form.mjs 22.4 KB
Newer Older
1
"use strict";
2
import "../../node_modules/jstodotxt/jsTodoExtensions.js";
3
import { resetModal, handleError, userData, setUserData, translations, getConfirmation } from "../render.js";
4
import { _paq } from "./matomo.mjs";
5
import { RecExtension, SugarDueExtension, ThresholdExtension } from "./todotxtExtensions.mjs";
6
import { generateFilterData } from "./filters.mjs";
7
import { items, item, setTodoComplete } from "./todos.mjs";
8
import { datePickerInput, datePicker } from "./datePicker.mjs";
9
import { createModalJail } from "../configs/modal.config.mjs";
10
import * as recurrencePicker from "./recurrencePicker.mjs";
11

12
13
14
const autoCompleteContainer = document.getElementById("autoCompleteContainer");
const recurrencePickerInput = document.getElementById("recurrencePickerInput");
const modalFormAlert = document.getElementById("modalFormAlert");
15
const modalForm = document.getElementById("modalForm");
ransome1's avatar
ransome1 committed
16
const modalFormInputLabel = document.getElementById("modalFormInputLabel");
17
const modalFormInputResize = document.getElementById("modalFormInputResize");
18

19
const priorityPicker = document.getElementById("priorityPicker");
ransome1's avatar
ransome1 committed
20
const btnSave = document.getElementById("btnSave");
21
22
const btnItemStatus = document.getElementById("btnItemStatus");

ransome1's avatar
ransome1 committed
23
modalFormInputLabel.innerHTML = translations.todoTxtSyntax;
24
25

btnItemStatus.onclick = function() {
26
  setTodoComplete(modalForm.getAttribute("data-item")).then(response => {
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
    resetModal().then(function(result) {
      console.log(result);
    }).catch(function(error) {
      handleError(error);
    });
    console.log(response);
    // trigger matomo event
    if(userData.matomoEvents) _paq.push(["trackEvent", "Form", "Click on Done/In progress"]);
  }).catch(error => {
    handleError(error);
  });
}
modalFormInputResize.onclick = function() {
  toggleInputSize(this.getAttribute("data-input-type"));
  // trigger matomo event
  if(userData.matomoEvents) _paq.push(["trackEvent", "Form", "Click on Resize"]);
}
ransome1's avatar
ransome1 committed
44
45
46
47
48
49
50
51
52
53
54
55
btnSave.onclick = function() {
  submitForm().then(response => {
    console.log(response);
  }).catch(error => {
    handleError(error);
  });
  // trigger matomo event
  if(userData.matomoEvents) _paq.push(["trackEvent", "Form", "Click on Submit"]);
}

document.getElementById("modalFormInput").addEventListener("keyup", event => {
  keyUp();
56
});
ransome1's avatar
ransome1 committed
57
58
59
60
61

document.getElementById("modalFormInput").addEventListener("keydown", event => {
  keyDown();
});

ransome1's avatar
ransome1 committed
62
63
64
65
66
67
document.getElementById("modalFormInput").onfocus = function() {
  modalForm.classList.add("is-focused");
}
document.getElementById("modalFormInput").onblur = function() {
  modalForm.classList.remove("is-focused");
}
68
modalForm.addEventListener("submit", function(event) {
ransome1's avatar
ransome1 committed
69
  event.preventDefault;
70
});
71
modalForm.addEventListener ("click", function() {
72
  // close recurrence picker if click is outside of recurrence container
73
  if(!event.target.closest("#recurrencePickerContainer") && event.target!=recurrencePickerInput) document.getElementById("recurrencePickerContainer").classList.remove("is-active")
74
});
75
76
77
78
79
80
81
82
83
84
85
86
priorityPicker.addEventListener("change", e => {
  setPriority(e.target.value).then(response => {
    console.log(response);
  }).catch(error => {
    handleError(error);
  });
});
priorityPicker.onfocus = function() {
  // close suggestion box if focus comes to priority picker
  autoCompleteContainer.classList.remove("is-active");
};

87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
// TODO add try catch
function keyUp() {
  // do not show suggestion container if Escape has been pressed
  if(event.key==="Escape") {
    autoCompleteContainer.classList.remove("is-active");
    return false;
  }
  modalFormInputEvent();
}

