# HG changeset patch # User bsw # Date 1632814174 -7200 # Node ID c33916811ca760fe20aec02ead2c28f68fb6c299 # Parent 0b43b2485930c76637b6f8ed8ec53bf8063586f6 Added new suggestions button on top of suggestion list diff -r 0b43b2485930 -r c33916811ca7 app/main/initiative/_suggestions.lua --- a/app/main/initiative/_suggestions.lua Tue Sep 28 09:16:01 2021 +0200 +++ b/app/main/initiative/_suggestions.lua Tue Sep 28 09:29:34 2021 +0200 @@ -133,214 +133,226 @@ attr = { class = "section suggestions" }, content = function () - if # ( initiative.suggestions ) > 0 then - - ui.heading { - level = 1, - content = _("Suggestions for improvement (#{count})", { count = # ( initiative.suggestions ) } ) + ui.heading { + level = 1, + content = _("Suggestions for improvement (#{count})", { count = # ( initiative.suggestions ) } ) + } + + ui.container { content = _"written and rated by the supportes of this initiative to improve the proposal and its reasons" } + + if initiative.member_info.supported and not active_trustee_id then + ui.link { + attr = { + style = "margin-top: 1ex;", + class = "mdl-button mdl-js-button mdl-button--raised mdl-button--colored", + }, + module = "suggestion", view = "new", params = { + initiative_id = initiative.id + }, + content = _"write a new suggestion" } - ui.container { content = _"written and rated by the supportes of this initiative to improve the proposal and its reasons" } - slot.put("
") - - for i, suggestion in ipairs(initiative.suggestions) do - - local opinion = Opinion:by_pk(app.session.member_id, suggestion.id) + end + + slot.put("

