From a52f7c710aa23be9ff48d755a6c549f76683178e Mon Sep 17 00:00:00 2001 From: timparsons Date: Mon, 23 Oct 2023 11:37:58 -0400 Subject: [PATCH 01/12] [BI-1910] Creating views for importing and viewing sample submissions --- package-lock.json | 346 ++++- package.json | 3 +- src/assets/scss/main.scss | 81 +- src/components/layouts/UserSideBarLayout.vue | 9 + src/router/index.ts | 32 + src/views/import/ImportFile.vue | 5 + src/views/import/ImportSample.vue | 206 +++ src/views/sample-mgmt/SampleManagement.vue | 143 ++ src/views/sample-mgmt/SubmissionDetails.vue | 1332 ++++++++++++++++++ 9 files changed, 2124 insertions(+), 33 deletions(-) create mode 100644 src/views/import/ImportSample.vue create mode 100644 src/views/sample-mgmt/SampleManagement.vue create mode 100644 src/views/sample-mgmt/SubmissionDetails.vue diff --git a/package-lock.json b/package-lock.json index 23ff488e5..229be9d95 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { "name": "bi-web", - "version": "v0.8.0+469", + "version": "v0.9.0+607", "lockfileVersion": 2, "requires": true, "packages": { "": { - "version": "v0.8.0+469", + "version": "v0.9.0+607", "hasInstallScript": true, "dependencies": { "@casl/ability": "~4.0.0", @@ -26,7 +26,7 @@ "title-case": "^3.0.3", "uuid": "^8.3.2", "valid-url": "^1.0.9", - "vue": "^2.6.10", + "vue": "^2.7.14", "vue-breakpoint-component": "^1.2.6", "vue-class-component": "^7.0.2", "vue-click-outside": "^1.1.0", @@ -41,7 +41,8 @@ "vuelidate": "^0.7.5", "vuelidate-property-decorators": "^1.0.28", "vuex": "^3.1.2", - "vuex-class": "^0.3.2" + "vuex-class": "^0.3.2", + "xlsx": "^0.18.5" }, "devDependencies": { "@creativebulma/bulma-divider": "^1.1.0", @@ -82,7 +83,7 @@ "shelljs": "^0.8.3", "typescript": "~3.5.3", "vue-cli-plugin-axios": "0.0.4", - "vue-template-compiler": "^2.6.10" + "vue-template-compiler": "^2.7.14" } }, "node_modules/@ant-design-vue/babel-helper-vue-transform-on": { @@ -481,10 +482,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.11.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", - "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==", - "dev": true, + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -3752,6 +3752,43 @@ "node": ">=6" } }, + "node_modules/@vue/compiler-sfc": { + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz", + "integrity": "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==", + "dependencies": { + "@babel/parser": "^7.18.4", + "postcss": "^8.4.14", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/@vue/component-compiler-utils": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.0.tgz", @@ -4103,6 +4140,14 @@ "node": ">= 0.12.0" } }, + "node_modules/adler-32": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", + "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/agent-base": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", @@ -6300,6 +6345,18 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, + "node_modules/cfb": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz", + "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", + "dependencies": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/chai": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", @@ -6840,6 +6897,14 @@ "node": ">=0.10.0" } }, + "node_modules/codepage": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -7408,6 +7473,17 @@ "node": ">=8" } }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/create-ecdh": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", @@ -7818,6 +7894,11 @@ "cssom": "0.3.x" } }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, "node_modules/currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -11137,6 +11218,14 @@ "node": ">= 0.6" } }, + "node_modules/frac": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -16327,6 +16416,23 @@ "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", "dev": true }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -17788,6 +17894,11 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, "node_modules/picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", @@ -20622,7 +20733,14 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "engines": { "node": ">=0.10.0" } @@ -20752,6 +20870,17 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "node_modules/ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "dependencies": { + "frac": "~1.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -22373,9 +22502,13 @@ "dev": true }, "node_modules/vue": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.11.tgz", - "integrity": "sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ==" + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.14.tgz", + "integrity": "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==", + "dependencies": { + "@vue/compiler-sfc": "2.7.14", + "csstype": "^3.1.0" + } }, "node_modules/vue-breakpoint-component": { "version": "1.2.6", @@ -22688,13 +22821,13 @@ "dev": true }, "node_modules/vue-template-compiler": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.11.tgz", - "integrity": "sha512-KIq15bvQDrcCjpGjrAhx4mUlyyHfdmTaoNfeoATHLAiWB+MU3cx4lOzMwrnUh9cCxy0Lt1T11hAFY6TQgroUAA==", + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", + "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", "dev": true, "dependencies": { "de-indent": "^1.0.2", - "he": "^1.1.0" + "he": "^1.2.0" } }, "node_modules/vue-template-es2015-compiler": { @@ -22712,6 +22845,11 @@ "vue": "2.6.11" } }, + "node_modules/vuejs-logger/node_modules/vue": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.11.tgz", + "integrity": "sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ==" + }, "node_modules/vuelidate": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/vuelidate/-/vuelidate-0.7.5.tgz", @@ -23897,6 +24035,22 @@ "string-width": "^1.0.2 || 2" } }, + "node_modules/wmf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/word": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -24029,6 +24183,26 @@ "async-limiter": "~1.0.0" } }, + "node_modules/xlsx": { + "version": "0.18.5", + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz", + "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", + "dependencies": { + "adler-32": "~1.3.0", + "cfb": "~1.2.1", + "codepage": "~1.15.0", + "crc-32": "~1.2.1", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + }, + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", @@ -24676,10 +24850,9 @@ } }, "@babel/parser": { - "version": "7.11.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", - "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==", - "dev": true + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==" }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.10.5", @@ -27406,6 +27579,28 @@ } } }, + "@vue/compiler-sfc": { + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz", + "integrity": "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==", + "requires": { + "@babel/parser": "^7.18.4", + "postcss": "^8.4.14", + "source-map": "^0.6.1" + }, + "dependencies": { + "postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + } + } + }, "@vue/component-compiler-utils": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.0.tgz", @@ -27730,6 +27925,11 @@ "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", "dev": true }, + "adler-32": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", + "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==" + }, "agent-base": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", @@ -29652,6 +29852,15 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, + "cfb": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz", + "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", + "requires": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0" + } + }, "chai": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", @@ -30079,6 +30288,11 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, + "codepage": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==" + }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -30557,6 +30771,11 @@ "yaml": "^1.7.2" } }, + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" + }, "create-ecdh": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", @@ -30898,6 +31117,11 @@ "cssom": "0.3.x" } }, + "csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -33658,6 +33882,11 @@ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", "dev": true }, + "frac": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==" + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -37824,6 +38053,11 @@ "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", "dev": true }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -38991,6 +39225,11 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, "picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", @@ -41357,8 +41596,12 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" }, "source-map-resolve": { "version": "0.5.3", @@ -41476,6 +41719,14 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "requires": { + "frac": "~1.1.2" + } + }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -42781,9 +43032,13 @@ "dev": true }, "vue": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.11.tgz", - "integrity": "sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ==" + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.14.tgz", + "integrity": "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==", + "requires": { + "@vue/compiler-sfc": "2.7.14", + "csstype": "^3.1.0" + } }, "vue-breakpoint-component": { "version": "1.2.6", @@ -43042,13 +43297,13 @@ } }, "vue-template-compiler": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.11.tgz", - "integrity": "sha512-KIq15bvQDrcCjpGjrAhx4mUlyyHfdmTaoNfeoATHLAiWB+MU3cx4lOzMwrnUh9cCxy0Lt1T11hAFY6TQgroUAA==", + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", + "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", "dev": true, "requires": { "de-indent": "^1.0.2", - "he": "^1.1.0" + "he": "^1.2.0" } }, "vue-template-es2015-compiler": { @@ -43064,6 +43319,13 @@ "requires": { "es6-object-assign": "1.1.0", "vue": "2.6.11" + }, + "dependencies": { + "vue": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.11.tgz", + "integrity": "sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ==" + } } }, "vuelidate": { @@ -44050,6 +44312,16 @@ "string-width": "^1.0.2 || 2" } }, + "wmf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==" + }, + "word": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==" + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -44165,6 +44437,20 @@ "async-limiter": "~1.0.0" } }, + "xlsx": { + "version": "0.18.5", + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz", + "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", + "requires": { + "adler-32": "~1.3.0", + "cfb": "~1.2.1", + "codepage": "~1.15.0", + "crc-32": "~1.2.1", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + } + }, "xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", diff --git a/package.json b/package.json index a656c1cfd..123b22473 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,8 @@ "vuelidate": "^0.7.5", "vuelidate-property-decorators": "^1.0.28", "vuex": "^3.1.2", - "vuex-class": "^0.3.2" + "vuex-class": "^0.3.2", + "xlsx": "^0.18.5" }, "devDependencies": { "@creativebulma/bulma-divider": "^1.1.0", diff --git a/src/assets/scss/main.scss b/src/assets/scss/main.scss index 26c9e7b8e..b5a89d17e 100644 --- a/src/assets/scss/main.scss +++ b/src/assets/scss/main.scss @@ -284,6 +284,45 @@ nav.tabs li.is-active { } } +.b-tabs { + &.is-vertical { + .tabs { + ul { + border-right: 1px $turquoise solid; + } + &.is-boxed { + li a { + border: 1px solid transparent !important; + margin-right: -1px; + } + + li:not(.is-active) a { + &:hover { + border-right-color: $turquoise !important; + } + } + } + } + li.is-active { + border-top: 1px $turquoise solid; + border-left: 2px $turquoise solid; + border-bottom: 1px $turquoise solid; + + a { + background-color: white; + border-color: $turquoise; + border-right-color: transparent !important; + &:hover { + border-right-color: transparent !important; + } + } + } + li a { + //border + } + } +} + .expandable-card { .is-button-transparent { background: transparent; @@ -912,6 +951,21 @@ tr:nth-child(odd) td.db-filled { white-space: -pre-wrap; white-space: -o-pre-wrap; } + + .field-book-info { + .columns { + margin-bottom: 0; + + .column { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + + &.is-two-thirds { + @extend .is-align-self-flex-end; + } + } + } + } } label.environment-option-label { @@ -925,13 +979,36 @@ label.environment-option-label { 'gray') to preserve some difference in row color when a table is striped. */ - background-color: black; - opacity: 17%; + background-color: rgba(0,0,0,.17); } #data_set th { min-width: 5em; } +.submission-details { + .plate-row-header { + background-color: $primary-light; + font-weight: bold; + } + .plate-column-header { + background-color: $primary-light; + } + .blank-well { + background-color: rgba(0,0,0,.17); + color: $black; + } +} +.sample-tooltip { + .tooltip-content { + //width: auto!important; + //display: flex; + } + .tooltip-trigger { + &:hover { + cursor: pointer; + } + } +} diff --git a/src/components/layouts/UserSideBarLayout.vue b/src/components/layouts/UserSideBarLayout.vue index c8716ced3..5c0610105 100644 --- a/src/components/layouts/UserSideBarLayout.vue +++ b/src/components/layouts/UserSideBarLayout.vue @@ -120,6 +120,14 @@ Import Data +
  • + + Sample Management + +
  • + + + + + + diff --git a/src/views/sample-mgmt/SampleManagement.vue b/src/views/sample-mgmt/SampleManagement.vue new file mode 100644 index 000000000..a92488e9e --- /dev/null +++ b/src/views/sample-mgmt/SampleManagement.vue @@ -0,0 +1,143 @@ + + + + + \ No newline at end of file diff --git a/src/views/sample-mgmt/SubmissionDetails.vue b/src/views/sample-mgmt/SubmissionDetails.vue new file mode 100644 index 000000000..e34eadfb2 --- /dev/null +++ b/src/views/sample-mgmt/SubmissionDetails.vue @@ -0,0 +1,1332 @@ + + + + \ No newline at end of file From 43108d5e4d9819f51379cecb5551c5df85f61a62 Mon Sep 17 00:00:00 2001 From: timparsons Date: Thu, 26 Oct 2023 15:29:51 -0400 Subject: [PATCH 02/12] [BI-1910] updating sample management interfaces to be dynamic and interactive Able to interact with the DeltaBreed backend to fetch data. Able to submit submission via BrAPI. Able to manual update a submission's status. --- src/assets/scss/main.scss | 62 +- .../dao/SampleSubmissionDAO.ts | 98 + .../model/SampleSubmission.ts | 74 + .../service/SampleSubmissionService.ts | 84 + src/components/forms/DataForm.vue | 15 +- src/components/forms/EditDataForm.vue | 2 +- src/components/forms/EditDataRowForm.vue | 2 +- src/components/forms/NewDataForm.vue | 2 +- src/components/germplasm/GermplasmLink.vue | 16 +- src/components/modals/BaseModal.vue | 26 +- src/components/modals/GenericModal.vue | 5 - src/config/AppAbility.ts | 4 +- src/config/ability.ts | 1 + src/views/import/ImportSample.vue | 39 +- src/views/program/ProgramConfiguration.vue | 100 +- src/views/sample-mgmt/SampleManagement.vue | 84 +- src/views/sample-mgmt/SubmissionDetails.vue | 1680 +++++------------ 17 files changed, 1034 insertions(+), 1260 deletions(-) create mode 100644 src/breeding-insight/dao/SampleSubmissionDAO.ts create mode 100644 src/breeding-insight/model/SampleSubmission.ts create mode 100644 src/breeding-insight/service/SampleSubmissionService.ts diff --git a/src/assets/scss/main.scss b/src/assets/scss/main.scss index b5a89d17e..6e1a3e669 100644 --- a/src/assets/scss/main.scss +++ b/src/assets/scss/main.scss @@ -136,6 +136,10 @@ main ul { } } +.list-no-style { + list-style-type: none; +} + nav.pagination { align-items: normal; justify-content: flex-start; @@ -265,11 +269,21 @@ img { } } -// Added to override message background colors for modals only -.modal-card-body .message.is-info, -.modal-card-body .message.is-danger, -.modal-card-body message.is-success { - background-color: white; +.modal { + .modal-background { + backdrop-filter: blur(5px); + } + + // Added to override message background colors for modals only + .modal-card-body { + .message.is-info, .message.is-danger, message.is-success { + background-color: white; + } + } + + .modal-card-foot { + justify-content: center; + } } // Added to support new account creation process @@ -289,6 +303,7 @@ nav.tabs li.is-active { .tabs { ul { border-right: 1px $turquoise solid; + margin-left: 0px; } &.is-boxed { li a { @@ -547,10 +562,6 @@ table tr.is-edited + .detail { margin-bottom: 7em; } -.modal-background { - backdrop-filter: blur(5px); -} - .program-selection-level { .level-item:not(:last-child) { margin-right:0.5em !important; @@ -825,10 +836,20 @@ th.activesort.sortcolumn, th.sortcolumn:hover { } // Some css to only overlay on tbody for tables instead of entire table like b-table -div.b-table.loading-active tbody { - opacity: 0.25; - z-index: 1; - pointer-events: none; +div.b-table { + .loading-active tbody { + opacity: 0.25; + z-index: 1; + pointer-events: none; + } + .th-wrap { + .icon { + margin-left: 0!important; + } + .multi-sort-cancel-icon { + margin-left:3px; + } + } } .loading-overlay { &, .loading-background { @@ -987,6 +1008,9 @@ label.environment-option-label { } .submission-details { + .loading-indicator { + min-height: 200px; + } .plate-row-header { background-color: $primary-light; font-weight: bold; @@ -1000,15 +1024,5 @@ label.environment-option-label { } } -.sample-tooltip { - .tooltip-content { - //width: auto!important; - //display: flex; - } - .tooltip-trigger { - &:hover { - cursor: pointer; - } - } -} + diff --git a/src/breeding-insight/dao/SampleSubmissionDAO.ts b/src/breeding-insight/dao/SampleSubmissionDAO.ts new file mode 100644 index 000000000..373aeff34 --- /dev/null +++ b/src/breeding-insight/dao/SampleSubmissionDAO.ts @@ -0,0 +1,98 @@ +/* + * See the NOTICE file distributed with this work for additional information + * regarding copyright ownership. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as api from '@/util/api'; +import { BiResponse, Response } from '@/breeding-insight/model/BiResponse'; +import { BreedingMethod } from '@/breeding-insight/model/BreedingMethod'; +import {Result, ResultGenerator} from "@/breeding-insight/model/Result"; +import {SampleSubmission} from "@/breeding-insight/model/SampleSubmission"; +import {VendorOrderSubmission} from "@/breeding-insight/brapi/model/geno/vendorOrderSubmission"; +import {BrAPIDAOUtil} from "@/breeding-insight/dao/BrAPIDAOUtil"; + +export class SampleSubmissionDAO { + + static async getProgramSampleSubmissions(programId: string) { + const {data} = await api.call({ + url: `${process.env.VUE_APP_BI_API_V1_PATH}/programs/${programId}/submissions`, + method: 'get', + }) as Response; + + return new BiResponse(data); + } + + static async getSubmissionById(programId: string, submissionId: string, fetchDetails: boolean): Promise> { + const config: any = {}; + config.url = `${process.env.VUE_APP_BI_API_V1_PATH}/programs/${programId}/submissions/${submissionId}`; + config.method = 'get'; + config.programId = programId; + config.submissionId = submissionId; + config.params = {'details': fetchDetails}; + try { + const res = await api.call(config) as Response; + let { result } = res.data; + return ResultGenerator.success(result); + } catch (error) { + return ResultGenerator.err(error); + } + } + + static async submitToDArT(programId: string, submissionId: string): Promise> { + const config: any = {}; + config.url = `${process.env.VUE_APP_BI_API_V1_PATH}/programs/${programId}/submissions/${submissionId}/submit?vendor=dart`; + config.method = 'post'; + config.programId = programId; + config.submissionId = submissionId; + try { + const res = await api.call(config) as Response; + let { result } = res.data; + return ResultGenerator.success(result); + } catch (error) { + return ResultGenerator.err(error); + } + } + + static async checkVendorStatus(programId: string, submissionId: string): Promise> { + const config: any = {}; + config.url = `${process.env.VUE_APP_BI_API_V1_PATH}/programs/${programId}/submissions/${submissionId}/status`; + config.method = 'get'; + config.programId = programId; + config.submissionId = submissionId; + try { + const res = await api.call(config) as Response; + let { result } = res.data; + return ResultGenerator.success(result); + } catch (error) { + return ResultGenerator.err(error); + } + } + + static async updateSubmissionStatus(programId: string, submissionId: string, status: string): Promise> { + const config: any = {}; + config.url = `${process.env.VUE_APP_BI_API_V1_PATH}/programs/${programId}/submissions/${submissionId}/status`; + config.method = 'put'; + config.programId = programId; + config.submissionId = submissionId; + config.data = {'status': status}; + try { + const res = await api.call(config) as Response; + let { result } = res.data; + return ResultGenerator.success(result); + } catch (error) { + return ResultGenerator.err(error); + } + } +} diff --git a/src/breeding-insight/model/SampleSubmission.ts b/src/breeding-insight/model/SampleSubmission.ts new file mode 100644 index 000000000..a13a1fa5a --- /dev/null +++ b/src/breeding-insight/model/SampleSubmission.ts @@ -0,0 +1,74 @@ +/* + * See the NOTICE file distributed with this work for additional information + * regarding copyright ownership. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {User} from "@/breeding-insight/model/User"; +import {Plate} from "@/breeding-insight/brapi/model/geno/plate"; +import {Sample} from "@/breeding-insight/brapi/model/geno/sample"; +import {ShipmentForm} from "@/breeding-insight/brapi/model/geno/shipmentForm"; + +export class SampleSubmission { + id?: string; + name?: string; + submitted?: boolean; + submittedDate?: string; + vendorOrderId?: string; + vendorStatus?: string; + vendorStatusLastCheck?: string; + shipmentForms?: Array; + programId?: string; + createdAt?: string; + updatedAt?: string; + createdByUser?: User; + updatedByUser?: User; + submittedByUser?: User; + plates?: Array; + samples?: Array; + + constructor({ + id, + name, + submitted, + submittedDate, + vendorOrderId, + vendorStatus, + vendorStatusLastCheck, + shipmentForms, + programId, + createdAt, + updatedAt, + createdByUser, + updatedByUser, + plates, + samples + }: SampleSubmission) { + this.id = id; + this.name = name; + this.submitted = submitted; + this.submittedDate = submittedDate; + this.vendorOrderId = vendorOrderId; + this.vendorStatus = vendorStatus; + this.vendorStatusLastCheck = vendorStatusLastCheck; + this.shipmentForms = shipmentForms; + this.programId = programId; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + this.createdByUser = createdByUser; + this.updatedByUser = updatedByUser; + this.plates = plates; + this.samples = samples; + } +} \ No newline at end of file diff --git a/src/breeding-insight/service/SampleSubmissionService.ts b/src/breeding-insight/service/SampleSubmissionService.ts new file mode 100644 index 000000000..abf8d08f5 --- /dev/null +++ b/src/breeding-insight/service/SampleSubmissionService.ts @@ -0,0 +1,84 @@ +/* + * See the NOTICE file distributed with this work for additional information + * regarding copyright ownership. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { BiResponse } from '@/breeding-insight/model/BiResponse'; +import {SampleSubmission} from "@/breeding-insight/model/SampleSubmission"; +import {SampleSubmissionDAO} from "@/breeding-insight/dao/SampleSubmissionDAO"; +import {Result, ResultGenerator} from "@/breeding-insight/model/Result"; +import {VendorOrderSubmission} from "@/breeding-insight/brapi/model/geno/vendorOrderSubmission"; + +export class SampleSubmissionService { + private static getSampleSubmissionUnknown: string = 'An unknown error occurred while retrieving sample submissions'; + + static async getProgramSampleSubmissions(programId: string): Promise { + if (!programId) { + throw 'Program ID not provided'; + } + + try { + const response: BiResponse = await SampleSubmissionDAO.getProgramSampleSubmissions(programId); + const data: any = response.result.data; + if(data) { + return data.map((response: SampleSubmission) => new SampleSubmission(response)); + } else { + return []; + } + } catch (e) { + if (e.response && e.response.statusText) { + e.errorMessage = e.response.statusText; + } else { + e.errorMessage = this.getSampleSubmissionUnknown; + } + throw e; + } + } + + static async getSubmission(programId: string, submissionId: string): Promise> { + if (!programId) { + return ResultGenerator.err(new Error('Missing or invalid program id')); + } + return await SampleSubmissionDAO.getSubmissionById(programId, submissionId, false); + } + + static async getSubmissionDetails(programId: string, submissionId: string): Promise> { + if (!programId) { + return ResultGenerator.err(new Error('Missing or invalid program id')); + } + return await SampleSubmissionDAO.getSubmissionById(programId, submissionId, true); + } + + static async submitToDArT(programId: string, submissionId: string): Promise> { + if (!programId) { + return ResultGenerator.err(new Error('Missing or invalid program id')); + } + return await SampleSubmissionDAO.submitToDArT(programId, submissionId); + } + + static async checkVendorStatus(programId: string, submissionId: string): Promise> { + if (!programId) { + return ResultGenerator.err(new Error('Missing or invalid program id')); + } + return await SampleSubmissionDAO.checkVendorStatus(programId, submissionId); + } + + static async updateSubmissionStatus(programId: string, submissionId: string, status: string): Promise> { + if (!programId) { + return ResultGenerator.err(new Error('Missing or invalid program id')); + } + return await SampleSubmissionDAO.updateSubmissionStatus(programId, submissionId, status); + } +} \ No newline at end of file diff --git a/src/components/forms/DataForm.vue b/src/components/forms/DataForm.vue index 7531159a3..4d951ea8e 100644 --- a/src/components/forms/DataForm.vue +++ b/src/components/forms/DataForm.vue @@ -59,6 +59,8 @@ import { components: { CheckCircleIcon } }) export default class DataForm extends Vue { + @Prop() + record!:Object; @Prop() rowValidations!: Object; @Prop() @@ -70,11 +72,16 @@ export default class DataForm extends Vue { @Prop({default: true}) showCancelButton?: boolean - protected record!: Object; - protected formClass!: string; + protected formRecord!: Object; + protected formClass?: string; private timeout!: number; + created() { + this.formClass = 'data-form'; + this.formRecord = this.record; + } + @Validations() validations () { if (this.rowValidations) { @@ -128,6 +135,10 @@ export default class DataForm extends Vue { this.$store.commit( DEACTIVATE_ALL_NOTIFICATIONS ); } + protected setFormClass(formClass: string) { + this.formClass = formClass; + } + } diff --git a/src/components/forms/EditDataForm.vue b/src/components/forms/EditDataForm.vue index b4e402d18..49563ed7d 100644 --- a/src/components/forms/EditDataForm.vue +++ b/src/components/forms/EditDataForm.vue @@ -26,7 +26,7 @@ export default class EditDataForm extends DataForm { created () { super.formClass = 'edit-form'; - super.record = this.editRecord; + super.formRecord = this.editRecord; } } diff --git a/src/components/forms/EditDataRowForm.vue b/src/components/forms/EditDataRowForm.vue index 0e480ed35..7580aa7e4 100644 --- a/src/components/forms/EditDataRowForm.vue +++ b/src/components/forms/EditDataRowForm.vue @@ -26,7 +26,7 @@ export default class EditDataRowForm extends DataForm { created () { super.formClass = 'edit-form'; - super.record = this.editRecord; + super.formRecord = this.editRecord; } } diff --git a/src/components/forms/NewDataForm.vue b/src/components/forms/NewDataForm.vue index 78f94e412..aa42f6fa5 100644 --- a/src/components/forms/NewDataForm.vue +++ b/src/components/forms/NewDataForm.vue @@ -26,7 +26,7 @@ export default class NewDataForm extends DataForm { created () { super.formClass = 'new-form'; - super.record = this.newRecord; + super.formRecord = this.newRecord; } } diff --git a/src/components/germplasm/GermplasmLink.vue b/src/components/germplasm/GermplasmLink.vue index a2ad619ed..b05f5e73d 100644 --- a/src/components/germplasm/GermplasmLink.vue +++ b/src/components/germplasm/GermplasmLink.vue @@ -19,15 +19,16 @@ {{ this.germplasmGID }} -
    + {{ this.germplasmGID }} -
    + \ No newline at end of file diff --git a/src/components/modals/GenericModal.vue b/src/components/modals/GenericModal.vue index d15e92472..75a2824e5 100644 --- a/src/components/modals/GenericModal.vue +++ b/src/components/modals/GenericModal.vue @@ -21,9 +21,6 @@ v-on:deactivate="$emit('deactivate')" v-bind="$attrs" > -

    - {{msgTitle}} -