0
0
Fork 1
Spiegel von https://github.com/paviliondev/discourse-custom-wizard.git synchronisiert 2024-11-30 12:31:10 +01:00
discourse-custom-wizard/assets/javascripts/discourse/mixins/undo-changes.js.es6

137 Zeilen
3,7 KiB
Text

import { listProperties } from "../lib/wizard";
import { default as wizardSchema } from "../lib/wizard-schema";
2021-04-12 07:10:02 +02:00
import { get, set } from "@ember/object";
2020-04-20 11:41:13 +02:00
import Mixin from "@ember/object/mixin";
import { deepEqual } from "discourse-common/lib/object";
2020-04-20 11:41:13 +02:00
const observedCache = [];
2020-04-20 11:41:13 +02:00
export default Mixin.create({
didInsertElement() {
this._super(...arguments);
this.setupObservers();
2020-04-20 11:41:13 +02:00
const obj = this.get(this.componentType);
2020-04-20 11:41:13 +02:00
this.setProperties({
originalObject: JSON.parse(JSON.stringify(obj)),
undoIcon: obj.isNew ? "times" : "undo",
undoKey: `admin.wizard.${obj.isNew ? "clear" : "undo"}`,
});
2020-04-20 11:41:13 +02:00
},
willDestroyElement() {
this._super(...arguments);
this.removeObservers();
},
removeObservers(objType = null) {
2020-04-20 11:41:13 +02:00
const componentType = this.componentType;
const obj = this.get(componentType);
2020-04-20 11:41:13 +02:00
let opts = {
objectType: objType || obj.type,
};
2020-04-20 11:41:13 +02:00
listProperties(componentType, opts).forEach((property) => {
if (observedCache.includes(property)) {
obj.removeObserver(property, this, this.toggleUndo);
let index = observedCache.indexOf(property);
if (index !== -1) {
observedCache.splice(index, 1);
}
}
2020-04-20 11:41:13 +02:00
});
},
setupObservers(objType = null) {
2020-04-20 11:41:13 +02:00
const componentType = this.componentType;
const obj = this.get(componentType);
2020-04-20 11:41:13 +02:00
let opts = {
objectType: objType || obj.type,
};
listProperties(componentType, opts).forEach((property) => {
if (observedCache.indexOf(property) === -1) {
observedCache.push(property);
}
2020-04-20 11:41:13 +02:00
obj.addObserver(property, this, this.toggleUndo);
});
},
revertToOriginal(revertBasic = false) {
2020-04-20 11:41:13 +02:00
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;
2020-04-20 11:41:13 +02:00
if (revertBasic) {
Object.keys(basicDefaults).forEach((property) => {
2020-04-20 11:41:13 +02:00
let value;
2020-04-20 11:41:13 +02:00
if (original.hasOwnProperty(property)) {
value = get(original, property);
} else if (basicDefaults.hasOwnProperty(property)) {
value = get(basicDefaults, property);
}
2020-04-20 11:41:13 +02:00
set(obj, property, value);
});
}
2020-04-20 11:41:13 +02:00
if (objSchema.types && obj.type) {
let typeDefaults = objSchema.types[obj.type];
Object.keys(typeDefaults).forEach((property) => {
2020-04-20 11:41:13 +02:00
let value;
if (original.type === obj.type && original.hasOwnProperty(property)) {
value = get(original, property);
} else if (typeDefaults.hasOwnProperty(property)) {
value = get(typeDefaults, property);
}
2020-04-20 11:41:13 +02:00
set(obj, property, value);
});
}
},
2020-04-20 11:41:13 +02:00
toggleUndo() {
const current = this.get(this.componentType);
const original = this.originalObject;
this.set("showUndo", !deepEqual(current, original));
2020-04-20 11:41:13 +02:00
},
2020-04-20 11:41:13 +02:00
actions: {
undoChanges() {
const componentType = this.componentType;
const obj = this.get(componentType);
2020-04-20 11:41:13 +02:00
this.removeObservers(obj.type);
this.revertToOriginal(true);
this.set("showUndo", false);
2020-04-20 11:41:13 +02:00
this.setupObservers(this.get(componentType).type);
},
2020-04-20 11:41:13 +02:00
changeType(type) {
const componentType = this.componentType;
const original = this.get("originalObject");
2020-04-20 11:41:13 +02:00
const obj = this.get(componentType);
2020-04-20 11:41:13 +02:00
this.removeObservers(obj.type);
obj.set("type", type);
2020-04-20 11:41:13 +02:00
this.revertToOriginal();
this.set("showUndo", type !== original.type);
2020-04-20 11:41:13 +02:00
this.setupObservers(type);
},
2021-04-12 07:44:47 +02:00
// eslint-disable-next-line
mappedFieldUpdated(property, mappedComponent, type) {
const obj = this.get(this.componentType);
obj.notifyPropertyChange(property);
},
},
});