mirror of
https://github.com/wekan/wekan.git
synced 2025-04-24 14:08:31 -04:00
98 lines
2.4 KiB
JavaScript
98 lines
2.4 KiB
JavaScript
// 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 time
|
|
const 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 inlinedForm
|
|
EscapeActions.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);
|