summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2014-06-25 22:35:21 +0300
committerKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2014-06-25 23:35:46 +0300
commit8707c1eccd1f27454ee46ebef5613579c4c3c736 (patch)
tree80d0b770ab3b09e2208524d8ea6e10f912919252
parent9b1a1d67f288ef3ba01d2c6c5724d844eb67ca02 (diff)
downloadaconf-8707c1eccd1f27454ee46ebef5613579c4c3c736.tar.bz2
aconf-8707c1eccd1f27454ee46ebef5613579c4c3c736.tar.xz
web client: editable sets of primitive types
-rw-r--r--aconf/model/set.lua11
-rw-r--r--web/widget/abstract/base.js33
-rw-r--r--web/widget/abstract/fields.js2
-rw-r--r--web/widget/inline.js29
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 = $("<td>").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 = $("<td>").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 = $("<input>").attr({type: "text"})
.change(insert);
row = $("<tr>").html($("<td>").html(field));
@@ -79,12 +92,6 @@ define(
self.appendRow(row);
field.focus();
}
- else {
- getter = function() {
- return data.data.length + 1;
- };
- insert();
- }
});
this.el.append($("<p>").html(button));
}