Merge branch 'dashboards' into 'master'

Dashboards

See merge request medlabboulder/modpol!20
This commit is contained in:
Nathan Schneider 2021-04-29 05:16:21 +00:00
commit 51b30d57e5

View File

@ -29,6 +29,9 @@ local formspec_fields = {}
-- output: a formspec-ready list of the strings -- output: a formspec-ready list of the strings
local function formspec_list(array) local function formspec_list(array)
local escaped = {} local escaped = {}
if not array then
return ""
end
for i = 1, #array do for i = 1, #array do
escaped[i] = minetest.formspec_escape(array[i]) escaped[i] = minetest.formspec_escape(array[i])
end end
@ -54,7 +57,7 @@ function modpol.interactions.dashboard(user)
local formspec = { local formspec = {
"formspec_version[4]", "formspec_version[4]",
"size[10,8]", "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:]", "label[0.5,2;All orgs:]",
"dropdown[2,1.5;5,0.8;all_orgs;"..formspec_list(all_orgs)..";;]", "dropdown[2,1.5;5,0.8;all_orgs;"..formspec_list(all_orgs)..";;]",
"label[0.5,3;Your orgs:]", "label[0.5,3;Your orgs:]",
@ -76,12 +79,20 @@ end
minetest.register_on_player_receive_fields(function (player, formname, fields) minetest.register_on_player_receive_fields(function (player, formname, fields)
if formname == "modpol:dashboard" then if formname == "modpol:dashboard" then
local pname = player:get_player_name() 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):") modpol.interactions.binary_poll_org(pname, 1, "Poll question (yes/no):")
elseif fields.add_org then elseif fields.add_org then
modpol.interactions.add_org(pname, 1) modpol.interactions.add_org(pname, 1)
elseif fields.remove_org then elseif fields.remove_org then
modpol.interactions.remove_org(pname) 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 end
end) end)
@ -94,24 +105,47 @@ function modpol.interactions.org_dashboard(user, org_name)
-- prepare data -- prepare data
local org = modpol.orgs.get_org(org_name) local org = modpol.orgs.get_org(org_name)
if not org then return nil end 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 -- set player context
_contexts[user][current_org] = org local user_context = {}
user_context["current_org"] = org_name
_contexts[user] = user_context
-- set up formspec -- set up formspec
local formspec = { local formspec = {
"formspec_version[4]", "formspec_version[4]",
"size[10,8]", "size[10,8]",
"label[0.5,0.5;Org: ".. "label[0.5,0.5;Org: "..
minetest.formspec_escape(org_name).."]", 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:]", "label[0.5,2;Members:]",
"dropdown[2,1.5;5,0.8;user_orgs;"..formspec_list(org.members)..";;]", "dropdown[2,1.5;5,0.8;user_orgs;"..formspec_list(org.members)..";;]",
"label[0.5,3;Children:]", "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:]", "label[0.5,4;Policies:]",
"dropdown[2,3.5;5,0.8;policies;"..formspec_list(org.policies)..";;]", "dropdown[2,3.5;5,0.8;policies;"..formspec_list(org.policies)..";;]",
"label[0.5,5;Processes:]", "label[0.5,5;Processes:]",
"dropdown[2,4.5;5,0.8;processes;"..formspec_list(org.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[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[3.5,7;1.5,0.8;remove_org;Remove org]",
"button[8.5,7;1,0.8;back;Back]", "button[8.5,7;1,0.8;back;Back]",
} }
@ -123,10 +157,18 @@ end
minetest.register_on_player_receive_fields(function (player, formname, fields) minetest.register_on_player_receive_fields(function (player, formname, fields)
if formname == "modpol:org_dashboard" then if formname == "modpol:org_dashboard" then
local pname = player:get_player_name() 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):") modpol.interactions.binary_poll_org(pname, _contexts.pname.current_org.id, "Poll question (yes/no):")
elseif fields.add_org then elseif fields.add_child then
modpol.interactions.add_org(pname, _contexts.pname.current_org.id) modpol.interactions.add_org(pname, org.id)
elseif fields.remove_org then elseif fields.remove_org then
modpol.interactions.remove_org(pname) modpol.interactions.remove_org(pname)
elseif fields.back then elseif fields.back then
@ -203,6 +245,7 @@ minetest.register_on_player_receive_fields(function (player, formname, fields)
end end
end) end)
-- SECONDARY INTERACTIONS -- SECONDARY INTERACTIONS
-- ====================== -- ======================
@ -276,7 +319,7 @@ function modpol.interactions.add_org(initiator, base_org_id)
_contexts[initiator] = function(input) _contexts[initiator] = function(input)
if input then if input then
local base_org = modpol.orgs.get_org(base_org_id) 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 if result then
local message = input .. " created" local message = input .. " created"
modpol.interactions.message(initiator, message) modpol.interactions.message(initiator, message)