diff --git a/apps/web/src/api-clients/dashboard/_types/dashboard-global-variable-type.ts b/apps/web/src/api-clients/dashboard/_types/dashboard-global-variable-type.ts index ca49e1e6bd..4fc30a4703 100644 --- a/apps/web/src/api-clients/dashboard/_types/dashboard-global-variable-type.ts +++ b/apps/web/src/api-clients/dashboard/_types/dashboard-global-variable-type.ts @@ -1,5 +1,5 @@ // Base Model -import type { GLOBAL_VARIABLE_FILTER_TYPE_MAP } from '@/services/dashboards/constants/dashboard-global-variable'; +import type { GLOBAL_VARIABLE_FILTER_TYPE_MAP } from '@/services/dashboard-shared/dashboard-detail/constants/dashboard-global-variable'; interface DashboardGlobalVariableBase { key: string; // new_variable diff --git a/apps/web/src/api-clients/dashboard/_types/dashboard-type.ts b/apps/web/src/api-clients/dashboard/_types/dashboard-type.ts index c3f990a0f2..2bef51f950 100644 --- a/apps/web/src/api-clients/dashboard/_types/dashboard-type.ts +++ b/apps/web/src/api-clients/dashboard/_types/dashboard-type.ts @@ -13,6 +13,7 @@ import type { PrivateDashboardGetParameters } from '@/api-clients/dashboard/priv import type { PrivateDashboardListParameters } from '@/api-clients/dashboard/private-dashboard/schema/api-verbs/list'; import type { PrivateDashboardUpdateParameters } from '@/api-clients/dashboard/private-dashboard/schema/api-verbs/update'; import type { PrivateDashboardModel } from '@/api-clients/dashboard/private-dashboard/schema/model'; +import type { PrivateFolderModel } from '@/api-clients/dashboard/private-folder/schema/model'; import type { PublicDashboardChangeFolderParameters } from '@/api-clients/dashboard/public-dashboard/schema/api-verbs/change-folder'; import type { PublicDashboardCreateParameters } from '@/api-clients/dashboard/public-dashboard/schema/api-verbs/create'; import type { PublicDashboardDeleteParameters } from '@/api-clients/dashboard/public-dashboard/schema/api-verbs/delete'; @@ -20,16 +21,19 @@ import type { PublicDashboardGetParameters } from '@/api-clients/dashboard/publi import type { PublicDashboardListParameters } from '@/api-clients/dashboard/public-dashboard/schema/api-verbs/list'; import type { PublicDashboardUpdateParameters } from '@/api-clients/dashboard/public-dashboard/schema/api-verbs/update'; import type { PublicDashboardModel } from '@/api-clients/dashboard/public-dashboard/schema/model'; +import type { PublicFolderModel } from '@/api-clients/dashboard/public-folder/schema/model'; import type { VariableModelType } from '@/lib/variable-models'; import type { Value } from '@/lib/variable-models/_base/types'; + export type DashboardType = typeof DASHBOARD_TYPE[keyof typeof DASHBOARD_TYPE]; export type DashboardFolderType = 'PUBLIC'|'PRIVATE'; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore export type DashboardModel = PublicDashboardModel | PrivateDashboardModel; +export type DashboardFolderModel = PublicFolderModel | PrivateFolderModel; export type DashboardCreateParams = PublicDashboardCreateParameters | PrivateDashboardCreateParameters; export type DashboardChangeFolderParams = PublicDashboardChangeFolderParameters | PrivateDashboardChangeFolderParameters; export type DashboardListParams = PublicDashboardListParameters | PrivateDashboardListParameters; diff --git a/apps/web/src/api-clients/dashboard/public-dashboard/schema/api-verbs/create.ts b/apps/web/src/api-clients/dashboard/public-dashboard/schema/api-verbs/create.ts index fe5c4718e0..d615baf0a9 100644 --- a/apps/web/src/api-clients/dashboard/public-dashboard/schema/api-verbs/create.ts +++ b/apps/web/src/api-clients/dashboard/public-dashboard/schema/api-verbs/create.ts @@ -24,4 +24,5 @@ export interface PublicDashboardCreateParameters { workspace_id?: string; resource_group: Extract; project_id?: string; + project_group_id?: string; } diff --git a/apps/web/src/api-clients/dashboard/public-dashboard/schema/api-verbs/list.ts b/apps/web/src/api-clients/dashboard/public-dashboard/schema/api-verbs/list.ts index 02105bb824..3987bb3b5f 100644 --- a/apps/web/src/api-clients/dashboard/public-dashboard/schema/api-verbs/list.ts +++ b/apps/web/src/api-clients/dashboard/public-dashboard/schema/api-verbs/list.ts @@ -7,4 +7,5 @@ export interface PublicDashboardListParameters { name?: string; workspace_id?: string; project_id?: string; + project_group_id?: string; } diff --git a/apps/web/src/api-clients/dashboard/public-dashboard/schema/model.ts b/apps/web/src/api-clients/dashboard/public-dashboard/schema/model.ts index 5ae600ff6d..dc48203ef7 100644 --- a/apps/web/src/api-clients/dashboard/public-dashboard/schema/model.ts +++ b/apps/web/src/api-clients/dashboard/public-dashboard/schema/model.ts @@ -30,6 +30,7 @@ export interface PublicDashboardModel { folder_id: string; resource_group: Extract; project_id: string; + project_group_id: string; workspace_id: string; domain_id: string; created_at: string; diff --git a/apps/web/src/api-clients/dashboard/public-folder/schema/api-verbs/create.ts b/apps/web/src/api-clients/dashboard/public-folder/schema/api-verbs/create.ts index 76d46dcf06..65848de62e 100644 --- a/apps/web/src/api-clients/dashboard/public-folder/schema/api-verbs/create.ts +++ b/apps/web/src/api-clients/dashboard/public-folder/schema/api-verbs/create.ts @@ -9,4 +9,5 @@ export interface PublicFolderCreateParameters { dashboards?: string[]; workspace_id?: string; project_id?: string; + project_group_id?: string; } diff --git a/apps/web/src/api-clients/dashboard/public-folder/schema/api-verbs/list.ts b/apps/web/src/api-clients/dashboard/public-folder/schema/api-verbs/list.ts index 5e48ae7302..69bf18aae1 100644 --- a/apps/web/src/api-clients/dashboard/public-folder/schema/api-verbs/list.ts +++ b/apps/web/src/api-clients/dashboard/public-folder/schema/api-verbs/list.ts @@ -7,4 +7,5 @@ export interface PublicFolderListParameters { name?: string; workspace_id?: string; project_id?: string; + project_group_id?: string; } diff --git a/apps/web/src/api-clients/dashboard/public-folder/schema/model.ts b/apps/web/src/api-clients/dashboard/public-folder/schema/model.ts index 424b1471ea..97a58f9209 100644 --- a/apps/web/src/api-clients/dashboard/public-folder/schema/model.ts +++ b/apps/web/src/api-clients/dashboard/public-folder/schema/model.ts @@ -10,6 +10,7 @@ export interface PublicFolderModel { tags: Tags; resource_group: Extract; project_id: string; + project_group_id: string; workspace_id: string; domain_id: string; created_at: string; diff --git a/apps/web/src/common/modules/widgets/_components/WidgetFormDataSourcePopover.vue b/apps/web/src/common/modules/widgets/_components/WidgetFormDataSourcePopover.vue index 704b65edfc..a03e6240bc 100644 --- a/apps/web/src/common/modules/widgets/_components/WidgetFormDataSourcePopover.vue +++ b/apps/web/src/common/modules/widgets/_components/WidgetFormDataSourcePopover.vue @@ -47,8 +47,8 @@ import type { DataTableDataType, DataTableSourceType, DataTableOperator, DataTableAddOptions, DataTableTransformOptions, } from '@/common/modules/widgets/types/widget-model'; -import { useDashboardGetQuery } from '@/services/dashboards/shared/composables/use-dashboard-get-query'; -import { useDashboardWidgetListQuery } from '@/services/dashboards/shared/composables/use-dashboard-widget-list-query'; +import { useDashboardGetQuery } from '@/services/dashboard-shared/dashboard-detail/composables/use-dashboard-get-query'; +import { useDashboardWidgetListQuery } from '@/services/dashboard-shared/dashboard-detail/composables/use-dashboard-widget-list-query'; const widgetGenerateStore = useWidgetGenerateStore(); const widgetGenerateState = widgetGenerateStore.state; diff --git a/apps/web/src/common/modules/widgets/_components/WidgetFormDataTableCardFiltersItem.vue b/apps/web/src/common/modules/widgets/_components/WidgetFormDataTableCardFiltersItem.vue index f45957a4cf..ef194f9a8b 100644 --- a/apps/web/src/common/modules/widgets/_components/WidgetFormDataTableCardFiltersItem.vue +++ b/apps/web/src/common/modules/widgets/_components/WidgetFormDataTableCardFiltersItem.vue @@ -26,8 +26,8 @@ import type { DataTableQueryFilterForDropdown } from '@/common/modules/widgets/t import { blue, gray } from '@/styles/colors'; -import { getOrderedGlobalVariables } from '@/services/dashboards/helpers/dashboard-global-variables-helper'; -import { useDashboardGetQuery } from '@/services/dashboards/shared/composables/use-dashboard-get-query'; +import { useDashboardGetQuery } from '@/services/dashboard-shared/dashboard-detail/composables/use-dashboard-get-query'; +import { getOrderedGlobalVariables } from '@/services/dashboard-shared/dashboard-detail/helpers/dashboard-global-variables-helper'; interface Props { diff --git a/apps/web/src/common/modules/widgets/_components/WidgetFormDataTableCardTransformContents.vue b/apps/web/src/common/modules/widgets/_components/WidgetFormDataTableCardTransformContents.vue index 0545d134c6..c2261ee52e 100644 --- a/apps/web/src/common/modules/widgets/_components/WidgetFormDataTableCardTransformContents.vue +++ b/apps/web/src/common/modules/widgets/_components/WidgetFormDataTableCardTransformContents.vue @@ -62,7 +62,7 @@ import type { JoinOptions, ValueMappingOptions, ConcatOptions, AggregateOptions, AggregateFunction, } from '@/common/modules/widgets/types/widget-model'; -import { useDashboardGetQuery } from '@/services/dashboards/shared/composables/use-dashboard-get-query'; +import { useDashboardGetQuery } from '@/services/dashboard-shared/dashboard-detail/composables/use-dashboard-get-query'; diff --git a/apps/web/src/common/modules/widgets/_components/WidgetFormDataTableGlobalVariableViewButton.vue b/apps/web/src/common/modules/widgets/_components/WidgetFormDataTableGlobalVariableViewButton.vue index 6d15bb0bf5..b395f0c58c 100644 --- a/apps/web/src/common/modules/widgets/_components/WidgetFormDataTableGlobalVariableViewButton.vue +++ b/apps/web/src/common/modules/widgets/_components/WidgetFormDataTableGlobalVariableViewButton.vue @@ -7,8 +7,8 @@ import { PButton, PPopover, PCopyButton } from '@cloudforet/mirinae'; import type { DashboardGlobalVariable } from '@/api-clients/dashboard/_types/dashboard-global-variable-type'; -import { getOrderedGlobalVariables } from '@/services/dashboards/helpers/dashboard-global-variables-helper'; -import { useDashboardGetQuery } from '@/services/dashboards/shared/composables/use-dashboard-get-query'; +import { useDashboardGetQuery } from '@/services/dashboard-shared/dashboard-detail/composables/use-dashboard-get-query'; +import { getOrderedGlobalVariables } from '@/services/dashboard-shared/dashboard-detail/helpers/dashboard-global-variables-helper'; const route = useRoute(); const dashboardId = computed(() => route.params.dashboardId); diff --git a/apps/web/src/common/modules/widgets/_components/WidgetFormOverlayPreviewTable.vue b/apps/web/src/common/modules/widgets/_components/WidgetFormOverlayPreviewTable.vue index a24e973a4b..c27180a1c7 100644 --- a/apps/web/src/common/modules/widgets/_components/WidgetFormOverlayPreviewTable.vue +++ b/apps/web/src/common/modules/widgets/_components/WidgetFormOverlayPreviewTable.vue @@ -40,7 +40,7 @@ import { gray, white } from '@/styles/colors'; import { SIZE_UNITS } from '@/services/asset-inventory/constants/asset-analysis-constant'; import { GRANULARITY } from '@/services/cost-explorer/constants/cost-explorer-constant'; import type { Granularity } from '@/services/cost-explorer/types/cost-explorer-query-type'; -import { useDashboardGetQuery } from '@/services/dashboards/shared/composables/use-dashboard-get-query'; +import { useDashboardGetQuery } from '@/services/dashboard-shared/dashboard-detail/composables/use-dashboard-get-query'; diff --git a/apps/web/src/common/modules/widgets/_components/WidgetFormOverlayStep2.vue b/apps/web/src/common/modules/widgets/_components/WidgetFormOverlayStep2.vue index f72a279d63..b6319938af 100644 --- a/apps/web/src/common/modules/widgets/_components/WidgetFormOverlayStep2.vue +++ b/apps/web/src/common/modules/widgets/_components/WidgetFormOverlayStep2.vue @@ -35,11 +35,11 @@ import WidgetFieldValueManager from '@/common/modules/widgets/_widget-field-valu import type { DataTableModel } from '@/common/modules/widgets/types/widget-data-table-type'; import type { WidgetType } from '@/common/modules/widgets/types/widget-model'; -import DashboardToolsetDateDropdown from '@/services/dashboards/shared/components/DashboardToolsetDateDropdown.vue'; -import DashboardVariablesV2 from '@/services/dashboards/shared/components/DashboardVariablesV2.vue'; -import { useDashboardGetQuery } from '@/services/dashboards/shared/composables/use-dashboard-get-query'; -import { useDashboardWidgetListQuery } from '@/services/dashboards/shared/composables/use-dashboard-widget-list-query'; -import { useDashboardDetailInfoStore } from '@/services/dashboards/shared/stores/dashboard-detail-info-store'; +import DashboardToolsetDateDropdown from '@/services/dashboard-shared/dashboard-detail/components/DashboardToolsetDateDropdown.vue'; +import DashboardVariablesV2 from '@/services/dashboard-shared/dashboard-detail/components/DashboardVariablesV2.vue'; +import { useDashboardGetQuery } from '@/services/dashboard-shared/dashboard-detail/composables/use-dashboard-get-query'; +import { useDashboardWidgetListQuery } from '@/services/dashboard-shared/dashboard-detail/composables/use-dashboard-widget-list-query'; +import { useDashboardDetailInfoStore } from '@/services/dashboard-shared/dashboard-detail/stores/dashboard-detail-info-store'; import type { AllReferenceTypeInfo } from '@/services/dashboards/stores/all-reference-type-info-store'; import { useAllReferenceTypeInfoStore, @@ -318,6 +318,7 @@ onUnmounted(() => { /> diff --git a/apps/web/src/common/modules/widgets/_composables/use-widget-data-table-query.ts b/apps/web/src/common/modules/widgets/_composables/use-widget-data-table-query.ts index 032d0fa9cb..46fc9794e1 100644 --- a/apps/web/src/common/modules/widgets/_composables/use-widget-data-table-query.ts +++ b/apps/web/src/common/modules/widgets/_composables/use-widget-data-table-query.ts @@ -3,7 +3,6 @@ import { computed } from 'vue'; import { useScopedQuery } from '@/api-clients/_common/composables/use-scoped-query'; import { usePrivateDataTableApi } from '@/api-clients/dashboard/private-data-table/composables/use-private-data-table-api'; -import type { DataTableGetParameters } from '@/api-clients/dashboard/private-data-table/schema/api-verbs/get'; import { usePublicDataTableApi } from '@/api-clients/dashboard/public-data-table/composables/use-public-data-table-api'; import { useServiceQueryKey } from '@/query/query-key/use-service-query-key'; @@ -15,28 +14,25 @@ export const useWidgetDataTableQuery = (dataTableId: ComputedRef { - if (!dataTableId.value) return false; - return dataTableId.value.startsWith('private'); - }); + const isPrivate = computed(() => dataTableId.value?.startsWith('private')); const { key: publicKey, params: publicParams } = useServiceQueryKey('dashboard', 'public-data-table', 'get', { contextKey: dataTableId, - params: { - data_table_id: dataTableId.value, - } as DataTableGetParameters, + params: computed(() => ({ + data_table_id: dataTableId.value as string, + })), }); const { key: privateKey, params: privateParams } = useServiceQueryKey('dashboard', 'private-data-table', 'get', { contextKey: dataTableId, - params: { - data_table_id: dataTableId.value, - } as DataTableGetParameters, + params: computed(() => ({ + data_table_id: dataTableId.value as string, + })), }); const privateDataTableQuery = useScopedQuery({ queryKey: privateKey, queryFn: () => { - if (!dataTableId.value) { + if (!privateParams.value.data_table_id) { throw new Error('DataTable ID is required for fetching data'); } return privateDataTableAPI.get(privateParams.value); @@ -48,7 +44,7 @@ export const useWidgetDataTableQuery = (dataTableId: ComputedRef { - if (!dataTableId.value) { + if (!publicParams.value.data_table_id) { throw new Error('DataTable ID is required for fetching data'); } return publicDataTableAPI.get(publicParams.value); diff --git a/apps/web/src/common/modules/widgets/_helpers/__tests__/widget-chart-data-helper.test.ts b/apps/web/src/common/modules/widgets/_helpers/__tests__/widget-chart-data-helper.test.ts index 9619e60bc5..5965cb2597 100644 --- a/apps/web/src/common/modules/widgets/_helpers/__tests__/widget-chart-data-helper.test.ts +++ b/apps/web/src/common/modules/widgets/_helpers/__tests__/widget-chart-data-helper.test.ts @@ -1,7 +1,7 @@ import { range } from 'lodash'; import { describe, it, expect } from 'vitest'; -import { getRefinedXYChartData } from '@/services/dashboards/widgets/_helpers/widget-chart-data-helper'; +import { getRefinedXYChartData } from '@/services/dashboard-shared/dashboard-detail/legacy/widgets/_helpers/widget-chart-data-helper'; interface SubData { date: string; diff --git a/apps/web/src/common/modules/widgets/_helpers/__tests__/widget-inherit-options-helper.test.ts b/apps/web/src/common/modules/widgets/_helpers/__tests__/widget-inherit-options-helper.test.ts index b7f20f2a23..9077d786dc 100644 --- a/apps/web/src/common/modules/widgets/_helpers/__tests__/widget-inherit-options-helper.test.ts +++ b/apps/web/src/common/modules/widgets/_helpers/__tests__/widget-inherit-options-helper.test.ts @@ -7,7 +7,7 @@ import type { InheritOptions, WidgetConfig, WidgetOptionsSchema } from '@/api-cl import { getInheritingOptionKeys, getInitialWidgetInheritOptions, -} from '@/services/dashboards/widgets/_helpers/widget-inherit-options-helper'; +} from '@/services/dashboard-shared/dashboard-detail/legacy/widgets/_helpers/widget-inherit-options-helper'; diff --git a/apps/web/src/common/modules/widgets/_helpers/__tests__/widget-options-filters-helper.test.ts b/apps/web/src/common/modules/widgets/_helpers/__tests__/widget-options-filters-helper.test.ts index 61d4f9a8a7..359560bdc2 100644 --- a/apps/web/src/common/modules/widgets/_helpers/__tests__/widget-options-filters-helper.test.ts +++ b/apps/web/src/common/modules/widgets/_helpers/__tests__/widget-options-filters-helper.test.ts @@ -1,6 +1,6 @@ import type { WidgetFilterKey, WidgetFiltersMap } from '@/api-clients/dashboard/_types/widget-type'; -import { setFilterAndGetWidgetFiltersMap } from '@/services/dashboards/widgets/_helpers/widget-options-filters-helper'; +import { setFilterAndGetWidgetFiltersMap } from '@/services/dashboard-shared/dashboard-detail/legacy/widgets/_helpers/widget-options-filters-helper'; describe('[Widget Options Filters Helper] setFilterAndGetWidgetFiltersMap', () => { diff --git a/apps/web/src/common/modules/widgets/_helpers/__tests__/widget-schema-helper.test.ts b/apps/web/src/common/modules/widgets/_helpers/__tests__/widget-schema-helper.test.ts index 611ed71954..5124b9f446 100644 --- a/apps/web/src/common/modules/widgets/_helpers/__tests__/widget-schema-helper.test.ts +++ b/apps/web/src/common/modules/widgets/_helpers/__tests__/widget-schema-helper.test.ts @@ -6,7 +6,7 @@ import type { InheritOptions, WidgetConfig, WidgetOptions } from '@/api-clients/ import { getInitialSchemaProperties, getNonInheritedWidgetOptionNamesAmongUsedVariables, getRefinedSchemaProperties, getWidgetOptionKeyByVariableKey, -} from '@/services/dashboards/widgets/_helpers/widget-schema-helper'; +} from '@/services/dashboard-shared/dashboard-detail/legacy/widgets/_helpers/widget-schema-helper'; const DEFAULT_WIDGET_CONFIG = { widget_config_id: 'test', diff --git a/apps/web/src/common/modules/widgets/_helpers/__tests__/widget-value-label-helper.test.ts b/apps/web/src/common/modules/widgets/_helpers/__tests__/widget-value-label-helper.test.ts index 2f2235dbac..fa2d73a449 100644 --- a/apps/web/src/common/modules/widgets/_helpers/__tests__/widget-value-label-helper.test.ts +++ b/apps/web/src/common/modules/widgets/_helpers/__tests__/widget-value-label-helper.test.ts @@ -1,7 +1,7 @@ import { describe } from 'vitest'; +import { getWidgetValueLabel } from '@/services/dashboard-shared/dashboard-detail/legacy/widgets/_helpers/widget-value-label-helper'; import type { AllReferenceTypeInfo } from '@/services/dashboards/stores/all-reference-type-info-store'; -import { getWidgetValueLabel } from '@/services/dashboards/widgets/_helpers/widget-value-label-helper'; const mockAllReferenceTypeInfo: AllReferenceTypeInfo = { provider: { diff --git a/apps/web/src/common/modules/widgets/_widget-fields/date-range/WidgetFieldDateRange.vue b/apps/web/src/common/modules/widgets/_widget-fields/date-range/WidgetFieldDateRange.vue index 2336606ba9..03e5c14be1 100644 --- a/apps/web/src/common/modules/widgets/_widget-fields/date-range/WidgetFieldDateRange.vue +++ b/apps/web/src/common/modules/widgets/_widget-fields/date-range/WidgetFieldDateRange.vue @@ -34,7 +34,7 @@ import type { WidgetFieldComponentProps, } from '@/common/modules/widgets/types/widget-field-type'; -import { useDashboardDetailInfoStore } from '@/services/dashboards/shared/stores/dashboard-detail-info-store'; +import { useDashboardDetailInfoStore } from '@/services/dashboard-shared/dashboard-detail/stores/dashboard-detail-info-store'; const GRANULARITY_UNIT_MAP = { MONTHLY: { singular: 'Month', plural: 'Months' }, diff --git a/apps/web/src/services/dashboard-shared/_composables/use-dashboard-route-context.ts b/apps/web/src/services/dashboard-shared/_composables/use-dashboard-route-context.ts new file mode 100644 index 0000000000..1f47623d60 --- /dev/null +++ b/apps/web/src/services/dashboard-shared/_composables/use-dashboard-route-context.ts @@ -0,0 +1,56 @@ +// composables/useDashboardRouteContext.ts +import { computed } from 'vue'; +import { useRoute } from 'vue-router/composables'; + +import { useAppContextStore } from '@/store/app-context/app-context-store'; + +import { MENU_ID } from '@/lib/menu/config'; + +type EntryPoint = 'ADMIN' | 'WORKSPACE' | 'PROJECT' | 'UNKNOWN'; +type ProjectContextType = 'PROJECT' | 'PROJECT_GROUP' | undefined; + +/** + * Provides contextual information about the current dashboard route. + * + * - `entryPoint` tells where this dashboard page is accessed from. + * - If `entryPoint === 'PROJECT'`, then `projectGroupOrProjectId` and `projectContextType` will be available. + * (Business logic guarantees this, though they are optional in the type system.) + * - Use `entryPoint === 'PROJECT'` check before using project-specific fields. + */ +export const useDashboardRouteContext = () => { + const route = useRoute(); + const appContextStore = useAppContextStore(); + + const isAdminMode = computed(() => appContextStore.getters.isAdminMode); + + const entryPoint = computed(() => { + // Global admin mode overrides route-level checks + if (isAdminMode.value) return 'ADMIN'; + + // Project dashboard route (nested under project-level menu) + if (route.matched.some((m) => m.meta.menuId === MENU_ID.PROJECT)) return 'PROJECT'; + if (route.matched.some((m) => m.meta.menuId === MENU_ID.DASHBOARDS)) return 'WORKSPACE'; + return 'UNKNOWN'; + }); + + const projectGroupOrProjectId = computed(() => { + if (entryPoint.value !== 'PROJECT') return undefined; + const id = route.params.projectGroupOrProjectId; + return typeof id === 'string' ? id : undefined; + }); + + const projectContextType = computed(() => { + const id = projectGroupOrProjectId.value; + if (!id) return undefined; + if (id.startsWith('pg-')) return 'PROJECT_GROUP'; + if (id.startsWith('project-')) return 'PROJECT'; + return undefined; + }); + + return { + entryPoint, + isAdminMode, + projectGroupOrProjectId, + projectContextType, + }; +}; diff --git a/apps/web/src/services/dashboard-shared/dashboard-create/DashboardCreateBody.vue b/apps/web/src/services/dashboard-shared/dashboard-create/DashboardCreateBody.vue new file mode 100644 index 0000000000..08ebaad752 --- /dev/null +++ b/apps/web/src/services/dashboard-shared/dashboard-create/DashboardCreateBody.vue @@ -0,0 +1,151 @@ + + + + + + + diff --git a/apps/web/src/services/dashboards/components/dashboard-create/DashboardCreateBlankBoardItem.vue b/apps/web/src/services/dashboard-shared/dashboard-create/components/DashboardCreateBlankBoardItem.vue similarity index 97% rename from apps/web/src/services/dashboards/components/dashboard-create/DashboardCreateBlankBoardItem.vue rename to apps/web/src/services/dashboard-shared/dashboard-create/components/DashboardCreateBlankBoardItem.vue index f6754aded9..1bd0e43db5 100644 --- a/apps/web/src/services/dashboards/components/dashboard-create/DashboardCreateBlankBoardItem.vue +++ b/apps/web/src/services/dashboard-shared/dashboard-create/components/DashboardCreateBlankBoardItem.vue @@ -4,8 +4,7 @@ import { } from '@cloudforet/mirinae'; import type { BoardSet } from '@cloudforet/mirinae/types/data-display/board/type'; -import { useDashboardCreatePageStore } from '@/services/dashboards/stores/dashboard-create-page-store'; - +import { useDashboardCreatePageStore } from '@/services/dashboard-shared/dashboard-create/stores/dashboard-create-page-store'; interface Props { templateSets: BoardSet[]; diff --git a/apps/web/src/services/dashboards/components/dashboard-create/DashboardCreateScopeForm.vue b/apps/web/src/services/dashboard-shared/dashboard-create/components/DashboardCreateScopeForm.vue similarity index 98% rename from apps/web/src/services/dashboards/components/dashboard-create/DashboardCreateScopeForm.vue rename to apps/web/src/services/dashboard-shared/dashboard-create/components/DashboardCreateScopeForm.vue index c1d2b7a9ed..7ad4678a96 100644 --- a/apps/web/src/services/dashboards/components/dashboard-create/DashboardCreateScopeForm.vue +++ b/apps/web/src/services/dashboard-shared/dashboard-create/components/DashboardCreateScopeForm.vue @@ -18,7 +18,7 @@ import { useUserStore } from '@/store/user/user-store'; import WorkspaceLogoIcon from '@/common/modules/navigations/top-bar/modules/top-bar-header/WorkspaceLogoIcon.vue'; -import { useDashboardCreatePageStore } from '@/services/dashboards/stores/dashboard-create-page-store'; +import { useDashboardCreatePageStore } from '@/services/dashboard-shared/dashboard-create/stores/dashboard-create-page-store'; diff --git a/apps/web/src/services/dashboards/components/dashboard-create/DashboardCreateStep1.vue b/apps/web/src/services/dashboard-shared/dashboard-create/components/DashboardCreateStep1.vue similarity index 68% rename from apps/web/src/services/dashboards/components/dashboard-create/DashboardCreateStep1.vue rename to apps/web/src/services/dashboard-shared/dashboard-create/components/DashboardCreateStep1.vue index 1d981d2c5d..2edbaa6652 100644 --- a/apps/web/src/services/dashboards/components/dashboard-create/DashboardCreateStep1.vue +++ b/apps/web/src/services/dashboard-shared/dashboard-create/components/DashboardCreateStep1.vue @@ -14,49 +14,31 @@ import type { DashboardModel } from '@/api-clients/dashboard/_types/dashboard-ty import type { DashboardTemplateModel } from '@/schema/repository/dashboard-template/model'; import { i18n } from '@/translations'; -import { useAppContextStore } from '@/store/app-context/app-context-store'; - -import DashboardCreateBlankBoardItem from '@/services/dashboards/components/dashboard-create/DashboardCreateBlankBoardItem.vue'; -import type { FilterLabelItem } from '@/services/dashboards/components/dashboard-create/DashboardCreateStep1SearchFilter.vue'; -import DashboardCreateStep1SearchFilter from '@/services/dashboards/components/dashboard-create/DashboardCreateStep1SearchFilter.vue'; +import { useDashboardRouteContext } from '@/services/dashboard-shared/_composables/use-dashboard-route-context'; +import DashboardCreateBlankBoardItem from '@/services/dashboard-shared/dashboard-create/components/DashboardCreateBlankBoardItem.vue'; +import type { FilterLabelItem } from '@/services/dashboard-shared/dashboard-create/components/DashboardCreateStep1SearchFilter.vue'; +import DashboardCreateStep1SearchFilter from '@/services/dashboard-shared/dashboard-create/components/DashboardCreateStep1SearchFilter.vue'; +import { useDashboardCreatePageStore } from '@/services/dashboard-shared/dashboard-create/stores/dashboard-create-page-store'; import DashboardFolderTree from '@/services/dashboards/components/dashboard-folder/DashboardFolderTree.vue'; -import { useDashboardQuery } from '@/services/dashboards/composables/use-dashboard-query'; import { ADMIN_DASHBOARDS_ROUTE } from '@/services/dashboards/routes/admin/route-constant'; import { DASHBOARDS_ROUTE } from '@/services/dashboards/routes/route-constant'; -import { useDashboardCreatePageStore } from '@/services/dashboards/stores/dashboard-create-page-store'; import type { DashboardTreeDataType } from '@/services/dashboards/types/dashboard-folder-type'; +import { PROJECT_ROUTE_V2 } from '@/services/project/v2/routes/route-constant'; +interface Props { + dashboardItems: Array; +} - +const props = defineProps(); const emit = defineEmits<{(e: 'click-next'): void }>(); const router = useRouter(); -const appContextStore = useAppContextStore(); const dashboardCreatePageStore = useDashboardCreatePageStore(); const dashboardCreatePageState = dashboardCreatePageStore.state; const dashboardCreatePageGetters = dashboardCreatePageStore.getters; - -/* Query */ -const { - publicDashboardList, - privateDashboardList, -} = useDashboardQuery(); - -const queryState = reactive({ - publicDashboardItems: computed(() => { - const _v2DashboardItems = publicDashboardList.value.filter((d) => d.version !== '1.0'); - if (storeState.isAdminMode) return _v2DashboardItems; - return _v2DashboardItems.filter((d) => !(d.resource_group === 'DOMAIN' && !!d.shared && d.scope === 'PROJECT')); - }), - privateDashboardItems: computed(() => privateDashboardList.value.filter((d) => d.version !== '1.0')), - allDashboardItems: computed(() => [...queryState.publicDashboardItems, ...queryState.privateDashboardItems]), -}); - -const storeState = reactive({ - isAdminMode: computed(() => appContextStore.getters.isAdminMode), -}); +const { entryPoint, projectGroupOrProjectId } = useDashboardRouteContext(); const state = reactive({ templates: [] as DashboardTemplateModel[], @@ -83,7 +65,7 @@ const state = reactive({ }), allExistingLabels: computed(() => { const _ootbTemplates = getFilteredTemplates(dashboardCreatePageState.dashboardTemplates, '', [], []); - const _existingTemplates = getFilteredTemplates(queryState.allDashboardItems, '', [], []); + const _existingTemplates = getFilteredTemplates(props.dashboardItems, '', [], []); const _ootbLabels = flatMapDeep(_ootbTemplates.map((d) => d.labels ?? [])); const _existingLabels = flatMapDeep(_existingTemplates.map((d) => d.labels ?? [])); @@ -121,10 +103,22 @@ const handleSelectProvider = (providers: FilterLabelItem[]) => { filterState.selectedProviders = providers.map((d) => d.label.toLowerCase()); }; const handleClickCancel = () => { - const dashboardRouteName = storeState.isAdminMode - ? ADMIN_DASHBOARDS_ROUTE._NAME - : DASHBOARDS_ROUTE._NAME; - router.push({ name: dashboardRouteName }).catch(() => {}); + if (entryPoint.value === 'ADMIN') { + router.push({ name: ADMIN_DASHBOARDS_ROUTE._NAME }).catch(() => {}); + } else if (entryPoint.value === 'PROJECT' && projectGroupOrProjectId.value) { + router.push({ + name: PROJECT_ROUTE_V2._NAME, + params: { + projectGroupOrProjectId: projectGroupOrProjectId.value, + }, + }).catch(() => {}); + } else if (entryPoint.value === 'WORKSPACE') { + router.push({ + name: DASHBOARDS_ROUTE._NAME, + }).catch(() => {}); + } else { + console.error('Invalid entry point'); + } }; onMounted(() => { @@ -134,33 +128,6 @@ onMounted(() => {