bsw/jbe@4: bsw/jbe@4: local initiative = param.get("initiative", "table") bsw/jbe@0: local suggestions_selector = param.get("suggestions_selector", "table") bsw@454: bsw@454: suggestions_selector:add_order_by("plus2_unfulfilled_count + plus1_unfulfilled_count DESC, id") bsw@454: bsw/jbe@19: local ui_filters = ui.filters bsw@454: if true or not show_filter then bsw/jbe@19: ui_filters = function(args) args.content() end bsw/jbe@19: end bsw/jbe@19: bsw@718: bsw@718: ui.container{ attr = { class = "initiative_head" }, bsw/jbe@0: content = function() bsw@718: ui.container{ attr = { class = "title" }, content = _"Suggestions" } bsw@718: ui.container{ attr = { class = "content" }, content = function() bsw@718: ui.paginate{ bsw@718: selector = suggestions_selector, bsw@718: content = function() bsw@718: local suggestions = suggestions_selector:exec() bsw@718: if #suggestions < 1 then bsw@718: if not initiative.issue.fully_frozen and not initiative.issue.closed then bsw@718: ui.tag{ content = _"No suggestions yet" } bsw@718: else bsw@718: ui.tag{ content = _"No suggestions" } bsw@718: end bsw@718: else bsw@718: ui.list{ bsw@718: attr = { style = "table-layout: fixed;" }, bsw@718: records = suggestions, bsw@718: columns = { bsw@718: { bsw@718: label_attr = { style = "width: 101px;" }, bsw@718: content = function(record) bsw@718: if record.minus2_unfulfilled_count then bsw@718: local max_value = record.initiative.supporter_count bsw@718: ui.bargraph{ bsw@718: max_value = max_value, bsw@718: width = 100, bsw@718: bars = { bsw@718: { color = "#0a0", value = record.plus2_unfulfilled_count + record.plus2_fulfilled_count }, bsw@718: { color = "#8f8", value = record.plus1_unfulfilled_count + record.plus1_fulfilled_count }, bsw@718: { 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@718: { color = "#f88", value = record.minus1_unfulfilled_count + record.minus1_fulfilled_count }, bsw@718: { color = "#a00", value = record.minus2_unfulfilled_count + record.minus2_fulfilled_count }, bsw@51: } bsw@718: } bsw/jbe@19: end bsw/jbe@5: end bsw@718: }, bsw@718: { bsw@718: content = function(record) bsw@718: ui.link{ bsw@718: text = record.name, bsw@718: module = "suggestion", bsw@718: view = "show", bsw@718: id = record.id bsw/jbe@4: } bsw@718: local degree bsw@718: local opinion bsw@718: if app.session.member_id then bsw@718: opinion = Opinion:by_pk(app.session.member.id, record.id) bsw@718: end bsw@718: if opinion then bsw@718: local degrees = { bsw@718: ["-2"] = _"must not", bsw@718: ["-1"] = _"should not", bsw@718: ["0"] = _"neutral", bsw@718: ["1"] = _"should", bsw@718: ["2"] = _"must" bsw@718: } bsw@718: slot.put(" · ") bsw@718: ui.tag{ content = degrees[tostring(opinion.degree)] } bsw@718: slot.put(" · ") bsw@718: if opinion.fulfilled then bsw@718: ui.tag{ content = _"implemented" } bsw@718: else bsw@718: ui.tag{ content = _"not implemented" } bsw@718: end bsw@718: end bsw/jbe@4: end bsw@718: }, bsw@718: } bsw@718: } bsw@718: end bsw@718: end bsw@718: } bsw@718: end } bsw@720: if app.session.member_id bsw@720: and not initiative.issue.half_frozen bsw@720: and not initiative.issue.closed bsw@720: and not initiative.revoked bsw@720: and app.session.member:has_voting_right_for_unit_id(initiative.issue.area.unit_id) bsw@720: then bsw@718: ui.container{ attr = { class = "content" }, content = function() bsw@718: ui.link{ bsw@718: module = "suggestion", view = "new", params = { initiative_id = initiative.id }, bsw@718: text = _"New suggestion" bsw/jbe@4: } bsw@718: end } bsw@718: end bsw/jbe@0: end bsw/jbe@0: }