diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 1efdc69b7..9a904bf51 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -83,6 +83,8 @@ //= require globalize //= require send_admin_notification_alert //= require settings +//= require cookies +//= require columns_selector var initialize_modules = function() { App.Answers.initialize(); @@ -131,6 +133,9 @@ var initialize_modules = function() { App.Globalize.initialize(); App.SendAdminNotificationAlert.initialize(); App.Settings.initialize(); + App.Cookies.initialize(); + if ( $('#js-columns-selector').length ) + App.ColumnsSelector.initialize(); }; $(function(){ diff --git a/app/assets/javascripts/columns_selector.js.coffee b/app/assets/javascripts/columns_selector.js.coffee new file mode 100644 index 000000000..29b91224d --- /dev/null +++ b/app/assets/javascripts/columns_selector.js.coffee @@ -0,0 +1,81 @@ +App.ColumnsSelector = + + initColums: (name) -> + App.ColumnsSelector.hideAll() + c_value = App.ColumnsSelector.currentValue() + + if c_value.length == 0 + c_value = $("#js-columns-selector").data("default") + App.Cookies.saveCookie($("#js-columns-selector").data("cookie"), c_value, 30) + columns = c_value.split(",") + + for column in columns + do -> + $("[data-field=" + column + "]").removeClass("hidden") + $("#column_selector_" + column).prop("checked", true) + + initChecks: () -> + fields = $(".column-selecteable th[data-field]") + columns = [] + $(".column-selecteable th[data-field]").each -> + field = $(this).data("field") + text = $.trim($(this).text()) + item = $("#column_selector_item_template").clone() + item.prop("id", "column_selector_item_" + field) + input = item.find("input") + input.prop("name", "column-selector[" + field + "]") + input.prop("id", "column_selector_" + field) + input.data("column", field) + label = item.find("label") + label.prop("for", "column_selector_" + field) + label.text(text) + item.removeClass("hidden") + $("#js-columns-selector-wrapper").append(item) + + toggleOptions: (event) -> + event.preventDefault() + $("#js-columns-selector").toggleClass("hollow") + $("#js-columns-selector-wrapper").toggleClass("hidden") + + hideAll: () -> + $("[data-field]").addClass("hidden") + $(".column-selector-item input").prop("checked", false) + + toggleColumn: (event) -> + column = $(event.target).data("column") + App.ColumnsSelector.displayColumn(column) + + displayColumn: (column) -> + item = $("#column_selector_" + column) + if item.prop("checked") + $("[data-field=" + column + "]").removeClass("hidden") + else + $("[data-field=" + column + "]").addClass("hidden") + + value = App.ColumnsSelector.updateItem(column) + App.Cookies.saveCookie($("#js-columns-selector").data("cookie"), value, 30) + + updateItem: (value) -> + values = App.ColumnsSelector.currentValue().split(",") + index = values.indexOf(value) + if index >= 0 + values.splice index, 1 + else + values.push value + + values.join "," + + currentValue: () -> + App.Cookies.getCookie($("#js-columns-selector").data("cookie")) + + initialize: -> + App.ColumnsSelector.initChecks() + columns = App.ColumnsSelector.initColums($("#js-columns-selector").data("cookie")) + + $("#js-columns-selector").on + click: (event) -> + App.ColumnsSelector.toggleOptions(event) + + $(".column-selector-item input").on + click: (event) -> + App.ColumnsSelector.toggleColumn(event) diff --git a/app/assets/javascripts/cookies.js.coffee b/app/assets/javascripts/cookies.js.coffee new file mode 100644 index 000000000..fc1505b1f --- /dev/null +++ b/app/assets/javascripts/cookies.js.coffee @@ -0,0 +1,29 @@ +App.Cookies = + + removeCookie: (name) -> + document.cookie("name", null, { path: '/' }) + + saveCookie: (name, value, days) -> + expires = undefined + if days + date = new Date + date.setTime date.getTime() + days * 24 * 60 * 60 * 1000 + expires = '; expires=' + date.toGMTString() + else + expires = '' + document.cookie = name + '=' + value + expires + '; path=/' + return + + getCookie: (name) -> + if document.cookie.length > 0 + c_start = document.cookie.indexOf(name + '=') + if c_start != -1 + c_start = c_start + name.length + 1 + c_end = document.cookie.indexOf(';', c_start) + if c_end == -1 + c_end = document.cookie.length + return unescape(document.cookie.substring(c_start, c_end)) + '' + + initialize: -> + '' diff --git a/app/assets/stylesheets/admin.scss b/app/assets/stylesheets/admin.scss index e42bb0362..e56f6d68e 100644 --- a/app/assets/stylesheets/admin.scss +++ b/app/assets/stylesheets/admin.scss @@ -1258,6 +1258,44 @@ table { } } +.columns-selector { + + span[class^="icon-"] { + vertical-align: middle; + } +} + +.columns-selector-wrapper { + background: $light-gray; + padding: 2rem; + border-radius: 10px; + margin-bottom: 1rem; + + &.hidden { + display: none; + } + + .column-selector-item { + display: inline-block; + + &.hidden { + display: none; + } + + label { + font-size: 17px; + line-height: 1.5rem; + } + } +} + +.column-selecteable { + + .hidden { + display: none; + } +} + // 11. Newsletters // ----------------- diff --git a/app/views/admin/budget_investments/_investments.html.erb b/app/views/admin/budget_investments/_investments.html.erb index 9f7f97735..f19d512b2 100644 --- a/app/views/admin/budget_investments/_investments.html.erb +++ b/app/views/admin/budget_investments/_investments.html.erb @@ -20,29 +20,39 @@ <% end %> <% if @investments.any? %> -
| <%= link_to_investments_sorted_by :id %> | -<%= link_to_investments_sorted_by :title %> | -<%= link_to_investments_sorted_by :supports %> | -<%= t("admin.budget_investments.index.list.admin") %> | -- <%= t("admin.budget_investments.index.list.valuation_group") %> + | <%= link_to_investments_sorted_by :title %> | +<%= link_to_investments_sorted_by :supports %> | +<%= t("admin.budget_investments.index.list.admin") %> | ++ <%= t("admin.budget_investments.index.list.author") %> + | ++ <%= t("admin.budget_investments.index.list.valuation_group") %> / <%= t("admin.budget_investments.index.list.valuator") %> | -<%= t("admin.budget_investments.index.list.geozone") %> | -<%= t("admin.budget_investments.index.list.feasibility") %> | -<%= t("admin.budget_investments.index.list.price") %> | -<%= t("admin.budget_investments.index.list.valuation_finished") %> | -<%= t("admin.budget_investments.index.list.visible_to_valuators") %> | -<%= t("admin.budget_investments.index.list.selected") %> | - <% if params[:filter] == "selected" %> -<%= t("admin.budget_investments.index.list.incompatible") %> | +<%= t("admin.budget_investments.index.list.geozone") %> | +<%= t("admin.budget_investments.index.list.feasibility") %> | +<%= t("admin.budget_investments.index.list.price") %> | ++ <%= t("admin.budget_investments.index.list.valuation_finished") %> + | ++ <%= t("admin.budget_investments.index.list.visible_to_valuators") %> + | +<%= t("admin.budget_investments.index.list.selected") %> | + <% if params[:advanced_filters]&.include?("selected") %> +<%= t("admin.budget_investments.index.list.incompatible") %> | <% end %>+ | <%= investment.id %> | -+ + | <%= link_to investment.title, admin_budget_budget_investment_path(budget_id: @budget.id, id: investment.id, params: Budget::Investment.filter_params(params).to_h), target: "_blank" %> | -+ + | <%= investment.total_votes %> | -+ + | <% if investment.administrator.present? %> "> <%= investment.administrator.description_or_name %> <% else %> - <%= t("admin.budget_investments.index.no_admin_assigned") %> + <%= t("admin.budget_investments.index.no_admin_assigned") %> <% end %> | -
- <% no_valuation_groups = t("admin.budget_investments.index.no_valuation_groups") %>
- <%= investment.assigned_valuation_groups || no_valuation_groups %>
- - <% no_valuators_assigned = t("admin.budget_investments.index.no_valuators_assigned") %> - <%= investment.assigned_valuators || no_valuators_assigned %> + + | + <%= investment.author.name %> | -+ + | + <% valuators = [investment.assigned_valuation_groups, investment.assigned_valuators].compact %> + <% no_valuators_assigned = t("admin.budget_investments.index.no_valuators_assigned") %> + <%= raw valuators.present? ? valuators.join(", ") : no_valuators_assigned %> + | + +<%= investment.heading.name %> | -+ + | <%= t("admin.budget_investments.index.feasibility.#{investment.feasibility}") %> | -+ + | <%= investment.formatted_price %> | -+ + | <%= investment.valuation_finished? ? t("shared.yes"): t("shared.no") %> | -+ + | <%= form_for [:admin, investment.budget, investment], remote: true do |f| %> <%= f.check_box :visible_to_valuators, label: false, @@ -47,7 +58,8 @@ id: "budget_investment_visible_to_valuators" %> <% end %> | -+ + | <% if investment.selected? %> <%= link_to_unless investment.budget.finished?, t("admin.budget_investments.index.selected"), @@ -79,8 +91,9 @@ <% end %> <% end %> | -<% if params[:filter] == "selected" %> -- <%= investment.incompatible? ? t("shared.yes"): t("shared.no") %> - | + +<% if params[:advanced_filters]&.include?("selected") %> ++ <%= investment.incompatible? ? t("shared.yes"): t("shared.no") %> + | <% end %> diff --git a/app/views/admin/shared/_columns_selector.html.erb b/app/views/admin/shared/_columns_selector.html.erb new file mode 100644 index 000000000..a48a17f3f --- /dev/null +++ b/app/views/admin/shared/_columns_selector.html.erb @@ -0,0 +1,11 @@ + + +
|---|