diff --git a/apps/web/src/common/modules/navigations/top-bar/modules/top-bar-toolset/TopBarToolset.vue b/apps/web/src/common/modules/navigations/top-bar/modules/top-bar-toolset/TopBarToolset.vue index 8100a02134..dcaf4e4b76 100644 --- a/apps/web/src/common/modules/navigations/top-bar/modules/top-bar-toolset/TopBarToolset.vue +++ b/apps/web/src/common/modules/navigations/top-bar/modules/top-bar-toolset/TopBarToolset.vue @@ -38,7 +38,7 @@ const state = reactive({ isDomainAdmin: computed(() => userStore.getters.isDomainAdmin), isAdminMode: computed(() => appContextStore.getters.isAdminMode), isGrantLoading: computed(() => appContextStore.getters.globalGrantLoading), - visibleAlertIcon: computed(() => globalConfigStore.state.schema.ALERT_MANAGER.uiAffects?.visibleAlertIcon), + visibleAlertIcon: computed(() => globalConfigStore.state.schema.ALERT_MANAGER?.uiAffects?.visibleAlertIcon), tooltipTexts: computed>(() => ({ adminToggle: (state.isAdminMode ? i18n.t('COMMON.GNB.TOOLTIP.EXIT_ADMIN_MODE') : i18n.t('COMMON.GNB.TOOLTIP.ENABLE_ADMIN_MODE')) as string, })), diff --git a/apps/web/src/lib/config/global-config/feature-schema-manager.ts b/apps/web/src/lib/config/global-config/feature-schema-manager.ts index a40bbb27a6..7c969a6e6e 100644 --- a/apps/web/src/lib/config/global-config/feature-schema-manager.ts +++ b/apps/web/src/lib/config/global-config/feature-schema-manager.ts @@ -16,10 +16,10 @@ export class FeatureSchemaManager { ...this.config, ...config, }; - this.createSchema(); + this.setFeatureSchema(); } - createSchema() { + setFeatureSchema() { const globalConfigStore = useGlobalConfigStore(); const schema = {} as FeatureSchemaType; @@ -32,7 +32,6 @@ export class FeatureSchemaManager { const currentVersion = this.config[feature]?.VERSION || 'V1'; configurator.initialize(currentVersion); const menuConfig = configurator.getMenu(this.config); - if (configurator.uiAffect) { configurator.uiAffect.forEach((uiAffect) => { const targetFeature = uiAffect.feature; diff --git a/apps/web/src/lib/config/global-config/types/type.ts b/apps/web/src/lib/config/global-config/types/type.ts index 625703d03c..429cd6ebf2 100644 --- a/apps/web/src/lib/config/global-config/types/type.ts +++ b/apps/web/src/lib/config/global-config/types/type.ts @@ -34,7 +34,7 @@ export interface FeatureConfiguratorType { getRoutes: (isAdmin?: boolean) => RouteConfig|null; getMenu: (config?: GlobalServiceConfig) => FeatureMenuConfig; initialize: (version: FeatureVersion) => void; - uiAffect: FeatureUiAffect[]; + uiAffect?: FeatureUiAffect[]; } interface UiAffectConfig { diff --git a/apps/web/src/lib/site-initializer/index.ts b/apps/web/src/lib/site-initializer/index.ts index b7a1d0f195..29ad7082f2 100644 --- a/apps/web/src/lib/site-initializer/index.ts +++ b/apps/web/src/lib/site-initializer/index.ts @@ -27,7 +27,6 @@ import { initDomain } from '@/lib/site-initializer/domain'; import { initDomainSettings } from '@/lib/site-initializer/domain-settings'; import { initEcharts } from '@/lib/site-initializer/echarts'; import { initErrorHandler } from '@/lib/site-initializer/error-handler'; -import { initTaskManagementTemplate } from '@/lib/site-initializer/initTaskManagementTemplate'; import { mergeConfig } from '@/lib/site-initializer/merge-config'; import { initModeSetting } from '@/lib/site-initializer/mode-setting'; import { checkSsoAccessToken } from '@/lib/site-initializer/sso'; @@ -107,7 +106,6 @@ const init = async () => { initRequestIdleCallback(); const results = await Promise.allSettled([ checkSsoAccessToken(), - initTaskManagementTemplate(), ]); const errors: any[] = []; results.forEach((result) => { diff --git a/apps/web/src/lib/site-initializer/initTaskManagementTemplate.ts b/apps/web/src/lib/site-initializer/initTaskManagementTemplate.ts index 8f63651765..8c69456436 100644 --- a/apps/web/src/lib/site-initializer/initTaskManagementTemplate.ts +++ b/apps/web/src/lib/site-initializer/initTaskManagementTemplate.ts @@ -1,14 +1,11 @@ import { pinia } from '@/store/pinia'; -import { useUserStore } from '@/store/user/user-store'; import { useTaskManagementTemplateStore, } from '@/services/ops-flow/task-management-templates/stores/use-task-management-template-store'; -export const initTaskManagementTemplate = async () => { - const userStore = useUserStore(pinia); - if (userStore.state.isSessionExpired) return; +export const initTaskManagementTemplate = async () => { const taskManagementTemplateStore = useTaskManagementTemplateStore(pinia); await Promise.allSettled([ taskManagementTemplateStore.setInitialTemplateId(), diff --git a/apps/web/src/lib/site-initializer/merge-config.ts b/apps/web/src/lib/site-initializer/merge-config.ts index 18b229aed2..28928339c9 100644 --- a/apps/web/src/lib/site-initializer/merge-config.ts +++ b/apps/web/src/lib/site-initializer/merge-config.ts @@ -1,4 +1,5 @@ import { SpaceConnector } from '@cloudforet/core-lib/space-connector'; +import { APIError } from '@cloudforet/core-lib/space-connector/error'; import type { PublicConfigGetParameters } from '@/api-clients/config/public-config/schema/api-verbs/get'; import { PUBLIC_CONFIG_NAMES } from '@/api-clients/config/public-config/schema/constant'; @@ -6,6 +7,8 @@ import type { PublicConfigModel } from '@/api-clients/config/public-config/schem import type { GlobalServiceConfig } from '@/lib/config/global-config/types/type'; +import ErrorHandler from '@/common/composables/error/errorHandler'; + export const mergeConfig = async (config, domainId: string): Promise => { const baseConfig = config.get('SERVICES') || {}; @@ -16,8 +19,12 @@ export const mergeConfig = async (config, domainId: string): Promise { diff --git a/apps/web/src/services/alert-manager/v2/components/ServiceDetailTabsSettingsEventRuleCard.vue b/apps/web/src/services/alert-manager/v2/components/ServiceDetailTabsSettingsEventRuleCard.vue index 4f2fee5877..3092dca12c 100644 --- a/apps/web/src/services/alert-manager/v2/components/ServiceDetailTabsSettingsEventRuleCard.vue +++ b/apps/web/src/services/alert-manager/v2/components/ServiceDetailTabsSettingsEventRuleCard.vue @@ -98,7 +98,7 @@ const state = reactive({ result[type].push({ label: i18n.t('ALERT_MANAGER.EVENT_RULE.ASSET_TYPE'), name: 'asset_types', - value: matchAssetValue.asset_types.map((i) => storeState.cloudServiceType[i].label).join(', '), + value: matchAssetValue.asset_types.map((i) => (storeState.cloudServiceType[i] ? storeState.cloudServiceType[i].label : i)).join(', '), }); } if (matchAssetValue.key) { diff --git a/apps/web/src/services/asset-inventory/components/CloudServiceDetailTabs.vue b/apps/web/src/services/asset-inventory/components/CloudServiceDetailTabs.vue index 16eb5dc043..3e777de3ee 100644 --- a/apps/web/src/services/asset-inventory/components/CloudServiceDetailTabs.vue +++ b/apps/web/src/services/asset-inventory/components/CloudServiceDetailTabs.vue @@ -69,7 +69,7 @@ const { visibleContents } = useContentsAccessibility(MENU_ID.OPS_FLOW); /* Tabs */ const state = reactive({ - visibleAlertTab: computed(() => globalConfigStore.state.schema.ALERT_MANAGER.uiAffects?.visibleAssetAlertTab), + visibleAlertTab: computed(() => globalConfigStore.state.schema.ALERT_MANAGER?.uiAffects?.visibleAssetAlertTab), }); const singleItemTabState = reactive({ tabs: computed(() => { diff --git a/apps/web/src/services/auth/authenticator/index.ts b/apps/web/src/services/auth/authenticator/index.ts index 507c607342..321277a92f 100644 --- a/apps/web/src/services/auth/authenticator/index.ts +++ b/apps/web/src/services/auth/authenticator/index.ts @@ -10,8 +10,6 @@ import { useErrorStore } from '@/store/error/error-store'; import { pinia } from '@/store/pinia'; import { useUserStore } from '@/store/user/user-store'; -import { initTaskManagementTemplate } from '@/lib/site-initializer/initTaskManagementTemplate'; - abstract class Authenticator { static async signIn(credentials: Record, authType: AuthType | 'SAML', verifyCode?: string): Promise { @@ -29,7 +27,6 @@ abstract class Authenticator { await userWorkspaceStore.load(); displayStore.setIsSignInFailed(false); errorStore.reset(); - await initTaskManagementTemplate(); } static async signOut(): Promise { diff --git a/apps/web/src/services/cost-explorer/pages/BudgetDetailPage.vue b/apps/web/src/services/cost-explorer/pages/BudgetDetailPage.vue index cb35a14e4a..179b5a3e22 100644 --- a/apps/web/src/services/cost-explorer/pages/BudgetDetailPage.vue +++ b/apps/web/src/services/cost-explorer/pages/BudgetDetailPage.vue @@ -36,7 +36,7 @@ const budgetPageState = budgetPageStore.$state; const state = reactive({ loading: true, budgetData: computed(() => budgetPageState.budgetData), - visibleBudgetNotification: computed(() => globalConfigStore.state.schema.ALERT_MANAGER.uiAffects?.visibleBudgetNotification ?? false), + visibleBudgetNotification: computed(() => globalConfigStore.state.schema.ALERT_MANAGER?.uiAffects?.visibleBudgetNotification ?? false), isWorkspaceTarget: computed(() => (state.budgetData?.resource_group === 'WORKSPACE')), adminModeLink: computed(() => ({ name: ADMIN_COST_EXPLORER_ROUTE.BUDGET.DETAIL._NAME, diff --git a/apps/web/src/services/my-page/components/NotificationAddForm.vue b/apps/web/src/services/my-page/components/NotificationAddForm.vue index 4def96f229..ff02d23637 100644 --- a/apps/web/src/services/my-page/components/NotificationAddForm.vue +++ b/apps/web/src/services/my-page/components/NotificationAddForm.vue @@ -41,7 +41,7 @@ const router = useRouter(); const globalConfigStore = useGlobalConfigStore(); const state = reactive({ - visibleUserNotification: computed(() => globalConfigStore.state.schema.ALERT_MANAGER.uiAffects?.visibleUserNotification ?? false), + visibleUserNotification: computed(() => globalConfigStore.state.schema.ALERT_MANAGER?.uiAffects?.visibleUserNotification ?? false), isDataValid: false, notificationLevel: 'LV1' as NotificationLevel, // diff --git a/apps/web/src/services/my-page/components/NotificationChannelList.vue b/apps/web/src/services/my-page/components/NotificationChannelList.vue index f05cb08b5f..925b08f8a2 100644 --- a/apps/web/src/services/my-page/components/NotificationChannelList.vue +++ b/apps/web/src/services/my-page/components/NotificationChannelList.vue @@ -62,7 +62,7 @@ const props = withDefaults(defineProps<{ }); const route = useRoute(); const state = reactive({ - visibleUserNotification: computed(() => globalConfigStore.state.schema.ALERT_MANAGER.uiAffects?.visibleUserNotification ?? false), + visibleUserNotification: computed(() => globalConfigStore.state.schema.ALERT_MANAGER?.uiAffects?.visibleUserNotification ?? false), loading: true, channelLoading: true, userId: computed(() => (route.params.userId ? decodeURIComponent(route.params.userId) : userStore.state.userId)), diff --git a/apps/web/src/services/my-page/composables/notification-item.ts b/apps/web/src/services/my-page/composables/notification-item.ts index 83b74cdf9c..c3e9a45a7e 100644 --- a/apps/web/src/services/my-page/composables/notification-item.ts +++ b/apps/web/src/services/my-page/composables/notification-item.ts @@ -34,7 +34,7 @@ const globalConfigStore = useGlobalConfigStore(); export const useNotificationItem = (_state: NotificationItemState, emit: Emit) => { const state = reactive({ - visibleUserNotification: computed(() => globalConfigStore.state.schema.ALERT_MANAGER.uiAffects?.visibleUserNotification ?? false), + visibleUserNotification: computed(() => globalConfigStore.state.schema.ALERT_MANAGER?.uiAffects?.visibleUserNotification ?? false), isEditMode: _state.isEditMode, dataForEdit: _state.dataForEdit, userChannelId: _state.userChannelId, diff --git a/apps/web/src/services/ops-flow/configurator.ts b/apps/web/src/services/ops-flow/configurator.ts index 2f1d46c7b2..f846075f07 100644 --- a/apps/web/src/services/ops-flow/configurator.ts +++ b/apps/web/src/services/ops-flow/configurator.ts @@ -3,6 +3,7 @@ import type { RouteConfig } from 'vue-router'; import type { FeatureConfiguratorType, FeatureMenuConfig, FeatureUiAffect } from '@/lib/config/global-config/types/type'; import type { Menu } from '@/lib/menu/config'; import { MENU_ID } from '@/lib/menu/config'; +import { initTaskManagementTemplate } from '@/lib/site-initializer/initTaskManagementTemplate'; import adminOpsFlowRoutes from '@/services/ops-flow/routes/admin/routes'; import opsFlowRoutes from '@/services/ops-flow/routes/routes'; @@ -22,6 +23,8 @@ class OpsFlowConfigurator implements FeatureConfiguratorType { } getMenu(): FeatureMenuConfig { + initTaskManagementTemplate(); + const baseMenu: Menu = { id: MENU_ID.OPS_FLOW, needPermissionByRole: true, diff --git a/apps/web/src/services/ops-flow/task-management-templates/stores/use-task-management-template-store.ts b/apps/web/src/services/ops-flow/task-management-templates/stores/use-task-management-template-store.ts index 12e71b0168..e3d92a1bec 100644 --- a/apps/web/src/services/ops-flow/task-management-templates/stores/use-task-management-template-store.ts +++ b/apps/web/src/services/ops-flow/task-management-templates/stores/use-task-management-template-store.ts @@ -84,6 +84,7 @@ export const useTaskManagementTemplateStore = defineStore('task-management-templ } catch (e) { if (e instanceof APIError && e.status === 404) { state.templateId = 'default'; + console.warn('404 Not Found: Template Id Data not found.'); return; } ErrorHandler.handleError(e); @@ -111,6 +112,7 @@ export const useTaskManagementTemplateStore = defineStore('task-management-templ } catch (e) { if (e instanceof APIError && e.status === 404) { state.enableLanding = false; + console.warn('404 Not Found: Template Landing Data not found.'); return; } ErrorHandler.handleError(e);