mirror of
https://github.com/wekan/wekan.git
synced 2025-12-16 07:20:12 +01:00
Replace the component bounded cachedValue by a global UnsavedEdits
This new draft saving system is currently only implemented for the card description and comment. We need better a component inheritance/composition model to support this for all editable fields. Fixes #186
This commit is contained in:
parent
cc88e78483
commit
d644cba38f
13 changed files with 252 additions and 95 deletions
|
|
@ -1,22 +0,0 @@
|
|||
var emptyValue = '';
|
||||
|
||||
Mixins.CachedValue = BlazeComponent.extendComponent({
|
||||
onCreated: function() {
|
||||
this._cachedValue = emptyValue;
|
||||
},
|
||||
|
||||
setCache: function(value) {
|
||||
this._cachedValue = value;
|
||||
},
|
||||
|
||||
getCache: function(defaultValue) {
|
||||
if (this._cachedValue === emptyValue)
|
||||
return defaultValue || '';
|
||||
else
|
||||
return this._cachedValue;
|
||||
},
|
||||
|
||||
resetCache: function() {
|
||||
this.setCache('');
|
||||
}
|
||||
});
|
||||
|
|
@ -1,90 +0,0 @@
|
|||
// 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
|
||||
// XXX Could we avoid using a global here ? This is used in Mousetrap
|
||||
// keyboard.js
|
||||
var currentlyOpenedForm = new ReactiveVar(null);
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
template: function() {
|
||||
return 'inlinedForm';
|
||||
},
|
||||
|
||||
mixins: function() {
|
||||
return [Mixins.CachedValue];
|
||||
},
|
||||
|
||||
onCreated: function() {
|
||||
this.isOpen = new ReactiveVar(false);
|
||||
},
|
||||
|
||||
onDestroyed: function() {
|
||||
currentlyOpenedForm.set(null);
|
||||
},
|
||||
|
||||
open: function() {
|
||||
// Close currently opened form, if any
|
||||
EscapeActions.executeUpTo('inlinedForm');
|
||||
this.isOpen.set(true);
|
||||
currentlyOpenedForm.set(this);
|
||||
},
|
||||
|
||||
close: function() {
|
||||
this.saveValue();
|
||||
this.isOpen.set(false);
|
||||
currentlyOpenedForm.set(null);
|
||||
},
|
||||
|
||||
getValue: function() {
|
||||
var input = this.find('textarea,input[type=text]');
|
||||
return this.isOpen.get() && input && input.value;
|
||||
},
|
||||
|
||||
saveValue: function() {
|
||||
this.callFirstWith(this, 'setCache', this.getValue());
|
||||
},
|
||||
|
||||
events: function() {
|
||||
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': function(evt) {
|
||||
if (evt.keyCode === 13 && (evt.metaKey || evt.ctrlKey)) {
|
||||
this.find('button[type=submit]').click();
|
||||
}
|
||||
},
|
||||
|
||||
// Close the inlined form when after its submission
|
||||
submit: function() {
|
||||
if (this.currentData().autoclose !== false) {
|
||||
Tracker.afterFlush(() => {
|
||||
this.close();
|
||||
this.callFirstWith(this, 'resetCache');
|
||||
});
|
||||
}
|
||||
}
|
||||
}];
|
||||
}
|
||||
}).register('inlinedForm');
|
||||
|
||||
// Press escape to close the currently opened inlinedForm
|
||||
EscapeActions.register('inlinedForm',
|
||||
function() { currentlyOpenedForm.get().close(); },
|
||||
function() { return currentlyOpenedForm.get() !== null; }, {
|
||||
noClickEscapeOn: '.js-inlined-form'
|
||||
}
|
||||
);
|
||||
Loading…
Add table
Add a link
Reference in a new issue