diff --git a/apps/web/package.json b/apps/web/package.json index 8b3c297869..96bc4b2e2c 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -46,6 +46,7 @@ "@vueuse/core": "^10.7.2", "@vueuse/integrations": "^11.1.0", "@vvo/tzdb": "^6.4.1", + "console-vue-query-devtools-sdk": "^0.0.16", "animated-number-vue": "^1.0.0", "axios": "^1.8.2", "axios-auth-refresh": "^3.2.2", @@ -112,7 +113,7 @@ "postcss-config-custom": "*", "rollup-plugin-visualizer": "^5.9.0", "tsconfig": "*", - "vite": "^4.5.13", + "vite": "^4.5.14", "vite-plugin-stylelint": "^3.3.3", "vite-plugin-vue-type-imports": "^0.2.4", "vitest": "^3.0.8", diff --git a/apps/web/src/App.vue b/apps/web/src/App.vue index 95d5dde6b7..37a8ac669e 100755 --- a/apps/web/src/App.vue +++ b/apps/web/src/App.vue @@ -6,6 +6,9 @@ import { import type { Location } from 'vue-router'; import { useRoute, useRouter } from 'vue-router/composables'; +import { useQueryClient } from '@tanstack/vue-query'; +import { ConsoleVueQueryDevtools } from 'console-vue-query-devtools-sdk'; + import { LocalStorageAccessor } from '@cloudforet/core-lib/local-storage-accessor'; import { PNoticeAlert, PToastAlert, PIconModal, PSidebar, PDataLoader, @@ -15,6 +18,7 @@ import { EXTERNAL_PAGE_ROUTE } from '@/router/constant'; import { getRouteScope } from '@/router/helpers/route-helper'; import { useAppContextStore } from '@/store/app-context/app-context-store'; +import { useAuthorizationStore } from '@/store/authorization/authorization-store'; import { SIDEBAR_TYPE } from '@/store/display/constant'; import { useDisplayStore } from '@/store/display/display-store'; import { useErrorStore } from '@/store/error/error-store'; @@ -37,6 +41,15 @@ import MobileGuideModal from '@/services/auth/components/MobileGuideModal.vue'; import { AUTH_ROUTE } from '@/services/auth/routes/route-constant'; import { LANDING_ROUTE } from '@/services/landing/routes/route-constant'; +if (import.meta.env.DEV) { + const queryClient = useQueryClient(); + import('@/_dev-tools/vue-query-console-debug').then((mod) => mod.initVueQueryConsoleDebug(queryClient)) + .catch((error) => { + console.error('Failed to load vue-query-console-debug module:', error); + console.error('Ensure the module exists and the path is correct.'); + }); +} + const router = useRouter(); const route = useRoute(); @@ -56,6 +69,7 @@ const state = reactive({ }); const userStore = useUserStore(); +const authorizationStore = useAuthorizationStore(); const appContextStore = useAppContextStore(); const errorStore = useErrorStore(); const globalUIStore = useGlobalUIStore(); @@ -74,7 +88,7 @@ const goToSignIn = async () => { name: AUTH_ROUTE.SIGN_OUT._NAME, query: { previousPath: route.fullPath }, }; - userStore.setCurrentGrantInfo(undefined); + authorizationStore.setCurrentGrantInfo(undefined); errorStore.setVisibleSessionExpiredError(false); await router.push(to); @@ -104,6 +118,7 @@ watch(() => state.userId, (userId) => {
+ diff --git a/apps/web/src/services/alert-manager/v2/components/ServiceDetailTabsNotificationsDeleteModal.vue b/apps/web/src/services/alert-manager/v2/components/ServiceDetailTabsNotificationsDeleteModal.vue index 112aae553a..aadccceda3 100644 --- a/apps/web/src/services/alert-manager/v2/components/ServiceDetailTabsNotificationsDeleteModal.vue +++ b/apps/web/src/services/alert-manager/v2/components/ServiceDetailTabsNotificationsDeleteModal.vue @@ -1,18 +1,32 @@ diff --git a/apps/web/src/services/alert-manager/v2/components/ServiceDetailTabsNotificationsDetail.vue b/apps/web/src/services/alert-manager/v2/components/ServiceDetailTabsNotificationsDetail.vue index e76accc70c..a04687a0aa 100644 --- a/apps/web/src/services/alert-manager/v2/components/ServiceDetailTabsNotificationsDetail.vue +++ b/apps/web/src/services/alert-manager/v2/components/ServiceDetailTabsNotificationsDetail.vue @@ -37,6 +37,7 @@ type ScheduleInfo = { value: TranslateResult; days: string; time: string; + timezone: string; }; const serviceDetailPageStore = useServiceDetailPageStore(); @@ -111,14 +112,18 @@ const getUserGroupName = (userGroup: string[] = []): string => userGroup.map((gr }).join(', '); const getScheduleInfo = (schedule: ServiceChannelScheduleInfoType): ScheduleInfo => { const scheduleInfo = { - styleType: '', value: '' as TranslateResult, days: [] as TranslateResult[], time: '', + styleType: '', value: '' as TranslateResult, days: [] as TranslateResult[], time: '', timezone: '', }; const formatTime = (time: number | undefined, defaultTime: number): string => `${String(time ?? defaultTime).padStart(2, '0')}:00`; Object.entries(schedule).forEach(([day, s]) => { - if (day === 'SCHEDULE_TYPE' || day === 'TIMEZONE') return; + if (day === 'SCHEDULE_TYPE') return; + if (day === 'TIMEZONE') { + scheduleInfo.timezone = s as string; + return; + } const scheduleDay = s as ServiceChannelScheduleDayType; if (!scheduleDay) return; @@ -223,17 +228,21 @@ watch(() => storeState.selectedNotificationId, async (selectedId) => { diff --git a/apps/web/src/services/alert-manager/v2/components/ServiceDetailTabsOverviewNotification.vue b/apps/web/src/services/alert-manager/v2/components/ServiceDetailTabsOverviewNotification.vue index d564dfb614..111c70ddf6 100644 --- a/apps/web/src/services/alert-manager/v2/components/ServiceDetailTabsOverviewNotification.vue +++ b/apps/web/src/services/alert-manager/v2/components/ServiceDetailTabsOverviewNotification.vue @@ -4,13 +4,10 @@ import { computed, reactive, ref, watch, } from 'vue'; -import { SpaceConnector } from '@cloudforet/core-lib/space-connector'; import { PFieldTitle, PIconButton, PLazyImg, PDivider, PTextButton, PDataLoader, PI, } from '@cloudforet/mirinae'; -import type { ListResponse } from '@/api-clients/_common/schema/api-verbs/list'; -import type { ServiceChannelListParameters } from '@/schema/alert-manager/service-channel/api-verbs/list'; import { SERVICE_CHANNEL_TYPE } from '@/schema/alert-manager/service-channel/constants'; import type { ServiceChannelModel } from '@/schema/alert-manager/service-channel/model'; @@ -29,6 +26,7 @@ const rowItemsWrapperRef = ref(null); const itemEl = ref(null); const serviceDetailPageStore = useServiceDetailPageStore(); +const serviceDetailPageState = serviceDetailPageStore.state; const serviceDetailPageGetters = serviceDetailPageStore.getters; const { width: rowItemsWrapperWidth } = useElementSize(rowItemsWrapperRef); @@ -36,13 +34,13 @@ const { width: rowItemsWrapperWidth } = useElementSize(rowItemsWrapperRef); const storeState = reactive({ serviceId: computed(() => serviceDetailPageGetters.serviceInfo.service_id), notificationProtocolList: computed(() => serviceDetailPageGetters.notificationProtocolList), + serviceChannelList: computed(() => serviceDetailPageState.serviceChannelList.slice(0, 15)), }); const state = reactive({ loading: true, pageStart: 0, - items: [] as ServiceChannelModel[], visibleCount: computed(() => Math.floor((rowItemsWrapperWidth.value - DEFAULT_LEFT_PADDING) / ITEM_DEFAULT_WIDTH)), - pageMax: computed(() => Math.max(state.items.length - state.visibleCount, 0)), + pageMax: computed(() => Math.max(storeState.serviceChannelList.length - state.visibleCount, 0)), }); const handleClickArrowButton = (increment: number) => { @@ -68,19 +66,12 @@ const handleRouteDetail = () => ( serviceDetailPageStore.setCurrentTab(SERVICE_DETAIL_TABS.NOTIFICATIONS) ); -const fetchServiceChannelList = async () => { +const fetchServiceChannelList = async (serviceId: string) => { state.loading = true; try { - const { results } = await SpaceConnector.clientV2.alertManager.serviceChannel.list>({ - service_id: storeState.serviceId, - query: { - sort: [{ key: 'created_at', desc: true }], - }, - }); - state.items = (results || []).slice(0, 15); + await serviceDetailPageStore.fetchServiceChannelList(serviceId); } catch (e) { ErrorHandler.handleError(e); - state.items = []; } finally { state.loading = false; } @@ -88,7 +79,7 @@ const fetchServiceChannelList = async () => { watch(() => storeState.serviceId, (serviceId) => { if (!serviceId) return; - fetchServiceChannelList(); + fetchServiceChannelList(serviceId); }, { immediate: true }); @@ -100,9 +91,9 @@ watch(() => storeState.serviceId, (serviceId) => { font-weight="regular" />
storeState.serviceId, (serviceId) => {
-
diff --git a/apps/web/src/services/alert-manager/v2/components/ServiceList.vue b/apps/web/src/services/alert-manager/v2/components/ServiceList.vue index 68aac1297d..8768009464 100644 --- a/apps/web/src/services/alert-manager/v2/components/ServiceList.vue +++ b/apps/web/src/services/alert-manager/v2/components/ServiceList.vue @@ -1,36 +1,38 @@ + +
diff --git a/apps/web/src/services/alert-manager/v2/components/ServiceListContent.vue b/apps/web/src/services/alert-manager/v2/components/ServiceListContent.vue index 59a9692c15..e2514e95af 100644 --- a/apps/web/src/services/alert-manager/v2/components/ServiceListContent.vue +++ b/apps/web/src/services/alert-manager/v2/components/ServiceListContent.vue @@ -1,7 +1,7 @@ diff --git a/apps/web/src/services/project/v1/pages/ProjectSummaryPage.vue b/apps/web/src/services/project/v1/pages/ProjectSummaryPage.vue index 87446ccd1d..fdb83e4bee 100644 --- a/apps/web/src/services/project/v1/pages/ProjectSummaryPage.vue +++ b/apps/web/src/services/project/v1/pages/ProjectSummaryPage.vue @@ -11,8 +11,7 @@ import type { ListResponse } from '@/api-clients/_common/schema/api-verbs/list'; import type { ProjectAlertConfigListParameters } from '@/schema/monitoring/project-alert-config/api-verbs/list'; import type { ProjectAlertConfigModel } from '@/schema/monitoring/project-alert-config/model'; -import { useGlobalConfigSchemaStore } from '@/store/global-config-schema/global-config-schema-store'; - +import { useGlobalConfigUiAffectsSchema } from '@/lib/config/global-config/composables/use-global-config-ui-affects-schema'; import { MENU_ID } from '@/lib/menu/config'; import { useContentsAccessibility } from '@/common/composables/contents-accessibility'; @@ -34,13 +33,13 @@ interface Props { } const props = defineProps(); -const globalConfigSchemaStore = useGlobalConfigSchemaStore(); +const alertManagerUiAffectsSchema = useGlobalConfigUiAffectsSchema('ALERT_MANAGER'); const { visibleContents: visibleAssetContents } = useContentsAccessibility(MENU_ID.ASSET_INVENTORY); const { visibleContents: visibleAlertContents } = useContentsAccessibility(MENU_ID.ALERT_MANAGER); const state = reactive({ - visibleAlertTab: computed(() => visibleAlertContents.value && (globalConfigSchemaStore.state.uiAffectsSchema.ALERT_MANAGER?.visibleProjectAlertTab ?? false)), + visibleAlertTab: computed(() => visibleAlertContents.value && (alertManagerUiAffectsSchema.value?.visibleProjectAlertTab ?? false)), hasAlertConfig: false, deprecatedNotiVisible: true, }); diff --git a/apps/web/src/services/project/v1/stores/project-page-store.ts b/apps/web/src/services/project/v1/stores/project-page-store.ts index e9315e43f7..0774c56f7f 100644 --- a/apps/web/src/services/project/v1/stores/project-page-store.ts +++ b/apps/web/src/services/project/v1/stores/project-page-store.ts @@ -14,7 +14,7 @@ import type { ProjectUpdateParameters } from '@/api-clients/identity/project/sch import type { ProjectUpdateProjectTypeParameters } from '@/api-clients/identity/project/schema/api-verbs/update-project-type'; import type { ProjectModel } from '@/api-clients/identity/project/schema/model'; -import { useUserStore } from '@/store/user/user-store'; +import { useAuthorizationStore } from '@/store/authorization/authorization-store'; import getRandomId from '@/lib/random-id-generator'; @@ -24,13 +24,12 @@ import type { } from '@/common/modules/project/project-tree-type'; import { useProjectTree } from '@/common/modules/project/use-project-tree'; - const projectTreeHelper = useProjectTree(); export const useProjectPageStore = defineStore('page-project', () => { - const userStore = useUserStore(); + const authorizationStore = useAuthorizationStore(); const _state = reactive({ - currentRoleType: computed(() => userStore.state.currentRoleInfo?.roleType), + currentRoleType: computed(() => authorizationStore.state.currentRoleInfo?.roleType), }); const state = reactive({ projectTreeKey: getRandomId(), diff --git a/apps/web/src/services/project/v2/components/ProjectDeleteModal.vue b/apps/web/src/services/project/v2/components/ProjectDeleteModal.vue index 7fed8ddac8..6b37e69bf9 100644 --- a/apps/web/src/services/project/v2/components/ProjectDeleteModal.vue +++ b/apps/web/src/services/project/v2/components/ProjectDeleteModal.vue @@ -7,6 +7,7 @@ import { useQueryClient } from '@tanstack/vue-query'; import { useProjectGroupApi } from '@/api-clients/identity/project-group/composables/use-project-group-api'; import { useProjectApi } from '@/api-clients/identity/project/composables/use-project-api'; +import { useServiceQueryKey } from '@/query/query-key/use-service-query-key'; import { i18n as _i18n } from '@/translations'; import { useUserWorkspaceStore } from '@/store/app-context/workspace/user-workspace-store'; @@ -65,13 +66,16 @@ const handleConfirmDelete = async () => { }; const queryClient = useQueryClient(); -const { projectAPI, projectListQueryKey, projectQueryKey } = useProjectApi(); +const { projectAPI } = useProjectApi(); +const { key: projectListQueryKey } = useServiceQueryKey('identity', 'project', 'list'); +const { withSuffix: projectQueryKeyWithSuffix } = useServiceQueryKey('identity', 'project', 'get'); + const deleteProject = async (projectId: string) => { await projectAPI.delete({ project_id: projectId, }); queryClient.invalidateQueries({ queryKey: projectListQueryKey.value }); - queryClient.removeQueries({ queryKey: [...projectQueryKey.value, projectId] }); + queryClient.removeQueries({ queryKey: projectQueryKeyWithSuffix(projectId) }); await recentStore.deleteRecent({ type: RECENT_TYPE.PROJECT, itemId: projectId, @@ -86,13 +90,15 @@ const deleteProject = async (projectId: string) => { }); } }; -const { projectGroupAPI, projectGroupListQueryKey, projectGroupQueryKey } = useProjectGroupApi(); +const { projectGroupAPI } = useProjectGroupApi(); +const { key: projectGroupListQueryKey } = useServiceQueryKey('identity', 'project-group', 'list'); +const { withSuffix: projectGroupQueryKeyWithSuffix } = useServiceQueryKey('identity', 'project-group', 'get'); const deleteProjectGroup = async (projectGroupId: string) => { await projectGroupAPI.delete({ project_group_id: projectGroupId, }); queryClient.invalidateQueries({ queryKey: projectGroupListQueryKey.value }); - queryClient.removeQueries({ queryKey: [...projectGroupQueryKey.value, projectGroupId] }); + queryClient.removeQueries({ queryKey: projectGroupQueryKeyWithSuffix(projectGroupId) }); showSuccessMessage(_i18n.t('PROJECT.LANDING.ALT_S_DELETE_PROJECT_GROUP'), ''); const isFavoriteItem = favoriteGetters.projectGroupItems.find((item) => item.itemId === projectGroupId); if (isFavoriteItem) { diff --git a/apps/web/src/services/project/v2/components/ProjectGroupCreateModal.vue b/apps/web/src/services/project/v2/components/ProjectGroupCreateModal.vue index 7edba46885..777638b1e2 100644 --- a/apps/web/src/services/project/v2/components/ProjectGroupCreateModal.vue +++ b/apps/web/src/services/project/v2/components/ProjectGroupCreateModal.vue @@ -8,6 +8,7 @@ import { useMutation, useQueryClient } from '@tanstack/vue-query'; import { PButtonModal, PFieldGroup, PTextInput } from '@cloudforet/mirinae'; import { useProjectGroupApi } from '@/api-clients/identity/project-group/composables/use-project-group-api'; +import { useServiceQueryKey } from '@/query/query-key/use-service-query-key'; import { i18n } from '@/translations'; import { showSuccessMessage } from '@/lib/helper/notice-alert-helper'; @@ -56,7 +57,8 @@ watch(visible, (v) => { /* mutations */ -const { projectGroupAPI, projectGroupListQueryKey } = useProjectGroupApi(); +const { projectGroupAPI } = useProjectGroupApi(); +const { key: projectGroupListQueryKey } = useServiceQueryKey('identity', 'project-group', 'list'); const queryClient = useQueryClient(); const { mutateAsync: createProjectGroup, isPending: isCreating } = useMutation({ diff --git a/apps/web/src/services/project/v2/components/ProjectGroupMemberManagementModal.vue b/apps/web/src/services/project/v2/components/ProjectGroupMemberManagementModal.vue index 0aa0d15051..d86555394b 100644 --- a/apps/web/src/services/project/v2/components/ProjectGroupMemberManagementModal.vue +++ b/apps/web/src/services/project/v2/components/ProjectGroupMemberManagementModal.vue @@ -13,10 +13,11 @@ import type { SelectDropdownMenuItem } from '@cloudforet/mirinae/types/controls/ import { useProjectGroupApi } from '@/api-clients/identity/project-group/composables/use-project-group-api'; import type { ProjectGroupRemoveUsersParameters } from '@/api-clients/identity/project-group/schema/api-verbs/remove-users'; +import { ROLE_TYPE } from '@/api-clients/identity/role/constant'; import { i18n } from '@/translations'; +import { useAuthorizationStore } from '@/store/authorization/authorization-store'; import { useUserReferenceStore } from '@/store/reference/user-reference-store'; -import { useUserStore } from '@/store/user/user-store'; import { showSuccessMessage } from '@/lib/helper/notice-alert-helper'; @@ -31,8 +32,8 @@ const visible = computed(() => projectPageModalStore.state.projectGroupMemberMod const targetId = computed(() => projectPageModalStore.state.targetId); /* mode */ -const userStore = useUserStore(); -const readonlyMode = computed(() => userStore.state.currentRoleInfo?.roleType !== 'WORKSPACE_OWNER'); +const authorizationStore = useAuthorizationStore(); +const readonlyMode = computed(() => authorizationStore.state.currentRoleInfo?.roleType !== ROLE_TYPE.WORKSPACE_OWNER); /* project group users */ const { projectGroupAPI } = useProjectGroupApi(); diff --git a/apps/web/src/services/project/v2/components/ProjectGroupRenameModal.vue b/apps/web/src/services/project/v2/components/ProjectGroupRenameModal.vue index 30009af577..50103f140f 100644 --- a/apps/web/src/services/project/v2/components/ProjectGroupRenameModal.vue +++ b/apps/web/src/services/project/v2/components/ProjectGroupRenameModal.vue @@ -8,6 +8,7 @@ import { useMutation, useQueryClient } from '@tanstack/vue-query'; import { PButtonModal, PFieldGroup, PTextInput } from '@cloudforet/mirinae'; import { useProjectGroupApi } from '@/api-clients/identity/project-group/composables/use-project-group-api'; +import { useServiceQueryKey } from '@/query/query-key/use-service-query-key'; import { i18n } from '@/translations'; import { showSuccessMessage } from '@/lib/helper/notice-alert-helper'; @@ -66,7 +67,8 @@ watch([visible, projectGroup], async ([v, pg]) => { /* mutations */ -const { projectGroupAPI, projectGroupListQueryKey } = useProjectGroupApi(); +const { projectGroupAPI } = useProjectGroupApi(); +const { key: projectGroupListQueryKey } = useServiceQueryKey('identity', 'project-group', 'list'); const queryClient = useQueryClient(); const { mutateAsync: updateProjectGroup, isPending: isUpdating } = useMutation({ diff --git a/apps/web/src/services/project/v2/components/ProjectMoveModal.vue b/apps/web/src/services/project/v2/components/ProjectMoveModal.vue index b94237a42c..f5931a1111 100644 --- a/apps/web/src/services/project/v2/components/ProjectMoveModal.vue +++ b/apps/web/src/services/project/v2/components/ProjectMoveModal.vue @@ -6,10 +6,12 @@ import { useMutation, useQueryClient } from '@tanstack/vue-query'; import { PButtonModal, PRadio, PRadioGroup } from '@cloudforet/mirinae'; import { useProjectGroupApi } from '@/api-clients/identity/project-group/composables/use-project-group-api'; +import type { ProjectGroupModel } from '@/api-clients/identity/project-group/schema/model'; import { useProjectApi } from '@/api-clients/identity/project/composables/use-project-api'; +import type { ProjectModel } from '@/api-clients/identity/project/schema/model'; +import { useServiceQueryKey } from '@/query/query-key/use-service-query-key'; import { i18n } from '@/translations'; - import { showSuccessMessage } from '@/lib/helper/notice-alert-helper'; import ErrorHandler from '@/common/composables/error/errorHandler'; @@ -59,8 +61,12 @@ const getIsValid = (_isProject: boolean, selectProjectGroup: boolean, selectedPr }; /* mutations */ -const { projectAPI, projectListQueryKey, projectQueryKey } = useProjectApi(); -const { projectGroupAPI, projectGroupListQueryKey, projectGroupQueryKey } = useProjectGroupApi(); +const { projectAPI } = useProjectApi(); +const { key: projectListQueryKey } = useServiceQueryKey('identity', 'project', 'list'); +const { withSuffix: projectQueryKeyWithSuffix } = useServiceQueryKey('identity', 'project', 'get'); +const { projectGroupAPI } = useProjectGroupApi(); +const { key: projectGroupListQueryKey } = useServiceQueryKey('identity', 'project-group', 'list'); +const { withSuffix: projectGroupQueryKeyWithSuffix } = useServiceQueryKey('identity', 'project-group', 'get'); const queryClient = useQueryClient(); const { mutateAsync: changeProjectGroup } = useMutation({ @@ -68,25 +74,26 @@ const { mutateAsync: changeProjectGroup } = useMutation({ if (!targetId.value) throw new Error('No target id'); const _projectGroupId = state.selectProjectGroup ? state.selectedProjectGroupIdList[0] : null; if (isProject.value) { - await projectAPI.changeProjectGroup({ + return projectAPI.changeProjectGroup({ project_id: targetId.value, project_group_id: _projectGroupId, }); - } else { - await projectGroupAPI.changeParentGroup({ - project_group_id: targetId.value, - parent_group_id: _projectGroupId, - }); } + return projectGroupAPI.changeParentGroup({ + project_group_id: targetId.value, + parent_group_id: _projectGroupId, + }); }, - onSuccess: () => { + onSuccess: (data) => { showSuccessMessage(i18n.t('PROJECT.LANDING.ALT_S_UPDATE_PROJECT_GROUP'), ''); if (isProject.value) { + const _project = data as ProjectModel; queryClient.invalidateQueries({ queryKey: projectListQueryKey.value }); - queryClient.invalidateQueries({ queryKey: [...projectQueryKey.value, targetId.value] }); + queryClient.invalidateQueries({ queryKey: projectQueryKeyWithSuffix(_project.project_id) }); } else { + const _projectGroup = data as ProjectGroupModel; queryClient.invalidateQueries({ queryKey: projectGroupListQueryKey.value }); - queryClient.invalidateQueries({ queryKey: [...projectGroupQueryKey.value, targetId.value] }); + queryClient.invalidateQueries({ queryKey: projectGroupQueryKeyWithSuffix(_projectGroup.project_group_id) }); } }, onError: (e) => { diff --git a/apps/web/src/services/project/v2/composables/queries/use-project-query.ts b/apps/web/src/services/project/v2/composables/queries/use-project-query.ts index b05b3a6af5..ec5578186e 100644 --- a/apps/web/src/services/project/v2/composables/queries/use-project-query.ts +++ b/apps/web/src/services/project/v2/composables/queries/use-project-query.ts @@ -18,6 +18,7 @@ enabled?: Ref|boolean; }) => { const { projectAPI } = useProjectApi(); const { key: projectQueryKey, params } = useServiceQueryKey('identity', 'project', 'get', { + contextKey: projectId, params: computed(() => ({ project_id: projectId.value as string })), }); diff --git a/apps/web/src/services/service-account/pages/ServiceAccountDetailPage.vue b/apps/web/src/services/service-account/pages/ServiceAccountDetailPage.vue index be0610068c..19317e2daa 100644 --- a/apps/web/src/services/service-account/pages/ServiceAccountDetailPage.vue +++ b/apps/web/src/services/service-account/pages/ServiceAccountDetailPage.vue @@ -20,12 +20,11 @@ import type { TrustedAccountGetParameters } from '@/api-clients/identity/trusted import type { TrustedAccountModel } from '@/api-clients/identity/trusted-account/schema/model'; import { useAppContextStore } from '@/store/app-context/app-context-store'; +import { useAuthorizationStore } from '@/store/authorization/authorization-store'; import { useAllReferenceStore } from '@/store/reference/all-reference-store'; import type { ProjectReferenceMap } from '@/store/reference/project-reference-store'; import type { ProviderReferenceMap } from '@/store/reference/provider-reference-store'; -import { useUserStore } from '@/store/user/user-store'; -import type { PageAccessMap } from '@/lib/access-control/config'; import type { MenuId } from '@/lib/menu/config'; import { MENU_ID } from '@/lib/menu/config'; @@ -58,7 +57,7 @@ const serviceAccountSchemaStore = useServiceAccountSchemaStore(); const serviceAccountPageStore = useServiceAccountPageStore(); const allReferenceStore = useAllReferenceStore(); const appContextStore = useAppContextStore(); -const userStore = useUserStore(); +const authorizationStore = useAuthorizationStore(); const route = useRoute(); @@ -69,8 +68,7 @@ const storeState = reactive({ ? serviceAccountSchemaStore.getters.trustedAccountSchema?.options?.external_link : serviceAccountSchemaStore.getters.generalAccountSchema?.options?.external_link)), isAdminMode: computed(() => appContextStore.getters.isAdminMode), - isWorkspaceMember: computed(() => userStore.state.currentRoleInfo?.roleType === ROLE_TYPE.WORKSPACE_MEMBER), - pageAccessPermissionMap: computed(() => userStore.getters.pageAccessPermissionMap), + isWorkspaceMember: computed(() => authorizationStore.state.currentRoleInfo?.roleType === ROLE_TYPE.WORKSPACE_MEMBER), }); const state = reactive({ loading: true, @@ -83,7 +81,7 @@ const state = reactive({ } return targetMenuId; }), - hasReadWriteAccess: computed(() => storeState.pageAccessPermissionMap[state.selectedMenuId]?.write), + hasReadWriteAccess: computed(() => authorizationStore.getters.pageAccessPermissionMap[state.selectedMenuId]?.write), originServiceAccountItem: computed(() => serviceAccountPageStore.state.originServiceAccountItem), serviceAccountType: computed(() => serviceAccountPageStore.state.serviceAccountType), isTrustedAccount: computed(() => state.serviceAccountType === ACCOUNT_TYPE.TRUSTED), diff --git a/apps/web/src/services/service-account/pages/ServiceAccountPage.vue b/apps/web/src/services/service-account/pages/ServiceAccountPage.vue index 263aff2a68..b7fb65daf7 100644 --- a/apps/web/src/services/service-account/pages/ServiceAccountPage.vue +++ b/apps/web/src/services/service-account/pages/ServiceAccountPage.vue @@ -33,13 +33,13 @@ import { i18n } from '@/translations'; import { useAppContextStore } from '@/store/app-context/app-context-store'; import { useUserWorkspaceStore } from '@/store/app-context/workspace/user-workspace-store'; +import { useAuthorizationStore } from '@/store/authorization/authorization-store'; import { CURRENCY_SYMBOL } from '@/store/display/constant'; import type { Currency } from '@/store/display/type'; import { useAllReferenceStore } from '@/store/reference/all-reference-store'; import type { ProviderReferenceMap, ProviderItem } from '@/store/reference/provider-reference-store'; import { useUserStore } from '@/store/user/user-store'; -import type { PageAccessMap } from '@/lib/access-control/config'; import { dynamicFieldsToExcelDataFields } from '@/lib/excel-export'; import { FILE_NAME_PREFIX } from '@/lib/excel-export/constant'; import { downloadExcel } from '@/lib/helper/file-download-helper'; @@ -83,6 +83,7 @@ const userWorkspaceStore = useUserWorkspaceStore(); const appContextStore = useAppContextStore(); const allReferenceStore = useAllReferenceStore(); const userStore = useUserStore(); +const authorizationStore = useAuthorizationStore(); const { hasReadWriteAccess } = usePageEditableStatus(); @@ -90,7 +91,6 @@ const { referenceFieldFormatter } = useReferenceFieldFormatter(); const storeState = reactive({ - pageAccessPermissionMap: computed(() => userStore.getters.pageAccessPermissionMap), currency: computed(() => serviceAccountPageGetters.currency), }); const state = reactive({ @@ -107,7 +107,7 @@ const state = reactive({ selectedProviderName: computed(() => state.providers[state.selectedProvider]?.label), timezone: computed(() => userStore.state.timezone || 'UTC'), grantLoading: computed(() => appContextStore.getters.globalGrantLoading), - currentGrantInfo: computed(() => userStore.state.currentGrantInfo), + currentGrantInfo: computed(() => authorizationStore.state.currentGrantInfo), isAgentModeAccount: computed(() => state.selectedProvider === 'kubernetes'), }); @@ -130,7 +130,7 @@ const typeOptionState = reactive({ }); const tableState = reactive({ - isWorkspaceMember: computed(() => userStore.state.currentRoleInfo?.roleType === ROLE_TYPE.WORKSPACE_MEMBER), + isWorkspaceMember: computed(() => authorizationStore.state.currentRoleInfo?.roleType === ROLE_TYPE.WORKSPACE_MEMBER), items: [] as ServiceAccountModel[] | TrustedAccountModel[], schema: computed(() => (tableState.isTrustedAccount ? serviceAccountSchemaState.trustedAccountTableSchema : serviceAccountSchemaState.generalAccountTableSchema)), diff --git a/apps/web/src/services/service-account/routes/routes.ts b/apps/web/src/services/service-account/routes/routes.ts index 23dffa3474..f4b4827da1 100644 --- a/apps/web/src/services/service-account/routes/routes.ts +++ b/apps/web/src/services/service-account/routes/routes.ts @@ -1,8 +1,5 @@ import type { RouteConfig } from 'vue-router'; -import { pinia } from '@/store/pinia'; -import { useUserStore } from '@/store/user/user-store'; - import { getRedirectRouteByPagePermission } from '@/lib/access-control/redirect-route-helper'; import { MENU_ID } from '@/lib/menu/config'; import { MENU_INFO_MAP } from '@/lib/menu/menu-info'; @@ -18,11 +15,10 @@ const ServiceAccountDetailPage = () => import('@/services/service-account/pages/ const ServiceAccountAddPage = () => import('@/services/service-account/pages/ServiceAccountAddPage.vue'); -const userStore = useUserStore(pinia); const serviceAccountRoute: RouteConfig = { path: 'service-account', meta: { menuId: MENU_ID.SERVICE_ACCOUNT, translationId: MENU_INFO_MAP[MENU_ID.SERVICE_ACCOUNT].translationId }, - redirect: (to) => getRedirectRouteByPagePermission(to, userStore.getters.pageAccessPermissionMap), + redirect: (to) => getRedirectRouteByPagePermission(to), component: ServiceAccountContainer, children: [ { diff --git a/apps/web/src/services/workspace-home/components/BookmarkBoard.vue b/apps/web/src/services/workspace-home/components/BookmarkBoard.vue index 780465e3ee..df56488e71 100644 --- a/apps/web/src/services/workspace-home/components/BookmarkBoard.vue +++ b/apps/web/src/services/workspace-home/components/BookmarkBoard.vue @@ -13,7 +13,7 @@ import type { UserConfigModel } from '@/api-clients/config/user-config/schema/mo import { ROLE_TYPE } from '@/api-clients/identity/role/constant'; import { i18n } from '@/translations'; -import { useUserStore } from '@/store/user/user-store'; +import { useAuthorizationStore } from '@/store/authorization/authorization-store'; import { assetUrlConverter } from '@/lib/helper/asset-helper'; @@ -46,10 +46,10 @@ const bookmarkState = bookmarkStore.state; const workspaceHomePageStore = useWorkspaceHomePageStore(); const workspaceHomePageState = workspaceHomePageStore.state; const workspaceHomePageGetters = workspaceHomePageStore.getters; -const userStore = useUserStore(); +const authorizationStore = useAuthorizationStore(); const storeState = reactive({ - isWorkspaceMember: computed(() => userStore.state.currentRoleInfo?.roleType === ROLE_TYPE.WORKSPACE_MEMBER), + isWorkspaceMember: computed(() => authorizationStore.state.currentRoleInfo?.roleType === ROLE_TYPE.WORKSPACE_MEMBER), selectedBookmarks: computed(() => bookmarkState.selectedBookmarks), bookmarkType: computed(() => bookmarkState.bookmarkType), diff --git a/apps/web/src/services/workspace-home/components/BookmarkFullMode.vue b/apps/web/src/services/workspace-home/components/BookmarkFullMode.vue index 0270eb6583..d4b03ec7c6 100644 --- a/apps/web/src/services/workspace-home/components/BookmarkFullMode.vue +++ b/apps/web/src/services/workspace-home/components/BookmarkFullMode.vue @@ -3,7 +3,7 @@ import { computed, reactive } from 'vue'; import { ROLE_TYPE } from '@/api-clients/identity/role/constant'; -import { useUserStore } from '@/store/user/user-store'; +import { useAuthorizationStore } from '@/store/authorization/authorization-store'; import { useBookmarkStore } from '@/common/components/bookmark/store/bookmark-store'; import type { BookmarkItem } from '@/common/components/bookmark/type/type'; @@ -26,13 +26,13 @@ const bookmarkStore = useBookmarkStore(); const bookmarkState = bookmarkStore.state; const workspaceHomePageStore = useWorkspaceHomePageStore(); const workspaceHomePageState = workspaceHomePageStore.state; -const userStore = useUserStore(); +const authorizationStore = useAuthorizationStore(); const storeState = reactive({ bookmarkType: computed(() => bookmarkState.bookmarkType), isFileFullMode: computed(() => workspaceHomePageState.isFileFullMode), - isWorkspaceMember: computed(() => userStore.state.currentRoleInfo?.roleType === ROLE_TYPE.WORKSPACE_MEMBER), + isWorkspaceMember: computed(() => authorizationStore.state.currentRoleInfo?.roleType === ROLE_TYPE.WORKSPACE_MEMBER), }); diff --git a/apps/web/src/services/workspace-home/components/UserConfigRecent.vue b/apps/web/src/services/workspace-home/components/UserConfigRecent.vue index 829775d414..a9eadc905e 100644 --- a/apps/web/src/services/workspace-home/components/UserConfigRecent.vue +++ b/apps/web/src/services/workspace-home/components/UserConfigRecent.vue @@ -1,6 +1,6 @@ diff --git a/apps/web/src/services/workspace-home/components/WorkspaceInfo.vue b/apps/web/src/services/workspace-home/components/WorkspaceInfo.vue index b2c8a4ff1c..8d8e95d990 100644 --- a/apps/web/src/services/workspace-home/components/WorkspaceInfo.vue +++ b/apps/web/src/services/workspace-home/components/WorkspaceInfo.vue @@ -15,9 +15,8 @@ import { i18n } from '@/translations'; import { useAppContextStore } from '@/store/app-context/app-context-store'; import { useUserWorkspaceStore } from '@/store/app-context/workspace/user-workspace-store'; -import { useUserStore } from '@/store/user/user-store'; +import { useAuthorizationStore } from '@/store/authorization/authorization-store'; -import type { PageAccessMap } from '@/lib/access-control/config'; import { MENU_ID } from '@/lib/menu/config'; import FavoriteButton from '@/common/modules/favorites/favorite-button/FavoriteButton.vue'; @@ -51,7 +50,7 @@ const appPageStore = useAppPageStore(); const appContextStore = useAppContextStore(); const workspaceHomePageStore = useWorkspaceHomePageStore(); const workspaceHomePageState = workspaceHomePageStore.state; -const userStore = useUserStore(); +const authorizationStore = useAuthorizationStore(); const router = useRouter(); @@ -61,7 +60,6 @@ const storeState = reactive({ workspaceList: computed(() => userWorkspaceGetters.workspaceList), workspaceUserTotalCount: computed(() => workspaceHomePageState.workspaceUserTotalCount), appsTotalCount: computed(() => workspaceHomePageState.appsTotalCount), - pageAccessPermissionMap: computed(() => userStore.getters.pageAccessPermissionMap), }); const state = reactive({ selectedWorkspace: computed(() => storeState.workspaceList.find((workspace) => workspace.workspace_id === storeState.currentWorkspace?.workspace_id) || {} as WorkspaceModel), @@ -183,7 +181,7 @@ const routerToWorkspaceUser = (isOpenModal: boolean) => {
-