Browse Source

Merge branch 'dashboards' into 'master'

Dashboards

See merge request medlabboulder/modpol!20
Nathan Schneider 3 years ago
parent
commit
51b30d57e5
1 changed files with 52 additions and 9 deletions
  1. 52 9
      modpol_minetest/overrides/interactions/interactions.lua

+ 52 - 9
modpol_minetest/overrides/interactions/interactions.lua

@@ -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)