From 67e524f24dd51634b3f4643ca074aa3d6856907c Mon Sep 17 00:00:00 2001 From: HADDAD Zineddine Date: Fri, 28 Jul 2023 13:38:59 +0000 Subject: [PATCH 01/19] add search language selector --- app/assets/javascripts/bp_search.js.erb | 2 ++ app/javascript/component_controllers/index.js | 2 +- app/views/search/index.html.haml | 13 ++++++++++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/bp_search.js.erb b/app/assets/javascripts/bp_search.js.erb index 26730ee00..aa6443390 100644 --- a/app/assets/javascripts/bp_search.js.erb +++ b/app/assets/javascripts/bp_search.js.erb @@ -293,6 +293,8 @@ function currentSearchParams() { params.require_definition = jQuery("#search_require_definition").is(":checked"); params.exact_match = jQuery("#search_exact_match").is(":checked"); params.categories = jQuery("#search_categories").val() || ""; + params.lang = jQuery("#search_language").val() || ""; + return params; } diff --git a/app/javascript/component_controllers/index.js b/app/javascript/component_controllers/index.js index b9968423b..54719f4a3 100644 --- a/app/javascript/component_controllers/index.js +++ b/app/javascript/component_controllers/index.js @@ -2,7 +2,7 @@ import {application} from "../controllers/application"; import TurboModalController from "../../components/turbo_modal_component/turbo_modal_component_controller" import FileInputLoaderController - from "../../components/form/file_input_component/file_input_loader_component_controller"; + from "../../components/input/file_input_component/file_input_loader_component_controller"; import Select_input_component_controller from "../../components/select_input_component/select_input_component_controller"; diff --git a/app/views/search/index.html.haml b/app/views/search/index.html.haml index 653cc05dc..edb9c90cf 100644 --- a/app/views/search/index.html.haml +++ b/app/views/search/index.html.haml @@ -17,6 +17,13 @@ -# Advanced search options %div#search_options{style: "display: none;"} %div.form-group.row + %div.col-sm-2.mb-4 Search language + %div.col-sm-10 + %select{name: "search_language", id: "search_language"} + %option{value: "all"} All + %option{value: "en"} English + %option{value: "fr"} Français + %div.col-sm-2= t("search.include_in_search") + ":" %div.col-sm-10 %div.form-check @@ -28,7 +35,11 @@ %div.form-check = check_box(:search, :include_views, class: "form-check-input") = label(:search, :include_views, t('search.ontology_views'), class: "form-check-label") - %div.form-group.row + + + + + %div.col-sm-2= t("search.narrow_search_to") + ":" %div.col-sm-10 %div.form-check From a906323b8fb6423755597062d6133a1240afd759 Mon Sep 17 00:00:00 2001 From: HADDAD Zineddine Date: Tue, 1 Aug 2023 15:25:08 +0000 Subject: [PATCH 02/19] add language in the ajax request --- app/assets/javascripts/bp_search.js.erb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/assets/javascripts/bp_search.js.erb b/app/assets/javascripts/bp_search.js.erb index aa6443390..6ce09fcbd 100644 --- a/app/assets/javascripts/bp_search.js.erb +++ b/app/assets/javascripts/bp_search.js.erb @@ -328,6 +328,7 @@ function performSearch() { includeOnlyDefinitions = jQuery("#search_require_definition").is(":checked"), exactMatch = jQuery("#search_exact_match").is(":checked"), categories = jQuery("#search_categories").val() || ""; + language = jQuery("#search_language").val() || ""; // Set the list of search words to be blacklisted for the ontology ownership algorithm blacklistSearchWordsArr = query.split(/\s+/); @@ -338,6 +339,7 @@ function performSearch() { url: determineHTTPS(jQuery(document).data().bp.config.rest_url) + "/search", data: { q: query, + lang: language, include_properties: includeProps, include_views: includeViews, obsolete: includeObsolete, From bd0da3017566263ef11ac3baa9aac7a327749f33 Mon Sep 17 00:00:00 2001 From: HADDAD Zineddine Date: Fri, 4 Aug 2023 15:15:21 +0000 Subject: [PATCH 03/19] add flags to search select --- app/views/layouts/_header.html.erb | 7 +++++- app/views/search/index.html.haml | 35 ++++++++++++++++++++++++++---- package.json | 2 ++ 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index 111fc1b69..29b04800c 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -15,11 +15,16 @@ <%if @title.nil?%><%=$ORG_SITE%><%else%><%="#{@title} | #{$ORG_SITE}"%><%end%> + - + + + + + <%= stylesheet_link_tag "https://use.fontawesome.com/releases/v5.2.0/css/all.css", integrity: "sha384-hWVjflwFxL6sNzntih27bfxkr27PmbbK/iSvJ+a4+0owXq79v+lsFkW54bOGbiDQ", crossorigin: "anonymous" %> <%= stylesheet_link_tag "application" %> diff --git a/app/views/search/index.html.haml b/app/views/search/index.html.haml index edb9c90cf..9dca4e780 100644 --- a/app/views/search/index.html.haml +++ b/app/views/search/index.html.haml @@ -19,10 +19,25 @@ %div.form-group.row %div.col-sm-2.mb-4 Search language %div.col-sm-10 - %select{name: "search_language", id: "search_language"} - %option{value: "all"} All - %option{value: "en"} English - %option{value: "fr"} Français + %select#select-beast(autocomplete="off" placeholder="Select a person...") + %option(value="") Select a person... + %option(value="4") Thomas Edison + %option(value="1") Nikola + %option(value="3") Nikola Tesla + %option(value="5") Arnold Schwarzenegger + -# %select.selectpicker.mb-4{style: "width: auto", name: "search[language]", id: "search_language"} + -# %option{selected: "selected"} All + -# %option{value: "en", 'data-content': ' English'} + -# %option{value: "zh", 'data-content': ' Chinese'} + -# %option{value: "hi", 'data-content': ' Hindi'} + -# %option{value: "es", 'data-content': ' Spanish'} + -# %option{value: "fr", 'data-content': ' French'} + -# %option{value: "ar", 'data-content': ' Arabic'} + -# %option{value: "bn", 'data-content': ' Bengali'} + -# %option{value: "ru", 'data-content': ' Russian'} + -# %option{value: "pt", 'data-content': ' Portuguese'} + -# %option{value: "id", 'data-content': ' Indonesian'} + %div.col-sm-2= t("search.include_in_search") + ":" %div.col-sm-10 @@ -69,10 +84,22 @@ :javascript // Hash of ontology id => name, acronym for lookup use via JS + jQuery(document).ready(function() { + jQuery(document).data().bp.ontologies = #{Hash[LinkedData::Client::Models::Ontology.all(include_views: true).map {|o| [o.id, {name: o.name, acronym: o.acronym}]}].to_json.html_safe} if (jQuery("#search_keywords").val() !== "") { performSearch(); } }); + + new TomSelect("#select-beast",{ + create: true, + sortField: { + field: "text", + direction: "asc" + } + }); + + diff --git a/package.json b/package.json index dbe55880b..fc6fdbb71 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,9 @@ "dependencies": { "@hotwired/stimulus": "^3.0.1", "@hotwired/turbo-rails": "^7.1.1", + "bootstrap-select": "^1.13.18", "esbuild": "^0.14.41", + "flag-icons": "^6.9.3", "flatpickr": "^4.6.13", "split.js": "^1.6.5", "stimulus-flatpickr": "^3.0.0-0", From 5e9f0f5b7659f948bc5cb9793312781bfc3eae15 Mon Sep 17 00:00:00 2001 From: HADDAD Zineddine Date: Fri, 4 Aug 2023 15:16:48 +0000 Subject: [PATCH 04/19] Merge branch 'development' into feat/multilingual --- config/environments/development.rb | 37 +++++++++++------------------- 1 file changed, 13 insertions(+), 24 deletions(-) diff --git a/config/environments/development.rb b/config/environments/development.rb index b595b87cd..ede4e54c9 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -1,10 +1,7 @@ -require "active_support/core_ext/integer/time" - Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. - config.assets.debug = true - # In the development environment your application's code is reloaded any time - # it changes. This slows down response time but is perfect for development + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development # since you don't have to restart the web server when you make code changes. config.cache_classes = false @@ -14,18 +11,15 @@ # Show full error reports. config.consider_all_requests_local = true - # Enable server timing - config.server_timing = true - # Enable/disable caching. By default caching is disabled. # Run rails dev:cache to toggle caching. - if Rails.root.join("tmp/caching-dev.txt").exist? + if Rails.root.join('tmp', 'caching-dev.txt').exist? config.action_controller.perform_caching = true config.action_controller.enable_fragment_cache_logging = true config.cache_store = :memory_store config.public_file_server.headers = { - "Cache-Control" => "public, max-age=#{2.days.to_i}" + 'Cache-Control' => "public, max-age=#{2.days.to_i}" } else config.action_controller.perform_caching = false @@ -44,30 +38,27 @@ # Print deprecation notices to the Rails logger. config.active_support.deprecation = :log - # Raise exceptions for disallowed deprecations. - config.active_support.disallowed_deprecation = :raise - - # Tell Active Support which deprecation messages to disallow. - config.active_support.disallowed_deprecation_warnings = [] - # Raise an error on page load if there are pending migrations. config.active_record.migration_error = :page_load # Highlight code that triggered database queries in logs. config.active_record.verbose_query_logs = true + # Debug mode disables concatenation and preprocessing of assets. + # This option may cause significant delays in view rendering with a large + # number of complex assets. + config.assets.debug = true # Suppress logger output for asset requests. config.assets.quiet = true # memcache setup - config.cache_store = ActiveSupport::Cache::MemCacheStore.new('cache:11211', namespace: 'BioPortal') + config.cache_store = ActiveSupport::Cache::MemCacheStore.new('cache', namespace: 'BioPortal') # Silence cache output config.cache_store.logger = Logger.new("/dev/null") if config.cache_store.respond_to?(:logger) # Add custom data attributes to sanitize allowed list config.action_view.sanitized_allowed_attributes = ['id', 'class', 'style', 'data-cls', 'data-ont'] - config.view_component.generate.sidecar = true config.file_watcher = ActiveSupport::FileUpdateChecker @@ -75,11 +66,9 @@ require Rails.root.join('config', "bioportal_config_#{Rails.env}.rb") # Raises error for missing translations. - # config.i18n.raise_on_missing_translations = true - - # Annotate rendered view with file names. - # config.action_view.annotate_rendered_view_with_filenames = true + # config.action_view.raise_on_missing_translations = true - # Uncomment if you wish to allow Action Cable access from any origin. - # config.action_cable.disable_request_forgery_protection = true + # Use an evented file watcher to asynchronously detect changes in source code, + # routes, locales, etc. This feature depends on the listen gem. + config.file_watcher = ActiveSupport::EventedFileUpdateChecker end \ No newline at end of file From e408c01c770154c413849ba35a57b6742d0eefce Mon Sep 17 00:00:00 2001 From: HADDAD Zineddine Date: Thu, 10 Aug 2023 13:25:36 +0000 Subject: [PATCH 05/19] customizing TomSelect controller --- .../select_input_component_controller.js | 49 ++++++++++++++++--- app/views/search/index.html.haml | 16 ++---- 2 files changed, 45 insertions(+), 20 deletions(-) diff --git a/app/components/select_input_component/select_input_component_controller.js b/app/components/select_input_component/select_input_component_controller.js index 5002e90ea..63a88a508 100644 --- a/app/components/select_input_component/select_input_component_controller.js +++ b/app/components/select_input_component/select_input_component_controller.js @@ -3,17 +3,52 @@ import TomSelect from "tom-select" export default class extends Controller { static values = { - multiple: Boolean, - openAdd : Boolean + multiple: { type: Boolean, default: false }, + openAdd : { type: Boolean, default: false }. + withIcon : { type: Boolean, default: false }, + valueField: { type: String, default: 'id' }, + searchField: { type: String, default: 'title' }, + options: { type: Array, default: [] } } + + connect() { let myOptions = {} - if (this.multipleValue) { - myOptions['plugins'] = ['remove_button']; - } - if (this.openAddValue) { - myOptions['create'] = true; + + if (this.withIconValue) { + + myOptions = { + valueField: this.valueFieldValue, + searchField: this.searchFieldvalue, + options: this.optionsValue, + render: { + option: (data, escape) => { + return '
' + + '' + escape(data.title) + '' + + '' + escape(data.url) + '' + + '
'; + }, + item: (data, escape) => { + return '
' + escape(data.title) + '
'; + } + } + } + + + + } else { + if (this.multipleValue) { + myOptions['plugins'] = ['remove_button']; + } + if (this.openAddValue) { + myOptions['create'] = true; + } } + + + + + new TomSelect(this.element, myOptions); } diff --git a/app/views/search/index.html.haml b/app/views/search/index.html.haml index 9dca4e780..4b1970aab 100644 --- a/app/views/search/index.html.haml +++ b/app/views/search/index.html.haml @@ -19,12 +19,8 @@ %div.form-group.row %div.col-sm-2.mb-4 Search language %div.col-sm-10 - %select#select-beast(autocomplete="off" placeholder="Select a person...") - %option(value="") Select a person... - %option(value="4") Thomas Edison - %option(value="1") Nikola - %option(value="3") Nikola Tesla - %option(value="5") Arnold Schwarzenegger + %select#select-links{multiple: "multiple", placeholder: "Pick some links..."} + -# %select.selectpicker.mb-4{style: "width: auto", name: "search[language]", id: "search_language"} -# %option{selected: "selected"} All -# %option{value: "en", 'data-content': ' English'} @@ -94,12 +90,6 @@ } }); - new TomSelect("#select-beast",{ - create: true, - sortField: { - field: "text", - direction: "asc" - } - }); + From 7eabe5a6d96cc28685ed47bfe3600c492fc91dff Mon Sep 17 00:00:00 2001 From: HADDAD Zineddine Date: Thu, 10 Aug 2023 14:14:55 +0000 Subject: [PATCH 06/19] use tomselect --- .../select_input_component_controller.js | 22 +++++++------- app/views/search/index.html.haml | 30 +++++++++---------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/app/components/select_input_component/select_input_component_controller.js b/app/components/select_input_component/select_input_component_controller.js index 63a88a508..783f8f173 100644 --- a/app/components/select_input_component/select_input_component_controller.js +++ b/app/components/select_input_component/select_input_component_controller.js @@ -4,38 +4,40 @@ import TomSelect from "tom-select" export default class extends Controller { static values = { multiple: { type: Boolean, default: false }, - openAdd : { type: Boolean, default: false }. + openAdd : { type: Boolean, default: false }, withIcon : { type: Boolean, default: false }, valueField: { type: String, default: 'id' }, searchField: { type: String, default: 'title' }, options: { type: Array, default: [] } - } + }; connect() { let myOptions = {} + if (this.withIconValue) { - myOptions = { valueField: this.valueFieldValue, - searchField: this.searchFieldvalue, + searchField: this.searchFieldValue, options: this.optionsValue, render: { option: (data, escape) => { - return '
' + - '' + escape(data.title) + '' + - '' + escape(data.url) + '' + - '
'; + return `
+ + ${escape(data.title)} +
`; }, item: (data, escape) => { - return '
' + escape(data.title) + '
'; + return `
+ + ${escape(data.title)} +
`; } } } - } else { if (this.multipleValue) { myOptions['plugins'] = ['remove_button']; diff --git a/app/views/search/index.html.haml b/app/views/search/index.html.haml index 4b1970aab..b9c97116a 100644 --- a/app/views/search/index.html.haml +++ b/app/views/search/index.html.haml @@ -15,25 +15,23 @@ = link_to(t('search.show_advanced_options'), "javascript:void(0)", id: "advanced_options", data: {text_swap: t('search.hide_advanced_options')}, class: "form-text") -# Advanced search options - %div#search_options{style: "display: none;"} + %div#search_options %div.form-group.row %div.col-sm-2.mb-4 Search language %div.col-sm-10 - %select#select-links{multiple: "multiple", placeholder: "Pick some links..."} - - -# %select.selectpicker.mb-4{style: "width: auto", name: "search[language]", id: "search_language"} - -# %option{selected: "selected"} All - -# %option{value: "en", 'data-content': ' English'} - -# %option{value: "zh", 'data-content': ' Chinese'} - -# %option{value: "hi", 'data-content': ' Hindi'} - -# %option{value: "es", 'data-content': ' Spanish'} - -# %option{value: "fr", 'data-content': ' French'} - -# %option{value: "ar", 'data-content': ' Arabic'} - -# %option{value: "bn", 'data-content': ' Bengali'} - -# %option{value: "ru", 'data-content': ' Russian'} - -# %option{value: "pt", 'data-content': ' Portuguese'} - -# %option{value: "id", 'data-content': ' Indonesian'} - + %select#search_language.mb-4.w-25{autocomplete: "off", + placeholder: "Choose language", + "data-controller" => "select-input", + "data-select-input-with-icon-value" => "true", + "data-select-input-open-add-value" => "true", + "data-select-input-options-value" => + '[ + {"id": "fr", "title": "French", "icon": "fi fi-fr fis"}, + {"id": "en", "title": "English", "icon": "fi fi-us fis"}, + {"id": "es", "title": "Spanish", "icon": "fi fi-es fis"}, + {"id": "ar", "title": "Arabic", "icon": "fi fi-dz fis"} + ]' + } %div.col-sm-2= t("search.include_in_search") + ":" %div.col-sm-10 From 9a9f9fc53718d515889f1d0e784eda342072d2e0 Mon Sep 17 00:00:00 2001 From: HADDAD Zineddine Date: Thu, 10 Aug 2023 14:17:29 +0000 Subject: [PATCH 07/19] remove bootstrap select --- app/views/layouts/_header.html.erb | 4 +--- app/views/search/index.html.haml | 4 ---- package.json | 1 - 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index 29b04800c..29ae07b01 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -20,9 +20,7 @@ - - - + diff --git a/app/views/search/index.html.haml b/app/views/search/index.html.haml index b9c97116a..2c3beaa80 100644 --- a/app/views/search/index.html.haml +++ b/app/views/search/index.html.haml @@ -45,10 +45,6 @@ = check_box(:search, :include_views, class: "form-check-input") = label(:search, :include_views, t('search.ontology_views'), class: "form-check-label") - - - - %div.col-sm-2= t("search.narrow_search_to") + ":" %div.col-sm-10 %div.form-check diff --git a/package.json b/package.json index b3a14da60..95225e8dd 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,6 @@ "dependencies": { "@hotwired/stimulus": "^3.0.1", "@hotwired/turbo-rails": "^7.1.1", - "bootstrap-select": "^1.13.18", "esbuild": "^0.14.41", "flag-icons": "^6.9.3", "flatpickr": "^4.6.13", From 074e5bae1110d75df1c7096e38af832530471fda Mon Sep 17 00:00:00 2001 From: HADDAD Zineddine Date: Thu, 17 Aug 2023 12:17:32 +0000 Subject: [PATCH 08/19] SelectComponent --- .../stylesheets/application.css.scss.erb | 1 + app/components/input/select_component.rb | 3 ++- app/components/select_input_component.rb | 19 ++++++++++---- .../select_input_component_controller.js | 26 ++++++++----------- app/javascript/application_esbuild.js | 4 +-- app/views/search/index.html.haml | 19 +++----------- .../input/select_component_preview.rb | 5 ++++ 7 files changed, 38 insertions(+), 39 deletions(-) diff --git a/app/assets/stylesheets/application.css.scss.erb b/app/assets/stylesheets/application.css.scss.erb index a3e69e6ab..4acd7a137 100755 --- a/app/assets/stylesheets/application.css.scss.erb +++ b/app/assets/stylesheets/application.css.scss.erb @@ -45,6 +45,7 @@ @import "lostpassword"; @import "flatpickr/dist/themes/light"; @import "tom-select/dist/scss/tom-select"; +@import "flag-icons/sass/flag-icons"; @import "feedback"; @import "login"; @import "components/index"; diff --git a/app/components/input/select_component.rb b/app/components/input/select_component.rb index e9f8e9b33..234d00a1b 100644 --- a/app/components/input/select_component.rb +++ b/app/components/input/select_component.rb @@ -2,12 +2,13 @@ class Input::SelectComponent < Input::InputFieldComponent - def initialize(id: nil, label: '', name:, value: [], selected: '', placeholder: '', error_message: '', helper_text: '', multiple: false, open_to_add_values: false) + def initialize(id: nil, label: '', name:, value: [], selected: '', placeholder: '', error_message: '', helper_text: '', multiple: false, open_to_add_values: false, withIcon: false) super(label: label, name: name, value: value, placeholder: placeholder, error_message: error_message, helper_text: helper_text) @values = value @selected = selected @open_to_add_values = open_to_add_values @multiple = multiple + @withIcon = withIcon @id = id end end diff --git a/app/components/select_input_component.rb b/app/components/select_input_component.rb index 935087fe5..367a078a3 100644 --- a/app/components/select_input_component.rb +++ b/app/components/select_input_component.rb @@ -2,7 +2,7 @@ class SelectInputComponent < ViewComponent::Base - def initialize(id:, name:, values:, selected:, multiple: false, open_to_add_values: false) + def initialize(id: "", name: "[]", values: [], selected: "", multiple: false, open_to_add_values: false, withIcon: false, valueField: false, searchField: false, placeholder: "") super @id = id || "" @name = name @@ -10,10 +10,14 @@ def initialize(id:, name:, values:, selected:, multiple: false, open_to_add_valu @selected = selected @multiple = multiple @open_to_add_values = open_to_add_values + @withIcon = withIcon + @valueField = valueField + @searchField = searchField + @placeholder = placeholder end def call - select_input_tag(@id, @values, @selected, multiple: @multiple, open_to_add_values: @open_to_add_values) + select_input_tag(@id, @values, @selected, multiple: @multiple, open_to_add_values: @open_to_add_values, withIcon: @withIcon, placeholder: @placeholder) end private @@ -21,18 +25,23 @@ def call def select_input_tag(id, values, selected, options = {}) multiple = options[:multiple] || false open_to_add_values = options[:open_to_add_values] || false - + withIcon = options[:withIcon] || false + placeholder = options[:placeholder] || '' + select_html_options = { id: "select_#{id}", + placeholder: placeholder, autocomplete: "off", multiple: multiple, data: { controller: "select-input", + 'select-input-with-icon-value': withIcon, 'select-input-multiple-value': multiple, - 'select-input-open-add-value': open_to_add_values + 'select-input-open-add-value': open_to_add_values, + 'select-input-options-value': @values, } } - #binding.pry + select_tag(id, options_for_select(values, selected), select_html_options) end end diff --git a/app/components/select_input_component/select_input_component_controller.js b/app/components/select_input_component/select_input_component_controller.js index 783f8f173..6535c149e 100644 --- a/app/components/select_input_component/select_input_component_controller.js +++ b/app/components/select_input_component/select_input_component_controller.js @@ -4,8 +4,8 @@ import TomSelect from "tom-select" export default class extends Controller { static values = { multiple: { type: Boolean, default: false }, - openAdd : { type: Boolean, default: false }, - withIcon : { type: Boolean, default: false }, + openAdd: { type: Boolean, default: false }, + withIcon: { type: Boolean, default: false }, valueField: { type: String, default: 'id' }, searchField: { type: String, default: 'title' }, options: { type: Array, default: [] } @@ -15,7 +15,6 @@ export default class extends Controller { connect() { let myOptions = {} - if (this.withIconValue) { myOptions = { valueField: this.valueFieldValue, @@ -38,19 +37,16 @@ export default class extends Controller { } - } else { - if (this.multipleValue) { - myOptions['plugins'] = ['remove_button']; - } - if (this.openAddValue) { - myOptions['create'] = true; - } } - - - - - + + if (this.multipleValue) { + myOptions['plugins'] = ['remove_button']; + } + + if (this.openAddValue) { + myOptions['create'] = true; + } + new TomSelect(this.element, myOptions); } diff --git a/app/javascript/application_esbuild.js b/app/javascript/application_esbuild.js index a939c36c9..a330c2995 100644 --- a/app/javascript/application_esbuild.js +++ b/app/javascript/application_esbuild.js @@ -2,11 +2,11 @@ import { Turbo } from "@hotwired/turbo-rails" -Turbo.session.drive = false import "./controllers" import "./component_controllers" +import "flag-icons/css/flag-icons.min.css"; - +Turbo.session.drive = false; Turbo.setConfirmMethod((message) => { return new Promise((resolve, reject) => { alertify.confirm(message, (e) => { diff --git a/app/views/search/index.html.haml b/app/views/search/index.html.haml index 2c3beaa80..67d70551b 100644 --- a/app/views/search/index.html.haml +++ b/app/views/search/index.html.haml @@ -13,26 +13,13 @@ aria: {label: t('search.view_search_documentation')}, class: "float-right") %div.form-group = link_to(t('search.show_advanced_options'), "javascript:void(0)", id: "advanced_options", data: {text_swap: t('search.hide_advanced_options')}, class: "form-text") - + -# Advanced search options %div#search_options %div.form-group.row %div.col-sm-2.mb-4 Search language - %div.col-sm-10 - %select#search_language.mb-4.w-25{autocomplete: "off", - placeholder: "Choose language", - "data-controller" => "select-input", - "data-select-input-with-icon-value" => "true", - "data-select-input-open-add-value" => "true", - "data-select-input-options-value" => - '[ - {"id": "fr", "title": "French", "icon": "fi fi-fr fis"}, - {"id": "en", "title": "English", "icon": "fi fi-us fis"}, - {"id": "es", "title": "Spanish", "icon": "fi fi-es fis"}, - {"id": "ar", "title": "Arabic", "icon": "fi fi-dz fis"} - ]' - } - + %div.col-sm-10.mb-4 + = render SelectInputComponent.new(id: "", name: "", values: [{id: "fr", title: "French", icon: "fi fi-fr fis"}, {id: "en", title: "English", icon: "fi fi-us fis"}], withIcon: true, placeholder: "Choose language") %div.col-sm-2= t("search.include_in_search") + ":" %div.col-sm-10 %div.form-check diff --git a/test/components/previews/input/select_component_preview.rb b/test/components/previews/input/select_component_preview.rb index 61599fb78..1a27fdd1a 100644 --- a/test/components/previews/input/select_component_preview.rb +++ b/test/components/previews/input/select_component_preview.rb @@ -14,4 +14,9 @@ def multiple(id: "", name: "", values: ["choices 1", "choices 2", "choices 3"], def open_to_add(id: "", name: "", values: ["choices 1", "choices 2", "choices 3"], selected: "choices 2", multiple: true , open_to_add_values: true) render Input::SelectComponent.new(id: id, name: name, value: values, selected: selected, multiple: multiple, open_to_add_values: open_to_add_values) end + + def with_icon(id: "", name: "", values: [{id: "fr", title: "French", icon: "fi fi-fr fis"}, {id: "en", title: "English", icon: "fi fi-us fis"}], withIcon: true, placeholder: "Choose language") + render SelectInputComponent.new(id: id, name: name, values: values, withIcon: withIcon, placeholder: placeholder) + end + end From 148154e6a18516f43020d29d4843ac9142339d7f Mon Sep 17 00:00:00 2001 From: HADDAD Zineddine Date: Thu, 17 Aug 2023 12:46:19 +0000 Subject: [PATCH 09/19] remove flag-icon and use his cdn instead --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 95225e8dd..94282d913 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,6 @@ "@hotwired/stimulus": "^3.0.1", "@hotwired/turbo-rails": "^7.1.1", "esbuild": "^0.14.41", - "flag-icons": "^6.9.3", "flatpickr": "^4.6.13", "split.js": "^1.6.5", "stimulus-flatpickr": "^3.0.0-0", From 05c2bee784fbcd756ebd9c0d6e660fb0067d1143 Mon Sep 17 00:00:00 2001 From: HADDAD Zineddine Date: Thu, 17 Aug 2023 12:46:38 +0000 Subject: [PATCH 10/19] use flag-icon cdn --- app/views/layouts/_header.html.erb | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index 29ae07b01..1817186d6 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -15,14 +15,13 @@ <%if @title.nil?%><%=$ORG_SITE%><%else%><%="#{@title} | #{$ORG_SITE}"%><%end%> - - - - - + <%= stylesheet_link_tag "https://use.fontawesome.com/releases/v5.2.0/css/all.css", integrity: "sha384-hWVjflwFxL6sNzntih27bfxkr27PmbbK/iSvJ+a4+0owXq79v+lsFkW54bOGbiDQ", crossorigin: "anonymous" %> <%= stylesheet_link_tag "application" %> From 18377c7c02fe1204899b3d174ef5ebb304c1e2ae Mon Sep 17 00:00:00 2001 From: HADDAD Zineddine Date: Thu, 17 Aug 2023 12:48:06 +0000 Subject: [PATCH 11/19] remove flag icon import statement --- app/assets/stylesheets/application.css.scss.erb | 1 - app/javascript/application_esbuild.js | 7 +++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/app/assets/stylesheets/application.css.scss.erb b/app/assets/stylesheets/application.css.scss.erb index 4acd7a137..a3e69e6ab 100755 --- a/app/assets/stylesheets/application.css.scss.erb +++ b/app/assets/stylesheets/application.css.scss.erb @@ -45,7 +45,6 @@ @import "lostpassword"; @import "flatpickr/dist/themes/light"; @import "tom-select/dist/scss/tom-select"; -@import "flag-icons/sass/flag-icons"; @import "feedback"; @import "login"; @import "components/index"; diff --git a/app/javascript/application_esbuild.js b/app/javascript/application_esbuild.js index a330c2995..2ded13b5a 100644 --- a/app/javascript/application_esbuild.js +++ b/app/javascript/application_esbuild.js @@ -1,10 +1,9 @@ // Entry point for the build script in your package.json -import { Turbo } from "@hotwired/turbo-rails" -import "./controllers" -import "./component_controllers" -import "flag-icons/css/flag-icons.min.css"; +import { Turbo } from "@hotwired/turbo-rails"; +import "./controllers"; +import "./component_controllers"; Turbo.session.drive = false; Turbo.setConfirmMethod((message) => { From d53eab924e064d8b7f78e35217eb8ed3d8de6b14 Mon Sep 17 00:00:00 2001 From: HADDAD Zineddine Date: Thu, 17 Aug 2023 12:58:14 +0000 Subject: [PATCH 12/19] change id for select lang --- app/assets/javascripts/bp_search.js.erb | 4 ++-- app/views/search/index.html.haml | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/bp_search.js.erb b/app/assets/javascripts/bp_search.js.erb index 6ce09fcbd..62be24f7d 100644 --- a/app/assets/javascripts/bp_search.js.erb +++ b/app/assets/javascripts/bp_search.js.erb @@ -293,7 +293,7 @@ function currentSearchParams() { params.require_definition = jQuery("#search_require_definition").is(":checked"); params.exact_match = jQuery("#search_exact_match").is(":checked"); params.categories = jQuery("#search_categories").val() || ""; - params.lang = jQuery("#search_language").val() || ""; + params.lang = jQuery("#select_search_language").val() || ""; return params; } @@ -328,7 +328,7 @@ function performSearch() { includeOnlyDefinitions = jQuery("#search_require_definition").is(":checked"), exactMatch = jQuery("#search_exact_match").is(":checked"), categories = jQuery("#search_categories").val() || ""; - language = jQuery("#search_language").val() || ""; + language = jQuery("#select_search_language").val() || ""; // Set the list of search words to be blacklisted for the ontology ownership algorithm blacklistSearchWordsArr = query.split(/\s+/); diff --git a/app/views/search/index.html.haml b/app/views/search/index.html.haml index 67d70551b..0382387a9 100644 --- a/app/views/search/index.html.haml +++ b/app/views/search/index.html.haml @@ -19,7 +19,8 @@ %div.form-group.row %div.col-sm-2.mb-4 Search language %div.col-sm-10.mb-4 - = render SelectInputComponent.new(id: "", name: "", values: [{id: "fr", title: "French", icon: "fi fi-fr fis"}, {id: "en", title: "English", icon: "fi fi-us fis"}], withIcon: true, placeholder: "Choose language") + %div.w-25 + = render SelectInputComponent.new(id: "search_language", name: "search_language", values: [{id: "fr", title: "French", icon: "fi fi-fr fis"}, {id: "en", title: "English", icon: "fi fi-us fis"}], withIcon: true, placeholder: "Choose language") %div.col-sm-2= t("search.include_in_search") + ":" %div.col-sm-10 %div.form-check From 71fa2f681d08fc6322e4446a905939d044864db7 Mon Sep 17 00:00:00 2001 From: HADDAD Zineddine Date: Sun, 27 Aug 2023 14:31:42 +0000 Subject: [PATCH 13/19] remove << HEAD --- app/components/select_input_component.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/components/select_input_component.rb b/app/components/select_input_component.rb index 279964a5a..367a078a3 100644 --- a/app/components/select_input_component.rb +++ b/app/components/select_input_component.rb @@ -41,11 +41,7 @@ def select_input_tag(id, values, selected, options = {}) 'select-input-options-value': @values, } } -<<<<<<< HEAD -======= - ->>>>>>> development select_tag(id, options_for_select(values, selected), select_html_options) end end From f1e2f34fbd613019e65fa52749a86de9abb3bc96 Mon Sep 17 00:00:00 2001 From: Syphax Bouazzouni Date: Tue, 5 Sep 2023 01:57:39 +0200 Subject: [PATCH 14/19] update tom select component to use options inner HTML text to show icons --- app/components/select_input_component.rb | 25 +++++------- .../select_input_component_controller.js | 38 ++++++------------- .../input/select_component_preview.rb | 11 ++++-- 3 files changed, 28 insertions(+), 46 deletions(-) diff --git a/app/components/select_input_component.rb b/app/components/select_input_component.rb index 367a078a3..d86e929ae 100644 --- a/app/components/select_input_component.rb +++ b/app/components/select_input_component.rb @@ -2,22 +2,19 @@ class SelectInputComponent < ViewComponent::Base - def initialize(id: "", name: "[]", values: [], selected: "", multiple: false, open_to_add_values: false, withIcon: false, valueField: false, searchField: false, placeholder: "") + def initialize(id: '', name: '[]', values: [], selected: '', multiple: false, open_to_add_values: false, placeholder: '') super - @id = id || "" + @id = id || '' @name = name @values = values @selected = selected @multiple = multiple @open_to_add_values = open_to_add_values - @withIcon = withIcon - @valueField = valueField - @searchField = searchField @placeholder = placeholder end - - def call - select_input_tag(@id, @values, @selected, multiple: @multiple, open_to_add_values: @open_to_add_values, withIcon: @withIcon, placeholder: @placeholder) + + def call + select_input_tag(@id, @values, @selected, multiple: @multiple, open_to_add_values: @open_to_add_values, placeholder: @placeholder) end private @@ -25,23 +22,19 @@ def call def select_input_tag(id, values, selected, options = {}) multiple = options[:multiple] || false open_to_add_values = options[:open_to_add_values] || false - withIcon = options[:withIcon] || false placeholder = options[:placeholder] || '' - select_html_options = { id: "select_#{id}", placeholder: placeholder, - autocomplete: "off", + autocomplete: 'off', multiple: multiple, data: { - controller: "select-input", - 'select-input-with-icon-value': withIcon, + controller: 'select-input', 'select-input-multiple-value': multiple, - 'select-input-open-add-value': open_to_add_values, - 'select-input-options-value': @values, + 'select-input-open-add-value': open_to_add_values } } - + select_tag(id, options_for_select(values, selected), select_html_options) end end diff --git a/app/components/select_input_component/select_input_component_controller.js b/app/components/select_input_component/select_input_component_controller.js index 6535c149e..0a2e6e5da 100644 --- a/app/components/select_input_component/select_input_component_controller.js +++ b/app/components/select_input_component/select_input_component_controller.js @@ -1,42 +1,26 @@ -import { Controller } from "@hotwired/stimulus" +import {Controller} from "@hotwired/stimulus" import TomSelect from "tom-select" export default class extends Controller { static values = { - multiple: { type: Boolean, default: false }, - openAdd: { type: Boolean, default: false }, - withIcon: { type: Boolean, default: false }, - valueField: { type: String, default: 'id' }, - searchField: { type: String, default: 'title' }, - options: { type: Array, default: [] } + multiple: {type: Boolean, default: false}, + openAdd: {type: Boolean, default: false} }; connect() { let myOptions = {} - if (this.withIconValue) { - myOptions = { - valueField: this.valueFieldValue, - searchField: this.searchFieldValue, - options: this.optionsValue, - render: { - option: (data, escape) => { - return `
- - ${escape(data.title)} -
`; - }, - item: (data, escape) => { - return `
- - ${escape(data.title)} -
`; - } + myOptions = { + create: true, + render: { + option: (data) => { + return `
${data.text}
` + }, + item: (data) => { + return `
${data.text}
` } } - - } if (this.multipleValue) { diff --git a/test/components/previews/input/select_component_preview.rb b/test/components/previews/input/select_component_preview.rb index 1a27fdd1a..e8f89cb73 100644 --- a/test/components/previews/input/select_component_preview.rb +++ b/test/components/previews/input/select_component_preview.rb @@ -11,12 +11,17 @@ def multiple(id: "", name: "", values: ["choices 1", "choices 2", "choices 3"], render Input::SelectComponent.new(id: id, name: name, value: values, selected: selected, multiple: multiple, open_to_add_values: open_to_add_values) end - def open_to_add(id: "", name: "", values: ["choices 1", "choices 2", "choices 3"], selected: "choices 2", multiple: true , open_to_add_values: true) + def open_to_add(id: "", name: "", values: ["choices 1", "choices 2", "choices 3"], selected: "choices 2", multiple: true, open_to_add_values: true) render Input::SelectComponent.new(id: id, name: name, value: values, selected: selected, multiple: multiple, open_to_add_values: open_to_add_values) end - def with_icon(id: "", name: "", values: [{id: "fr", title: "French", icon: "fi fi-fr fis"}, {id: "en", title: "English", icon: "fi fi-us fis"}], withIcon: true, placeholder: "Choose language") - render SelectInputComponent.new(id: id, name: name, values: values, withIcon: withIcon, placeholder: placeholder) + def with_icon + values = [ + ['', ''], + ["\nFR", 'fr'], + ["\nEN", 'en'] + ] + render SelectInputComponent.new(id: 'id', name: 'name', values: values, placeholder: 'Choose a language') end end From 4c1f6b1fcefebb9d503b37534cef537983a0217c Mon Sep 17 00:00:00 2001 From: Syphax Bouazzouni Date: Tue, 5 Sep 2023 02:03:19 +0200 Subject: [PATCH 15/19] add lag-icons-rails and iso-639 gems to handle flags display and update code usage --- Gemfile | 2 + Gemfile.lock | 87 ++++--- app/assets/images/flags32.png | Bin 89104 -> 0 bytes .../stylesheets/application.css.scss.erb | 1 + .../stylesheets/themes/lirmm/flags32.scss | 245 ------------------ app/components/language_field_component.rb | 25 +- .../language_field_component.html.haml | 11 +- app/controllers/ontologies_controller.rb | 5 - app/views/layouts/_header.html.erb | 4 - .../_attribute_inline.html.haml | 11 +- 10 files changed, 74 insertions(+), 317 deletions(-) delete mode 100644 app/assets/images/flags32.png delete mode 100644 app/assets/stylesheets/themes/lirmm/flags32.scss diff --git a/Gemfile b/Gemfile index ddb44b4b0..e7fc36725 100644 --- a/Gemfile +++ b/Gemfile @@ -75,6 +75,8 @@ gem 'will_paginate', '~> 3.0' gem 'inline_svg' gem "lookbook", '~> 1.5.5' gem 'ontologies_api_client', git: 'https://github.com/ontoportal-lirmm/ontologies_api_ruby_client.git', branch: 'development' +gem "flag-icons-rails", "~> 3.4" +gem "iso-639", "~> 0.3.6" # Multi-Provider Authentication gem 'omniauth' diff --git a/Gemfile.lock b/Gemfile.lock index 6e4f2b162..25804aa14 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -85,11 +85,12 @@ GEM addressable (2.8.5) public_suffix (>= 2.0.2, < 6.0) aes_key_wrap (1.1.0) - airbrussh (1.4.1) + airbrussh (1.4.2) sshkit (>= 1.6.1, != 1.7.0) ast (2.4.2) autoprefixer-rails (10.4.13.0) execjs (~> 2) + base64 (0.1.1) bcrypt_pbkdf (1.1.0) bindata (2.4.15) bindex (0.8.1) @@ -131,7 +132,7 @@ GEM coderay (1.1.3) concurrent-ruby (1.2.2) crass (1.0.6) - css_parser (1.14.0) + css_parser (1.16.0) addressable cube-ruby (0.0.3) daemons (1.4.1) @@ -147,7 +148,7 @@ GEM erubi (1.12.0) erubis (2.7.0) eventmachine (1.2.7) - excon (0.100.0) + excon (0.102.0) execjs (2.8.1) faraday (2.0.1) faraday-net_http (~> 2.0) @@ -161,10 +162,12 @@ GEM multipart-post (~> 2) faraday-net_http (2.1.0) ffi (1.15.5) + flag-icons-rails (3.4.6.1) + sass-rails flamegraph (0.9.5) - globalid (1.1.0) - activesupport (>= 5.0) - graphql (2.0.24) + globalid (1.2.0) + activesupport (>= 6.1) + graphql (2.1.0) graphql-client (0.18.0) activesupport (>= 3.0) graphql @@ -194,6 +197,7 @@ GEM io-console (0.6.0) irb (1.7.4) reline (>= 0.3.6) + iso-639 (0.3.6) jquery-rails (4.6.0) rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) @@ -239,10 +243,11 @@ GEM marcel (1.0.2) matrix (0.4.2) method_source (1.0.0) - mime-types (3.4.1) + mime-types (3.5.1) mime-types-data (~> 3.2015) - mime-types-data (3.2023.0218.1) - mini_mime (1.1.2) + mime-types-data (3.2023.0808) + mini_mime (1.1.5) + mini_portile2 (2.8.4) minitest (5.19.0) msgpack (1.7.2) multi_json (1.15.0) @@ -267,11 +272,14 @@ GEM net-protocol net-ssh (7.2.0) netrc (0.11.0) - newrelic_rpm (9.3.1) + newrelic_rpm (9.4.2) nio4r (2.5.9) - nokogiri (1.15.3-x86_64-darwin) + nokogiri (1.15.4) + mini_portile2 (~> 2.8.2) + racc (~> 1.4) + nokogiri (1.15.4-x86_64-darwin) racc (~> 1.4) - nokogiri (1.15.3-x86_64-linux) + nokogiri (1.15.4-x86_64-linux) racc (~> 1.4) oauth2 (1.4.11) faraday (>= 0.17.3, < 3.0) @@ -279,31 +287,33 @@ GEM multi_json (~> 1.3) multi_xml (~> 0.5) rack (>= 1.2, < 4) - oj (3.15.1) - omniauth (1.9.2) + oj (3.16.1) + omniauth (2.1.1) hashie (>= 3.4.6) - rack (>= 1.6.2, < 3) - omniauth-github (1.4.0) - omniauth (~> 1.5) - omniauth-oauth2 (>= 1.4.0, < 2.0) - omniauth-google-oauth2 (0.8.2) + rack (>= 2.2.3) + rack-protection + omniauth-github (2.0.0) + omniauth (~> 2.0) + omniauth-oauth2 (~> 1.7.1) + omniauth-google-oauth2 (1.0.1) jwt (>= 2.0) oauth2 (~> 1.1) - omniauth (~> 1.1) - omniauth-oauth2 (>= 1.6) - omniauth-keycloak (1.2.1) - json-jwt (~> 1.12) - omniauth (~> 1.9.0) - omniauth-oauth2 (~> 1.6.0) - omniauth-oauth2 (1.6.0) - oauth2 (~> 1.1) - omniauth (~> 1.9) + omniauth (~> 2.0) + omniauth-oauth2 (~> 1.7.1) + omniauth-keycloak (1.5.1) + faraday + json-jwt (> 1.13.0) + omniauth (>= 2.0) + omniauth-oauth2 (~> 1.7.1) + omniauth-oauth2 (1.7.3) + oauth2 (>= 1.4, < 3) + omniauth (>= 1.9, < 3) omniauth-orcid (2.1.1) omniauth-oauth2 (~> 1.3) ruby_dig (~> 0.0.2) - omniauth-rails_csrf_protection (0.1.2) + omniauth-rails_csrf_protection (1.0.1) actionpack (>= 4.2) - omniauth (>= 1.3.1) + omniauth (~> 2.0) open_uri_redirections (0.2.1) parallel (1.23.0) parser (3.2.2.3) @@ -315,7 +325,7 @@ GEM method_source (~> 1.0) psych (3.3.4) public_suffix (5.0.3) - puma (5.6.6) + puma (5.6.7) nio4r (~> 2.0) racc (1.7.1) rack (2.2.8) @@ -323,6 +333,8 @@ GEM rack (>= 0.4) rack-mini-profiler (3.1.1) rack (>= 1.2.0) + rack-protection (3.1.0) + rack (~> 2.2, >= 2.2.4) rack-test (2.1.0) rack (>= 1.3) rails (7.0.3) @@ -346,7 +358,7 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - rails-i18n (7.0.7) + rails-i18n (7.0.8) i18n (>= 0.7, < 2) railties (>= 6.0.0, < 8) rails_autolink (1.1.8) @@ -370,7 +382,7 @@ GEM json redcarpet (3.6.0) regexp_parser (2.8.1) - reline (0.3.7) + reline (0.3.8) io-console (~> 0.5) rest-client (2.1.0) http-accept (>= 1.7.0, < 2.0) @@ -396,7 +408,8 @@ GEM rspec-mocks (~> 3.12) rspec-support (~> 3.12) rspec-support (3.12.1) - rubocop (1.55.1) + rubocop (1.56.2) + base64 (~> 0.1.1) json (~> 2.3) language_server-protocol (>= 3.17.0) parallel (~> 1.10) @@ -415,6 +428,8 @@ GEM ruby_parser (3.20.3) sexp_processor (~> 4.16) rubyzip (2.3.2) + sass-rails (6.0.0) + sassc-rails (~> 2.1, >= 2.1.1) sassc (2.4.0) ffi (~> 1.9) sassc-rails (2.1.2) @@ -441,7 +456,7 @@ GEM net-scp (>= 1.1.2) net-ssh (>= 2.8.0) stackprof (0.2.25) - stimulus-rails (1.2.1) + stimulus-rails (1.2.2) railties (>= 6.0.0) temple (0.10.2) terser (1.1.17) @@ -516,6 +531,7 @@ DEPENDENCIES dalli debug ed25519 (>= 1.2, < 2.0) + flag-icons-rails (~> 3.4) flamegraph graphql-client haml (~> 5.1) @@ -524,6 +540,7 @@ DEPENDENCIES iconv importmap-rails inline_svg + iso-639 (~> 0.3.6) jquery-rails jquery-ui-rails jsbundling-rails diff --git a/app/assets/images/flags32.png b/app/assets/images/flags32.png deleted file mode 100644 index a9a45aef81d475e7053ee8ccf3750d05e48e923c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89104 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 Dn&x!a diff --git a/app/assets/stylesheets/application.css.scss.erb b/app/assets/stylesheets/application.css.scss.erb index e509a4f5d..972fd30c8 100755 --- a/app/assets/stylesheets/application.css.scss.erb +++ b/app/assets/stylesheets/application.css.scss.erb @@ -20,6 +20,7 @@ *= require thickbox *= require select2 *= require trumbowyg + *= require flag-icon *= require theme-variables */ diff --git a/app/assets/stylesheets/themes/lirmm/flags32.scss b/app/assets/stylesheets/themes/lirmm/flags32.scss deleted file mode 100644 index 2a7323d7c..000000000 --- a/app/assets/stylesheets/themes/lirmm/flags32.scss +++ /dev/null @@ -1,245 +0,0 @@ -.f32 .flag{display:inline-block;height:32px;width:32px;vertical-align:text-top;line-height:32px;background-image: image-url('flags32.png');background-repeat:no-repeat;} -.f32 ._African_Union{background-position:0 -32px;} -.f32 ._Arab_League{background-position:0 -64px;} -.f32 ._ASEAN{background-position:0 -96px;} -.f32 ._CARICOM{background-position:0 -128px;} -.f32 ._CIS{background-position:0 -160px;} -.f32 ._Commonwealth{background-position:0 -192px;} -.f32 ._England{background-position:0 -224px;} -.f32 ._European_Union{background-position:0 -256px;} -.f32 ._Islamic_Conference{background-position:0 -288px;} -.f32 ._Kosovo{background-position:0 -320px;} -.f32 ._NATO{background-position:0 -352px;} -.f32 ._Northern_Cyprus{background-position:0 -384px;} -.f32 ._Northern_Ireland{background-position:0 -416px;} -.f32 ._Olimpic_Movement{background-position:0 -448px;} -.f32 ._OPEC{background-position:0 -480px;} -.f32 ._Red_Cross{background-position:0 -512px;} -.f32 ._Scotland{background-position:0 -544px;} -.f32 ._Somaliland{background-position:0 -576px;} -.f32 ._Tibet{background-position:0 -608px;} -.f32 ._United_Nations{background-position:0 -640px;} -.f32 ._Wales{background-position:0 -672px;} -.f32 .ad{background-position:0 -704px;} -.f32 .ae{background-position:0 -736px;} -.f32 .af{background-position:0 -768px;} -.f32 .ag{background-position:0 -800px;} -.f32 .ai{background-position:0 -832px;} -.f32 .al{background-position:0 -864px;} -.f32 .am{background-position:0 -896px;} -.f32 .an{background-position:0 -928px;} -.f32 .ao{background-position:0 -960px;} -.f32 .aq{background-position:0 -992px;} -.f32 .ar{background-position:0 -1024px;} -.f32 .as{background-position:0 -1056px;} -.f32 .at{background-position:0 -1088px;} -.f32 .au{background-position:0 -1120px;} -.f32 .aw{background-position:0 -1152px;} -.f32 .az{background-position:0 -1184px;} -.f32 .ba{background-position:0 -1216px;} -.f32 .bb{background-position:0 -1248px;} -.f32 .bd{background-position:0 -1280px;} -.f32 .be{background-position:0 -1312px;} -.f32 .bf{background-position:0 -1344px;} -.f32 .bg{background-position:0 -1376px;} -.f32 .bh{background-position:0 -1408px;} -.f32 .bi{background-position:0 -1440px;} -.f32 .bj{background-position:0 -1472px;} -.f32 .bm{background-position:0 -1504px;} -.f32 .bn{background-position:0 -1536px;} -.f32 .bo{background-position:0 -1568px;} -.f32 .br{background-position:0 -1600px;} -.f32 .bs{background-position:0 -1632px;} -.f32 .bt{background-position:0 -1664px;} -.f32 .bw{background-position:0 -1696px;} -.f32 .by{background-position:0 -1728px;} -.f32 .bz{background-position:0 -1760px;} -.f32 .ca{background-position:0 -1792px;} -.f32 .cd{background-position:0 -1824px;} -.f32 .cf{background-position:0 -1856px;} -.f32 .cg{background-position:0 -1888px;} -.f32 .ch{background-position:0 -1920px;} -.f32 .ci{background-position:0 -1952px;} -.f32 .ck{background-position:0 -1984px;} -.f32 .cl{background-position:0 -2016px;} -.f32 .cm{background-position:0 -2048px;} -.f32 .cn{background-position:0 -2080px;} -.f32 .co{background-position:0 -2112px;} -.f32 .cr{background-position:0 -2144px;} -.f32 .cu{background-position:0 -2176px;} -.f32 .cv{background-position:0 -2208px;} -.f32 .cy{background-position:0 -2240px;} -.f32 .cz{background-position:0 -2272px;} -.f32 .de{background-position:0 -2304px;} -.f32 .dj{background-position:0 -2336px;} -.f32 .dk{background-position:0 -2368px;} -.f32 .dm{background-position:0 -2400px;} -.f32 .do{background-position:0 -2432px;} -.f32 .dz{background-position:0 -2464px;} -.f32 .ec{background-position:0 -2496px;} -.f32 .ee{background-position:0 -2528px;} -.f32 .eg{background-position:0 -2560px;} -.f32 .eh{background-position:0 -2592px;} -.f32 .er{background-position:0 -2624px;} -.f32 .es{background-position:0 -2656px;} -.f32 .et{background-position:0 -2688px;} -.f32 .fi{background-position:0 -2720px;} -.f32 .fj{background-position:0 -2752px;} -.f32 .fm{background-position:0 -2784px;} -.f32 .fo{background-position:0 -2816px;} -.f32 .fr{background-position:0 -2848px;} -.f32 .ga{background-position:0 -2880px;} -.f32 .gb{background-position:0 -2912px;} -.f32 .gd{background-position:0 -2944px;} -.f32 .ge{background-position:0 -2976px;} -.f32 .gg{background-position:0 -3008px;} -.f32 .gh{background-position:0 -3040px;} -.f32 .gi{background-position:0 -3072px;} -.f32 .gl{background-position:0 -3104px;} -.f32 .gm{background-position:0 -3136px;} -.f32 .gn{background-position:0 -3168px;} -.f32 .gp{background-position:0 -3200px;} -.f32 .gq{background-position:0 -3232px;} -.f32 .gr{background-position:0 -3264px;} -.f32 .gt{background-position:0 -3296px;} -.f32 .gu{background-position:0 -3328px;} -.f32 .gw{background-position:0 -3360px;} -.f32 .gy{background-position:0 -3392px;} -.f32 .hk{background-position:0 -3424px;} -.f32 .hn{background-position:0 -3456px;} -.f32 .hr{background-position:0 -3488px;} -.f32 .ht{background-position:0 -3520px;} -.f32 .hu{background-position:0 -3552px;} -.f32 .id{background-position:0 -3584px;} -.f32 .mc{background-position:0 -3584px;} -.f32 .ie{background-position:0 -3616px;} -.f32 .il{background-position:0 -3648px;} -.f32 .im{background-position:0 -3680px;} -.f32 .in{background-position:0 -3712px;} -.f32 .iq{background-position:0 -3744px;} -.f32 .ir{background-position:0 -3776px;} -.f32 .is{background-position:0 -3808px;} -.f32 .it{background-position:0 -3840px;} -.f32 .je{background-position:0 -3872px;} -.f32 .jm{background-position:0 -3904px;} -.f32 .jo{background-position:0 -3936px;} -.f32 .jp{background-position:0 -3968px;} -.f32 .ke{background-position:0 -4000px;} -.f32 .kg{background-position:0 -4032px;} -.f32 .kh{background-position:0 -4064px;} -.f32 .ki{background-position:0 -4096px;} -.f32 .km{background-position:0 -4128px;} -.f32 .kn{background-position:0 -4160px;} -.f32 .kp{background-position:0 -4192px;} -.f32 .kr{background-position:0 -4224px;} -.f32 .kw{background-position:0 -4256px;} -.f32 .ky{background-position:0 -4288px;} -.f32 .kz{background-position:0 -4320px;} -.f32 .la{background-position:0 -4352px;} -.f32 .lb{background-position:0 -4384px;} -.f32 .lc{background-position:0 -4416px;} -.f32 .li{background-position:0 -4448px;} -.f32 .lk{background-position:0 -4480px;} -.f32 .lr{background-position:0 -4512px;} -.f32 .ls{background-position:0 -4544px;} -.f32 .lt{background-position:0 -4576px;} -.f32 .lu{background-position:0 -4608px;} -.f32 .lv{background-position:0 -4640px;} -.f32 .ly{background-position:0 -4672px;} -.f32 .ma{background-position:0 -4704px;} -.f32 .md{background-position:0 -4736px;} -.f32 .me{background-position:0 -4768px;} -.f32 .mg{background-position:0 -4800px;} -.f32 .mh{background-position:0 -4832px;} -.f32 .mk{background-position:0 -4864px;} -.f32 .ml{background-position:0 -4896px;} -.f32 .mm{background-position:0 -4928px;} -.f32 .mn{background-position:0 -4960px;} -.f32 .mo{background-position:0 -4992px;} -.f32 .mq{background-position:0 -5024px;} -.f32 .mr{background-position:0 -5056px;} -.f32 .ms{background-position:0 -5088px;} -.f32 .mt{background-position:0 -5120px;} -.f32 .mu{background-position:0 -5152px;} -.f32 .mv{background-position:0 -5184px;} -.f32 .mw{background-position:0 -5216px;} -.f32 .mx{background-position:0 -5248px;} -.f32 .my{background-position:0 -5280px;} -.f32 .mz{background-position:0 -5312px;} -.f32 .na{background-position:0 -5344px;} -.f32 .nc{background-position:0 -5376px;} -.f32 .ne{background-position:0 -5408px;} -.f32 .ng{background-position:0 -5440px;} -.f32 .ni{background-position:0 -5472px;} -.f32 .nl{background-position:0 -5504px;} -.f32 .no{background-position:0 -5536px;} -.f32 .np{background-position:0 -5568px;} -.f32 .nr{background-position:0 -5600px;} -.f32 .nz{background-position:0 -5632px;} -.f32 .om{background-position:0 -5664px;} -.f32 .pa{background-position:0 -5696px;} -.f32 .pe{background-position:0 -5728px;} -.f32 .pf{background-position:0 -5760px;} -.f32 .pg{background-position:0 -5792px;} -.f32 .ph{background-position:0 -5824px;} -.f32 .pk{background-position:0 -5856px;} -.f32 .pl{background-position:0 -5888px;} -.f32 .pr{background-position:0 -5920px;} -.f32 .ps{background-position:0 -5952px;} -.f32 .pt{background-position:0 -5984px;} -.f32 .pw{background-position:0 -6016px;} -.f32 .py{background-position:0 -6048px;} -.f32 .qa{background-position:0 -6080px;} -.f32 .re{background-position:0 -6112px;} -.f32 .ro{background-position:0 -6144px;} -.f32 .rs{background-position:0 -6176px;} -.f32 .ru{background-position:0 -6208px;} -.f32 .rw{background-position:0 -6240px;} -.f32 .sa{background-position:0 -6272px;} -.f32 .sb{background-position:0 -6304px;} -.f32 .sc{background-position:0 -6336px;} -.f32 .sd{background-position:0 -6368px;} -.f32 .se{background-position:0 -6400px;} -.f32 .sg{background-position:0 -6432px;} -.f32 .si{background-position:0 -6464px;} -.f32 .sk{background-position:0 -6496px;} -.f32 .sl{background-position:0 -6528px;} -.f32 .sm{background-position:0 -6560px;} -.f32 .sn{background-position:0 -6592px;} -.f32 .so{background-position:0 -6624px;} -.f32 .sr{background-position:0 -6656px;} -.f32 .st{background-position:0 -6688px;} -.f32 .sv{background-position:0 -6720px;} -.f32 .sy{background-position:0 -6752px;} -.f32 .sz{background-position:0 -6784px;} -.f32 .tc{background-position:0 -6816px;} -.f32 .td{background-position:0 -6848px;} -.f32 .tg{background-position:0 -6880px;} -.f32 .th{background-position:0 -6912px;} -.f32 .tj{background-position:0 -6944px;} -.f32 .tl{background-position:0 -6976px;} -.f32 .tm{background-position:0 -7008px;} -.f32 .tn{background-position:0 -7040px;} -.f32 .to{background-position:0 -7072px;} -.f32 .tr{background-position:0 -7104px;} -.f32 .tt{background-position:0 -7136px;} -.f32 .tv{background-position:0 -7168px;} -.f32 .tw{background-position:0 -7200px;} -.f32 .tz{background-position:0 -7232px;} -.f32 .ua{background-position:0 -7264px;} -.f32 .ug{background-position:0 -7296px;} -.f32 .us{background-position:0 -7328px;} -.f32 .uy{background-position:0 -7360px;} -.f32 .uz{background-position:0 -7392px;} -.f32 .va{background-position:0 -7424px;} -.f32 .vc{background-position:0 -7456px;} -.f32 .ve{background-position:0 -7488px;} -.f32 .vg{background-position:0 -7520px;} -.f32 .vi{background-position:0 -7552px;} -.f32 .vn{background-position:0 -7584px;} -.f32 .vu{background-position:0 -7616px;} -.f32 .ws{background-position:0 -7648px;} -.f32 .ye{background-position:0 -7680px;} -.f32 .za{background-position:0 -7712px;} -.f32 .zm{background-position:0 -7744px;} -.f32 .zw{background-position:0 -7744px;} \ No newline at end of file diff --git a/app/components/language_field_component.rb b/app/components/language_field_component.rb index 6922f855e..2fde7ebfb 100644 --- a/app/components/language_field_component.rb +++ b/app/components/language_field_component.rb @@ -1,26 +1,23 @@ # frozen_string_literal: true +require 'iso-639' class LanguageFieldComponent < ViewComponent::Base - LEXVO_TO_FLAG = { 'http://lexvo.org/id/iso639-3/aar' => 'aa', 'http://lexvo.org/id/iso639-3/abk' => 'ab', - 'http://lexvo.org/id/iso639-3/ave' => 'ae', 'http://lexvo.org/id/iso639-3/afr' => 'af', - 'http://lexvo.org/id/iso639-3/aka' => 'ak', 'http://lexvo.org/id/iso639-3/amh' => 'am', - 'http://lexvo.org/id/iso639-3/arg' => 'an', 'http://lexvo.org/id/iso639-3/ara' => 'ar', 'http://lexvo.org/id/iso639-3/asm' => 'as', 'http://lexvo.org/id/iso639-3/ava' => 'av', 'http://lexvo.org/id/iso639-3/aym' => 'ay', 'http://lexvo.org/id/iso639-3/aze' => 'az', 'http://lexvo.org/id/iso639-3/bak' => 'ba', 'http://lexvo.org/id/iso639-3/bel' => 'be', 'http://lexvo.org/id/iso639-3/bul' => 'bg', 'http://lexvo.org/id/iso639-3/bis' => 'bi', 'http://lexvo.org/id/iso639-3/bam' => 'bm', 'http://lexvo.org/id/iso639-3/ben' => 'bn', 'http://lexvo.org/id/iso639-3/bod' => 'bo', 'http://lexvo.org/id/iso639-3/bre' => 'br', 'http://lexvo.org/id/iso639-3/bos' => 'bs', 'http://lexvo.org/id/iso639-3/cat' => 'ca', 'http://lexvo.org/id/iso639-3/che' => 'ce', 'http://lexvo.org/id/iso639-3/cha' => 'ch', 'http://lexvo.org/id/iso639-3/cos' => 'co', 'http://lexvo.org/id/iso639-3/cre' => 'cr', 'http://lexvo.org/id/iso639-3/ces' => 'cs', 'http://lexvo.org/id/iso639-3/chu' => 'cu', 'http://lexvo.org/id/iso639-3/chv' => 'cv', 'http://lexvo.org/id/iso639-3/cym' => 'cy', 'http://lexvo.org/id/iso639-3/dan' => 'da', 'http://lexvo.org/id/iso639-3/deu' => 'de', 'http://lexvo.org/id/iso639-3/div' => 'dv', 'http://lexvo.org/id/iso639-3/dzo' => 'dz', 'http://lexvo.org/id/iso639-3/ewe' => 'ee', 'http://lexvo.org/id/iso639-3/ell' => 'el', 'http://lexvo.org/id/iso639-3/eng' => 'en', 'http://lexvo.org/id/iso639-3/epo' => 'eo', 'http://lexvo.org/id/iso639-3/spa' => 'es', 'http://lexvo.org/id/iso639-3/est' => 'et', 'http://lexvo.org/id/iso639-3/eus' => 'eu', 'http://lexvo.org/id/iso639-3/fas' => 'fa', 'http://lexvo.org/id/iso639-3/ful' => 'ff', 'http://lexvo.org/id/iso639-3/fin' => 'fi', 'http://lexvo.org/id/iso639-3/fij' => 'fj', 'http://lexvo.org/id/iso639-3/fao' => 'fo', 'http://lexvo.org/id/iso639-3/fra' => 'fr', 'http://lexvo.org/id/iso639-3/fry' => 'fy', 'http://lexvo.org/id/iso639-3/gle' => 'ga', 'http://lexvo.org/id/iso639-3/gla' => 'gd', 'http://lexvo.org/id/iso639-3/glg' => 'gl', 'http://lexvo.org/id/iso639-3/grn' => 'gn', 'http://lexvo.org/id/iso639-3/guj' => 'gu', 'http://lexvo.org/id/iso639-3/glv' => 'gv', 'http://lexvo.org/id/iso639-3/hau' => 'ha', 'http://lexvo.org/id/iso639-3/heb' => 'he', 'http://lexvo.org/id/iso639-3/hin' => 'hi', 'http://lexvo.org/id/iso639-3/hmo' => 'ho', 'http://lexvo.org/id/iso639-3/hrv' => 'hr', 'http://lexvo.org/id/iso639-3/hat' => 'ht', 'http://lexvo.org/id/iso639-3/hun' => 'hu', 'http://lexvo.org/id/iso639-3/hye' => 'hy', 'http://lexvo.org/id/iso639-3/her' => 'hz', 'http://lexvo.org/id/iso639-3/ina' => 'ia', 'http://lexvo.org/id/iso639-3/ind' => 'id', 'http://lexvo.org/id/iso639-3/ile' => 'ie', 'http://lexvo.org/id/iso639-3/ibo' => 'ig', 'http://lexvo.org/id/iso639-3/iii' => 'ii', 'http://lexvo.org/id/iso639-3/ipk' => 'ik', 'http://lexvo.org/id/iso639-3/ido' => 'io', 'http://lexvo.org/id/iso639-3/isl' => 'is', 'http://lexvo.org/id/iso639-3/ita' => 'it', 'http://lexvo.org/id/iso639-3/iku' => 'iu', 'http://lexvo.org/id/iso639-3/jpn' => 'ja', 'http://lexvo.org/id/iso639-3/jav' => 'jv', 'http://lexvo.org/id/iso639-3/kat' => 'ka', 'http://lexvo.org/id/iso639-3/kon' => 'kg', 'http://lexvo.org/id/iso639-3/kik' => 'ki', 'http://lexvo.org/id/iso639-3/kua' => 'kj', 'http://lexvo.org/id/iso639-3/kaz' => 'kk', 'http://lexvo.org/id/iso639-3/kal' => 'kl', 'http://lexvo.org/id/iso639-3/khm' => 'km', 'http://lexvo.org/id/iso639-3/kan' => 'kn', 'http://lexvo.org/id/iso639-3/kor' => 'ko', 'http://lexvo.org/id/iso639-3/kau' => 'kr', 'http://lexvo.org/id/iso639-3/kas' => 'ks', 'http://lexvo.org/id/iso639-3/kur' => 'ku', 'http://lexvo.org/id/iso639-3/kom' => 'kv', 'http://lexvo.org/id/iso639-3/cor' => 'kw', 'http://lexvo.org/id/iso639-3/kir' => 'ky', 'http://lexvo.org/id/iso639-3/lat' => 'la', 'http://lexvo.org/id/iso639-3/ltz' => 'lb', 'http://lexvo.org/id/iso639-3/lug' => 'lg', 'http://lexvo.org/id/iso639-3/lim' => 'li', 'http://lexvo.org/id/iso639-3/lin' => 'ln', 'http://lexvo.org/id/iso639-3/lao' => 'lo', 'http://lexvo.org/id/iso639-3/lit' => 'lt', 'http://lexvo.org/id/iso639-3/lub' => 'lu', 'http://lexvo.org/id/iso639-3/lav' => 'lv', 'http://lexvo.org/id/iso639-3/mlg' => 'mg', 'http://lexvo.org/id/iso639-3/mah' => 'mh', 'http://lexvo.org/id/iso639-3/mri' => 'mi', 'http://lexvo.org/id/iso639-3/mkd' => 'mk', 'http://lexvo.org/id/iso639-3/mal' => 'ml', 'http://lexvo.org/id/iso639-3/mon' => 'mn', 'http://lexvo.org/id/iso639-3/mar' => 'mr', 'http://lexvo.org/id/iso639-3/msa' => 'ms', 'http://lexvo.org/id/iso639-3/mlt' => 'mt', 'http://lexvo.org/id/iso639-3/mya' => 'my', 'http://lexvo.org/id/iso639-3/nau' => 'na', 'http://lexvo.org/id/iso639-3/nob' => 'nb', 'http://lexvo.org/id/iso639-3/nde' => 'nd', 'http://lexvo.org/id/iso639-3/nep' => 'ne', 'http://lexvo.org/id/iso639-3/ndo' => 'ng', 'http://lexvo.org/id/iso639-3/nld' => 'nl', 'http://lexvo.org/id/iso639-3/nno' => 'nn', 'http://lexvo.org/id/iso639-3/nor' => 'no', 'http://lexvo.org/id/iso639-3/nbl' => 'nr', 'http://lexvo.org/id/iso639-3/nav' => 'nv', 'http://lexvo.org/id/iso639-3/nya' => 'ny', 'http://lexvo.org/id/iso639-3/oci' => 'oc', 'http://lexvo.org/id/iso639-3/oji' => 'oj', 'http://lexvo.org/id/iso639-3/orm' => 'om', 'http://lexvo.org/id/iso639-3/ori' => 'or', 'http://lexvo.org/id/iso639-3/oss' => 'os', 'http://lexvo.org/id/iso639-3/pan' => 'pa', 'http://lexvo.org/id/iso639-3/pli' => 'pi', 'http://lexvo.org/id/iso639-3/pol' => 'pl', 'http://lexvo.org/id/iso639-3/pus' => 'ps', 'http://lexvo.org/id/iso639-3/por' => 'pt', 'http://lexvo.org/id/iso639-3/que' => 'qu', 'http://lexvo.org/id/iso639-3/roh' => 'rm', 'http://lexvo.org/id/iso639-3/run' => 'rn', 'http://lexvo.org/id/iso639-3/ron' => 'ro', 'http://lexvo.org/id/iso639-3/rus' => 'ru', 'http://lexvo.org/id/iso639-3/kin' => 'rw', 'http://lexvo.org/id/iso639-3/san' => 'sa', 'http://lexvo.org/id/iso639-3/srd' => 'sc', 'http://lexvo.org/id/iso639-3/snd' => 'sd', 'http://lexvo.org/id/iso639-3/sme' => 'se', 'http://lexvo.org/id/iso639-3/sag' => 'sg', 'http://lexvo.org/id/iso639-3/hbs' => 'sh', 'http://lexvo.org/id/iso639-3/sin' => 'si', 'http://lexvo.org/id/iso639-3/slk' => 'sk', 'http://lexvo.org/id/iso639-3/slv' => 'sl', 'http://lexvo.org/id/iso639-3/smo' => 'sm', 'http://lexvo.org/id/iso639-3/sna' => 'sn', 'http://lexvo.org/id/iso639-3/som' => 'so', 'http://lexvo.org/id/iso639-3/sqi' => 'sq', 'http://lexvo.org/id/iso639-3/srp' => 'sr', 'http://lexvo.org/id/iso639-3/ssw' => 'ss', 'http://lexvo.org/id/iso639-3/sot' => 'st', 'http://lexvo.org/id/iso639-3/sun' => 'su', 'http://lexvo.org/id/iso639-3/swe' => 'sv', 'http://lexvo.org/id/iso639-3/swa' => 'sw', 'http://lexvo.org/id/iso639-3/tam' => 'ta', 'http://lexvo.org/id/iso639-3/tel' => 'te', 'http://lexvo.org/id/iso639-3/tgk' => 'tg', 'http://lexvo.org/id/iso639-3/tha' => 'th', 'http://lexvo.org/id/iso639-3/tir' => 'ti', 'http://lexvo.org/id/iso639-3/tuk' => 'tk', 'http://lexvo.org/id/iso639-3/tgl' => 'tl', 'http://lexvo.org/id/iso639-3/tsn' => 'tn', 'http://lexvo.org/id/iso639-3/ton' => 'to', 'http://lexvo.org/id/iso639-3/tur' => 'tr', 'http://lexvo.org/id/iso639-3/tso' => 'ts', 'http://lexvo.org/id/iso639-3/tat' => 'tt', 'http://lexvo.org/id/iso639-3/twi' => 'tw', 'http://lexvo.org/id/iso639-3/tah' => 'ty', 'http://lexvo.org/id/iso639-3/uig' => 'ug', 'http://lexvo.org/id/iso639-3/ukr' => 'uk', 'http://lexvo.org/id/iso639-3/urd' => 'ur', 'http://lexvo.org/id/iso639-3/uzb' => 'uz', 'http://lexvo.org/id/iso639-3/ven' => 've', 'http://lexvo.org/id/iso639-3/vie' => 'vi', 'http://lexvo.org/id/iso639-3/vol' => 'vo', 'http://lexvo.org/id/iso639-3/wln' => 'wa', 'http://lexvo.org/id/iso639-3/wol' => 'wo', 'http://lexvo.org/id/iso639-3/xho' => 'xh', 'http://lexvo.org/id/iso639-3/yid' => 'yi', 'http://lexvo.org/id/iso639-3/yor' => 'yo', 'http://lexvo.org/id/iso639-3/zha' => 'za', 'http://lexvo.org/id/iso639-3/zho' => 'zh', 'http://lexvo.org/id/iso639-3/zul' => 'zu' } + include FlagIconsRails::Rails::ViewHelpers - - def initialize(value: ) + def initialize(value:, label: nil) super - @lang_code = lang_codes_init(value) + @value = value + @lang_code = ISO_639.find(value)&.alpha2 || nil + @label = label end - def lang_codes_init(lang) - if lang.to_s.eql?("en") || lang.to_s.eql?("eng") || lang.to_s.eql?("http://lexvo.org/id/iso639-3/eng") - lang_codes = "gb" - elsif lang.to_s.start_with?("http://lexvo.org") - lang_codes = LEXVO_TO_FLAG[lang] + def lang_code + if @lang_code + @lang_code = 'gb' if @lang_code.eql?('en') + @lang_code else - lang_codes = lang + @value end - lang_codes end end diff --git a/app/components/language_field_component/language_field_component.html.haml b/app/components/language_field_component/language_field_component.html.haml index a6b431565..3122fe9d8 100644 --- a/app/components/language_field_component/language_field_component.html.haml +++ b/app/components/language_field_component/language_field_component.html.haml @@ -1,5 +1,8 @@ -- if @lang_code.length == 2 - %div.f32 - %span.flag{:class => " #{@lang_code}", :style => "margin-right: 0.5em;"} +- if @lang_code + .d-flex.align-items-center + = flag_icon(lang_code) + - if @label + %div.ml-1 + = @label - else - = render ChipButtonComponent.new(text: @lang_code) \ No newline at end of file + = render ChipButtonComponent.new(text: @value) \ No newline at end of file diff --git a/app/controllers/ontologies_controller.rb b/app/controllers/ontologies_controller.rb index a50f1797c..8b064183b 100644 --- a/app/controllers/ontologies_controller.rb +++ b/app/controllers/ontologies_controller.rb @@ -23,11 +23,6 @@ class OntologiesController < ApplicationController EXTERNAL_MAPPINGS_GRAPH = "http://data.bioontology.org/metadata/ExternalMappings" INTERPORTAL_MAPPINGS_GRAPH = "http://data.bioontology.org/metadata/InterportalMappings" - $LEXVO_TO_FLAG = { 'http://lexvo.org/id/iso639-3/aar' => 'aa', 'http://lexvo.org/id/iso639-3/abk' => 'ab', - 'http://lexvo.org/id/iso639-3/ave' => 'ae', 'http://lexvo.org/id/iso639-3/afr' => 'af', - 'http://lexvo.org/id/iso639-3/aka' => 'ak', 'http://lexvo.org/id/iso639-3/amh' => 'am', - 'http://lexvo.org/id/iso639-3/arg' => 'an', 'http://lexvo.org/id/iso639-3/ara' => 'ar', 'http://lexvo.org/id/iso639-3/asm' => 'as', 'http://lexvo.org/id/iso639-3/ava' => 'av', 'http://lexvo.org/id/iso639-3/aym' => 'ay', 'http://lexvo.org/id/iso639-3/aze' => 'az', 'http://lexvo.org/id/iso639-3/bak' => 'ba', 'http://lexvo.org/id/iso639-3/bel' => 'be', 'http://lexvo.org/id/iso639-3/bul' => 'bg', 'http://lexvo.org/id/iso639-3/bis' => 'bi', 'http://lexvo.org/id/iso639-3/bam' => 'bm', 'http://lexvo.org/id/iso639-3/ben' => 'bn', 'http://lexvo.org/id/iso639-3/bod' => 'bo', 'http://lexvo.org/id/iso639-3/bre' => 'br', 'http://lexvo.org/id/iso639-3/bos' => 'bs', 'http://lexvo.org/id/iso639-3/cat' => 'ca', 'http://lexvo.org/id/iso639-3/che' => 'ce', 'http://lexvo.org/id/iso639-3/cha' => 'ch', 'http://lexvo.org/id/iso639-3/cos' => 'co', 'http://lexvo.org/id/iso639-3/cre' => 'cr', 'http://lexvo.org/id/iso639-3/ces' => 'cs', 'http://lexvo.org/id/iso639-3/chu' => 'cu', 'http://lexvo.org/id/iso639-3/chv' => 'cv', 'http://lexvo.org/id/iso639-3/cym' => 'cy', 'http://lexvo.org/id/iso639-3/dan' => 'da', 'http://lexvo.org/id/iso639-3/deu' => 'de', 'http://lexvo.org/id/iso639-3/div' => 'dv', 'http://lexvo.org/id/iso639-3/dzo' => 'dz', 'http://lexvo.org/id/iso639-3/ewe' => 'ee', 'http://lexvo.org/id/iso639-3/ell' => 'el', 'http://lexvo.org/id/iso639-3/eng' => 'en', 'http://lexvo.org/id/iso639-3/epo' => 'eo', 'http://lexvo.org/id/iso639-3/spa' => 'es', 'http://lexvo.org/id/iso639-3/est' => 'et', 'http://lexvo.org/id/iso639-3/eus' => 'eu', 'http://lexvo.org/id/iso639-3/fas' => 'fa', 'http://lexvo.org/id/iso639-3/ful' => 'ff', 'http://lexvo.org/id/iso639-3/fin' => 'fi', 'http://lexvo.org/id/iso639-3/fij' => 'fj', 'http://lexvo.org/id/iso639-3/fao' => 'fo', 'http://lexvo.org/id/iso639-3/fra' => 'fr', 'http://lexvo.org/id/iso639-3/fry' => 'fy', 'http://lexvo.org/id/iso639-3/gle' => 'ga', 'http://lexvo.org/id/iso639-3/gla' => 'gd', 'http://lexvo.org/id/iso639-3/glg' => 'gl', 'http://lexvo.org/id/iso639-3/grn' => 'gn', 'http://lexvo.org/id/iso639-3/guj' => 'gu', 'http://lexvo.org/id/iso639-3/glv' => 'gv', 'http://lexvo.org/id/iso639-3/hau' => 'ha', 'http://lexvo.org/id/iso639-3/heb' => 'he', 'http://lexvo.org/id/iso639-3/hin' => 'hi', 'http://lexvo.org/id/iso639-3/hmo' => 'ho', 'http://lexvo.org/id/iso639-3/hrv' => 'hr', 'http://lexvo.org/id/iso639-3/hat' => 'ht', 'http://lexvo.org/id/iso639-3/hun' => 'hu', 'http://lexvo.org/id/iso639-3/hye' => 'hy', 'http://lexvo.org/id/iso639-3/her' => 'hz', 'http://lexvo.org/id/iso639-3/ina' => 'ia', 'http://lexvo.org/id/iso639-3/ind' => 'id', 'http://lexvo.org/id/iso639-3/ile' => 'ie', 'http://lexvo.org/id/iso639-3/ibo' => 'ig', 'http://lexvo.org/id/iso639-3/iii' => 'ii', 'http://lexvo.org/id/iso639-3/ipk' => 'ik', 'http://lexvo.org/id/iso639-3/ido' => 'io', 'http://lexvo.org/id/iso639-3/isl' => 'is', 'http://lexvo.org/id/iso639-3/ita' => 'it', 'http://lexvo.org/id/iso639-3/iku' => 'iu', 'http://lexvo.org/id/iso639-3/jpn' => 'ja', 'http://lexvo.org/id/iso639-3/jav' => 'jv', 'http://lexvo.org/id/iso639-3/kat' => 'ka', 'http://lexvo.org/id/iso639-3/kon' => 'kg', 'http://lexvo.org/id/iso639-3/kik' => 'ki', 'http://lexvo.org/id/iso639-3/kua' => 'kj', 'http://lexvo.org/id/iso639-3/kaz' => 'kk', 'http://lexvo.org/id/iso639-3/kal' => 'kl', 'http://lexvo.org/id/iso639-3/khm' => 'km', 'http://lexvo.org/id/iso639-3/kan' => 'kn', 'http://lexvo.org/id/iso639-3/kor' => 'ko', 'http://lexvo.org/id/iso639-3/kau' => 'kr', 'http://lexvo.org/id/iso639-3/kas' => 'ks', 'http://lexvo.org/id/iso639-3/kur' => 'ku', 'http://lexvo.org/id/iso639-3/kom' => 'kv', 'http://lexvo.org/id/iso639-3/cor' => 'kw', 'http://lexvo.org/id/iso639-3/kir' => 'ky', 'http://lexvo.org/id/iso639-3/lat' => 'la', 'http://lexvo.org/id/iso639-3/ltz' => 'lb', 'http://lexvo.org/id/iso639-3/lug' => 'lg', 'http://lexvo.org/id/iso639-3/lim' => 'li', 'http://lexvo.org/id/iso639-3/lin' => 'ln', 'http://lexvo.org/id/iso639-3/lao' => 'lo', 'http://lexvo.org/id/iso639-3/lit' => 'lt', 'http://lexvo.org/id/iso639-3/lub' => 'lu', 'http://lexvo.org/id/iso639-3/lav' => 'lv', 'http://lexvo.org/id/iso639-3/mlg' => 'mg', 'http://lexvo.org/id/iso639-3/mah' => 'mh', 'http://lexvo.org/id/iso639-3/mri' => 'mi', 'http://lexvo.org/id/iso639-3/mkd' => 'mk', 'http://lexvo.org/id/iso639-3/mal' => 'ml', 'http://lexvo.org/id/iso639-3/mon' => 'mn', 'http://lexvo.org/id/iso639-3/mar' => 'mr', 'http://lexvo.org/id/iso639-3/msa' => 'ms', 'http://lexvo.org/id/iso639-3/mlt' => 'mt', 'http://lexvo.org/id/iso639-3/mya' => 'my', 'http://lexvo.org/id/iso639-3/nau' => 'na', 'http://lexvo.org/id/iso639-3/nob' => 'nb', 'http://lexvo.org/id/iso639-3/nde' => 'nd', 'http://lexvo.org/id/iso639-3/nep' => 'ne', 'http://lexvo.org/id/iso639-3/ndo' => 'ng', 'http://lexvo.org/id/iso639-3/nld' => 'nl', 'http://lexvo.org/id/iso639-3/nno' => 'nn', 'http://lexvo.org/id/iso639-3/nor' => 'no', 'http://lexvo.org/id/iso639-3/nbl' => 'nr', 'http://lexvo.org/id/iso639-3/nav' => 'nv', 'http://lexvo.org/id/iso639-3/nya' => 'ny', 'http://lexvo.org/id/iso639-3/oci' => 'oc', 'http://lexvo.org/id/iso639-3/oji' => 'oj', 'http://lexvo.org/id/iso639-3/orm' => 'om', 'http://lexvo.org/id/iso639-3/ori' => 'or', 'http://lexvo.org/id/iso639-3/oss' => 'os', 'http://lexvo.org/id/iso639-3/pan' => 'pa', 'http://lexvo.org/id/iso639-3/pli' => 'pi', 'http://lexvo.org/id/iso639-3/pol' => 'pl', 'http://lexvo.org/id/iso639-3/pus' => 'ps', 'http://lexvo.org/id/iso639-3/por' => 'pt', 'http://lexvo.org/id/iso639-3/que' => 'qu', 'http://lexvo.org/id/iso639-3/roh' => 'rm', 'http://lexvo.org/id/iso639-3/run' => 'rn', 'http://lexvo.org/id/iso639-3/ron' => 'ro', 'http://lexvo.org/id/iso639-3/rus' => 'ru', 'http://lexvo.org/id/iso639-3/kin' => 'rw', 'http://lexvo.org/id/iso639-3/san' => 'sa', 'http://lexvo.org/id/iso639-3/srd' => 'sc', 'http://lexvo.org/id/iso639-3/snd' => 'sd', 'http://lexvo.org/id/iso639-3/sme' => 'se', 'http://lexvo.org/id/iso639-3/sag' => 'sg', 'http://lexvo.org/id/iso639-3/hbs' => 'sh', 'http://lexvo.org/id/iso639-3/sin' => 'si', 'http://lexvo.org/id/iso639-3/slk' => 'sk', 'http://lexvo.org/id/iso639-3/slv' => 'sl', 'http://lexvo.org/id/iso639-3/smo' => 'sm', 'http://lexvo.org/id/iso639-3/sna' => 'sn', 'http://lexvo.org/id/iso639-3/som' => 'so', 'http://lexvo.org/id/iso639-3/sqi' => 'sq', 'http://lexvo.org/id/iso639-3/srp' => 'sr', 'http://lexvo.org/id/iso639-3/ssw' => 'ss', 'http://lexvo.org/id/iso639-3/sot' => 'st', 'http://lexvo.org/id/iso639-3/sun' => 'su', 'http://lexvo.org/id/iso639-3/swe' => 'sv', 'http://lexvo.org/id/iso639-3/swa' => 'sw', 'http://lexvo.org/id/iso639-3/tam' => 'ta', 'http://lexvo.org/id/iso639-3/tel' => 'te', 'http://lexvo.org/id/iso639-3/tgk' => 'tg', 'http://lexvo.org/id/iso639-3/tha' => 'th', 'http://lexvo.org/id/iso639-3/tir' => 'ti', 'http://lexvo.org/id/iso639-3/tuk' => 'tk', 'http://lexvo.org/id/iso639-3/tgl' => 'tl', 'http://lexvo.org/id/iso639-3/tsn' => 'tn', 'http://lexvo.org/id/iso639-3/ton' => 'to', 'http://lexvo.org/id/iso639-3/tur' => 'tr', 'http://lexvo.org/id/iso639-3/tso' => 'ts', 'http://lexvo.org/id/iso639-3/tat' => 'tt', 'http://lexvo.org/id/iso639-3/twi' => 'tw', 'http://lexvo.org/id/iso639-3/tah' => 'ty', 'http://lexvo.org/id/iso639-3/uig' => 'ug', 'http://lexvo.org/id/iso639-3/ukr' => 'uk', 'http://lexvo.org/id/iso639-3/urd' => 'ur', 'http://lexvo.org/id/iso639-3/uzb' => 'uz', 'http://lexvo.org/id/iso639-3/ven' => 've', 'http://lexvo.org/id/iso639-3/vie' => 'vi', 'http://lexvo.org/id/iso639-3/vol' => 'vo', 'http://lexvo.org/id/iso639-3/wln' => 'wa', 'http://lexvo.org/id/iso639-3/wol' => 'wo', 'http://lexvo.org/id/iso639-3/xho' => 'xh', 'http://lexvo.org/id/iso639-3/yid' => 'yi', 'http://lexvo.org/id/iso639-3/yor' => 'yo', 'http://lexvo.org/id/iso639-3/zha' => 'za', 'http://lexvo.org/id/iso639-3/zho' => 'zh', 'http://lexvo.org/id/iso639-3/zul' => 'zu' } - # GET /ontologies def index diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index 1817186d6..c6a62ff56 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -18,10 +18,6 @@ - <%= stylesheet_link_tag "https://use.fontawesome.com/releases/v5.2.0/css/all.css", integrity: "sha384-hWVjflwFxL6sNzntih27bfxkr27PmbbK/iSvJ+a4+0owXq79v+lsFkW54bOGbiDQ", crossorigin: "anonymous" %> <%= stylesheet_link_tag "application" %> diff --git a/app/views/ontologies_metadata_curator/_attribute_inline.html.haml b/app/views/ontologies_metadata_curator/_attribute_inline.html.haml index b430b3121..898638bfa 100644 --- a/app/views/ontologies_metadata_curator/_attribute_inline.html.haml +++ b/app/views/ontologies_metadata_curator/_attribute_inline.html.haml @@ -7,17 +7,8 @@ - if attribute == "contact" = raw submission.contact.map {|c| [c["name"], c["email"]].join(", ") if c.member?(:name) && c.member?(:email)}.join("
") - elsif attribute == "naturalLanguage" - - lang_codes = [] - submission.send(attribute).each do |lang| - - if (lang.to_s.eql?("en") || lang.to_s.eql?("eng") || lang.to_s.eql?("http://lexvo.org/id/iso639-3/eng")) - - lang_codes << "gb" - - elsif lang.to_s.start_with?("http://lexvo.org") - - lang_codes << $LEXVO_TO_FLAG[lang] - - else - - lang_codes << lang - %ul{:class => "f32"} - - lang_codes.each do |lang_code| - %li{:class => "flag " + lang_code, :style => "margin-right: 0.5em;"} + = render LanguageFieldComponent.new(value: lang) - elsif attribute == "ontology" = acronym - else From 40d9bf241f2ddcafa76fe5c81805facccf2f4faa Mon Sep 17 00:00:00 2001 From: Syphax Bouazzouni Date: Tue, 5 Sep 2023 02:04:57 +0200 Subject: [PATCH 16/19] add language selector component --- app/assets/javascripts/bp_search.js.erb | 2 +- .../input/language_selector_component.rb | 25 +++++++++++++++++++ app/components/input/select_component.rb | 3 +-- app/views/search/index.html.haml | 6 ++--- .../input/input_field_component_preview.rb | 4 +++ 5 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 app/components/input/language_selector_component.rb diff --git a/app/assets/javascripts/bp_search.js.erb b/app/assets/javascripts/bp_search.js.erb index 62be24f7d..3649c8bae 100644 --- a/app/assets/javascripts/bp_search.js.erb +++ b/app/assets/javascripts/bp_search.js.erb @@ -327,7 +327,7 @@ function performSearch() { includeNonProduction = jQuery("#search_include_non_production").is(":checked"), includeOnlyDefinitions = jQuery("#search_require_definition").is(":checked"), exactMatch = jQuery("#search_exact_match").is(":checked"), - categories = jQuery("#search_categories").val() || ""; + categories = jQuery("#search_categories").val() || "", language = jQuery("#select_search_language").val() || ""; // Set the list of search words to be blacklisted for the ontology ownership algorithm diff --git a/app/components/input/language_selector_component.rb b/app/components/input/language_selector_component.rb new file mode 100644 index 000000000..443ee2cbb --- /dev/null +++ b/app/components/input/language_selector_component.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +class Input::LanguageSelectorComponent < ViewComponent::Base + + def initialize(languages:, id: '', name: '' ) + super + @languages = languages + @id = id + @name = languages + end + + def languages_options + values = [['All languages', 'all']] + + @languages.each do |key, label| + option = "

" + values += [[option, key.to_s.downcase]] + end + values + end + + def call + render SelectInputComponent.new(id: @id, name: @name, values: languages_options, placeholder: 'Select a language') + end +end diff --git a/app/components/input/select_component.rb b/app/components/input/select_component.rb index 234d00a1b..e9f8e9b33 100644 --- a/app/components/input/select_component.rb +++ b/app/components/input/select_component.rb @@ -2,13 +2,12 @@ class Input::SelectComponent < Input::InputFieldComponent - def initialize(id: nil, label: '', name:, value: [], selected: '', placeholder: '', error_message: '', helper_text: '', multiple: false, open_to_add_values: false, withIcon: false) + def initialize(id: nil, label: '', name:, value: [], selected: '', placeholder: '', error_message: '', helper_text: '', multiple: false, open_to_add_values: false) super(label: label, name: name, value: value, placeholder: placeholder, error_message: error_message, helper_text: helper_text) @values = value @selected = selected @open_to_add_values = open_to_add_values @multiple = multiple - @withIcon = withIcon @id = id end end diff --git a/app/views/search/index.html.haml b/app/views/search/index.html.haml index 0382387a9..cac1f241d 100644 --- a/app/views/search/index.html.haml +++ b/app/views/search/index.html.haml @@ -1,7 +1,7 @@ - @title = t("search.title") %div.container.mt-5 - %h1.display-4 + %h1.display-4 = t("search.class_search") = form_tag("/search", method: "post") do @@ -20,7 +20,7 @@ %div.col-sm-2.mb-4 Search language %div.col-sm-10.mb-4 %div.w-25 - = render SelectInputComponent.new(id: "search_language", name: "search_language", values: [{id: "fr", title: "French", icon: "fi fi-fr fis"}, {id: "en", title: "English", icon: "fi fi-us fis"}], withIcon: true, placeholder: "Choose language") + = render Input::LanguageSelectorComponent.new(id:'search_language' , name:'search_language', languages: {fr: 'French', en: 'English'}) %div.col-sm-2= t("search.include_in_search") + ":" %div.col-sm-10 %div.form-check @@ -32,7 +32,7 @@ %div.form-check = check_box(:search, :include_views, class: "form-check-input") = label(:search, :include_views, t('search.ontology_views'), class: "form-check-label") - + %div.col-sm-2= t("search.narrow_search_to") + ":" %div.col-sm-10 %div.form-check diff --git a/test/components/previews/input/input_field_component_preview.rb b/test/components/previews/input/input_field_component_preview.rb index 49849e984..dafe178b9 100644 --- a/test/components/previews/input/input_field_component_preview.rb +++ b/test/components/previews/input/input_field_component_preview.rb @@ -87,4 +87,8 @@ def text(label: "Label", placeholder: "", error_message: "", helper_text: "") def text_area(label: "Label", placeholder: "", error_message: "", helper_text: "", rows: 5) render Input::TextAreaComponent.new(label: label, name: "name",value: '', placeholder: placeholder, error_message: error_message, helper_text: helper_text, rows: rows) end + + def language_input + render Input::LanguageSelectorComponent.new(languages: {fr: 'French', en: 'English'}) + end end From 97f64e065c3c3c3384c36e1bf6e8ce5efaec3438 Mon Sep 17 00:00:00 2001 From: Syphax Bouazzouni Date: Tue, 5 Sep 2023 02:19:11 +0200 Subject: [PATCH 17/19] remove tooltipster dependecies --- app/assets/javascripts/application.js | 1 - app/assets/javascripts/tooltipster.bundle.min.js | 2 -- app/assets/stylesheets/themes/lirmm/main.scss | 7 ------- .../sideTip/themes/tooltipster-sideTip-borderless.min.scss | 1 - .../sideTip/themes/tooltipster-sideTip-light.min.scss | 1 - .../sideTip/themes/tooltipster-sideTip-noir.min.scss | 1 - .../sideTip/themes/tooltipster-sideTip-punk.min.scss | 1 - .../sideTip/themes/tooltipster-sideTip-shadow.min.scss | 1 - .../stylesheets/themes/lirmm/tooltipster.bundle.min.scss | 1 - 9 files changed, 16 deletions(-) delete mode 100644 app/assets/javascripts/tooltipster.bundle.min.js delete mode 100644 app/assets/stylesheets/themes/lirmm/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-borderless.min.scss delete mode 100644 app/assets/stylesheets/themes/lirmm/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-light.min.scss delete mode 100644 app/assets/stylesheets/themes/lirmm/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-noir.min.scss delete mode 100644 app/assets/stylesheets/themes/lirmm/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-punk.min.scss delete mode 100644 app/assets/stylesheets/themes/lirmm/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-shadow.min.scss delete mode 100644 app/assets/stylesheets/themes/lirmm/tooltipster.bundle.min.scss diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 0d0fe33cb..79646cd33 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -30,7 +30,6 @@ //= require_tree ./components //= require ontologies //= require projects -//= require tooltipster.bundle.min //= require application_esbuild customElements.define('data-table-loader', DataTableLoader ); customElements.define('data-table', DataTable ); diff --git a/app/assets/javascripts/tooltipster.bundle.min.js b/app/assets/javascripts/tooltipster.bundle.min.js deleted file mode 100644 index fa810446b..000000000 --- a/app/assets/javascripts/tooltipster.bundle.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! tooltipster v4.2.7 */!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(a){function b(a){this.$container,this.constraints=null,this.__$tooltip,this.__init(a)}function c(b,c){var d=!0;return a.each(b,function(a,e){return void 0===c[a]||b[a]!==c[a]?(d=!1,!1):void 0}),d}function d(b){var c=b.attr("id"),d=c?h.window.document.getElementById(c):null;return d?d===b[0]:a.contains(h.window.document.body,b[0])}function e(){if(!g)return!1;var a=g.document.body||g.document.documentElement,b=a.style,c="transition",d=["Moz","Webkit","Khtml","O","ms"];if("string"==typeof b[c])return!0;c=c.charAt(0).toUpperCase()+c.substr(1);for(var e=0;e0?e=c.__plugins[d]:a.each(c.__plugins,function(a,b){return b.name.substring(b.name.length-d.length-1)=="."+d?(e=b,!1):void 0}),e}if(b.name.indexOf(".")<0)throw new Error("Plugins must be namespaced");return c.__plugins[b.name]=b,b.core&&c.__bridge(b.core,c,b.name),this},_trigger:function(){var a=Array.prototype.slice.apply(arguments);return"string"==typeof a[0]&&(a[0]={type:a[0]}),this.__$emitterPrivate.trigger.apply(this.__$emitterPrivate,a),this.__$emitterPublic.trigger.apply(this.__$emitterPublic,a),this},instances:function(b){var c=[],d=b||".tooltipstered";return a(d).each(function(){var b=a(this),d=b.data("tooltipster-ns");d&&a.each(d,function(a,d){c.push(b.data(d))})}),c},instancesLatest:function(){return this.__instancesLatestArr},off:function(){return this.__$emitterPublic.off.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},on:function(){return this.__$emitterPublic.on.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},one:function(){return this.__$emitterPublic.one.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},origins:function(b){var c=b?b+" ":"";return a(c+".tooltipstered").toArray()},setDefaults:function(b){return a.extend(f,b),this},triggerHandler:function(){return this.__$emitterPublic.triggerHandler.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this}},a.tooltipster=new i,a.Tooltipster=function(b,c){this.__callbacks={close:[],open:[]},this.__closingTime,this.__Content,this.__contentBcr,this.__destroyed=!1,this.__$emitterPrivate=a({}),this.__$emitterPublic=a({}),this.__enabled=!0,this.__garbageCollector,this.__Geometry,this.__lastPosition,this.__namespace="tooltipster-"+Math.round(1e6*Math.random()),this.__options,this.__$originParents,this.__pointerIsOverOrigin=!1,this.__previousThemes=[],this.__state="closed",this.__timeouts={close:[],open:null},this.__touchEvents=[],this.__tracker=null,this._$origin,this._$tooltip,this.__init(b,c)},a.Tooltipster.prototype={__init:function(b,c){var d=this;if(d._$origin=a(b),d.__options=a.extend(!0,{},f,c),d.__optionsFormat(),!h.IE||h.IE>=d.__options.IEmin){var e=null;if(void 0===d._$origin.data("tooltipster-initialTitle")&&(e=d._$origin.attr("title"),void 0===e&&(e=null),d._$origin.data("tooltipster-initialTitle",e)),null!==d.__options.content)d.__contentSet(d.__options.content);else{var g,i=d._$origin.attr("data-tooltip-content");i&&(g=a(i)),g&&g[0]?d.__contentSet(g.first()):d.__contentSet(e)}d._$origin.removeAttr("title").addClass("tooltipstered"),d.__prepareOrigin(),d.__prepareGC(),a.each(d.__options.plugins,function(a,b){d._plug(b)}),h.hasTouchCapability&&a(h.window.document.body).on("touchmove."+d.__namespace+"-triggerOpen",function(a){d._touchRecordEvent(a)}),d._on("created",function(){d.__prepareTooltip()})._on("repositioned",function(a){d.__lastPosition=a.position})}else d.__options.disabled=!0},__contentInsert:function(){var a=this,b=a._$tooltip.find(".tooltipster-content"),c=a.__Content,d=function(a){c=a};return a._trigger({type:"format",content:a.__Content,format:d}),a.__options.functionFormat&&(c=a.__options.functionFormat.call(a,a,{origin:a._$origin[0]},a.__Content)),"string"!=typeof c||a.__options.contentAsHTML?b.empty().append(c):b.text(c),a},__contentSet:function(b){return b instanceof a&&this.__options.contentCloning&&(b=b.clone(!0)),this.__Content=b,this._trigger({type:"updated",content:b}),this},__destroyError:function(){throw new Error("This tooltip has been destroyed and cannot execute your method call.")},__geometry:function(){var b=this,c=b._$origin,d=b._$origin.is("area");if(d){var e=b._$origin.parent().attr("name");c=a('img[usemap="#'+e+'"]')}var f=c[0].getBoundingClientRect(),g=a(h.window.document),i=a(h.window),j=c,k={available:{document:null,window:null},document:{size:{height:g.height(),width:g.width()}},window:{scroll:{left:h.window.scrollX||h.window.document.documentElement.scrollLeft,top:h.window.scrollY||h.window.document.documentElement.scrollTop},size:{height:i.height(),width:i.width()}},origin:{fixedLineage:!1,offset:{},size:{height:f.bottom-f.top,width:f.right-f.left},usemapImage:d?c[0]:null,windowOffset:{bottom:f.bottom,left:f.left,right:f.right,top:f.top}}};if(d){var l=b._$origin.attr("shape"),m=b._$origin.attr("coords");if(m&&(m=m.split(","),a.map(m,function(a,b){m[b]=parseInt(a)})),"default"!=l)switch(l){case"circle":var n=m[0],o=m[1],p=m[2],q=o-p,r=n-p;k.origin.size.height=2*p,k.origin.size.width=k.origin.size.height,k.origin.windowOffset.left+=r,k.origin.windowOffset.top+=q;break;case"rect":var s=m[0],t=m[1],u=m[2],v=m[3];k.origin.size.height=v-t,k.origin.size.width=u-s,k.origin.windowOffset.left+=s,k.origin.windowOffset.top+=t;break;case"poly":for(var w=0,x=0,y=0,z=0,A="even",B=0;By&&(y=C,0===B&&(w=y)),w>C&&(w=C),A="odd"):(C>z&&(z=C,1==B&&(x=z)),x>C&&(x=C),A="even")}k.origin.size.height=z-x,k.origin.size.width=y-w,k.origin.windowOffset.left+=w,k.origin.windowOffset.top+=x}}var D=function(a){k.origin.size.height=a.height,k.origin.windowOffset.left=a.left,k.origin.windowOffset.top=a.top,k.origin.size.width=a.width};for(b._trigger({type:"geometry",edit:D,geometry:{height:k.origin.size.height,left:k.origin.windowOffset.left,top:k.origin.windowOffset.top,width:k.origin.size.width}}),k.origin.windowOffset.right=k.origin.windowOffset.left+k.origin.size.width,k.origin.windowOffset.bottom=k.origin.windowOffset.top+k.origin.size.height,k.origin.offset.left=k.origin.windowOffset.left+k.window.scroll.left,k.origin.offset.top=k.origin.windowOffset.top+k.window.scroll.top,k.origin.offset.bottom=k.origin.offset.top+k.origin.size.height,k.origin.offset.right=k.origin.offset.left+k.origin.size.width,k.available.document={bottom:{height:k.document.size.height-k.origin.offset.bottom,width:k.document.size.width},left:{height:k.document.size.height,width:k.origin.offset.left},right:{height:k.document.size.height,width:k.document.size.width-k.origin.offset.right},top:{height:k.origin.offset.top,width:k.document.size.width}},k.available.window={bottom:{height:Math.max(k.window.size.height-Math.max(k.origin.windowOffset.bottom,0),0),width:k.window.size.width},left:{height:k.window.size.height,width:Math.max(k.origin.windowOffset.left,0)},right:{height:k.window.size.height,width:Math.max(k.window.size.width-Math.max(k.origin.windowOffset.right,0),0)},top:{height:Math.max(k.origin.windowOffset.top,0),width:k.window.size.width}};"html"!=j[0].tagName.toLowerCase();){if("fixed"==j.css("position")){k.origin.fixedLineage=!0;break}j=j.parent()}return k},__optionsFormat:function(){return"number"==typeof this.__options.animationDuration&&(this.__options.animationDuration=[this.__options.animationDuration,this.__options.animationDuration]),"number"==typeof this.__options.delay&&(this.__options.delay=[this.__options.delay,this.__options.delay]),"number"==typeof this.__options.delayTouch&&(this.__options.delayTouch=[this.__options.delayTouch,this.__options.delayTouch]),"string"==typeof this.__options.theme&&(this.__options.theme=[this.__options.theme]),null===this.__options.parent?this.__options.parent=a(h.window.document.body):"string"==typeof this.__options.parent&&(this.__options.parent=a(this.__options.parent)),"hover"==this.__options.trigger?(this.__options.triggerOpen={mouseenter:!0,touchstart:!0},this.__options.triggerClose={mouseleave:!0,originClick:!0,touchleave:!0}):"click"==this.__options.trigger&&(this.__options.triggerOpen={click:!0,tap:!0},this.__options.triggerClose={click:!0,tap:!0}),this._trigger("options"),this},__prepareGC:function(){var b=this;return b.__options.selfDestruction?b.__garbageCollector=setInterval(function(){var c=(new Date).getTime();b.__touchEvents=a.grep(b.__touchEvents,function(a,b){return c-a.time>6e4}),d(b._$origin)||b.close(function(){b.destroy()})},2e4):clearInterval(b.__garbageCollector),b},__prepareOrigin:function(){var a=this;if(a._$origin.off("."+a.__namespace+"-triggerOpen"),h.hasTouchCapability&&a._$origin.on("touchstart."+a.__namespace+"-triggerOpen touchend."+a.__namespace+"-triggerOpen touchcancel."+a.__namespace+"-triggerOpen",function(b){a._touchRecordEvent(b)}),a.__options.triggerOpen.click||a.__options.triggerOpen.tap&&h.hasTouchCapability){var b="";a.__options.triggerOpen.click&&(b+="click."+a.__namespace+"-triggerOpen "),a.__options.triggerOpen.tap&&h.hasTouchCapability&&(b+="touchend."+a.__namespace+"-triggerOpen"),a._$origin.on(b,function(b){a._touchIsMeaningfulEvent(b)&&a._open(b)})}if(a.__options.triggerOpen.mouseenter||a.__options.triggerOpen.touchstart&&h.hasTouchCapability){var b="";a.__options.triggerOpen.mouseenter&&(b+="mouseenter."+a.__namespace+"-triggerOpen "),a.__options.triggerOpen.touchstart&&h.hasTouchCapability&&(b+="touchstart."+a.__namespace+"-triggerOpen"),a._$origin.on(b,function(b){!a._touchIsTouchEvent(b)&&a._touchIsEmulatedEvent(b)||(a.__pointerIsOverOrigin=!0,a._openShortly(b))})}if(a.__options.triggerClose.mouseleave||a.__options.triggerClose.touchleave&&h.hasTouchCapability){var b="";a.__options.triggerClose.mouseleave&&(b+="mouseleave."+a.__namespace+"-triggerOpen "),a.__options.triggerClose.touchleave&&h.hasTouchCapability&&(b+="touchend."+a.__namespace+"-triggerOpen touchcancel."+a.__namespace+"-triggerOpen"),a._$origin.on(b,function(b){a._touchIsMeaningfulEvent(b)&&(a.__pointerIsOverOrigin=!1)})}return a},__prepareTooltip:function(){var b=this,c=b.__options.interactive?"auto":"";return b._$tooltip.attr("id",b.__namespace).css({"pointer-events":c,zIndex:b.__options.zIndex}),a.each(b.__previousThemes,function(a,c){b._$tooltip.removeClass(c)}),a.each(b.__options.theme,function(a,c){b._$tooltip.addClass(c)}),b.__previousThemes=a.merge([],b.__options.theme),b},__scrollHandler:function(b){var c=this;if(c.__options.triggerClose.scroll)c._close(b);else if(d(c._$origin)&&d(c._$tooltip)){var e=null;if(b.target===h.window.document)c.__Geometry.origin.fixedLineage||c.__options.repositionOnScroll&&c.reposition(b);else{e=c.__geometry();var f=!1;if("fixed"!=c._$origin.css("position")&&c.__$originParents.each(function(b,c){var d=a(c),g=d.css("overflow-x"),h=d.css("overflow-y");if("visible"!=g||"visible"!=h){var i=c.getBoundingClientRect();if("visible"!=g&&(e.origin.windowOffset.lefti.right))return f=!0,!1;if("visible"!=h&&(e.origin.windowOffset.topi.bottom))return f=!0,!1}return"fixed"==d.css("position")?!1:void 0}),f)c._$tooltip.css("visibility","hidden");else if(c._$tooltip.css("visibility","visible"),c.__options.repositionOnScroll)c.reposition(b);else{var g=e.origin.offset.left-c.__Geometry.origin.offset.left,i=e.origin.offset.top-c.__Geometry.origin.offset.top;c._$tooltip.css({left:c.__lastPosition.coord.left+g,top:c.__lastPosition.coord.top+i})}}c._trigger({type:"scroll",event:b,geo:e})}return c},__stateSet:function(a){return this.__state=a,this._trigger({type:"state",state:a}),this},__timeoutsClear:function(){return clearTimeout(this.__timeouts.open),this.__timeouts.open=null,a.each(this.__timeouts.close,function(a,b){clearTimeout(b)}),this.__timeouts.close=[],this},__trackerStart:function(){var a=this,b=a._$tooltip.find(".tooltipster-content");return a.__options.trackTooltip&&(a.__contentBcr=b[0].getBoundingClientRect()),a.__tracker=setInterval(function(){if(d(a._$origin)&&d(a._$tooltip)){if(a.__options.trackOrigin){var e=a.__geometry(),f=!1;c(e.origin.size,a.__Geometry.origin.size)&&(a.__Geometry.origin.fixedLineage?c(e.origin.windowOffset,a.__Geometry.origin.windowOffset)&&(f=!0):c(e.origin.offset,a.__Geometry.origin.offset)&&(f=!0)),f||(a.__options.triggerClose.mouseleave?a._close():a.reposition())}if(a.__options.trackTooltip){var g=b[0].getBoundingClientRect();g.height===a.__contentBcr.height&&g.width===a.__contentBcr.width||(a.reposition(),a.__contentBcr=g)}}else a._close()},a.__options.trackerInterval),a},_close:function(b,c,d){var e=this,f=!0;if(e._trigger({type:"close",event:b,stop:function(){f=!1}}),f||d){c&&e.__callbacks.close.push(c),e.__callbacks.open=[],e.__timeoutsClear();var g=function(){a.each(e.__callbacks.close,function(a,c){c.call(e,e,{event:b,origin:e._$origin[0]})}),e.__callbacks.close=[]};if("closed"!=e.__state){var i=!0,j=new Date,k=j.getTime(),l=k+e.__options.animationDuration[1];if("disappearing"==e.__state&&l>e.__closingTime&&e.__options.animationDuration[1]>0&&(i=!1),i){e.__closingTime=l,"disappearing"!=e.__state&&e.__stateSet("disappearing");var m=function(){clearInterval(e.__tracker),e._trigger({type:"closing",event:b}),e._$tooltip.off("."+e.__namespace+"-triggerClose").removeClass("tooltipster-dying"),a(h.window).off("."+e.__namespace+"-triggerClose"),e.__$originParents.each(function(b,c){a(c).off("scroll."+e.__namespace+"-triggerClose")}),e.__$originParents=null,a(h.window.document.body).off("."+e.__namespace+"-triggerClose"),e._$origin.off("."+e.__namespace+"-triggerClose"),e._off("dismissable"),e.__stateSet("closed"),e._trigger({type:"after",event:b}),e.__options.functionAfter&&e.__options.functionAfter.call(e,e,{event:b,origin:e._$origin[0]}),g()};h.hasTransitions?(e._$tooltip.css({"-moz-animation-duration":e.__options.animationDuration[1]+"ms","-ms-animation-duration":e.__options.animationDuration[1]+"ms","-o-animation-duration":e.__options.animationDuration[1]+"ms","-webkit-animation-duration":e.__options.animationDuration[1]+"ms","animation-duration":e.__options.animationDuration[1]+"ms","transition-duration":e.__options.animationDuration[1]+"ms"}),e._$tooltip.clearQueue().removeClass("tooltipster-show").addClass("tooltipster-dying"),e.__options.animationDuration[1]>0&&e._$tooltip.delay(e.__options.animationDuration[1]),e._$tooltip.queue(m)):e._$tooltip.stop().fadeOut(e.__options.animationDuration[1],m)}}else g()}return e},_off:function(){return this.__$emitterPrivate.off.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_on:function(){return this.__$emitterPrivate.on.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_one:function(){return this.__$emitterPrivate.one.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_open:function(b,c){var e=this;if(!e.__destroying&&d(e._$origin)&&e.__enabled){var f=!0;if("closed"==e.__state&&(e._trigger({type:"before",event:b,stop:function(){f=!1}}),f&&e.__options.functionBefore&&(f=e.__options.functionBefore.call(e,e,{event:b,origin:e._$origin[0]}))),f!==!1&&null!==e.__Content){c&&e.__callbacks.open.push(c),e.__callbacks.close=[],e.__timeoutsClear();var g,i=function(){"stable"!=e.__state&&e.__stateSet("stable"),a.each(e.__callbacks.open,function(a,b){b.call(e,e,{origin:e._$origin[0],tooltip:e._$tooltip[0]})}),e.__callbacks.open=[]};if("closed"!==e.__state)g=0,"disappearing"===e.__state?(e.__stateSet("appearing"),h.hasTransitions?(e._$tooltip.clearQueue().removeClass("tooltipster-dying").addClass("tooltipster-show"),e.__options.animationDuration[0]>0&&e._$tooltip.delay(e.__options.animationDuration[0]),e._$tooltip.queue(i)):e._$tooltip.stop().fadeIn(i)):"stable"==e.__state&&i();else{if(e.__stateSet("appearing"),g=e.__options.animationDuration[0],e.__contentInsert(),e.reposition(b,!0),h.hasTransitions?(e._$tooltip.addClass("tooltipster-"+e.__options.animation).addClass("tooltipster-initial").css({"-moz-animation-duration":e.__options.animationDuration[0]+"ms","-ms-animation-duration":e.__options.animationDuration[0]+"ms","-o-animation-duration":e.__options.animationDuration[0]+"ms","-webkit-animation-duration":e.__options.animationDuration[0]+"ms","animation-duration":e.__options.animationDuration[0]+"ms","transition-duration":e.__options.animationDuration[0]+"ms"}),setTimeout(function(){"closed"!=e.__state&&(e._$tooltip.addClass("tooltipster-show").removeClass("tooltipster-initial"),e.__options.animationDuration[0]>0&&e._$tooltip.delay(e.__options.animationDuration[0]),e._$tooltip.queue(i))},0)):e._$tooltip.css("display","none").fadeIn(e.__options.animationDuration[0],i),e.__trackerStart(),a(h.window).on("resize."+e.__namespace+"-triggerClose",function(b){var c=a(document.activeElement);(c.is("input")||c.is("textarea"))&&a.contains(e._$tooltip[0],c[0])||e.reposition(b)}).on("scroll."+e.__namespace+"-triggerClose",function(a){e.__scrollHandler(a)}),e.__$originParents=e._$origin.parents(),e.__$originParents.each(function(b,c){a(c).on("scroll."+e.__namespace+"-triggerClose",function(a){e.__scrollHandler(a)})}),e.__options.triggerClose.mouseleave||e.__options.triggerClose.touchleave&&h.hasTouchCapability){e._on("dismissable",function(a){a.dismissable?a.delay?(m=setTimeout(function(){e._close(a.event)},a.delay),e.__timeouts.close.push(m)):e._close(a):clearTimeout(m)});var j=e._$origin,k="",l="",m=null;e.__options.interactive&&(j=j.add(e._$tooltip)),e.__options.triggerClose.mouseleave&&(k+="mouseenter."+e.__namespace+"-triggerClose ",l+="mouseleave."+e.__namespace+"-triggerClose "),e.__options.triggerClose.touchleave&&h.hasTouchCapability&&(k+="touchstart."+e.__namespace+"-triggerClose",l+="touchend."+e.__namespace+"-triggerClose touchcancel."+e.__namespace+"-triggerClose"),j.on(l,function(a){if(e._touchIsTouchEvent(a)||!e._touchIsEmulatedEvent(a)){var b="mouseleave"==a.type?e.__options.delay:e.__options.delayTouch;e._trigger({delay:b[1],dismissable:!0,event:a,type:"dismissable"})}}).on(k,function(a){!e._touchIsTouchEvent(a)&&e._touchIsEmulatedEvent(a)||e._trigger({dismissable:!1,event:a,type:"dismissable"})})}e.__options.triggerClose.originClick&&e._$origin.on("click."+e.__namespace+"-triggerClose",function(a){e._touchIsTouchEvent(a)||e._touchIsEmulatedEvent(a)||e._close(a)}),(e.__options.triggerClose.click||e.__options.triggerClose.tap&&h.hasTouchCapability)&&setTimeout(function(){if("closed"!=e.__state){var b="",c=a(h.window.document.body);e.__options.triggerClose.click&&(b+="click."+e.__namespace+"-triggerClose "),e.__options.triggerClose.tap&&h.hasTouchCapability&&(b+="touchend."+e.__namespace+"-triggerClose"),c.on(b,function(b){e._touchIsMeaningfulEvent(b)&&(e._touchRecordEvent(b),e.__options.interactive&&a.contains(e._$tooltip[0],b.target)||e._close(b))}),e.__options.triggerClose.tap&&h.hasTouchCapability&&c.on("touchstart."+e.__namespace+"-triggerClose",function(a){e._touchRecordEvent(a)})}},0),e._trigger("ready"),e.__options.functionReady&&e.__options.functionReady.call(e,e,{origin:e._$origin[0],tooltip:e._$tooltip[0]})}if(e.__options.timer>0){var m=setTimeout(function(){e._close()},e.__options.timer+g);e.__timeouts.close.push(m)}}}return e},_openShortly:function(a){var b=this,c=!0;if("stable"!=b.__state&&"appearing"!=b.__state&&!b.__timeouts.open&&(b._trigger({type:"start",event:a,stop:function(){c=!1}}),c)){var d=0==a.type.indexOf("touch")?b.__options.delayTouch:b.__options.delay;d[0]?b.__timeouts.open=setTimeout(function(){b.__timeouts.open=null,b.__pointerIsOverOrigin&&b._touchIsMeaningfulEvent(a)?(b._trigger("startend"),b._open(a)):b._trigger("startcancel")},d[0]):(b._trigger("startend"),b._open(a))}return b},_optionsExtract:function(b,c){var d=this,e=a.extend(!0,{},c),f=d.__options[b];return f||(f={},a.each(c,function(a,b){var c=d.__options[a];void 0!==c&&(f[a]=c)})),a.each(e,function(b,c){void 0!==f[b]&&("object"!=typeof c||c instanceof Array||null==c||"object"!=typeof f[b]||f[b]instanceof Array||null==f[b]?e[b]=f[b]:a.extend(e[b],f[b]))}),e},_plug:function(b){var c=a.tooltipster._plugin(b);if(!c)throw new Error('The "'+b+'" plugin is not defined');return c.instance&&a.tooltipster.__bridge(c.instance,this,c.name),this},_touchIsEmulatedEvent:function(a){for(var b=!1,c=(new Date).getTime(),d=this.__touchEvents.length-1;d>=0;d--){var e=this.__touchEvents[d];if(!(c-e.time<500))break;e.target===a.target&&(b=!0)}return b},_touchIsMeaningfulEvent:function(a){return this._touchIsTouchEvent(a)&&!this._touchSwiped(a.target)||!this._touchIsTouchEvent(a)&&!this._touchIsEmulatedEvent(a)},_touchIsTouchEvent:function(a){return 0==a.type.indexOf("touch")},_touchRecordEvent:function(a){return this._touchIsTouchEvent(a)&&(a.time=(new Date).getTime(),this.__touchEvents.push(a)),this},_touchSwiped:function(a){for(var b=!1,c=this.__touchEvents.length-1;c>=0;c--){var d=this.__touchEvents[c];if("touchmove"==d.type){b=!0;break}if("touchstart"==d.type&&a===d.target)break}return b},_trigger:function(){var b=Array.prototype.slice.apply(arguments);return"string"==typeof b[0]&&(b[0]={type:b[0]}),b[0].instance=this,b[0].origin=this._$origin?this._$origin[0]:null,b[0].tooltip=this._$tooltip?this._$tooltip[0]:null,this.__$emitterPrivate.trigger.apply(this.__$emitterPrivate,b),a.tooltipster._trigger.apply(a.tooltipster,b),this.__$emitterPublic.trigger.apply(this.__$emitterPublic,b),this},_unplug:function(b){var c=this;if(c[b]){var d=a.tooltipster._plugin(b);d.instance&&a.each(d.instance,function(a,d){c[a]&&c[a].bridged===c[b]&&delete c[a]}),c[b].__destroy&&c[b].__destroy(),delete c[b]}return c},close:function(a){return this.__destroyed?this.__destroyError():this._close(null,a),this},content:function(a){var b=this;if(void 0===a)return b.__Content;if(b.__destroyed)b.__destroyError();else if(b.__contentSet(a),null!==b.__Content){if("closed"!==b.__state&&(b.__contentInsert(),b.reposition(),b.__options.updateAnimation))if(h.hasTransitions){var c=b.__options.updateAnimation;b._$tooltip.addClass("tooltipster-update-"+c),setTimeout(function(){"closed"!=b.__state&&b._$tooltip.removeClass("tooltipster-update-"+c)},1e3)}else b._$tooltip.fadeTo(200,.5,function(){"closed"!=b.__state&&b._$tooltip.fadeTo(200,1)})}else b._close();return b},destroy:function(){var b=this;if(b.__destroyed)b.__destroyError();else{"closed"!=b.__state?b.option("animationDuration",0)._close(null,null,!0):b.__timeoutsClear(),b._trigger("destroy"),b.__destroyed=!0,b._$origin.removeData(b.__namespace).off("."+b.__namespace+"-triggerOpen"),a(h.window.document.body).off("."+b.__namespace+"-triggerOpen");var c=b._$origin.data("tooltipster-ns");if(c)if(1===c.length){var d=null;"previous"==b.__options.restoration?d=b._$origin.data("tooltipster-initialTitle"):"current"==b.__options.restoration&&(d="string"==typeof b.__Content?b.__Content:a("
").append(b.__Content).html()),d&&b._$origin.attr("title",d),b._$origin.removeClass("tooltipstered"),b._$origin.removeData("tooltipster-ns").removeData("tooltipster-initialTitle")}else c=a.grep(c,function(a,c){return a!==b.__namespace}),b._$origin.data("tooltipster-ns",c);b._trigger("destroyed"),b._off(),b.off(),b.__Content=null,b.__$emitterPrivate=null,b.__$emitterPublic=null,b.__options.parent=null,b._$origin=null,b._$tooltip=null,a.tooltipster.__instancesLatestArr=a.grep(a.tooltipster.__instancesLatestArr,function(a,c){return b!==a}),clearInterval(b.__garbageCollector)}return b},disable:function(){return this.__destroyed?(this.__destroyError(),this):(this._close(),this.__enabled=!1,this)},elementOrigin:function(){return this.__destroyed?void this.__destroyError():this._$origin[0]},elementTooltip:function(){return this._$tooltip?this._$tooltip[0]:null},enable:function(){return this.__enabled=!0,this},hide:function(a){return this.close(a)},instance:function(){return this},off:function(){return this.__destroyed||this.__$emitterPublic.off.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},on:function(){return this.__destroyed?this.__destroyError():this.__$emitterPublic.on.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},one:function(){return this.__destroyed?this.__destroyError():this.__$emitterPublic.one.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},open:function(a){return this.__destroyed?this.__destroyError():this._open(null,a),this},option:function(b,c){return void 0===c?this.__options[b]:(this.__destroyed?this.__destroyError():(this.__options[b]=c,this.__optionsFormat(),a.inArray(b,["trigger","triggerClose","triggerOpen"])>=0&&this.__prepareOrigin(),"selfDestruction"===b&&this.__prepareGC()),this)},reposition:function(a,b){var c=this;return c.__destroyed?c.__destroyError():"closed"!=c.__state&&d(c._$origin)&&(b||d(c._$tooltip))&&(b||c._$tooltip.detach(),c.__Geometry=c.__geometry(),c._trigger({type:"reposition",event:a,helper:{geo:c.__Geometry}})),c},show:function(a){return this.open(a)},status:function(){return{destroyed:this.__destroyed,enabled:this.__enabled,open:"closed"!==this.__state,state:this.__state}},triggerHandler:function(){return this.__destroyed?this.__destroyError():this.__$emitterPublic.triggerHandler.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this}},a.fn.tooltipster=function(){var b=Array.prototype.slice.apply(arguments),c="You are using a single HTML element as content for several tooltips. You probably want to set the contentCloning option to TRUE.";if(0===this.length)return this;if("string"==typeof b[0]){var d="#*$~&";return this.each(function(){var e=a(this).data("tooltipster-ns"),f=e?a(this).data(e[0]):null;if(!f)throw new Error("You called Tooltipster's \""+b[0]+'" method on an uninitialized element');if("function"!=typeof f[b[0]])throw new Error('Unknown method "'+b[0]+'"');this.length>1&&"content"==b[0]&&(b[1]instanceof a||"object"==typeof b[1]&&null!=b[1]&&b[1].tagName)&&!f.__options.contentCloning&&f.__options.debug&&console.log(c);var g=f[b[0]](b[1],b[2]);return g!==f||"instance"===b[0]?(d=g,!1):void 0}),"#*$~&"!==d?d:this}a.tooltipster.__instancesLatestArr=[];var e=b[0]&&void 0!==b[0].multiple,g=e&&b[0].multiple||!e&&f.multiple,h=b[0]&&void 0!==b[0].content,i=h&&b[0].content||!h&&f.content,j=b[0]&&void 0!==b[0].contentCloning,k=j&&b[0].contentCloning||!j&&f.contentCloning,l=b[0]&&void 0!==b[0].debug,m=l&&b[0].debug||!l&&f.debug;return this.length>1&&(i instanceof a||"object"==typeof i&&null!=i&&i.tagName)&&!k&&m&&console.log(c),this.each(function(){var c=!1,d=a(this),e=d.data("tooltipster-ns"),f=null;e?g?c=!0:m&&(console.log("Tooltipster: one or more tooltips are already attached to the element below. Ignoring."),console.log(this)):c=!0,c&&(f=new a.Tooltipster(this,b[0]),e||(e=[]),e.push(f.__namespace),d.data("tooltipster-ns",e),d.data(f.__namespace,f),f.__options.functionInit&&f.__options.functionInit.call(f,f,{origin:this}),f._trigger("init")),a.tooltipster.__instancesLatestArr.push(f)}),this},b.prototype={__init:function(b){this.__$tooltip=b,this.__$tooltip.css({left:0,overflow:"hidden",position:"absolute",top:0}).find(".tooltipster-content").css("overflow","auto"),this.$container=a('
').append(this.__$tooltip).appendTo(h.window.document.body)},__forceRedraw:function(){var a=this.__$tooltip.parent();this.__$tooltip.detach(),this.__$tooltip.appendTo(a)},constrain:function(a,b){return this.constraints={width:a,height:b},this.__$tooltip.css({display:"block",height:"",overflow:"auto",width:a}),this},destroy:function(){this.__$tooltip.detach().find(".tooltipster-content").css({display:"",overflow:""}),this.$container.remove()},free:function(){return this.constraints=null,this.__$tooltip.css({display:"",height:"",overflow:"visible",width:""}),this},measure:function(){this.__forceRedraw();var a=this.__$tooltip[0].getBoundingClientRect(),b={size:{height:a.height||a.bottom-a.top,width:a.width||a.right-a.left}};if(this.constraints){var c=this.__$tooltip.find(".tooltipster-content"),d=this.__$tooltip.outerHeight(),e=c[0].getBoundingClientRect(),f={height:d<=this.constraints.height,width:a.width<=this.constraints.width&&e.width>=c[0].scrollWidth-1};b.fits=f.height&&f.width}return h.IE&&h.IE<=11&&b.size.width!==h.window.document.documentElement.clientWidth&&(b.size.width=Math.ceil(b.size.width)+1),b}};var j=navigator.userAgent.toLowerCase();-1!=j.indexOf("msie")?h.IE=parseInt(j.split("msie")[1]):-1!==j.toLowerCase().indexOf("trident")&&-1!==j.indexOf(" rv:11")?h.IE=11:-1!=j.toLowerCase().indexOf("edge/")&&(h.IE=parseInt(j.toLowerCase().split("edge/")[1]));var k="tooltipster.sideTip";return a.tooltipster._plugin({name:k,instance:{__defaults:function(){return{arrow:!0,distance:6,functionPosition:null,maxWidth:null,minIntersection:16,minWidth:0,position:null,side:"top",viewportAware:!0}},__init:function(a){var b=this;b.__instance=a,b.__namespace="tooltipster-sideTip-"+Math.round(1e6*Math.random()),b.__previousState="closed",b.__options,b.__optionsFormat(),b.__instance._on("state."+b.__namespace,function(a){"closed"==a.state?b.__close():"appearing"==a.state&&"closed"==b.__previousState&&b.__create(),b.__previousState=a.state}),b.__instance._on("options."+b.__namespace,function(){b.__optionsFormat()}),b.__instance._on("reposition."+b.__namespace,function(a){b.__reposition(a.event,a.helper)})},__close:function(){this.__instance.content()instanceof a&&this.__instance.content().detach(),this.__instance._$tooltip.remove(),this.__instance._$tooltip=null},__create:function(){var b=a('
');this.__options.arrow||b.find(".tooltipster-box").css("margin",0).end().find(".tooltipster-arrow").hide(),this.__options.minWidth&&b.css("min-width",this.__options.minWidth+"px"),this.__options.maxWidth&&b.css("max-width",this.__options.maxWidth+"px"), -this.__instance._$tooltip=b,this.__instance._trigger("created")},__destroy:function(){this.__instance._off("."+self.__namespace)},__optionsFormat:function(){var b=this;if(b.__options=b.__instance._optionsExtract(k,b.__defaults()),b.__options.position&&(b.__options.side=b.__options.position),"object"!=typeof b.__options.distance&&(b.__options.distance=[b.__options.distance]),b.__options.distance.length<4&&(void 0===b.__options.distance[1]&&(b.__options.distance[1]=b.__options.distance[0]),void 0===b.__options.distance[2]&&(b.__options.distance[2]=b.__options.distance[0]),void 0===b.__options.distance[3]&&(b.__options.distance[3]=b.__options.distance[1]),b.__options.distance={top:b.__options.distance[0],right:b.__options.distance[1],bottom:b.__options.distance[2],left:b.__options.distance[3]}),"string"==typeof b.__options.side){var c={top:"bottom",right:"left",bottom:"top",left:"right"};b.__options.side=[b.__options.side,c[b.__options.side]],"left"==b.__options.side[0]||"right"==b.__options.side[0]?b.__options.side.push("top","bottom"):b.__options.side.push("right","left")}6===a.tooltipster._env.IE&&b.__options.arrow!==!0&&(b.__options.arrow=!1)},__reposition:function(b,c){var d,e=this,f=e.__targetFind(c),g=[];e.__instance._$tooltip.detach();var h=e.__instance._$tooltip.clone(),i=a.tooltipster._getRuler(h),j=!1,k=e.__instance.option("animation");switch(k&&h.removeClass("tooltipster-"+k),a.each(["window","document"],function(d,k){var l=null;if(e.__instance._trigger({container:k,helper:c,satisfied:j,takeTest:function(a){l=a},results:g,type:"positionTest"}),1==l||0!=l&&0==j&&("window"!=k||e.__options.viewportAware))for(var d=0;d=h.outerSize.width&&c.geo.available[k][n].height>=h.outerSize.height?h.fits=!0:h.fits=!1:h.fits=p.fits,"window"==k&&(h.fits?"top"==n||"bottom"==n?h.whole=c.geo.origin.windowOffset.right>=e.__options.minIntersection&&c.geo.window.size.width-c.geo.origin.windowOffset.left>=e.__options.minIntersection:h.whole=c.geo.origin.windowOffset.bottom>=e.__options.minIntersection&&c.geo.window.size.height-c.geo.origin.windowOffset.top>=e.__options.minIntersection:h.whole=!1),g.push(h),h.whole)j=!0;else if("natural"==h.mode&&(h.fits||h.size.width<=c.geo.available[k][n].width))return!1}})}}),e.__instance._trigger({edit:function(a){g=a},event:b,helper:c,results:g,type:"positionTested"}),g.sort(function(a,b){if(a.whole&&!b.whole)return-1;if(!a.whole&&b.whole)return 1;if(a.whole&&b.whole){var c=e.__options.side.indexOf(a.side),d=e.__options.side.indexOf(b.side);return d>c?-1:c>d?1:"natural"==a.mode?-1:1}if(a.fits&&!b.fits)return-1;if(!a.fits&&b.fits)return 1;if(a.fits&&b.fits){var c=e.__options.side.indexOf(a.side),d=e.__options.side.indexOf(b.side);return d>c?-1:c>d?1:"natural"==a.mode?-1:1}return"document"==a.container&&"bottom"==a.side&&"natural"==a.mode?-1:1}),d=g[0],d.coord={},d.side){case"left":case"right":d.coord.top=Math.floor(d.target-d.size.height/2);break;case"bottom":case"top":d.coord.left=Math.floor(d.target-d.size.width/2)}switch(d.side){case"left":d.coord.left=c.geo.origin.windowOffset.left-d.outerSize.width;break;case"right":d.coord.left=c.geo.origin.windowOffset.right+d.distance.horizontal;break;case"top":d.coord.top=c.geo.origin.windowOffset.top-d.outerSize.height;break;case"bottom":d.coord.top=c.geo.origin.windowOffset.bottom+d.distance.vertical}"window"==d.container?"top"==d.side||"bottom"==d.side?d.coord.left<0?c.geo.origin.windowOffset.right-this.__options.minIntersection>=0?d.coord.left=0:d.coord.left=c.geo.origin.windowOffset.right-this.__options.minIntersection-1:d.coord.left>c.geo.window.size.width-d.size.width&&(c.geo.origin.windowOffset.left+this.__options.minIntersection<=c.geo.window.size.width?d.coord.left=c.geo.window.size.width-d.size.width:d.coord.left=c.geo.origin.windowOffset.left+this.__options.minIntersection+1-d.size.width):d.coord.top<0?c.geo.origin.windowOffset.bottom-this.__options.minIntersection>=0?d.coord.top=0:d.coord.top=c.geo.origin.windowOffset.bottom-this.__options.minIntersection-1:d.coord.top>c.geo.window.size.height-d.size.height&&(c.geo.origin.windowOffset.top+this.__options.minIntersection<=c.geo.window.size.height?d.coord.top=c.geo.window.size.height-d.size.height:d.coord.top=c.geo.origin.windowOffset.top+this.__options.minIntersection+1-d.size.height):(d.coord.left>c.geo.window.size.width-d.size.width&&(d.coord.left=c.geo.window.size.width-d.size.width),d.coord.left<0&&(d.coord.left=0)),e.__sideChange(h,d.side),c.tooltipClone=h[0],c.tooltipParent=e.__instance.option("parent").parent[0],c.mode=d.mode,c.whole=d.whole,c.origin=e.__instance._$origin[0],c.tooltip=e.__instance._$tooltip[0],delete d.container,delete d.fits,delete d.mode,delete d.outerSize,delete d.whole,d.distance=d.distance.horizontal||d.distance.vertical;var l=a.extend(!0,{},d);if(e.__instance._trigger({edit:function(a){d=a},event:b,helper:c,position:l,type:"position"}),e.__options.functionPosition){var m=e.__options.functionPosition.call(e,e.__instance,c,l);m&&(d=m)}i.destroy();var n,o;"top"==d.side||"bottom"==d.side?(n={prop:"left",val:d.target-d.coord.left},o=d.size.width-this.__options.minIntersection):(n={prop:"top",val:d.target-d.coord.top},o=d.size.height-this.__options.minIntersection),n.valo&&(n.val=o);var p;p=c.geo.origin.fixedLineage?c.geo.origin.windowOffset:{left:c.geo.origin.windowOffset.left+c.geo.window.scroll.left,top:c.geo.origin.windowOffset.top+c.geo.window.scroll.top},d.coord={left:p.left+(d.coord.left-c.geo.origin.windowOffset.left),top:p.top+(d.coord.top-c.geo.origin.windowOffset.top)},e.__sideChange(e.__instance._$tooltip,d.side),c.geo.origin.fixedLineage?e.__instance._$tooltip.css("position","fixed"):e.__instance._$tooltip.css("position",""),e.__instance._$tooltip.css({left:d.coord.left,top:d.coord.top,height:d.size.height,width:d.size.width}).find(".tooltipster-arrow").css({left:"",top:""}).css(n.prop,n.val),e.__instance._$tooltip.appendTo(e.__instance.option("parent")),e.__instance._trigger({type:"repositioned",event:b,position:d})},__sideChange:function(a,b){a.removeClass("tooltipster-bottom").removeClass("tooltipster-left").removeClass("tooltipster-right").removeClass("tooltipster-top").addClass("tooltipster-"+b)},__targetFind:function(a){var b={},c=this.__instance._$origin[0].getClientRects();if(c.length>1){var d=this.__instance._$origin.css("opacity");1==d&&(this.__instance._$origin.css("opacity",.99),c=this.__instance._$origin[0].getClientRects(),this.__instance._$origin.css("opacity",1))}if(c.length<2)b.top=Math.floor(a.geo.origin.windowOffset.left+a.geo.origin.size.width/2),b.bottom=b.top,b.left=Math.floor(a.geo.origin.windowOffset.top+a.geo.origin.size.height/2),b.right=b.left;else{var e=c[0];b.top=Math.floor(e.left+(e.right-e.left)/2),e=c.length>2?c[Math.ceil(c.length/2)-1]:c[0],b.right=Math.floor(e.top+(e.bottom-e.top)/2),e=c[c.length-1],b.bottom=Math.floor(e.left+(e.right-e.left)/2),e=c.length>2?c[Math.ceil((c.length+1)/2)-1]:c[c.length-1],b.left=Math.floor(e.top+(e.bottom-e.top)/2)}return b}}}),a}); \ No newline at end of file diff --git a/app/assets/stylesheets/themes/lirmm/main.scss b/app/assets/stylesheets/themes/lirmm/main.scss index d5bb078c1..53ba749a4 100644 --- a/app/assets/stylesheets/themes/lirmm/main.scss +++ b/app/assets/stylesheets/themes/lirmm/main.scss @@ -2,18 +2,11 @@ @import "annotator"; @import "app"; @import "bootstrap_overrides"; -@import "flags32"; @import "jqcloud"; @import "landscape"; @import "ontologies"; @import "recommender"; @import "search"; -@import "tooltipster.bundle.min"; -@import "plugins/tooltipster/sideTip/themes/tooltipster-sideTip-borderless.min"; -@import "plugins/tooltipster/sideTip/themes/tooltipster-sideTip-light.min"; -@import "plugins/tooltipster/sideTip/themes/tooltipster-sideTip-noir.min"; -@import "plugins/tooltipster/sideTip/themes/tooltipster-sideTip-punk.min"; -@import "plugins/tooltipster/sideTip/themes/tooltipster-sideTip-shadow.min"; /************************************ diff --git a/app/assets/stylesheets/themes/lirmm/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-borderless.min.scss b/app/assets/stylesheets/themes/lirmm/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-borderless.min.scss deleted file mode 100644 index 19408cb1e..000000000 --- a/app/assets/stylesheets/themes/lirmm/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-borderless.min.scss +++ /dev/null @@ -1 +0,0 @@ -.tooltipster-sidetip.tooltipster-borderless .tooltipster-box{border:none;background:#1b1b1b;background:rgba(10,10,10,.9)}.tooltipster-sidetip.tooltipster-borderless.tooltipster-bottom .tooltipster-box{margin-top:8px}.tooltipster-sidetip.tooltipster-borderless.tooltipster-left .tooltipster-box{margin-right:8px}.tooltipster-sidetip.tooltipster-borderless.tooltipster-right .tooltipster-box{margin-left:8px}.tooltipster-sidetip.tooltipster-borderless.tooltipster-top .tooltipster-box{margin-bottom:8px}.tooltipster-sidetip.tooltipster-borderless .tooltipster-arrow{height:8px;margin-left:-8px;width:16px}.tooltipster-sidetip.tooltipster-borderless.tooltipster-left .tooltipster-arrow,.tooltipster-sidetip.tooltipster-borderless.tooltipster-right .tooltipster-arrow{height:16px;margin-left:0;margin-top:-8px;width:8px}.tooltipster-sidetip.tooltipster-borderless .tooltipster-arrow-background{display:none}.tooltipster-sidetip.tooltipster-borderless .tooltipster-arrow-border{border:8px solid transparent}.tooltipster-sidetip.tooltipster-borderless.tooltipster-bottom .tooltipster-arrow-border{border-bottom-color:#1b1b1b;border-bottom-color:rgba(10,10,10,.9)}.tooltipster-sidetip.tooltipster-borderless.tooltipster-left .tooltipster-arrow-border{border-left-color:#1b1b1b;border-left-color:rgba(10,10,10,.9)}.tooltipster-sidetip.tooltipster-borderless.tooltipster-right .tooltipster-arrow-border{border-right-color:#1b1b1b;border-right-color:rgba(10,10,10,.9)}.tooltipster-sidetip.tooltipster-borderless.tooltipster-top .tooltipster-arrow-border{border-top-color:#1b1b1b;border-top-color:rgba(10,10,10,.9)}.tooltipster-sidetip.tooltipster-borderless.tooltipster-bottom .tooltipster-arrow-uncropped{top:-8px}.tooltipster-sidetip.tooltipster-borderless.tooltipster-right .tooltipster-arrow-uncropped{left:-8px} \ No newline at end of file diff --git a/app/assets/stylesheets/themes/lirmm/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-light.min.scss b/app/assets/stylesheets/themes/lirmm/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-light.min.scss deleted file mode 100644 index 298c9d4a5..000000000 --- a/app/assets/stylesheets/themes/lirmm/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-light.min.scss +++ /dev/null @@ -1 +0,0 @@ -.tooltipster-sidetip.tooltipster-light .tooltipster-box{border-radius:3px;border:1px solid #ccc;background:#ededed}.tooltipster-sidetip.tooltipster-light .tooltipster-content{color:#666}.tooltipster-sidetip.tooltipster-light .tooltipster-arrow{height:9px;margin-left:-9px;width:18px}.tooltipster-sidetip.tooltipster-light.tooltipster-left .tooltipster-arrow,.tooltipster-sidetip.tooltipster-light.tooltipster-right .tooltipster-arrow{height:18px;margin-left:0;margin-top:-9px;width:9px}.tooltipster-sidetip.tooltipster-light .tooltipster-arrow-background{border:9px solid transparent}.tooltipster-sidetip.tooltipster-light.tooltipster-bottom .tooltipster-arrow-background{border-bottom-color:#ededed;top:1px}.tooltipster-sidetip.tooltipster-light.tooltipster-left .tooltipster-arrow-background{border-left-color:#ededed;left:-1px}.tooltipster-sidetip.tooltipster-light.tooltipster-right .tooltipster-arrow-background{border-right-color:#ededed;left:1px}.tooltipster-sidetip.tooltipster-light.tooltipster-top .tooltipster-arrow-background{border-top-color:#ededed;top:-1px}.tooltipster-sidetip.tooltipster-light .tooltipster-arrow-border{border:9px solid transparent}.tooltipster-sidetip.tooltipster-light.tooltipster-bottom .tooltipster-arrow-border{border-bottom-color:#ccc}.tooltipster-sidetip.tooltipster-light.tooltipster-left .tooltipster-arrow-border{border-left-color:#ccc}.tooltipster-sidetip.tooltipster-light.tooltipster-right .tooltipster-arrow-border{border-right-color:#ccc}.tooltipster-sidetip.tooltipster-light.tooltipster-top .tooltipster-arrow-border{border-top-color:#ccc}.tooltipster-sidetip.tooltipster-light.tooltipster-bottom .tooltipster-arrow-uncropped{top:-9px}.tooltipster-sidetip.tooltipster-light.tooltipster-right .tooltipster-arrow-uncropped{left:-9px} \ No newline at end of file diff --git a/app/assets/stylesheets/themes/lirmm/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-noir.min.scss b/app/assets/stylesheets/themes/lirmm/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-noir.min.scss deleted file mode 100644 index 39f4ca388..000000000 --- a/app/assets/stylesheets/themes/lirmm/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-noir.min.scss +++ /dev/null @@ -1 +0,0 @@ -.tooltipster-sidetip.tooltipster-noir .tooltipster-box{border-radius:0;border:3px solid #000;background:#fff}.tooltipster-sidetip.tooltipster-noir .tooltipster-content{color:#000}.tooltipster-sidetip.tooltipster-noir .tooltipster-arrow{height:11px;margin-left:-11px;width:22px}.tooltipster-sidetip.tooltipster-noir.tooltipster-left .tooltipster-arrow,.tooltipster-sidetip.tooltipster-noir.tooltipster-right .tooltipster-arrow{height:22px;margin-left:0;margin-top:-11px;width:11px}.tooltipster-sidetip.tooltipster-noir .tooltipster-arrow-background{border:11px solid transparent}.tooltipster-sidetip.tooltipster-noir.tooltipster-bottom .tooltipster-arrow-background{border-bottom-color:#fff;top:4px}.tooltipster-sidetip.tooltipster-noir.tooltipster-left .tooltipster-arrow-background{border-left-color:#fff;left:-4px}.tooltipster-sidetip.tooltipster-noir.tooltipster-right .tooltipster-arrow-background{border-right-color:#fff;left:4px}.tooltipster-sidetip.tooltipster-noir.tooltipster-top .tooltipster-arrow-background{border-top-color:#fff;top:-4px}.tooltipster-sidetip.tooltipster-noir .tooltipster-arrow-border{border-width:11px}.tooltipster-sidetip.tooltipster-noir.tooltipster-bottom .tooltipster-arrow-uncropped{top:-11px}.tooltipster-sidetip.tooltipster-noir.tooltipster-right .tooltipster-arrow-uncropped{left:-11px} \ No newline at end of file diff --git a/app/assets/stylesheets/themes/lirmm/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-punk.min.scss b/app/assets/stylesheets/themes/lirmm/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-punk.min.scss deleted file mode 100644 index 6702cf557..000000000 --- a/app/assets/stylesheets/themes/lirmm/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-punk.min.scss +++ /dev/null @@ -1 +0,0 @@ -.tooltipster-sidetip.tooltipster-punk .tooltipster-box{border-radius:5px;border:none;border-bottom:3px solid #f71169;background:#2a2a2a}.tooltipster-sidetip.tooltipster-punk.tooltipster-top .tooltipster-box{margin-bottom:7px}.tooltipster-sidetip.tooltipster-punk .tooltipster-content{color:#fff;padding:8px 16px}.tooltipster-sidetip.tooltipster-punk .tooltipster-arrow-background{display:none}.tooltipster-sidetip.tooltipster-punk.tooltipster-bottom .tooltipster-arrow-border{border-bottom-color:#2a2a2a}.tooltipster-sidetip.tooltipster-punk.tooltipster-left .tooltipster-arrow-border{border-left-color:#2a2a2a}.tooltipster-sidetip.tooltipster-punk.tooltipster-right .tooltipster-arrow-border{border-right-color:#2a2a2a}.tooltipster-sidetip.tooltipster-punk.tooltipster-top .tooltipster-arrow-border{border-top-color:#f71169} \ No newline at end of file diff --git a/app/assets/stylesheets/themes/lirmm/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-shadow.min.scss b/app/assets/stylesheets/themes/lirmm/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-shadow.min.scss deleted file mode 100644 index 7d92926de..000000000 --- a/app/assets/stylesheets/themes/lirmm/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-shadow.min.scss +++ /dev/null @@ -1 +0,0 @@ -.tooltipster-sidetip.tooltipster-shadow .tooltipster-box{border:none;border-radius:5px;background:#fff;box-shadow:0 0 10px 6px rgba(0,0,0,.1)}.tooltipster-sidetip.tooltipster-shadow.tooltipster-bottom .tooltipster-box{margin-top:6px}.tooltipster-sidetip.tooltipster-shadow.tooltipster-left .tooltipster-box{margin-right:6px}.tooltipster-sidetip.tooltipster-shadow.tooltipster-right .tooltipster-box{margin-left:6px}.tooltipster-sidetip.tooltipster-shadow.tooltipster-top .tooltipster-box{margin-bottom:6px}.tooltipster-sidetip.tooltipster-shadow .tooltipster-content{color:#8d8d8d}.tooltipster-sidetip.tooltipster-shadow .tooltipster-arrow{height:6px;margin-left:-6px;width:12px}.tooltipster-sidetip.tooltipster-shadow.tooltipster-left .tooltipster-arrow,.tooltipster-sidetip.tooltipster-shadow.tooltipster-right .tooltipster-arrow{height:12px;margin-left:0;margin-top:-6px;width:6px}.tooltipster-sidetip.tooltipster-shadow .tooltipster-arrow-background{display:none}.tooltipster-sidetip.tooltipster-shadow .tooltipster-arrow-border{border:6px solid transparent}.tooltipster-sidetip.tooltipster-shadow.tooltipster-bottom .tooltipster-arrow-border{border-bottom-color:#fff}.tooltipster-sidetip.tooltipster-shadow.tooltipster-left .tooltipster-arrow-border{border-left-color:#fff}.tooltipster-sidetip.tooltipster-shadow.tooltipster-right .tooltipster-arrow-border{border-right-color:#fff}.tooltipster-sidetip.tooltipster-shadow.tooltipster-top .tooltipster-arrow-border{border-top-color:#fff}.tooltipster-sidetip.tooltipster-shadow.tooltipster-bottom .tooltipster-arrow-uncropped{top:-6px}.tooltipster-sidetip.tooltipster-shadow.tooltipster-right .tooltipster-arrow-uncropped{left:-6px} \ No newline at end of file diff --git a/app/assets/stylesheets/themes/lirmm/tooltipster.bundle.min.scss b/app/assets/stylesheets/themes/lirmm/tooltipster.bundle.min.scss deleted file mode 100644 index d8f30feec..000000000 --- a/app/assets/stylesheets/themes/lirmm/tooltipster.bundle.min.scss +++ /dev/null @@ -1 +0,0 @@ -.tooltipster-fall,.tooltipster-grow.tooltipster-show{-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1);-moz-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-ms-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-o-transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-base{display:flex;pointer-events:none;position:absolute}.tooltipster-box{flex:1 1 auto}.tooltipster-content{box-sizing:border-box;max-height:100%;max-width:100%;overflow:auto}.tooltipster-ruler{bottom:0;left:0;overflow:hidden;position:fixed;right:0;top:0;visibility:hidden}.tooltipster-fade{opacity:0;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;-ms-transition-property:opacity;transition-property:opacity}.tooltipster-fade.tooltipster-show{opacity:1}.tooltipster-grow{-webkit-transform:scale(0,0);-moz-transform:scale(0,0);-o-transform:scale(0,0);-ms-transform:scale(0,0);transform:scale(0,0);-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform;-webkit-backface-visibility:hidden}.tooltipster-grow.tooltipster-show{-webkit-transform:scale(1,1);-moz-transform:scale(1,1);-o-transform:scale(1,1);-ms-transform:scale(1,1);transform:scale(1,1);-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-swing{opacity:0;-webkit-transform:rotateZ(4deg);-moz-transform:rotateZ(4deg);-o-transform:rotateZ(4deg);-ms-transform:rotateZ(4deg);transform:rotateZ(4deg);-webkit-transition-property:-webkit-transform,opacity;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform}.tooltipster-swing.tooltipster-show{opacity:1;-webkit-transform:rotateZ(0);-moz-transform:rotateZ(0);-o-transform:rotateZ(0);-ms-transform:rotateZ(0);transform:rotateZ(0);-webkit-transition-timing-function:cubic-bezier(.23,.635,.495,1);-webkit-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);-moz-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);-ms-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);-o-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);transition-timing-function:cubic-bezier(.23,.635,.495,2.4)}.tooltipster-fall{-webkit-transition-property:top;-moz-transition-property:top;-o-transition-property:top;-ms-transition-property:top;transition-property:top;-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-fall.tooltipster-initial{top:0!important}.tooltipster-fall.tooltipster-dying{-webkit-transition-property:all;-moz-transition-property:all;-o-transition-property:all;-ms-transition-property:all;transition-property:all;top:0!important;opacity:0}.tooltipster-slide{-webkit-transition-property:left;-moz-transition-property:left;-o-transition-property:left;-ms-transition-property:left;transition-property:left;-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1);-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-moz-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-ms-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-o-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-slide.tooltipster-initial{left:-40px!important}.tooltipster-slide.tooltipster-dying{-webkit-transition-property:all;-moz-transition-property:all;-o-transition-property:all;-ms-transition-property:all;transition-property:all;left:0!important;opacity:0}@keyframes tooltipster-fading{0%{opacity:0}100%{opacity:1}}.tooltipster-update-fade{animation:tooltipster-fading .4s}@keyframes tooltipster-rotating{25%{transform:rotate(-2deg)}75%{transform:rotate(2deg)}100%{transform:rotate(0)}}.tooltipster-update-rotate{animation:tooltipster-rotating .6s}@keyframes tooltipster-scaling{50%{transform:scale(1.1)}100%{transform:scale(1)}}.tooltipster-update-scale{animation:tooltipster-scaling .6s}.tooltipster-sidetip .tooltipster-box{background:#565656;border:2px solid #000;border-radius:4px}.tooltipster-sidetip.tooltipster-bottom .tooltipster-box{margin-top:8px}.tooltipster-sidetip.tooltipster-left .tooltipster-box{margin-right:8px}.tooltipster-sidetip.tooltipster-right .tooltipster-box{margin-left:8px}.tooltipster-sidetip.tooltipster-top .tooltipster-box{margin-bottom:8px}.tooltipster-sidetip .tooltipster-content{color:#fff;line-height:18px;padding:6px 14px}.tooltipster-sidetip .tooltipster-arrow{overflow:hidden;position:absolute}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow{height:10px;margin-left:-10px;top:0;width:20px}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow{height:20px;margin-top:-10px;right:0;top:0;width:10px}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow{height:20px;margin-top:-10px;left:0;top:0;width:10px}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow{bottom:0;height:10px;margin-left:-10px;width:20px}.tooltipster-sidetip .tooltipster-arrow-background,.tooltipster-sidetip .tooltipster-arrow-border{height:0;position:absolute;width:0}.tooltipster-sidetip .tooltipster-arrow-background{border:10px solid transparent}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-background{border-bottom-color:#565656;left:0;top:3px}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow-background{border-left-color:#565656;left:-3px;top:0}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-background{border-right-color:#565656;left:3px;top:0}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow-background{border-top-color:#565656;left:0;top:-3px}.tooltipster-sidetip .tooltipster-arrow-border{border:10px solid transparent;left:0;top:0}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-border{border-bottom-color:#000}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow-border{border-left-color:#000}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-border{border-right-color:#000}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow-border{border-top-color:#000}.tooltipster-sidetip .tooltipster-arrow-uncropped{position:relative}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-uncropped{top:-10px}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-uncropped{left:-10px} \ No newline at end of file From 7478c14fd1ba98f9f44d57843caa1a7d229f929d Mon Sep 17 00:00:00 2001 From: Syphax Bouazzouni Date: Tue, 5 Sep 2023 02:33:31 +0200 Subject: [PATCH 18/19] fix flag size in the summary page --- app/assets/stylesheets/summary.scss.erb | 4 ++++ app/components/language_field_component.rb | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/summary.scss.erb b/app/assets/stylesheets/summary.scss.erb index 262c9e742..af2f1a640 100644 --- a/app/assets/stylesheets/summary.scss.erb +++ b/app/assets/stylesheets/summary.scss.erb @@ -2,6 +2,10 @@ display: flex; justify-content: center; flex-wrap: wrap; + .flag-icon{ + width: 30px; + height: 30px; + } } .summary-page-center .card_title{ diff --git a/app/components/language_field_component.rb b/app/components/language_field_component.rb index 2fde7ebfb..2bd646a78 100644 --- a/app/components/language_field_component.rb +++ b/app/components/language_field_component.rb @@ -8,7 +8,7 @@ class LanguageFieldComponent < ViewComponent::Base def initialize(value:, label: nil) super @value = value - @lang_code = ISO_639.find(value)&.alpha2 || nil + @lang_code = ISO_639.find(value.split('/').last)&.alpha2 || nil @label = label end From dbb82135581d0e4032804a01e5c3797bfb68857d Mon Sep 17 00:00:00 2001 From: Syphax Bouazzouni Date: Tue, 5 Sep 2023 02:34:26 +0200 Subject: [PATCH 19/19] add selected argument to LanguageSelector component --- app/assets/stylesheets/upload_ontology.scss | 7 ++-- .../input/language_selector_component.rb | 5 ++- app/components/select_input_component.rb | 2 +- config/environments/development.rb | 37 ++++++++++++------- .../input/select_component_preview.rb | 4 +- 5 files changed, 34 insertions(+), 21 deletions(-) diff --git a/app/assets/stylesheets/upload_ontology.scss b/app/assets/stylesheets/upload_ontology.scss index d5026556c..978d3997d 100644 --- a/app/assets/stylesheets/upload_ontology.scss +++ b/app/assets/stylesheets/upload_ontology.scss @@ -2,6 +2,9 @@ display: flex; justify-content: center; padding: 40px 0; + .show { + display: block; + } } .upload-ontology-card { @@ -50,9 +53,7 @@ display: none; } -.show { - display: block; -} + .upload-ontology-desc { font-size: 12px; diff --git a/app/components/input/language_selector_component.rb b/app/components/input/language_selector_component.rb index 443ee2cbb..3a7ec435c 100644 --- a/app/components/input/language_selector_component.rb +++ b/app/components/input/language_selector_component.rb @@ -2,11 +2,12 @@ class Input::LanguageSelectorComponent < ViewComponent::Base - def initialize(languages:, id: '', name: '' ) + def initialize(languages:, selected: nil, id: '', name: '' ) super @languages = languages @id = id @name = languages + @selected = selected end def languages_options @@ -20,6 +21,6 @@ def languages_options end def call - render SelectInputComponent.new(id: @id, name: @name, values: languages_options, placeholder: 'Select a language') + render SelectInputComponent.new(id: @id, name: @name, values: languages_options, selected: @selected, placeholder: 'Select a language') end end diff --git a/app/components/select_input_component.rb b/app/components/select_input_component.rb index 9392c6b8e..c006ec266 100644 --- a/app/components/select_input_component.rb +++ b/app/components/select_input_component.rb @@ -2,7 +2,7 @@ class SelectInputComponent < ViewComponent::Base - def initialize(id:, name:, values:, selected:, multiple: false, open_to_add_values: false, data: {}, placeholder: '') + def initialize(id:, name:, values:, selected: nil, multiple: false, open_to_add_values: false, data: {}, placeholder: '') super @id = id || '' @name = name diff --git a/config/environments/development.rb b/config/environments/development.rb index ede4e54c9..b595b87cd 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -1,7 +1,10 @@ +require "active_support/core_ext/integer/time" + Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. - # In the development environment your application's code is reloaded on - # every request. This slows down response time but is perfect for development + config.assets.debug = true + # In the development environment your application's code is reloaded any time + # it changes. This slows down response time but is perfect for development # since you don't have to restart the web server when you make code changes. config.cache_classes = false @@ -11,15 +14,18 @@ # Show full error reports. config.consider_all_requests_local = true + # Enable server timing + config.server_timing = true + # Enable/disable caching. By default caching is disabled. # Run rails dev:cache to toggle caching. - if Rails.root.join('tmp', 'caching-dev.txt').exist? + if Rails.root.join("tmp/caching-dev.txt").exist? config.action_controller.perform_caching = true config.action_controller.enable_fragment_cache_logging = true config.cache_store = :memory_store config.public_file_server.headers = { - 'Cache-Control' => "public, max-age=#{2.days.to_i}" + "Cache-Control" => "public, max-age=#{2.days.to_i}" } else config.action_controller.perform_caching = false @@ -38,27 +44,30 @@ # Print deprecation notices to the Rails logger. config.active_support.deprecation = :log + # Raise exceptions for disallowed deprecations. + config.active_support.disallowed_deprecation = :raise + + # Tell Active Support which deprecation messages to disallow. + config.active_support.disallowed_deprecation_warnings = [] + # Raise an error on page load if there are pending migrations. config.active_record.migration_error = :page_load # Highlight code that triggered database queries in logs. config.active_record.verbose_query_logs = true - # Debug mode disables concatenation and preprocessing of assets. - # This option may cause significant delays in view rendering with a large - # number of complex assets. - config.assets.debug = true # Suppress logger output for asset requests. config.assets.quiet = true # memcache setup - config.cache_store = ActiveSupport::Cache::MemCacheStore.new('cache', namespace: 'BioPortal') + config.cache_store = ActiveSupport::Cache::MemCacheStore.new('cache:11211', namespace: 'BioPortal') # Silence cache output config.cache_store.logger = Logger.new("/dev/null") if config.cache_store.respond_to?(:logger) # Add custom data attributes to sanitize allowed list config.action_view.sanitized_allowed_attributes = ['id', 'class', 'style', 'data-cls', 'data-ont'] + config.view_component.generate.sidecar = true config.file_watcher = ActiveSupport::FileUpdateChecker @@ -66,9 +75,11 @@ require Rails.root.join('config', "bioportal_config_#{Rails.env}.rb") # Raises error for missing translations. - # config.action_view.raise_on_missing_translations = true + # config.i18n.raise_on_missing_translations = true + + # Annotate rendered view with file names. + # config.action_view.annotate_rendered_view_with_filenames = true - # Use an evented file watcher to asynchronously detect changes in source code, - # routes, locales, etc. This feature depends on the listen gem. - config.file_watcher = ActiveSupport::EventedFileUpdateChecker + # Uncomment if you wish to allow Action Cable access from any origin. + # config.action_cable.disable_request_forgery_protection = true end \ No newline at end of file diff --git a/test/components/previews/input/select_component_preview.rb b/test/components/previews/input/select_component_preview.rb index e8f89cb73..851712b2d 100644 --- a/test/components/previews/input/select_component_preview.rb +++ b/test/components/previews/input/select_component_preview.rb @@ -18,8 +18,8 @@ def open_to_add(id: "", name: "", values: ["choices 1", "choices 2", "choices 3" def with_icon values = [ ['', ''], - ["\nFR", 'fr'], - ["\nEN", 'en'] + ["FR", 'fr'], + ["EN", 'en'] ] render SelectInputComponent.new(id: 'id', name: 'name', values: values, placeholder: 'Choose a language') end