124 Zeilen
3,5 KiB
Text
124 Zeilen
3,5 KiB
Text
|
import { listProperties } from '../lib/wizard';
|
||
|
import { default as wizardSchema } from '../lib/wizard-schema';
|
||
|
import { set, get } from "@ember/object";
|
||
|
import Mixin from "@ember/object/mixin";
|
||
|
import { observes } from 'discourse-common/utils/decorators';
|
||
|
|
||
|
export default Mixin.create({
|
||
|
didInsertElement() {
|
||
|
this._super(...arguments);
|
||
|
this.setupObservers();
|
||
|
|
||
|
const obj = this.get(this.componentType);
|
||
|
|
||
|
this.setProperties({
|
||
|
originalObject: JSON.parse(JSON.stringify(obj)),
|
||
|
undoIcon: obj.isNew ? 'times' : 'undo',
|
||
|
undoKey: `admin.wizard.${obj.isNew ? 'clear' : 'undo'}`
|
||
|
})
|
||
|
},
|
||
|
|
||
|
willDestroyElement() {
|
||
|
this._super(...arguments);
|
||
|
this.removeObservers();
|
||
|
},
|
||
|
|
||
|
removeObservers(objType=null) {
|
||
|
const componentType = this.componentType;
|
||
|
const obj = this.get(componentType);
|
||
|
|
||
|
let opts = {
|
||
|
objectType: objType || obj.type
|
||
|
}
|
||
|
|
||
|
listProperties(componentType, opts).forEach(property => {
|
||
|
obj.removeObserver(property, this, this.toggleUndo);
|
||
|
});
|
||
|
},
|
||
|
|
||
|
setupObservers(objType=null) {
|
||
|
const componentType = this.componentType;
|
||
|
const obj = this.get(componentType);
|
||
|
|
||
|
let opts = {
|
||
|
objectType: objType || obj.type
|
||
|
}
|
||
|
|
||
|
listProperties(componentType, opts).forEach(property => {
|
||
|
obj.addObserver(property, this, this.toggleUndo);
|
||
|
});
|
||
|
},
|
||
|
|
||
|
revertToOriginal(revertBasic=false) {
|
||
|
const original = JSON.parse(JSON.stringify(this.originalObject));
|
||
|
const componentType = this.componentType;
|
||
|
const obj = this.get(componentType);
|
||
|
const objSchema = wizardSchema[componentType];
|
||
|
const basicDefaults = objSchema.basic;
|
||
|
|
||
|
if (revertBasic) {
|
||
|
Object.keys(basicDefaults).forEach(property => {
|
||
|
let value;
|
||
|
|
||
|
if (original.hasOwnProperty(property)) {
|
||
|
value = get(original, property);
|
||
|
} else if (basicDefaults.hasOwnProperty(property)) {
|
||
|
value = get(basicDefaults, property);
|
||
|
}
|
||
|
|
||
|
set(obj, property, value);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
if (objSchema.types && obj.type) {
|
||
|
let typeDefaults = objSchema.types[obj.type];
|
||
|
|
||
|
Object.keys(typeDefaults).forEach(property => {
|
||
|
let value;
|
||
|
|
||
|
if (original.type === obj.type && original.hasOwnProperty(property)) {
|
||
|
value = get(original, property);
|
||
|
} else if (typeDefaults.hasOwnProperty(property)) {
|
||
|
value = get(typeDefaults, property);
|
||
|
}
|
||
|
|
||
|
set(obj, property, value);
|
||
|
});
|
||
|
}
|
||
|
},
|
||
|
|
||
|
toggleUndo() {
|
||
|
const current = this.get(this.componentType);
|
||
|
const original = this.originalObject;
|
||
|
this.set('showUndo', !_.isEqual(current, original));
|
||
|
},
|
||
|
|
||
|
actions: {
|
||
|
undoChanges() {
|
||
|
const componentType = this.componentType;
|
||
|
const original = this.get('originalObject');
|
||
|
const obj = this.get(componentType);
|
||
|
|
||
|
this.removeObservers(obj.type);
|
||
|
this.revertToOriginal(true);
|
||
|
this.set('showUndo', false);
|
||
|
this.setupObservers(this.get(componentType).type);
|
||
|
},
|
||
|
|
||
|
changeType(type) {
|
||
|
const componentType = this.componentType;
|
||
|
const original = this.get('originalObject');
|
||
|
const obj = this.get(componentType);
|
||
|
|
||
|
this.removeObservers(obj.type);
|
||
|
obj.set('type', type);
|
||
|
this.revertToOriginal();
|
||
|
this.set('showUndo', type !== original.type);
|
||
|
this.setupObservers(type);
|
||
|
},
|
||
|
|
||
|
mappedFieldUpdated(property, type) {
|
||
|
this.get(this.componentType).notifyPropertyChange(property);
|
||
|
}
|
||
|
}
|
||
|
})
|