| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 | // A inlined form is used to provide a quick edition of single field for a given// document. Clicking on a edit button should display the form to edit the field// value. The form can then be submited, or just closed.//// When the form is closed we save non-submitted values in memory to avoid any// data loss.//// Usage:////   +inlineForm//     // the content when the form is open//   else//     // the content when the form is close (optional)// We can only have one inlined form element opened at a timeconst currentlyOpenedForm = new ReactiveVar(null);InlinedForm = BlazeComponent.extendComponent({  template() {    return 'inlinedForm';  },  onCreated() {    this.isOpen = new ReactiveVar(false);  },  onDestroyed() {    currentlyOpenedForm.set(null);  },  open(evt) {    evt && evt.preventDefault();    // Close currently opened form, if any    EscapeActions.executeUpTo('inlinedForm');    this.isOpen.set(true);    currentlyOpenedForm.set(this);  },  close() {    this.isOpen.set(false);    currentlyOpenedForm.set(null);  },  getValue() {    const input = this.find('textarea,input[type=text]');    return this.isOpen.get() && input && input.value;  },  events() {    return [{      'click .js-close-inlined-form': this.close,      'click .js-open-inlined-form': this.open,      // Pressing Ctrl+Enter should submit the form      'keydown form textarea'(evt) {        if (evt.keyCode === 13 && (evt.metaKey || evt.ctrlKey)) {          this.find('button[type=submit]').click();        }      },      // Close the inlined form when after its submission      submit() {        if (this.currentData().autoclose !== false) {          Tracker.afterFlush(() => {            this.close();          });        }      },    }];  },}).register('inlinedForm');// Press escape to close the currently opened inlinedFormEscapeActions.register('inlinedForm',  () => { currentlyOpenedForm.get().close(); },  () => { return currentlyOpenedForm.get() !== null; }, {    enabledOnClick: false,  });// submit on click outsidedocument.addEventListener('click', function(evt) {  const openedForm = currentlyOpenedForm.get();  const isClickOutside = $(evt.target).closest('.js-inlined-form').length === 0;  if (openedForm && isClickOutside) {    $('.js-inlined-form button[type=submit]').click();    openedForm.close();  }}, true);
 |