bsw/jbe@0: local areas_selector = param.get("areas_selector", "table") 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@9: :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@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@9: bsw/jbe@0: ui.order{ bsw/jbe@0: name = name, bsw/jbe@0: selector = areas_selector, bsw/jbe@0: options = { bsw/jbe@0: { bsw/jbe@0: name = "member_weight", bsw/jbe@0: label = _"Population", bsw/jbe@0: order_by = "area.member_weight DESC" bsw/jbe@0: }, bsw/jbe@0: { bsw/jbe@0: name = "direct_member_count", bsw/jbe@0: label = _"Direct member count", bsw/jbe@0: order_by = "area.direct_member_count DESC" bsw/jbe@0: }, bsw/jbe@0: { bsw/jbe@0: name = "az", bsw/jbe@0: label = _"A-Z", bsw/jbe@0: order_by = "area.name" bsw/jbe@0: }, bsw/jbe@0: { bsw/jbe@0: name = "za", bsw/jbe@0: label = _"Z-A", bsw/jbe@0: order_by = "area.name DESC" bsw/jbe@0: } bsw/jbe@0: }, bsw/jbe@0: content = function() bsw/jbe@0: ui.list{ bsw/jbe@0: records = areas_selector:exec(), bsw/jbe@0: columns = { bsw/jbe@0: { bsw/jbe@0: content = function(record) bsw/jbe@0: if record.member_weight and record.direct_member_count then bsw/jbe@0: local max_value = MemberCount:get() bsw/jbe@0: ui.bargraph{ bsw/jbe@0: max_value = max_value, bsw/jbe@4: width = 100, bsw/jbe@0: bars = { bsw/jbe@0: { color = "#444", value = record.direct_member_count }, bsw/jbe@0: { color = "#777", value = record.member_weight - record.direct_member_count }, bsw/jbe@0: { color = "#ddd", value = max_value - record.member_weight }, bsw/jbe@0: } bsw/jbe@0: } bsw/jbe@0: end bsw/jbe@0: end bsw/jbe@0: }, bsw/jbe@0: { bsw/jbe@0: content = function(record) bsw/jbe@0: ui.link{ bsw/jbe@0: text = record.name, bsw/jbe@0: module = "area", bsw/jbe@0: view = "show", bsw/jbe@0: id = record.id bsw/jbe@0: } bsw/jbe@0: end bsw@9: }, bsw@9: { bsw@9: label = _"New", bsw@9: field_attr = { style = "text-align: right;" }, bsw@9: content = function(record) bsw@9: ui.link{ bsw@9: text = tostring(record.issues_new_count), bsw@9: module = "area", bsw@9: view = "show", bsw@9: id = record.id, bsw@9: params = { filter = "new" } bsw@9: } bsw@9: end bsw@9: }, bsw@9: { bsw@9: label = _"Discussion", bsw@9: field_attr = { style = "text-align: right;" }, bsw@9: content = function(record) bsw@9: ui.link{ bsw@9: text = tostring(record.issues_discussion_count), bsw@9: module = "area", bsw@9: view = "show", bsw@9: id = record.id, bsw@9: params = { filter = "accepted" } bsw@9: } bsw@9: end bsw@9: }, bsw@9: { bsw@9: label = _"Frozen", bsw@9: field_attr = { style = "text-align: right;" }, bsw@9: content = function(record) bsw@9: ui.link{ bsw@9: text = tostring(record.issues_frozen_count), bsw@9: module = "area", bsw@9: view = "show", bsw@9: id = record.id, bsw@9: params = { filter = "half_frozen" } bsw@9: } bsw@9: end bsw@9: }, bsw@9: { bsw@9: label = _"Voting", bsw@9: field_attr = { style = "text-align: right;" }, bsw@9: content = function(record) bsw@9: ui.link{ bsw@9: text = tostring(record.issues_voting_count), bsw@9: module = "area", bsw@9: view = "show", bsw@9: id = record.id, bsw@9: params = { filter = "frozen" } bsw@9: } bsw@9: end bsw@9: }, bsw@9: { bsw@9: label = _"Not yet voted", bsw@9: field_attr = { style = "text-align: right;" }, bsw@9: content = function(record) bsw@9: ui.link{ bsw@9: attr = { class = record.issues_to_vote_count > 0 and "not_voted" or nil }, bsw@9: text = tostring(record.issues_to_vote_count), bsw@9: module = "area", bsw@9: view = "show", bsw@9: id = record.id, bsw@9: params = { filter = "frozen", filter_voting = "not_voted" } bsw@9: } bsw@9: end bsw@10: }, bsw@10: { bsw@10: label = _"Finished", bsw@10: field_attr = { style = "text-align: right;" }, bsw@10: content = function(record) bsw@10: ui.link{ bsw@10: text = tostring(record.issues_finished_count), bsw@10: module = "area", bsw@10: view = "show", bsw@10: id = record.id, bsw@10: params = { filter = "finished", issue_list = "newest" } bsw@10: } bsw@10: end bsw@10: }, bsw@10: { bsw@10: label = _"Cancelled", bsw@10: field_attr = { style = "text-align: right;" }, bsw@10: content = function(record) bsw@10: ui.link{ bsw@10: text = tostring(record.issues_cancelled_count), bsw@10: module = "area", bsw@10: view = "show", bsw@10: id = record.id, bsw@10: params = { filter = "cancelled", issue_list = "newest" } bsw@10: } bsw@10: end bsw@10: }, bsw/jbe@0: } bsw/jbe@0: } bsw/jbe@0: end bsw/jbe@4: } bsw/jbe@4: bsw/jbe@4: ui.bargraph_legend{ bsw/jbe@4: width = 25, bsw/jbe@4: bars = { bsw/jbe@4: { color = "#444", label = _"Direct membership" }, bsw/jbe@4: { color = "#777", label = _"Membership by delegation" }, bsw/jbe@4: { color = "#ddd", label = _"No membership at all" }, bsw/jbe@4: } bsw/jbe@4: } bsw/jbe@4: