liquid_feedback_frontend

annotate app/main/issue/_list.lua @ 5:afd9f769c7ae

Version beta1

Final voting with Schulze-Method is now possible

Many bug fixes and code cleanup

Registration with invite codes

More sort and filter options

Seperated display of "supporters" and "potential supporters"

Optical changes

Flood limit / initiative contigent is now checked by frontend

Neccessary changes to access core beta11
author bsw/jbe
date Fri Dec 25 12:00:00 2009 +0100 (2009-12-25)
parents 5c601807d397
children 8d91bccab0bf
rev   line source
bsw/jbe@0 1 local issues_selector = param.get("issues_selector", "table")
bsw/jbe@0 2
bsw/jbe@5 3 local ui_filter = ui.filter
bsw/jbe@5 4 if param.get("filter", atom.boolean) == false then
bsw/jbe@5 5 ui_filter = function(args) args.content() end
bsw/jbe@5 6 end
bsw/jbe@0 7
bsw/jbe@5 8 local filter_voting = false
bsw/jbe@5 9 ui_filter{
bsw/jbe@0 10 selector = issues_selector,
bsw@2 11 filters = {
bsw@2 12 {
bsw@2 13 type = "boolean",
bsw@2 14 name = "any",
bsw@2 15 label = _"Any",
bsw@2 16 selector_modifier = function() end
bsw@2 17 },
bsw/jbe@0 18 {
bsw@2 19 type = "boolean",
bsw@2 20 name = "new",
bsw@2 21 label = _"New",
bsw@2 22 selector_modifier = function(selector, value)
bsw@2 23 if value then
bsw@2 24 selector:add_where("issue.accepted ISNULL AND issue.closed ISNULL")
bsw@2 25 end
bsw@2 26 end
bsw@2 27 },
bsw@2 28 {
bsw@2 29 type = "boolean",
bsw@2 30 name = "accepted",
bsw@2 31 label = _"In discussion",
bsw@2 32 selector_modifier = function(selector, value)
bsw@2 33 if value then
bsw@2 34 selector:add_where("issue.accepted NOTNULL AND issue.half_frozen ISNULL AND issue.closed ISNULL")
bsw@2 35 end
bsw@2 36 end
bsw/jbe@0 37 },
bsw/jbe@0 38 {
bsw@2 39 type = "boolean",
bsw@2 40 name = "half_frozen",
bsw@2 41 label = _"Frozen",
bsw@2 42 selector_modifier = function(selector, value)
bsw@2 43 if value then
bsw/jbe@5 44 selector:add_where("issue.half_frozen NOTNULL AND issue.fully_frozen ISNULL")
bsw@2 45 end
bsw@2 46 end
bsw@2 47 },
bsw@2 48 {
bsw@2 49 type = "boolean",
bsw@2 50 name = "frozen",
bsw@2 51 label = _"Voting",
bsw@2 52 selector_modifier = function(selector, value)
bsw@2 53 if value then
bsw@2 54 selector:add_where("issue.fully_frozen NOTNULL AND issue.closed ISNULL")
bsw/jbe@5 55 filter_voting = true
bsw@2 56 end
bsw@2 57 end
bsw/jbe@0 58 },
bsw/jbe@0 59 {
bsw@2 60 type = "boolean",
bsw@2 61 name = "finished",
bsw@2 62 label = _"Finished",
bsw@2 63 selector_modifier = function(selector, value)
bsw@2 64 if value then
bsw/jbe@5 65 selector:add_where("issue.closed NOTNULL AND issue.fully_frozen NOTNULL")
bsw@2 66 end
bsw@2 67 end
bsw@2 68 },
bsw@2 69 {
bsw@2 70 type = "boolean",
bsw@2 71 name = "cancelled",
bsw@2 72 label = _"Cancelled",
bsw@2 73 selector_modifier = function(selector, value)
bsw@2 74 if value then
bsw/jbe@5 75 selector:add_where("issue.closed NOTNULL AND issue.accepted ISNULL")
bsw@2 76 end
bsw@2 77 end
bsw@2 78 },
bsw/jbe@0 79 },
bsw/jbe@0 80 content = function()
bsw/jbe@5 81 local ui_filter = ui.filter
bsw/jbe@5 82 if not filter_voting then
bsw/jbe@5 83 ui_filter = function(args) args.content() end
bsw/jbe@5 84 end
bsw/jbe@5 85 ui_filter{
bsw/jbe@0 86 selector = issues_selector,
bsw/jbe@5 87 name = "filter_voting",
bsw/jbe@5 88 filters = {
bsw@2 89 {
bsw/jbe@5 90 type = "boolean",
bsw/jbe@5 91 name = "any",
bsw/jbe@5 92 label = _"Any",
bsw/jbe@5 93 selector_modifier = function() end
bsw@2 94 },
bsw@2 95 {
bsw/jbe@5 96 type = "boolean",
bsw/jbe@5 97 name = "not_voted",
bsw/jbe@5 98 label = _"Not voted",
bsw/jbe@5 99 selector_modifier = function(selector, value)
bsw/jbe@5 100 if value then
bsw/jbe@5 101 selector:left_join("direct_voter", nil, { "direct_voter.issue_id = issue.id AND direct_voter.member_id = ?", app.session.member.id })
bsw/jbe@5 102 selector:add_where("direct_voter.member_id ISNULL")
bsw/jbe@5 103 end
bsw/jbe@5 104 end
bsw@2 105 },
bsw@2 106 {
bsw/jbe@5 107 type = "boolean",
bsw/jbe@5 108 name = "voted",
bsw/jbe@5 109 label = _"Voted",
bsw/jbe@5 110 selector_modifier = function(selector, value)
bsw/jbe@5 111 if value then
bsw/jbe@5 112 selector:join("direct_voter", nil, { "direct_voter.issue_id = issue.id AND direct_voter.member_id = ?", app.session.member.id })
bsw/jbe@5 113 end
bsw/jbe@5 114 end
bsw/jbe@5 115 },
bsw@2 116 },
bsw/jbe@0 117 content = function()
bsw/jbe@5 118 local ui_filter = ui.filter
bsw/jbe@5 119 if param.get("filter", atom.boolean) == false then
bsw/jbe@5 120 ui_filter = function(args) args.content() end
bsw/jbe@5 121 end
bsw/jbe@5 122 ui_filter{
bsw@2 123 selector = issues_selector,
bsw/jbe@5 124 name = "filter_interest",
bsw/jbe@5 125 filters = {
bsw/jbe@5 126 {
bsw/jbe@5 127 type = "boolean",
bsw/jbe@5 128 name = "any",
bsw/jbe@5 129 label = _"Any",
bsw/jbe@5 130 selector_modifier = function() end
bsw/jbe@5 131 },
bsw/jbe@5 132 {
bsw/jbe@5 133 type = "boolean",
bsw/jbe@5 134 name = "my",
bsw/jbe@5 135 label = _"Interested",
bsw/jbe@5 136 selector_modifier = function(selector, value)
bsw/jbe@5 137 if value then
bsw/jbe@5 138 selector:join("interest", "filter_interest", { "filter_interest.issue_id = issue.id AND filter_interest.member_id = ? ", app.session.member.id })
bsw/jbe@5 139 end
bsw/jbe@5 140 end
bsw/jbe@5 141 },
bsw/jbe@5 142 },
bsw@2 143 content = function()
bsw/jbe@5 144
bsw/jbe@5 145 ui.order{
bsw/jbe@5 146 name = "issue_list",
bsw/jbe@5 147 selector = issues_selector,
bsw/jbe@5 148 options = {
bsw@2 149 {
bsw/jbe@5 150 name = "max_potential_support",
bsw/jbe@5 151 label = _"Max potential support",
bsw/jbe@5 152 selector_modifier = function(selector)
bsw/jbe@5 153 selector:add_order_by("(SELECT max(supporter_count) FROM initiative WHERE initiative.issue_id = issue.id)")
bsw@2 154 end
bsw@2 155 },
bsw@2 156 {
bsw/jbe@5 157 name = "max_support",
bsw/jbe@5 158 label = _"Max support",
bsw/jbe@5 159 selector_modifier = function(selector)
bsw/jbe@5 160 selector:add_order_by("(SELECT max(satisfied_supporter_count) FROM initiative WHERE initiative.issue_id = issue.id)")
bsw@2 161 end
bsw@2 162 },
bsw@2 163 {
bsw/jbe@5 164 name = "population",
bsw/jbe@5 165 label = _"Population",
bsw/jbe@5 166 order_by = "issue.population DESC"
bsw/jbe@5 167 },
bsw/jbe@5 168 {
bsw/jbe@5 169 name = "newest",
bsw/jbe@5 170 label = _"Newest",
bsw/jbe@5 171 order_by = "issue.created DESC"
bsw/jbe@5 172 },
bsw/jbe@5 173 {
bsw/jbe@5 174 name = "oldest",
bsw/jbe@5 175 label = _"Oldest",
bsw/jbe@5 176 order_by = "issue.created"
bsw/jbe@5 177 }
bsw/jbe@5 178 },
bsw/jbe@5 179 content = function()
bsw/jbe@5 180 ui.paginate{
bsw/jbe@5 181 selector = issues_selector,
bsw/jbe@5 182 content = function()
bsw/jbe@5 183 local highlight_string = param.get("highlight_string", "string")
bsw/jbe@5 184 local issues = issues or issues_selector:exec()
bsw/jbe@5 185 -- issues:load(initiatives)
bsw/jbe@5 186 ui.list{
bsw/jbe@5 187 attr = { class = "issues" },
bsw/jbe@5 188 records = issues,
bsw/jbe@5 189 columns = {
bsw/jbe@5 190 {
bsw/jbe@5 191 label = _"Issue",
bsw/jbe@5 192 content = function(record)
bsw/jbe@5 193 if not param.get("for_area_list", atom.boolean) then
bsw/jbe@5 194 ui.field.text{
bsw/jbe@5 195 value = record.area.name
bsw/jbe@5 196 }
bsw/jbe@5 197 slot.put("<br />")
bsw/jbe@5 198 end
bsw/jbe@5 199 ui.link{
bsw/jbe@5 200 text = _"Issue ##{id}":gsub("#{id}", tostring(record.id)),
bsw/jbe@5 201 module = "issue",
bsw/jbe@5 202 view = "show",
bsw/jbe@5 203 id = record.id
bsw/jbe@5 204 }
bsw/jbe@5 205 if record.state == "new" then
bsw/jbe@5 206 ui.image{
bsw/jbe@5 207 static = "icons/16/new.png"
bsw/jbe@5 208 }
bsw/jbe@5 209 end
bsw/jbe@5 210 slot.put("<br />")
bsw/jbe@5 211 slot.put("<br />")
bsw/jbe@5 212 end
bsw/jbe@5 213 },
bsw/jbe@5 214 {
bsw/jbe@5 215 label = _"State",
bsw/jbe@5 216 content = function(record)
bsw/jbe@5 217 ui.field.issue_state{ value = record.state }
bsw/jbe@5 218 end
bsw/jbe@5 219 },
bsw/jbe@5 220 {
bsw/jbe@5 221 label = _"Initiatives",
bsw/jbe@5 222 content = function(record)
bsw/jbe@5 223 local initiatives_selector = record:get_reference_selector("initiatives")
bsw/jbe@5 224 local highlight_string = param.get("highlight_string")
bsw/jbe@5 225 if highlight_string then
bsw/jbe@5 226 initiatives_selector:add_field( {'"highlight"("initiative"."name", ?)', highlight_string }, "name_highlighted")
bsw/jbe@5 227 end
bsw/jbe@5 228 execute.view{
bsw/jbe@5 229 module = "initiative",
bsw/jbe@5 230 view = "_list",
bsw/jbe@5 231 params = {
bsw/jbe@5 232 issue = record,
bsw/jbe@5 233 initiatives_selector = initiatives_selector,
bsw/jbe@5 234 highlight_string = highlight_string,
bsw/jbe@5 235 limit = 3
bsw/jbe@5 236 }
bsw/jbe@5 237 }
bsw/jbe@5 238 end
bsw/jbe@5 239 },
bsw@2 240 }
bsw@2 241 }
bsw@2 242 end
bsw/jbe@5 243 }
bsw/jbe@5 244 end
bsw@2 245 }
bsw@2 246 end
bsw/jbe@0 247 }
bsw/jbe@0 248 end
bsw/jbe@0 249 }
bsw/jbe@5 250 if param.get("legend", atom.boolean) ~= false then
bsw/jbe@5 251 local filter = param.get_all_cgi().filter
bsw/jbe@5 252 if not filter or filter == "any" or filter ~= "finished" then
bsw/jbe@5 253 ui.bargraph_legend{
bsw/jbe@5 254 width = 25,
bsw/jbe@5 255 bars = {
bsw/jbe@5 256 { color = "#0a0", label = _"Supporter" },
bsw/jbe@5 257 { color = "#777", label = _"Potential supporter" },
bsw/jbe@5 258 { color = "#ddd", label = _"No support at all" },
bsw/jbe@5 259 }
bsw/jbe@5 260 }
bsw/jbe@5 261 end
bsw/jbe@5 262 if not filter or filter == "any" or filter == "finished" then
bsw/jbe@5 263 ui.bargraph_legend{
bsw/jbe@5 264 width = 25,
bsw/jbe@5 265 bars = {
bsw/jbe@5 266 { color = "#0a0", label = _"Yes" },
bsw/jbe@5 267 { color = "#aaa", label = _"Abstention" },
bsw/jbe@5 268 { color = "#a00", label = _"No" },
bsw/jbe@5 269 }
bsw/jbe@5 270 }
bsw/jbe@5 271 end
bsw/jbe@5 272 end
bsw/jbe@0 273 end
bsw@2 274 }

Impressum / About Us