summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2013-12-21 12:23:38 +0200
committerKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2013-12-21 13:08:41 +0200
commita4dcb24efa1fbe9c0d05ccb69525ee3e1e5984c9 (patch)
treee74f162746c6cbfb66700962f2b69d3afbcf9e33
parentffb001c705a6f16c7055f5ab18a1f9aad8d7350f (diff)
downloadaconf-a4dcb24efa1fbe9c0d05ccb69525ee3e1e5984c9.tar.bz2
aconf-a4dcb24efa1fbe9c0d05ccb69525ee3e1e5984c9.tar.xz
model: default field to editable if its compute function returns nil
-rw-r--r--acf2/model/field.lua33
-rw-r--r--acf2/model/init.lua2
2 files changed, 21 insertions, 14 deletions
diff --git a/acf2/model/field.lua b/acf2/model/field.lua
index 5a699f6..ebe35ab 100644
--- a/acf2/model/field.lua
+++ b/acf2/model/field.lua
@@ -56,13 +56,8 @@ M.Field = class(M.Member)
function M.Field:init(params)
if not params then params = {} end
- params = setdefaults(
- params,
- {
- addr=params.compute and node.null_addr or nil,
- editable=(params.store or not params.compute) and true or false,
- visible=true
- }
+ setdefaults(
+ params, {addr=params.compute and node.null_addr or nil, visible=true}
)
super(self, M.Field):init(params)
@@ -74,10 +69,6 @@ function M.Field:init(params)
end
end
- if type(self.editable) ~= 'function' then
- function self.editable(obj) return params.editable end
- end
-
self.condition = M.conv_filter(self.condition)
if self.choice then
@@ -105,7 +96,19 @@ function M.Field:init(params)
end
end
-function M.Field:_editable(context) return self:editable(context.parent) end
+function M.Field:_editable(context)
+ if self.editable == nil then
+ if self.store or not self.compute then return true end
+ if self.compute then return self:_compute(context) == nil end
+ return false
+ end
+
+ if type(self.editable) == 'function' then
+ return self:editable(context.parent) and true or false
+ end
+
+ return self.editable
+end
function M.Field:_choice(context) return self.choice end
@@ -135,12 +138,16 @@ end
function M.Field:load(context)
if not context.txn then return setmetatable({}, context) end
local value
- if self.compute then value = self:compute(context.parent, context.txn) end
+ if self.compute then value = self:_compute(context) end
if value == nil then value = self:_load(context) end
if value == nil then return self.default end
return value
end
+function M.Field:_compute(context)
+ return self:compute(context.parent, context.txn)
+end
+
function M.Field:_load(context) return context.txn:get(context.addr) end
function M.Field:_validate(context, value)
diff --git a/acf2/model/init.lua b/acf2/model/init.lua
index 31f4dd6..0e89bc6 100644
--- a/acf2/model/init.lua
+++ b/acf2/model/init.lua
@@ -189,7 +189,7 @@ function M.Collection:init(params, itype)
self.itype = itype or node.Collection
self.iparams = {
destroy=self.destroy,
- editable=self:editable(),
+ editable=self:_editable(),
layout=self.layout,
required=self.required,
ui_member=self.ui_member