| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 | // 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) {    if (evt) {      evt.preventDefault();      // Close currently opened form, if any      EscapeActions.clickExecute(evt.target, 'inlinedForm');    } else {      // 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]');    // \s without \n + unicode (https://developer.mozilla.org/de/docs/Web/JavaScript/Guide/Regular_Expressions#special-white-space)    return this.isOpen.get() && input && input.value.replaceAll(/[ \f\r\t\v]+$/gm, '');  },  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 outside//document.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);
 |