summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2013-11-25 20:30:19 +0200
committerKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2013-11-25 23:28:52 +0200
commit4ff7513fec2df0f079b844c7c558e9ad6c448b16 (patch)
tree2226660ea02f0502fd264f243ecd883f1dc4d415
parent878c1bc580d89d70d330eb896d7affc88f776ce0 (diff)
downloadaconf-4ff7513fec2df0f079b844c7c558e9ad6c448b16.tar.bz2
aconf-4ff7513fec2df0f079b844c7c558e9ad6c448b16.tar.xz
resolve reference choices on server side
-rw-r--r--acf2/model/init.lua16
-rw-r--r--protocol.txt1
-rw-r--r--web/client.js54
3 files changed, 29 insertions, 42 deletions
diff --git a/acf2/model/init.lua b/acf2/model/init.lua
index a45197d..27a2e32 100644
--- a/acf2/model/init.lua
+++ b/acf2/model/init.lua
@@ -7,6 +7,7 @@ local M = {}
M.error = require('acf2.error')
local raise = M.error.raise
+local relabel = M.error.relabel
local combination = require('acf2.model.combination')
M.Union = combination.Union
@@ -81,6 +82,19 @@ end
function M.Reference:meta(context)
local res = super(self, M.Reference):meta(context)
res.scope = self:abs_scope(context)
+
+ local txn = context.txn
+ local obj = relabel('system', txn.fetch, txn, res.scope)
+ assert(isinstance(obj, node.Collection))
+ res.choice = {}
+ for k, v in node.pairs(obj) do
+ if isinstance(v, node.TreeNode) then
+ v = node.path(v)
+ v = {value=v, ['ui-value']=pth.name(v), path=true}
+ else v = {value=pth.escape(v), ['ui-value']=v} end
+ table.insert(res.choice, v)
+ end
+
return res
end
@@ -120,7 +134,7 @@ function M.Reference:_validate(context, value)
end
-- TODO check instance type
- M.error.relabel(path, self.follow, self, context, value)
+ relabel(path, self.follow, self, context, value)
return value
end
diff --git a/protocol.txt b/protocol.txt
index 68f62d7..0751d97 100644
--- a/protocol.txt
+++ b/protocol.txt
@@ -66,6 +66,7 @@ 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)
- 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 cf7910f..ce5a031 100644
--- a/web/client.js
+++ b/web/client.js
@@ -487,14 +487,14 @@ $(function() {
Field.init = function(
data, name, meta, level, editable, removable
) {
- var el = _.bind(Widget.init, this)(
- data, name, meta, level, editable, removable
- );
-
this.data = data;
this.name = name;
this.editable = editable && meta.editable;
+ var el = _.bind(Widget.init, this)(
+ data, name, meta, level, editable, removable
+ );
+
this.onChange(this.validate);
if (data.status(name) == "invalid") this.validate();
@@ -653,7 +653,7 @@ $(function() {
Inline.requestData = function(value, meta) {
var def = $.Deferred();
txnMgr.query(value).done(function(data) {
- def.resolve(data, meta);
+ def.resolve(data, data.meta);
});
return def;
};
@@ -926,19 +926,6 @@ $(function() {
var CheckBoxes = Object.create(HeaderInline);
- CheckBoxes.requestData = function(value, meta) {
- var def = $.Deferred();
- Inline.requestData(value, meta).done(function(data, meta) {
- txnMgr.query(data.meta.members.scope).done(function(sdata) {
- meta.primitive = sdata.meta.type == "set";
- meta.choice = meta.primitive ?
- _.values(sdata.data) : _.keys(sdata.data);
- def.resolve(data, meta);
- });
- });
- return def;
- };
-
CheckBoxes.render = function(data, meta) {
_.bind(HeaderInline.render, this)(data, meta);
@@ -947,36 +934,32 @@ $(function() {
var self = this;
- _.each(meta.choice, function(choice) {
- var ec = meta.primitive ? escape(choice) : choice;
-
+ _.each(meta.members.choice, function(choice) {
var cbox = $("<input>").attr({
type: "checkbox",
- checked: _.contains(data.data, ec)
+ checked: _.contains(data.data, choice.value)
});
var row = $("<tr>");
row.append($("<td>").html(cbox));
var item = $("<td>");
- if (meta.primitive) item.text(choice);
- else item.html(
- Link.staticRender(
- join(data.meta.members.scope, choice)
- ).text(choice)
+ if (choice.path) item.html(
+ Link.staticRender(choice.value).text(choice["ui-value"])
);
+ else item.text(choice["ui-value"]);
row.append(item);
function setStatus() {
- self.setElStatus(row, data.status(ec));
+ self.setElStatus(row, data.status(choice.value));
}
setStatus();
cbox.change(function() {
(
cbox.is(":checked") ?
- data.add(ec) :
- data.delete(ec)
+ data.add(choice.value) :
+ data.delete(choice.value)
).done(function(txnValid) {
setStatus();
statusBar.validationReady(txnValid);
@@ -1009,17 +992,6 @@ $(function() {
Reference.createEl = function() { return $("<div>"); };
- Reference.requestData = function(value, meta) {
- var def = $.Deferred();
- txnMgr.query(meta.scope).done(function(data) {
- meta.choice = _.map(_.values(data.data), function(path) {
- return {value: path, "ui-value": split(path).pop()};
- });
- def.resolve(value, meta);
- });
- return def;
- };
-
Reference.render = function(value, meta) {
_.bind(ComboBox.render, this)(value, meta);