diff --git a/apps/web/src/api-clients/inventory/region/composables/use-region-api.ts b/apps/web/src/api-clients/inventory/region/composables/use-region-api.ts index 8c90161b66..7c7d65f738 100644 --- a/apps/web/src/api-clients/inventory/region/composables/use-region-api.ts +++ b/apps/web/src/api-clients/inventory/region/composables/use-region-api.ts @@ -2,6 +2,7 @@ import { SpaceConnector } from '@cloudforet/core-lib/space-connector'; import type { ListResponse } from '@/api-clients/_common/schema/api-verbs/list'; import type { StatResponse } from '@/api-clients/_common/schema/api-verbs/stat'; +import type { RegionGetParameters } from '@/api-clients/inventory/region/schema/api-verbs/get'; import type { RegionListParameters } from '@/api-clients/inventory/region/schema/api-verbs/list'; import type { RegionStatParameters } from '@/api-clients/inventory/region/schema/api-verbs/stat'; import type { RegionModel } from '@/api-clients/inventory/region/schema/model'; @@ -10,6 +11,7 @@ export const useRegionApi = () => { const actions = { list: SpaceConnector.clientV2.inventory.region.list>, stat: SpaceConnector.clientV2.inventory.region.stat, + get: SpaceConnector.clientV2.inventory.region.get, }; return { diff --git a/apps/web/src/api-clients/inventory/region/schema/api-verbs/get.ts b/apps/web/src/api-clients/inventory/region/schema/api-verbs/get.ts new file mode 100644 index 0000000000..3d2373903a --- /dev/null +++ b/apps/web/src/api-clients/inventory/region/schema/api-verbs/get.ts @@ -0,0 +1,3 @@ +export interface RegionGetParameters { + region_id: string; +} diff --git a/apps/web/src/common/components/select/DataSelector.vue b/apps/web/src/common/components/select/DataSelector.vue index 83b6dfb817..45d16f08a3 100644 --- a/apps/web/src/common/components/select/DataSelector.vue +++ b/apps/web/src/common/components/select/DataSelector.vue @@ -11,17 +11,22 @@ import type { MenuAttachHandler } from '@cloudforet/mirinae/types/hooks/use-cont import type { DataSelectorItem } from '@/common/components/select/type'; -const props = defineProps<{ +interface Props { label?: string; menu?: DataSelectorItem[]; handler?: MenuAttachHandler; showSelectMarker?: boolean; multiSelectable?: boolean; selected?: DataSelectorItem[]; -}>(); -const emit = defineEmits<{(e: 'update:selected', value: DataSelectorItem[]): void; +} +interface Emits { + (e: 'update:selected', value: DataSelectorItem[]): void; (e: 'update:search-text', value: string): void; -}>(); +} + +const props = defineProps(); + +const emit = defineEmits(); const slots = useSlots(); @@ -71,39 +76,37 @@ watch([() => props.menu, () => props.handler, () => props.selected], () => { diff --git a/apps/web/src/services/_shared/dashboard/core/composables/use-cost-data-source-map.ts b/apps/web/src/common/composables/data-source/use-cost-data-source-map.ts similarity index 100% rename from apps/web/src/services/_shared/dashboard/core/composables/use-cost-data-source-map.ts rename to apps/web/src/common/composables/data-source/use-cost-data-source-map.ts diff --git a/apps/web/src/common/modules/custom-table/custom-field-modal/composables/use-provider-list.ts b/apps/web/src/common/modules/custom-table/custom-field-modal/composables/use-provider-list.ts new file mode 100644 index 0000000000..f330220575 --- /dev/null +++ b/apps/web/src/common/modules/custom-table/custom-field-modal/composables/use-provider-list.ts @@ -0,0 +1,34 @@ +import { computed } from 'vue'; + +import { useProviderApi } from '@/api-clients/identity/provider/composables/use-provider-api'; +import { useServiceQueryKey } from '@/query/core/query-key/use-service-query-key'; +import { useScopedQuery } from '@/query/service-query/use-scoped-query'; + +export const useProviderList = () => { + const { providerAPI } = useProviderApi(); + const { key, params } = useServiceQueryKey('identity', 'provider', 'list', { + params: { + query: { + only: ['provider', 'name', 'icon'], + }, + }, + }); + + const { data, isFetching } = useScopedQuery({ + queryKey: key, + queryFn: () => providerAPI.list(params.value), + select: (response) => (response.results ?? []).map((provider) => ({ + label: provider.alias || provider.name, + name: provider.provider, + image: provider.icon, + })), + staleTime: 1000 * 60 * 3, + gcTime: 1000 * 60 * 30, + }, ['WORKSPACE', 'DOMAIN']); + + + return { + providerList: computed(() => data.value ?? []), + loading: isFetching, + }; +}; diff --git a/apps/web/src/common/modules/custom-table/custom-field-modal/modules/SelectCloudServiceTagColumns.vue b/apps/web/src/common/modules/custom-table/custom-field-modal/modules/SelectCloudServiceTagColumns.vue index 2adb914822..200dacba95 100644 --- a/apps/web/src/common/modules/custom-table/custom-field-modal/modules/SelectCloudServiceTagColumns.vue +++ b/apps/web/src/common/modules/custom-table/custom-field-modal/modules/SelectCloudServiceTagColumns.vue @@ -29,15 +29,20 @@ import type { QueryItem, ValueHandlerMap, ValueHandler, KeyItemSet, } from '@cloudforet/mirinae/types/controls/search/query-search/type'; -import { useAllReferenceStore } from '@/store/reference/all-reference-store'; -import type { ProviderItem, ProviderReferenceMap } from '@/store/reference/provider-reference-store'; import ErrorHandler from '@/common/composables/error/errorHandler'; +import { useProviderList } from '@/common/modules/custom-table/custom-field-modal/composables/use-provider-list'; import { TAGS_PREFIX } from '@/common/modules/custom-table/custom-field-modal/config'; -const allReferenceStore = useAllReferenceStore(); -const props = withDefaults(defineProps<{ +type Provider = { + label: string; + key: string; + imageUrl?: string; + icon?: string; +}; + +interface Props { selectedTagKeys?: string[]; options?: { provider?: string; @@ -45,44 +50,48 @@ const props = withDefaults(defineProps<{ cloudServiceType?: string; }; isServerPage?: boolean; -}>(), { +} + +interface Emits { + (e: 'update:selected-tag-keys', tagKeys: string[]): void; +} + +const props = withDefaults(defineProps(), { selectedTagKeys: () => [], options: () => ({}), isServerPage: false, }); -const emit = defineEmits<{(e: 'update:selected-tag-keys', tagKeys: string[]): void}>(); +const emit = defineEmits(); + /* providers */ -const providersMap = computed(() => ({ - ...allReferenceStore.getters.provider, - custom: { - label: 'Custom', - key: 'custom', - icon: 'ic_cloud-filled', - }, +const { providerList } = useProviderList(); +const providersMap = computed>(() => ({ + ...providerList.value.reduce((acc, provider) => { + acc[provider.name] = provider; + return acc; + }, { + custom: { + label: 'Custom', + key: 'custom', + icon: 'ic_cloud-filled', + }, + }), })); -const providers = computed(() => Object.values(providersMap.value)); -const providerKeys = computed(() => providers.value.map((provider) => provider.key)); +const providerKeys = computed(() => providerList.value.map((provider) => provider.name)); /* key items */ const keyItemSets = computed(() => [{ title: 'Provider', - items: [ - ...providers.value.map((provider) => ({ - label: provider.label, - name: provider.key, - imageUrl: provider.key !== 'custom' ? provider.icon : undefined, - icon: provider.key === 'custom' ? provider.icon : undefined, - })), - ], + items: providerList.value, }]); /* value handler */ const valueHandlerMap = computed(() => { const result = { custom: getTags }; - providers.value.forEach((provider) => { - result[provider.key] = getTags; + providerList.value.forEach((provider) => { + result[provider.name] = getTags; }); return result; }); @@ -127,7 +136,7 @@ const getQueryItemsFromTagKeys = (tagKeys: string[]): QueryItem[] => tagKeys.map const value = query.slice(dotPosition + 1); return { key: { - label: providersMap.value[key].label, + label: providersMap.value[key]?.label, name: key, }, value: { diff --git a/apps/web/src/common/modules/navigations/gnb/GNBNavigationRail.vue b/apps/web/src/common/modules/navigations/gnb/GNBNavigationRail.vue index 16e010e23b..0d71efb4e9 100644 --- a/apps/web/src/common/modules/navigations/gnb/GNBNavigationRail.vue +++ b/apps/web/src/common/modules/navigations/gnb/GNBNavigationRail.vue @@ -12,11 +12,11 @@ import { } from '@cloudforet/mirinae'; import type { ContextMenuType } from '@cloudforet/mirinae/types/controls/context-menu/type'; +import type { CostDataSourceModel } from '@/api-clients/cost-analysis/data-source/schema/model'; + import { useAppContextStore } from '@/store/app-context/app-context-store'; import { useUserWorkspaceStore } from '@/store/app-context/workspace/user-workspace-store'; import type { DisplayMenu } from '@/store/menu/type'; -import { useAllReferenceStore } from '@/store/reference/all-reference-store'; -import type { CostDataSourceReferenceMap } from '@/store/reference/cost-data-source-reference-store'; import type { MenuId } from '@/lib/menu/config'; import { MENU_ID } from '@/lib/menu/config'; @@ -26,6 +26,7 @@ import BetaMark from '@/common/components/marks/BetaMark.vue'; import NewMark from '@/common/components/marks/NewMark.vue'; import UpdateMark from '@/common/components/marks/UpdateMark.vue'; import { useCurrentMenuId } from '@/common/composables/current-menu-id'; +import { useCostDataSourceMap } from '@/common/composables/data-source/use-cost-data-source-map'; import { useGnbStore } from '@/common/modules/navigations/stores/gnb-store'; import { ADMIN_COST_EXPLORER_ROUTE } from '@/services/cost-explorer/routes/admin/route-constant'; @@ -37,14 +38,14 @@ interface GNBMenuType extends DisplayMenu { disabled?: boolean; } -const allReferenceStore = useAllReferenceStore(); -const allReferenceGetters = allReferenceStore.getters; const appContextStore = useAppContextStore(); const gnbStore = useGnbStore(); const gnbGetters = gnbStore.getters; const userWorkspaceStore = useUserWorkspaceStore(); const userWorkspaceGetters = userWorkspaceStore.getters; const { getAllMenuList } = useAllMenuList(); +const { getCostDataSourceMap } = useCostDataSourceMap(); + const route = useRoute(); const router = useRouter(); @@ -57,13 +58,13 @@ const storeState = reactive({ isHideNavRail: computed(() => gnbGetters.isHideNavRail), isMinimizeNavRail: computed(() => gnbGetters.isMinimizeNavRail), currentWorkspaceId: computed(() => userWorkspaceGetters.currentWorkspaceId), - costDataSource: computed(() => allReferenceGetters.costDataSource), }); const noParentsMenuList:MenuId[] = [MENU_ID.WORKSPACE_HOME, MENU_ID.DASHBOARDS, MENU_ID.PROJECT, MENU_ID.SERVICE_ACCOUNT]; const state = reactive({ isInit: false as boolean|undefined, + costDataSourceMap: undefined as Record | undefined, isHovered: false, isMobileSize: computed(() => width.value < screens.mobile.max), isMenuDescription: undefined as boolean | undefined, @@ -71,7 +72,7 @@ const state = reactive({ let results = [] as GNBMenuType[]; const allMenuList = getAllMenuList(route, router); const menuList = allMenuList.filter((d) => !d.hideOnGNB); - if (state.isInit && isEmpty(storeState.costDataSource)) { + if (state.isInit && isEmpty(state.costDataSourceMap ?? {})) { results = removeCostExplorerFromMenuList(menuList); } else results = menuList; return results; @@ -144,6 +145,8 @@ const removeCostExplorerFromMenuList = (list: GNBMenuType[]) => { onMounted(async () => { state.isInit = true; + const costDataSourceMap = await getCostDataSourceMap(); + state.costDataSourceMap = costDataSourceMap; }); diff --git a/apps/web/src/common/modules/navigations/gnb/GNBToolbox.vue b/apps/web/src/common/modules/navigations/gnb/GNBToolbox.vue index 3928815f55..f46ba26f18 100644 --- a/apps/web/src/common/modules/navigations/gnb/GNBToolbox.vue +++ b/apps/web/src/common/modules/navigations/gnb/GNBToolbox.vue @@ -108,14 +108,8 @@ const handleClickBreadcrumbsDropdownItem = (item: MenuItem) => { } }; -watch(() => state.selectedMenuId, async (selectedMenuId) => { +watch(() => state.selectedMenuId, async () => { await gnbStore.initState(); - - if (selectedMenuId === MENU_ID.COST_ANALYSIS) { - await gnbStore.fetchCostQuerySet(); - } else if (state.selectedMenuId === MENU_ID.METRIC_EXPLORER) { - await gnbStore.fetchMetricExample(); - } }, { immediate: true }); watch(() => state.currentMenuId, async () => { if (state.selectedMenuId === MENU_ID.SECURITY || state.selectedMenuId === MENU_ID.COST_ANALYSIS) return; diff --git a/apps/web/src/common/modules/navigations/stores/gnb-store.ts b/apps/web/src/common/modules/navigations/stores/gnb-store.ts index 907d91401d..487f9d64c3 100644 --- a/apps/web/src/common/modules/navigations/stores/gnb-store.ts +++ b/apps/web/src/common/modules/navigations/stores/gnb-store.ts @@ -7,15 +7,6 @@ import { SpaceConnector } from '@cloudforet/core-lib/space-connector'; import type { ListResponse } from '@/api-clients/_common/schema/api-verbs/list'; import type { UserConfigListParameters } from '@/api-clients/config/user-config/schema/api-verbs/list'; import type { UserConfigModel } from '@/api-clients/config/user-config/schema/model'; -import type { CostQuerySetListParameters } from '@/api-clients/cost-analysis/cost-query-set/schema/api-verbs/list'; -import type { CostQuerySetModel } from '@/api-clients/cost-analysis/cost-query-set/schema/model'; -import type { MetricExampleListParameters } from '@/api-clients/inventory/metric-example/schema/api-verbs/list'; -import type { MetricExampleModel } from '@/api-clients/inventory/metric-example/schema/model'; - -import { useUserWorkspaceStore } from '@/store/app-context/workspace/user-workspace-store'; -import { useAllReferenceStore } from '@/store/reference/all-reference-store'; -import type { CostDataSourceReferenceMap } from '@/store/reference/cost-data-source-reference-store'; -import { useUserStore } from '@/store/user/user-store'; import ErrorHandler from '@/common/composables/error/errorHandler'; import type { Breadcrumb } from '@/common/modules/page-layouts/type'; @@ -28,28 +19,14 @@ interface GnbStoreState { favoriteItem?: FavoriteOptions; isHideNavRail?: boolean; isMinimizeNavRail?: boolean; - metricExamples: MetricExampleModel[]; - costQuerySets: CostQuerySetModel[]; } export const useGnbStore = defineStore('gnb', () => { - const allReferenceStore = useAllReferenceStore(); - const userWorkspaceStore = useUserWorkspaceStore(); - const userStore = useUserStore(); - - const _getters = reactive({ - userId: computed(() => userStore.state.userId), - costDataSource: computed(() => allReferenceStore.getters.costDataSource), - currentWorkspaceId: computed(() => userWorkspaceStore.getters.currentWorkspaceId as string), - }); - const state = reactive({ breadcrumbs: [], selectedItem: {} as Breadcrumb, id: '', favoriteItem: {} as FavoriteOptions, - metricExamples: [] as MetricExampleModel[], - costQuerySets: [] as CostQuerySetModel[], isHideNavRail: false, isMinimizeNavRail: false, }); @@ -59,8 +36,6 @@ export const useGnbStore = defineStore('gnb', () => { selectedItem: computed(() => state.selectedItem), id: computed(() => state.id), favoriteItem: computed(() => state.favoriteItem), - metricExamples: computed(() => state.metricExamples), - costQuerySets: computed(() => state.costQuerySets), isHideNavRail: computed(() => state.isHideNavRail), isMinimizeNavRail: computed(() => state.isMinimizeNavRail), }); @@ -128,46 +103,6 @@ export const useGnbStore = defineStore('gnb', () => { ErrorHandler.handleError(e); } }, - fetchMetricExample: async () => { - try { - const res = await SpaceConnector.clientV2.inventory.metricExample.list>(); - state.metricExamples = res.results ?? []; - } catch (e) { - ErrorHandler.handleError(e); - state.metricExamples = []; - } - }, - fetchCostQuerySet: async () => { - const costQuerySetPromiseResults = await Promise.allSettled( - Object.keys(_getters.costDataSource).map(async (dataSourceId) => { - try { - const res = await SpaceConnector.clientV2.costAnalysis.costQuerySet.list>({ - data_source_id: dataSourceId, - query: { - filter: [ - { k: 'user_id', v: _getters.userId, o: 'eq' }, - { k: 'workspace_id', v: _getters.currentWorkspaceId, o: 'eq' }, - ], - only: ['cost_query_set_id', 'data_source_id', 'name'], - }, - }); - return res.results ?? []; - } catch (e) { - ErrorHandler.handleError(e); - return []; - } - }), - ); - const costQuerySets: CostQuerySetModel[] = []; - costQuerySetPromiseResults.forEach((res) => { - if (res.status === 'fulfilled' && res.value.length) { - res.value.forEach((item) => { - costQuerySets.push(item); - }); - } - }); - state.costQuerySets = costQuerySets; - }, initState: () => { state.breadcrumbs = []; state.selectedItem = {} as Breadcrumb; diff --git a/apps/web/src/common/modules/navigations/top-bar/modules/top-bar-search/modules/top-bar-search-contents/modules/SearchTabContent.vue b/apps/web/src/common/modules/navigations/top-bar/modules/top-bar-search/modules/top-bar-search-contents/modules/SearchTabContent.vue index 33c8464491..cbbcd66762 100644 --- a/apps/web/src/common/modules/navigations/top-bar/modules/top-bar-search/modules/top-bar-search-contents/modules/SearchTabContent.vue +++ b/apps/web/src/common/modules/navigations/top-bar/modules/top-bar-search/modules/top-bar-search-contents/modules/SearchTabContent.vue @@ -70,7 +70,6 @@ const state = reactive({ }), serviceMenuCount: computed(() => state.searchMenuList?.length ?? 0), currentWorkspaceId: computed(() => workspaceStoreGetter.currentWorkspaceId), - stagedWorkspaces: computed(() => topBarSearchStore.state.stagedWorkspaces), recentMode: computed(() => state.inputText.length === 0), // focus proxyFocusingDirection: useProxyValue('focusingDirection', props, emit), diff --git a/apps/web/src/common/modules/navigations/top-bar/modules/top-bar-search/modules/top-bar-search-contents/modules/TopBarSearchRecentListItem.vue b/apps/web/src/common/modules/navigations/top-bar/modules/top-bar-search/modules/top-bar-search-contents/modules/TopBarSearchRecentListItem.vue index 7466e9391b..fdf387d9c9 100644 --- a/apps/web/src/common/modules/navigations/top-bar/modules/top-bar-search/modules/top-bar-search-contents/modules/TopBarSearchRecentListItem.vue +++ b/apps/web/src/common/modules/navigations/top-bar/modules/top-bar-search/modules/top-bar-search-contents/modules/TopBarSearchRecentListItem.vue @@ -7,9 +7,10 @@ import { PI, PIconButton, PLazyImg, PTooltip, } from '@cloudforet/mirinae'; -import { useReferenceRouter } from '@/router/composables/use-reference-router'; +import type { PublicDashboardModel } from '@/api-clients/dashboard/public-dashboard/schema/model'; +import { useAllReferenceDataModel } from '@/query/resource-query/reference-data-model'; -import { useAllReferenceStore } from '@/store/reference/all-reference-store'; +import { useReferenceRouter } from '@/router/composables/use-reference-router'; import { SEARCH_TAB } from '@/common/modules/navigations/top-bar/modules/top-bar-search/config'; import { topBarSearchReferenceRouter } from '@/common/modules/navigations/top-bar/modules/top-bar-search/helper'; @@ -17,6 +18,8 @@ import { useTopBarSearchStore } from '@/common/modules/navigations/top-bar/modul import type { SearchTab } from '@/common/modules/navigations/top-bar/modules/top-bar-search/type'; import type { RecentItem } from '@/common/modules/navigations/type'; import { useRecentDelete } from '@/common/modules/user-config/recent/use-recent-delete'; +import { useCloudServiceTypeMap } from '@/common/modules/user-config/shared/_internal/use-cloud-service-type-map'; +import { useDashboardMap } from '@/common/modules/user-config/shared/_internal/use-dashboard-map'; interface Props { recentItem?: RecentItem; @@ -26,21 +29,22 @@ const props = withDefaults(defineProps(), { recentItem: undefined, }); const topBarSearchStore = useTopBarSearchStore(); -const allReferenceStore = useAllReferenceStore(); const router = useRouter(); const { getReferenceLocation } = useReferenceRouter(); +const referenceMap = useAllReferenceDataModel(); +const serviceAccountMap = referenceMap.serviceAccount; +const projectMap = referenceMap.project; + /* Recent */ const { mutateAsync: deleteRecent } = useRecentDelete(); +const { map: cloudServiceTypeMap } = useCloudServiceTypeMap(); +const { map: dashboardMap } = useDashboardMap(); const storeState = reactive({ currentWorkspaceId: computed(() => topBarSearchStore.storeState.currentWorkspaceId), activeTab: computed(() => topBarSearchStore.state.activeTab), - serviceAccountMap: computed(() => allReferenceStore.getters.serviceAccount), - projectMap: computed(() => allReferenceStore.getters.project), - cloudServiceTypeMap: computed(() => allReferenceStore.getters.cloudServiceType), - publicDashboardMap: computed(() => allReferenceStore.getters.publicDashboard), }); const splitCloudServiceInfo = (id:string): {provider:string; group:string; name: string} => { @@ -61,15 +65,17 @@ const state = reactive({ return state.resourceId; } const { provider, group, name } = splitCloudServiceInfo(state.resourceId); - return Object.values(storeState.cloudServiceTypeMap).filter((item) => item?.data?.provider === provider && item?.data?.group === group && item.name === name)[0]?.key; + const cloudServiceTypeList = Array.from(cloudServiceTypeMap.value.values()); + const cloudServiceType = cloudServiceTypeList.find((item) => item?.provider === provider && item?.group === group && item.name === name); + return cloudServiceType?.cloud_service_type_id; }), isDeleted: computed(() => { if (storeState.activeTab === SEARCH_TAB.SERVICE_ACCOUNT) { - return !storeState.serviceAccountMap[state.resourceId]; + return !serviceAccountMap[state.resourceId]; } if (storeState.activeTab === SEARCH_TAB.PROJECT) { - return !storeState.projectMap[state.resourceId]; + return !projectMap[state.resourceId]; } if (storeState.activeTab === SEARCH_TAB.DASHBOARD) { - return !storeState.publicDashboardMap[state.resourceId]; + return !dashboardMap.value.get(state.resourceId); } if (storeState.activeTab === SEARCH_TAB.CLOUD_SERVICE) { return !props.recentItem?.data?.resource_id; } @@ -92,9 +98,10 @@ const state = reactive({ cloudServiceIconName: computed(() => props.recentItem?.tags?.icon), description: computed(() => { if (storeState.activeTab === SEARCH_TAB.DASHBOARD) { - if (storeState.publicDashboardMap[state.convertResourceId]?.data?.resourceGroup === 'PROJECT') { - const projectId = storeState.publicDashboardMap[state.convertResourceId]?.data?.projectId; - return `Single Project (${storeState.projectMap[projectId]?.label})`; + const dashboard = dashboardMap.value.get(state.convertResourceId) as PublicDashboardModel | undefined; + if (dashboard?.resource_group === 'PROJECT') { + const projectId = dashboard?.project_id; + return `Single Project (${projectMap[projectId]?.label || projectId})`; } return 'Workspace'; } if (storeState.activeTab === SEARCH_TAB.CLOUD_SERVICE) { @@ -110,20 +117,20 @@ const state = reactive({ const getLabelByResourceId = (resourceId: string, activeTab: SearchTab) => { if (activeTab === SEARCH_TAB.SERVICE_ACCOUNT) { - const provider = storeState.serviceAccountMap[resourceId]?.provider; + const provider = serviceAccountMap[resourceId]?.provider; let accountId; if (provider === 'aws') { - accountId = storeState.serviceAccountMap[resourceId]?.data?.account_id; + accountId = serviceAccountMap[resourceId]?.data?.data?.account_id; } else if (provider === 'google_cloud') { - accountId = storeState.serviceAccountMap[resourceId]?.data?.project_id; + accountId = serviceAccountMap[resourceId]?.data?.data?.project_id; } else if (provider === 'azure') { - accountId = storeState.serviceAccountMap[resourceId]?.data?.subscription_id; + accountId = serviceAccountMap[resourceId]?.data?.data?.subscription_id; } - return `${storeState.serviceAccountMap[resourceId]?.label} (${accountId ?? resourceId})`; + return `${serviceAccountMap[resourceId]?.label || resourceId} (${accountId ?? resourceId})`; } if (activeTab === SEARCH_TAB.PROJECT) { - return storeState.projectMap[resourceId]?.label; + return projectMap[resourceId]?.label || resourceId; } if (activeTab === SEARCH_TAB.DASHBOARD) { - return storeState.publicDashboardMap[resourceId]?.label; + return dashboardMap.value.get(resourceId)?.name || resourceId; } if (activeTab === SEARCH_TAB.CLOUD_SERVICE) { return props.recentItem?.data?.label ?? ''; } diff --git a/apps/web/src/common/modules/navigations/top-bar/modules/top-bar-search/modules/top-bar-search-contents/modules/TopBarSearchWorkspaceFilter.vue b/apps/web/src/common/modules/navigations/top-bar/modules/top-bar-search/modules/top-bar-search-contents/modules/TopBarSearchWorkspaceFilter.vue index d8f9aa0c1d..5e12e755ed 100644 --- a/apps/web/src/common/modules/navigations/top-bar/modules/top-bar-search/modules/top-bar-search-contents/modules/TopBarSearchWorkspaceFilter.vue +++ b/apps/web/src/common/modules/navigations/top-bar/modules/top-bar-search/modules/top-bar-search-contents/modules/TopBarSearchWorkspaceFilter.vue @@ -22,8 +22,7 @@ import type { MenuItem } from '@cloudforet/mirinae/types/controls/context-menu/t import { useResourceApi } from '@/api-clients/search/resource/composables/use-resource-api'; import type { ResourceModel } from '@/api-clients/search/resource/schema/model'; import { useServiceQueryKey } from '@/query/core/query-key/use-service-query-key'; - -import { useAllReferenceStore } from '@/store/reference/all-reference-store'; +import { useAllReferenceDataModel } from '@/query/resource-query/reference-data-model'; import ErrorHandler from '@/common/composables/error/errorHandler'; import WorkspaceLogoIcon from '@/common/modules/navigations/top-bar/modules/top-bar-header/WorkspaceLogoIcon.vue'; @@ -32,12 +31,11 @@ import { } from '@/common/modules/navigations/top-bar/modules/top-bar-search/store'; import type { StageWorkspace } from '@/common/modules/navigations/top-bar/modules/top-bar-search/type'; -const allReferenceStore = useAllReferenceStore(); -const allReferenceGetters = allReferenceStore.getters; const topBarSearchStore = useTopBarSearchStore(); +const referenceMap = useAllReferenceDataModel(); +const workspaceMap = referenceMap.workspace; const storeState = reactive({ - workspaceMap: computed(() => allReferenceGetters.workspace), stagedWorkspaces: computed(() => topBarSearchStore.state.stagedWorkspaces), selectedWorkspaces: computed(() => topBarSearchStore.getters.selectedWorkspaces), isAllSelected: computed(() => topBarSearchStore.state.allWorkspacesChecked), @@ -134,7 +132,6 @@ const handleSelectItem = (item:MenuItem) => { topBarSearchStore.addStagedWorkspace({ workspaceId: item.name, label: item.label, - theme: storeState.workspaceMap[item.name]?.data?.tags?.theme, isSelected: false, }); } @@ -202,7 +199,7 @@ watch(() => state.searchText, (val) => {
{{ workspace.label }} @@ -238,7 +235,7 @@ watch(() => state.searchText, (val) => {