- <%=sel_text%>
+ <%=t('select_ontologies_list')%>
- <%=select form_object, form_attribute, options_for_select(@onts_for_select, selected_ontologies), { }, :multiple => 'true', "data-placeholder".to_sym => "Start typing to select ontologies or leave blank to use all", :style => "width: 432px;" %>
+ <%=select form_object, form_attribute, options_for_select(@onts_for_select, selected_ontologies), { }, :multiple => 'true', "data-placeholder".to_sym => t("select_ontologies"), :style => "width: 432px;" %>
<%=render_advanced_picker(custom_ontologies, selected_ontologies)%>
diff --git a/app/views/shared/_ontology_picker_single.html.erb b/app/views/shared/_ontology_picker_single.html.erb
index 53e2b4f9d..5bcba1323 100644
--- a/app/views/shared/_ontology_picker_single.html.erb
+++ b/app/views/shared/_ontology_picker_single.html.erb
@@ -25,6 +25,6 @@
- <%= select object_name, field_name, @onts_for_select, { :include_blank => true, :selected => selected }, :id => picker_id, :class => "ontology_picker_single form-control", "data-placeholder".to_sym => placeholder, disabled: disabled %>
+ <%= select_input(label: placeholder, name: "#{object_name}[#{field_name}]", values: @onts_for_select, selected: selected) %>
diff --git a/app/views/submissions/_form.html.haml b/app/views/submissions/_form.html.haml
deleted file mode 100644
index c98657349..000000000
--- a/app/views/submissions/_form.html.haml
+++ /dev/null
@@ -1,62 +0,0 @@
-:javascript
- $(document).ready(function() {
- jQuery("#ontology_submission_form").validate();
- });
-
-
- function onMetadataChange(){
- let frame = document.getElementById('metadata_by_ontology')
- let properties = document.getElementById('search_metadata')
- let required = document.getElementById('filter-required-only')
- let selectedProperties = "all"
- if(properties){
- selectedProperties = Array.from(properties.selectedOptions).map(({ value }) => value).join(',')
- }
- frame.src = "?properties=" + selectedProperties + "&required=" + required.checked + "&show_sections=true"
- }
-
-- unless @errors.nil?
- %div.form-group.row
- %div.col-sm-8.offset-sm-2.enable-lists{style: "color:red;"}
- %strong Errors On Form
- %ul
- - for error in @errors
- - if error.is_a? Array
- %ul
- - error[1].each do |key, message|
- %li
- = message
- - else
- %li
- = error
-
-%div#editMetadataDiv
- %div{:style => "width: 50%;margin: 3em auto;"}
- %p{:style => "text-align: center;"}
- To understand the ontologies metadata:
- %a{:href => "https://github.com/agroportal/documentation/wiki/Ontology-metadata", :target => "_blank"} see the Wiki
- %div{:style => "text-align: center;"}
- %span.asterik * fields are required
- %br
- = extractable_metadatum_tooltip({ text: 'Metadata that can be extracted from the ontology' , content: "Extractable metadatum"})
-
- %div.d-flex.align-items-center.justify-content-between{onchange: "onMetadataChange()"}
- - unless @filters_disabled
- %div.w-75.mt-3
- - if @submission.id
- = render MetadataSelectorComponent.new(label: 'Filter properties to show', values: submission_editable_properties , selected: nil, inline: true)
- %div
- = render SwitchInputComponent.new(id:"filter-required-only", name: "required-only", label: "Required only", checked: @required_only)
-
-
-= render partial: 'form_content', locals: {id: 'metadata_by_ontology', acronym: @ontology.acronym, submissionId: @submission.submissionId}
-
-%div.form-group.row
- %div.col-12.text-center
- %label.col-form-label.font-italic.asterik * Fields marked with an asterisk are required.
-
-%div.form-group.row
- %div.col-6
- = submit_tag button_text, class: "btn btn-primary"
- %div.col-6.text-right
- = link_to "Cancel", :back, class: "btn btn-warning"
diff --git a/app/views/submissions/_form_content.html.haml b/app/views/submissions/_form_content.html.haml
index 85896b8dc..1df57ccf8 100644
--- a/app/views/submissions/_form_content.html.haml
+++ b/app/views/submissions/_form_content.html.haml
@@ -1,146 +1,12 @@
-= render TurboFrameComponent.new(id:id) do
- = hidden_field object_name, :ontology, value: acronym
- = hidden_field object_name, :id, value: submissionId
- %div#general-card.mt-4
- = metadata_section('general', 'General', collapsed: false) do
- = attribute_container('format', required: true) do
- = turbo_frame_tag "#{object_name(acronym, submissionId)}Format_from_group_input" do
- = render partial: 'submissions/submission_format_form'
- = attribute_text_field_container('version')
+- unless @errors.nil?
+ = turbo_frame_tag 'test', target: '_top' do
+ = error_message_alert
+ = form_for :submission, url: ontology_submission_path(params["ontology_id"], params["id"]), html: { id: "ontology_submission_form", method: :put, multipart: true, 'data-turbo': true, novalidate: 'true'} do
+ = render_submission_inputs('')
+ %hr#edit-ontology-actions-devider
+ .edit-ontology-actions
+ .save-button
+ = render Buttons::RegularButtonComponent.new(id:'save-button', value: "Save", variant: "primary", size: "slim", type: "submit") do |btn|
+ - btn.icon_left do
+ - inline_svg_tag "check.svg"
- = attribute_form_group_container('status', required: true) do |c|
- - selected_status = c.value ? c.value : "alpha"
- - status_options = %w[alpha beta production retired]
- = select c.name, c.method_name, status_options, {selected: selected_status, required: true}, class: "form-control"
-
- = attribute_form_group_container('location', required: true) do
- = render partial: 'submissions/submission_location_form'
-
- %div#key-properties-card.mt-4
- = metadata_section('key-properties', 'Key properties', collapsed: false) do
- = form_group_attribute("URI")
- = form_group_attribute("deprecated")
- = form_group_attribute("hasOntologySyntax") do
- %p
- Properties taken from
- = link_to "W3C URIs for file format", "https://www.w3.org/ns/formats/", target: "_blank"
-
- = form_group_attribute("hasFormalityLevel") do
- %p
- Properties taken from
- = link_to "DCMI KOS type vocabularies", "http://wiki.dublincore.org/index.php/NKOS_Vocabularies#KOS_Types_Vocabulary", target: "_blank"
-
- = form_group_attribute("isOfType")
- = form_group_attribute("naturalLanguage") do
- %p
- Consider using a
- = link_to "Lexvo URI", "http://www.lexvo.org", target: "_blank"
- with ISO639-3 code
- %br
- e.g.: http://lexvo.org/id/iso639-3/eng
-
- %div#description-card.mt-4
- = metadata_section('description', 'Description', collapsed: !@required_only || !@submission.id.nil?) do
- -# Description
- = attribute_form_group_container('description', required: true) do |c|
- = text_area c.name, c.method_name, rows: 5, value: @submission.description, required: true, class: "form-control"
-
- -# Home page
- = form_group_attribute('homepage') do
- Enter a URL for the main page of your ontology.
-
- -# Documentation page
- = form_group_attribute('documentation') do
- Enter a URL for a page that provides ontology documentation.
-
- -# Publications page
- = form_group_attribute('publication') do
- Enter a URL for a page that lists publications about your ontology.
-
- -# Used ontology engineering tool
- = form_group_attribute("usedOntologyEngineeringTool")
-
- = metadata_section('more-description-details', 'More description details', parent_id: "description-card") do
- - for attr_name in %w[abstract notes keywords alternative identifier]
- = form_group_attribute(attr_name)
-
- - data = sections
-
- - data.each do |d|
- = metadata_section(d[0], d[1], parent_id: "description-card") do
- - for attr in @metadata.select { |m| m['display'] == d[2] }
- = form_group_attribute(attr["attribute"])
-
- %div#ontology-dates-card.mt-4
- = metadata_section('ontology-dates', 'Dates', collapsed: !@required_only || !@submission.id.nil?) do
- = form_group_attribute("released", default: Date.today, required: true)
- = form_group_attribute("modificationDate")
- = metadata_section('more-dates', 'More dates', parent_id: "ontology-dates-card") do
- - for attr in @metadata.select { |m| m['display'] == 'dates' }
- = form_group_attribute(attr["attribute"])
-
- %div#licenses-card.mt-4
- = metadata_section('licenses', 'Licenses') do
- = form_group_attribute("hasLicense") do
- %p
- Consider using a
- = link_to "URI to describe your License", "http://rdflicense.appspot.com", target: "_blank"
- %p
- Consider using
- = link_to "INRIA licentia", "http://licentia.inria.fr/", target: "_blank"
- to choose your license
-
- = metadata_section('more-licensing-info', 'More licensing information', parent_id: "licenses-card") do
- - for attr in @metadata.select { |m| m['display'] == 'license' }
- = form_group_attribute(attr["attribute"])
-
- %div#community.mt-4
- = metadata_section('contacts-panel', 'Contacts', parent_id: "community", collapsed: !@required_only || !@submission.id.nil?) do
- -# Contact(s)
- = attribute_form_group_container('contact' ,required: true) do |c|
- - @submission.contact = [] unless @submission.contact && @submission.contact.size > 0
- = render NestedFormInputsComponent.new do |c|
- - c.template do
- = render partial: "submissions/submission_contact_form", locals: {contact: nil, index: 'NEW_RECORD'}
- - c.empty_state do
- = hidden_field_tag object_name+"[contact][#{@submission.contact.size}][email]"
- = hidden_field_tag object_name+"[contact][#{@submission.contact.size}][name]"
- - @submission.contact.each_with_index do |contact, i|
- - c.row do
- = render partial: "submissions/submission_contact_form", locals: {contact: contact, index: i}
-
- = form_group_attribute("hasContributor")
- = form_group_attribute("hasCreator")
-
- = metadata_section('more-community-info', 'More community information', parent_id: "community") do
- - for attr in @metadata.select { |m| m['display'] == 'community' }
- = form_group_attribute(attr["attribute"])
-
- = metadata_section('more-people-info', 'More people information', parent_id: "community") do
- - for attr in @metadata.select { |m| m['display'] == 'people' }
- = form_group_attribute(attr["attribute"])
-
- %div#ontology-relations-more.mt-4
- = metadata_section('ontology-relations', 'Ontology relations', parent_id: "ontology-relations-more") do
- = form_group_attribute("useImports")
- = form_group_attribute("hasPriorVersion")
- = form_group_attribute("isAlignedTo")
- = form_group_attribute("ontologyRelatedTo")
-
- = metadata_section('more-relations', 'More relations', parent_id: "ontology-relations-more") do
- - for attr in @metadata
- - if attr["display"].eql?("relations")
- = form_group_attribute(attr["attribute"])
-
- %div#ontology-content-metrics.mt-4
- = metadata_section('ontology-content', 'Ontology content', parent_id: "ontology-content-metrics") do
- = form_group_attribute("preferredNamespacePrefix")
- = form_group_attribute("preferredNamespaceUri")
-
- = metadata_section('more-informations', 'More content informations', parent_id: "ontology-content-metrics") do
- - for attr in @metadata.select { |m| m['display'] == 'content' }
- = form_group_attribute(attr["attribute"])
-
- = metadata_section('more-metrics-informations', 'More metrics informations', parent_id: "ontology-content-metrics") do
- - for attr in @metadata.select { |m| m['display'] == 'metrics' }
- = form_group_attribute(attr["attribute"])
\ No newline at end of file
diff --git a/app/views/submissions/_submission_contact_form.html.haml b/app/views/submissions/_submission_contact_form.html.haml
deleted file mode 100644
index 590a9dd6c..000000000
--- a/app/views/submissions/_submission_contact_form.html.haml
+++ /dev/null
@@ -1,7 +0,0 @@
-%div.d-flex
- %div.w-50.mx-1.mt-3
- = render FormGroupComponent.new(name: object_name, method: "contact[#{index.to_s.upcase}][name]", label: 'Name' ) do |c1|
- = text_field c1.name, "contact[#{index.to_s.upcase}][name]", value: contact ? contact["name"] : '' , class: "form-control flex-grow-1 mx-2"
- %div.w-50.mx-1.mt-3
- = render FormGroupComponent.new(name: object_name, method: "contact[#{index.to_s.upcase}][email]", label: 'Email' ) do |c2|
- = text_field c2.name, "contact[#{index.to_s.upcase}][email]", value: contact ? contact["email"] : '', class: "form-control flex-grow-1 mx-2"
diff --git a/app/views/submissions/_submission_format_form.html.haml b/app/views/submissions/_submission_format_form.html.haml
deleted file mode 100644
index fc2a1ba51..000000000
--- a/app/views/submissions/_submission_format_form.html.haml
+++ /dev/null
@@ -1,70 +0,0 @@
-:javascript
-
- function ontologyFormatChange(event){
- let selected = event.target.selectedOptions.item(0)
- let options = document.querySelectorAll('.format_options')
- Array.from(options).forEach( x => $(x).hide())
- switch(selected.value){
- case 'OWL':
- jQuery("#owl_options").show()
- break
- case 'SKOS':
- jQuery("#skos_options").show()
- break
- }
- }
-
-= attribute_form_group_container('hasOntologyLanguage', label: 'Format', required: true) do |c|
- - ont_formats = %w[OBO OWL UMLS SKOS].sort
- - selected = @submission.hasOntologyLanguage ? @submission.hasOntologyLanguage : "OWL"
- = select c.name, c.method_name, options_for_select(ont_formats, selected), {required: true}, {class: "form-control", onchange: 'ontologyFormatChange(event)'}
- - c.help do
- %div#skos_options.format_options{style: "display:#{skos? ? 'block': 'none'}"}
- SKOS vocabularies submitted to BioPortal must contain a minimum of one concept scheme and top concept assertion.
- Please refer to the NCBO wiki for a more #{link_to 'detailed explanation', 'https://www.bioontology.org/wiki/index.php/SKOSSupport', target: "_blank" }
- with examples.
-
-%div#owl_options.form-group.row.format_options
- %div.col-sm-8.offset-sm-4
- %a#collapseOWLOptions{href: "#owl-options-properties", role: "button", data: {toggle: "collapse"}, aria: {expanded: "false", controls: "owl-options"},
- class: "btn btn-outline-secondary btn-sm"} Show advanced OWL options
-
- %div#owl-options-properties.collapse
- %div.form-group.row
- %div.col-sm-8.offset-sm-2
- %label.lead Customize default property settings
- = attribute_text_field_container('prefLabelProperty', label: 'Preferred name', inline: false) do |c|
- - c.help do
- Enter a property ID, or leave blank to use the default setting:
- = link_to 'http://www.w3.org/2004/02/skos/core#prefLabel', 'http://www.w3.org/2004/02/skos/core#prefLabel', target: "_blank"
-
- = attribute_text_field_container('synonymProperty', label: 'Synonym', inline: false) do |c|
- - c.help do
- Enter a property ID, or leave blank to use the default setting:
- = link_to 'http://www.w3.org/2004/02/skos/core#altLabel', 'http://www.w3.org/2004/02/skos/core#altLabel', target: "_blank"
-
-
- = attribute_text_field_container('definitionProperty', label: 'Definition', inline: false) do |c|
- - c.help do
- Enter a property ID, or leave blank to use the default setting:
- = link_to 'http://www.w3.org/2004/02/skos/core#definition', 'http://www.w3.org/2004/02/skos/core#definition', target: "_blank"
-
-
- = attribute_text_field_container('authorProperty', label: 'Author', inline: false) do |c|
- - c.help do
- Enter a property ID, or leave blank to use the default setting:
- = link_to 'http://purl.org/dc/elements/1.1/creator', 'http://purl.org/dc/elements/1.1/creator', target: "_blank"
-
-
- %div.form-group.row
- %div.col-sm-8.offset-sm-2
- %label.lead Identify obsolete classes
- = attribute_text_field_container('obsoleteProperty', label: 'Obsolete property', inline: false) do |c|
- - c.help do
- Optionally enter a property ID that indicates obsolete status for ontology classes
- (the property value must be set to "true"). Note that by default, BioPortal checks for existence of the owl:deprecated property.
-
- = attribute_text_field_container('obsoleteParent', label: 'Obsolete branch root', inline: false) do |c|
- - c.help do
- Optionally enter a class ID for the root of an obsolete branch. All classes in the branch will be marked as
- obsolete, with the exception of the root class.
diff --git a/app/views/submissions/_submission_location_form.html.haml b/app/views/submissions/_submission_location_form.html.haml
deleted file mode 100644
index 07faedf61..000000000
--- a/app/views/submissions/_submission_location_form.html.haml
+++ /dev/null
@@ -1,61 +0,0 @@
-:javascript
- $(document).ready(function() {
-
- // Properly display the information for 'File Location' based on radio button
- if (jQuery("#submission_isRemote_0").is(":checked")) {
- location_toggle("upload");
- }
- if (jQuery("#submission_isRemote_1").is(":checked")) {
- location_toggle("remote");
- }
-
- // Select default 'File Location' radio button
- if (!jQuery("#submission_isRemote_0").is(":checked") && !jQuery("#submission_isRemote_1").is(":checked") && !jQuery("#submission_isRemote_2").is(":checked")) {
- jQuery("#submission_isRemote_0").attr("checked", "checked")
- }
- });
-
- // Show/hide location inputs
- function location_toggle(input_div) {
- jQuery('.hidden_field').hide();
- jQuery('.hidden_field input').attr("disabled", true);
- jQuery('#' + input_div + " input").removeAttr("disabled");
- jQuery('#' + input_div).show();
- }
-
-
-- if !@masterFileOptions
- %div.form-check
- - checked = @ontology.summaryOnly
- = radio_button(object_name, :isRemote, 3, :onclick=>"$('.hidden_field').hide();", checked: checked, aria: {describedBy: "metadataHelpBlock"}, class: "form-check-input")
- %label.form-check-label{for: "submission_isRemote_3"}
- Metadata only
- %small.form-text.text-muted#metadataHelpBlock Allow users to view and search your ontology metadata, but not its classes and properties.
- %div.form-check
- - checked = !(@submission.pullLocation.nil? || @submission.pullLocation.empty?)
- = radio_button(object_name, :isRemote, 1, :onclick=>"location_toggle('remote');", checked: checked, aria: {describedBy: "loadFromURLHelpBlock"}, class: "form-check-input")
- %label.form-check-label{for: "submission_isRemote_1"}
- Load from URL
- %small.form-text.text-muted#loadFromURLHelpBlock New versions loaded on a nightly basis.
- - display = (checked and "" or "display:none;")
- %div.hidden_field#remote{style: display}
- = text_field(object_name, :pullLocation, value: @submission.pullLocation, aria: {describedBy: "enterURLHelpBlock"}, class: "form-control")
- %small.form-text.text-muted#enterURLHelpBlock Enter a URL, including the name of your ontology source file, e.g., http://www.example.com/my_ontology.owl.
- %div.form-check
- - checked = (!@ontology.summaryOnly) && @submission.pullLocation.nil?
- = radio_button(object_name, :isRemote, 0, :onclick=>"location_toggle('upload');", checked: checked, class: "form-check-input")
- %label.form-check-label{for: "submission_isRemote_0"}
- Upload local file
- - display = (checked and "" or "display:none;")
- %div.hidden_field#upload{style: display}
- = file_field(object_name, :filePath, class: "mt-2")
-- else
- -# TODO: Has this section of code actually been tested?
- = radio_button object_name, :isRemote, 0, :onclick=>"location_toggle('upload');", checked: true
- Upload Local File
- %br/
- %span{:style => "font-size:11px;"} (choose a file on your local file system to upload)
- - display = (checked and "" or "display:none;")
- %div#upload{style: display}
- = file_field object_name, :filePath, required: true
- = select(object_name, "masterFileName", @masterFileOptions, { include_blank: "Select primary file from zip contents", required: true}, {style: "border-color: red;"})
diff --git a/app/views/submissions/_submissions.html.haml b/app/views/submissions/_submissions.html.haml
index 6a666118f..3b3286a29 100644
--- a/app/views/submissions/_submissions.html.haml
+++ b/app/views/submissions/_submissions.html.haml
@@ -4,24 +4,29 @@
- more_colspan = 7
- more_colspan = 6 if @ont_restricted
- %div.click_versions_collapse
+ %div.click_versions_collapse.p-1
= render_alerts_container(AdminController)
- %table#ontology_versions.table.table-sm.table-striped
- %thead
- %tr
- - if @ontology.admin?(session[:user])
- %th.align-middle ID
- %th.align-middle Version
- %th
- = generate_attribute_text("released", "Released")
- %th
- = generate_attribute_text("modificationDate", "Modified")
- %th
- = generate_attribute_text("creationDate", "Uploaded")
- - unless @ont_restricted
- %th.align-middle Downloads
- - if @ontology.admin?(session[:user])
- %th.align-middle Actions
+ = render TableComponent.new(id: 'ontology_versions', stripped: false, borderless: true) do |t|
+ - t.header do |header|
+ - if @ontology.admin?(session[:user])
+ - header.th do
+ %div.align-middle
+ ID
+ - header.th do
+ %div.align-middle
+ Version
+ - header.th do
+ = attr_label("modificationDate", "Modified", show_tooltip: false)
+ - header.th do
+ = attr_label("creationDate", "Submitted", show_tooltip: false)
+ - unless @ont_restricted
+ - header.th do
+ %div.align-middle
+ Downloads
+ - if @ontology.admin?(session[:user])
+ - header.th do
+ %div.align-middle
+ Actions
- begin
- submission_ready = @ontology.explore.latest_submission({:include_status => 'ready', display: 'submissionId'})
@@ -30,33 +35,40 @@
- submission_readyId = -1
- @submissions.each_with_index do |sub, index|
- hidden_row_class = index >= 5 ? "hidden_ont hidden_select" : ""
- %tr{class: "#{hidden_row_class}", id: "submission_#{sub.submissionId}"}
+ - t.row(id:"submission_#{sub.submissionId}" , class_css: hidden_row_class) do |r|
+
- if @ontology.admin?(session[:user])
- %td
- = sub.submissionId
- %td
- = raw status_link(sub, sub.submissionId==submission_readyId)
- %td
- = xmldatetime_to_date(sub.released) unless sub.released.nil?
- %td
- = xmldatetime_to_date(sub.modificationDate) unless sub.modificationDate.nil?
- %td
- = xmldatetime_to_date(sub.creationDate) unless sub.creationDate.nil?
+ - r.td { raw sub.submissionId }
+ - r.td do
+ = render SubmissionStatusComponent.new(sub, sub.submissionId==submission_readyId)
+ - r.td { xmldatetime_to_date(sub.modificationDate) unless sub.modificationDate.nil? }
+ - r.td { xmldatetime_to_date(sub.creationDate) unless sub.creationDate.nil? }
+
- unless @ont_restricted
- %td
- = raw download_link(sub, @ontology)
+ - r.td do
+ %div.dropdown
+ %button.btn.btn-outline-primary.rounded-pill.dropdown-toggle{type:"button", 'data-toggle':"dropdown", 'aria-expanded': "false", style:'white-space: nowrap'}
+ Download
+ %span.sr-only Toggle Dropdown
+ .dropdown-menu
+ - links = download_link(sub,@ontology)
+ - links.each do |value|
+ - link,label = value.values
+ %a.dropdown-item{ href: link }= label
+
+ -# = raw download_link(sub, @ontology)
- if @ontology.admin?(session[:user])
- %td
+ - r.td do
%div.d-flex
- %a.btn.btn-sm.btn-link{:href => "/ontologies/#{@ontology.acronym}/submissions/#{sub.submissionId}/edit"}
+ %a.btn.btn-sm.btn-link{:href => "/ontologies/#{@ontology.acronym}/submissions/#{sub.submissionId}/edit", 'data-turbo-frame':"_top"}
%span Edit
- unless index.zero?
- alert_text = "Are you sure you want to delete submission
" + sub.submissionId.to_s + " for ontology
" + @ontology.acronym + "?
This action CAN NOT be undone!!!"
= button_to "Delete", "/admin/ontologies/#{@ontology.acronym}/submissions/#{sub.submissionId}?turbo_stream=true", method: :delete, class:'btn btn-sm btn-link', form: {data: { turbo: true, turbo_confirm: alert_text, turbo_frame: '_top'}}
- if @submissions.length > 5
- %tr
- %td{colspan: more_colspan, class: "show_more_subs"}
+ - t.row(class_css: "show_more_subs") do |r|
+ - r.td(colspan: more_colspan) do
%a#version_toggle{:href => ""} more...
:javascript
diff --git a/app/views/submissions/edit.html.haml b/app/views/submissions/edit.html.haml
index 172a4f761..3bd739f9c 100644
--- a/app/views/submissions/edit.html.haml
+++ b/app/views/submissions/edit.html.haml
@@ -1,6 +1,58 @@
-%div.container.py-4.py-md-5
- %h3.text-center.mb-4
- Edit submission information
- %small.text-muted for #{@submission.ontology.acronym}
- = form_for :submission, url: ontology_submission_path(@ontology.acronym, @submission.submissionId), html: { id: "ontology_submission_form", method: :put, multipart: true } do |f|
- = render partial: "form", locals: {f: f, button_text: "Save submission"}
+- section = params[:section] || 'general'
+.center
+ .edit-ontology-container
+ = turbo_frame_tag(params[:container_id]) do
+ = form_for :submission, url: ontology_submission_path(@ontology.acronym, params["id"]), html: { id: "ontology_submission_form", method: :put, multipart: true, 'data-turbo': true, 'data-turbo-frame': '_top', novalidate: 'true'} do
+ .edit-ontology-title
+ %div Edit ontology
+ %hr
+ .edit-ontology-sub-container
+ - if @selected_attributes.empty?
+ .edit-ontology-left-column{:role => "tablist",onchange:"onMetadataChange()"}
+ .edit-ontology-desc
+ = submission_metadata_selector
+ %div.nav.nav-pills.flex-column#categories-tabs
+ - @categories_order.each_with_index do |key, index|
+ %a.edit-ontology-tab-item.d-block{href: "##{key.parameterize}-tab", "data-toggle" => "pill", class: section.eql?(key.parameterize) ? 'active show' : ''}
+ = key.humanize
+
+ #myTabContent.edit-ontology-right-column.w-100
+ = render TurboFrameComponent.new(id:"metadata_by_ontology") do
+ = metadata_help_link
+ %div.tab-content
+ - if @selected_attributes.empty?
+ - @categories_order.each_with_index do |key, index|
+ - properties = @category_attributes[key]
+ .edit-ontology-tab.tab-pane.fade{id: key.parameterize+'-tab', class: section.eql?(key.parameterize) ? 'active show' : ''}
+ = render TurboFrameComponent.new(id: "ontology-content-#{index}", loading:"lazy", src: "edit_properties?properties=#{properties.join(',')}&container_id=ontology-content-#{index}")
+ - else
+ - link = ontology_submission_edit_properties_path(@ontology.acronym, params[:id], properties: @selected_attributes.join(','), container_id: 'ontology-content-0')
+ = render TurboFrameComponent.new(id: "ontology-content-0", loading:"lazy", src: link)
+
+ %hr#edit-ontology-actions-devider
+ .edit-ontology-actions
+ - unless params[:container_id]
+ .cancel-button.mx-2{onClick: 'window.history.back();'}
+ = form_cancel_button
+ .save-button
+ = form_save_button
+
+
+ :javascript
+ function onMetadataChange(){
+ document.querySelector('.edit-ontology-tab-item.d-block.active.show')?.classList.remove('active', 'show')
+ document.querySelector('.edit-ontology-tab.tab-pane.fade.active.show')?.classList.remove('active', 'show')
+ document.getElementById('categories-tabs')?.classList.add('disabled')
+
+ let frame = document.getElementById('metadata_by_ontology')
+ let properties = document.getElementById('select_search_metadata')
+
+ let selectedProperties = "all"
+ if(properties && properties.selectedOptions.length > 0){
+ selectedProperties = Array.from(properties.selectedOptions).map(({ value }) => value).join(',')
+ frame.src = "./edit_properties?properties=" + selectedProperties
+ } else {
+ Turbo.visit(location.href)
+ }
+
+ }
diff --git a/app/views/submissions/new.html.haml b/app/views/submissions/new.html.haml
deleted file mode 100644
index 21d83e669..000000000
--- a/app/views/submissions/new.html.haml
+++ /dev/null
@@ -1,9 +0,0 @@
-- @title = "Add new ontology submission"
-
-%div.container.py-4.py-md-5
- %h3.text-center.mb-4
- Add new submission
- - if !(@submission.ontology.nil? || (@submission.ontology.is_a? String))
- %small.text-muted for #{@submission.ontology.acronym}
- = form_for :submission, url: {action: "create"}, html: {id: "ontology_submission_form", multipart: true} do |f|
- = render partial: "form", locals: {f: f, button_text: "Add submission"}
diff --git a/app/views/users/_form.html.haml b/app/views/users/_form.html.haml
index e70512e62..3dc7daa20 100644
--- a/app/views/users/_form.html.haml
+++ b/app/views/users/_form.html.haml
@@ -5,50 +5,53 @@
%img.lost-password-arrowback{:src => "#{asset_path("arrow-back.svg")}"}
.register-title-container
%h2.register-title
- Create new account
+ = t('register.create_account')
%hr#register-title-line/
%div
.register-double-input
.register-first-input
%p.register-input-title
- First name
+ = t('register.first_name')
%font{:color => "red"} *
- = text_field :user, :firstName, value: @user.firstname, class: "register-input-short"
+ = text_field :user, :firstName, value: @user.firstName, class: "register-input-short"
%div
%p.register-input-title
- Last name
+ = t('register.last_name')
%font{:color => "red"} *
- = text_field :user, :lastName, value: @user.lastname, class: "register-input-short"
+ = text_field :user, :lastName, value: @user.lastName, class: "register-input-short"
%p.register-input-title
- Username
+ = t('register.username')
%font{:color => "red"} *
= text_field :user, :username, value: @user.username, class: "register-input-long"
%p.register-input-title
ORCID ID
- %font.register-optional (optional)
+ %font.register-optional
+ = t('register.optional')
%img.register-input-icon{:src => "#{asset_path("orcid.svg")}"}/
= text_field :user, :orcidId, value: @user.orcidId, class: "register-input-long register-input-with-icon"
%p.register-input-title
Github ID
- %font.register-optional (optional)
+ %font.register-optional
+ = t('register.optional')
%img.register-input-icon{:src => "#{asset_path("github-icon.svg")}"}/
= text_field :user, :githubId, value: @user.githubId, class: "register-input-long register-input-with-icon"
%p.register-input-title
- Email
+ = t('register.email')
%font{:color => "red"} *
= text_field :user, :email, value: @user.email, class: "register-input-long"
%p.register-input-title
- Password
+ = t('register.password')
%font{:color => "red"} *
= password_field :user, :password, class: "register-input-long"
%p.register-input-title
- Confirm password
+ = t('register.confirm_password')
%font{:color => "red"} *
= password_field :user, :password_confirmation, class: "register-input-long"
- if using_captcha?
= recaptcha_tags
.d-flex
%input#user_register_mail_list{:checked => "checked", :name => "user[register_mail_list]", :type => "checkbox", :value => "1"}/
- %p#register-check-text Register for the AgroPortal's mailing list
+ %p#register-check-text
+ = t('register.mailing_list')
.register-button-container
- = render Buttons::PrimaryButtonComponent.new(type: "submit", value: "Register")
+ = render Buttons::RegularButtonComponent.new(id: 'register-button', value: "Register", type:'submit')
diff --git a/app/views/users/edit.html.haml b/app/views/users/edit.html.haml
index da8327ff0..b4307dc1a 100644
--- a/app/views/users/edit.html.haml
+++ b/app/views/users/edit.html.haml
@@ -125,7 +125,7 @@
%font{:color => "red"} *
= password_field :user, :password_confirmation, class: "register-input-long"
%br
- %input.register-button{:type => "submit", :value => "Save", :name => "Update"}/
+ = render Buttons::RegularButtonComponent.new(id: 'update-button', value: "Save", type:'submit')
- unless params[:password].eql?("true")
.change-password
%a{:href => edit_user_path(@user.username, password: true)}
diff --git a/app/views/users/new.html.haml b/app/views/users/new.html.haml
index 95b41374e..e6d6bc8bc 100644
--- a/app/views/users/new.html.haml
+++ b/app/views/users/new.html.haml
@@ -1,9 +1,9 @@
-- @title = "Register"
+- @title = t('register.title')
= form_for(:user, :url => users_path) do |f|
- unless @errors.nil?
.enable-lists{:style => "color: red; padding: 1em;"}
- Errors creating your account:
+ = t('register.account_errors')
%ul
- for error in @errors
- %li= error
+ %li= error.is_a?(Array) ? error.last : error
= render :partial => 'form', :locals => {:f => f}
diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml
index bf3657498..f47328998 100644
--- a/app/views/users/show.html.haml
+++ b/app/views/users/show.html.haml
@@ -6,7 +6,7 @@
.account-page-first-row
.account-page-card
.account-page-personal-informations-title-bar
- %h4.account-page-card-title Personal information
+ %h4.account-page-card-title Personal Information
%a.account-page-rounded-button{:href => edit_user_path(url_encode(@user.username))}
= render partial: "shared/svgs/edit_icon"
.account-page-info-column
@@ -18,7 +18,7 @@
%p.info
= @user.lastName
.account-page-info-column
- %p.title Email address:
+ %p.title Email:
%p.info
= @user.email
.account-page-info-column
@@ -30,14 +30,14 @@
%p.info
=@user.orcidId
.account-page-info-column
- %p.title Github ID:
+ %p.title GitHub ID:
%p.info
=@user.githubId
.account-page-card
.account-page-card-container
.account-page-card-sub-container
- %h4.account-page-card-title Mailing list subscription
- %p.account-page-card-desc AgroPortal announcements email list
+ %h4.account-page-card-title Mailing List Subscription
+ %p.account-page-card-desc="Register to the #{portal_name} announcements mailing list."
- subscribed = false
- if subscribed
%a.account-page-subscribe-button{:href =>"mailto:#{$ANNOUNCE_SERVICE_HOST}?Subject=unsubscribe%20#{$ANNOUNCE_LIST}"}
@@ -49,30 +49,31 @@
.account-page-card-container
.account-page-card-sub-container
%h4.account-page-card-title API Key
- %p.account-page-card-desc Your API Key can be used to access the NCBO API (REST) Services
+ %p.account-page-card-desc
+ = "Your API Key can be used to access #{portal_name} Web services"
%p.apikey
= session[:user].apikey
%a{:href => "javascript:navigator.clipboard.writeText('"+session[:user].apikey+"');"}
= render partial: "shared/svgs/copy_icon"
.account-page-api-documentation-link
- %a{href: "https://data.bioportal.lirmm.fr/documentation", target: "_blank"}
+ %a{href: "#{$REST_URL}/documentation", target: "_blank"}
API documentation
= render partial: "shared/svgs/external_link_icon"
.account-page-card
%h4.account-page-card-title
- Custom Ontology Set
+ Custom Semantic Resource Set
#custom_ontologies.enable-lists
- if at_slice?
%p{style: "padding-left: 7px; font-size: 10pt; margin: -3px 0 7px;"}
Please
%a{href: "#{$UI_URL}/account"} visit the main site
- to modify your Custom Ontology Set.
+ to modify your Custom Semantic Resource Set.
- else
%p.account-page-card-desc
- Customize your AgroPortal display: Pick the ontologies that you want to see on AgroPortal will hide all other ontologies.
+ Customize your #{portal_name} display: Pick the semantic resources that you want to see on #{portal_name} will hide all other semantic resources.
%p
%span{style: "font-weight: normal; font-size: 9pt; padding-left: 7px;"}
- %a#edit_custom_ontologies{href: "javascript:void(0);"} select ontologies
+ %a#edit_custom_ontologies{href: "javascript:void(0);"} Select semantic resources
- if @user_ontologies && !@user_ontologies.empty?
%ul
- @user_ontologies.each do |ont|
@@ -80,18 +81,20 @@
%li
#{ont.name} (#{ont.acronym})
- else
- %p{style: "padding-left: 7px;"} You haven't picked any ontologies yet
- %p.account-page-card-desc Note: This feature works only when you are logged in.
+ %p{style: "padding-left: 7px;"} You haven't picked any semantic resources yet
+ %p.account-page-card-desc Note: this feature works only when you are logged in.
#custom_ontologies_picker{style: "left: -9999px; position: absolute;"}
= form_tag custom_ontologies_path(url_encode(@user.username)) do
- selected = @user.customOntology.map {|o| LinkedData::Client::Models::Ontology.get(o).acronym}
- - locals = { custom_ontologies: @all_ontologies, selected_ontologies: selected, sel_text: "Select Custom Ontologies" }
+ - locals = { custom_ontologies: @all_ontologies, selected_ontologies: selected, sel_text: "Select Custom Semantic Resources" }
= render partial: "shared/ontology_picker", locals: locals
- = submit_tag "Save Custom Ontologies", class: "link_button"
+ = submit_tag "Save Custom Semantic Resources", class: "link_button"
.account-page-second-row
- - unless @user.subscription.nil? || @user.subscription.empty?
- .account-page-card
- %h4.account-page-card-title Subscriptions
+ .account-page-card
+ %h4.account-page-card-title Subscriptions
+ - if @user.subscription.nil? || @user.subscription.empty?
+ Not subscribed to any semantic resource
+ - else
- @user.subscription.each do |subscription|
- ont_id = subscription[:ontology]
- ont = (!subscription[:ontology].nil? ? subscription[:ontology].split('/').last: nil) # ensure we get the acronym
@@ -104,29 +107,33 @@
- else
= type
= subscribe_button(ont_id)
- - no_ontologies = true
- - unless @admin_ontologies.nil? || @admin_ontologies.empty?
- - no_ontologies = false
- .account-page-card
- %h4.account-page-card-title Submitted ontologies
- .account-page-small-cards-container
+ .account-page-card
+ %h4.account-page-card-title Submitted Semantic Resources
+ .account-page-small-cards-container
+ - if @admin_ontologies.nil? || @admin_ontologies.empty?
+ .account-page-no-ontology.w-100
+ %img{:src => "#{asset_path("empty-box.svg")}"}/
+ %p You didn't upload any semantic resource yet
+ %a.account-page-upload-ontology-button{href: "/ontologies/new"} Upload semantic resource
+ - else
- @admin_ontologies.each do |ont|
.account-page-submitted-ontology{data: {controller: 'tooltip'}, title: ont.name}
%a{href: "/ontologies/#{ont.acronym}"}= ont.acronym
- - unless @user_projects.nil? || @user_projects.empty?
- - no_ontologies = false
- .account-page-card
- %h4.account-page-card-title Projects Created
- .account-page-small-cards-container
+ - unless ont.views.nil? || ont.views.empty?
+ - ont.views.each do |view|
+ .account-page-submitted-ontology{data: {controller: 'tooltip'}, title: ont.name}
+ %a{href: "/ontologies/#{view.match(/\/([^\/]+)$/)[1]}"}= view.match(/\/([^\/]+)$/)[1]
+
+ .account-page-card
+ %h4.account-page-card-title Projects Created
+ .account-page-small-cards-container
+ - if @user_projects.nil? || @user_projects.empty?
+ No project created
+ - else
- @user_projects.each do |project|
.account-page-submitted-ontology
%a{href: "/projects/#{project.acronym}"}= project.name
- - if no_ontologies
- .account-page-card
- .account-page-no-ontology
- %img{:src => "#{asset_path("empty-box.svg")}"}/
- %p You didn't upload any ontology yet
- %a.account-page-upload-ontology-button{href: "/ontologies/new"} Upload ontology
+
:javascript
jQuery(document).ready(function(){
jQuery("#edit_custom_ontologies").click(editCustomOntologies);
diff --git a/bin/dev b/bin/dev
index a1104a50b..a4e05fa14 100755
--- a/bin/dev
+++ b/bin/dev
@@ -1,9 +1,11 @@
-#!/usr/bin/env bash
+#!/usr/bin/env sh
-if ! command -v foreman &> /dev/null
-then
+if ! gem list foreman -i --silent; then
echo "Installing foreman..."
gem install foreman
fi
-foreman start -f Procfile.dev "$@"
+# Default to port 3000 if not specified
+export PORT="${PORT:-3000}"
+
+exec foreman start -f Procfile.dev "$@"
diff --git a/bin/ontoportal b/bin/ontoportal
new file mode 100755
index 000000000..792974b88
--- /dev/null
+++ b/bin/ontoportal
@@ -0,0 +1,189 @@
+#!/usr/bin/env bash
+
+# Function to display script usage information
+show_help() {
+ echo "Usage: $0 {dev|test|run|help} [--reset-cache] [--api-url API_URL] [--api-key API_KEY]"
+ echo " dev : Start the Ontoportal Web UI development server."
+ echo " Example: $0 dev --api-url http://localhost:9393 --api-key my_api_key"
+ echo " Use --reset-cache to remove volumes: $0 dev --reset-cache"
+ echo " test : Run tests. Specify either a test file:line_number or empty for 'all'."
+ echo " Example: $0 test test/integration/login_flows_test.rb:22 "
+ echo " run : Run a command in the Ontoportal Web UI Docker container."
+ echo " help : Show this help message."
+ echo
+ echo "Description:"
+ echo " This script provides convenient commands for managing an Ontoportal Web UI"
+ echo " application using Docker Compose. It includes options for starting the development server,"
+ echo " running tests, and executing commands within the Ontoportal Web UI Docker container."
+ echo
+ echo "Goals:"
+ echo " - Simplify common tasks related to Ontoportal Web UI development using Docker."
+ echo " - Provide a consistent and easy-to-use interface for common actions."
+}
+# Function to update or create the .env file with API_URL and API_KEY
+update_env_file() {
+ local api_url="$1"
+ local api_key="$2"
+
+ # Update the .env file with the provided values
+ file_content=$(<.env)
+
+ # Make changes to the variable
+ while IFS= read -r line; do
+ if [[ "$line" == "API_URL="* ]]; then
+ echo "API_URL=$api_url"
+ elif [[ "$line" == "API_KEY="* ]]; then
+ echo "API_KEY=$api_key"
+ else
+ echo "$line"
+ fi
+ done <<< "$file_content" > .env
+}
+
+# Function to create configuration files if they don't exist
+create_config_files() {
+ if [ ! -f ".env" ]; then
+ echo "Creating .env file from env.sample"
+ cp .env.sample .env
+ fi
+
+ if [ ! -f "config/bioportal_config_development.rb" ]; then
+ echo "Creating config/bioportal_config_development.rb file from config/bioportal_config_env.rb.sample"
+ cp config/bioportal_config_env.rb.sample config/bioportal_config_development.rb
+ fi
+
+ if [ ! -f "config/database.yml" ]; then
+ echo "Creating config/database.yml file from config/database.yml.sample"
+ cp config/database.yml.sample config/database.yml
+ fi
+}
+
+# Function to handle the "dev" option
+dev() {
+ echo "Starting Ontoportal Web UI development server..."
+
+
+ local reset_cache=false
+ local api_url=""
+ local api_key=""
+
+ # Check for command line arguments
+ while [[ "$#" -gt 0 ]]; do
+ case $1 in
+ --reset-cache)
+ reset_cache=true
+ shift
+ ;;
+ --api-url)
+ api_url="$2"
+ shift 2
+ ;;
+ --api-key)
+ api_key="$2"
+ shift 2
+ ;;
+ *)
+ echo "Unknown option: $1"
+ show_help
+ exit 1
+ ;;
+ esac
+ done
+
+
+
+ # Check if arguments are provided
+ if [ -n "$api_url" ] && [ -n "$api_key" ]; then
+ # If arguments are provided, update the .env file
+ update_env_file "$api_url" "$api_key"
+ else
+ # If no arguments, fetch values from the .env file
+ source .env
+ api_url="$API_URL"
+ api_key="$API_KEY"
+ fi
+
+ if [ -z "$api_url" ] || [ -z "$api_key" ]; then
+ echo "Error: Missing required arguments. Please provide both --api-url and --api-key or update them in your .env"
+ exit 1
+ fi
+
+ # Check if --reset-cache is present and execute docker compose down --volumes
+ if [ "$reset_cache" = true ]; then
+ echo "Resetting cache. Running: docker compose down --volumes"
+ docker compose down --volumes
+ fi
+
+ echo "Run: bundle exec rails s -b 0.0.0.0 -p 3000"
+ docker compose run --rm -it --service-ports rails bash -c "(bundle check || bundle install) && bin/rails db:prepare && bundle exec rails s -b 0.0.0.0 -p 3000"
+}
+
+# Function to handle the "test" option
+test() {
+
+
+ local api_url=""
+ local api_key=""
+ local test_options=""
+
+ # Check for command line arguments
+ while [ "$#" -gt 0 ]; do
+ case "$1" in
+ --api-url)
+ shift
+ api_url="$1"
+ ;;
+ *)
+
+ if [ -z "$test_options" ]; then
+ test_options="$1"
+ else
+
+ test_options="$test_options $1"
+ fi
+ ;;
+ esac
+ shift
+ done
+
+ if [ -z "$api_url" ]; then
+ api_url=http://localhost:9393
+ echo "Running API..."
+ bin/run_api
+ fi
+
+ echo "Running tests..."
+ echo "Run: API_URL=$api_url bundle exec rails test -v $test_options"
+
+ docker compose run --rm -it test bash -c "(bundle check || bundle install) && RAILS_ENV=test bin/rails db:prepare && API_URL=$api_url bundle exec rails test -v $test_options"
+
+ # echo "Stopping API..."
+ # bin/stop_api
+}
+
+# Function to handle the "run" option
+run() {
+ echo "Run: $*"
+ docker compose run --rm -it rails bash -c "$*"
+}
+
+create_config_files
+# Main script logic
+case "$1" in
+ "run")
+ run "${@:2}"
+ ;;
+ "dev")
+ dev "${@:2}"
+ ;;
+ "test")
+ test "${@:2}"
+ ;;
+ "help")
+ show_help
+ ;;
+ *)
+ show_help
+ exit 1
+ ;;
+esac
diff --git a/bin/run_api b/bin/run_api
new file mode 100755
index 000000000..c44c794ba
--- /dev/null
+++ b/bin/run_api
@@ -0,0 +1,69 @@
+#!/bin/bash
+display_help() {
+ echo "Usage: $0 [options]"
+ echo "Options:"
+ echo " -f Remove tmp/ontoportal_docker"
+ echo " -k API_KEY API key"
+ echo " -r REPOSITORY Image repository"
+ echo " -t TAG Image tag"
+ echo " -s ONTOLOGY Starter ontology"
+ echo " -u URL Remote API URL"
+ echo " -h Display this help message"
+ exit 0
+}
+
+
+env_file_path="$(realpath "$(dirname "$0")")/../.env"
+
+# Read and parse the .env file
+if [ -f "$env_file_path" ]; then
+ while IFS='=' read -r key value; do
+ [[ "$key" =~ ^\s*# ]] && continue # Skip commented lines
+ [[ "$value" ]] || continue # Skip lines without values
+ export "$key"="$value"
+ done < "$env_file_path"
+fi
+
+
+while getopts ":k:r:t:s:u:fh" opt; do
+ case $opt in
+ k) api_key="$OPTARG" ;;
+ r) image_repository="$OPTARG" ;;
+ t) image_tag="$OPTARG" ;;
+ s) starter_ontology="$OPTARG" ;;
+ u) remote_api_url="$OPTARG" ;;
+ f) rm -fr tmp/ontoportal_docker ;;
+ h) display_help ;;
+ \?) echo "Invalid option: -$OPTARG" >&2; exit 1 ;;
+ :) echo "Option -$OPTARG requires an argument." >&2; exit 1 ;;
+ esac
+done
+
+
+
+if [ ! -d "tmp/ontoportal_docker" ]; then
+ git clone --depth=1 https://github.com/syphax-bouazzouni/ontoportal_docker.git tmp/ontoportal_docker
+fi
+
+# If an option is not provided, check and use the corresponding value from the environment variables
+api_key="${api_key:-$OP_API_KEY}"
+image_repository="${image_repository:-$API_IMAGE_REPOSITORY}"
+image_tag="${image_tag:-$API_IMAGE_TAG}"
+starter_ontology="${starter_ontology:-$STARTER_ONTOLOGY}"
+remote_api_url="${remote_api_url:-$OP_API_URL}"
+
+if curl -sSf http://localhost:9393 > /dev/null 2>&1; then
+ echo "API is already running in http://localhost:9393"
+ exit 0
+fi
+
+# Check if the Docker Compose service exists
+docker compose ls -a --filter "name=ontoportal_docker" | grep -q "ontoportal_docker" && no_provision=true || no_provision=false
+(
+ cd tmp/ontoportal_docker || exit 1
+ command="./run -k $api_key -r $image_repository -t $image_tag -s $starter_ontology -u $remote_api_url"
+ [ "$no_provision" = true ] && command="$command --no-provision"
+ echo "Run: $command"
+ eval "$command"
+)
+
diff --git a/bin/stop_api b/bin/stop_api
new file mode 100755
index 000000000..31308b172
--- /dev/null
+++ b/bin/stop_api
@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+
+# Check if the directory exists
+if [ -d "tmp/ontoportal_docker" ]; then
+ # Check if the container is running
+ if docker ps --filter "name=ontoportal_docker-api" --format "{{.Names}}" | grep -q "ontoportal_docker-api"; then
+ container_names=$(docker ps --filter "name=ontoportal_docker-api" --format "{{.Names}}")
+ docker stop "$container_names"
+ fi
+
+ cd "tmp/ontoportal_docker" && docker compose down --volumes
+fi
+
diff --git a/config/application.rb b/config/application.rb
index ea51961b9..1213596fa 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -11,6 +11,11 @@ class Application < Rails::Application
# Initialize configuration defaults for originally generated Rails version.
config.load_defaults 7.0
+ # permitted locales available for the application
+ config.i18n.available_locales = [:en, :fr, :it, :de]
+ config.i18n.default_locale = :en
+
+
# Configuration for the application, engines, and railties goes here.
#
# These settings can be overridden in specific environments using the files
diff --git a/config/bioportal_config_env.rb.sample b/config/bioportal_config_env.rb.sample
index 4c83979d0..4cc57816b 100644
--- a/config/bioportal_config_env.rb.sample
+++ b/config/bioportal_config_env.rb.sample
@@ -1,138 +1,110 @@
-# coding: utf-8
-
-#local IP address lookup. This doesn't make connection to external hosts
-require 'socket'
-def local_ip
- orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true # turn off reverse DNS resolution temporarily
-
- UDPSocket.open do |s|
- s.connect '8.8.8.8', 1 #google
- s.addr.last
- end
-ensure
- Socket.do_not_reverse_lookup = orig
-end
-
-$LOCAL_IP = local_ip
-
# Organization info
-$ORG = "NCBO"
-$ORG_URL = "http://www.bioontology.org"
-
+$ORG = ENV['ORG']
+$ORG_URL = ENV['ORG_URL']
# Site name (required)
-$SITE = "BioPortal"
-$SITE_URL = "localhost"
-
+$SITE = ENV['SITE']
# Full string for site, EX: "NCBO BioPortal", do not modify
-$ORG_SITE = ($ORG.nil? || $ORG.empty?) ? $SITE : "#{$ORG} #{$SITE}"
-
+$ORG_SITE = $ORG.nil? || $ORG.empty? ? $SITE : "#{$ORG} #{$SITE}"
# The URL for the BioPortal Rails UI (this application)
-$UI_URL = "http://localhost:3000"
-
-
+$UI_URL = ENV['UI_URL']
# If you are running a PURL server to provide URLs for ontologies in your BioPortal instance, enable this option
$PURL_ENABLED = false
-
# The PURL URL is generated using this prefix + the abbreviation for an ontology.
# The PURL URL generation algorithm can be altered in app/models/ontology_wrapper.rb
-$PURL_PREFIX = "http://purl.bioontology.org/ontology"
-
+$PURL_PREFIX = 'http://purl.bioontology.org/ontology'
# If your BioPortal installation includes Annotator set this to false
$ANNOTATOR_DISABLED = false
-
# Unique string representing the UI's id for use with the BioPortal Core
-$API_KEY = ""
-
+$API_KEY = ENV['API_KEY']
# BioPortal API service address
-$REST_URL = "http://example.org:8080/"
-
+$REST_URL = ENV['API_URL']
# Annotator REST service address
-#$ANNOTATOR_URL = "http://services.stageportal.lirmm.fr/annotator"
-$ANNOTATOR_URL = "#{$REST_URL}/annotator"
-
+# $ANNOTATOR_URL = "http://services.stageportal.lirmm.fr/annotator"
+$ANNOTATOR_URL = $PROXY_URL = ENV['ANNOTATOR_URL']
+# NCBO annotator URL and apikey
+$NCBO_ANNOTATORPLUS_ENABLED = ENV['NCBO_ANNOTATORPLUS_ENABLED']
+$NCBO_ANNOTATOR_URL = ENV['NCBO_ANNOTATOR_URL']
+$NCBO_API_KEY = ENV['NCBO_API_KEY']
+# Fairness Assessment.
+$FAIRNESS_DISABLED = ENV['FAIRNESS_DISABLED']
+$FAIRNESS_URL = ENV['FAIRNESS_URL']
# Announcements sympa mailing list REQUEST address, EX: list-request@lists.example.org
-$ANNOUNCE_LIST_SERVICE ||= "SERVICE_EXAMPLE"
-$ANNOUNCE_SERVICE_HOST ||= "service@test.com"
-$ANNOUNCE_LIST||= "users-list@test"
-
+$ANNOUNCE_LIST_SERVICE ||= 'SERVICE_EXAMPLE'
+$ANNOUNCE_SERVICE_HOST ||= 'service@test.com'
+$ANNOUNCE_LIST ||= 'users-list@test'
# Used to define other bioportal that can be mapped to
# Example to map to ncbo bioportal : {"ncbo" => {"api" => "http://data.bioontology.org", "ui" => "http://bioportal.bioontology.org", "apikey" => ""}
# Then create the mapping using the following class in JSON : "http://purl.bioontology.org/ontology/MESH/C585345": "ncbo:MESH"
# Where "ncbo" is the namespace used as key in the interportal_hash
$INTERPORTAL_HASH = {}
-
+$NOT_DOWNLOADABLE = {}
+# OAuth2 authentication
+$OMNIAUTH_PROVIDERS = {
+ github: {
+ client_id: 'CLIENT_ID',
+ client_secret: 'CLIENT_SECRET',
+ icon: 'github.svg',
+ enable: true
+ },
+ google: {
+ strategy: :google_oauth2,
+ client_id: 'CLIENT_ID',
+ client_secret: 'CLIENT_SECRET',
+ icon: 'google.svg',
+ enable: true
+ },
+ orcid: {
+ client_id: 'CLIENT_SECRET',
+ client_secret: 'CLIENT_SECRET',
+ icon: 'orcid.svg',
+ enable: false
+ },
+ keycloak: {
+ strategy: :keycloak_openid,
+ client_id: 'YOUR_KEYCLOAK_CLIENT_ID',
+ client_secret: 'YOUR_KEYCLOAK_CLIENT_SECRET',
+ client_options: { site: 'KEYCLOAK_SITE', realm: 'KEYCLOAK_REALM' },
+ name: 'keycloak',
+ icon: 'keycloak.svg',
+ enable: false
+ }
+}.freeze
# Don't load and don't display recent mappings if false, in case of too many mappings (take longer to load homepage)
$DISPLAY_RECENT = false
-
# If true then the UI will get available recognize at API_URL/annotators/recognizers
$MULTIPLE_RECOGNIZERS = false
-
# Remove download for these ontologies. Default:
# ["CPT","ICD10","ICNP","ICPC2P","MDDB","MEDDRA","MSHFRE","MSHSPA_1","NDDF","NDFRT","NIC","RCD","SCTSPA","SNOMEDCT","WHO-ART"]
-$RESTRICTED_DOWNLOADS = ["MDRFRE", "WHO-ARTFRE", "MSHFRE", "CIM-10"]
-
+$RESTRICTED_DOWNLOADS = []
# Ontolobridge endpoint url
-$ONTOLOBRIDGE_BASE_URL = "https://ontolobridge.ccs.miami.edu/api-test/requests"
-
+$ONTOLOBRIDGE_BASE_URL = 'https://ontolobridge.ccs.miami.edu/api-test/requests'
# Ontolobridge authentication token
-$ONTOLOBRIDGE_AUTHENTICATION_TOKEN = "Token Uq2pae73ktMtmgjUgtnhEOuHxr9sZeuK"
-
+$ONTOLOBRIDGE_AUTHENTICATION_TOKEN = 'Token Uq2pae73ktMtmgjUgtnhEOuHxr9sZeuK'
# Ontologies for which to enable the new term request (Ontolobridge) tab
$NEW_TERM_REQUEST_ONTOLOGIES = []
-
# Legacy REST core service address (BioPortal v3.x and lower)
-$LEGACY_REST_URL = "http://example.org:8080/bioportal"
-
-# Max number of children to return when rendering a tree view
-$MAX_CHILDREN = 2500
-
-# Max number of children that it's possible to display (more than this is either too slow or not helpful to users)
-$MAX_POSSIBLE_DISPLAY = 10000
-
+$LEGACY_REST_URL = 'http://example.org:8080/bioportal'
# Release version text (appears in footer of all pages, except 404 and 500 errors)
-$RELEASE_VERSION = "4.24 (February 2016)"
-
+$RELEASE_VERSION = ENV['RELEASE_VERSION']
# Enable Slices, filtering of ontologies based on subdomain and ontology groups
$ENABLE_SLICES = false
-
# Google Analytics ID (optional)
-$ANALYTICS_ID = ""
-
-# A user id for user 'anonymous' for use when a user is required for an action on the REST service but you don't want to require a user to login
-$ANONYMOUS_USER = 0
-
-# Redis server to use for NCBO::Resolver
-$REDIS_HOST = ""
-$REDIS_PORT = 6379
-
-# Cube metrics reporting
-$ENABLE_CUBE = false
-$CUBE_HOST = "localhost"
-$CUBE_PORT = 1180
-
+$ANALYTICS_ID = ENV['ANALYTICS_ID']
# Enable client request caching
-$CLIENT_REQUEST_CACHING = false
-
-# If you don't use Airbrake you can have exceptions emailed to the $ERROR_EMAIL address by setting this to 'true'
-$EMAIL_EXCEPTIONS = false
-
+$CLIENT_REQUEST_CACHING = true
# Email settings
ActionMailer::Base.smtp_settings = {
- :address => "", # smtp server address, ex: smtp.example.org
- :port => 25, # smtp server port
- :domain => "", # fqdn of rails server, ex: rails.example.org
+ address: '', # smtp server address, ex: smtp.example.org
+ port: 25, # smtp server port
+ domain: '' # fqdn of rails server, ex: rails.example.org
}
-
# Announcements mailman mailing list REQUEST address, EX: list-request@lists.example.org
# NOTE: You must use the REQUEST address for the mailing list. ONLY WORKS WITH MAILMAN LISTS.
-$ANNOUNCE_LIST = "sifrportal-users@lirmm.fr"
-
+$ANNOUNCE_LIST = ENV['SUPPORT_EMAIL']
# Email addresses used for sending notifications (errors, feedback, support)
-$SUPPORT_EMAIL = "sifrportal-support@lirmm.fr"
-
+$SUPPORT_EMAIL = ENV['SUPPORT_EMAIL']
# Email used to send notifications
-$NOTIFICATION_EMAIL = "notifications@bioportal.lirmm.fr"
-
+$NOTIFICATION_EMAIL = ENV['SUPPORT_EMAIL']
# reCAPTCHA
# In order to use reCAPTCHA on the account creation and feedback submission pages:
# 1. Obtain a reCAPTCHA v2 key from: https://www.google.com/recaptcha/admin
@@ -144,33 +116,12 @@ $NOTIFICATION_EMAIL = "notifications@bioportal.lirmm.fr"
#
# 3. Set the USE_RECAPTCHA option to 'true'
ENV['USE_RECAPTCHA'] = 'false'
-
# Custom BioPortal logging
require 'log'
-$REMOTE_LOGGING = false
-
-##
-# Flex Options
-##
-
-# URL to pull Flex apps from
-$FLEX_URL = "/flex"
-
-# Flex App API keys
-$ANNOTATOR_FLEX_APIKEY = ""
-$SEARCH_FLEX_APIKEY = ""
-$RECOMMENDER_FLEX_APIKEY = ""
-$FLEXOVIZ_APIKEY = ""
-
# URL where BioMixer GWT app is located
-#$BIOMIXER_URL = "http://bioportal-integration.bio-mixer.appspot.com"
-$BIOMIXER_URL = "http://#{$SITE_URL}/BioMixer"
-
-# Array with all the additional ontology metadata to display in the ontology details
-$ADDITIONAL_ONTOLOGY_METADATA = ["naturalLanguage", "hasLicense", "notes", "modificationDate", "URI", "hasContributor", "hasCreator", "endorsedBy", "hasDomain",
- "keyClasses", "keywords", "isOfType", "knowUsage", "designedForOntologyTask", "hasFormalityLevel", "usedImports", "usedKnowledgeRepresentationParadigm",
- "usedOntologyEngineeringMethodology", "usedOntologyEngineeringTool"]
-
+# $BIOMIXER_URL = "http://bioportal-integration.bio-mixer.appspot.com"
+$BIOMIXER_URL = ENV['BIOMIXER_URL']
+$BIOMIXER_APIKEY = ENV['BIOMIXER_APIKEY']
##
# Custom Ontology Details
# Custom details can be added on a per ontology basis using a key/value pair as columns of the details table
@@ -179,43 +130,93 @@ $ADDITIONAL_ONTOLOGY_METADATA = ["naturalLanguage", "hasLicense", "notes", "modi
# $ADDITIONAL_ONTOLOGY_DETAILS = { "STY" => { "Additional Detail" => "Text to be shown in the right-hand column." } }
##
$ADDITIONAL_ONTOLOGY_DETAILS = {}
-
-#Front notice appears on the front page only and is closable by the user. It remains closed for seven days (stored in cookie)
+# Front notice appears on the front page only and is closable by the user. It remains closed for seven days (stored in cookie)
$FRONT_NOTICE = ''
-
# Site notice appears on all pages and remains closed indefinitely. Stored below as a hash with a unique key and a string message
# EX: $SITE_NOTICE = { :unique_key => 'Put your message here (can include
html if you use single quotes).' }
-$SITE_NOTICE = { }
-
-# Used in browse for facetted search to avoid having to call the API (for performance)
-$FORMALITY_LEVELS = {
- "http://w3id.org/nkos/nkostype#classification_schema" => "Classification scheme",
- "http://w3id.org/nkos/nkostype#dictionary" => "Dictionary",
- "http://w3id.org/nkos/nkostype#gazetteer" => "Gazetteer",
- "http://w3id.org/nkos/nkostype#glossary" => "Glossary",
- "http://w3id.org/nkos/nkostype#list" => "List",
- "http://w3id.org/nkos/nkostype#name_authority_list" => "Name authority list",
- "http://w3id.org/nkos/nkostype#ontology" => "Ontology",
- "http://w3id.org/nkos/nkostype#semantic_network" => "Semantic network",
- "http://w3id.org/nkos/nkostype#subject_heading_scheme" => "Subject heading scheme",
- "http://w3id.org/nkos/nkostype#synonym_ring" => "Synonym ring",
- "http://w3id.org/nkos/nkostype#taxonomy" => "Taxonomy",
- "http://w3id.org/nkos/nkostype#terminology" => "Terminology",
- "http://w3id.org/nkos/nkostype#thesaurus" => "Thesaurus"
-}
-$IS_OF_TYPE = {
- "http://omv.ontoware.org/2005/05/ontology#ApplicationOntology" => "Application Ontology",
- "http://omv.ontoware.org/2005/05/ontology#CoreOntology" => "Core Ontology",
- "http://omv.ontoware.org/2005/05/ontology#DomainOntology" => "Domain Ontology",
- "http://omv.ontoware.org/2005/05/ontology#TaskOntology" => "Task Ontology",
- "http://omv.ontoware.org/2005/05/ontology#UpperLevelOntology" => "Upper Level Ontology",
- "http://omv.ontoware.org/2005/05/ontology#Vocabulary" => "Vocabulary"
+$SITE_NOTICE = {}
+$HOME_PAGE_LOGOS = {
+ supported_by: [
+ {
+ img_src: 'logos/supports/numev.png',
+ url: 'http://www.lirmm.fr/numev',
+ target: '_blank'
+ },
+ {
+ img_src: 'logos/supports/anr.png',
+ url: 'https://anr.fr/en',
+ target: '_blank'
+ },
+ {
+ img_src: 'logos/supports/eu.png',
+ url: 'https://commission.europa.eu/research-and-innovation_en',
+ target: '_blank'
+ }
+ ],
+ with_the_collaboration_of: [
+ {
+ img_src: 'logos/collaboration/d2kab.png',
+ url: 'http://d2kab.mystrikingly.com',
+ target: '_blank'
+ },
+ {
+ img_src: 'logos/collaboration/lirmm.png',
+ url: 'http://www.lirmm.fr',
+ target: '_blank'
+ },
+ {
+ img_src: 'logos/collaboration/inrae.png',
+ url: 'https://www.inrae.fr/enm',
+ target: '_blank'
+ },
+ {
+ img_src: 'logos/collaboration/stanford.png',
+ url: 'https://www.stanford.edu',
+ target: '_blank'
+ }
+ ]
}
-$NATURAL_LANGUAGES = {
- "http://lexvo.org/id/iso639-3/eng" => "English",
- "http://lexvo.org/id/iso639-3/fra" => "French",
- "http://lexvo.org/id/iso639-3/spa" => "Spanish",
- "http://lexvo.org/id/iso639-3/por" => "Portuguese",
- "http://lexvo.org/id/iso639-3/ita" => "Italian",
- "http://lexvo.org/id/iso639-3/deu" => "German"
+
+$FOOTER_LINKS = {
+ social: [
+ { logo: 'social/people.svg', link: 'https://github.com/orgs/agroportal/people' },
+ { logo: 'social/github.svg', link: 'https://github.com/agroportal' },
+ { logo: 'social/twitter.svg', link: 'https://twitter.com/lagroportal' }
+ ],
+ sections: {
+ products: {
+ ontoportal: 'https://ontoportal.org/',
+ release_notes: 'https://doc.jonquetlab.lirmm.fr/share/e6158eda-c109-4385-852c-51a42de9a412/doc/release-notes-btKjZk5tU2',
+ api: 'https://data.agroportal.lirmm.fr/',
+ sparql: 'https://sparql.agroportal.lirmm.fr/test/'
+ },
+ support: {
+ contact_us: 'https://agroportal.lirmm.fr/feedback',
+ wiki: 'https://www.bioontology.org/wiki/',
+ documentation: 'https://ontoportal.github.io/documentation/'
+ },
+ agreements: {
+ terms: '',
+ privacy_policy: '',
+ cite_us: '',
+ acknowledgments: ''
+ },
+ about: {
+ about_us: 'https://github.com/agroportal/project-management',
+ projects: 'https://d2kab.mystrikingly.com/',
+ team: 'https://github.com/orgs/agroportal/people'
+ }
+ }
}
+
+$NOT_DOWNLOADABLE = {}
+
+$UI_THEME = ENV['UI_THEME'] || 'ontoportal'
+$HOSTNAME = ENV['API_URL']
+if $HOSTNAME
+ $HOSTNAME = ENV['API_URL'].split('data.').last
+ # add custom stage server configuration if needed (e.g bioportal_config_development_stageportal.lirmm.fr)
+ if File.exist?("config/bioportal_config_development_#{$HOSTNAME}")
+ require_relative "bioportal_config_development_#{$HOSTNAME}"
+ end
+end
diff --git a/config/bioportal_config_test.rb b/config/bioportal_config_test.rb
new file mode 100644
index 000000000..81aad6510
--- /dev/null
+++ b/config/bioportal_config_test.rb
@@ -0,0 +1,177 @@
+# frozen_string_literal: true
+
+$SITE = 'Testportal'
+$HOSTNAME = 'testportal'
+$UI_HOSTNAME = 'localhost'
+$UI_URL = "http://#{$UI_HOSTNAME}:3000"
+
+$API_KEY = ENV['API_KEY']
+$REST_URL = ENV['API_URL']
+$BIOMIXER_URL = ENV['BIOMIXER_URL']
+$ANNOTATOR_URL = $PROXY_URL = ENV['ANNOTATOR_URL']
+$FAIRNESS_URL = ENV['FAIRNESS_URL']
+
+# config/initializers/omniauth_providers.rb
+$OMNIAUTH_PROVIDERS = {
+ github: {
+ client_id: 'CLIENT_ID',
+ client_secret: 'CLIENT_SECRET',
+ icon: 'github.svg',
+ enable: true
+ },
+ google: {
+ strategy: :google_oauth2,
+ client_id: 'CLIENT_ID',
+ client_secret: 'CLIENT_SECRET',
+ icon: 'google.svg',
+ enable: true
+ },
+ orcid: {
+ client_id: 'CLIENT_SECRET',
+ client_secret: 'CLIENT_SECRET',
+ icon: 'orcid.svg',
+ enable: false
+ },
+ keycloak: {
+ strategy: :keycloak_openid,
+ client_id: 'YOUR_KEYCLOAK_CLIENT_ID',
+ client_secret: 'YOUR_KEYCLOAK_CLIENT_SECRET',
+ client_options: { site: 'KEYCLOAK_SITE', realm: 'KEYCLOAK_REALM' },
+ name: 'keycloak',
+ icon: 'keycloak.svg',
+ enable: false
+ }
+}.freeze
+
+$INTERPORTAL_HASH = {}
+
+# If your BioPortal installation includes Fairness score set this to true
+$FAIRNESS_DISABLED = false
+
+# Pairing a name with an array of ontology virtual ids will allow you to filter ontologies based on a subdomain.
+# If your main UI is hosted at example.org and you add custom.example.org pointing to the same Rails installation
+# you could filter the ontologies visible at custom.example.org by adding this to the hash: "custom" => { :name => "Custom Slice", :ontologies => [1032, 1054, 1099] }
+# Any number of slices can be added. Groups are added automatically using the group acronym as the subdomain.
+$ENABLE_SLICES = true
+$ONTOLOGY_SLICES = {}
+
+# Cube metrics reporting
+$ENABLE_CUBE = false
+
+$NOT_DOWNLOADABLE = {}
+# Enable client request caching
+$CLIENT_REQUEST_CACHING = true
+
+# If you don't use Airbrake you can have exceptions emailed to the $ERROR_EMAIL address by setting this to 'true'
+$EMAIL_EXCEPTIONS = false
+
+# Announcements mailman mailing list REQUEST address, EX: list-request@lists.example.org
+# NOTE: You must use the REQUEST address for the mailing list. ONLY WORKS WITH MAILMAN LISTS.
+$ANNOUNCE_LIST ||= 'appliance-users-request@localhost'
+
+# Email addresses used for sending notifications (errors, feedback, support)
+$SUPPORT_EMAIL ||= 'support@localhost'
+$ADMIN_EMAIL ||= 'admin@localhost'
+$ERROR_EMAIL ||= 'errors@localhost'
+
+# Custom BioPortal logging
+require 'log'
+$REMOTE_LOGGING = false
+
+##
+# Custom Ontology Details
+# Custom details can be added on a per ontology basis using a key/value pair as columns of the details table
+#
+# Example:
+# $ADDITIONAL_ONTOLOGY_DETAILS = { 1000 => { "Additional Detail" => "Text to be shown in the right-hand column." } }
+##
+$ADDITIONAL_ONTOLOGY_DETAILS = {}
+
+# Site notice appears on all pages and remains closed indefinitely. Stored below as a hash with a unique key and a
+# EX: $SITE_NOTICE = { :unique_key => 'Put your message here (can include
html if you use
+$SITE_NOTICE = {}
+################################
+## AUTO-GENERATED DO NOT MODIFY
+#################################
+
+# Full string for site, EX: "NCBO BioPortal"
+$ORG_SITE = $ORG.nil? || $ORG.empty? ? $SITE : "#{$ORG} #{$SITE}"
+
+$HOME_PAGE_LOGOS = {
+ supported_by: [
+ {
+ img_src: 'logos/supports/numev.png',
+ url: 'http://www.lirmm.fr/numev',
+ target: '_blank'
+ },
+ {
+ img_src: 'logos/supports/anr.png',
+ url: 'https://anr.fr/en',
+ target: '_blank'
+ },
+ {
+ img_src: 'logos/supports/eu.png',
+ url: 'https://commission.europa.eu/research-and-innovation_en',
+ target: '_blank'
+ }
+ ],
+ with_the_collaboration_of: [
+ {
+ img_src: 'logos/collaboration/d2kab.png',
+ url: 'http://d2kab.mystrikingly.com',
+ target: '_blank'
+ },
+ {
+ img_src: 'logos/collaboration/lirmm.png',
+ url: 'http://www.lirmm.fr',
+ target: '_blank'
+ },
+ {
+ img_src: 'logos/collaboration/inrae.png',
+ url: 'https://www.inrae.fr/enm',
+ target: '_blank'
+ },
+ {
+ img_src: 'logos/collaboration/stanford.png',
+ url: 'https://www.stanford.edu',
+ target: '_blank'
+ }
+ ]
+}
+
+$FOOTER_LINKS = {
+ social: [
+ { logo: 'social/people.svg', link: 'https://github.com/orgs/agroportal/people' },
+ { logo: 'social/github.svg', link: 'https://github.com/agroportal' },
+ { logo: 'social/twitter.svg', link: 'https://twitter.com/lagroportal' }
+ ],
+ sections: {
+ products: {
+ ontoportal: 'https://ontoportal.org/',
+ release_notes: 'https://doc.jonquetlab.lirmm.fr/share/e6158eda-c109-4385-852c-51a42de9a412/doc/release-notes-btKjZk5tU2',
+ api: 'https://data.agroportal.lirmm.fr/',
+ sparql: 'https://sparql.agroportal.lirmm.fr/test/'
+ },
+ support: {
+ contact_us: 'https://agroportal.lirmm.fr/feedback',
+ wiki: 'https://www.bioontology.org/wiki/',
+ documentation: 'https://ontoportal.github.io/documentation/'
+ },
+ agreements: {
+ terms: '',
+ privacy_policy: '',
+ cite_us: '',
+ acknowledgments: ''
+ },
+ about: {
+ about_us: 'https://github.com/agroportal/project-management',
+ projects: 'https://d2kab.mystrikingly.com/',
+ team: 'https://github.com/orgs/agroportal/people'
+ }
+ }
+}
+
+$UI_THEME = :stageportal
+if File.exist?('config/bioportal_config_development_testportal.lirmm.fr.rb')
+ require_relative 'bioportal_config_development_testportal.lirmm.fr' # local credentials
+end
diff --git a/config/boot.rb b/config/boot.rb
index 282011619..6a51f27d2 100644
--- a/config/boot.rb
+++ b/config/boot.rb
@@ -1,3 +1,4 @@
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
require "bundler/setup" # Set up gems listed in the Gemfile.
+require 'bootsnap/setup'
\ No newline at end of file
diff --git a/config/database.yml.sample b/config/database.yml.sample
index c92d72df2..6edf6ed31 100644
--- a/config/database.yml.sample
+++ b/config/database.yml.sample
@@ -12,10 +12,9 @@
default: &default
adapter: mysql2
encoding: utf8mb4
- pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
- password: bp_user
- host: db
+ password: root
+ host: <%= ENV["DB_HOST"] %>
development:
<<: *default
diff --git a/config/environments/development.rb b/config/environments/development.rb
index b595b87cd..7e0593176 100644
--- a/config/environments/development.rb
+++ b/config/environments/development.rb
@@ -7,7 +7,16 @@
# 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
+ config.action_mailer.delivery_method = :letter_opener_web
+ config.action_mailer.raise_delivery_errors = false
+
+ config.action_mailer.perform_deliveries = true
+ config.action_mailer.default_url_options = { host: '0.0.0:3000' } # Adjust the host/port as needed
+
+ config.action_mailer_letter_opener_location = Rails.root.join('tmp', 'my_mails')
+
+
# Do not eager load code on boot.
config.eager_load = false
@@ -16,7 +25,9 @@
# Enable server timing
config.server_timing = true
-
+
+ # Allow all hosts in development
+ config.hosts = nil
# Enable/disable caching. By default caching is disabled.
# Run rails dev:cache to toggle caching.
if Rails.root.join("tmp/caching-dev.txt").exist?
diff --git a/config/environments/production.rb b/config/environments/production.rb
index 3eea9fbc8..3eb3961f0 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -92,8 +92,10 @@
# config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name')
# Include the BioPortal-specific configuration options
- require Rails.root.join('config', "bioportal_config_#{Rails.env}.rb")
-
+ if File.exist?(Rails.root.join('config', "bioportal_config_#{Rails.env}.rb"))
+ require Rails.root.join('config', "bioportal_config_#{Rails.env}.rb")
+ end
+
# Use a different cache store in production.
config.cache_store = :mem_cache_store, ENV["MEMCACHE_SERVERS"] || "localhost:11211", { namespace: 'bioportal_web_ui', expires_in: 1.day }
diff --git a/config/environments/test.rb b/config/environments/test.rb
index 4448d0e8f..d35b8d0f7 100644
--- a/config/environments/test.rb
+++ b/config/environments/test.rb
@@ -1,4 +1,6 @@
-require "active_support/core_ext/integer/time"
+# frozen_string_literal: true
+
+require 'active_support/core_ext/integer/time'
# The test environment is used exclusively to run your application's
# test suite. You never need to work with it otherwise. Remember that
@@ -14,18 +16,18 @@
# Eager loading loads your whole application. When running a single test locally,
# this probably isn't necessary. It's a good idea to do in a continuous integration
# system, or in some way before deploying your code.
- config.eager_load = ENV["CI"].present?
+ config.eager_load = ENV['CI'].present?
# Configure public file server for tests with Cache-Control for performance.
config.public_file_server.enabled = true
config.public_file_server.headers = {
- "Cache-Control" => "public, max-age=#{1.hour.to_i}"
+ 'Cache-Control' => "public, max-age=#{1.hour.to_i}"
}
# Show full error reports and disable caching.
config.consider_all_requests_local = true
config.action_controller.perform_caching = false
- config.cache_store = :null_store
+ config.cache_store = ActiveSupport::Cache::MemCacheStore.new('localhost:11211', namespace: 'BioPortal')
# Raise exceptions instead of rendering exception templates.
config.action_dispatch.show_exceptions = false
diff --git a/config/initializers/graphql_client.rb b/config/initializers/graphql_client.rb
index 69a909bb9..57760a168 100644
--- a/config/initializers/graphql_client.rb
+++ b/config/initializers/graphql_client.rb
@@ -6,7 +6,7 @@
module GitHub
HTTPAdapter = GraphQL::Client::HTTP.new('https://api.github.com/graphql') do
def headers(_context)
- { 'Authorization': "Bearer #{Rails.application.credentials[:kgcl][:github_access_token]}" }
+ { 'Authorization': "Bearer #{Rails.application.credentials.dig(:kgcl, :github_access_token)}" }
end
end
diff --git a/config/initializers/omniauth.rb b/config/initializers/omniauth.rb
new file mode 100644
index 000000000..c7c4027c3
--- /dev/null
+++ b/config/initializers/omniauth.rb
@@ -0,0 +1,5 @@
+Rails.application.config.middleware.use OmniAuth::Builder do
+ Array($OMNIAUTH_PROVIDERS).each do |provider, config|
+ provider config[:strategy] || provider, config[:client_id], config[:client_secret], client_options: {}.merge(config[:client_options].to_h)
+ end
+end
\ No newline at end of file
diff --git a/config/locales/de.yml b/config/locales/de.yml
new file mode 100644
index 000000000..4524bf312
--- /dev/null
+++ b/config/locales/de.yml
@@ -0,0 +1,409 @@
+---
+de:
+ activaterecord:
+ errors:
+ models:
+ license:
+ attributes:
+ encrypted_key:
+ invalid_license_key: is an invalid license key
+ no_appliance_id_for_comparison: Could not be validated. Unable to retrieve virtual appliance ID.
+ appliance_id_mismatch: is an appliance id mismatch
+
+ date:
+ formats:
+ year_month_day_concise: "%Y-%m-%d" # 2017-03-01
+ month_day_year: "%b %-d, %Y" # Mar 1, 2017
+ monthfull_day_year: "%B %-d, %Y" # March 1, 2017
+
+ additional_parameters: Zusätzliche Parameter werden erklärt unter
+ admin:
+ licenses:
+ create:
+ success: Lizenz erfolgreich verlängert!
+ all: Alle
+ annotator:
+ annotate_text_prompt: Zu beschriftenden Text eingeben oder einfügen
+ annotations_result: Anmerkungen
+ fast_context: FastContext
+ filters:
+ confidence_threshold: Filterkonfidenzschwellenwert
+ confidence_threshold_help: Geben Sie die Mindestposition in der Punkteverteilung
+ an (zwischen 1 und 100)
+ exclude_numbers: Nummern ausschließen
+ exclude_synonyms: Synonyme ausschließen
+ include_mappings: Mappings einbeziehen
+ match_longest_only: Nur das längste Spiel
+ match_partial_words: Erkennen von Wortteilen
+ max_hierarchy_level: Vorfahren bis zur Ebene einbeziehen
+ score: Punktzahl einbeziehen
+ score_help: Bewertung von Anmerkungen nach der früheren NCBO 2009-Maßnahme (alt)
+ oder Bewertung von Anmerkungen nach der C-Value-Maßnahme (cvalue) oder Bewertung
+ von Anmerkungen nach der C-Value-Maßnahme mit Hierarchieerweiterung (cvalueh)
+ score_threshold: Filter nach Schwellenwert
+ score_threshold_help: Mindestpunktzahl für Anmerkungen festlegen
+ get_annotator: Anmerkungen erhalten
+ index:
+ fast_context:
+ tooltip: Aktivieren Sie FastContext, um zu erkennen, ob ein Konzept verneint
+ wurde (bejaht, verneint), wer das gefundene Konzept erlebt hat (Patient,
+ andere), wann das kommentierte Konzept aufgetreten ist (kürzlich, historisch,
+ hypothetisch) und/oder ob das kommentierte Konzept unsicher ist (sicher,
+ unsicher).
+ intro: Annotationen für biomedizinische Texte mit Ontologieklassen erhalten
+ lemmatize:
+ tooltip: Aktivieren Sie Lemmatize, um eingereichten Text zu lemmatisieren
+ und ein lemmatisiertes Wörterbuch für Anmerkungen zu verwenden
+ sample_text: Das Melanom ist ein bösartiger Tumor der Melanozyten, der hauptsächlich
+ in der Haut, aber auch im Darm und im Auge vorkommt.
+ lemmatize: Lemmatisieren
+ results_filtered_by: Die Ergebnisse werden gefiltert nach
+ select: Wählen Sie %{name}
+ start_typing_to_select: Beginnen Sie mit der Eingabe, um %{type} auszuwählen oder
+ lassen Sie es leer, um alle zu verwenden
+ title: Kommentator
+ umls:
+ semantic_groups: UMLS Semantische Gruppen
+ semantic_types: UMLS-Semantische Typen
+ certainty: Gewissheit
+ class: Klasse
+ clear_selection: Auswahl löschen
+ concepts:
+ request_term:
+ new_term_instructions: |
+
Diese Ontologie ist in OntoloBridge integriert und ermöglicht es den Nutzern der Gemeinschaft, Ergänzungen zur öffentlichen Ontologie vorzuschlagen. Füllen Sie die nachstehende Vorlage aus, um eine Begriffsanfrage direkt an den Ontologiemanager zu senden.
+
+ Begriffsbezeichnung (erforderlich)
Vorgeschlagener Begriffsname. Wenn ein Begriff mit mehr als einem Synonym beschrieben werden kann, geben Sie hier nur den bevorzugten Namen ein.
+
+
+ Begriffsbeschreibung (erforderlich)
Eine kurze Definition, Beschreibung oder Verwendung des vorgeschlagenen Begriffs. Synonyme von weiteren Begriffen können in diesem Abschnitt aufgeführt werden.
+
+
+ Superclass (erforderlich)
Der übergeordnete Begriff des vorgeschlagenen Begriffs. Der übergeordnete Begriff muss ein bestehender Eintrag in der aktuellen Ontologie sein. Die Oberklasse kann direkt aus dem Bioportal-Klassenbaum ausgewählt werden.
+
+
+ Referenzen (optional)
Bieten Sie Belege für die Existenz des gesuchten Begriffs, wie Pubmed IDs von Artikeln oder Links zu anderen Ressourcen, die den Begriff beschreiben.
+
+
+ Begründung (optional)
Geben Sie hier zusätzliche Informationen über den gesuchten Begriff an.
+
+ context: Kontext
+ coverage: Erfassungsbereich
+ filter: Filter
+ format_results: Ergebnisse formatieren als
+ get_json_version: Abrufen der json-Version
+ get_recommendations: Empfehlungen erhalten
+ help: Hilfe
+ home:
+ agroportal_figures: "%{site} in Zahlen:"
+ benefit1: Entdecken Sie neue Erkenntnisse und Zusammenhänge, indem Sie andere
+ Ontologien im Repository erforschen.
+ benefit2: Tragen Sie zum Wachstum und zur Entwicklung Ihres Bereichs bei, indem
+ Sie neue Konzepte und Kategorien hinzufügen.
+ benefit3: Verwenden Sie die Versionskontrolle, um die Änderungen an Ihrer Ontologie
+ im Laufe der Zeit zu verwalten und mit anderen Benutzern zusammenzuarbeiten.
+ benefit4: Holen Sie sich Feedback und Vorschläge von anderen Benutzern, die Ihre
+ Ontologie überprüfen und kommentieren können.
+ benefit5: Holen Sie sich den FAIR Score und die Metriken für Ihre Ontologie.
+ fair_details: Siehe Details
+ fairness: FAIR-Punkte
+ get_annotations: Anmerkungen erhalten
+ get_recommendations: Empfehlungen erhalten
+ index:
+ tagline: Die Heimat von Vokabularen und Ontologien in der Agrarwissenschaft
+ und verwandten Bereichen.
+ title: Willkommen bei der %{site}
+ welcome: Willkommen auf der %{site},
+ ontology_upload: Möchten Sie eine Ontologie hochladen?
+ ontology_upload_benefits: 'Indem Sie Ihre Ontologie auf %{site} hochladen, können
+ Sie:'
+ ontology_upload_button: Ontologie hochladen
+ ontology_upload_desc: Das Hochladen einer Ontologie ist eine Möglichkeit, Ihr
+ Fachwissen mit anderen zu teilen.
+ paste_text_prompt: Einfügen eines Textabsatzes oder einiger Schlüsselwörter ...
+ recommender_annotator: Empfehlungsgeber und Kommentator
+ supported_by: Unterstützt von
+ twitter_news: Nachrichten
+ with_collaboration: In Zusammenarbeit mit der
+ input: Eingabe
+ insert_sample_text: Beispieltext einfügen
+ keywords: Schlüsselwörter
+ keywords_separated_by_commas: Schlüsselwörter durch Kommas getrennt
+ knowledge_detail: Wissen Detail
+ landscape:
+ average_metrics: Durchschnittliche Metriken
+ category: Kategorie
+ filter_network: Netzwerk filtern
+ funding_endorsing_organizations: Organisationen, die die meisten Ontologien finanzieren
+ und befürworten
+ group: Gruppe
+ groups_and_categories: Gruppen und Kategorien
+ intro: Visualisierung von Daten, die aus im Portal gespeicherten Ontologien abgerufen
+ werden
+ more_properties_charts: Weitere Eigenschaftsdiagramme
+ most_active_ontologies: Die aktivsten Ontologien
+ most_active_organizations: Die aktivsten Organisationen
+ most_active_people: Die aktivsten Menschen
+ most_active_people_as_reviewer: Die aktivsten Personen als Gutachter
+ most_mentioned_people: Meistgenannte Personen als Kontaktperson, Ersteller, Mitwirkender
+ oder Kurator
+ most_mentioned_people_as_reviewer: Personen, die Notizen, Rezensionen und Projekte
+ veröffentlicht haben
+ ontologies_activity_on: Ontologie-Aktivität auf %{site}
+ ontologies_by: Ontologien nach %{type}
+ ontologies_contributors: Beiträge zur Ontologieentwicklung
+ ontologies_count_by_catalog: Anzahl der Ontologien in jedem Datenkatalog
+ ontologies_formats: Verwendetes Format
+ ontologies_languages: Natürliche Sprachen der Ontologien
+ ontologies_licenses: Von Ontologien verwendete Lizenzen
+ ontologies_with_notes_reviews_projects: Ontologien mit Notizen, Bewertungen und
+ Projekten
+ ontology_fairness_evaluator: Ontologie FAIRness Evaluator (O'FAIRe)
+ ontology_formality_levels: Formalitätsebenen von Ontologien
+ ontology_properties_pie_charts: Kreisdiagramme für die in Ontologien verwendeten
+ Eigenschaften
+ ontology_relations_network: Ontologie-Beziehungsnetz
+ ontology_tools: Meistgenutzte Tools zur Erstellung von Ontologien
+ owl_ontology_author_uris: URIs für Autoreneigenschaften, die für OWL-Ontologien
+ verwendet werden
+ owl_ontology_definition_uris: URIs für Definitionsmerkmale, die für OWL-Ontologien
+ verwendet werden
+ owl_ontology_preflabel_uris: URIs für prefLabel-Eigenschaften, die für OWL-Ontologien
+ verwendet werden
+ owl_ontology_synonym_uris: URIs für synonyme Eigenschaften, die für OWL-Ontologien
+ verwendet werden
+ properties_usage_proportion: Der Anteil der verwendeten Eigenschaften in den gespeicherten
+ Ontologien
+ properties_use: Nutzung der Immobilie
+ relations_between_stored_ontologies: Beziehungen zwischen gespeicherten Ontologien
+ im Portal
+ size: Größe
+ title: "%{site} Landschaft"
+ layout:
+ header:
+ account_setting: Kontoeinstellungen
+ annotator: Kommentator
+ browse: Durchsuchen
+ documentation: Dokumentation
+ help: Hilfe
+ landscape: Landschaft
+ login: Anmeldung
+ logout: abmeldung
+ mappings: Mappings
+ publications: Veröffentlichungen
+ release_notes: Anmerkungen zur Veröffentlichung
+ search_prompt: Suche in %{portal_name} ...
+ submit_feedback: Feedback senden
+ support: unterstützung
+ login:
+ enter_email: Ihre E-Mail eingeben
+ enter_password: Geben Sie Ihr Passwort ein
+ forgot_password: Passwort vergessen?
+ invalid_login: Fehler im Formular
+ no_account: Sie haben noch kein Konto?
+ password: Passwort
+ register: Register
+ title: Anmeldung
+ username_or_email: Benutzername oder E-Mail
+ mappings:
+ find_mappings: Zuordnungen einer Klasse/eines Konzepts finden
+ intro: Mappings zwischen Klassen verschiedener Ontologien durchsuchen
+ loading_mappings: Mappings laden...
+ mappings_bulk_load: Mapping Bulk Load
+ no_mappings_available: Keine Mappings verfügbar
+ title: Korrespondenzen
+ upload_mappings: Mappings hochladen
+ matched_class: Abgestimmte Klasse
+ matched_ontology: abgestimmte Ontologie
+ max_ontologies_per_set: Maximale Anzahl von Ontologien pro Satz
+ nbco_annotatosplus:
+ annotations: Anmerkungen
+ enter_paste_text_to_annotate: 'Geben Sie den zu beschriftenden Text ein oder fügen
+ Sie ihn ein:'
+ exclude_numbers: Nummern ausschließen
+ exclude_synonyms: Synonyme ausschließen
+ fast_context:
+ help: 'Aktivieren Sie FastContext, um festzustellen: ob ein Konzept verneint
+ wurde (bejaht, verneint), wer das gefundene Konzept erlebt hat (Patient, andere),
+ wann das kommentierte Konzept aufgetreten ist (kürzlich, historisch, hypothetisch)
+ und/oder ob das kommentierte Konzept unsicher ist (sicher, unsicher).'
+ title: FastContext
+ filters:
+ additional_parameters_explained_at: 'Weitere Parameter werden auf der Seite
+ erläutert:'
+ by:
+ certainty: Gewissheit
+ class: Klasse
+ experiencer: Erlebnisträger
+ filter: Filter
+ match_context: Kontext
+ match_type: Typ
+ matched_class: Assoziierte Klasse
+ matched_ontology: Assoziierte Ontologie
+ negation: Negation
+ ontology: Ontologie
+ score: Ergebnis
+ temporality: Zeitlichkeit
+ title: Die Ergebnisse werden gefiltert nach
+ umls_sem_type: UMLS-Semantischer Typ
+ confidence_threshold: Vertrauensschwelle filtern
+ confidence_threshold_help: Geben Sie die Mindestposition in der Punkteverteilung
+ an (zwischen 1 und 100)
+ format_results_as: 'Ergebnisse formatieren als:'
+ reproduce_results_using: Reproduzieren Sie diese Ergebnisse mit der
+ score_threshold: Filter nach Schwellenwert
+ score_threshold_help: Geben Sie den Mindestwert für die Bewertung von Anmerkungen
+ an
+ include_ancestors_up_to_level: Vorfahren bis zur Ebene einbeziehen
+ include_mappings: Mappings einbeziehen
+ include_score: Punktzahl einbeziehen
+ index:
+ intro: |
+ Der NCBO Annotator+ ist ein Proxy, der den NCBO Annotator Web Service auf dem NCBO BioPortal aufruft.
+
+ Tchechmedjiev, A., Abdaoui, A., Emonet, V., Melzi, S., Jonnagaddala, J., & Jonquet, C. (2018).
Enhanced features for annotating and indexing clinical text with NCBO Annotator+. Bioinformatics, 34(11), 1962-1965.
+
+ Wenn Sie die API verwenden, geben Sie bitte einen gültigen NCBO BioPortal API-Schlüssel an und greifen Sie auf den Dienst unter
http://services.bioportal.lirmm. de/ncbo_annotatorplus zu
+ Der an NCBO Annotator+ übermittelte Text muss in englischer Sprache verfasst sein.
+ sample_text: Das Melanom ist ein bösartiger Tumor der Melanozyten, der hauptsächlich
+ in der Haut, aber auch im Darm und im Auge vorkommt.
+ title: NCBO Annotator +
+ insert_sample_text: Beispieltext einfügen
+ match_longest_only: Nur das längste Spiel
+ match_partial_words: Teilwörter zuordnen
+ recognizer: Erkennung von Entitäten
+ score_help: Bewertung von Anmerkungen nach der früheren NCBO 2009-Maßnahme (alt)
+ oder Bewertung von Anmerkungen nach der C-Value-Maßnahme (cvalue) oder Bewertung
+ von Anmerkungen nach der C-Value-Maßnahme mit Hierarchieerweiterung (cvalueh)
+ select: Wählen Sie %{name}
+ select_ontologies: Beginnen Sie mit der Eingabe, um Ontologien auszuwählen, oder
+ lassen Sie das Feld leer, um alle Ontologien zu verwenden
+ select_ontologies_list: Ontologien auswählen
+ show_advanced_options: Erweiterte Optionen anzeigen
+ start_typing_to_select: Beginnen Sie mit der Eingabe, um %{type} auszuwählen oder
+ lassen Sie es leer, um alle zu verwenden
+ umls:
+ semantic_groups: UMLS Semantische Gruppen
+ semantic_types: UMLS-Semantische Typen
+ negation: verneinung
+ none: keine
+ ontologies:
+ ontology_search_prompt: 'Suche nach einer Ontologie oder einem Konzept (Beispiel:
+ Agrovoc ...)'
+ self: Ontologien
+ ontology: Ontologie
+ ontology_details:
+ concept:
+ definitions: Definitionen
+ id: ID
+ in_schemes: In Schemata
+ member_of: Mitglied von
+ no_preferred_name_for_selected_language: Kein bevorzugter Name für die gewählte
+ Sprache.
+ obsolete: Veraltet
+ preferred_name: Bevorzugter Name
+ synonyms: Synonyme
+ type: Typ
+ metadata:
+ additional_metadata: Zusätzliche Metadaten
+ header:
+ last_submission_date: Datum laatste indiening
+
+ ontology_sets: Ontologie-Sets
+ output: Ausgabe
+ projects:
+ contacts: Kontakte
+ create_new_project: Neues Projekt erstellen
+ created: Erstellt
+ creator: Benutzer
+ delete_admin_only: Löschen (nur für Administratoren)
+ delete_confirm: Sind Sie sicher?
+ description: Beschreibung
+ description_text: Beschreibung Text
+ edit: Bearbeiten
+ home_page: Hauptseite
+ index:
+ intro: Durchsuchen Sie eine Auswahl von Projekten, die %{site} Ressourcen verwenden
+ institutions: Einrichtungen
+ ontologies: Ontologien
+ project_description: Beschreibung des Projekts
+ self: Projekte
+ title: Liste der Projekte
+ view_projects_help: Projekte anzeigen Hilfe
+ recommender:
+ intro: Empfehlungen für die relevantesten Ontologien anhand eines Auszugs aus
+ einem biomedizinischen Text oder einer Liste von Schlüsselwörtern erhalten
+ no_recommendations: Keine Empfehlungen gefunden
+ no_sets_recommended: Es gibt keine empfohlenen Ontologiesätze für die angegebene
+ Eingabe. Bitte versuchen Sie die Ausgabe 'Ontologien'.
+ ontology_recommendation_input: Bitte fügen Sie einen Textabschnitt oder einige
+ Schlüsselwörter ein, um Ontologieempfehlungen zu berechnen.
+ ontology_recommender: Ontologie-Empfehlungsprogramm
+ paste_text_recommendations: Fügen Sie einen Textabschnitt oder einige Schlüsselwörter
+ ein, die bei der Berechnung der Ontologieempfehlungen verwendet werden sollen
+ recommendation_error: Problem beim Abrufen von Empfehlungen, bitte versuchen Sie
+ es erneut
+ text_length_limit: Bitte verwenden Sie weniger als 500 Wörter. Wenn Sie längere
+ Texte kommentieren müssen, können Sie den Webdienst für Empfehlungen nutzen.
+ title: empfehlungsgeber
+ valid_integer_max_ontologies_per_set: Die maximale Anzahl von Ontologien pro Satz
+ muss ein gültiger ganzzahliger Wert sein
+ valid_max_ontologies_per_set_range: Die maximale Anzahl von Ontologien pro Satz
+ muss zwischen 2 und 4 liegen
+ valid_numeric_weights: Alle Gewichte müssen gültige numerische Werte sein
+ weight_sum_greater_than_zero: Die Summe der Gewichte muss größer als Null sein
+ weights_greater_than_zero: Alle Gewichte müssen größer als oder gleich Null sein
+ register:
+ account_errors: 'Fehler bei der Erstellung Ihres Kontos:'
+ confirm_password: Bestätigen Sie das Passwort
+ create_account: Neues Konto erstellen
+ email: E-Mail
+ first_name: Vornamen
+ last_name: Nachname
+ mailing_list: Registrieren Sie sich für die Mailingliste des AgroPortal
+ optional: "(fakultativ)"
+ password: Passwort
+ title: Register
+ username: Benutzername
+ reproduce_results: Reproduzieren Sie diese Ergebnisse mit der
+ score: Ergebnis
+ search:
+ categories: Kategorien
+ class_search: Klasse suchen
+ classes_with_definitions: Klassen mit Definitionen
+ hide_advanced_options: Erweiterte Optionen ausblenden
+ include_in_search: In die Suche einbeziehen
+ index:
+ categories_placeholder: Beginnen Sie mit der Eingabe, um Kategorien auszuwählen,
+ oder lassen Sie das Feld leer, um alle zu verwenden
+ obsolete_definition: 'Eine Klasse, die von den Autoren der Ontologie als veraltet
+ gekennzeichnet wurde und deren Verwendung nicht empfohlen wird. Diese Klassen
+ werden oft in Ontologien belassen (anstatt sie ganz zu löschen), damit bestehende
+ Systeme, die von ihnen abhängen, weiterhin funktionieren
+
+ '
+ property_definition: Eine benannte Assoziation zwischen zwei Entitäten. Beispiele
+ sind "Definition" (eine Beziehung zwischen einer Klasse und Text) und "Teil
+ von" (eine Beziehung zwischen zwei Klassen).
+ search_keywords_placeholder: Geben Sie eine Klasse ein, z. B. Melanom
+ narrow_search_to: Suche eingrenzen auf
+ obsolete_classes: Überholte Klassen
+ ontologies: Ontologien
+ ontology_views: Ontologie-Ansichten
+ property_values: Immobilienwerte
+ show_advanced_options: Erweiterte Optionen anzeigen
+ title: Suche
+ view_search_documentation: Dokumentation zur Suche anzeigen
+ select_from_list: Aus Liste auswählen
+ select_ontologies: Beginnen Sie mit der Eingabe, um Ontologien auszuwählen, oder
+ lassen Sie sie leer, um alle zu verwenden
+ select_ontologies_list: Ontologien auswählen
+ show_advanced_options: Erweiterte Optionen anzeigen
+ specialization: Spezialisierung
+ temporality: Zeitlichkeit
+ text: Text
+ type: Typ
+ umls_sem_type: UMLS Sem Typ
+ view_fair_scores_definitions: Definitionen für faire Noten anzeigen
+ visits: Besuche
+ weights_configuration: Gewichte Konfiguration
diff --git a/config/locales/en.rb.sample b/config/locales/en.rb.sample
deleted file mode 100644
index 56e0ccd50..000000000
--- a/config/locales/en.rb.sample
+++ /dev/null
@@ -1,112 +0,0 @@
-{
- :en => {
- :home => {
- :intro => 'Use ' + $SITE + ' to access and share ontologies. You can
create ontology-based
- annotations for your own text ,
link your own project that uses ontologies to the
- description of those ontologies ,
find and create relations between terms in
- different ontologies, review and comment on ontologies and their components as you
-
browse them.
Sign in to ' + $SITE + '
- to submit a new ontology or ontology-based project, provide comments on ontologies or add ontology mappings.',
-
- :facebook_button => '',
-
- :twitter_button => '',
-
- :annotate => {
- :intro => 'The ' + $ORG_SITE + ' Annotator processes text submitted by users, recognizes relevant ontology terms in the text and returns
- the annotations to the user. Use the interface below to submit sample text to get ontology-based annotations. Hover the mouse pointer on any
- button to see what it does. Click on the (?) to see a detailed help panel.
-
- Subscribe to the
NCBO Annotator Users Google group to learn more about
- who and how the Annotator is being used in different projects.'
- },
-
- :resources => {
- :intro => $ORG + ' is building a system for automated ontology-based annotation and indexing of data. We process the textual metadata of diverse elements of resources
- to annotate and index them with terms from appropriate ontologies. Use the interface below to search the resulting index of annotations and to identify
- data resources annotated with particular ontology terms.'
- },
-
- :footer => '
Powered by NCBO BioPortal
-
Release Notes'
- },
-
- :projects => {
- :intro => 'Browse the ontology-based projects in the community: Each project description is linked to ' + $ORG_SITE + ' ontologies that the project uses.
- Use the ‘Add Project’ link to add your ontology-based project to this list and to link it to ' + $ORG_SITE + ' ontologies.
- Your project will then appear on the pages that list the details for the ontologies that you selected. We also invite you to review ontologies that you used in your project.'
- },
-
- :ontologies => {
- :intro => '
Access all ontologies that are available in ' + $ORG_SITE + ':
- You can filter this list by category to display ontologies relevant for a certain domain.
- You can also filter ontologies that belong to a certain group.
Subscribe to the ' + $ORG_SITE + ' RSS feed
- to receive alerts for submissions of new ontologies, new versions of ontologies, new notes, and new projects. You can subscribe to feeds for a specific ontology at
- the individual ontology page. Add a new ontology to ' + $ORG_SITE + ' using the Submit New Ontology link (you need to
sign in
- to see this link).',
-
- :metrics => {
- :intro => '' + $SITE + ' calculates the metrics on the salient properties of the ontology, including statistics and quality-control
- and quality-assurance metrics. Each ontology may have all, some, or no values filled in for its metrics and only metrics
- for the most recent version are reflected. The metrics currently do not distinguish between the terms defined directly in
- this ontology and imported terms (for OWL) or referenced terms (for OBO).
-
See metrics descriptions.'
- }
- },
-
- :mappings => {
- :intro => 'Use this page to explore mappings between ontologies that you are interested in. You will also see the mappings when you browse individual ontologies.'
- },
-
- :about => {
- :welcome => 'Welcome to the National Center for Biomedical Ontology’s BioPortal. BioPortal is a Web-based application for accessing and sharing biomedical ontologies.',
- :getting_started => $SITE + ' allows users to browse, upload, download, search, comment on, and create mappings for ontologies.',
- :browse => '
-
- Users can browse and explore individual ontologies by navigating either a tree structure or an animated graphical view. Users can also view mappings and ontology metadata, and download ontologies.
-
-
- Additionally, users who are signed in may also submit a new ontology to the library. All submissions to the library are reviewed.
-
',
- :announce_list => 'To receive notices of new ' + $SITE + ' releases or site outages, please email ' + $SUPPORT_EMAIL,
- :release_notes => ''
- },
-
- :most_viewed_date => 'March, 2012',
-
- :most_viewed =>
- '
-
-
- Ontology |
- Views |
-
-
-
- |
- |
-
-
- |
- |
-
-
- |
- |
-
-
-
- |
- |
-
-
- |
- |
-
-
-
',
-
- :stats =>
- ''
- }
-}
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 29050980a..3daa18ad8 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -1,449 +1,78 @@
+---
en:
- nbco_annotatosplus:
- score_help: "Score annotations following previous NCBO 2009 measure (old) or Score annotations following C-Value measure (cvalue) or Score annotations following C-Value measure with hierarchy expansion (cvalueh)"
- start_typing_to_select: "Start typing to select %{type} or leave blank to use all"
- include_ancestors_up_to_level: "Include ancestors up to level"
- include_score: "Include score"
-
- date:
- formats:
- year_month_day_concise: '%Y-%m-%d' # 2017-03-01
- month_day_year: '%b %-d, %Y' # Mar 1, 2017
- monthfull_day_year: '%B %-d, %Y' # March 1, 2017
-
- layouts:
- footer:
- copyright_html: Copyright © 2005‑2022, The Board of Trustees of Leland Stanford Junior University. All rights reserved.
- grant_html: >
-
%{site} is currently being developed within French
ANR D2KAB project (
ANR-18-CE23-0017). It also receives or received support from
ANR SIFR project (
ANR-12-JS02-0010), European Union
H2020-MSCA SIFRm project (
No 701771), the
NUMEV Labex (ANR-10-LABX-20), the
IBC of Montpellier project (ANR-11-BINF0002), the Agro Labex (ANR-10-LABX-0001) as well as from University of Montpellier and the CNRS.
- notices:
- license_contact: >
- For more information, email support@ontoportal.org or
- visit https://ontoportal.org/licensing.
- license_obtain: >
- If you are the owner of this OntoPortal installation, you can visit
- https://license.ontoportal.org to obtain a license.
- license_expired: >
- We're sorry, but the license for this OntoPortal installation has expired. If you are the owner of this OntoPortal installation,
- please visit https://license.ontoportal.org to renew your license.
- license_trial:
- one:
- This installation of the OntoPortal Appliance is a trial license, which will expire in 1 day.
- other:
- This installation of the OntoPortal Appliance is a trial license, which will expire in %{count} days.
-
- home:
- index:
- find_ontology_placeholder: Start typing ontology name, then choose from list
- query_placeholder: Enter a class, e.g. Melanoma
- tagline: the world's most comprehensive repository of biomedical ontologies
- title: Welcome to the %{organization}
- welcome: Welcome to %{site},
- help:
- welcome: Welcome to the National Center for Biomedical Ontology’s %{site}. %{site} is a web-based application for accessing and sharing biomedical ontologies.
- getting_started: >
- %{site} allows users to browse, upload, download, search, comment on, and create mappings for ontologies.
- browse: >
- Users can browse and explore individual ontologies by navigating either a tree structure or an animated graphical view. Users can also view mappings and
- ontology metadata, and download ontologies. Additionally, users who are signed in may submit a new ontology to the library.
- rest_examples_html: View documentation and examples of the %{site} REST API.
- announce_list_html: >
- To receive notices of new releases or site outages, please subscribe to the
- bioontology-support list.
-
- annotator:
- index:
- intro: Get annotations for biomedical text with classes from the ontologies
- annotatorplus_html: Check out AnnotatorPlus beta; a new version of the Annotator with added support for negation, and more!
- fast_context:
- tooltip: "Enable FastContext to detect : if a concept has been negated (affirmed, negated), who experienced the found concept (patient, other), when the annotated concept occurred (recent, historical, hypothetical), and/or if the annotated concept is uncertain (certain, uncertain)."
- sample_text: Melanoma is a malignant tumor of melanocytes which are found predominantly in skin but also in the bowel and the eye.
-
- select: "Select %{name}"
-
- fast_context:
- title: "FastContext"
- help: "Activate FastContext to detect: if a concept has been negated (affirmed, negated), who experienced the concept found (patient, other), when the annotated concept occurred (recent, historical, hypothetical), and/or if the annotated concept is uncertain (certain, uncertain)."
-
- annotations: "Annotations"
-
- filters:
- by:
- filter: "Filter"
- title: "Results are filtered by"
- class: "Class"
- ontology: "Ontology"
- match_type: "Type"
- match_context: "Context"
- matched_class: "Associated Class"
- matched_ontology: "Associated Ontology"
- umls_sem_type: "UMLS Semantic Type"
- score: "Score"
- negation: "Negation"
- experiencer: "Experiencer"
- temporality: "Temporality"
- certainty: "Certainty"
-
- additional_parameters_explained_at: "Additional parameters are explained on the page:"
- format_results_as: "Format results as:"
- reproduce_results_using: "Reproduce these results using the"
- match_longest_only: "Match longest only"
- match_partial_words: "Recognize partial words"
- include_mappings: "Include mappings"
- exclude_numbers: "Exclude numbers"
- exclude_synonyms: "Exclude synonyms"
- max_hierarchy_level: "Include ancestors up to level"
- score: "Include score"
- score_help: "Score annotations according to the previous NCBO 2009 measure (old) or score annotations using the C-Value measure (cvalue) or score annotations using the C-Value measure with hierarchy expansion (cvalueh)"
- score_threshold: "Filter by score threshold"
- score_threshold_help: "Specify the minimum score value for annotations"
- confidence_threshold: "Filter confidence threshold"
- confidence_threshold_help: "Specify the minimum position in the scores distribution (between 1 and 100)"
- entity_recognizer: "entity recognition tool"
-
- index:
- intro: >
- The NCBO Annotator+ is a proxy calling the NCBO Annotator Web service on the NCBO BioPortal.
-
- Tchechmedjiev, A., Abdaoui, A., Emonet, V., Melzi, S., Jonnagaddala, J., & Jonquet, C. (2018). Enhanced functionalities for annotating and indexing clinical text with the NCBO Annotator+. Bioinformatics, 34(11), 1962-1965.
-
- If using the API, please provide a valid NCBO BioPortal apikey and hit the service at http://services.bioportal.lirmm.fr/ncbo_annotatorplus
- Text submitted to the NCBO Annotator+ must be in English.
- sample_text: Melanoma is a malignant tumor of melanocytes which are found predominantly in skin but also in the bowel and the eye.
-
- recommender:
- intro: Get recommendations for the most relevant ontologies based on an excerpt from a biomedical text or a list of keywords
-
- search:
- index:
- intro: Search for a class in multiple ontologies
- search_keywords_placeholder: Enter a class, e.g. Melanoma
- categories_placeholder: Start typing to select categories or leave blank to use all
- property_definition: Named association between two entities. Examples are "definition" (a relation between a class and some text) and "part-of" (a relation between two classes).
- obsolete_definition: >
- A class that the authors of the ontology have flagged as being obsolete and which they recommend that people not use. These classes
- are often left in ontologies (rather than removing them entirely) so that existing systems that depend on them will continue to function.
-
- projects:
- index:
- intro: Browse a selection of projects that use %{site} resources
-
- landscape:
- title: "%{site} Landscape"
- intro: Visualize data retrieved from ontologies stored in the portal
- groups_and_categories: Groups and Categories
- ontologies_by: "Ontologies by %{type}"
- ontologies_count_by_catalog: Number of ontologies in each data catalog
- properties_use: Property Usage
- properties_usage_proportion: The proportion of properties usage among stored ontologies
- ontologies_languages: Natural languages of ontologies
- ontologies_licenses: Licenses used by ontologies
- ontology_tools: Most used tools to build ontologies
- more_properties_charts: More properties charts
- ontology_properties_pie_charts: Pie charts for the properties used in ontologies
- owl_ontology_preflabel_uris: URIs for prefLabel properties used for OWL ontologies
- owl_ontology_synonym_uris: URIs for synonym properties used for OWL ontologies
- owl_ontology_definition_uris: URIs for definition properties used for OWL ontologies
- owl_ontology_author_uris: URIs for author properties used for OWL ontologies
- ontology_types: Ontology types
- ontology_formality_levels: Formality levels of ontologies
- ontologies_formats: Format used
- ontologies_contributors: Contributors to ontology development
- most_active_people: Most active people
- most_mentioned_people: Most mentioned people as contact, creator, contributor or curator
- most_active_organizations: Most active organizations
- funding_endorsing_organizations: Organizations funding and endorsing the most ontologies
- ontologies_activity_on: "Ontology Activity on %{site}"
- most_active_people_as_reviewer: "Most active people as reviewers"
- most_mentioned_people_as_reviewer: People who published notes, reviews, and projects
- most_active_ontologies: "Most active ontologies"
- ontologies_with_notes_reviews_projects: "Ontologies with notes, reviews, and projects"
- ontology_relations_network: "Ontology Relations Network"
- relations_between_stored_ontologies: "Relations between stored ontologies in the portal"
- filter_network: "Filter network"
- ontology_fairness_evaluator: "Ontology FAIRness Evaluator (O’FAIRe)"
- average_metrics: "Average metrics"
- group: Group
- category: Category
- size: Size
-
- home:
- find_ontology: "Find an ontology"
- search_class: "Search Class"
- browse_by_group: "Browse by Group"
- browse_ontologies: "Browse ontologies"
- comprehensive_repository: "the most comprehensive repository of biomedical ontologies in the world"
- advanced_search: "Advanced Search"
- ontology_visits: "Ontology visits"
- fair_scores: "FAIR Scores"
- clear_selection: "Clear Selection"
- latest_notes: "Latest Notes"
- ontologies: "Ontologies"
- classes: "Classes"
- individuals: "People"
- projects: "Projects"
- users: "Users"
- no_recent_notes: "No recent notes were submitted"
- index:
- find_ontology_placeholder: Start typing the ontology name, then choose from
- query_placeholder: Enter a class, eg Melanoma
- tagline: The home of vocabularies and ontologies in agronomy and related fields.
- title: Welcome to the %{organization}
- welcome: Welcome to %{site},
- help:
- welcome: Welcome to the %{site} of the National Center for Biomedical Ontology. %{site} is a web application for accessing and sharing biomedical ontologies.
- getting_started: >
- %{site} allows users to browse, upload, download, search, comment, and create mappings for ontologies.
- browse: >
- Users can browse and explore individual ontologies by navigating either in a tree structure or in an animated graphical view. Users can also view mappings and
- ontology metadata and ontology download. Additionally, logged in users can submit a new ontology to the library.
- rest_examples_html: View documentation and examples for the %{site} REST API.
- announce_list_html: >
- To receive notices of new releases or site outages, please subscribe to
- bioontology support list.
-
- recommend:
- intro: Get recommendations for the most relevant ontologies from an excerpt of a biomedical text or a list of keywords
- title: "recommender"
- ontology_recommender: "Ontology Recommender"
- ontology_recommendation_input: "Please paste a paragraph of text or some keywords to compute ontology recommendations."
- weight_sum_greater_than_zero: "The sum of weights must be greater than zero"
- weights_greater_than_zero: "All weights must be greater than or equal to zero"
- valid_numeric_weights: "All weights must be valid numeric values"
- valid_integer_max_ontologies_per_set: "Max ontologies per set must be a valid integer value"
- valid_max_ontologies_per_set_range: "Max ontologies per set must be a number between 2 and 4"
- recommendation_error: "Problem retrieving recommendations, please try again"
- no_recommendations: "No recommendations found"
- no_sets_recommended: "There are no recommended ontology sets for the provided input. Please try the 'Ontologies' output."
- text_length_limit: "Please use less than 500 words. If you need to annotate longer pieces of text, you can use the recommendation web service."
-
- mappings:
- title: "Correspondences"
- upload_mappings: "Upload mappings"
- mappings_bulk_load: "Mapping Bulk Load"
- intro: "Browse mappings between classes of different ontologies"
- no_mappings_available: "No mappings available"
- loading_mappings: "Loading mappings..."
- find_mappings: "Find mappings of a class/concept"
- view_mappings_help: "View mappings help"
- select_class: "Start typing to select a class"
- select_ontologies: "Start typing to select ontologies or leave blank to use all ontologies"
- select_semantic_types: "Select UMLS semantic types"
- select_semantic_types_help: "Start typing to select UMLS semantic types or leave blank to use all types"
- select_semantic_groups: "Select UMLS semantic groups"
- select_semantic_groups_help: "Start typing to select UMLS semantic groups or leave blank to use all groups"
- include_ancestors_up_to_level: "Include ancestors up to level"
- include_score: "Include score"
-
- annotator:
- title: "Annotator"
- get_annotator: "Get annotations"
- filters:
- match_longest_only: "Match longest only"
- match_partial_words: "Recognize partial words"
- include_mappings: "Include Mappings"
- exclude_numbers: "Exclude Numbers"
- exclude_synonyms: "Exclude synonyms"
- max_hierarchy_level: "Include ancestors up to level"
- score: "Include score"
- score_help: "Score annotations following previous NCBO 2009 measure (old) or Score annotations following C-Value measure (cvalue) or Score annotations following C-Value measure with hierarchy expansion (cvalueh)"
- score_threshold: "Filter by score threshold"
- score_threshold_help: "Specify minimum score value for annotations"
- confidence_threshold: "Filter Confidence Threshold"
- confidence_threshold_help: "Specify the minimum position in the score distribution (between 1 and 100)"
- recognizer recognizer: "entity recognition tool"
- start_typing_to_select: "Start typing to select %{type} or leave blank to use all"
- select: "Select %{name}"
- enter_or_paste_text: "Enter or paste text to annotate"
- fast_context: "FastContext"
- lemmatize: "Lemmatize"
- annotations_result: "Annotations"
- results_filtered_by: "Results are filtered by"
-
- umls:
- semantic_types: "UMLS Semantic Types"
- semantic_groups: "UMLS Semantic Groups"
- index:
- intro: Get annotations for biomedical text with ontology classes
- annotatorplus_html: Check out the beta version of AnnotatorPlus; a new version of the Annotator with added support for negation, and more!
- fast_context:
- tooltip: "Enable FastContext to detect: if a concept was denied (affirmed, denied), who experienced the found concept (patient, other), when the annotated concept occurred (recent, historical, hypothetical), and/ or if the annotated concept is uncertain (certain, uncertain)."
- lemmatize:
- tooltip: "Enable Lemmatize to lemmatize submitted text and use a lemmatized dictionary for annotations"
- sample_text: Melanoma is a malignant tumor of melanocytes found mainly in the skin but also in the intestine and the eye.
-
- ontology_details:
- metadata:
- details: "Details"
- acronym: "Acronym"
- visibility: "Visibility"
- viewing_restriction: "Viewing Restriction"
- view_of_ontology: "View of ontology"
- description: "Description"
- status: "Status"
- format: "Format"
- contact: "Contact"
- categories: "Categories"
- groups: "Groups"
- pull_url: "Pull URL"
- submissions: "Submissions"
- links: "Links"
- add_submission: "Add Submission"
- views_of: "Views of"
- create_new_view: "Create a new view"
- no_views_of: "No views of %{name} available"
- go_to_rest_api_json_entry: "Go to REST API JSON Entry"
- get_my_metadata_back: "Get my metadata back"
- n_triple: "N-Triple"
- json_ld: "JSON-LD"
- rdf_xml: "RDF/XML"
- view_individual_metrics_definitions: "View individual metrics definitions"
- metrics: "Metrics"
- metrics_not_calculated_yet: "We have not yet calculated metrics for"
- classes: "Classes"
- individuals: "Individuals"
- properties: "Properties"
- max_depth: "Maximum depth"
- max_children: "Maximum number of children"
- avg_children: "Average number of children"
- single_child_classes: "Classes with a single child"
- many_children_classes: "Classes with more than 25 children"
- no_definition_classes: "Classes without definition"
- visits: "Visits"
- download_as_csv: "Download as CSV"
- projects_using: "Projects Using"
- no_projects_using: "No projects are using"
- create_new_project: "Create a new project"
- additional_metadata: "Additional Metadata"
-
- layout:
- header:
- browse: "Browse"
- search: "Search"
- mappings: "Mappings"
- recommend: "Recommend"
- annotator: "Annotator"
- ncbo_annotator_plus: "NCBO Annotator+"
- projects: "Projects"
- landscape: "Landscape"
- login: "Login"
- account_setting: "Account Settings"
- submit_feedback: "Send Feedback"
- help: "Help"
- release_notes: "Release Notes"
- publications: "Publications"
- footer:
- products: Products
- ontoportal: OntoPortal
- release_notes: Release Notes
- api: API
- sparql: SPARQL
- support: Support
- contact_us: Contact Us
- wiki: Wiki
- documentation: Documentation
- agreements: Agreements
- terms: Terms
- privacy_policy: Privacy Policy
- cite_us: Cite Us
- acknowledgments: Acknowledgments
- about: About
- about_us: About Us
- projects: Projects
- team: Team
- copyright_html: Copyright © 2005-2022, Leland Stanford Junior University Board of Trustees. All rights reserved.
- grant_html: >
- %{site} is currently being developed as part of the ANR D2KAB project (ANR-18-CE23-0017). It receives or has also received support from the ANR SIFR project (ANR-12-JS02-0010), European Union Project H2020-MSCA SIFRm (N° 701771), the Labex NUMEV (ANR-10-LABX-20), the Montpellier IBC project (ANR-11 -BINF0002) , the Agro Labex (ANR-10-LABX-0001) as well than the University of Montpellier and the CNRS.
- notes:
- license_contact: >
- For more information, email support@ontoportal.org or
- visit https://ontoportal.org/licensing.
- license_obtain: >
- If you are the owner of this OntoPortal installation, you can visit
- https://license.ontoportal.org to obtain a license.
- license_expired: >
- We're sorry, but the license for this OntoPortal installation has expired. If you are the owner of this OntoPortal installation,
- please visit https://license.ontoportal.org to renew your license.
- license_trial:
- one: This OntoPortal appliance installation is a trial license, which will expire in 1 day.
- other: This OntoPortal appliance installation is a trial license, which will expire in %{count} days.
- # Other
-
- about: >
-
-
Summary
-
- Many vocabularies and ontologies are produced to represent and annotate agronomic data. It is therefore necessary to have a common platform to identify them, host them and use them in agro-informatics applications. The AgroPortal project aims to provide a repository of reference ontologies for agronomy, by reusing the NCBO BioPortal technology. The scientific results and the experience of the biomedical field are thus exploited and transposed in the field of agronomy, including plants, food, the environment and possibly animal sciences. We propose an ontology portal that offers ontology hosting, search, versioning, visualization, commenting, recommendation, allows semantic annotation, as well as storing and exploiting alignments of ontologies. All this in an infrastructure fully compliant with the Semantic Web. The AgroPortal project pays particular attention to meeting the requirements of the agronomic community in terms of ontology formats (e.g. SKOS, trait dictionaries) or supported functionalities. The AgroPortal project is based on five agronomic use cases that participate in the design and orientation of the platform. AgroPortal already offers a robust and stable reference repository, of great value for the field of agronomy.
-
-
Use cases
-
-
-
New Features
-
- See the release-notes
-
-
-
Partners
-
The National Center for Biomedical Ontology (NCBO), the Research Institute for Development (IRD), Research Data Alliance (RDA),
- Bioversity International, Food & Agriculture Organization (FAO), Global Open Data for Agriculture & Nutrition (Godan Action), National Institute for Agronomic Research (INRA)
-
thanks
-
The AgroPortail is partly produced as part of the Semantic Indexing of French Biomedical Resources project (SIFR)
- who have received funding from the EU H2020 research and innovation program under Marie Sklodowska-Curie (grant 701771)
- and the National Research Agency (ANR-12-JS02-01001 grant), Labex NUMEV (ANR-10-LABX-20 grant),
- the Institute of Computational Biology of Montpellier (grant ANR-11-BINF-0002) as well as by the University of Montpellier and the CNRS.
- We also thank the National Center of Biomedical Ontologies for their help and the time spent with us in the deployment of the AgroPortail.
-
Team
- To contact us: firstname.lastname@lirmm.fr
-
- - Clément Jonquet, researcher at LIRMM (Univ. of Montpellier, France), principal investigator of the AgroPortal project
- - Anne Toulet, researcher at LIRMM (Univ. of Montpellier, France)
- - Vincent Emonet, engineer at LIRMM (Univ. of Montpellier, France)
-
-
-
activaterecord:
errors:
models:
license:
attributes:
encrypted_key:
- invalid_license_key: is an invalid license key
+ invalid_license_key: is an invalid license key.
no_appliance_id_for_comparison: Could not be validated. Unable to retrieve virtual appliance ID.
- appliance_id_mismatch: is an appliance id mismatch
-
- admin:
- licenses:
- create:
- success: License renewed successfully!
+ appliance_id_mismatch: is an appliance id mismatch.
date:
formats:
year_month_day_concise: "%Y-%m-%d" # 2017-03-01
month_day_year: "%b %-d, %Y" # Mar 1, 2017
monthfull_day_year: "%B %-d, %Y" # March 1, 2017
-
- ontologies:
- self: "Ontologies"
- loading: Loading ontologies
- intro: Browse the Ontology Library
- please_wait: Please wait..
- browse: Explore
- welcome_admin: Welcome admin
- admin_help: This color indicates features reserved for administrators
- debug_info: Debug Info
- submit_new_ontology: Submit a new ontology
- entry_type: Entry Type
- uploaded_in_the_last: Uploaded in the last
-
+
+ acceptance: Acceptance
+ additional_parameters: 'Additional parameters explained at '
+ admin:
+ licenses:
+ create:
+ success: License renewed successfully!
+
+ all: All
+
+ annotator:
+ annotate_text_prompt: Enter or paste text to be annotated
+ annotations_result: Annotations
+ fast_context: FastContext
+ filters:
+ confidence_threshold: Filter confidence threshold
+ confidence_threshold_help: Specify the minimum position in the score distribution
+ (between 1 and 100).
+ exclude_numbers: Exclude numbers
+ exclude_synonyms: Exclude synonyms
+ include_mappings: Include mappings
+ match_longest_only: Match longest only
+ match_partial_words: Recognize partial words
+ max_hierarchy_level: Include ancestors up to level
+ score: Include score
+ score_help: Score annotations following previous NCBO 2009 measure (old) or
+ Score annotations following C-Value measure (cvalue) or Score annotations
+ following C-Value measure with hierarchy expansion (cvalueh).
+ score_threshold: Filter by score threshold
+ score_threshold_help: Specify minimum score value for annotations.
+ get_annotator: Get annotations
+ index:
+ fast_context:
+ tooltip: 'Enable FastContext to detect: if a concept is denied (affirmed,
+ denied), who experienced the found concept (patient, other), when the annotated
+ concept occurred (recent, historical, hypothetical), and/ or if the annotated
+ concept is uncertain (certain, uncertain).'
+ intro: Get annotations for text with ontology classes
+ lemmatize:
+ tooltip: Enable Lemmatize to lemmatize submitted text and use a lemmatized
+ dictionary for annotations
+ sample_text: Melanoma is a malignant tumor of melanocytes found mainly in the
+ skin but also in the intestine and the eye.
+ lemmatize: Lemmatize
+ results_filtered_by: Results are filtered by
+ select: Select %{name}
+ start_typing_to_select: Start typing to select %{type} or leave blank to use all
+ title: Annotator
+ umls:
+ semantic_groups: UMLS Semantic Groups
+ semantic_types: UMLS Semantic Types
+
+ certainty: Certainty
+ class: Class
+ clear_selection: Clear selection
concepts:
request_term:
- new_term_instructions: >
+ new_term_instructions: |
This ontology integrates with OntoloBridge, allowing community users to suggest additions to the public ontology. Complete the template below to submit a term request directly to the Ontology Manager.
Term label (required)
Suggested term name. If a term can be described with more than one synonym, enter only the preferred name here.
@@ -452,101 +81,334 @@ en:
Term Description (required)
A brief definition, description, or usage of the suggested term. Synonyms of additional terms may be listed in this section.
- Superclass (required)
The parent term of the suggested term. The parent term must be an existing entry in the current ontology. The superclass can be selected directly from the Bioportal class tree.
+ Superclass (required)
The parent term of the suggested term. The parent term must be an existing entry in the current ontology. The superclass can be selected directly from the class tree.
- References (optional)
Provide evidence that the requested term exists, such as Pubmed IDs of articles or links to other resources describing the term.
+ References (optional)
Provide evidence that the requested term exists, such as IDs of articles or links to other resources describing the term.
Justification (optional)
Provide here any additional information about the requested term.
+ context: Context
+ coverage: Coverage
+ filter: Filter
+ format_results: 'Format results as '
+ get_json_version: Get the json version
+ get_recommendations: Get recommendations
+ help: Help
+
+ home:
+ agroportal_figures: "%{site} in figures"
+ benefit1: Discover new insights and knowledge by exploring other ontologies or smeantic resources in the repository.
+ benefit2: Contribute to knowledge sharing and semantic interoperability in your domain.
+ benefit3: Map your ontology to other relevant ones in the domain and collaborate with other users.
+ benefit4: Get feedback and suggestions from other users who can use and comment on your ontology.
+ benefit5: Precisely describe your ontology with relevant metadata and get a FAIR score for your ontology.
+ fair_details: See details
+ fairness: FAIR Score
+ get_annotations: Get annotations
+ get_recommendations: Get recommendations
+ index:
+ tagline: The home of ontologies and semantic artefacts in agri-food and related domains.
+ title: Welcome to %{site}
+ welcome: Welcome to %{site},
+ ontology_upload: Do you want to share an ontology?
+ ontology_upload_benefits: 'By uploading and sharing your ontology to %{site}, you can:'
+ ontology_upload_button: Submit ontology
+ ontology_upload_desc: Uploading an ontology or another type of semantic artefact (vocabulary, terminology, thesaurus, ...) is a way of sharing your knowledge with others.
+ paste_text_prompt: Enter a paragraph of text or some keywords...
+ recommender_annotator: Recommender and Annotator
+ supported_by: Supported by
+ twitter_news: News
+ with_collaboration: With the collaboration of
+
+ input: Input
+ insert_sample_text: Insert sample text
+ keywords: Keywords
+ keywords_separated_by_commas: Keywords separated by commas
+ knowledge_detail: Knowledge detail
+
+ landscape:
+ average_metrics: Average metrics
+ category: category
+ filter_network: Filter network
+ funding_endorsing_organizations: Organizations funding and endorsing the most
+ ontologies
+ group: group
+ groups_and_categories: Groups and Categories
+ intro: Visualize the panorama of ontologies and other semantic resources of %{site} via metadata aggregation.
+ more_properties_charts: More properties charts
+ most_active_ontologies: Most active ontologies
+ most_active_organizations: Most active organizations
+ most_active_people: Most active people
+ most_active_people_as_reviewer: Most active user account
+ most_mentioned_people: Most mentioned people as contact, creator, contributor or curator
+ most_mentioned_people_as_reviewer: User account who published notes, reviews, and projects
+ ontologies_activity_on: Ontology activity
+ ontologies_by: Ontologies by %{type}
+ ontologies_contributors: Contributors to ontology development
+ ontologies_count_by_catalog: Number of ontologies in each semantic artefact catalog
+ ontologies_formats: Representation language
+ ontologies_languages: Natural languages
+ ontologies_licenses: Licenses
+ ontologies_with_notes_reviews_projects: Ontologies with notes, reviews, and projects
+ ontology_fairness_evaluator: Ontology FAIRness Evaluator (O’FAIRe)
+ ontology_formality_levels: Formality levels
+ ontology_properties_pie_charts: Pie charts retated to object description properties (i.e., meatdata properties used to describe ontology objects).
+ ontology_relations_network: Ontology relations network
+ ontology_tools: Most used tools to build ontologies
+ owl_ontology_author_uris: Properties used to specify object author
+ owl_ontology_definition_uris: Properties used to specify objects definition
+ owl_ontology_preflabel_uris: Properties used to specify objects preferred label
+ owl_ontology_synonym_uris: Properties used to specify object synonyms
+ properties_usage_proportion: Pie charts related to the most frequent values for certain metadata properties
+ properties_use: Property usage
+ relations_between_stored_ontologies: Set of relationships between %{site} ontologies as captured by metadata. Green ontologies are stored in the repository while those in blue are external resources.
+ size: size
+ title: "Landscape"
+
+ layout:
+ header:
+ account_setting: Account settings
+ annotator: Annotator
+ browse: Browse
+ documentation: Documentation
+ help: Help
+ landscape: Landscape
+ login: Login
+ logout: Logout
+ mappings: Mappings
+ publications: Publications
+ release_notes: Release notes
+ search_prompt: Search in %{portal_name} ...
+ submit_feedback: Send feedback
+ support: Support
+ cite_us: Cite Us
+ footer:
+ products: Products
+ ontoportal: OntoPortal
+ release_notes: Release Notes
+ api: API
+ sparql: SPARQL
+ support: support
+ contact_us: Contact Us
+ wiki: Wiki
+ documentation: Documentation
+ agreements: Legal
+ terms: Terms and Conditions
+ privacy_policy: Privacy Policy
+ cite_us: Cite Us
+ acknowledgments: Acknowledgments
+ about: About
+ about_us: About Us
+ projects: D2KAB
+ team: Team
- # General
-
- showing: Display
- of: of
- sort: Sort
- popular: Popular
- name: Name
- classes_count: Number of classes
- instances_concepts_count: Number of instances/concepts
- Notes: Notes
- upload_date: Upload date
- release_date: Release date
- fair_score: FAIR score
- search_rank: Search Rank
- no_matches: No matches!
- uploaded: Uploaded
- view_of: View of
- view: View
- summary_only: Summary only
- groups: Groups
- categories: Categories
- admins: Administrators
- status: Status
- no_submissions_available: No submissions available
- classes: classes
+ login:
+ enter_email: Enter your username
+ enter_password: Enter your password
+ forgot_password: Forgot password?
+ invalid_login: Errors on the form
+ no_account: Do not have an account?
+ password: Password
+ register: Register
+ title: Login
+ username_or_email: Username
+
+ mappings:
+ find_mappings: Find mappings of a class/concept
+ intro: Find all the mappings of an ontology
+ loading_mappings: Loading mappings...
+ mappings_bulk_load: Upload mappings in bulk from a source file
+ no_mappings_available: No mappings available
+ title: Mappings
+ upload_mappings: Upload mappings
+
+ matched_class: Matched class
+ matched_ontology: matched ontology
+ max_ontologies_per_set: Maximum number of ontologies per set
+
+ nbco_annotatosplus:
+ annotations: Annotations
+ enter_paste_text_to_annotate: 'Enter or paste the text to annotate'
+ exclude_numbers: Exclude numbers
+ exclude_synonyms: Exclude synonyms
+ fast_context:
+ help: 'Activate FastContext to detect: if a concept has been negated (affirmed,
+ negated), who experienced the concept found (patient, other), when the annotated
+ concept occurred (recent, historical, hypothetical), and/or if the annotated
+ concept is uncertain (certain, uncertain).'
+ title: FastContext
+ filters:
+ additional_parameters_explained_at: 'Additional parameters are explained on
+ the page:'
+ by:
+ certainty: Certainty
+ class: Class
+ experiencer: Experiencer
+ filter: Filter
+ match_context: Context
+ match_type: Type
+ matched_class: Associated Class
+ matched_ontology: Associated Ontology
+ negation: Negation
+ ontology: Ontology
+ score: Score
+ temporality: Temporality
+ title: Results are filtered by
+ umls_sem_type: UMLS Semantic Type
+ confidence_threshold: Filter confidence threshold
+ confidence_threshold_help: Specify the minimum position in the scores distribution (between 1 and 100)
+ format_results_as: 'Format results as:'
+ reproduce_results_using: Reproduce these results using the
+ score_threshold: Filter by score threshold
+ score_threshold_help: Specify the minimum score value for annotations
+ include_ancestors_up_to_level: Include ancestors up to level
+ include_mappings: Include mappings
+ include_score: Include score
+ index:
+ intro: |
+ The NCBO Annotator+ is a proxy calling the NCBO Annotator web service on the NCBO BioPortal.
+
+ Tchechmedjiev, A., Abdaoui, A., Emonet, V., Melzi, S., Jonnagaddala, J., & Jonquet, C. (2018). Enhanced features for annotating and indexing clinical text with NCBO Annotator+. Bioinformatics, 34(11), 1962-1965.
+
+ If you are using the API, please provide a valid NCBO BioPortal API key and access the service at http://services.bioportal.lirmm. en/ncbo_annotatorplus
+ Text submitted to NCBO Annotator+ must be in English.
+ sample_text: Melanoma is a malignant tumor of melanocytes found mainly in the skin but also in the intestine and the eye.
+ title: NCBO Annotator +
+ insert_sample_text: Insert sample text
+ match_longest_only: Match longest only
+ match_partial_words: Match partial words
+ recognizer: Entity recognition
+ score_help: Score annotations following previous NCBO 2009 measure (old) or Score
+ annotations following C-Value measure (cvalue) or Score annotations following
+ C-Value measure with hierarchy expansion (cvalueh)
+ select: Select %{name}
+ select_ontologies: Start typing to select ontologies or leave blank to use all
+ ontologies
+ select_ontologies_list: Select ontologies
+ show_advanced_options: Show advanced options
+ start_typing_to_select: Start typing to select %{type} or leave blank to use all
+ umls:
+ semantic_groups: UMLS Semantic Groups
+ semantic_types: UMLS Semantic Types
+ negation: negation
+ none: none
+
+ ontologies:
+ ontology_search_prompt: 'Search an ontology or a term (e.g., plant height)'
+ self: Ontologies
+
+ ontology: Ontology
+ ontology_details:
+ concept:
+ definitions: Definitions
+ id: ID
+ in_schemes: In schemes
+ member_of: Member of
+ no_preferred_name_for_selected_language: No preferred name for selected language.
+ obsolete: Obsolete
+ preferred_name: Preferred name
+ synonyms: Synonyms
+ type: Type
+ metadata:
+ additional_metadata: Additional Metadata
+ header:
+ last_submission_date: Last submission date
+ ontology_sets: Ontology sets
+ output: Output
+
+ projects:
+ contacts: Contacts
+ create_new_project: Create new project
+ created: Created
+ creator: User
+ delete_admin_only: Delete (admin only)
+ delete_confirm: Are you sure?
+ description: Description
+ description_text: Description text
+ edit: Edit
+ home_page: Home page
+ index:
+ intro: Browse a selection of projects that use %{site} ontologies
+ institutions: Institutions
+ ontologies: Ontologies
+ project_description: Project Description
+ self: Projects
+ title: Projects List
+ view_projects_help: View projects help
+
+ recommender:
+ intro: Get recommendations for the most relevant ontologies from an excerpt of text or a list of keywords
+ no_recommendations: No recommendations found
+ no_sets_recommended: There are no recommended ontology sets for the provided input. Please try the 'Ontologies' output.
+ ontology_recommendation_input: Please paste a paragraph of text or some keywords to compute ontology recommendations.
+ ontology_recommender: Recommender
+ paste_text_recommendations: Paste a paragraph of text or some keywords separated by commas to compute ontology recommendations
+ recommendation_error: Problem computing recommendations, please try again.
+ text_length_limit: Please use less than 500 words. If you need to annotate longer pieces of text, you can use the recommendation wWb service.
+ title: Recommender
+ valid_integer_max_ontologies_per_set: Max ontologies per set must be a valid integer
+ value
+ valid_max_ontologies_per_set_range: Max ontologies per set must be a number between
+ 2 and 4
+ valid_numeric_weights: All weights must be valid numeric values
+ weight_sum_greater_than_zero: The sum of weights must be greater than zero
+ weights_greater_than_zero: All weights must be greater than or equal to zero
+
+ register:
+ account_errors: 'Errors creating your account:'
+ confirm_password: Confirm password
+ create_account: Create new account
+ email: Email
+ first_name: First name
+ last_name: Last name
+ mailing_list: Register to the %{site}'s mailing list
+ optional: "(Optional)"
+ password: Password
+ title: Register
+ username: Username
+
+ reproduce_results: 'Reproduce these results using the '
+ score: Score
+
+ search:
+ categories: Categories
+ class_search: Class Search
+ classes_with_definitions: Classes with definitions
+ hide_advanced_options: Hide advanced pptions
+ include_in_search: Include in search
+ index:
+ categories_placeholder: Start typing to select categories or leave blank to
+ use all
+ obsolete_definition: 'A class that the ontology authors have flagged as obsolete
+ and recommend not to use. These classes are often left in ontologies (rather
+ than being deleted entirely) so that existing systems that depend on them
+ continue to function."
- category: Category
- group: Group
- size: size
- ontology_content: Ontology content
- natural_language: Natural language
- formality_levels: Formality levels
- is_of_type: Is of type
- missing_status: Missing Status
- types: Types
- artifacts: Artifacts
- formats: formats
- selected_ontologies: Selected ontologies
- all: "All"
- none: "none"
- keywords: "Keywords"
- keywords_separated_by_commas: "Keywords separated by commas"
- see_details: "See details"
- view_fair_scores_definitions: "View fair scores definitions"
- get_json_version: "Get the json version"
- select_ontologies: "Start typing to select ontologies or leave blank to use them all"
- clear_selection: "Clear Selection"
- select_from_list: "Select from list"
- more: "More"
- statistics: "Statistics"
- average: "Average"
- min: "Min"
- max: "Max"
- median: "Median"
- slices: "Slices"
- help: "Help"
- or: "Or"
- show_advanced_options: "Show advanced options"
- insert_sample_text: "Insert sample text"
- class: "Class"
- filter: "Filter"
- ontology: "Ontology"
- type: "Type"
- context: "Context"
- umls_sem_type: "UMLS Sem Type"
- matched_ontology: "matched ontology"
- matched_class: "Matched class"
- score: "Score"
- negation: "negation"
- experience: "Experience"
- temporality: "Temporality"
- certainty: "Certainty"
- format_results: "Format results as "
- reproduce_results: "Reproduce these results using the "
- additional_parameters: "Additional Parameters Explained at "
- input: "Input"
- text: "Text"
- output: "Output"
- ontology_sets: "Ontology sets"
- insert_sample_input: "Insert sample input"
- weights_configuration: "Weights Configuration"
- coverage: "Coverage"
- accept: "Accept"
- knowledge_detail: "Knowledge Detail"
- specialization: "Specialization"
- max_ontologies_per_set: "Maximum number of ontologies per set"
- paste_input_text: "Paste a paragraph of text or keywords to use in calculating ontology recommendations"
- get_recommendations: "Get recommendations"
- select_ontologies_list: "Select ontologies"
+ '
+ property_definition: A named association between two entities. Examples are
+ 'definition' (a relationship between a class and text) and 'part of' (a relationship
+ between two classes).
+ search_keywords_placeholder: Enter a term, e.g. Melanoma
+ narrow_search_to: Narrow search to
+ obsolete_classes: Obsolete classes
+ ontologies: Ontologies
+ ontology_views: Ontology views
+ property_values: Property values
+ show_advanced_options: Show advanced options
+ title: Search
+ view_search_documentation: View search documentation
+
+ select_from_list: Select from list
+ select_ontologies: Start typing to select ontologies or leave blank to use them all
+ select_ontologies_list: Select ontologies
+ show_advanced_options: Show advanced options
+ specialization: Specialization
+ temporality: Temporality
+ text: Text
+ type: Type
+ umls_sem_type: UMLS Semantic Type
+ view_fair_scores_definitions: View FAIR scores definitions
+ visits: Visits
+ weights_configuration: Weights configuration
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
new file mode 100644
index 000000000..78d888ff9
--- /dev/null
+++ b/config/locales/fr.yml
@@ -0,0 +1,413 @@
+---
+fr:
+ activerecord:
+ errors:
+ models:
+ license:
+ attributes:
+ encrypted_key:
+ invalid_license_key: est une clé de licence invalide.
+ no_appliance_id_for_comparison: n'a pas pu être validé. Impossible de récupérer l'ID de l'appliance virtuelle.
+ appliance_id_mismatch: ne correspond pas à l'ID de l'appliance virtuelle.
+
+ date:
+ formats:
+ year_month_day_concise: "%d-%m-%Y" # 01-03-2017
+ month_day_year: "%-d %b %Y" # 1 Mar 2017
+ monthfull_day_year: "%-d %B %Y" # 1 March 2017
+
+ acceptance: Acceptation
+ additional_parameters: 'Paramètres supplémentaires expliqués à '
+ admin:
+ licenses:
+ create:
+ success: Licence renouvelée avec succès !
+
+ all: Tout
+
+ annotator:
+ annotate_text_prompt: Saisissez ou collez le texte à annoter
+ annotations_result: Annotations
+ fast_context: FastContext
+ filters:
+ confidence_threshold: Seuil de confiance
+ confidence_threshold_help: Spécifiez la position minimale dans la distribution
+ des scores (entre 1 et 100).
+ exclude_numbers: Exclure les nombres
+ exclude_synonyms: Exclure les synonymes
+ include_mappings: Inclure les alignements
+ match_longest_only: Reconnaître les mots les plus long uniquement
+ match_partial_words: Reconnaître les mots partiels
+ max_hierarchy_level: Inclure les ancêtres jusqu'au niveau
+ score: Inclure le score
+ score_help: Score des annoations suivant la mesure originale NCBO 2009 (ancienne)
+ ou Score des annoations suivant la mesure C-Value (cvalue) ou Score des annoations
+ suivant la mesure C-Value avec expansion de la hiérarchie (cvalueh).
+ score_threshold: Seuil de score
+ score_threshold_help: Spécifiez la valeur de score minimum pour les annotations.
+ get_annotator: Obtenir les annotations
+ index:
+ fast_context:
+ tooltip: 'Activez FastContext pour détecter : si un concept est négatif (affirmé,
+ nié), qui a vécu le concept trouvé (patient, autre), quand le concept annoté
+ s''est-il produit (récent, historique, hypothétique), et/ou si le concept annoté
+ est incertain (certain, incertain).'
+ intro: Obtenez des annotations avec des classes des ontologies
+ lemmatize:
+ tooltip: Activez Lemmatize pour lemmatiser le texte soumis et utiliser un
+ dictionnaire lemmatisé pour les annotations
+ sample_text: Le mélanome est une tumeur maligne des mélanocytes qui se trouvent
+ principalement dans la peau mais aussi dans l'intestin et l'œil.
+ lemmatize: Lemmatiser
+ results_filtered_by: Les résultats sont filtrés par
+ select: Sélectionnez %{name}
+ start_typing_to_select: Commencez à taper pour sélectionner %{type} ou laissez vide pour tout utiliser
+ title: Annotateur
+ umls:
+ semantic_groups: Groupes sémantiques UMLS
+ semantic_types: Types sémantiques UMLS
+
+ certainty: Certitude
+ class: Classe
+ clear_selection: Effacer la sélection
+ concepts:
+ request_term:
+ new_term_instructions: |
+ Cette ontologie s'intègre à OntoloBridge, permettant aux utilisateurs de la communauté de suggérer des ajouts à l'ontologie publique. Remplissez le modèle ci-dessous pour soumettre une demande de terme directement au responsable de l'ontologie.
+
+ Libellé du terme (obligatoire)
Nom du terme suggéré. Si un terme peut être décrit avec plusieurs synonymes, n'indiquez ici que le nom préféré.
+
+
+ Description du terme (obligatoire)
Une brève définition, description ou utilisation du terme suggéré. Des synonymes de termes supplémentaires peuvent être répertoriés dans cette section.
+
+
+ Superclasse (obligatoire)
Le terme parent du terme suggéré. Le terme parent doit être une entrée existante de l'ontologie actuelle. La superclasse peut être sélectionnée directement à partir de l'arborescence des classes.
+
+
+ Références (facultatif)
Fournissez des preuves de l'existence du terme demandé, telles que les identifiants d'articles ou des liens vers d'autres ressources décrivant le terme.
+
+
+ Justification (facultatif)
Fournissez ici toute information supplémentaire sur le terme demandé.
+
+ context: Contexte
+ coverage: Couverture
+ experiencer: Experiencer
+ filter: Filtre
+ format_results: 'Formater les résultats en '
+ get_json_version: Obtenir la version json
+ get_recommendations: Obtenir des recommandations
+ help: Aide
+
+ home:
+ agroportail_figures: "%{site} en chiffres"
+ benefit1: Découvrez de nouvelles perspectives et connaissances en explorant d'autres ontologies ou resources sémantiques dans le portail.
+ benefit2: Contribuez au partage des connaissances et à l’interopérabilité sémantique dans votre domaine.
+ benefit3: Alignez votre ontologie avec d'autres ontologies du domaine et collaborez avec d'autres utilisateurs.
+ benefit4: Obtenez des commentaires et des suggestions d'autres utilisateurs qui peuvent utiliser et commenter votre ontologie.
+ benefit5: Décrivez précisément votre ontologie avec des métadonnées pertinentes et obtenez un score de "FAIRness" pour votre ontologie.
+ fair_details: Voir détails
+ fairness: Score FAIR
+ get_annotations: Obtenir des annotations
+ get_recommendations: Obtenir des recommandations
+ index:
+ tagline: L'hôte des ontologies et des artefacts sémantiques dans l’agroalimentaire et les domaines connexes.
+ title: Bienvenue sur %{site}
+ welcome: Bienvenue sur %{site},
+ ontology_upload: Voulez-vous charger une ontologie ?
+ ontology_upload_benefits: 'En chargeant et partageant votre ontologie sur %{site}, vous pouvez :'
+ ontology_upload_button: Charger une ontologie
+ ontology_upload_desc: Charger une ontologie ou un autre type d'artefact sémantique (vocabulaire, terminologie, thésaurus, ...) est un moyen de partager vos connaissances avec d'autres.
+ paste_text_prompt: Collez un paragraphe de texte ou quelques mots-clés...
+ recommender_annotator: Recommandeur et Annotateur
+ supported_by: Avec le soutien de
+ twitter_news: Actualités
+ with_collaboration: Une collaboration de
+
+ input: Entrée
+ insert_sample_text: Insérez un exemple de texte
+ keywords: Mots-clés
+ keywords_separated_by_commas: Mots-clés séparés par des virgules
+ knowledge_detail: Détail de la connaissance
+
+ landscape:
+ average_metrics: Métriques moyennes
+ category: catégorie
+ filter_network: Filtrer le réseau
+ funding_endorsing_organizations: Organisations qui financent et soutiennent
+ le plus grand nombre d'ontologies
+ group: groupe
+ groups_and_categories: Groupes et catégories
+ intro: Visualiser le panorama des ontologies et autres resources sémantiques de %{site} via l'aggrégation des métadonnées.
+ more_properties_charts: Plus de graphiques de propriétés
+ most_active_ontologies: Ontologies les plus actives
+ most_active_organizations: Organisations les plus actives
+ most_active_people: Personnes les plus actives
+ most_active_people_as_reviewer: Comptes utilisateurs les plus actifs
+ most_mentioned_people: Personnes les plus mentionnées en tant que contact, créateur, contributeur ou curateur
+ most_mentioned_people_as_reviewer: Comptes utilisateurs ayant publié des notes, des avis et des projets
+ ontologies_activity_on: Activité autour des ontologies
+ ontologies_by: Ontologies par %{type}
+ ontologies_contributors: Contributeurs au développement des ontologies
+ ontologies_count_by_catalog: Nombre d'ontologies dans chaque catalogue d'artéfacts sémantiques
+ ontologies_formats: Language de representation
+ ontologies_languages: Langues
+ ontologies_licenses: Licences
+ ontologies_with_notes_reviews_projects: Ontologies avec des notes, des évaluations et des projets
+ ontology_fairness_evaluator: Évaluateur du niveau de FAIRness des ontologies (O’FAIRe)
+ ontology_formality_levels: Niveaux de formalité
+ ontology_properties_pie_charts: Diagrammes liés aux propriétés de description d'objet (i.e., les propriétés de métadonnées utilisées pour décrire les objets des ontologies).
+ ontology_relations_network: Réseau des relations entre ontologies
+ ontology_tools: Outils les plus utilisés pour construire des ontologies
+ owl_ontology_author_uris: Propriétés utilisées pour spécifier l'auteur de l'objet
+ owl_ontology_definition_uris: Propriétés utilisées pour spécifier la définition de l'objet
+ owl_ontology_preflabel_uris: Propriétés utilisées pour spécifier le nom préféré de l'objet
+ owl_ontology_synonym_uris: Propriétés utilisées pour spécifier les synonymes de l'objet
+ properties_usage_proportion: Diagrammes liés aux valeurs les plus fréquentes pour certaines propriétés de métadonnées
+ properties_use: Utilisation des propriétés
+ relations_between_stored_ontologies: Ensemble des relations entre les ontologies stockées de %{site} tel que capturées par les métadonnées. Les ontologies en vertes sont stockées dans le portail tandis que celles en bleus sont des resources extérieures.
+ size: taille
+ title: "Panorama"
+
+ layout:
+ header:
+ account_setting: Paramètres du compte
+ annotator: Annotateur
+ browse: Parcourir
+ documentation: Documentation
+ help: Aide
+ landscape: Panorama
+ login: Connexion
+ logout: Décconnexion
+ mappings: Alignements
+ publications: Publications
+ recommender: Recommendeur
+ release_notes: Notes de version
+ search_prompt: Rechercher dans %{portal_name} ...
+ submit_feedback: Envoyer un commentaire
+ support: Assistance
+ cite_us: Citez-nous
+ footer:
+ products: Produits
+ ontoportal: OntoPortal
+ release_notes: Notes de version
+ api: API
+ sparql: SPARQL
+ support: Assistance
+ contact_us: Contactez nous
+ wiki: Wiki
+ documentation: Documentation
+ agreements: Juridique
+ terms: Termes et Conditions
+ privacy_policy: Politique de confidentialité
+ cite_us: Citez-nous
+ acknowledgments: Remerciements
+ about: À propos
+ about_us: À propos de nous
+ projects: D2KAB
+ team: Équipe
+
+ login:
+ enter_email: Saisissez votre nom d'utilisateur
+ enter_password: Saisissez votre mot de passe
+ forgot_password: Mot de passe oublié ?
+ invalid_login: Erreurs sur le formulaire
+ no_account: Vous n'avez pas de compte ?
+ password: Mot de passe
+ register: S'inscrire
+ title: Connexion
+ username_or_email: Nom d'utilisateur
+
+ mappings:
+ find_mappings: Trouver les alignements d'une classe ou d'un concept
+ intro: Trouver tous les alignements d'une ontologie
+ loading_mappings: Chargement des alignements...
+ mappings_bulk_load: Charger des alignements via un fichier source
+ no_mappings_available: Aucune correspondance disponible
+ title: Alignements
+ upload_mappings: Charger des alignements
+
+ matched_class: Classe correspondante
+ matched_ontology: ontologie correspondante
+ max_ontologies_per_set: Nombre maximum d'ontologies par ensemble
+
+ nbco_annotatosplus:
+ annotations: Annotations
+ enter_paste_text_to_annotate: 'Saisissez ou collez le texte à annoter'
+ exclude_numbers: Exclure les nombres
+ exclude_synonyms: Exclure les synonymes
+ fast_context:
+ help: 'Activez FastContext pour détecter : si un concept est négatif (affirmé,
+ nié), qui a vécu le concept trouvé (patient, autre), quand le concept annoté
+ s''est-il produit (récent, historique, hypothétique), et/ou si le concept annoté
+ est incertain (certain, incertain).'
+ title: FastContext
+ filters:
+ additional_parameters_explained_at: 'Des paramètres supplémentaires sont expliqués
+ à la page :'
+ by:
+ certainty: Certitude
+ class: Classe
+ experiencer: Personne concerné
+ filter: Filtrer
+ match_context: Contexte
+ match_type: Type
+ matched_class: Classe associée
+ matched_ontology: Ontologie associée
+ negation: Négation
+ ontology: Ontologie
+ score: Score
+ temporality: Temporalité
+ title: Les résultats sont filtrés par
+ umls_sem_type: Type sémantique UMLS
+ confidence_threshold: Seuil de confiance
+ confidence_threshold_help: Spécifiez la position minimale dans la distribution des scores (entre 1 et 100)
+ format_results_as: 'Formater les résultats en tant que :'
+ reproduce_results_using: Reproduire ces résultats en utilisant le
+ score_threshold: Seuil de score
+ score_threshold_help: Spécifiez la valeur de score minimum pour les annotations.
+ include_ancestors_up_to_level: Inclure les ancêtres jusqu'au niveau
+ include_mappings: Inclure les alignements
+ include_score: Inclure le score
+ index:
+ intro: |
+ Le NCBO Annotator+ est un proxy appelant le service Web NCBO Annotator du NCBO BioPortal.
+
+ Tchechmedjiev, A., Abdaoui, A., Emonet, V., Melzi, S., Jonnagaddala, J., & Jonquet, C. (2018). Fonctionnalités améliorées pour annoter et indexer le texte clinique avec NCBO Annotator+. Bioinformatique, 34(11), 1962-1965.
+
+ Si vous utilisez l'API, veuillez fournir une clé d'API pour le NCBO BioPortal valide et accéder au service via http://services.bioportail.lirmm.fr/ncbo_annotatorplus
+ Le texte soumis au NCBO Annotator+ doit être en anglais.
+ sample_text: Le mélanome est une tumeur maligne des mélanocytes qui se trouvent principalement dans la peau mais aussi dans l'intestin et l'œil.
+ title: NCBO Annotator +
+ insert_sample_text: Insérer un exemple de texte
+ match_longest_only: Reconnaître les mots les plus long uniquement
+ match_partial_words: Reconnaître les mots partiels
+ recognizer: Reconnaissance d'entité
+ score_help: Score des annoations suivant la mesure originale NCBO 2009 (ancienne)
+ ou Score des annoations suivant la mesure C-Value (cvalue) ou Score des annoations
+ suivant la mesure C-Value avec expansion de la hiérarchie (cvalueh).
+ select: Sélectionnez %{name}
+ select_ontologies: Commencez à taper pour sélectionner des ontologies ou laissez
+ vide pour utiliser toutes les ontologies
+ select_ontologies_list: Sélectionnez les ontologies
+ show_advanced_options: Affichez les options avancées
+ start_typing_to_select: Commencez à taper pour sélectionner %{type} ou laissez vide pour tout utiliser
+ umls:
+ semantic_groups: Groupes sémantiques UMLS
+ semantic_types: Types sémantiques UMLS
+ negation: négation
+ none: aucune
+
+ ontologies:
+ ontology_search_prompt: 'Recherchez une ontologie ou un terme (e.g., hauteur de la plante)'
+ self: Ontologies
+
+ ontology: Ontologie
+ ontology_details:
+ concept:
+ definitions: Définitions
+ id: Identifiant
+ in_schemes: Dans les schémas
+ member_of: Membre de
+ no_preferred_name_for_selected_language: Pas de nom préféré pour la langue sélectionnée.
+ obsolete: Obsolète
+ preferred_name: Nom préféré
+ synonyms: Synonymes
+ type: Type
+ metadata:
+ additional_metadata: Métadonnées supplémentaires
+ header:
+ last_submission_date: Date de la dernière soumission
+ ontology_sets: Ensembles d'ontologies
+ output: Sortie
+
+ projects:
+ contacts: Contacts
+ create_new_project: Créer un nouveau projet
+ created: Créé
+ creator: Utilisateur
+ delete_admin_only: Supprimer (administrateur seulement)
+ delete_confirm: Êtes-vous sûr(e) ?
+ description: Description
+ description_text: Texte de description
+ edit: Modifier
+ home_page: Page d'accueil
+ index:
+ intro: Parcourez une sélection de projets qui utilisent les ontologies de %{site}
+ institutions: Institutions
+ ontologies: Ontologies
+ project_description: Description du projet
+ self: Projets
+ title: Liste de projets
+ view_projects_help: Aide à la visualisation des projets
+
+ recommender:
+ intro: Obtenez des recommandations d'ontologies les plus pertinentes à partir d'un extrait d'un texte ou d'une liste de mots-clés
+ no_recommendations: Aucune recommandation trouvée
+ no_sets_recommended: Il n'y a pas d'ensembles d'ontologies recommandés pour l'entrée fournie. Veuillez essayer la sortie 'Ontologies'.
+ ontology_recommendation_input: Saisissez un paragraphe de texte ou quelques mots-clés pour calculer les recommandations d'ontologie.
+ ontology_recommender: Recommandeur
+ paste_text_recommendations: Collez un paragraphe de texte ou quelques mots-clés séparés par des virgules à utiliser pour calculer les recommandations d'ontologie
+ recommendation_error: Problème lors du calcul des recommandations, veuillez réessayer.
+ text_length_limit: Veuillez utiliser moins de 500 mots. Si vous devez annoter de plus grands morceaux de texte, vous pouvez utiliser le service Web de recommandation.
+ title: Recommandeur
+ valid_integer_max_ontologies_per_set: Le nombre maximum d'ontologies par ensemble doit être une valeur entière valide
+ valid_max_ontologies_per_set_range: Le nombre maximum d'ontologies par ensemble doit être un nombre entre 2 et 4
+ valid_numeric_weights: Tous les poids doivent être des valeurs numériques valides
+ weight_sum_greater_than_zero: La somme des poids doit être supérieure à zéro
+ weights_greater_than_zero: Tous les poids doivent être supérieurs ou égaux à zéro
+
+ register:
+ account_errors: 'Erreurs lors de la création de votre compte :'
+ confirm_password: Confirmer le mot de passe
+ create_account: Créer un nouveau compte
+ email: Email
+ first_name: Prénom
+ last_name: Nom
+ mailing_list: S'inscrire à la liste de diffusion de %{site}
+ optional: "(Facultatif)"
+ password: Mot de passe
+ title: S'inscrire
+ username: Nom d'utilisateur
+
+ reproduce_results: 'Reproduisez ces résultats en utilisant le '
+ score: Score
+
+ search:
+ categories: Catégories
+ class_search: Recherche de classe
+ classes_with_definitions: Classes avec définitions
+ hide_advanced_options: Masquer les options avancées
+ include_in_search: Inclure dans la recherche
+ index:
+ categories_placeholder: Commencez à taper pour sélectionner des catégories ou
+ laissez vide pour tout utiliser
+ obsolete_definition: 'Une classe que les auteurs de l''ontologie ont signalée
+ comme étant obsolète et qu''ils recommandent de ne pas utiliser. Ces classes
+ sont souvent laissées dans des ontologies (plutôt que de les supprimer entièrement)
+ afin que les systèmes existants qui en dépendent continuent à fonctionner.
+
+ '
+ property_definition: Association nommée entre deux entités. Les exemples sont
+ "définition" (une relation entre une classe et du texte) et "partie de" (une
+ relation entre deux classes).
+ search_keywords_placeholder: Entrez un terme, e.g., leaf area
+ narrow_search_to: Réduire la recherche à
+ obsolete_classes: Classes obsolètes
+ ontologies: Ontologies
+ ontology_views: Vues d'ontologie
+ property_values: Valeurs de propriété
+ show_advanced_options: Afficher les options avancées
+ title: Rechercher
+ view_search_documentation: Voir la documentation de recherche
+ select_from_list: Sélectionner dans la liste
+ select_ontologies: Commencez à taper pour sélectionner des ontologies ou laissez vide pour toutes les utiliser
+ select_ontologies_list: Sélectionnez les ontologies
+ show_advanced_options: Afficher les options avancées
+ specialization: Spécialisation
+ temporality: Temporalité
+ text: Texte
+ type: Type
+ umls_sem_type: Type Semantique UMLS
+ view_fair_scores_definitions: Voir les définition des scores de FAIRness
+ visits: Visites
+ weights_configuration: Configuration des poids
diff --git a/config/locales/it.yml b/config/locales/it.yml
new file mode 100644
index 000000000..107542219
--- /dev/null
+++ b/config/locales/it.yml
@@ -0,0 +1,402 @@
+---
+it:
+ activaterecord:
+ errors:
+ models:
+ license:
+ attributes:
+ encrypted_key:
+ invalid_license_key: is an invalid license key
+ no_appliance_id_for_comparison: Could not be validated. Unable to retrieve virtual appliance ID.
+ appliance_id_mismatch: is an appliance id mismatch
+
+ date:
+ formats:
+ year_month_day_concise: "%Y-%m-%d" # 2017-03-01
+ month_day_year: "%b %-d, %Y" # Mar 1, 2017
+ monthfull_day_year: "%B %-d, %Y" # March 1, 2017
+
+ additional_parameters: Parametri aggiuntivi spiegati in
+ admin:
+ licenses:
+ create:
+ success: Licenza rinnovata con successo!
+ all: Tutti
+ annotator:
+ annotate_text_prompt: Inserire o incollare il testo da annotare
+ annotations_result: Annotazioni
+ fast_context: Contesto veloce
+ filters:
+ confidence_threshold: Soglia di confidenza del filtro
+ confidence_threshold_help: Specificare la posizione minima nella distribuzione
+ dei punteggi (tra 1 e 100)
+ exclude_numbers: Escludere i numeri
+ exclude_synonyms: Escludere sinonimi
+ include_mappings: Includere le mappature
+ match_longest_only: Solo la partita più lunga
+ match_partial_words: Riconoscere parole parziali
+ max_hierarchy_level: Includere gli antenati fino al livello
+ score: Includere il punteggio
+ score_help: Punteggio delle annotazioni secondo la precedente misura NCBO 2009
+ (old) o Punteggio delle annotazioni secondo la misura C-Value (cvalue) o Punteggio
+ delle annotazioni secondo la misura C-Value con espansione gerarchica (cvalueh)
+ score_threshold: Filtrare per soglia di punteggio
+ score_threshold_help: Specificare il valore minimo del punteggio per le annotazioni
+ get_annotator: Ottenere le annotazioni
+ index:
+ fast_context:
+ tooltip: 'Abilita FastContext a rilevare: se un concetto è stato negato (affermato,
+ negato), chi ha sperimentato il concetto trovato (paziente, altro), quando
+ si è verificato il concetto annotato (recente, storico, ipotetico), e/o
+ se il concetto annotato è incerto (certo, incerto).'
+ intro: Ottenere annotazioni per un testo biomedico con classi ontologiche
+ lemmatize:
+ tooltip: Abilita Lemmatize per lemmatizzare il testo inviato e utilizzare
+ un dizionario lemmatizzato per le annotazioni
+ sample_text: Il melanoma è un tumore maligno dei melanociti che si trova principalmente
+ nella pelle, ma anche nell'intestino e nell'occhio.
+ lemmatize: Lemmatizzare
+ results_filtered_by: I risultati sono filtrati da
+ select: Selezionare %{name}
+ start_typing_to_select: Iniziare a digitare per selezionare %{type} o lasciare
+ in bianco per utilizzare tutti i dati
+ title: Annotatore
+ umls:
+ semantic_groups: Gruppi semantici UMLS
+ semantic_types: Tipi semantici UMLS
+ certainty: Certezza
+ class: Classe
+ clear_selection: Azzeramento della selezione
+ concepts:
+ request_term:
+ new_term_instructions: |
+ Questa ontologia si integra con OntoloBridge, permettendo agli utenti della comunità di suggerire aggiunte all'ontologia pubblica. Compilare il modello sottostante per inviare una richiesta di termine direttamente al gestore dell'ontologia.
+
+ Etichetta del termine (obbligatorio)
Nome del termine suggerito. Se un termine può essere descritto con più di un sinonimo, inserire qui solo il nome preferito.
+
+
+ Descrizione del termine (obbligatorio)
Breve definizione, descrizione o uso del termine suggerito. In questa sezione si possono elencare i sinonimi di altri termini.
+
+
+ Superclasse (obbligatorio)
Il termine padre del termine suggerito. Il termine genitore deve essere una voce esistente nell'ontologia corrente. La superclasse può essere selezionata direttamente dall'albero delle classi del Bioportale.
+
+
+ Riferimenti (facoltativo)
Fornire prove dell'esistenza del termine richiesto, come ID Pubmed di articoli o link ad altre risorse che descrivono il termine.
+
+
+ Giustificazione (opzionale)
Fornisci qui qualsiasi informazione aggiuntiva sul termine richiesto.
+
+ context: Contesto
+ coverage: Copertura
+ filter: Filtro
+ format_results: Formatta i risultati come
+ get_json_version: Ottenere la versione json
+ get_recommendations: Raccomandazioni
+ help: Aiuto
+ home:
+ agroportal_figures: "%{site} in cifre:"
+ benefit1: Scoprite nuove intuizioni e connessioni esplorando le altre ontologie
+ presenti nel repository.
+ benefit2: Contribuite alla crescita e allo sviluppo del vostro dominio aggiungendo
+ nuovi concetti e categorie.
+ benefit3: Utilizzate il controllo di versione per gestire le modifiche alla vostra
+ ontologia nel tempo e collaborare con altri utenti.
+ benefit4: Ottenere feedback e suggerimenti da altri utenti che possono rivedere
+ e commentare la vostra ontologia.
+ benefit5: Ottenere il punteggio e le metriche FAIR per l'ontologia.
+ fair_details: Vedi dettagli
+ fairness: Punteggi FAIR
+ get_annotations: Ottenere le annotazioni
+ get_recommendations: Raccomandazioni
+ index:
+ tagline: La casa dei vocabolari e delle ontologie in agronomia e nei campi correlati.
+ title: Benvenuti alla %{site}
+ welcome: Benvenuti al %{site},
+ ontology_upload: Volete caricare un'ontologia?
+ ontology_upload_benefits: 'Caricando la propria ontologia su %{site}, è possibile:'
+ ontology_upload_button: Caricare l'ontologia
+ ontology_upload_desc: Caricare un'ontologia è un modo per condividere la propria
+ conoscenza del dominio con altri.
+ paste_text_prompt: Incollare un paragrafo di testo o alcune parole chiave ...
+ recommender_annotator: Raccomandatore e annotatore
+ supported_by: Supportato da
+ twitter_news: Notizie
+ with_collaboration: Con la collaborazione di
+ input: Ingresso
+ insert_sample_text: Inserire un testo di esempio
+ keywords: Parole chiave
+ keywords_separated_by_commas: Parole chiave separate da virgole
+ knowledge_detail: Dettaglio della conoscenza
+ landscape:
+ average_metrics: Metriche medie
+ category: Categoria
+ filter_network: Rete di filtraggio
+ funding_endorsing_organizations: Organizzazioni che finanziano e sostengono il
+ maggior numero di ontologie
+ group: Gruppo
+ groups_and_categories: Gruppi e categorie
+ intro: Visualizzare i dati recuperati dalle ontologie memorizzate nel portale
+ more_properties_charts: Altri grafici delle proprietà
+ most_active_ontologies: Le ontologie più attive
+ most_active_organizations: Le organizzazioni più attive
+ most_active_people: Le persone più attive
+ most_active_people_as_reviewer: Le persone più attive come recensori
+ most_mentioned_people: Le persone più citate come contatto, creatore, collaboratore
+ o curatore
+ most_mentioned_people_as_reviewer: Persone che hanno pubblicato note, recensioni
+ e progetti
+ ontologies_activity_on: Attività ontologica su %{site}
+ ontologies_by: Ontologie per %{type}
+ ontologies_contributors: Contribuenti allo sviluppo dell'ontologia
+ ontologies_count_by_catalog: Numero di ontologie in ogni catalogo di dati
+ ontologies_formats: Formato utilizzato
+ ontologies_languages: Linguaggi naturali delle ontologie
+ ontologies_licenses: Licenze utilizzate dalle ontologie
+ ontologies_with_notes_reviews_projects: Ontologie con note, recensioni e progetti
+ ontology_fairness_evaluator: Valutatore di ontologia FAIR (O'FAIRe)
+ ontology_formality_levels: Livelli di formalità delle ontologie
+ ontology_properties_pie_charts: Grafici a torta per le proprietà utilizzate nelle
+ ontologie
+ ontology_relations_network: Rete di relazioni ontologiche
+ ontology_tools: Strumenti più utilizzati per costruire ontologie
+ owl_ontology_author_uris: URI per le proprietà dell'autore utilizzate per le ontologie
+ OWL
+ owl_ontology_definition_uris: URI per le proprietà di definizione utilizzate per
+ le ontologie OWL
+ owl_ontology_preflabel_uris: URI per le proprietà prefLabel utilizzate per le
+ ontologie OWL
+ owl_ontology_synonym_uris: URI per le proprietà dei sinonimi utilizzati per le
+ ontologie OWL
+ properties_usage_proportion: La percentuale di utilizzo delle proprietà tra le
+ ontologie memorizzate
+ properties_use: Uso della proprietà
+ relations_between_stored_ontologies: Relazioni tra le ontologie memorizzate nel
+ portale
+ size: Dimensione
+ title: "%{site} Paesaggio"
+ layout:
+ header:
+ account_setting: Impostazioni dell'account
+ annotator: Annotatore
+ browse: Sfogliare
+ documentation: Documentazione
+ help: Aiuto
+ landscape: Paesaggio
+ login: Accesso
+ logout: logout
+ mappings: Mappature
+ publications: Pubblicazioni
+ release_notes: Note di rilascio
+ search_prompt: Cerca in %{portal_name} ...
+ submit_feedback: Invia un feedback
+ support: supporto
+ login:
+ enter_email: Inserisci il tuo indirizzo e-mail
+ enter_password: Inserire la password
+ forgot_password: Hai dimenticato la password?
+ invalid_login: Errori nel modulo
+ no_account: Non avete un account?
+ password: Password
+ register: Registro
+ title: Accesso
+ username_or_email: Nome utente o e-mail
+ mappings:
+ find_mappings: Trovare le mappature di una classe/concetto
+ intro: Sfogliare le mappature tra classi di diverse ontologie
+ loading_mappings: Caricamento delle mappature...
+ mappings_bulk_load: Mappatura del carico massivo
+ no_mappings_available: Nessuna mappatura disponibile
+ title: Corrispondenze
+ upload_mappings: Caricare le mappature
+ matched_class: Classe abbinata
+ matched_ontology: ontologia abbinata
+ max_ontologies_per_set: Numero massimo di ontologie per set
+ nbco_annotatosplus:
+ annotations: Annotazioni
+ enter_paste_text_to_annotate: 'Inserire o incollare il testo da annotare:'
+ exclude_numbers: Escludere i numeri
+ exclude_synonyms: Escludere sinonimi
+ fast_context:
+ help: 'Attivare FastContext per rilevare: se un concetto è stato negato (affermato,
+ negato), chi ha sperimentato il concetto trovato (paziente, altro), quando
+ si è verificato il concetto annotato (recente, storico, ipotetico), e/o se
+ il concetto annotato è incerto (certo, incerto).'
+ title: Contesto veloce
+ filters:
+ additional_parameters_explained_at: 'Ulteriori parametri sono spiegati nella
+ pagina:'
+ by:
+ certainty: Certezza
+ class: Classe
+ experiencer: Esperto
+ filter: Filtro
+ match_context: Contesto
+ match_type: Tipo
+ matched_class: Classe associata
+ matched_ontology: Ontologia associata
+ negation: Negazione
+ ontology: Ontologia
+ score: Punteggio
+ temporality: Temporalità
+ title: I risultati sono filtrati da
+ umls_sem_type: Tipo semantico UMLS
+ confidence_threshold: Soglia di fiducia del filtro
+ confidence_threshold_help: Specificare la posizione minima nella distribuzione
+ dei punteggi (tra 1 e 100)
+ format_results_as: 'Formattare i risultati come:'
+ reproduce_results_using: Riprodurre questi risultati utilizzando il metodo
+ score_threshold: Filtrare per soglia di punteggio
+ score_threshold_help: Specificare il valore minimo del punteggio per le annotazioni
+ include_ancestors_up_to_level: Includere gli antenati fino al livello
+ include_mappings: Includere le mappature
+ include_score: Includere il punteggio
+ index:
+ intro: |
+ NCBO Annotator+ è un proxy che chiama il servizio web NCBO Annotator sul BioPortale NCBO.
+
+ Tchechmedjiev, A., Abdaoui, A., Emonet, V., Melzi, S., Jonnagaddala, J., & Jonquet, C. (2018). Funzioni migliorate per l'annotazione e l'indicizzazione di testi clinici con NCBO Annotator+. Bioinformatica, 34(11), 1962-1965.
+
+ Se si utilizza l'API, fornire una chiave API NCBO BioPortal valida e accedere al servizio all'indirizzo http://services.bioportal.lirmm. en/ncbo_annotatorplus
+ Il testo inviato a NCBO Annotator+ deve essere in inglese.
+ sample_text: Il melanoma è un tumore maligno dei melanociti che si trova principalmente
+ nella pelle, ma anche nell'intestino e nell'occhio.
+ title: Annotatore NCBO +
+ insert_sample_text: Inserire un testo di esempio
+ match_longest_only: Solo la partita più lunga
+ match_partial_words: Abbinare parole parziali
+ recognizer: Riconoscimento dell'entità
+ score_help: Punteggio delle annotazioni secondo la precedente misura NCBO 2009
+ (old) o Punteggio delle annotazioni secondo la misura C-Value (cvalue) o Punteggio
+ delle annotazioni secondo la misura C-Value con espansione gerarchica (cvalueh)
+ select: Selezionare %{name}
+ select_ontologies: Iniziare a digitare per selezionare le ontologie o lasciare
+ vuoto per utilizzare tutte le ontologie
+ select_ontologies_list: Selezionare le ontologie
+ show_advanced_options: Mostra le opzioni avanzate
+ start_typing_to_select: Iniziare a digitare per selezionare %{type} o lasciare
+ vuoto per usare tutti
+ umls:
+ semantic_groups: Gruppi semantici UMLS
+ semantic_types: Tipi semantici UMLS
+ negation: negazione
+ none: nessuno
+ ontologies:
+ ontology_search_prompt: 'Ricerca di un''ontologia o di un concetto (es.: Agrovoc
+ ...)'
+ self: Ontologie
+ ontology: Ontologia
+ ontology_details:
+ concept:
+ definitions: Definizioni
+ id: ID
+ in_schemes: In Schemi
+ member_of: Membro di
+ no_preferred_name_for_selected_language: Nessun nome preferito per la lingua
+ selezionata.
+ obsolete: Obsoleto
+ preferred_name: Nome preferito
+ synonyms: Sinonimi
+ type: Tipo
+ metadata:
+ additional_metadata: Metadati aggiuntivi
+ header:
+ last_submission_date: Data dell'ultimo invio
+
+ ontology_sets: Insiemi di ontologie
+ output: Uscita
+ projects:
+ contacts: Contatti
+ create_new_project: Creare un nuovo progetto
+ created: Creato
+ creator: Utente
+ delete_admin_only: Elimina (solo per l'amministratore)
+ delete_confirm: Sei sicuro?
+ description: Descrizione
+ description_text: Descrizione Testo
+ edit: Modifica
+ home_page: Pagina iniziale
+ index:
+ intro: Sfoglia una selezione di progetti che utilizzano risorse %{site}
+ institutions: Istituzioni
+ ontologies: Ontologie
+ project_description: Descrizione del progetto
+ self: Progetti
+ title: Elenco dei progetti
+ view_projects_help: Visualizza i progetti Aiuto
+ recommender:
+ intro: Ottenere raccomandazioni per le ontologie più rilevanti da un estratto
+ di un testo biomedico o da un elenco di parole chiave
+ no_recommendations: Nessuna raccomandazione trovata
+ no_sets_recommended: Non ci sono set di ontologie consigliati per l'input fornito.
+ Provare con l'output "Ontologie".
+ ontology_recommendation_input: Incollare un paragrafo di testo o alcune parole
+ chiave per calcolare le raccomandazioni dell'ontologia.
+ ontology_recommender: Raccomandatore di ontologia
+ paste_text_recommendations: Incollare un paragrafo di testo o alcune parole chiave
+ da utilizzare per calcolare le raccomandazioni dell'ontologia
+ recommendation_error: Problema nel recupero delle raccomandazioni, provare di
+ nuovo
+ text_length_limit: Si prega di utilizzare meno di 500 parole. Se avete bisogno
+ di annotare testi più lunghi, potete utilizzare il servizio web di raccomandazione.
+ title: raccomandatore
+ valid_integer_max_ontologies_per_set: Il numero massimo di ontologie per set deve
+ essere un valore intero valido
+ valid_max_ontologies_per_set_range: Il numero massimo di ontologie per set deve
+ essere un numero compreso tra 2 e 4
+ valid_numeric_weights: Tutti i pesi devono essere valori numerici validi
+ weight_sum_greater_than_zero: La somma dei pesi deve essere maggiore di zero
+ weights_greater_than_zero: Tutti i pesi devono essere maggiori o uguali a zero
+ register:
+ account_errors: 'Errori nella creazione dell''account:'
+ confirm_password: Confermare la password
+ create_account: Creare un nuovo account
+ email: Email
+ first_name: Nome
+ last_name: Cognome
+ mailing_list: Registrarsi alla mailing list di AgroPortal
+ optional: "(Opzionale)"
+ password: Password
+ title: Registro
+ username: Nome utente
+ reproduce_results: Riprodurre questi risultati utilizzando il metodo
+ score: Punteggio
+ search:
+ categories: Categorie
+ class_search: Ricerca di classe
+ classes_with_definitions: Classi con definizioni
+ hide_advanced_options: Nascondere le opzioni avanzate
+ include_in_search: Includere nella ricerca
+ index:
+ categories_placeholder: Iniziare a digitare per selezionare le categorie o lasciare
+ vuoto per utilizzare tutte le categorie
+ obsolete_definition: 'Una classe che gli autori dell''ontologia hanno segnalato
+ come obsoleta e che raccomandano di non usare. Spesso queste classi vengono
+ lasciate nelle ontologie (invece di essere eliminate del tutto) in modo che
+ i sistemi esistenti che dipendono da esse continuino a funzionare"
+
+ '
+ property_definition: Un'associazione nominativa tra due entità. Esempi sono
+ "definizione" (una relazione tra una classe e un testo) e "parte di" (una
+ relazione tra due classi).
+ search_keywords_placeholder: Inserire una classe, ad es. Melanoma
+ narrow_search_to: Restringere la ricerca a
+ obsolete_classes: Classi obsolete
+ ontologies: Ontologie
+ ontology_views: Viste ontologiche
+ property_values: Valori della proprietà
+ show_advanced_options: Mostra opzioni avanzate
+ title: Ricerca
+ view_search_documentation: Visualizza la documentazione della ricerca
+ select_from_list: Selezionare dall'elenco
+ select_ontologies: Iniziare a digitare per selezionare le ontologie o lasciare vuoto
+ per utilizzarle tutte
+ select_ontologies_list: Selezionare le ontologie
+ show_advanced_options: Mostra le opzioni avanzate
+ specialization: Specializzazione
+ temporality: Temporalità
+ text: Testo
+ type: Tipo
+ umls_sem_type: Tipo UMLS Sem
+ view_fair_scores_definitions: Visualizza le definizioni dei punteggi equi
+ visits: Visite
+ weights_configuration: Configurazione dei pesi
diff --git a/config/routes.rb b/config/routes.rb
index 56d1d4f52..959f25f40 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,13 +1,21 @@
Rails.application.routes.draw do
root to: 'home#index'
+ mount LetterOpenerWeb::Engine, at: "/letter_opener" if Rails.env.development?
+
+ get 'auth/:provider/callback', to: 'login#create_omniauth'
+ get 'locale/:language', to: 'language#set_locale_language'
get '/notes/new_comment', to: 'notes#new_comment'
get '/notes/new_proposal', to: 'notes#new_proposal'
get '/notes/new_reply', to: 'notes#new_reply'
delete '/notes', to: 'notes#destroy'
resources :notes, constraints: { id: /.+/ }
-
+ get 'agents/show_search', to: 'agents#show_search'
+ get 'agents/:id/usages', to: 'agents#agent_usages', constraints: { id: /.+/ }
+ post 'agents/:id/usages', to: 'agents#update_agent_usages', constraints: { id: /.+/ }
+ resources :agents, constraints: { id: /.+/ }
+ post 'agents/:id', to: 'agents#update', constraints: { id: /.+/ }
resources :ontolobridge do
post :save_new_term_instructions, on: :collection
end
@@ -38,10 +46,15 @@
get 'ontologies/:ontology_id/concepts', to: 'concepts#show_concept'
resources :ontologies do
- resources :submissions
+ resources :submissions do
+ get 'edit_properties'
+ end
+
get 'instances/:instance_id', to: 'instances#show', constraints: { instance_id: /[^\/?]+/ }
get 'schemes/show_scheme', to: 'schemes#show'
get 'collections/show'
+ get 'metrics'
+ get 'metrics_evolution'
end
resources :login
@@ -83,10 +96,9 @@
# Top-level pages
match '/feedback', to: 'home#feedback', via: [:get, :post]
get '/account' => 'home#account'
- get '/help' => 'home#help'
- get '/about' => 'home#about'
get '/site_config' => 'home#site_config'
get '/validate_ontology_file' => 'home#validate_ontology_file_show'
+ post '/annotator_recommender_form' => 'home#annotator_recommender_form'
match '/validate_ontology_file' => 'home#validate_ontology_file', via: [:get, :post]
get '/layout_partial/:partial' => 'home#render_layout_partial'
match '/visits', to: 'visits#index', via: :get
@@ -117,6 +129,8 @@
match '/ontologies/:acronym/submissions/:id/edit_metadata' => 'submissions#edit_metadata', via: [:get, :post]
get '/ontologies_filter', to: 'ontologies#ontologies_filter'
+ get '/ontologies/:acronym/properties/show', to: 'properties#show'
+
# Analytics
get '/analytics/:action' => 'analytics#(?-mix:search_result_clicked|user_intention_surveys)'
@@ -147,11 +161,14 @@
get 'ajax/label_xl', to: "label_xl#show"
get '/ajax/biomixer' => 'concepts#biomixer'
get '/ajax/fair_score/html' => 'fair_score#details_html'
+ get '/ajax/submission/show_additional_metadata/:id' => 'ontologies#show_additional_metadata'
+ get '/ajax/submission/show_licenses/:id' => 'ontologies#show_licenses'
get '/ajax/fair_score/json' => 'fair_score#details_json'
get '/ajax/:ontology/instances' => 'instances#index_by_ontology'
get '/ajax/:ontology/classes/:conceptid/instances' => 'instances#index_by_class', :constraints => { conceptid: /[^\/?]+/ }
get '/ajax/ontologies' , to:"ontologies#ajax_ontologies"
-
+ get '/ajax/agents' , to:"agents#ajax_agents"
+ get '/ajax/images/show' => 'application#show_image_modal'
# User
get '/logout' => 'login#destroy', :as => :logout
get '/lost_pass' => 'login#lost_password'
diff --git a/config/settings.yml b/config/settings.yml
index 0a8d2dbbd..7b5a9422a 100644
--- a/config/settings.yml
+++ b/config/settings.yml
@@ -21,6 +21,7 @@ shared:
widgets: 'http://www.bioontology.org/wiki/NCBO_Widgets'
wiki: 'https://www.bioontology.org/wiki/'
mappings: 'https://www.bioontology.org/wiki/BioPortal_Help#Mappings_Tab'
+ metadata_help: 'https://doc.jonquetlab.lirmm.fr/share/32c082ff-97f5-45f4-bafe-05f41c9a5ce4'
development:
links:
diff --git a/db/schema.rb b/db/schema.rb
index 51716810e..22dc2b318 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,7 @@
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[7.0].define(version: 2020_09_21_120918) do
- create_table "analytics", id: :integer, charset: "utf8mb3", force: :cascade do |t|
+ create_table "analytics", id: :integer, charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
t.string "segment"
t.string "action"
t.string "bp_slice"
@@ -22,13 +22,13 @@
t.datetime "updated_at", precision: nil
end
- create_table "licenses", charset: "utf8mb3", force: :cascade do |t|
+ create_table "licenses", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
t.text "encrypted_key"
t.datetime "created_at", precision: nil, null: false
t.datetime "updated_at", precision: nil, null: false
end
- create_table "ontologies", charset: "utf8mb3", force: :cascade do |t|
+ create_table "ontologies", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
t.string "acronym", null: false
t.text "new_term_instructions"
t.text "custom_message"
@@ -37,7 +37,7 @@
t.index ["acronym"], name: "index_ontologies_on_acronym", unique: true
end
- create_table "timeouts", id: :integer, charset: "utf8mb3", force: :cascade do |t|
+ create_table "timeouts", id: :integer, charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
t.string "path"
t.integer "ontology_id"
t.text "concept_id"
@@ -45,7 +45,7 @@
t.timestamp "created"
end
- create_table "virtual_appliance_users", id: :integer, charset: "utf8mb3", force: :cascade do |t|
+ create_table "virtual_appliance_users", id: :integer, charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
t.string "user_id"
t.datetime "created_at", precision: nil
t.datetime "updated_at", precision: nil
diff --git a/docker-compose.yml b/docker-compose.yml
index 38be0278f..1eb928b19 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,52 +1,86 @@
x-app: &default-app
- build:
- context: "."
- target: "app"
- args:
- - "UID=${UID:-1000}"
- - "GID=${GID:-1000}"
- - "RAILS_ENV=${RAILS_ENV:-production}"
- - "NODE_ENV=${NODE_ENV:-production}"
- depends_on:
- - "db"
- - "cache"
- links:
- - "db"
- - "cache"
+ image: agroportal/ontoportal_web_ui:development
env_file:
- ".env"
tty: true
volumes:
- - "${DOCKER_WEB_VOLUME}"
- - bundle:/usr/local/bundle
+ - .:/app
+ - bundle:/usr/local/bundle
- node:/node_modules
+ - rails_cache:/app/tmp/cache
+ - assets:/app/public/assets
+ - /var/run/docker.sock:/var/run/docker.sock
+ tmpfs:
+ - /tmp
+ - /app/tmp/pids
services:
db:
- environment:
- MYSQL_ROOT_PASSWORD: 'bp_user'
- image: "mysql:latest"
- profiles: ["db"]
+ image: "mysql:8.0"
+ networks:
+ - default
+ volumes:
+ - mysql-data:/var/lib/mysql
ports:
- "3306:3306"
- volumes:
- - db-v:/var/lib/mysql
+ environment:
+ MYSQL_ROOT_PASSWORD: root
+ healthcheck:
+ test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
+ timeout: 5s
+ retries: 3
+
cache:
- deploy:
- resources:
- limits:
- cpus: "${DOCKER_REDIS_CPUS:-0}"
- memory: "${DOCKER_REDIS_MEMORY:-0}"
- image: "memcached:1.6.17-bullseye"
- profiles: ["cache"]
+ image: memcached:latest
+ restart: unless-stopped
+ command: [ "-m", "1024" ]
+ networks:
+ - default
+ ports:
+ - "11211:11211"
+ node:
+ <<: *default-app
+ command: "yarn build --watch"
- web:
+ rails:
<<: *default-app
+ depends_on:
+ db:
+ condition: service_healthy
+ cache:
+ condition: service_started
+ node:
+ condition: service_started
+ links:
+ - db
+ - cache
+ environment:
+ BUNDLE_WITHOUT: ''
+ DB_HOST: db
+ CACHE_HOST: cache
ports:
- - "${DOCKER_WEB_PORT_FORWARD:-127.0.0.1:3000}:${PORT:-3000}"
- profiles: ["web"]
- command: "yarn build --watch"
+ - "3000:3000"
+ test:
+ <<: *default-app
+ depends_on:
+ - db
+ - cache
+ - chrome-server
+ network_mode: 'host'
+ environment:
+ BUNDLE_WITHOUT: ''
+ DB_HOST: 127.0.0.1
+ CACHE_HOST: 127.0.0.1
+ chrome-server:
+ image: selenium/standalone-chrome:112.0-chromedriver-112.0-grid-4.9.0-20230421
+ shm_size: 2g
+ ports:
+ - "4444:4444"
+ - "7900:7900"
+
volumes:
- db-v:
+ mysql-data:
bundle:
+ rails_cache:
+ assets:
node:
diff --git a/lib/log.rb b/lib/log.rb
index 00c815d60..edef5506f 100644
--- a/lib/log.rb
+++ b/lib/log.rb
@@ -12,13 +12,7 @@ class LOG
# :concept_id
# :concept_name
def self.add(level, message, request = nil, remote_params = nil)
- if request
- if !$REMOTE_LOGGING.nil? && $REMOTE_LOGGING
- remote(level, message, request, remote_params)
- end
- else
- local(level, message)
- end
+ local(level, message)
end
private
diff --git a/package.json b/package.json
index 94282d913..d5003c910 100644
--- a/package.json
+++ b/package.json
@@ -4,13 +4,20 @@
"dependencies": {
"@hotwired/stimulus": "^3.0.1",
"@hotwired/turbo-rails": "^7.1.1",
+ "debounce": "^1.2.1",
"esbuild": "^0.14.41",
"flatpickr": "^4.6.13",
"split.js": "^1.6.5",
"stimulus-flatpickr": "^3.0.0-0",
"stimulus-rails-nested-form": "^4.0.0",
"stimulus-read-more": "^4.1.0",
- "tom-select": "^2.2.2"
+ "stimulus-reveal-controller": "^4.1.0",
+ "stimulus-timeago": "^4.1.0",
+ "tippy.js": "^6.3.7",
+ "tom-select": "^2.2.2",
+ "vis-data": "^7.1.6",
+ "vis-network": "^9.1.6",
+ "vis-util": "^5.0.3"
},
"scripts": {
"build": "esbuild app/javascript/*.* --bundle --sourcemap --outdir=app/assets/builds"
diff --git a/spec/mailers/notifier_spec.rb b/spec/mailers/notifier_spec.rb
new file mode 100644
index 000000000..4c8edc5df
--- /dev/null
+++ b/spec/mailers/notifier_spec.rb
@@ -0,0 +1,35 @@
+require 'rails_helper'
+
+RSpec.describe Notifier, type: :mailer do
+ let(:support_email) { 'agroportal-support@lirmm.fr' }
+ let(:site) { 'Agroportal' }
+
+ describe 'error' do
+ let(:error) { StandardError.new('Test error message') }
+ subject(:error_mail) { Notifier.error(error) }
+
+ it 'sends an error email' do
+ expect(error_mail.to).to eq([support_email])
+ expect(error_mail.from).to eq([support_email])
+ expect(error_mail.subject).to eq("[#{site}] Exception Mailer: #{error.message}")
+ expect(error_mail.body.encoded).to include(error.backtrace.join("\n"))
+ end
+ end
+
+ describe 'feedback' do
+ let(:name) { 'John Doe' }
+ let(:email) { 'user@lirmm.fr' }
+ let(:comment) { 'This is a test comment.' }
+ let(:location) { 'Test Location' }
+ let(:tags) { 'tag1, tag2' }
+
+ subject(:feedback_mail) { Notifier.feedback(name, email, comment, location, tags) }
+
+ it 'sends a feedback email' do
+ expect(feedback_mail.to).to eq(["#{support_email}, #{email}"])
+ expect(feedback_mail.from).to eq([support_email])
+ expect(feedback_mail.subject).to eq("[#{site}] Feedback from #{name}")
+ expect(feedback_mail.body.encoded).to include(name, email, comment, location, tags)
+ end
+ end
+end
diff --git a/test/application_system_test_case.rb b/test/application_system_test_case.rb
new file mode 100644
index 000000000..b4457f965
--- /dev/null
+++ b/test/application_system_test_case.rb
@@ -0,0 +1,196 @@
+require "test_helper"
+require_relative 'helpers/application_test_helpers'
+
+class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
+ include ApplicationTestHelpers::Ontologies
+ include ApplicationTestHelpers::Users
+ include ApplicationTestHelpers::Users
+ include ApplicationTestHelpers::Categories
+ include ApplicationTestHelpers::Groups
+ include ApplicationTestHelpers::Agents
+
+ driven_by :selenium, using: ENV['CI'].present? ? :headless_chrome : :chrome, screen_size: [1400, 1400], options: {
+ browser: :remote,
+ url: "http://localhost:4444"
+ }
+
+ def wait_for(selector, tries = 60)
+ tries.times.each do
+ puts "waiting for #{selector}"
+ break if page.has_selector?(selector)
+ sleep 1
+ end
+ end
+
+ def wait_for_text(text, tries = 60)
+ tries.times.each do
+ sleep 1
+ puts "waiting for #{text}"
+ break if page.has_text?(text)
+ end
+ assert_text text
+ end
+
+ def login_in_as(user, admin: false)
+ create_user(user, admin: admin)
+
+ visit login_index_url
+
+ # Fill in the login form
+ fill_in 'user_username', with: user.username
+ fill_in 'user_password', with: user.password
+
+ # Click the login button
+ click_button 'Login'
+ end
+
+ def assert_date(date)
+ assert_text I18n.l(DateTime.parse(date), format: '%B %-d, %Y')
+ end
+
+ def search_input(selector, value)
+ within "#{selector}" do
+ find(".search-inputs .input-field-component").last.set(value)
+ page.execute_script("document.querySelector('#{selector} > .search-inputs .input-field-component').dispatchEvent(new Event('input'))")
+ sleep 1
+ find(".search-inputs .search-content", text: value).click
+ sleep 1
+ find("input", text: 'Save').click
+ end
+ end
+
+ def list_checks(selected_values, all_values = [])
+ all_values.each do |val|
+ uncheck val, allow_label_click: true
+ end
+
+ selected_values.each do |val|
+ check val, allow_label_click: true
+ end
+ end
+
+ def list_inputs(parent_selector, selector, values, &block)
+ within parent_selector do
+ all('.delete').each { |x| x.click }
+ find('.add-another-object', text: 'Add another').click
+ last_index = values.size - 1
+ values.each_with_index do |value, index|
+ if value.is_a?(Hash)
+ value.each do |key, val|
+ all("[name^='#{selector}'][name$='[#{key}]']").last.set(val)
+ end
+ else
+ if block_given?
+ block.call(selector, value, index)
+ else
+ all("[name^='#{selector}']").last.set(value)
+ end
+ end
+ find('.add-another-object', text: 'Add another').click unless index.eql?(last_index)
+ end
+ end
+ end
+
+ def tom_select(selector, values, open_to_add: false)
+
+ multiple = values.is_a?(Array)
+
+ real_select = "[name='#{selector}']"
+
+ ts_wrapper_selector = "#{real_select} + div.ts-wrapper"
+ assert_selector ts_wrapper_selector
+
+ # Click on the Tom Select input to open the dropdown
+ element = find(ts_wrapper_selector)
+ element.click
+
+
+ return unless page.has_selector?("#{ts_wrapper_selector} > .ts-dropdown")
+
+ if multiple
+ # reset the input to empty
+ all("#{ts_wrapper_selector} > .ts-control > .item .remove").each do |element|
+ element.click
+ end
+ else
+ values = Array(values)
+ end
+
+ values.each do |value|
+ find("#{ts_wrapper_selector} input").set(value) if open_to_add
+ within "#{ts_wrapper_selector} > .ts-dropdown" do
+ if page.has_selector?('.option', text: value)
+ find('.option', text: value).click
+ elsif open_to_add
+ find('.create').click
+ end
+ end
+ end
+
+ if multiple
+ find("#{ts_wrapper_selector} input").click
+ end
+ end
+
+ def date_picker_fill_in(selector, value, index = 0)
+ page.execute_script("document.querySelectorAll(\"[name^='#{selector}']\")[#{index}].flatpickr().setDate('#{value}')")
+ end
+
+ def agent_search(name)
+ within(".search-inputs:last-of-type") do
+ input = find("input[name^='agent']")
+ agent_id = input[:name].split('agent').last
+ input.set(name)
+ sleep 2
+ links = all('a', text: name)
+ links_size = links.size
+ sleep 1
+ first(:link, name).click
+ return links_size.eql?(1) ? agent_id : nil
+ end
+
+ end
+
+ def agent_fill(agent, parent_id: nil, enable_affiliations: true)
+ id = agent.id ? "/#{agent.id}": ''
+ form = all("form[action=\"/agents#{id}\"]").first
+ within form do
+ choose "", option: agent.agentType, allow_label_click: true if enable_affiliations
+ fill_in 'name', with: agent.name
+
+ if agent.agentType.eql?('organization')
+ refute_selector('input[name="email"]')
+ fill_in 'acronym', with: agent.acronym
+ fill_in 'homepage', with: agent.homepage
+ else
+ refute_selector('input[name="acronym"]')
+ refute_selector('input[name="homepage"]')
+ fill_in 'email', with: agent.email
+ end
+
+ list_inputs ".agents-identifiers",
+ "[identifiers]", agent.identifiers
+
+ unless enable_affiliations
+ refute_selector ".agents-affiliations"
+ return
+ end
+
+ within '.agents-affiliations' do
+ all('.delete').each { |x| x.click }
+ Array(agent.affiliations).each do |aff|
+ aff = OpenStruct.new(aff)
+ find('.add-another-object', text: 'Add another').click
+ agent_id = agent_search(aff.name)
+ id = parent_id && !parent_id.eql?('NEW_RECORD') ? "#{parent_id}_#{agent_id}" : agent_id
+ within "turbo-frame[id=\"#{id}\"]" do
+ agent_fill(aff, enable_affiliations: false)
+ click_on "Save"
+ sleep 1
+ end
+ end
+ end
+ click_on "Save"
+ end
+ end
+end
diff --git a/test/controllers/application_controller_test.rb b/test/controllers/application_controller_test.rb
new file mode 100644
index 000000000..fe33ef551
--- /dev/null
+++ b/test/controllers/application_controller_test.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'test_helper'
+
+class ApplicationControllerTest < ActionDispatch::IntegrationTest
+ test 'should show home page' do
+ get ''
+ assert_response :success
+ end
+
+ test 'should show projects page' do
+ get '/projects'
+ assert_response :success
+ end
+
+ test 'should show annotator page' do
+ get '/annotator'
+ assert_response :success
+ end
+
+ test 'should show recommender page' do
+ get '/recommender'
+ assert_response :success
+ end
+
+ test 'should show mapping page' do
+ get '/mappings'
+ assert_response :success
+ end
+
+ test 'should show feedback page' do
+ get '/feedback'
+ assert_response :success
+ end
+end
diff --git a/test/controllers/landscape_controller_test.rb b/test/controllers/landscape_controller_test.rb
index 31a32b842..619c82dc9 100644
--- a/test/controllers/landscape_controller_test.rb
+++ b/test/controllers/landscape_controller_test.rb
@@ -1,9 +1,11 @@
+# frozen_string_literal: true
+
require 'test_helper'
class LandscapeControllerTest < ActionController::TestCase
- test "should get index" do
+ test 'should get index' do
+ skip('take too much time')
get :index
assert_response :success
end
-
end
diff --git a/test/controllers/ontologies_controller_test.rb b/test/controllers/ontologies_controller_test.rb
new file mode 100644
index 000000000..b5998de7a
--- /dev/null
+++ b/test/controllers/ontologies_controller_test.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+require 'test_helper'
+
+class OntologiesControllerTest < ActionDispatch::IntegrationTest
+ ONTOLOGIES = LinkedData::Client::Models::Ontology.all(include: 'acronym')
+ PAGES = %w[summary classes properties notes mappings schemes collections widgets].freeze
+
+ test 'should return all the ontologies' do
+ get ontologies_path
+ assert_response :success
+ end
+
+ ONTOLOGIES.flat_map { |ont| PAGES.map { |page| [ont, page] } }.each do |ont, page|
+ test "should get page #{page} of #{ont.acronym} ontology" do
+ path = "#{ontologies_path}/#{ont.acronym}?p=#{page}"
+ get path
+ if response.redirect?
+ follow_redirect!
+ end
+ assert_response :success, "GET #{path} returned #{response.status}"
+ end
+ end
+end
diff --git a/test/fixtures/agents.yml b/test/fixtures/agents.yml
new file mode 100644
index 000000000..ce32845e0
--- /dev/null
+++ b/test/fixtures/agents.yml
@@ -0,0 +1,173 @@
+agent1:
+ name: "John Doe"
+ agentType: "person"
+ email: "jonh@test.com"
+ identifiers:
+ - notation: "0000-0001-2345-6789"
+ - notation: "0000-0001-2345-6788"
+ - notation: "0000-0001-2345-6788"
+ affiliations:
+ - name: "Research Institute X"
+ agentType: "organization"
+ identifiers:
+ - notation: "1234-5678"
+ affiliations: [ ]
+ email: "x@example.com"
+ acronym: "RI-X"
+ homepage: "https://www.rix-institute.org/"
+
+ - name: "Research Institute Y"
+ agentType: "organization"
+ identifiers:
+ - notation: "1234-5679"
+ affiliations: [ ]
+ email: "y@example.com"
+ acronym: "RI-Y"
+ homepage: "https://www.riy-institute.org/"
+
+agent2:
+ name: "Alice Smith"
+ agentType: "person"
+ identifiers:
+ - notation: "0000-0002-9876-5432"
+ affiliations:
+ - name: "Tech Innovators Ltd."
+ agentType: "organization"
+ identifiers:
+ - notation: "9876-5432"
+ affiliations: [ ]
+ email: "alice.smith@example.com"
+ acronym: "TI Ltd."
+ homepage: "https://www.techinnovators.com/"
+
+agent3:
+ name: "Robert Johnson"
+ agentType: "person"
+ identifiers:
+ - schemaAgency: "ORCID"
+ notation: "0000-0003-4567-8901"
+ affiliations:
+ - name: "Science Hub Inc."
+ agentType: "organization"
+ identifiers:
+ - schemaAgency: "ROR"
+ notation: "3456-7890"
+ affiliations: [ ]
+ email: "robert.johnson@example.com"
+ acronym: "SH Inc."
+ homepage: "https://www.sciencehubinc.com/"
+
+agent4:
+ name: "Emily Brown"
+ agentType: "person"
+ identifiers:
+ - schemaAgency: "ORCID"
+ notation: "0000-0004-5678-9012"
+ affiliations:
+ - name: "Health Solutions Co."
+ agentType: "organization"
+ identifiers:
+ - schemaAgency: "ROR"
+ notation: "5678-9012"
+ affiliations: [ ]
+ email: "emily.brown@example.com"
+ acronym: "HSC"
+ homepage: "https://www.healthsolutionsco.com/"
+
+agent5:
+ name: "Michael Taylor"
+ agentType: "person"
+ identifiers:
+ - schemaAgency: "ORCID"
+ notation: "0000-0005-6789-0123"
+ affiliations:
+ - name: "Environmental Research Foundation"
+ creator:
+ agentType: "organization"
+ identifiers:
+ - schemaAgency: "ROR"
+ notation: "6789-0123"
+ affiliations: [ ]
+ email: "michael.taylor@example.com"
+ acronym: "ERF"
+ homepage: "https://www.enviro-research.org/"
+
+organization1:
+ name: "Tech Solutions Group"
+ agentType: "organization"
+ identifiers:
+ - notation: "1234-5678"
+ affiliations:
+ - name: "Research Consortium A"
+ agentType: "organization"
+ identifiers:
+ - notation: "9876-5432"
+ affiliations: [ ]
+ email: "contact@researchconsortiumA.com"
+ acronym: "RCA"
+ homepage: "https://www.researchconsortiumA.com/"
+
+ - name: "Innovation Hub B"
+ agentType: "organization"
+ identifiers:
+ - notation: "3456-7890"
+ affiliations: [ ]
+ email: "info@innovationhubb.com"
+ acronym: "IHB"
+ homepage: "https://www.innovationhubb.com/"
+
+ email: "info@techsolutionsgroup.com"
+ acronym: "TSG"
+ homepage: "https://www.techsolutionsgroup.com/"
+
+organization2:
+ name: "Quantum Dynamics Solutions"
+ agentType: "organization"
+ identifiers:
+ - notation: "5678-9012"
+ affiliations:
+ - name: "Space Exploration Consortium"
+ agentType: "organization"
+ identifiers:
+ - notation: "1234-1234"
+ affiliations: []
+ email: "contact@spaceconsortium.com"
+ acronym: "SEC"
+ homepage: "https://www.spaceconsortium.com/"
+ - name: "Tech Innovators Guild"
+ agentType: "organization"
+ identifiers:
+ - notation: "7890-1234"
+ affiliations: []
+ email: "info@techinnovatorsguild.com"
+ acronym: "TIG"
+ homepage: "https://www.techinnovatorsguild.com/"
+ email: "info@quantumdynamics.com"
+ acronym: "QDS"
+ homepage: "https://www.quantumdynamics.com/"
+
+organization3:
+ name: "BioTech Solutions Inc."
+ agentType: "organization"
+ identifiers:
+ - notation: "2345-6789"
+ affiliations:
+ - name: "Health Research Alliance"
+ agentType: "organization"
+ identifiers:
+ - notation: "5678-9012"
+ affiliations: []
+ email: "contact@healthresearchalliance.com"
+ acronym: "HRA"
+ homepage: "https://www.healthresearchalliance.com/"
+ - name: "GreenTech Innovations"
+ agentType: "organization"
+ identifiers:
+ - notation: "8901-2345"
+ affiliations: []
+ email: "info@greentechinnovations.com"
+ acronym: "GTI"
+ homepage: "https://www.greentechinnovations.com/"
+ email: "info@biotechsolutions.com"
+ acronym: "BSI"
+ homepage: "https://www.biotechsolutions.com/"
diff --git a/test/fixtures/categories.yml b/test/fixtures/categories.yml
new file mode 100644
index 000000000..e0669133d
--- /dev/null
+++ b/test/fixtures/categories.yml
@@ -0,0 +1,29 @@
+category1:
+ acronym: "CAT1"
+ name: "Category One"
+ description: "This is the first category."
+ ontologies:
+
+category2:
+ acronym: "CAT2"
+ name: "Category Two"
+ description: "This is the second category."
+ ontologies:
+
+category3:
+ acronym: "CAT3"
+ name: "Category Three"
+ description: "This is the third category."
+ ontologies:
+
+category4:
+ acronym: "CAT4"
+ name: "Category Four"
+ description: "This is the fourth category."
+ ontologies:
+
+category5:
+ acronym: "CAT5"
+ name: "Category Five"
+ description: "This is the fifth category."
+ ontologies:
\ No newline at end of file
diff --git a/test/fixtures/groups.yml b/test/fixtures/groups.yml
new file mode 100644
index 000000000..58e3ff91e
--- /dev/null
+++ b/test/fixtures/groups.yml
@@ -0,0 +1,17 @@
+group1:
+ acronym: "GRP1"
+ name: "Group One"
+ description: "This is the first group."
+ ontologies:
+
+group2:
+ acronym: "GRP2"
+ name: "Group Two"
+ description: "This is the second group."
+ ontologies:
+
+group3:
+ acronym: "GRP3"
+ name: "Group Three"
+ description: "This is the third group."
+ ontologies:
\ No newline at end of file
diff --git a/test/fixtures/ontologies.yml b/test/fixtures/ontologies.yml
new file mode 100644
index 000000000..28d345e73
--- /dev/null
+++ b/test/fixtures/ontologies.yml
@@ -0,0 +1,63 @@
+ontology1:
+ acronym: "ONT1"
+ name: "Ontology One"
+ notes: "This is the first ontology."
+ administeredBy:
+ group:
+ viewingRestriction: "public"
+ hasDomain:
+ summaryOnly: false
+ acl:
+
+ontology2:
+ acronym: "ONT2"
+ name: "Ontology Two"
+ notes: "This is the second ontology."
+ administeredBy:
+ group:
+ viewingRestriction: "private"
+ hasDomain:
+ acl:
+
+ontology3:
+ acronym: "ONT3"
+ name: "Ontology Three"
+ notes: "This is the third ontology."
+ administeredBy:
+ group:
+ viewingRestriction: "public"
+ doNotUpdate: false
+ hasDomain:
+ acl:
+
+ontology4:
+ acronym: "ONT4"
+ name: "Ontology Four"
+ notes: "This is the fourth ontology."
+ administeredBy:
+ group:
+ viewingRestriction: "public"
+ hasDomain:
+ summaryOnly: true
+ acl:
+
+ontology_private:
+ acronym: "ontology_private"
+ name: "Ontology private"
+ notes: "This is the fourth ontology."
+ administeredBy:
+ group:
+ viewingRestriction: "private"
+ hasDomain:
+ acl:
+
+ontology_view:
+ acronym: "ontology_view"
+ name: "View of ONT1"
+ notes: "This is a view ontology."
+ administeredBy:
+ group:
+ viewingRestriction: "public"
+ hasDomain:
+ acl:
+ viewOf: "ONT1"
diff --git a/test/fixtures/submissions.yml b/test/fixtures/submissions.yml
new file mode 100644
index 000000000..5d066008e
--- /dev/null
+++ b/test/fixtures/submissions.yml
@@ -0,0 +1,315 @@
+submission1:
+ URI: "http://example.org/ontologies/ontology1"
+ versionIRI: "http://example.org/ontologies/ontology1/v1"
+ version: "1.0"
+ status: "production"
+ deprecated: false
+ hasOntologyLanguage: "OWL"
+ hasFormalityLevel: "http://example.org/formality#Informal"
+ hasOntologySyntax: "http://www.w3.org/2002/07/owl#FunctionalSyntax"
+ naturalLanguage:
+ - "http://lexvo.org/id/iso639-1/en"
+ isOfType: "http://example.org/ontologyType#DomainOntology"
+ identifier:
+ - "http://example.org/ontologies/ontology1/identifier1"
+ - "http://example.org/ontologies/ontology1/identifier2"
+ description: "An example ontology submission"
+ homepage: "http://example.org/ontologies/ontology1/homepage"
+ documentation: "http://example.org/ontologies/ontology1/documentation"
+ notes:
+ - "Note 1"
+ - "Note 2"
+ keywords:
+ - "Keyword1"
+ - "Keyword2"
+ hiddenLabel:
+ - "HiddenLabel1"
+ - "HiddenLabel2"
+ alternative:
+ - "Alternative1"
+ - "Alternative2"
+ abstract: "An abstract for the ontology"
+ publication:
+ - "http://example.org/publication1"
+ - "http://example.org/publication2"
+ hasLicense: "http://example.org/licenses/license1"
+ useGuidelines: "Guidelines for use"
+ morePermissions: "Additional permissions"
+ released: "2023-01-01T00:00:00Z"
+ valid: "2023-01-31T00:00:00Z"
+ curatedOn:
+ - "2023-01-15T12:00:00Z"
+ creationDate: "2023-01-01T00:00:00Z"
+ modificationDate: "2023-01-15T16:45:00Z"
+ contact: [
+ {name: 'contact1' , email: "contact1@test.com"},
+ {name: 'contact2' , email: "contact2@test.com"},
+ ]
+ pullLocation: 'https://raw.githubusercontent.com/owlcs/pizza-ontology/master/pizza.owl'
+
+submission2:
+ URI: "http://example.org/ontologies/ontology2"
+ versionIRI: "http://example.org/ontologies/ontology2/v1"
+ version: "2.0"
+ status: "beta"
+ deprecated: true
+ hasOntologyLanguage: "SKOS"
+ hasFormalityLevel: "Ontology"
+ hasOntologySyntax: "OWL Manchester Syntax"
+ naturalLanguage:
+ - "French"
+ isOfType: "Application Ontology"
+ identifier:
+ - "http://example.org/ontologies/ontology2/identifier1"
+ - "http://example.org/ontologies/ontology2/identifier2"
+ description: "Another example ontology submission"
+ homepage: "http://example.org/ontologies/ontology2/homepage"
+ documentation: "http://example.org/ontologies/ontology2/documentation"
+ notes:
+ - "Note 3"
+ - "Note 4"
+ keywords:
+ - "Keyword3"
+ - "Keyword4"
+ hiddenLabel:
+ - "HiddenLabel3"
+ - "HiddenLabel4"
+ alternative:
+ - "Alternative3"
+ - "Alternative4"
+ abstract: "Abstract for the second ontology"
+ publication:
+ - "http://example.org/publication3"
+ - "http://example.org/publication4"
+ hasLicense: "http://example.org/licenses/license2"
+ useGuidelines: "Usage guidelines"
+ morePermissions: "More permissions"
+ released: "2023-02-01T00:00:00Z"
+ valid: "2023-02-28T00:00:00Z"
+ curatedOn:
+ - "2023-02-15T12:00:00Z"
+ - "2023-03-15T12:00:00Z"
+ creationDate: "2023-02-01T00:00:00Z"
+ modificationDate: "2023-02-15T16:45:00Z"
+ contact: [
+ {name: 'contact3' , email: "contact3@test.com"},
+ {name: 'contact4' , email: "contact4@test.com"},
+ ]
+ pullLocation: 'https://www.w3.org/2009/08/skos-reference/skos.rdf'
+ source:
+ - "source 2.1"
+ - "source 2.2"
+ endpoint:
+ - "https://endpoint.2.1.com"
+ - "https://endpoint.2.2.com"
+ includedInDataCatalog:
+ - "AgroPortal"
+ - "MedPortal"
+ associatedMedia:
+ - "https://associatedMedia.2.1.com"
+ - "https://associatedMedia.2.2.com"
+ - "https://associatedMedia.2.3.com"
+ depiction:
+ - "https://depiction.2.1.com"
+ - "https://depiction.2.2.com"
+ logo: "https://logo.2.com"
+ audience: "audience 2"
+ repository: "https://repository.2.com"
+ bugDatabase: "https://bugDatabase.2.com"
+ mailingList: "mailingList2"
+ toDoList:
+ - 'todo2.1'
+ - 'todo2.2'
+ - 'todo2.3'
+ - 'todo2.4'
+ award:
+ - 'award2.1'
+ - 'award2.2'
+ knownUsage:
+ - 'usage2.1'
+ - 'usage2.2'
+ - 'usage2.3'
+ designedForOntologyTask:
+ - 'Search Task'
+ - 'Indexing Task'
+ hasDomain:
+ - "hasDomain2.1"
+ - "hasDomain2.2"
+ - "hasDomain2.3"
+ coverage: "coverage2"
+ example:
+ - "exmaple2.1"
+ - "exmaple2.2"
+ hasPriorVersion: "https://hasPriorVersion.2.com"
+ # hasPart: TODO: auto complete this programmatically
+ obsoleteParent: "https://obsoleteParent.2.com"
+ uriRegexPattern: "https://uriRegexPattern.2.com"
+ preferredNamespaceUri: "https://preferredNamespaceUri.2.com"
+ preferredNamespacePrefix: "prefix2"
+ exampleIdentifier: "https://exampleIdentifier.2.com"
+ keyClasses:
+ - "https://keyClasses.2.1.com"
+ - "https://keyClasses.2.2.com"
+ - "https://keyClasses.2.3.com"
+ metadataVoc:
+ - "RDF Schema (RDFS)"
+ - "Dublin core (DCTERMS)"
+ conformsToKnowledgeRepresentationParadigm: "conformsToKnowledgeRepresentationParadigm2"
+ usedOntologyEngineeringMethodology: "usedOntologyEngineeringMethodology2"
+ usedOntologyEngineeringTool:
+ - "Protégé"
+ - "SWOOP"
+ accrualMethod:
+ - "https://accrualMethod.2.1.com"
+ - "https://accrualMethod.2.2.com"
+ - "https://accrualMethod.2.3.com"
+ accrualPeriodicity: "Annual"
+ accrualPolicy: "accrualPolicy2"
+
+
+
+
+
+submission3:
+ URI: "http://example.org/ontologies/ontology3"
+ versionIRI: "http://example.org/ontologies/ontology3/v1"
+ version: "1.5"
+ status: "production"
+ deprecated: false
+ hasOntologyLanguage: "OWL"
+ hasFormalityLevel: "http://example.org/formality#Informal"
+ hasOntologySyntax: "http://www.w3.org/2002/07/owl#FunctionalSyntax"
+ naturalLanguage:
+ - "http://lexvo.org/id/iso639-1/en"
+ isOfType: "http://example.org/ontologyType#DomainOntology"
+ identifier:
+ - "http://example.org/ontologies/ontology3/identifier1"
+ - "http://example.org/ontologies/ontology3/identifier2"
+ description: "Yet another example ontology submission"
+ homepage: "http://example.org/ontologies/ontology3/homepage"
+ documentation: "http://example.org/ontologies/ontology3/documentation"
+ notes:
+ - "Note 5"
+ - "Note 6"
+ keywords:
+ - "Keyword5"
+ - "Keyword6"
+ hiddenLabel:
+ - "HiddenLabel5"
+ - "HiddenLabel6"
+ alternative:
+ - "Alternative5"
+ - "Alternative6"
+ abstract: "Abstract for the third ontology"
+ publication:
+ - "http://example.org/publication5"
+ - "http://example.org/publication6"
+ hasLicense: "http://example.org/licenses/license3"
+ useGuidelines: "Guidelines for use"
+ morePermissions: "Additional permissions"
+ released: "2023-03-01T00:00:00Z"
+ valid: "2023-03-31T00:00:00Z"
+ curatedOn: "2023-03-15T12:00:00Z"
+ creationDate: "2023-02-01T00:00:00Z"
+ modificationDate: "2023-02-15T16:45:00Z"
+ contact: [
+ {name: 'contact5' , email: "contact5@test.com"},
+ {name: 'contact6' , email: "contact6@test.com"},
+ ]
+ pullLocation: 'http://example.org/pull3'
+
+submission4:
+ URI: "http://example.org/ontologies/ontology4"
+ versionIRI: "http://example.org/ontologies/ontology4/v1"
+ version: "1.2"
+ status: "alpha"
+ deprecated: true
+ hasOntologyLanguage: "SKOS"
+ hasFormalityLevel: "http://example.org/formality#Formal"
+ hasOntologySyntax: "http://www.w3.org/2002/07/owl#ManchesterSyntax"
+ naturalLanguage:
+ - "http://lexvo.org/id/iso639-1/fr"
+ isOfType: "http://example.org/ontologyType#KnowledgeBase"
+ identifier:
+ - "http://example.org/ontologies/ontology4/identifier1"
+ - "http://example.org/ontologies/ontology4/identifier2"
+ description: "A different example ontology submission"
+ homepage: "http://example.org/ontologies/ontology4/homepage"
+ documentation: "http://example.org/ontologies/ontology4/documentation"
+ notes:
+ - "Note 7"
+ - "Note 8"
+ keywords:
+ - "Keyword7"
+ - "Keyword8"
+ hiddenLabel:
+ - "HiddenLabel7"
+ - "HiddenLabel8"
+ alternative:
+ - "Alternative7"
+ - "Alternative8"
+ abstract: "Abstract for the fourth ontology"
+ publication:
+ - "http://example.org/publication7"
+ - "http://example.org/publication8"
+ hasLicense: "http://example.org/licenses/license4"
+ useGuidelines: "Usage guidelines 2"
+ morePermissions: "More permissions 2"
+ released: "2023-04-01T00:00:00Z"
+ valid: "2023-04-30T00:00:00Z"
+ curatedOn: "2023-04-15T12:00:00Z"
+ creationDate: "2023-04-01T00:00:00Z"
+ modificationDate: "2023-04-15T16:45:00Z"
+ contact: [
+ {name: 'contact7' , email: "contact7@test.com"},
+ {name: 'contact8' , email: "contact8@test.com"},
+ ]
+ pullLocation: 'http://example.org/pull4'
+
+submission5:
+ URI: "http://example.org/ontologies/ontology5"
+ versionIRI: "http://example.org/ontologies/ontology5/v1"
+ version: "1.8"
+ status: "production"
+ deprecated: false
+ hasOntologyLanguage: "OWL"
+ hasFormalityLevel: "http://example.org/formality#Informal"
+ hasOntologySyntax: "http://www.w3.org/2002/07/owl#FunctionalSyntax"
+ naturalLanguage:
+ - "http://lexvo.org/id/iso639-1/en"
+ isOfType: "http://example.org/ontologyType#DomainOntology"
+ identifier:
+ - "http://example.org/ontologies/ontology5/identifier1"
+ - "http://example.org/ontologies/ontology5/identifier2"
+ description: "Yet another different example ontology submission"
+ homepage: "http://example.org/ontologies/ontology5/homepage"
+ documentation: "http://example.org/ontologies/ontology5/documentation"
+ notes:
+ - "Note 9"
+ - "Note 10"
+ keywords:
+ - "Keyword9"
+ - "Keyword10"
+ hiddenLabel:
+ - "HiddenLabel9"
+ - "HiddenLabel10"
+ alternative:
+ - "Alternative9"
+ - "Alternative10"
+ abstract: "Abstract for the fifth ontology"
+ publication:
+ - "http://example.org/publication9"
+ - "http://example.org/publication10"
+ hasLicense: "http://example.org/licenses/license5"
+ useGuidelines: "Guidelines for use"
+ morePermissions: "Additional permissions"
+ released: "2023-05-01T00:00:00Z"
+ valid: "2023-05-31T00:00:00Z"
+ curatedOn: "2023-05-15T12:00:00Z"
+ creationDate: "2023-05-01T00:00:00Z"
+ modificationDate: "2023-05-15T16:45:00Z"
+ contact: [
+ {name: 'contact9' , email: "contact9@test.com"},
+ {name: 'contact10' , email: "contact10@test.com"},
+ ]
+ pullLocation: 'http://example.org/pull5'
diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml
new file mode 100644
index 000000000..c4a633c02
--- /dev/null
+++ b/test/fixtures/users.yml
@@ -0,0 +1,26 @@
+john:
+ first_name: John
+ last_name: Doe
+ username: johndoe
+ orcid_id: '0000-0001-2345-6789'
+ github_id: 'johndoe_github'
+ email: john.doe@example.com
+ password: password
+
+jane:
+ first_name: Jane
+ last_name: Smith
+ username: janesmith
+ orcid_id: '0000-0002-3456-7890'
+ github_id: 'janesmith_github'
+ email: jane.smith@example.com
+ password: password
+
+bob:
+ first_name: Bob
+ last_name: Jones
+ username: bobjones
+ orcid_id: '0000-0003-4567-8901'
+ github_id: 'bobjones_github'
+ email: bob.jones@example.com
+ password: password
diff --git a/test/helpers/application_test_helpers.rb b/test/helpers/application_test_helpers.rb
new file mode 100644
index 000000000..80c76e2b3
--- /dev/null
+++ b/test/helpers/application_test_helpers.rb
@@ -0,0 +1,108 @@
+require 'rails/test_help'
+module ApplicationTestHelpers
+
+ def self.transform_models_to_ids(object)
+ object.each_pair do |key, value|
+ if value.is_a?(Array) && value.first.is_a?(LinkedData::Client::Base)
+ object[key] = value.map(&:id)
+ elsif value.is_a?(LinkedData::Client::Base)
+ object[key] = value.id
+ end
+ end
+ object
+ end
+
+ module Users
+ def sign_in_as(username)
+ user = fixtures(:users)[username]
+ logged_in_user = LinkedData::Client::Models::User.authenticate(user.username, user.password)
+ if logged_in_user && !logged_in_user.errors
+ logged_in_user = create_user(user)
+ end
+ session[:user] = logged_in_user
+ end
+
+ def create_user(user , admin: false)
+ unless (existent_user = LinkedData::Client::Models::User.find_by_username(user.username).first)
+ values = user.to_h
+ values[:role] = ["ADMINISTRATOR"] if admin
+ existent_user = LinkedData::Client::Models::User.new(values: values).save
+ end
+
+ existent_user.password = user.password
+ existent_user
+ end
+
+ def delete_user(user)
+ LinkedData::Client::Models::User.find_by_username(user.username).first&.delete
+ end
+ end
+
+ module Ontologies
+ def create_ontology(ontology, submission)
+ ontology = LinkedData::Client::Models::Ontology.new(values: ApplicationTestHelpers.transform_models_to_ids(ontology).to_h).save
+ if ontology.errors
+ puts "Ontology creation error: #{ontology.errors}"
+ delete_ontologies([ontology])
+ ontology = LinkedData::Client::Models::Ontology.new(values: ApplicationTestHelpers.transform_models_to_ids(ontology).to_h).save
+ end
+ submission[:ontology] = ontology.id
+ submission.curatedOn = nil # TODO fix the curatedOn not saving
+ submission.naturalLanguage = Array(submission.naturalLanguage).map{|x| x.gsub('iso639-1','iso639-3')}
+ submission = LinkedData::Client::Models::OntologySubmission.new(values: ApplicationTestHelpers.transform_models_to_ids(submission).to_h).save
+ [ontology, submission]
+ end
+
+ def delete_ontologies(ontologies = @ontologies)
+ Array(ontologies).each do |o|
+ LinkedData::Client::Models::Ontology.find_by_acronym(o.acronym).first&.delete
+ end
+ end
+ end
+
+ module Categories
+ def create_category(category)
+ created = LinkedData::Client::Models::Category.new(values: category.to_h).save
+ return LinkedData::Client::Models::Category.find_by_acronym(category.acronym).first if created.errors
+ created
+ end
+
+ def create_categories(categories_data = fixtures(:categories))
+ @categories = []
+ categories_data.to_a.each do |name, category|
+ @categories << create_category(category)
+ end
+ @categories
+ end
+
+ def delete_categories(categories = LinkedData::Client::Models::Category.all)
+ Array(categories).each { |g| g.delete }
+ end
+ end
+
+ module Groups
+ def create_group(group)
+ created = LinkedData::Client::Models::Group.new(values: group.to_h).save
+ return LinkedData::Client::Models::Group.find_by_acronym(group.acronym).first if created.errors
+ created
+ end
+
+ def create_groups(groups_data = fixtures(:groups))
+ @groups = []
+ groups_data.to_a.each do |name, group|
+ @groups << create_group(group)
+ end
+ @groups
+ end
+
+ def delete_groups(groups = LinkedData::Client::Models::Group.all)
+ Array(groups).each { |g| g.delete }
+ end
+ end
+
+ module Agents
+ def delete_agents(agents = LinkedData::Client::Models::Agent.all)
+ Array(agents).each { |g| g.delete }
+ end
+ end
+end
\ No newline at end of file
diff --git a/test/integration/login_flows_test.rb b/test/integration/login_flows_test.rb
new file mode 100644
index 000000000..b19ef95f1
--- /dev/null
+++ b/test/integration/login_flows_test.rb
@@ -0,0 +1,91 @@
+# In test/integration/login_flows_test.rb
+
+require 'test_helper'
+
+require_relative '../helpers/application_test_helpers'
+
+class LoginFlowsTest < ActionDispatch::IntegrationTest
+ include ApplicationTestHelpers::Users
+
+
+ setup do
+ @user_john = fixtures(:users)[:john]
+ @user_bob = fixtures(:users)[:bob]
+ @user_bob = create_user(@user_bob)
+ end
+
+ teardown do
+ delete_user(@user_bob)
+ delete_user(@user_john)
+ end
+
+ test 'go to sign up page, save, and see account details' do
+ get root_url
+ assert_response :success
+
+ get login_index_url
+ assert_response :success
+
+ get new_user_path
+
+ new_user = @user_john
+ delete_user(new_user)
+
+ post users_path, params: {
+ user: {
+ firstName: new_user.first_name,
+ lastName: new_user.last_name,
+ username: new_user.username,
+ orcidId: new_user.orcid_id,
+ githubId: new_user.github_id,
+ email: new_user.email,
+ password: new_user.password,
+ password_confirmation: new_user.password
+ }
+ }
+
+ assert_redirected_to ontologies_url
+ follow_redirect!
+
+ assert_select '.notification', text: 'Account was successfully created'
+
+ get account_path
+ assert_response :success
+
+ assert_select '.account-page-title', text: 'My account'
+
+ assert_select '.title', text: 'First name:'
+ assert_select '.info', text: new_user.firstName
+
+ assert_select '.title', text: 'Last name:'
+ assert_select '.info', text: new_user.lastName
+
+ assert_select '.title', text: 'Email:'
+ assert_select '.info', text: new_user.email
+
+ assert_select '.title', text: 'Username:'
+ assert_select '.info', text: new_user.username
+
+ assert_select '.title', text: 'ORCID ID:'
+ assert_select '.info', text: new_user.orcidId
+
+ assert_select '.title', text: 'GitHub ID:'
+ assert_select '.info', text: new_user.githubId
+ end
+
+ test 'go to login page and click save' do
+ get login_index_url
+ assert_response :success
+ post login_index_url, params: {
+ user: {
+ username: @user_bob.username,
+ password: @user_bob.password
+ }
+ }
+
+ assert_redirected_to root_url
+ follow_redirect!
+
+ assert_select '.notification', text: "Welcome #{@user_bob.username}!"
+ end
+end
diff --git a/test/integration/submission_flows_test.rb b/test/integration/submission_flows_test.rb
new file mode 100644
index 000000000..7da33aa90
--- /dev/null
+++ b/test/integration/submission_flows_test.rb
@@ -0,0 +1,34 @@
+require 'test_helper'
+require_relative '../helpers/application_test_helpers'
+
+class SubmissionFlowsTest < ActionDispatch::IntegrationTest
+ include ApplicationTestHelpers::Users
+ include ApplicationTestHelpers::Groups
+ include ApplicationTestHelpers::Categories
+ include ApplicationTestHelpers::Ontologies
+
+ setup do
+ @logged_user = fixtures(:users)[:john]
+ @user_bob = fixtures(:users)[:bob]
+ @new_ontology = fixtures(:ontologies)[:ontology1]
+ @new_submission = fixtures(:submissions)[:submission1]
+ @groups = create_groups
+ @categories = create_categories
+ @user_bob = create_user(@user_bob)
+ @logged_user = create_user(@logged_user)
+ @new_ontology[:administeredBy] = [@logged_user.username, @user_bob.username]
+ @new_ontology[:hasDomain] = @categories[0..3]
+ @new_ontology[:group] = @groups[0..3]
+ @new_submission[:isRemote] = '1'
+ end
+
+ teardown do
+ delete_user(@user_bob)
+ delete_user(@logged_user)
+ delete_groups
+ delete_categories
+ delete_ontologies([@new_ontology])
+ end
+end
+
+
diff --git a/test/system/agent_flows_test.rb b/test/system/agent_flows_test.rb
new file mode 100644
index 000000000..d91433747
--- /dev/null
+++ b/test/system/agent_flows_test.rb
@@ -0,0 +1,103 @@
+require "application_system_test_case"
+
+class AgentFlowsTest < ApplicationSystemTestCase
+ include AgentHelper
+
+ setup do
+ @logged_user = fixtures(:users)[:john]
+ @new_person = fixtures(:agents)[:agent1]
+ @new_organization = fixtures(:agents)[:organization1]
+ login_in_as(@logged_user, admin: true)
+ end
+
+ def teardown
+ delete_agents
+ delete_user(@logged_user)
+ end
+
+ test "go admin page and create an agent person and edit it" do
+ visit admin_index_url
+ click_on "Persons & organizations"
+ wait_for_text "Create New Agent"
+
+ # Creation test
+ create_agent_flow(@new_person, person_count: 1, organization_count: 2)
+
+ # Edition test
+ @new_person2 = fixtures(:agents)[:agent2]
+ wait_for_text @new_person.name
+ edit_link = find("a[data-show-modal-title-value=\"Edit agent #{@new_person.name}\"]")
+ @new_person2.id = edit_link['href'].split('/')[-2]
+ edit_link.click
+
+ edit_agent_flow(@new_person2, person_count: 1, organization_count: 3)
+
+ end
+
+ test "go admin page and create an agent organization and edit it" do
+ visit admin_index_url
+ click_on "Persons & organizations"
+
+ # Creation test
+ create_agent_flow(@new_organization, person_count: 0, organization_count: 3)
+
+ # Edition test
+ @new_organization2 = fixtures(:agents)[:organization2]
+ wait_for_text @new_organization.name
+ edit_link = find("a[data-show-modal-title-value=\"Edit agent #{@new_organization.name}\"]")
+ @new_organization2.id = edit_link['href'].split('/')[-2]
+ edit_link.click
+
+ edit_agent_flow(@new_organization2, person_count: 0, organization_count: 5)
+ end
+
+
+ private
+ def create_agent_flow(new_agent, person_count: , organization_count:)
+ wait_for_text "Create New Agent"
+
+ # Creation test
+ click_on "Create New Agent"
+ wait_for_text "TYPE"
+ agent_fill(new_agent)
+ sleep 1
+ assert_text "New Agent added successfully"
+ find('.close').click
+ within "table#adminAgents" do
+ assert_selector '.human', count: person_count + organization_count # all created agents
+ assert_text new_agent.name
+ new_agent.identifiers.map{|x| "https://orcid.org/#{x["notation"]}"}.each do |orcid|
+ assert_text orcid
+ end
+
+ assert_text 'person', count: person_count
+ assert_text 'organization', count: organization_count
+
+ new_agent.affiliations.map do |aff|
+ aff["identifiers"] = aff["identifiers"].each{|x| x["schemaAgency"] = 'ORCID'}
+ assert_text display_agent(OpenStruct.new(aff), link: false)
+ end
+ end
+ end
+
+ def edit_agent_flow(agent, person_count: , organization_count: )
+ wait_for_text "TYPE"
+ agent_fill(agent, parent_id: agent.id)
+ # assert_text "New Agent added successfully"
+ find('.close').click
+ within "table#adminAgents" do
+ assert_selector '.human', count: person_count + organization_count # all created agents
+ assert_text agent.name
+ agent.identifiers.map{|x| "https://orcid.org/#{x["notation"]}"}.each do |orcid|
+ assert_text orcid
+ end
+ assert_text 'person', count: person_count
+ assert_text 'organization', count: organization_count
+
+ agent.affiliations.map do |aff|
+ aff["identifiers"] = aff["identifiers"].each{|x| x["schemaAgency"] = 'ORCID'}
+ assert_text display_agent(OpenStruct.new(aff), link: false)
+ end
+ end
+ end
+end
diff --git a/test/system/login_flows_test.rb b/test/system/login_flows_test.rb
new file mode 100644
index 000000000..d7c7caf4e
--- /dev/null
+++ b/test/system/login_flows_test.rb
@@ -0,0 +1,75 @@
+require "application_system_test_case"
+
+class LoginFlowsTest < ApplicationSystemTestCase
+
+ setup do
+ @user_john = fixtures(:users)[:john]
+ @user_bob = create_user(fixtures(:users)[:bob])
+ end
+
+ teardown do
+ delete_user(@user_bob)
+ delete_user(@user_john)
+ end
+
+ test "go to sign up page, save and see account details" do
+ visit root_url
+ click_on 'Login'
+
+ click_on 'Register'
+
+ new_user = @user_john
+ delete_user(new_user)
+
+ LinkedData::Client::Models::User.find_by_username(new_user.username).first&.delete
+
+ fill_in 'user_firstName', with: new_user.first_name
+ fill_in 'user_lastName', with: new_user.last_name
+ fill_in 'user_username', with: new_user.username
+ fill_in 'user_orcidId', with: new_user.orcid_id
+ fill_in 'user_githubId', with: new_user.github_id
+ fill_in 'user_email', with: new_user.email
+ fill_in 'user_password', with: new_user.password
+ fill_in 'user_password_confirmation', with: new_user.password
+
+ # Click the save button
+ click_button 'Register'
+
+
+ assert_selector '.notification', text: 'Account was successfully created'
+
+ visit root_url + '/account'
+
+ assert_selector '.account-page-title', text: 'My account'
+
+ assert_selector '.title', text: 'First name:'
+ assert_selector '.info', text: new_user.firstName
+
+ assert_selector '.title', text: 'Last name:'
+ assert_selector '.info', text: new_user.lastName
+
+ assert_selector '.title', text: 'Email:'
+ assert_selector '.info', text: new_user.email
+
+ assert_selector '.title', text: 'Username:'
+ assert_selector '.info', text: new_user.username
+
+ assert_selector '.title', text: 'ORCID ID:'
+ assert_selector '.info', text: new_user.orcidId
+
+ assert_selector '.title', text: 'GitHub ID:'
+ assert_selector '.info', text: new_user.githubId
+
+ assert_selector '.account-page-card-title', text: 'API Key'
+ assert_selector '.account-page-card-title', text: 'Subscriptions'
+ assert_selector '.account-page-card-title', text: 'Submitted Semantic Resources'
+ assert_selector '.account-page-card-title', text: 'Projects Created'
+
+ end
+
+ test "go to login page and click save" do
+ login_in_as(@user_bob)
+
+ assert_selector '.notification', text: "Welcome #{@user_bob.username}!", wait: 10
+ end
+end
diff --git a/test/system/submission_flows_test.rb b/test/system/submission_flows_test.rb
new file mode 100644
index 000000000..b00e39ed7
--- /dev/null
+++ b/test/system/submission_flows_test.rb
@@ -0,0 +1,652 @@
+require "application_system_test_case"
+
+class SubmissionFlowsTest < ApplicationSystemTestCase
+
+ setup do
+ @logged_user = fixtures(:users)[:john]
+ @user_bob = fixtures(:users)[:bob]
+ @new_ontology = fixtures(:ontologies)[:ontology1]
+ @new_submission = fixtures(:submissions)[:submission1]
+ teardown
+ @groups = create_groups
+ @categories = create_categories
+ @user_bob = create_user(@user_bob)
+ @new_ontology[:administeredBy] = [@logged_user.username, @user_bob.username]
+ @new_ontology[:hasDomain] = @categories[0..3]
+ @new_ontology[:group] = @groups[0..3]
+ @new_submission[:isRemote] = '1'
+
+ login_in_as(@logged_user, admin: true)
+ end
+
+ teardown do
+ delete_user(@user_bob)
+ delete_user(@logged_user)
+ delete_ontologies([@new_ontology])
+ delete_groups
+ delete_categories
+ delete_agents
+ end
+
+ test "create a new ontology and go to it's summary page" do
+ visit new_ontology_url
+
+ assert_text 'Submit new ontology', wait: 10
+
+ fill_ontology(@new_ontology, @new_submission)
+
+ assert_selector 'h2', text: 'Ontology submitted successfully!'
+ click_on current_url.gsub("/ontologies/success/#{@new_ontology.acronym}", '') + ontology_path(@new_ontology.acronym)
+
+ assert_text "#{@new_ontology.name} (#{@new_ontology.acronym})"
+ assert_selector '.alert-message', text: "The ontology is processing."
+
+ @new_ontology.hasDomain.each do |cat|
+ assert_text cat.name
+ end
+
+
+ assert_text @new_submission.URI
+ assert_text @new_submission.description
+ assert_text @new_submission.pullLocation
+ assert_date @new_submission.released
+
+ # check
+ assert_selector '.fas.fa-key' if @new_submission.status.eql?('private')
+
+ # check
+ assert_selector '.chip_button_container.chip_button_small', text: @new_submission.hasOntologyLanguage
+
+ @new_submission.contact.each do |contact|
+ assert_text contact["name"]
+ assert_text contact["email"]
+ end
+
+ # Assert relations
+ open_dropdown "#community"
+
+ @new_ontology.group.each do |group|
+ assert_text group.name
+ end
+
+ end
+
+ test "click on button edit submission and change all the fields and save" do
+ submission_2 = fixtures(:submissions)[:submission2]
+ ontology_2 = fixtures(:ontologies)[:ontology2]
+ create_ontology(@new_ontology, @new_submission)
+ visit ontology_path(@new_ontology.acronym)
+
+ # click edit button
+ find("a.rounded-button[href=\"#{edit_ontology_path(@new_ontology.acronym)}\"]").click
+ sleep 1
+
+ selected_categories = @categories[3..4]
+ selected_groups = Array(@groups[2])
+
+ within 'form#ontology_submission_form' do
+
+ # General tab
+ submission_general_edit_fill(ontology_2, submission_2,
+ selected_groups: selected_groups,
+ selected_categories: selected_categories)
+ # Description tab
+ click_on "Description"
+ submission_description_edit_fill(submission_2)
+
+ # Dates tab
+ click_on "Dates"
+ submission_date_edit_fill(submission_2)
+
+ # Licencing tab
+ click_on "Licensing"
+ submission_licensing_edit_fill(ontology_2, submission_2)
+
+
+ # Persons and organizations tab
+ click_on "Persons and organizations"
+ submission_agent_edit_fill(submission_2)
+
+ # Links tab
+ click_on "Links"
+ submission_links_edit_fill(submission_2)
+ # Media tab
+ click_on "Media"
+ submission_media_edit_fill(submission_2)
+
+ # Community tab
+ click_on "Community"
+ submission_community_edit_fill(submission_2)
+
+ # Usage tab
+ click_on "Usage"
+ submission_usage_edit_fill(submission_2)
+
+ # Relation tab
+ click_on "Relation"
+ submission_relations_edit_fill(submission_2)
+
+ # Content tab
+ click_on "Content"
+ submission_content_edit_fill(submission_2)
+
+ # Methodology tab
+ click_on "Methodology"
+ submission_methodology_fill(submission_2)
+
+ click_button 'save-button'
+ end
+ sleep 1
+ wait_for '.notification'
+ assert_selector '.notification', text: "Submission updated successfully"
+ assert_text "#{ontology_2.name} (#{@new_ontology.acronym})"
+
+ selected_categories.each do |cat|
+ assert_text cat.name
+ end
+
+ assert_text submission_2.URI
+ assert_text submission_2.versionIRI
+ assert_selector '#submission-status', text: submission_2.version
+ assert_selector ".flag-icon-fr" # todo fix this
+ submission_2.identifier.each do |id|
+ assert_text id
+ end
+
+ assert_text submission_2.description
+
+ submission_2.keywords.each do |key|
+ assert_text key
+ end
+
+ assert_selector "a[href=\"#{submission_2.homepage}\"]"
+ assert_selector "a[href=\"#{submission_2.documentation}\"]"
+ assert_selector "a[href=\"#{Array(submission_2.publication).last}\"]" # TODO the publication display is an array can't be an Icon
+ assert_text submission_2.abstract
+
+ open_dropdown "#dates"
+ assert_date submission_2.released
+ assert_date submission_2.valid
+ submission_2.curatedOn.each do |date|
+ assert_date date
+ end
+ assert_date submission_2.creationDate
+ assert_date submission_2.modificationDate
+
+ # Assert media
+ open_dropdown "#link"
+ # associatedMedia not displayed for now
+ # submission_2.associatedMedia.each do |media|
+ # assert_text media
+ # end
+
+ submission_2.depiction.map do |d|
+ assert_selector "img[src=\"#{d}\"]"
+ end
+
+ assert_selector "img[src=\"#{submission_2.logo}\"]"
+
+ # Assert links
+ assert_selector "a[href=\"#{submission_2.repository}\"]"
+
+ # Assert persons and organizations
+ open_dropdown "#person_and_organization"
+
+ agent1 = fixtures(:agents)[:agent1]
+ agent2 = fixtures(:agents)[:agent2]
+
+ assert_text agent1.name, count: 3
+ assert_text agent2.name, count: 3
+
+ # Assert usage
+ open_dropdown "#projects_section"
+ usage_properties = [
+ :coverage, :knownUsage,
+ :hasDomain, :example
+ ]
+ usage_properties.each do |property|
+ Array(submission_2[property]).each { |v| assert_text v } # check
+ end
+
+ submission_2.designedForOntologyTask.each do |task|
+ assert_text task.delete(' ') # TODO fix in the UI the disaply of taskes
+ end
+
+ # Assert Methodology
+ open_dropdown "#methodology"
+ methodology_properties = [
+ :conformsToKnowledgeRepresentationParadigm,
+ :usedOntologyEngineeringMethodology,
+ :accrualPolicy
+ ]
+
+ methodology_properties.each do |key|
+ Array(submission_2[key]).map { |x| assert_text x }
+ end
+
+ [:competencyQuestion, :wasGeneratedBy, :wasInvalidatedBy].each do |key|
+ 2.times.map { |i| assert_text "#{key}-#{i}" }
+ end
+
+ assert_text submission_2.accrualPeriodicity.split('/').last.downcase
+
+ # Assert Community
+ open_dropdown "#community"
+ assert_text submission_2.bugDatabase
+ assert_text submission_2.mailingList
+ [:toDoList, :notes, :award].each do |key|
+ Array(submission_2[key]).map { |x| assert_text x }
+ end
+
+ selected_groups.each do |group|
+ assert_text group.name
+ end
+
+ # Assert Content
+ open_dropdown "#content"
+ assert_text submission_2.obsoleteParent
+ assert_text submission_2.exampleIdentifier
+ assert_text submission_2.uriRegexPattern
+ assert_text submission_2.preferredNamespaceUri
+ assert_text submission_2.preferredNamespacePrefix
+
+ # assert submission_2.metadataVoc
+ assert_text "rdfs"
+ assert_text "dct"
+
+
+ open_dropdown "#configuration"
+
+ submission_2.keyClasses.each do |key|
+ assert_text key
+ end
+
+ # Assert relations
+ click_on "See all metadata"
+ sleep 1
+ within "#application_modal_content" do
+ wait_for 'input[type="search"]'
+ find('input').set('hasPriorVersion')
+ assert_text submission_2.hasPriorVersion
+
+ submission_2.alternative.each do |alt|
+ find('input').set('alternative')
+ assert_text alt
+ end
+
+ submission_2.hiddenLabel.each do |alt|
+ find('input').set('hiddenLabel')
+ assert_text alt
+ end
+
+ relations = [:hasPart, :ontologyRelatedTo, :similarTo, :comesFromTheSameDomain,
+ :isAlignedTo, :isBackwardCompatibleWith, :isIncompatibleWith,
+ :hasDisparateModelling, :hasDisjunctionsWith, :generalizes,
+ :explanationEvolution, :useImports,
+ :usedBy, :workTranslation, :translationOfWork
+ ]
+ relations.each do |key|
+ find('input').set(key)
+ 2.times.each { |id| assert_text "https://#{key}.2.#{id}.com" }
+ end
+ end
+
+ end
+
+ test "click on button add submission, create a new submission and go to it's summary page" do
+ submission_2 = fixtures(:submissions)[:submission2]
+ ontology_2 = fixtures(:ontologies)[:ontology2]
+ ontology_2[:administeredBy] = [@logged_user.username, @user_bob.username]
+ ontology_2[:hasDomain] = @categories.sample(3)
+ ontology_2[:group] = @groups.sample(2)
+ submission_2[:isRemote] = '1'
+
+ new_ontology1 = @new_ontology
+ existent_ontology = new_ontology1
+ existent_submission = @new_submission
+ existent_submission[:submissionStatus] = %w[ERROR_RDF UPLOADED]
+ create_ontology(existent_ontology, existent_submission)
+ visit ontology_path(existent_ontology.acronym)
+
+ # click add button
+ find("a.rounded-button[href=\"#{new_ontology_submission_path(existent_ontology.acronym)}\"]").click
+ sleep 1
+ # assert existent
+
+ assert_equal existent_ontology.name, find_field('ontology[name]').value
+ assert_equal existent_ontology.acronym, find_field('ontology[acronym]', disabled: true).value
+ # assert_equal existent_submission.administeredBy, find_field('ontology[administeredBy]').value
+ # assert_equal existent_submission.hasDomain, find_field('ontology[viewingRestriction]').value
+
+ click_button 'Next'
+
+ assert_equal existent_submission.URI, find_field('submission[URI]').value
+ assert_equal existent_submission.description, find_field('submission[description]').value
+ assert_equal existent_submission.hasOntologyLanguage, find_field('submission[hasOntologyLanguage]', visible: false).value
+ assert_equal existent_submission.notes.sort, all('[name^="submission[notes]"]').map(&:value).sort
+ assert_equal existent_submission.pullLocation, find_field('submission[pullLocation]').value
+
+ click_button 'Next'
+
+ assert_equal Date.parse(existent_submission.modificationDate).to_s, find('[name="submission[modificationDate]"]', visible: false).value
+ assert_equal existent_submission.contact.map(&:values).flatten.sort, all('[name^="submission[contact]"]').map(&:value).sort
+
+ # fill new version metadata
+ click_button 'Back'
+ sleep 0.5
+ click_button 'Back'
+
+
+ fill_ontology(ontology_2, submission_2, add_submission: true)
+
+
+ assert_selector 'h2', text: 'Ontology submitted successfully!'
+ click_on current_url.gsub("/ontologies/success/#{existent_ontology.acronym}", '') + ontology_path(existent_ontology.acronym)
+
+ assert_text "#{ontology_2.name} (#{existent_ontology.acronym})"
+ assert_selector '.alert-message', text: "The ontology is processing."
+
+ ontology_2.hasDomain.each do |cat|
+ assert_text cat.name
+ end
+
+ refute_text 'Version IRI'
+ assert_text existent_submission.version, count: 1
+
+ assert_text submission_2.URI
+ assert_text submission_2.description
+ assert_text submission_2.pullLocation
+
+
+ # check
+ assert_selector '.fas.fa-key' if submission_2.status.eql?('private')
+
+ # check
+ assert_selector '.chip_button_container.chip_button_small', text: submission_2.hasOntologyLanguage
+
+ submission_2.contact.each do |contact|
+ assert_text contact["name"]
+ assert_text contact["email"]
+ end
+
+ open_dropdown "#community"
+
+ ontology_2.group.each do |group|
+ assert_text group.name
+ end
+
+
+ open_dropdown "#dates"
+ assert_date submission_2.modificationDate
+ assert_date existent_submission.released
+
+ refute_text 'Validity date'
+ refute_text 'Curation date'
+ end
+
+ private
+
+ def submission_general_edit_fill(ontology, submission, selected_categories:, selected_groups:)
+ wait_for_text 'Acronym'
+
+ assert_text 'Acronym'
+ assert_selector 'input[name="ontology[acronym]"][disabled="disabled"]'
+ fill_in 'ontology[name]', with: ontology.name
+ tom_select 'submission[hasOntologyLanguage]', submission.hasOntologyLanguage
+
+ list_checks selected_categories.map(&:acronym), @categories.map(&:acronym)
+ list_checks selected_groups.map(&:acronym), @groups.map(&:acronym)
+
+ tom_select 'ontology[administeredBy][]', [@user_bob.username]
+
+ fill_in 'submission[URI]', with: submission.URI
+ fill_in 'submission[versionIRI]', with: submission.versionIRI
+ fill_in 'submission[version]', with: submission.version
+ tom_select 'submission[status]', submission.status
+
+ # TODO test deprecated
+
+ tom_select 'submission[hasFormalityLevel]', submission.hasFormalityLevel
+ tom_select 'submission[hasOntologySyntax]', submission.hasOntologySyntax
+ tom_select 'submission[naturalLanguage][]', submission.naturalLanguage
+ tom_select 'submission[isOfType]', submission.isOfType
+
+ list_inputs "#submissionidentifier_from_group_input",
+ "submission[identifier]",
+ submission.identifier
+ end
+
+ def submission_description_edit_fill(submission)
+ wait_for '[name="submission[description]"]'
+
+ fill_in 'submission[description]', with: submission.description
+ fill_in 'submission[abstract]', with: submission.abstract
+ fill_in 'submission[homepage]', with: submission.homepage
+ fill_in 'submission[documentation]', with: submission.documentation
+
+ list_inputs "#submissionnotes_from_group_input",
+ "submission[notes]", submission.notes
+
+ list_inputs "#submissionkeywords_from_group_input",
+ "submission[keywords]", submission.keywords
+
+ list_inputs "#submissionhiddenLabel_from_group_input",
+ "submission[hiddenLabel]", submission.hiddenLabel
+
+ list_inputs "#submissionalternative_from_group_input",
+ "submission[alternative]", submission.alternative
+
+ list_inputs "#submissionpublication_from_group_input",
+ "submission[publication]", submission.publication
+
+ end
+
+ def submission_date_edit_fill(submission)
+ wait_for_text "Submission date"
+
+ date_picker_fill_in 'submission[released]', submission.released
+ date_picker_fill_in 'submission[valid]', submission.valid
+ list_inputs "#submissioncuratedOn_from_group_input",
+ "submission[curatedOn]", submission.curatedOn do |selector, value, index|
+ date_picker_fill_in selector, value, index + 1
+ end
+
+ date_picker_fill_in 'submission[creationDate]', submission.creationDate
+ date_picker_fill_in 'submission[modificationDate]', submission.modificationDate
+
+ end
+
+ def submission_licensing_edit_fill(ontology, submission)
+ wait_for_text "Visibility"
+
+ tom_select 'ontology[viewingRestriction]', ontology.viewingRestriction
+ tom_select 'submission[hasLicense]', 'CC Attribution 3.0'
+ fill_in 'submission[useGuidelines]', with: submission.useGuidelines
+ fill_in 'submission[morePermissions]', with: submission.morePermissions
+
+ within "#submissioncopyrightHolder_from_group_input" do
+ new_agent = fixtures(:agents)[:agent1]
+ agent_id = agent_search(new_agent.name)
+ agent_fill(new_agent, parent_id: agent_id)
+ end
+
+ end
+
+ def submission_agent_edit_fill(submission)
+ # TODO use list_inputs
+ wait_for_text "Contact"
+
+ list_inputs "#submissioncontact_from_group_input", "submission[contact]", submission.contact
+
+
+ agent1 = fixtures(:agents)[:agent1]
+ agent2 = fixtures(:agents)[:agent2]
+
+ [:hasCreator, :hasContributor, :curatedBy].each do |key|
+ list_inputs "#submission#{key}_from_group_input", "submission[#{key}]", [agent1, agent2] do |selector, value, index|
+ element = all("turbo-frame:last-of-type").last
+ within element do
+ agent_id = agent_search(value.name)
+ agent_fill(value, parent_id: agent_id) if agent_id
+ end
+ end
+ end
+
+ # TODO agents test
+ end
+
+ def submission_links_edit_fill(submission)
+ wait_for_text "Location"
+
+ choose 'submission[isRemote]', option: '1'
+ fill_in 'submission[pullLocation]', with: submission.pullLocation
+ list_inputs "#submissionsource_from_group_input",
+ "submission[source]", submission.source
+ list_inputs "#submissionendpoint_from_group_input",
+ "submission[endpoint]", submission.endpoint
+ tom_select 'submission[includedInDataCatalog][]', submission.includedInDataCatalog
+ end
+
+ def submission_media_edit_fill(submission)
+ wait_for_text "Depiction"
+
+ list_inputs "#submissionassociatedMedia_from_group_input",
+ "submission[associatedMedia]", submission.associatedMedia
+
+ list_inputs "#submissiondepiction_from_group_input",
+ "submission[depiction]", submission.depiction
+
+ fill_in 'submission[logo]', with: submission.logo
+ end
+
+ def submission_community_edit_fill(submission)
+ wait_for_text "Audience"
+
+ fill_in 'submission[audience]', with: submission.audience
+ fill_in 'submission[repository]', with: submission.repository
+ fill_in 'submission[bugDatabase]', with: submission.bugDatabase
+ fill_in 'submission[mailingList]', with: submission.mailingList
+
+ list_inputs "#submissiontoDoList_from_group_input",
+ "submission[toDoList]", submission.toDoList
+ list_inputs "#submissionaward_from_group_input",
+ "submission[award]", submission.award
+
+ end
+
+ def submission_usage_edit_fill(submission)
+ wait_for_text "Known usage"
+ list_inputs "#submissionknownUsage_from_group_input",
+ "submission[knownUsage]", submission.knownUsage
+
+ tom_select 'submission[designedForOntologyTask][]', submission.designedForOntologyTask
+
+ list_inputs "#submissionhasDomain_from_group_input",
+ "submission[hasDomain]", submission.hasDomain
+
+ fill_in 'submission[coverage]', with: submission.coverage
+
+ list_inputs "#submissionexample_from_group_input",
+ "submission[example]", submission.example
+ end
+
+ def submission_content_edit_fill(submission)
+ wait_for_text "Root of obsolete branch"
+
+ fill_in "submission[obsoleteParent]", with: submission.obsoleteParent
+ fill_in "submission[uriRegexPattern]", with: submission.uriRegexPattern
+ fill_in "submission[preferredNamespaceUri]", with: submission.preferredNamespaceUri
+ fill_in "submission[preferredNamespacePrefix]", with: submission.preferredNamespacePrefix
+ fill_in "submission[exampleIdentifier]", with: submission.exampleIdentifier
+ list_inputs "#submissionkeyClasses_from_group_input",
+ "submission[keyClasses]", submission.keyClasses
+ tom_select "submission[metadataVoc][]", submission.metadataVoc
+
+ end
+
+ def submission_relations_edit_fill(submission)
+ wait_for_text "Prior version"
+
+ # TODO ontology view check in
+
+ fill_in "submission[hasPriorVersion]", with: submission.hasPriorVersion
+ relations = [:hasPart, :ontologyRelatedTo, :similarTo, :comesFromTheSameDomain,
+ :isAlignedTo, :isBackwardCompatibleWith, :isIncompatibleWith,
+ :hasDisparateModelling, :hasDisjunctionsWith, :generalizes,
+ :explanationEvolution, :useImports,
+ :usedBy, :workTranslation, :translationOfWork
+ ]
+
+ relations.each do |key|
+ tom_select "submission[#{key}][]", 2.times.map { |id| "https://#{key}.2.#{id}.com" }, open_to_add: true
+ end
+ end
+
+ def submission_methodology_fill(submission)
+ wait_for_text "Knowledge representation paradigm"
+
+ fill_in "submission[conformsToKnowledgeRepresentationParadigm]", with: submission.conformsToKnowledgeRepresentationParadigm
+ fill_in "submission[usedOntologyEngineeringMethodology]", with: submission.usedOntologyEngineeringMethodology
+ tom_select "submission[usedOntologyEngineeringTool][]", submission.usedOntologyEngineeringTool
+
+ list_inputs "#submissionaccrualMethod_from_group_input",
+ "submission[accrualMethod]", submission.accrualMethod
+
+ tom_select "submission[accrualPeriodicity]", submission.accrualPeriodicity
+
+ fill_in "submission[accrualPolicy]", with: submission.accrualPolicy
+
+ [:competencyQuestion, :wasGeneratedBy, :wasInvalidatedBy].each do |key|
+ list_inputs "#submission#{key}_from_group_input",
+ "submission[#{key}]", 2.times.map { |i| "#{key}-#{i}" }
+ end
+ end
+
+ def open_dropdown(target)
+ find(".dropdown-container .dropdown-title-bar[data-target=\"#{target}\"]").click
+ sleep 1
+ end
+
+ def fill_ontology(new_ontology, new_submission, add_submission: false)
+ within 'form#ontologyForm' do
+ # Page 1
+ fill_in 'ontology[name]', with: new_ontology.name
+ fill_in 'ontology[acronym]', with: new_ontology.acronym unless add_submission
+
+ tom_select 'ontology[viewingRestriction]', new_ontology.viewingRestriction
+ tom_select 'ontology[administeredBy][]', new_ontology.administeredBy
+
+ list_checks new_ontology.hasDomain.map(&:acronym), @categories.map(&:acronym)
+ list_checks new_ontology.group.map(&:acronym), @groups.map(&:acronym)
+
+
+ click_button 'Next'
+
+ # Page 2
+ fill_in 'submission[URI]', with: new_submission.URI
+ fill_in 'submission[description]', with: new_submission.description
+
+ if add_submission
+ list_inputs "#submissionnotes_from_group_input", "submission[notes]", new_submission.notes
+ end
+ tom_select 'submission[hasOntologyLanguage]', new_submission.hasOntologyLanguage
+ tom_select 'submission[status]', new_submission.status
+
+ choose 'submission[isRemote]', option: new_submission.isRemote
+ fill_in 'submission[pullLocation]', with: new_submission.pullLocation
+
+ click_button 'Next'
+
+ # Page 3
+ if add_submission
+ date_picker_fill_in 'submission[modificationDate]', new_submission.modificationDate
+ else
+ date_picker_fill_in 'submission[released]', new_submission.released
+ end
+
+ list_inputs "#submissioncontact_from_group_input", "submission[contact]", new_submission.contact
+
+ click_button 'Finish'
+ end
+ end
+end
\ No newline at end of file
diff --git a/test/test_helper.rb b/test/test_helper.rb
index a21ff2216..1083b2287 100644
--- a/test/test_helper.rb
+++ b/test/test_helper.rb
@@ -1,13 +1,44 @@
ENV['RAILS_ENV'] ||= 'test'
require_relative '../config/environment'
require 'rails/test_help'
+require 'simplecov'
+
+SimpleCov.start 'rails' do
+ add_filter '/bin/'
+ add_filter '/db/'
+ add_filter '/test/'
+ add_filter '/vendor/'
+end
class ActiveSupport::TestCase
# Run tests in parallel with specified workers
parallelize(workers: 1)
- # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
- fixtures :all
-
# Add more helper methods to be used by all tests here...
+
+
+ Capybara.server_host = "0.0.0.0"
+ Capybara.app_host = "http://#{Socket.gethostname}:#{Capybara.server_port}"
+end
+
+# Define the fixtures helper method
+def fixtures(fixture_name)
+ @global_fixtures ||= load_all_fixtures
+ @global_fixtures[fixture_name.to_s]
+end
+
+# Load all fixtures method
+def load_all_fixtures
+ fixtures_directory = Rails.root.join('test', 'fixtures')
+ fixture_files = Dir.glob(File.join(fixtures_directory, '*.yml'))
+
+ fixtures_data = {}
+
+ fixture_files.each do |fixture_file|
+ fixture_name = File.basename(fixture_file, '.yml')
+ data = YAML.load_file(fixture_file)
+ fixtures_data[fixture_name] = OpenStruct.new(Array(data).map{|key, hash| [key , OpenStruct.new(hash)]}.to_h)
+ end
+
+ fixtures_data
end
\ No newline at end of file
diff --git a/yarn.lock b/yarn.lock
index a16ad8d21..6ef271967 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,6 +2,13 @@
# yarn lockfile v1
+"@babel/runtime@^7.21.0":
+ version "7.22.10"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.10.tgz#ae3e9631fd947cb7e3610d3e9d8fef5f76696682"
+ integrity sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==
+ 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"
@@ -37,10 +44,27 @@
resolved "https://registry.yarnpkg.com/@orchidjs/unicode-variants/-/unicode-variants-1.0.4.tgz#6d2f812e3b19545bba2d81caffff1204de9a6a58"
integrity sha512-NvVBRnZNE+dugiXERFsET1JlKZfM5lJDEpSMilKW4bToYJ7pxf0Zne78xyXB2ny2c2aHfJ6WLnz1AaTNHAmQeQ==
+"@popperjs/core@^2.9.0":
+ version "2.11.8"
+ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f"
+ integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==
+
"@rails/actioncable@^7.0":
- version "7.0.4"
- resolved "https://registry.yarnpkg.com/@rails/actioncable/-/actioncable-7.0.4.tgz#70a3ca56809f7aaabb80af2f9c01ae51e1a8ed41"
- integrity sha512-tz4oM+Zn9CYsvtyicsa/AwzKZKL+ITHWkhiu7x+xF77clh2b4Rm+s6xnOgY/sGDWoFWZmtKsE95hxBPkgQQNnQ==
+ version "7.0.5"
+ resolved "https://registry.yarnpkg.com/@rails/actioncable/-/actioncable-7.0.5.tgz#bbc11203e0d3d5084002abfcf01d621fdf5f3a9d"
+ integrity sha512-SOBA2heB9lTw0VYIx8M/ed7inSf4I9sR8OIlJprhgkfQ3WJtrxPJ6DDATR1Z3RYaIR7HlT2Olj08v1lfGIGuHA==
+
+date-fns@^2.29.3:
+ version "2.30.0"
+ resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0"
+ integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==
+ dependencies:
+ "@babel/runtime" "^7.21.0"
+
+debounce@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5"
+ integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==
esbuild-android-64@0.14.54:
version "0.14.54"
@@ -174,6 +198,11 @@ flatpickr@^4.6.13:
resolved "https://registry.yarnpkg.com/flatpickr/-/flatpickr-4.6.13.tgz#8a029548187fd6e0d670908471e43abe9ad18d94"
integrity sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw==
+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==
+
split.js@^1.6.5:
version "1.6.5"
resolved "https://registry.yarnpkg.com/split.js/-/split.js-1.6.5.tgz#f7f61da1044c9984cb42947df4de4fadb5a3f300"
@@ -196,6 +225,25 @@ stimulus-read-more@^4.1.0:
resolved "https://registry.yarnpkg.com/stimulus-read-more/-/stimulus-read-more-4.1.0.tgz#f34efb2dcb33fd091936d84c569937bc100506c8"
integrity sha512-SJyCJqZrhDSKpfrepnhStBaxtyv6Jnvr+b84GDg3l+/BzL5HaFLYmc6QkSNCeR6y0x+Zw7lwKuzv+XzyAm1KzQ==
+stimulus-reveal-controller@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/stimulus-reveal-controller/-/stimulus-reveal-controller-4.1.0.tgz#bf0fb4c2706f22d41544b5b02e2fbd794f608575"
+ integrity sha512-cPpTLV/+IQgiE+J3iBMjf3kD3H9ZOeoRJjyhvcsjyPE82mdcsuWxlzpI1pwSJPN66qSud4hVkhNH5w4xadyOfA==
+
+stimulus-timeago@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/stimulus-timeago/-/stimulus-timeago-4.1.0.tgz#5e4b712d9eadd7f0e2b3b142f35f334dba4b3857"
+ integrity sha512-CHcB2rko2ItmDMIhBTaxEMe7sKqI0DOMU8dmWuQ+gzDfoxcrA8DAW/BElHAAw26HVqLTA43RSUsfug8Q+2Ua+g==
+ dependencies:
+ date-fns "^2.29.3"
+
+tippy.js@^6.3.7:
+ version "6.3.7"
+ resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-6.3.7.tgz#8ccfb651d642010ed9a32ff29b0e9e19c5b8c61c"
+ integrity sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==
+ dependencies:
+ "@popperjs/core" "^2.9.0"
+
tom-select@^2.2.2:
version "2.2.2"
resolved "https://registry.yarnpkg.com/tom-select/-/tom-select-2.2.2.tgz#8e5f9296e6d80254feccb57f0986bd6c44d126e2"
@@ -203,3 +251,18 @@ tom-select@^2.2.2:
dependencies:
"@orchidjs/sifter" "^1.0.3"
"@orchidjs/unicode-variants" "^1.0.4"
+
+vis-data@^7.1.6:
+ version "7.1.6"
+ resolved "https://registry.yarnpkg.com/vis-data/-/vis-data-7.1.6.tgz#81dcf4d024d23183cacb680ad605e644cdd6ee6c"
+ integrity sha512-lG7LJdkawlKSXsdcEkxe/zRDyW29a4r7N7PMwxCPxK12/QIdqxJwcMxwjVj9ozdisRhP5TyWDHZwsgjmj0g6Dg==
+
+vis-network@^9.1.6:
+ version "9.1.6"
+ resolved "https://registry.yarnpkg.com/vis-network/-/vis-network-9.1.6.tgz#943df07e829248943656a2f19a7ec87cc1b707de"
+ integrity sha512-Eiwx1JleAsUqfy4pzcsFngCVlCEdjAtRPB/OwCV7PHBm+o2jtE4IZPcPITAEGUlxvL4Fdw7/lZsfD32dL+IL6g==
+
+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==