Skip to content

Commit dc9132e

Browse files
committed
Add optional group-memory and picker fixes
Introduce a rememberSelection prop to ProjectGroupPicker (default false) to control persisting and showing cached project-group names. Update scroll hint logic (showScrollHint computed) and related class bindings. Only persist/load cached names when rememberSelection is enabled and refine selection initialization when options are passed. Fix ServicePicker selection logic to keep the current service if it still exists, otherwise pick the first or null. Wire remember-selection in dashboard, add a :key to the service-picker in the TDEI exporter, and make the fetched workspace reactive to ensure proper updates.
1 parent 6b55e74 commit dc9132e

4 files changed

Lines changed: 23 additions & 12 deletions

File tree

components/ProjectGroupPicker.vue

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
Showing first {{ projectGroups.length }} of {{ totalCount }} project groups
2424
<span v-if="hasMore && !loading" class="pg-scroll-hint">&#183; Scroll to continue loading</span>
2525
</template>
26-
<template v-else-if="!hasMore">Showing all {{ projectGroups.length }} project group{{ projectGroups.length !== 1 ? 's' : '' }}</template>
26+
<template v-else-if="!showScrollHint">Showing all {{ projectGroups.length }} project group{{ projectGroups.length !== 1 ? 's' : '' }}</template>
2727
<template v-else>
2828
Showing first {{ projectGroups.length }} results
2929
<span v-if="!loading" class="pg-scroll-hint">&#183; Scroll to continue loading</span>
@@ -33,7 +33,7 @@
3333
</div>
3434
<div
3535
class="pg-list-wrap"
36-
:class="{ 'pg-has-more': hasMore && !loading }"
36+
:class="{ 'pg-has-more': showScrollHint && !loading }"
3737
ref="listRef"
3838
@scroll="onScroll"
3939
>
@@ -89,8 +89,9 @@ import { ref, watch, onMounted, onUnmounted, nextTick } from 'vue'
8989
import { tdeiUserClient } from '~/services/index'
9090
import type { TdeiProjectGroupItem } from '~/types/tdei'
9191
92-
const props = withDefaults(defineProps<{ id?: string; disabled?: boolean; options?: TdeiProjectGroupItem[] }>(), {
92+
const props = withDefaults(defineProps<{ id?: string; disabled?: boolean; options?: TdeiProjectGroupItem[]; rememberSelection?: boolean }>(), {
9393
disabled: false,
94+
rememberSelection: false,
9495
})
9596
9697
const model = defineModel({ required: true })
@@ -105,6 +106,7 @@ const listRef = ref<HTMLElement | null>(null)
105106
const activeIndex = ref(-1)
106107
107108
const projectGroups = computed(() => props.options ?? fetchedGroups.value)
109+
const showScrollHint = computed(() => !props.options && hasMore.value)
108110
109111
let pageNo = 1
110112
const hasMore = ref(true)
@@ -144,7 +146,9 @@ const loadGroups = async (reset = false) => {
144146
if (total !== undefined) totalCount.value = total
145147
fetchedGroups.value.push(...newGroups)
146148
const selected = newGroups.find(g => g.tdei_project_group_id === model.value)
147-
if (selected) persistCachedName(selected.tdei_project_group_id, selected.name)
149+
if (selected && props.rememberSelection) {
150+
persistCachedName(selected.tdei_project_group_id, selected.name)
151+
}
148152
149153
if (newGroups.length < pageSize) {
150154
hasMore.value = false
@@ -205,7 +209,9 @@ const selectGroup = (id: string) => {
205209
if (pg) {
206210
searchText.value = pg.name
207211
selectedGroupName.value = pg.name
208-
persistCachedName(pg.tdei_project_group_id, pg.name)
212+
if (props.rememberSelection) {
213+
persistCachedName(pg.tdei_project_group_id, pg.name)
214+
}
209215
}
210216
}
211217
@@ -296,7 +302,7 @@ watch(
296302
(groups) => {
297303
if (groups.length > 0) {
298304
const pgId = model.value as string | undefined
299-
if (!pgId || !groups.some(pg => pg.tdei_project_group_id === pgId)) {
305+
if (!pgId || (props.options && !groups.some(pg => pg.tdei_project_group_id === pgId))) {
300306
model.value = groups[0]?.tdei_project_group_id
301307
}
302308
const selected = groups.find(pg => pg.tdei_project_group_id === model.value)
@@ -311,7 +317,7 @@ watch(
311317
312318
onMounted(async () => {
313319
// Show cached name immediately before the API call completes
314-
if (model.value && loadCachedName(model.value as string)) {
320+
if (props.rememberSelection && model.value && loadCachedName(model.value as string)) {
315321
applyCachedName()
316322
}
317323
@@ -323,7 +329,7 @@ onMounted(async () => {
323329
if (selected) {
324330
searchText.value = selected.name
325331
selectedGroupName.value = selected.name
326-
} else if (model.value && loadCachedName(model.value as string)) {
332+
} else if (props.rememberSelection && model.value && loadCachedName(model.value as string)) {
327333
// Group is beyond page 1 — use the cached name for display
328334
applyCachedName()
329335
} else if (model.value) {

components/ServicePicker.vue

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,11 @@ async function refreshServices() {
3737
services.value = (await tdeiUserClient.getMyServices(props.projectGroupId, props.serviceType))
3838
.sort((a, b) => a.name.localeCompare(b.name));
3939
40-
if (!model.value && services.length > 0) {
41-
model.value = services[0].id
40+
const selectedServiceStillExists = services.value.some(s => s.id === model.value)
41+
42+
if (!selectedServiceStillExists) {
43+
model.value = services.value[0]?.id ?? null
4244
}
4345
}
4446
4547
</script>
46-

pages/dashboard.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
<project-group-picker
88
id="ws_project_group_picker"
99
v-model="currentProjectGroup"
10+
remember-selection
1011
/>
1112

1213
<nuxt-link class="btn btn-primary flex-shrink-0" to="/workspace/create">

pages/workspace/[id]/export/tdei.vue

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
<label class="d-block mt-3">
7676
Service
7777
<service-picker
78+
:key="workspace.tdeiProjectGroupId"
7879
v-model="workspace.tdeiServiceId"
7980
:project-group-id="workspace.tdeiProjectGroupId"
8081
:service-type="workspace.type"
@@ -126,11 +127,13 @@ const exporter = new TdeiExporter(tdeiClient, osmClient, context);
126127
const route = useRoute();
127128
const workspaceId = Number(route.params.id);
128129
129-
const [workspace, { items: myProjectGroups }] = await Promise.all([
130+
const [workspaceData, { items: myProjectGroups }] = await Promise.all([
130131
workspacesClient.getWorkspace(workspaceId),
131132
tdeiUserClient.getMyProjectGroups(1, '', 10000),
132133
]);
133134
135+
const workspace = reactive(workspaceData);
136+
134137
const dataGeneratorRole = `${workspace.type}_data_generator`;
135138
const eligibleProjectGroups = myProjectGroups.filter(pg =>
136139
pg.roles.includes('poc') || pg.roles.includes(dataGeneratorRole),

0 commit comments

Comments
 (0)