|
@@ -29,6 +29,9 @@ local formspec_fields = {}
|
|
|
-- output: a formspec-ready list of the strings
|
|
|
local function formspec_list(array)
|
|
|
local escaped = {}
|
|
|
+ if not array then
|
|
|
+ return ""
|
|
|
+ end
|
|
|
for i = 1, #array do
|
|
|
escaped[i] = minetest.formspec_escape(array[i])
|
|
|
end
|
|
@@ -54,7 +57,7 @@ function modpol.interactions.dashboard(user)
|
|
|
local formspec = {
|
|
|
"formspec_version[4]",
|
|
|
"size[10,8]",
|
|
|
- "label[0.5,0.5;MODULAR POLITICS]",
|
|
|
+ "label[0.5,0.5;M O D U L A R P O L I T I C S]",
|
|
|
"label[0.5,2;All orgs:]",
|
|
|
"dropdown[2,1.5;5,0.8;all_orgs;"..formspec_list(all_orgs)..";;]",
|
|
|
"label[0.5,3;Your orgs:]",
|
|
@@ -76,12 +79,20 @@ end
|
|
|
minetest.register_on_player_receive_fields(function (player, formname, fields)
|
|
|
if formname == "modpol:dashboard" then
|
|
|
local pname = player:get_player_name()
|
|
|
- if fields.test_poll then
|
|
|
+ if nil then
|
|
|
+ -- buttons first
|
|
|
+ elseif fields.test_poll then
|
|
|
modpol.interactions.binary_poll_org(pname, 1, "Poll question (yes/no):")
|
|
|
elseif fields.add_org then
|
|
|
modpol.interactions.add_org(pname, 1)
|
|
|
elseif fields.remove_org then
|
|
|
modpol.interactions.remove_org(pname)
|
|
|
+ -- dropdowns need to go last
|
|
|
+ elseif fields.close then
|
|
|
+ minetest.close_formspec(pname, formname)
|
|
|
+ elseif fields.all_orgs or fields.user_orgs then
|
|
|
+ local org_name = fields.all_orgs or fields.user_orgs
|
|
|
+ modpol.interactions.org_dashboard(pname, org_name)
|
|
|
end
|
|
|
end
|
|
|
end)
|
|
@@ -94,24 +105,47 @@ function modpol.interactions.org_dashboard(user, org_name)
|
|
|
-- prepare data
|
|
|
local org = modpol.orgs.get_org(org_name)
|
|
|
if not org then return nil end
|
|
|
+ local is_member = org:has_member(user)
|
|
|
+ local membership_toggle = function()
|
|
|
+ local toggle_code = ""
|
|
|
+ if is_member then
|
|
|
+ toggle_code = toggle_code
|
|
|
+ ..minetest.formspec_escape("leave")..";"
|
|
|
+ ..minetest.formspec_escape("Leave").."]"
|
|
|
+ else
|
|
|
+ toggle_code = toggle_code
|
|
|
+ ..minetest.formspec_escape("join")..";"
|
|
|
+ ..minetest.formspec_escape("Join").."]"
|
|
|
+ end
|
|
|
+ return toggle_code
|
|
|
+ end
|
|
|
+ local children = {}
|
|
|
+ for k,v in ipairs(org.children) do
|
|
|
+ local this_child = modpol.orgs.get_org(v)
|
|
|
+ table.insert(children, this_child.name)
|
|
|
+ end
|
|
|
-- set player context
|
|
|
- _contexts[user][current_org] = org
|
|
|
+ local user_context = {}
|
|
|
+ user_context["current_org"] = org_name
|
|
|
+ _contexts[user] = user_context
|
|
|
-- set up formspec
|
|
|
local formspec = {
|
|
|
"formspec_version[4]",
|
|
|
"size[10,8]",
|
|
|
"label[0.5,0.5;Org: "..
|
|
|
minetest.formspec_escape(org_name).."]",
|
|
|
+ "label[0.5,1;Parent: TODO]",
|
|
|
+ "button[8.5,0.5;1,0.8;"..membership_toggle(),
|
|
|
"label[0.5,2;Members:]",
|
|
|
"dropdown[2,1.5;5,0.8;user_orgs;"..formspec_list(org.members)..";;]",
|
|
|
"label[0.5,3;Children:]",
|
|
|
- "dropdown[2,2.5;5,0.8;children;"..formspec_list(org.children)..";;]",
|
|
|
+ "dropdown[2,2.5;5,0.8;children;"..formspec_list(children)..";;]",
|
|
|
"label[0.5,4;Policies:]",
|
|
|
"dropdown[2,3.5;5,0.8;policies;"..formspec_list(org.policies)..";;]",
|
|
|
"label[0.5,5;Processes:]",
|
|
|
"dropdown[2,4.5;5,0.8;processes;"..formspec_list(org.processes)..";;]",
|
|
|
"button[0.5,7;1,0.8;test_poll;Test poll]",
|
|
|
- "button[2,7;1,0.8;add_org;Add child]",
|
|
|
+ "button[2,7;1,0.8;add_child;Add child]",
|
|
|
"button[3.5,7;1.5,0.8;remove_org;Remove org]",
|
|
|
"button[8.5,7;1,0.8;back;Back]",
|
|
|
}
|
|
@@ -123,10 +157,18 @@ end
|
|
|
minetest.register_on_player_receive_fields(function (player, formname, fields)
|
|
|
if formname == "modpol:org_dashboard" then
|
|
|
local pname = player:get_player_name()
|
|
|
- if fields.test_poll then
|
|
|
+ local org = modpol.orgs.get_org(_contexts[pname].current_org)
|
|
|
+ if nil then
|
|
|
+ elseif fields.join then
|
|
|
+ org:add_member(pname)
|
|
|
+ modpol.interactions.org_dashboard(pname,org.name)
|
|
|
+ elseif fields.leave then
|
|
|
+ org:remove_member(pname)
|
|
|
+ modpol.interactions.dashboard(pname)
|
|
|
+ elseif fields.test_poll then
|
|
|
modpol.interactions.binary_poll_org(pname, _contexts.pname.current_org.id, "Poll question (yes/no):")
|
|
|
- elseif fields.add_org then
|
|
|
- modpol.interactions.add_org(pname, _contexts.pname.current_org.id)
|
|
|
+ elseif fields.add_child then
|
|
|
+ modpol.interactions.add_org(pname, org.id)
|
|
|
elseif fields.remove_org then
|
|
|
modpol.interactions.remove_org(pname)
|
|
|
elseif fields.back then
|
|
@@ -203,6 +245,7 @@ minetest.register_on_player_receive_fields(function (player, formname, fields)
|
|
|
end
|
|
|
end)
|
|
|
|
|
|
+
|
|
|
-- SECONDARY INTERACTIONS
|
|
|
-- ======================
|
|
|
|
|
@@ -276,7 +319,7 @@ function modpol.interactions.add_org(initiator, base_org_id)
|
|
|
_contexts[initiator] = function(input)
|
|
|
if input then
|
|
|
local base_org = modpol.orgs.get_org(base_org_id)
|
|
|
- local result = base_org:add_org(input)
|
|
|
+ local result = base_org:add_org(input, initiator)
|
|
|
if result then
|
|
|
local message = input .. " created"
|
|
|
modpol.interactions.message(initiator, message)
|