diff --git a/app/assets/stylesheets/admin.scss b/app/assets/stylesheets/admin.scss index 998333449..2bc0cec24 100644 --- a/app/assets/stylesheets/admin.scss +++ b/app/assets/stylesheets/admin.scss @@ -22,6 +22,13 @@ } } +.yasgui .autocompleteWrapper, .yasgui .tabContextButton{ + display: none !important; +} +.yasqe .yasqe_buttons .yasqe_share{ + display: none !important; +} + .alert-box span { font-weight: bold; text-transform: uppercase; diff --git a/app/assets/stylesheets/application.css.scss.erb b/app/assets/stylesheets/application.css.scss.erb index 0040a5ba4..950e97d73 100755 --- a/app/assets/stylesheets/application.css.scss.erb +++ b/app/assets/stylesheets/application.css.scss.erb @@ -49,6 +49,7 @@ @import "tom-select/dist/scss/tom-select"; @import "tippy.js/dist/tippy"; @import 'tippy.js/themes/light-border'; +@import '@triply/yasgui/build/yasgui.min'; @import "feedback"; @import "login"; @import "components/index"; diff --git a/app/assets/stylesheets/home.scss b/app/assets/stylesheets/home.scss index b4303bebe..29841ead3 100644 --- a/app/assets/stylesheets/home.scss +++ b/app/assets/stylesheets/home.scss @@ -153,7 +153,7 @@ i.fa.fa-caret-square-o-down { .home-statistics-container{ border-radius: 8px; box-shadow: 2px 0px 60px rgba(0, 0, 0, 0.10); - padding: 30px 40px; + padding: 30px 40px 10px 40px; } .home-statistics-container > div { diff --git a/app/controllers/admin_controller.rb b/app/controllers/admin_controller.rb index 0db3c0f34..a239307ed 100644 --- a/app/controllers/admin_controller.rb +++ b/app/controllers/admin_controller.rb @@ -1,5 +1,5 @@ class AdminController < ApplicationController - include TurboHelper, HomeHelper + include TurboHelper, HomeHelper, SparqlHelper layout :determine_layout before_action :cache_setup @@ -10,6 +10,20 @@ class AdminController < ApplicationController PARSE_LOG_URL = lambda { |acronym| "#{ONTOLOGY_URL.call(acronym)}/log" } REPORT_NEVER_GENERATED = "NEVER GENERATED" + + def sparql_endpoint + graph = params["named-graph-uri"] + if !session[:user]&.admin? && !graph.blank? + acronym = graph.split('/')[-3] + @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(acronym).first + render(inline: 'Query not permitted') && return if @ontology.nil? || @ontology.errors + end + + response = helpers.ontology_sparql_query(params[:query], graph) + + render inline: response + end + def index @users = LinkedData::Client::Models::User.all @ontology_visits = ontology_visits_data diff --git a/app/controllers/ontologies_controller.rb b/app/controllers/ontologies_controller.rb index 31170cffd..5f8914e69 100644 --- a/app/controllers/ontologies_controller.rb +++ b/app/controllers/ontologies_controller.rb @@ -10,6 +10,7 @@ class OntologiesController < ApplicationController include MappingStatistics include OntologyUpdater include TurboHelper + include SparqlHelper include SubmissionFilter require 'multi_json' @@ -22,7 +23,7 @@ class OntologiesController < ApplicationController before_action :authorize_and_redirect, :only => [:edit, :update, :create, :new] before_action :submission_metadata, only: [:show] - KNOWN_PAGES = Set.new(["terms", "classes", "mappings", "notes", "widgets", "summary", "properties", "instances", "schemes", "collections"]) + KNOWN_PAGES = Set.new(["terms", "classes", "mappings", "notes", "widgets", "summary", "properties", "instances", "schemes", "collections", "sparql"]) EXTERNAL_MAPPINGS_GRAPH = "http://data.bioontology.org/metadata/ExternalMappings" INTERPORTAL_MAPPINGS_GRAPH = "http://data.bioontology.org/metadata/InterportalMappings" @@ -208,6 +209,14 @@ def collections end end + + def sparql + if request.xhr? + render partial: 'ontologies/sections/sparql', layout: false + else + render partial: 'ontologies/sections/sparql', layout: 'ontology_viewer' + end + end # GET /ontologies/ACRONYM # GET /ontologies/1.xml def show @@ -240,7 +249,7 @@ def show # Note: find_by_acronym includes ontology views @ontology = LinkedData::Client::Models::Ontology.find_by_acronym(params[:ontology]).first - ontology_not_found(params[:ontology]) if @ontology.nil? + ontology_not_found(params[:ontology]) if @ontology.nil? || @ontology.errors # Handle the case where an ontology is converted to summary only. # See: https://github.com/ncbo/bioportal_web_ui/issues/133. @@ -288,6 +297,8 @@ def show self.schemes when 'collections' self.collections + when 'sparql' + self.sparql else self.summary end diff --git a/app/controllers/statistics_controller.rb b/app/controllers/statistics_controller.rb new file mode 100644 index 000000000..ac3828f02 --- /dev/null +++ b/app/controllers/statistics_controller.rb @@ -0,0 +1,14 @@ +class StatisticsController < ApplicationController + include StatisticsHelper, ComponentsHelper + + layout :determine_layout + + def index + projects = LinkedData::Client::Models::Project.all({include: 'created'}) + users = LinkedData::Client::Models::User.all({include: 'created'}) + year_month_count, @year_month_visits = ontologies_by_year_month + @merged_data = merge_time_evolution_data([group_by_year_month(users), + group_by_year_month(projects), + year_month_count]) + end +end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index ea12c3545..e6a6d0524 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -25,11 +25,8 @@ module ApplicationHelper def ontologies_analytics - LinkedData::Client::Analytics.all.to_h.map do |key, ontology_analytics| - next if key.eql?(:links) || key.eql?(:context) - - [key.to_s, ontology_analytics.to_h.values.map { |x| x&.values }.flatten.compact.sum] - end.compact.to_h + data = LinkedData::Client::Analytics.last_month.onts + data.map{|x| [x[:ont].to_s, x[:views]]}.to_h end def get_apikey diff --git a/app/helpers/components_helper.rb b/app/helpers/components_helper.rb index 7652f5e28..294238806 100644 --- a/app/helpers/components_helper.rb +++ b/app/helpers/components_helper.rb @@ -17,17 +17,19 @@ def tree_close_icon end - def chart_component(title: '', type: , labels: , datasets: , index_axis: 'x') + def chart_component(title: '', type: , labels: , datasets: , index_axis: 'x', show_legend: false) data = { controller: 'load-chart', 'load-chart-type-value': type, 'load-chart-title-value': title, 'load-chart-labels-value': labels, 'load-chart-index-axis-value': index_axis, - 'load-chart-datasets-value': datasets + 'load-chart-datasets-value': datasets, + 'load-chart-legend-value': show_legend, } content_tag(:canvas, nil, data: data) end + def info_tooltip(text) render Display::InfoTooltipComponent.new(text: text) end diff --git a/app/helpers/ontologies_helper.rb b/app/helpers/ontologies_helper.rb index 3ad522795..3a75d358a 100644 --- a/app/helpers/ontologies_helper.rb +++ b/app/helpers/ontologies_helper.rb @@ -149,7 +149,7 @@ def classes_link(ontology, count) def metadata_filled_count(submission = @submission_latest, ontology = @ontology) return if submission.nil? - + reject = [:csvDump, :dataDump, :openSearchDescription, :metrics, :prefLabelProperty, :definitionProperty, :definitionProperty, :synonymProperty, :authorProperty, :hierarchyProperty, :obsoleteProperty, :ontology, :endpoint, :submissionId, :submissionStatus, :uploadFilePath, :context, :links, :ontology] @@ -384,18 +384,23 @@ def lazy_load_section(section_title, &block) end def visits_chart_dataset(visits_data) - [ + visits_chart_dataset_array({'Visits': visits_data}) + end + + def visits_chart_dataset_array(visits_data, fill: true) + visits_data = visits_data.map do |label , x| { - label: 'Visits', - data: visits_data, + label: label, + data: x, borderWidth: 2, borderRadius: 5, borderSkipped: false, cubicInterpolationMode: 'monotone', tension: 0.4, - fill: true + fill: fill } - ].to_json + end + visits_data.to_json end def submission_ready?(submission) @@ -410,7 +415,7 @@ def sections_to_show sections += %w[properties] sections += %w[schemes collections] if skos? sections += %w[instances] unless skos? - sections += %w[notes mappings widgets] + sections += %w[notes mappings widgets sparql] end sections end diff --git a/app/helpers/sparql_helper.rb b/app/helpers/sparql_helper.rb new file mode 100644 index 000000000..eb1a1eed0 --- /dev/null +++ b/app/helpers/sparql_helper.rb @@ -0,0 +1,67 @@ +module SparqlHelper + def change_from_clause(query, graph) + unless graph.blank? + graph = graph.gsub($REST_URL, 'http://data.bioontology.org') + + if query.match?(/FROM <[^>]+>/i) + # Use a regular expression to replace all instances of FROM + query = query.gsub(/FROM <[^>]+>/i, "") + else + query = query.gsub("WHERE", "FROM <#{graph}> WHERE") + end + + query = query.gsub(/GRAPH <[^>]+>/i, "") + end + query + end + def ontology_sparql_query(query, graph = '') + query = change_from_clause(query, graph) + sparql_query(query) + end + def is_allowed_query?(sparql_query) + forbidden_operations = [ + 'INSERT DATA', + 'DELETE DATA', + 'DELETE/INSERT', + 'DELETE', + 'INSERT', + 'DELETE WHERE', + 'LOAD', + 'CLEAR', + 'CREATE', + 'DROP', + 'COPY', + 'MOVE', + 'ADD' + ] + + # Define a regular expression to match SELECT queries + select_query_regex = /\A\s*SELECT\b/m + + # Check if the query contains any forbidden operations outside SELECT queries + return false if forbidden_operations.any? { |op| sparql_query.upcase.include?(op) && !sparql_query.match(select_query_regex) } + + true + end + + def sparql_query(query) + return 'No SPARQL endpoint configured' if $SPARQL_URL.blank? + return 'INSERT Queries not permitted' unless is_allowed_query?(query) + endpoint = $SPARQL_URL.gsub('test', 'sparql') + begin + conn = Faraday.new do |conn| + conn.options.timeout = 60 + end + response = conn.get("#{endpoint}?query=#{encode_param(query)}") + response.body.force_encoding('ISO-8859-1').encode('UTF-8') + rescue + "Query timeout" + end + end + def sparql_query_container(graph: nil) + content_tag(:div, '', data: {controller: 'sparql', + 'sparql-proxy-value': '/sparql_proxy/', + 'sparql-graph-value': graph}) + end + +end diff --git a/app/helpers/statistics_helper.rb b/app/helpers/statistics_helper.rb new file mode 100644 index 000000000..ee680c401 --- /dev/null +++ b/app/helpers/statistics_helper.rb @@ -0,0 +1,60 @@ +module StatisticsHelper + + def ontologies_by_year_month + data = LinkedData::Client::Analytics.all.to_h + data.delete(:links) + data.delete(:context) + year_month_count = {} + year_month_visits = {} + acronyms = [] + data.each do |acronym, ont| + ont.each do |year, months| + next if year.eql?(:links) || year.eql?(:context) + months.each do |month, count| + next if month.eql?(:links) || month.eql?(:context) + year_month_count[[year.to_s.to_i, month.to_s.to_i]] ||= [] + year_month_visits[[year.to_s.to_i, month.to_s.to_i]] = count + (year_month_visits[[year.to_s.to_i, month.to_s.to_i]] || 0) + + if !count.zero? && !acronyms.include?(acronym) + year_month_count[[year.to_s.to_i, month.to_s.to_i]] << acronym + acronyms << acronym + end + end + end + end + year_month_visits = year_month_visits.sort_by { |(year, month), _| [year, month] }.to_h + [year_month_count, year_month_visits] + end + + def string_year_month(year, month) + DateTime.parse("#{year}/#{month}").strftime("%b %Y") + end + def group_by_year_month(data) + data.group_by{|x| [Date.parse(x.created).year, Date.parse(x.created).month] }.sort_by { |(year, month), _| [year, month] }.to_h + end + + def merge_time_evolution_data(data) + min_year = data.map{|x| x.keys.first.first}.min + old = data.size.times.map { |x| 0 } + + visits_data = { visits: data.size.times.map { |x| [] }, labels: [] } + + (min_year..Date.today.year).each do |year| + (1..12).each do |month| + data.each_with_index do |x , i| + old[i] += x[[year, month]]&.size || 0 + end + + next if old.sum.zero? + + data.each_index do |i| + visits_data[:visits][i] << old[i] + end + + visits_data[:labels] << string_year_month(year, month) + end + end + visits_data + end + +end diff --git a/app/javascript/controllers/index.js b/app/javascript/controllers/index.js index a722c875e..8416e7ecd 100644 --- a/app/javascript/controllers/index.js +++ b/app/javascript/controllers/index.js @@ -69,6 +69,9 @@ application.register("show-modal", ShowModalController) import SkosCollectionColorsController from "./skos_collection_colors_controller" application.register("skos-collection-colors", SkosCollectionColorsController) +import SparqlController from "./sparql_controller" +application.register("sparql", SparqlController) + import TextTruncateController from "./text_truncate_controller" application.register("text-truncate", TextTruncateController) diff --git a/app/javascript/controllers/load_chart_controller.js b/app/javascript/controllers/load_chart_controller.js index 5ef880c47..c55b5adbb 100644 --- a/app/javascript/controllers/load_chart_controller.js +++ b/app/javascript/controllers/load_chart_controller.js @@ -9,7 +9,8 @@ export default class extends Controller { datasets: Array, type: { type: String, default: 'line' }, title: String, - indexAxis: { type: String, default: 'x' } + indexAxis: { type: String, default: 'x' }, + legend: { type: Boolean, default: false } } connect () { @@ -34,7 +35,7 @@ export default class extends Controller { text: this.titleValue }, legend: { - display: false + display: this.legendValue } }, responsive: true, diff --git a/app/javascript/controllers/sparql_controller.js b/app/javascript/controllers/sparql_controller.js new file mode 100644 index 000000000..31227f4fd --- /dev/null +++ b/app/javascript/controllers/sparql_controller.js @@ -0,0 +1,25 @@ +import { Controller } from '@hotwired/stimulus' +import { getYasgui } from '../mixins/useYasgui' + +// Connects to data-controller="sparql" +export default class extends Controller { + static values = { + proxy: String, + graph: String, + } + connect () { + localStorage.removeItem('yagui__config'); + this.yasgui = getYasgui(this.element, + { + corsProxy: this.proxyValue, + copyEndpointOnNewTab: true, + requestConfig: { + endpoint: this.proxyValue, + acceptHeaderGraph: false, + acceptHeaderUpdate: false, + namedGraphs: [this.graphValue], + } + }) + + } +} diff --git a/app/javascript/mixins/useYasgui.js b/app/javascript/mixins/useYasgui.js new file mode 100644 index 000000000..e13188157 --- /dev/null +++ b/app/javascript/mixins/useYasgui.js @@ -0,0 +1,6 @@ +import Yasgui from "@triply/yasgui"; + +export const getYasgui = (elem, config) => { + return new Yasgui(elem, config) +} + diff --git a/app/views/admin/index.html.haml b/app/views/admin/index.html.haml index 6c1721438..9144b4884 100644 --- a/app/views/admin/index.html.haml +++ b/app/views/admin/index.html.haml @@ -12,12 +12,13 @@ %div %div.mx-1 - - sections = ['Analytics', 'Site Administration','Ontology Administration', 'Licensing', 'Users', 'Metadata Administration', 'Groups', 'Categories', 'Persons & Organizations'] + - sections = ['Analytics', 'Site Administration','Ontology Administration', 'Licensing', 'Users', 'Metadata Administration', 'Groups', 'Categories', 'Persons & Organizations', 'SPARQL'] + - selected = params[:section] || sections.first.downcase = render TabsContainerComponent.new do |t| - sections.each do |section_title| - t.item(title: section_title, path: '', - selected: section_title.eql?(sections.first), + selected: section_title.downcase.eql?(selected), page_name: '') - t.item_content do = render 'analytics' @@ -66,8 +67,6 @@ %div.ontologies_list_container.mt-3 %div.mx-auto.w-75 = render TurboFrameComponent.new(id: 'agents-list', src: '/agents', loading: 'lazy') - - -# Groups tab - %div.tab-pane.fade{id: "groups", role: "tabpanel", aria: { labelledby: "groups-admin-tab" }} - %div.ontologies_list_container.mt-3 - %table#adminGroups.zebra{:cellpadding => "0", :cellspacing => "0", :width => "100%"} + - t.item_content do + %div.container + = sparql_query_container diff --git a/app/views/application/_ga_tracking.html.haml b/app/views/application/_ga_tracking.html.haml index 73308e4cd..405f77c2b 100644 --- a/app/views/application/_ga_tracking.html.haml +++ b/app/views/application/_ga_tracking.html.haml @@ -1,9 +1,10 @@ --# Google Analytics -- unless $ANALYTICS_ID.nil? || $ANALYTICS_ID.empty? +-# Google tag +- tag_id = Rails.application.credentials.dig(:google_analytics, :tag_id) || $ANALYTICS_ID +- if tag_id.present? + %script - window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date; - ga('create', '#{$ANALYTICS_ID}', 'auto'); - ga('send', 'pageview'); - + window.dataLayer = window.dataLayer || []; + function gtag(){dataLayer.push(arguments);} + gtag('js', new Date()); - \ No newline at end of file + gtag('config', '#{tag_id}'); \ No newline at end of file diff --git a/app/views/home/index.html.haml b/app/views/home/index.html.haml index ca377ec9b..6f2ebd8d1 100644 --- a/app/views/home/index.html.haml +++ b/app/views/home/index.html.haml @@ -163,6 +163,9 @@ %h4 = format_number_abbreviated(@users_count) %p Users + .home-statistics-link.justify-content-end + = link_to 'See details','/statistics', target: "_blank" + .home-section .home-statistics-container .home-support-title diff --git a/app/views/layouts/_footer.html.haml b/app/views/layouts/_footer.html.haml index 4c582f1de..9d8908961 100644 --- a/app/views/layouts/_footer.html.haml +++ b/app/views/layouts/_footer.html.haml @@ -28,4 +28,3 @@ = javascript_include_tag "application" -= render partial: "ga_tracking" diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index b58dfe440..fcf060a9e 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -1,6 +1,7 @@ lang="<%=I18n.locale%>"> + <%= render partial: 'ga_tracking' %> diff --git a/app/views/layouts/appliance.html.haml b/app/views/layouts/appliance.html.haml index dff0e0108..817bd3026 100644 --- a/app/views/layouts/appliance.html.haml +++ b/app/views/layouts/appliance.html.haml @@ -1,6 +1,7 @@ !!! Strict %html %head + = render partial: 'ga_tracking' diff --git a/app/views/layouts/minimal.html.erb b/app/views/layouts/minimal.html.erb deleted file mode 100644 index 99fe12457..000000000 --- a/app/views/layouts/minimal.html.erb +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - <%= csrf_meta_tag %> - <%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" %> - <%=render partial: 'layouts/js_data'%> - <%=render partial: 'layouts/head_js'%> - - - -
- - <%if flash[:notice] %> -
-

- <%=flash[:notice] %> -

-
- <%end %> - -
- <% message_name = "" %> - <% unless $SITE_NOTICE.nil? || $SITE_NOTICE.empty? %> - <% $SITE_NOTICE.each_key { |k| message_name = k } %> - <% unless cookies[message_name.to_sym].eql?("true") %> - -
- <%=$SITE_NOTICE[message_name.to_sym]%>  [close] -
- <% end %> - <% end %> - - <%=yield%> -
- - - - diff --git a/app/views/layouts/popup.html.erb b/app/views/layouts/popup.html.erb index 86a2b772e..7262ec44f 100644 --- a/app/views/layouts/popup.html.erb +++ b/app/views/layouts/popup.html.erb @@ -1,6 +1,7 @@ + <%= render partial: "ga_tracking" %> diff --git a/app/views/ontologies/sections/_sparql.html.haml b/app/views/ontologies/sections/_sparql.html.haml new file mode 100644 index 000000000..3d2921c14 --- /dev/null +++ b/app/views/ontologies/sections/_sparql.html.haml @@ -0,0 +1,2 @@ += render TurboFrameComponent.new(id: "sparql", data: {"turbo-frame-target": "frame"} ) do + = sparql_query_container(graph: @submission_latest.id ) \ No newline at end of file diff --git a/app/views/statistics/index.html.haml b/app/views/statistics/index.html.haml new file mode 100644 index 000000000..8f802870d --- /dev/null +++ b/app/views/statistics/index.html.haml @@ -0,0 +1,33 @@ +%div.px-3.py-3.pt-md-5.pb-md-4.text-center + %h1.display-4 + #{portal_name} Statistics + %p.lead (last #{Date.today.year - Date.parse(@merged_data[:labels].first).year} years) + +%div.container + %div + = chart_component(title: nil, type: 'line', show_legend: true, + labels: @merged_data[:labels], + datasets: visits_chart_dataset_array({ 'Ontologies': @merged_data[:visits][2] , 'Users': @merged_data[:visits][0], 'Projects': @merged_data[:visits][1]}, fill: false)) + + %div.pb-3.pb-md-4 + - size = @merged_data[:labels].size - 1 + - visits = @year_month_visits + = render TableComponent.new(id: 'statistics_table') do |t| + - t.header do |h| + - h.th {'Date'} + - h.th {'Ontologies'} + - h.th {'Users'} + - h.th {'Projects'} + - h.th {'Ontology Visits'} + + - @merged_data[:labels].reverse.each_with_index do |year_month, i| + - t.row do |r| + - r.td {year_month} + - r.td {@merged_data[:visits][2][size - i].to_s} + - r.td {@merged_data[:visits][0][size - i].to_s} + - r.td {@merged_data[:visits][1][size - i].to_s} + - r.td do + - year = Date.parse(year_month).year + - month = Date.parse(year_month).month + = visits[[year, month]] || 0 + diff --git a/config/routes.rb b/config/routes.rb index d709e202b..9d9dfd363 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -94,12 +94,15 @@ get '' => 'home#index' + match 'sparql_proxy', to: 'admin#sparql_endpoint', via: [:get, :post] + # Top-level pages match '/feedback', to: 'home#feedback', via: [:get, :post] get '/account' => 'home#account' get '/site_config' => 'home#site_config' post '/annotator_recommender_form' => 'home#annotator_recommender_form' match '/visits', to: 'visits#index', via: :get + get 'statistics/index' # Error pages match "/404", to: "errors#not_found", via: :all diff --git a/package.json b/package.json index 347c429f9..f33c80df4 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "dependencies": { "@hotwired/stimulus": "^3.0.1", "@hotwired/turbo-rails": "^7.1.1", + "@triply/yasgui": "^4.2.28", "chart.js": "^4.4.1", "debounce": "^1.2.1", "esbuild": "^0.14.41", diff --git a/yarn.lock b/yarn.lock index fd47a75e3..8d0d99872 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,11 +9,30 @@ dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.9.2": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.7.tgz#dd7c88deeb218a0f8bd34d5db1aa242e0f203193" + integrity sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA== + dependencies: + regenerator-runtime "^0.14.0" + "@esbuild/linux-loong64@0.14.54": version "0.14.54" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== +"@fortawesome/fontawesome-common-types@^0.2.36": + version "0.2.36" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz#b44e52db3b6b20523e0c57ef8c42d315532cb903" + integrity sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg== + +"@fortawesome/free-solid-svg-icons@^5.14.0": + version "5.15.4" + resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz#2a68f3fc3ddda12e52645654142b9e4e8fbb6cc5" + integrity sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w== + dependencies: + "@fortawesome/fontawesome-common-types" "^0.2.36" + "@hotwired/stimulus@^3.0.0", "@hotwired/stimulus@^3.0.1": version "3.2.1" resolved "https://registry.yarnpkg.com/@hotwired/stimulus/-/stimulus-3.2.1.tgz#e3de23623b0c52c247aba4cd5d530d257008676b" @@ -59,6 +78,134 @@ resolved "https://registry.yarnpkg.com/@rails/actioncable/-/actioncable-7.0.5.tgz#bbc11203e0d3d5084002abfcf01d621fdf5f3a9d" integrity sha512-SOBA2heB9lTw0VYIx8M/ed7inSf4I9sR8OIlJprhgkfQ3WJtrxPJ6DDATR1Z3RYaIR7HlT2Olj08v1lfGIGuHA== +"@tarekraafat/autocomplete.js@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@tarekraafat/autocomplete.js/-/autocomplete.js-7.2.0.tgz#d6ac9fe78db92d864ec096639e577f7e4b323829" + integrity sha512-p1aEcKC/WHpVBuFyRhXq/ie+mgO4QqCNEsdVIPUBgmNqmxV4dVfqYEpk///9vvKyranUUvrlVu4e2tdzAaXKIg== + +"@triply/yasgui-utils@^4.2.28": + version "4.2.28" + resolved "https://registry.yarnpkg.com/@triply/yasgui-utils/-/yasgui-utils-4.2.28.tgz#b3dc4da5192d449b84a2d2e984c17383baed325c" + integrity sha512-1RvlHAmwvx5VjoVROZOCL0kMLUaIkRRPR/hc5PNN2oLSMGXRO1lptEXMbFXx16RePX9d3wvgb7WaWr6dP9hgBg== + dependencies: + "@types/node" "14.0.23" + store "^2.0.12" + +"@triply/yasgui@^4.2.28": + version "4.2.28" + resolved "https://registry.yarnpkg.com/@triply/yasgui/-/yasgui-4.2.28.tgz#540ffcd9ccee9c6b489426e4ef15ff3bc910be23" + integrity sha512-HN1neZqERSGoDyk/Fg40nI+F0tHnaBxjqizhN0mur2Kj0oJsklBsFMRk/M+wW+ohy8dSEn7AgX3H0pPrV/wmVg== + dependencies: + "@tarekraafat/autocomplete.js" "^7.2.0" + "@triply/yasgui-utils" "^4.2.28" + "@triply/yasqe" "^4.2.28" + "@triply/yasr" "^4.2.28" + "@types/lodash-es" "^4.17.3" + autosuggest-highlight "^3.1.1" + blueimp-md5 "^2.12.0" + choices.js "^9.0.1" + es6-object-assign "^1.1.0" + jsuri "^1.3.1" + lodash-es "^4.17.15" + sortablejs "^1.10.2" + superagent "5.3.1" + +"@triply/yasqe@^4.2.28": + version "4.2.28" + resolved "https://registry.yarnpkg.com/@triply/yasqe/-/yasqe-4.2.28.tgz#c34730edea62c48e997309e3c2cbd57bc68c3d8a" + integrity sha512-5yLfgvrf9hRU3DFZvpuAOt4tZchw9u0cxBBPSCgDf5+AIKfgeO4WxaTZix+yu7aQhR8iDf1I1ewvQTXIiCUO6w== + dependencies: + "@triply/yasgui-utils" "^4.2.28" + "@types/lodash-es" "^4.17.3" + codemirror "^5.51.0" + lodash-es "^4.17.15" + query-string "^6.10.1" + superagent "5.3.1" + +"@triply/yasr@^4.2.28": + version "4.2.28" + resolved "https://registry.yarnpkg.com/@triply/yasr/-/yasr-4.2.28.tgz#c4053377ae857a02e2b911d742c49b9d093b0a87" + integrity sha512-7EgOJX1/Xv1l9Sxu1S5Da/F+dG9hqANEfw/EJa6pbttkK+rQMN4Zv3paBD4dbHLwZGvybcupqCX7q7Ut+au8Bw== + dependencies: + "@fortawesome/free-solid-svg-icons" "^5.14.0" + "@triply/yasgui-utils" "^4.2.28" + "@triply/yasqe" "^4.2.28" + "@types/lodash-es" "^4.17.3" + codemirror "^5.51.0" + colors "^1.4.0" + column-resizer "^1.3.4" + datatables.net "^1.10.24" + datatables.net-dt "^1.10.24" + dompurify "^2.0.7" + jquery "^3.5.0" + json2csv "^5.0.1" + lodash-es "^4.17.15" + n3 "^1.3.5" + papaparse "^5.3.1" + +"@types/lodash-es@^4.17.3": + version "4.17.12" + resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.12.tgz#65f6d1e5f80539aa7cfbfc962de5def0cf4f341b" + integrity sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.14.202" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.202.tgz#f09dbd2fb082d507178b2f2a5c7e74bd72ff98f8" + integrity sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ== + +"@types/node@14.0.23": + version "14.0.23" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.23.tgz#676fa0883450ed9da0bb24156213636290892806" + integrity sha512-Z4U8yDAl5TFkmYsZdFPdjeMa57NOvnaf1tljHzhouaPEp7LCj2JKkejpI1ODviIAQuW4CcQmxkQ77rnLsOOoKw== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +autosuggest-highlight@^3.1.1: + version "3.3.4" + resolved "https://registry.yarnpkg.com/autosuggest-highlight/-/autosuggest-highlight-3.3.4.tgz#d71b575ba8eab40b5adba73df9244e9ba88cc387" + integrity sha512-j6RETBD2xYnrVcoV1S5R4t3WxOlWZKyDQjkwnggDPSjF5L4jV98ZltBpvPvbkM1HtoSe5o+bNrTHyjPbieGeYA== + dependencies: + remove-accents "^0.4.2" + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +blueimp-md5@^2.12.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.19.0.tgz#b53feea5498dcb53dc6ec4b823adb84b729c4af0" + integrity sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w== + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +call-bind@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== + dependencies: + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" + chart.js@^4.4.1: version "4.4.1" resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-4.4.1.tgz#ac5dc0e69a7758909158a96fe80ce43b3bb96a9f" @@ -66,6 +213,69 @@ chart.js@^4.4.1: dependencies: "@kurkle/color" "^0.3.0" +choices.js@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/choices.js/-/choices.js-9.1.0.tgz#fdf5c1f9df4f85f015fb82c01841f22d15b56ee0" + integrity sha512-6NnqiE/MNnNAiMzdW7phJ49nMQylkKMQ6La6PAS1+h1VhrGt38MOPnjzEJ3cRaECieqaGpl9eFGtI2icW27r8A== + dependencies: + deepmerge "^4.2.2" + fuse.js "^3.4.6" + redux "^4.1.2" + +codemirror@^5.51.0: + version "5.65.16" + resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.65.16.tgz#efc0661be6bf4988a6a1c2fe6893294638cdb334" + integrity sha512-br21LjYmSlVL0vFCPWPfhzUCT34FM/pAdK7rRIZwa0rrtrIdotvP4Oh4GUHsu2E3IrQMCfRkL/fN3ytMNxVQvg== + +colors@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +column-resizer@^1.3.4: + version "1.4.0" + resolved "https://registry.yarnpkg.com/column-resizer/-/column-resizer-1.4.0.tgz#baebab36acd81102787aec5cd966193159340186" + integrity sha512-KM5Jh/UBKwVUr01oEGN/OvxF6gZIEn4c1Qde4iHSqNru9hxq93ao3u93qb9N1E1TZ2Sxjh4x7OHGe8v/P8FgkA== + dependencies: + string-hash "~1.1.3" + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + +component-emitter@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17" + integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== + +cookiejar@^2.1.2: + version "2.1.4" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" + integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== + +datatables.net-dt@^1.10.24: + version "1.13.8" + resolved "https://registry.yarnpkg.com/datatables.net-dt/-/datatables.net-dt-1.13.8.tgz#6e875d97407cc605f0dadb3452cf477361000176" + integrity sha512-/ZPzr1hQ+domerlg/MbcQHqeeqxK9fsZmpRs1YeKxsdfr+UyHQTUiiOO7RqekppSLc7MPqxGnzKkCX9vAgqm0w== + dependencies: + datatables.net "1.13.8" + jquery ">=1.7" + +datatables.net@1.13.8, datatables.net@^1.10.24: + version "1.13.8" + resolved "https://registry.yarnpkg.com/datatables.net/-/datatables.net-1.13.8.tgz#05a2fb5a036b0b65b66d1bb1eae0ba018aaea8a3" + integrity sha512-2pDamr+GUwPTby2OgriVB9dR9ftFKD2AQyiuCXzZIiG4d9KkKFQ7gqPfNmG7uj9Tc5kDf+rGj86do4LAb/V71g== + dependencies: + jquery ">=1.7" + date-fns@^2.29.3: version "2.30.0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" @@ -78,6 +288,47 @@ debounce@^1.2.1: resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== +debug@^4.1.1: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decode-uri-component@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +dompurify@^2.0.7: + version "2.4.7" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.7.tgz#277adeb40a2c84be2d42a8bcd45f582bfa4d0cfc" + integrity sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ== + +es6-object-assign@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" + integrity sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw== + esbuild-android-64@0.14.54: version "0.14.54" resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" @@ -205,16 +456,297 @@ esbuild@^0.14.41: esbuild-windows-64 "0.14.54" esbuild-windows-arm64 "0.14.54" +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +fast-safe-stringify@^2.0.7: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +filter-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" + integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== + flatpickr@^4.6.13: version "4.6.13" resolved "https://registry.yarnpkg.com/flatpickr/-/flatpickr-4.6.13.tgz#8a029548187fd6e0d670908471e43abe9ad18d94" integrity sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw== +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +formidable@^1.2.2: + version "1.2.6" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.6.tgz#d2a51d60162bbc9b4a055d8457a7c75315d1a168" + integrity sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +fuse.js@^3.4.6: + version "3.6.1" + resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-3.6.1.tgz#7de85fdd6e1b3377c23ce010892656385fd9b10c" + integrity sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== + dependencies: + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +has-property-descriptors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== + dependencies: + get-intrinsic "^1.2.2" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +inherits@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +jquery@>=1.7, jquery@^3.5.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.7.1.tgz#083ef98927c9a6a74d05a6af02806566d16274de" + integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg== + +json2csv@^5.0.1: + version "5.0.7" + resolved "https://registry.yarnpkg.com/json2csv/-/json2csv-5.0.7.tgz#f3a583c25abd9804be873e495d1e65ad8d1b54ae" + integrity sha512-YRZbUnyaJZLZUJSRi2G/MqahCyRv9n/ds+4oIetjDF3jWQA7AG7iSeKTiZiCNqtMZM7HDyt0e/W6lEnoGEmMGA== + dependencies: + commander "^6.1.0" + jsonparse "^1.3.1" + lodash.get "^4.4.2" + +jsonparse@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + +jsuri@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsuri/-/jsuri-1.3.1.tgz#cd93fc6a87b255142cb7b0f479f00517ab9395ed" + integrity sha512-LLdAeqOf88/X0hylAI7oSir6QUsz/8kOW0FcJzzu/SJRfORA/oPHycAOthkNp7eLPlTAbqVDFbqNRHkRVzEA3g== + +lodash-es@^4.17.15: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +methods@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@^2.4.6: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +n3@^1.3.5: + version "1.17.2" + resolved "https://registry.yarnpkg.com/n3/-/n3-1.17.2.tgz#3370b2d07da98a5b2865fa43c2d4e5c563cc65df" + integrity sha512-BxSM52wYFqXrbQQT5WUEzKUn6qpYV+2L4XZLfn3Gblz2kwZ09S+QxC33WNdVEQy2djenFL8SNkrjejEKlvI6+Q== + dependencies: + queue-microtask "^1.1.2" + readable-stream "^4.0.0" + +object-inspect@^1.9.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +papaparse@^5.3.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-5.4.1.tgz#f45c0f871853578bd3a30f92d96fdcfb6ebea127" + integrity sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +qs@^6.9.4: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + dependencies: + side-channel "^1.0.4" + +query-string@^6.10.1: + version "6.14.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" + integrity sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw== + dependencies: + decode-uri-component "^0.2.0" + filter-obj "^1.1.0" + split-on-first "^1.0.0" + strict-uri-encode "^2.0.0" + +queue-microtask@^1.1.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@^4.0.0: + version "4.5.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09" + integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g== + dependencies: + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + string_decoder "^1.3.0" + +redux@^4.1.2: + version "4.2.1" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197" + integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== + dependencies: + "@babel/runtime" "^7.9.2" + regenerator-runtime@^0.14.0: version "0.14.0" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== +remove-accents@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.4.tgz#73704abf7dae3764295d475d2b6afac4ea23e4d9" + integrity sha512-EpFcOa/ISetVHEXqu+VwI96KZBmq+a8LJnGkaeFw45epGlxIZz5dhEEnNZMsQXgORu3qaMoLX4qJCzOik6ytAg== + +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +semver@^7.3.2: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +set-function-length@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" + integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== + dependencies: + define-data-property "^1.1.1" + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +sortablejs@^1.10.2: + version "1.15.1" + resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.15.1.tgz#9a35f52cdff449fb42ea8ecf222f3468d76e0a47" + integrity sha512-P5Cjvb0UG1ZVNiDPj/n4V+DinttXG6K8n7vM/HQf0C25K3YKQTQY6fsr/sEGsJGpQ9exmPxluHxKBc0mLKU1lQ== + +split-on-first@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" + integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== + split.js@^1.6.5: version "1.6.5" resolved "https://registry.yarnpkg.com/split.js/-/split.js-1.6.5.tgz#f7f61da1044c9984cb42947df4de4fadb5a3f300" @@ -249,6 +781,45 @@ stimulus-timeago@^4.1.0: dependencies: date-fns "^2.29.3" +store@^2.0.12: + version "2.0.12" + resolved "https://registry.yarnpkg.com/store/-/store-2.0.12.tgz#8c534e2a0b831f72b75fc5f1119857c44ef5d593" + integrity sha512-eO9xlzDpXLiMr9W1nQ3Nfp9EzZieIQc10zPPMP5jsVV7bLOziSFFBP0XoDXACEIFtdI+rIz0NwWVA/QVJ8zJtw== + +strict-uri-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" + integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== + +string-hash@~1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" + integrity sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A== + +string_decoder@^1.1.1, string_decoder@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +superagent@5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/superagent/-/superagent-5.3.1.tgz#d62f3234d76b8138c1320e90fa83dc1850ccabf1" + integrity sha512-wjJ/MoTid2/RuGCOFtlacyGNxN9QLMgcpYLDQlWFIhhdJ93kNscFonGvrpAHSCVjRVj++DGCglocF7Aej1KHvQ== + dependencies: + component-emitter "^1.3.0" + cookiejar "^2.1.2" + debug "^4.1.1" + fast-safe-stringify "^2.0.7" + form-data "^3.0.0" + formidable "^1.2.2" + methods "^1.1.2" + mime "^2.4.6" + qs "^6.9.4" + readable-stream "^3.6.0" + semver "^7.3.2" + tippy.js@^6.3.7: version "6.3.7" resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-6.3.7.tgz#8ccfb651d642010ed9a32ff29b0e9e19c5b8c61c" @@ -264,6 +835,11 @@ tom-select@^2.2.2: "@orchidjs/sifter" "^1.0.3" "@orchidjs/unicode-variants" "^1.0.4" +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + vis-data@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/vis-data/-/vis-data-7.1.6.tgz#81dcf4d024d23183cacb680ad605e644cdd6ee6c" @@ -278,3 +854,8 @@ vis-util@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/vis-util/-/vis-util-5.0.3.tgz#6a9d67c6ed92f2bfa67e50c20166bb5f59ac07bf" integrity sha512-Wf9STUcFrDzK4/Zr7B6epW2Kvm3ORNWF+WiwEz2dpf5RdWkLUXFSbLcuB88n1W6tCdFwVN+v3V4/Xmn9PeL39g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==