liquid_feedback_frontend
annotate app/main/initiative/_list.lua @ 11:77d58efe99fd
Version beta7
Important security fixes:
- Added missing HTML encoding to postal address of member
- Link to discussion URL only if it starts with http(s)://
Other bugfixes:
- Fixed wrong display of 2nd level delegating voters for an initiative
- Do not display invited initiators as initiators while voting
- Added missing translation
New features:
- Public message of the day
- Both direct and indirect supporter count is shown in tab heads
- Support shown in initiative lists
Language chooser at the login page has been added (again)
Important security fixes:
- Added missing HTML encoding to postal address of member
- Link to discussion URL only if it starts with http(s)://
Other bugfixes:
- Fixed wrong display of 2nd level delegating voters for an initiative
- Do not display invited initiators as initiators while voting
- Added missing translation
New features:
- Public message of the day
- Both direct and indirect supporter count is shown in tab heads
- Support shown in initiative lists
Language chooser at the login page has been added (again)
author | bsw |
---|---|
date | Fri Jan 22 12:00:00 2010 +0100 (2010-01-22) |
parents | 72c5e0ee7c98 |
children | 00d1004545f1 |
rev | line source |
---|---|
bsw/jbe@0 | 1 local initiatives_selector = param.get("initiatives_selector", "table") |
bsw/jbe@0 | 2 initiatives_selector:join("issue", nil, "issue.id = initiative.issue_id") |
bsw/jbe@0 | 3 |
bsw@11 | 4 local limit = param.get("limit", atom.number) |
bsw@11 | 5 |
bsw@11 | 6 local more_initiatives_count |
bsw@11 | 7 if limit then |
bsw@11 | 8 local initiatives_count = initiatives_selector:count() |
bsw@11 | 9 if initiatives_count > limit then |
bsw@11 | 10 more_initiatives_count = initiatives_count - limit |
bsw@11 | 11 end |
bsw@11 | 12 initiatives_selector:limit(limit) |
bsw@11 | 13 end |
bsw@11 | 14 |
bsw@11 | 15 |
bsw/jbe@0 | 16 local issue = param.get("issue", "table") |
bsw/jbe@0 | 17 |
bsw/jbe@0 | 18 local order_options = {} |
bsw/jbe@0 | 19 |
bsw/jbe@0 | 20 if issue and issue.ranks_available then |
bsw/jbe@0 | 21 order_options[#order_options+1] = { |
bsw/jbe@0 | 22 name = "rank", |
bsw/jbe@0 | 23 label = _"Rank", |
bsw/jbe@5 | 24 order_by = "initiative.rank, initiative.admitted DESC, vote_ratio(initiative.positive_votes, initiative.negative_votes) DESC, initiative.id" |
bsw/jbe@0 | 25 } |
bsw/jbe@0 | 26 end |
bsw/jbe@0 | 27 |
bsw/jbe@0 | 28 order_options[#order_options+1] = { |
bsw/jbe@5 | 29 name = "potential_support", |
bsw/jbe@5 | 30 label = _"Potential support", |
bsw/jbe@5 | 31 order_by = "initiative.supporter_count::float / issue.population::float DESC, initiative.id" |
bsw/jbe@5 | 32 } |
bsw/jbe@5 | 33 |
bsw/jbe@5 | 34 order_options[#order_options+1] = { |
bsw/jbe@0 | 35 name = "support", |
bsw/jbe@0 | 36 label = _"Support", |
bsw/jbe@5 | 37 order_by = "initiative.satisfied_supporter_count::float / issue.population::float DESC, initiative.id" |
bsw/jbe@0 | 38 } |
bsw/jbe@0 | 39 |
bsw/jbe@0 | 40 order_options[#order_options+1] = { |
bsw/jbe@0 | 41 name = "newest", |
bsw/jbe@0 | 42 label = _"Newest", |
bsw/jbe@5 | 43 order_by = "initiative.created DESC, initiative.id" |
bsw/jbe@0 | 44 } |
bsw/jbe@0 | 45 |
bsw/jbe@0 | 46 order_options[#order_options+1] = { |
bsw/jbe@0 | 47 name = "oldest", |
bsw/jbe@0 | 48 label = _"Oldest", |
bsw/jbe@5 | 49 order_by = "initiative.created, initiative.id" |
bsw/jbe@0 | 50 } |
bsw/jbe@0 | 51 |
bsw/jbe@0 | 52 local name = "initiative_list" |
bsw/jbe@0 | 53 if issue then |
bsw/jbe@0 | 54 name = "issue_" .. tostring(issue.id) .. "_initiative_list" |
bsw/jbe@0 | 55 end |
bsw/jbe@0 | 56 |
bsw@10 | 57 ui_order = ui.order |
bsw@10 | 58 |
bsw@10 | 59 if param.get("no_sort", atom.boolean) then |
bsw@10 | 60 ui_order = function(args) args.content() end |
bsw@10 | 61 if issue.ranks_available then |
bsw@10 | 62 initiatives_selector:add_order_by("initiative.rank, initiative.admitted DESC, vote_ratio(initiative.positive_votes, initiative.negative_votes) DESC, initiative.id") |
bsw@10 | 63 else |
bsw@10 | 64 initiatives_selector:add_order_by("initiative.supporter_count::float / issue.population::float DESC, initiative.id") |
bsw@10 | 65 end |
bsw@10 | 66 end |
bsw@10 | 67 |
bsw@11 | 68 initiatives_selector |
bsw@11 | 69 :left_join("initiator", "_initiator", { "_initiator.initiative_id = initiative.id AND _initiator.member_id = ?", app.session.member.id} ) |
bsw@11 | 70 :left_join("supporter", "_supporter", { "_supporter.initiative_id = initiative.id AND _supporter.member_id = ?", app.session.member.id} ) |
bsw@11 | 71 |
bsw@11 | 72 :add_field("(_initiator.member_id NOTNULL)", "is_initiator") |
bsw@11 | 73 :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 | 74 :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 | 75 |
bsw@11 | 76 |
bsw@10 | 77 ui_order{ |
bsw/jbe@0 | 78 name = name, |
bsw/jbe@0 | 79 selector = initiatives_selector, |
bsw/jbe@0 | 80 options = order_options, |
bsw/jbe@0 | 81 content = function() |
bsw/jbe@0 | 82 ui.paginate{ |
bsw@11 | 83 name = issue and "issue_" .. tostring(issue.id) .. "_page" or nil, |
bsw/jbe@0 | 84 selector = initiatives_selector, |
bsw@10 | 85 per_page = param.get("per_page", atom.number), |
bsw/jbe@0 | 86 content = function() |
bsw/jbe@0 | 87 local initiatives = initiatives_selector:exec() |
bsw/jbe@0 | 88 local columns = {} |
bsw@2 | 89 columns[#columns+1] = { |
bsw@2 | 90 content = function(record) |
bsw@2 | 91 if record.issue.accepted and record.issue.closed and record.issue.ranks_available then |
bsw@3 | 92 ui.field.rank{ attr = { class = "rank" }, value = record.rank } |
bsw@3 | 93 end |
bsw@3 | 94 end |
bsw@3 | 95 } |
bsw@3 | 96 columns[#columns+1] = { |
bsw@3 | 97 content = function(record) |
bsw/jbe@5 | 98 if record.issue.accepted and record.issue.closed then |
bsw/jbe@5 | 99 if record.issue.ranks_available then |
bsw/jbe@5 | 100 if record.negative_votes and record.positive_votes then |
bsw/jbe@5 | 101 local max_value = record.issue.voter_count |
bsw/jbe@5 | 102 ui.bargraph{ |
bsw/jbe@5 | 103 max_value = max_value, |
bsw/jbe@5 | 104 width = 100, |
bsw/jbe@5 | 105 bars = { |
bsw/jbe@5 | 106 { color = "#0a0", value = record.positive_votes }, |
bsw/jbe@5 | 107 { color = "#aaa", value = max_value - record.negative_votes - record.positive_votes }, |
bsw/jbe@5 | 108 { color = "#a00", value = record.negative_votes }, |
bsw/jbe@5 | 109 } |
bsw/jbe@0 | 110 } |
bsw/jbe@5 | 111 end |
bsw/jbe@5 | 112 else |
bsw/jbe@5 | 113 slot.put(_"Counting of votes") |
bsw/jbe@0 | 114 end |
bsw@2 | 115 else |
bsw/jbe@0 | 116 local max_value = (record.issue.population or 0) |
bsw/jbe@0 | 117 ui.bargraph{ |
bsw/jbe@0 | 118 max_value = max_value, |
bsw/jbe@4 | 119 width = 100, |
bsw/jbe@0 | 120 bars = { |
bsw@2 | 121 { color = "#0a0", value = (record.satisfied_supporter_count or 0) }, |
bsw/jbe@5 | 122 { color = "#777", value = (record.supporter_count or 0) - (record.satisfied_supporter_count or 0) }, |
bsw/jbe@0 | 123 { color = "#ddd", value = max_value - (record.supporter_count or 0) }, |
bsw/jbe@0 | 124 } |
bsw/jbe@0 | 125 } |
bsw/jbe@0 | 126 end |
bsw@2 | 127 end |
bsw@2 | 128 } |
bsw/jbe@0 | 129 columns[#columns+1] = { |
bsw/jbe@0 | 130 content = function(record) |
bsw@10 | 131 local link_class |
bsw@10 | 132 if record.revoked then |
bsw@10 | 133 link_class = "revoked" |
bsw@10 | 134 end |
bsw/jbe@0 | 135 ui.link{ |
bsw@10 | 136 attr = { class = link_class }, |
bsw/jbe@0 | 137 content = function() |
bsw@2 | 138 local name |
bsw@2 | 139 if record.name_highlighted then |
bsw@2 | 140 name = encode.highlight(record.name_highlighted) |
bsw@2 | 141 else |
bsw@2 | 142 name = encode.html(record.name) |
bsw@2 | 143 end |
bsw@2 | 144 slot.put(name) |
bsw/jbe@0 | 145 end, |
bsw/jbe@0 | 146 module = "initiative", |
bsw/jbe@0 | 147 view = "show", |
bsw/jbe@0 | 148 id = record.id |
bsw/jbe@0 | 149 } |
bsw@2 | 150 if record.issue.state == "new" then |
bsw@2 | 151 ui.image{ |
bsw@2 | 152 static = "icons/16/new.png" |
bsw@2 | 153 } |
bsw@2 | 154 end |
bsw@11 | 155 if record.is_supporter then |
bsw@11 | 156 slot.put(" ") |
bsw@11 | 157 local label = _"You are supporting this initiative" |
bsw@11 | 158 ui.image{ |
bsw@11 | 159 attr = { alt = label, title = label }, |
bsw@11 | 160 static = "icons/16/thumb_up_green.png" |
bsw@11 | 161 } |
bsw@11 | 162 end |
bsw@11 | 163 if record.is_potential_supporter then |
bsw@11 | 164 slot.put(" ") |
bsw@11 | 165 local label = _"You are potential supporter of this initiative" |
bsw@11 | 166 ui.image{ |
bsw@11 | 167 attr = { alt = label, title = label }, |
bsw@11 | 168 static = "icons/16/thumb_up.png" |
bsw@11 | 169 } |
bsw@11 | 170 end |
bsw@11 | 171 if record.is_initiator then |
bsw@11 | 172 slot.put(" ") |
bsw@11 | 173 local label = _"You are iniator of this initiative" |
bsw@11 | 174 ui.image{ |
bsw@11 | 175 attr = { alt = label, title = label }, |
bsw@11 | 176 static = "icons/16/user_edit.png" |
bsw@11 | 177 } |
bsw@11 | 178 end |
bsw/jbe@0 | 179 end |
bsw/jbe@0 | 180 } |
bsw/jbe@0 | 181 |
bsw/jbe@0 | 182 ui.list{ |
bsw/jbe@0 | 183 attr = { class = "initiatives" }, |
bsw/jbe@0 | 184 records = initiatives, |
bsw/jbe@0 | 185 columns = columns |
bsw/jbe@0 | 186 } |
bsw/jbe@0 | 187 end |
bsw/jbe@0 | 188 } |
bsw/jbe@0 | 189 end |
bsw@11 | 190 } |
bsw@11 | 191 |
bsw@11 | 192 if more_initiatives_count then |
bsw@11 | 193 ui.link{ |
bsw@11 | 194 attr = { style = "font-size: 75%; font-style: italic;" }, |
bsw@11 | 195 content = _("#{count} more initiatives", { count = more_initiatives_count }), |
bsw@11 | 196 module = "issue", |
bsw@11 | 197 view = "show", |
bsw@11 | 198 id = issue.id, |
bsw@11 | 199 } |
bsw@11 | 200 end |