summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2013-12-17 16:56:42 +0200
committerKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2013-12-17 19:28:56 +0200
commita8aa513b9d07e8cabdb541c5b01d51caf21673bb (patch)
treefb267c5c0e3476ccb2384fa7020a8156df334666
parent6073e42010ae41bde396d5b140def71c32376f9d (diff)
downloadaconf-a8aa513b9d07e8cabdb541c5b01d51caf21673bb.tar.bz2
aconf-a8aa513b9d07e8cabdb541c5b01d51caf21673bb.tar.xz
web client: disable deletion for non-removable collection members
-rw-r--r--acf2/model/node.lua24
-rw-r--r--protocol.txt14
-rw-r--r--web/client.js3
3 files changed, 30 insertions, 11 deletions
diff --git a/acf2/model/node.lua b/acf2/model/node.lua
index 59c495d..d0d44cd 100644
--- a/acf2/model/node.lua
+++ b/acf2/model/node.lua
@@ -15,6 +15,7 @@ local super = object.super
local pth = require('acf2.path')
local util = require('acf2.util')
+local copy = util.copy
local update = util.update
@@ -81,10 +82,13 @@ function M.TreeNode:init(context, dtype)
function mt.get(k, options) return mt.load(k, options) end
function mt.removable() return true end
+ function mt.member_removable(k)
+ local v = mt.load(k, {dereference=false})
+ return not isinstance(v, M.TreeNode) or getmetatable(v).removable()
+ end
+
function mt.check_removable(k, v)
- if v ~= nil then return end
- local old = mt.load(k, {dereference=false})
- if isinstance(old, M.TreeNode) and not getmetatable(old).removable() then
+ if v == nil and not mt.member_removable(k) then
raise(pth.join(mt.path, k), 'Cannot be deleted')
end
end
@@ -204,9 +208,21 @@ function M.Collection:init(context, params, dtype)
)
end
+ local meta = mt.meta
+ function mt.meta()
+ local res = copy(meta())
+ res.removable = {}
+ for _, member in ipairs(mt.members()) do
+ if mt.member_removable(member) then
+ table.insert(res.removable, member)
+ end
+ end
+ return res
+ end
+
function mt.mmeta(name)
local meta = mt.meta()
- local res = util.copy(meta.members)
+ local res = copy(meta.members)
if name ~= pth.wildcard then
res['ui-name'] = meta['ui-member']..' '..name
end
diff --git a/protocol.txt b/protocol.txt
index f65a93e..035f4ec 100644
--- a/protocol.txt
+++ b/protocol.txt
@@ -52,8 +52,8 @@ resp: JSON object, with the following attributes:
- name (last component of path name)
- ui-name (shown to user)
- description (optional help text)
- - type (e.g. model, collection, set, reference, string,
- number, boolean)
+ - type (e.g. model, collection, list, set, reference,
+ string, number, boolean)
- widget (name of client-side JS module used to display
the data)
- editable (boolean)
@@ -72,10 +72,12 @@ resp: JSON object, with the following attributes:
based on other fields
- fields (model only): array of field metadata JSON
objects
- - members (collections and sets only): metadata for
- members (JSON object)
- - ui-member (collections and sets only): singular noun
- describing members (shown to user)
+ - members (collections, lists, and sets only): metadata
+ for members (JSON object)
+ - ui-member (collections, lists, and sets only): singular
+ noun describing members (shown to user)
+ - removable (collections, lists, and sets only): list of
+ removable members
- scope (references only): subtree where the reference can
refer to
diff --git a/web/client.js b/web/client.js
index ddad75c..976f5e8 100644
--- a/web/client.js
+++ b/web/client.js
@@ -871,7 +871,7 @@ $(function() {
meta.members,
meta["ui-member"] + " " + name,
!set,
- !set
+ !set && _.contains(meta.removable, name)
).trigger("start");
},
@@ -1012,6 +1012,7 @@ $(function() {
name,
isTreeNode(meta.members) ? {} : null
).done(function(txnValid) {
+ meta.removable.push(name);
self.renderCollectionMember(name, meta);
button.prop("class", null);
statusBar.validationReady(txnValid);