bsw@248: function change_delegation(scope, unit_id, area_id, issue, delegation, initiative_id)
bsw@281:   local check_unit_id
bsw@281:   if unit_id then
bsw@281:     check_unit_id = unit_id
bsw@281:   elseif area_id then
bsw@281:     local area = Area:by_id(area_id)
bsw@281:     check_unit_id = area.unit_id
bsw@281:   else
bsw@281:     local area = Area:by_id(issue.area_id)
bsw@281:     check_unit_id = area.unit_id
bsw@281:   end
bsw@281: 
bsw@281:   if not app.session.member:has_voting_right_for_unit_id(check_unit_id) then
bsw@281:     return
bsw@281:   end
bsw@281: 
bsw/jbe@19:   local image
bsw/jbe@19:   local text
bsw@248:   if scope == "unit" and delegation and delegation.unit_id then
bsw/jbe@19:     image = { static = "icons/16/table_go.png" }
bsw@264:     text = config.single_unit_id and _"Change global delegation" or _"Change unit delegation"
bsw@248:   elseif scope == "unit" and not (delegation and delegation.unit_id) then
bsw/jbe@19:     image = { static = "icons/16/table_go.png" }
bsw@264:     text = config.single_unit_id and _"Set global delegation" or _"Set unit delegation"
bsw/jbe@19:   elseif scope == "area" and delegation and delegation.area_id then
bsw/jbe@19:     image = { static = "icons/16/table_go.png" }
bsw/jbe@19:     text = _"Change area delegation"
bsw/jbe@19:   elseif scope == "area" and not (delegation and delegation.area_id) then
bsw/jbe@19:     image = { static = "icons/16/table_go.png" }
bsw/jbe@19:     text = _"Set area delegation"
bsw/jbe@19:   elseif scope == "issue" then
bsw/jbe@19:     if delegation and delegation.issue_id then
bsw/jbe@19:       image = { static = "icons/16/table_go.png" }
bsw/jbe@19:       text = _"Change issue delegation"
bsw/jbe@19:     elseif issue.state ~= "finished" and issue.state ~= "cancelled" then
bsw/jbe@19:       image = { static = "icons/16/table_go.png" }
bsw/jbe@19:       text = _"Set issue delegation"
bsw/jbe@19:     end
bsw/jbe@19:   end
bsw/jbe@19:   ui.container{
bsw/jbe@19:     attr = {
bsw/jbe@19:       class = "change_delegation",
bsw/jbe@19:     },
bsw/jbe@19:     content = function()
bsw/jbe@19:       ui.link{
bsw/jbe@19:         image  = image,
bsw/jbe@19:         text   = text,
bsw/jbe@19:         module = "delegation",
bsw/jbe@19:         view = "new",
bsw/jbe@19:         params = {
bsw/jbe@19:           issue_id = issue and issue.id or nil,
poelzi@111:           initiative_id = initiative_id or nil,
bsw@248:           area_id = area_id,
bsw@248:           unit_id = unit_id
bsw/jbe@19:         },
bsw/jbe@19:       }
bsw/jbe@19:       if delegation then
bsw/jbe@19:         ui.link{
bsw/jbe@19:           image  = { static = "icons/16/delete.png" },
bsw/jbe@19:           text   = _"Revoke",
bsw/jbe@19:           module = "delegation",
bsw/jbe@19:           action = "update",
bsw@248:           params = { issue_id = delegation.issue_id, area_id = delegation.area_id, unit_id = delegation.unit_id, delete = true },
bsw/jbe@19:           routing = {
bsw/jbe@19:             default = {
bsw/jbe@19:               mode = "redirect",
bsw/jbe@19:               module = request.get_module(),
bsw/jbe@19:               view = request.get_view(),
bsw/jbe@19:               id = param.get_id_cgi(),
bsw/jbe@19:               params = param.get_all_cgi()
bsw/jbe@19:             }
bsw/jbe@19:           }
bsw/jbe@19:         }
bsw/jbe@19:       end
bsw/jbe@19:     end
bsw/jbe@19:   }
bsw/jbe@19: end
bsw/jbe@5: 
bsw/jbe@19: local delegation
bsw@248: local unit_id
bsw/jbe@19: local area_id
bsw/jbe@19: local issue_id
poelzi@111: local initiative_id
bsw/jbe@19: 
bsw@248: local scope = "unit"
bsw@248: 
bsw@248: unit_id = param.get("unit_id", atom.integer)
bsw/jbe@5: 
bsw@273: local inline = param.get("inline", atom.boolean)
bsw@273: 
bsw/jbe@19: if param.get("initiative_id", atom.integer) then
poelzi@111:   initiative_id = param.get("initiative_id", atom.integer)
poelzi@111:   issue_id = Initiative:by_id(initiative_id).issue_id
bsw/jbe@19:   scope = "issue"
bsw/jbe@19: end
bsw/jbe@5: 
bsw/jbe@19: if param.get("issue_id", atom.integer) then
bsw/jbe@19:   issue_id = param.get("issue_id", atom.integer)
bsw/jbe@19:   scope = "issue"
bsw/jbe@19: end
bsw/jbe@19: 
bsw/jbe@19: if param.get("area_id", atom.integer) then
bsw/jbe@19:   area_id = param.get("area_id", atom.integer)
bsw/jbe@19:   scope = "area"
bsw/jbe@19: end
bsw/jbe@5: 
bsw/jbe@5: 
bsw/jbe@5: 
bsw/jbe@19: local delegation
bsw/jbe@19: local issue
poelzi@111: 
bsw/jbe@19: if issue_id then
bsw/jbe@19:   issue = Issue:by_id(issue_id)
bsw@248:   delegation = Delegation:by_pk(app.session.member.id, nil, nil, issue_id)
bsw/jbe@19:   if not delegation then
bsw@248:     delegation = Delegation:by_pk(app.session.member.id, nil, issue.area_id)
bsw/jbe@5:   end
bsw@273:   if not delegation then
bsw@273:     delegation = Delegation:by_pk(app.session.member.id, issue.area.unit_id)
bsw@273:   end
bsw/jbe@19: elseif area_id then
bsw@248:   delegation = Delegation:by_pk(app.session.member.id, nil, area_id)
bsw@273:   if not delegation then
bsw@273:     local area = Area:by_id(area_id)
bsw@273:     delegation = Delegation:by_pk(app.session.member.id, area.unit_id)
bsw@273:   end
bsw/jbe@19: end
bsw/jbe@5: 
bsw/jbe@19: if not delegation then
bsw@248:   delegation = Delegation:by_pk(app.session.member.id, unit_id)
bsw/jbe@19: end
bsw/jbe@19: 
bsw@273: local slot_name = "actions"
bsw/jbe@19: 
bsw@273: if inline then
bsw@273:   slot_name = "default"
bsw@273: end
bsw@273: 
bsw@273: slot.select(slot_name, function()
bsw/jbe@19: 
bsw/jbe@5:   if delegation then
bsw/jbe@5:     ui.container{
bsw/jbe@5:       attr = { class = "delegation vote_info"},
bsw/jbe@5:       content = function()
bsw@2:         ui.container{
bsw@2:           attr = {
bsw/jbe@4:             title = _"Click for details",
bsw/jbe@4:             class = "head head_active",
bsw@2:             style = "cursor: pointer;",
bsw/jbe@4:             onclick = "document.getElementById('delegation_content').style.display = 'block';"
bsw@2:           },
bsw/jbe@4:           content = function()
bsw@180:             if delegation.trustee_id then
bsw@180:               ui.image{
bsw@180:                 static = "icons/16/table_go.png"
bsw@180:               }
mail@251:               local member = Member:new_selector()
mail@251:                 :reset_fields()
mail@251:                 :add_field("name", "delegation_name")
mail@251:                 :add_where({ "id = ?", delegation.trustee_id })
mail@251:                 :single_object_mode()
mail@251:                 :exec()
bsw@180:               if delegation.issue_id then
mail@251:                 slot.put( _("Issue delegated to '#{name}'", { name = member.delegation_name }) )
bsw@180:               elseif delegation.area_id then
mail@251:                 slot.put( _("Area delegated to '#{name}'", { name = member.delegation_name }) )
bsw@180:               else
bsw@264:                 if config.single_unit_id then
bsw@264:                   slot.put( _("Global delegation set to '#{name}'", { name = member.delegation_name }) )
bsw@264:                 else
bsw@264:                   slot.put( _("Unit delegated to '#{name}'", { name = member.delegation_name }) )
bsw@264:                 end
bsw@180:               end
mail@251: 
bsw/jbe@4:             else
bsw@180:               ui.image{
bsw@180:                 static = "icons/16/table_go_crossed.png"
bsw@180:               }
bsw@180:               if delegation.issue_id then
bsw@180:                 slot.put(_"Delegation turned off for issue")
bsw@180:               elseif delegation.area_id then
bsw@180:                 slot.put(_"Delegation turned off for area")
bsw@180:               end
bsw/jbe@4:             end
bsw/jbe@4:             ui.image{
bsw/jbe@4:               static = "icons/16/dropdown.png"
bsw/jbe@4:             }
bsw/jbe@4:           end
bsw@2:         }
bsw/jbe@4:         ui.container{
bsw/jbe@4:           attr = { class = "content", id = "delegation_content" },
bsw/jbe@4:           content = function()
bsw@2:             ui.container{
bsw/jbe@4:               attr = {
bsw/jbe@4:                 class = "close",
bsw/jbe@4:                 style = "cursor: pointer;",
bsw/jbe@4:                 onclick = "document.getElementById('delegation_content').style.display = 'none';"
bsw/jbe@4:               },
bsw@2:               content = function()
bsw/jbe@4:                 ui.image{ static = "icons/16/cross.png" }
bsw/jbe@4:               end
bsw/jbe@4:             }
bsw/jbe@4:     
bsw/jbe@4:             local delegation_chain = Member:new_selector()
bsw/jbe@4:               :add_field("delegation_chain.*")
bsw@246:               :join("delegation_chain(" .. tostring(app.session.member.id) .. ", " .. tostring(unit_id or "NULL") .. ", " .. tostring(area_id or "NULL") .. ", " .. tostring(issue_id or "NULL") .. ")", "delegation_chain", "member.id = delegation_chain.member_id")
bsw/jbe@4:               :add_order_by("index")
bsw/jbe@4:               :exec()
bsw/jbe@4:     
bsw/jbe@19:             if not issue or (issue.state ~= "finished" and issue.state ~= "cancelled") then
bsw@248:               change_delegation(scope, unit_id, area_id, issue, delegation, initiative_id)
bsw@277:               slot.put("
")
bsw/jbe@19:             end
bsw/jbe@19: 
bsw/jbe@4:             for i, record in ipairs(delegation_chain) do
bsw/jbe@4:               local style
bsw@341:               local overridden = (not issue or issue.state ~= 'voting') and record.overridden
bsw/jbe@4:               if record.scope_in then
bsw@2:                 ui.container{
bsw/jbe@4:                   attr = { class = "delegation_info" },
bsw@2:                   content = function()
bsw/jbe@4:                     if not overridden then
bsw/jbe@4:                       ui.image{
bsw/jbe@4:                         attr = { class = "delegation_arrow" },
bsw@341:                         static = "delegation_arrow_24_vertical.png"
bsw/jbe@4:                       }
bsw/jbe@4:                     else
bsw/jbe@4:                       ui.image{
bsw/jbe@4:                         attr = { class = "delegation_arrow delegation_arrow_overridden" },
bsw@341:                         static = "delegation_arrow_24_vertical.png"
bsw/jbe@4:                       }
bsw/jbe@4:                     end
bsw/jbe@4:                     ui.container{
bsw/jbe@4:                       attr = { class = "delegation_scope" .. (overridden and " delegation_scope_overridden" or "") },
bsw/jbe@4:                       content = function()
bsw@248:                         if record.scope_in == "unit" then
bsw@264:                           slot.put(config.single_object_mode and _"Global delegation" or _"Unit delegation")
bsw/jbe@4:                         elseif record.scope_in == "area" then
bsw/jbe@4:                           slot.put(_"Area delegation")
bsw/jbe@4:                         elseif record.scope_in == "issue" then
bsw/jbe@4:                           slot.put(_"Issue delegation")
bsw/jbe@4:                         end
bsw/jbe@4:                       end
bsw/jbe@4:                     }
bsw@2:                   end
bsw@2:                 }
bsw/jbe@4:               end
bsw/jbe@4:               ui.container{
bsw/jbe@4:                 attr = { class = overridden and "delegation_overridden" or "" },
bsw/jbe@4:                 content = function()
bsw/jbe@4:                   execute.view{
bsw/jbe@4:                     module = "member",
bsw/jbe@4:                     view = "_show_thumb",
bsw/jbe@4:                     params = { member = record }
bsw@2:                   }
bsw@2:                 end
bsw/jbe@4:               }
bsw@341:               if (not issue or issue.state ~= 'voting') and record.participation and not record.overridden then
bsw/jbe@4:                 ui.container{
bsw/jbe@4:                   attr = { class = "delegation_participation" },
bsw/jbe@4:                   content = function()
bsw/jbe@19:                     slot.put(_"This member is participating, the rest of delegation chain is suspended while discussing")
bsw/jbe@4:                   end
bsw/jbe@4:                 }
bsw@2:               end
bsw/jbe@4:               slot.put("
")
bsw/jbe@4:             end
bsw/jbe@0:           end
bsw/jbe@4:         }
bsw/jbe@0:       end
bsw/jbe@5:     }
bsw/jbe@19:   else
bsw@248:     change_delegation(scope, unit_id, area_id, issue, nil, initiative_id)
bsw/jbe@5:   end
bsw/jbe@0: end)