bsw/jbe@4: bsw/jbe@4: local initiative = param.get("initiative", "table") bsw/jbe@0: local suggestions_selector = param.get("suggestions_selector", "table") bsw/jbe@19: local tab_id = param.get("tab_id") bsw/jbe@19: local show_name = param.get("show_name", atom.boolean) bsw/jbe@19: if show_name == nil then bsw/jbe@19: show_name = true bsw/jbe@19: end bsw/jbe@19: local show_filter = param.get("show_filter", atom.boolean) bsw/jbe@19: if show_filter == nil then bsw/jbe@19: show_filter = true bsw/jbe@19: end bsw/jbe@0: bsw/jbe@19: local partial = { bsw/jbe@19: routing = { bsw/jbe@19: default = { bsw/jbe@19: mode = "redirect", bsw/jbe@19: module = "initiative", bsw/jbe@19: view = "show_tab", bsw/jbe@19: params = { bsw/jbe@19: initiative_id = initiative.id, bsw/jbe@19: tab = "suggestions", bsw/jbe@19: tab_id = tab_id bsw/jbe@19: }, bsw/jbe@19: } bsw/jbe@19: } bsw/jbe@19: } bsw/jbe@19: bsw/jbe@19: local ui_filters = ui.filters bsw/jbe@19: if not show_filter then bsw/jbe@19: ui_filters = function(args) args.content() end bsw/jbe@19: end bsw/jbe@19: bsw/jbe@19: ui_filters{ bsw/jbe@0: selector = suggestions_selector, bsw/jbe@19: { bsw/jbe@4: { bsw/jbe@19: name = "plus_unfulfilled", bsw/jbe@19: label = _"requested", bsw/jbe@19: selector_modifier = function(selector) selector:add_order_by("plus2_unfulfilled_count + plus1_unfulfilled_count DESC, id") end bsw/jbe@4: }, bsw/jbe@4: { bsw/jbe@4: name = "plus2", bsw/jbe@4: label = _"must", bsw/jbe@19: selector_modifier = function(selector) selector:add_order_by("plus2_unfulfilled_count + plus2_fulfilled_count DESC, id") end bsw/jbe@4: }, bsw/jbe@4: { bsw/jbe@4: name = "plus", bsw/jbe@4: label = _"must/should", bsw/jbe@19: selector_modifier = function(selector) selector:add_order_by("plus2_unfulfilled_count + plus1_unfulfilled_count + plus2_fulfilled_count + plus1_fulfilled_count DESC, id") end bsw/jbe@4: }, bsw/jbe@4: { bsw/jbe@4: name = "minus", bsw/jbe@4: label = _"must/should not", bsw/jbe@19: selector_modifier = function(selector) selector:add_order_by("minus2_unfulfilled_count + minus1_unfulfilled_count + minus2_fulfilled_count + minus1_fulfilled_count DESC, id") end bsw/jbe@4: }, bsw/jbe@4: { bsw/jbe@4: name = "minus2", bsw/jbe@4: label = _"must not", bsw/jbe@19: selector_modifier = function(selector) selector:add_order_by("minus2_unfulfilled_count + minus2_fulfilled_count DESC, id") end bsw/jbe@19: } bsw/jbe@4: }, bsw/jbe@0: content = function() bsw/jbe@4: ui.paginate{ bsw/jbe@4: selector = suggestions_selector, bsw/jbe@4: content = function() bsw/jbe@4: ui.list{ bsw/jbe@4: attr = { style = "table-layout: fixed;" }, bsw/jbe@4: records = suggestions_selector:exec(), bsw/jbe@4: columns = { bsw/jbe@4: { bsw/jbe@19: label = show_name and _"Suggestion" or nil, bsw/jbe@4: content = function(record) bsw/jbe@19: if show_name then bsw/jbe@19: ui.link{ bsw/jbe@19: text = record.name, bsw/jbe@19: module = "suggestion", bsw/jbe@19: view = "show", bsw/jbe@19: id = record.id bsw/jbe@19: } bsw/jbe@19: end bsw/jbe@4: end bsw/jbe@4: }, bsw/jbe@4: { bsw@95: label = _"Collective opinion of supporters", bsw/jbe@4: label_attr = { style = "width: 101px;" }, bsw/jbe@4: content = function(record) bsw/jbe@4: if record.minus2_unfulfilled_count then bsw@95: local max_value = record.initiative.supporter_count bsw/jbe@4: ui.bargraph{ bsw/jbe@4: max_value = max_value, bsw@95: width = 100, bsw/jbe@4: bars = { bsw@95: { color = "#0a0", value = record.plus2_unfulfilled_count + record.plus2_fulfilled_count }, bsw@95: { color = "#8f8", value = record.plus1_unfulfilled_count + record.plus1_fulfilled_count }, bsw@95: { color = "#eee", value = max_value - record.minus2_unfulfilled_count - record.minus1_unfulfilled_count - record.minus2_fulfilled_count - record.minus1_fulfilled_count - record.plus1_unfulfilled_count - record.plus2_unfulfilled_count - record.plus1_fulfilled_count - record.plus2_fulfilled_count}, bsw/jbe@4: { color = "#f88", value = record.minus1_unfulfilled_count + record.minus1_fulfilled_count }, bsw/jbe@4: { color = "#a00", value = record.minus2_unfulfilled_count + record.minus2_fulfilled_count }, bsw/jbe@4: } bsw/jbe@4: } bsw/jbe@4: end bsw/jbe@4: end bsw/jbe@4: }, bsw/jbe@4: { bsw/jbe@4: label = _"My opinion", bsw@95: label_attr = { style = "width: 130px; font-style: italic;" }, bsw/jbe@4: content = function(record) bsw/jbe@4: local degree bsw@51: local opinion bsw@51: if app.session.member_id then bsw@51: opinion = Opinion:by_pk(app.session.member.id, record.id) bsw@51: end bsw/jbe@4: if opinion then bsw/jbe@4: degree = opinion.degree bsw@3: end bsw/jbe@5: ui.container{ bsw/jbe@5: attr = { class = "suggestion_my_opinion" }, bsw/jbe@5: content = function() bsw@51: if app.session.member_id then bsw@51: if initiative.issue.state == "voting" or initiative.issue.state == "closed" then bsw@95: if degree == -2 then bsw@95: ui.tag{ bsw@95: tag = "span", bsw@95: attr = { bsw@95: class = "action" .. (degree == -2 and " active_red2" or "") bsw@95: }, bsw@95: content = _"must not" bsw@95: } bsw@95: end bsw@95: if degree == -1 then bsw@95: ui.tag{ bsw@95: tag = "span", bsw@95: attr = { class = "action" .. (degree == -1 and " active_red1" or "") }, bsw@95: content = _"should not" bsw@95: } bsw@95: end bsw@95: if degree == nil then bsw@95: ui.tag{ bsw@95: tag = "span", bsw@95: attr = { class = "action" .. (degree == nil and " active" or "") }, bsw@95: content = _"neutral" bsw@95: } bsw@95: end bsw@95: if degree == 1 then bsw@95: ui.tag{ bsw@95: tag = "span", bsw@95: attr = { class = "action" .. (degree == 1 and " active_green1" or "") }, bsw@95: content = _"should" bsw@95: } bsw@95: end bsw@95: if degree == 2 then bsw@95: ui.tag{ bsw@95: tag = "span", bsw@95: attr = { class = "action" .. (degree == 2 and " active_green2" or "") }, bsw@95: content = _"must" bsw@95: } bsw@95: end bsw@51: else poelzi@142: -- we need to put initiative_id into the parameters to have a redirect target in case the suggestion is gone after the action poelzi@142: params = param.get_all_cgi() poelzi@142: params['initiative_id'] = initiative.id poelzi@142: bsw@51: ui.link{ bsw@95: attr = { class = "action" .. (degree == 2 and " active_green2" or "") }, bsw@95: text = _"must", bsw@51: module = "opinion", bsw@51: action = "update", poelzi@142: routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = params } }, bsw@51: params = { bsw@51: suggestion_id = record.id, bsw@95: degree = 2 bsw@51: }, bsw@51: partial = partial bsw@51: } bsw@51: slot.put(" ") bsw@51: ui.link{ bsw@51: attr = { class = "action" .. (degree == 1 and " active_green1" or "") }, bsw@51: text = _"should", bsw@51: module = "opinion", bsw@51: action = "update", poelzi@142: routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = params} }, bsw@51: params = { bsw@51: suggestion_id = record.id, bsw@51: degree = 1 bsw@51: }, bsw@51: partial = partial bsw@51: } bsw@51: slot.put(" ") bsw@51: ui.link{ bsw@95: attr = { class = "action" .. (degree == nil and " active" or "") }, bsw@95: text = _"neutral", bsw@51: module = "opinion", bsw@51: action = "update", poelzi@142: routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = params } }, bsw@51: params = { bsw@51: suggestion_id = record.id, bsw@95: delete = true bsw@95: }, bsw@95: partial = partial bsw@95: } bsw@95: slot.put(" ") bsw@95: ui.link{ bsw@95: attr = { class = "action" .. (degree == -1 and " active_red1" or "") }, bsw@95: text = _"should not", bsw@95: module = "opinion", bsw@95: action = "update", poelzi@142: routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = params } }, bsw@95: params = { bsw@95: suggestion_id = record.id, bsw@95: degree = -1 bsw@95: }, bsw@95: partial = partial bsw@95: } bsw@95: slot.put(" ") bsw@95: ui.link{ bsw@95: attr = { class = "action" .. (degree == -2 and " active_red2" or "") }, bsw@95: text = _"must not", bsw@95: module = "opinion", bsw@95: action = "update", poelzi@142: routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = params } }, bsw@95: params = { bsw@95: suggestion_id = record.id, bsw@95: degree = -2 bsw@51: }, bsw@51: partial = partial bsw@51: } bsw@51: end bsw/jbe@19: else bsw@51: ui.field.text{ value = _"[Registered members only]" } bsw/jbe@19: end bsw/jbe@5: end bsw/jbe@0: } bsw/jbe@0: end bsw/jbe@4: }, bsw/jbe@4: { bsw/jbe@4: label = _"Suggestion currently not implemented", bsw/jbe@4: label_attr = { style = "width: 101px;" }, bsw/jbe@4: content = function(record) bsw/jbe@4: if record.minus2_unfulfilled_count then bsw@95: local max_value = record.initiative.supporter_count bsw/jbe@4: ui.bargraph{ bsw/jbe@4: max_value = max_value, bsw@95: width = 100, bsw/jbe@4: bars = { bsw/jbe@4: { color = "#0a0", value = record.plus2_unfulfilled_count }, bsw/jbe@4: { color = "#8f8", value = record.plus1_unfulfilled_count }, bsw@95: { color = "#eee", value = max_value - record.minus2_unfulfilled_count - record.minus1_unfulfilled_count - record.plus1_unfulfilled_count - record.plus2_unfulfilled_count }, bsw@95: { color = "#f88", value = record.minus1_unfulfilled_count }, bsw@95: { color = "#a00", value = record.minus2_unfulfilled_count }, bsw/jbe@4: } bsw/jbe@4: } bsw/jbe@4: end bsw/jbe@4: end bsw/jbe@4: }, bsw/jbe@4: { bsw/jbe@4: label = _"Suggestion currently implemented", bsw/jbe@4: label_attr = { style = "width: 101px;" }, bsw/jbe@4: content = function(record) bsw/jbe@4: if record.minus2_fulfilled_count then bsw@95: local max_value = record.initiative.supporter_count bsw/jbe@4: ui.bargraph{ bsw/jbe@4: max_value = max_value, bsw@95: width = 100, bsw/jbe@4: bars = { bsw@95: { color = "#0a0", value = record.plus2_fulfilled_count }, bsw@95: { color = "#8f8", value = record.plus1_fulfilled_count }, bsw@95: { color = "#eee", value = max_value - record.minus2_fulfilled_count - record.minus1_fulfilled_count - record.plus1_fulfilled_count - record.plus2_fulfilled_count}, bsw/jbe@4: { color = "#f88", value = record.minus1_fulfilled_count }, bsw/jbe@4: { color = "#a00", value = record.minus2_fulfilled_count }, bsw/jbe@4: } bsw/jbe@4: } bsw/jbe@4: end bsw@3: end bsw/jbe@4: }, bsw/jbe@4: { bsw@95: label = app.session.member_id and _"I consider suggestion as" or nil, bsw@95: label_attr = { style = "width: 100px; font-style: italic;" }, bsw/jbe@4: content = function(record) bsw/jbe@4: local degree bsw@51: local opinion bsw@51: if app.session.member_id then bsw@51: opinion = Opinion:by_pk(app.session.member.id, record.id) bsw@51: end bsw/jbe@4: if opinion then bsw/jbe@4: degree = opinion.degree bsw/jbe@4: end bsw/jbe@4: if opinion then bsw@95: bsw@95: ui.link{ bsw@95: attr = { class = opinion.fulfilled and "action active" or "action" }, bsw@95: text = _"implemented", bsw@95: module = "opinion", bsw@95: action = "update", bsw@95: routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = param.get_all_cgi() } }, bsw@95: params = { bsw@95: suggestion_id = record.id, bsw@95: fulfilled = true bsw@95: }, bsw@95: partial = partial bsw@95: } bsw@95: slot.put("
") bsw@95: ui.link{ bsw@95: attr = { class = not opinion.fulfilled and "action active" or "action" }, bsw@95: text = _"not implemented", bsw@95: module = "opinion", bsw@95: action = "update", bsw@95: routing = { default = { mode = "redirect", module = request.get_module(), view = request.get_view(), id = param.get_id_cgi(), params = param.get_all_cgi() } }, bsw@95: params = { bsw@95: suggestion_id = record.id, bsw@95: fulfilled = false bsw@95: }, bsw@95: partial = partial bsw@95: } bsw@95: bsw/jbe@4: end bsw/jbe@4: end bsw/jbe@4: }, bsw/jbe@4: { bsw@95: label = app.session.member_id and _"So I'm" or nil, bsw/jbe@4: content = function(record) bsw@51: local opinion bsw@51: if app.session.member_id then bsw@51: opinion = Opinion:by_pk(app.session.member.id, record.id) bsw@51: end bsw/jbe@4: if opinion then bsw/jbe@4: if (opinion.fulfilled and opinion.degree > 0) or (not opinion.fulfilled and opinion.degree < 0) then bsw@95: local title = _"satisfied" bsw@95: ui.image{ attr = { alt = title, title = title }, static = "icons/emoticon_happy.png" } bsw@95: elseif opinion.degree == 1 or opinion.degree == -1 then bsw@95: local title = _"a bit unsatisfied" bsw@95: ui.image{ attr = { alt = title, title = title }, static = "icons/emoticon_unhappy.png" } bsw/jbe@4: else bsw@95: local title = _"more unsatisfied" bsw@95: ui.image{ attr = { alt = title, title = title }, static = "icons/emoticon_unhappy_red.png" } bsw/jbe@4: end bsw/jbe@4: end bsw/jbe@4: end bsw/jbe@4: }, bsw/jbe@4: } bsw/jbe@4: } bsw/jbe@4: end bsw/jbe@0: } bsw/jbe@0: end bsw/jbe@0: }