From 45ab25511fc7645fb313fc13bec473fc01e95eee Mon Sep 17 00:00:00 2001 From: Martin Weise <martin.weise@tuwien.ac.at> Date: Wed, 15 Jan 2025 09:39:46 +0100 Subject: [PATCH] WIP Signed-off-by: Martin Weise <martin.weise@tuwien.ac.at> --- dbrepo-ui/bun.lockb | Bin 381532 -> 381903 bytes dbrepo-ui/composables/database-service.ts | 5 +- dbrepo-ui/composables/table-service.ts | 2 +- dbrepo-ui/layouts/default.vue | 88 +++++++++++++++++- dbrepo-ui/nuxt.config.ts | 28 +++--- dbrepo-ui/package.json | 1 + .../pages/database/[database_id]/info.vue | 43 +-------- .../persist/[identifier_id]/index.vue | 7 +- .../database/[database_id]/persist/index.vue | 7 +- .../pages/database/[database_id]/settings.vue | 28 +----- .../[database_id]/subset/[subset_id]/data.vue | 23 +---- .../[database_id]/subset/[subset_id]/info.vue | 25 +---- .../persist/[identifier_id]/index.vue | 7 +- .../subset/[subset_id]/persist/index.vue | 8 +- .../database/[database_id]/subset/create.vue | 3 +- .../database/[database_id]/subset/index.vue | 26 ------ .../[database_id]/table/[table_id]/data.vue | 34 +------ .../[database_id]/table/[table_id]/import.vue | 35 +------ .../[database_id]/table/[table_id]/info.vue | 42 +-------- .../persist/[identifier_id]/index.vue | 35 +------ .../table/[table_id]/persist/index.vue | 35 +------ .../[database_id]/table/[table_id]/schema.vue | 33 +------ .../table/[table_id]/settings.vue | 34 +------ .../[database_id]/table/create/dataset.vue | 30 +----- .../[database_id]/table/create/schema.vue | 18 +--- .../database/[database_id]/table/index.vue | 31 ------ .../[database_id]/view/[view_id]/data.vue | 33 +------ .../[database_id]/view/[view_id]/info.vue | 40 +------- .../persist/[identifier_id]/index.vue | 35 +------ .../view/[view_id]/persist/index.vue | 35 +------ .../[database_id]/view/[view_id]/schema.vue | 33 +------ .../[database_id]/view/[view_id]/settings.vue | 33 +------ .../database/[database_id]/view/create.vue | 35 +------ .../database/[database_id]/view/index.vue | 36 +------ dbrepo-ui/pages/search.vue | 12 +-- dbrepo-ui/stores/cache.js | 62 ++++++------ dbrepo-ui/utils/index.ts | 28 ++++-- 37 files changed, 209 insertions(+), 801 deletions(-) diff --git a/dbrepo-ui/bun.lockb b/dbrepo-ui/bun.lockb index b82e45d505fdc0e1f41e246f7d1caefe3e23007c..45a8c51c621dab127458d68a4493b23d2df9f88d 100755 GIT binary patch delta 57667 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 P!bcX>?eAu==2-#&Sa?R- delta 56861 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 PtYImByFGChYn~+lhkTG@ diff --git a/dbrepo-ui/composables/database-service.ts b/dbrepo-ui/composables/database-service.ts index b96d75ab80..7956f7b4df 100644 --- a/dbrepo-ui/composables/database-service.ts +++ b/dbrepo-ui/composables/database-service.ts @@ -83,7 +83,7 @@ export const useDatabaseService = (): any => { }); } - async function findOne(id: number): Promise<DatabaseDto | null> { + async function findOne(id: number, rawError: boolean = false): Promise<DatabaseDto | null> { const axios = useAxiosInstance(); console.debug('find database with id', id); return new Promise((resolve, reject) => { @@ -94,6 +94,9 @@ export const useDatabaseService = (): any => { }) .catch((error) => { console.error('Failed to find database', error); + if (rawError) { + reject(error) + } reject(axiosErrorToApiError(error)); }); }); diff --git a/dbrepo-ui/composables/table-service.ts b/dbrepo-ui/composables/table-service.ts index 4abaebec93..ca757c7451 100644 --- a/dbrepo-ui/composables/table-service.ts +++ b/dbrepo-ui/composables/table-service.ts @@ -29,7 +29,7 @@ export const useTableService = (): any => { resolve(response.data) }) .catch((error) => { - console.error('Failed to find table') + console.error('Failed to find table', error) reject(axiosErrorToApiError(error)) }) }) diff --git a/dbrepo-ui/layouts/default.vue b/dbrepo-ui/layouts/default.vue index b7baeb7043..2311be0e05 100644 --- a/dbrepo-ui/layouts/default.vue +++ b/dbrepo-ui/layouts/default.vue @@ -150,32 +150,47 @@ <v-main> <v-container> <slot /> + <JumboBox + v-if="error" + :title="$t(errorCodeKey(error).title, { resource })" + :subtitle="$t(errorCodeKey(error).subtitle)" + :text="$t(errorCodeKey(error).text, { resource })" /> </v-container> </v-main> </v-app> </template> <script setup> -const config = useRuntimeConfig() +import { ref } from 'vue' + +const runtimeConfig = useRuntimeConfig() +const config = ref(runtimeConfig) useServerHead({ - title: config.public.title, + title: runtimeConfig.public.title, meta: [ - {'ref': 'icon', type: 'image/x-icon', href: config.public.icon}, - {'http-equiv': 'Content-Security-Policy', content: 'upgrade-insecure-requests'} + { 'ref': 'icon', type: 'image/x-icon', href: runtimeConfig.public.icon }, + { 'http-equiv': 'Content-Security-Policy', content: 'upgrade-insecure-requests' } ] }) </script> <script> +import JumboBox from '@/components/JumboBox.vue' import { useUserStore } from '@/stores/user' import { useCacheStore } from '@/stores/cache' +import { errorCodeKey, makeError } from '@/utils' export default { + components: { + JumboBox + }, data () { return { drawer: false, model: null, query: null, loading: true, + databaseError: null, + accessError: null, searchResults: [], databases: [], loadingUser: true, @@ -199,12 +214,36 @@ export default { messages () { return this.cacheStore.getMessages }, + access () { + return this.userStore.getAccess + }, table () { return this.cacheStore.getTable }, + view () { + return this.cacheStore.getView + }, + subset () { + return this.cacheStore.getSubset + }, database () { return this.cacheStore.getDatabase }, + resource () { + if (!this.$route.params.database_id) { + return null + } + if (this.$route.params.table_id) { + return 'table' + } + if (this.$route.params.view_id) { + return 'view' + } + if (this.$route.params.subset_id) { + return 'subset' + } + return 'database' + }, roles () { return this.userStore.getRoles }, @@ -220,6 +259,27 @@ export default { commitShort () { return this.$config.public.commit.substr(0, 8) }, + error () { + if (this.databaseError) { + return this.databaseError + } + if (this.accessError) { + return this.accessError + } + if (!this.user) { + return null + } + if (this.table && !this.table.is_public && !this.table.is_schema_public && !this.table.owner.id !== this.user.id) { + return makeError(403, null, null) + } + if (this.view && !this.view.is_public && !this.view.is_schema_public && !this.view.owner.id !== this.user.id) { + return makeError(403, null, null) + } + if (this.subset && !this.subset.is_public && !this.subset.is_schema_public && !this.subset.owner.id !== this.user.id) { + return makeError(403, null, null) + } + return null + }, canListOntologies () { if (!this.roles) { return false @@ -243,25 +303,42 @@ export default { watch: { '$route.params': { handler (newObj, oldObj) { - if (!newObj.database_id || import.meta.server) { + if (!newObj.database_id) { + this.databaseError = null + this.accessError = null + this.cacheStore.setTable(null) + this.cacheStore.setView(null) + this.cacheStore.setSubset(null) + return + } + if (import.meta.server) { return } /* load database and optional access */ this.cacheStore.setRouteDatabase(newObj.database_id) + .catch((error) => { + this.databaseError = error + }) if (this.user) { this.userStore.setRouteAccess(newObj.database_id) } /* load table */ if (newObj.table_id) { this.cacheStore.setRouteTable(newObj.database_id, newObj.table_id) + } else { + this.cacheStore.setTable(null) } /* load view */ if (newObj.view_id) { this.cacheStore.setRouteView(newObj.database_id, newObj.view_id) + } else { + this.cacheStore.setView(null) } /* load subset */ if (newObj.subset_id) { this.cacheStore.setRouteSubset(newObj.database_id, newObj.subset_id) + } else { + this.cacheStore.setSubset(null) } }, deep: true, @@ -280,6 +357,7 @@ export default { this.cacheStore.reloadMessages() }, methods: { + errorCodeKey, login () { const redirect = ![undefined, '/', '/login'].includes(this.$router.currentRoute.path) this.$router.push({ path: '/login', query: redirect ? { redirect: this.$router.currentRoute.path } : {} }) diff --git a/dbrepo-ui/nuxt.config.ts b/dbrepo-ui/nuxt.config.ts index b5758d06f5..4bce6ec5c5 100644 --- a/dbrepo-ui/nuxt.config.ts +++ b/dbrepo-ui/nuxt.config.ts @@ -4,18 +4,18 @@ import vuetify from 'vite-plugin-vuetify' const proxy: any = {} /* proxies the backend calls, >>NOT<< the frontend calls (clicking) */ -// if (process.env.NODE_ENV === 'development') { -// const api = 'http://localhost' -// proxy['/api'] = api -// proxy['/pid'] = { -// target: api + '/api', -// changeOrigin: true, -// pathRewrite: { -// '^/pid': '/pid' -// } -// } -// process.env.NUXT_PUBLIC_API_SERVER = api -// } +if (process.env.NODE_ENV === 'development') { + const api = 'http://localhost' + proxy['/api'] = api + proxy['/pid'] = { + target: api + '/api', + changeOrigin: true, + pathRewrite: { + '^/pid': '/pid' + } + } + process.env.NUXT_PUBLIC_API_SERVER = api +} /** * https://nuxt.com/docs/guide/concepts/rendering#hybrid-rendering @@ -75,8 +75,8 @@ export default defineNuxtConfig({ } }, api: { - client: 'https://dbrepo.arisnet.ac.at', - server: 'https://dbrepo.arisnet.ac.at', + client: 'http://localhost', + server: 'http://gateway-service', }, upload: { client: 'http://localhost/api/upload/files', diff --git a/dbrepo-ui/package.json b/dbrepo-ui/package.json index 856f56f4f0..a135477820 100644 --- a/dbrepo-ui/package.json +++ b/dbrepo-ui/package.json @@ -23,6 +23,7 @@ "buffer": "^6.0.3", "chart.js": "^4.4.1", "date-fns": "^3.3.1", + "http-status-codes": "^2.3.0", "jwt-decode": "^4.0.0", "merkle-json": "^2.6.0", "moment": "^2.30.1", diff --git a/dbrepo-ui/pages/database/[database_id]/info.vue b/dbrepo-ui/pages/database/[database_id]/info.vue index eee94047bc..02c2c8310a 100644 --- a/dbrepo-ui/pages/database/[database_id]/info.vue +++ b/dbrepo-ui/pages/database/[database_id]/info.vue @@ -161,27 +161,14 @@ :items="items" class="pa-0 mt-2" /> </div> - <JumboBox - v-if="error" - :title="$t(errorCodeKey(error).title, { resource: 'database' })" - :subtitle="$t(errorCodeKey(error).subtitle)" - :text="$t(errorCodeKey(error).text, { resource: 'database' })" /> - <pre v-if="error">{{ error }}</pre> </template> -<script setup> -import { ref } from 'vue' - -const runtimeConfig = useRuntimeConfig() -const config = ref(runtimeConfig) -</script> <script> import DatabaseToolbar from '@/components/database/DatabaseToolbar.vue' import Summary from '@/components/identifier/Summary.vue' import Select from '@/components/identifier/Select.vue' import UserBadge from '@/components/user/UserBadge.vue' -import JumboBox from '@/components/JumboBox.vue' -import { sizeToHumanLabel, errorCodeKey } from '@/utils' +import { sizeToHumanLabel } from '@/utils' import { useUserStore } from '@/stores/user' import { useCacheStore } from '@/stores/cache' @@ -190,32 +177,11 @@ export default { DatabaseToolbar, Summary, Select, - UserBadge, - JumboBox - }, - setup () { - const userStore = useUserStore() - const { database_id } = useRoute().params - const { error, data } = useFetch(`${this.config.public.api.server}/api/database/${database_id}`, { - immediate: true, - method: 'GET', - timeout: 90_000, - headers: { - Accept: 'application/json', - Authorization: userStore.getToken ? `Bearer ${this.userStore.getToken}` : null - } - }) - if (data.value) { - const identifierService = useIdentifierService() - useServerHead(identifierService.databaseToServerHead(data.value)) - useServerSeoMeta(identifierService.databaseToServerSeoMeta(data.value)) - } - return { - error - } + UserBadge }, data () { return { + error: null, items: [ { title: this.$t('navigation.databases'), @@ -375,9 +341,6 @@ export default { } return this.database } - }, - methods: { - errorCodeKey } } </script> diff --git a/dbrepo-ui/pages/database/[database_id]/persist/[identifier_id]/index.vue b/dbrepo-ui/pages/database/[database_id]/persist/[identifier_id]/index.vue index 7de1348fdc..a57b439b21 100644 --- a/dbrepo-ui/pages/database/[database_id]/persist/[identifier_id]/index.vue +++ b/dbrepo-ui/pages/database/[database_id]/persist/[identifier_id]/index.vue @@ -1,6 +1,9 @@ <template> - <div v-if="canCreateIdentifier || canUpdateIdentifier"> - <Persist type="database" :database="database" /> + <div + v-if="canCreateIdentifier || canUpdateIdentifier"> + <Persist + type="database" + :database="database" /> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> </template> diff --git a/dbrepo-ui/pages/database/[database_id]/persist/index.vue b/dbrepo-ui/pages/database/[database_id]/persist/index.vue index 0981a54790..df675d262e 100644 --- a/dbrepo-ui/pages/database/[database_id]/persist/index.vue +++ b/dbrepo-ui/pages/database/[database_id]/persist/index.vue @@ -1,6 +1,9 @@ <template> - <div v-if="canCreateIdentifier || canUpdateIdentifier"> - <Persist type="database" :database="database" /> + <div + v-if="canCreateIdentifier || canUpdateIdentifier"> + <Persist + type="database" + :database="database" /> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> </template> diff --git a/dbrepo-ui/pages/database/[database_id]/settings.vue b/dbrepo-ui/pages/database/[database_id]/settings.vue index 984df4e635..aed13a4e1e 100644 --- a/dbrepo-ui/pages/database/[database_id]/settings.vue +++ b/dbrepo-ui/pages/database/[database_id]/settings.vue @@ -242,43 +242,18 @@ </v-window> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> - <JumboBox - v-if="error" - :title="$t(errorCodeKey(error).title, { resource: 'database' })" - :subtitle="$t(errorCodeKey(error).subtitle)" - :text="$t(errorCodeKey(error).text, { resource: 'database' })" /> </template> <script> import DatabaseToolbar from '@/components/database/DatabaseToolbar.vue' import EditAccess from '@/components/dialogs/EditAccess.vue' -import JumboBox from '@/components/JumboBox.vue' import { useUserStore } from '@/stores/user' import { useCacheStore } from '@/stores/cache' -import { errorCodeKey } from '@/utils' export default { components: { DatabaseToolbar, - EditAccess, - JumboBox - }, - setup () { - const config = useRuntimeConfig() - const userStore = useUserStore() - const { database_id } = useRoute().params - const { error } = useFetch(`${config.public.api.server}/api/database/${database_id}`, { - immediate: true, - method: 'HEAD', - timeout: 90_000, - headers: { - Accept: 'application/json', - Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null - } - }) - return { - error - } + EditAccess }, data () { return { @@ -488,7 +463,6 @@ export default { this.modifyOwner.id = this.database.owner.id }, methods: { - errorCodeKey, submit () { this.$refs.form.validate() }, diff --git a/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/data.vue b/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/data.vue index 01ebb72efb..37c34a7167 100644 --- a/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/data.vue +++ b/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/data.vue @@ -53,30 +53,12 @@ import QueryResults from '@/components/subset/Results.vue' import SubsetToolbar from '@/components/subset/SubsetToolbar.vue' import { formatTimestampUTCLabel } from '@/utils' import { useCacheStore } from '@/stores/cache' -import {useUserStore} from "~/stores/user.js"; export default { components: { SubsetToolbar, QueryResults }, - setup () { - const config = useRuntimeConfig() - const userStore = useUserStore() - const { database_id, subset_id } = useRoute().params - const { error, data } = useFetch(`${config.public.api.server}/api/database/${database_id}/subset/${subset_id}`, { - immediate: true, - timeout: 90_000, - headers: { - Accept: 'application/json', - Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null - } - }) - return { - subset: data, - error - } - }, data () { return { loadingSubset: false, @@ -111,6 +93,9 @@ export default { database () { return this.cacheStore.getDatabase }, + subset () { + return this.cacheStore.getSubset + }, executionUTC () { if (!this.subset) { return null @@ -186,5 +171,3 @@ export default { } } </script> -<style> -</style> diff --git a/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/info.vue b/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/info.vue index 88add5804e..f27153bebf 100644 --- a/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/info.vue +++ b/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/info.vue @@ -102,28 +102,6 @@ export default { SubsetToolbar, UserBadge }, - setup () { - const config = useRuntimeConfig() - const userStore = useUserStore() - const { database_id, subset_id } = useRoute().params - const { error, data } = useFetch(`${config.public.api.server}/api/database/${database_id}/subset/${subset_id}`, { - immediate: true, - timeout: 90_000, - headers: { - Accept: 'application/json', - Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null - } - }) - if (data.value) { - const identifierService = useIdentifierService() - useServerHead(identifierService.subsetToServerHead(data.value)) - useServerSeoMeta(identifierService.subsetToServerSeoMeta(data.value)) - } - return { - subset: data, - error - } - }, data () { return { items: [ @@ -170,6 +148,9 @@ export default { access () { return this.userStore.getAccess }, + subset () { + return this.cacheStore.getSubset + }, user () { return this.userStore.getUser }, diff --git a/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/persist/[identifier_id]/index.vue b/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/persist/[identifier_id]/index.vue index a3b7306643..b15ecb3292 100644 --- a/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/persist/[identifier_id]/index.vue +++ b/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/persist/[identifier_id]/index.vue @@ -1,6 +1,9 @@ <template> - <div v-if="canCreateIdentifier || canUpdateIdentifier"> - <Persist type="subset" :database="database" /> + <div + v-if="canCreateIdentifier || canUpdateIdentifier"> + <Persist + type="subset" + :database="database" /> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> </template> diff --git a/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/persist/index.vue b/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/persist/index.vue index 01ba88a36c..07be66bc73 100644 --- a/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/persist/index.vue +++ b/dbrepo-ui/pages/database/[database_id]/subset/[subset_id]/persist/index.vue @@ -1,6 +1,10 @@ <template> - <div v-if="canPersistQuery"> - <Persist type="subset" :database="database" :query="query" /> + <div + v-if="canPersistQuery"> + <Persist + type="subset" + :database="database" + :query="query" /> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> </template> diff --git a/dbrepo-ui/pages/database/[database_id]/subset/create.vue b/dbrepo-ui/pages/database/[database_id]/subset/create.vue index 5202bc6336..b533dfb1a8 100644 --- a/dbrepo-ui/pages/database/[database_id]/subset/create.vue +++ b/dbrepo-ui/pages/database/[database_id]/subset/create.vue @@ -1,5 +1,6 @@ <template> - <div v-if="canCreateSubset"> + <div + v-if="canCreateSubset"> <Builder /> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> diff --git a/dbrepo-ui/pages/database/[database_id]/subset/index.vue b/dbrepo-ui/pages/database/[database_id]/subset/index.vue index 7866e6d5de..d031b3f3f6 100644 --- a/dbrepo-ui/pages/database/[database_id]/subset/index.vue +++ b/dbrepo-ui/pages/database/[database_id]/subset/index.vue @@ -5,39 +5,16 @@ <SubsetList /> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> - <JumboBox - v-if="error" - :title="$t(errorCodeKey(error).title, { resource: 'subset' })" - :subtitle="$t(errorCodeKey(error).subtitle)" - :text="$t(errorCodeKey(error).text, { resource: 'subset' })" /> </template> <script> import SubsetList from '@/components/subset/SubsetList.vue' -import { errorCodeKey } from '@/utils' import { useCacheStore } from '@/stores/cache' export default { components: { SubsetList }, - setup () { - const config = useRuntimeConfig() - const userStore = useUserStore() - const { database_id } = useRoute().params - const { error } = useFetch(`${config.public.api.server}/api/database/${database_id}`, { - immediate: true, - method: 'HEAD', - timeout: 90_000, - headers: { - Accept: 'application/json', - Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null - } - }) - return { - error - } - }, data () { return { items: [ @@ -68,9 +45,6 @@ export default { } return this.database } - }, - methods: { - errorCodeKey } } </script> diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/data.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/data.vue index 10c1bc8ccf..46e7f564a7 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/data.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/data.vue @@ -102,30 +102,18 @@ </v-dialog> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> - <JumboBox - v-if="error" - :title="$t(errorCodeKey(error).title, { resource: 'table' })" - :subtitle="$t(errorCodeKey(error).subtitle)" - :text="$t(errorCodeKey(error).text, { resource: 'table' })" /> </template> -<script setup> -import { ref } from 'vue' - -const runtimeConfig = useRuntimeConfig() -const config = ref(runtimeConfig) -</script> <script> import TableHistory from '@/components/table/TableHistory.vue' import TimeDrift from '@/components/TimeDrift.vue' import TableToolbar from '@/components/table/TableToolbar.vue' -import { errorCodeKey, formatTimestamp } from '@/utils' +import { formatTimestamp } from '@/utils' import { useUserStore } from '@/stores/user' import { useCacheStore } from '@/stores/cache' import EditTuple from '@/components/dialogs/EditTuple.vue' import BlobDownload from '@/components/table/BlobDownload.vue' import QueryResults from '@/components/subset/Results.vue' -import JumboBox from '@/components/JumboBox.vue' export default { components: { @@ -134,24 +122,7 @@ export default { EditTuple, TableHistory, TableToolbar, - TimeDrift, - JumboBox - }, - setup () { - const userStore = useUserStore() - const { database_id, table_id } = useRoute().params - const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}/table/${table_id}`, { - immediate: true, - method: 'HEAD', - timeout: 90_000, - headers: { - Accept: 'application/json', - Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null - } - }) - return { - error - } + TimeDrift }, data () { return { @@ -325,7 +296,6 @@ export default { this.reload() }, methods: { - errorCodeKey, addTuple () { this.tuple = {} this.columns.forEach((c) => { diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/import.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/import.vue index 0e51854700..9da3e1c9fd 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/import.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/import.vue @@ -26,46 +26,16 @@ </v-card> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> - <JumboBox - v-if="error" - :title="$t(errorCodeKey(error).title, { resource: 'table' })" - :subtitle="$t(errorCodeKey(error).subtitle)" - :text="$t(errorCodeKey(error).text, { resource: 'table' })" /> </template> -<script setup> -import { ref } from 'vue' - -const runtimeConfig = useRuntimeConfig() -const config = ref(runtimeConfig) -</script> <script> import TableImport from '@/components/table/TableImport.vue' -import JumboBox from '@/components/JumboBox.vue' import { useUserStore } from '@/stores/user' import { useCacheStore } from '@/stores/cache' -import { errorCodeKey } from '@/utils' export default { components: { - TableImport, - JumboBox - }, - setup () { - const userStore = useUserStore() - const { database_id, table_id } = useRoute().params - const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}/table/${table_id}`, { - immediate: true, - method: 'HEAD', - timeout: 90_000, - headers: { - Accept: 'application/json', - Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null - } - }) - return { - error - } + TableImport }, data () { return { @@ -125,9 +95,6 @@ export default { } return this.roles.includes('insert-table-data') } - }, - methods: { - errorCodeKey } } </script> diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue index 5171d1861a..8108e0677e 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue @@ -116,57 +116,22 @@ </v-card> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> - <JumboBox - v-if="error" - :title="$t(errorCodeKey(error).title, { resource: 'table' })" - :subtitle="$t(errorCodeKey(error).subtitle)" - :text="$t(errorCodeKey(error).text, { resource: 'table' })" /> </template> -<script setup> -import { ref } from 'vue' - -const runtimeConfig = useRuntimeConfig() -const config = ref(runtimeConfig) -</script> <script> import TableToolbar from '@/components/table/TableToolbar.vue' -import JumboBox from '@/components/JumboBox.vue' import Select from '@/components/identifier/Select.vue' import Summary from '@/components/identifier/Summary.vue' import UserBadge from '@/components/user/UserBadge.vue' import { useUserStore } from '@/stores/user' import { useCacheStore } from '@/stores/cache' -import { errorCodeKey } from '@/utils' export default { components: { Summary, Select, TableToolbar, - UserBadge, - JumboBox - }, - setup () { - const userStore = useUserStore() - const { database_id, table_id } = useRoute().params - const { error, data } = useFetch(`${this.config.public.api.server}/api/database/${database_id}/table/${table_id}`, { - immediate: true, - method: 'GET', - timeout: 90_000, - headers: { - Accept: 'application/json', - Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null - } - }) - if (data.value) { - const identifierService = useIdentifierService() - useServerHead(identifierService.databaseToServerHead(data.value)) - useServerSeoMeta(identifierService.databaseToServerSeoMeta(data.value)) - } - return { - error - } + UserBadge }, data () { return { @@ -319,9 +284,6 @@ export default { return this.$t('pages.table.connection.permissions.read') } } - }, - methods: { - errorCodeKey - }, + } } </script> diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/persist/[identifier_id]/index.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/persist/[identifier_id]/index.vue index d0b72a436e..d444ca4e62 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/persist/[identifier_id]/index.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/persist/[identifier_id]/index.vue @@ -4,46 +4,16 @@ <Persist type="table" :database="database" /> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> - <JumboBox - v-if="error" - :title="$t(errorCodeKey(error).title, { resource: 'identifier' })" - :subtitle="$t(errorCodeKey(error).subtitle)" - :text="$t(errorCodeKey(error).text, { resource: 'identifier' })" /> </template> -<script setup> -import { ref } from 'vue' - -const runtimeConfig = useRuntimeConfig() -const config = ref(runtimeConfig) -</script> <script> import Persist from '@/components/identifier/Persist.vue' -import JumboBox from '@/components/JumboBox.vue' import { useUserStore } from '@/stores/user' import { useCacheStore } from '@/stores/cache' -import { errorCodeKey } from '@/utils' export default { components: { - Persist, - JumboBox - }, - setup () { - const userStore = useUserStore() - const { database_id, table_id } = useRoute().params - const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}/table/${table_id}`, { - immediate: true, - method: 'HEAD', - timeout: 90_000, - headers: { - Accept: 'application/json', - Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null - } - }) - return { - error - } + Persist }, data () { return { @@ -104,9 +74,6 @@ export default { } return this.roles.includes('modify-identifier-metadata') } - }, - methods: { - errorCodeKey } } </script> diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/persist/index.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/persist/index.vue index f807001353..af5b613df9 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/persist/index.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/persist/index.vue @@ -9,46 +9,16 @@ :items="items" class="pa-0 mt-2" /> </div> - <JumboBox - v-if="error" - :title="$t(errorCodeKey(error).title, { resource: 'identifier' })" - :subtitle="$t(errorCodeKey(error).subtitle)" - :text="$t(errorCodeKey(error).text, { resource: 'identifier' })" /> </template> -<script setup> -import { ref } from 'vue' - -const runtimeConfig = useRuntimeConfig() -const config = ref(runtimeConfig) -</script> <script> import Persist from '@/components/identifier/Persist.vue' -import JumboBox from '@/components/JumboBox.vue' import { useUserStore } from '@/stores/user' import { useCacheStore } from '@/stores/cache' -import { errorCodeKey } from '@/utils' export default { components: { - Persist, - JumboBox - }, - setup () { - const userStore = useUserStore() - const { database_id, table_id } = useRoute().params - const { error, data } = useFetch(`${this.config.public.api.server}/api/database/${database_id}/table/${table_id}`, { - immediate: true, - method: 'HEAD', - timeout: 90_000, - headers: { - Accept: 'application/json', - Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null - } - }) - return { - error - } + Persist }, data () { return { @@ -102,9 +72,6 @@ export default { const userService = useUserService() return userService.hasReadAccess(this.access) } - }, - methods: { - errorCodeKey } } </script> diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/schema.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/schema.vue index 320ebe3d75..0c92401672 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/schema.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/schema.vue @@ -118,46 +118,16 @@ :items="items" class="pa-0 mt-2" /> </div> - <JumboBox - v-if="error" - :title="$t(errorCodeKey(error).title, { resource: 'table' })" - :subtitle="$t(errorCodeKey(error).subtitle)" - :text="$t(errorCodeKey(error).text, { resource: 'table' })" /> </template> -<script setup> -import { ref } from 'vue' - -const runtimeConfig = useRuntimeConfig() -const config = ref(runtimeConfig) -</script> <script> import TableToolbar from '@/components/table/TableToolbar.vue' -import JumboBox from '@/components/JumboBox.vue' import { useUserStore } from '@/stores/user' import { useCacheStore } from '@/stores/cache' -import { errorCodeKey } from '@/utils' export default { components: { - TableToolbar, - JumboBox - }, - setup () { - const userStore = useUserStore() - const { database_id, table_id } = useRoute().params - const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}/table/${table_id}`, { - immediate: true, - method: 'HEAD', - timeout: 90_000, - headers: { - Accept: 'application/json', - Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null - } - }) - return { - error - } + TableToolbar }, data () { return { @@ -268,7 +238,6 @@ export default { } }, methods: { - errorCodeKey, extra (column) { if (column.type === 'float') { return `precision=${column.size}` diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/settings.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/settings.vue index f51851b220..201917c5c0 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/settings.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/settings.vue @@ -112,46 +112,17 @@ :items="items" class="pa-0 mt-2" /> </div> - <JumboBox - v-if="error" - :title="$t(errorCodeKey(error).title, { resource: 'table' })" - :subtitle="$t(errorCodeKey(error).subtitle)" - :text="$t(errorCodeKey(error).text, { resource: 'table' })" /> </template> -<script setup> -import { ref } from 'vue' - -const runtimeConfig = useRuntimeConfig() -const config = ref(runtimeConfig) -</script> <script> -import JumboBox from '@/components/JumboBox.vue' import TableToolbar from '@/components/table/TableToolbar.vue' import { useUserStore } from '@/stores/user' import { useCacheStore } from '@/stores/cache' -import { errorCodeKey, max } from '@/utils' +import { max } from '@/utils' export default { components: { - TableToolbar, - JumboBox - }, - setup () { - const userStore = useUserStore() - const { database_id, table_id } = useRoute().params - const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}/table/${table_id}`, { - immediate: true, - method: 'HEAD', - timeout: 90_000, - headers: { - Accept: 'application/json', - Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null - } - }) - return { - error - } + TableToolbar }, data () { return { @@ -283,7 +254,6 @@ export default { }, methods: { max, - errorCodeKey, submit () { this.$refs.form.validate() }, diff --git a/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue b/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue index 2d1729d7cd..b031c846ea 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue @@ -217,22 +217,11 @@ </v-form> <v-breadcrumbs :items="items" class="pa-0 mt-2"/> </div> - <JumboBox - v-if="error" - :title="$t(errorCodeKey(error).title, { resource: 'table' })" - :subtitle="$t(errorCodeKey(error).subtitle)" - :text="$t(errorCodeKey(error).text, { resource: 'table' })" /> </template> -<script setup> -import { ref } from 'vue' - -const runtimeConfig = useRuntimeConfig() -const config = ref(runtimeConfig) -</script> <script> import TableSchema from '@/components/table/TableSchema.vue' -import { notEmpty, errorCodeKey } from '@/utils' +import { notEmpty } from '@/utils' import { useUserStore } from '@/stores/user' import { useCacheStore } from '@/stores/cache' @@ -240,22 +229,6 @@ export default { components: { TableSchema }, - setup () { - const userStore = useUserStore() - const { database_id } = useRoute().params - const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}`, { - immediate: true, - method: 'HEAD', - timeout: 90_000, - headers: { - Accept: 'application/json', - Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null - } - }) - return { - error - } - }, data() { return { step: 1, @@ -392,7 +365,6 @@ export default { }, methods: { notEmpty, - errorCodeKey, submit() { this.$refs.form.validate() }, diff --git a/dbrepo-ui/pages/database/[database_id]/table/create/schema.vue b/dbrepo-ui/pages/database/[database_id]/table/create/schema.vue index 946b084ba8..5f433013bf 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/create/schema.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/create/schema.vue @@ -183,30 +183,17 @@ </v-card> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> - <JumboBox - v-if="error" - :title="$t(errorCodeKey(error).title, { resource: 'table' })" - :subtitle="$t(errorCodeKey(error).subtitle)" - :text="$t(errorCodeKey(error).text, { resource: 'table' })" /> </template> -<script setup> -import { ref } from 'vue' - -const runtimeConfig = useRuntimeConfig() -const config = ref(runtimeConfig) -</script> <script> import TableSchema from '@/components/table/TableSchema.vue' -import JumboBox from '@/components/JumboBox.vue' -import { notEmpty, errorCodeKey } from '@/utils' +import { notEmpty } from '@/utils' import { useUserStore } from '@/stores/user' import { useCacheStore } from '@/stores/cache' export default { components: { - TableSchema, - JumboBox + TableSchema }, data () { return { @@ -320,7 +307,6 @@ export default { }, methods: { notEmpty, - errorCodeKey, submit () { this.$refs.form.validate() }, diff --git a/dbrepo-ui/pages/database/[database_id]/table/index.vue b/dbrepo-ui/pages/database/[database_id]/table/index.vue index 6511f963c6..2f1cf87ec8 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/index.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/index.vue @@ -10,24 +10,12 @@ :items="items" class="pa-0 mt-2" /> </div> - <JumboBox - v-if="error" - :title="$t(errorCodeKey(error).title, { resource: 'table' })" - :subtitle="$t(errorCodeKey(error).subtitle)" - :text="$t(errorCodeKey(error).text, { resource: 'table' })" /> </template> -<script setup> -import { ref } from 'vue' - -const runtimeConfig = useRuntimeConfig() -const config = ref(runtimeConfig) -</script> <script> import TableList from '@/components/table/TableList.vue' import DatabaseToolbar from '@/components/database/DatabaseToolbar.vue' import { useCacheStore } from '@/stores/cache' -import { errorCodeKey } from '@/utils' export default { name: 'Tables', @@ -35,22 +23,6 @@ export default { TableList, DatabaseToolbar }, - setup () { - const userStore = useUserStore() - const { database_id } = useRoute().params - const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}`, { - immediate: true, - method: 'HEAD', - timeout: 90_000, - headers: { - Accept: 'application/json', - Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null - } - }) - return { - error - } - }, data () { return { tab: 0, @@ -82,9 +54,6 @@ export default { } return this.database } - }, - methods: { - errorCodeKey } } </script> diff --git a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/data.vue b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/data.vue index 3f0ebc1844..f4c81f43f0 100644 --- a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/data.vue +++ b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/data.vue @@ -32,47 +32,17 @@ </v-card> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> - <JumboBox - v-if="error" - :title="$t(errorCodeKey(error).title, { resource: 'view' })" - :subtitle="$t(errorCodeKey(error).subtitle)" - :text="$t(errorCodeKey(error).text, { resource: 'view' })" /> </template> -<script setup> -import { ref } from 'vue' - -const runtimeConfig = useRuntimeConfig() -const config = ref(runtimeConfig) -</script> <script> import TimeDrift from '@/components/TimeDrift.vue' -import JumboBox from '@/components/JumboBox.vue' import QueryResults from '@/components/subset/Results.vue' import { useUserStore } from '@/stores/user' -import { errorCodeKey } from '@/utils' export default { components: { QueryResults, - TimeDrift, - JumboBox - }, - setup () { - const userStore = useUserStore() - const { database_id, view_id } = useRoute().params - const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}/view/${view_id}`, { - immediate: true, - method: 'HEAD', - timeout: 90_000, - headers: { - Accept: 'application/json', - Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null - } - }) - return { - error - } + TimeDrift }, data () { return { @@ -143,7 +113,6 @@ export default { this.reload() }, methods: { - errorCodeKey, reload () { this.$refs.queryResults.reExecute(Number(this.$route.params.view_id)) this.$refs.queryResults.reExecuteCount(Number(this.$route.params.view_id)) diff --git a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/info.vue b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/info.vue index 61bdb4c379..43bfb2b390 100644 --- a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/info.vue +++ b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/info.vue @@ -57,26 +57,14 @@ </v-window> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> - <JumboBox - v-if="error" - :title="$t(errorCodeKey(error).title, { resource: 'view' })" - :subtitle="$t(errorCodeKey(error).subtitle)" - :text="$t(errorCodeKey(error).text, { resource: 'view' })" /> </template> -<script setup> -import { ref } from 'vue' - -const runtimeConfig = useRuntimeConfig() -const config = ref(runtimeConfig) -</script> <script> import ViewToolbar from '@/components/view/ViewToolbar.vue' import Summary from '@/components/identifier/Summary.vue' import Select from '@/components/identifier/Select.vue' import UserBadge from '@/components/user/UserBadge.vue' -import JumboBox from '@/components/JumboBox.vue' -import { formatTimestampUTCLabel, errorCodeKey } from '@/utils' +import { formatTimestampUTCLabel } from '@/utils' import { useUserStore } from '@/stores/user' import { useCacheStore } from '@/stores/cache' @@ -85,30 +73,7 @@ export default { Select, Summary, ViewToolbar, - UserBadge, - JumboBox - }, - setup () { - const userStore = useUserStore() - const { database_id, view_id } = useRoute().params - const { error, data } = useFetch(`${this.config.public.api.server}/api/database/${database_id}/view/${view_id}`, { - immediate: true, - method: 'GET', - timeout: 90_000, - headers: { - Accept: 'application/json', - Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null - } - }) - if (data.value) { - const identifierService = useIdentifierService() - useServerHead(identifierService.viewToServerHead(data.value)) - useServerSeoMeta(identifierService.viewToServerSeoMeta(data.value)) - } - return { - view: data, - error - } + UserBadge }, data () { return { @@ -221,7 +186,6 @@ export default { } }, methods: { - errorCodeKey, formatUTC (timestamp) { return formatTimestampUTCLabel(timestamp) } diff --git a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/persist/[identifier_id]/index.vue b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/persist/[identifier_id]/index.vue index 11b0f60c00..86db06f196 100644 --- a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/persist/[identifier_id]/index.vue +++ b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/persist/[identifier_id]/index.vue @@ -6,46 +6,16 @@ :database="database" /> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> - <JumboBox - v-if="error" - :title="$t(errorCodeKey(error).title, { resource: 'view' })" - :subtitle="$t(errorCodeKey(error).subtitle)" - :text="$t(errorCodeKey(error).text, { resource: 'view' })" /> </template> -<script setup> -import { ref } from 'vue' - -const runtimeConfig = useRuntimeConfig() -const config = ref(runtimeConfig) -</script> <script> import Persist from '@/components/identifier/Persist.vue' -import JumboBox from '@/components/JumboBox.vue' import { useUserStore } from '@/stores/user' import { useCacheStore } from '@/stores/cache' -import { errorCodeKey } from '@/utils' export default { components: { - Persist, - JumboBox - }, - setup () { - const userStore = useUserStore() - const { database_id, view_id } = useRoute().params - const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}/view/${view_id}`, { - immediate: true, - method: 'HEAD', - timeout: 90_000, - headers: { - Accept: 'application/json', - Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null - } - }) - return { - error - } + Persist }, data () { return { @@ -106,9 +76,6 @@ export default { } return this.roles.includes('modify-identifier-metadata') } - }, - methods: { - errorCodeKey } } </script> diff --git a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/persist/index.vue b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/persist/index.vue index 3a2f0f793f..f3a3e18f9d 100644 --- a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/persist/index.vue +++ b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/persist/index.vue @@ -7,46 +7,16 @@ :view="view" /> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> - <JumboBox - v-if="error" - :title="$t(errorCodeKey(error).title, { resource: 'view' })" - :subtitle="$t(errorCodeKey(error).subtitle)" - :text="$t(errorCodeKey(error).text, { resource: 'view' })" /> </template> -<script setup> -import { ref } from 'vue' - -const runtimeConfig = useRuntimeConfig() -const config = ref(runtimeConfig) -</script> <script> import Persist from '@/components/identifier/Persist.vue' -import JumboBox from '@/components/JumboBox.vue' import { useUserStore } from '@/stores/user' import { useCacheStore } from '@/stores/cache' -import { errorCodeKey } from '@/utils' export default { components: { - Persist, - JumboBox - }, - setup () { - const userStore = useUserStore() - const { database_id, view_id } = useRoute().params - const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}/view/${view_id}`, { - immediate: true, - method: 'HEAD', - timeout: 90_000, - headers: { - Accept: 'application/json', - Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null - } - }) - return { - error - } + Persist }, data () { return { @@ -102,9 +72,6 @@ export default { const userService = useUserService() return userService.hasReadAccess(this.access) } - }, - methods: { - errorCodeKey } } </script> diff --git a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/schema.vue b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/schema.vue index e8a8435d88..e126e19d90 100644 --- a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/schema.vue +++ b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/schema.vue @@ -49,46 +49,16 @@ :items="items" class="pa-0 mt-2" /> </div> - <JumboBox - v-if="error" - :title="$t(errorCodeKey(error).title, { resource: 'view' })" - :subtitle="$t(errorCodeKey(error).subtitle)" - :text="$t(errorCodeKey(error).text, { resource: 'view' })" /> </template> -<script setup> -import { ref } from 'vue' - -const runtimeConfig = useRuntimeConfig() -const config = ref(runtimeConfig) -</script> <script> import TableToolbar from '@/components/table/TableToolbar.vue' -import JumboBox from '@/components/JumboBox.vue' import { useUserStore } from '@/stores/user' import { useCacheStore } from '@/stores/cache' -import { errorCodeKey } from '@/utils' export default { components: { - TableToolbar, - JumboBox - }, - setup () { - const userStore = useUserStore() - const { database_id, view_id } = useRoute().params - const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}/view/${view_id}`, { - immediate: true, - method: 'HEAD', - timeout: 90_000, - headers: { - Accept: 'application/json', - Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null - } - }) - return { - error - } + TableToolbar }, data () { return { @@ -173,7 +143,6 @@ export default { } }, methods: { - errorCodeKey, extra (column) { if (column.type === 'float') { return `precision=${column.size}` diff --git a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/settings.vue b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/settings.vue index 8a65a34f27..27444c9e89 100644 --- a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/settings.vue +++ b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/settings.vue @@ -88,46 +88,16 @@ :items="items" class="pa-0 mt-2" /> </div> - <JumboBox - v-if="error" - :title="$t(errorCodeKey(error).title, { resource: 'view' })" - :subtitle="$t(errorCodeKey(error).subtitle)" - :text="$t(errorCodeKey(error).text, { resource: 'view' })" /> </template> -<script setup> -import { ref } from 'vue' - -const runtimeConfig = useRuntimeConfig() -const config = ref(runtimeConfig) -</script> <script> import ViewToolbar from '@/components/view/ViewToolbar.vue' -import JumboBox from '@/components/JumboBox.vue' import { useUserStore } from '@/stores/user' import { useCacheStore } from '@/stores/cache' -import { errorCodeKey } from '@/utils' export default { components: { - ViewToolbar, - JumboBox - }, - setup () { - const userStore = useUserStore() - const { database_id } = useRoute().params - const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}`, { - immediate: true, - method: 'HEAD', - timeout: 90_000, - headers: { - Accept: 'application/json', - Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null - } - }) - return { - error - } + ViewToolbar }, data () { return { @@ -252,7 +222,6 @@ export default { this.modify.description = this.view.description }, methods: { - errorCodeKey, submit () { this.$refs.form.validate() }, diff --git a/dbrepo-ui/pages/database/[database_id]/view/create.vue b/dbrepo-ui/pages/database/[database_id]/view/create.vue index d1202980ec..060d186252 100644 --- a/dbrepo-ui/pages/database/[database_id]/view/create.vue +++ b/dbrepo-ui/pages/database/[database_id]/view/create.vue @@ -4,45 +4,15 @@ <Builder mode="view" /> <v-breadcrumbs :items="items" class="pa-0 mt-2" /> </div> - <JumboBox - v-if="error" - :title="$t(errorCodeKey(error).title, { resource: 'view' })" - :subtitle="$t(errorCodeKey(error).subtitle)" - :text="$t(errorCodeKey(error).text, { resource: 'view' })" /> </template> -<script setup> -import { ref } from 'vue' - -const runtimeConfig = useRuntimeConfig() -const config = ref(runtimeConfig) -</script> <script> import Builder from '@/components/subset/Builder.vue' -import JumboBox from '@/components/JumboBox.vue' import { useUserStore } from '@/stores/user' -import { errorCodeKey } from '@/utils' export default { components: { - Builder, - JumboBox - }, - setup () { - const userStore = useUserStore() - const { database_id } = useRoute().params - const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}`, { - immediate: true, - method: 'HEAD', - timeout: 90_000, - headers: { - Accept: 'application/json', - Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null - } - }) - return { - error - } + Builder }, data () { return { @@ -81,9 +51,6 @@ export default { } return this.roles.includes('create-database-view') } - }, - methods: { - errorCodeKey } } </script> diff --git a/dbrepo-ui/pages/database/[database_id]/view/index.vue b/dbrepo-ui/pages/database/[database_id]/view/index.vue index ab244bbe8a..4172797328 100644 --- a/dbrepo-ui/pages/database/[database_id]/view/index.vue +++ b/dbrepo-ui/pages/database/[database_id]/view/index.vue @@ -10,49 +10,18 @@ :items="items" class="pa-0 mt-2" /> </div> - <JumboBox - v-if="error" - :title="$t(errorCodeKey(error).title, { resource: 'view' })" - :subtitle="$t(errorCodeKey(error).subtitle)" - :text="$t(errorCodeKey(error).text, { resource: 'view' })" /> </template> -<script setup> -import { ref } from 'vue' - -const runtimeConfig = useRuntimeConfig() -const config = ref(runtimeConfig) -</script> <script> import DatabaseToolbar from '@/components/database/DatabaseToolbar.vue' -import JumboBox from '@/components/JumboBox.vue' import ViewList from '@/components/view/ViewList.vue' import { useCacheStore } from '@/stores/cache' -import { errorCodeKey } from '@/utils' export default { name: 'Views', components: { ViewList, - DatabaseToolbar, - JumboBox - }, - setup () { - const config = useRuntimeConfig() - const userStore = useUserStore() - const { database_id } = useRoute().params - const { error } = useFetch(`${this.config.public.api.server}/api/database/${database_id}`, { - immediate: true, - method: 'HEAD', - timeout: 90_000, - headers: { - Accept: 'application/json', - Authorization: userStore.getToken ? `Bearer ${userStore.getToken}` : null - } - }) - return { - error - } + DatabaseToolbar }, data () { return { @@ -85,9 +54,6 @@ export default { } return this.database } - }, - methods: { - errorCodeKey } } </script> diff --git a/dbrepo-ui/pages/search.vue b/dbrepo-ui/pages/search.vue index d822643204..b13a0f0fc2 100644 --- a/dbrepo-ui/pages/search.vue +++ b/dbrepo-ui/pages/search.vue @@ -52,6 +52,8 @@ <div v-if="tags(result).length > 0" class="mt-2 db-tags"> + <ResourceStatus + :resource="result" /> <v-chip v-for="(tag, i) in tags(result)" :key="i" @@ -196,12 +198,6 @@ export default { } return this.type === 'identifier' }, - isPublic (item) { - if (this.isDatabase(item) || this.isTable(item) || this.isColumn(item) || this.isView(item) || this.isIdentifier(item)) { - return item.is_public - } - return null - }, title (item) { if (this.isDatabase(item) || this.isTable(item) || this.isColumn(item) || this.isView(item)) { return item.name @@ -260,10 +256,6 @@ export default { }, tags (item) { const tags = [] - if (this.isPublic(item) === true || this.isPublic(item) === false) { - const text = this.isPublic(item) ? this.$t('toolbars.database.public') : this.$t('toolbars.database.private') - tags.push({ color: this.isPublic(item) ? 'success' : null, text }) - } if (this.isDatabase(item)) { } else if (this.isTable(item)) { } else if (this.isColumn(item)) { diff --git a/dbrepo-ui/stores/cache.js b/dbrepo-ui/stores/cache.js index 13fcea5861..3574b24d7c 100644 --- a/dbrepo-ui/stores/cache.js +++ b/dbrepo-ui/stores/cache.js @@ -23,25 +23,25 @@ export const useCacheStore = defineStore('cache', { getUploadProgress: (state) => state.uploadProgress, }, actions: { - setDatabase (database) { + setDatabase(database) { this.database = database }, - setTable (table) { + setTable(table) { this.table = table }, - setView (view) { + setView(view) { this.view = view }, - setSubset (subset) { + setSubset(subset) { this.subset = subset }, - setOntologies (ontologies) { + setOntologies(ontologies) { this.ontologies = ontologies }, - setUploadProgress (uploadProgress) { + setUploadProgress(uploadProgress) { this.uploadProgress = uploadProgress }, - reloadMessages () { + reloadMessages() { const messageService = useMessageService() messageService.findAll('active') .then(messages => this.messages = messages) @@ -49,7 +49,7 @@ export const useCacheStore = defineStore('cache', { console.error('Failed to reload messages', error) }) }, - reloadOntologies () { + reloadOntologies() { const ontologyService = useOntologyService() ontologyService.findAll() .then(ontologies => this.ontologies = ontologies) @@ -57,7 +57,7 @@ export const useCacheStore = defineStore('cache', { console.error('Failed to reload ontologies', error) }) }, - reloadDatabase () { + reloadDatabase() { const databaseService = useDatabaseService() databaseService.findOne(this.database.id) .then(database => this.database = database) @@ -65,7 +65,7 @@ export const useCacheStore = defineStore('cache', { console.error('Failed to reload database', error) }) }, - reloadTable () { + reloadTable() { const tableService = useTableService() tableService.findOne(this.table.database_id, this.table.id) .then(table => this.table = table) @@ -73,7 +73,7 @@ export const useCacheStore = defineStore('cache', { console.error('Failed to reload table', error) }) }, - reloadView () { + reloadView() { const viewService = useViewService() viewService.findOne(this.table.database_id, this.view.id) .then(view => this.view = view) @@ -82,19 +82,24 @@ export const useCacheStore = defineStore('cache', { }) }, setRouteDatabase (databaseId) { - if (!databaseId) { - this.database = null - return - } - const databaseService = useDatabaseService() - databaseService.findOne(databaseId) - .then(database => this.database = database) - .catch((error) => { + return new Promise((resolve, reject) => { + if (!databaseId) { this.database = null - console.error('Failed to set route database', error) - }) + reject() + } + const databaseService = useDatabaseService() + databaseService.findOne(databaseId, true) + .then((database) => { + this.database = database + resolve(database) + }) + .catch((error) => { + this.database = null + reject(error) + }) + }) }, - setRouteTable (databaseId, tableId) { + setRouteTable(databaseId, tableId) { if (!databaseId || !tableId) { this.table = null console.error('Cannot set route table: missing database id', databaseId, 'or table id', tableId) @@ -103,11 +108,8 @@ export const useCacheStore = defineStore('cache', { const tableService = useTableService() tableService.findOne(databaseId, tableId) .then(table => this.table = table) - .catch((error) => { - console.error('Failed to set route table', error) - }) }, - setRouteView (databaseId, viewId) { + setRouteView(databaseId, viewId) { if (!databaseId || !viewId) { this.view = null console.error('Cannot set route view: database view id', databaseId, 'or view id', viewId) @@ -116,11 +118,8 @@ export const useCacheStore = defineStore('cache', { const viewService = useViewService() viewService.findOne(databaseId, viewId) .then(view => this.view = view) - .catch((error) => { - console.error('Failed to set route view', error) - }) }, - setRouteSubset (databaseId, subsetId) { + setRouteSubset(databaseId, subsetId) { if (!databaseId || !subsetId) { this.subset = null console.error('Cannot set route subset: missing database id', databaseId, 'or subset id', subsetId) @@ -129,9 +128,6 @@ export const useCacheStore = defineStore('cache', { const subsetService = useQueryService() subsetService.findOne(databaseId, subsetId) .then(subset => this.subset = subset) - .catch((error) => { - console.error('Failed to set route subset', error) - }) } }, }) diff --git a/dbrepo-ui/utils/index.ts b/dbrepo-ui/utils/index.ts index 46a5e9e555..694a9258e9 100644 --- a/dbrepo-ui/utils/index.ts +++ b/dbrepo-ui/utils/index.ts @@ -1,7 +1,7 @@ -import {format} from 'date-fns' import moment from 'moment' -import type {AxiosError} from 'axios' -import type {H3Error} from "h3"; +import {AxiosError, type AxiosResponse, type InternalAxiosRequestConfig} from 'axios' +import { format } from 'date-fns' +import { getStatusText } from 'http-status-codes' export function notEmpty(str: string) { @@ -25,24 +25,36 @@ export function notFile(files: [File[]]) { return files.length === 1 } -export function errorCodeKey(error: H3Error): any { - switch (error.statusCode) { +export function makeError(status: number, code: string | null, message: string | null ): AxiosError { + const config: InternalAxiosRequestConfig = {} + const response: AxiosResponse = { + data: {}, + status, + statusText: getStatusText(status).toUpperCase(), + config, + headers: {} + } + return new AxiosError(message, code, undefined, null, response) +} + +export function errorCodeKey(error: AxiosError): any { + switch (error?.response?.status) { case 404: return { title: 'error.missing.title', - subtitle: 'ERR_NOT_FOUND', + subtitle: 'ERR_' + error?.response?.data?.status, text: 'error.missing.text' } case 403: return { title: 'error.permission.title', - subtitle: 'ERR_NOT_AUTHORIZED', + subtitle: 'ERR_' + error?.response?.data?.status, text: 'error.permission.text' } default: return { title: 'error.gone.title', - subtitle: 'ERR_GONE', + subtitle: 'ERR_' + error?.response?.data?.status, text: 'error.gone.text' } } -- GitLab