// TODO add try and catch
function keyDown() {
  // regular submit
  if(document.getElementById("modalFormInput").type !=="textarea" && event.key === "Enter") {
    submitForm().then(response => {
      console.log(response);
    }).catch(error => {
      handleError(error);
    });
    // trigger matomo event
    if(userData.matomoEvents) _paq.push(["trackEvent", "Form", "Pressed Enter for Submit"]);
  }

  // submit form with Ctrl/CMD and Enter
  if(event.key==="Enter" && (event.ctrlKey || event.metaKey)) {
    submitForm().then(response => {
      console.log(response);
    }).catch(error => {
      handleError(error);
    });
    // trigger matomo event
    if(userData.matomoEvents) _paq.push(["trackEvent", "Form", "Pressed Ctrl/CMD and Enter for Submit"]);
  }
}
121
122
123
124
125
126
127
128
function getCaretPosition(inputId) {
  var content = inputId;
  if((content.selectionStart!=null)&&(content.selectionStart!=undefined)){
    var position = content.selectionStart;
    return position;
  } else {
    return false;
  }
129
}
130
131
function positionAutoCompleteContainer() {
  // Adjust position of suggestion box to input field
132
133
  let modalFormInputPosition = document.getElementById("modalFormInput").getBoundingClientRect();
  autoCompleteContainer.style.width = document.getElementById("modalFormInput").offsetWidth + "px";
ransome1's avatar
ransome1 committed
134
  autoCompleteContainer.style.top = modalFormInputPosition.top + document.getElementById("modalFormInput").offsetHeight - 40 + "px";
135
136
  autoCompleteContainer.style.left = modalFormInputPosition.left + "px";
}
ransome1's avatar
ransome1 committed
137
function modalFormInputEvent(event) {
138
  positionAutoCompleteContainer();
139
  resizeInput(document.getElementById("modalFormInput"));
140
141
  let autoCompleteValue ="";
  let autoCompletePrefix = "";
142
  let caretPosition = getCaretPosition(document.getElementById("modalFormInput"));
143
  let autoCompleteCategory = "";
144
145
146
147
148
149
150
151
152
153
  let inputValue = document.getElementById("modalFormInput").value;
  if((inputValue.charAt(caretPosition-2) === " " || inputValue.charAt(caretPosition-2) === "\n") && (inputValue.charAt(caretPosition-1) === "@" || inputValue.charAt(caretPosition-1) === "+")) {
    autoCompleteValue = inputValue.substr(caretPosition, inputValue.lastIndexOf(" ")).split(" ").shift();
    autoCompletePrefix = inputValue.charAt(caretPosition-1);
  } else if(inputValue.charAt(caretPosition) === " ") {
    autoCompleteValue = inputValue.substr(inputValue.lastIndexOf(" ", caretPosition-1)+2).split(" ").shift();
    autoCompletePrefix = inputValue.charAt(inputValue.lastIndexOf(" ", caretPosition-1)+1);
  } else if(inputValue.charAt(inputValue.lastIndexOf(" ", caretPosition)+1) === "@" || inputValue.charAt(inputValue.lastIndexOf(" ", caretPosition)+1) === "+") {
    autoCompleteValue = inputValue.substr(inputValue.lastIndexOf(" ", caretPosition)+2).split(" ").shift();
    autoCompletePrefix = inputValue.charAt(inputValue.lastIndexOf(" ", caretPosition)+1);
154
155
156
157
158
159
160
  } else {
    autoCompleteContainer.classList.remove("is-active");
    autoCompleteContainer.blur();
    return false;
  }
  // suppress suggestion box if caret is at the end of word
  if(autoCompletePrefix==="+" || autoCompletePrefix==="@") {
ransome1's avatar
ransome1 committed
161
    if(autoCompletePrefix==="+") {
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
      autoCompleteCategory = "projects";
    } else if(autoCompletePrefix=="@") {
      autoCompleteCategory = "contexts";
    }
    // parsed data will be passed to generate filter data and build the filter buttons
    generateFilterData(autoCompleteCategory, autoCompleteValue, autoCompletePrefix, caretPosition).then(response => {
      console.log(response);
    }).catch (error => {
      handleError(error);
    });
  } else {
    autoCompleteContainer.classList.remove("is-active");
    autoCompleteContainer.blur();
  }
}
ransome1's avatar
ransome1 committed
177
178
// TODO add try catch
async function resizeInput(input) {
179
  if(input.tagName==="TEXTAREA" && input.id==="modalFormInput") {
ransome1's avatar
ransome1 committed
180
181
    input.style.height = "auto"
    await input.scrollHeight;
182
183
184
185
186
    input.style.height = input.scrollHeight+"px";
    return false;
  } else if (input.type==="text" && input.id==="modalFormInput") {
    return false;
  }
187
188
  let additionalLength = 6;
  if(userData.language === "jp" || userData.language === "zh") additionalLength = 11;
189
  if(input.value) {
190
    input.style.width = input.value.length + additionalLength + "ch";
191
  } else if(!input.value && input.placeholder) {
192
    input.style.width = input.placeholder.length + additionalLength + "ch";
193
194
  }
}
195
196
197
198
199
200
201
202
203
204
205
206
207
function setPriority(priority) {
  try {
    const setPriorityInput = function(priority) {
      if(priority===null) {
        priorityPicker.selectedIndex = 0;
      } else {
        Array.from(priorityPicker.options).forEach(function(option) {
          if(option.value===priority) {
            priorityPicker.selectedIndex = option.index;
          }
        });
      }
    }
208
    let todo = new TodoTxtItem(document.getElementById("modalFormInput").value);
209
210
211
212
213
214
215
216
217
218
219
220
    if((priority==="down" || priority==="up") && !todo.priority) {
      todo.priority = "A";
    } else if(priority==="up" && todo.priority!="a") {
      todo.priority = String.fromCharCode(todo.priority.charCodeAt(0)-1).toUpperCase();
    } else if(priority==="down" && todo.priority!="z") {
      todo.priority = String.fromCharCode(todo.priority.charCodeAt(0)+1).toUpperCase();
    } else if(priority && priority.match(/[A-Z]/i)) {
      todo.priority = priority.toUpperCase();
    } else {
      todo.priority = null;
    }
    if(todo.priority===null || todo.priority.match(/[a-z]/i)) {
221
      document.getElementById("modalFormInput").value = todo.toString();
222
223
224
225
226
227
228
229
230
231
232
233
234
      setPriorityInput(todo.priority);
      // trigger matomo event
      if(userData.matomoEvents) _paq.push(["trackEvent", "Form", "Priority changed to: " + todo.priority]);
      return Promise.resolve("Success: Priority changed to " + todo.priority)
    }
    return Promise.resolve("Info: Priority unchanged")
  } catch(error) {
    error.functionName = setPriority.name;
    return Promise.reject(error);
  }
}
function setDueDate(days) {
  try {
235
    const todo = new TodoTxtItem(document.getElementById("modalFormInput").value, [ new DueExtension(), new HiddenExtension(), new RecExtension(), new ThresholdExtension() ]);
236
237
238
239
240
241
242
243
244
245
    if(days===0) {
      todo.due = undefined;
      todo.dueString = undefined;
    } else if(days && todo.due) {
      todo.due = new Date(new Date(todo.dueString).setDate(new Date(todo.dueString).getDate() + days));
      todo.dueString = todo.due.toISOString().substr(0, 10);
    } else if(days && !todo.due) {
      todo.due = new Date(new Date().setDate(new Date().getDate() + days));
      todo.dueString = todo.due.toISOString().substr(0, 10);
    }
246
247
248
249

    datePicker.setDate( todo.due );


250
    document.getElementById("modalFormInput").value = todo.toString();
251
252
253
254
255
256
    return Promise.resolve("Success: Due date changed to " + todo.dueString)
  } catch(error) {
    error.functionName = setDueDate.name;
    return Promise.reject(error);
  }
}
257
258
function show(todo, templated) {
  try {
259
    // remove any previously set data-item attributes
260
261
    //modalForm.removeAttribute("data-item");
    modalForm.setAttribute("data-item", "");
262
263
    // adjust size of recurrence picker input field
    datePickerInput.value = null;
264
    recurrencePickerInput.value = null;
265
    document.getElementById("modalFormInput").value = null;
266
267
    modalFormAlert.innerHTML = null;
    modalFormAlert.parentElement.classList.remove("is-active", 'is-warning', 'is-danger');
268
    //
269
270
271
    if(todo) {
      // replace invisible multiline ascii character with new line
      // we need to check if there already is a due date in the object
272
      todo = new TodoTxtItem(todo, [ new DueExtension(), new HiddenExtension(), new RecExtension(), new ThresholdExtension() ]);
273
274
275
276
277
278
      // set the priority
      setPriority(todo.priority);
      //
      if(templated === true) {
        // this is a new templated todo task
        // erase the original creation date and description
279
        todo.date = new Date();
280
        todo.text = "____________";
281
        document.getElementById("modalFormInput").value = todo.toString();
ransome1's avatar
ransome1 committed
282
        //modalTitle.innerHTML = translations.addTodo;
283
        // automatically select the placeholder description
284
        let selectStart = document.getElementById("modalFormInput").value.indexOf(todo.text);
285
        let selectEnd = selectStart + todo.text.length;
286
        document.getElementById("modalFormInput").setSelectionRange(selectStart, selectEnd);
ransome1's avatar
ransome1 committed
287
        btnItemStatus.classList.add("is-hidden");
288
      } else {
289
290
        // pass todo string to form data item
        modalForm.setAttribute("data-item", todo.toString());
291
        // this is an existing todo task to be edited
292
        // replace special char with line breaks before passing it to textarea
293
        //if(userData.useTextarea) document.getElementById("modalFormInput").value = todo.toString().replaceAll(String.fromCharCode(16),"\r\n");
294
        // replace special char with space before passing it to regular input
295
        //if(!userData.useTextarea) document.getElementById("modalFormInput").value = todo.toString().replaceAll(String.fromCharCode(16)," ");
296
        //document.getElementById("modalFormInput").value = todo.toString();
ransome1's avatar
ransome1 committed
297
        //modalTitle.innerHTML = translations.editTodo;
298
299
        document.getElementById("modalFormInput").value = todo.toString();

ransome1's avatar
ransome1 committed
300
        btnItemStatus.classList.remove("is-hidden");
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
      }
      // only show the complete button on open items
      if(todo.complete === false) {
        btnItemStatus.innerHTML = translations.done;
      } else {
        btnItemStatus.innerHTML = translations.inProgress;
      }
      // if there is a recurrence
      if(todo.rec) {
        recurrencePicker.setInput(todo.rec).then(function(result) {
          console.log(result);
        }).catch(function(error) {
          handleError(error);
        });
      }
      // if so we paste it into the input field
      if(todo.dueString) {
        datePickerInput.value = todo.dueString;
      }
    } else {
ransome1's avatar
ransome1 committed
321
322
      //modalTitle.innerHTML = translations.addTodo;
      btnItemStatus.classList.add("is-hidden");
323
    }
324
325
    // switch to textarea if needed
    if(userData.useTextarea) toggleInputSize("input");
326
327
328
    // adjust size of picker inputs
    resizeInput(datePickerInput);
    resizeInput(recurrencePickerInput);
ransome1's avatar
ransome1 committed
329
    //resizeInput(document.getElementById("modalFormInput"));
330
331
    // create the modal jail, so tabbing won't leave modal
    createModalJail(modalForm);
332
333
334
335
    // show modal and set focus to input element
    modalForm.classList.add("is-active");
    // put focus into the input field
    document.getElementById("modalFormInput").focus();
336
337
338
339
340
341
342
343
    return Promise.resolve("Info: Show/Edit todo window opened");
  } catch (error) {
    error.functionName = show.name;
    return Promise.reject(error);
  }
}
function submitForm() {
  try {
344
345
346
347
348
349
    // if(userData.file === undefined) {
    //   modalFormAlert.innerHTML = translations.formErrorWritingFile;
    //   modalFormAlert.parentElement.classList.remove("is-active", 'is-danger');
    //   modalFormAlert.parentElement.classList.add("is-active", 'is-warning');
    //   return Promise.resolve("Info: No todo.txt defined yet");
    // }
350
351
    // check if there is an input in the text field, otherwise indicate it to the user
    // input value and data item are the same, nothing has changed, nothing will be written
ransome1's avatar
ransome1 committed
352
    if(modalForm.getAttribute("data-item") === document.getElementById("modalFormInput").value) {
353
354
355
356
357
358
      // close and reset any modal
      resetModal().then(function(result) {
        console.log(result);
      }).catch(function(error) {
        handleError(error);
      });
359
360
      return Promise.resolve("Info: Nothing has changed, won't write anything.");
    // Edit todo
361
    } else if(modalForm.getAttribute("data-item")) {
362
363
364
365
      // get index of todo
      const index = items.objects.map(function(item) {return item.toString(); }).indexOf(modalForm.getAttribute("data-item"));
      // create a todo.txt object
      // replace new lines with spaces (https://stackoverflow.com/a/34936253)
366
      let todo = new TodoTxtItem(document.getElementById("modalFormInput").value.replaceAll(/[\r\n]+/g, String.fromCharCode(16)), [ new SugarDueExtension(), new HiddenExtension(), new RecExtension(), new ThresholdExtension() ]);
367
368
369
370
371
372
373
      // check and prevent duplicate todo
      if(items.objects.map(function(item) {return item.toString(); }).indexOf(todo.toString())!=-1) {
        modalFormAlert.innerHTML = translations.formInfoDuplicate;
        modalFormAlert.parentElement.classList.remove("is-active", 'is-danger');
        modalFormAlert.parentElement.classList.add("is-active", 'is-warning');
        return Promise.resolve("Info: Todo already exists in file, won't write duplicate");
      // check if todo text is empty
374
      } else if(!todo.text && !todo.h) {
375
376
377
378
379
380
381
382
        modalFormAlert.innerHTML = translations.formInfoIncomplete;
        modalFormAlert.parentElement.classList.remove("is-active", 'is-danger');
        modalFormAlert.parentElement.classList.add("is-active", 'is-warning');
        return Promise.resolve("Info: Todo is incomplete");
      }
      // jump to index, remove 1 item there and add the value from the input at that position
      items.objects.splice(index, 1, todo);
    // Add todo
383
    } else if(!modalForm.getAttribute("data-item") && document.getElementById("modalFormInput").value!="") {
384
385
      // in case there hasn't been a passed data item, we just push the input value as a new item into the array
      // replace new lines with spaces (https://stackoverflow.com/a/34936253)
386
      let todo = new TodoTxtItem(document.getElementById("modalFormInput").value.replaceAll(/[\r\n]+/g, String.fromCharCode(16)), [ new SugarDueExtension(), new HiddenExtension(), new RecExtension(), new ThresholdExtension() ]);
387
388
389
390
391
392
393
394
395
      // we add the current date to the start date attribute of the todo.txt object
      todo.date = new Date();
      // check and prevent duplicate todo
      if(items.objects.map(function(item) {return item.toString(); }).indexOf(todo.toString())!=-1) {
        modalFormAlert.innerHTML = translations.formInfoDuplicate;
        modalFormAlert.parentElement.classList.remove("is-active", 'is-danger');
        modalFormAlert.parentElement.classList.add("is-active", 'is-warning');
        return Promise.resolve("Info: Todo already exists in file, won't write duplicate");
      // check if todo text is empty
396
      } else if(!todo.text && !todo.h) {
397
398
399
400
401
402
403
404
405
        modalFormAlert.innerHTML = translations.formInfoIncomplete;
        modalFormAlert.parentElement.classList.remove("is-active", 'is-danger');
        modalFormAlert.parentElement.classList.add("is-active", 'is-warning');
        return Promise.resolve("Info: Todo is incomplete");
      }
      // we build the array
      items.objects.push(todo);
      // mark the todo for anchor jump after next reload
      item.previous = todo.toString();
ransome1's avatar
ransome1 committed
406
    } else if(document.getElementById("modalFormInput").value=="") {
407
408
409
410
411
412
413
      modalFormAlert.innerHTML = translations.formInfoNoInput;
      modalFormAlert.parentElement.classList.remove("is-active", 'is-danger');
      modalFormAlert.parentElement.classList.add("is-active", 'is-warning');
      return Promise.resolve("Info: Will not write empty todo");
    }
    //write the data to the file
    // a newline character is added to prevent other todo.txt apps to append new todos to the last line
414
    window.api.send("writeToFile", [items.objects.join("\n").toString() + "\n"]);
415
416
417
418
419
420
    // close and reset any modal
    resetModal().then(function(result) {
      console.log(result);
    }).catch(function(error) {
      handleError(error);
    });
421
    // trigger matomo event
422
    if(userData.matomoEvents) _paq.push(["trackEvent", "Form", "Submit"]);
423
    return Promise.resolve("Success: Changes written to file");
424
425
426
  // if the input field is empty, let users know
  } catch (error) {
    // if writing into file is denied throw alert
427
    modalFormAlert.innerHTML = translations.formErrorWritingFile;
428
429
430
431
432
    modalFormAlert.parentElement.classList.add("is-active", 'is-danger');
    error.functionName = submitForm.name;
    return Promise.reject(error);
  }
}
ransome1's avatar
ransome1 committed
433

