liquid_feedback_frontend
annotate app/main/initiative/_list.lua @ 41:53a45356c107
Several bugfixes, including bugfix in timeline
- Fixed grouping of multiple new drafts in timeline
- Do not allow to add suggestions when issue is half frozen
- Do not show initiator invitations for (half-)frozen or closed issues
- Fixed problem with duplicates in display of vote-later requests
- Clarified german "member is participating" info text in delegation chain
- Hide inactive members from member listing
- Fixed grouping of multiple new drafts in timeline
- Do not allow to add suggestions when issue is half frozen
- Do not show initiator invitations for (half-)frozen or closed issues
- Fixed problem with duplicates in display of vote-later requests
- Clarified german "member is participating" info text in delegation chain
- Hide inactive members from member listing
| author | bsw | 
|---|---|
| date | Sun Mar 07 15:36:54 2010 +0100 (2010-03-07) | 
| parents | 81586ea68d57 | 
| children | 0849be391140 | 
| rev | line source | 
|---|---|
| bsw/jbe@19 | 1 ui.script{ script = "lf_initiative_expanded = {};" } | 
| bsw@11 | 2 | 
| bsw/jbe@0 | 3 local issue = param.get("issue", "table") | 
| bsw/jbe@0 | 4 | 
| bsw/jbe@19 | 5 local initiatives_selector = param.get("initiatives_selector", "table") | 
| bsw@11 | 6 initiatives_selector | 
| bsw/jbe@19 | 7 :join("issue", nil, "issue.id = initiative.issue_id") | 
| bsw@11 | 8 :left_join("initiator", "_initiator", { "_initiator.initiative_id = initiative.id AND _initiator.member_id = ?", app.session.member.id} ) | 
| bsw@11 | 9 :left_join("supporter", "_supporter", { "_supporter.initiative_id = initiative.id AND _supporter.member_id = ?", app.session.member.id} ) | 
| bsw@11 | 10 | 
| bsw@11 | 11 :add_field("(_initiator.member_id NOTNULL)", "is_initiator") | 
| bsw@11 | 12 :add_field({"(_supporter.member_id NOTNULL) AND NOT EXISTS(SELECT 1 FROM opinion WHERE opinion.initiative_id = initiative.id AND opinion.member_id = ? AND ((opinion.degree = 2 AND NOT fulfilled) OR (opinion.degree = -2 AND fulfilled)))", app.session.member.id }, "is_supporter") | 
| bsw@11 | 13 :add_field({"EXISTS(SELECT 1 FROM opinion WHERE opinion.initiative_id = initiative.id AND opinion.member_id = ? AND ((opinion.degree = 2 AND NOT fulfilled) OR (opinion.degree = -2 AND fulfilled)))", app.session.member.id }, "is_potential_supporter") | 
| bsw@11 | 14 | 
| bsw/jbe@19 | 15 local initiatives_count = initiatives_selector:count() | 
| bsw@11 | 16 | 
| bsw/jbe@19 | 17 local limit = param.get("limit", atom.number) | 
| bsw/jbe@19 | 18 local no_sort = param.get("no_sort", atom.boolean) | 
| bsw/jbe@19 | 19 | 
| bsw/jbe@19 | 20 local show_for_issue = param.get("show_for_issue", atom.boolean) | 
| bsw/jbe@19 | 21 | 
| bsw/jbe@19 | 22 local show_for_initiative | 
| bsw/jbe@19 | 23 | 
| bsw/jbe@19 | 24 local show_for_initiative_id = param.get("for_initiative_id", atom.number) | 
| bsw/jbe@19 | 25 | 
| bsw/jbe@19 | 26 if show_for_initiative_id then | 
| bsw/jbe@19 | 27 show_for_initiative = Initiative:by_id(show_for_initiative_id) | 
| bsw/jbe@19 | 28 | 
| bsw/jbe@19 | 29 elseif not show_for_initiative_id and show_for_issue and issue and issue.ranks_available then | 
| bsw/jbe@19 | 30 winning_initiative = Initiative:new_selector() | 
| bsw/jbe@19 | 31 :add_where{ "issue_id = ?", issue.id } | 
| bsw/jbe@19 | 32 :add_where("rank = 1") | 
| bsw@24 | 33 :optional_object_mode() | 
| bsw/jbe@19 | 34 :exec() | 
| bsw/jbe@19 | 35 if winning_initiative then | 
| bsw/jbe@19 | 36 show_for_initiative = winning_initiative | 
| bsw/jbe@19 | 37 ui.container{ | 
| bsw/jbe@19 | 38 attr = { class = "admitted_info" }, | 
| bsw/jbe@19 | 39 content = _"This issue has been finished with the following winning initiative:" | 
| bsw/jbe@19 | 40 } | 
| bsw/jbe@19 | 41 else | 
| bsw/jbe@19 | 42 ui.container{ | 
| bsw/jbe@19 | 43 attr = { class = "not_admitted_info" }, | 
| bsw/jbe@19 | 44 content = _"This issue has been finished without any winning initiative." | 
| bsw/jbe@19 | 45 } | 
| bsw/jbe@19 | 46 end | 
| bsw/jbe@19 | 47 end | 
| bsw/jbe@19 | 48 | 
| bsw/jbe@19 | 49 | 
| bsw/jbe@19 | 50 if show_for_initiative then | 
| bsw/jbe@19 | 51 ui.script{ script = "lf_initiative_expanded['initiative_content_" .. tostring(show_for_initiative.id) .. "'] = true;" } | 
| bsw/jbe@19 | 52 initiatives_selector:add_where{ "initiative.id != ?", show_for_initiative.id } | 
| bsw/jbe@19 | 53 | 
| bsw/jbe@19 | 54 execute.view{ | 
| bsw/jbe@19 | 55 module = "initiative", | 
| bsw/jbe@19 | 56 view = "_list_element", | 
| bsw/jbe@19 | 57 params = { | 
| bsw/jbe@19 | 58 initiative = show_for_initiative, | 
| bsw/jbe@19 | 59 expanded = true, | 
| bsw/jbe@19 | 60 expandable = true | 
| bsw/jbe@19 | 61 } | 
| bsw/jbe@19 | 62 } | 
| bsw/jbe@19 | 63 if show_for_issue then | 
| bsw/jbe@19 | 64 slot.put("<br />") | 
| bsw/jbe@19 | 65 ui.container{ | 
| bsw/jbe@19 | 66 attr = { style = "font-weight: bold;" }, | 
| bsw/jbe@0 | 67 content = function() | 
| bsw/jbe@19 | 68 slot.put(_"Alternative initiatives") | 
| bsw/jbe@0 | 69 end | 
| bsw/jbe@0 | 70 } | 
| bsw/jbe@0 | 71 end | 
| bsw/jbe@19 | 72 elseif show_for_issue then | 
| bsw/jbe@19 | 73 ui.container{ | 
| bsw/jbe@19 | 74 attr = { style = "font-weight: bold;" }, | 
| bsw/jbe@19 | 75 content = function() | 
| bsw/jbe@19 | 76 slot.put(_"Alternative initiatives") | 
| bsw/jbe@19 | 77 end | 
| bsw@11 | 78 } | 
| bsw@11 | 79 end | 
| bsw/jbe@19 | 80 | 
| bsw/jbe@19 | 81 if not show_for_initiative or initiatives_count > 1 then | 
| bsw/jbe@19 | 82 | 
| bsw/jbe@19 | 83 | 
| bsw/jbe@19 | 84 local more_initiatives_count | 
| bsw/jbe@19 | 85 if limit then | 
| bsw/jbe@19 | 86 limit = limit - (show_for_initiative and 1 or 0) | 
| bsw/jbe@19 | 87 if initiatives_count > limit then | 
| bsw/jbe@19 | 88 more_initiatives_count = initiatives_count - limit | 
| bsw/jbe@19 | 89 end | 
| bsw/jbe@19 | 90 initiatives_selector:limit(limit) | 
| bsw/jbe@19 | 91 end | 
| bsw/jbe@19 | 92 | 
| bsw/jbe@19 | 93 local expandable = param.get("expandable", atom.boolean) | 
| bsw/jbe@19 | 94 | 
| bsw/jbe@19 | 95 local issue = param.get("issue", "table") | 
| bsw/jbe@19 | 96 | 
| bsw/jbe@19 | 97 local name = "initiative_list" | 
| bsw/jbe@19 | 98 if issue then | 
| bsw/jbe@19 | 99 name = "issue_" .. tostring(issue.id) .. "_initiative_list" | 
| bsw/jbe@19 | 100 end | 
| bsw/jbe@19 | 101 | 
| bsw/jbe@19 | 102 ui.add_partial_param_names{ name } | 
| bsw/jbe@19 | 103 | 
| bsw/jbe@19 | 104 local order_filter = { | 
| bsw/jbe@19 | 105 name = name, | 
| bsw/jbe@19 | 106 label = _"Order by" | 
| bsw/jbe@19 | 107 } | 
| bsw/jbe@19 | 108 | 
| bsw/jbe@19 | 109 if issue and issue.ranks_available then | 
| bsw/jbe@19 | 110 order_filter[#order_filter+1] = { | 
| bsw/jbe@19 | 111 name = "rank", | 
| bsw/jbe@19 | 112 label = _"Rank", | 
| bsw/jbe@19 | 113 selector_modifier = function(selector) selector:add_order_by("initiative.rank, initiative.admitted DESC, vote_ratio(initiative.positive_votes, initiative.negative_votes) DESC, initiative.id") end | 
| bsw/jbe@19 | 114 } | 
| bsw/jbe@19 | 115 end | 
| bsw/jbe@19 | 116 | 
| bsw/jbe@19 | 117 order_filter[#order_filter+1] = { | 
| bsw/jbe@19 | 118 name = "potential_support", | 
| bsw/jbe@19 | 119 label = _"Potential support", | 
| bsw/jbe@19 | 120 selector_modifier = function(selector) selector:add_order_by("initiative.supporter_count::float / issue.population::float DESC, initiative.id") end | 
| bsw/jbe@19 | 121 } | 
| bsw/jbe@19 | 122 | 
| bsw/jbe@19 | 123 order_filter[#order_filter+1] = { | 
| bsw/jbe@19 | 124 name = "support", | 
| bsw/jbe@19 | 125 label = _"Support", | 
| bsw/jbe@19 | 126 selector_modifier = function(selector) selector:add_order_by("initiative.satisfied_supporter_count::float / issue.population::float DESC, initiative.id") end | 
| bsw/jbe@19 | 127 } | 
| bsw/jbe@19 | 128 | 
| bsw/jbe@19 | 129 order_filter[#order_filter+1] = { | 
| bsw/jbe@19 | 130 name = "newest", | 
| bsw/jbe@19 | 131 label = _"Newest", | 
| bsw/jbe@19 | 132 selector_modifier = function(selector) selector:add_order_by("initiative.created DESC, initiative.id") end | 
| bsw/jbe@19 | 133 } | 
| bsw/jbe@19 | 134 | 
| bsw/jbe@19 | 135 order_filter[#order_filter+1] = { | 
| bsw/jbe@19 | 136 name = "oldest", | 
| bsw/jbe@19 | 137 label = _"Oldest", | 
| bsw/jbe@19 | 138 selector_modifier = function(selector) selector:add_order_by("initiative.created, initiative.id") end | 
| bsw/jbe@19 | 139 } | 
| bsw/jbe@19 | 140 | 
| bsw/jbe@19 | 141 ui_filters = ui.filters | 
| bsw/jbe@19 | 142 | 
| bsw/jbe@19 | 143 if no_sort then | 
| bsw/jbe@19 | 144 ui_filters = function(args) args.content() end | 
| bsw/jbe@19 | 145 if issue.ranks_available then | 
| bsw/jbe@19 | 146 initiatives_selector:add_order_by("initiative.rank, initiative.admitted DESC, vote_ratio(initiative.positive_votes, initiative.negative_votes) DESC, initiative.id") | 
| bsw/jbe@19 | 147 else | 
| bsw/jbe@19 | 148 initiatives_selector:add_order_by("initiative.supporter_count::float / issue.population::float DESC, initiative.id") | 
| bsw/jbe@19 | 149 end | 
| bsw/jbe@19 | 150 end | 
| bsw/jbe@19 | 151 | 
| bsw/jbe@19 | 152 ui_filters{ | 
| bsw/jbe@19 | 153 label = _"Change order", | 
| bsw/jbe@19 | 154 order_filter, | 
| bsw/jbe@19 | 155 selector = initiatives_selector, | 
| bsw/jbe@19 | 156 content = function() | 
| bsw/jbe@19 | 157 ui.paginate{ | 
| bsw/jbe@19 | 158 name = issue and "issue_" .. tostring(issue.id) .. "_page" or nil, | 
| bsw/jbe@19 | 159 selector = initiatives_selector, | 
| bsw/jbe@19 | 160 per_page = param.get("per_page", atom.number), | 
| bsw/jbe@19 | 161 content = function() | 
| bsw/jbe@19 | 162 local initiatives = initiatives_selector:exec() | 
| bsw/jbe@19 | 163 for i, initiative in ipairs(initiatives) do | 
| bsw/jbe@19 | 164 local expanded = config.user_tab_mode == "accordeon_all_expanded" and expandable or | 
| bsw/jbe@19 | 165 show_for_initiative and initiative.id == show_for_initiative.id | 
| bsw/jbe@19 | 166 if expanded then | 
| bsw/jbe@19 | 167 ui.script{ script = "lf_initiative_expanded['initiative_content_" .. tostring(initiative.id) .. "'] = true;" } | 
| bsw/jbe@19 | 168 end | 
| bsw/jbe@19 | 169 execute.view{ | 
| bsw/jbe@19 | 170 module = "initiative", | 
| bsw/jbe@19 | 171 view = "_list_element", | 
| bsw/jbe@19 | 172 params = { | 
| bsw/jbe@19 | 173 initiative = initiative, | 
| bsw/jbe@19 | 174 expanded = expanded, | 
| bsw/jbe@19 | 175 expandable = expandable | 
| bsw/jbe@19 | 176 } | 
| bsw/jbe@19 | 177 } | 
| bsw/jbe@19 | 178 end | 
| bsw/jbe@19 | 179 end | 
| bsw/jbe@19 | 180 } | 
| bsw/jbe@19 | 181 end | 
| bsw/jbe@19 | 182 } | 
| bsw/jbe@19 | 183 | 
| bsw/jbe@19 | 184 if more_initiatives_count then | 
| bsw/jbe@19 | 185 ui.link{ | 
| bsw/jbe@19 | 186 attr = { style = "font-size: 75%; font-style: italic;" }, | 
| bsw/jbe@19 | 187 content = _("and #{count} more initiatives", { count = more_initiatives_count }), | 
| bsw/jbe@19 | 188 module = "issue", | 
| bsw/jbe@19 | 189 view = "show", | 
| bsw/jbe@19 | 190 id = issue.id, | 
| bsw/jbe@19 | 191 } | 
| bsw/jbe@19 | 192 end | 
| bsw/jbe@19 | 193 | 
| bsw/jbe@19 | 194 end | 
| bsw/jbe@19 | 195 | 
| bsw/jbe@19 | 196 if show_for_issue then | 
| bsw/jbe@19 | 197 slot.put("<br />") | 
| bsw/jbe@19 | 198 | 
| bsw/jbe@19 | 199 if issue and initiatives_count == 1 then | 
| bsw/jbe@19 | 200 ui.container{ | 
| bsw/jbe@19 | 201 content = function() | 
| bsw/jbe@19 | 202 if issue.fully_frozen or issue.closed then | 
| bsw/jbe@19 | 203 slot.put(_"There were no more alternative initiatives.") | 
| bsw/jbe@19 | 204 else | 
| bsw/jbe@19 | 205 slot.put(_"There are no more alternative initiatives currently.") | 
| bsw/jbe@19 | 206 end | 
| bsw/jbe@19 | 207 end | 
| bsw/jbe@19 | 208 } | 
| bsw/jbe@19 | 209 end | 
| bsw/jbe@19 | 210 | 
| bsw/jbe@19 | 211 if not (issue.fully_frozen or issue.closed) then | 
| bsw/jbe@19 | 212 slot.put(" ") | 
| bsw/jbe@19 | 213 ui.link{ | 
| bsw/jbe@19 | 214 content = function() | 
| bsw/jbe@19 | 215 ui.image{ static = "icons/16/script_add.png" } | 
| bsw/jbe@19 | 216 slot.put(" ") | 
| bsw/jbe@19 | 217 slot.put(_"Create alternative initiative") | 
| bsw/jbe@19 | 218 end, | 
| bsw/jbe@19 | 219 module = "initiative", | 
| bsw/jbe@19 | 220 view = "new", | 
| bsw/jbe@19 | 221 params = { issue_id = issue.id } | 
| bsw/jbe@19 | 222 } | 
| bsw/jbe@19 | 223 end | 
| bsw/jbe@19 | 224 end |