diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index de1ed18f..b9251802 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -24,8 +24,6 @@ updates:
update-types: ["version-update:semver-major"]
- dependency-name: 'bootstrap'
update-types: ["version-update:semver-major"]
- - dependency-name: 'eslint-plugin-prettier'
- update-types: ["version-update:semver-major"]
labels:
- "_bot"
- "maint:dependency"
diff --git a/README.md b/README.md
index 3439c3cc..c1d5b5a0 100644
--- a/README.md
+++ b/README.md
@@ -28,11 +28,14 @@
-[Neurobagel's](https://www.neurobagel.org/) annotation tool takes BID-style [phenotypic data](https://github.com/neurobagel/annotation_tool/blob/main/cypress/fixtures/examples/good/ds003653_participant.tsv) and [corresponding data description files](https://github.com/neurobagel/annotation_tool/blob/main/cypress/fixtures/examples/good/ds003653_participant.json) and gives users the ability to annotate their data using the Neurobagel data model for preparation to inject that modeled data into Neurobagel's graph database for [federated querying](https://github.com/neurobagel/query-tool).
+[Neurobagel's](https://www.neurobagel.org/) annotation tool takes BIDS-style [phenotypic data](https://github.com/neurobagel/annotation_tool/blob/main/cypress/fixtures/examples/good/ds003653_participant.tsv) and [corresponding data description files](https://github.com/neurobagel/annotation_tool/blob/main/cypress/fixtures/examples/good/ds003653_participant.json) and gives users the ability to annotate their data using the Neurobagel data model for preparation to inject that modeled data into Neurobagel's graph database for [federated querying](https://github.com/neurobagel/query-tool).
The annotation tool is a Vue application, developed in [JavaScript](https://www.javascript.com/) using a variety of tools including [Nuxt](https://nuxtjs.org/), [Cypress](https://www.cypress.io/), and [BootstrapVue](https://bootstrap-vue.org/docs).
+Please refer to our [**official documentation**](https://neurobagel.org/annotation_tool/) for more information on how to use the annotation tool.
+
[Quickstart](#quickstart) |
+[Documentation](https://neurobagel.org/annotation_tool/) |
[Local Installation](#local-installation) |
[Workflow](#annotation-workflow) |
[Navigation](#general-navigation) |
diff --git a/assets/css/main.css b/assets/css/main.css
index 7347aca7..b5f02254 100644
--- a/assets/css/main.css
+++ b/assets/css/main.css
@@ -75,4 +75,14 @@
background-color: white;
color: black;
+}
+
+.category-transparent {
+
+ opacity: 0.5;
+}
+
+.category-opaque {
+
+ opacity: 1.0;
}
\ No newline at end of file
diff --git a/components/category-select-table.vue b/components/category-select-table.vue
index 66e5977c..eed5a07a 100644
--- a/components/category-select-table.vue
+++ b/components/category-select-table.vue
@@ -2,9 +2,9 @@
-
+
-
+
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/components/category-toolgroup.vue b/components/category-toolgroup.vue
index 3c2ceb14..e6ad7b2b 100644
--- a/components/category-toolgroup.vue
+++ b/components/category-toolgroup.vue
@@ -1,18 +1,17 @@
-
-
-
+
+
+
-
-
-
-
+ :selectable="(option) => !getSelectedTools.some(el => el.identifier.includes(option.identifier))"
+ class="aligned-element" />
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/cypress.config.js b/cypress.config.js
index 5e90efb9..f25f21be 100644
--- a/cypress.config.js
+++ b/cypress.config.js
@@ -6,6 +6,8 @@ const fs = require("fs");
module.exports = defineConfig({
e2e: {
+ viewportHeight: 1080,
+ viewportWidth: 1920,
baseUrl: "http://localhost:3000",
diff --git a/cypress/component/category-toolgroup.cy.js b/cypress/component/category-toolgroup.cy.js
index 801d59a0..b9f4ca15 100644
--- a/cypress/component/category-toolgroup.cy.js
+++ b/cypress/component/category-toolgroup.cy.js
@@ -24,7 +24,7 @@ describe("Tool Group component", () => {
};
getters = {
getColumnsForCategory: () => (p_category) => {
- return ["column1", "column3"];
+ return ["column1", "column2", "column3"];
},
getSelectedTools: () => {
return [
@@ -88,8 +88,8 @@ describe("Tool Group component", () => {
}})
});
- cy.get("[data-cy='assessment-column-table']").find("tr:contains('column1')").should('not.have.class', 'selected-tool');
- cy.get("[data-cy='assessment-column-table']").find("tr:contains('column3')").should('not.have.class', 'selected-tool');
+ cy.get("[data-cy='assessment-column-table']").find("tr:contains('column1')").should('not.have.class', 'category-style-5');
+ cy.get("[data-cy='assessment-column-table']").find("tr:contains('column3')").should('not.have.class', 'category-style-5');
});
@@ -220,15 +220,26 @@ describe("Tool Group component", () => {
mocks: { $store: store },
computed: store.getters
});
- // Starting out with a different tool selected
+ // Starting out with a different tool selected and then checking the background color
cy.get("[data-cy='assessment-tool-table']").find("tr:contains('MOCA')").click();
cy.get("[data-cy='assessment-column-table']").find("tr:contains('column3')")
.invoke("css", "background-color").then((InitialBackgroundColor) => {
cy.get("[data-cy='assessment-tool-table']")
// Selecting the tool my column is mapped to should change my columns styling
.find("tr:contains('UPDRSIII')").click();
- // assert that element has different color after
- cy.get("[data-cy='assessment-column-table']").find("tr:contains('column3')").should("not.have.css", "background-color", InitialBackgroundColor);
+ // assert that element has the same background color after
+ cy.get("[data-cy='assessment-column-table']").find("tr:contains('column3')").should("have.css", "background-color", InitialBackgroundColor);
+ });
+
+ // Starting out with a different tool selected and then checking the opacity
+ cy.get("[data-cy='assessment-tool-table']").find("tr:contains('MOCA')").click();
+ cy.get("[data-cy='assessment-column-table']").find("tr:contains('column3')")
+ .invoke("css", "opacity").then((InitialOpacity) => {
+ cy.get("[data-cy='assessment-tool-table']")
+ // Selecting the tool my column is mapped to should change my columns styling
+ .find("tr:contains('UPDRSIII')").click();
+ // assert that element has a different opacity after
+ cy.get("[data-cy='assessment-column-table']").find("tr:contains('column3')").should("not.have.css", "Opacity", InitialOpacity);
});
});
});
diff --git a/cypress/component/index_page.cy.js b/cypress/component/index_page.cy.js
index 3517c42d..750c2fb8 100644
--- a/cypress/component/index_page.cy.js
+++ b/cypress/component/index_page.cy.js
@@ -35,9 +35,9 @@ describe("The index page", () => {
});
// Assert
- cy.get("[data-cy='data-table-display']").should("be.visible.and.empty");
+ cy.get("[data-cy='data-table-display']").should("not.exist");
cy.get("[data-cy='data-table-selector']").should("be.visible").contains("Choose file");
- cy.get("[data-cy='data-dictionary-display']").should("be.visible.and.empty");
+ cy.get("[data-cy='data-dictionary-display']").should("not.exist");
cy.get("[data-cy='data-dictionary-selector']").should("be.visible").contains("Choose file");
});
@@ -77,10 +77,9 @@ describe("The index page", () => {
plugins: ["bootstrap-vue"]
});
- // Assert - Because we're looking at an input field, we need to assert
- // over the value and can't just use .contains as usual
- cy.get("[data-cy='data-table-display']").should('include.value', 'val1\tval2');
- cy.get("[data-cy='data-dictionary-display']").should('include.value', '"col1": "something"');
+ cy.get("[data-cy='data-table-display']").contains("val1");
+ cy.get("[data-cy='data-table-display']").contains("val2");
+ cy.get("[data-cy='data-dictionary-display']").contains('"col1": "something"');
});
it("Dispatches an action when a dataTable is loaded", () => {
diff --git a/cypress/e2e/app/simple-e2etest.cy.js b/cypress/e2e/app/simple-e2etest.cy.js
index ad2c75d3..95f21b3d 100644
--- a/cypress/e2e/app/simple-e2etest.cy.js
+++ b/cypress/e2e/app/simple-e2etest.cy.js
@@ -13,11 +13,7 @@ describe("End to end test using a simple UI path through the app", () => {
];
beforeEach(() => {
-
- // Standard setup for annotation tool testing
- cy.appSetup();
-
- // 2. Open the index page
+ // 1. Open the index page
cy.visit("/");
});
diff --git a/cypress/e2e/app/validate-output-example-synthetic-e2etest.cy.js b/cypress/e2e/app/validate-output-example-synthetic-e2etest.cy.js
index a6eea532..e3bebba0 100644
--- a/cypress/e2e/app/validate-output-example-synthetic-e2etest.cy.js
+++ b/cypress/e2e/app/validate-output-example-synthetic-e2etest.cy.js
@@ -6,7 +6,7 @@ describe("to annotate an assessment ", () => {
/* ==== Generated with Cypress Studio ==== */
cy.get('[data-cy="data-dictionary-selector"] > .row > form > .file-selector-button').click();
- cy.get('[data-cy="data-dictionary-selector"] > .row > form > .file-selector-button > input').selectFile('cypress/fixtures/examples/good/example_synthetic.json', { force: true });
+ cy.get('[data-cy="data-dictionary-selector"] > .row > form > .file-selector-button > input').selectFile('cypress/fixtures/examples/good/example_synthetic_participants.json', { force: true });
/* ==== End Cypress Studio ==== */
cy.get("[data-cy='button-nextpage']").click();
@@ -105,7 +105,7 @@ describe("to annotate an assessment ", () => {
cy.task("downloads", "cypress/downloads").then(folderStateAfter => {
cy.readFile('cypress/downloads/' + folderStateAfter[folderStateAfter.length - 1]).then((outputContent) => {
- const expectedOutput = require('../../fixtures/examples/good/example_synthetic_expected_output.json');
+ const expectedOutput = require('../../fixtures/examples/good/example_synthetic.json');
expect(outputContent).to.deep.equal(expectedOutput);
});
});
diff --git a/cypress/e2e/page/annotation-pagetests.cy.js b/cypress/e2e/page/annotation-pagetests.cy.js
index 75e0199b..5009b97d 100644
--- a/cypress/e2e/page/annotation-pagetests.cy.js
+++ b/cypress/e2e/page/annotation-pagetests.cy.js
@@ -8,12 +8,6 @@ describe("tests on annotation page ui with programmatic state loading and store
// NOTE: Add more dataset json files here via 'require'
];
- beforeEach(() => {
-
- // Standard app setup
- cy.appSetup();
- });
-
datasets.forEach((p_dataset) => {
context("Annotation page tests with " + p_dataset.description + " data", () => {
diff --git a/cypress/e2e/page/categorization-pagetests.cy.js b/cypress/e2e/page/categorization-pagetests.cy.js
index 936c04cc..69aa827e 100644
--- a/cypress/e2e/page/categorization-pagetests.cy.js
+++ b/cypress/e2e/page/categorization-pagetests.cy.js
@@ -9,12 +9,6 @@ describe("Tests on categorization page ui via programmatic state loading and sto
// NOTE: Add more dataset json files here via 'require'
];
- beforeEach(() => {
-
- // Standard app setup
- cy.appSetup();
- });
-
datasets.forEach((p_dataset) => {
context("Categorization page tests with " + p_dataset.description + " data", () => {
diff --git a/cypress/e2e/page/download-pagetests.cy.js b/cypress/e2e/page/download-pagetests.cy.js
index 2bdf4a88..9131d3b2 100644
--- a/cypress/e2e/page/download-pagetests.cy.js
+++ b/cypress/e2e/page/download-pagetests.cy.js
@@ -9,12 +9,6 @@ describe("tests on download page ui via programmatic state loading and store int
// NOTE: Add more dataset json files here via 'require'
];
- beforeEach(() => {
-
- // Standard app setup
- cy.appSetup();
- });
-
datasets.forEach((p_dataset) => {
context("download page tests with " + p_dataset.description + " data", () => {
diff --git a/cypress/e2e/page/home-pagetests.cy.js b/cypress/e2e/page/home-pagetests.cy.js
new file mode 100644
index 00000000..92f20bab
--- /dev/null
+++ b/cypress/e2e/page/home-pagetests.cy.js
@@ -0,0 +1,14 @@
+describe("On My homepage", () => {
+ it("I can upload some data", () => {
+ cy.visit('/');
+ // Before I load anything, I have a little notification that my preview will
+ // appear once I upload a table
+ // Load a table
+ cy.get('[data-cy="data-table-selector"]').get('input').selectFile('cypress/fixtures/examples/good/example_synthetic.tsv', { force: true });
+
+ /* ==== Generated with Cypress Studio ==== */
+ cy.get('[data-cy="data-dictionary-selector"] > .row > form > .file-selector-button').click();
+ cy.get('[data-cy="data-dictionary-selector"] > .row > form > .file-selector-button > input').selectFile('cypress/fixtures/examples/good/example_synthetic_participants.json', { force: true });
+ /* ==== End Cypress Studio ==== */
+ });
+});
\ No newline at end of file
diff --git a/cypress/e2e/page/index-pagetests.cy.js b/cypress/e2e/page/index-pagetests.cy.js
index c3389d2c..bff5ebf5 100644
--- a/cypress/e2e/page/index-pagetests.cy.js
+++ b/cypress/e2e/page/index-pagetests.cy.js
@@ -12,12 +12,6 @@ describe("Tests on the index page via store interaction", () => {
// NOTE: Add more dataset json files here via 'require'
];
- beforeEach(() => {
-
- // Standard app setup
- cy.appSetup();
- });
-
datasets.forEach((p_dataset) => {
context("index page with " + p_dataset.description + " data", () => {
diff --git a/cypress/fixtures/examples/good/example.json b/cypress/fixtures/examples/good/example.json
index df6d885c..61a584fe 100644
--- a/cypress/fixtures/examples/good/example.json
+++ b/cypress/fixtures/examples/good/example.json
@@ -6,8 +6,8 @@
"sex": {
"Description": "sex of the participant as reported by the participant",
"Levels": {
- "M": "male",
- "F": "female"
+ "1": "male",
+ "2": "female"
}
},
"group": {
diff --git a/cypress/fixtures/examples/good/example_synthetic.json b/cypress/fixtures/examples/good/example_synthetic.json
index 41e75aac..1e1c2b5b 100644
--- a/cypress/fixtures/examples/good/example_synthetic.json
+++ b/cypress/fixtures/examples/good/example_synthetic.json
@@ -1,34 +1,131 @@
{
- "participant_id":{
- "Description":"A participant ID"
+ "participant_id": {
+ "Description": "A participant ID",
+ "Annotations": {
+ "IsAbout": {
+ "TermURL": "nb:ParticipantID",
+ "Label": "Subject Unique Identifier"
+ },
+ "Identifies": "participant"
+ }
},
- "session_id":{
- "Description":"A session ID"
+ "session_id": {
+ "Description": "A session ID"
},
- "pheno_age":{
- "Description":"Age of the participant"
+ "pheno_age": {
+ "Description": "Age of the participant",
+ "Annotations": {
+ "IsAbout": {
+ "TermURL": "nb:Age",
+ "Label": "Age"
+ },
+ "Transformation": {
+ "TermURL": "nb:FromEuro",
+ "Label": "european decimal value"
+ },
+ "MissingValues": [
+ "NA"
+ ]
+ }
},
- "pheno_sex":{
- "Description":"Sex variable",
- "Levels":{
- "M":"Male",
- "F":"Female"
- }
+ "pheno_sex": {
+ "Description": "Sex variable",
+ "Levels": {
+ "M": "Male",
+ "F": "Female"
+ },
+ "Annotations": {
+ "IsAbout": {
+ "TermURL": "nb:Sex",
+ "Label": "Sex"
+ },
+ "Levels": {
+ "M": {
+ "TermURL": "snomed:248153007",
+ "Label": "Male"
+ },
+ "F": {
+ "TermURL": "snomed:248152002",
+ "Label": "Female"
+ }
+ },
+ "MissingValues": [
+ "missing"
+ ]
+ }
},
- "pheno_group":{
- "Description":"Group variable",
- "Levels":{
- "PAT":"Patient",
- "CTRL":"Control subject"
- }
+ "pheno_group": {
+ "Description": "Group variable",
+ "Levels": {
+ "PAT": "Patient",
+ "CTRL": "Control subject"
+ },
+ "Annotations": {
+ "IsAbout": {
+ "TermURL": "nb:Diagnosis",
+ "Label": "Diagnosis"
+ },
+ "Levels": {
+ "PAT": {
+ "TermURL": "snomed:406506008",
+ "Label": "Attention deficit hyperactivity disorder"
+ },
+ "CTRL": {
+ "TermURL": "ncit:C94342",
+ "Label": "Healthy Control"
+ }
+ },
+ "MissingValues": [
+ "NA"
+ ]
+ }
},
- "tool1_item1":{
- "Description":"item 1 scores for tool1"
+ "tool1_item1": {
+ "Description": "item 1 scores for tool1",
+ "Annotations": {
+ "IsAbout": {
+ "TermURL": "nb:Assessment",
+ "Label": "Assessment tool"
+ },
+ "IsPartOf": {
+ "TermURL": "cogatlas:trm_57964b8a66aed",
+ "Label": "Montreal Cognitive Assessment"
+ },
+ "MissingValues": [
+ "missing"
+ ]
+ }
},
- "tool1_item2":{
- "Description":"item 2 scores for tool1"
+ "tool1_item2": {
+ "Description": "item 2 scores for tool1",
+ "Annotations": {
+ "IsAbout": {
+ "TermURL": "nb:Assessment",
+ "Label": "Assessment tool"
+ },
+ "IsPartOf": {
+ "TermURL": "cogatlas:trm_57964b8a66aed",
+ "Label": "Montreal Cognitive Assessment"
+ },
+ "MissingValues": [
+ "missing"
+ ]
+ }
},
- "tool2_item1":{
- "Description":"item 1 scores for tool2"
+ "tool2_item1": {
+ "Description": "item 1 scores for tool2",
+ "Annotations": {
+ "IsAbout": {
+ "TermURL": "nb:Assessment",
+ "Label": "Assessment tool"
+ },
+ "IsPartOf": {
+ "TermURL": "cogatlas:tsk_4a57abb949ece",
+ "Label": "Unified Parkinson's Disease Rating Scale"
+ },
+ "MissingValues": [
+ "not completed"
+ ]
+ }
}
-}
+}
\ No newline at end of file
diff --git a/cypress/fixtures/examples/good/example_synthetic_expected_output.json b/cypress/fixtures/examples/good/example_synthetic_expected_output.json
deleted file mode 100644
index 3f7dafb3..00000000
--- a/cypress/fixtures/examples/good/example_synthetic_expected_output.json
+++ /dev/null
@@ -1,131 +0,0 @@
-{
- "participant_id":{
- "Description":"A participant ID",
- "Annotations":{
- "IsAbout":{
- "TermURL":"nb:ParticipantID",
- "Label":"Subject Unique Identifier"
- },
- "Identifies":"participant"
- }
- },
- "session_id":{
- "Description":"A session ID"
- },
- "pheno_age":{
- "Description":"Age of the participant",
- "Annotations":{
- "IsAbout":{
- "TermURL":"nb:Age",
- "Label":"Age"
- },
- "Transformation":{
- "TermURL":"nb:FromEuro",
- "Label":"european decimal value"
- },
- "MissingValues":[
- "NA"
- ]
- }
- },
- "pheno_sex":{
- "Description":"Sex variable",
- "Levels":{
- "M":"Male",
- "F":"Female"
- },
- "Annotations":{
- "IsAbout":{
- "TermURL":"nb:Sex",
- "Label":"Sex"
- },
- "Levels":{
- "M":{
- "TermURL":"snomed:248153007",
- "Label":"Male"
- },
- "F":{
- "TermURL":"snomed:248152002",
- "Label":"Female"
- }
- },
- "MissingValues":[
- "missing"
- ]
- }
- },
- "pheno_group":{
- "Description":"Group variable",
- "Levels":{
- "PAT":"Patient",
- "CTRL":"Control subject"
- },
- "Annotations":{
- "IsAbout":{
- "TermURL":"nb:Diagnosis",
- "Label":"Diagnosis"
- },
- "Levels":{
- "PAT":{
- "TermURL":"snomed:406506008",
- "Label":"Attention deficit hyperactivity disorder"
- },
- "CTRL":{
- "TermURL":"ncit:C94342",
- "Label":"Healthy Control"
- }
- },
- "MissingValues":[
- "NA"
- ]
- }
- },
- "tool1_item1":{
- "Description":"item 1 scores for tool1",
- "Annotations":{
- "IsAbout":{
- "TermURL":"nb:Assessment",
- "Label":"Assessment tool"
- },
- "IsPartOf":{
- "TermURL":"cogatlas:trm_57964b8a66aed",
- "Label":"Montreal Cognitive Assessment"
- },
- "MissingValues":[
- "missing"
- ]
- }
- },
- "tool1_item2":{
- "Description":"item 2 scores for tool1",
- "Annotations":{
- "IsAbout":{
- "TermURL":"nb:Assessment",
- "Label":"Assessment tool"
- },
- "IsPartOf":{
- "TermURL":"cogatlas:trm_57964b8a66aed",
- "Label":"Montreal Cognitive Assessment"
- },
- "MissingValues":[
- "missing"
- ]
- }
- },
- "tool2_item1":{
- "Description":"item 1 scores for tool2",
- "Annotations":{
- "IsAbout":{
- "TermURL":"nb:Assessment",
- "Label":"Assessment tool"
- },
- "IsPartOf":{
- "TermURL":"cogatlas:tsk_4a57abb949ece",
- "Label":"Unified Parkinson's Disease Rating Scale"
- },
- "MissingValues":[
- "not completed"
- ]
- }
- }
-}
diff --git a/cypress/fixtures/examples/good/example_synthetic_participants.json b/cypress/fixtures/examples/good/example_synthetic_participants.json
new file mode 100644
index 00000000..51dfed5b
--- /dev/null
+++ b/cypress/fixtures/examples/good/example_synthetic_participants.json
@@ -0,0 +1,34 @@
+{
+ "participant_id": {
+ "Description": "A participant ID"
+ },
+ "session_id": {
+ "Description": "A session ID"
+ },
+ "pheno_age": {
+ "Description": "Age of the participant"
+ },
+ "pheno_sex": {
+ "Description": "Sex variable",
+ "Levels": {
+ "M": "Male",
+ "F": "Female"
+ }
+ },
+ "pheno_group": {
+ "Description": "Group variable",
+ "Levels": {
+ "PAT": "Patient",
+ "CTRL": "Control subject"
+ }
+ },
+ "tool1_item1": {
+ "Description": "item 1 scores for tool1"
+ },
+ "tool1_item2": {
+ "Description": "item 2 scores for tool1"
+ },
+ "tool2_item1": {
+ "Description": "item 1 scores for tool2"
+ }
+}
\ No newline at end of file
diff --git a/cypress/support/commands.js b/cypress/support/commands.js
index 0bddf0cf..e75f05d8 100644
--- a/cypress/support/commands.js
+++ b/cypress/support/commands.js
@@ -26,16 +26,6 @@
// Standard setup functionality for each collection of tests
// NOTE: In the future we will likely want to parametrize this for different
-// test setups (i.e. testing across different viewport sizes).
-Cypress.Commands.add("appSetup", () => {
-
- // Standard setup for annotation tool testing
-
- // A. Set viewport size
- // NOTE: Standard 13-inch laptop screen to start, but this can be expanded
- cy.viewport("macbook-13");
-});
-
Cypress.Commands.add("assertButtonStatus", (p_buttonName, p_enabled) => {
let chainer = ( p_enabled ) ? "not.have.class" : "have.class";
diff --git a/cypress/unit/store-getter-getValueDescription.cy.js b/cypress/unit/store-getter-getValueDescription.cy.js
index 649ffc06..6aa0ecd1 100644
--- a/cypress/unit/store-getter-getValueDescription.cy.js
+++ b/cypress/unit/store-getter-getValueDescription.cy.js
@@ -5,17 +5,13 @@ const state = {
dataDictionary: {
annotated: {
"goodColumn": {
- "levels": {
- "value1": {
- "description": "my description"
- },
- "value2": {
- "description": "my other description"
+ "Levels": {
+ "value1": "my description",
+ "value2": "my other description"
}
- }
},
"levelsButNothingElse": {
- "levels": {
+ "Levels": {
}
},
"badColumn": {
@@ -33,12 +29,12 @@ describe("getValueDescription", () => {
expect(result).to.be.equal("my description");
});
- it("Returns an empty string if the value does not have a description", () => {
+ it("Returns 'no description available' if the value does not have a description", () => {
const resultNoValue = getters.getValueDescription(state)("levelsButNothingElse", "notExistValue");
- expect(resultNoValue).to.be.empty;
+ expect(resultNoValue).to.be.equal("no description available");
const resultNoLevels = getters.getValueDescription(state)("badColumn", "notExistValue");
- expect(resultNoLevels).to.be.empty;
+ expect(resultNoLevels).to.be.equal("no description available");
});
});
\ No newline at end of file
diff --git a/nuxt.config.js b/nuxt.config.js
index 4fd364ba..08770bd2 100644
--- a/nuxt.config.js
+++ b/nuxt.config.js
@@ -25,7 +25,6 @@ export default {
// Global CSS: https://go.nuxtjs.dev/config-css
css: [
-
"@/assets/css/main.css"
],
diff --git a/package-lock.json b/package-lock.json
index 53b26c72..f7c44ffd 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -19,22 +19,20 @@
"papaparse": "^5.4.1",
"vue": "^2.6.14",
"vue-select": "^3.20.2",
- "vue-server-renderer": "^2.6.14",
+ "vue-server-renderer": "^2.7.15",
"vue-template-compiler": "^2.6.14",
"webpack": "^4.47.0"
},
"devDependencies": {
"cy-verify-downloads": "^0.2.2",
- "cypress": "^13.3.3",
+ "cypress": "^13.4.0",
"editorconfig": "^2.0.0",
- "eslint": "^8.52.0",
+ "eslint": "^8.53.0",
"eslint-config-airbnb": "^19.0.4",
- "eslint-config-prettier": "^9.0.0",
"eslint-plugin-cypress": "^2.15.1",
- "eslint-plugin-prettier": "^4.2.1",
- "eslint-plugin-vue": "^9.17.0",
+ "eslint-plugin-vue": "^9.18.1",
"husky": "^8.0.3",
- "lint-staged": "^15.0.2",
+ "lint-staged": "^15.1.0",
"push-dir": "^0.4.1"
}
},
@@ -2831,9 +2829,9 @@
}
},
"node_modules/@eslint/eslintrc": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz",
- "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==",
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz",
+ "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==",
"dev": true,
"dependencies": {
"ajv": "^6.12.4",
@@ -2870,9 +2868,9 @@
}
},
"node_modules/@eslint/eslintrc/node_modules/globals": {
- "version": "13.21.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz",
- "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==",
+ "version": "13.23.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz",
+ "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==",
"dev": true,
"dependencies": {
"type-fest": "^0.20.2"
@@ -2891,9 +2889,9 @@
"dev": true
},
"node_modules/@eslint/js": {
- "version": "8.52.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz",
- "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==",
+ "version": "8.53.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz",
+ "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==",
"dev": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -6837,9 +6835,9 @@
"integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk="
},
"node_modules/cypress": {
- "version": "13.3.3",
- "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.3.3.tgz",
- "integrity": "sha512-mbdkojHhKB1xbrj7CrKWHi22uFx9P9vQFiR0sYDZZoK99OMp9/ZYN55TO5pjbXmV7xvCJ4JwBoADXjOJK8aCJw==",
+ "version": "13.4.0",
+ "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.4.0.tgz",
+ "integrity": "sha512-KeWNC9xSHG/ewZURVbaQsBQg2mOKw4XhjJZFKjWbEjgZCdxpPXLpJnfq5Jns1Gvnjp6AlnIfpZfWFlDgVKXdWQ==",
"dev": true,
"hasInstallScript": true,
"dependencies": {
@@ -7680,15 +7678,15 @@
}
},
"node_modules/eslint": {
- "version": "8.52.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz",
- "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==",
+ "version": "8.53.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz",
+ "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
- "@eslint/eslintrc": "^2.1.2",
- "@eslint/js": "8.52.0",
+ "@eslint/eslintrc": "^2.1.3",
+ "@eslint/js": "8.53.0",
"@humanwhocodes/config-array": "^0.11.13",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
@@ -7774,18 +7772,6 @@
"eslint-plugin-import": "^2.25.2"
}
},
- "node_modules/eslint-config-prettier": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz",
- "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==",
- "dev": true,
- "bin": {
- "eslint-config-prettier": "bin/cli.js"
- },
- "peerDependencies": {
- "eslint": ">=7.0.0"
- }
- },
"node_modules/eslint-import-resolver-node": {
"version": "0.3.6",
"resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz",
@@ -8023,27 +8009,6 @@
"dev": true,
"peer": true
},
- "node_modules/eslint-plugin-prettier": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz",
- "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==",
- "dev": true,
- "dependencies": {
- "prettier-linter-helpers": "^1.0.0"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "eslint": ">=7.28.0",
- "prettier": ">=2.0.0"
- },
- "peerDependenciesMeta": {
- "eslint-config-prettier": {
- "optional": true
- }
- }
- },
"node_modules/eslint-plugin-react": {
"version": "7.29.4",
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz",
@@ -8124,9 +8089,9 @@
}
},
"node_modules/eslint-plugin-vue": {
- "version": "9.17.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.17.0.tgz",
- "integrity": "sha512-r7Bp79pxQk9I5XDP0k2dpUC7Ots3OSWgvGZNu3BxmKK6Zg7NgVtcOB6OCna5Kb9oQwJPl5hq183WD0SY5tZtIQ==",
+ "version": "9.18.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.18.1.tgz",
+ "integrity": "sha512-7hZFlrEgg9NIzuVik2I9xSnJA5RsmOfueYgsUGUokEDLJ1LHtxO0Pl4duje1BriZ/jDWb+44tcIlC3yi0tdlZg==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.4.0",
@@ -8777,12 +8742,6 @@
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
},
- "node_modules/fast-diff": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
- "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
- "dev": true
- },
"node_modules/fast-glob": {
"version": "3.2.11",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
@@ -11022,9 +10981,9 @@
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
},
"node_modules/lint-staged": {
- "version": "15.0.2",
- "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.0.2.tgz",
- "integrity": "sha512-vnEy7pFTHyVuDmCAIFKR5QDO8XLVlPFQQyujQ/STOxe40ICWqJ6knS2wSJ/ffX/Lw0rz83luRDh+ET7toN+rOw==",
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.1.0.tgz",
+ "integrity": "sha512-ZPKXWHVlL7uwVpy8OZ7YQjYDAuO5X4kMh0XgZvPNxLcCCngd0PO5jKQyy3+s4TL2EnHoIXIzP1422f/l3nZKMw==",
"dev": true,
"dependencies": {
"chalk": "5.3.0",
@@ -11036,7 +10995,7 @@
"micromatch": "4.0.5",
"pidtree": "0.6.0",
"string-argv": "0.3.2",
- "yaml": "2.3.3"
+ "yaml": "2.3.4"
},
"bin": {
"lint-staged": "bin/lint-staged.js"
@@ -14917,7 +14876,7 @@
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz",
"integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==",
- "devOptional": true,
+ "optional": true,
"bin": {
"prettier": "bin-prettier.js"
},
@@ -14925,18 +14884,6 @@
"node": ">=10.13.0"
}
},
- "node_modules/prettier-linter-helpers": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
- "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
- "dev": true,
- "dependencies": {
- "fast-diff": "^1.1.2"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
"node_modules/pretty-bytes": {
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
@@ -19148,9 +19095,9 @@
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
},
"node_modules/yaml": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz",
- "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==",
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
+ "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
"dev": true,
"engines": {
"node": ">= 14"
@@ -20797,9 +20744,9 @@
"dev": true
},
"@eslint/eslintrc": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz",
- "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==",
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz",
+ "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==",
"dev": true,
"requires": {
"ajv": "^6.12.4",
@@ -20826,9 +20773,9 @@
}
},
"globals": {
- "version": "13.21.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz",
- "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==",
+ "version": "13.23.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz",
+ "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==",
"dev": true,
"requires": {
"type-fest": "^0.20.2"
@@ -20843,9 +20790,9 @@
}
},
"@eslint/js": {
- "version": "8.52.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz",
- "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==",
+ "version": "8.53.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz",
+ "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==",
"dev": true
},
"@gar/promisify": {
@@ -23870,9 +23817,9 @@
"integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk="
},
"cypress": {
- "version": "13.3.3",
- "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.3.3.tgz",
- "integrity": "sha512-mbdkojHhKB1xbrj7CrKWHi22uFx9P9vQFiR0sYDZZoK99OMp9/ZYN55TO5pjbXmV7xvCJ4JwBoADXjOJK8aCJw==",
+ "version": "13.4.0",
+ "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.4.0.tgz",
+ "integrity": "sha512-KeWNC9xSHG/ewZURVbaQsBQg2mOKw4XhjJZFKjWbEjgZCdxpPXLpJnfq5Jns1Gvnjp6AlnIfpZfWFlDgVKXdWQ==",
"dev": true,
"requires": {
"@cypress/request": "^3.0.0",
@@ -24535,15 +24482,15 @@
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
},
"eslint": {
- "version": "8.52.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz",
- "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==",
+ "version": "8.53.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz",
+ "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==",
"dev": true,
"requires": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
- "@eslint/eslintrc": "^2.1.2",
- "@eslint/js": "8.52.0",
+ "@eslint/eslintrc": "^2.1.3",
+ "@eslint/js": "8.53.0",
"@humanwhocodes/config-array": "^0.11.13",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
@@ -24700,13 +24647,6 @@
"semver": "^6.3.0"
}
},
- "eslint-config-prettier": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz",
- "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==",
- "dev": true,
- "requires": {}
- },
"eslint-import-resolver-node": {
"version": "0.3.6",
"resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz",
@@ -24909,15 +24849,6 @@
}
}
},
- "eslint-plugin-prettier": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz",
- "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==",
- "dev": true,
- "requires": {
- "prettier-linter-helpers": "^1.0.0"
- }
- },
"eslint-plugin-react": {
"version": "7.29.4",
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz",
@@ -24980,9 +24911,9 @@
"requires": {}
},
"eslint-plugin-vue": {
- "version": "9.17.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.17.0.tgz",
- "integrity": "sha512-r7Bp79pxQk9I5XDP0k2dpUC7Ots3OSWgvGZNu3BxmKK6Zg7NgVtcOB6OCna5Kb9oQwJPl5hq183WD0SY5tZtIQ==",
+ "version": "9.18.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.18.1.tgz",
+ "integrity": "sha512-7hZFlrEgg9NIzuVik2I9xSnJA5RsmOfueYgsUGUokEDLJ1LHtxO0Pl4duje1BriZ/jDWb+44tcIlC3yi0tdlZg==",
"dev": true,
"requires": {
"@eslint-community/eslint-utils": "^4.4.0",
@@ -25367,12 +25298,6 @@
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
},
- "fast-diff": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
- "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
- "dev": true
- },
"fast-glob": {
"version": "3.2.11",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
@@ -27012,9 +26937,9 @@
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
},
"lint-staged": {
- "version": "15.0.2",
- "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.0.2.tgz",
- "integrity": "sha512-vnEy7pFTHyVuDmCAIFKR5QDO8XLVlPFQQyujQ/STOxe40ICWqJ6knS2wSJ/ffX/Lw0rz83luRDh+ET7toN+rOw==",
+ "version": "15.1.0",
+ "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.1.0.tgz",
+ "integrity": "sha512-ZPKXWHVlL7uwVpy8OZ7YQjYDAuO5X4kMh0XgZvPNxLcCCngd0PO5jKQyy3+s4TL2EnHoIXIzP1422f/l3nZKMw==",
"dev": true,
"requires": {
"chalk": "5.3.0",
@@ -27026,7 +26951,7 @@
"micromatch": "4.0.5",
"pidtree": "0.6.0",
"string-argv": "0.3.2",
- "yaml": "2.3.3"
+ "yaml": "2.3.4"
},
"dependencies": {
"ansi-escapes": {
@@ -29585,16 +29510,7 @@
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz",
"integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==",
- "devOptional": true
- },
- "prettier-linter-helpers": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
- "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
- "dev": true,
- "requires": {
- "fast-diff": "^1.1.2"
- }
+ "optional": true
},
"pretty-bytes": {
"version": "5.6.0",
@@ -32848,9 +32764,9 @@
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
},
"yaml": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz",
- "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==",
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
+ "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
"dev": true
},
"yauzl": {
diff --git a/package.json b/package.json
index f9fd342f..488770e2 100644
--- a/package.json
+++ b/package.json
@@ -26,22 +26,20 @@
"papaparse": "^5.4.1",
"vue": "^2.6.14",
"vue-select": "^3.20.2",
- "vue-server-renderer": "^2.6.14",
+ "vue-server-renderer": "^2.7.15",
"vue-template-compiler": "^2.6.14",
"webpack": "^4.47.0"
},
"devDependencies": {
"cy-verify-downloads": "^0.2.2",
- "cypress": "^13.3.3",
+ "cypress": "^13.4.0",
"editorconfig": "^2.0.0",
- "eslint": "^8.52.0",
+ "eslint": "^8.53.0",
"eslint-config-airbnb": "^19.0.4",
- "eslint-config-prettier": "^9.0.0",
"eslint-plugin-cypress": "^2.15.1",
- "eslint-plugin-prettier": "^4.2.1",
- "eslint-plugin-vue": "^9.17.0",
+ "eslint-plugin-vue": "^9.18.1",
"husky": "^8.0.3",
- "lint-staged": "^15.0.2",
+ "lint-staged": "^15.1.0",
"push-dir": "^0.4.1"
}
}
diff --git a/pages/categorization.vue b/pages/categorization.vue
index 9f41ca6d..a939c059 100644
--- a/pages/categorization.vue
+++ b/pages/categorization.vue
@@ -34,11 +34,7 @@
-
-
-
-
-
+
diff --git a/pages/index.vue b/pages/index.vue
index 0ecfedc6..bfbd80ef 100644
--- a/pages/index.vue
+++ b/pages/index.vue
@@ -7,15 +7,6 @@
{{ uiText.dataTableHeader }}
-
-
-
-
-
-
-
+
- {{ uiText.dataDictionaryHeader }}
+
+
+ Please provide a data table to see a preview here.
+
-
+
+
-
+ {{ uiText.dataDictionaryHeader }}
@@ -49,6 +44,20 @@
:enabled="dataTableSelected" />
+
+
+
+ {{ stringifiedDataDictionary }}
+
+
+ Provide a data dictionary to see the preview.
+ If you load a data table, a skeleton data dictionary will be created for you
+
+
+
@@ -101,19 +110,9 @@
// (used to enable data dictionary selection)
return ( this.dataTable.length > 0 );
},
-
stringifiedDataDictionary() {
- return ( 0 === Object.keys(this.dataDictionary.userProvided).length )
- ? "" : JSON.stringify(this.dataDictionary.userProvided, null, 4);
- },
-
- stringifiedDataTable() {
-
- // Returns only the cell values of the table as a formatted string (no column names)
- return this.dataTable.map(row => {
- return Object.values(row).join("\t");
- }).join("\n");
+ return JSON.stringify(this.dataDictionary.userProvided, null, 4);
}
},
diff --git a/store/index.js b/store/index.js
index aa93e7a0..1e14964e 100644
--- a/store/index.js
+++ b/store/index.js
@@ -644,9 +644,9 @@ export const getters = {
getValueDescription: (p_state) => (p_columnName, p_value) => {
// Returns the description of a value in a column, if that description exists
// Otherwise it returns an empty string
- const description = p_state.dataDictionary.annotated[p_columnName].levels?.[p_value]?.description;
+ const description = p_state.dataDictionary.annotated[p_columnName].Levels?.[p_value];
if ( typeof description === "undefined" ) {
- return "";
+ return "no description available";
}
return description;
},
diff --git a/test_contributions.md b/test_contributions.md
index 4919439f..aa66c47b 100644
--- a/test_contributions.md
+++ b/test_contributions.md
@@ -22,7 +22,6 @@ TBD
- `context` is a container function used to group different kinds of tests within the file and also is used to describe that context
- `it` defines the individual, specific test you are writing
*3.* Both `describe` and `context` can contain `beforeEach` functions that will be run before every `context` or before every `it`, respectively
- - Use the `appSetup` function in your `beforeEach` for the `describe` function. This calls a set of common app configuration commands.
*4.* Writing individual tests
- Tests contain three primary sections: setup, action, and assert. They can be repeated as needed depending on the complexity of the test. But a good guideline to follow is to keep tests as simople as possible.
- It is possible to work with multiple datasets for one test file. The paradigm that has been setup can be seen, for example, in `annotation-pagetests.cy.js`. The idea is that you utilize json files in the `fixtures` folder that describe each dataset and can use functions `datasetMeetsTestCriteria` and `loadAppState` to reflect both the data needs of your test and the dataset that's being used for the test.