From a8aa513b9d07e8cabdb541c5b01d51caf21673bb Mon Sep 17 00:00:00 2001 From: Kaarle Ritvanen Date: Tue, 17 Dec 2013 16:56:42 +0200 Subject: web client: disable deletion for non-removable collection members --- acf2/model/node.lua | 24 ++++++++++++++++++++---- protocol.txt | 14 ++++++++------ web/client.js | 3 ++- 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); -- cgit v1.2.3