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)
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

Impressum / About Us