bsw/jbe@0: local issues_selector = param.get("issues_selector", "table")
bsw/jbe@0:
bsw@11: issues_selector
bsw@11: :left_join("interest", "_interest", { "_interest.issue_id = issue.id AND _interest.member_id = ?", app.session.member.id} )
bsw@11: :add_field("(_interest.member_id NOTNULL)", "is_interested")
bsw@11:
bsw/jbe@5: local ui_filter = ui.filter
bsw/jbe@5: if param.get("filter", atom.boolean) == false then
bsw/jbe@5: ui_filter = function(args) args.content() end
bsw/jbe@5: end
bsw/jbe@0:
bsw@10: if param.get("no_filter", atom.boolean) then
bsw@10: ui_filter = function(args) args.content() end
bsw@10: end
bsw@10:
bsw/jbe@5: local filter_voting = false
bsw/jbe@5: ui_filter{
bsw/jbe@0: selector = issues_selector,
bsw@2: filters = {
bsw@2: {
bsw@2: type = "boolean",
bsw/jbe@6: name = "open",
bsw/jbe@6: label = _"Open",
bsw/jbe@6: selector_modifier = function(selector, value)
bsw/jbe@6: if value then
bsw/jbe@6: selector:add_where("issue.closed ISNULL")
bsw/jbe@6: end
bsw/jbe@6: end
bsw@2: },
bsw/jbe@0: {
bsw@2: type = "boolean",
bsw@2: name = "new",
bsw@2: label = _"New",
bsw@2: selector_modifier = function(selector, value)
bsw@2: if value then
bsw@2: selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL")
bsw@2: end
bsw@2: end
bsw@2: },
bsw@2: {
bsw@2: type = "boolean",
bsw@2: name = "accepted",
bsw@2: label = _"In discussion",
bsw@2: selector_modifier = function(selector, value)
bsw@2: if value then
bsw@2: selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL")
bsw@2: end
bsw@2: end
bsw/jbe@0: },
bsw/jbe@0: {
bsw@2: type = "boolean",
bsw@2: name = "half_frozen",
bsw@2: label = _"Frozen",
bsw@2: selector_modifier = function(selector, value)
bsw@2: if value then
bsw/jbe@5: selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL")
bsw@2: end
bsw@2: end
bsw@2: },
bsw@2: {
bsw@2: type = "boolean",
bsw@2: name = "frozen",
bsw@2: label = _"Voting",
bsw@2: selector_modifier = function(selector, value)
bsw@2: if value then
bsw@2: selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL")
bsw/jbe@5: filter_voting = true
bsw@2: end
bsw@2: end
bsw/jbe@0: },
bsw/jbe@0: {
bsw@2: type = "boolean",
bsw@2: name = "finished",
bsw@2: label = _"Finished",
bsw@2: selector_modifier = function(selector, value)
bsw@2: if value then
bsw/jbe@5: selector:add_where("issue.closed NOTNULL AND issue.fully_frozen NOTNULL")
bsw@2: end
bsw@2: end
bsw@2: },
bsw@2: {
bsw@2: type = "boolean",
bsw@2: name = "cancelled",
bsw@2: label = _"Cancelled",
bsw@2: selector_modifier = function(selector, value)
bsw@2: if value then
bsw/jbe@5: selector:add_where("issue.closed NOTNULL AND issue.accepted ISNULL")
bsw@2: end
bsw@2: end
bsw@2: },
bsw/jbe@0: },
bsw/jbe@0: content = function()
bsw/jbe@5: local ui_filter = ui.filter
bsw/jbe@5: if not filter_voting then
bsw/jbe@5: ui_filter = function(args) args.content() end
bsw/jbe@5: end
bsw@10: if param.get("no_filter", atom.boolean) then
bsw@10: ui_filter = function(args) args.content() end
bsw@10: end
bsw/jbe@5: ui_filter{
bsw/jbe@0: selector = issues_selector,
bsw/jbe@5: name = "filter_voting",
bsw/jbe@5: filters = {
bsw@2: {
bsw/jbe@5: type = "boolean",
bsw/jbe@5: name = "any",
bsw/jbe@5: label = _"Any",
bsw/jbe@5: selector_modifier = function() end
bsw@2: },
bsw@2: {
bsw/jbe@5: type = "boolean",
bsw/jbe@5: name = "not_voted",
bsw/jbe@5: label = _"Not voted",
bsw/jbe@5: selector_modifier = function(selector, value)
bsw/jbe@5: if value then
bsw/jbe@5: selector:left_join("direct_voter", nil, { "direct_voter.issue_id = issue.id AND direct_voter.member_id = ?", app.session.member.id })
bsw/jbe@5: selector:add_where("direct_voter.member_id ISNULL")
bsw/jbe@5: end
bsw/jbe@5: end
bsw@2: },
bsw@2: {
bsw/jbe@5: type = "boolean",
bsw/jbe@5: name = "voted",
bsw/jbe@5: label = _"Voted",
bsw/jbe@5: selector_modifier = function(selector, value)
bsw/jbe@5: if value then
bsw/jbe@5: selector:join("direct_voter", nil, { "direct_voter.issue_id = issue.id AND direct_voter.member_id = ?", app.session.member.id })
bsw/jbe@5: end
bsw/jbe@5: end
bsw/jbe@5: },
bsw@2: },
bsw/jbe@0: content = function()
bsw/jbe@5: local ui_filter = ui.filter
bsw/jbe@5: if param.get("filter", atom.boolean) == false then
bsw/jbe@5: ui_filter = function(args) args.content() end
bsw/jbe@5: end
bsw/jbe@5: ui_filter{
bsw@2: selector = issues_selector,
bsw/jbe@5: name = "filter_interest",
bsw/jbe@5: filters = {
bsw/jbe@5: {
bsw/jbe@5: type = "boolean",
bsw/jbe@5: name = "any",
bsw/jbe@5: label = _"Any",
bsw/jbe@5: selector_modifier = function() end
bsw/jbe@5: },
bsw/jbe@5: {
bsw/jbe@5: type = "boolean",
bsw/jbe@5: name = "my",
bsw/jbe@5: label = _"Interested",
bsw/jbe@5: selector_modifier = function(selector, value)
bsw/jbe@5: if value then
bsw/jbe@5: selector:join("interest", "filter_interest", { "filter_interest.issue_id = issue.id AND filter_interest.member_id = ? ", app.session.member.id })
bsw/jbe@5: end
bsw/jbe@5: end
bsw/jbe@5: },
bsw@11: {
bsw@11: type = "boolean",
bsw@11: name = "supported",
bsw@11: label = _"Supported",
bsw@11: selector_modifier = function(selector, value)
bsw@11: if value then
bsw@11: selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN supporter ON supporter.initiative_id = initiative.id AND supporter.member_id = ? LEFT JOIN opinion ON opinion.initiative_id = initiative.id AND opinion.member_id = ? AND ((opinion.degree = 2 AND NOT fulfilled) OR (opinion.degree = -2 AND fulfilled)) WHERE initiative.issue_id = issue.id AND opinion.member_id ISNULL LIMIT 1)", app.session.member.id, app.session.member.id })
bsw@11: end
bsw@11: end
bsw@11: },
bsw@11: {
bsw@11: type = "boolean",
bsw@11: name = "potentially_supported",
bsw@11: label = _"Potential supported",
bsw@11: selector_modifier = function(selector, value)
bsw@11: if value then
bsw@11: selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN supporter ON supporter.initiative_id = initiative.id AND supporter.member_id = ? JOIN opinion ON opinion.initiative_id = initiative.id AND opinion.member_id = ? AND ((opinion.degree = 2 AND NOT fulfilled) OR (opinion.degree = -2 AND fulfilled)) WHERE initiative.issue_id = issue.id LIMIT 1)", app.session.member.id, app.session.member.id })
bsw@11: end
bsw@11: end
bsw@11: },
bsw@11: {
bsw@11: type = "boolean",
bsw@11: name = "initiated",
bsw@11: label = _"Initiated",
bsw@11: selector_modifier = function(selector, value)
bsw@11: if value then
bsw@11: selector:add_where({ "EXISTS (SELECT 1 FROM initiative JOIN initiator ON initiator.initiative_id = initiative.id AND initiator.member_id = ? WHERE initiative.issue_id = issue.id)", app.session.member.id })
bsw@11: end
bsw@11: end
bsw@11: },
bsw/jbe@5: },
bsw@2: content = function()
bsw@10: local ui_order = ui.order
bsw@10: if param.get("no_sort", atom.boolean) then
bsw@10: ui_order = function(args) args.content() end
bsw@10: end
bsw@10: ui_order{
bsw/jbe@5: name = "issue_list",
bsw/jbe@5: selector = issues_selector,
bsw/jbe@5: options = {
bsw@2: {
bsw/jbe@5: name = "max_potential_support",
bsw/jbe@5: label = _"Max potential support",
bsw/jbe@5: selector_modifier = function(selector)
bsw/jbe@6: selector:add_order_by("(SELECT max(supporter_count) FROM initiative WHERE initiative.issue_id = issue.id) DESC")
bsw@2: end
bsw@2: },
bsw@2: {
bsw/jbe@5: name = "max_support",
bsw/jbe@5: label = _"Max support",
bsw/jbe@5: selector_modifier = function(selector)
bsw/jbe@6: selector:add_order_by("(SELECT max(satisfied_supporter_count) FROM initiative WHERE initiative.issue_id = issue.id) DESC")
bsw@2: end
bsw@2: },
bsw@2: {
bsw/jbe@5: name = "population",
bsw/jbe@5: label = _"Population",
bsw/jbe@5: order_by = "issue.population DESC"
bsw/jbe@5: },
bsw/jbe@5: {
bsw/jbe@5: name = "newest",
bsw/jbe@5: label = _"Newest",
bsw/jbe@5: order_by = "issue.created DESC"
bsw/jbe@5: },
bsw/jbe@5: {
bsw/jbe@5: name = "oldest",
bsw/jbe@5: label = _"Oldest",
bsw/jbe@5: order_by = "issue.created"
bsw/jbe@5: }
bsw/jbe@5: },
bsw/jbe@5: content = function()
bsw@10: local ui_paginate = ui.paginate
bsw@10: if param.get("per_page") == "all" then
bsw@10: ui_paginate = function(args) args.content() end
bsw@10: end
bsw@10: ui_paginate{
bsw@10: per_page = tonumber(param.get("per_page")),
bsw/jbe@5: selector = issues_selector,
bsw/jbe@5: content = function()
bsw/jbe@5: local highlight_string = param.get("highlight_string", "string")
bsw/jbe@5: local issues = issues or issues_selector:exec()
bsw/jbe@5: -- issues:load(initiatives)
bsw/jbe@5: ui.list{
bsw/jbe@5: attr = { class = "issues" },
bsw/jbe@5: records = issues,
bsw/jbe@5: columns = {
bsw/jbe@5: {
bsw/jbe@5: label = _"Issue",
bsw/jbe@5: content = function(record)
bsw/jbe@5: if not param.get("for_area_list", atom.boolean) then
bsw/jbe@5: ui.field.text{
bsw/jbe@5: value = record.area.name
bsw/jbe@5: }
bsw/jbe@5: slot.put("
")
bsw/jbe@5: end
bsw@11: if record.is_interested then
bsw@11: local label = _"You are interested in this issue",
bsw@11: ui.image{
bsw@11: attr = { alt = label, title = label },
bsw@11: static = "icons/16/eye.png"
bsw@11: }
bsw@11: slot.put(" ")
bsw@11: end
bsw/jbe@5: ui.link{
bsw@10: text = _("Issue ##{id}", { id = tostring(record.id) }),
bsw/jbe@5: module = "issue",
bsw/jbe@5: view = "show",
bsw/jbe@5: id = record.id
bsw/jbe@5: }
bsw/jbe@5: if record.state == "new" then
bsw/jbe@5: ui.image{
bsw/jbe@5: static = "icons/16/new.png"
bsw/jbe@5: }
bsw/jbe@5: end
bsw/jbe@5: slot.put("
")
bsw/jbe@5: slot.put("
")
bsw@10: if record.old_state then
bsw@10: ui.field.text{ value = format.time(record.sort) }
bsw@10: ui.field.text{ value = Issue:get_state_name_for_state(record.old_state) .. " > " .. Issue:get_state_name_for_state(record.new_state) }
bsw@10: else
bsw@10: end
bsw/jbe@5: end
bsw/jbe@5: },
bsw/jbe@5: {
bsw/jbe@5: label = _"State",
bsw/jbe@5: content = function(record)
bsw/jbe@6: if record.state == "voting" then
bsw/jbe@6: ui.link{
bsw/jbe@6: content = _"Voting",
bsw/jbe@6: module = "vote",
bsw/jbe@6: view = "list",
bsw/jbe@6: params = { issue_id = record.id }
bsw/jbe@6: }
bsw/jbe@6: else
bsw/jbe@6: ui.field.issue_state{ value = record.state }
bsw/jbe@6: end
bsw/jbe@5: end
bsw/jbe@5: },
bsw/jbe@5: {
bsw/jbe@5: label = _"Initiatives",
bsw/jbe@5: content = function(record)
bsw/jbe@5: local initiatives_selector = record:get_reference_selector("initiatives")
bsw/jbe@5: local highlight_string = param.get("highlight_string")
bsw/jbe@5: if highlight_string then
bsw/jbe@5: initiatives_selector:add_field( {'"highlight"("initiative"."name", ?)', highlight_string }, "name_highlighted")
bsw/jbe@5: end
bsw/jbe@5: execute.view{
bsw/jbe@5: module = "initiative",
bsw/jbe@5: view = "_list",
bsw/jbe@5: params = {
bsw/jbe@5: issue = record,
bsw/jbe@5: initiatives_selector = initiatives_selector,
bsw/jbe@5: highlight_string = highlight_string,
bsw@10: per_page = param.get("initiatives_per_page", atom.number),
bsw@10: no_sort = param.get("initiatives_no_sort", atom.boolean)
bsw/jbe@5: }
bsw/jbe@5: }
bsw/jbe@5: end
bsw/jbe@5: },
bsw@2: }
bsw@2: }
bsw@2: end
bsw/jbe@5: }
bsw/jbe@5: end
bsw@2: }
bsw@2: end
bsw/jbe@0: }
bsw/jbe@0: end
bsw/jbe@0: }
bsw/jbe@5: if param.get("legend", atom.boolean) ~= false then
bsw/jbe@5: local filter = param.get_all_cgi().filter
bsw/jbe@5: if not filter or filter == "any" or filter ~= "finished" then
bsw/jbe@5: ui.bargraph_legend{
bsw/jbe@5: width = 25,
bsw/jbe@5: bars = {
bsw/jbe@5: { color = "#0a0", label = _"Supporter" },
bsw/jbe@5: { color = "#777", label = _"Potential supporter" },
bsw/jbe@5: { color = "#ddd", label = _"No support at all" },
bsw/jbe@5: }
bsw/jbe@5: }
bsw/jbe@5: end
bsw/jbe@5: if not filter or filter == "any" or filter == "finished" then
bsw/jbe@5: ui.bargraph_legend{
bsw/jbe@5: width = 25,
bsw/jbe@5: bars = {
bsw/jbe@5: { color = "#0a0", label = _"Yes" },
bsw/jbe@5: { color = "#aaa", label = _"Abstention" },
bsw/jbe@5: { color = "#a00", label = _"No" },
bsw/jbe@5: }
bsw/jbe@5: }
bsw/jbe@5: end
bsw/jbe@5: end
bsw/jbe@0: end
bsw@2: }