") + + for i, suggestion in ipairs(initiative.suggestions) do + + local opinion = Opinion:by_pk(app.session.member_id, suggestion.id) - local class = "mdl-card mdl-card__fullwidth mdl-shadow--2dp not-folded" - if suggestion.id == param.get("suggestion_id", atom.number) then - class = class .. " highlighted" - end - if member and not initiative.issue.fully_frozen and not initiative.issue.closed and initiative.member_info.supported then - class = class .. " rateable" - end + local class = "mdl-card mdl-card__fullwidth mdl-shadow--2dp not-folded" + if suggestion.id == param.get("suggestion_id", atom.number) then + class = class .. " highlighted" + end + if member and not initiative.issue.fully_frozen and not initiative.issue.closed and initiative.member_info.supported then + class = class .. " rateable" + end + + ui.link { attr = { name = "s" .. suggestion.id }, text = "" } + ui.tag { tag = "div", attr = { class = class, id = "s" .. suggestion.id }, content = function () + ui.tag{ attr = { class = "mdl-card__title mdl-card--border" }, content = function() + ui.heading { level = 2, + attr = { class = "mdl-card__title-text" }, + content = function() + ui.tag{ content = format.string(suggestion.name, { + truncate_at = 160, truncate_suffix = true }) + } + end + } + end } + + + + ui.container{ attr = { class = "suggestion-content" }, content = function() - ui.link { attr = { name = "s" .. suggestion.id }, text = "" } - ui.tag { tag = "div", attr = { class = class, id = "s" .. suggestion.id }, content = function () - ui.tag{ attr = { class = "mdl-card__title mdl-card--border" }, content = function() - ui.heading { level = 2, - attr = { class = "mdl-card__title-text" }, - content = function() - ui.tag{ content = format.string(suggestion.name, { - truncate_at = 160, truncate_suffix = true }) + ui.container { + attr = { class = "mdl-card__content mdl-card--border suggestionInfo" }, + content = function () + + if app.session:has_access("authors_pseudonymous") then + ui.tag{ content = _"by" } + slot.put(" ") + ui.link{ + module = "member", view = "show", id = suggestion.author_id, + content = suggestion.author.name } end - } - end } + + execute.view{ + module = "suggestion", view = "_collective_rating", params = { + suggestion = suggestion + } + } - - - ui.container{ attr = { class = "suggestion-content" }, content = function() - - ui.container { - attr = { class = "mdl-card__content mdl-card--border suggestionInfo" }, - content = function () + end + } - if app.session:has_access("authors_pseudonymous") then - ui.tag{ content = _"by" } - slot.put(" ") - ui.link{ - module = "member", view = "show", id = suggestion.author_id, - content = suggestion.author.name - } - end - - execute.view{ - module = "suggestion", view = "_collective_rating", params = { - suggestion = suggestion - } + ui.container { + attr = { class = "mdl-card__content suggestion-text draft" }, + content = function () + slot.put ( suggestion:get_content( "html" ) ) + + ui.container { attr = { class = "floatx-right" }, content = function() + + ui.link { + attr = { + class = "mdl-button mdl-js-button mdl-button--icon suggestion-more", + onclick = "document.querySelector('#s" .. suggestion.id .. "').classList.remove('folded');document.querySelector('#s" .. suggestion.id .. "').classList.add('unfolded'); return false;" + }, + content = function() + ui.tag{ tag = "i", attr = { class = "material-icons" }, content = "expand_more" } + end } - - end - } - ui.container { - attr = { class = "mdl-card__content suggestion-text draft" }, - content = function () - slot.put ( suggestion:get_content( "html" ) ) + ui.link { + attr = { + class = "mdl-button mdl-js-button mdl-button--icon suggestion-less", + onclick = "document.querySelector('#s" .. suggestion.id .. "').classList.add('folded');document.querySelector('#s" .. suggestion.id .. "').classList.remove('unfolded'); return false;" + }, + content = function() + ui.tag{ tag = "i", attr = { class = "material-icons" }, content = "expand_less" } + end + } + --[[ + ui.link{ + attr = { class = "mdl-button" }, + content = _"Details", + module = "suggestion", view = "show", id = suggestion.id + } + --]] + end } + + end + } + + end } + + ui.container { attr = { class = "mdl-card__actions mdl-card--border" }, content = function() - ui.container { attr = { class = "floatx-right" }, content = function() - - ui.link { - attr = { - class = "mdl-button mdl-js-button mdl-button--icon suggestion-more", - onclick = "document.querySelector('#s" .. suggestion.id .. "').classList.remove('folded');document.querySelector('#s" .. suggestion.id .. "').classList.add('unfolded'); return false;" - }, - content = function() - ui.tag{ tag = "i", attr = { class = "material-icons" }, content = "expand_more" } - end - } - - ui.link { - attr = { - class = "mdl-button mdl-js-button mdl-button--icon suggestion-less", - onclick = "document.querySelector('#s" .. suggestion.id .. "').classList.add('folded');document.querySelector('#s" .. suggestion.id .. "').classList.remove('unfolded'); return false;" - }, - content = function() - ui.tag{ tag = "i", attr = { class = "material-icons" }, content = "expand_less" } - end - } - --[[ - ui.link{ - attr = { class = "mdl-button" }, - content = _"Details", - module = "suggestion", view = "show", id = suggestion.id - } - --]] - end } - + if direct_supporter then + ui.container{ attr = { class = "suggestion_rating_info" }, content = function() + ui.tag{ attr = { id = "s" .. suggestion.id .. "_rating_text" }, content = function() + local text = "" + if opinion then + if opinion.degree == 2 then + text = _"must" + elseif opinion.degree == 1 then + text = _"should" + elseif opinion.degree == 0 then + text = _"neutral" + elseif opinion.degree == -1 then + text = _"should not" + elseif opinion.degree == -2 then + text = _"must not" + end + ui.tag { content = text } + slot.put ( " " ) + if + (opinion.degree > 0 and not opinion.fulfilled) + or (opinion.degree < 0 and opinion.fulfilled) + then + ui.tag{ content = _"but" } + else + ui.tag{ content = _"and" } + end + slot.put ( " " ) + local text = "" + if opinion.fulfilled then + text = _"is implemented" + else + text = _"is not implemented" + end + ui.tag { content = text } + end + end } + local id = "s" .. suggestion.id .. "_rating_icon" + if opinion and ( + (opinion.degree > 0 and not opinion.fulfilled) + or (opinion.degree < 0 and opinion.fulfilled) + ) + then + slot.put(" ") + if math.abs(opinion.degree) > 1 then + ui.icon("warning", "red", id) + else + ui.icon("warning", nil, id) + end + elseif opinion then + slot.put(" ") + ui.icon("done", nil, id) + else + slot.put(" ") + ui.icon("blank", nil, id) + end + end } + + ui.link{ + attr = { + id = "s" .. suggestion.id .. "_rate_button", + class = "mdl-button", + onclick = "rateSuggestion(" .. suggestion.id .. ", " .. (opinion and opinion.degree or 0) .. ", " .. (opinion and (opinion.fulfilled and "true" or "false") or "null") .. ");return false;" + }, + content = function() + if opinion then + ui.tag { content = _"update rating" } + else + ui.tag { content = _"rate suggestion" } + end end } - - end } - - ui.container { attr = { class = "mdl-card__actions mdl-card--border" }, content = function() + end + + ui.link{ + attr = { class = "mdl-button" }, + content = _"Details", + module = "suggestion", view = "show", id = suggestion.id + } - if direct_supporter then - ui.container{ attr = { class = "suggestion_rating_info" }, content = function() - ui.tag{ attr = { id = "s" .. suggestion.id .. "_rating_text" }, content = function() - local text = "" - if opinion then - if opinion.degree == 2 then - text = _"must" - elseif opinion.degree == 1 then - text = _"should" - elseif opinion.degree == 0 then - text = _"neutral" - elseif opinion.degree == -1 then - text = _"should not" - elseif opinion.degree == -2 then - text = _"must not" - end - ui.tag { content = text } - slot.put ( " " ) - if - (opinion.degree > 0 and not opinion.fulfilled) - or (opinion.degree < 0 and opinion.fulfilled) - then - ui.tag{ content = _"but" } - else - ui.tag{ content = _"and" } - end - slot.put ( " " ) - local text = "" - if opinion.fulfilled then - text = _"is implemented" - else - text = _"is not implemented" - end - ui.tag { content = text } - end - end } - local id = "s" .. suggestion.id .. "_rating_icon" - if opinion and ( - (opinion.degree > 0 and not opinion.fulfilled) - or (opinion.degree < 0 and opinion.fulfilled) - ) - then - slot.put(" ") - if math.abs(opinion.degree) > 1 then - ui.icon("warning", "red", id) - else - ui.icon("warning", nil, id) - end - elseif opinion then - slot.put(" ") - ui.icon("done", nil, id) - else - slot.put(" ") - ui.icon("blank", nil, id) - end - end } - - ui.link{ - attr = { - id = "s" .. suggestion.id .. "_rate_button", - class = "mdl-button", - onclick = "rateSuggestion(" .. suggestion.id .. ", " .. (opinion and opinion.degree or 0) .. ", " .. (opinion and (opinion.fulfilled and "true" or "false") or "null") .. ");return false;" - }, - content = function() - if opinion then - ui.tag { content = _"update rating" } - else - ui.tag { content = _"rate suggestion" } - end - end - } - end - - ui.link{ - attr = { class = "mdl-button" }, - content = _"Details", - module = "suggestion", view = "show", id = suggestion.id + end } + ui.script{ script = [[ + var rateSuggestionRateText = "]] .. _"rate suggestion" .. [["; + var rateSuggestionUpdateRatingText = "]] .. _"update rating" .. [["; + var rateSuggestionDegreeTexts = { + "-2": "]] .. _"must not" .. [[", + "-1": "]] .. _"should not" .. [[", + "1": "]] .. _"should" .. [[", + "2": "]] .. _"must" .. [[" + } + var rateSuggestionAndText = "]] .. _"and" .. [["; + var rateSuggestionButText = "]] .. _"but" .. [["; + var rateSuggestionFulfilledText = "]] .. _"is implemented" .. [["; + var rateSuggestionNotFulfilledText = "]] .. _"is not implemented" .. [["; + window.addEventListener("load", function() { + var textEl = document.querySelector('#s]] .. suggestion.id .. [[ .suggestion-content'); + var height = textEl.clientHeight; + if (height > 250) { + document.querySelector('#s]] .. suggestion.id .. [[').classList.add('folded'); } + }); + ]] } + + end } - end } - ui.script{ script = [[ - var rateSuggestionRateText = "]] .. _"rate suggestion" .. [["; - var rateSuggestionUpdateRatingText = "]] .. _"update rating" .. [["; - var rateSuggestionDegreeTexts = { - "-2": "]] .. _"must not" .. [[", - "-1": "]] .. _"should not" .. [[", - "1": "]] .. _"should" .. [[", - "2": "]] .. _"must" .. [[" - } - var rateSuggestionAndText = "]] .. _"and" .. [["; - var rateSuggestionButText = "]] .. _"but" .. [["; - var rateSuggestionFulfilledText = "]] .. _"is implemented" .. [["; - var rateSuggestionNotFulfilledText = "]] .. _"is not implemented" .. [["; - window.addEventListener("load", function() { - var textEl = document.querySelector('#s]] .. suggestion.id .. [[ .suggestion-content'); - var height = textEl.clientHeight; - if (height > 250) { - document.querySelector('#s]] .. suggestion.id .. [[').classList.add('folded'); - } - }); - ]] } - - end } - - end -- for i, suggestion - - end -- if #initiative.suggestions > 0 + end -- for i, suggestion + end }