rev |
line source |
bsw/jbe@0
|
1 local issues_selector = param.get("issues_selector", "table")
|
bsw@459
|
2 local member = param.get("for_member", "table") or app.session.member
|
bsw@459
|
3 local for_member = param.get("for_member", "table")
|
bsw@414
|
4 local for_state = param.get("for_state")
|
bsw@414
|
5 local for_unit = param.get("for_unit", atom.boolean)
|
bsw@414
|
6 local for_area = param.get("for_area", atom.boolean)
|
bsw@414
|
7
|
bsw@414
|
8
|
bsw@414
|
9 if for_state == "open" then
|
bsw@414
|
10 issues_selector:add_where("issue.closed ISNULL")
|
bsw@414
|
11 elseif for_state == "closed" then
|
bsw@414
|
12 issues_selector:add_where("issue.closed NOTNULL")
|
bsw@414
|
13 end
|
bsw/jbe@0
|
14
|
bsw@51
|
15 if app.session.member_id then
|
bsw@51
|
16 issues_selector
|
bsw@461
|
17 :left_join("interest", "_interest", { "_interest.issue_id = issue.id AND _interest.member_id = ?", member.id } )
|
bsw@51
|
18 :add_field("(_interest.member_id NOTNULL)", "is_interested")
|
bsw@285
|
19 issues_selector
|
bsw@461
|
20 :left_join("delegating_interest_snapshot", "_delegating_interest", { "_delegating_interest.issue_id = issue.id AND _delegating_interest.member_id = ? AND _delegating_interest.event = issue.latest_snapshot_event", member.id } )
|
bsw@285
|
21 :add_field("_delegating_interest.delegate_member_ids[1]", "is_interested_by_delegation_to_member_id")
|
bsw@285
|
22 :add_field("_delegating_interest.delegate_member_ids[array_upper(_delegating_interest.delegate_member_ids, 1)]", "is_interested_via_member_id")
|
bsw@285
|
23 :add_field("array_length(_delegating_interest.delegate_member_ids, 1)", "delegation_chain_length")
|
bsw@51
|
24 end
|
bsw@11
|
25
|
bsw/jbe@19
|
26 ui.add_partial_param_names{
|
bsw/jbe@19
|
27 "filter",
|
bsw/jbe@19
|
28 "filter_open",
|
bsw/jbe@19
|
29 "filter_voting",
|
bsw/jbe@19
|
30 "filter_interest",
|
bsw/jbe@19
|
31 "issue_list"
|
bsw/jbe@19
|
32 }
|
bsw/jbe@0
|
33
|
bsw@414
|
34 local filters = execute.load_chunk{module="issue", chunk="_filters.lua", params = {
|
bsw@459
|
35 member = member, for_member = for_member, state = for_state, for_unit = for_unit, for_area = for_area
|
bsw@414
|
36 }}
|
bsw/jbe@19
|
37
|
bsw/jbe@19
|
38 filters.content = function()
|
bsw@275
|
39 ui.paginate{
|
bsw@422
|
40 per_page = tonumber(param.get("per_page") or 25),
|
bsw/jbe@19
|
41 selector = issues_selector,
|
bsw/jbe@19
|
42 content = function()
|
bsw/jbe@19
|
43 local highlight_string = param.get("highlight_string", "string")
|
bsw/jbe@19
|
44 local issues = issues or issues_selector:exec()
|
bsw/jbe@19
|
45 -- issues:load(initiatives)
|
bsw@273
|
46 ui.container{ attr = { class = "issues" }, content = function()
|
bsw@273
|
47
|
bsw@273
|
48 for i, issue in ipairs(issues) do
|
bsw@273
|
49
|
bsw@273
|
50 local class = "issue"
|
bsw@289
|
51 if issue.is_interested then
|
bsw@273
|
52 class = class .. " interested"
|
bsw@289
|
53 elseif issue.is_interested_by_delegation_to_member_id then
|
bsw@289
|
54 class = class .. " interested_by_delegation"
|
bsw@273
|
55 end
|
bsw@273
|
56 ui.container{ attr = { class = class }, content = function()
|
bsw@273
|
57
|
bsw@273
|
58 ui.container{ attr = { class = "issue_info" }, content = function()
|
bsw@273
|
59
|
bsw@312
|
60 if issue.is_interested then
|
bsw@312
|
61 ui.tag{
|
bsw@312
|
62 tag = "div", attr = { class = "interest_by_delegation"},
|
bsw@312
|
63 content = function()
|
bsw@312
|
64 local text = "You are interested in this issue"
|
bsw@312
|
65 ui.image{ attr = { alt = text, title = text }, static = "icons/16/eye.png" }
|
bsw@312
|
66 end
|
bsw@312
|
67 }
|
bsw@312
|
68
|
bsw@312
|
69 elseif issue.is_interested_by_delegation_to_member_id then
|
bsw@285
|
70 ui.tag{
|
bsw@285
|
71 tag = "div", attr = { class = "interest_by_delegation"},
|
bsw@285
|
72 content = function()
|
bsw@285
|
73 local member = Member:by_id(issue.is_interested_by_delegation_to_member_id)
|
bsw@315
|
74 local text = _"delegated to"
|
bsw@315
|
75 ui.image{
|
bsw@315
|
76 attr = { class = "delegation_arrow", alt = text, title = text },
|
bsw@315
|
77 static = "delegation_arrow_24_horizontal.png"
|
bsw@315
|
78 }
|
bsw@285
|
79 execute.view{
|
bsw@285
|
80 module = "member_image",
|
bsw@285
|
81 view = "_show",
|
bsw@285
|
82 params = {
|
bsw@285
|
83 member = member,
|
bsw@285
|
84 image_type = "avatar",
|
bsw@285
|
85 show_dummy = true,
|
bsw@285
|
86 class = "micro_avatar",
|
bsw@285
|
87 popup_text = member.name
|
bsw@285
|
88 }
|
bsw@285
|
89 }
|
bsw@285
|
90 if issue.is_interested_by_delegation_to_member_id ~= issue.is_interested_via_member_id then
|
bsw@285
|
91 if issue.delegation_chain_length > 2 then
|
bsw@315
|
92 local text = _"delegated to"
|
bsw@315
|
93 ui.image{
|
bsw@315
|
94 attr = { class = "delegation_arrow", alt = text, title = text },
|
bsw@315
|
95 static = "delegation_arrow_24_horizontal.png"
|
bsw@315
|
96 }
|
bsw@315
|
97 ui.tag{ content = "..." }
|
bsw@285
|
98 end
|
bsw@315
|
99 local text = _"delegated to"
|
bsw@315
|
100 ui.image{
|
bsw@315
|
101 attr = { class = "delegation_arrow", alt = text, title = text },
|
bsw@315
|
102 static = "delegation_arrow_24_horizontal.png"
|
bsw@315
|
103 }
|
bsw@285
|
104 local member = Member:by_id(issue.is_interested_via_member_id)
|
bsw@285
|
105 execute.view{
|
bsw@285
|
106 module = "member_image",
|
bsw@285
|
107 view = "_show",
|
bsw@285
|
108 params = {
|
bsw@285
|
109 member = member,
|
bsw@285
|
110 image_type = "avatar",
|
bsw@285
|
111 show_dummy = true,
|
bsw@285
|
112 class = "micro_avatar",
|
bsw@285
|
113 popup_text = member.name
|
bsw@285
|
114 }
|
bsw@285
|
115 }
|
bsw@285
|
116 end
|
bsw@285
|
117 end
|
bsw@285
|
118 }
|
bsw@285
|
119 end
|
bsw@285
|
120
|
bsw@273
|
121 ui.tag{
|
bsw@273
|
122 tag = "div",
|
bsw@273
|
123 content = function()
|
bsw@273
|
124 ui.link{
|
bsw@273
|
125 attr = { class = "issue_id" },
|
bsw@273
|
126 text = _("Issue ##{id}", { id = tostring(issue.id) }),
|
bsw@273
|
127 module = "issue",
|
bsw@273
|
128 view = "show",
|
bsw@273
|
129 id = issue.id
|
bsw@273
|
130 }
|
bsw@273
|
131
|
bsw@280
|
132 slot.put(" · ")
|
bsw@471
|
133 ui.tag{ content = issue.policy.name }
|
bsw@471
|
134 slot.put(" · ")
|
bsw@280
|
135 ui.tag{ content = issue.area.name }
|
bsw@280
|
136 slot.put(" · ")
|
bsw@280
|
137 ui.tag{ content = issue.area.unit.name }
|
bsw@280
|
138
|
bsw@280
|
139 end
|
bsw/jbe@19
|
140 }
|
bsw@273
|
141 ui.tag{
|
bsw@286
|
142 attr = { class = "issue_policy_info" },
|
bsw@273
|
143 tag = "div",
|
bsw@273
|
144 content = function()
|
bsw@273
|
145
|
bsw@414
|
146 ui.tag{ attr = { class = "event_name" }, content = issue.state_name }
|
bsw@273
|
147
|
bsw@273
|
148 if issue.state_time_left then
|
bsw@273
|
149 slot.put(" · ")
|
bsw@414
|
150 if issue.state_time_left:sub(1,1) == "-" then
|
bsw@448
|
151 if issue.state == "new" then
|
bsw@448
|
152 ui.tag{ content = _("Discussion starts soon") }
|
bsw@448
|
153 elseif issue.state == "discussion" then
|
bsw@448
|
154 ui.tag{ content = _("Verification starts soon") }
|
bsw@448
|
155 elseif issue.state == "frozen" then
|
bsw@448
|
156 ui.tag{ content = _("Voting starts soon") }
|
bsw@448
|
157 elseif issue.state == "voting" then
|
bsw@448
|
158 ui.tag{ content = _("Counting starts soon") }
|
bsw@448
|
159 end
|
bsw@414
|
160 else
|
bsw@414
|
161 ui.tag{ content = _("#{time_left} left", { time_left = issue.state_time_left:gsub("days", _"days"):gsub("day", _"day") }) }
|
bsw@414
|
162 end
|
bsw@273
|
163 end
|
bsw@273
|
164
|
bsw@273
|
165 end
|
bsw@273
|
166 }
|
bsw@273
|
167
|
bsw@273
|
168
|
bsw@273
|
169 if issue.old_state then
|
bsw@273
|
170 ui.field.text{ value = format.time(issue.sort) }
|
bsw@273
|
171 ui.field.text{ value = Issue:get_state_name_for_state(issue.old_state) .. " > " .. Issue:get_state_name_for_state(issue.new_state) }
|
bsw/jbe@19
|
172 else
|
bsw/jbe@19
|
173 end
|
bsw@273
|
174 end }
|
bsw@273
|
175
|
bsw@273
|
176 ui.container{ attr = { class = "initiative_list" }, content = function()
|
bsw@273
|
177
|
bsw@273
|
178 local initiatives_selector = issue:get_reference_selector("initiatives")
|
bsw/jbe@19
|
179 local highlight_string = param.get("highlight_string")
|
bsw/jbe@19
|
180 if highlight_string then
|
bsw/jbe@19
|
181 initiatives_selector:add_field( {'"highlight"("initiative"."name", ?)', highlight_string }, "name_highlighted")
|
bsw/jbe@19
|
182 end
|
bsw/jbe@19
|
183 execute.view{
|
bsw/jbe@19
|
184 module = "initiative",
|
bsw/jbe@19
|
185 view = "_list",
|
bsw/jbe@19
|
186 params = {
|
bsw@273
|
187 issue = issue,
|
bsw/jbe@19
|
188 initiatives_selector = initiatives_selector,
|
bsw/jbe@19
|
189 highlight_string = highlight_string,
|
bsw@51
|
190 per_page = app.session.member_id and tonumber(app.session.member:get_setting_value("initiatives_preview_limit") or 3) or 3,
|
bsw/jbe@19
|
191 no_sort = true,
|
bsw@285
|
192 limit = app.session.member_id and tonumber(app.session.member:get_setting_value("initiatives_preview_limit") or 3) or 3,
|
bsw@285
|
193 for_member = for_member
|
bsw/jbe@19
|
194 }
|
bsw/jbe@19
|
195 }
|
bsw@273
|
196 end }
|
bsw@273
|
197 end }
|
bsw@273
|
198 end
|
bsw@273
|
199 end }
|
bsw/jbe@19
|
200 end
|
bsw/jbe@19
|
201 }
|
bsw/jbe@19
|
202 end
|
bsw/jbe@19
|
203
|
bsw@275
|
204 filters.opened = true
|
bsw/jbe@19
|
205 filters.selector = issues_selector
|
bsw/jbe@19
|
206
|
bsw/jbe@19
|
207 if param.get("no_filter", atom.boolean) then
|
bsw/jbe@19
|
208 filters.content()
|
bsw/jbe@19
|
209 else
|
bsw/jbe@19
|
210 ui.filters(filters)
|
bsw/jbe@19
|
211 end
|