app/assets/javascripts/ckeditor/plugins/cells/dialogs/cells.js in nacelle-0.2.4 vs app/assets/javascripts/ckeditor/plugins/cells/dialogs/cells.js in nacelle-0.3.0
- old
+ new
@@ -8,26 +8,118 @@
elements: [{
type: "select",
id: "cellName",
label: "Select Cell",
items: [],
+ onChange: (event) => {
+ let select = event.sender
+ let dialog = select.getDialog()
+ let form = dialog.getContentElement("main", "form")
+ let cellConfig = dialog.cellConfigs.find(config => config.id === event.data.value)
+
+ form.getElement().setHtml(cellConfig.form)
+
+ if(selectedCell = getSelectedCell()) {
+ form.getElement().$.querySelectorAll("[name]").forEach(element => {
+ setValue(element, selectedCell.getAttribute(element.name))
+ })
+ }
+ },
+ },
+ {
+ type: "html",
+ id: "form",
+ html: "",
}],
}],
onShow: function() {
fetch("/nacelle/cells.json").then(r => r.json()).then(data => {
- var select = this.getContentElement("main", "cellName");
- for(var i=0; i < data.cells.length; i++) {
- var item = data.cells[i];
- select.add(item.name, item.id);
+ this.cellConfigs = data.cells
+ let select = this.getContentElement("main", "cellName")
+ select.clear()
+
+ this.cellConfigs.forEach(config => select.add(config.name, config.id))
+
+ let selectedCell = getSelectedCell()
+ if(selectedCell) {
+ select.setValue(selectedCell.getAttribute("name"))
}
});
},
onOk: function() {
- var cell = editor.document.createElement("cell");
+ let cell = editor.document.createElement("cell")
cell.setAttribute("name", this.getValueOf("main", "cellName"));
+
+ let form = this.getContentElement("main", "form")
+ form.getElement().$.querySelectorAll("[name]").forEach(element => {
+ cell.setAttribute(element.name, getValue(element))
+ })
+
editor.insertElement(cell)
},
+ };
+
+ function getSelectedCell() {
+ let node = editor.getSelectedHtml().$.firstElementChild
+ if(node && node.nodeName == "CELL") {
+ return node
+ }
+ }
+
+ function getValue(element) {
+ switch(element.type) {
+ case 'radio':
+ case 'checkbox':
+ const elements = document.querySelectorAll(`[name="${element.name}"]:checked`)
+ const values = Array.from(elements).map(e => e.value)
+ if(element.name.endsWith("[]")) {
+ return values
+ } else {
+ return values[0]
+ }
+ default:
+ return element.value
+ }
+ }
+
+ function setValue(element, value) {
+ if ('undefined' === typeof value) {
+ value = '';
+ }
+
+ if (null === value) {
+ value = '';
+ }
+
+ var type = element.type || element[0].type;
+
+ switch(type ) {
+ default:
+ element.value = value;
+ break;
+
+ case 'radio':
+ case 'checkbox':
+ element.checked = element.value === value;
+ break;
+
+ case 'select-multiple':
+ var values = value.constructor === Array ? value : [value];
+ for(var k = 0; k < element.options.length; k++) {
+ element.options[k].selected = (values.indexOf(element.options[k].value) > -1 );
+ }
+ break;
+
+ case 'select':
+ case 'select-one':
+ element.value = value.toString() || value;
+ break;
+
+ case 'date':
+ element.value = new Date(value).toISOString().split('T')[0];
+ break;
+ }
};
});