diff --git a/.circleci/config.yml b/.circleci/config.yml
index aeb23948fd6..4e82f32b0b7 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -104,7 +104,7 @@ jobs:
- run: tox -e test_galaxy_packages
js_lint:
docker:
- - image: cimg/node:14.15
+ - image: cimg/node:16.13.2
<<: *set_workdir
steps:
- *restore_yarn_cache
diff --git a/client/.eslintignore b/client/.eslintignore
deleted file mode 100644
index bacad2ec6e2..00000000000
--- a/client/.eslintignore
+++ /dev/null
@@ -1,5 +0,0 @@
-src/qunit
-src/mocha
-src/libs
-src/nls
-src/legacy
diff --git a/client/.eslintrc.js b/client/.eslintrc.json
similarity index 55%
rename from client/.eslintrc.js
rename to client/.eslintrc.json
index b061f993130..7f177bcbd46 100644
--- a/client/.eslintrc.js
+++ b/client/.eslintrc.json
@@ -1,38 +1,36 @@
-module.exports = {
- extends: [
+{
+ "extends": [
"eslint:recommended",
- "plugin:vue/strongly-recommended",
+ "plugin:vue/strongly-recommended"
//"airbnb-base", eventually
],
- env: {
- browser: true,
- commonjs: true,
- es6: true,
- node: true,
- jest: true,
+ "env": {
+ "browser": true,
+ "commonjs": true,
+ "es6": true,
+ "node": true,
+ "jest": true
},
- parserOptions: {
- parser: "babel-eslint",
- sourceType: "module",
+ "parserOptions": {
+ "parser": "@babel/eslint-parser",
+ "sourceType": "module"
},
- rules: {
+ "rules": {
// Standard rules
"no-console": "off",
- "no-unused-vars": ["error", { args: "none" }],
+ "no-unused-vars": ["error", { "args": "none" }],
"prefer-const": "error",
"one-var": ["error", "never"],
"curly": "error",
"vue/valid-v-slot": "error",
- "vue/v-slot-style": ["error", { atComponent: "v-slot", default: "v-slot", named: "longform" }],
-
- // Now in strongly-recommended, enforce instead of warn.
- "vue/attribute-hyphenation": "error",
+ "vue/v-slot-style": ["error", { "atComponent": "v-slot", "default": "v-slot", "named": "longform" }],
// Vue TODO (enable these)
"vue/require-default-prop": "warn",
"vue/require-prop-types": "warn",
"vue/prop-name-casing": "warn",
+ "vue/multi-word-component-names": "warn",
// Prettier compromises/workarounds -- mostly #wontfix?
"vue/html-indent": "off",
@@ -41,6 +39,7 @@ module.exports = {
"vue/singleline-html-element-content-newline": "off",
"vue/multiline-html-element-content-newline": "off",
"vue/html-closing-bracket-newline": "off",
- "vue/html-closing-bracket-spacing": "off",
+ "vue/html-closing-bracket-spacing": "off"
},
-};
+ "ignorePatterns": ["src/qunit", "src/mocha", "src/libs", "src/nls", "src/legacy"]
+}
diff --git a/client/.node_version b/client/.node_version
index c1074247761..23d9c36a118 100644
--- a/client/.node_version
+++ b/client/.node_version
@@ -1 +1 @@
-14.15.0
+16.13.2
diff --git a/client/docs/README.md b/client/docs/README.md
deleted file mode 100644
index b57412ac27e..00000000000
--- a/client/docs/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-The \*.md files in this directory are rendered as a style guide generated when
-running ```yarn run styleguide```.
-
-For more details see [Vue
-Styleguidist](https://github.com/vue-styleguidist/vue-styleguidist).
diff --git a/client/docs/src/component-design/avoid-using-global-Galaxy.md b/client/docs/avoid-using-global-Galaxy.md
similarity index 100%
rename from client/docs/src/component-design/avoid-using-global-Galaxy.md
rename to client/docs/avoid-using-global-Galaxy.md
diff --git a/client/docs/src/component-design/never-use-jquery.md b/client/docs/never-use-jquery.md
similarity index 100%
rename from client/docs/src/component-design/never-use-jquery.md
rename to client/docs/never-use-jquery.md
diff --git a/client/docs/src/component-design/providers-and-renderers.md b/client/docs/providers-and-renderers.md
similarity index 100%
rename from client/docs/src/component-design/providers-and-renderers.md
rename to client/docs/providers-and-renderers.md
diff --git a/client/docs/src/component-design/readme.md b/client/docs/readme.md
similarity index 100%
rename from client/docs/src/component-design/readme.md
rename to client/docs/readme.md
diff --git a/client/docs/root.js b/client/docs/root.js
deleted file mode 100644
index 7e02f3f2ecc..00000000000
--- a/client/docs/root.js
+++ /dev/null
@@ -1,15 +0,0 @@
-/**
- * Component root for rendering inside the styleguide, injects vuex store and other common elements
- * into each component example section.
- */
-
-import store from "../src/store";
-
-export default (previewComponent) => {
- return {
- store,
- render(h) {
- return h(previewComponent);
- },
- };
-};
diff --git a/client/docs/sections.js b/client/docs/sections.js
deleted file mode 100644
index 0b86475259a..00000000000
--- a/client/docs/sections.js
+++ /dev/null
@@ -1,142 +0,0 @@
-/**
- * Functions for generating the sections for the style guide. Has the old style doc glob and a
- * recursive tree-walker that looks through the components folder and tries to arrange found
- * markdown docs in a tree.
- */
-
-const path = require("path");
-const fs = require("fs");
-const glob = require("glob");
-const { humanize, titleize } = require("underscore.string");
-
-/**
- * Gets the table of contents sections for documentation in the components folder.
- *
- * @param {string} rootPath absolute path to components folder
- * @return {Object} Rootnode, section map, childMap
- */
-function getDocSections(rootPath, options = {}) {
- const { ignore = [], docSelector = "*.@(vue|md)" } = options;
-
- const sections = new Map(); // absolute section directory path -> section object
- const childToParent = new Map(); // absolute child path -> absolute parent path
-
- // create root node
- const rootNode = newSection(rootPath, ignore);
- sections.set(rootPath, rootNode);
- childToParent.set(rootPath, null);
-
- // get all matching doc files
- const selector = path.join(rootPath, "**", docSelector);
- const allFiles = glob.sync(selector, { ignore });
-
- allFiles.forEach((file) => {
- const p = path.parse(file);
-
- // intermediate dir names between this dir and root
- const relPath = path.relative(rootPath, p.dir);
- const midFolders = relPath.split(path.sep);
-
- // build intermediate parent sections in the event that this is deeply-nested
- while (midFolders.length) {
- const sectionPath = path.join(rootPath, ...midFolders);
- if (!sections.has(sectionPath)) {
- // create new section
- const section = newSection(sectionPath, ignore);
- sections.set(sectionPath, section);
- // register relationship for tree-build later
- const parentPath = path.join(sectionPath, "..");
- childToParent.set(sectionPath, parentPath);
- }
- midFolders.pop();
- }
-
- // if it's a MD file, add to parent as a subsection
- const section = sections.get(p.dir);
- if (section && isSubsection(section, file)) {
- section.children.add({
- name: titleize(humanize(p.name)),
- content: file,
- });
- }
- });
-
- // assemble recursive section tree under rootNode
- buildSectionTree(sections, childToParent);
-
- // rootNode is the main result, returning the maps so the user has the option to manipulate the
- // tree before handing it over to the styleguide configs
- return { sections, childToParent, rootNode };
-}
-
-function isSubsection(section, file) {
- const p = path.parse(file);
-
- // it's not a subsection if it's not a markdown file
- if (p.ext !== ".md") return false;
-
- // it's not a subsection if it's the same file as the section content
- if (file === section.content) return false;
-
- // it's not a subsection if it's an example for an existing component
- const matchingComponentPath = path.join(p.dir, `${p.name}.vue`);
- const componentExists = fs.existsSync(matchingComponentPath);
- if (componentExists) return false;
-
- return true;
-}
-
-/**
- * Creates a new section in the TOC from passed path.
- *
- * @param {string} dir absolute directory path
- * @return {Object} section object
- */
-function newSection(dir, ignore = []) {
- const section = {
- name: titleize(humanize(path.basename(dir))),
- components: () => glob.sync(path.join(dir, "*.vue"), { ignore }),
- children: new Set(),
- sectionDepth: 1,
- };
-
- // summary doc is readme/docs/index.md
- const summarySelector = path.join(dir, "@(readme|docs|index).md");
- const summaryDocs = glob.sync(summarySelector, { ignore, nocase: true });
- if (summaryDocs.length) {
- section.content = summaryDocs[0];
- }
-
- return section;
-}
-
-/**
- * Turns the pair of maps into a nested object for use in the styleguide config script. Operates on
- * sections array by reference.
- *
- * @param {Map} sections Map of path -> section object
- * @param {Map} childToParent Map of childPath -> parentPath
- */
-function buildSectionTree(sections, childToParent) {
- // add each child to its parent
- for (const [childPath, parentPath] of childToParent) {
- const child = sections.get(childPath);
- const parent = sections.get(parentPath);
- if (child && parent && parent.children) {
- parent.children.add(child);
- }
- }
- // convert child Sets to arrays now that de-dupe not required
- for (const section of sections.values()) {
- section.sections = Array.from(section.children).sort((a, b) => a.name.localeCompare(b.name));
- delete section.children;
- }
-}
-
-module.exports = {
- // public function
- getDocSections,
- // exporting these in case user wants to tweak the result tree and rebuild it
- buildSectionTree,
- newSection,
-};
diff --git a/client/docs/src/styles/bootstrap.md b/client/docs/src/styles/bootstrap.md
deleted file mode 100644
index 30ad491c74d..00000000000
--- a/client/docs/src/styles/bootstrap.md
+++ /dev/null
@@ -1,379 +0,0 @@
-## Buttons
-
-Regular buttons
-
-```vue
-
- Primary
- Secondary
- Success
- Info
- Warning
- Danger
- Link
-
-```
-
-Disabled
-
-```vue
-
- Primary
- Secondary
- Success
- Info
- Warning
- Danger
- Link
-
-```
-
-```vue
-
- Primary
- Secondary
- Success
- Info
- Warning
- Danger
-
-```
-
-```vue
-
-```
-
-```vue
-
-```
-
-```vue
-
-```
-
-```vue
-
-```
-
-```vue
-
- Large button
- Default button
- Small button
-
-```
-
-## Alerts
-
-```vue
-
-
×
-
Warning!
-
Best check yo self, you're not looking too good. Nulla vitae elit libero, a pharetra augue. Praesent commodo cursus magna, vel scelerisque nisl consectetur et .
-
-```
-
-```vue
-
-```
-
-```vue
-
-```
-
-```vue
-
-```
-
-## Badges
-
-```vue
-
- Primary
- Secondary
- Success
- Warning
- Danger
- Info
-
-```
-
-```vue
-
-```
-
-## Tables
-
-```vue
-
-
-
-
- #
- Column heading
- Column heading
- Column heading
-
-
-
-
- 1
- Column content
- Column content
- Column content
-
-
- 2
- Column content
- Column content
- Column content
-
-
- 3
- Column content
- Column content
- Column content
-
-
- 4
- Column content
- Column content
- Column content
-
-
- 5
- Column content
- Column content
- Column content
-
-
- 6
- Column content
- Column content
- Column content
-
-
- 7
- Column content
- Column content
- Column content
-
-
-
-
-```
-
-## Cards
-
-```vue
-
-
-
-
-
-
-
Primary card title
-
Some quick example text to build on the card title and make up the bulk of the card's content.
-
-
-
-
-
-
Secondary card title
-
Some quick example text to build on the card title and make up the bulk of the card's content.
-
-
-
-
-
-
Success card title
-
Some quick example text to build on the card title and make up the bulk of the card's content.
-
-
-
-
-
-
Danger card title
-
Some quick example text to build on the card title and make up the bulk of the card's content.
-
-
-
-
-
-
Warning card title
-
Some quick example text to build on the card title and make up the bulk of the card's content.
-
-
-
-
-
-
Info card title
-
Some quick example text to build on the card title and make up the bulk of the card's content.
-
-
-
-
-
-
Light card title
-
Some quick example text to build on the card title and make up the bulk of the card's content.
-
-
-
-
-
-
Dark card title
-
Some quick example text to build on the card title and make up the bulk of the card's content.
-
-
-
-
-
-
-
-
-
-
Primary card title
-
Some quick example text to build on the card title and make up the bulk of the card's content.
-
-
-
-
-
-
Secondary card title
-
Some quick example text to build on the card title and make up the bulk of the card's content.
-
-
-
-
-
-
Success card title
-
Some quick example text to build on the card title and make up the bulk of the card's content.
-
-
-
-
-
-
Danger card title
-
Some quick example text to build on the card title and make up the bulk of the card's content.
-
-
-
-
-
-
Warning card title
-
Some quick example text to build on the card title and make up the bulk of the card's content.
-
-
-
-
-
-
Info card title
-
Some quick example text to build on the card title and make up the bulk of the card's content.
-
-
-
-
-
-
Light card title
-
Some quick example text to build on the card title and make up the bulk of the card's content.
-
-
-
-
-
-
Dark card title
-
Some quick example text to build on the card title and make up the bulk of the card's content.
-
-
-
-
-
-
-
-
-
-
-
Special title treatment
- Support card subtitle
-
-
-
-
Some quick example text to build on the card title and make up the bulk of the card's content.
-
-
- Cras justo odio
- Dapibus ac facilisis in
- Vestibulum at eros
-
-
-
-
-
-
-
Card title
-
Card subtitle
-
Some quick example text to build on the card title and make up the bulk of the card's content.
-
Card link
-
Another link
-
-
-
-
-
-```
diff --git a/client/docs/src/styles/galaxy-styles/buttons.md b/client/docs/src/styles/galaxy-styles/buttons.md
deleted file mode 100644
index 30675603809..00000000000
--- a/client/docs/src/styles/galaxy-styles/buttons.md
+++ /dev/null
@@ -1,49 +0,0 @@
-## Buttons
-
-```vue
-Just a default button
-```
-
-```vue
-An anchor with .action-button
-```
-
-All the crazy permutations of menu button...
-
-```vue
-
-```
-
-```vue
-
-```
-
-```vue
-
-
-```
-
-## Radio Buttons
-
-As generated by mvc.ui.ui-options
-
-```vue
-
-
- Active
-
-
- Radio
-
-
- Radio
-
-
-```
-
-## Pagination
-
-```vue
-
-```
diff --git a/client/docs/src/styles/galaxy-styles/forms.md b/client/docs/src/styles/galaxy-styles/forms.md
deleted file mode 100644
index 662f096689b..00000000000
--- a/client/docs/src/styles/galaxy-styles/forms.md
+++ /dev/null
@@ -1,55 +0,0 @@
-## Forms
-
-Manually crafted "tool" form class, this is broken in the BS4 branch I think.
-
-```vue
-
-```
-
-Portlet variant generated by mvc.form.form-view
-
-```vue
-
-```
diff --git a/client/docs/src/styles/galaxy-styles/masthead.md b/client/docs/src/styles/galaxy-styles/masthead.md
deleted file mode 100644
index 164ed6e5060..00000000000
--- a/client/docs/src/styles/galaxy-styles/masthead.md
+++ /dev/null
@@ -1,69 +0,0 @@
-## Masthead
-
-As generated by layout.masthead.js
-
-Default height:
-
-```vue
-
-
-
- Title
-
-
-
-```
-
-Override height with "height: 80px;"
-
-```vue
-
-
-
- Title
-
-
-
-```
-
-Override height with "height: 4rem;"
-
-```vue
-
-
-
- Title
-
-
-
-```
diff --git a/client/docs/src/styles/galaxy-styles/menus.md b/client/docs/src/styles/galaxy-styles/menus.md
deleted file mode 100644
index 12763f91d02..00000000000
--- a/client/docs/src/styles/galaxy-styles/menus.md
+++ /dev/null
@@ -1,19 +0,0 @@
-## Popup menus
-
-These are the classes for the menu itself, normally floating, so placed inside
-a relative element.
-
-```vue
-
-
-
-```
diff --git a/client/docs/src/styles/galaxy-styles/messages.md b/client/docs/src/styles/galaxy-styles/messages.md
deleted file mode 100644
index 51397a8403c..00000000000
--- a/client/docs/src/styles/galaxy-styles/messages.md
+++ /dev/null
@@ -1,33 +0,0 @@
-### Panel Messages
-
-Messages that appear across the top of the panel view below the masthead.
-
-```vue
-
-
-
I'm a panel-{{type}}-message
-
-
-```
-
-### Large Messages
-
-Used for providing feedback inline.
-
-```vue
-
-
-
I'm a {{type}}messagelarge
-
-
-```
-
-### Small Messages
-
-```vue
-
-
-
I'm a {{type}}message
-
-
-```
diff --git a/client/docs/src/styles/galaxy-styles/panels.md b/client/docs/src/styles/galaxy-styles/panels.md
deleted file mode 100644
index 373f457bcdb..00000000000
--- a/client/docs/src/styles/galaxy-styles/panels.md
+++ /dev/null
@@ -1,20 +0,0 @@
-## Panel (toolMenuContainer)
-
-```vue
-
-```
diff --git a/client/docs/src/styles/galaxy-styles/tables.md b/client/docs/src/styles/galaxy-styles/tables.md
deleted file mode 100644
index 66a2ffd3f94..00000000000
--- a/client/docs/src/styles/galaxy-styles/tables.md
+++ /dev/null
@@ -1,14 +0,0 @@
-## Tables
-
-Tables using the .grid class
-
-```vue
-
-```
diff --git a/client/docs/src/styles/galaxy-styles/tabs.md b/client/docs/src/styles/galaxy-styles/tabs.md
deleted file mode 100644
index d8f19e05504..00000000000
--- a/client/docs/src/styles/galaxy-styles/tabs.md
+++ /dev/null
@@ -1,32 +0,0 @@
-## Tabs
-
-Tabs as generated by mvc.ui.ui-tabs
-
-```vue
-
-```
diff --git a/client/docs/test/sample-docs/a-file.md b/client/docs/test/sample-docs/a-file.md
deleted file mode 100644
index bd8d6998af4..00000000000
--- a/client/docs/test/sample-docs/a-file.md
+++ /dev/null
@@ -1 +0,0 @@
-# testdocs/a-file.md
\ No newline at end of file
diff --git a/client/docs/test/sample-docs/another-file.md b/client/docs/test/sample-docs/another-file.md
deleted file mode 100644
index c8d2be4519d..00000000000
--- a/client/docs/test/sample-docs/another-file.md
+++ /dev/null
@@ -1 +0,0 @@
-# testdocs/another-file.md
\ No newline at end of file
diff --git a/client/docs/test/sample-docs/component-example/SomeComponent.md b/client/docs/test/sample-docs/component-example/SomeComponent.md
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/client/docs/test/sample-docs/component-example/SomeComponent.vue b/client/docs/test/sample-docs/component-example/SomeComponent.vue
deleted file mode 100644
index ef519b76833..00000000000
--- a/client/docs/test/sample-docs/component-example/SomeComponent.vue
+++ /dev/null
@@ -1,3 +0,0 @@
-
- Yay!
-
\ No newline at end of file
diff --git a/client/docs/test/sample-docs/contains-ommitted-file/ignored-file.md b/client/docs/test/sample-docs/contains-ommitted-file/ignored-file.md
deleted file mode 100644
index 18c16545f98..00000000000
--- a/client/docs/test/sample-docs/contains-ommitted-file/ignored-file.md
+++ /dev/null
@@ -1 +0,0 @@
-# ignored-file.md
\ No newline at end of file
diff --git a/client/docs/test/sample-docs/contains-ommitted-file/some-loose-file.md b/client/docs/test/sample-docs/contains-ommitted-file/some-loose-file.md
deleted file mode 100644
index 7cc5029a826..00000000000
--- a/client/docs/test/sample-docs/contains-ommitted-file/some-loose-file.md
+++ /dev/null
@@ -1 +0,0 @@
-# some-loose-file.md
\ No newline at end of file
diff --git a/client/docs/test/sample-docs/has-readme/loose.md b/client/docs/test/sample-docs/has-readme/loose.md
deleted file mode 100644
index 70ef94ec877..00000000000
--- a/client/docs/test/sample-docs/has-readme/loose.md
+++ /dev/null
@@ -1 +0,0 @@
-# loose file
\ No newline at end of file
diff --git a/client/docs/test/sample-docs/has-readme/readme.md b/client/docs/test/sample-docs/has-readme/readme.md
deleted file mode 100644
index eb8b03babff..00000000000
--- a/client/docs/test/sample-docs/has-readme/readme.md
+++ /dev/null
@@ -1 +0,0 @@
-# testdocs/abc/readme.md
\ No newline at end of file
diff --git a/client/docs/test/sample-docs/ignored/foo.md b/client/docs/test/sample-docs/ignored/foo.md
deleted file mode 100644
index ad96c729e02..00000000000
--- a/client/docs/test/sample-docs/ignored/foo.md
+++ /dev/null
@@ -1 +0,0 @@
-# foo
\ No newline at end of file
diff --git a/client/docs/test/sample-docs/nested-folders/another-nested-folder/should-exist.md b/client/docs/test/sample-docs/nested-folders/another-nested-folder/should-exist.md
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/client/docs/test/sample-docs/no-summary-file/another-loose-file.md b/client/docs/test/sample-docs/no-summary-file/another-loose-file.md
deleted file mode 100644
index 5be0105b76e..00000000000
--- a/client/docs/test/sample-docs/no-summary-file/another-loose-file.md
+++ /dev/null
@@ -1 +0,0 @@
-# another loose file
\ No newline at end of file
diff --git a/client/docs/test/sample-docs/no-summary-file/loose.md b/client/docs/test/sample-docs/no-summary-file/loose.md
deleted file mode 100644
index 8306ab6295b..00000000000
--- a/client/docs/test/sample-docs/no-summary-file/loose.md
+++ /dev/null
@@ -1 +0,0 @@
-# Loose file
\ No newline at end of file
diff --git a/client/docs/test/sections.test.js b/client/docs/test/sections.test.js
deleted file mode 100644
index d079ffe3162..00000000000
--- a/client/docs/test/sections.test.js
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * Tests the functions which build the sections for the styleguide.
- */
-
-const path = require("path");
-const { getDocSections } = require("../sections");
-
-const getSectionByName = (sections, name) => sections.find((o) => o.name == name);
-
-describe("getDocSections", () => {
- const ignore = [
- // ignoring a whole directory
- "**/ignored/*",
- // ignoring a file
- "**/ignore*",
- ];
- const testDocRoot = path.join(__dirname, "sample-docs");
- const { rootNode } = getDocSections(testDocRoot, { ignore });
-
- test("section generation", () => {
- expect(rootNode.name).toEqual("Sample Docs");
- expect(rootNode.sections.length).toEqual(7);
- expect(rootNode.content).toBeUndefined();
- });
-
- test("nested subsection should appear even if no docs in intermediate folders", () => {
- const deepSection = getSectionByName(rootNode.sections, "Nested Folders");
- expect(deepSection.sections.length).toEqual(1);
- });
-
- test("subdirectory with readme should register as summary", () => {
- const subsection = getSectionByName(rootNode.sections, "Has Readme");
-
- // readme interpreted as content file and not as loose section
- // one other loose file
- expect(subsection.content).toContain("readme.md");
- expect(subsection.sections.length).toEqual(1);
- });
-
- test("subdirectory with no readme file", () => {
- const subsection = getSectionByName(rootNode.sections, "No Summary File");
-
- // should just see 2 folders no summary
- expect(subsection.content).toBeUndefined();
- expect(subsection.sections.length).toEqual(2);
- });
-
- test("subdirectory with ignored file", () => {
- const subsection = getSectionByName(rootNode.sections, "Contains Ommitted File");
- expect(subsection.sections.length).toEqual(1);
- });
-
- test("ignored subdirectory", () => {
- const ignoredSection = getSectionByName(rootNode.sections, "Ignored");
- expect(ignoredSection).toBeUndefined();
- });
-
- test("should not create a section for a component example file", () => {
- const section = getSectionByName(rootNode.sections, "Component Example");
- expect(section.sections.length).toEqual(0);
- });
-});
diff --git a/client/docs/src/component-design/unit-testing/debugging-unit-tests.md b/client/docs/unit-testing/debugging-unit-tests.md
similarity index 100%
rename from client/docs/src/component-design/unit-testing/debugging-unit-tests.md
rename to client/docs/unit-testing/debugging-unit-tests.md
diff --git a/client/docs/src/component-design/unit-testing/readme.md b/client/docs/unit-testing/readme.md
similarity index 100%
rename from client/docs/src/component-design/unit-testing/readme.md
rename to client/docs/unit-testing/readme.md
diff --git a/client/docs/src/component-design/unit-testing/strategies.md b/client/docs/unit-testing/strategies.md
similarity index 100%
rename from client/docs/src/component-design/unit-testing/strategies.md
rename to client/docs/unit-testing/strategies.md
diff --git a/client/docs/src/component-design/unit-testing/writing-tests.md b/client/docs/unit-testing/writing-tests.md
similarity index 100%
rename from client/docs/src/component-design/unit-testing/writing-tests.md
rename to client/docs/unit-testing/writing-tests.md
diff --git a/client/package.json b/client/package.json
index faedd886b87..f03123c8ffb 100644
--- a/client/package.json
+++ b/client/package.json
@@ -11,8 +11,7 @@
},
"license": "AFL-3.0",
"resolutions": {
- "**/chokidar": "3.5.2",
- "**/ua-parser-js": "0.7.30"
+ "**/chokidar": "3.5.3"
},
"dependencies": {
"@fortawesome/fontawesome-free": "^5.15.4",
@@ -20,21 +19,22 @@
"@fortawesome/free-brands-svg-icons": "^5.15.4",
"@fortawesome/free-regular-svg-icons": "^5.15.4",
"@fortawesome/free-solid-svg-icons": "^5.15.4",
- "@fortawesome/vue-fontawesome": "^2.0.2",
+ "@fortawesome/vue-fontawesome": "^2.0.6",
"@galaxyproject/bootstrap-tour": "^0.12.1",
"@handsontable/vue": "^2.0.0-beta1",
- "@hirez_io/observer-spy": "^2.1.0",
+ "@hirez_io/observer-spy": "^2.1.2",
"@johmun/vue-tags-input": "^2.1.0",
- "@sentry/browser": "^5.20.1",
- "axios": "^0.21.1",
+ "@sentry/browser": "^6.17.4",
+ "assert": "^2.0.0",
+ "axios": "^0.25.0",
"babel-runtime": "^6.26.0",
"backbone": "1.4.0",
- "bootstrap": "4.5.0",
+ "bootstrap": "4.6",
"bootstrap-vue": "^2.21.2",
- "citation-js": "^0.5.1",
- "core-js": "^3.19.1",
+ "citation-js": "^0.5.5",
+ "core-js": "^3.21.0",
"d3": "3",
- "date-fns": "^2.24.0",
+ "date-fns": "^2.28.0",
"decode-uri-component": "^0.2.0",
"deep-diff": "^1.0.2",
"deep-equal": "^2.0.5",
@@ -44,18 +44,19 @@
"flush-promises": "^1.0.2",
"glob": "^7.2.0",
"handsontable": "^2.0.0",
- "imask": "^6.2.2",
+ "imask": "^6.4.0",
"in-viewport": "^3.6.0",
"is-promise": "^4.0.0",
"isotope-layout": "^3.0.6",
- "iter-tools": "7.1.4",
+ "iter-tools": "7.2.0",
"jquery": "2",
"jquery-migrate": "~1.4",
"jquery-mousewheel": "^3.1.13",
- "jquery-ui": "^1.12.1",
+ "jquery-ui": "^1.13.1",
"jquery.cookie": "^1.4.1",
- "jspdf": "^2.4.0",
- "linkifyjs": "^2.1.9",
+ "jspdf": "^2.5.1",
+ "linkify-html": "^3.0.5",
+ "linkifyjs": "^3.0.5",
"markdown-it": "^12.3.2",
"markdown-it-regexp": "^0.4.0",
"moment": "2.29.1",
@@ -68,36 +69,38 @@
"pouchdb-find": "^7.2.2",
"pouchdb-upsert": "^2.2.0",
"pretty-bytes": "^5.6.0",
- "proper-skip-list": "^4.0.2",
+ "proper-skip-list": "^4.1.0",
"pyre-to-regexp": "^0.0.5",
+ "querystring-es3": "^0.2.1",
"regenerator-runtime": "^0.13.9",
"regression": "^2.0.1",
"requirejs": "2.3.6",
- "rxjs": "^7.4.0",
- "rxjs-spy": "^8.0.0",
+ "rxjs": "^7.5.2",
+ "rxjs-spy": "^8.0.2",
"rxjs-spy-devtools-plugin": "^0.0.4",
- "slugify": "^1.6.0",
+ "slugify": "^1.6.5",
"snake-case": "^3.0.4",
"splitpanes": "2.3.8",
"stream-browserify": "^3.0.0",
- "threads": "^1.6.5",
+ "threads": "^1.7.0",
"timers-browserify": "^2.0.12",
"toastr": "^2.1.4",
"tus-js-client": "^2.3.0",
- "underscore": "^1.10.2",
- "underscore.string": "^3.3.5",
+ "underscore": "^1.13.2",
+ "underscore.string": "^3.3.6",
+ "util": "^0.12.4",
"vue": "^2.6.14",
"vue-infinite-scroll": "^2.0.2",
- "vue-multiselect": "^2.1.0",
+ "vue-multiselect": "^2.1.6",
"vue-observe-visibility": "^1.0.0",
"vue-prismjs": "^1.2.0",
- "vue-router": "^3.5.2",
+ "vue-router": "^3.5.3",
"vue-rx": "^6.2.0",
"vue-scrollto": "^2.20.0",
"vuedraggable": "2.24.3",
"vueisotope": "^3.1.2",
- "vuex": "^3.4.0",
- "vuex-cache": "^3.2.0",
+ "vuex": "^3.6.2",
+ "vuex-cache": "^3.4.0",
"vuex-persist": "^3.1.3",
"vuex-persistedstate": "^4.1.0",
"xml-beautifier": "^0.5.0"
@@ -117,76 +120,72 @@
"save-build-hash": "(git rev-parse HEAD 2>/dev/null || echo '') >../static/client_build_hash.txt",
"prettier": "prettier --write 'src/style/scss/**/*.scss' 'src/**/{*.js,*.vue}' '!src/libs/**'",
"prettier-check": "prettier --check 'src/style/scss/**/*.scss' 'src/**/{*.js,*.vue}' '!src/libs/**'",
- "styleguide": "vue-styleguidist server",
- "styleguide:build": "vue-styleguidist build",
"test": "yarn run qunit && yarn run jest",
"jest": "jest --config tests/jest/jest.config.js",
"jest-watch": "jest --config tests/jest/jest.config.js --watch",
"qunit": "karma start tests/karma/karma.config.qunit.js",
- "eslint": "eslint -c .eslintrc.js src --ext .js,.vue"
+ "eslint": "eslint -c .eslintrc.json src --ext .js,.vue"
},
"devDependencies": {
- "@babel/core": "^7.15.8",
- "@babel/helper-validator-identifier": "^7.15.7",
+ "@babel/core": "^7.17.0",
+ "@babel/eslint-parser": "^7.17.0",
+ "@babel/helper-validator-identifier": "^7.16.7",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
- "@babel/plugin-transform-runtime": "^7.15.8",
- "@babel/preset-env": "^7.15.8",
+ "@babel/plugin-transform-runtime": "^7.17.0",
+ "@babel/preset-env": "^7.16.11",
"@cerner/duplicate-package-checker-webpack-plugin": "^2.1.0",
- "@testing-library/jest-dom": "^5.14.1",
- "@vue/test-utils": "^1.2.2",
- "@vue/vue2-jest": "^27.0.0-alpha.2",
+ "@testing-library/jest-dom": "^5.16.2",
+ "@vue/test-utils": "^1.3.0",
+ "@vue/vue2-jest": "^27.0.0-alpha.4",
"amdi18n-loader": "^0.9.3",
- "autoprefixer": "^10.3.5",
+ "autoprefixer": "^10.4.2",
"axios-mock-adapter": "^1.20.0",
"babel-core": "^7.0.0-bridge.0",
- "babel-eslint": "^10.1.0",
- "babel-jest": "^27.2.5",
- "babel-loader": "^8.2.2",
+ "babel-jest": "^27.4.6",
+ "babel-loader": "^8.2.3",
"babel-plugin-transform-inline-environment-variables": "^0.4.3",
"babel-plugin-transform-vue-template": "^0.4.2",
"buffer": "^6.0.3",
- "chai": "^4.2.0",
- "chokidar": "^3.5.2",
- "css-loader": "^6.3.0",
- "css-minimizer-webpack-plugin": "^3.0.2",
+ "chai": "^4.3.6",
+ "css-loader": "^6.6.0",
+ "css-minimizer-webpack-plugin": "^3.4.1",
"del": "^6.0.0",
- "eslint": "^7.32.0",
- "eslint-plugin-vue": "^7.18.0",
- "expose-loader": "^3.0.0",
+ "eslint": "^8.8.0",
+ "eslint-plugin-vue": "^8.4.1",
+ "expose-loader": "^3.1.0",
"gulp": "^4.0.2",
"ignore-loader": "^0.1.2",
- "imports-loader": "^3.0.0",
- "jest": "^27.2.5",
+ "imports-loader": "^3.1.1",
+ "jest": "^27.4.7",
"jest-raw-loader": "^1.0.1",
- "jest-transform-yaml": "0.1.2",
+ "jest-transform-yaml": "1.0.0",
"json-loader": "^0.5.7",
- "karma": "^6.3.4",
+ "karma": "^6.3.13",
"karma-chrome-launcher": "^3.1.0",
"karma-polyfill": "^1.1.0",
- "karma-qunit": "^4.1.1",
+ "karma-qunit": "^4.1.2",
"karma-webpack": "^5.0.0",
- "mini-css-extract-plugin": "^2.4.2",
- "postcss-loader": "^6.1.1",
- "prettier": "^2.4.1",
+ "mini-css-extract-plugin": "^2.5.3",
+ "postcss-loader": "^6.2.1",
+ "prettier": "^2.5.1",
"process": "^0.11.10",
"qunit": "^2.17.2",
"raw-loader": "^4.0.2",
- "sass": "^1.42.1",
- "sass-loader": "^12.1.0",
- "sinon": "^11.1.2",
+ "sass": "^1.49.7",
+ "sass-loader": "^12.4.0",
+ "sinon": "^13.0.1",
"store": "^2.0.12",
- "style-loader": "^3.3.0",
+ "style-loader": "^3.3.1",
"uuid": "^8.3.2",
"vue-loader": "^15.9.8",
- "vue-styleguidist": "^4.41.2",
"vue-template-compiler": "^2.6.14",
- "webpack": "^5.58.0",
- "webpack-cli": "^4.9.0",
- "webpack-dev-server": "^4.2.1",
+ "webpack": "^5.68.0",
+ "webpack-cli": "^4.9.2",
+ "webpack-dev-server": "^4.7.4",
"webpack-merge": "^5.8.0",
"yaml-loader": "^0.6.0"
},
"peerDependencies": {
- "postcss": "^8.2.8"
+ "postcss": "^8.4.6"
}
}
diff --git a/client/src/components/Collections/PairedListCollectionCreator.vue b/client/src/components/Collections/PairedListCollectionCreator.vue
index 5bd7d66d3af..36238198529 100644
--- a/client/src/components/Collections/PairedListCollectionCreator.vue
+++ b/client/src/components/Collections/PairedListCollectionCreator.vue
@@ -248,13 +248,7 @@
+ class="unpaired-filter forward-unpaired-filter float-left search-input search-query input-group">