diff --git a/modpol_core/interactions/interactions.lua b/modpol_core/interactions/interactions.lua index 1581e78..83b37a3 100644 --- a/modpol_core/interactions/interactions.lua +++ b/modpol_core/interactions/interactions.lua @@ -5,6 +5,35 @@ modpol.interactions = {} +-- UTILITIES +-- ========= + +--- Output: returns a string listing a module's policies +-- @function modpol.interactions.get_policy_string +-- @param org (string or number) name or id for the org +-- @param module_slug (string) +-- @param sep (string) separator string +function modpol.interactions.get_policy_string( + org, module_slug, sep) + local this_org = modpol.orgs.get_org(org) + local this_module = modpol.modules[module_slug] + local output = {} + if modpol.util.num_pairs(this_module.config) > 0 then + for k, v in pairs(this_module.config) do + local this_policy = "" + -- org policies + if this_org.policies[module_slug] + and this_org.policies[module_slug][k] then + this_policy = k .. " - " .. + tostring(this_org.policies[module_slug][k]) + else + this_policy = k .. " - " .. tostring(v) + end + table.insert(output,this_policy) + end + end + return "Policies:\n" .. table.concat(output, sep) +end -- DASHBOARDS -- ========== @@ -165,8 +194,23 @@ function modpol.interactions.org_dashboard(user, org_string) module_result = true end end + local module = org.modules[module_sel] if module_result then - org:call_module(module_sel, user) + modpol.interactions.binary_poll_user( + user, + module.name..":\n".. + module.desc.."\n".. + modpol.interactions.get_policy_string( + org.name, module.slug, "\n").. + "\n".."Proceed?", + function(input) + if input == "Yes" then + org:call_module(module_sel, user) + elseif input == "No" then + modpol.interactions.org_dashboard( + pname, org.id) + end + end) else print("Error: Module not found.") modpol.interactions.org_dashboard(user, org.id) diff --git a/modpol_core/orgs/base.lua b/modpol_core/orgs/base.lua index 1f31cd2..e3510f8 100644 --- a/modpol_core/orgs/base.lua +++ b/modpol_core/orgs/base.lua @@ -15,11 +15,12 @@ function temp_org() id = nil, name = nil, modules = modpol.util.copy_table(modpol.modules), + policies = {}, processes = {}, pending = {}, members = {}, parent = nil, - children = {} + children = {}, } end diff --git a/modpol_core/orgs/process.lua b/modpol_core/orgs/process.lua index aedaa36..4ae012e 100644 --- a/modpol_core/orgs/process.lua +++ b/modpol_core/orgs/process.lua @@ -18,12 +18,22 @@ function modpol.orgs:call_module(module_slug, initiator, config, result, parent_ local module = modpol.modules[module_slug] -- sets default values for undeclared config variables - if modpol.util.num_pairs(module.config) > 0 and config then - for k, v in pairs(module.config) do - if config[k] == nil then - config[k] = v - end - end + -- first applies any relevant org policies + -- then overrides with the config values given on input + local new_config = {} + if modpol.util.num_pairs(module.config) > 0 then + for k, v in pairs(module.config) do + new_config[k] = v + -- org policies + if self.policies[module_slug] + and self.policies[module_slug][k] then + new_config[k] = self.policies[module_slug][k] + end + -- input settings + if config and config[k] then + new_config[k] = config[k] + end + end end -- setting default params @@ -34,7 +44,7 @@ function modpol.orgs:call_module(module_slug, initiator, config, result, parent_ id = index, parent_id = parent_id, children = {}, - config = config, + config = modpol.util.copy_table(new_config), data = modpol.util.copy_table(module.data), slug = module_slug } diff --git a/modpol_minetest/overrides/interactions.lua b/modpol_minetest/overrides/interactions.lua index 9bbca45..82d71fb 100644 --- a/modpol_minetest/overrides/interactions.lua +++ b/modpol_minetest/overrides/interactions.lua @@ -237,7 +237,9 @@ minetest.register_on_player_receive_fields(function (player, formname, fields) pname, module.name..":\n".. module.desc.."\n".. - "Proceed?", + modpol.interactions.get_policy_string( + org.name, module.slug, ", ").. + "\n".."Proceed?", function(input) if input == "Yes" then org:call_module(module.slug, pname) @@ -570,10 +572,10 @@ function modpol.interactions.binary_poll_user(user, question, func) -- set up formspec local formspec = { "formspec_version[4]", - "size[8,4]", + "size[8,6]", "label[0.375,0.5;",minetest.formspec_escape(question), "]", - "button[1,2.5;1,0.8;yes;Yes]", - "button[2,2.5;1,0.8;no;No]", + "button[1,5;1,0.8;yes;Yes]", + "button[2,5;1,0.8;no;No]", --TODO can we enable text wrapping? --TODO we could use scroll boxes to contain the text }