From bbb79bdcf3a4effb37fe905908d577b823081fb5 Mon Sep 17 00:00:00 2001 From: dc-bcgov <117310853+dc-bcgov@users.noreply.github.com> Date: Thu, 16 Feb 2023 12:18:59 -0800 Subject: [PATCH] Implementation of 2966 bucket configure (#36) * Adding bucket config dialog and form. Dialog and form support create a new bucket and update. Form contains required bucket fields, submit and cancel. * Removing $ - global in dialog visible and unnecessary eslint comment. * Fixing the x close dialog * Removing apply button disable support as it is not working at the moment * Adding support for color-border: red for invalid input * Removing update bucket config header and using newBucket instead for dialog * Adding yup/schema and fixing form validation before submit. Refactoring of TextInput to support validation. * Final commit - import ordering fix * Replacing asterisk yup import * Updating with new yup dependency * Adding password component to support redacted for access and secret keys. Reordering imports and removing async. * Removing space conditifion for redacted check * Removed unnecessary div for dialog * Fixed alphabetical emit ordering * Fixed @ reference recommended vs relative. * Removing isUpdate flag * Removing isUpdate flag 2 * Fixed bucketConfigTitle set via ternary operator * Removed console.log * Deleting BucketConfigForm and putting Dialog inside of BucketList. Removing the rest of the isUpdate logic. * Fixed import ordering, extra newline, replaced primeflex margins, relative path changed to an absolute, removed invalid attribute * Removed extra line --- frontend/package-lock.json | 73 ++++++++- frontend/package.json | 3 +- .../components/bucket/BucketConfigForm.vue | 148 ++++++++++++++++++ frontend/src/components/bucket/BucketList.vue | 72 ++++++++- .../src/components/bucket/BucketsTable.vue | 12 +- frontend/src/components/form/Password.vue | 39 +++++ frontend/src/components/form/TextInput.vue | 44 +++--- frontend/src/services/bucketService.ts | 21 +++ frontend/src/store/bucketStore.ts | 22 +++ frontend/src/utils/constants.ts | 5 + 10 files changed, 408 insertions(+), 31 deletions(-) create mode 100644 frontend/src/components/bucket/BucketConfigForm.vue create mode 100644 frontend/src/components/form/Password.vue diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 2c0453f3..3e0747c5 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -22,7 +22,8 @@ "primevue": "^3.21.0", "vee-validate": "^4.7.1", "vue": "^3.2.41", - "vue-router": "^4.1.5" + "vue-router": "^4.1.5", + "yup": "^1.0.0" }, "devDependencies": { "@pinia/testing": "^0.0.14", @@ -5155,6 +5156,11 @@ "asap": "~2.0.6" } }, + "node_modules/property-expr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz", + "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==" + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -5680,6 +5686,11 @@ "node": ">= 0.12" } }, + "node_modules/tiny-case": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz", + "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==" + }, "node_modules/tinybench": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.3.1.tgz", @@ -5725,6 +5736,11 @@ "node": ">=8.0" } }, + "node_modules/toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==" + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -6373,6 +6389,28 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/yup": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yup/-/yup-1.0.0.tgz", + "integrity": "sha512-bRZIyMkoe212ahGJTE32cr2dLkJw53Va+Uw5mzsBKpcef9zCGQ23k/xtpQUfGwdWPKvCIlR8CzFwchs2rm2XpQ==", + "dependencies": { + "property-expr": "^2.0.5", + "tiny-case": "^1.0.3", + "toposort": "^2.0.2", + "type-fest": "^2.19.0" + } + }, + "node_modules/yup/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } }, "dependencies": { @@ -10044,6 +10082,11 @@ "asap": "~2.0.6" } }, + "property-expr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz", + "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==" + }, "proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -10426,6 +10469,11 @@ } } }, + "tiny-case": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz", + "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==" + }, "tinybench": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.3.1.tgz", @@ -10459,6 +10507,11 @@ "is-number": "^7.0.0" } }, + "toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==" + }, "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -10884,6 +10937,24 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true + }, + "yup": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yup/-/yup-1.0.0.tgz", + "integrity": "sha512-bRZIyMkoe212ahGJTE32cr2dLkJw53Va+Uw5mzsBKpcef9zCGQ23k/xtpQUfGwdWPKvCIlR8CzFwchs2rm2XpQ==", + "requires": { + "property-expr": "^2.0.5", + "tiny-case": "^1.0.3", + "toposort": "^2.0.2", + "type-fest": "^2.19.0" + }, + "dependencies": { + "type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" + } + } } } } diff --git a/frontend/package.json b/frontend/package.json index 062e9231..fb07225b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -36,7 +36,8 @@ "primevue": "^3.21.0", "vee-validate": "^4.7.1", "vue": "^3.2.41", - "vue-router": "^4.1.5" + "vue-router": "^4.1.5", + "yup": "^1.0.0" }, "devDependencies": { "@pinia/testing": "^0.0.14", diff --git a/frontend/src/components/bucket/BucketConfigForm.vue b/frontend/src/components/bucket/BucketConfigForm.vue new file mode 100644 index 00000000..f27e9d0a --- /dev/null +++ b/frontend/src/components/bucket/BucketConfigForm.vue @@ -0,0 +1,148 @@ + + + + + diff --git a/frontend/src/components/bucket/BucketList.vue b/frontend/src/components/bucket/BucketList.vue index 578723de..d1811b1c 100644 --- a/frontend/src/components/bucket/BucketList.vue +++ b/frontend/src/components/bucket/BucketList.vue @@ -1,14 +1,24 @@ + + + + diff --git a/frontend/src/components/form/TextInput.vue b/frontend/src/components/form/TextInput.vue index 42202bb0..3d5f6a06 100644 --- a/frontend/src/components/form/TextInput.vue +++ b/frontend/src/components/form/TextInput.vue @@ -1,34 +1,30 @@ - - diff --git a/frontend/src/services/bucketService.ts b/frontend/src/services/bucketService.ts index 471bea02..741182dc 100644 --- a/frontend/src/services/bucketService.ts +++ b/frontend/src/services/bucketService.ts @@ -1,4 +1,5 @@ import { comsAxios } from './interceptors'; +import type { Bucket } from '@/interfaces'; const BUCKET_PATH = 'bucket'; @@ -12,4 +13,24 @@ export default { searchForBuckets(params?: Object) { return comsAxios().get(`${BUCKET_PATH}`, { params: params }); }, + + /** + * @function createBucket + * Creates a bucket + * @param {Bucket} data Bucket object containing the data to create bucket + * @returns {Promise} An axios response + */ + createBucket(data: Bucket) { + return comsAxios().put(`${BUCKET_PATH}`, data); + }, + + /** + * @function updateBucket + * Updates a bucket + * @param {Bucket} data Bucket object containing the data to update bucket + * @returns {Promise} An axios response + */ + updateBucket(bucketId: string, data: Bucket) { + return comsAxios().patch(`${BUCKET_PATH}/${bucketId}`, data); + } }; diff --git a/frontend/src/store/bucketStore.ts b/frontend/src/store/bucketStore.ts index 8207ea6d..f2a30455 100644 --- a/frontend/src/store/bucketStore.ts +++ b/frontend/src/store/bucketStore.ts @@ -160,6 +160,26 @@ export const useBucketStore = defineStore('bucket', () => { } } + async function createBucket(bucket: Bucket) { + try { + loading.value = true; + + return (await bucketService.createBucket(bucket)).data; + } finally { + loading.value = false; + } + } + + async function updateBucket(bucketId: string, bucket: Bucket) { + try { + loading.value = true; + + return (await bucketService.updateBucket(bucketId, bucket)).data; + } finally { + loading.value = false; + } + } + return { loading, load, @@ -169,6 +189,8 @@ export const useBucketStore = defineStore('bucket', () => { addBucketPermission, deleteBucketPermission, removeBucketUser, + createBucket, + updateBucket, buckets, permissions, selectedBucketPermissionsForUser diff --git a/frontend/src/utils/constants.ts b/frontend/src/utils/constants.ts index 5c68b8d2..f38e4095 100644 --- a/frontend/src/utils/constants.ts +++ b/frontend/src/utils/constants.ts @@ -30,3 +30,8 @@ export const RouteNames = Object.freeze({ export const ValidationMessages = Object.freeze({ Required: 'This field is required.', }); + +export const BucketConfig = Object.freeze({ + headerNewBucket: 'Configure bucket', + titleNewBucket: 'Use this form to configure a bucket to be used in BCBox for the first time.' +});