diff options
author | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2013-11-25 20:30:19 +0200 |
---|---|---|
committer | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2013-11-25 23:28:52 +0200 |
commit | 4ff7513fec2df0f079b844c7c558e9ad6c448b16 (patch) | |
tree | 2226660ea02f0502fd264f243ecd883f1dc4d415 | |
parent | 878c1bc580d89d70d330eb896d7affc88f776ce0 (diff) | |
download | aconf-4ff7513fec2df0f079b844c7c558e9ad6c448b16.tar.bz2 aconf-4ff7513fec2df0f079b844c7c558e9ad6c448b16.tar.xz |
resolve reference choices on server side
-rw-r--r-- | acf2/model/init.lua | 16 | ||||
-rw-r--r-- | protocol.txt | 1 | ||||
-rw-r--r-- | web/client.js | 54 |
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); |