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

ransome1's avatar
ransome1 committed
296
        btnItemStatus.classList.remove("is-hidden");
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
      }
      // 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
317
318
      //modalTitle.innerHTML = translations.addTodo;
      btnItemStatus.classList.add("is-hidden");
319
    }
320
321
    // switch to textarea if needed
    if(userData.useTextarea) toggleInputSize("input");
322
323
324
    // adjust size of picker inputs
    resizeInput(datePickerInput);
    resizeInput(recurrencePickerInput);
ransome1's avatar
ransome1 committed
325
    //resizeInput(document.getElementById("modalFormInput"));
326
327
    // create the modal jail, so tabbing won't leave modal
    createModalJail(modalForm);
328
329
330
331
    // show modal and set focus to input element
    modalForm.classList.add("is-active");
    // put focus into the input field
    document.getElementById("modalFormInput").focus();
332
333
334
335
336
337
338
339
    return Promise.resolve("Info: Show/Edit todo window opened");
  } catch (error) {
    error.functionName = show.name;
    return Promise.reject(error);
  }
}
function submitForm() {
  try {
340
341
342
343
344
345
    // 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");
    // }
346
347
    // 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
348
    if(modalForm.getAttribute("data-item") === document.getElementById("modalFormInput").value) {
349
350
351
352
353
354
      // close and reset any modal
      resetModal().then(function(result) {
        console.log(result);
      }).catch(function(error) {
        handleError(error);
      });
355
356
      return Promise.resolve("Info: Nothing has changed, won't write anything.");
    // Edit todo
357
    } else if(modalForm.getAttribute("data-item")) {
358
359
360
361
      // 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)
362
      let todo = new TodoTxtItem(document.getElementById("modalFormInput").value.replaceAll(/[\r\n]+/g, String.fromCharCode(16)), [ new SugarDueExtension(), new HiddenExtension(), new RecExtension(), new ThresholdExtension() ]);
363
364
365
366
367
368
369
      // 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
370
      } else if(!todo.text && !todo.h) {
371
372
373
374
375
376
377
378
        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
379
    } else if(!modalForm.getAttribute("data-item") && document.getElementById("modalFormInput").value!="") {
380
381
      // 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)
382
      let todo = new TodoTxtItem(document.getElementById("modalFormInput").value.replaceAll(/[\r\n]+/g, String.fromCharCode(16)), [ new SugarDueExtension(), new HiddenExtension(), new RecExtension(), new ThresholdExtension() ]);
383
384
385
386
387
388
389
390
391
      // 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
392
      } else if(!todo.text && !todo.h) {
393
394
395
396
397
398
399
400
401
        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
402
    } else if(document.getElementById("modalFormInput").value=="") {
403
404
405
406
407
408
409
      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
410
    window.api.send("writeToFile", [items.objects.join("\n").toString() + "\n"]);
411
412
413
414
415
416
    // close and reset any modal
    resetModal().then(function(result) {
      console.log(result);
    }).catch(function(error) {
      handleError(error);
    });
417
    // trigger matomo event
418
    if(userData.matomoEvents) _paq.push(["trackEvent", "Form", "Submit"]);
419
    return Promise.resolve("Success: Changes written to file");
420
421
422
  // if the input field is empty, let users know
  } catch (error) {
    // if writing into file is denied throw alert
423
    modalFormAlert.innerHTML = translations.formErrorWritingFile;
424
425
426
427
428
    modalFormAlert.parentElement.classList.add("is-active", 'is-danger');
    error.functionName = submitForm.name;
    return Promise.reject(error);
  }
}
ransome1's avatar
ransome1 committed
429

430
431
function toggleInputSize(type) {
  let newInputElement;
432
433
434
435
436
437
438
439
440
441
  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);

442
443
  switch (type) {
    case "input":
444
      newInputElement = document.createElement("textarea");
445
      newInputElement.value = value.replaceAll(String.fromCharCode(16),"\r\n");
446
447
448
449
450
      modalFormInputResize.setAttribute("data-input-type", "textarea");
      modalFormInputResize.innerHTML = "<i class=\"fas fa-compress-alt\"></i>";
      setUserData("useTextarea", true);
      break;
    case "textarea":
451
      newInputElement = document.createElement("input");
452
453
      //newInputElement.value = value.replaceAll(String.fromCharCode(16)," ");
      newInputElement.value = value;
454
455
456
457
458
459
460
      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";
461
  newInputElement.setAttribute("tabindex", 0);
462
  newInputElement.setAttribute("class", "input is-medium");
463
464
465
466
467
468
469
470

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

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

478

479
  positionAutoCompleteContainer();
480
  resizeInput(document.getElementById("modalFormInput"));
481

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

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

499
500
501
502
503
504
505
506
507
508
window.onresize = function() {
  try {
    positionAutoCompleteContainer();
  } catch(error) {
    error.functionName = "window.onresize";
    handleError(error);
    return Promise.reject(error);
  }
}

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