@blinkk/selective-edit
Version:
Selective structured text editor.
107 lines • 3.52 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SelectiveEditor = void 0;
const fields_1 = require("./fields");
const lit_html_1 = require("lit-html");
const autoFields_1 = require("./autoFields");
const mixins_1 = require("../mixins");
const classes_1 = require("../utility/classes");
const data_1 = require("../mixins/data");
const events_1 = require("./events");
class SelectiveEditor extends (0, data_1.DataMixin)(mixins_1.Base) {
constructor(config, container) {
super();
this.container = container;
this.config = config;
this.types = {
fields: new classes_1.ClassManager(),
globals: {
FieldsCls: fields_1.Fields,
AutoFieldsCls: autoFields_1.AutoFields,
},
rules: new classes_1.ClassManager(),
};
this.isRendering = false;
this.isPendingRender = false;
if (this.config.fieldTypes) {
this.types.fields.registerClasses(this.config.fieldTypes);
}
if (this.config.ruleTypes) {
this.types.rules.registerClasses(this.config.ruleTypes);
}
this.fields = new fields_1.Fields(this.types, {
fields: this.config.fields,
parentKey: '',
}, this.config.global || {});
}
addFieldType(key, FieldCls) {
this.types.fields.registerClass(key, FieldCls);
this.resetFields();
}
addFieldTypes(fieldTypes) {
this.types.fields.registerClasses(fieldTypes);
this.resetFields();
}
addRuleType(key, RuleCls) {
this.types.rules.registerClass(key, RuleCls);
}
addRuleTypes(ruleTypes) {
this.types.rules.registerClasses(ruleTypes);
}
guessFields() {
const autoFields = new this.types.globals.AutoFieldsCls({});
if (!this.data) {
this.config.fields = [];
this.resetFields();
return this.config.fields;
}
this.config.fields = autoFields.guessFields(this.data?.obj);
this.resetFields();
return this.config.fields;
}
get isClean() {
return this.fields.isClean;
}
get isValid() {
return this.fields.isValid;
}
template(editor, data) {
return (0, lit_html_1.html) `<div class="selective">
${editor.fields.template(editor, data)}
</div>`;
}
render() {
// When no container is defined, it is rendered externally.
if (!this.container || !this.data) {
return;
}
if (this.isRendering) {
this.isPendingRender = true;
return;
}
this.isPendingRender = false;
this.isRendering = true;
const isClean = this.isClean;
const isValid = this.isValid;
(0, lit_html_1.render)(this.template(this, this.data), this.container);
this.isRendering = false;
document.dispatchEvent(new CustomEvent(events_1.EVENT_RENDER_COMPLETE));
if (this.isPendingRender ||
this.isClean !== isClean ||
this.isValid !== isValid) {
this.render();
}
}
resetFields() {
this.fields = new fields_1.Fields(this.types, {
fields: this.config.fields,
parentKey: '',
}, this.config.global || {});
this.render();
}
get value() {
return this.fields.value;
}
}
exports.SelectiveEditor = SelectiveEditor;
//# sourceMappingURL=editor.js.map