From ccb63b0599f3c8c49e4e731236978da10c91ed34 Mon Sep 17 00:00:00 2001 From: Martin Weise <martin.weise@tuwien.ac.at> Date: Sun, 13 Apr 2025 14:21:20 +0200 Subject: [PATCH] Updated the filter to display unstarred subsets Signed-off-by: Martin Weise <martin.weise@tuwien.ac.at> --- .../target/create-event-listener.jar | Bin 10139 -> 10144 bytes .../components/database/DatabaseToolbar.vue | 2 +- dbrepo-ui/components/subset/Builder.vue | 2 +- dbrepo-ui/components/subset/SubsetList.vue | 54 +++++++++++++++++- dbrepo-ui/components/table/TableSchema.vue | 7 ++- dbrepo-ui/components/table/TableToolbar.vue | 5 +- dbrepo-ui/composables/database-service.ts | 2 +- .../[database_id]/table/[table_id]/import.vue | 13 +++-- .../[database_id]/table/create/dataset.vue | 3 +- helm/dbrepo/files/create-event-listener.jar | Bin 10139 -> 10144 bytes 10 files changed, 76 insertions(+), 12 deletions(-) diff --git a/dbrepo-auth-service/listeners/target/create-event-listener.jar b/dbrepo-auth-service/listeners/target/create-event-listener.jar index e6ee56c50203b9ba4e75d7964141c3c353ff933d..7e717c5aada04fa7e157ec8dd9f04333955cf816 100644 GIT binary patch delta 1017 zcmbR3zrbHOz?+#xgn@yBgJDy4Z<Mq4`|`4h!ix32`HvL@_C|lIf56YMaqf+^`M%#a z^j=y!rS8sggL?~ZSTt?i{PVl2-|MW!S=-qY668M1<ySCdXMH&mf3foN%}J_BV(!}Q z4l90s3faUiabc77^0G9C<3@(|%G35{n#8}ht+!ghb-l~N%6*v`mqy5=^KDW(GuO$; zS@GGv-QjL7QQvy~M5nc^cf9)AcQGfgojz9`Hur{@>2FRE_wR2P9u(94JO4e`FY$#D zH531<JwII*yh--r!RbMA{qBib`YY_EwlGa$m~`wKpUuv=!1otUciTw1AADh>lP!_( z=y&5(Mr+x+5|xPGFMjT1R&5S@{<-i!_pJ|idN=-^UugfZSg`6u{pOba$@4=_htJ)* zBI8W;)oJ^Ad!0`iy#M93V%^kgo0ZF&|B7@>n3DB}Tc&-1rOh1kW5Q7-(+@?<oM{bP zZXBD^z2wBJEjt=Z=B=9j#B6=hREJq2TI<uVCQW<z^j>$i-Q3^P**y6Iw;gmYnIGk* z=y+lGw1gCyy^Ns9;9_9lU|<2o#^eo*D$E<RdnaFK)Meh3-8-3`Ne)bFFsXv+046Ok zUCU$wrnfM8fz>lIp9RwwnY%&an{#>RFo7BIEZm%629H3EAc!%!TX7bc)=-+v2~Pl% zk0@D!L?<arGp?8{qb#AYF}pX40SO4f*#Zo29nUjPe!wg;IYXHz2V@3Zj)8%J8O{MI z{Lje1kXWK0;LXS+!VLB($e$=CbD?NZU;=9>DJ{=T%|q8W`GK-DqsQbw%8*czRgq>a zo!p=zqm9peeH8Q8Om0xI1BcZ?6=|lQOp^tewI*|@@_;?;^P6Rr9s>h|4g&*&6I>eu z!;;36%#$B5yG*W7<pBlL<kPCsOyMk(Yj{m2%c$`vfWm<LpWvTc91INW1Q-~^Q1pId zo1DiYF?kPEueO>r6N|v)8ea9u`DzA?3nwp7a|N5Qd)<R1kgXtWi(*2v;^c*DrjySr kazTBH$iKoKA?K1A7#KD(Ffa(CXi}J*udc?nMF}Jb03ZNb5dZ)H delta 955 zcmZ4BKigkAz?+#xgn@yBgP}9KJIXUk-K>z2f#D1j1B1xq`%2>Vy+H?q4jBmSEnoJ3 zg1iS)6Kj>QjRvz7^P}3?IjYXHjZSVmabLP?+Qh;u&Xat<rQSb%Tj$^`8QYKHCHF$i zQfn`EFP`bFaHXco=cbU<mN(~CuFbr#u~A~4z~x&av(A6*TmOB<p{;>3bCo7bvx;ba z6nAD_=9A9%U9^4HwmXZndk)oSryQ@nJZ+y}RP4?vXO~a?u4BDPH0v9Kh<pFjeFube z|DG*p{p+TYSAXLF<l@ayOLDxod|x@G{jlSVJKU@I+14_sHZ0k=li7b=ScvtPPdfg` z0u8J<Ps>QX`0>urIAQnU^?fYa^KI=*6;cCUrQCQoe*w?=Sc&NU+kf-T@3`P>_oDu@ z|C^|(HDQt6UAOjxr~XP?Asf_I8J+GFy7bP&KvB^*yBu1UguIP^aD(OS!-sne=3Q81 zEgqMcd~S<Z^1aIwG^VN>_)H3vKhA9X&M|*Z>PeQ+b?(iaedoTLt=nPoeKwmXU*NQZ z&L!fyYbPkY2=+EG>a$}2MF|%J0|x^`XEtN^<gJV<%pKX?lkYI<f@vNmIWVouq{`fx z-90&!NefIjF`0nrolIU}c{b*=VEP(!H;CTM%+AdTW~8vpVFEJ*1!@GrS|%vY0@J!m zlR4qZVDd>NOL-8F0SR!z*#Zo29T!hlRF(i4HQ7d4n(@@+2xUbuuSQu~>=z>gLt=@3 zfHxzP2s6YxAYZIimbR2;0!x*YmS?8sp{PK&jvvK3=gEvJati2bBvI59FioDwBs)1q zg$wMXOciOS<sc#H$-5NAbRe#Qr1y^O?x;WW+MK!=7#Kb<FfeGq&0%0z()fjGvM96G zWL{Msu#aR^r5TS*wonZO^WLaRGX=3s=2U~kOpmHGQv&Z~1p)QR7gQy|Dh$-5nf~)n zRuIsgT&1SPG)H#wL?)0Eq$b~1;|II!t(r7bog!3NWwNI_4>+)eJwnbUGcYi0WME(r RMsbn!<Pvo?w)ILNK>%1wN0|Ts diff --git a/dbrepo-ui/components/database/DatabaseToolbar.vue b/dbrepo-ui/components/database/DatabaseToolbar.vue index 09d40abf8e..028cf4c3e9 100644 --- a/dbrepo-ui/components/database/DatabaseToolbar.vue +++ b/dbrepo-ui/components/database/DatabaseToolbar.vue @@ -66,7 +66,7 @@ :text="$t('toolbars.database.views.tab')" :to="`/database/${$route.params.database_id}/view`" /> <v-tab - v-if="database && database.is_public" + v-if="hasReadAccess" :text="$t('toolbars.database.subsets.tab')" :to="`/database/${$route.params.database_id}/subset`" /> <v-tab diff --git a/dbrepo-ui/components/subset/Builder.vue b/dbrepo-ui/components/subset/Builder.vue index 4e4fe21eec..24e91eec87 100644 --- a/dbrepo-ui/components/subset/Builder.vue +++ b/dbrepo-ui/components/subset/Builder.vue @@ -590,7 +590,7 @@ export default { return } const tid = this.$route.query.tid - const selection = this.tables.filter(t => t.id === tid) + const selection = this.datasources.filter(t => t.id === tid) if (selection.length === 0) { console.warn('Failed to find table with id', tid) return diff --git a/dbrepo-ui/components/subset/SubsetList.vue b/dbrepo-ui/components/subset/SubsetList.vue index df0948372e..8c5efe1022 100644 --- a/dbrepo-ui/components/subset/SubsetList.vue +++ b/dbrepo-ui/components/subset/SubsetList.vue @@ -1,5 +1,17 @@ <template> <div> + <v-toolbar + class="pr-2" + color="secondary" + flat> + <v-spacer /> + <v-btn + :variant="buttonVariant" + :prepend-icon="filterIcon" + @click="switchFilter"> + {{ filterText }} + </v-btn> + </v-toolbar> <v-card v-if="!loadingSubsets && subsets.length === 0" variant="flat" @@ -14,6 +26,7 @@ <Loading /> </v-list-item> <div + v-if="!loadingSubsets" v-for="(subset, i) in subsets" :key="`q-${i}`"> <v-divider v-if="i !== 0" class="mx-4" /> @@ -45,6 +58,7 @@ export default { loadingSubsets: false, loadingIdentifiers: false, subsets: [], + filter: null, cacheStore: useCacheStore() } }, @@ -58,8 +72,35 @@ export default { isDarkTheme () { return this.$vuetify.theme.global.name.toLowerCase().startsWith('dark') }, + buttonVariant () { + const runtimeConfig = useRuntimeConfig() + return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.button.contrast : runtimeConfig.public.variant.button.normal + }, colorVariant () { return this.isContrastTheme ? '' : (this.isDarkTheme ? 'tertiary' : 'secondary') + }, + filterIcon () { + if (this.filter === true) { + return 'mdi-star' + } + if (this.filter === false) { + return 'mdi-star-off' + } + return 'mdi-star-outline' + }, + filterText () { + if (this.filter === true) { + return 'Starred' + } + if (this.filter === false) { + return 'Not Starred' + } + return 'All' + } + }, + watch: { + filter () { + this.loadQueries() } }, mounted () { @@ -69,7 +110,7 @@ export default { loadQueries () { this.loadingSubsets = true const queryService = useQueryService() - queryService.findAll(this.$route.params.database_id, true) + queryService.findAll(this.$route.params.database_id, this.filter) .then((subsets) => { this.loadingSubsets = false this.subsets = subsets.map(subset => { @@ -87,6 +128,17 @@ export default { toast.error(this.$t(code)) }) }, + switchFilter () { + if (this.filter === true) { + this.filter = false + return + } + if (this.filter === false) { + this.filter = null + return + } + this.filter = true + }, title (subset) { if (subset.identifiers.length === 0) { return subset.query diff --git a/dbrepo-ui/components/table/TableSchema.vue b/dbrepo-ui/components/table/TableSchema.vue index 62d88647e4..d6b9c13885 100644 --- a/dbrepo-ui/components/table/TableSchema.vue +++ b/dbrepo-ui/components/table/TableSchema.vue @@ -169,6 +169,7 @@ </v-col> </v-row> <v-row + v-if="columns.length !== 0" dense> <v-col> <v-btn @@ -181,7 +182,8 @@ @click="addColumn()" /> </v-col> </v-row> - <v-row> + <v-row + v-if="columns.length !== 0"> <v-col> <v-btn color="secondary" @@ -250,6 +252,9 @@ export default { return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.button.contrast : runtimeConfig.public.variant.button.normal }, showPrimaryKeyWarning () { + if (this.columns.length === 0) { + return false + } return this.columns.filter(c => c.primary_key).length === 0 } }, diff --git a/dbrepo-ui/components/table/TableToolbar.vue b/dbrepo-ui/components/table/TableToolbar.vue index 72d20ebdc2..70c2165b30 100644 --- a/dbrepo-ui/components/table/TableToolbar.vue +++ b/dbrepo-ui/components/table/TableToolbar.vue @@ -117,11 +117,14 @@ export default { return this.roles.includes('update-table') && this.table.owner.id === this.cacheUser.uid }, isOwner () { + if (!this.cacheUser || !this.database) { + return false + } const databaseService = useDatabaseService() return databaseService.isOwner(this.database, this.cacheUser) }, canCreateView () { - if (!this.roles || !this.cacheUser || !this.isOwner) { + if (!this.roles || !this.isOwner) { return false } return this.roles.includes('create-database-view') diff --git a/dbrepo-ui/composables/database-service.ts b/dbrepo-ui/composables/database-service.ts index 204f99dd35..77c958fc92 100644 --- a/dbrepo-ui/composables/database-service.ts +++ b/dbrepo-ui/composables/database-service.ts @@ -214,7 +214,7 @@ export const useDatabaseService = (): any => { if (!database || !user) { return false } - return database.owner.id === user.id + return database.owner.id === user.uid } return { 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 efbcd6accf..260f2113d1 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 @@ -1,7 +1,8 @@ <template> - <div - v-if="canInsertTableData"> - <v-toolbar flat> + <div> + <v-toolbar + v-if="hasReadAccess" + flat> <v-btn class="mr-2" variant="plain" @@ -12,6 +13,7 @@ :text="title" /> </v-toolbar> <v-card + v-if="canInsertTableData" variant="flat" rounded="0"> <v-card-text> @@ -84,6 +86,9 @@ export default { access () { return this.cacheStore.getAccess }, + hasReadAccess () { + return this.access + }, title () { if (!this.table) { return this.$t('pages.table.import.title') @@ -91,7 +96,7 @@ export default { return this.$t('pages.table.import.title') + ' ' + this.table.name }, canInsertTableData () { - if (!this.table || !this.access || !this.cacheUser || !this.roles || !this.roles.includes('insert-table-data')) { + if (!this.table || !this.cacheUser || !this.roles || !this.roles.includes('insert-table-data') || !this.hasReadAccess) { return false } const userService = useUserService() 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 56db5fdc37..088190ac5a 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue @@ -155,8 +155,7 @@ </v-stepper-header> <v-stepper-window direction="vertical"> - <v-container - v-if="step >= 4"> + <v-container> <TableSchema ref="schema" :back="false" diff --git a/helm/dbrepo/files/create-event-listener.jar b/helm/dbrepo/files/create-event-listener.jar index e6ee56c50203b9ba4e75d7964141c3c353ff933d..7e717c5aada04fa7e157ec8dd9f04333955cf816 100644 GIT binary patch delta 1017 zcmbR3zrbHOz?+#xgn@yBgJDy4Z<Mq4`|`4h!ix32`HvL@_C|lIf56YMaqf+^`M%#a z^j=y!rS8sggL?~ZSTt?i{PVl2-|MW!S=-qY668M1<ySCdXMH&mf3foN%}J_BV(!}Q z4l90s3faUiabc77^0G9C<3@(|%G35{n#8}ht+!ghb-l~N%6*v`mqy5=^KDW(GuO$; zS@GGv-QjL7QQvy~M5nc^cf9)AcQGfgojz9`Hur{@>2FRE_wR2P9u(94JO4e`FY$#D zH531<JwII*yh--r!RbMA{qBib`YY_EwlGa$m~`wKpUuv=!1otUciTw1AADh>lP!_( z=y&5(Mr+x+5|xPGFMjT1R&5S@{<-i!_pJ|idN=-^UugfZSg`6u{pOba$@4=_htJ)* zBI8W;)oJ^Ad!0`iy#M93V%^kgo0ZF&|B7@>n3DB}Tc&-1rOh1kW5Q7-(+@?<oM{bP zZXBD^z2wBJEjt=Z=B=9j#B6=hREJq2TI<uVCQW<z^j>$i-Q3^P**y6Iw;gmYnIGk* z=y+lGw1gCyy^Ns9;9_9lU|<2o#^eo*D$E<RdnaFK)Meh3-8-3`Ne)bFFsXv+046Ok zUCU$wrnfM8fz>lIp9RwwnY%&an{#>RFo7BIEZm%629H3EAc!%!TX7bc)=-+v2~Pl% zk0@D!L?<arGp?8{qb#AYF}pX40SO4f*#Zo29nUjPe!wg;IYXHz2V@3Zj)8%J8O{MI z{Lje1kXWK0;LXS+!VLB($e$=CbD?NZU;=9>DJ{=T%|q8W`GK-DqsQbw%8*czRgq>a zo!p=zqm9peeH8Q8Om0xI1BcZ?6=|lQOp^tewI*|@@_;?;^P6Rr9s>h|4g&*&6I>eu z!;;36%#$B5yG*W7<pBlL<kPCsOyMk(Yj{m2%c$`vfWm<LpWvTc91INW1Q-~^Q1pId zo1DiYF?kPEueO>r6N|v)8ea9u`DzA?3nwp7a|N5Qd)<R1kgXtWi(*2v;^c*DrjySr kazTBH$iKoKA?K1A7#KD(Ffa(CXi}J*udc?nMF}Jb03ZNb5dZ)H delta 955 zcmZ4BKigkAz?+#xgn@yBgP}9KJIXUk-K>z2f#D1j1B1xq`%2>Vy+H?q4jBmSEnoJ3 zg1iS)6Kj>QjRvz7^P}3?IjYXHjZSVmabLP?+Qh;u&Xat<rQSb%Tj$^`8QYKHCHF$i zQfn`EFP`bFaHXco=cbU<mN(~CuFbr#u~A~4z~x&av(A6*TmOB<p{;>3bCo7bvx;ba z6nAD_=9A9%U9^4HwmXZndk)oSryQ@nJZ+y}RP4?vXO~a?u4BDPH0v9Kh<pFjeFube z|DG*p{p+TYSAXLF<l@ayOLDxod|x@G{jlSVJKU@I+14_sHZ0k=li7b=ScvtPPdfg` z0u8J<Ps>QX`0>urIAQnU^?fYa^KI=*6;cCUrQCQoe*w?=Sc&NU+kf-T@3`P>_oDu@ z|C^|(HDQt6UAOjxr~XP?Asf_I8J+GFy7bP&KvB^*yBu1UguIP^aD(OS!-sne=3Q81 zEgqMcd~S<Z^1aIwG^VN>_)H3vKhA9X&M|*Z>PeQ+b?(iaedoTLt=nPoeKwmXU*NQZ z&L!fyYbPkY2=+EG>a$}2MF|%J0|x^`XEtN^<gJV<%pKX?lkYI<f@vNmIWVouq{`fx z-90&!NefIjF`0nrolIU}c{b*=VEP(!H;CTM%+AdTW~8vpVFEJ*1!@GrS|%vY0@J!m zlR4qZVDd>NOL-8F0SR!z*#Zo29T!hlRF(i4HQ7d4n(@@+2xUbuuSQu~>=z>gLt=@3 zfHxzP2s6YxAYZIimbR2;0!x*YmS?8sp{PK&jvvK3=gEvJati2bBvI59FioDwBs)1q zg$wMXOciOS<sc#H$-5NAbRe#Qr1y^O?x;WW+MK!=7#Kb<FfeGq&0%0z()fjGvM96G zWL{Msu#aR^r5TS*wonZO^WLaRGX=3s=2U~kOpmHGQv&Z~1p)QR7gQy|Dh$-5nf~)n zRuIsgT&1SPG)H#wL?)0Eq$b~1;|II!t(r7bog!3NWwNI_4>+)eJwnbUGcYi0WME(r RMsbn!<Pvo?w)ILNK>%1wN0|Ts -- GitLab