diff --git a/apps/web/src/common/components/buttons/ActionMenuButton.vue b/apps/web/src/common/components/buttons/ActionMenuButton.vue index 8a6d6a3226..f46507e21c 100644 --- a/apps/web/src/common/components/buttons/ActionMenuButton.vue +++ b/apps/web/src/common/components/buttons/ActionMenuButton.vue @@ -1,8 +1,10 @@ diff --git a/apps/web/src/common/modules/navigations/new-lsb/LSBItem.vue b/apps/web/src/common/modules/navigations/new-lsb/LSBItem.vue new file mode 100644 index 0000000000..60d913cb39 --- /dev/null +++ b/apps/web/src/common/modules/navigations/new-lsb/LSBItem.vue @@ -0,0 +1,62 @@ + + + + diff --git a/apps/web/src/common/modules/navigations/new-lsb/LSBRouterButton.vue b/apps/web/src/common/modules/navigations/new-lsb/LSBRouterButton.vue deleted file mode 100644 index 66e1926335..0000000000 --- a/apps/web/src/common/modules/navigations/new-lsb/LSBRouterButton.vue +++ /dev/null @@ -1,84 +0,0 @@ - - - - - diff --git a/apps/web/src/common/modules/navigations/new-lsb/LSBRouterItem.vue b/apps/web/src/common/modules/navigations/new-lsb/LSBRouterItem.vue deleted file mode 100644 index d0c0e8f5c8..0000000000 --- a/apps/web/src/common/modules/navigations/new-lsb/LSBRouterItem.vue +++ /dev/null @@ -1,152 +0,0 @@ - - - - - diff --git a/apps/web/src/common/modules/navigations/new-lsb/LSBStarredTree.vue b/apps/web/src/common/modules/navigations/new-lsb/LSBStarredTree.vue new file mode 100644 index 0000000000..b0a061fe9f --- /dev/null +++ b/apps/web/src/common/modules/navigations/new-lsb/LSBStarredTree.vue @@ -0,0 +1,48 @@ + + + diff --git a/apps/web/src/common/modules/navigations/new-lsb/LSBTitle.vue b/apps/web/src/common/modules/navigations/new-lsb/LSBTitle.vue new file mode 100644 index 0000000000..11e7a51d50 --- /dev/null +++ b/apps/web/src/common/modules/navigations/new-lsb/LSBTitle.vue @@ -0,0 +1,48 @@ + + + diff --git a/apps/web/src/common/modules/navigations/new-lsb/LSBTopTitle.vue b/apps/web/src/common/modules/navigations/new-lsb/LSBTopTitle.vue deleted file mode 100644 index 4fcc1fc8c0..0000000000 --- a/apps/web/src/common/modules/navigations/new-lsb/LSBTopTitle.vue +++ /dev/null @@ -1,41 +0,0 @@ - - - diff --git a/apps/web/src/common/modules/navigations/new-lsb/composables/use-lsb-router-item-state.ts b/apps/web/src/common/modules/navigations/new-lsb/composables/use-lsb-router-item-state.ts deleted file mode 100644 index 53bd568175..0000000000 --- a/apps/web/src/common/modules/navigations/new-lsb/composables/use-lsb-router-item-state.ts +++ /dev/null @@ -1,55 +0,0 @@ -import type { UnwrapRef, Ref } from 'vue'; -import { computed } from 'vue'; -import type { Location } from 'vue-router'; -import { useRoute, useRouter } from 'vue-router/composables'; - -import { assetUrlConverter } from '@/lib/helper/asset-helper'; - -import type { LSBIcon, LSBRouterPredicate } from '@/common/modules/navigations/new-lsb/type'; - -interface UseLsbRouterItemProps { - to?: Ref>; - icon?: Ref>; - imgIcon?: Ref>; - predicate?: LSBRouterPredicate; -} -export const useLsbRouterItemState = (props: UnwrapRef) => { - const router = useRouter(); - const route = useRoute(); - - const isSelected = computed(() => { - if (!props.to) return false; - - if (props.predicate) { - return props.predicate(props.to, route); - } - - const resolved = router.resolve(props.to); - if (!resolved) return false; - - let currentPath = route.fullPath; - if (currentPath.indexOf('?') > 0) { - currentPath = currentPath.slice(0, currentPath.indexOf('?')); - } - const resolvedHref = resolved.href; - return currentPath === resolvedHref; - }); - const iconName = computed(() => { - if (!props.icon) return ''; - if (typeof props.icon === 'string') return props.icon; - return props.icon.name; - }); - const iconColor = computed(() => { - if (!props.icon) return 'inherit'; - if (typeof props.icon === 'string') return 'inherit'; - return props.icon.color || 'inherit'; - }); - const imgIconUrl = computed(() => (props.imgIcon ? assetUrlConverter(props.imgIcon) : '')); - - return { - isSelected, - iconName, - iconColor, - imgIconUrl, - }; -}; diff --git a/apps/web/src/common/modules/navigations/new-lsb/type.ts b/apps/web/src/common/modules/navigations/new-lsb/type.ts index 39f4908eb1..e05ca944e4 100644 --- a/apps/web/src/common/modules/navigations/new-lsb/type.ts +++ b/apps/web/src/common/modules/navigations/new-lsb/type.ts @@ -1,6 +1,21 @@ +import type { TranslateResult } from 'vue-i18n'; import type { Location, Route } from 'vue-router'; +import type { TreeNodeDisplayType, TreeNodeIcon, TreeNodeLink } from '@cloudforet/mirinae/types/data-display/tree/new-tree/type'; + +import type { FavoriteOptions } from '@/common/modules/favorites/favorite-button/type'; -export type LSBIcon = string | { name: string; color?: string; }; export type HighlightTagType = 'new' | 'beta' | 'update'; export type LSBRouterPredicate = (to: Location, currentRoute: Route) => boolean; +export type LSBItemFavoriteVisibility = 'always' | 'active-only' | 'hovered-only' | 'none'; + +export interface LSBItemProps { + id: string; + name: TranslateResult; + icon?: TreeNodeIcon; + link: TreeNodeLink; + displayType?: TreeNodeDisplayType; + highlightTag?: HighlightTagType; + favoriteOptions?: FavoriteOptions; + favoriteVisibility?: LSBItemFavoriteVisibility; +} diff --git a/apps/web/src/common/modules/page-layouts/type.ts b/apps/web/src/common/modules/page-layouts/type.ts index 4343f25bac..9d3acd34e0 100644 --- a/apps/web/src/common/modules/page-layouts/type.ts +++ b/apps/web/src/common/modules/page-layouts/type.ts @@ -1,7 +1,7 @@ import type { TranslateResult } from 'vue-i18n'; import type { Location } from 'vue-router'; -import type { ProjectGroupTreeNodeData } from '@/services/project/v-shared/types/project-tree-type'; +import type { ProjectGroupTreeNodeData } from '@/common/modules/project/project-tree-type'; export interface Breadcrumb { name: TranslateResult|string; diff --git a/apps/web/src/common/modules/project/ProjectSelectDropdown.vue b/apps/web/src/common/modules/project/ProjectSelectDropdown.vue index 85eb705042..f0d5e3d4d8 100644 --- a/apps/web/src/common/modules/project/ProjectSelectDropdown.vue +++ b/apps/web/src/common/modules/project/ProjectSelectDropdown.vue @@ -17,15 +17,16 @@ import type { ReferenceMap } from '@/store/reference/type'; import getRandomId from '@/lib/random-id-generator'; import ErrorHandler from '@/common/composables/error/errorHandler'; - -import { indigo, peacock } from '@/styles/colors'; - -import type { ProjectTreeOptions } from '@/services/project/v-shared/composables/use-project-tree'; -import { useProjectTree } from '@/services/project/v-shared/composables/use-project-tree'; import type { ProjectTreeItem, ProjectTreeNodeData, ProjectTreeRoot, ProjectTreeItemType, ProjectTreeNode, -} from '@/services/project/v-shared/types/project-tree-type'; +} from '@/common/modules/project/project-tree-type'; +import type { ProjectTreeOptions } from '@/common/modules/project/use-project-tree'; +import { useProjectTree } from '@/common/modules/project/use-project-tree'; + +import { indigo, peacock } from '@/styles/colors'; + + import { PROJECT_ROUTE_V1 } from '@/services/project/v1/routes/route-constant'; interface ProjectGroupSelectOptions { diff --git a/apps/web/src/services/project/v-shared/types/project-tree-type.ts b/apps/web/src/common/modules/project/project-tree-type.ts similarity index 100% rename from apps/web/src/services/project/v-shared/types/project-tree-type.ts rename to apps/web/src/common/modules/project/project-tree-type.ts diff --git a/apps/web/src/services/project/v-shared/composables/use-project-tree.ts b/apps/web/src/common/modules/project/use-project-tree.ts similarity index 99% rename from apps/web/src/services/project/v-shared/composables/use-project-tree.ts rename to apps/web/src/common/modules/project/use-project-tree.ts index 00b833a92b..5c7867039c 100644 --- a/apps/web/src/services/project/v-shared/composables/use-project-tree.ts +++ b/apps/web/src/common/modules/project/use-project-tree.ts @@ -11,7 +11,7 @@ import type { ProjectGroupModel } from '@/api-clients/identity/project-group/sch import type { ProjectListParameters } from '@/api-clients/identity/project/schema/api-verbs/list'; import type { ProjectModel } from '@/api-clients/identity/project/schema/model'; -import type { ProjectTreeItemType, ProjectTreeNodeData } from '@/services/project/v-shared/types/project-tree-type'; +import type { ProjectTreeItemType, ProjectTreeNodeData } from '@/common/modules/project/project-tree-type'; type ProjectGroupListResponse = ListResponse; diff --git a/apps/web/src/lib/config/global-config/feature-schema.ts b/apps/web/src/lib/config/global-config/feature-schema.ts index 2ddd0251b7..15999061e8 100644 --- a/apps/web/src/lib/config/global-config/feature-schema.ts +++ b/apps/web/src/lib/config/global-config/feature-schema.ts @@ -17,6 +17,9 @@ export const initialFeatureSchema: FeatureSchemaType = { visibleAlertTabAtDetail: true, }, }, + V2: { + menu: { [MENU_ID.PROJECT]: true }, + }, }, [FEATURES.SERVICE_ACCOUNT]: { currentVersion: 'V1', diff --git a/apps/web/src/services/alert-manager/v1/components/AlertMainAlertCreateModal.vue b/apps/web/src/services/alert-manager/v1/components/AlertMainAlertCreateModal.vue index 2c55b7b58b..2038e5a3ed 100644 --- a/apps/web/src/services/alert-manager/v1/components/AlertMainAlertCreateModal.vue +++ b/apps/web/src/services/alert-manager/v1/components/AlertMainAlertCreateModal.vue @@ -21,9 +21,9 @@ import { showSuccessMessage } from '@/lib/helper/notice-alert-helper'; import ErrorHandler from '@/common/composables/error/errorHandler'; import { useProxyValue } from '@/common/composables/proxy-state'; +import type { ProjectTreeNodeData } from '@/common/modules/project/project-tree-type'; import ProjectSelectDropdown from '@/common/modules/project/ProjectSelectDropdown.vue'; -import type { ProjectTreeNodeData } from '@/services/project/v-shared/types/project-tree-type'; const props = defineProps<{ visible: boolean; diff --git a/apps/web/src/services/alert-manager/v1/components/EscalationPolicyForm.vue b/apps/web/src/services/alert-manager/v1/components/EscalationPolicyForm.vue index 550a34591b..4595574386 100644 --- a/apps/web/src/services/alert-manager/v1/components/EscalationPolicyForm.vue +++ b/apps/web/src/services/alert-manager/v1/components/EscalationPolicyForm.vue @@ -22,13 +22,13 @@ import { useUserStore } from '@/store/user/user-store'; import { referenceRouter } from '@/lib/reference/referenceRouter'; import { useFormValidator } from '@/common/composables/form-validator'; +import type { ProjectTreeNodeData } from '@/common/modules/project/project-tree-type'; import ProjectSelectDropdown from '@/common/modules/project/ProjectSelectDropdown.vue'; import EscalationPolicyFormRulesInput from '@/services/alert-manager/v1/components/EscalationPolicyFormRulesInput.vue'; import { ACTION } from '@/services/alert-manager/v1/constants/alert-constant'; import { useEscalationPolicyFormStore } from '@/services/alert-manager/v1/stores/escalation-policy-form-store'; import type { ActionMode } from '@/services/alert-manager/v1/types/alert-type'; -import type { ProjectTreeNodeData } from '@/services/project/v-shared/types/project-tree-type'; import { PROJECT_ROUTE_V1 } from '@/services/project/v1/routes/route-constant'; const props = withDefaults(defineProps<{ diff --git a/apps/web/src/services/iam/components/AppManagementFormModal.vue b/apps/web/src/services/iam/components/AppManagementFormModal.vue index 4d9017db5d..a44e91cdbc 100644 --- a/apps/web/src/services/iam/components/AppManagementFormModal.vue +++ b/apps/web/src/services/iam/components/AppManagementFormModal.vue @@ -26,13 +26,13 @@ import { i18n } from '@/translations'; import { useAppContextStore } from '@/store/app-context/app-context-store'; import ErrorHandler from '@/common/composables/error/errorHandler'; +import type { ProjectTreeNodeData } from '@/common/modules/project/project-tree-type'; import ProjectSelectDropdown from '@/common/modules/project/ProjectSelectDropdown.vue'; import { useRoleFormatter } from '@/services/iam/composables/refined-table-data'; import { getInputItemsFromTagKeys } from '@/services/iam/composables/tag-data'; import { APP_DROPDOWN_MODAL_TYPE } from '@/services/iam/constants/app-constant'; import { useAppPageStore } from '@/services/iam/store/app-page-store'; -import type { ProjectTreeNodeData } from '@/services/project/v-shared/types/project-tree-type'; interface AppDropdownMenuItem extends SelectDropdownMenuItem { diff --git a/apps/web/src/services/ops-flow/components/BoardLSB.vue b/apps/web/src/services/ops-flow/components/BoardLSB.vue index 98bb8d98c5..a55962ba56 100644 --- a/apps/web/src/services/ops-flow/components/BoardLSB.vue +++ b/apps/web/src/services/ops-flow/components/BoardLSB.vue @@ -3,10 +3,9 @@ import { PIconButton } from '@cloudforet/mirinae'; import LSBContainer from '@/common/modules/navigations/new-lsb/LSBContainer.vue'; import LSBDivider from '@/common/modules/navigations/new-lsb/LSBDivider.vue'; +import LSBItem from '@/common/modules/navigations/new-lsb/LSBItem.vue'; import LSBLoadingSpinner from '@/common/modules/navigations/new-lsb/LSBLoadingSpinner.vue'; -import LSBRouterButton from '@/common/modules/navigations/new-lsb/LSBRouterButton.vue'; -import LSBRouterItem from '@/common/modules/navigations/new-lsb/LSBRouterItem.vue'; -import LSBTopTitle from '@/common/modules/navigations/new-lsb/LSBTopTitle.vue'; +import LSBTitle from '@/common/modules/navigations/new-lsb/LSBTitle.vue'; import type { LSBRouterPredicate } from '@/common/modules/navigations/new-lsb/type'; import { useAvailableCategories } from '@/services/ops-flow/composables/use-available-categories'; @@ -24,40 +23,43 @@ const { availableCategories, isLoading, refetch } = useAvailableCategories();