diff options
-rw-r--r-- | acf2/model/init.lua | 11 | ||||
-rw-r--r-- | acf2/model/node.lua | 2 | ||||
-rw-r--r-- | acf2/model/set.lua | 5 | ||||
-rw-r--r-- | protocol.txt | 3 | ||||
-rw-r--r-- | web/client.js | 4 |
5 files changed, 16 insertions, 9 deletions
diff --git a/acf2/model/init.lua b/acf2/model/init.lua index 17f9ff4..62f114b 100644 --- a/acf2/model/init.lua +++ b/acf2/model/init.lua @@ -55,6 +55,7 @@ local isinstance = object.isinstance local super = object.super local pth = require('acf2.path') +local update = require('acf2.util').update local stringy = require('stringy') @@ -66,6 +67,7 @@ function M.Reference:init(params) if not params.widget then params.widget = 'reference' end super(self, M.Reference):init(params) self.dtype = 'reference' + self.dereference = true if not self.scope then self.scope = '/' end end @@ -90,8 +92,11 @@ function M.Reference:meta(context) for k, v in node.pairs(obj) do if isinstance(v, node.TreeNode) then v = node.path(v) + local name = pth.name(v) v = not pth.is_subordinate(context.path, v) and { - value=v, ['ui-value']=pth.name(v), path=true + value=self.dereference and v or pth.escape(name), + ['ui-value']=name, + ref=v } or nil else v = {value=pth.escape(v), ['ui-value']=v} end if v then table.insert(res.choice, v) end @@ -107,7 +112,9 @@ end function M.Reference:load(context, options) local ref = super(self, M.Reference):load(context) return ( - (not options or options.dereference ~= false) and context.txn and ref + update( + options or {}, {dereference=self.dereference} + ).dereference and context.txn and ref ) and self:follow(context, ref) or ref end diff --git a/acf2/model/node.lua b/acf2/model/node.lua index 45167af..554fa8c 100644 --- a/acf2/model/node.lua +++ b/acf2/model/node.lua @@ -60,7 +60,6 @@ function M.TreeNode:init(context) util.update(mt, context) mt.__eq = equal_tns - mt.dereference = true mt._meta = {} function mt.get(k, create) return mt.load(k, {create=create}) end @@ -276,7 +275,6 @@ function M.pairs(tbl, dereference) if not isinstance(tbl, M.TreeNode) then return pairs(tbl) end local mt = getmetatable(tbl) - if dereference == nil then dereference = mt.dereference end local res = {} for _, member in ipairs(mt.members()) do diff --git a/acf2/model/set.lua b/acf2/model/set.lua index 808dc58..ac5600b 100644 --- a/acf2/model/set.lua +++ b/acf2/model/set.lua @@ -15,6 +15,8 @@ M.Set = object.class(require('acf2.model.node').List) function M.Set:init(context, params) assert(not object.isinstance(params.field, TreeNode)) + params.field.dereference = false + object.super(self, M.Set):init(context, params) local function find(value) @@ -24,12 +26,11 @@ function M.Set:init(context, params) end local mt = getmetatable(self) - mt.dereference = false mt._meta.type = 'set' function mt.get(k, create) local i = find(k) - if i then return mt.load(i) end + if i then return mt.load(i, {dereference=true}) end if create then return k end end diff --git a/protocol.txt b/protocol.txt index 0751d97..eb03a4b 100644 --- a/protocol.txt +++ b/protocol.txt @@ -66,7 +66,8 @@ resp: JSON object, with the following attributes: objects with the following attributes: - value - ui-value (user-friendly version) - - path (boolean indicating whether the value refers to an object) + - ref (absolute path to the referred object, not defined + if refers to a primitive value) - fields (model only): array of field metadata JSON objects - members (collections and sets only): metadata for diff --git a/web/client.js b/web/client.js index ce5a031..aa3c649 100644 --- a/web/client.js +++ b/web/client.js @@ -944,8 +944,8 @@ $(function() { row.append($("<td>").html(cbox)); var item = $("<td>"); - if (choice.path) item.html( - Link.staticRender(choice.value).text(choice["ui-value"]) + if (choice.ref) item.html( + Link.staticRender(choice.ref).text(choice["ui-value"]) ); else item.text(choice["ui-value"]); row.append(item); |