From 873ea67e9ce1ed780a7b0b1104ecae9e7cd2e555 Mon Sep 17 00:00:00 2001 From: azivner Date: Sun, 4 Feb 2018 17:22:21 -0500 Subject: [PATCH] nice UI for attributes with validation --- src/public/javascripts/dialogs/attributes.js | 88 +++++++++++++++++--- src/views/index.ejs | 13 +-- 2 files changed, 85 insertions(+), 16 deletions(-) diff --git a/src/public/javascripts/dialogs/attributes.js b/src/public/javascripts/dialogs/attributes.js index 21c97e983..76023b970 100644 --- a/src/public/javascripts/dialogs/attributes.js +++ b/src/public/javascripts/dialogs/attributes.js @@ -14,26 +14,94 @@ const attributesDialog = (function() { const attributes = await server.get('notes/' + noteId + '/attributes'); - this.attributes(attributes); + self.attributes(attributes.map(ko.observable)); + + addLastEmptyRow(); }; - this.addNewRow = function() { - self.attributes.push({ - attributeId: '', - name: '', - value: '' - }); - }; + function isValid() { + for (let attrs = self.attributes(), i = 0; i < attrs.length; i++) { + if (self.isEmptyName(i) || self.isNotUnique(i)) { + return false; + } + } + + return true; + } this.save = async function() { + if (!isValid()) { + alert("Please fix all validation errors and try saving again."); + return; + } + const noteId = noteEditor.getCurrentNoteId(); - const attributes = await server.put('notes/' + noteId + '/attributes', this.attributes()); + const attributesToSave = self.attributes() + .map(attr => attr()) + .filter(attr => attr.attributeId !== "" || attr.name !== ""); - self.attributes(attributes); + const attributes = await server.put('notes/' + noteId + '/attributes', attributesToSave); + + self.attributes(attributes.map(ko.observable)); + + addLastEmptyRow(); showMessage("Attributes have been saved."); }; + + function addLastEmptyRow() { + const attrs = self.attributes(); + const last = attrs[attrs.length - 1](); + +// console.log("last", attrs.map(attr => attr())); + + if (last.name.trim() !== "" || last.value !== "") { + console.log("Adding new row"); + + self.attributes.push(ko.observable({ + attributeId: '', + name: '', + value: '' + })); + } + } + + this.attributeChanged = function (row) { + console.log(row); + + addLastEmptyRow(); + + for (const attr of self.attributes()) { + if (row.attributeId === attr().attributeId) { + attr.valueHasMutated(); + } + } + }; + + this.isNotUnique = function(index) { + const cur = self.attributes()[index](); + + if (cur.name.trim() === "") { + return false; + } + + for (let attrs = self.attributes(), i = 0; i < attrs.length; i++) { + const attr = attrs[i](); + + if (index !== i && cur.name === attr.name) { + return true; + } + } + + return false; + }; + + this.isEmptyName = function(index) { + const cur = self.attributes()[index](); + + return cur.name.trim() === "" && (cur.attributeId !== "" || cur.value !== ""); + } } async function showDialog() { diff --git a/src/views/index.ejs b/src/views/index.ejs index b23e72c52..aaf57880f 100644 --- a/src/views/index.ejs +++ b/src/views/index.ejs @@ -383,10 +383,8 @@