From 6f3ddc4ad6bbc67794d99b515ee8cdcf585b083e Mon Sep 17 00:00:00 2001
From: Svilen Velikov <51084653+svilenvelikov@users.noreply.github.com>
Date: Wed, 27 Mar 2024 10:13:29 +0200
Subject: [PATCH] GDB-9969 import view help messages (#1328)
* Reimplemented help message.
* Add import view persistence service backed by the local storage.
* Add upload limit file size info alert.
* Removed the watcher for the opened tab and replaced with explicit call to a new function `openTab(tabId)` which now handles the tab initialization.
* Fix fat button text and icons align when on lower resolutions.
* Split tests for user data tab.
* Implemented additional tests for the help messages.
* Implemented persistence for the help message on the empty state. Added more tests.
* Add more code documentation
* Skip copy to clipboard check test
---
src/app.js | 2 +
src/css/import.css | 26 +-
src/i18n/locale-en.json | 226 +++++-----
src/i18n/locale-fr.json | 228 +++++-----
.../copy-to-clipboard.directive.js | 57 +++
src/js/angular/import/controllers.js | 121 +++--
.../angular/import/import-context.service.js | 60 +++
.../import/import-view-storage.service.js | 62 +++
.../angular/import/templates/commonInfo.html | 6 -
.../import/templates/fileSizeLimitInfo.html | 6 +
.../angular/import/templates/filesTable.html | 2 +-
.../angular/import/templates/importInfo.html | 16 +-
.../angular/import/templates/uploadInfo.html | 18 +-
.../angular/models/import/import-settings.js | 53 +++
.../models/import/import-view-persistence.js | 23 +
src/js/angular/utils/local-storage-adapter.js | 3 +-
src/pages/import.html | 94 ++--
test-cypress/fixtures/locale-en.json | 226 +++++-----
.../import/import-from-url.spec.js | 82 ++++
.../import/import-text-snippet.spec.js | 335 ++++++++++++++
.../import/import-user-data-tab.spec.js | 114 +++++
.../import/import.server.files.spec.js | 9 +-
.../import/import.user.data.spec.js | 416 ------------------
test-cypress/steps/import-steps.js | 99 ++++-
24 files changed, 1478 insertions(+), 806 deletions(-)
create mode 100644 src/js/angular/core/directives/copy-to-clipboard/copy-to-clipboard.directive.js
create mode 100644 src/js/angular/import/import-context.service.js
create mode 100644 src/js/angular/import/import-view-storage.service.js
delete mode 100644 src/js/angular/import/templates/commonInfo.html
create mode 100644 src/js/angular/import/templates/fileSizeLimitInfo.html
create mode 100644 src/js/angular/models/import/import-settings.js
create mode 100644 src/js/angular/models/import/import-view-persistence.js
create mode 100644 test-cypress/integration/import/import-from-url.spec.js
create mode 100644 test-cypress/integration/import/import-text-snippet.spec.js
create mode 100644 test-cypress/integration/import/import-user-data-tab.spec.js
delete mode 100644 test-cypress/integration/import/import.user.data.spec.js
diff --git a/src/app.js b/src/app.js
index efa88b803..def307d77 100644
--- a/src/app.js
+++ b/src/app.js
@@ -8,6 +8,7 @@ import 'angular/core/interceptors/unauthorized.interceptor';
import 'angular/core/interceptors/authentication.interceptor';
import 'angular/core/directives/rdfresourcesearch/rdf-resource-search.directive';
import 'angular/core/directives/languageselector/language-selector.directive';
+import 'angular/core/directives/copy-to-clipboard/copy-to-clipboard.directive';
import 'angular/core/directives/angulartooltips/angular-tooltips.js';
import 'angular/core/directives/uppercased.directive';
import 'angular/core/directives/operations-statuses-monitor/operations-statuses-monitor.directive';
@@ -33,6 +34,7 @@ const modules = [
'graphdb.framework.core.interceptors.authentication',
'graphdb.framework.core.directives.rdfresourcesearch.rdfresourcesearch',
'graphdb.framework.core.directives.languageselector.languageselector',
+ 'graphdb.framework.core.directives.copytoclipboard.copytoclipboard',
'graphdb.framework.core.directives.angular-tooltips',
'graphdb.framework.core.directives.uppercased',
'graphdb.framework.guides.services',
diff --git a/src/css/import.css b/src/css/import.css
index bb21b2336..a3986dbe4 100644
--- a/src/css/import.css
+++ b/src/css/import.css
@@ -4,7 +4,8 @@
flex-flow: row wrap;
}
-.upload-buttons div.btn {
+.upload-buttons .btn {
+ display: flex;
height: 100%;
max-height: 100px;
white-space: normal;
@@ -14,6 +15,7 @@
.grid-container {
display: flex;
+ align-items: center;
}
.text {
@@ -37,3 +39,25 @@
.impex-popover pre {
white-space: pre-wrap;
}
+
+.file-size-prop,
+.server-import-directory-prop {
+ border-bottom: 1px dotted var(--secondary-color);
+}
+
+.copy-btn {
+ border: none;
+ background-color: transparent;
+ cursor: pointer;
+ padding: 0;
+ color: var(--secondary-color);
+}
+
+.copy-btn:hover {
+ transform: scale(1.1);
+ transition: all 0.1s ease-out;
+}
+
+.copy-btn:focus {
+ outline: none;
+}
diff --git a/src/i18n/locale-en.json b/src/i18n/locale-en.json
index 67668ca46..2fcd53d7f 100644
--- a/src/i18n/locale-en.json
+++ b/src/i18n/locale-en.json
@@ -851,105 +851,133 @@
"explore.implicit": "Implicit only",
"explore.autocomplete.warning.msg": "Autocomplete is OFF
Go to Setup -> Autocomplete",
"repository.create.btn": "Create new repository",
- "import.execution": "Import execution",
- "import.work.in.background": "Imports are executed in the background while you continue working on other things.",
- "import.interrupt.support": "Interrupt is supported only when the location is local.",
- "import.parser.config": "Parser config options are not available for remote locations.",
- "import.from.server": "Import files from the server where the Workbench is running",
- "import.put.files.into": "Put files or directories you want to import into ",
- "import.settings": "Import settings",
- "import.label.base.iri": "Base IRI",
- "import.label.bnodes": "BNodes",
- "import.label.datatype": "Datatype",
- "import.popover.relative.iri": "RDF data may contain relative IRIs. In order to make sense of them, they need to be resolved against a Base IRI. Typically data does not contain relative IRIs and this field may be left empty.",
- "import.alert.not.valid.iri": "Not a valid IRI!",
- "import.target.graphs": "Target graphs",
- "import.into.graphs": "Data is imported into one or more graphs. Some RDF formats may specify graphs, while others do not support that. The latter are treated as if they specify the default graph.",
- "import.by.data.source": "Import into the graph(s) specified by the data source.",
- "import.from.data": "From data",
- "import.into.default.graph": "Import everything into the default graph.",
- "import.default.graph": "The default graph",
- "import.into.user.graph": "Import everything into a user-specified named graph.",
- "import.named.graph": "Named graph",
- "import.enter.replacement": "Enable replacement of existing data",
- "import.replaced.graphs": "Replaced graphs",
- "import.replaced.graphs.for.update": "Replaced graphs provide an easy way to update one or more graphs with a new version of the data. All specified graphs will be cleared before the import is run. This option provides the most flexibility when the target graphs are determined from data.",
- "import.same.as.target": "(same as the target graph)",
- "import.graph.wildcard": "If a graph ends in *, it will be treated as a prefix matching all named graphs starting with that prefix excluding the *.",
- "import.add.graph": "Add graph",
- "import.add.default.graph": "Add default graph",
- "import.no.replaced.graphs.added": "No replaced graphs added",
- "import.data.cleared.before.import": "I understand that data in the replaced graphs will be cleared before importing new data.",
- "import.show.advance.settings": "Show advanced settings",
- "import.hide.advance.settings": "Hide advanced settings",
- "import.assign.own.bnode.ids": "Assign its own internal blank node identifiers or use the blank node ids it finds in the file.",
- "import.preserve.bnode.ids": "Preserve BNode IDs",
- "import.fail.unknown.datatype": "Fail on unknown datatypes",
- "import.fail.parsing.if.unrecognised": "Fail parsing if datatypes are not recognised",
- "import.validate.recognised": "Validate recognised datatype values",
- "import.verify.recognised": "Verify recognised datatypes",
- "import.normalize.recognised": "Normalize recognised datatype values",
- "import.language.tags": "Language tags",
- "import.fail.lang.unknown": "Fail on unknown languages",
- "import.fail.parsing.lang.unknown": "Fail parsing if languages are not recognised",
- "import.validate.lang.tags": "Validate recognised language tags",
- "import.verify.language": "Verify language based on a given set of definitions for valid languages",
- "import.normalize.lang.tags": "Normalize language tags",
- "import.normalize.recognized.tags": "Normalize recognised language tags",
- "import.error.handling": "Error handling",
- "import.parser.stops.on.error": "By default parser stops on error. When set on false errors are reported in the log and parsing continues.",
- "import.should.stop.on.error": "Should stop on error",
- "import.debug.label": "Debug",
- "import.forces.serial.statements": "Forces the use of the serial statements pipeline. Not recommended. Use for debugging only.",
- "import.force.serial.pipeline": "Force serial pipeline",
- "import.restore.defaults.btn": "Restore defaults",
- "import.abort.btn": "Abort",
- "import.no.files.found": "No files found",
- "import.rdf.from.snippet": "Import RDF data from a text snippet",
- "import.rdf.data.here": "Put your RDF data here and select its format.",
- "import.enable.for.auto.start": "Enable this option to start the import when you click the Import button. If it is disabled the import will be added to the list but not started automatically.",
- "import.auto.start": "Start import automatically",
- "import.rdf.local.url.paste.data": "Import your local RDF files, RDF from a URL or simply type or paste RDF data",
- "import.to.reimport": "To reimport a file, URL or text snippet click the Import button again.",
- "import.data.from.url": "Import RDF data from URL",
- "import.supported.url.with.rdf": "URL with RDF data. Supported formats are",
- "import.invalid.url": "Not valid url!",
- "import.format": "Format",
- "import.gz.zip": ", as well as their .gz versions and .zip archives",
- "import.error.could.not.get.files": "Could not get files; {{data}}",
- "import.error.could.not.stop": "Could not stop import; {{data}}",
- "import.error.could.not.clear": "Could not clear status; {{data}}",
- "import.error.default.settings": "Could not get default settings; {{data}}",
- "import.could.not.send.file": "Could not send file for import; {{data}}",
- "import.large.file": "File {{name}} too big {{size}} MB. Use Server Files import.",
- "import.could.not.upload": "Could not upload file {{name}}. BZip2 archives are not supported.",
- "import.no.such.file": "No such file; {{name}}",
- "import.could.not.send.data": "Could not send data for import; {{data}}",
- "import.could.not.send.url": "Could not send url for import; {{data}}",
- "import.could.not.upload.file": "Could not upload file; {{data}}",
- "import.could.not.update.text": "Could not update text import; {{data}}",
- "import.text.snippet.not.imported": "Text snippet was edited but has not been imported again.",
- "import.graph.already.in.list": "This graph is already in the list.",
- "import.file.size.limit.control": "The file size limit is controlled by the ",
- "import.property": " property",
- "import.directory.setting": "The directory can be changed by setting the ",
- "import.show.files.only": "Show files only",
- "import.show.files.directories": "Show both files and directories",
- "import.show.directories.only": "Show directories only",
- "import.type.to.filter": "Type to filter",
- "import.selected.items": "Import the selected items",
- "import.without.changing.settings": "Import without changing settings",
- "import.reset.last.imported": "Reset the last imported status of the selected items",
- "import.reset.status": "Reset status",
- "import.remove.selected": "Remove the selected items from the list",
- "import.remove.btn": "Remove",
- "import.remove.confirm.msg": "Are you sure you want to remove selected files: '{{name}}'?",
- "import.last.import.settings": "Last import settings",
- "import.mode.not.supported.constraint": "This mode is not supported when importing multiple items.",
- "import.enable.replace.option": "Enable this to replace the data in one or more graphs with the imported data.",
- "import.context.link": "JSON-LD context",
- "import.context.link.info": "Specifies external JSON-LD context as a URL. Only whitelisted URLs can be used.",
- "import.file.upload.progress": "{{progress}} % uploaded",
+ "import": {
+ "settings": "Import settings",
+ "label.base.iri": "Base IRI",
+ "label.bnodes": "BNodes",
+ "label.datatype": "Datatype",
+ "popover.relative.iri": "RDF data may contain relative IRIs. In order to make sense of them, they need to be resolved against a Base IRI. Typically data does not contain relative IRIs and this field may be left empty.",
+ "alert.not.valid.iri": "Not a valid IRI!",
+ "target.graphs": "Target graphs",
+ "into.graphs": "Data is imported into one or more graphs. Some RDF formats may specify graphs, while others do not support that. The latter are treated as if they specify the default graph.",
+ "by.data.source": "Import into the graph(s) specified by the data source.",
+ "from.data": "From data",
+ "into.default.graph": "Import everything into the default graph.",
+ "default.graph": "The default graph",
+ "into.user.graph": "Import everything into a user-specified named graph.",
+ "named.graph": "Named graph",
+ "enter.replacement": "Enable replacement of existing data",
+ "replaced.graphs": "Replaced graphs",
+ "replaced.graphs.for.update": "Replaced graphs provide an easy way to update one or more graphs with a new version of the data. All specified graphs will be cleared before the import is run. This option provides the most flexibility when the target graphs are determined from data.",
+ "same.as.target": "(same as the target graph)",
+ "graph.wildcard": "If a graph ends in *, it will be treated as a prefix matching all named graphs starting with that prefix excluding the *.",
+ "add.graph": "Add graph",
+ "add.default.graph": "Add default graph",
+ "no.replaced.graphs.added": "No replaced graphs added",
+ "data.cleared.before.import": "I understand that data in the replaced graphs will be cleared before importing new data.",
+ "show.advance.settings": "Show advanced settings",
+ "hide.advance.settings": "Hide advanced settings",
+ "assign.own.bnode.ids": "Assign its own internal blank node identifiers or use the blank node ids it finds in the file.",
+ "preserve.bnode.ids": "Preserve BNode IDs",
+ "fail.unknown.datatype": "Fail on unknown datatypes",
+ "fail.parsing.if.unrecognised": "Fail parsing if datatypes are not recognised",
+ "validate.recognised": "Validate recognised datatype values",
+ "verify.recognised": "Verify recognised datatypes",
+ "normalize.recognised": "Normalize recognised datatype values",
+ "language.tags": "Language tags",
+ "fail.lang.unknown": "Fail on unknown languages",
+ "fail.parsing.lang.unknown": "Fail parsing if languages are not recognised",
+ "validate.lang.tags": "Validate recognised language tags",
+ "verify.language": "Verify language based on a given set of definitions for valid languages",
+ "normalize.lang.tags": "Normalize language tags",
+ "normalize.recognized.tags": "Normalize recognised language tags",
+ "error.handling": "Error handling",
+ "parser.stops.on.error": "By default parser stops on error. When set on false errors are reported in the log and parsing continues.",
+ "should.stop.on.error": "Should stop on error",
+ "debug.label": "Debug",
+ "forces.serial.statements": "Forces the use of the serial statements pipeline. Not recommended. Use for debugging only.",
+ "force.serial.pipeline": "Force serial pipeline",
+ "restore.defaults.btn": "Restore defaults",
+ "abort.btn": "Abort",
+ "no.files.found": "No files found",
+ "rdf.from.snippet": "Import RDF data from a text snippet",
+ "rdf.data.here": "Put your RDF data here and select its format.",
+ "enable.for.auto.start": "Enable this option to start the import when you click the Import button. If it is disabled the import will be added to the list but not started automatically.",
+ "auto.start": "Start import automatically",
+ "data.from.url": "Import RDF data from URL",
+ "supported.url.with.rdf": "URL with RDF data. Supported formats are",
+ "invalid.url": "Not valid url!",
+ "format": "Format",
+ "gz.zip": ", as well as their .gz versions and .zip archives",
+ "error.could.not.get.files": "Could not get files; {{data}}",
+ "error.could.not.stop": "Could not stop import; {{data}}",
+ "error.could.not.clear": "Could not clear status; {{data}}",
+ "error.default.settings": "Could not get default settings; {{data}}",
+ "could.not.send.file": "Could not send file for import; {{data}}",
+ "large.file": "File {{name}} too big {{size}} MB. Use Server Files import.",
+ "could.not.upload": "Could not upload file {{name}}. BZip2 archives are not supported.",
+ "no.such.file": "No such file; {{name}}",
+ "could.not.send.data": "Could not send data for import; {{data}}",
+ "could.not.send.url": "Could not send url for import; {{data}}",
+ "could.not.upload.file": "Could not upload file; {{data}}",
+ "could.not.update.text": "Could not update text import; {{data}}",
+ "text.snippet.not.imported": "Text snippet was edited but has not been imported again.",
+ "graph.already.in.list": "This graph is already in the list.",
+ "directory.setting": "The directory can be changed by setting the ",
+ "show.files.only": "Show files only",
+ "show.files.directories": "Show both files and directories",
+ "show.directories.only": "Show directories only",
+ "type.to.filter": "Type to filter",
+ "selected.items": "Import the selected items",
+ "without.changing.settings": "Import without changing settings",
+ "reset.last.imported": "Reset the last imported status of the selected items",
+ "reset.status": "Reset status",
+ "remove.selected": "Remove the selected items from the list",
+ "remove.btn": "Remove",
+ "remove.confirm.msg": "Are you sure you want to remove selected files: '{{name}}'?",
+ "last.import.settings": "Last import settings",
+ "mode.not.supported.constraint": "This mode is not supported when importing multiple items.",
+ "enable.replace.option": "Enable this to replace the data in one or more graphs with the imported data.",
+ "context.link": "JSON-LD context",
+ "context.link.info": "Specifies external JSON-LD context as a URL. Only whitelisted URLs can be used.",
+ "file.upload.progress": "{{progress}} % uploaded",
+ "help": {
+ "buttons": {
+ "toggle_help": {
+ "tooltip": "Get help on import"
+ },
+ "copy_file_size_prop": {
+ "tooltip": "Copy max file size property"
+ }
+ },
+ "messages": {
+ "copied_to_clipboard": "Copied to clipboard"
+ },
+ "on_upload": {
+ "import_user_data": "Import User Data",
+ "to_reimport_again": "To reimport a file, URL or text snippet click the Import button again.",
+ "file_size_limit_can_be_changed": "The file size limit can be changed by setting the",
+ "the_property": " property",
+ "execution": "Import execution",
+ "work_in_background": "Imports are executed in the background while you continue working on other things.",
+ "interrupt_support": "Interrupt is supported only when the location is local.",
+ "parser_config": "Parser config options are not available for remote locations."
+ },
+ "on_server_import": {
+ "import_from_server": "It’s required to have access to the server where the GraphDB Workbench is running",
+ "open_directory": "Open (or create) a directory",
+ "put_files_into": "and place your files and folders in it",
+ "directory_can_be_changed": "The directory can be changed by setting the",
+ "the_property": "property"
+ },
+ "on_file_size_limit": {
+ "file_size_limit_info": "To import larger than {{fileSizeLimit}} MB, use the ",
+ "server_files_link": "Server files",
+ "import_or_use": "import or use the",
+ "api_link": "API"
+ }
+ }
+ },
"text.snippet.text.aria.placeholder": "# Example: rdf:predicate a rdf:Property .",
"url.import.input.placeholder": "Data URL",
"filesTable.interrupt.import": "Interrupt import",
diff --git a/src/i18n/locale-fr.json b/src/i18n/locale-fr.json
index 4e81464d7..05633b268 100644
--- a/src/i18n/locale-fr.json
+++ b/src/i18n/locale-fr.json
@@ -850,106 +850,134 @@
"explore.implicit": "Implicite seulement",
"explore.autocomplete.warning.msg": "L'autocomplétion est désactivée
Aller à Configuration -> Autocomplétion",
"repository.create.btn": "Créer un nouveau dépôt",
- "import.execution": "Exécution d'importation",
- "import.work.in.background": "Les importations sont exécutées en arrière-plan pendant que vous continuez à travailler sur d'autres choses.",
- "import.interrupt.support": "L'interruption n'est prise en charge que lorsque l'emplacement est local.",
- "import.parser.config": "Les options de configuration de l'analyseur ne sont pas disponibles pour les sites distants.",
- "import.from.server": "Importation de fichiers à partir du serveur où le Workbench est exécuté",
- "import.put.files.into": "Mettez les fichiers ou les dépôts que vous voulez importer dans",
- "import.settings": "Paramètres d'importation",
- "import.label.base.iri": "Base IRI",
- "import.label.bnodes": "BNodes",
- "import.label.datatype": "Datatype",
- "import.popover.relative.iri": "Les données RDF peuvent contenir des IRI relatifs. Afin de leur donner un sens, ils doivent être résolus par rapport à un IRI de base. En général, les données ne contiennent pas d'IRI relatifs et ce champ peut être laissé vide.",
- "import.alert.not.valid.iri": "Pas un IRI valide !",
- "import.target.graphs": "Graphes cibles",
- "import.into.graphs": "Les données sont importées dans un ou plusieurs graphes. Certains formats RDF peuvent spécifier des graphes, tandis que d'autres ne le supportent pas. Ces derniers sont traités comme s'ils spécifiaient le graphe par défaut.",
- "import.by.data.source": "Importation dans le(s) graphe(s) spécifié(s) par la source de données.",
- "import.from.data": "De données",
- "import.into.default.graph": "Importe tout dans le graphe par défaut.",
- "import.default.graph": "Le graphe par défaut",
- "import.into.user.graph": "Importez tout dans un graphe nommé spécifié par l'utilisateur.",
- "import.named.graph": "Graphe nommé",
- "import.enter.replacement": "Permettre le remplacement des données existantes",
- "import.replaced.graphs": "Graphes remplacés",
- "import.replaced.graphs.for.update": "Les graphes remplacés offrent un moyen simple de mettre à jour un ou plusieurs graphes avec une nouvelle version des données. Tous les graphes spécifiés seront effacés avant l'exécution de l'importation. Cette option offre la plus grande flexibilité lorsque les graphes cibles sont déterminés à partir de données.",
- "import.same.as.target": "(identique au graphe cible)",
- "import.graph.wildcard": "Si un graphe se termine par *, il sera traité comme un préfixe correspondant à tous les graphes nommés commençant par ce préfixe, à l'exception de *.",
- "import.add.graph": "Ajouter un graphe",
- "import.add.default.graph": "Ajouter un graphe par défaut",
- "import.no.replaced.graphs.added": "Aucun graphe remplacé ajouté",
- "import.data.cleared.before.import": "Je comprends que les données des graphes remplacés seront effacées avant l'importation de nouvelles données.",
- "import.show.advance.settings": "Afficher les paramètres avancés",
- "import.hide.advance.settings": "Cacher les paramètres avancés",
- "import.assign.own.bnode.ids": "Attribuer ses propres identifiants de nœuds vides internes ou utiliser les identifiants de nœuds vides qu'il trouve dans le fichier.",
- "import.preserve.bnode.ids": "Préserver les identifiants de nœuds vierges",
- "import.fail.unknown.datatype": "Échec sur les types de données inconnus",
- "import.fail.parsing.if.unrecognised": "Échec de l'analyse si les types de données ne sont pas reconnus",
- "import.validate.recognised": "Valider les valeurs des types de données reconnus",
- "import.verify.recognised": "Vérifier les types de données reconnus",
- "import.normalize.recognised": "Normalisation des valeurs de type de données reconnues",
- "import.language.tags": "Balises de langue",
- "import.fail.lang.unknown": "Échec sur les langues inconnues",
- "import.fail.parsing.lang.unknown": "Échec de l'analyse syntaxique si les langues ne sont pas reconnues",
- "import.validate.lang.tags": "Valider les balises de langue reconnues",
- "import.verify.language": "Vérifier la langue sur la base d'un ensemble donné de définitions pour les langues valides",
- "import.normalize.lang.tags": "Normalisation des balises de langue",
- "import.normalize.recognized.tags": "Normalisation des balises de langue reconnues",
- "import.error.handling": "Gestion des erreurs",
- "import.parser.stops.on.error": "Par défaut, l'analyseur syntaxique s'arrête en cas d'erreur. Lorsqu'il est défini sur false, les erreurs sont signalées dans le journal et l'analyse syntaxique continue.",
- "import.should.stop.on.error": "Devrait s'arrêter sur une erreur",
- "import.debug.label": "Débogage",
- "import.forces.serial.statements": "Force l'utilisation du pipeline d'instructions en série. Non recommandé. A utiliser uniquement pour le débogage.",
- "import.force.serial.pipeline": "Forcer le pipeline série",
- "import.restore.defaults.btn": "Restaurer les valeurs par défaut",
- "import.abort.btn": "Abandonner",
- "import.no.files.found": "Aucun fichier trouvé",
- "import.rdf.from.snippet": "Importer des données RDF à partir d'un extrait de texte",
- "import.rdf.data.here": "Mettez vos données RDF ici et sélectionnez leur format.",
- "import.enable.for.auto.start": "Activez cette option pour lancer l'importation lorsque vous cliquez sur le bouton Importer. Si elle est désactivée, l'importation sera ajoutée à la liste mais ne démarrera pas automatiquement.",
- "import.auto.start": "Démarrer l'importation automatiquement",
- "import.rdf.local.url.paste.data": "Importez vos fichiers RDF locaux, RDF depuis une URL ou tapez ou collez simplement des données RDF.",
- "import.to.reimport": "Pour réimporter un fichier, une URL ou un extrait de texte, cliquez à nouveau sur le bouton Importer.",
- "import.data.from.url": "Importer des données RDF depuis une URL",
- "import.supported.url.with.rdf": "URL avec des données RDF. Les formats supportés sont",
- "import.invalid.url": "URL non valide!",
- "import.format": "Format",
- "import.gz.zip": "ainsi que leurs versions .gz et leurs archives .zip.",
- "import.error.could.not.get.files": "Impossible de récupérer des fichiers; {{data}}",
- "import.error.could.not.stop": "Impossible d'arrêter l'importation; {{data}}",
- "import.error.could.not.clear": "Impossible d'effacer le statut; {{data}}",
- "import.error.default.settings": "Impossible de récupérer les paramètres par défaut; {{data}}",
- "import.could.not.send.file": "Impossible d'envoyer le fichier à importer; {{data}}",
- "import.large.file": "Fichier {{name}} trop grand {{size}} MB. Utilisez l'importation de fichiers du serveur.",
- "import.could.not.upload": "Impossible de télécharger le fichier {{name}}. Les archives BZip2 ne sont pas prises en charge.",
- "import.no.such.file": "Aucun fichier de ce type; {{name}}",
- "import.could.not.send.data": "Impossible d'envoyer des données pour l'importation; {{data}}",
- "import.could.not.send.url": "Impossible d'envoyer l'url pour l'importation; {{data}}",
- "import.could.not.upload.file": "Impossible de télécharger un fichier; {{data}}",
- "import.could.not.update.text": "Impossible de mettre à jour le texte importé; {{data}}",
- "import.text.snippet.not.imported": "L'extrait de texte a été modifié mais n'a pas été réimporté.",
- "import.graph.already.in.list": "Ce graphe est déjà dans la liste.",
- "import.file.size.limit.control": "La taille limite du fichier est contrôlée par la propriété",
- "import.property": "propriété",
- "import.directory.setting": "Le dépôt peut être modifié en définissant la propriété",
- "import.show.files.only": "Afficher uniquement les fichiers",
- "import.show.files.directories": "Afficher à la fois les fichiers et les dépôts",
- "import.show.directories.only": "Afficher uniquement les dépôts",
- "import.type.to.filter": "Type de filtre",
- "import.select.all": "Tout sélectionner",
- "import.selected.items": "Importer les éléments sélectionnés",
- "import.without.changing.settings": "Importer sans modifier les paramètres",
- "import.reset.last.imported": "Réinitialiser le dernier statut importé des éléments sélectionnés",
- "import.reset.status": "Réinitialiser l'état",
- "import.remove.selected": "Supprimer les éléments sélectionnés de la liste",
- "import.remove.btn": "Supprimer",
- "import.remove.confirm.msg": "Êtes-vous sûr de vouloir supprimer les fichiers sélectionnés: {{name}}",
- "import.last.import.settings": "Paramètres de la dernière importation",
- "import.mode.not.supported.constraint": "Ce mode n'est pas pris en charge lors de l'importation de plusieurs éléments.",
- "import.enable.replace.option": "Activez cette option pour remplacer les données d'un ou plusieurs graphes par les données importées.",
- "import.context.link": "Contexte JSON-LD",
- "import.context.link.info": "Spécifie le contexte JSON-LD externe en tant qu'URL. Seules les URL figurant sur la liste blanche peuvent être utilisées",
- "import.file.upload.progress": "{{progress}} % téléchargé",
+ "import": {
+ "settings": "Paramètres d'importation",
+ "label.base.iri": "Base IRI",
+ "label.bnodes": "BNodes",
+ "label.datatype": "Datatype",
+ "popover.relative.iri": "Les données RDF peuvent contenir des IRI relatifs. Afin de leur donner un sens, ils doivent être résolus par rapport à un IRI de base. En général, les données ne contiennent pas d'IRI relatifs et ce champ peut être laissé vide.",
+ "alert.not.valid.iri": "Pas un IRI valide !",
+ "target.graphs": "Graphes cibles",
+ "into.graphs": "Les données sont importées dans un ou plusieurs graphes. Certains formats RDF peuvent spécifier des graphes, tandis que d'autres ne le supportent pas. Ces derniers sont traités comme s'ils spécifiaient le graphe par défaut.",
+ "by.data.source": "Importation dans le(s) graphe(s) spécifié(s) par la source de données.",
+ "from.data": "De données",
+ "into.default.graph": "Importe tout dans le graphe par défaut.",
+ "default.graph": "Le graphe par défaut",
+ "into.user.graph": "Importez tout dans un graphe nommé spécifié par l'utilisateur.",
+ "named.graph": "Graphe nommé",
+ "enter.replacement": "Permettre le remplacement des données existantes",
+ "replaced.graphs": "Graphes remplacés",
+ "replaced.graphs.for.update": "Les graphes remplacés offrent un moyen simple de mettre à jour un ou plusieurs graphes avec une nouvelle version des données. Tous les graphes spécifiés seront effacés avant l'exécution de l'importation. Cette option offre la plus grande flexibilité lorsque les graphes cibles sont déterminés à partir de données.",
+ "same.as.target": "(identique au graphe cible)",
+ "graph.wildcard": "Si un graphe se termine par *, il sera traité comme un préfixe correspondant à tous les graphes nommés commençant par ce préfixe, à l'exception de *.",
+ "add.graph": "Ajouter un graphe",
+ "add.default.graph": "Ajouter un graphe par défaut",
+ "no.replaced.graphs.added": "Aucun graphe remplacé ajouté",
+ "data.cleared.before.import": "Je comprends que les données des graphes remplacés seront effacées avant l'importation de nouvelles données.",
+ "show.advance.settings": "Afficher les paramètres avancés",
+ "hide.advance.settings": "Cacher les paramètres avancés",
+ "assign.own.bnode.ids": "Attribuer ses propres identifiants de nœuds vides internes ou utiliser les identifiants de nœuds vides qu'il trouve dans le fichier.",
+ "preserve.bnode.ids": "Préserver les identifiants de nœuds vierges",
+ "fail.unknown.datatype": "Échec sur les types de données inconnus",
+ "fail.parsing.if.unrecognised": "Échec de l'analyse si les types de données ne sont pas reconnus",
+ "validate.recognised": "Valider les valeurs des types de données reconnus",
+ "verify.recognised": "Vérifier les types de données reconnus",
+ "normalize.recognised": "Normalisation des valeurs de type de données reconnues",
+ "language.tags": "Balises de langue",
+ "fail.lang.unknown": "Échec sur les langues inconnues",
+ "fail.parsing.lang.unknown": "Échec de l'analyse syntaxique si les langues ne sont pas reconnues",
+ "validate.lang.tags": "Valider les balises de langue reconnues",
+ "verify.language": "Vérifier la langue sur la base d'un ensemble donné de définitions pour les langues valides",
+ "normalize.lang.tags": "Normalisation des balises de langue",
+ "normalize.recognized.tags": "Normalisation des balises de langue reconnues",
+ "error.handling": "Gestion des erreurs",
+ "parser.stops.on.error": "Par défaut, l'analyseur syntaxique s'arrête en cas d'erreur. Lorsqu'il est défini sur false, les erreurs sont signalées dans le journal et l'analyse syntaxique continue.",
+ "should.stop.on.error": "Devrait s'arrêter sur une erreur",
+ "debug.label": "Débogage",
+ "forces.serial.statements": "Force l'utilisation du pipeline d'instructions en série. Non recommandé. A utiliser uniquement pour le débogage.",
+ "force.serial.pipeline": "Forcer le pipeline série",
+ "restore.defaults.btn": "Restaurer les valeurs par défaut",
+ "abort.btn": "Abandonner",
+ "no.files.found": "Aucun fichier trouvé",
+ "rdf.from.snippet": "Importer des données RDF à partir d'un extrait de texte",
+ "rdf.data.here": "Mettez vos données RDF ici et sélectionnez leur format.",
+ "enable.for.auto.start": "Activez cette option pour lancer l'importation lorsque vous cliquez sur le bouton Importer. Si elle est désactivée, l'importation sera ajoutée à la liste mais ne démarrera pas automatiquement.",
+ "auto.start": "Démarrer l'importation automatiquement",
+ "data.from.url": "Importer des données RDF depuis une URL",
+ "supported.url.with.rdf": "URL avec des données RDF. Les formats supportés sont",
+ "invalid.url": "URL non valide!",
+ "format": "Format",
+ "gz.zip": "ainsi que leurs versions .gz et leurs archives .zip.",
+ "error.could.not.get.files": "Impossible de récupérer des fichiers; {{data}}",
+ "error.could.not.stop": "Impossible d'arrêter l'importation; {{data}}",
+ "error.could.not.clear": "Impossible d'effacer le statut; {{data}}",
+ "error.default.settings": "Impossible de récupérer les paramètres par défaut; {{data}}",
+ "could.not.send.file": "Impossible d'envoyer le fichier à importer; {{data}}",
+ "large.file": "Fichier {{name}} trop grand {{size}} MB. Utilisez l'importation de fichiers du serveur.",
+ "could.not.upload": "Impossible de télécharger le fichier {{name}}. Les archives BZip2 ne sont pas prises en charge.",
+ "no.such.file": "Aucun fichier de ce type; {{name}}",
+ "could.not.send.data": "Impossible d'envoyer des données pour l'importation; {{data}}",
+ "could.not.send.url": "Impossible d'envoyer l'url pour l'importation; {{data}}",
+ "could.not.upload.file": "Impossible de télécharger un fichier; {{data}}",
+ "could.not.update.text": "Impossible de mettre à jour le texte importé; {{data}}",
+ "text.snippet.not.imported": "L'extrait de texte a été modifié mais n'a pas été réimporté.",
+ "graph.already.in.list": "Ce graphe est déjà dans la liste.",
+ "directory.setting": "Le dépôt peut être modifié en définissant la propriété",
+ "show.files.only": "Afficher uniquement les fichiers",
+ "show.files.directories": "Afficher à la fois les fichiers et les dépôts",
+ "show.directories.only": "Afficher uniquement les dépôts",
+ "type.to.filter": "Type de filtre",
+ "select.all": "Tout sélectionner",
+ "selected.items": "Importer les éléments sélectionnés",
+ "without.changing.settings": "Importer sans modifier les paramètres",
+ "reset.last.imported": "Réinitialiser le dernier statut importé des éléments sélectionnés",
+ "reset.status": "Réinitialiser l'état",
+ "remove.selected": "Supprimer les éléments sélectionnés de la liste",
+ "remove.btn": "Supprimer",
+ "remove.confirm.msg": "Êtes-vous sûr de vouloir supprimer les fichiers sélectionnés: {{name}}",
+ "last.import.settings": "Paramètres de la dernière importation",
+ "mode.not.supported.constraint": "Ce mode n'est pas pris en charge lors de l'importation de plusieurs éléments.",
+ "enable.replace.option": "Activez cette option pour remplacer les données d'un ou plusieurs graphes par les données importées.",
+ "context.link": "Contexte JSON-LD",
+ "context.link.info": "Spécifie le contexte JSON-LD externe en tant qu'URL. Seules les URL figurant sur la liste blanche peuvent être utilisées",
+ "file.upload.progress": "{{progress}} % téléchargé",
+ "help": {
+ "buttons": {
+ "toggle_help": {
+ "tooltip": "Obtenir de l'aide sur l'importation"
+ },
+ "copy_file_size_prop": {
+ "tooltip": "Copier la propriété de taille maximale du fichier"
+ }
+ },
+ "messages": {
+ "copied_to_clipboard": "Copié dans le presse-papier"
+ },
+ "on_upload": {
+ "import_user_data": "Importer des données utilisateur",
+ "to_reimport_again": "Pour réimporter un fichier, une URL ou un extrait de texte, cliquez à nouveau sur le bouton Importer.",
+ "file_size_limit_can_be_changed": "The file size limit can be changed by setting the",
+ "the_property": "propriété",
+ "execution": "Exécution d'importation",
+ "work_in_background": "Les importations sont exécutées en arrière-plan pendant que vous continuez à travailler sur d'autres choses.",
+ "interrupt_support": "L'interruption n'est prise en charge que lorsque l'emplacement est local.",
+ "parser_config": "Les options de configuration de l'analyseur ne sont pas disponibles pour les sites distants."
+ },
+ "on_server_import": {
+ "import_from_server": "Il est nécessaire d'avoir accès au serveur sur lequel GraphDB Workbench est exécuté",
+ "open_directory": "Ouvrir (ou créer) un répertoire",
+ "put_files_into": "et placez-y vos fichiers et dossiers",
+ "directory_can_be_changed": "Le répertoire peut être modifié en réglant le",
+ "the_property": "propriété"
+ },
+ "on_file_size_limit": {
+ "file_size_limit_info": "Pour importer plus de {{fileSizeLimit}} Mo, utilisez l'importation de ",
+ "server_files_link": "Fichiers du serveur",
+ "import_or_use": "ou utilisez l'",
+ "api_link": "API"
+ }
+ }
+ },
"text.snippet.text.aria.placeholder": "# Exemple : rdf:predicate a rdf:Property .",
"url.import.input.placeholder": "URL des données",
"filesTable.interrupt.import": "Interrompre l'importation",
diff --git a/src/js/angular/core/directives/copy-to-clipboard/copy-to-clipboard.directive.js b/src/js/angular/core/directives/copy-to-clipboard/copy-to-clipboard.directive.js
new file mode 100644
index 000000000..1e3b91aa0
--- /dev/null
+++ b/src/js/angular/core/directives/copy-to-clipboard/copy-to-clipboard.directive.js
@@ -0,0 +1,57 @@
+/**
+ * @ngdoc directive
+ * @name copyToClipboard
+ * @module graphdb.framework.core.directives.copytoclipboard.copytoclipboard
+ * @restrict E
+ *
+ * @description
+ * `copyToClipboard` is a directive that creates a button which, when clicked, copies a specific text to the clipboard.
+ * The directive uses an isolated scope with a single property, `tooltipText`, which is bound to the `tooltipText` attribute of the element where the directive is used.
+ * The tooltip text is translated using the `$translate` service.
+ * The button also has an `ng-click` directive that triggers the `copyToClipboard` function when the button is clicked.
+ *
+ * @param {string} tooltipText - The text to be displayed as a tooltip when hovering over the button.
+ *
+ * @example
+ *
- {{'import.put.files.into' | translate}}{{appData.properties['graphdb.workbench.importDirectory'].value}}.
+ {{'import.help.on_server_import.open_directory' | translate}}
+ {{appData.properties['graphdb.workbench.importDirectory'].value}}
+ {{'import.help.on_server_import.put_files_into' | translate}}.
+ {{'import.help.on_server_import.directory_can_be_changed' | translate}}
+ graphdb.workbench.importDirectory
+
- {{'import.directory.setting' | translate}}graphdb.workbench.importDirectory{{'import.property' | translate}}. -
-
- {{'import.to.reimport' | translate}}
- {{'import.file.size.limit.control' | translate}}graphdb.workbench.maxUploadSize{{'import.property' | translate}}.
+ {{'import.help.on_upload.to_reimport_again' | translate}}
+ {{'import.help.on_upload.file_size_limit_can_be_changed' | translate}}
+ graphdb.workbench.maxUploadSize
+