434
435
function toggleInputSize(type) {
  let newInputElement;
436
437
438
439
440
441
442
443
444
445
  let value = "";


  if(document.getElementById("modalFormInput").value!=="") {
    value = document.getElementById("modalFormInput").value.replaceAll("\n", String.fromCharCode(16));
  } /*else if(modalForm.getAttribute("data-item")!=="") {
    value = modalForm.getAttribute("data-item").replaceAll("\n", String.fromCharCode(16));
  }*/
  //modalForm.setAttribute("data-item", document.getElementById("modalFormInput").value);

446
447
  switch (type) {
    case "input":
448
      newInputElement = document.createElement("textarea");
449
      newInputElement.value = value.replaceAll(String.fromCharCode(16),"\r\n");
450
451
452
453
454
      modalFormInputResize.setAttribute("data-input-type", "textarea");
      modalFormInputResize.innerHTML = "<i class=\"fas fa-compress-alt\"></i>";
      setUserData("useTextarea", true);
      break;
    case "textarea":
455
      newInputElement = document.createElement("input");
456
457
      //newInputElement.value = value.replaceAll(String.fromCharCode(16)," ");
      newInputElement.value = value;
458
459
460
461
462
463
464
      newInputElement.type = "text";
      modalFormInputResize.setAttribute("data-input-type", "input");
      modalFormInputResize.innerHTML = "<i class=\"fas fa-expand-alt\"></i>";
      setUserData("useTextarea", false);
      break;
  }
  newInputElement.id = "modalFormInput";
465
  newInputElement.setAttribute("tabindex", 0);
466
  newInputElement.setAttribute("class", "input is-medium");
467
468
469
470
471
472
473
474

  // if(userData.useTextarea) {
  //   value.replaceAll(String.fromCharCode(16),"\r\n");
  // } else {
  //   value.replaceAll(String.fromCharCode(16)," ");
  // }

  //newInputElement.value = value;
475
476
477
  // replace old element with the new one
  document.getElementById("modalFormInput").replaceWith(newInputElement);
  // replace special char with line break before passing it to textarea
478
  //if(userData.useTextarea && modalForm.getAttribute("data-item")) document.getElementById("modalFormInput").value = document.getElementById("modalForm").getAttribute("data-item").replaceAll(String.fromCharCode(16),"\r\n");
479
  // replace special char with space before passing it to regular input
480
481
  //if(!userData.useTextarea && modalForm.getAttribute("data-item")) document.getElementById("modalFormInput").value = document.getElementById("modalForm").getAttribute("data-item").replaceAll(String.fromCharCode(16)," ");

482

483
  positionAutoCompleteContainer();
484
  resizeInput(document.getElementById("modalFormInput"));
485

ransome1's avatar
ransome1 committed
486
487
488
489
490
491
  document.getElementById("modalFormInput").onfocus = function() {
    modalForm.classList.add("is-focused");
  }
  document.getElementById("modalFormInput").onblur = function() {
    modalForm.classList.remove("is-focused");
  }
492
493
  document.getElementById("modalFormInput").focus();
  createModalJail(modalForm);
ransome1's avatar
ransome1 committed
494
495
496
497
498
499
500

  document.getElementById("modalFormInput").addEventListener("keydown", () => {
    keyDown();
  });
  document.getElementById("modalFormInput").addEventListener("keyup", () => {
    keyUp();
  });
501
502
}

503
504
505
506
507
508
509
510
511
512
window.onresize = function() {
  try {
    positionAutoCompleteContainer();
  } catch(error) {
    error.functionName = "window.onresize";
    handleError(error);
    return Promise.reject(error);
  }
}

ransome1's avatar
ransome1 committed
513
export { show, resizeInput, setPriority, setDueDate, submitForm, toggleInputSize};