liquid_feedback_frontend

annotate app/main/issue/_list.lua @ 1859:02c34183b6df

Fixed wrong filename in INSTALL file
author bsw
date Tue Nov 28 18:54:51 2023 +0100 (17 months ago)
parents cb2fc0c24e35
children
rev   line source
bsw/jbe@1309 1 local for_member = param.get ( "for_member", "table" )
bsw/jbe@1309 2 local for_unit = param.get ( "for_unit", "table" )
bsw/jbe@1309 3 local for_area = param.get ( "for_area", "table" )
bsw/jbe@1309 4 local for_issue = param.get ( "for_issue", "table" )
bsw/jbe@1309 5 local for_initiative = param.get ( "for_initiative", "table" )
bsw/jbe@1309 6 local for_sidebar = param.get("for_sidebar", atom.boolean)
bsw/jbe@1309 7 local no_filter = param.get ( "no_filter", atom.boolean )
bsw/jbe@1309 8 local search = param.get ( "search" )
bsw/jbe@1309 9
bsw/jbe@1309 10 local limit = 25
bsw/jbe@1309 11
bsw/jbe@1309 12 local mode = request.get_param{ name = "mode" } or "issue"
bsw/jbe@1309 13
bsw/jbe@1309 14 if for_initiative or for_issue or for_member then
bsw/jbe@1309 15 mode = "timeline"
bsw/jbe@1309 16 end
bsw/jbe@1309 17
bsw@1696 18 if app.single_unit_id then
bsw@1718 19 if request.get_param{ name = "unit" } then
bsw@1718 20 for_unit = Unit:by_id(request.get_param{ name = "unit" })
bsw@1718 21 else
bsw@1718 22 for_unit = Unit:by_id(app.single_unit_id)
bsw@1718 23 end
bsw@1513 24 end
bsw@1513 25
bsw/jbe@1309 26 local selector
bsw/jbe@1309 27
bsw/jbe@1309 28 if search then
bsw/jbe@1309 29
bsw/jbe@1309 30 selector = Issue:get_search_selector(search)
bsw/jbe@1309 31
bsw/jbe@1309 32
bsw/jbe@1309 33 elseif mode == "timeline" then
bsw/jbe@1309 34
bsw/jbe@1309 35 local event_max_id = request.get_param_strings()["event_max_id"]
bsw/jbe@1309 36
bsw/jbe@1309 37 selector = Event:new_selector()
bsw/jbe@1309 38 :add_order_by("event.id DESC")
bsw/jbe@1309 39 :join("issue", nil, "issue.id = event.issue_id")
bsw/jbe@1309 40 :add_field("now() - event.occurrence", "time_ago")
bsw/jbe@1309 41 :limit(limit + 1)
bsw/jbe@1309 42
bsw/jbe@1309 43 if event_max_id then
bsw/jbe@1309 44 selector:add_where{ "event.id < ?", event_max_id }
bsw/jbe@1309 45 end
bsw/jbe@1309 46
bsw/jbe@1309 47 if for_member then
bsw/jbe@1309 48 selector:add_where{ "event.member_id = ?", for_member.id }
bsw/jbe@1309 49 end
bsw/jbe@1309 50
bsw/jbe@1309 51 if for_initiative then
bsw/jbe@1309 52 selector:add_where{ "event.initiative_id = ?", for_initiative.id }
bsw/jbe@1309 53 end
bsw/jbe@1309 54
bsw/jbe@1309 55
bsw/jbe@1309 56 elseif mode == "issue" then
bsw/jbe@1309 57
bsw/jbe@1309 58 selector = Issue:new_selector()
bsw/jbe@1309 59
bsw/jbe@1309 60 end
bsw/jbe@1309 61
bsw/jbe@1309 62 if for_unit then
bsw/jbe@1309 63 selector:join("area", nil, "area.id = issue.area_id")
bsw/jbe@1309 64 selector:add_where{ "area.unit_id = ?", for_unit.id }
bsw/jbe@1309 65 elseif for_area then
bsw/jbe@1309 66 selector:add_where{ "issue.area_id = ?", for_area.id }
bsw/jbe@1309 67 elseif for_issue then
bsw/jbe@1309 68 selector:add_where{ "issue.id = ?", for_issue.id }
bsw/jbe@1309 69 end
bsw/jbe@1309 70
bsw/jbe@1309 71 if not search and app.session.member_id then
bsw/jbe@1309 72 selector
bsw/jbe@1309 73 :left_join("interest", "_interest", {
bsw/jbe@1309 74 "_interest.issue_id = issue.id AND _interest.member_id = ?", app.session.member.id
bsw/jbe@1309 75 } )
bsw/jbe@1309 76 :add_field("(_interest.member_id NOTNULL)", "is_interested")
bsw/jbe@1309 77 :left_join("delegating_interest_snapshot", "_delegating_interest", { [[
bsw/jbe@1309 78 _delegating_interest.issue_id = issue.id AND
bsw/jbe@1309 79 _delegating_interest.member_id = ? AND
bsw/jbe@1309 80 _delegating_interest.snapshot_id = issue.latest_snapshot_id
bsw/jbe@1309 81 ]], app.session.member.id } )
bsw/jbe@1309 82 :add_field("_delegating_interest.delegate_member_ids[1]", "is_interested_by_delegation_to_member_id")
bsw/jbe@1309 83 :add_field("_delegating_interest.delegate_member_ids[array_upper(_delegating_interest.delegate_member_ids, 1)]", "is_interested_via_member_id")
bsw/jbe@1309 84 :add_field("array_length(_delegating_interest.delegate_member_ids, 1)", "delegation_chain_length")
bsw/jbe@1309 85 end
bsw/jbe@1309 86
bsw/jbe@1309 87 local function doit()
bsw/jbe@1309 88
bsw/jbe@1309 89 local last_event_id
bsw/jbe@1309 90
bsw/jbe@1309 91 local items = selector:exec()
bsw/jbe@1309 92
bsw/jbe@1309 93 local row_class = "sectionRow"
bsw/jbe@1309 94 if for_sidebar then
bsw/jbe@1309 95 row_class = "sidebarRow"
bsw/jbe@1309 96 end
bsw/jbe@1309 97
bsw/jbe@1309 98 if mode == "timeline" then
bsw/jbe@1309 99 local issues = items:load ( "issue" )
bsw/jbe@1309 100 local initiative = items:load ( "initiative" )
bsw/jbe@1309 101 items:load ( "suggestion" )
bsw/jbe@1309 102 items:load ( "member" )
bsw/jbe@1309 103 issues:load_everything_for_member_id ( app.session.member_id )
bsw/jbe@1309 104 initiative:load_everything_for_member_id ( app.session.member_id )
bsw/jbe@1309 105 elseif mode == "issue" then
bsw/jbe@1309 106 items:load_everything_for_member_id ( app.session.member_id )
bsw/jbe@1309 107 end
bsw/jbe@1309 108
bsw/jbe@1309 109 local last_event_date
bsw/jbe@1309 110 for i, item in ipairs(items) do
bsw/jbe@1309 111 local event
bsw/jbe@1309 112 local issue
bsw/jbe@1309 113 if mode == "timeline" then
bsw/jbe@1309 114 event = item
bsw/jbe@1309 115 issue = item.issue
bsw/jbe@1309 116 elseif mode == "issue" then
bsw/jbe@1309 117 event = {}
bsw/jbe@1309 118 issue = item
bsw/jbe@1309 119 end
bsw/jbe@1309 120
bsw/jbe@1309 121 last_event_id = event.id
bsw/jbe@1309 122
bsw/jbe@1309 123 local class = "mdl-card mdl-shadow--2dp mdl-card__fullwidth event " .. row_class
bsw/jbe@1309 124 if event.suggestion_id then
bsw/jbe@1309 125 class = class .. " suggestion"
bsw/jbe@1309 126 end
bsw/jbe@1309 127
bsw@1603 128 ui.container{ attr = { class = class, id = "issue_" .. issue.id }, content = function()
bsw/jbe@1309 129 local event_name
bsw/jbe@1309 130 local event_icon
bsw/jbe@1309 131 local negative_event = false
bsw/jbe@1309 132
bsw/jbe@1309 133 local days_ago_text
bsw/jbe@1309 134
bsw/jbe@1309 135 if mode == "timeline" then
bsw/jbe@1309 136 event_name = event.event_name
bsw/jbe@1309 137 if event.event == "issue_state_changed" then
bsw/jbe@1309 138 if event.state == "discussion" then
bsw/jbe@1309 139 event_name = _"Discussion started"
bsw/jbe@1309 140 elseif event.state == "verification" then
bsw/jbe@1309 141 event_name = _"Verification started"
bsw/jbe@1309 142 elseif event.state == "voting" then
bsw/jbe@1309 143 event_name = _"Voting started"
bsw/jbe@1309 144 elseif event.state == "finished_with_winner" then
bsw/jbe@1309 145 event_name = event.state_name
bsw/jbe@1309 146 elseif event.state == "finished_without_winner" then
bsw/jbe@1309 147 event_name = event.state_name
bsw/jbe@1309 148 negative_event = true
bsw/jbe@1309 149 else
bsw/jbe@1309 150 event_name = event.state_name
bsw/jbe@1309 151 negative_event = true
bsw/jbe@1309 152 end
bsw/jbe@1309 153 elseif event.event == "initiative_revoked" then
bsw/jbe@1309 154 negative_event = true
bsw/jbe@1309 155 end
bsw/jbe@1309 156
bsw/jbe@1309 157 if event.time_ago == 0 then
bsw/jbe@1309 158 days_ago_text = _("today at #{time}", { time = format.time(event.occurrence) })
bsw/jbe@1309 159 elseif event.time_ago == 1 then
bsw/jbe@1309 160 days_ago_text = _("yesterday at #{time}", { time = format.time(event.occurrence) })
bsw/jbe@1309 161 else
bsw/jbe@1309 162 days_ago_text = _("#{interval} ago", { interval = format.interval_text ( event.time_ago ) } )
bsw/jbe@1309 163 end
bsw/jbe@1309 164
bsw/jbe@1309 165 elseif mode == "issue" then
bsw/jbe@1309 166 local event_icons_map = {
bsw/jbe@1309 167 admission = "bubble_chart",
bsw/jbe@1309 168 discussion = "question_answer",
bsw/jbe@1309 169 verification = "find_in_page",
bsw/jbe@1309 170 voting = "mail",
bsw@1650 171 finished_with_winner = "emoji_events",
bsw@1650 172 finished_without_winner = "do_not_disturb",
bsw@1653 173 canceled = "do_not_disturb"
bsw/jbe@1309 174 }
bsw/jbe@1309 175 event_icon = event_icons_map[issue.state] or event_icons_map["canceled"]
bsw/jbe@1309 176 event_name = issue.state_name
bsw/jbe@1309 177 if issue.state_time_left:sub(1,1) ~= "-" then
bsw/jbe@1309 178 days_ago_text = _( "#{interval_text} left", {
bsw/jbe@1309 179 interval_text = format.interval_text ( issue.state_time_left )
bsw/jbe@1309 180 })
bsw/jbe@1309 181 elseif issue.closed then
bsw/jbe@1309 182 days_ago_text = _( "#{interval_text} ago", {
bsw/jbe@1309 183 interval_text = format.interval_text ( issue.closed_ago )
bsw/jbe@1309 184 })
bsw/jbe@1309 185 else
bsw/jbe@1309 186 days_ago_text = _"phase ends soon"
bsw/jbe@1309 187 end
bsw/jbe@1309 188 if issue.closed and not issue.fully_frozen then
bsw/jbe@1309 189 negative_event = true
bsw/jbe@1309 190 end
bsw/jbe@1309 191 if issue.state == "finished_without_winner"
bsw/jbe@1309 192 or issue.state == "canceled_no_initiative_admitted"
bsw/jbe@1309 193 or issue.state == "canceled_by_admin"
bsw/jbe@1309 194 then
bsw/jbe@1309 195 negative_event = true
bsw/jbe@1309 196 end
bsw/jbe@1309 197 end
bsw/jbe@1309 198
bsw/jbe@1309 199 local class= "event_info"
bsw/jbe@1309 200
bsw/jbe@1309 201 if negative_event then
bsw/jbe@1309 202 class = class .. " negative"
bsw/jbe@1309 203 end
bsw/jbe@1309 204
bsw/jbe@1309 205 if not for_issue and not for_initiative then
bsw@1503 206 ui.container{ attr = { class = "mdl-card__title mdl-card--has-fab mdl-card--border card-issue" }, content = function()
bsw@1489 207 ui.container{ attr = { class = "contextlinks" }, content = function()
bsw@1696 208 if not (app.single_unit_id and config.single_area_id) then
bsw@1696 209 if not app.single_unit_id then
bsw@1650 210 ui.icon("group")
bsw@1650 211 slot.put(" ")
bsw@1489 212 ui.link{
bsw@1489 213 module = "index", view = "index", params = { unit = issue.area.unit_id },
bsw@1650 214 attr = { class = "unit" }, content = issue.area.unit.name }
bsw@1489 215 end
bsw@1489 216 if not config.single_area_id then
bsw@1696 217 if not app.single_unit_id then
bsw@1650 218 slot.put(" &nbsp;&nbsp;&nbsp; ")
bsw@1490 219 end
bsw@1650 220 ui.icon("category")
bsw@1650 221 slot.put(" ")
bsw@1489 222 ui.link{
bsw@1489 223 module = "index", view = "index", params = { unit = issue.area.unit_id, area = issue.area_id },
bsw@1489 224 attr = { class = "area" }, content = issue.area.name
bsw@1489 225 }
bsw@1489 226 end
bsw/jbe@1309 227 end
bsw@1650 228 slot.put(" &nbsp;&nbsp;&nbsp; ")
bsw@1650 229 ui.icon("gavel")
bsw@1650 230 slot.put(" ")
bsw/jbe@1309 231 ui.link{
bsw/jbe@1309 232 module = "issue", view = "show", id = issue.id,
bsw@1489 233 attr = { class = "issue" }, content = issue.name
bsw@1489 234 }
bsw@1503 235 -- end }
bsw@1503 236 -- ui.container{ attr = { class = "mdl-card__subtitle-text .mdl-cell--hide-phone" }, content = function()
bsw@1503 237 ui.container{ attr = { class = class, style = "float: right; color: #fff;" }, content = function ()
bsw/jbe@1309 238 if event_icon then
bsw@1489 239 ui.tag{ tag = "i", attr = { class = "material-icons", ["aria-hidden"] = "true" }, content = event_icon }
bsw/jbe@1309 240 end
bsw/jbe@1309 241 slot.put(" ")
bsw/jbe@1309 242 ui.tag { content = event_name }
bsw/jbe@1309 243 slot.put(" ")
bsw/jbe@1309 244 ui.tag{ content = "(" .. days_ago_text .. ")" }
bsw/jbe@1309 245 end }
bsw/jbe@1309 246 end }
bsw/jbe@1309 247 if app.session.member and issue.fully_frozen and not issue.closed and not issue.member_info.direct_voted and app.session.member:has_voting_right_for_unit_id(issue.area.unit_id) then
bsw/jbe@1309 248 ui.link {
bsw/jbe@1309 249 attr = { class = "mdl-button mdl-js-button mdl-button--fab mdl-button--colored" ,
bsw/jbe@1309 250 style = "position: absolute; right: 20px; bottom: -27px;"
bsw/jbe@1309 251 },
bsw/jbe@1309 252 module = "vote", view = "list",
bsw/jbe@1309 253 params = { issue_id = issue.id },
bsw/jbe@1309 254 content = function()
bsw/jbe@1309 255 ui.tag{ tag = "i", attr = { class = "material-icons" }, content = config.voting_icon or "mail_outline" }
bsw/jbe@1309 256 end
bsw/jbe@1309 257 }
bsw/jbe@1309 258 end
bsw/jbe@1309 259 end }
bsw/jbe@1309 260 end
bsw/jbe@1309 261
bsw/jbe@1309 262 if event.suggestion_id then
bsw/jbe@1309 263 ui.container{ attr = { class = "suggestion" }, content = function()
bsw/jbe@1309 264 ui.link{
bsw/jbe@1309 265 text = format.string(event.suggestion.name, {
bsw/jbe@1309 266 truncate_at = 160, truncate_suffix = true
bsw/jbe@1309 267 }),
bsw/jbe@1309 268 module = "initiative", view = "show", id = event.initiative.id,
bsw/jbe@1309 269 params = { suggestion_id = event.suggestion_id },
bsw/jbe@1309 270 anchor = "s" .. event.suggestion_id
bsw/jbe@1309 271 }
bsw/jbe@1309 272 end }
bsw/jbe@1309 273 end
bsw/jbe@1309 274
bsw/jbe@1309 275 if not for_initiative and (not for_issue or event.initiative_id) then
bsw/jbe@1309 276
bsw/jbe@1309 277 ui.container{ attr = { class = "initiative_list" }, content = function()
bsw/jbe@1309 278 if event.initiative_id then
bsw/jbe@1309 279 local initiative = event.initiative
bsw/jbe@1309 280
bsw/jbe@1309 281 execute.view{ module = "initiative", view = "_list", params = {
bsw/jbe@1309 282 issue = issue,
bsw/jbe@1309 283 initiative = initiative,
bsw/jbe@1309 284 for_event = mode == "timeline" and not (event.state == issue.state)
bsw/jbe@1309 285
bsw/jbe@1309 286 } }
bsw/jbe@1309 287 else
bsw/jbe@1309 288 local initiatives = issue.initiatives
bsw/jbe@1309 289 execute.view{ module = "initiative", view = "_list", params = {
bsw/jbe@1309 290 issue = issue,
bsw/jbe@1309 291 initiatives = initiatives,
bsw/jbe@1309 292 for_event = mode == "timeline" and not (event.state == issue.state)
bsw/jbe@1309 293 } }
bsw/jbe@1309 294 end
bsw/jbe@1309 295 end }
bsw/jbe@1309 296 end
bsw@1587 297 if
bsw@1587 298 app.session.member_id and (
bsw@1587 299 (not issue.fully_frozen and app.session.member:has_initiative_right_for_unit_id(issue.area.unit_id))
bsw@1590 300 or (issue.fully_frozen and app.session.member:has_voting_right_for_unit_id(issue.area.unit_id))
bsw@1587 301 )
bsw@1587 302 then
bsw/jbe@1309 303 ui.container{ attr = { class = "mdl-card__actions mdl-card--border" }, content = function()
bsw/jbe@1309 304 execute.view{
bsw/jbe@1309 305 module = "delegation", view = "_info", params = {
bsw/jbe@1309 306 issue = issue, member = for_member
bsw/jbe@1309 307 }
bsw/jbe@1309 308 }
bsw/jbe@1309 309 end }
bsw/jbe@1309 310 end
bsw/jbe@1309 311 end }
bsw/jbe@1309 312
bsw/jbe@1309 313 end
bsw/jbe@1309 314
bsw/jbe@1309 315 if mode == "timeline" then
bsw/jbe@1309 316 if for_sidebar then
bsw/jbe@1309 317 ui.container { attr = { class = row_class }, content = function ()
bsw/jbe@1309 318 ui.link{
bsw/jbe@1309 319 attr = { class = "moreLink" },
bsw/jbe@1309 320 text = _"Show full history",
bsw/jbe@1309 321 module = "initiative", view = "history", id = for_initiative.id
bsw/jbe@1309 322 }
bsw/jbe@1309 323 end }
bsw/jbe@1309 324 elseif #items > limit then
bsw/jbe@1309 325 ui.container { attr = { class = row_class }, content = function ()
bsw/jbe@1309 326 local params = request.get_param_strings()
bsw/jbe@1309 327 ui.link{
bsw/jbe@1309 328 attr = { class = "moreLink" },
bsw/jbe@1309 329 text = _"Show older events",
bsw/jbe@1309 330 module = request.get_module(),
bsw/jbe@1309 331 view = request.get_view(),
bsw/jbe@1309 332 id = for_unit and for_unit.id or for_area and for_area.id or for_issue and for_issue.id or for_member and for_member.id,
bsw/jbe@1309 333 params = {
bsw/jbe@1309 334 mode = "timeline",
bsw/jbe@1309 335 event_max_id = last_event_id,
bsw/jbe@1309 336 tab = params["tab"],
bsw/jbe@1309 337 phase = params["phase"],
bsw/jbe@1309 338 closed = params["closed"]
bsw/jbe@1309 339 }
bsw/jbe@1309 340 }
bsw/jbe@1309 341 end }
bsw/jbe@1309 342 elseif #items < 1 then
bsw/jbe@1309 343 ui.container { attr = { class = row_class }, content = _"No more events available" }
bsw/jbe@1309 344 end
bsw/jbe@1309 345 end
bsw/jbe@1309 346
bsw/jbe@1309 347 if #items < 1 then
bsw/jbe@1309 348 ui.section( function()
bsw/jbe@1309 349 ui.sectionRow( function()
bsw/jbe@1309 350 ui.container{ content = _"No results for this selection" }
bsw/jbe@1309 351 end )
bsw/jbe@1309 352 end )
bsw/jbe@1309 353 end
bsw/jbe@1309 354
bsw/jbe@1309 355
bsw/jbe@1309 356 end
bsw/jbe@1309 357
bsw/jbe@1309 358
bsw/jbe@1309 359 local filters = {}
bsw/jbe@1309 360
bsw/jbe@1309 361 if not for_initiative and not for_issue and not no_filter then
bsw/jbe@1309 362
bsw/jbe@1309 363 filters = execute.chunk{
bsw/jbe@1309 364 module = "issue", chunk = "_filters", params = {
bsw/jbe@1309 365 for_events = mode == "timeline" and true or false,
bsw/jbe@1309 366 member = app.session.member,
bsw/jbe@1309 367 for_member = for_member,
bsw/jbe@1309 368 state = for_state,
bsw/jbe@1309 369 for_unit = for_unit and true or false,
bsw/jbe@1309 370 for_area = for_area and true or false
bsw/jbe@1309 371 }}
bsw/jbe@1309 372 end
bsw/jbe@1309 373
bsw/jbe@1309 374 filters.opened = true
bsw/jbe@1309 375 filters.selector = selector
bsw/jbe@1309 376
bsw/jbe@1309 377
bsw/jbe@1309 378 local function dotabs()
bsw/jbe@1309 379 slot.select("filter", function()
bsw/jbe@1309 380 ui.container{ attr = { class = "mdl-tabs mdl-js-tabs mdl-js-ripple-effect float-left" }, content = function()
bsw/jbe@1309 381 ui.container{ attr = { class = "mdl-tabs__tab-bar" }, content = function()
bsw/jbe@1309 382 local mode = request.get_param{ name = "mode" }
bsw/jbe@1309 383 local css_active = (not mode or mode == "issue") and " is-active" or ""
bsw/jbe@1309 384 ui.link{ module = request.get_module(), view = request.get_view(), id = request.get_id_string(), content = "Issues", attr = { class = "mdl-tabs__tab" .. css_active } }
bsw/jbe@1309 385 local css_active = mode and " is-active" or " "
bsw/jbe@1309 386 ui.link{ module = request.get_module(), view = request.get_view(), id = request.get_id_string(), params = { mode = "timeline" }, content = "Timeline", attr = { class = "mdl-tabs__tab" .. css_active } }
bsw/jbe@1309 387 ui.link{ module = "member", view = "list", content = "Member", attr = { class = "mdl-tabs__tab" } }
bsw/jbe@1309 388 end }
bsw/jbe@1309 389 end }
bsw/jbe@1309 390 end)
bsw/jbe@1309 391 end
bsw/jbe@1309 392
bsw/jbe@1309 393
bsw/jbe@1309 394 if mode == "timeline" then
bsw/jbe@1309 395 --dotabs()
bsw/jbe@1309 396 filters.content = function()
bsw/jbe@1309 397 doit()
bsw/jbe@1309 398 end
bsw/jbe@1309 399 else
bsw/jbe@1309 400 -- dotabs()
bsw/jbe@1309 401 filters.content = function()
bsw/jbe@1309 402 if config.voting_only then
bsw/jbe@1309 403 local admission_order_field = "filter_issue_order.order_in_unit"
bsw/jbe@1309 404 if for_area then
bsw/jbe@1309 405 admission_order_field = "filter_issue_order.order_in_area"
bsw/jbe@1309 406 end
bsw/jbe@1309 407 selector:left_join ( "issue_order_in_admission_state", "filter_issue_order", "filter_issue_order.id = issue.id" )
bsw/jbe@1309 408 selector:add_order_by ( "issue.closed DESC NULLS FIRST" )
bsw/jbe@1309 409 selector:add_order_by ( "issue.accepted ISNULL" )
bsw/jbe@1309 410 selector:add_order_by ( "CASE WHEN issue.accepted ISNULL THEN NULL ELSE justify_interval(coalesce(issue.fully_frozen + issue.voting_time, issue.half_frozen + issue.verification_time, issue.accepted + issue.discussion_time, issue.created + issue.max_admission_time) - now()) END" )
bsw/jbe@1309 411 selector:add_order_by ( "CASE WHEN issue.accepted ISNULL THEN " .. admission_order_field .. " ELSE NULL END" )
bsw/jbe@1309 412 selector:add_order_by ( "id" )
bsw/jbe@1309 413 end
bsw@1493 414 if not search then
bsw@1602 415 -- execute.view{ module = "index", view = "_head" }
bsw@1493 416 end
bsw/jbe@1309 417 ui.paginate{
bsw/jbe@1309 418 selector = selector,
bsw/jbe@1309 419 per_page = 25,
bsw@1758 420 link_attr = { class = "mdl-button mdl-js-button mdl-button--raised" },
bsw@1760 421 active_link_attr = { class = "mdl-button mdl-js-button mdl-button--raised mdl-button--colored" },
bsw@1757 422 position = "after",
bsw/jbe@1309 423 content = doit
bsw/jbe@1309 424 }
bsw/jbe@1309 425 end
bsw/jbe@1309 426 end
bsw/jbe@1309 427
bsw/jbe@1309 428 filters.class = "mdl-special-card mdl-card__fullwidth mdl-shadow--2dp"
bsw/jbe@1309 429
bsw@1489 430 filters.legend = _"Filter issues:"
bsw@1489 431
bsw/jbe@1309 432 ui.filters(filters)
bsw/jbe@1309 433
bsw/jbe@1309 434
bsw/jbe@1309 435

Impressum / About Us