diff --git a/.coffeelint.json b/.coffeelint.json deleted file mode 100644 index 9b00e8a75..000000000 --- a/.coffeelint.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "arrow_spacing": { - "level": "error" - }, - "braces_spacing": { - "level": "error", - "spaces": 1 - }, - "colon_assignment_spacing": { - "level": "error", - "spacing": { - "left": 0, - "right": 1 - } - }, - "eol_last": { - "level": "error" - }, - "indentation": { - "value": 2 - }, - "line_endings": { - "level": "error" - }, - "max_line_length": { - "value": 100, - "level": "error", - "limitComments": true - }, - "no_trailing_whitespace": { - "level": "error", - "allowed_in_comments": false, - "allowed_in_empty_lines": false - }, - "space_operators": { - "level": "error" - }, - "spacing_after_comma": { - "level": "error" - } -} diff --git a/.eslintrc.yml b/.eslintrc.yml new file mode 100644 index 000000000..339bc88f2 --- /dev/null +++ b/.eslintrc.yml @@ -0,0 +1,84 @@ +env: + browser: true + es6: false +extends: "eslint:recommended" +globals: + $: readonly + App: readonly + annotator: readonly + c3: readonly + CKEDITOR: readonly + L: readonly + Turbolinks: readonly +parserOptions: + ecmaVersion: 5 +rules: + array-bracket-spacing: error + array-callback-return: error + block-spacing: error + brace-style: error + comma-spacing: error + computed-property-spacing: error + curly: error + dot-notation: error + eol-last: error + eqeqeq: + - error + - always + - "null": ignore + func-call-spacing: error + indent: + - error + - 2 + key-spacing: error + keyword-spacing: error + linebreak-style: error + lines-between-class-members: error + max-len: + - warn + - code: 110 + no-array-constructor: error + no-console: error + no-multi-spaces: error + no-multiple-empty-lines: + - error + - max: 1 + no-param-reassign: error + no-shadow: error + no-spaced-func: error + no-tabs: error + no-trailing-spaces: error + no-void: error + no-whitespace-before-property: error + object-curly-spacing: + - error + - always + - objectsInObjects: false + padded-blocks: + - error + - never + quotes: + - error + - double + - avoidEscape: true + semi: + - error + - always + semi-spacing: error + space-before-blocks: error + space-before-function-paren: + - error + - never + space-in-parens: error + space-infix-ops: error + space-unary-ops: error + spaced-comment: + - error + - always + - markers: + - "=" + exceptions: + - "-" + strict: error + switch-colon-spacing: error + yoda: error diff --git a/.hound.yml b/.hound.yml index 4e54eebfc..4010fa02a 100644 --- a/.hound.yml +++ b/.hound.yml @@ -2,8 +2,9 @@ rubocop: config_file: .rubocop_basic.yml scss: config_file: .scss-lint.yml -coffeescript: - config_file: .coffeelint.json erblint: enabled: true config_file: .erb-lint.yml +eslint: + enabled: true + config_file: .eslintrc.yml diff --git a/Gemfile b/Gemfile index 81a57dd66..29e2d2d54 100644 --- a/Gemfile +++ b/Gemfile @@ -13,7 +13,6 @@ gem "browser", "~> 2.5.3" gem "cancancan", "~> 2.3.0" gem "ckeditor", "~> 4.2.3" gem "cocoon", "~> 1.2.9" -gem "coffee-rails", "~> 4.2.2" gem "daemons", "~> 1.2.4" gem "dalli", "~> 2.7.6" gem "delayed_job_active_record", "~> 4.1.3" diff --git a/Gemfile.lock b/Gemfile.lock index a93c7fd64..eb3684ed1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -594,7 +594,6 @@ DEPENDENCIES capybara-webmock (~> 0.5.3) ckeditor (~> 4.2.3) cocoon (~> 1.2.9) - coffee-rails (~> 4.2.2) coveralls (~> 0.8.22) daemons (~> 1.2.4) dalli (~> 2.7.6) diff --git a/app/assets/javascripts/advanced_search.js b/app/assets/javascripts/advanced_search.js new file mode 100644 index 000000000..c913e86d8 --- /dev/null +++ b/app/assets/javascripts/advanced_search.js @@ -0,0 +1,47 @@ +(function() { + "use strict"; + App.AdvancedSearch = { + advanced_search_terms: function() { + return $("#js-advanced-search").data("advanced-search-terms"); + }, + toggle_form: function(event) { + event.preventDefault(); + $("#js-advanced-search").slideToggle(); + }, + toggle_date_options: function() { + if ($("#js-advanced-search-date-min").val() === "custom") { + $("#js-custom-date").show(); + $(".js-calendar").datepicker("option", "disabled", false); + } else { + $("#js-custom-date").hide(); + $(".js-calendar").datepicker("option", "disabled", true); + } + }, + init_calendar: function() { + var locale; + locale = $("#js-locale").data("current-locale"); + $(".js-calendar").datepicker({ + maxDate: "+0d" + }); + $(".js-calendar-full").datepicker(); + $.datepicker.setDefaults($.datepicker.regional[locale]); + }, + initialize: function() { + App.AdvancedSearch.init_calendar(); + if (App.AdvancedSearch.advanced_search_terms()) { + $("#js-advanced-search").show(); + App.AdvancedSearch.toggle_date_options(); + } + $("#js-advanced-search-title").on({ + click: function(event) { + App.AdvancedSearch.toggle_form(event); + } + }); + $("#js-advanced-search-date-min").on({ + change: function() { + App.AdvancedSearch.toggle_date_options(); + } + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/advanced_search.js.coffee b/app/assets/javascripts/advanced_search.js.coffee deleted file mode 100644 index 77f9183b5..000000000 --- a/app/assets/javascripts/advanced_search.js.coffee +++ /dev/null @@ -1,41 +0,0 @@ -"use strict" - -App.AdvancedSearch = - - advanced_search_terms: -> - $("#js-advanced-search").data("advanced-search-terms") - - toggle_form: (event) -> - event.preventDefault() - $("#js-advanced-search").slideToggle() - - toggle_date_options: -> - if $("#js-advanced-search-date-min").val() == "custom" - $("#js-custom-date").show() - $( ".js-calendar" ).datepicker( "option", "disabled", false ) - else - $("#js-custom-date").hide() - $( ".js-calendar" ).datepicker( "option", "disabled", true ) - - init_calendar: -> - locale = $("#js-locale").data("current-locale") - - $(".js-calendar").datepicker - maxDate: "+0d" - $(".js-calendar-full").datepicker() - $.datepicker.setDefaults($.datepicker.regional[locale]) - - initialize: -> - App.AdvancedSearch.init_calendar() - - if App.AdvancedSearch.advanced_search_terms() - $("#js-advanced-search").show() - App.AdvancedSearch.toggle_date_options() - - $("#js-advanced-search-title").on - click: (event) -> - App.AdvancedSearch.toggle_form(event) - - $("#js-advanced-search-date-min").on - change: -> - App.AdvancedSearch.toggle_date_options() diff --git a/app/assets/javascripts/allow_participation.js b/app/assets/javascripts/allow_participation.js new file mode 100644 index 000000000..0b18fb78c --- /dev/null +++ b/app/assets/javascripts/allow_participation.js @@ -0,0 +1,17 @@ +(function() { + "use strict"; + App.AllowParticipation = { + initialize: function() { + $(document).on({ + "mouseenter focus": function() { + $(this).find(".js-participation-not-allowed").show(); + $(this).find(".js-participation-allowed").hide(); + }, + mouseleave: function() { + $(this).find(".js-participation-not-allowed").hide(); + $(this).find(".js-participation-allowed").show(); + } + }, ".js-participation"); + } + }; +}).call(this); diff --git a/app/assets/javascripts/allow_participation.js.coffee b/app/assets/javascripts/allow_participation.js.coffee deleted file mode 100644 index 3438e46c4..000000000 --- a/app/assets/javascripts/allow_participation.js.coffee +++ /dev/null @@ -1,13 +0,0 @@ -"use strict" - -App.AllowParticipation = - - initialize: -> - $(document).on { - "mouseenter focus": -> - $(this).find(".js-participation-not-allowed").show() - $(this).find(".js-participation-allowed").hide() - mouseleave: -> - $(this).find(".js-participation-not-allowed").hide() - $(this).find(".js-participation-allowed").show() - }, ".js-participation" diff --git a/app/assets/javascripts/answers.js b/app/assets/javascripts/answers.js new file mode 100644 index 000000000..74cb29305 --- /dev/null +++ b/app/assets/javascripts/answers.js @@ -0,0 +1,30 @@ +(function() { + "use strict"; + App.Answers = { + initializeAnswers: function(answers) { + $(answers).on("cocoon:after-insert", function(e, new_answer) { + var given_order; + given_order = App.Answers.maxGivenOrder(answers) + 1; + $(new_answer).find("[name$='[given_order]']").val(given_order); + }); + }, + maxGivenOrder: function(answers) { + var max_order; + max_order = 0; + $(answers).find("[name$='[given_order]']").each(function(index, answer) { + var value; + value = parseFloat($(answer).val()); + max_order = value > max_order ? value : max_order; + }); + return max_order; + }, + nestedAnswers: function() { + $(".js-answers").each(function(index, answers) { + App.Answers.initializeAnswers(answers); + }); + }, + initialize: function() { + App.Answers.nestedAnswers(); + } + }; +}).call(this); diff --git a/app/assets/javascripts/answers.js.coffee b/app/assets/javascripts/answers.js.coffee deleted file mode 100644 index 3a2fb10b1..000000000 --- a/app/assets/javascripts/answers.js.coffee +++ /dev/null @@ -1,22 +0,0 @@ -"use strict" - -App.Answers = - - initializeAnswers: (answers) -> - $(answers).on "cocoon:after-insert", (e, new_answer) -> - given_order = App.Answers.maxGivenOrder(answers) + 1 - $(new_answer).find("[name$='[given_order]']").val(given_order) - - maxGivenOrder: (answers) -> - max_order = 0 - $(answers).find("[name$='[given_order]']").each (index, answer) -> - value = parseFloat($(answer).val()) - max_order = if value > max_order then value else max_order - return max_order - - nestedAnswers: -> - $(".js-answers").each (index, answers) -> - App.Answers.initializeAnswers(answers) - - initialize: -> - App.Answers.nestedAnswers() diff --git a/app/assets/javascripts/app.js b/app/assets/javascripts/app.js new file mode 100644 index 000000000..90074f1c7 --- /dev/null +++ b/app/assets/javascripts/app.js @@ -0,0 +1,5 @@ +// Generated by CoffeeScript 1.12.6 +(function() { + "use strict"; + window.App = {}; +}).call(this); diff --git a/app/assets/javascripts/app.js.coffee b/app/assets/javascripts/app.js.coffee deleted file mode 100644 index b0ea6be5e..000000000 --- a/app/assets/javascripts/app.js.coffee +++ /dev/null @@ -1,3 +0,0 @@ -"use strict" - -window.App = {} diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 8381fd0fc..1fbde90cb 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -84,7 +84,7 @@ //= require settings //= require cookies //= require columns_selector -//= require budget_edit_associations.js.coffee +//= require budget_edit_associations //= require votations var initialize_modules = function() { @@ -116,8 +116,9 @@ var initialize_modules = function() { App.LegislationAdmin.initialize(); App.LegislationAllegations.initialize(); App.Legislation.initialize(); - if ( $(".legislation-annotatable").length ) + if ($(".legislation-annotatable").length) { App.LegislationAnnotatable.initialize(); + } App.WatchFormChanges.initialize(); App.TreeNavigator.initialize(); App.Documentable.initialize(); @@ -135,14 +136,16 @@ var initialize_modules = function() { App.SendAdminNotificationAlert.initialize(); App.ModalDownload.initialize(); App.Settings.initialize(); - if ( $("#js-columns-selector").length ) + if ($("#js-columns-selector").length) { App.ColumnsSelector.initialize(); + } App.BudgetEditAssociations.initialize(); - if ( $("#votation_type_enum_type").length ) + if ($("#votation_type_enum_type").length) { App.Votations.initialize(); + } }; -$(function(){ +$(function() { "use strict"; Turbolinks.enableProgressBar(); diff --git a/app/assets/javascripts/banners.js b/app/assets/javascripts/banners.js new file mode 100644 index 000000000..d69066c92 --- /dev/null +++ b/app/assets/javascripts/banners.js @@ -0,0 +1,28 @@ +(function() { + "use strict"; + App.Banners = { + initialize: function() { + $("[data-js-banner-title]").on({ + change: function() { + $("#js-banner-title").html($(this).val()); + } + }); + $("[data-js-banner-description]").on({ + change: function() { + $("#js-banner-description").html($(this).val()); + } + }); + $("[name='banner[background_color]']").on({ + change: function() { + $("#js-banner-background").css("background-color", $(this).val()); + } + }); + $("[name='banner[font_color]']").on({ + change: function() { + $("#js-banner-title").css("color", $(this).val()); + $("#js-banner-description").css("color", $(this).val()); + } + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/banners.js.coffee b/app/assets/javascripts/banners.js.coffee deleted file mode 100644 index 8a1710b5e..000000000 --- a/app/assets/javascripts/banners.js.coffee +++ /dev/null @@ -1,20 +0,0 @@ -"use strict" - -App.Banners = - initialize: -> - $("[data-js-banner-title]").on - change: -> - $("#js-banner-title").html($(this).val()) - - $("[data-js-banner-description]").on - change: -> - $("#js-banner-description").html($(this).val()) - - $("[name='banner[background_color]']").on - change: -> - $("#js-banner-background").css("background-color", $(this).val()) - - $("[name='banner[font_color]']").on - change: -> - $("#js-banner-title").css("color", $(this).val()) - $("#js-banner-description").css("color", $(this).val()) diff --git a/app/assets/javascripts/budget_edit_associations.js b/app/assets/javascripts/budget_edit_associations.js new file mode 100644 index 000000000..a50485a24 --- /dev/null +++ b/app/assets/javascripts/budget_edit_associations.js @@ -0,0 +1,41 @@ +(function() { + "use strict"; + App.BudgetEditAssociations = { + set_text: function(response) { + $(".js-budget-show-administrators-list").text(response.administrators); + $(".js-budget-show-valuators-list").text(response.valuators); + $(".js-budget-show-trackers-list").text(response.trackers); + }, + initialize: function() { + $(".js-budget-list-checkbox-user").on({ + click: function() { + var admin_count, budget, params, tracker_count, url, valuator_count; + admin_count = $(".js-budget-list-checkbox-administrators:checkbox:checked").length; + valuator_count = $(".js-budget-list-checkbox-valuators:checkbox:checked").length; + tracker_count = $(".js-budget-list-checkbox-trackers:checkbox:checked").length; + budget = $(".js-budget-id").attr("id"); + url = "/admin/budgets/" + budget + "/assigned_users_translation.json"; + params = { + administrators: admin_count, + valuators: valuator_count, + trackers: tracker_count + }; + $.get(url, params, function(response) { + App.BudgetEditAssociations.set_text(response, "json"); + }); + } + }); + $(".js-budget-show-users-list").on({ + click: function() { + var div_id; + div_id = $(this).data().toggle; + $(".js-budget-users-list").each(function() { + if (this.id !== div_id && !$(this).hasClass("is-hidden")) { + $(this).addClass("is-hidden"); + } + }); + } + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/budget_edit_associations.js.coffee b/app/assets/javascripts/budget_edit_associations.js.coffee deleted file mode 100644 index 5daa48441..000000000 --- a/app/assets/javascripts/budget_edit_associations.js.coffee +++ /dev/null @@ -1,26 +0,0 @@ -"use strict" - -App.BudgetEditAssociations = - - set_text: (response)-> - $(".js-budget-show-administrators-list").text(response["administrators"]) - $(".js-budget-show-valuators-list").text(response["valuators"]) - $(".js-budget-show-trackers-list").text(response["trackers"]) - - initialize: -> - $(".js-budget-list-checkbox-user").on - click: -> - admin_count = $(".js-budget-list-checkbox-administrators:checkbox:checked").length - valuator_count = $(".js-budget-list-checkbox-valuators:checkbox:checked").length - tracker_count = $(".js-budget-list-checkbox-trackers:checkbox:checked").length - budget = $(".js-budget-id").attr("id") - url = "/admin/budgets/" + budget + "/assigned_users_translation.json" - params = {administrators: admin_count, valuators: valuator_count, trackers: tracker_count} - $.get(url, params, (response) -> App.BudgetEditAssociations.set_text response, "json") - - $(".js-budget-show-users-list").on - click: -> - div_id = $(this).data().toggle - $(".js-budget-users-list").each -> - if this.id != div_id && !$(this).hasClass("is-hidden") - $(this).addClass("is-hidden") diff --git a/app/assets/javascripts/check_all_none.js b/app/assets/javascripts/check_all_none.js new file mode 100644 index 000000000..8684a7cf7 --- /dev/null +++ b/app/assets/javascripts/check_all_none.js @@ -0,0 +1,17 @@ +(function() { + "use strict"; + App.CheckAllNone = { + initialize: function() { + $("[data-check-all]").on("click", function() { + var target_name; + target_name = $(this).data("check-all"); + $("[name='" + target_name + "']").prop("checked", true); + }); + $("[data-check-none]").on("click", function() { + var target_name; + target_name = $(this).data("check-none"); + $("[name='" + target_name + "']").prop("checked", false); + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/check_all_none.js.coffee b/app/assets/javascripts/check_all_none.js.coffee deleted file mode 100644 index 45df897ea..000000000 --- a/app/assets/javascripts/check_all_none.js.coffee +++ /dev/null @@ -1,12 +0,0 @@ -"use strict" - -App.CheckAllNone = - - initialize: -> - $("[data-check-all]").on "click", -> - target_name = $(this).data("check-all") - $("[name='#{target_name}']").prop("checked", true) - - $("[data-check-none]").on "click", -> - target_name = $(this).data("check-none") - $("[name='#{target_name}']").prop("checked", false) diff --git a/app/assets/javascripts/checkbox_toggle.js b/app/assets/javascripts/checkbox_toggle.js new file mode 100644 index 000000000..c17469a1e --- /dev/null +++ b/app/assets/javascripts/checkbox_toggle.js @@ -0,0 +1,17 @@ +(function() { + "use strict"; + App.CheckboxToggle = { + initialize: function() { + $("[data-checkbox-toggle]").on("change", function() { + var $target; + $target = $($(this).data("checkbox-toggle")); + + if ($(this).is(":checked")) { + $target.show(); + } else { + $target.hide(); + } + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/checkbox_toggle.js.coffee b/app/assets/javascripts/checkbox_toggle.js.coffee deleted file mode 100644 index 0121b0b3a..000000000 --- a/app/assets/javascripts/checkbox_toggle.js.coffee +++ /dev/null @@ -1,11 +0,0 @@ -"use strict" - -App.CheckboxToggle = - - initialize: -> - $("[data-checkbox-toggle]").on "change", -> - $target = $($(this).data("checkbox-toggle")) - if $(this).is(":checked") - $target.show() - else - $target.hide() diff --git a/app/assets/javascripts/columns_selector.js b/app/assets/javascripts/columns_selector.js new file mode 100644 index 000000000..b4d95334f --- /dev/null +++ b/app/assets/javascripts/columns_selector.js @@ -0,0 +1,87 @@ +(function() { + "use strict"; + App.ColumnsSelector = { + initColums: function() { + var c_value, columns; + 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(","); + columns.forEach(function(column) { + $("[data-field=" + column + "]").removeClass("hidden"); + $("#column_selector_" + column).prop("checked", true); + }); + }, + initChecks: function() { + $(".column-selecteable th[data-field]").each(function() { + var field, input, item, label, text; + field = $(this).data("field"); + text = $(this).text().trim(); + 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: function(event) { + event.preventDefault(); + $("#js-columns-selector").toggleClass("hollow"); + $("#js-columns-selector-wrapper").toggleClass("hidden"); + }, + hideAll: function() { + $("[data-field]").addClass("hidden"); + $(".column-selector-item input").prop("checked", false); + }, + toggleColumn: function(event) { + App.ColumnsSelector.displayColumn($(event.target).data("column")); + }, + displayColumn: function(column) { + var value; + if ($("#column_selector_" + column).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: function(value) { + var index, values; + values = App.ColumnsSelector.currentValue().split(","); + index = values.indexOf(value); + if (index >= 0) { + values.splice(index, 1); + } else { + values.push(value); + } + return values.join(","); + }, + currentValue: function() { + return App.Cookies.getCookie($("#js-columns-selector").data("cookie")); + }, + initialize: function() { + App.ColumnsSelector.initChecks(); + App.ColumnsSelector.initColums(); + $("#js-columns-selector").on({ + click: function(event) { + App.ColumnsSelector.toggleOptions(event); + } + }); + $(".column-selector-item input").on({ + click: function(event) { + App.ColumnsSelector.toggleColumn(event); + } + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/columns_selector.js.coffee b/app/assets/javascripts/columns_selector.js.coffee deleted file mode 100644 index 312f2e129..000000000 --- a/app/assets/javascripts/columns_selector.js.coffee +++ /dev/null @@ -1,78 +0,0 @@ -"use strict" - -App.ColumnsSelector = - - initColums: () -> - 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(",") - - columns.forEach (column) -> - $("[data-field=" + column + "]").removeClass("hidden") - $("#column_selector_" + column).prop("checked", true) - - initChecks: () -> - $(".column-selecteable th[data-field]").each -> - field = $(this).data("field") - text = $(this).text().trim() - 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) -> - App.ColumnsSelector.displayColumn($(event.target).data("column")) - - displayColumn: (column) -> - if $("#column_selector_" + column).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() - App.ColumnsSelector.initColums() - - $("#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/comments.js b/app/assets/javascripts/comments.js new file mode 100644 index 000000000..c3c2be8ae --- /dev/null +++ b/app/assets/javascripts/comments.js @@ -0,0 +1,72 @@ +(function() { + "use strict"; + App.Comments = { + add_comment: function(parent_id, response_html) { + $(response_html).insertAfter($("#js-comment-form-" + parent_id)); + this.update_comments_count(); + }, + add_reply: function(parent_id, response_html) { + if ($("#" + parent_id + " .comment-children").length === 0) { + $("#" + parent_id).append("
  • "); + } + $("#" + parent_id + " .comment-children:first").prepend($(response_html)); + this.update_comments_count(); + }, + update_comments_count: function() { + $(".js-comments-count").each(function() { + var new_val; + new_val = $(this).text().trim().replace(/\d+/, function(match) { + return parseInt(match, 10) + 1; + }); + $(this).text(new_val); + }); + }, + display_error: function(field_with_errors, error_html) { + $(error_html).insertAfter($("" + field_with_errors)); + }, + reset_and_hide_form: function(id) { + var form_container, input; + form_container = $("#js-comment-form-" + id); + input = form_container.find("form textarea"); + input.val(""); + form_container.hide(); + }, + reset_form: function(id) { + var input; + input = $("#js-comment-form-" + id + " form textarea"); + input.val(""); + }, + toggle_form: function(id) { + $("#js-comment-form-" + id).toggle(); + }, + toggle_arrow: function(id) { + var arrow; + arrow = "span#" + id + "_arrow"; + if ($(arrow).hasClass("icon-arrow-right")) { + $(arrow).removeClass("icon-arrow-right").addClass("icon-arrow-down"); + } else { + $(arrow).removeClass("icon-arrow-down").addClass("icon-arrow-right"); + } + }, + initialize: function() { + $("body .js-add-comment-link").each(function() { + if ($(this).data("initialized") !== "yes") { + $(this).on("click", function() { + App.Comments.toggle_form($(this).data().id); + return false; + }).data("initialized", "yes"); + } + }); + $("body .js-toggle-children").each(function() { + $(this).on("click", function() { + var children_container_id; + children_container_id = ($(this).data().id) + "_children"; + $("#" + children_container_id).toggle("slow"); + App.Comments.toggle_arrow(children_container_id); + $(this).children(".js-child-toggle").toggle(); + return false; + }); + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/comments.js.coffee b/app/assets/javascripts/comments.js.coffee deleted file mode 100644 index cbd84f8c2..000000000 --- a/app/assets/javascripts/comments.js.coffee +++ /dev/null @@ -1,58 +0,0 @@ -"use strict" - -App.Comments = - - add_comment: (parent_id, response_html) -> - $(response_html).insertAfter($("#js-comment-form-#{parent_id}")) - this.update_comments_count() - - add_reply: (parent_id, response_html) -> - if $("##{parent_id} .comment-children").length == 0 - $("##{parent_id}").append("
  • ") - $("##{parent_id} .comment-children:first").prepend($(response_html)) - this.update_comments_count() - - update_comments_count: -> - $(".js-comments-count").each -> - new_val = $(this).text().trim().replace /\d+/, (match) -> parseInt(match, 10) + 1 - $(this).text(new_val) - - display_error: (field_with_errors, error_html) -> - $(error_html).insertAfter($("#{field_with_errors}")) - - reset_and_hide_form: (id) -> - form_container = $("#js-comment-form-#{id}") - input = form_container.find("form textarea") - input.val("") - form_container.hide() - - reset_form: (id) -> - input = $("#js-comment-form-#{id} form textarea") - input.val("") - - toggle_form: (id) -> - $("#js-comment-form-#{id}").toggle() - - toggle_arrow: (id) -> - arrow = "span##{id}_arrow" - if $(arrow).hasClass("icon-arrow-right") - $(arrow).removeClass("icon-arrow-right").addClass("icon-arrow-down") - else - $(arrow).removeClass("icon-arrow-down").addClass("icon-arrow-right") - - initialize: -> - $("body .js-add-comment-link").each -> - unless $(this).data("initialized") is "yes" - $(this).on("click", -> - App.Comments.toggle_form($(this).data().id) - false - ).data "initialized", "yes" - - $("body .js-toggle-children").each -> - $(this).on("click", -> - children_container_id = "#{$(this).data().id}_children" - $("##{children_container_id}").toggle("slow") - App.Comments.toggle_arrow(children_container_id) - $(this).children(".js-child-toggle").toggle() - false - ) diff --git a/app/assets/javascripts/cookies.js b/app/assets/javascripts/cookies.js new file mode 100644 index 000000000..620c10dbd --- /dev/null +++ b/app/assets/javascripts/cookies.js @@ -0,0 +1,32 @@ +(function() { + "use strict"; + App.Cookies = { + saveCookie: function(name, value, days) { + var date, expires; + 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=/"; + }, + getCookie: function(name) { + var c_end, c_start; + 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)); + } + } + return ""; + } + }; +}).call(this); diff --git a/app/assets/javascripts/cookies.js.coffee b/app/assets/javascripts/cookies.js.coffee deleted file mode 100644 index aa5a875f6..000000000 --- a/app/assets/javascripts/cookies.js.coffee +++ /dev/null @@ -1,25 +0,0 @@ -"use strict" - -App.Cookies = - - 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)) - "" diff --git a/app/assets/javascripts/custom.js b/app/assets/javascripts/custom.js index 6c880b3a9..065440922 100644 --- a/app/assets/javascripts/custom.js +++ b/app/assets/javascripts/custom.js @@ -1,5 +1,5 @@ // Overrides and adds customized javascripts in this file -// Read more on documentation: +// Read more on documentation: // * English: https://github.com/consul/consul/blob/master/CUSTOMIZE_EN.md#javascript // * Spanish: https://github.com/consul/consul/blob/master/CUSTOMIZE_ES.md#javascript // diff --git a/app/assets/javascripts/dashboard_graphs.js b/app/assets/javascripts/dashboard_graphs.js index 261bc5293..3171e4815 100644 --- a/app/assets/javascripts/dashboard_graphs.js +++ b/app/assets/javascripts/dashboard_graphs.js @@ -4,7 +4,7 @@ // TODO: This module is complex enough to require its own tests. Rewrite it using Ecma6 class syntax and // write tests for this feature after consul has been migrated to Rails 5.1 -(function(){ +(function() { "use strict"; var ProposalGraph = function(url) { @@ -33,7 +33,7 @@ .done(this.draw.bind(this)); }; - ProposalGraph.prototype.refreshGoals = function () { + ProposalGraph.prototype.refreshGoals = function() { return $.ajax({ url: this.resourcesUrl, cache: false, @@ -52,11 +52,11 @@ }); }; - ProposalGraph.prototype.refreshData = function () { + ProposalGraph.prototype.refreshData = function() { return $.ajax({ url: this.url, cache: false, - success: function (data) { + success: function(data) { this.parseData(data); }.bind(this), data: { @@ -68,8 +68,8 @@ ProposalGraph.prototype.parseData = function(data) { var key; - this.xColumnValues = [ ]; - this.progressColumnValues = [ this.progressLabel ]; + this.xColumnValues = []; + this.progressColumnValues = [this.progressLabel]; for (key in data) { if (Object.prototype.hasOwnProperty.call(data, key)) { @@ -87,7 +87,7 @@ return $.ajax({ url: this.successfulProposalDataUrl, cache: false, - success: function (data) { + success: function(data) { this.parseSuccessfulProposalData(data); }.bind(this), data: { @@ -99,7 +99,7 @@ ProposalGraph.prototype.parseSuccessfulProposalData = function(data) { var key; - this.successfulColumnValues = [ this.successLabel ]; + this.successfulColumnValues = [this.successLabel]; for (key in data) { if (Object.prototype.hasOwnProperty.call(data, key)) { @@ -113,7 +113,7 @@ return $.ajax({ url: this.proposalAchievementsUrl, cache: false, - success: function (data) { + success: function(data) { this.parseAchievements(data); }.bind(this), data: { @@ -138,7 +138,7 @@ } }; - ProposalGraph.prototype.addXColumnValue = function (value) { + ProposalGraph.prototype.addXColumnValue = function(value) { if (this.xColumnValues.indexOf(value) === -1) { this.xColumnValues.push(value); } @@ -146,7 +146,7 @@ ProposalGraph.prototype.draw = function() { var colors = {}, - maximumValue = this.maximumValue === 0 ? this.proposalSuccess : Math.round(this.maximumValue * 1.10); + maximumValue = this.maximumValue === 0 ? this.proposalSuccess : Math.round(this.maximumValue * 1.10); this.formatXColumnValues(); @@ -163,14 +163,14 @@ this.successfulColumnValues ], colors: colors, - color: function (color, d) { + color: function(color, d) { var achievement; if (d.id === this.successfulColumnValues[0] || !Object.prototype.hasOwnProperty.call(d, "x")) { return color; } - achievement = this.achievements.find(function (element) { + achievement = this.achievements.find(function(element) { return element.value === this.xColumnValues[d.index + 1]; }.bind(this)); @@ -211,8 +211,8 @@ }, tooltip: { format: { - title: function (d) { - var achievement = this.achievements.find(function (element) { + title: function(d) { + var achievement = this.achievements.find(function(element) { return element.value === this.xColumnValues[d + 1]; }.bind(this)); @@ -227,11 +227,11 @@ }); }; - ProposalGraph.prototype.tickYValues = function () { + ProposalGraph.prototype.tickYValues = function() { var i, - tick = [0], - maximumValue = this.maximumValue === 0 ? this.proposalSuccess : Math.round(this.maximumValue * 1.10), - step = maximumValue <= 10 ? 1 : Math.round(maximumValue / 10); + tick = [0], + maximumValue = this.maximumValue === 0 ? this.proposalSuccess : Math.round(this.maximumValue * 1.10), + step = maximumValue <= 10 ? 1 : Math.round(maximumValue / 10); for (i = step; i < maximumValue; i += step) { tick.push(i); @@ -242,16 +242,16 @@ return tick; }; - ProposalGraph.prototype.tickXValues = function () { + ProposalGraph.prototype.tickXValues = function() { var i, - l, - tick = [], - step = this.xColumnValues.length < 13 ? 1 : Math.round((this.xColumnValues.length - 1) / 12); + l, + tick = [], + step = this.xColumnValues.length < 13 ? 1 : Math.round((this.xColumnValues.length - 1) / 12); if (this.xColumnValues.length > 1) { tick.push(0); - for(i = step, l = this.xColumnValues.length - 1; i < l; i += step) { + for (i = step, l = this.xColumnValues.length - 1; i < l; i += step) { tick.push(i); } } @@ -259,7 +259,7 @@ return tick; }; - ProposalGraph.prototype.formatXColumnValues = function () { + ProposalGraph.prototype.formatXColumnValues = function() { var i, l; this.xColumnValues = this.xColumnValues.sort(); @@ -286,8 +286,8 @@ return this.groupBy === undefined || this.groupBy === "" || this.groupBy === null; }; - $(document).ready(function () { - $("[data-proposal-graph-url]").each(function () { + $(document).ready(function() { + $("[data-proposal-graph-url]").each(function() { var graph = new ProposalGraph($(this).data("proposal-graph-url")); graph.successfulProposalDataUrl = $(this).data("successful-proposal-graph-url"); graph.proposalAchievementsUrl = $(this).data("proposal-achievements-url"); diff --git a/app/assets/javascripts/documentable.js b/app/assets/javascripts/documentable.js new file mode 100644 index 000000000..b6b85ba8c --- /dev/null +++ b/app/assets/javascripts/documentable.js @@ -0,0 +1,169 @@ +(function() { + "use strict"; + App.Documentable = { + initialize: function() { + $(".js-document-attachment").each(function() { + App.Documentable.initializeDirectUploadInput(this); + }); + $("#nested-documents").on("cocoon:after-remove", function() { + App.Documentable.unlockUploads(); + }); + $("#nested-documents").on("cocoon:after-insert", function(e, nested_document) { + var input; + input = $(nested_document).find(".js-document-attachment"); + input.lockUpload = $(nested_document).closest("#nested-documents").find(".document:visible").length >= $("#nested-documents").data("max-documents-allowed"); + App.Documentable.initializeDirectUploadInput(input); + if (input.lockUpload) { + App.Documentable.lockUploads(); + } + }); + }, + initializeDirectUploadInput: function(input) { + var inputData; + inputData = this.buildData([], input); + this.initializeRemoveCachedDocumentLink(input, inputData); + $(input).fileupload({ + paramName: "attachment", + formData: null, + add: function(e, data) { + var upload_data; + upload_data = App.Documentable.buildData(data, e.target); + App.Documentable.clearProgressBar(upload_data); + App.Documentable.setProgressBar(upload_data, "uploading"); + upload_data.submit(); + }, + change: function(e, data) { + data.files.forEach(function(file) { + App.Documentable.setFilename(inputData, file.name); + }); + }, + fail: function(e, data) { + $(data.cachedAttachmentField).val(""); + App.Documentable.clearFilename(data); + App.Documentable.setProgressBar(data, "errors"); + App.Documentable.clearInputErrors(data); + App.Documentable.setInputErrors(data); + $(data.destroyAttachmentLinkContainer).find("a.delete:not(.remove-nested)").remove(); + $(data.addAttachmentLabel).addClass("error"); + $(data.addAttachmentLabel).show(); + }, + done: function(e, data) { + var destroyAttachmentLink; + $(data.cachedAttachmentField).val(data.result.cached_attachment); + App.Documentable.setTitleFromFile(data, data.result.filename); + App.Documentable.setProgressBar(data, "complete"); + App.Documentable.setFilename(data, data.result.filename); + App.Documentable.clearInputErrors(data); + $(data.addAttachmentLabel).hide(); + $(data.wrapper).find(".attachment-actions").removeClass("small-12").addClass("small-6 float-right"); + $(data.wrapper).find(".attachment-actions .action-remove").removeClass("small-3").addClass("small-12"); + destroyAttachmentLink = $(data.result.destroy_link); + $(data.destroyAttachmentLinkContainer).html(destroyAttachmentLink); + $(destroyAttachmentLink).on("click", function(event) { + event.preventDefault(); + event.stopPropagation(); + App.Documentable.doDeleteCachedAttachmentRequest(this.href, data); + }); + if (input.lockUpload) { + App.Documentable.showNotice(); + } + }, + progress: function(e, data) { + var progress; + progress = parseInt(data.loaded / data.total * 100, 10); + $(data.progressBar).find(".loading-bar").css("width", progress + "%"); + } + }); + }, + buildData: function(data, input) { + var wrapper; + wrapper = $(input).closest(".direct-upload"); + data.input = input; + data.wrapper = wrapper; + data.progressBar = $(wrapper).find(".progress-bar-placeholder"); + data.errorContainer = $(wrapper).find(".attachment-errors"); + data.fileNameContainer = $(wrapper).find("p.file-name"); + data.destroyAttachmentLinkContainer = $(wrapper).find(".action-remove"); + data.addAttachmentLabel = $(wrapper).find(".action-add label"); + data.cachedAttachmentField = $(wrapper).find("input[name$='[cached_attachment]']"); + data.titleField = $(wrapper).find("input[name$='[title]']"); + $(wrapper).find(".progress-bar-placeholder").css("display", "block"); + return data; + }, + clearFilename: function(data) { + $(data.fileNameContainer).text(""); + $(data.fileNameContainer).hide(); + }, + clearInputErrors: function(data) { + $(data.errorContainer).find("small.error").remove(); + }, + clearProgressBar: function(data) { + $(data.progressBar).find(".loading-bar").removeClass("complete errors uploading").css("width", "0px"); + }, + setFilename: function(data, file_name) { + $(data.fileNameContainer).text(file_name); + $(data.fileNameContainer).show(); + }, + setProgressBar: function(data, klass) { + $(data.progressBar).find(".loading-bar").addClass(klass); + }, + setTitleFromFile: function(data, title) { + if ($(data.titleField).val() === "") { + $(data.titleField).val(title); + } + }, + setInputErrors: function(data) { + var errors; + errors = "" + data.jqXHR.responseJSON.errors + ""; + $(data.errorContainer).append(errors); + }, + lockUploads: function() { + $("#new_document_link").addClass("hide"); + }, + unlockUploads: function() { + $("#max-documents-notice").addClass("hide"); + $("#new_document_link").removeClass("hide"); + }, + showNotice: function() { + $("#max-documents-notice").removeClass("hide"); + }, + doDeleteCachedAttachmentRequest: function(url, data) { + $.ajax({ + type: "POST", + url: url, + dataType: "json", + data: { + "_method": "delete" + }, + complete: function() { + $(data.cachedAttachmentField).val(""); + $(data.addAttachmentLabel).show(); + App.Documentable.clearFilename(data); + App.Documentable.clearInputErrors(data); + App.Documentable.clearProgressBar(data); + App.Documentable.unlockUploads(); + $(data.wrapper).find(".attachment-actions").addClass("small-12").removeClass("small-6 float-right"); + $(data.wrapper).find(".attachment-actions .action-remove").addClass("small-3").removeClass("small-12"); + if ($(data.input).data("nested-document") === true) { + $(data.wrapper).remove(); + } else { + $(data.wrapper).find("a.remove-cached-attachment").remove(); + } + } + }); + }, + initializeRemoveCachedDocumentLink: function(input, data) { + var remove_document_link, wrapper; + wrapper = $(input).closest(".direct-upload"); + remove_document_link = $(wrapper).find("a.remove-cached-attachment"); + $(remove_document_link).on("click", function(e) { + e.preventDefault(); + e.stopPropagation(); + App.Documentable.doDeleteCachedAttachmentRequest(this.href, data); + }); + }, + removeDocument: function(id) { + $("#" + id).remove(); + } + }; +}).call(this); diff --git a/app/assets/javascripts/documentable.js.coffee b/app/assets/javascripts/documentable.js.coffee deleted file mode 100644 index 9287304c2..000000000 --- a/app/assets/javascripts/documentable.js.coffee +++ /dev/null @@ -1,156 +0,0 @@ -"use strict" - -App.Documentable = - - initialize: -> - $(".js-document-attachment").each -> - App.Documentable.initializeDirectUploadInput(this) - - $("#nested-documents").on "cocoon:after-remove", -> - App.Documentable.unlockUploads() - - $("#nested-documents").on "cocoon:after-insert", (e, nested_document) -> - input = $(nested_document).find(".js-document-attachment") - input["lockUpload"] = $(nested_document).closest("#nested-documents").find(".document:visible").length >= $("#nested-documents").data("max-documents-allowed") - App.Documentable.initializeDirectUploadInput(input) - App.Documentable.lockUploads() if input["lockUpload"] - - initializeDirectUploadInput: (input) -> - - inputData = this.buildData([], input) - - this.initializeRemoveCachedDocumentLink(input, inputData) - - $(input).fileupload - - paramName: "attachment" - - formData: null - - add: (e, data) -> - upload_data = App.Documentable.buildData(data, e.target) - App.Documentable.clearProgressBar(upload_data) - App.Documentable.setProgressBar(upload_data, "uploading") - upload_data.submit() - - change: (e, data) -> - data.files.forEach (file) -> - App.Documentable.setFilename(inputData, file.name) - - fail: (e, data) -> - $(data.cachedAttachmentField).val("") - App.Documentable.clearFilename(data) - App.Documentable.setProgressBar(data, "errors") - App.Documentable.clearInputErrors(data) - App.Documentable.setInputErrors(data) - $(data.destroyAttachmentLinkContainer).find("a.delete:not(.remove-nested)").remove() - $(data.addAttachmentLabel).addClass("error") - $(data.addAttachmentLabel).show() - - done: (e, data) -> - $(data.cachedAttachmentField).val(data.result.cached_attachment) - App.Documentable.setTitleFromFile(data, data.result.filename) - App.Documentable.setProgressBar(data, "complete") - App.Documentable.setFilename(data, data.result.filename) - App.Documentable.clearInputErrors(data) - $(data.addAttachmentLabel).hide() - $(data.wrapper).find(".attachment-actions").removeClass("small-12").addClass("small-6 float-right") - $(data.wrapper).find(".attachment-actions .action-remove").removeClass("small-3").addClass("small-12") - - destroyAttachmentLink = $(data.result.destroy_link) - $(data.destroyAttachmentLinkContainer).html(destroyAttachmentLink) - $(destroyAttachmentLink).on "click", (e) -> - e.preventDefault() - e.stopPropagation() - App.Documentable.doDeleteCachedAttachmentRequest(this.href, data) - - App.Documentable.showNotice() if input["lockUpload"] - - - progress: (e, data) -> - progress = parseInt(data.loaded / data.total * 100, 10) - $(data.progressBar).find(".loading-bar").css "width", "#{progress}%" - return - - buildData: (data, input) -> - wrapper = $(input).closest(".direct-upload") - data.input = input - data.wrapper = wrapper - data.progressBar = $(wrapper).find(".progress-bar-placeholder") - data.errorContainer = $(wrapper).find(".attachment-errors") - data.fileNameContainer = $(wrapper).find("p.file-name") - data.destroyAttachmentLinkContainer = $(wrapper).find(".action-remove") - data.addAttachmentLabel = $(wrapper).find(".action-add label") - data.cachedAttachmentField = $(wrapper).find("input[name$='[cached_attachment]']") - data.titleField = $(wrapper).find("input[name$='[title]']") - $(wrapper).find(".progress-bar-placeholder").css("display", "block") - return data - - clearFilename: (data) -> - $(data.fileNameContainer).text("") - $(data.fileNameContainer).hide() - - clearInputErrors: (data) -> - $(data.errorContainer).find("small.error").remove() - - clearProgressBar: (data) -> - $(data.progressBar).find(".loading-bar").removeClass("complete errors uploading").css("width", "0px") - - setFilename: (data, file_name) -> - $(data.fileNameContainer).text(file_name) - $(data.fileNameContainer).show() - - setProgressBar: (data, klass) -> - $(data.progressBar).find(".loading-bar").addClass(klass) - - setTitleFromFile: (data, title) -> - if $(data.titleField).val() == "" - $(data.titleField).val(title) - - setInputErrors: (data) -> - errors = "#{data.jqXHR.responseJSON.errors}" - $(data.errorContainer).append(errors) - - lockUploads: -> - $("#new_document_link").addClass("hide") - - unlockUploads: -> - $("#max-documents-notice").addClass("hide") - $("#new_document_link").removeClass("hide") - - showNotice: -> - $("#max-documents-notice").removeClass("hide") - - doDeleteCachedAttachmentRequest: (url, data) -> - $.ajax - type: "POST" - url: url - dataType: "json" - data: { "_method": "delete" } - complete: -> - $(data.cachedAttachmentField).val("") - $(data.addAttachmentLabel).show() - - App.Documentable.clearFilename(data) - App.Documentable.clearInputErrors(data) - App.Documentable.clearProgressBar(data) - - App.Documentable.unlockUploads() - $(data.wrapper).find(".attachment-actions").addClass("small-12").removeClass("small-6 float-right") - $(data.wrapper).find(".attachment-actions .action-remove").addClass("small-3").removeClass("small-12") - - if $(data.input).data("nested-document") == true - $(data.wrapper).remove() - else - $(data.wrapper).find("a.remove-cached-attachment").remove() - - initializeRemoveCachedDocumentLink: (input, data) -> - wrapper = $(input).closest(".direct-upload") - remove_document_link = $(wrapper).find("a.remove-cached-attachment") - $(remove_document_link).on "click", (e) -> - e.preventDefault() - e.stopPropagation() - App.Documentable.doDeleteCachedAttachmentRequest(this.href, data) - - removeDocument: (id) -> - $("##{id}").remove() diff --git a/app/assets/javascripts/embed_video.js b/app/assets/javascripts/embed_video.js new file mode 100644 index 000000000..beed5a8c7 --- /dev/null +++ b/app/assets/javascripts/embed_video.js @@ -0,0 +1,12 @@ +(function() { + "use strict"; + App.EmbedVideo = { + initialize: function() { + $("#js-embedded-video").each(function() { + var code; + code = $(this).data("video-code"); + $("#js-embedded-video").html(code); + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/embed_video.js.coffee b/app/assets/javascripts/embed_video.js.coffee deleted file mode 100644 index 163f831c7..000000000 --- a/app/assets/javascripts/embed_video.js.coffee +++ /dev/null @@ -1,8 +0,0 @@ -"use strict" - -App.EmbedVideo = - - initialize: -> - $("#js-embedded-video").each -> - code = $(this).data("video-code") - $("#js-embedded-video").html(code) diff --git a/app/assets/javascripts/fixed_bar.js b/app/assets/javascripts/fixed_bar.js new file mode 100644 index 000000000..f8e48f7ec --- /dev/null +++ b/app/assets/javascripts/fixed_bar.js @@ -0,0 +1,21 @@ +(function() { + "use strict"; + App.FixedBar = { + initialize: function() { + $("[data-fixed-bar]").each(function() { + var $this, fixedBarTopPosition; + $this = $(this); + fixedBarTopPosition = $this.offset().top; + $(window).on("scroll", function() { + if ($(window).scrollTop() > fixedBarTopPosition) { + $this.addClass("is-fixed"); + $("#check-ballot").css({ "display": "inline-block" }); + } else { + $this.removeClass("is-fixed"); + $("#check-ballot").hide(); + } + }); + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/fixed_bar.js.coffee b/app/assets/javascripts/fixed_bar.js.coffee deleted file mode 100644 index 59b3255f0..000000000 --- a/app/assets/javascripts/fixed_bar.js.coffee +++ /dev/null @@ -1,15 +0,0 @@ -"use strict" - -App.FixedBar = - initialize: -> - $("[data-fixed-bar]").each -> - $this = $(this) - fixedBarTopPosition = $this.offset().top - - $(window).on "scroll", -> - if $(window).scrollTop() > fixedBarTopPosition - $this.addClass("is-fixed") - $("#check-ballot").css({ "display": "inline-block" }) - else - $this.removeClass("is-fixed") - $("#check-ballot").hide() diff --git a/app/assets/javascripts/flaggable.js b/app/assets/javascripts/flaggable.js new file mode 100644 index 000000000..0b2661e05 --- /dev/null +++ b/app/assets/javascripts/flaggable.js @@ -0,0 +1,8 @@ +(function() { + "use strict"; + App.Flaggable = { + update: function(resource_id, button) { + $("#" + resource_id + " .js-flag-actions").html(button).foundation(); + } + }; +}).call(this); diff --git a/app/assets/javascripts/flaggable.js.coffee b/app/assets/javascripts/flaggable.js.coffee deleted file mode 100644 index fe5709ddd..000000000 --- a/app/assets/javascripts/flaggable.js.coffee +++ /dev/null @@ -1,6 +0,0 @@ -"use strict" - -App.Flaggable = - - update: (resource_id, button) -> - $("##{resource_id} .js-flag-actions").html(button).foundation() diff --git a/app/assets/javascripts/followable.js b/app/assets/javascripts/followable.js new file mode 100644 index 000000000..81775de58 --- /dev/null +++ b/app/assets/javascripts/followable.js @@ -0,0 +1,13 @@ +(function() { + "use strict"; + App.Followable = { + update: function(followable_id, button, notice) { + $("#" + followable_id + " .js-follow").html(button); + if ($("[data-alert]").length > 0) { + $("[data-alert]").replaceWith(notice); + } else { + $("body").append(notice); + } + } + }; +}).call(this); diff --git a/app/assets/javascripts/followable.js.coffee b/app/assets/javascripts/followable.js.coffee deleted file mode 100644 index 4f1d339d5..000000000 --- a/app/assets/javascripts/followable.js.coffee +++ /dev/null @@ -1,10 +0,0 @@ -"use strict" - -App.Followable = - - update: (followable_id, button, notice) -> - $("##{followable_id} .js-follow").html(button) - if ($("[data-alert]").length > 0) - $("[data-alert]").replaceWith(notice) - else - $("body").append(notice) diff --git a/app/assets/javascripts/forms.js b/app/assets/javascripts/forms.js new file mode 100644 index 000000000..d3120ab1d --- /dev/null +++ b/app/assets/javascripts/forms.js @@ -0,0 +1,67 @@ +(function() { + "use strict"; + App.Forms = { + disableEnter: function() { + $("form.js-enter-disabled").on("keyup keypress", function(event) { + if (event.which === 13) { + event.preventDefault(); + } + }); + }, + submitOnChange: function() { + $(".js-submit-on-change").unbind("change").on("change", function() { + $(this).closest("form").submit(); + return false; + }); + }, + toggleLink: function() { + $(".js-toggle-link").unbind("click").on("click", function() { + var toggle_txt; + $($(this).data("toggle-selector")).toggle("down"); + if ($(this).data("toggle-text") !== undefined) { + toggle_txt = $(this).text(); + $(this).text($(this).data("toggle-text")); + $(this).data("toggle-text", toggle_txt); + } + return false; + }); + }, + synchronizeInputs: function() { + var banners, inputs, processes, progress_bar; + progress_bar = "[name='progress_bar[percentage]']"; + processes = "[name='legislation_process[background_color]'], [name='legislation_process[font_color]']"; + banners = "[name='banner[background_color]'], [name='banner[font_color]']"; + inputs = $(progress_bar + ", " + processes + ", " + banners); + inputs.on({ + input: function() { + $("[name='" + this.name + "']").val($(this).val()); + } + }); + inputs.trigger("input"); + }, + hideOrShowFieldsAfterSelection: function() { + $("[name='progress_bar[kind]']").on({ + change: function() { + var locale, title_field; + locale = App.Globalize.selected_language(); + title_field = $(".translatable-fields[data-locale=" + locale + "]"); + if (this.value === "primary") { + title_field.hide(); + $(".globalize-languages").hide(); + } else { + title_field.show(); + $(".globalize-languages").show(); + } + } + }); + $("[name='progress_bar[kind]']").change(); + }, + initialize: function() { + App.Forms.disableEnter(); + App.Forms.submitOnChange(); + App.Forms.toggleLink(); + App.Forms.synchronizeInputs(); + App.Forms.hideOrShowFieldsAfterSelection(); + } + }; +}).call(this); diff --git a/app/assets/javascripts/forms.js.coffee b/app/assets/javascripts/forms.js.coffee deleted file mode 100644 index e81ec0668..000000000 --- a/app/assets/javascripts/forms.js.coffee +++ /dev/null @@ -1,60 +0,0 @@ -"use strict" - -App.Forms = - - disableEnter: -> - $("form.js-enter-disabled").on("keyup keypress", (event) -> - if event.which == 13 - event.preventDefault() - ) - - submitOnChange: -> - $(".js-submit-on-change").unbind("change").on("change", -> - $(this).closest("form").submit() - false - ) - - toggleLink: -> - $(".js-toggle-link").unbind("click").on("click", -> - $($(this).data("toggle-selector")).toggle("down") - if $(this).data("toggle-text") isnt undefined - toggle_txt = $(this).text() - $(this).text( $(this).data("toggle-text") ) - $(this).data("toggle-text", toggle_txt) - - false - ) - - synchronizeInputs: -> - progress_bar = "[name='progress_bar[percentage]']" - processes = "[name='legislation_process[background_color]'], [name='legislation_process[font_color]']" - banners = "[name='banner[background_color]'], [name='banner[font_color]']" - - inputs = $("#{progress_bar}, #{processes}, #{banners}") - inputs.on - input: -> - $("[name='#{this.name}']").val($(this).val()) - - inputs.trigger("input") - - hideOrShowFieldsAfterSelection: -> - $("[name='progress_bar[kind]']").on - change: -> - locale = App.Globalize.selected_language() - title_field = $(".translatable-fields[data-locale=#{locale}]") - - if this.value == "primary" - title_field.hide() - $(".globalize-languages").hide() - else - title_field.show() - $(".globalize-languages").show() - - $("[name='progress_bar[kind]']").change() - - initialize: -> - App.Forms.disableEnter() - App.Forms.submitOnChange() - App.Forms.toggleLink() - App.Forms.synchronizeInputs() - App.Forms.hideOrShowFieldsAfterSelection() diff --git a/app/assets/javascripts/foundation_extras.js b/app/assets/javascripts/foundation_extras.js new file mode 100644 index 000000000..c6e344684 --- /dev/null +++ b/app/assets/javascripts/foundation_extras.js @@ -0,0 +1,29 @@ +(function() { + "use strict"; + App.FoundationExtras = { + clearSticky: function() { + if ($("[data-sticky]").length) { + $("[data-sticky]").foundation("destroy"); + } + }, + mobile_ui_init: function() { + $(window).trigger("load.zf.sticky"); + }, + desktop_ui_init: function() { + $(window).trigger("init.zf.sticky"); + }, + initialize: function() { + $(document).foundation(); + $(window).trigger("resize"); + $(document).on("page:before-unload", this.clearSticky); + window.addEventListener("popstate", this.clearSticky, false); + $(function() { + if ($(window).width() < 620) { + App.FoundationExtras.mobile_ui_init(); + } else { + App.FoundationExtras.desktop_ui_init(); + } + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/foundation_extras.js.coffee b/app/assets/javascripts/foundation_extras.js.coffee deleted file mode 100644 index e2c949daa..000000000 --- a/app/assets/javascripts/foundation_extras.js.coffee +++ /dev/null @@ -1,23 +0,0 @@ -"use strict" - -App.FoundationExtras = - clearSticky: -> - $("[data-sticky]").foundation("destroy") if $("[data-sticky]").length - - mobile_ui_init: -> - $(window).trigger "load.zf.sticky" - - desktop_ui_init: -> - $(window).trigger "init.zf.sticky" - - initialize: -> - $(document).foundation() - $(window).trigger "resize" - $(document).on("page:before-unload", this.clearSticky) - window.addEventListener("popstate", this.clearSticky, false) - - $ -> - if $(window).width() < 620 - App.FoundationExtras.mobile_ui_init() - else - App.FoundationExtras.desktop_ui_init() diff --git a/app/assets/javascripts/gettext.js b/app/assets/javascripts/gettext.js new file mode 100644 index 000000000..7404109ee --- /dev/null +++ b/app/assets/javascripts/gettext.js @@ -0,0 +1,40 @@ +// Generated by CoffeeScript 1.12.6 +(function() { + "use strict"; + var i18n; + + i18n = { + es: { + "Comments": "Comentarios", + "No comment": "Sin comentarios", + "Cancel": "Cancelar", + "Save": "Guardar", + "Edit": "Editar", + "Delete": "Borrar", + "Unregistered": "

    Necesitas iniciar sesión o registrarte para continuar.

    " + }, + en: { + "Comments": "Coments", + "No comment": "No comment", + "Cancel": "Cancel", + "Save": "Save", + "Edit": "Edit", + "Delete": "Delete", + "Unregistered": "You need to sign in or sign up to continue." + } + }; + + window.Gettext = function() { + return { + gettext: function(key) { + var locale, locale_id; + locale_id = $("html").attr("lang"); + locale = i18n[locale_id]; + if (locale && locale[key]) { + return locale[key]; + } + return key; + } + }; + }; +}).call(this); diff --git a/app/assets/javascripts/gettext.js.coffee b/app/assets/javascripts/gettext.js.coffee deleted file mode 100644 index 2d954e56d..000000000 --- a/app/assets/javascripts/gettext.js.coffee +++ /dev/null @@ -1,30 +0,0 @@ -"use strict" - -i18n = { - es: { - "Comments": "Comentarios", - "No comment": "Sin comentarios", - "Cancel": "Cancelar", - "Save": "Guardar", - "Edit": "Editar", - "Delete": "Borrar", - "Unregistered": "

    Necesitas iniciar sesión o registrarte para continuar.

    " - }, - en: { - "Comments": "Coments", - "No comment": "No comment", - "Cancel": "Cancel", - "Save": "Save", - "Edit": "Edit", - "Delete": "Delete", - "Unregistered": "You need to sign in or sign up to continue." - } -} - -window.Gettext = -> - gettext: (key) -> - locale_id = $("html").attr("lang") - locale = i18n[locale_id] - if locale && locale[key] - return locale[key] - key diff --git a/app/assets/javascripts/globalize.js b/app/assets/javascripts/globalize.js new file mode 100644 index 000000000..a7757f520 --- /dev/null +++ b/app/assets/javascripts/globalize.js @@ -0,0 +1,117 @@ +(function() { + "use strict"; + App.Globalize = { + selected_language: function() { + return $("#select_language").val(); + }, + display_locale: function(locale) { + App.Globalize.enable_locale(locale); + App.Globalize.add_language(locale); + $(".js-add-language option:selected").removeAttr("selected"); + }, + display_translations: function(locale) { + $(".js-select-language option[value=" + locale + "]").prop("selected", true); + $(".js-globalize-attribute").each(function() { + if ($(this).data("locale") === locale) { + $(this).show(); + } else { + $(this).hide(); + } + $(".js-delete-language").hide(); + $(".js-delete-" + locale).show(); + }); + }, + add_language: function(locale) { + var language_option, option; + language_option = $(".js-add-language [value=" + locale + "]"); + if ($(".js-select-language option[value=" + locale + "]").length === 0) { + option = new Option(language_option.text(), language_option.val()); + $(".js-select-language").append(option); + } + $(".js-select-language option[value=" + locale + "]").prop("selected", true); + }, + remove_language: function(locale) { + var next; + $(".js-globalize-attribute[data-locale=" + locale + "]").each(function() { + $(this).val("").hide(); + App.Globalize.resetEditor(this); + }); + $(".js-select-language option[value=" + locale + "]").remove(); + next = $(".js-select-language option:not([value=''])").first(); + App.Globalize.display_translations(next.val()); + App.Globalize.disable_locale(locale); + App.Globalize.update_description(); + if ($(".js-select-language option").length === 1) { + $(".js-select-language option").prop("selected", true); + } + }, + resetEditor: function(element) { + if (CKEDITOR.instances[$(element).attr("id")]) { + CKEDITOR.instances[$(element).attr("id")].setData(""); + } + }, + enable_locale: function(locale) { + App.Globalize.destroy_locale_field(locale).val(false); + App.Globalize.site_customization_enable_locale_field(locale).val(1); + }, + disable_locale: function(locale) { + App.Globalize.destroy_locale_field(locale).val(true); + App.Globalize.site_customization_enable_locale_field(locale).val(0); + }, + enabled_locales: function() { + return $.map($(".js-select-language:first option:not([value=''])"), function(element) { + return $(element).val(); + }); + }, + destroy_locale_field: function(locale) { + return $("input[id$=_destroy][data-locale=" + locale + "]"); + }, + site_customization_enable_locale_field: function(locale) { + return $("#enabled_translations_" + locale); + }, + refresh_visible_translations: function() { + var locale; + locale = $(".js-select-language").val(); + App.Globalize.display_translations(locale); + }, + update_description: function() { + var count, description; + count = App.Globalize.enabled_locales().length; + description = App.Globalize.language_description(count); + $(".js-languages-description").html(description); + $(".js-languages-count").text(count); + }, + language_description: function(count) { + switch (count) { + case 0: + return $(".globalize-languages").data("zero-languages-description"); + case 1: + return $(".globalize-languages").data("one-languages-description"); + default: + return $(".globalize-languages").data("other-languages-description"); + } + }, + initialize: function() { + $(".js-add-language").on("change", function() { + var locale; + locale = $(this).val(); + App.Globalize.display_translations(locale); + App.Globalize.display_locale(locale); + App.Globalize.update_description(); + }); + $(".js-select-language").on("change", function() { + App.Globalize.display_translations($(this).val()); + }); + $(".js-delete-language").on("click", function(e) { + e.preventDefault(); + App.Globalize.remove_language($(this).data("locale")); + $(this).hide(); + }); + $(".js-add-fields-container").on("cocoon:after-insert", function() { + App.Globalize.enabled_locales().forEach(function(locale) { + App.Globalize.enable_locale(locale); + }); + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/globalize.js.coffee b/app/assets/javascripts/globalize.js.coffee deleted file mode 100644 index 46976864f..000000000 --- a/app/assets/javascripts/globalize.js.coffee +++ /dev/null @@ -1,101 +0,0 @@ -"use strict" - -App.Globalize = - - selected_language: -> - $("#select_language").val() - - display_locale: (locale) -> - App.Globalize.enable_locale(locale) - App.Globalize.add_language(locale) - $(".js-add-language option:selected").removeAttr("selected") - - display_translations: (locale) -> - $(".js-select-language option[value=#{locale}]").prop("selected", true) - $(".js-globalize-attribute").each -> - if $(this).data("locale") == locale - $(this).show() - else - $(this).hide() - $(".js-delete-language").hide() - $(".js-delete-" + locale).show() - - add_language: (locale) -> - language_option = $(".js-add-language [value=#{locale}]") - if $(".js-select-language option[value=#{locale}]").length == 0 - option = new Option(language_option.text(), language_option.val()) - $(".js-select-language").append(option) - $(".js-select-language option[value=#{locale}]").prop("selected", true) - - remove_language: (locale) -> - $(".js-globalize-attribute[data-locale=#{locale}]").each -> - $(this).val("").hide() - App.Globalize.resetEditor(this) - - $(".js-select-language option[value=#{locale}]").remove() - next = $(".js-select-language option:not([value=''])").first() - App.Globalize.display_translations(next.val()) - App.Globalize.disable_locale(locale) - App.Globalize.update_description() - - if $(".js-select-language option").length == 1 - $(".js-select-language option").prop("selected", true) - - resetEditor: (element) -> - if CKEDITOR.instances[$(element).attr("id")] - CKEDITOR.instances[$(element).attr("id")].setData("") - - enable_locale: (locale) -> - App.Globalize.destroy_locale_field(locale).val(false) - App.Globalize.site_customization_enable_locale_field(locale).val(1) - - disable_locale: (locale) -> - App.Globalize.destroy_locale_field(locale).val(true) - App.Globalize.site_customization_enable_locale_field(locale).val(0) - - enabled_locales: -> - $.map( - $(".js-select-language:first option:not([value=''])"), - (element) -> $(element).val() - ) - - destroy_locale_field: (locale) -> - $("input[id$=_destroy][data-locale=#{locale}]") - - site_customization_enable_locale_field: (locale) -> - $("#enabled_translations_#{locale}") - - refresh_visible_translations: -> - locale = $(".js-select-language").val() - App.Globalize.display_translations(locale) - - update_description: -> - count = App.Globalize.enabled_locales().length - description = App.Globalize.language_description(count) - $(".js-languages-description").html(description) - $(".js-languages-count").text(count) - - language_description: (count) -> - switch count - when 0 then $(".globalize-languages").data("zero-languages-description") - when 1 then $(".globalize-languages").data("one-languages-description") - else $(".globalize-languages").data("other-languages-description") - - initialize: -> - $(".js-add-language").on "change", -> - locale = $(this).val() - App.Globalize.display_translations(locale) - App.Globalize.display_locale(locale) - App.Globalize.update_description() - - $(".js-select-language").on "change", -> - App.Globalize.display_translations($(this).val()) - - $(".js-delete-language").on "click", (e) -> - e.preventDefault() - App.Globalize.remove_language($(this).data("locale")) - $(this).hide() - - $(".js-add-fields-container").on "cocoon:after-insert", -> - App.Globalize.enabled_locales().forEach (locale) -> - App.Globalize.enable_locale(locale) diff --git a/app/assets/javascripts/ie_alert.js b/app/assets/javascripts/ie_alert.js new file mode 100644 index 000000000..7f447d8c9 --- /dev/null +++ b/app/assets/javascripts/ie_alert.js @@ -0,0 +1,18 @@ +(function() { + "use strict"; + App.IeAlert = { + set_cookie_and_hide: function(event) { + event.preventDefault(); + $.cookie("ie_alert_closed", "true", { + path: "/", + expires: 365 + }); + $(".ie-callout").remove(); + }, + initialize: function() { + $(".ie-callout-close-js").on("click", function(event) { + App.IeAlert.set_cookie_and_hide(event); + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/ie_alert.js.coffee b/app/assets/javascripts/ie_alert.js.coffee deleted file mode 100644 index 75338974b..000000000 --- a/app/assets/javascripts/ie_alert.js.coffee +++ /dev/null @@ -1,11 +0,0 @@ -"use strict" - -App.IeAlert = - set_cookie_and_hide: (event) -> - event.preventDefault() - $.cookie("ie_alert_closed", "true", { path: "/", expires: 365 }) - $(".ie-callout").remove() - - initialize: -> - $(".ie-callout-close-js").on "click", (event) -> - App.IeAlert.set_cookie_and_hide(event) diff --git a/app/assets/javascripts/imageable.js b/app/assets/javascripts/imageable.js new file mode 100644 index 000000000..7f0773907 --- /dev/null +++ b/app/assets/javascripts/imageable.js @@ -0,0 +1,174 @@ +(function() { + "use strict"; + App.Imageable = { + initialize: function() { + $(".js-image-attachment").each(function() { + App.Imageable.initializeDirectUploadInput(this); + }); + $("#nested-image").on("cocoon:after-remove", function() { + $("#new_image_link").removeClass("hide"); + }); + $("#nested-image").on("cocoon:before-insert", function() { + $(".js-image-attachment").closest(".image").remove(); + }); + $("#nested-image").on("cocoon:after-insert", function(e, nested_image) { + var input; + $("#new_image_link").addClass("hide"); + input = $(nested_image).find(".js-image-attachment"); + App.Imageable.initializeDirectUploadInput(input); + }); + }, + initializeDirectUploadInput: function(input) { + var inputData; + inputData = this.buildData([], input); + this.initializeRemoveCachedImageLink(input, inputData); + $(input).fileupload({ + paramName: "attachment", + formData: null, + add: function(e, data) { + var upload_data; + upload_data = App.Imageable.buildData(data, e.target); + App.Imageable.clearProgressBar(upload_data); + App.Imageable.setProgressBar(upload_data, "uploading"); + upload_data.submit(); + }, + change: function(e, data) { + data.files.forEach(function(file) { + App.Imageable.setFilename(inputData, file.name); + }); + }, + fail: function(e, data) { + $(data.cachedAttachmentField).val(""); + App.Imageable.clearFilename(data); + App.Imageable.setProgressBar(data, "errors"); + App.Imageable.clearInputErrors(data); + App.Imageable.setInputErrors(data); + App.Imageable.clearPreview(data); + $(data.destroyAttachmentLinkContainer).find("a.delete:not(.remove-nested)").remove(); + $(data.addAttachmentLabel).addClass("error"); + $(data.addAttachmentLabel).show(); + }, + done: function(e, data) { + var destroyAttachmentLink; + $(data.cachedAttachmentField).val(data.result.cached_attachment); + App.Imageable.setTitleFromFile(data, data.result.filename); + App.Imageable.setProgressBar(data, "complete"); + App.Imageable.setFilename(data, data.result.filename); + App.Imageable.clearInputErrors(data); + $(data.addAttachmentLabel).hide(); + $(data.wrapper).find(".attachment-actions").removeClass("small-12").addClass("small-6 float-right"); + $(data.wrapper).find(".attachment-actions .action-remove").removeClass("small-3").addClass("small-12"); + App.Imageable.setPreview(data); + destroyAttachmentLink = $(data.result.destroy_link); + $(data.destroyAttachmentLinkContainer).html(destroyAttachmentLink); + $(destroyAttachmentLink).on("click", function(event) { + event.preventDefault(); + event.stopPropagation(); + App.Imageable.doDeleteCachedAttachmentRequest(this.href, data); + }); + }, + progress: function(e, data) { + var progress; + progress = parseInt(data.loaded / data.total * 100, 10); + $(data.progressBar).find(".loading-bar").css("width", progress + "%"); + } + }); + }, + buildData: function(data, input) { + var wrapper; + wrapper = $(input).closest(".direct-upload"); + data.input = input; + data.wrapper = wrapper; + data.progressBar = $(wrapper).find(".progress-bar-placeholder"); + data.preview = $(wrapper).find(".image-preview"); + data.errorContainer = $(wrapper).find(".attachment-errors"); + data.fileNameContainer = $(wrapper).find("p.file-name"); + data.destroyAttachmentLinkContainer = $(wrapper).find(".action-remove"); + data.addAttachmentLabel = $(wrapper).find(".action-add label"); + data.cachedAttachmentField = $(wrapper).find("input[name$='[cached_attachment]']"); + data.titleField = $(wrapper).find("input[name$='[title]']"); + $(wrapper).find(".progress-bar-placeholder").css("display", "block"); + return data; + }, + clearFilename: function(data) { + $(data.fileNameContainer).text(""); + $(data.fileNameContainer).hide(); + }, + clearInputErrors: function(data) { + $(data.errorContainer).find("small.error").remove(); + }, + clearProgressBar: function(data) { + $(data.progressBar).find(".loading-bar").removeClass("complete errors uploading").css("width", "0px"); + }, + clearPreview: function(data) { + $(data.wrapper).find(".image-preview").remove(); + }, + setFilename: function(data, file_name) { + $(data.fileNameContainer).text(file_name); + $(data.fileNameContainer).show(); + }, + setProgressBar: function(data, klass) { + $(data.progressBar).find(".loading-bar").addClass(klass); + }, + setTitleFromFile: function(data, title) { + if ($(data.titleField).val() === "") { + $(data.titleField).val(title); + } + }, + setInputErrors: function(data) { + var errors; + errors = "" + data.jqXHR.responseJSON.errors + ""; + $(data.errorContainer).append(errors); + }, + setPreview: function(data) { + var image_preview; + image_preview = "
    "; + if ($(data.preview).length > 0) { + $(data.preview).replaceWith(image_preview); + } else { + $(image_preview).insertBefore($(data.wrapper).find(".attachment-actions")); + data.preview = $(data.wrapper).find(".image-preview"); + } + }, + doDeleteCachedAttachmentRequest: function(url, data) { + $.ajax({ + type: "POST", + url: url, + dataType: "json", + data: { + "_method": "delete" + }, + complete: function() { + $(data.cachedAttachmentField).val(""); + $(data.addAttachmentLabel).show(); + App.Imageable.clearFilename(data); + App.Imageable.clearInputErrors(data); + App.Imageable.clearProgressBar(data); + App.Imageable.clearPreview(data); + $("#new_image_link").removeClass("hide"); + $(data.wrapper).find(".attachment-actions").addClass("small-12").removeClass("small-6 float-right"); + $(data.wrapper).find(".attachment-actions .action-remove").addClass("small-3").removeClass("small-12"); + if ($(data.input).data("nested-image") === true) { + $(data.wrapper).remove(); + } else { + $(data.wrapper).find("a.remove-cached-attachment").remove(); + } + } + }); + }, + initializeRemoveCachedImageLink: function(input, data) { + var remove_image_link, wrapper; + wrapper = $(input).closest(".direct-upload"); + remove_image_link = $(wrapper).find("a.remove-cached-attachment"); + $(remove_image_link).on("click", function(e) { + e.preventDefault(); + e.stopPropagation(); + App.Imageable.doDeleteCachedAttachmentRequest(this.href, data); + }); + }, + removeImage: function(id) { + $("#" + id).remove(); + $("#new_image_link").removeClass("hide"); + } + }; +}).call(this); diff --git a/app/assets/javascripts/imageable.js.coffee b/app/assets/javascripts/imageable.js.coffee deleted file mode 100644 index 656514484..000000000 --- a/app/assets/javascripts/imageable.js.coffee +++ /dev/null @@ -1,162 +0,0 @@ -"use strict" - -App.Imageable = - - initialize: -> - $(".js-image-attachment").each -> - App.Imageable.initializeDirectUploadInput(this) - - $("#nested-image").on "cocoon:after-remove", -> - $("#new_image_link").removeClass("hide") - - $("#nested-image").on "cocoon:before-insert", -> - $(".js-image-attachment").closest(".image").remove() - - $("#nested-image").on "cocoon:after-insert", (e, nested_image) -> - $("#new_image_link").addClass("hide") - input = $(nested_image).find(".js-image-attachment") - App.Imageable.initializeDirectUploadInput(input) - - initializeDirectUploadInput: (input) -> - - inputData = this.buildData([], input) - - this.initializeRemoveCachedImageLink(input, inputData) - - $(input).fileupload - - paramName: "attachment" - - formData: null - - add: (e, data) -> - upload_data = App.Imageable.buildData(data, e.target) - App.Imageable.clearProgressBar(upload_data) - App.Imageable.setProgressBar(upload_data, "uploading") - upload_data.submit() - - change: (e, data) -> - data.files.forEach (file) -> - App.Imageable.setFilename(inputData, file.name) - - fail: (e, data) -> - $(data.cachedAttachmentField).val("") - App.Imageable.clearFilename(data) - App.Imageable.setProgressBar(data, "errors") - App.Imageable.clearInputErrors(data) - App.Imageable.setInputErrors(data) - App.Imageable.clearPreview(data) - $(data.destroyAttachmentLinkContainer).find("a.delete:not(.remove-nested)").remove() - $(data.addAttachmentLabel).addClass("error") - $(data.addAttachmentLabel).show() - - done: (e, data) -> - $(data.cachedAttachmentField).val(data.result.cached_attachment) - App.Imageable.setTitleFromFile(data, data.result.filename) - App.Imageable.setProgressBar(data, "complete") - App.Imageable.setFilename(data, data.result.filename) - App.Imageable.clearInputErrors(data) - $(data.addAttachmentLabel).hide() - $(data.wrapper).find(".attachment-actions").removeClass("small-12").addClass("small-6 float-right") - $(data.wrapper).find(".attachment-actions .action-remove").removeClass("small-3").addClass("small-12") - App.Imageable.setPreview(data) - - destroyAttachmentLink = $(data.result.destroy_link) - $(data.destroyAttachmentLinkContainer).html(destroyAttachmentLink) - $(destroyAttachmentLink).on "click", (e) -> - e.preventDefault() - e.stopPropagation() - App.Imageable.doDeleteCachedAttachmentRequest(this.href, data) - - progress: (e, data) -> - progress = parseInt(data.loaded / data.total * 100, 10) - $(data.progressBar).find(".loading-bar").css "width", "#{progress}%" - return - - buildData: (data, input) -> - wrapper = $(input).closest(".direct-upload") - data.input = input - data.wrapper = wrapper - data.progressBar = $(wrapper).find(".progress-bar-placeholder") - data.preview = $(wrapper).find(".image-preview") - data.errorContainer = $(wrapper).find(".attachment-errors") - data.fileNameContainer = $(wrapper).find("p.file-name") - data.destroyAttachmentLinkContainer = $(wrapper).find(".action-remove") - data.addAttachmentLabel = $(wrapper).find(".action-add label") - data.cachedAttachmentField = $(wrapper).find("input[name$='[cached_attachment]']") - data.titleField = $(wrapper).find("input[name$='[title]']") - $(wrapper).find(".progress-bar-placeholder").css("display", "block") - return data - - clearFilename: (data) -> - $(data.fileNameContainer).text("") - $(data.fileNameContainer).hide() - - clearInputErrors: (data) -> - $(data.errorContainer).find("small.error").remove() - - clearProgressBar: (data) -> - $(data.progressBar).find(".loading-bar").removeClass("complete errors uploading").css("width", "0px") - - clearPreview: (data) -> - $(data.wrapper).find(".image-preview").remove() - - setFilename: (data, file_name) -> - $(data.fileNameContainer).text(file_name) - $(data.fileNameContainer).show() - - setProgressBar: (data, klass) -> - $(data.progressBar).find(".loading-bar").addClass(klass) - - setTitleFromFile: (data, title) -> - if $(data.titleField).val() == "" - $(data.titleField).val(title) - - setInputErrors: (data) -> - errors = "#{data.jqXHR.responseJSON.errors}" - $(data.errorContainer).append(errors) - - setPreview: (data) -> - image_preview = "
    " - if $(data.preview).length > 0 - $(data.preview).replaceWith(image_preview) - else - $(image_preview).insertBefore($(data.wrapper).find(".attachment-actions")) - data.preview = $(data.wrapper).find(".image-preview") - - doDeleteCachedAttachmentRequest: (url, data) -> - $.ajax - type: "POST" - url: url - dataType: "json" - data: { "_method": "delete" } - complete: -> - $(data.cachedAttachmentField).val("") - $(data.addAttachmentLabel).show() - - App.Imageable.clearFilename(data) - App.Imageable.clearInputErrors(data) - App.Imageable.clearProgressBar(data) - App.Imageable.clearPreview(data) - - $("#new_image_link").removeClass("hide") - - $(data.wrapper).find(".attachment-actions").addClass("small-12").removeClass("small-6 float-right") - $(data.wrapper).find(".attachment-actions .action-remove").addClass("small-3").removeClass("small-12") - - if $(data.input).data("nested-image") == true - $(data.wrapper).remove() - else - $(data.wrapper).find("a.remove-cached-attachment").remove() - - initializeRemoveCachedImageLink: (input, data) -> - wrapper = $(input).closest(".direct-upload") - remove_image_link = $(wrapper).find("a.remove-cached-attachment") - $(remove_image_link).on "click", (e) -> - e.preventDefault() - e.stopPropagation() - App.Imageable.doDeleteCachedAttachmentRequest(this.href, data) - - removeImage: (id) -> - $("##{id}").remove() - $("#new_image_link").removeClass("hide") diff --git a/app/assets/javascripts/investment_report_alert.js b/app/assets/javascripts/investment_report_alert.js new file mode 100644 index 000000000..4128183ed --- /dev/null +++ b/app/assets/javascripts/investment_report_alert.js @@ -0,0 +1,14 @@ +(function() { + "use strict"; + App.InvestmentReportAlert = { + initialize: function() { + $("#js-investment-report-alert").on("click", function() { + if (this.checked && $("#budget_investment_feasibility_unfeasible").is(":checked")) { + return confirm(this.dataset.alert + "\n" + this.dataset.notFeasibleAlert); + } else if (this.checked) { + return confirm(this.dataset.alert); + } + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/investment_report_alert.js.coffee b/app/assets/javascripts/investment_report_alert.js.coffee deleted file mode 100644 index d968deb55..000000000 --- a/app/assets/javascripts/investment_report_alert.js.coffee +++ /dev/null @@ -1,9 +0,0 @@ -"use strict" - -App.InvestmentReportAlert = - initialize: -> - $("#js-investment-report-alert").on "click", -> - if this.checked && $("#budget_investment_feasibility_unfeasible").is(":checked") - confirm("#{this.dataset.alert}\n#{this.dataset.notFeasibleAlert}") - else if this.checked - confirm(this.dataset.alert) diff --git a/app/assets/javascripts/legislation.js b/app/assets/javascripts/legislation.js new file mode 100644 index 000000000..39d5eebf9 --- /dev/null +++ b/app/assets/javascripts/legislation.js @@ -0,0 +1,19 @@ +(function() { + "use strict"; + App.Legislation = { + initialize: function() { + $("form#new_legislation_answer input.button").hide(); + $("form#new_legislation_answer input[type=radio]").on({ + click: function() { + $("form#new_legislation_answer").submit(); + } + }); + $("form#draft_version_go_to_version input.button").hide(); + $("form#draft_version_go_to_version select").on({ + change: function() { + $("form#draft_version_go_to_version").submit(); + } + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/legislation.js.coffee b/app/assets/javascripts/legislation.js.coffee deleted file mode 100644 index d2c710c80..000000000 --- a/app/assets/javascripts/legislation.js.coffee +++ /dev/null @@ -1,14 +0,0 @@ -"use strict" - -App.Legislation = - - initialize: -> - $("form#new_legislation_answer input.button").hide() - $("form#new_legislation_answer input[type=radio]").on - click: -> - $("form#new_legislation_answer").submit() - - $("form#draft_version_go_to_version input.button").hide() - $("form#draft_version_go_to_version select").on - change: -> - $("form#draft_version_go_to_version").submit() diff --git a/app/assets/javascripts/legislation_admin.js b/app/assets/javascripts/legislation_admin.js new file mode 100644 index 000000000..c4692014f --- /dev/null +++ b/app/assets/javascripts/legislation_admin.js @@ -0,0 +1,25 @@ +(function() { + "use strict"; + App.LegislationAdmin = { + initialize: function() { + $("input[type='checkbox'][data-disable-date]").on({ + change: function() { + var checkbox, date_selector, parent; + checkbox = $(this); + parent = $(this).parents(".row:eq(0)"); + date_selector = $(this).data("disable-date"); + parent.find("input[type='text'][id^='" + date_selector + "']").each(function() { + if (checkbox.is(":checked")) { + $(this).removeAttr("disabled"); + } else { + $(this).val(""); + } + }); + } + }); + $("#nested_question_options").on("cocoon:after-insert", function() { + App.Globalize.refresh_visible_translations(); + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/legislation_admin.js.coffee b/app/assets/javascripts/legislation_admin.js.coffee deleted file mode 100644 index 847c39663..000000000 --- a/app/assets/javascripts/legislation_admin.js.coffee +++ /dev/null @@ -1,18 +0,0 @@ -"use strict" - -App.LegislationAdmin = - - initialize: -> - $("input[type='checkbox'][data-disable-date]").on - change: -> - checkbox = $(this) - parent = $(this).parents(".row:eq(0)") - date_selector = $(this).data("disable-date") - parent.find("input[type='text'][id^='#{date_selector}']").each -> - if checkbox.is(":checked") - $(this).removeAttr("disabled") - else - $(this).val("") - - $("#nested_question_options").on "cocoon:after-insert", -> - App.Globalize.refresh_visible_translations() diff --git a/app/assets/javascripts/legislation_allegations.js b/app/assets/javascripts/legislation_allegations.js new file mode 100644 index 000000000..f5970b8e5 --- /dev/null +++ b/app/assets/javascripts/legislation_allegations.js @@ -0,0 +1,36 @@ +(function() { + "use strict"; + App.LegislationAllegations = { + toggle_comments: function() { + if (!App.LegislationAnnotatable.isMobile()) { + $(".draft-allegation").toggleClass("comments-on"); + $("#comments-box").html("").hide(); + } + }, + show_comments: function() { + if (!App.LegislationAnnotatable.isMobile()) { + $(".draft-allegation").addClass("comments-on"); + } + }, + initialize: function() { + $(".js-toggle-allegations .draft-panel").on({ + click: function(e) { + e.preventDefault(); + e.stopPropagation(); + if (!App.LegislationAnnotatable.isMobile()) { + App.LegislationAllegations.toggle_comments(); + } + } + }); + $(".js-toggle-allegations").on({ + click: function() { + if (!App.LegislationAnnotatable.isMobile()) { + if ($(this).find(".draft-panel .panel-title:visible").length === 0) { + App.LegislationAllegations.toggle_comments(); + } + } + } + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/legislation_allegations.js.coffee b/app/assets/javascripts/legislation_allegations.js.coffee deleted file mode 100644 index 4823d1e58..000000000 --- a/app/assets/javascripts/legislation_allegations.js.coffee +++ /dev/null @@ -1,27 +0,0 @@ -"use strict" - -App.LegislationAllegations = - - toggle_comments: -> - if !App.LegislationAnnotatable.isMobile() - $(".draft-allegation").toggleClass("comments-on") - $("#comments-box").html("").hide() - - show_comments: -> - if !App.LegislationAnnotatable.isMobile() - $(".draft-allegation").addClass("comments-on") - - initialize: -> - $(".js-toggle-allegations .draft-panel").on - click: (e) -> - e.preventDefault() - e.stopPropagation() - if !App.LegislationAnnotatable.isMobile() - App.LegislationAllegations.toggle_comments() - - $(".js-toggle-allegations").on - click: -> - # Toggle comments when the section title is visible - if !App.LegislationAnnotatable.isMobile() - if $(this).find(".draft-panel .panel-title:visible").length == 0 - App.LegislationAllegations.toggle_comments() diff --git a/app/assets/javascripts/legislation_annotatable.js b/app/assets/javascripts/legislation_annotatable.js new file mode 100644 index 000000000..ab5f5cc6d --- /dev/null +++ b/app/assets/javascripts/legislation_annotatable.js @@ -0,0 +1,232 @@ +(function() { + "use strict"; + App.LegislationAnnotatable = { + makeEditableAndHighlight: function(colour) { + var range, sel; + sel = window.getSelection(); + if (sel.rangeCount && sel.getRangeAt) { + range = sel.getRangeAt(0); + } + document.designMode = "on"; + if (range) { + sel.removeAllRanges(); + sel.addRange(range); + } + if (!document.execCommand("HiliteColor", false, colour)) { + document.execCommand("BackColor", false, colour); + } + document.designMode = "off"; + }, + highlight: function(colour) { + try { + if (!document.execCommand("BackColor", false, colour)) { + App.LegislationAnnotatable.makeEditableAndHighlight(colour); + } + } catch (error) { + App.LegislationAnnotatable.makeEditableAndHighlight(colour); + } + }, + remove_highlight: function() { + $("[data-legislation-draft-version-id] span[style]").replaceWith(function() { + return $(this).contents(); + }); + }, + renderAnnotationComments: function(event) { + if (event.offset) { + $("#comments-box").css({ + top: event.offset - $(".calc-comments").offset().top + }); + } + if (App.LegislationAnnotatable.isMobile()) { + return; + } + $.ajax({ + method: "GET", + url: event.annotation_url + "/annotations/" + event.annotation_id + "/comments", + dataType: "script" + }); + }, + onClick: function(event) { + var annotation_id, annotation_url, parents, parents_ids, target; + event.preventDefault(); + event.stopPropagation(); + if (App.LegislationAnnotatable.isMobile()) { + annotation_url = $(event.target).closest(".legislation-annotatable").data("legislation-annotatable-base-url"); + window.location.href = annotation_url + "/annotations/" + ($(this).data("annotation-id")); + return; + } + $("[data-annotation-id]").removeClass("current-annotation"); + target = $(this); + parents = target.parents(".annotator-hl"); + parents_ids = parents.map(function(_, elem) { + return $(elem).data("annotation-id"); + }); + annotation_id = target.data("annotation-id"); + $("[data-annotation-id='" + annotation_id + "']").addClass("current-annotation"); + $("#comments-box").html(""); + App.LegislationAllegations.show_comments(); + $("#comments-box").show(); + $.event.trigger({ + type: "renderLegislationAnnotation", + annotation_id: target.data("annotation-id"), + annotation_url: target.closest(".legislation-annotatable").data("legislation-annotatable-base-url"), + offset: target.offset().top + }); + parents_ids.each(function(i, pid) { + $.event.trigger({ + type: "renderLegislationAnnotation", + annotation_id: pid, + annotation_url: target.closest(".legislation-annotatable").data("legislation-annotatable-base-url") + }); + }); + }, + isMobile: function() { + return window.innerWidth <= 652; + }, + viewerExtension: function(viewer) { + return viewer._onHighlightMouseover = function() {}; + }, + customShow: function(position) { + var annotation_url; + $(this.element).html(""); + // Clean comments section and open it + $("#comments-box").html(""); + App.LegislationAllegations.show_comments(); + $("#comments-box").show(); + annotation_url = $("[data-legislation-annotatable-base-url]").data("legislation-annotatable-base-url"); + $.ajax({ + method: "GET", + url: annotation_url + "/annotations/new", + dataType: "script" + }).done((function() { + $("#new_legislation_annotation #legislation_annotation_quote").val(this.annotation.quote); + $("#new_legislation_annotation #legislation_annotation_ranges").val(JSON.stringify(this.annotation.ranges)); + $("#comments-box").css({ + top: position.top - $(".calc-comments").offset().top + }); + if ($("[data-legislation-open-phase]").data("legislation-open-phase") !== false) { + App.LegislationAnnotatable.highlight("#7fff9a"); + $("#comments-box textarea").focus(); + $("#new_legislation_annotation").on("ajax:complete", function(e, data) { + App.LegislationAnnotatable.app.destroy(); + if (data.status === 200) { + App.LegislationAnnotatable.remove_highlight(); + $("#comments-box").html("").hide(); + $.ajax({ + method: "GET", + url: annotation_url + "/annotations/" + data.responseJSON.id + "/comments", + dataType: "script" + }); + } else { + $(e.target).find("label").addClass("error"); + $("" + data.responseJSON[0] + "").insertAfter($(e.target).find("textarea")); + } + }); + } + }).bind(this)); + }, + editorExtension: function(editor) { + return editor.show = App.LegislationAnnotatable.customShow; + }, + scrollToAnchor: function() { + return { + annotationsLoaded: function() { + var anchor, ann_id, checkExist; + anchor = $(location).attr("hash"); + if (anchor && anchor.startsWith("#annotation")) { + ann_id = anchor.split("-").slice(-1); + return checkExist = setInterval((function() { + var el; + if ($("span[data-annotation-id='" + ann_id + "']").length) { + el = $("span[data-annotation-id='" + ann_id + "']"); + el.addClass("current-annotation"); + $("#comments-box").html(""); + App.LegislationAllegations.show_comments(); + $("html,body").animate({ + scrollTop: el.offset().top + }); + $.event.trigger({ + type: "renderLegislationAnnotation", + annotation_id: ann_id, + annotation_url: el.closest(".legislation-annotatable").data("legislation-annotatable-base-url"), + offset: el.offset().top + }); + clearInterval(checkExist); + } + }), 100); + } + } + }; + }, + propotionalWeight: function(v, max) { + return Math.floor(v * 5 / (max + 1)) + 1; + }, + addWeightClasses: function() { + return { + annotationsLoaded: function(annotations) { + var checkExist, last_annotation, max_weight, weights; + if (annotations.length === 0) { + return; + } + weights = annotations.map(function(ann) { + return ann.weight; + }); + max_weight = Math.max.apply(null, weights); + last_annotation = annotations[annotations.length - 1]; + return checkExist = setInterval((function() { + if ($("span[data-annotation-id='" + last_annotation.id + "']").length) { + annotations.forEach(function(annotation) { + var ann_weight, el; + ann_weight = App.LegislationAnnotatable.propotionalWeight(annotation.weight, max_weight); + el = $("span[data-annotation-id='" + annotation.id + "']"); + el.addClass("weight-" + ann_weight); + }); + clearInterval(checkExist); + } + }), 100); + } + }; + }, + initialize: function() { + var current_user_id; + $(document).off("renderLegislationAnnotation").on("renderLegislationAnnotation", App.LegislationAnnotatable.renderAnnotationComments); + $(document).off("click", "[data-annotation-id]").on("click", "[data-annotation-id]", App.LegislationAnnotatable.onClick); + $(document).off("click", "[data-cancel-annotation]").on("click", "[data-cancel-annotation]", function(e) { + e.preventDefault(); + $("#comments-box").html(""); + $("#comments-box").hide(); + App.LegislationAnnotatable.remove_highlight(); + }); + current_user_id = $("html").data("current-user-id"); + $(".legislation-annotatable").each(function() { + var ann_id, base_url; + ann_id = $(this).data("legislation-draft-version-id"); + base_url = $(this).data("legislation-annotatable-base-url"); + App.LegislationAnnotatable.app = new annotator.App().include(function() { + return { + beforeAnnotationCreated: function(ann) { + ann.legislation_draft_version_id = ann_id; + ann.permissions = ann.permissions || {}; + ann.permissions.admin = []; + } + }; + }).include(annotator.ui.main, { + element: this, + viewerExtensions: [App.LegislationAnnotatable.viewerExtension], + editorExtensions: [App.LegislationAnnotatable.editorExtension] + }).include(App.LegislationAnnotatable.scrollToAnchor).include(App.LegislationAnnotatable.addWeightClasses).include(annotator.storage.http, { + prefix: base_url, + urls: { + search: "/annotations/search" + } + }); + App.LegislationAnnotatable.app.start().then(function() { + App.LegislationAnnotatable.app.ident.identity = current_user_id; + App.LegislationAnnotatable.app.annotations.load({ + legislation_draft_version_id: ann_id + }); + }); + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/legislation_annotatable.js.coffee b/app/assets/javascripts/legislation_annotatable.js.coffee deleted file mode 100644 index fc985e749..000000000 --- a/app/assets/javascripts/legislation_annotatable.js.coffee +++ /dev/null @@ -1,205 +0,0 @@ -"use strict" - -App.LegislationAnnotatable = - - makeEditableAndHighlight: (colour) -> - sel = window.getSelection() - if sel.rangeCount and sel.getRangeAt - range = sel.getRangeAt(0) - document.designMode = "on" - if range - sel.removeAllRanges() - sel.addRange range - # Use HiliteColor since some browsers apply BackColor to the whole block - if !document.execCommand("HiliteColor", false, colour) - document.execCommand "BackColor", false, colour - document.designMode = "off" - return - - highlight: (colour) -> - try - if !document.execCommand("BackColor", false, colour) - App.LegislationAnnotatable.makeEditableAndHighlight colour - catch - App.LegislationAnnotatable.makeEditableAndHighlight colour - - return - - remove_highlight: -> - $("[data-legislation-draft-version-id] span[style]").replaceWith(-> - return $(this).contents() - ) - return - - renderAnnotationComments: (event) -> - if event.offset - $("#comments-box").css({ top: event.offset - $(".calc-comments").offset().top }) - - if App.LegislationAnnotatable.isMobile() - return - - $.ajax - method: "GET" - url: "#{event.annotation_url}/annotations/#{event.annotation_id}/comments" - dataType: "script" - - onClick: (event) -> - event.preventDefault() - event.stopPropagation() - - if App.LegislationAnnotatable.isMobile() - annotation_url = $(event.target).closest(".legislation-annotatable").data("legislation-annotatable-base-url") - window.location.href = "#{annotation_url}/annotations/#{$(this).data("annotation-id")}" - return - - $("[data-annotation-id]").removeClass("current-annotation") - - target = $(this) - - parents = target.parents(".annotator-hl") - parents_ids = parents.map (_, elem) -> - $(elem).data("annotation-id") - - annotation_id = target.data("annotation-id") - $("[data-annotation-id='#{annotation_id}']").addClass("current-annotation") - - $("#comments-box").html("") - App.LegislationAllegations.show_comments() - $("#comments-box").show() - - $.event.trigger - type: "renderLegislationAnnotation" - annotation_id: target.data("annotation-id") - annotation_url: target.closest(".legislation-annotatable").data("legislation-annotatable-base-url") - offset: target.offset()["top"] - - parents_ids.each (i, pid) -> - $.event.trigger - type: "renderLegislationAnnotation" - annotation_id: pid - annotation_url: target.closest(".legislation-annotatable").data("legislation-annotatable-base-url") - - isMobile: -> - return window.innerWidth <= 652 - - viewerExtension: (viewer) -> - viewer._onHighlightMouseover = -> - return - - customShow: (position) -> - $(this.element).html "" - # Clean comments section and open it - $("#comments-box").html "" - App.LegislationAllegations.show_comments() - $("#comments-box").show() - - annotation_url = $("[data-legislation-annotatable-base-url]").data("legislation-annotatable-base-url") - $.ajax( - method: "GET" - url: "#{annotation_url}/annotations/new" - dataType: "script").done (-> - $("#new_legislation_annotation #legislation_annotation_quote").val(this.annotation.quote) - $("#new_legislation_annotation #legislation_annotation_ranges").val(JSON.stringify(this.annotation.ranges)) - $("#comments-box").css({ top: position.top - $(".calc-comments").offset().top }) - - unless $("[data-legislation-open-phase]").data("legislation-open-phase") == false - App.LegislationAnnotatable.highlight("#7fff9a") - $("#comments-box textarea").focus() - - $("#new_legislation_annotation").on("ajax:complete", (e, data) -> - App.LegislationAnnotatable.app.destroy() - if data.status == 200 - App.LegislationAnnotatable.remove_highlight() - $("#comments-box").html("").hide() - $.ajax - method: "GET" - url: "#{annotation_url}/annotations/#{data.responseJSON.id}/comments" - dataType: "script" - else - $(e.target).find("label").addClass("error") - $("#{data.responseJSON[0]}").insertAfter($(e.target).find("textarea")) - return true - ) - return - ).bind(this) - - editorExtension: (editor) -> - editor.show = App.LegislationAnnotatable.customShow - - scrollToAnchor: -> - annotationsLoaded: -> - anchor = $(location).attr("hash") - if anchor && anchor.startsWith("#annotation") - ann_id = anchor.split("-")[-1..] - - checkExist = setInterval((-> - if $("span[data-annotation-id='#{ann_id}']").length - el = $("span[data-annotation-id='#{ann_id}']") - el.addClass("current-annotation") - $("#comments-box").html("") - App.LegislationAllegations.show_comments() - $("html,body").animate({ scrollTop: el.offset().top }) - $.event.trigger - type: "renderLegislationAnnotation" - annotation_id: ann_id - annotation_url: el.closest(".legislation-annotatable").data("legislation-annotatable-base-url") - offset: el.offset()["top"] - clearInterval checkExist - return - ), 100) - - propotionalWeight: (v, max) -> - Math.floor(v * 5 / (max + 1)) + 1 - - addWeightClasses: -> - annotationsLoaded: (annotations) -> - return if annotations.length == 0 - weights = annotations.map (ann) -> ann.weight - max_weight = Math.max.apply(null, weights) - last_annotation = annotations[annotations.length - 1] - - checkExist = setInterval((-> - if $("span[data-annotation-id='#{last_annotation.id}']").length - annotations.forEach (annotation) -> - ann_weight = App.LegislationAnnotatable.propotionalWeight(annotation.weight, max_weight) - el = $("span[data-annotation-id='#{annotation.id}']") - el.addClass("weight-#{ann_weight}") - clearInterval checkExist - return - ), 100) - - initialize: -> - $(document).off("renderLegislationAnnotation").on("renderLegislationAnnotation", App.LegislationAnnotatable.renderAnnotationComments) - $(document).off("click", "[data-annotation-id]").on("click", "[data-annotation-id]", App.LegislationAnnotatable.onClick) - $(document).off("click", "[data-cancel-annotation]").on("click", "[data-cancel-annotation]", (e) -> - e.preventDefault() - $("#comments-box").html("") - $("#comments-box").hide() - App.LegislationAnnotatable.remove_highlight() - return - ) - - current_user_id = $("html").data("current-user-id") - - $(".legislation-annotatable").each -> - ann_id = $(this).data("legislation-draft-version-id") - base_url = $(this).data("legislation-annotatable-base-url") - - App.LegislationAnnotatable.app = new annotator.App() - .include -> - beforeAnnotationCreated: (ann) -> - ann["legislation_draft_version_id"] = ann_id - ann.permissions = ann.permissions || {} - ann.permissions.admin = [] - .include(annotator.ui.main, { - element: this, - viewerExtensions: [App.LegislationAnnotatable.viewerExtension], - editorExtensions: [App.LegislationAnnotatable.editorExtension] - }) - .include(App.LegislationAnnotatable.scrollToAnchor) - .include(App.LegislationAnnotatable.addWeightClasses) - .include(annotator.storage.http, { prefix: base_url, urls: { search: "/annotations/search" } }) - - App.LegislationAnnotatable.app.start().then -> - App.LegislationAnnotatable.app.ident.identity = current_user_id - App.LegislationAnnotatable.app.annotations.load(legislation_draft_version_id: ann_id) diff --git a/app/assets/javascripts/location_changer.js b/app/assets/javascripts/location_changer.js new file mode 100644 index 000000000..e84298f03 --- /dev/null +++ b/app/assets/javascripts/location_changer.js @@ -0,0 +1,10 @@ +(function() { + "use strict"; + App.LocationChanger = { + initialize: function() { + $(".js-location-changer").on("change", function() { + window.location.assign($(this).val()); + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/location_changer.js.coffee b/app/assets/javascripts/location_changer.js.coffee deleted file mode 100644 index 409e5a3c0..000000000 --- a/app/assets/javascripts/location_changer.js.coffee +++ /dev/null @@ -1,7 +0,0 @@ -"use strict" - -App.LocationChanger = - - initialize: -> - $(".js-location-changer").on "change", -> - window.location.assign($(this).val()) diff --git a/app/assets/javascripts/managers.js b/app/assets/javascripts/managers.js new file mode 100644 index 000000000..4a87fa7e4 --- /dev/null +++ b/app/assets/javascripts/managers.js @@ -0,0 +1,32 @@ +(function() { + "use strict"; + App.Managers = { + generatePassword: function() { + var chars, possible_chars; + possible_chars = "aAbcdeEfghiJkmnpqrstuUvwxyz23456789"; + chars = Array.apply(null, { + length: 12 + }).map(function() { + var i; + i = Math.floor(Math.random() * possible_chars.length); + return possible_chars.charAt(i); + }); + return chars.join(""); + }, + togglePassword: function(type) { + $("#user_password").prop("type", type); + }, + initialize: function() { + $(".generate-random-value").on("click", function() { + $("#user_password").val(App.Managers.generatePassword()); + }); + $(".show-password").on("click", function() { + if ($("#user_password").is("input[type='password']")) { + App.Managers.togglePassword("text"); + } else { + App.Managers.togglePassword("password"); + } + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/managers.js.coffee b/app/assets/javascripts/managers.js.coffee deleted file mode 100644 index 3ec7683c1..000000000 --- a/app/assets/javascripts/managers.js.coffee +++ /dev/null @@ -1,25 +0,0 @@ -"use strict" - -App.Managers = - - generatePassword: -> - possible_chars = "aAbcdeEfghiJkmnpqrstuUvwxyz23456789" - - chars = Array.apply(null, length: 12).map -> - i = Math.floor(Math.random() * possible_chars.length) - possible_chars.charAt(i) - - chars.join("") - - togglePassword: (type) -> - $("#user_password").prop "type", type - - initialize: -> - $(".generate-random-value").on "click", -> - $("#user_password").val(App.Managers.generatePassword()) - - $(".show-password").on "click", -> - if $("#user_password").is("input[type='password']") - App.Managers.togglePassword("text") - else - App.Managers.togglePassword("password") diff --git a/app/assets/javascripts/map.js b/app/assets/javascripts/map.js new file mode 100644 index 000000000..d1882cc5e --- /dev/null +++ b/app/assets/javascripts/map.js @@ -0,0 +1,131 @@ +(function() { + "use strict"; + App.Map = { + initialize: function() { + $("*[data-map]").each(function() { + App.Map.initializeMap(this); + }); + $(".js-toggle-map").on({ + click: function() { + App.Map.toggleMap(); + } + }); + }, + initializeMap: function(element) { + var addMarkerInvestments, clearFormfields, createMarker, editable, getPopupContent, latitudeInputSelector, longitudeInputSelector, map, mapAttribution, mapCenterLatLng, mapCenterLatitude, mapCenterLongitude, mapTilesProvider, marker, markerIcon, markerLatitude, markerLongitude, moveOrPlaceMarker, openMarkerPopup, removeMarker, removeMarkerSelector, updateFormfields, zoom, zoomInputSelector; + App.Map.cleanInvestmentCoordinates(element); + mapCenterLatitude = $(element).data("map-center-latitude"); + mapCenterLongitude = $(element).data("map-center-longitude"); + markerLatitude = $(element).data("marker-latitude"); + markerLongitude = $(element).data("marker-longitude"); + zoom = $(element).data("map-zoom"); + mapTilesProvider = $(element).data("map-tiles-provider"); + mapAttribution = $(element).data("map-tiles-provider-attribution"); + latitudeInputSelector = $(element).data("latitude-input-selector"); + longitudeInputSelector = $(element).data("longitude-input-selector"); + zoomInputSelector = $(element).data("zoom-input-selector"); + removeMarkerSelector = $(element).data("marker-remove-selector"); + addMarkerInvestments = $(element).data("marker-investments-coordinates"); + editable = $(element).data("marker-editable"); + marker = null; + markerIcon = L.divIcon({ + className: "map-marker", + iconSize: [30, 30], + iconAnchor: [15, 40], + html: '
    ' + }); + createMarker = function(latitude, longitude) { + var markerLatLng; + markerLatLng = new L.LatLng(latitude, longitude); + marker = L.marker(markerLatLng, { + icon: markerIcon, + draggable: editable + }); + if (editable) { + marker.on("dragend", updateFormfields); + } + marker.addTo(map); + return marker; + }; + removeMarker = function(e) { + e.preventDefault(); + if (marker) { + map.removeLayer(marker); + marker = null; + } + clearFormfields(); + }; + moveOrPlaceMarker = function(e) { + if (marker) { + marker.setLatLng(e.latlng); + } else { + marker = createMarker(e.latlng.lat, e.latlng.lng); + } + updateFormfields(); + }; + updateFormfields = function() { + $(latitudeInputSelector).val(marker.getLatLng().lat); + $(longitudeInputSelector).val(marker.getLatLng().lng); + $(zoomInputSelector).val(map.getZoom()); + }; + clearFormfields = function() { + $(latitudeInputSelector).val(""); + $(longitudeInputSelector).val(""); + $(zoomInputSelector).val(""); + }; + openMarkerPopup = function(e) { + marker = e.target; + $.ajax("/investments/" + marker.options.id + "/json_data", { + type: "GET", + dataType: "json", + success: function(data) { + e.target.bindPopup(getPopupContent(data)).openPopup(); + } + }); + }; + getPopupContent = function(data) { + return "" + data.investment_title + ""; + }; + mapCenterLatLng = new L.LatLng(mapCenterLatitude, mapCenterLongitude); + map = L.map(element.id).setView(mapCenterLatLng, zoom); + L.tileLayer(mapTilesProvider, { + attribution: mapAttribution + }).addTo(map); + if (markerLatitude && markerLongitude && !addMarkerInvestments) { + marker = createMarker(markerLatitude, markerLongitude); + } + if (editable) { + $(removeMarkerSelector).on("click", removeMarker); + map.on("zoomend", updateFormfields); + map.on("click", moveOrPlaceMarker); + } + if (addMarkerInvestments) { + addMarkerInvestments.forEach(function(coordinates) { + if (App.Map.validCoordinates(coordinates)) { + marker = createMarker(coordinates.lat, coordinates.long); + marker.options.id = coordinates.investment_id; + marker.on("click", openMarkerPopup); + } + }); + } + }, + toggleMap: function() { + $(".map").toggle(); + $(".js-location-map-remove-marker").toggle(); + }, + cleanInvestmentCoordinates: function(element) { + var clean_markers, markers; + markers = $(element).attr("data-marker-investments-coordinates"); + if (markers != null) { + clean_markers = markers.replace(/-?(\*+)/g, null); + $(element).attr("data-marker-investments-coordinates", clean_markers); + } + }, + validCoordinates: function(coordinates) { + return App.Map.isNumeric(coordinates.lat) && App.Map.isNumeric(coordinates.long); + }, + isNumeric: function(n) { + return !isNaN(parseFloat(n)) && isFinite(n); + } + }; +}).call(this); diff --git a/app/assets/javascripts/map.js.coffee b/app/assets/javascripts/map.js.coffee deleted file mode 100644 index 25ef1dbbf..000000000 --- a/app/assets/javascripts/map.js.coffee +++ /dev/null @@ -1,120 +0,0 @@ -"use strict" - -App.Map = - - initialize: -> - $("*[data-map]").each -> - App.Map.initializeMap(this) - - $(".js-toggle-map").on - click: -> - App.Map.toggleMap() - - initializeMap: (element) -> - App.Map.cleanInvestmentCoordinates(element) - - mapCenterLatitude = $(element).data("map-center-latitude") - mapCenterLongitude = $(element).data("map-center-longitude") - markerLatitude = $(element).data("marker-latitude") - markerLongitude = $(element).data("marker-longitude") - zoom = $(element).data("map-zoom") - mapTilesProvider = $(element).data("map-tiles-provider") - mapAttribution = $(element).data("map-tiles-provider-attribution") - latitudeInputSelector = $(element).data("latitude-input-selector") - longitudeInputSelector = $(element).data("longitude-input-selector") - zoomInputSelector = $(element).data("zoom-input-selector") - removeMarkerSelector = $(element).data("marker-remove-selector") - addMarkerInvestments = $(element).data("marker-investments-coordinates") - editable = $(element).data("marker-editable") - marker = null - markerIcon = L.divIcon( - className: "map-marker" - iconSize: [30, 30] - iconAnchor: [15, 40] - html: '
    ' - ) - - createMarker = (latitude, longitude) -> - markerLatLng = new (L.LatLng)(latitude, longitude) - marker = L.marker(markerLatLng, { icon: markerIcon, draggable: editable }) - if editable - marker.on "dragend", updateFormfields - marker.addTo(map) - return marker - - removeMarker = (e) -> - e.preventDefault() - if marker - map.removeLayer(marker) - marker = null - clearFormfields() - return - - moveOrPlaceMarker = (e) -> - if marker - marker.setLatLng(e.latlng) - else - marker = createMarker(e.latlng.lat, e.latlng.lng) - - updateFormfields() - return - - updateFormfields = -> - $(latitudeInputSelector).val marker.getLatLng().lat - $(longitudeInputSelector).val marker.getLatLng().lng - $(zoomInputSelector).val map.getZoom() - return - - clearFormfields = -> - $(latitudeInputSelector).val "" - $(longitudeInputSelector).val "" - $(zoomInputSelector).val "" - return - - openMarkerPopup = (e) -> - marker = e.target - - $.ajax "/investments/#{marker.options["id"]}/json_data", - type: "GET" - dataType: "json" - success: (data) -> - e.target.bindPopup(getPopupContent(data)).openPopup() - - getPopupContent = (data) -> - "#{data["investment_title"]}" - - mapCenterLatLng = new (L.LatLng)(mapCenterLatitude, mapCenterLongitude) - map = L.map(element.id).setView(mapCenterLatLng, zoom) - L.tileLayer(mapTilesProvider, attribution: mapAttribution).addTo map - - if markerLatitude && markerLongitude && !addMarkerInvestments - marker = createMarker(markerLatitude, markerLongitude) - - if editable - $(removeMarkerSelector).on "click", removeMarker - map.on "zoomend", updateFormfields - map.on "click", moveOrPlaceMarker - - if addMarkerInvestments - addMarkerInvestments.forEach (coordinates) -> - if App.Map.validCoordinates(coordinates) - marker = createMarker(coordinates.lat, coordinates.long) - marker.options["id"] = coordinates.investment_id - - marker.on "click", openMarkerPopup - - toggleMap: -> - $(".map").toggle() - $(".js-location-map-remove-marker").toggle() - - cleanInvestmentCoordinates: (element) -> - markers = $(element).attr("data-marker-investments-coordinates") - if markers? - clean_markers = markers.replace(/-?(\*+)/g, null) - $(element).attr("data-marker-investments-coordinates", clean_markers) - - validCoordinates: (coordinates) -> - App.Map.isNumeric(coordinates.lat) && App.Map.isNumeric(coordinates.long) - - isNumeric: (n) -> - !isNaN(parseFloat(n)) && isFinite(n) diff --git a/app/assets/javascripts/markdown_editor.js b/app/assets/javascripts/markdown_editor.js new file mode 100644 index 000000000..c0a587e31 --- /dev/null +++ b/app/assets/javascripts/markdown_editor.js @@ -0,0 +1,51 @@ +(function() { + "use strict"; + App.MarkdownEditor = { + refresh_preview: function(element, md) { + var result, textarea_content; + textarea_content = App.MarkdownEditor.find_textarea(element).val(); + result = md.render(textarea_content); + element.find(".markdown-preview").html(result); + }, + // Multi-locale (translatable) form fields work by hiding inputs of locales + // which are not "active". + find_textarea: function(editor) { + return editor.find("textarea"); + }, + initialize: function() { + $(".markdown-editor").each(function() { + var editor, md; + md = window.markdownit({ + html: true, + breaks: true, + typographer: true + }); + editor = $(this); + editor.on("input", function() { + App.MarkdownEditor.refresh_preview($(this), md); + $(".legislation-draft-versions-edit .warning").show(); + }); + editor.find("textarea").on("scroll", function() { + editor.find(".markdown-preview").scrollTop($(this).scrollTop()); + }); + editor.find(".fullscreen-toggle").on("click", function() { + var span; + editor.toggleClass("fullscreen"); + $(".fullscreen-container").toggleClass("medium-8", "medium-12"); + span = $(this).find("span"); + if (span.html() === span.data("open-text")) { + span.html(span.data("closed-text")); + } else { + span.html(span.data("open-text")); + } + if (editor.hasClass("fullscreen")) { + App.MarkdownEditor.find_textarea(editor).height($(window).height() - 100); + App.MarkdownEditor.refresh_preview(editor, md); + } else { + App.MarkdownEditor.find_textarea(editor).height("10em"); + } + }); + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/markdown_editor.js.coffee b/app/assets/javascripts/markdown_editor.js.coffee deleted file mode 100644 index eb10c3108..000000000 --- a/app/assets/javascripts/markdown_editor.js.coffee +++ /dev/null @@ -1,47 +0,0 @@ -"use strict" - -App.MarkdownEditor = - - refresh_preview: (element, md) -> - textarea_content = App.MarkdownEditor.find_textarea(element).val() - result = md.render(textarea_content) - element.find(".markdown-preview").html(result) - - # Multi-locale (translatable) form fields work by hiding inputs of locales - # which are not "active". - find_textarea: (editor) -> - editor.find("textarea") - - initialize: -> - $(".markdown-editor").each -> - md = window.markdownit({ - html: true, - breaks: true, - typographer: true, - }) - - editor = $(this) - - editor.on "input", -> - App.MarkdownEditor.refresh_preview($(this), md) - $(".legislation-draft-versions-edit .warning").show() - return - - editor.find("textarea").on "scroll", -> - editor.find(".markdown-preview").scrollTop($(this).scrollTop()) - - editor.find(".fullscreen-toggle").on "click", -> - editor.toggleClass("fullscreen") - $(".fullscreen-container").toggleClass("medium-8", "medium-12") - span = $(this).find("span") - - if(span.html() == span.data("open-text")) - span.html(span.data("closed-text")) - else - span.html(span.data("open-text")) - - if editor.hasClass("fullscreen") - App.MarkdownEditor.find_textarea(editor).height($(window).height() - 100) - App.MarkdownEditor.refresh_preview(editor, md) - else - App.MarkdownEditor.find_textarea(editor).height("10em") diff --git a/app/assets/javascripts/modal_download.js b/app/assets/javascripts/modal_download.js new file mode 100644 index 000000000..debd3672a --- /dev/null +++ b/app/assets/javascripts/modal_download.js @@ -0,0 +1,14 @@ +(function() { + "use strict"; + App.ModalDownload = { + enableButton: function() { + $("#js-download-modal-submit").attr("disabled", false); + $("#js-download-modal-submit").removeClass("disabled"); + }, + initialize: function() { + $("#js-download-modal-submit").on("click", function() { + setTimeout(App.ModalDownload.enableButton, 2000); + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/modal_download.js.coffee b/app/assets/javascripts/modal_download.js.coffee deleted file mode 100644 index a1e36010a..000000000 --- a/app/assets/javascripts/modal_download.js.coffee +++ /dev/null @@ -1,11 +0,0 @@ -"use strict" - -App.ModalDownload = - - enableButton: -> - $("#js-download-modal-submit").attr("disabled", false) - $("#js-download-modal-submit").removeClass("disabled") - - initialize: -> - $("#js-download-modal-submit").on "click", -> - setTimeout(App.ModalDownload.enableButton, 2000) diff --git a/app/assets/javascripts/moderator_budget_investments.js b/app/assets/javascripts/moderator_budget_investments.js new file mode 100644 index 000000000..035f13ecc --- /dev/null +++ b/app/assets/javascripts/moderator_budget_investments.js @@ -0,0 +1,12 @@ +(function() { + "use strict"; + App.ModeratorBudgetInvestments = { + add_class_faded: function(id) { + $("#" + id).addClass("faded"); + $("#comments").addClass("faded"); + }, + hide_moderator_actions: function(id) { + $("#" + id + " .js-moderator-investment-actions:first").hide(); + } + }; +}).call(this); diff --git a/app/assets/javascripts/moderator_budget_investments.js.coffee b/app/assets/javascripts/moderator_budget_investments.js.coffee deleted file mode 100644 index 4bcb49ad1..000000000 --- a/app/assets/javascripts/moderator_budget_investments.js.coffee +++ /dev/null @@ -1,10 +0,0 @@ -"use strict" - -App.ModeratorBudgetInvestments = - - add_class_faded: (id) -> - $("##{id}").addClass("faded") - $("#comments").addClass("faded") - - hide_moderator_actions: (id) -> - $("##{id} .js-moderator-investment-actions:first").hide() diff --git a/app/assets/javascripts/moderator_comment.js b/app/assets/javascripts/moderator_comment.js new file mode 100644 index 000000000..1e8c9bd59 --- /dev/null +++ b/app/assets/javascripts/moderator_comment.js @@ -0,0 +1,11 @@ +(function() { + "use strict"; + App.ModeratorComments = { + add_class_faded: function(id) { + $("#" + id + " .comment-body:first").addClass("faded"); + }, + hide_moderator_actions: function(id) { + $("#" + id + " .js-moderator-comment-actions").hide(); + } + }; +}).call(this); diff --git a/app/assets/javascripts/moderator_comment.js.coffee b/app/assets/javascripts/moderator_comment.js.coffee deleted file mode 100644 index 0e866d762..000000000 --- a/app/assets/javascripts/moderator_comment.js.coffee +++ /dev/null @@ -1,9 +0,0 @@ -"use strict" - -App.ModeratorComments = - - add_class_faded: (id) -> - $("##{id} .comment-body:first").addClass("faded") - - hide_moderator_actions: (id) -> - $("##{id} .js-moderator-comment-actions").hide() diff --git a/app/assets/javascripts/moderator_debates.js b/app/assets/javascripts/moderator_debates.js new file mode 100644 index 000000000..9d13f87a5 --- /dev/null +++ b/app/assets/javascripts/moderator_debates.js @@ -0,0 +1,12 @@ +(function() { + "use strict"; + App.ModeratorDebates = { + add_class_faded: function(id) { + $("#" + id).addClass("faded"); + $("#comments").addClass("faded"); + }, + hide_moderator_actions: function(id) { + $("#" + id + " .js-moderator-debate-actions:first").hide(); + } + }; +}).call(this); diff --git a/app/assets/javascripts/moderator_debates.js.coffee b/app/assets/javascripts/moderator_debates.js.coffee deleted file mode 100644 index 39bd7df10..000000000 --- a/app/assets/javascripts/moderator_debates.js.coffee +++ /dev/null @@ -1,10 +0,0 @@ -"use strict" - -App.ModeratorDebates = - - add_class_faded: (id) -> - $("##{id}").addClass("faded") - $("#comments").addClass("faded") - - hide_moderator_actions: (id) -> - $("##{id} .js-moderator-debate-actions:first").hide() diff --git a/app/assets/javascripts/moderator_proposal_notifications.js b/app/assets/javascripts/moderator_proposal_notifications.js new file mode 100644 index 000000000..eb7bdefef --- /dev/null +++ b/app/assets/javascripts/moderator_proposal_notifications.js @@ -0,0 +1,11 @@ +(function() { + "use strict"; + App.ModeratorProposalNotifications = { + add_class_faded: function(id) { + $("#" + id).addClass("faded"); + }, + hide_moderator_actions: function(id) { + $("#" + id + " .js-moderator-proposal-notifications-actions:first").hide(); + } + }; +}).call(this); diff --git a/app/assets/javascripts/moderator_proposal_notifications.js.coffee b/app/assets/javascripts/moderator_proposal_notifications.js.coffee deleted file mode 100644 index 12c9040d1..000000000 --- a/app/assets/javascripts/moderator_proposal_notifications.js.coffee +++ /dev/null @@ -1,9 +0,0 @@ -"use strict" - -App.ModeratorProposalNotifications = - - add_class_faded: (id) -> - $("##{id}").addClass("faded") - - hide_moderator_actions: (id) -> - $("##{id} .js-moderator-proposal-notifications-actions:first").hide() diff --git a/app/assets/javascripts/moderator_proposals.js b/app/assets/javascripts/moderator_proposals.js new file mode 100644 index 000000000..93fb100dd --- /dev/null +++ b/app/assets/javascripts/moderator_proposals.js @@ -0,0 +1,12 @@ +(function() { + "use strict"; + App.ModeratorProposals = { + add_class_faded: function(id) { + $("#" + id).addClass("faded"); + $("#comments").addClass("faded"); + }, + hide_moderator_actions: function(id) { + $("#" + id + " .js-moderator-proposals-actions:first").hide(); + } + }; +}).call(this); diff --git a/app/assets/javascripts/moderator_proposals.js.coffee b/app/assets/javascripts/moderator_proposals.js.coffee deleted file mode 100644 index 2920ab58f..000000000 --- a/app/assets/javascripts/moderator_proposals.js.coffee +++ /dev/null @@ -1,10 +0,0 @@ -"use strict" - -App.ModeratorProposals = - - add_class_faded: (id) -> - $("##{id}").addClass("faded") - $("#comments").addClass("faded") - - hide_moderator_actions: (id) -> - $("##{id} .js-moderator-proposals-actions:first").hide() diff --git a/app/assets/javascripts/polls.js b/app/assets/javascripts/polls.js new file mode 100644 index 000000000..6a9f50079 --- /dev/null +++ b/app/assets/javascripts/polls.js @@ -0,0 +1,46 @@ +(function() { + "use strict"; + App.Polls = { + generateToken: function() { + var strings; + strings = Array.apply(null, { + length: 6 + }).map(function() { + return Math.random().toString(36).substr(2); // remove `0.` + }); + return strings.join("").substring(0, 64); + }, + replaceToken: function(token) { + $(".js-question-answer").each(function() { + var token_param; + token_param = this.search.slice(-6); + if (token_param === "token=") { + this.href = this.href + token; + } + }); + }, + initialize: function() { + var token; + token = App.Polls.generateToken(); + App.Polls.replaceToken(token); + $(".zoom-link").on("click", function(event) { + var answer; + answer = $(event.target).closest("div.answer"); + + if ($(answer).hasClass("medium-6")) { + $(answer).removeClass("medium-6"); + $(answer).addClass("answer-divider"); + if (!$(answer).hasClass("first")) { + $(answer).insertBefore($(answer).prev("div.answer")); + } + } else { + $(answer).addClass("medium-6"); + $(answer).removeClass("answer-divider"); + if (!$(answer).hasClass("first")) { + $(answer).insertAfter($(answer).next("div.answer")); + } + } + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/polls.js.coffee b/app/assets/javascripts/polls.js.coffee deleted file mode 100644 index db6c0619c..000000000 --- a/app/assets/javascripts/polls.js.coffee +++ /dev/null @@ -1,32 +0,0 @@ -"use strict" - -App.Polls = - generateToken: -> - strings = Array.apply(null, length: 6).map -> - Math.random().toString(36).substr(2) # remove `0.` - - strings.join("").substring(0, 64) - - replaceToken: (token) -> - $(".js-question-answer").each -> - token_param = this.search.slice(-6) - if token_param == "token=" - this.href = this.href + token - - initialize: -> - token = App.Polls.generateToken() - App.Polls.replaceToken(token) - - $(".zoom-link").on "click", (event) -> - answer = $(event.target).closest("div.answer") - - if $(answer).hasClass("medium-6") - $(answer).removeClass("medium-6") - $(answer).addClass("answer-divider") - unless $(answer).hasClass("first") - $(answer).insertBefore($(answer).prev("div.answer")) - else - $(answer).addClass("medium-6") - $(answer).removeClass("answer-divider") - unless $(answer).hasClass("first") - $(answer).insertAfter($(answer).next("div.answer")) diff --git a/app/assets/javascripts/polls_admin.js b/app/assets/javascripts/polls_admin.js new file mode 100644 index 000000000..87e55756b --- /dev/null +++ b/app/assets/javascripts/polls_admin.js @@ -0,0 +1,20 @@ +(function() { + "use strict"; + App.PollsAdmin = { + initialize: function() { + $("select[class='js-poll-shifts']").on({ + change: function() { + switch ($(this).val()) { + case "vote_collection": + $("select[class='js-shift-vote-collection-dates']").show(); + $("select[class='js-shift-recount-scrutiny-dates']").hide(); + break; + case "recount_scrutiny": + $("select[class='js-shift-recount-scrutiny-dates']").show(); + $("select[class='js-shift-vote-collection-dates']").hide(); + } + } + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/polls_admin.js.coffee b/app/assets/javascripts/polls_admin.js.coffee deleted file mode 100644 index fb5e954d4..000000000 --- a/app/assets/javascripts/polls_admin.js.coffee +++ /dev/null @@ -1,15 +0,0 @@ -"use strict" - -App.PollsAdmin = - - initialize: -> - $("select[class='js-poll-shifts']").on - change: -> - switch ($(this).val()) - when "vote_collection" - $("select[class='js-shift-vote-collection-dates']").show() - $("select[class='js-shift-recount-scrutiny-dates']").hide() - break - when "recount_scrutiny" - $("select[class='js-shift-recount-scrutiny-dates']").show() - $("select[class='js-shift-vote-collection-dates']").hide() diff --git a/app/assets/javascripts/prevent_double_submission.js b/app/assets/javascripts/prevent_double_submission.js new file mode 100644 index 000000000..40b454d46 --- /dev/null +++ b/app/assets/javascripts/prevent_double_submission.js @@ -0,0 +1,48 @@ +(function() { + "use strict"; + App.PreventDoubleSubmission = { + disable_buttons: function(buttons) { + setTimeout(function() { + buttons.each(function() { + var button, loading, ref; + button = $(this); + if (!button.hasClass("disabled")) { + loading = (ref = button.data("loading")) != null ? ref : "..."; + button.addClass("disabled").attr("disabled", "disabled"); + button.data("text", button.val()); + button.val(loading); + } + }); + }, 1); + }, + reset_buttons: function(buttons) { + buttons.each(function() { + var button, button_text; + button = $(this); + if (button.hasClass("disabled")) { + button_text = button.data("text"); + button.removeClass("disabled").attr("disabled", null); + if (button_text) { + button.val(button_text); + button.data("text", null); + } + } + }); + }, + initialize: function() { + $("form").on("submit", function(event) { + var buttons; + if (!(event.target.id === "new_officing_voter" || event.target.id === "admin_download_emails")) { + buttons = $(this).find(":button, :submit"); + App.PreventDoubleSubmission.disable_buttons(buttons); + } + }).on("ajax:success", function(event) { + var buttons; + if (!(event.target.id === "new_officing_voter" || event.target.id === "admin_download_emails")) { + buttons = $(this).find(":button, :submit"); + App.PreventDoubleSubmission.reset_buttons(buttons); + } + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/prevent_double_submission.js.coffee b/app/assets/javascripts/prevent_double_submission.js.coffee deleted file mode 100644 index acfaa1068..000000000 --- a/app/assets/javascripts/prevent_double_submission.js.coffee +++ /dev/null @@ -1,38 +0,0 @@ -"use strict" - -App.PreventDoubleSubmission = - disable_buttons: (buttons) -> - setTimeout -> - buttons.each -> - button = $(this) - unless button.hasClass("disabled") - loading = button.data("loading") ? "..." - button.addClass("disabled").attr("disabled", "disabled") - button.data("text", button.val()) - button.val(loading) - , 1 - - reset_buttons: (buttons) -> - buttons.each -> - button = $(this) - if button.hasClass("disabled") - button_text = button.data("text") - button.removeClass("disabled").attr("disabled", null) - if button_text - button.val(button_text) - button.data("text", null) - - initialize: -> - $("form").on("submit", (event) -> - unless event.target.id == "new_officing_voter" || - event.target.id == "admin_download_emails" - - buttons = $(this).find(":button, :submit") - App.PreventDoubleSubmission.disable_buttons(buttons) - ).on("ajax:success", (event) -> - unless event.target.id == "new_officing_voter" || - event.target.id == "admin_download_emails" - - buttons = $(this).find(":button, :submit") - App.PreventDoubleSubmission.reset_buttons(buttons) - ) diff --git a/app/assets/javascripts/questions.js b/app/assets/javascripts/questions.js new file mode 100644 index 000000000..5ce74d1fd --- /dev/null +++ b/app/assets/javascripts/questions.js @@ -0,0 +1,13 @@ +(function() { + "use strict"; + App.Questions = { + nestedQuestions: function() { + $(".js-questions").on("cocoon:after-insert", function(e, new_question) { + App.Answers.initializeAnswers($(new_question).find(".js-answers")); + }); + }, + initialize: function() { + App.Questions.nestedQuestions(); + } + }; +}).call(this); diff --git a/app/assets/javascripts/questions.js.coffee b/app/assets/javascripts/questions.js.coffee deleted file mode 100644 index cf396bffc..000000000 --- a/app/assets/javascripts/questions.js.coffee +++ /dev/null @@ -1,10 +0,0 @@ -"use strict" - -App.Questions = - - nestedQuestions: -> - $(".js-questions").on "cocoon:after-insert", (e, new_question) -> - App.Answers.initializeAnswers($(new_question).find(".js-answers")) - - initialize: -> - App.Questions.nestedQuestions() diff --git a/app/assets/javascripts/registration_form.js b/app/assets/javascripts/registration_form.js new file mode 100644 index 000000000..ecb827926 --- /dev/null +++ b/app/assets/javascripts/registration_form.js @@ -0,0 +1,32 @@ +(function() { + "use strict"; + App.RegistrationForm = { + initialize: function() { + var clearUsernameMessage, showUsernameMessage, usernameInput, validateUsername; + usernameInput = $("form#new_user[action=\"/users\"] input#user_username"); + clearUsernameMessage = function() { + $("small").remove(); + }; + showUsernameMessage = function(response) { + var klass; + klass = response.available ? "no-error" : "error"; + usernameInput.after($("" + response.message + "")); + }; + validateUsername = function(username) { + var request; + request = $.get("/user/registrations/check_username?username=" + username); + request.done(function(response) { + showUsernameMessage(response); + }); + }; + usernameInput.on("focusout", function() { + var username; + clearUsernameMessage(); + username = usernameInput.val(); + if (username !== "") { + validateUsername(username); + } + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/registration_form.js.coffee b/app/assets/javascripts/registration_form.js.coffee deleted file mode 100644 index dec7c4e1f..000000000 --- a/app/assets/javascripts/registration_form.js.coffee +++ /dev/null @@ -1,24 +0,0 @@ -"use strict" - -App.RegistrationForm = - - initialize: -> - usernameInput = $("form#new_user[action=\"/users\"] input#user_username") - - clearUsernameMessage = -> - $("small").remove() - - showUsernameMessage = (response) -> - klass = if response.available then "no-error" else "error" - usernameInput.after $("#{response.message}") - - validateUsername = (username) -> - request = $.get "/user/registrations/check_username?username=#{username}" - request.done (response) -> - showUsernameMessage(response) - - - usernameInput.on "focusout", -> - clearUsernameMessage() - username = usernameInput.val() - validateUsername(username) if username != "" diff --git a/app/assets/javascripts/send_admin_notification_alert.js b/app/assets/javascripts/send_admin_notification_alert.js new file mode 100644 index 000000000..6dc7b36f2 --- /dev/null +++ b/app/assets/javascripts/send_admin_notification_alert.js @@ -0,0 +1,10 @@ +(function() { + "use strict"; + App.SendAdminNotificationAlert = { + initialize: function() { + $("#js-send-admin_notification-alert").on("click", function() { + return confirm(this.dataset.alert); + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/send_admin_notification_alert.js.coffee b/app/assets/javascripts/send_admin_notification_alert.js.coffee deleted file mode 100644 index 5bb03f7e7..000000000 --- a/app/assets/javascripts/send_admin_notification_alert.js.coffee +++ /dev/null @@ -1,6 +0,0 @@ -"use strict" - -App.SendAdminNotificationAlert = - initialize: -> - $("#js-send-admin_notification-alert").on "click", -> - confirm(this.dataset.alert) diff --git a/app/assets/javascripts/send_newsletter_alert.js b/app/assets/javascripts/send_newsletter_alert.js new file mode 100644 index 000000000..fa5a605af --- /dev/null +++ b/app/assets/javascripts/send_newsletter_alert.js @@ -0,0 +1,10 @@ +(function() { + "use strict"; + App.SendNewsletterAlert = { + initialize: function() { + $("#js-send-newsletter-alert").on("click", function() { + return confirm(this.dataset.alert); + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/send_newsletter_alert.js.coffee b/app/assets/javascripts/send_newsletter_alert.js.coffee deleted file mode 100644 index 834d90778..000000000 --- a/app/assets/javascripts/send_newsletter_alert.js.coffee +++ /dev/null @@ -1,6 +0,0 @@ -"use strict" - -App.SendNewsletterAlert = - initialize: -> - $("#js-send-newsletter-alert").on "click", -> - confirm(this.dataset.alert) diff --git a/app/assets/javascripts/settings.js b/app/assets/javascripts/settings.js new file mode 100644 index 000000000..cea8fcda7 --- /dev/null +++ b/app/assets/javascripts/settings.js @@ -0,0 +1,17 @@ +(function() { + "use strict"; + App.Settings = { + initialize: function() { + $("#settings-tabs").on("change.zf.tabs", function() { + var map_container; + if ($("#tab-map-configuration:visible").length) { + map_container = L.DomUtil.get("admin-map"); + if (map_container !== null) { + map_container._leaflet_id = null; + } + App.Map.initialize(); + } + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/settings.js.coffee b/app/assets/javascripts/settings.js.coffee deleted file mode 100644 index cb3313d44..000000000 --- a/app/assets/javascripts/settings.js.coffee +++ /dev/null @@ -1,12 +0,0 @@ -"use strict" - -App.Settings = - - initialize: -> - - $("#settings-tabs").on "change.zf.tabs", -> - if $("#tab-map-configuration:visible").length - map_container = L.DomUtil.get "admin-map" - unless map_container is null - map_container._leaflet_id = null - App.Map.initialize() diff --git a/app/assets/javascripts/social_share.js b/app/assets/javascripts/social_share.js new file mode 100644 index 000000000..34ae229ac --- /dev/null +++ b/app/assets/javascripts/social_share.js @@ -0,0 +1,10 @@ +(function() { + "use strict"; + App.SocialShare = { + initialize: function() { + $(".social-share-button a").each(function() { + $(this).append("" + ($(this).data("site")) + ""); + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/social_share.js.coffee b/app/assets/javascripts/social_share.js.coffee deleted file mode 100644 index 4a89dfbe4..000000000 --- a/app/assets/javascripts/social_share.js.coffee +++ /dev/null @@ -1,7 +0,0 @@ -"use strict" - -App.SocialShare = - - initialize: -> - $(".social-share-button a").each -> - $(this).append("#{$(this).data("site")}") diff --git a/app/assets/javascripts/sortable.js b/app/assets/javascripts/sortable.js new file mode 100644 index 000000000..587ef598a --- /dev/null +++ b/app/assets/javascripts/sortable.js @@ -0,0 +1,37 @@ +(function() { + "use strict"; + App.Sortable = { + initialize: function() { + $(".sortable").sortable({ + update: function() { + var new_order; + new_order = $(this).sortable("toArray", { + attribute: "data-answer-id" + }); + $.ajax({ + url: $(".sortable").data("js-url"), + data: { + ordered_list: new_order + }, + type: "POST" + }); + } + }); + $(".sortable-priotirized-votation").sortable({ + update: function() { + var new_order; + new_order = $(this).sortable("toArray", { + attribute: "data-answer-id" + }); + $.ajax({ + url: $(this).data("js-url"), + data: { + ordered_list: new_order + }, + type: "POST" + }); + } + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/sortable.js.coffee b/app/assets/javascripts/sortable.js.coffee deleted file mode 100644 index 09d3050f4..000000000 --- a/app/assets/javascripts/sortable.js.coffee +++ /dev/null @@ -1,19 +0,0 @@ -"use strict" - -App.Sortable = - initialize: -> - $(".sortable").sortable - update: -> - new_order = $(this).sortable("toArray", { attribute: "data-answer-id" }) - $.ajax - url: $(".sortable").data("js-url"), - data: { ordered_list: new_order }, - type: "POST" - - $(".sortable-priotirized-votation").sortable - update: -> - new_order = $(this).sortable("toArray", { attribute: "data-answer-id" }) - $.ajax - url: $(this).data("js-url"), - data: { ordered_list: new_order }, - type: "POST" diff --git a/app/assets/javascripts/stat_graphs.js b/app/assets/javascripts/stat_graphs.js index 479e20287..d3aa121fa 100644 --- a/app/assets/javascripts/stat_graphs.js +++ b/app/assets/javascripts/stat_graphs.js @@ -9,7 +9,7 @@ var initialize_stats_modules = function() { App.Stats.initialize(); }; -$(function(){ +$(function() { "use strict"; $(document).ready(initialize_stats_modules); diff --git a/app/assets/javascripts/stats.js b/app/assets/javascripts/stats.js new file mode 100644 index 000000000..fe7e46d8b --- /dev/null +++ b/app/assets/javascripts/stats.js @@ -0,0 +1,36 @@ +(function() { + "use strict"; + // Helper for generate C3.js graphs + //---------------------------------------------------------------------- + var buildGraph; + + buildGraph = function(el) { + var conf, url; + url = $(el).data("graph"); + conf = { + bindto: el, + data: { + x: "x", + url: url, + mimeType: "json" + }, + axis: { + x: { + type: "timeseries", + tick: { + format: "%Y-%m-%d" + } + } + } + }; + c3.generate(conf); + }; + + App.Stats = { + initialize: function() { + $("[data-graph]").each(function() { + buildGraph(this); + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/stats.js.coffee b/app/assets/javascripts/stats.js.coffee deleted file mode 100644 index 0cb687230..000000000 --- a/app/assets/javascripts/stats.js.coffee +++ /dev/null @@ -1,13 +0,0 @@ -"use strict" - -# Helper for generate C3.js graphs -#---------------------------------------------------------------------- - -buildGraph = (el) -> - url = $(el).data "graph" - conf = bindto: el, data: { x: "x", url: url, mimeType: "json" }, axis: { x: { type: "timeseries", tick: { format: "%Y-%m-%d" } } } - c3.generate conf - -App.Stats = - initialize: -> - $("[data-graph]").each -> buildGraph(this) diff --git a/app/assets/javascripts/suggest.js b/app/assets/javascripts/suggest.js new file mode 100644 index 000000000..1a3ce24b5 --- /dev/null +++ b/app/assets/javascripts/suggest.js @@ -0,0 +1,37 @@ +(function() { + "use strict"; + App.Suggest = { + initialize: function() { + $("[data-js-suggest-result]").each(function() { + var $this, callback, timer; + $this = $(this); + callback = function() { + $.ajax({ + url: $this.data("js-url"), + data: { + search: $this.val() + }, + type: "GET", + dataType: "html", + success: function(stHtml) { + var js_suggest_selector, locale; + js_suggest_selector = $this.data("js-suggest"); + + if (js_suggest_selector.startsWith(".")) { + locale = $this.closest(".translatable-fields").data("locale"); + js_suggest_selector += "[data-locale=" + locale + "]"; + } + $(js_suggest_selector).html(stHtml); + } + }); + }; + timer = null; + $this.on("keyup", function() { + window.clearTimeout(timer); + timer = window.setTimeout(callback, 1000); + }); + $this.on("change", callback); + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/suggest.js.coffee b/app/assets/javascripts/suggest.js.coffee deleted file mode 100644 index 24159e36a..000000000 --- a/app/assets/javascripts/suggest.js.coffee +++ /dev/null @@ -1,31 +0,0 @@ -"use strict" - -App.Suggest = - - initialize: -> - - $("[data-js-suggest-result]").each -> - - $this = $(this) - - callback = -> - $.ajax - url: $this.data("js-url") - data: - search: $this.val() - type: "GET" - dataType: "html" - success: (stHtml) -> - js_suggest_selector = $this.data("js-suggest") - if js_suggest_selector.startsWith(".") - locale = $this.closest(".translatable-fields").data("locale") - js_suggest_selector += "[data-locale=#{locale}]" - $(js_suggest_selector).html(stHtml) - - timer = null - - $this.on "keyup", -> - window.clearTimeout(timer) - timer = window.setTimeout(callback, 1000) - - $this.on "change", callback diff --git a/app/assets/javascripts/table_sortable.js b/app/assets/javascripts/table_sortable.js new file mode 100644 index 000000000..7b4ebad8b --- /dev/null +++ b/app/assets/javascripts/table_sortable.js @@ -0,0 +1,33 @@ +(function() { + "use strict"; + App.TableSortable = { + getCellValue: function(row, index) { + return $(row).children("td").eq(index).text(); + }, + comparer: function(index) { + return function(a, b) { + var valA, valB; + valA = App.TableSortable.getCellValue(a, index); + valB = App.TableSortable.getCellValue(b, index); + if ($.isNumeric(valA) && $.isNumeric(valB)) { + return valA - valB; + } else { + return valA.localeCompare(valB); + } + }; + }, + initialize: function() { + $("table.sortable th").click(function() { + var rows, table; + table = $(this).parents("table").eq(0); + rows = table.find("tbody tr").toArray().sort(App.TableSortable.comparer($(this).index())); + this.asc = !this.asc; + if (this.asc) { + table.append(rows); + } else { + table.append(rows.reverse()); + } + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/table_sortable.js.coffee b/app/assets/javascripts/table_sortable.js.coffee deleted file mode 100644 index 784147327..000000000 --- a/app/assets/javascripts/table_sortable.js.coffee +++ /dev/null @@ -1,24 +0,0 @@ -"use strict" - -App.TableSortable = - getCellValue: (row, index) -> - $(row).children("td").eq(index).text() - - comparer: (index) -> - (a, b) -> - valA = App.TableSortable.getCellValue(a, index) - valB = App.TableSortable.getCellValue(b, index) - return if $.isNumeric(valA) and $.isNumeric(valB) then valA - valB else valA.localeCompare(valB) - - initialize: -> - $("table.sortable th").click -> - table = $(this).parents("table").eq(0) - rows = table.find("tbody tr").toArray().sort(App.TableSortable.comparer($(this).index())) - this.asc = !this.asc - - if this.asc - table.append rows - else - table.append rows.reverse() - - return diff --git a/app/assets/javascripts/tag_autocomplete.js b/app/assets/javascripts/tag_autocomplete.js new file mode 100644 index 000000000..675e4f5c9 --- /dev/null +++ b/app/assets/javascripts/tag_autocomplete.js @@ -0,0 +1,47 @@ +(function() { + "use strict"; + App.TagAutocomplete = { + split: function(val) { + return val.split(/,\s*/); + }, + extractLast: function(term) { + return App.TagAutocomplete.split(term).pop(); + }, + init_autocomplete: function() { + $(".tag-autocomplete").autocomplete({ + source: function(request, response) { + $.ajax({ + url: $(".tag-autocomplete").data("js-url"), + data: { + search: App.TagAutocomplete.extractLast(request.term) + }, + type: "GET", + dataType: "json", + success: function(data) { + return response(data); + } + }); + }, + minLength: 0, + search: function() { + return App.TagAutocomplete.extractLast(this.value); + }, + focus: function() { + return false; + }, + select: function(event, ui) { + var terms; + terms = App.TagAutocomplete.split(this.value); + terms.pop(); + terms.push(ui.item.value); + terms.push(""); + this.value = terms.join(", "); + return false; + } + }); + }, + initialize: function() { + App.TagAutocomplete.init_autocomplete(); + } + }; +}).call(this); diff --git a/app/assets/javascripts/tag_autocomplete.js.coffee b/app/assets/javascripts/tag_autocomplete.js.coffee deleted file mode 100644 index f1230e058..000000000 --- a/app/assets/javascripts/tag_autocomplete.js.coffee +++ /dev/null @@ -1,36 +0,0 @@ -"use strict" - -App.TagAutocomplete = - - split: ( val ) -> - return (val.split( /,\s*/ )) - - extractLast: ( term ) -> - return (App.TagAutocomplete.split( term ).pop()) - - init_autocomplete: -> - $(".tag-autocomplete").autocomplete - source: (request, response) -> - $.ajax - url: $(".tag-autocomplete").data("js-url"), - data: { search: App.TagAutocomplete.extractLast( request.term ) }, - type: "GET", - dataType: "json" - success: ( data ) -> - response( data ) - - minLength: 0, - search: -> - App.TagAutocomplete.extractLast( this.value ) - focus: -> - return false - select: ( event, ui ) -> ( - terms = App.TagAutocomplete.split( this.value ) - terms.pop() - terms.push( ui.item.value ) - terms.push( "" ) - this.value = terms.join( ", " ) - return false;) - - initialize: -> - App.TagAutocomplete.init_autocomplete() diff --git a/app/assets/javascripts/tags.js b/app/assets/javascripts/tags.js new file mode 100644 index 000000000..312ec892e --- /dev/null +++ b/app/assets/javascripts/tags.js @@ -0,0 +1,25 @@ +(function() { + "use strict"; + App.Tags = { + initialize: function() { + var $tag_input; + $tag_input = $("input.js-tag-list"); + $("body .js-add-tag-link").each(function() { + if ($(this).data("initialized") !== "yes") { + $(this).on("click", function() { + var current_tags, name; + name = "\"" + ($(this).text()) + "\""; + current_tags = $tag_input.val().split(",").filter(Boolean); + if (current_tags.indexOf(name) >= 0) { + current_tags.splice(current_tags.indexOf(name), 1); + } else { + current_tags.push(name); + } + $tag_input.val(current_tags.join(",")); + return false; + }).data("initialized", "yes"); + } + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/tags.js.coffee b/app/assets/javascripts/tags.js.coffee deleted file mode 100644 index f29b384a7..000000000 --- a/app/assets/javascripts/tags.js.coffee +++ /dev/null @@ -1,21 +0,0 @@ -"use strict" - -App.Tags = - - initialize: -> - $tag_input = $("input.js-tag-list") - - $("body .js-add-tag-link").each -> - unless $(this).data("initialized") is "yes" - $(this).on("click", -> - name = "\"#{$(this).text()}\"" - current_tags = $tag_input.val().split(",").filter(Boolean) - - if current_tags.indexOf(name) >= 0 - current_tags.splice(current_tags.indexOf(name), 1) - else - current_tags.push name - - $tag_input.val(current_tags.join(",")) - false - ).data "initialized", "yes" diff --git a/app/assets/javascripts/tree_navigator.js b/app/assets/javascripts/tree_navigator.js new file mode 100644 index 000000000..de382d1a7 --- /dev/null +++ b/app/assets/javascripts/tree_navigator.js @@ -0,0 +1,42 @@ +(function() { + "use strict"; + App.TreeNavigator = { + setNodes: function(nodes) { + nodes.children("ul").each(function() { + var link; + link = $(this).prev("a"); + $('').insertBefore(link); + App.TreeNavigator.setNodes($(this).children()); + }); + }, + initialize: function() { + var anchor, elem, ul; + elem = $("[data-tree-navigator]"); + if (elem.length === 0) { + return; + } + ul = elem.find("ul:eq(0)"); + if (ul.length && ul.children().length) { + App.TreeNavigator.setNodes(ul.children()); + } + $("[data-tree-navigator] span").on({ + click: function() { + if ($(this).hasClass("open")) { + $(this).removeClass("open").addClass("closed"); + $(this).siblings("ul").hide(); + } else if ($(this).hasClass("closed")) { + $(this).removeClass("closed").addClass("open"); + $(this).siblings("ul").show(); + } + } + }); + anchor = $(location).attr("hash"); + if (anchor) { + elem.find("a[href='" + anchor + "']").parents("ul").each(function() { + $(this).show(); + $(this).siblings("span").removeClass("closed").addClass("open"); + }); + } + } + }; +}).call(this); diff --git a/app/assets/javascripts/tree_navigator.js.coffee b/app/assets/javascripts/tree_navigator.js.coffee deleted file mode 100644 index 066967e0c..000000000 --- a/app/assets/javascripts/tree_navigator.js.coffee +++ /dev/null @@ -1,33 +0,0 @@ -"use strict" - -App.TreeNavigator = - setNodes: (nodes) -> - nodes.children("ul").each -> - link = $(this).prev("a") - $('').insertBefore(link) - App.TreeNavigator.setNodes($(this).children()) - - initialize: -> - elem = $("[data-tree-navigator]") - if(elem.length == 0) - return - - ul = elem.find("ul:eq(0)") - if(ul.length && ul.children().length) - App.TreeNavigator.setNodes(ul.children()) - - $("[data-tree-navigator] span").on - click: -> - if($(this).hasClass("open")) - $(this).removeClass("open").addClass("closed") - $(this).siblings("ul").hide() - else if($(this).hasClass("closed")) - $(this).removeClass("closed").addClass("open") - $(this).siblings("ul").show() - - anchor = $(location).attr("hash") - - if anchor - elem.find("a[href='#{anchor}']").parents("ul").each -> - $(this).show() - $(this).siblings("span").removeClass("closed").addClass("open") diff --git a/app/assets/javascripts/users.js b/app/assets/javascripts/users.js new file mode 100644 index 000000000..8f8f8ccfa --- /dev/null +++ b/app/assets/javascripts/users.js @@ -0,0 +1,8 @@ +(function() { + "use strict"; + App.Users = { + initialize: function() { + $(".initialjs-avatar").initial(); + } + }; +}).call(this); diff --git a/app/assets/javascripts/users.js.coffee b/app/assets/javascripts/users.js.coffee deleted file mode 100644 index b5da545fa..000000000 --- a/app/assets/javascripts/users.js.coffee +++ /dev/null @@ -1,6 +0,0 @@ -"use strict" - -App.Users = - - initialize: -> - $(".initialjs-avatar").initial() diff --git a/app/assets/javascripts/valuation_budget_investment_form.js b/app/assets/javascripts/valuation_budget_investment_form.js new file mode 100644 index 000000000..3f8e72d84 --- /dev/null +++ b/app/assets/javascripts/valuation_budget_investment_form.js @@ -0,0 +1,36 @@ +(function() { + "use strict"; + App.ValuationBudgetInvestmentForm = { + showFeasibleFields: function() { + $("#valuation_budget_investment_edit_form #unfeasible_fields").hide("down"); + $("#valuation_budget_investment_edit_form #feasible_fields").show(); + }, + showNotFeasibleFields: function() { + $("#valuation_budget_investment_edit_form #feasible_fields").hide("down"); + $("#valuation_budget_investment_edit_form #unfeasible_fields").show(); + }, + showAllFields: function() { + $("#valuation_budget_investment_edit_form #feasible_fields").show("down"); + $("#valuation_budget_investment_edit_form #unfeasible_fields").show("down"); + }, + showFeasibilityFields: function() { + var feasibility; + feasibility = $("#valuation_budget_investment_edit_form input[type=radio][name='budget_investment[feasibility]']:checked").val(); + if (feasibility === "feasible") { + App.ValuationBudgetInvestmentForm.showFeasibleFields(); + } else if (feasibility === "unfeasible") { + App.ValuationBudgetInvestmentForm.showNotFeasibleFields(); + } + }, + showFeasibilityFieldsOnChange: function() { + $("#valuation_budget_investment_edit_form input[type=radio][name='budget_investment[feasibility]']").change(function() { + App.ValuationBudgetInvestmentForm.showAllFields(); + App.ValuationBudgetInvestmentForm.showFeasibilityFields(); + }); + }, + initialize: function() { + App.ValuationBudgetInvestmentForm.showFeasibilityFields(); + App.ValuationBudgetInvestmentForm.showFeasibilityFieldsOnChange(); + } + }; +}).call(this); diff --git a/app/assets/javascripts/valuation_budget_investment_form.js.coffee b/app/assets/javascripts/valuation_budget_investment_form.js.coffee deleted file mode 100644 index 6aec6be07..000000000 --- a/app/assets/javascripts/valuation_budget_investment_form.js.coffee +++ /dev/null @@ -1,33 +0,0 @@ -"use strict" - -App.ValuationBudgetInvestmentForm = - - showFeasibleFields: -> - $("#valuation_budget_investment_edit_form #unfeasible_fields").hide("down") - $("#valuation_budget_investment_edit_form #feasible_fields").show() - - showNotFeasibleFields: -> - $("#valuation_budget_investment_edit_form #feasible_fields").hide("down") - $("#valuation_budget_investment_edit_form #unfeasible_fields").show() - - showAllFields: -> - $("#valuation_budget_investment_edit_form #feasible_fields").show("down") - $("#valuation_budget_investment_edit_form #unfeasible_fields").show("down") - - showFeasibilityFields: -> - feasibility = $("#valuation_budget_investment_edit_form input[type=radio][name='budget_investment[feasibility]']:checked").val() - if feasibility == "feasible" - App.ValuationBudgetInvestmentForm.showFeasibleFields() - else if feasibility == "unfeasible" - App.ValuationBudgetInvestmentForm.showNotFeasibleFields() - - - showFeasibilityFieldsOnChange: -> - $("#valuation_budget_investment_edit_form input[type=radio][name='budget_investment[feasibility]']").change -> - App.ValuationBudgetInvestmentForm.showAllFields() - App.ValuationBudgetInvestmentForm.showFeasibilityFields() - - - initialize: -> - App.ValuationBudgetInvestmentForm.showFeasibilityFields() - App.ValuationBudgetInvestmentForm.showFeasibilityFieldsOnChange() diff --git a/app/assets/javascripts/votations.js b/app/assets/javascripts/votations.js new file mode 100644 index 000000000..312ccdcb7 --- /dev/null +++ b/app/assets/javascripts/votations.js @@ -0,0 +1,56 @@ +(function() { + "use strict"; + App.Votations = { + checkMaxVotes: function() { + if ($("#votation_type_enum_type").val() === "0") { + $(".js-max_votes").hide(); + $("#max_votes").attr({ disabled: true }); + } else { + $(".js-max_votes").show(); + $("#max_votes").attr({ disabled: false }); + } + }, + checkPrioritization: function() { + if ($("#votation_type_enum_type").val() === "2") { + $(".js-prioritization_type").show(); + $("#prioritization_type").attr({ disabled: false }); + } else { + $(".js-prioritization_type").hide(); + $("#prioritization_type").attr({ disabled: true }); + } + }, + checkMaxGroups: function() { + if ($("#votation_type_enum_type").val() === "7" || $("#votation_type_enum_type").val() === "8") { + $(".js-max_group_votes").show(); + $("#max_groups_answers").attr({ disabled: false }); + } else { + $(".js-max_group_votes").hide(); + $("#max_groups_answers").attr({ disabled: true }); + } + }, + setTraduction: function(response) { + $(".js-description_text").text(response.traduction); + }, + updateChecks: function() { + App.Votations.checkMaxVotes(); + App.Votations.checkPrioritization(); + App.Votations.checkMaxGroups(); + }, + initialize: function() { + App.Votations.updateChecks(); + $("#votation_type_enum_type").on({ + change: function() { + var params, url; + App.Votations.updateChecks(); + url = "/admin/get_options_traductions.json"; + params = { + enum_type: $("#votation_type_enum_type").val() + }; + $.get(url, params, function(response) { + App.Votations.setTraduction(response, "json"); + }); + } + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/votations.js.coffee b/app/assets/javascripts/votations.js.coffee deleted file mode 100644 index 2ce9333d0..000000000 --- a/app/assets/javascripts/votations.js.coffee +++ /dev/null @@ -1,44 +0,0 @@ -"use strict" - -App.Votations = - - checkMaxVotes: -> - if $("#votation_type_enum_type").val() == "0" - $(".js-max_votes").hide() - $("#max_votes").attr(disabled: true) - else - $(".js-max_votes").show() - $("#max_votes").attr(disabled: false) - - checkPrioritization: -> - if $("#votation_type_enum_type").val() == "2" - $(".js-prioritization_type").show() - $("#prioritization_type").attr(disabled: false) - else - $(".js-prioritization_type").hide() - $("#prioritization_type").attr(disabled: true) - - checkMaxGroups: -> - if $("#votation_type_enum_type").val() == "7" || $("#votation_type_enum_type").val() == "8" - $(".js-max_group_votes").show() - $("#max_groups_answers").attr(disabled: false) - else - $(".js-max_group_votes").hide() - $("#max_groups_answers").attr(disabled: true) - - setTraduction: (response) -> - $(".js-description_text").text(response["traduction"]) - - updateChecks: () -> - App.Votations.checkMaxVotes() - App.Votations.checkPrioritization() - App.Votations.checkMaxGroups() - - initialize: -> - App.Votations.updateChecks() - $("#votation_type_enum_type").on - change: -> - App.Votations.updateChecks() - url = "/admin/get_options_traductions.json" - params = { enum_type: $("#votation_type_enum_type").val() } - $.get(url, params, (response) -> App.Votations.setTraduction response, "json") diff --git a/app/assets/javascripts/votes.js b/app/assets/javascripts/votes.js new file mode 100644 index 000000000..2e8583156 --- /dev/null +++ b/app/assets/javascripts/votes.js @@ -0,0 +1,23 @@ +(function() { + "use strict"; + App.Votes = { + hoverize: function(votes) { + $(document).on({ + "mouseenter focus": function() { + $("div.participation-not-allowed", this).show(); + $("div.participation-allowed", this).hide(); + }, + mouseleave: function() { + $("div.participation-not-allowed", this).hide(); + $("div.participation-allowed", this).show(); + } + }, votes); + }, + initialize: function() { + App.Votes.hoverize("div.votes"); + App.Votes.hoverize("div.supports"); + App.Votes.hoverize("div.debate-questions"); + App.Votes.hoverize("div.comment-footer"); + } + }; +}).call(this); diff --git a/app/assets/javascripts/votes.js.coffee b/app/assets/javascripts/votes.js.coffee deleted file mode 100644 index ec57df968..000000000 --- a/app/assets/javascripts/votes.js.coffee +++ /dev/null @@ -1,19 +0,0 @@ -"use strict" - -App.Votes = - - hoverize: (votes) -> - $(document).on { - "mouseenter focus": -> - $("div.participation-not-allowed", this).show() - $("div.participation-allowed", this).hide() - mouseleave: -> - $("div.participation-not-allowed", this).hide() - $("div.participation-allowed", this).show() - }, votes - - initialize: -> - App.Votes.hoverize "div.votes" - App.Votes.hoverize "div.supports" - App.Votes.hoverize "div.debate-questions" - App.Votes.hoverize "div.comment-footer" diff --git a/app/assets/javascripts/watch_form_changes.js b/app/assets/javascripts/watch_form_changes.js new file mode 100644 index 000000000..104d8d4d0 --- /dev/null +++ b/app/assets/javascripts/watch_form_changes.js @@ -0,0 +1,32 @@ +(function() { + "use strict"; + App.WatchFormChanges = { + forms: function() { + return $("form[data-watch-changes]"); + }, + msg: function() { + return $("[data-watch-form-message]").data("watch-form-message"); + }, + hasChanged: function() { + return App.WatchFormChanges.forms().is(function() { + return $(this).serialize() !== $(this).data("watchChanges"); + }); + }, + checkChanges: function() { + if (App.WatchFormChanges.hasChanged()) { + return confirm(App.WatchFormChanges.msg()); + } else { + return true; + } + }, + initialize: function() { + if (App.WatchFormChanges.forms().length === 0 || App.WatchFormChanges.msg() === undefined) { + return; + } + $(document).off("page:before-change").on("page:before-change", App.WatchFormChanges.checkChanges); + App.WatchFormChanges.forms().each(function() { + $(this).data("watchChanges", $(this).serialize()); + }); + } + }; +}).call(this); diff --git a/app/assets/javascripts/watch_form_changes.js.coffee b/app/assets/javascripts/watch_form_changes.js.coffee deleted file mode 100644 index 2f3e70eba..000000000 --- a/app/assets/javascripts/watch_form_changes.js.coffee +++ /dev/null @@ -1,27 +0,0 @@ -"use strict" - -App.WatchFormChanges = - forms: -> - return $("form[data-watch-changes]") - - msg: -> - return $("[data-watch-form-message]").data("watch-form-message") - - hasChanged: -> - App.WatchFormChanges.forms().is -> - $(this).serialize() != $(this).data("watchChanges") - - checkChanges: -> - if App.WatchFormChanges.hasChanged() - confirm(App.WatchFormChanges.msg()) - else - true - - initialize: -> - if App.WatchFormChanges.forms().length == 0 || App.WatchFormChanges.msg() == undefined - return - - $(document).off("page:before-change").on("page:before-change", App.WatchFormChanges.checkChanges) - - App.WatchFormChanges.forms().each -> - $(this).data("watchChanges", $(this).serialize())