From 8707c1eccd1f27454ee46ebef5613579c4c3c736 Mon Sep 17 00:00:00 2001 From: Kaarle Ritvanen Date: Wed, 25 Jun 2014 22:35:21 +0300 Subject: web client: editable sets of primitive types --- aconf/model/set.lua | 11 +++++++++-- web/widget/abstract/base.js | 33 +++++++++++++++++++-------------- web/widget/abstract/fields.js | 2 +- web/widget/inline.js | 29 ++++++++++++++++++----------- 4 files changed, 47 insertions(+), 28 deletions(-) diff --git a/aconf/model/set.lua b/aconf/model/set.lua index ac8904b..8b51f12 100644 --- a/aconf/model/set.lua +++ b/aconf/model/set.lua @@ -9,7 +9,7 @@ local TreeNode = require('aconf.model.field').TreeNode local node = require('aconf.model.node') local object = require('aconf.object') local pth = require('aconf.path') -local setdefaults = require('aconf.util').setdefaults +local util = require('aconf.util') M.Set = object.class(require('aconf.model.node').List) @@ -35,7 +35,7 @@ function M.Set:init(context, params) local mt = getmetatable(self) function mt.get(k, options) - options = setdefaults(options or {}, {dereference=true}) + options = util.setdefaults(options or {}, {dereference=true}) local i, v = find(k) if i then return mt.load(i, options) end if options.create then return v end @@ -52,6 +52,13 @@ function M.Set:init(context, params) local insert = mt.insert function mt.insert(v) if not mt.contains(v) then insert(v) end end + + local meta = mt.meta + function mt.meta() + local res = meta() + res.removable = util.map(mt.load, res.removable) + return res + end end diff --git a/web/widget/abstract/base.js b/web/widget/abstract/base.js index 4b2fc37..5dd49a6 100644 --- a/web/widget/abstract/base.js +++ b/web/widget/abstract/base.js @@ -25,11 +25,28 @@ define( this.meta = meta; this.level = level; + function appendRemoveButton(el) { + if (removable) { + var link = dom.href().click(function() { + data.delete(name).done(function(txnValid) { + $("#content").trigger("reload", [txnValid]); + }) + }).text("Delete"); + el = dom.makeRow(el); + if (el.is("tr")) link = $("").html(link); + el.append(link); + } + + return el; + } + var value = data.get(name); - if (!removable && (!editable || !meta.editable)) { + if (!editable || !meta.editable) { var el = this.staticRender(value, meta); if (el) { + el = appendRemoveButton(el); + _.each(["start", "updated"], function(event) { el.on(event, function(event) { event.stopPropagation(); @@ -42,21 +59,9 @@ define( this.makeEl(); this.dynamic = meta.dynamic; - - this.wrapped = this.wrap(); this.visible = true; - if (removable) { - var link = dom.href().click(function() { - data.delete(name).done(function(txnValid) { - $("#content").trigger("reload", [txnValid]); - }) - }).text("Delete"); - this.wrapped = dom.makeRow(this.wrapped); - if (this.wrapped.is("tr")) link = $("").html(link); - this.wrapped.append(link); - } - + this.wrapped = appendRemoveButton(this.wrap()); this.wrapped.data("description", meta.description); this.handleResponse(this.requestData(value, meta)); diff --git a/web/widget/abstract/fields.js b/web/widget/abstract/fields.js index 7a9773f..f7fdfbe 100644 --- a/web/widget/abstract/fields.js +++ b/web/widget/abstract/fields.js @@ -111,7 +111,7 @@ define( name, meta.members, !set, - !set && _.contains(meta.removable, name) + _.contains(meta.removable, name) ); this.setupWidget( widget, set ? null : meta["ui-member"] + " " + name diff --git a/web/widget/inline.js b/web/widget/inline.js index 87e6bc7..9fd89f8 100644 --- a/web/widget/inline.js +++ b/web/widget/inline.js @@ -24,8 +24,7 @@ define( this.el.append(this.div); - if (meta.editable && - _.contains(["collection", "list"], meta.type)) { + if (meta.editable && type.isCollection(meta)) { if (!this.table) this.makeSortable(this.div); var self = this; @@ -36,8 +35,11 @@ define( function insert() { var name = getter(); + var set = meta.type == "set"; + + if (set ? _.contains(data.data, name) : + name in data.data) { - if (name in data.data) { statusBar.setError("Already exists: " + name); return; } @@ -48,8 +50,13 @@ define( return self.renderCollectionMember(name, meta); } + var task; if (type.isTreeNode(meta.members)) - data.set(name, {}).done(function(txnValid) { + task = data.set(name, {}); + else if (set) task = data.add(name); + + if (task) + task.done(function(txnValid) { render(txnValid); button.show(); }).fail(function(xhr) { @@ -71,7 +78,13 @@ define( button.hide(); - if (meta.type == "collection") { + if (meta.type == "list") { + getter = function() { + return data.data.length + 1; + }; + insert(); + } + else { var field = $("").attr({type: "text"}) .change(insert); row = $("").html($("").html(field)); @@ -79,12 +92,6 @@ define( self.appendRow(row); field.focus(); } - else { - getter = function() { - return data.data.length + 1; - }; - insert(); - } }); this.el.append($("

").html(button)); } -- cgit v1.2.3