bsw/jbe@0: local issues_selector = param.get("issues_selector", "table") bsw@459: local member = param.get("for_member", "table") or app.session.member bsw@459: local for_member = param.get("for_member", "table") bsw@414: local for_state = param.get("for_state") bsw@414: local for_unit = param.get("for_unit", atom.boolean) bsw@414: local for_area = param.get("for_area", atom.boolean) bsw@414: bsw@414: bsw@414: if for_state == "open" then bsw@414: issues_selector:add_where("issue.closed ISNULL") bsw@414: elseif for_state == "closed" then bsw@414: issues_selector:add_where("issue.closed NOTNULL") bsw@414: end bsw/jbe@0: bsw@51: if app.session.member_id then bsw@51: issues_selector bsw@461: :left_join("interest", "_interest", { "_interest.issue_id = issue.id AND _interest.member_id = ?", member.id } ) bsw@51: :add_field("(_interest.member_id NOTNULL)", "is_interested") bsw@285: issues_selector bsw@461: :left_join("delegating_interest_snapshot", "_delegating_interest", { "_delegating_interest.issue_id = issue.id AND _delegating_interest.member_id = ? AND _delegating_interest.event = issue.latest_snapshot_event", member.id } ) bsw@285: :add_field("_delegating_interest.delegate_member_ids[1]", "is_interested_by_delegation_to_member_id") bsw@285: :add_field("_delegating_interest.delegate_member_ids[array_upper(_delegating_interest.delegate_member_ids, 1)]", "is_interested_via_member_id") bsw@285: :add_field("array_length(_delegating_interest.delegate_member_ids, 1)", "delegation_chain_length") bsw@51: end bsw@11: bsw/jbe@19: ui.add_partial_param_names{ bsw/jbe@19: "filter", bsw/jbe@19: "filter_open", bsw/jbe@19: "filter_voting", bsw/jbe@19: "filter_interest", bsw/jbe@19: "issue_list" bsw/jbe@19: } bsw/jbe@0: bsw@414: local filters = execute.load_chunk{module="issue", chunk="_filters.lua", params = { bsw@459: member = member, for_member = for_member, state = for_state, for_unit = for_unit, for_area = for_area bsw@414: }} bsw/jbe@19: bsw/jbe@19: filters.content = function() bsw@275: ui.paginate{ bsw@422: per_page = tonumber(param.get("per_page") or 25), bsw/jbe@19: selector = issues_selector, bsw/jbe@19: content = function() bsw/jbe@19: local highlight_string = param.get("highlight_string", "string") bsw/jbe@19: local issues = issues or issues_selector:exec() bsw/jbe@19: -- issues:load(initiatives) bsw@273: ui.container{ attr = { class = "issues" }, content = function() bsw@273: bsw@273: for i, issue in ipairs(issues) do bsw@273: bsw@273: local class = "issue" bsw@289: if issue.is_interested then bsw@273: class = class .. " interested" bsw@289: elseif issue.is_interested_by_delegation_to_member_id then bsw@289: class = class .. " interested_by_delegation" bsw@273: end bsw@273: ui.container{ attr = { class = class }, content = function() bsw@273: bsw@273: ui.container{ attr = { class = "issue_info" }, content = function() bsw@273: bsw@312: if issue.is_interested then bsw@312: ui.tag{ bsw@312: tag = "div", attr = { class = "interest_by_delegation"}, bsw@312: content = function() bsw@312: local text = "You are interested in this issue" bsw@312: ui.image{ attr = { alt = text, title = text }, static = "icons/16/eye.png" } bsw@312: end bsw@312: } bsw@312: bsw@312: elseif issue.is_interested_by_delegation_to_member_id then bsw@285: ui.tag{ bsw@285: tag = "div", attr = { class = "interest_by_delegation"}, bsw@285: content = function() bsw@285: local member = Member:by_id(issue.is_interested_by_delegation_to_member_id) bsw@315: local text = _"delegated to" bsw@315: ui.image{ bsw@315: attr = { class = "delegation_arrow", alt = text, title = text }, bsw@315: static = "delegation_arrow_24_horizontal.png" bsw@315: } bsw@285: execute.view{ bsw@285: module = "member_image", bsw@285: view = "_show", bsw@285: params = { bsw@285: member = member, bsw@285: image_type = "avatar", bsw@285: show_dummy = true, bsw@285: class = "micro_avatar", bsw@285: popup_text = member.name bsw@285: } bsw@285: } bsw@285: if issue.is_interested_by_delegation_to_member_id ~= issue.is_interested_via_member_id then bsw@285: if issue.delegation_chain_length > 2 then bsw@315: local text = _"delegated to" bsw@315: ui.image{ bsw@315: attr = { class = "delegation_arrow", alt = text, title = text }, bsw@315: static = "delegation_arrow_24_horizontal.png" bsw@315: } bsw@315: ui.tag{ content = "..." } bsw@285: end bsw@315: local text = _"delegated to" bsw@315: ui.image{ bsw@315: attr = { class = "delegation_arrow", alt = text, title = text }, bsw@315: static = "delegation_arrow_24_horizontal.png" bsw@315: } bsw@285: local member = Member:by_id(issue.is_interested_via_member_id) bsw@285: execute.view{ bsw@285: module = "member_image", bsw@285: view = "_show", bsw@285: params = { bsw@285: member = member, bsw@285: image_type = "avatar", bsw@285: show_dummy = true, bsw@285: class = "micro_avatar", bsw@285: popup_text = member.name bsw@285: } bsw@285: } bsw@285: end bsw@285: end bsw@285: } bsw@285: end bsw@285: bsw@273: ui.tag{ bsw@273: tag = "div", bsw@273: content = function() bsw@273: ui.link{ bsw@273: attr = { class = "issue_id" }, bsw@273: text = _("Issue ##{id}", { id = tostring(issue.id) }), bsw@273: module = "issue", bsw@273: view = "show", bsw@273: id = issue.id bsw@273: } bsw@273: bsw@280: slot.put(" · ") bsw@280: ui.tag{ content = issue.area.name } bsw@280: slot.put(" · ") bsw@280: ui.tag{ content = issue.area.unit.name } bsw@414: slot.put(" · ") bsw@414: ui.tag{ content = issue.policy.name } bsw@414: bsw@280: bsw@280: end bsw/jbe@19: } bsw@273: ui.tag{ bsw@286: attr = { class = "issue_policy_info" }, bsw@273: tag = "div", bsw@273: content = function() bsw@273: bsw@414: ui.tag{ attr = { class = "event_name" }, content = issue.state_name } bsw@273: bsw@273: if issue.state_time_left then bsw@273: slot.put(" · ") bsw@414: if issue.state_time_left:sub(1,1) == "-" then bsw@448: if issue.state == "new" then bsw@448: ui.tag{ content = _("Discussion starts soon") } bsw@448: elseif issue.state == "discussion" then bsw@448: ui.tag{ content = _("Verification starts soon") } bsw@448: elseif issue.state == "frozen" then bsw@448: ui.tag{ content = _("Voting starts soon") } bsw@448: elseif issue.state == "voting" then bsw@448: ui.tag{ content = _("Counting starts soon") } bsw@448: end bsw@414: else bsw@414: ui.tag{ content = _("#{time_left} left", { time_left = issue.state_time_left:gsub("days", _"days"):gsub("day", _"day") }) } bsw@414: end bsw@273: end bsw@273: bsw@273: end bsw@273: } bsw@273: bsw@273: bsw@273: if issue.old_state then bsw@273: ui.field.text{ value = format.time(issue.sort) } bsw@273: ui.field.text{ value = Issue:get_state_name_for_state(issue.old_state) .. " > " .. Issue:get_state_name_for_state(issue.new_state) } bsw/jbe@19: else bsw/jbe@19: end bsw@273: end } bsw@273: bsw@273: ui.container{ attr = { class = "initiative_list" }, content = function() bsw@273: bsw@273: local initiatives_selector = issue:get_reference_selector("initiatives") bsw/jbe@19: local highlight_string = param.get("highlight_string") bsw/jbe@19: if highlight_string then bsw/jbe@19: initiatives_selector:add_field( {'"highlight"("initiative"."name", ?)', highlight_string }, "name_highlighted") bsw/jbe@19: end bsw/jbe@19: execute.view{ bsw/jbe@19: module = "initiative", bsw/jbe@19: view = "_list", bsw/jbe@19: params = { bsw@273: issue = issue, bsw/jbe@19: initiatives_selector = initiatives_selector, bsw/jbe@19: highlight_string = highlight_string, bsw@51: per_page = app.session.member_id and tonumber(app.session.member:get_setting_value("initiatives_preview_limit") or 3) or 3, bsw/jbe@19: no_sort = true, bsw@285: limit = app.session.member_id and tonumber(app.session.member:get_setting_value("initiatives_preview_limit") or 3) or 3, bsw@285: for_member = for_member bsw/jbe@19: } bsw/jbe@19: } bsw@273: end } bsw@273: end } bsw@273: end bsw@273: end } bsw/jbe@19: end bsw/jbe@19: } bsw/jbe@19: end bsw/jbe@19: bsw@275: filters.opened = true bsw/jbe@19: filters.selector = issues_selector bsw/jbe@19: bsw/jbe@19: if param.get("no_filter", atom.boolean) then bsw/jbe@19: filters.content() bsw/jbe@19: else bsw/jbe@19: ui.filters(filters) bsw/jbe@19: end