bsw/jbe@0: local areas_selector = param.get("areas_selector", "table") bsw@375: local hide_membership = param.get("hide_membership", atom.boolean) bsw/jbe@0: bsw@9: areas_selector bsw@9: :reset_fields() bsw@9: :add_field("area.id", nil, { "grouped" }) bsw@9: :add_field("area.name", nil, { "grouped" }) bsw@9: :add_field("member_weight", nil, { "grouped" }) bsw@9: :add_field("direct_member_count", nil, { "grouped" }) bsw@9: :add_field("(SELECT COUNT(*) FROM issue WHERE issue.area_id = area.id AND issue.accepted ISNULL AND issue.closed ISNULL)", "issues_new_count") bsw@9: :add_field("(SELECT COUNT(*) FROM issue WHERE issue.area_id = area.id AND issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL)", "issues_discussion_count") bsw@9: :add_field("(SELECT COUNT(*) FROM issue WHERE issue.area_id = area.id AND issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL AND issue.closed ISNULL)", "issues_frozen_count") bsw@9: :add_field("(SELECT COUNT(*) FROM issue WHERE issue.area_id = area.id AND issue.fully_frozen NOTNULL AND issue.closed ISNULL)", "issues_voting_count") bsw@10: :add_field("(SELECT COUNT(*) FROM issue WHERE issue.area_id = area.id AND issue.fully_frozen NOTNULL AND issue.closed NOTNULL)", "issues_finished_count") bsw@10: :add_field("(SELECT COUNT(*) FROM issue WHERE issue.area_id = area.id AND issue.fully_frozen ISNULL AND issue.closed NOTNULL)", "issues_cancelled_count") bsw@51: bsw@51: if app.session.member_id then bsw@51: areas_selector bsw@51: :add_field({ "(SELECT COUNT(*) FROM issue LEFT JOIN direct_voter ON direct_voter.issue_id = issue.id AND direct_voter.member_id = ? WHERE issue.area_id = area.id AND issue.fully_frozen NOTNULL AND issue.closed ISNULL AND direct_voter.member_id ISNULL)", app.session.member.id }, "issues_to_vote_count") bsw@51: :left_join("membership", "_membership", { "_membership.area_id = area.id AND _membership.member_id = ?", app.session.member.id }) bsw@51: :add_field("_membership.member_id NOTNULL", "is_member", { "grouped" }) bsw@274: :left_join("delegation", nil, { bsw@274: "delegation.truster_id = ? AND delegation.area_id = area.id AND delegation.scope = 'area'", app.session.member_id bsw@274: }) bsw@274: :left_join("member", nil, "member.id = delegation.trustee_id") bsw@274: :add_field("member.id", "trustee_member_id", { "grouped" }) bsw@274: :add_field("member.name", "trustee_member_name", { "grouped" }) bsw@51: else bsw@51: areas_selector:add_field("0", "issues_to_vote_count") bsw@51: end bsw@9: bsw@373: bsw@373: ui.container{ attr = { class = "area_list" }, content = function() bsw@373: bsw@378: ui.container{ attr = { class = "area head" }, content = function() bsw@378: bsw@378: ui.container{ attr = { class = "phases" }, content = function() bsw@378: bsw@378: ui.container{ attr = { class = "admission" }, content = function() bsw@378: ui.image{ static = "icons/16/new.png" } bsw@378: end } bsw@378: bsw@378: ui.container{ attr = { class = "discussion" }, content = function() bsw@378: ui.image{ static = "icons/16/comments.png" } bsw@378: end } bsw@378: bsw@378: ui.container{ attr = { class = "verification" }, content = function() bsw@378: ui.image{ static = "icons/16/lock.png" } bsw@378: end } bsw@378: bsw@378: ui.container{ attr = { class = "voting" }, content = function() bsw@378: ui.image{ static = "icons/16/email_open.png" } bsw@378: end } bsw@378: bsw@378: ui.container{ attr = { class = "finished" }, content = function() bsw@378: ui.image{ static = "icons/16/tick.png" } bsw@378: end } bsw@378: bsw@378: ui.container{ attr = { class = "cancelled" }, content = function() bsw@378: ui.image{ static = "icons/16/cross.png" } bsw@378: end } bsw@378: bsw@378: end } bsw@378: bsw@378: end } bsw@378: bsw@373: for i, area in ipairs(areas_selector:exec()) do bsw@373: bsw@373: ui.container{ attr = { class = "area" }, content = function() bsw@373: bsw@375: ui.container{ attr = { class = "bar" }, content = function() bsw@375: if area.member_weight and area.direct_member_count then bsw@375: local max_value = MemberCount:get() bsw@375: ui.bargraph{ bsw@375: max_value = max_value, bsw@375: width = 100, bsw@375: bars = { bsw@375: { color = "#444", value = area.direct_member_count }, bsw@375: { color = "#777", value = area.member_weight - area.direct_member_count }, bsw@375: { color = "#ddd", value = max_value - area.member_weight }, bsw@269: } bsw@375: } bsw@375: end bsw@375: end } bsw@373: bsw@381: ui.container{ attr = { class = "name" }, content = function() bsw@381: ui.link{ bsw@381: text = area.name, bsw@381: module = "area", bsw@381: view = "show", bsw@381: id = area.id bsw@381: } bsw@381: slot.put(" ") bsw@381: ui.tag{ content = "" } bsw@381: end } bsw@381: bsw@375: if not hide_membership then bsw@373: ui.container{ attr = { class = "membership" }, content = function() bsw@373: if area.is_member then bsw@373: local text = _"Member of area" bsw@373: ui.image{ bsw@373: attr = { title = text, alt = text }, bsw@373: static = "icons/16/user_gray.png", bsw@373: } bsw@373: else bsw@373: slot.put('') bsw@373: end bsw@373: end } bsw@375: end bsw@381: bsw@375: ui.container{ attr = { class = "delegatee" }, content = function() bsw@375: if area.trustee_member_id then bsw@375: local trustee_member = Member:by_id(area.trustee_member_id) bsw@375: local text = _("Area delegated to '#{name}'", { name = area.trustee_member_name }) bsw@375: ui.image{ bsw@375: attr = { class = "delegation_arrow", alt = text, title = text }, bsw@375: static = "delegation_arrow_24_horizontal.png" bsw@375: } bsw@375: execute.view{ bsw@375: module = "member_image", bsw@375: view = "_show", bsw@375: params = { bsw@375: member = trustee_member, bsw@375: image_type = "avatar", bsw@375: show_dummy = true, bsw@375: class = "micro_avatar", bsw@375: popup_text = text bsw@373: } bsw@375: } bsw@375: else bsw@375: slot.put('') bsw@375: end bsw@375: end } bsw@375: bsw@373: ui.container{ attr = { class = "phases" }, content = function() bsw@373: bsw@373: ui.container{ attr = { class = "admission" }, content = function() bsw@373: ui.link{ bsw@373: text = tostring(area.issues_new_count), bsw@373: module = "area", bsw@373: view = "show", bsw@373: id = area.id, bsw@373: params = { filter = "new", tab = "issues" } bsw@373: } bsw@373: end } bsw/jbe@19: bsw@373: ui.container{ attr = { class = "discussion" }, content = function() bsw@373: ui.link{ bsw@373: text = tostring(area.issues_discussion_count), bsw@373: module = "area", bsw@373: view = "show", bsw@373: id = area.id, bsw@373: params = { filter = "accepted", tab = "issues" } bsw@373: } bsw@373: end } mail@240: bsw@373: ui.container{ attr = { class = "verification" }, content = function() bsw@373: ui.link{ bsw@373: text = tostring(area.issues_frozen_count), bsw@373: module = "area", bsw@373: view = "show", bsw@373: id = area.id, bsw@373: params = { filter = "half_frozen", tab = "issues" } bsw@373: } bsw@373: end } bsw/jbe@19: bsw@373: ui.container{ attr = { class = "voting" }, content = function() bsw@373: ui.link{ bsw@373: text = tostring(area.issues_voting_count), bsw@373: module = "area", bsw@373: view = "show", bsw@373: id = area.id, bsw@373: params = { filter = "frozen", tab = "issues" } bsw@373: } bsw@373: end } bsw/jbe@19: bsw@373: ui.container{ attr = { class = "finished" }, content = function() bsw@373: ui.link{ bsw@373: text = tostring(area.issues_finished_count), bsw@373: module = "area", bsw@373: view = "show", bsw@373: id = area.id, bsw@373: params = { filter = "finished", issue_list = "newest", tab = "issues" } bsw@373: } bsw@373: end } bsw/jbe@19: bsw@373: ui.container{ attr = { class = "cancelled" }, content = function() bsw@373: ui.link{ bsw@373: text = tostring(area.issues_cancelled_count), bsw@373: module = "area", bsw@373: view = "show", bsw@373: id = area.id, bsw@373: params = { filter = "cancelled", issue_list = "newest", tab = "issues" } bsw@373: } bsw@373: end } bsw/jbe@19: bsw@373: end } bsw@373: bsw@378: slot.put("
") bsw@373: end } bsw@373: bsw@373: end bsw@373: bsw@373: end }