bsw@525: local show_as_homepage = param.get("show_as_homepage", atom.boolean) bsw@525: bsw@525: local member = param.get("member", "table") bsw@525: bsw@525: local tabs = { bsw/jbe@19: module = "member", bsw/jbe@19: view = "show_tab", bsw@525: static_params = { bsw@525: member_id = member.id, bsw@525: show_as_homepage = show_as_homepage bsw/jbe@19: } bsw@525: } bsw@525: bsw@525: if show_as_homepage and app.session.member_id == member.id then bsw@525: bsw@525: if app.session.member.notify_email_unconfirmed then bsw@525: tabs[#tabs+1] = { bsw@525: class = "yellow", bsw@525: name = "email_unconfirmed", bsw@525: label = _"Email unconfirmed", bsw@525: module = "member", bsw@525: view = "_email_unconfirmed", bsw@525: params = {} bsw@525: } bsw@525: end bsw@525: bsw@525: if app.session.member.notify_level == nil then bsw@525: tabs[#tabs+1] = { bsw@525: class = "yellow", bsw@525: name = "notify_level_not_set", bsw@525: label = _"Notifications", bsw@525: module = "member", bsw@525: view = "_notify_level_not_set" bsw@525: } bsw@525: end bsw@525: bsw@525: local broken_delegations = Delegation:new_selector() bsw@525: :join("issue", nil, "issue.id = delegation.issue_id AND issue.closed ISNULL") bsw@525: :join("member", nil, "delegation.trustee_id = member.id") bsw@525: :add_where{"delegation.truster_id = ?", member.id} bsw@525: :add_where{"member.active = 'f' OR (member.last_activity IS NULL OR age(member.last_activity) > ?::interval)", config.delegation_warning_time } bsw@525: bsw@525: if broken_delegations:count() > 0 then bsw@525: tabs[#tabs+1] = { bsw@525: class = "red", bsw@525: name = "broken_delegations", bsw@525: label = _"Delegation problems" .. " (" .. tostring(broken_delegations:count()) .. ")", bsw@525: icon = { static = "icons/16/table_go.png" }, bsw@525: module = "delegation", bsw@525: view = "_list", bsw@525: params = { delegations_selector = broken_delegations, outgoing = true }, bsw@525: } bsw@525: end bsw@525: bsw@525: local selector = Issue:new_selector() bsw@525: :join("area", nil, "area.id = issue.area_id") bsw@525: :join("privilege", nil, { "privilege.unit_id = area.unit_id AND privilege.member_id = ? AND privilege.voting_right", app.session.member_id }) bsw@525: :left_join("direct_voter", nil, { "direct_voter.issue_id = issue.id AND direct_voter.member_id = ?", app.session.member.id }) bsw@525: :left_join("interest", nil, { "interest.issue_id = issue.id AND interest.member_id = ?", app.session.member.id }) bsw@525: :left_join("membership", nil, { "membership.area_id = area.id AND membership.member_id = ? ", app.session.member.id }) bsw@525: :add_where{ "direct_voter.member_id ISNULL" } bsw@525: :add_where{ "interest.member_id NOTNULL OR membership.member_id NOTNULL" } bsw@525: :add_where{ "issue.fully_frozen NOTNULL" } bsw@525: :add_where{ "issue.closed ISNULL" } bsw@525: :add_order_by{ "issue.fully_frozen + issue.voting_time ASC" } bsw@525: bsw@525: local count = selector:count() bsw@525: if count > 0 then bsw@525: tabs[#tabs+1] = { bsw@525: class = "yellow", bsw@525: name = "not_voted_issues", bsw@525: label = _"Now in voting" .. " (" .. tostring(count) .. ")", bsw@525: icon = { static = "icons/16/email_open.png" }, bsw@525: module = "issue", bsw@525: view = "_list", bsw@525: params = { bsw@525: issues_selector = selector, bsw@525: no_filter = true bsw@525: } bsw@525: } bsw@525: end bsw@525: bsw@525: local initiator_invites_selector = Initiative:new_selector() bsw@525: :join("issue", "_issue_state", "_issue_state.id = initiative.issue_id") bsw@525: :join("initiator", nil, { "initiator.initiative_id = initiative.id AND initiator.member_id = ? AND initiator.accepted ISNULL", app.session.member.id }) bsw@525: :add_where("_issue_state.closed ISNULL AND _issue_state.half_frozen ISNULL") bsw@525: bsw@525: if initiator_invites_selector:count() > 0 then bsw@525: tabs[#tabs+1] = { bsw@525: class = "yellow", bsw@525: name = "initiator_invites", bsw@525: label = _"Initiator invites" .. " (" .. tostring(initiator_invites_selector:count()) .. ")", bsw@525: icon = { static = "icons/16/user_add.png" }, bsw@525: module = "index", bsw@525: view = "_initiator_invites", bsw@525: params = { bsw@525: initiatives_selector = initiator_invites_selector bsw@525: } bsw@525: } bsw@525: end bsw@525: bsw@525: local updated_drafts_selector = Initiative:new_selector() bsw@525: :join("issue", "_issue_state", "_issue_state.id = initiative.issue_id AND _issue_state.closed ISNULL AND _issue_state.fully_frozen ISNULL") bsw@525: :join("current_draft", "_current_draft", "_current_draft.initiative_id = initiative.id") bsw@525: :join("supporter", "supporter", { "supporter.member_id = ? AND supporter.initiative_id = initiative.id AND supporter.draft_id < _current_draft.id", app.session.member_id }) bsw@525: :add_where("initiative.revoked ISNULL") bsw@525: bsw@525: if updated_drafts_selector:count() > 0 then bsw@525: tabs[#tabs+1] = { bsw@525: class = "yellow", bsw@525: name = "updated_drafts", bsw@525: label = _"Updated drafts" .. " (" .. tostring(updated_drafts_selector:count()) .. ")", bsw@525: icon = { static = "icons/16/script.png" }, bsw@525: module = "index", bsw@525: view = "_updated_drafts", bsw@525: params = { bsw@525: initiatives_selector = updated_drafts_selector bsw@525: } bsw@525: } bsw@525: end bsw@525: end bsw@525: bsw@525: if not show_as_homepage then bsw@525: tabs[#tabs+1] = { bsw@525: name = "profile", bsw@525: label = _"Profile", bsw@525: icon = { static = "icons/16/application_form.png" }, bsw@525: module = "member", bsw@525: view = "_profile", bsw@525: params = { member = member }, bsw@525: } bsw@525: end bsw@525: bsw@525: bsw@525: local areas_selector = member:get_reference_selector("areas") bsw@525: tabs[#tabs+1] = { bsw@525: name = "areas", bsw@525: label = _"Units", bsw@525: icon = { static = "icons/16/package.png" }, bsw@525: module = "member", bsw@525: view = "_area_list", bsw@525: params = { areas_selector = areas_selector, member = member, for_member = not show_as_homepage }, bsw@525: } bsw@525: bsw@525: if show_as_homepage then bsw@525: tabs[#tabs+1] = { bsw@525: name = "timeline", bsw@528: label = _"Latest events", bsw@525: module = "member", bsw@525: view = "_event_list", bsw@525: params = { } bsw@525: } bsw@525: else bsw@525: tabs[#tabs+1] = { bsw@525: name = "timeline", bsw@525: label = _"Events", bsw@525: module = "event", bsw@525: view = "_list", bsw@525: params = { for_member = member } bsw@525: } bsw@525: end bsw@525: bsw@525: tabs[#tabs+1] = { bsw@525: name = "open", bsw@525: label = _"Open issues", bsw@525: module = "issue", bsw@525: view = "_list", bsw@525: link_params = { bsw@525: filter_interest = not show_as_homepage and "issue" or nil, bsw@525: }, bsw@525: params = { bsw@525: for_state = "open", bsw@525: for_member = not show_as_homepage and member or nil, bsw@525: issues_selector = Issue:new_selector() bsw@525: :add_where("issue.closed ISNULL") bsw@525: :add_order_by("coalesce(issue.fully_frozen + issue.voting_time, issue.half_frozen + issue.verification_time, issue.accepted + issue.discussion_time, issue.created + issue.admission_time) - now()") bsw@525: } bsw@525: } bsw@525: bsw@525: tabs[#tabs+1] = { bsw@525: name = "closed", bsw@525: label = _"Closed issues", bsw@525: module = "issue", bsw@525: view = "_list", bsw@525: link_params = { bsw@525: filter_interest = not show_as_homepage and "issue" or nil, bsw@525: }, bsw@525: params = { bsw@525: for_state = "closed", bsw@525: for_member = not show_as_homepage and member or nil, bsw@525: issues_selector = Issue:new_selector() bsw@525: :add_where("issue.closed NOTNULL") bsw@525: :add_order_by("issue.closed DESC") bsw@525: bsw@525: } bsw@525: } bsw@525: bsw@525: if show_as_homepage then bsw@525: tabs[#tabs+1] = { bsw@525: name = "members", bsw@525: label = _"Members", bsw@525: module = 'member', bsw@525: view = '_list', bsw@525: params = { members_selector = Member:new_selector() } bsw@525: } bsw@525: end bsw@525: bsw@525: bsw@525: bsw@525: if not show_as_homepage then bsw@525: local outgoing_delegations_selector = member:get_reference_selector("outgoing_delegations") bsw@525: :left_join("issue", "_member_showtab_issue", "_member_showtab_issue.id = delegation.issue_id") bsw@525: :add_where("_member_showtab_issue.closed ISNULL") bsw@525: tabs[#tabs+1] = { bsw@525: name = "outgoing_delegations", bsw@525: label = _"Outgoing delegations" .. " (" .. tostring(outgoing_delegations_selector:count()) .. ")", bsw@525: icon = { static = "icons/16/table_go.png" }, bsw@525: module = "delegation", bsw@525: view = "_list", bsw@525: params = { delegations_selector = outgoing_delegations_selector, outgoing = true }, bsw@525: } bsw@525: bsw@525: local incoming_delegations_selector = member:get_reference_selector("incoming_delegations") bsw@525: :left_join("issue", "_member_showtab_issue", "_member_showtab_issue.id = delegation.issue_id") bsw@525: :add_where("_member_showtab_issue.closed ISNULL") bsw@525: tabs[#tabs+1] = { bsw@525: name = "incoming_delegations", bsw@525: label = _"Incoming delegations" .. " (" .. tostring(incoming_delegations_selector:count()) .. ")", bsw@525: icon = { static = "icons/16/table_go.png" }, bsw@525: module = "delegation", bsw@525: view = "_list", bsw@525: params = { delegations_selector = incoming_delegations_selector, incoming = true }, bsw@525: } bsw@525: bsw@525: local contacts_selector = member:get_reference_selector("saved_members"):add_where("public") bsw@525: tabs[#tabs+1] = { bsw@525: name = "contacts", bsw@525: label = _"Contacts" .. " (" .. tostring(contacts_selector:count()) .. ")", bsw@525: icon = { static = "icons/16/book_edit.png" }, bsw@525: module = "member", bsw@525: view = "_list", bsw@525: params = { members_selector = contacts_selector }, bsw@525: } bsw@525: end bsw@525: bsw@525: ui.tabs(tabs)