summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2013-12-01 11:42:41 +0200
committerKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2013-12-03 23:30:18 +0200
commitd919f0e44851501e8a8cca8b8c59f48e00910abc (patch)
treeffa859a7117abf203d2b3a218bac2dfdafe8b4f0
parent4fd4280e0fdef0903a4ce00debb3f94c67c52d41 (diff)
downloadaconf-d919f0e44851501e8a8cca8b8c59f48e00910abc.tar.bz2
aconf-d919f0e44851501e8a8cca8b8c59f48e00910abc.tar.xz
present choices in relative forms for reference sets
-rw-r--r--acf2/model/init.lua11
-rw-r--r--acf2/model/node.lua2
-rw-r--r--acf2/model/set.lua5
-rw-r--r--protocol.txt3
-rw-r--r--web/client.js4
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);