From 2c2beb37d3a2d8f171e63152f2d99a8a9e6af782 Mon Sep 17 00:00:00 2001 From: WANJIN Date: Thu, 14 Nov 2024 10:02:49 +0900 Subject: [PATCH 01/53] feat: add itsm routes and related files & add markup and store of task management page (#5029) * feat: add itsm menu and itsm route config Signed-off-by: Wanjin Noh * feat: add itsm menus to workspace default permission Signed-off-by: Wanjin Noh * feat: add itsm related pages and routes Signed-off-by: Wanjin Noh * fix: fix admin route redirect bug Signed-off-by: Wanjin Noh * chore: add api schema for workflow Signed-off-by: Wanjin Noh * feat: add task management related page files and task management components Signed-off-by: Wanjin Noh --------- Signed-off-by: Wanjin Noh --- apps/web/src/lib/access-control/config.ts | 6 + apps/web/src/lib/menu/config.ts | 5 + apps/web/src/lib/menu/menu-architecture.ts | 15 ++ apps/web/src/lib/menu/menu-info.ts | 37 ++++ apps/web/src/router/admin-routes.ts | 2 + apps/web/src/router/workspace-routes.ts | 2 + .../identity/package/api-verbs/create.ts | 7 + .../schema/identity/package/api-verbs/list.ts | 7 + .../identity/package/api-verbs/update.ts | 8 + apps/web/src/schema/identity/package/model.ts | 12 ++ .../schema/workflow/_types/task-field-type.ts | 12 ++ .../workflow/comment/api-verbs/create.ts | 4 + .../schema/workflow/comment/api-verbs/get.ts | 3 + .../schema/workflow/comment/api-verbs/list.ts | 13 ++ .../workflow/comment/api-verbs/update.ts | 7 + apps/web/src/schema/workflow/comment/model.ts | 18 ++ apps/web/src/schema/workflow/comment/type.ts | 5 + .../schema/workflow/event/api-verbs/list.ts | 6 + apps/web/src/schema/workflow/event/model.ts | 16 ++ apps/web/src/schema/workflow/event/type.ts | 1 + .../task-category/api-verbs/create.ts | 12 ++ .../task-category/api-verbs/delete.ts | 3 + .../workflow/task-category/api-verbs/get.ts | 3 + .../workflow/task-category/api-verbs/list.ts | 7 + .../task-category/api-verbs/update.ts | 13 ++ .../schema/workflow/task-category/model.ts | 16 ++ .../workflow/task-type/api-verbs/create.ts | 10 + .../workflow/task-type/api-verbs/delete.ts | 3 + .../workflow/task-type/api-verbs/get.ts | 3 + .../workflow/task-type/api-verbs/list.ts | 7 + .../workflow/task-type/api-verbs/update.ts | 11 ++ .../src/schema/workflow/task-type/model.ts | 15 ++ .../workflow/task/api-verbs/change-status.ts | 6 + .../schema/workflow/task/api-verbs/create.ts | 15 ++ .../schema/workflow/task/api-verbs/delete.ts | 3 + .../src/schema/workflow/task/api-verbs/get.ts | 3 + .../schema/workflow/task/api-verbs/list.ts | 10 + .../schema/workflow/task/api-verbs/update.ts | 11 ++ apps/web/src/schema/workflow/task/model.ts | 19 ++ apps/web/src/schema/workflow/task/type.ts | 6 + apps/web/src/services/itsm/ITSMContainer.vue | 26 +++ .../components/AddOrEditCategoryModal.vue | 133 +++++++++++++ .../itsm/components/AddOrEditPackageModal.vue | 126 ++++++++++++ .../itsm/components/SupportPackagePanel.vue | 84 ++++++++ .../itsm/components/TaskCategoryPanel.vue | 107 ++++++++++ .../web/src/services/itsm/pages/BoardPage.vue | 8 + .../services/itsm/pages/ITSMLandingPage.vue | 8 + .../services/itsm/pages/TaskCreatePage.vue | 8 + .../services/itsm/pages/TaskDetailPage.vue | 7 + .../admin/AdminTaskCategoryDetailPage.vue | 7 + .../pages/admin/AdminTaskManagementPage.vue | 58 ++++++ .../itsm/pages/admin/AdminWorkflowPage.vue | 8 + .../src/services/itsm/routes/admin/routes.ts | 62 ++++++ .../services/itsm/routes/route-constant.ts | 23 +++ apps/web/src/services/itsm/routes/routes.ts | 62 ++++++ .../itsm/stores/admin/package-store.ts | 100 ++++++++++ .../admin/task-management-page-store.ts | 84 ++++++++ .../itsm/stores/task-category-store.ts | 184 ++++++++++++++++++ .../services/itsm/stores/task-type-store.ts | 122 ++++++++++++ 59 files changed, 1579 insertions(+) create mode 100644 apps/web/src/schema/identity/package/api-verbs/create.ts create mode 100644 apps/web/src/schema/identity/package/api-verbs/list.ts create mode 100644 apps/web/src/schema/identity/package/api-verbs/update.ts create mode 100644 apps/web/src/schema/identity/package/model.ts create mode 100644 apps/web/src/schema/workflow/_types/task-field-type.ts create mode 100644 apps/web/src/schema/workflow/comment/api-verbs/create.ts create mode 100644 apps/web/src/schema/workflow/comment/api-verbs/get.ts create mode 100644 apps/web/src/schema/workflow/comment/api-verbs/list.ts create mode 100644 apps/web/src/schema/workflow/comment/api-verbs/update.ts create mode 100644 apps/web/src/schema/workflow/comment/model.ts create mode 100644 apps/web/src/schema/workflow/comment/type.ts create mode 100644 apps/web/src/schema/workflow/event/api-verbs/list.ts create mode 100644 apps/web/src/schema/workflow/event/model.ts create mode 100644 apps/web/src/schema/workflow/event/type.ts create mode 100644 apps/web/src/schema/workflow/task-category/api-verbs/create.ts create mode 100644 apps/web/src/schema/workflow/task-category/api-verbs/delete.ts create mode 100644 apps/web/src/schema/workflow/task-category/api-verbs/get.ts create mode 100644 apps/web/src/schema/workflow/task-category/api-verbs/list.ts create mode 100644 apps/web/src/schema/workflow/task-category/api-verbs/update.ts create mode 100644 apps/web/src/schema/workflow/task-category/model.ts create mode 100644 apps/web/src/schema/workflow/task-type/api-verbs/create.ts create mode 100644 apps/web/src/schema/workflow/task-type/api-verbs/delete.ts create mode 100644 apps/web/src/schema/workflow/task-type/api-verbs/get.ts create mode 100644 apps/web/src/schema/workflow/task-type/api-verbs/list.ts create mode 100644 apps/web/src/schema/workflow/task-type/api-verbs/update.ts create mode 100644 apps/web/src/schema/workflow/task-type/model.ts create mode 100644 apps/web/src/schema/workflow/task/api-verbs/change-status.ts create mode 100644 apps/web/src/schema/workflow/task/api-verbs/create.ts create mode 100644 apps/web/src/schema/workflow/task/api-verbs/delete.ts create mode 100644 apps/web/src/schema/workflow/task/api-verbs/get.ts create mode 100644 apps/web/src/schema/workflow/task/api-verbs/list.ts create mode 100644 apps/web/src/schema/workflow/task/api-verbs/update.ts create mode 100644 apps/web/src/schema/workflow/task/model.ts create mode 100644 apps/web/src/schema/workflow/task/type.ts create mode 100644 apps/web/src/services/itsm/ITSMContainer.vue create mode 100644 apps/web/src/services/itsm/components/AddOrEditCategoryModal.vue create mode 100644 apps/web/src/services/itsm/components/AddOrEditPackageModal.vue create mode 100644 apps/web/src/services/itsm/components/SupportPackagePanel.vue create mode 100644 apps/web/src/services/itsm/components/TaskCategoryPanel.vue create mode 100644 apps/web/src/services/itsm/pages/BoardPage.vue create mode 100644 apps/web/src/services/itsm/pages/ITSMLandingPage.vue create mode 100644 apps/web/src/services/itsm/pages/TaskCreatePage.vue create mode 100644 apps/web/src/services/itsm/pages/TaskDetailPage.vue create mode 100644 apps/web/src/services/itsm/pages/admin/AdminTaskCategoryDetailPage.vue create mode 100644 apps/web/src/services/itsm/pages/admin/AdminTaskManagementPage.vue create mode 100644 apps/web/src/services/itsm/pages/admin/AdminWorkflowPage.vue create mode 100644 apps/web/src/services/itsm/routes/admin/routes.ts create mode 100644 apps/web/src/services/itsm/routes/route-constant.ts create mode 100644 apps/web/src/services/itsm/routes/routes.ts create mode 100644 apps/web/src/services/itsm/stores/admin/package-store.ts create mode 100644 apps/web/src/services/itsm/stores/admin/task-management-page-store.ts create mode 100644 apps/web/src/services/itsm/stores/task-category-store.ts create mode 100644 apps/web/src/services/itsm/stores/task-type-store.ts diff --git a/apps/web/src/lib/access-control/config.ts b/apps/web/src/lib/access-control/config.ts index ecbb241471..b08572aec4 100644 --- a/apps/web/src/lib/access-control/config.ts +++ b/apps/web/src/lib/access-control/config.ts @@ -46,6 +46,9 @@ export const WORKSPACE_OWNER_DEFAULT_PERMISSIONS: MenuId[] = [ MENU_ID.NOTIFICATIONS, MENU_ID.INFO, MENU_ID.NOTICE, + MENU_ID.ITSM, + MENU_ID.ITSM_LANDING, + MENU_ID.BOARD, ]; export const WORKSPACE_MEMBER_DEFAULT_PERMISSIONS: MenuId[] = [ MENU_ID.WORKSPACE_HOME, @@ -70,6 +73,9 @@ export const WORKSPACE_MEMBER_DEFAULT_PERMISSIONS: MenuId[] = [ MENU_ID.NOTIFICATIONS, MENU_ID.INFO, MENU_ID.NOTICE, + MENU_ID.ITSM, + MENU_ID.ITSM_LANDING, + MENU_ID.BOARD, ]; // TODO: this need to be changed with new SYSTEM domain planning diff --git a/apps/web/src/lib/menu/config.ts b/apps/web/src/lib/menu/config.ts index bdfba7390b..cbe1bbf2ed 100644 --- a/apps/web/src/lib/menu/config.ts +++ b/apps/web/src/lib/menu/config.ts @@ -42,6 +42,11 @@ export const MENU_ID = Object.freeze({ INFO: 'info', NOTICE: 'notice', METRIC_EXPLORER: 'metric_explorer', + ITSM: 'itsm', + ITSM_LANDING: 'itsm_landing', + WORKFLOW: 'workflow', + BOARD: 'board', + TASK_MANAGEMENT: 'task_management', } as const); export type MenuId = typeof MENU_ID[keyof typeof MENU_ID]; diff --git a/apps/web/src/lib/menu/menu-architecture.ts b/apps/web/src/lib/menu/menu-architecture.ts index bb502c0c66..35e6307bbb 100644 --- a/apps/web/src/lib/menu/menu-architecture.ts +++ b/apps/web/src/lib/menu/menu-architecture.ts @@ -42,6 +42,14 @@ export const MENU_LIST: Menu[] = [ { id: MENU_ID.ESCALATION_POLICY, needPermissionByRole: true }, ], }, + { + id: MENU_ID.ITSM, + needPermissionByRole: true, + subMenuList: [ + { id: MENU_ID.ITSM_LANDING }, + { id: MENU_ID.BOARD }, + ], + }, { id: MENU_ID.IAM, @@ -98,6 +106,13 @@ export const ADMIN_MENU_LIST: Menu[] = [ { id: MENU_ID.COST_ADVANCED_SETTINGS }, ], }, + { + id: MENU_ID.ITSM, + subMenuList: [ + { id: MENU_ID.TASK_MANAGEMENT }, + { id: MENU_ID.WORKFLOW }, + ], + }, { id: MENU_ID.IAM, subMenuList: [ diff --git a/apps/web/src/lib/menu/menu-info.ts b/apps/web/src/lib/menu/menu-info.ts index 62bebb1b52..9291b414a4 100644 --- a/apps/web/src/lib/menu/menu-info.ts +++ b/apps/web/src/lib/menu/menu-info.ts @@ -8,6 +8,7 @@ import { COST_EXPLORER_ROUTE } from '@/services/cost-explorer/routes/route-const import { DASHBOARDS_ROUTE } from '@/services/dashboards/routes/route-constant'; import { IAM_ROUTE } from '@/services/iam/routes/route-constant'; import { INFO_ROUTE } from '@/services/info/routes/route-constant'; +import { ITSM_ROUTE } from '@/services/itsm/routes/route-constant'; import { MY_PAGE_ROUTE } from '@/services/my-page/routes/route-constant'; import { PROJECT_ROUTE } from '@/services/project/routes/route-constant'; import { WORKSPACE_HOME_ROUTE } from '@/services/workspace-home/routes/route-constant'; @@ -256,4 +257,40 @@ export const MENU_INFO_MAP: Record = Object.freeze({ translationId: 'MENU.INFO_NOTICE', icon: 'ic_gnb_bell', }, + [MENU_ID.ITSM]: { + menuId: MENU_ID.ITSM, + routeName: ITSM_ROUTE._NAME, + translationId: 'ITSM', // TODO: change translation id + icon: 'ic_gnb_bell', // TODO: change icon + }, + [MENU_ID.ITSM_LANDING]: { + menuId: MENU_ID.ITSM_LANDING, + routeName: ITSM_ROUTE.ITSM_LANDING._NAME, + translationId: 'Support Center', // TODO: change translation id + icon: 'ic_gnb_bell', // TODO: change icon + }, + [MENU_ID.BOARD]: { + menuId: MENU_ID.BOARD, + routeName: ITSM_ROUTE.BOARD._NAME, + translationId: 'Board', // TODO: change translation id + icon: 'ic_gnb_bell', // TODO: change icon + }, + [MENU_ID.BOARD]: { + menuId: MENU_ID.BOARD, + routeName: ITSM_ROUTE.BOARD._NAME, + translationId: 'Board', // TODO: change translation id + icon: 'ic_gnb_bell', // TODO: change icon + }, + [MENU_ID.WORKFLOW]: { + menuId: MENU_ID.WORKFLOW, + routeName: ITSM_ROUTE.WORKFLOW._NAME, + translationId: 'Workflow', // TODO: change translation id + icon: 'ic_gnb_bell', // TODO: change icon + }, + [MENU_ID.TASK_MANAGEMENT]: { + menuId: MENU_ID.TASK_MANAGEMENT, + routeName: ITSM_ROUTE.TASK_MANAGEMENT._NAME, + translationId: 'Task Management', // TODO: change translation id + icon: 'ic_gnb_bell', // TODO: change icon + }, }); diff --git a/apps/web/src/router/admin-routes.ts b/apps/web/src/router/admin-routes.ts index 6678e42e23..72ac79c5e3 100644 --- a/apps/web/src/router/admin-routes.ts +++ b/apps/web/src/router/admin-routes.ts @@ -6,6 +6,7 @@ import adminCostExplorerRoutes from '@/services/cost-explorer/routes/admin/route import adminDashboardsRoutes from '@/services/dashboards/routes/admin/routes'; import adminIamRoutes from '@/services/iam/routes/admin/routes'; import adminInfoRoute from '@/services/info/routes/admin/routes'; +import adminItsmRoutes from '@/services/itsm/routes/admin/routes'; import adminWorkspaceHomeRoutes from '@/services/workspace-home/routes/admin/routes'; @@ -17,4 +18,5 @@ export const adminRoutes: RouteConfig[] = [ adminIamRoutes, adminAdvancedRoutes, adminInfoRoute, + adminItsmRoutes, ]; diff --git a/apps/web/src/router/workspace-routes.ts b/apps/web/src/router/workspace-routes.ts index 132ba5c52b..7795b87522 100644 --- a/apps/web/src/router/workspace-routes.ts +++ b/apps/web/src/router/workspace-routes.ts @@ -7,6 +7,7 @@ import costExplorerRoute from '@/services/cost-explorer/routes/routes'; import dashboardsRoute from '@/services/dashboards/routes/routes'; import iamRoutes from '@/services/iam/routes/routes'; import infoRoute from '@/services/info/routes/routes'; +import itsmRoutes from '@/services/itsm/routes/routes'; import projectRoute from '@/services/project/routes/routes'; import workspaceHomeRoute from '@/services/workspace-home/routes/routes'; @@ -20,4 +21,5 @@ export const workspaceRoutes: RouteConfig[] = [ alertManagerRoute, costExplorerRoute, infoRoute, + itsmRoutes, ]; diff --git a/apps/web/src/schema/identity/package/api-verbs/create.ts b/apps/web/src/schema/identity/package/api-verbs/create.ts new file mode 100644 index 0000000000..96f848dcbf --- /dev/null +++ b/apps/web/src/schema/identity/package/api-verbs/create.ts @@ -0,0 +1,7 @@ +import type { Tags } from '@/schema/_common/model'; + +export interface PackageCreateParameters { + name: string; + description: string; + tags: Tags; +} diff --git a/apps/web/src/schema/identity/package/api-verbs/list.ts b/apps/web/src/schema/identity/package/api-verbs/list.ts new file mode 100644 index 0000000000..37cf16cdb0 --- /dev/null +++ b/apps/web/src/schema/identity/package/api-verbs/list.ts @@ -0,0 +1,7 @@ +import type { Query } from '@cloudforet/core-lib/space-connector/type'; + +export interface PackageListParameters { + query?: Query; + package_id?: string; + name?: string; +} diff --git a/apps/web/src/schema/identity/package/api-verbs/update.ts b/apps/web/src/schema/identity/package/api-verbs/update.ts new file mode 100644 index 0000000000..48d7f17267 --- /dev/null +++ b/apps/web/src/schema/identity/package/api-verbs/update.ts @@ -0,0 +1,8 @@ +import type { Tags } from '@/schema/_common/model'; + +export interface PackageUpdateParameters { + package_id: string; + name?: string; + description?: string; + tags?: Tags; +} diff --git a/apps/web/src/schema/identity/package/model.ts b/apps/web/src/schema/identity/package/model.ts new file mode 100644 index 0000000000..9ac3f8bd90 --- /dev/null +++ b/apps/web/src/schema/identity/package/model.ts @@ -0,0 +1,12 @@ +import type { Tags } from '@/schema/_common/model'; + +export interface PackageModel { + package_id: string; + name: string; + description: string; + order: number; + tags: Tags; + domain_id: string; + created_at: string; + updated_at: string; +} diff --git a/apps/web/src/schema/workflow/_types/task-field-type.ts b/apps/web/src/schema/workflow/_types/task-field-type.ts new file mode 100644 index 0000000000..23fcba43aa --- /dev/null +++ b/apps/web/src/schema/workflow/_types/task-field-type.ts @@ -0,0 +1,12 @@ +export type TaskFieldType = 'TEXT'|'PARAGRAPH'|'DATE'|'LABELS'|'DROPDOWN'|'USER'|'ASSET'; +export type TaskFieldSelectionType = 'SINGLE'|'MULTI'; +export interface TaskField { + field_id: string; + name: string; + description?: string; + field_type: TaskFieldType; + selection_type?: TaskFieldSelectionType; + is_required?: boolean; + is_primary?: boolean; // whether to display field during task creation + options?: string[]; // for dropdown field type +} diff --git a/apps/web/src/schema/workflow/comment/api-verbs/create.ts b/apps/web/src/schema/workflow/comment/api-verbs/create.ts new file mode 100644 index 0000000000..b029d8cdb9 --- /dev/null +++ b/apps/web/src/schema/workflow/comment/api-verbs/create.ts @@ -0,0 +1,4 @@ +export interface CommentCreateParameters { + task_id: string; + comment: string; +} diff --git a/apps/web/src/schema/workflow/comment/api-verbs/get.ts b/apps/web/src/schema/workflow/comment/api-verbs/get.ts new file mode 100644 index 0000000000..130703ac97 --- /dev/null +++ b/apps/web/src/schema/workflow/comment/api-verbs/get.ts @@ -0,0 +1,3 @@ +export interface CommentGetParameters { + comment_id: string; +} diff --git a/apps/web/src/schema/workflow/comment/api-verbs/list.ts b/apps/web/src/schema/workflow/comment/api-verbs/list.ts new file mode 100644 index 0000000000..9595da1d95 --- /dev/null +++ b/apps/web/src/schema/workflow/comment/api-verbs/list.ts @@ -0,0 +1,13 @@ +import type { Query } from '@cloudforet/core-lib/space-connector/type'; + +import type { CommentType } from '@/schema/workflow/comment/type'; + +export interface CommentListParameters { + query?: Query; + task_id?: string; + comment_id?: string; + comment_type?: CommentType; + user_id?: string; + project_id?: string; + workspace_id?: string; +} diff --git a/apps/web/src/schema/workflow/comment/api-verbs/update.ts b/apps/web/src/schema/workflow/comment/api-verbs/update.ts new file mode 100644 index 0000000000..c71685048a --- /dev/null +++ b/apps/web/src/schema/workflow/comment/api-verbs/update.ts @@ -0,0 +1,7 @@ +import type { MentionTargets } from '@/schema/workflow/comment/type'; + +export interface CommentUpdateParameters { + comment_id: string; + comment: string; + mention_targets?: MentionTargets; +} diff --git a/apps/web/src/schema/workflow/comment/model.ts b/apps/web/src/schema/workflow/comment/model.ts new file mode 100644 index 0000000000..85854d1bde --- /dev/null +++ b/apps/web/src/schema/workflow/comment/model.ts @@ -0,0 +1,18 @@ +import type { ResourceGroupType } from '@/schema/_common/type'; +import type { CommentType, MentionTargets } from '@/schema/workflow/comment/type'; + +export interface WorkflowCommentModel { + comment_id: string; + comment: string; + comment_type: CommentType; + is_edited: boolean; + mention_targets: MentionTargets; + task_id: string; + user_id: string; + resource_group: Extract; + project_id: string; + workspace_id: string; + domain_id: string; + created_at: string; + updated_at: string; +} diff --git a/apps/web/src/schema/workflow/comment/type.ts b/apps/web/src/schema/workflow/comment/type.ts new file mode 100644 index 0000000000..785b6ca9ee --- /dev/null +++ b/apps/web/src/schema/workflow/comment/type.ts @@ -0,0 +1,5 @@ +export type CommentType = 'TASK_DESCRIPTION'|'COMMENT'; +export interface MentionTargets { + USER?: string[]; + USER_GROUP?: string[]; +} diff --git a/apps/web/src/schema/workflow/event/api-verbs/list.ts b/apps/web/src/schema/workflow/event/api-verbs/list.ts new file mode 100644 index 0000000000..c837421da2 --- /dev/null +++ b/apps/web/src/schema/workflow/event/api-verbs/list.ts @@ -0,0 +1,6 @@ +import type { Query } from '@cloudforet/core-lib/space-connector/type'; + +export interface WorkflowEventListParameters { + query?: Query; + task_id?: string; +} diff --git a/apps/web/src/schema/workflow/event/model.ts b/apps/web/src/schema/workflow/event/model.ts new file mode 100644 index 0000000000..2f27b32b81 --- /dev/null +++ b/apps/web/src/schema/workflow/event/model.ts @@ -0,0 +1,16 @@ +import type { ResourceGroupType } from '@/schema/_common/type'; +import type { WorkflowEventType } from '@/schema/workflow/event/type'; + +export interface WorkflowEventModel { + event_id: string; + event_type: WorkflowEventType; + name: string; + description: string; + actor: string; + task_id: string; + resource_group: Extract; + project_id: string; + workspace_id: string; + domain_id: string; + created_at: string; +} diff --git a/apps/web/src/schema/workflow/event/type.ts b/apps/web/src/schema/workflow/event/type.ts new file mode 100644 index 0000000000..5b1ad7bd22 --- /dev/null +++ b/apps/web/src/schema/workflow/event/type.ts @@ -0,0 +1 @@ +export type WorkflowEventType = 'CREATED'|'UPDATED'|'CHANGE_STATUS'|'COMMENTED'; diff --git a/apps/web/src/schema/workflow/task-category/api-verbs/create.ts b/apps/web/src/schema/workflow/task-category/api-verbs/create.ts new file mode 100644 index 0000000000..4002fd5d26 --- /dev/null +++ b/apps/web/src/schema/workflow/task-category/api-verbs/create.ts @@ -0,0 +1,12 @@ +import type { Tags } from '@/schema/_common/model'; +import type { TaskField } from '@/schema/workflow/_types/task-field-type'; +import type { TaskStatusOption } from '@/schema/workflow/task/type'; + +export interface TaskCategoryCreateParameters { + name: string; + description?: string; + status_options: TaskStatusOption[]; + fields?: TaskField[]; + tags?: Tags; + package_id: string; +} diff --git a/apps/web/src/schema/workflow/task-category/api-verbs/delete.ts b/apps/web/src/schema/workflow/task-category/api-verbs/delete.ts new file mode 100644 index 0000000000..edff2cbf5c --- /dev/null +++ b/apps/web/src/schema/workflow/task-category/api-verbs/delete.ts @@ -0,0 +1,3 @@ +export interface TaskCategoryDeleteParameters { + category_id: string; +} diff --git a/apps/web/src/schema/workflow/task-category/api-verbs/get.ts b/apps/web/src/schema/workflow/task-category/api-verbs/get.ts new file mode 100644 index 0000000000..283fa9534a --- /dev/null +++ b/apps/web/src/schema/workflow/task-category/api-verbs/get.ts @@ -0,0 +1,3 @@ +export interface TaskCategoryGetParameters { + category_id: string; +} diff --git a/apps/web/src/schema/workflow/task-category/api-verbs/list.ts b/apps/web/src/schema/workflow/task-category/api-verbs/list.ts new file mode 100644 index 0000000000..c9b8e2d1f7 --- /dev/null +++ b/apps/web/src/schema/workflow/task-category/api-verbs/list.ts @@ -0,0 +1,7 @@ +import type { Query } from '@cloudforet/core-lib/space-connector/type'; + +export interface TaskCategoryListParameters { + query?: Query; + category_id?: string; + name?: string; +} diff --git a/apps/web/src/schema/workflow/task-category/api-verbs/update.ts b/apps/web/src/schema/workflow/task-category/api-verbs/update.ts new file mode 100644 index 0000000000..6247bf2807 --- /dev/null +++ b/apps/web/src/schema/workflow/task-category/api-verbs/update.ts @@ -0,0 +1,13 @@ +import type { Tags } from '@/schema/_common/model'; +import type { TaskField, TaskStatusOption } from '@/schema/workflow/_types/task-field-type'; + +export interface TaskCategoryUpdateParameters { + category_id: string; + name?: string; + description?: string; + status_options: TaskStatusOption[]; + fields?: TaskField[]; + force?: boolean; + tags?: Tags; + package_id?: string; +} diff --git a/apps/web/src/schema/workflow/task-category/model.ts b/apps/web/src/schema/workflow/task-category/model.ts new file mode 100644 index 0000000000..68583c0b62 --- /dev/null +++ b/apps/web/src/schema/workflow/task-category/model.ts @@ -0,0 +1,16 @@ +import type { Tags } from '@/schema/_common/model'; +import type { TaskField } from '@/schema/workflow/_types/task-field-type'; +import type { TaskStatusOption } from '@/schema/workflow/task/type'; + +export interface TaskCategoryModel { + category_id: string; + name: string; + description: string; + status_options: TaskStatusOption[]; + fields:TaskField[]; + tags: Tags; + package_id: string; + domain_id: string; + created_at: string; + updated_at: string; +} diff --git a/apps/web/src/schema/workflow/task-type/api-verbs/create.ts b/apps/web/src/schema/workflow/task-type/api-verbs/create.ts new file mode 100644 index 0000000000..8c08cb679a --- /dev/null +++ b/apps/web/src/schema/workflow/task-type/api-verbs/create.ts @@ -0,0 +1,10 @@ +import type { Tags } from '@/schema/_common/model'; +import type { TaskField } from '@/schema/workflow/_types/task-field-type'; + +export interface TaskTypeCreateParameters { + name: string; + description?: string; + fields?: TaskField[]; + tags?: Tags; + category_id?: string; +} diff --git a/apps/web/src/schema/workflow/task-type/api-verbs/delete.ts b/apps/web/src/schema/workflow/task-type/api-verbs/delete.ts new file mode 100644 index 0000000000..a80953d89b --- /dev/null +++ b/apps/web/src/schema/workflow/task-type/api-verbs/delete.ts @@ -0,0 +1,3 @@ +export interface TaskTypeDeleteParameters { + task_type_id: string; +} diff --git a/apps/web/src/schema/workflow/task-type/api-verbs/get.ts b/apps/web/src/schema/workflow/task-type/api-verbs/get.ts new file mode 100644 index 0000000000..8a49ed92d3 --- /dev/null +++ b/apps/web/src/schema/workflow/task-type/api-verbs/get.ts @@ -0,0 +1,3 @@ +export interface TaskTypeGetParameters { + task_type_id: string; +} diff --git a/apps/web/src/schema/workflow/task-type/api-verbs/list.ts b/apps/web/src/schema/workflow/task-type/api-verbs/list.ts new file mode 100644 index 0000000000..5d02aee1b0 --- /dev/null +++ b/apps/web/src/schema/workflow/task-type/api-verbs/list.ts @@ -0,0 +1,7 @@ +import type { Query } from '@cloudforet/core-lib/space-connector/type'; + +export interface TaskTypeListParameters { + query?: Query; + task_type_id?: string; + name?: string; +} diff --git a/apps/web/src/schema/workflow/task-type/api-verbs/update.ts b/apps/web/src/schema/workflow/task-type/api-verbs/update.ts new file mode 100644 index 0000000000..f3eefa1e6b --- /dev/null +++ b/apps/web/src/schema/workflow/task-type/api-verbs/update.ts @@ -0,0 +1,11 @@ +import type { Tags } from '@/schema/_common/model'; +import type { TaskField } from '@/schema/workflow/_types/task-field-type'; + +export interface TaskTypeUpdateParameters { + task_type_id: string; + name?: string; + description?: string; + fields?: TaskField[]; + tags?: Tags; + category_id?: string; +} diff --git a/apps/web/src/schema/workflow/task-type/model.ts b/apps/web/src/schema/workflow/task-type/model.ts new file mode 100644 index 0000000000..66edb61cb7 --- /dev/null +++ b/apps/web/src/schema/workflow/task-type/model.ts @@ -0,0 +1,15 @@ +import type { Tags } from '@/schema/_common/model'; +import type { TaskField } from '@/schema/workflow/_types/task-field-type'; + +export interface TaskTypeModel { + task_type_id: string; + name: string; + description: string; + assignee?: string; + fields: TaskField[]; + tags: Tags; + category_id: string; + domain_id: string; + created_at: string; + updated_at: string; +} diff --git a/apps/web/src/schema/workflow/task/api-verbs/change-status.ts b/apps/web/src/schema/workflow/task/api-verbs/change-status.ts new file mode 100644 index 0000000000..cccb4deb61 --- /dev/null +++ b/apps/web/src/schema/workflow/task/api-verbs/change-status.ts @@ -0,0 +1,6 @@ +export interface TaskChangeStatusParameters { + task_id: string; + status: string; + assignee?: string; + comment?: string; +} diff --git a/apps/web/src/schema/workflow/task/api-verbs/create.ts b/apps/web/src/schema/workflow/task/api-verbs/create.ts new file mode 100644 index 0000000000..02b4a75cbf --- /dev/null +++ b/apps/web/src/schema/workflow/task/api-verbs/create.ts @@ -0,0 +1,15 @@ +import type { ResourceGroupType } from '@/schema/_common/type'; +import type { MentionTargets } from '@/schema/workflow/comment/type'; + +export interface TaskCreateParameters { + task_type_id: string; + name: string; + status: string; + description?: string; + mention_targets?: MentionTargets; + assignee?: string; + data?: Record; + resource_group: Extract; + project_id?: string; + workspace_id?: string; +} diff --git a/apps/web/src/schema/workflow/task/api-verbs/delete.ts b/apps/web/src/schema/workflow/task/api-verbs/delete.ts new file mode 100644 index 0000000000..65b6285466 --- /dev/null +++ b/apps/web/src/schema/workflow/task/api-verbs/delete.ts @@ -0,0 +1,3 @@ +export interface TaskDeleteParameters { + task_id: string; +} diff --git a/apps/web/src/schema/workflow/task/api-verbs/get.ts b/apps/web/src/schema/workflow/task/api-verbs/get.ts new file mode 100644 index 0000000000..8d060d9c2f --- /dev/null +++ b/apps/web/src/schema/workflow/task/api-verbs/get.ts @@ -0,0 +1,3 @@ +export interface TaskGetParameters { + task_id: string; +} diff --git a/apps/web/src/schema/workflow/task/api-verbs/list.ts b/apps/web/src/schema/workflow/task/api-verbs/list.ts new file mode 100644 index 0000000000..f7149a48dc --- /dev/null +++ b/apps/web/src/schema/workflow/task/api-verbs/list.ts @@ -0,0 +1,10 @@ +import type { Query } from '@cloudforet/core-lib/space-connector/type'; + +export interface TaskListParameters { + query?: Query; + task_id?: string; + name?: string; + status?: string; + project_id?: string; + workspace_id?: string; +} diff --git a/apps/web/src/schema/workflow/task/api-verbs/update.ts b/apps/web/src/schema/workflow/task/api-verbs/update.ts new file mode 100644 index 0000000000..6a068f2ca4 --- /dev/null +++ b/apps/web/src/schema/workflow/task/api-verbs/update.ts @@ -0,0 +1,11 @@ +import type { MentionTargets } from '@/schema/workflow/comment/type'; + +export interface TaskUpdateParameters { + task_id: string; + name?: string; + description?: string; + mention_targets?: MentionTargets; + assignee?: string; + data?: Record; + project_id?: string; +} diff --git a/apps/web/src/schema/workflow/task/model.ts b/apps/web/src/schema/workflow/task/model.ts new file mode 100644 index 0000000000..7714c685d3 --- /dev/null +++ b/apps/web/src/schema/workflow/task/model.ts @@ -0,0 +1,19 @@ +import type { ResourceGroupType } from '@/schema/_common/type'; +import type { TaskStatusType } from '@/schema/workflow/task/type'; + +export interface TaskModel { + task_id: string; + name: string; + status: string; + status_type: TaskStatusType; + description: string; + data: Record; + resource_group: Extract; + project_id: string; + workspace_id: string; + domain_id: string; + created_at: string; + started_at: string; + updated_at: string; + completed_at: string; +} diff --git a/apps/web/src/schema/workflow/task/type.ts b/apps/web/src/schema/workflow/task/type.ts new file mode 100644 index 0000000000..9afdd36737 --- /dev/null +++ b/apps/web/src/schema/workflow/task/type.ts @@ -0,0 +1,6 @@ +export type TaskStatusType = 'TODO'|'IN_PROGRESS'|'COMPLETE'; +export interface TaskStatusOption { + name: string; + color: string; + status_type: TaskStatusType; +} diff --git a/apps/web/src/services/itsm/ITSMContainer.vue b/apps/web/src/services/itsm/ITSMContainer.vue new file mode 100644 index 0000000000..ea00f2394e --- /dev/null +++ b/apps/web/src/services/itsm/ITSMContainer.vue @@ -0,0 +1,26 @@ + + + diff --git a/apps/web/src/services/itsm/components/AddOrEditCategoryModal.vue b/apps/web/src/services/itsm/components/AddOrEditCategoryModal.vue new file mode 100644 index 0000000000..fab7ca75bb --- /dev/null +++ b/apps/web/src/services/itsm/components/AddOrEditCategoryModal.vue @@ -0,0 +1,133 @@ + + + diff --git a/apps/web/src/services/itsm/components/AddOrEditPackageModal.vue b/apps/web/src/services/itsm/components/AddOrEditPackageModal.vue new file mode 100644 index 0000000000..148c950b0d --- /dev/null +++ b/apps/web/src/services/itsm/components/AddOrEditPackageModal.vue @@ -0,0 +1,126 @@ + + + + diff --git a/apps/web/src/services/itsm/components/SupportPackagePanel.vue b/apps/web/src/services/itsm/components/SupportPackagePanel.vue new file mode 100644 index 0000000000..d4f0d1279e --- /dev/null +++ b/apps/web/src/services/itsm/components/SupportPackagePanel.vue @@ -0,0 +1,84 @@ + + + + diff --git a/apps/web/src/services/itsm/components/TaskCategoryPanel.vue b/apps/web/src/services/itsm/components/TaskCategoryPanel.vue new file mode 100644 index 0000000000..36337c76c0 --- /dev/null +++ b/apps/web/src/services/itsm/components/TaskCategoryPanel.vue @@ -0,0 +1,107 @@ + + + + diff --git a/apps/web/src/services/itsm/pages/BoardPage.vue b/apps/web/src/services/itsm/pages/BoardPage.vue new file mode 100644 index 0000000000..3d55c81b7e --- /dev/null +++ b/apps/web/src/services/itsm/pages/BoardPage.vue @@ -0,0 +1,8 @@ + + + + diff --git a/apps/web/src/services/itsm/pages/ITSMLandingPage.vue b/apps/web/src/services/itsm/pages/ITSMLandingPage.vue new file mode 100644 index 0000000000..102a83d7de --- /dev/null +++ b/apps/web/src/services/itsm/pages/ITSMLandingPage.vue @@ -0,0 +1,8 @@ + + + + diff --git a/apps/web/src/services/itsm/pages/TaskCreatePage.vue b/apps/web/src/services/itsm/pages/TaskCreatePage.vue new file mode 100644 index 0000000000..033f5317a0 --- /dev/null +++ b/apps/web/src/services/itsm/pages/TaskCreatePage.vue @@ -0,0 +1,8 @@ + + + + diff --git a/apps/web/src/services/itsm/pages/TaskDetailPage.vue b/apps/web/src/services/itsm/pages/TaskDetailPage.vue new file mode 100644 index 0000000000..d1f461941e --- /dev/null +++ b/apps/web/src/services/itsm/pages/TaskDetailPage.vue @@ -0,0 +1,7 @@ + + + diff --git a/apps/web/src/services/itsm/pages/admin/AdminTaskCategoryDetailPage.vue b/apps/web/src/services/itsm/pages/admin/AdminTaskCategoryDetailPage.vue new file mode 100644 index 0000000000..fab086bd99 --- /dev/null +++ b/apps/web/src/services/itsm/pages/admin/AdminTaskCategoryDetailPage.vue @@ -0,0 +1,7 @@ + + + diff --git a/apps/web/src/services/itsm/pages/admin/AdminTaskManagementPage.vue b/apps/web/src/services/itsm/pages/admin/AdminTaskManagementPage.vue new file mode 100644 index 0000000000..9fcf8d9be7 --- /dev/null +++ b/apps/web/src/services/itsm/pages/admin/AdminTaskManagementPage.vue @@ -0,0 +1,58 @@ + + + + diff --git a/apps/web/src/services/itsm/pages/admin/AdminWorkflowPage.vue b/apps/web/src/services/itsm/pages/admin/AdminWorkflowPage.vue new file mode 100644 index 0000000000..ecd18e8e16 --- /dev/null +++ b/apps/web/src/services/itsm/pages/admin/AdminWorkflowPage.vue @@ -0,0 +1,8 @@ + + + + diff --git a/apps/web/src/services/itsm/routes/admin/routes.ts b/apps/web/src/services/itsm/routes/admin/routes.ts new file mode 100644 index 0000000000..204dd18992 --- /dev/null +++ b/apps/web/src/services/itsm/routes/admin/routes.ts @@ -0,0 +1,62 @@ +import type { RouteConfig } from 'vue-router'; + +import { makeAdminRouteName } from '@/router/helpers/route-helper'; + +import { MENU_ID } from '@/lib/menu/config'; +import { MENU_INFO_MAP } from '@/lib/menu/menu-info'; + +import { ITSM_ROUTE } from '@/services/itsm/routes/route-constant'; + +const ITSMContainer = () => import('@/services/itsm/ITSMContainer.vue'); + +const AdminTaskManagementPage = () => import('@/services/itsm/pages/admin/AdminTaskManagementPage.vue'); +const AdminTaskCategoryDetailPage = () => import('@/services/itsm/pages/admin/AdminTaskCategoryDetailPage.vue'); +const AdminWorkflowPage = () => import('@/services/itsm/pages/admin/AdminWorkflowPage.vue'); + +const adminItsmRoutes: RouteConfig = { + path: 'itsm', + name: makeAdminRouteName(ITSM_ROUTE._NAME), + meta: { + menuId: MENU_ID.ITSM, + translationId: MENU_INFO_MAP[MENU_ID.ITSM].translationId, + }, + redirect: () => ({ name: makeAdminRouteName(ITSM_ROUTE.TASK_MANAGEMENT._NAME) }), + component: ITSMContainer, + children: [ + { + path: 'task-management', + name: makeAdminRouteName(ITSM_ROUTE.TASK_MANAGEMENT._NAME), + redirect: () => ({ name: makeAdminRouteName(ITSM_ROUTE.TASK_MANAGEMENT.TASK_CATEGORY._NAME) }), + meta: { + menuId: MENU_ID.TASK_MANAGEMENT, + translationId: MENU_INFO_MAP[MENU_ID.TASK_MANAGEMENT].translationId, + }, + component: AdminTaskManagementPage as any, + children: [ + { + path: 'task-category', + name: makeAdminRouteName(ITSM_ROUTE.TASK_MANAGEMENT.TASK_CATEGORY._NAME), + component: { template: '' }, + children: [ + { + path: ':taskCategoryId', + name: makeAdminRouteName(ITSM_ROUTE.TASK_MANAGEMENT.TASK_CATEGORY.DETAIL._NAME), + component: AdminTaskCategoryDetailPage as any, + }, + ], + }, + ], + }, + { + path: 'workflow:workflowId?', + name: makeAdminRouteName(ITSM_ROUTE.WORKFLOW._NAME), + meta: { + menuId: MENU_ID.WORKFLOW, + translationId: MENU_INFO_MAP[MENU_ID.WORKFLOW].translationId, + }, + component: AdminWorkflowPage as any, + }, + ], +}; + +export default adminItsmRoutes; diff --git a/apps/web/src/services/itsm/routes/route-constant.ts b/apps/web/src/services/itsm/routes/route-constant.ts new file mode 100644 index 0000000000..40fa7387fc --- /dev/null +++ b/apps/web/src/services/itsm/routes/route-constant.ts @@ -0,0 +1,23 @@ +import { MENU_ID } from '@/lib/menu/config'; + +export const ITSM_ROUTE = Object.freeze({ + _NAME: MENU_ID.ITSM, + ITSM_LANDING: { _NAME: `${MENU_ID.ITSM}.${MENU_ID.ITSM_LANDING}` }, + BOARD: { + _NAME: `${MENU_ID.ITSM}.${MENU_ID.BOARD}`, + TASK_DETAIL: { _NAME: `${MENU_ID.ITSM}.${MENU_ID.BOARD}.task_detail` }, + TASK_CREATE: { _NAME: `${MENU_ID.ITSM}.${MENU_ID.BOARD}.task_create` }, + }, + WORKFLOW: { + _NAME: `${MENU_ID.ITSM}.${MENU_ID.WORKFLOW}`, + DETAIL: { _NAME: `${MENU_ID.ITSM}.${MENU_ID.WORKFLOW}.detail` }, + }, + TASK_MANAGEMENT: { + _NAME: `${MENU_ID.ITSM}.${MENU_ID.TASK_MANAGEMENT}`, + TASK_CATEGORY: { + _NAME: `${MENU_ID.ITSM}.${MENU_ID.TASK_MANAGEMENT}.task_category`, + DETAIL: { _NAME: `${MENU_ID.ITSM}.${MENU_ID.TASK_MANAGEMENT}.task_category.detail` }, + CREATE: { _NAME: `${MENU_ID.ITSM}.${MENU_ID.TASK_MANAGEMENT}.task_category.create` }, + }, + }, +}); diff --git a/apps/web/src/services/itsm/routes/routes.ts b/apps/web/src/services/itsm/routes/routes.ts new file mode 100644 index 0000000000..f38fd0e07a --- /dev/null +++ b/apps/web/src/services/itsm/routes/routes.ts @@ -0,0 +1,62 @@ +import type { RouteConfig } from 'vue-router'; + +import { store } from '@/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'; + +import { ITSM_ROUTE } from '@/services/itsm/routes/route-constant'; + +const ITSMContainer = () => import('@/services/itsm/ITSMContainer.vue'); + +const ITSMLandingPage = () => import('@/services/itsm/pages/ITSMLandingPage.vue'); +const BoardPage = () => import('@/services/itsm/pages/BoardPage.vue'); +const TaskDetailPage = () => import('@/services/itsm/pages/TaskDetailPage.vue'); +const TaskCreatePage = () => import('@/services/itsm/pages/TaskCreatePage.vue'); + +const itsmRoutes: RouteConfig = { + path: 'itsm', + name: ITSM_ROUTE._NAME, + meta: { + menuId: MENU_ID.ITSM, + translationId: MENU_INFO_MAP[MENU_ID.ITSM].translationId, + }, + redirect: (to) => getRedirectRouteByPagePermission(to, store.getters['user/pageAccessPermissionMap']), + component: ITSMContainer, + children: [ + { + path: 'landing', + name: ITSM_ROUTE.ITSM_LANDING._NAME, + meta: { + menuId: MENU_ID.ITSM_LANDING, + translationId: MENU_INFO_MAP[MENU_ID.ITSM_LANDING].translationId, + }, + component: ITSMLandingPage as any, + }, + { + path: 'board', + name: ITSM_ROUTE.BOARD._NAME, + meta: { + menuId: MENU_ID.BOARD, + translationId: MENU_INFO_MAP[MENU_ID.BOARD].translationId, + }, + component: BoardPage as any, + children: [ + { + path: ':taskId', + name: ITSM_ROUTE.BOARD.TASK_DETAIL._NAME, + props: true, + component: TaskDetailPage as any, + }, + { + path: 'task-create', + name: ITSM_ROUTE.BOARD.TASK_CREATE._NAME, + component: TaskCreatePage as any, + }, + ], + }, + ], +}; + +export default itsmRoutes; diff --git a/apps/web/src/services/itsm/stores/admin/package-store.ts b/apps/web/src/services/itsm/stores/admin/package-store.ts new file mode 100644 index 0000000000..bf84bac13c --- /dev/null +++ b/apps/web/src/services/itsm/stores/admin/package-store.ts @@ -0,0 +1,100 @@ +import { reactive } from 'vue'; + +import { defineStore } from 'pinia'; + +import type { PackageCreateParameters } from '@/schema/identity/package/api-verbs/create'; +import type { PackageUpdateParameters } from '@/schema/identity/package/api-verbs/update'; +import type { PackageModel } from '@/schema/identity/package/model'; + +interface UsePackageStoreState { + loading: boolean; + packages?: PackageModel[]; + creating: boolean; +} +export const usePackageStore = defineStore('package', () => { + const state = reactive({ + loading: false, + packages: undefined, + creating: false, + }); + const actions = { + async fetchPackages() { + return new Promise((resolve) => { + state.loading = true; + setTimeout(() => { + state.packages = [ + { + package_id: 'package_1', + name: 'Advanced', + description: '고급 패키지', + order: 1, + tags: {}, + domain_id: '1', + created_at: '2021-09-01T00:00:00', + updated_at: '2021-09-01T00:00:00', + }, + { + package_id: 'package_2', + name: 'Standard', + description: '표준 패키지', + order: 2, + tags: {}, + domain_id: '1', + created_at: '2021-09-01T00:00:00', + updated_at: '2021-09-01T00:00:00', + }, + { + package_id: 'package_3', + name: 'Basic', + description: '기본 패키지', + order: 3, + tags: {}, + domain_id: '1', + created_at: '2021-09-01T00:00:00', + updated_at: '2021-09-01T00:00:00', + }, + ]; + state.loading = false; + resolve(); + }, 1000); + }); + }, + async createPackage(param: PackageCreateParameters) { + return new Promise((resolve) => { + state.creating = true; + setTimeout(() => { + state.packages?.push({ + package_id: `package_${(state.packages?.length ?? 0) + 1}`, + name: param.name, + description: param.description, + order: 4, + tags: param.tags, + domain_id: '1', + created_at: '2021-09-01T00:00:00', + updated_at: '2021-09-01T00:00:00', + }); + state.creating = false; + resolve(); + }, 1000); + }); + }, + async updatePackage(param: PackageUpdateParameters) { + return new Promise((resolve) => { + setTimeout(() => { + const targetPackage = state.packages?.find((p) => p.package_id === param.package_id); + if (targetPackage) { + targetPackage.name = param.name ?? targetPackage.name; + targetPackage.description = param.description ?? targetPackage.description; + targetPackage.tags = param.tags ?? targetPackage.tags; + targetPackage.updated_at = Date.now().toString(); + } + resolve(); + }, 1000); + }); + }, + }; + return { + state, + ...actions, + }; +}); diff --git a/apps/web/src/services/itsm/stores/admin/task-management-page-store.ts b/apps/web/src/services/itsm/stores/admin/task-management-page-store.ts new file mode 100644 index 0000000000..9e58087271 --- /dev/null +++ b/apps/web/src/services/itsm/stores/admin/task-management-page-store.ts @@ -0,0 +1,84 @@ +import type { ComputedRef } from 'vue'; +import { reactive, computed } from 'vue'; + +import { defineStore } from 'pinia'; + +import { usePackageStore } from '@/services/itsm/stores/admin/package-store'; +import { useTaskCategoryStore } from '@/services/itsm/stores/task-category-store'; +// import { useTaskTypeStore } from '@/services/itsm/stores/task-type-store'; + +interface UseTaskManagementPageStoreState { + currentTemplateId?: string; + // support package + visibleAddOrEditPackageModal: boolean; + editTargetPackageId?: string; + // category + visibleAddOrEditCategoryModal: boolean; + editTargetCategoryId?: string; +} + +interface UseTaskManagementPageStoreGetters { + currentTemplate: ComputedRef; + +} + +export const useTaskManagementPageStore = defineStore('task-management-page', () => { + const packageStore = usePackageStore(); + const taskCategoryStore = useTaskCategoryStore(); + // const taskTypeStore = useTaskTypeStore(); + const state = reactive({ + currentTemplateId: 'support-center', + // support package + visibleAddOrEditPackageModal: false, + editTargetPackageId: undefined, + // category + visibleAddOrEditCategoryModal: false, + editTargetCategoryId: undefined, + }); + const getters = reactive({ + currentTemplate: computed(() => ({ + title: 'Support Center', + task_category: 'Ticket Category', + task_type: 'Ticket Topic', + })), + + }); + const actions = { + setCurrentTemplateId(templateId: string) { + state.currentTemplateId = templateId; + }, + // support package + openAddPackageModal() { + state.editTargetPackageId = undefined; + state.visibleAddOrEditPackageModal = true; + }, + closeAddOrEditPackageModal() { + state.editTargetPackageId = undefined; + state.visibleAddOrEditPackageModal = false; + }, + openEditPackageModal(packageId: string) { + state.editTargetPackageId = packageId; + state.visibleAddOrEditPackageModal = true; + }, + // category + openAddCategoryModal() { + state.editTargetCategoryId = undefined; + state.visibleAddOrEditCategoryModal = true; + }, + closeAddOrEditCategoryModal() { + state.editTargetCategoryId = undefined; + state.visibleAddOrEditCategoryModal = false; + }, + openEditCategoryModal(categoryId: string) { + state.editTargetCategoryId = categoryId; + state.visibleAddOrEditCategoryModal = true; + }, + }; + return { + packageStore, + taskCategoryStore, + state, + getters, + ...actions, + }; +}); diff --git a/apps/web/src/services/itsm/stores/task-category-store.ts b/apps/web/src/services/itsm/stores/task-category-store.ts new file mode 100644 index 0000000000..62c3685521 --- /dev/null +++ b/apps/web/src/services/itsm/stores/task-category-store.ts @@ -0,0 +1,184 @@ +import { reactive } from 'vue'; + +import { defineStore } from 'pinia'; + +import type { TaskCategoryCreateParameters } from '@/schema/workflow/task-category/api-verbs/create'; +import type { TaskCategoryUpdateParameters } from '@/schema/workflow/task-category/api-verbs/update'; +import type { TaskCategoryModel } from '@/schema/workflow/task-category/model'; + +interface UseTaskCategoryStoreState { + loading: boolean; + taskCategories?: TaskCategoryModel[]; + creating: boolean; + updating: boolean; +} + +export const useTaskCategoryStore = defineStore('task-category', () => { + const state = reactive({ + loading: false, + taskCategories: undefined, + creating: false, + updating: false, + }) as UseTaskCategoryStoreState; + const actions = { + async fetchCategories() { + return new Promise((resolve) => { + state.loading = true; + setTimeout(() => { + state.taskCategories = [ + { + category_id: 'category_1', + package_id: 'package_1', + name: 'Billing and Payment', + description: '빌링 및 결제와 관련된 문의사항', + status_options: [ + { + name: '요청', + status_type: 'TODO', + color: 'gray', + }, + { + name: '진행중', + status_type: 'IN_PROGRESS', + color: 'blue', + }, + { + name: '완료', + status_type: 'COMPLETE', + color: 'green', + }, + { + name: '보류', + status_type: 'COMPLETE', + color: 'yellow', + }, + { + name: '취소', + status_type: 'COMPLETE', + color: 'red', + }, + ], + fields: [], + domain_id: '1', + created_at: '2021-09-01T00:00:00', + updated_at: '2021-09-01T00:00:00', + tags: {}, + }, + { + category_id: 'category_2', + package_id: 'package_1', + name: 'Service Limit In-Crease', + description: '서비스 한도 증가와 관련된 문의사항', + status_options: [ + { + name: '요청', + status_type: 'TODO', + color: 'gray', + }, + { + name: '확인중', + status_type: 'IN_PROGRESS', + color: 'yellow', + }, + { + name: '진행중', + status_type: 'IN_PROGRESS', + color: 'blue', + }, + { + name: '완료', + status_type: 'COMPLETE', + color: 'green', + }, + ], + fields: [], + domain_id: '1', + created_at: '2021-09-01T00:00:00', + updated_at: '2021-09-01T00:00:00', + tags: {}, + }, { + category_id: 'category_3', + package_id: 'package_2', + name: 'Technical Support', + description: '기술 지원과 관련된 문의사항', + status_options: [ + { + name: '요청', + status_type: 'TODO', + color: 'gray', + }, + { + name: '진행중', + status_type: 'IN_PROGRESS', + color: 'blue', + }, + { + name: '완료', + status_type: 'COMPLETE', + color: 'green', + }, + ], + fields: [], + domain_id: '1', + created_at: '2021-09-01T00:00:00', + updated_at: '2021-09-01T00:00:00', + tags: {}, + }, + ]; + state.loading = false; + resolve(); + }, 1000); + }); + }, + async createCategory(param: Omit) { + return new Promise((resolve) => { + state.creating = true; + state.taskCategories?.push({ + category_id: `category_${(state.taskCategories?.length ?? 0) + 1}`, + package_id: param.package_id, + name: param.name, + description: param.description ?? '', + status_options: [{ + name: '요청', + status_type: 'TODO', + color: 'gray', + }, { + name: '진행중', + status_type: 'IN_PROGRESS', + color: 'blue', + }, { + name: '완료', + status_type: 'COMPLETE', + color: 'green', + }], + fields: [], + domain_id: '1', + created_at: '2021-09-01T00:00:00', + updated_at: '2021-09-01T00:00:00', + tags: param.tags ?? {}, + }); + state.creating = false; + resolve(); + }); + }, + async updateCategory(param: Omit) { + return new Promise((resolve) => { + state.updating = true; + setTimeout(() => { + const targetCategory = state.taskCategories?.find((category) => category.category_id === param.category_id); + if (targetCategory) { + if (param.name) targetCategory.name = param.name; + if (targetCategory.description) targetCategory.description = param.description ?? ''; + if (targetCategory.tags) targetCategory.tags = param.tags ?? {}; + } + state.updating = false; + resolve(); + }, 1000); + }); + }, + }; + return { + state, + ...actions, + }; +}); diff --git a/apps/web/src/services/itsm/stores/task-type-store.ts b/apps/web/src/services/itsm/stores/task-type-store.ts new file mode 100644 index 0000000000..a70b2d41bd --- /dev/null +++ b/apps/web/src/services/itsm/stores/task-type-store.ts @@ -0,0 +1,122 @@ +import { reactive } from 'vue'; + +import { defineStore } from 'pinia'; + +import type { TaskTypeModel } from '@/schema/workflow/task-type/model'; + +import getRandomId from '@/lib/random-id-generator'; + +interface UseTaskTypeStoreState { + taskTypes?: TaskTypeModel[]; +} + +export const useTaskTypeStore = defineStore('task-type', () => { + const state = reactive({ + taskTypes: [ + { + task_type_id: 'task_type_1', + name: 'Account', + description: '계정과 관련된 문의사항', + assignee: 'wanjin@mz.co.kr', + fields: [ + { + field_id: getRandomId(), + name: '제목', + field_type: 'TEXT', + is_required: true, + is_primary: true, + }, + { + field_id: getRandomId(), + name: '설명', + field_type: 'PARAGRAPH', + is_required: false, + is_primary: true, + }, + ], + category_id: 'category_1', + tags: {}, + domain_id: '1', + created_at: '2021-09-01T00:00:00', + updated_at: '2021-09-01T00:00:00', + }, + { + task_type_id: 'task_type_2', + name: 'Invoice', + description: '청구서와 관련된 문의사항', + assignee: 'bokjang@mz.co.kr', + fields: [ + { + field_id: getRandomId(), + name: '제목', + field_type: 'TEXT', + is_required: true, + is_primary: true, + }, + { + field_id: getRandomId(), + name: '설명', + field_type: 'PARAGRAPH', + is_required: true, + is_primary: true, + }, + { + field_id: getRandomId(), + name: '서비스', + field_type: 'DROPDOWN', + options: ['서비스1', '서비스2', '서비스3'], + is_required: false, + }, + { + field_id: getRandomId(), + name: '연결된 자산', + field_type: 'ASSET', + is_required: false, + }, + { + field_id: getRandomId(), + name: '담당자', + field_type: 'USER', + is_required: false, + }, + ], + category_id: 'category_1', + tags: {}, + domain_id: '1', + created_at: '2021-09-01T00:00:00', + updated_at: '2021-09-01T00:00:00', + }, + { + task_type_id: 'task_type_3', + name: 'Billing', + description: '빌링과 관련된 문의사항', + fields: [ + { + field_id: getRandomId(), + name: '제목', + field_type: 'TEXT', + is_required: true, + is_primary: true, + }, + { + field_id: getRandomId(), + name: '설명', + field_type: 'PARAGRAPH', + is_required: false, + is_primary: false, + }, + ], + category_id: 'category_2', + tags: {}, + domain_id: '1', + created_at: '2021-09-01T00:00:00', + updated_at: '2021-09-01T00:00:00', + }, + ], + }) as UseTaskTypeStoreState; + const actions = {}; + return { + state, + ...actions, + }; +}); From fd0db3e2ab3adb2cf74c847a8d140312cdb693b4 Mon Sep 17 00:00:00 2001 From: Wanjin Noh Date: Mon, 18 Nov 2024 21:31:16 +0900 Subject: [PATCH 02/53] feat: update package and workspace interfaces, update existing models Signed-off-by: Wanjin Noh --- .../identity/package/api-verbs/change-order.ts | 4 ++++ .../identity/package/api-verbs/create.ts | 4 ++-- .../identity/package/api-verbs/delete.ts | 3 +++ .../schema/identity/package/api-verbs/get.ts | 3 +++ .../identity/package/api-verbs/set-default.ts | 3 +++ apps/web/src/schema/identity/package/model.ts | 1 + .../workspace/api-verbs/add-package.ts | 4 ++++ .../identity/workspace/api-verbs/create.ts | 1 + .../workspace/api-verbs/remove-package.ts | 4 ++++ .../web/src/schema/identity/workspace/model.ts | 2 ++ .../_types/task-field-type.ts | 4 +++- .../schema/opsflow/comment/api-verbs/create.ts | 7 +++++++ .../comment/api-verbs/get.ts | 0 .../comment/api-verbs/list.ts | 3 ++- .../schema/opsflow/comment/api-verbs/update.ts | 7 +++++++ apps/web/src/schema/opsflow/comment/model.ts | 15 +++++++++++++++ .../{workflow => opsflow}/comment/type.ts | 0 .../src/schema/opsflow/event/api-verbs/list.ts | 10 ++++++++++ apps/web/src/schema/opsflow/event/model.ts | 15 +++++++++++++++ apps/web/src/schema/opsflow/event/type.ts | 1 + .../task-category/api-verbs/create.ts | 6 +++--- .../task-category/api-verbs/delete.ts | 0 .../task-category/api-verbs/get.ts | 0 .../task-category/api-verbs/list.ts | 0 .../task-category/api-verbs/update.ts | 5 +++-- .../task-category/model.ts | 6 +++--- .../task-type/api-verbs/create.ts | 4 ++-- .../task-type/api-verbs/delete.ts | 0 .../task-type/api-verbs/get.ts | 0 .../task-type/api-verbs/list.ts | 0 .../task-type/api-verbs/update.ts | 2 +- .../{workflow => opsflow}/task-type/model.ts | 4 ++-- .../task/api-verbs/change-status.ts | 0 .../schema/opsflow/task/api-verbs/create.ts | 16 ++++++++++++++++ .../task/api-verbs/delete.ts | 0 .../task/api-verbs/get.ts | 0 .../task/api-verbs/list.ts | 8 +++++++- .../schema/opsflow/task/api-verbs/update.ts | 15 +++++++++++++++ .../schema/{workflow => opsflow}/task/model.ts | 11 +++++++---- apps/web/src/schema/opsflow/task/type.ts | 9 +++++++++ .../workflow/comment/api-verbs/create.ts | 4 ---- .../workflow/comment/api-verbs/update.ts | 7 ------- apps/web/src/schema/workflow/comment/model.ts | 18 ------------------ .../schema/workflow/event/api-verbs/list.ts | 6 ------ apps/web/src/schema/workflow/event/model.ts | 16 ---------------- apps/web/src/schema/workflow/event/type.ts | 1 - .../schema/workflow/task/api-verbs/create.ts | 15 --------------- .../schema/workflow/task/api-verbs/update.ts | 11 ----------- apps/web/src/schema/workflow/task/type.ts | 6 ------ 49 files changed, 155 insertions(+), 106 deletions(-) create mode 100644 apps/web/src/schema/identity/package/api-verbs/change-order.ts create mode 100644 apps/web/src/schema/identity/package/api-verbs/delete.ts create mode 100644 apps/web/src/schema/identity/package/api-verbs/get.ts create mode 100644 apps/web/src/schema/identity/package/api-verbs/set-default.ts create mode 100644 apps/web/src/schema/identity/workspace/api-verbs/add-package.ts create mode 100644 apps/web/src/schema/identity/workspace/api-verbs/remove-package.ts rename apps/web/src/schema/{workflow => opsflow}/_types/task-field-type.ts (71%) create mode 100644 apps/web/src/schema/opsflow/comment/api-verbs/create.ts rename apps/web/src/schema/{workflow => opsflow}/comment/api-verbs/get.ts (100%) rename apps/web/src/schema/{workflow => opsflow}/comment/api-verbs/list.ts (75%) create mode 100644 apps/web/src/schema/opsflow/comment/api-verbs/update.ts create mode 100644 apps/web/src/schema/opsflow/comment/model.ts rename apps/web/src/schema/{workflow => opsflow}/comment/type.ts (100%) create mode 100644 apps/web/src/schema/opsflow/event/api-verbs/list.ts create mode 100644 apps/web/src/schema/opsflow/event/model.ts create mode 100644 apps/web/src/schema/opsflow/event/type.ts rename apps/web/src/schema/{workflow => opsflow}/task-category/api-verbs/create.ts (55%) rename apps/web/src/schema/{workflow => opsflow}/task-category/api-verbs/delete.ts (100%) rename apps/web/src/schema/{workflow => opsflow}/task-category/api-verbs/get.ts (100%) rename apps/web/src/schema/{workflow => opsflow}/task-category/api-verbs/list.ts (100%) rename apps/web/src/schema/{workflow => opsflow}/task-category/api-verbs/update.ts (59%) rename apps/web/src/schema/{workflow => opsflow}/task-category/model.ts (62%) rename apps/web/src/schema/{workflow => opsflow}/task-type/api-verbs/create.ts (64%) rename apps/web/src/schema/{workflow => opsflow}/task-type/api-verbs/delete.ts (100%) rename apps/web/src/schema/{workflow => opsflow}/task-type/api-verbs/get.ts (100%) rename apps/web/src/schema/{workflow => opsflow}/task-type/api-verbs/list.ts (100%) rename apps/web/src/schema/{workflow => opsflow}/task-type/api-verbs/update.ts (76%) rename apps/web/src/schema/{workflow => opsflow}/task-type/model.ts (80%) rename apps/web/src/schema/{workflow => opsflow}/task/api-verbs/change-status.ts (100%) create mode 100644 apps/web/src/schema/opsflow/task/api-verbs/create.ts rename apps/web/src/schema/{workflow => opsflow}/task/api-verbs/delete.ts (100%) rename apps/web/src/schema/{workflow => opsflow}/task/api-verbs/get.ts (100%) rename apps/web/src/schema/{workflow => opsflow}/task/api-verbs/list.ts (50%) create mode 100644 apps/web/src/schema/opsflow/task/api-verbs/update.ts rename apps/web/src/schema/{workflow => opsflow}/task/model.ts (55%) create mode 100644 apps/web/src/schema/opsflow/task/type.ts delete mode 100644 apps/web/src/schema/workflow/comment/api-verbs/create.ts delete mode 100644 apps/web/src/schema/workflow/comment/api-verbs/update.ts delete mode 100644 apps/web/src/schema/workflow/comment/model.ts delete mode 100644 apps/web/src/schema/workflow/event/api-verbs/list.ts delete mode 100644 apps/web/src/schema/workflow/event/model.ts delete mode 100644 apps/web/src/schema/workflow/event/type.ts delete mode 100644 apps/web/src/schema/workflow/task/api-verbs/create.ts delete mode 100644 apps/web/src/schema/workflow/task/api-verbs/update.ts delete mode 100644 apps/web/src/schema/workflow/task/type.ts diff --git a/apps/web/src/schema/identity/package/api-verbs/change-order.ts b/apps/web/src/schema/identity/package/api-verbs/change-order.ts new file mode 100644 index 0000000000..87c720614f --- /dev/null +++ b/apps/web/src/schema/identity/package/api-verbs/change-order.ts @@ -0,0 +1,4 @@ +export interface PackageChangeOrderParameters { + package_id: string; + order: number; +} diff --git a/apps/web/src/schema/identity/package/api-verbs/create.ts b/apps/web/src/schema/identity/package/api-verbs/create.ts index 96f848dcbf..e0e27e9f6a 100644 --- a/apps/web/src/schema/identity/package/api-verbs/create.ts +++ b/apps/web/src/schema/identity/package/api-verbs/create.ts @@ -2,6 +2,6 @@ import type { Tags } from '@/schema/_common/model'; export interface PackageCreateParameters { name: string; - description: string; - tags: Tags; + description?: string; + tags?: Tags; } diff --git a/apps/web/src/schema/identity/package/api-verbs/delete.ts b/apps/web/src/schema/identity/package/api-verbs/delete.ts new file mode 100644 index 0000000000..6f9cefd3b8 --- /dev/null +++ b/apps/web/src/schema/identity/package/api-verbs/delete.ts @@ -0,0 +1,3 @@ +export interface PackageDeleteParameters { + package_id: string; +} diff --git a/apps/web/src/schema/identity/package/api-verbs/get.ts b/apps/web/src/schema/identity/package/api-verbs/get.ts new file mode 100644 index 0000000000..b3f456d61d --- /dev/null +++ b/apps/web/src/schema/identity/package/api-verbs/get.ts @@ -0,0 +1,3 @@ +export interface PackageGetParameters { + package_id: string; +} diff --git a/apps/web/src/schema/identity/package/api-verbs/set-default.ts b/apps/web/src/schema/identity/package/api-verbs/set-default.ts new file mode 100644 index 0000000000..43b2b848f4 --- /dev/null +++ b/apps/web/src/schema/identity/package/api-verbs/set-default.ts @@ -0,0 +1,3 @@ +export interface PackageSetDefaultParameters { + package_id: string; +} diff --git a/apps/web/src/schema/identity/package/model.ts b/apps/web/src/schema/identity/package/model.ts index 9ac3f8bd90..5d8eeb920a 100644 --- a/apps/web/src/schema/identity/package/model.ts +++ b/apps/web/src/schema/identity/package/model.ts @@ -5,6 +5,7 @@ export interface PackageModel { name: string; description: string; order: number; + is_default: boolean; tags: Tags; domain_id: string; created_at: string; diff --git a/apps/web/src/schema/identity/workspace/api-verbs/add-package.ts b/apps/web/src/schema/identity/workspace/api-verbs/add-package.ts new file mode 100644 index 0000000000..221ed20173 --- /dev/null +++ b/apps/web/src/schema/identity/workspace/api-verbs/add-package.ts @@ -0,0 +1,4 @@ +export interface WorkspaceAddPackageParameters { + workspace_id: string; + package_id: string; +} diff --git a/apps/web/src/schema/identity/workspace/api-verbs/create.ts b/apps/web/src/schema/identity/workspace/api-verbs/create.ts index a39555a323..0a6c2c51f6 100644 --- a/apps/web/src/schema/identity/workspace/api-verbs/create.ts +++ b/apps/web/src/schema/identity/workspace/api-verbs/create.ts @@ -3,4 +3,5 @@ import type { Tags } from '@/schema/_common/model'; export interface WorkspaceCreateParameters { name: string; tags?: Tags; + package_id?: string; } diff --git a/apps/web/src/schema/identity/workspace/api-verbs/remove-package.ts b/apps/web/src/schema/identity/workspace/api-verbs/remove-package.ts new file mode 100644 index 0000000000..c76f80c2af --- /dev/null +++ b/apps/web/src/schema/identity/workspace/api-verbs/remove-package.ts @@ -0,0 +1,4 @@ +export interface WorkspaceRemovePackageParameters { + workspace_id: string; + package_id: string; +} diff --git a/apps/web/src/schema/identity/workspace/model.ts b/apps/web/src/schema/identity/workspace/model.ts index bf2d6f0a9a..0765b40798 100644 --- a/apps/web/src/schema/identity/workspace/model.ts +++ b/apps/web/src/schema/identity/workspace/model.ts @@ -1,4 +1,5 @@ import type { Tags } from '@/schema/_common/model'; +import type { PackageModel } from '@/schema/identity/package/model'; export type WorkspaceState = 'ENABLED' | 'DISABLED' | 'DORMANT'; @@ -6,6 +7,7 @@ export interface WorkspaceModel { workspace_id: string; name: string; state: WorkspaceState; + packages: PackageModel[]; tags: Tags; is_managed?: boolean; reference_id?: string; diff --git a/apps/web/src/schema/workflow/_types/task-field-type.ts b/apps/web/src/schema/opsflow/_types/task-field-type.ts similarity index 71% rename from apps/web/src/schema/workflow/_types/task-field-type.ts rename to apps/web/src/schema/opsflow/_types/task-field-type.ts index 23fcba43aa..684d5d6ebe 100644 --- a/apps/web/src/schema/workflow/_types/task-field-type.ts +++ b/apps/web/src/schema/opsflow/_types/task-field-type.ts @@ -1,4 +1,6 @@ -export type TaskFieldType = 'TEXT'|'PARAGRAPH'|'DATE'|'LABELS'|'DROPDOWN'|'USER'|'ASSET'; +export type TaskFieldType = |'GLOBAL' + |'TEXT'|'PARAGRAPH'|'LABELS'|'DROPDOWN'|'DATE' + |'USER'|'ASSET'|'PROJECT'|'PROVIDER'|'SERVICE_ACCOUNT'; export type TaskFieldSelectionType = 'SINGLE'|'MULTI'; export interface TaskField { field_id: string; diff --git a/apps/web/src/schema/opsflow/comment/api-verbs/create.ts b/apps/web/src/schema/opsflow/comment/api-verbs/create.ts new file mode 100644 index 0000000000..3dfad8bce1 --- /dev/null +++ b/apps/web/src/schema/opsflow/comment/api-verbs/create.ts @@ -0,0 +1,7 @@ +import type { MentionTargets } from '@/schema/opsflow/comment/type'; + +export interface CommentCreateParameters { + task_id: string; + comment: string; + mentions?: MentionTargets; +} diff --git a/apps/web/src/schema/workflow/comment/api-verbs/get.ts b/apps/web/src/schema/opsflow/comment/api-verbs/get.ts similarity index 100% rename from apps/web/src/schema/workflow/comment/api-verbs/get.ts rename to apps/web/src/schema/opsflow/comment/api-verbs/get.ts diff --git a/apps/web/src/schema/workflow/comment/api-verbs/list.ts b/apps/web/src/schema/opsflow/comment/api-verbs/list.ts similarity index 75% rename from apps/web/src/schema/workflow/comment/api-verbs/list.ts rename to apps/web/src/schema/opsflow/comment/api-verbs/list.ts index 9595da1d95..4d58e07bd0 100644 --- a/apps/web/src/schema/workflow/comment/api-verbs/list.ts +++ b/apps/web/src/schema/opsflow/comment/api-verbs/list.ts @@ -1,6 +1,6 @@ import type { Query } from '@cloudforet/core-lib/space-connector/type'; -import type { CommentType } from '@/schema/workflow/comment/type'; +import type { CommentType } from '@/schema/opsflow/comment/type'; export interface CommentListParameters { query?: Query; @@ -8,6 +8,7 @@ export interface CommentListParameters { comment_id?: string; comment_type?: CommentType; user_id?: string; + user_group_id?: string; project_id?: string; workspace_id?: string; } diff --git a/apps/web/src/schema/opsflow/comment/api-verbs/update.ts b/apps/web/src/schema/opsflow/comment/api-verbs/update.ts new file mode 100644 index 0000000000..bdb9a66df7 --- /dev/null +++ b/apps/web/src/schema/opsflow/comment/api-verbs/update.ts @@ -0,0 +1,7 @@ +import type { MentionTargets } from '@/schema/opsflow/comment/type'; + +export interface CommentUpdateParameters { + comment_id: string; + comment: string; + mentions?: MentionTargets; +} diff --git a/apps/web/src/schema/opsflow/comment/model.ts b/apps/web/src/schema/opsflow/comment/model.ts new file mode 100644 index 0000000000..401880bb31 --- /dev/null +++ b/apps/web/src/schema/opsflow/comment/model.ts @@ -0,0 +1,15 @@ +import type { CommentType, MentionTargets } from '@/schema/opsflow/comment/type'; + +export interface CommentModel { + comment_id: string; + comment: string; + comment_type: CommentType; + is_edited: boolean; + mentions: MentionTargets; + task_id: string; + project_id: string; + workspace_id: string; + domain_id: string; + created_at: string; + updated_at: string; +} diff --git a/apps/web/src/schema/workflow/comment/type.ts b/apps/web/src/schema/opsflow/comment/type.ts similarity index 100% rename from apps/web/src/schema/workflow/comment/type.ts rename to apps/web/src/schema/opsflow/comment/type.ts diff --git a/apps/web/src/schema/opsflow/event/api-verbs/list.ts b/apps/web/src/schema/opsflow/event/api-verbs/list.ts new file mode 100644 index 0000000000..1946ea395e --- /dev/null +++ b/apps/web/src/schema/opsflow/event/api-verbs/list.ts @@ -0,0 +1,10 @@ +import type { Query } from '@cloudforet/core-lib/space-connector/type'; + +import type { EventType } from '@/schema/opsflow/event/type'; + +export interface EventListParameters { + query?: Query; + task_id?: string; + event_type?: EventType; + user_type: 'USER'|'APP'; // TODO: replace with UserType +} diff --git a/apps/web/src/schema/opsflow/event/model.ts b/apps/web/src/schema/opsflow/event/model.ts new file mode 100644 index 0000000000..c365e26ff5 --- /dev/null +++ b/apps/web/src/schema/opsflow/event/model.ts @@ -0,0 +1,15 @@ +import type { EventType } from '@/schema/opsflow/event/type'; + +export interface EventModel { + event_id: string; + event_type: EventType; + name: string; + description: string; + user_type: 'USER'|'APP'; // TODO: replace with UserType + user_id: string; + task_id: string; + project_id: string; + workspace_id: string; + domain_id: string; + created_at: string; +} diff --git a/apps/web/src/schema/opsflow/event/type.ts b/apps/web/src/schema/opsflow/event/type.ts new file mode 100644 index 0000000000..c9a11fb81c --- /dev/null +++ b/apps/web/src/schema/opsflow/event/type.ts @@ -0,0 +1 @@ +export type EventType = 'CREATED'|'UPDATED'|'CHANGE_STATUS'|'COMMENTED'; diff --git a/apps/web/src/schema/workflow/task-category/api-verbs/create.ts b/apps/web/src/schema/opsflow/task-category/api-verbs/create.ts similarity index 55% rename from apps/web/src/schema/workflow/task-category/api-verbs/create.ts rename to apps/web/src/schema/opsflow/task-category/api-verbs/create.ts index 4002fd5d26..54325c9110 100644 --- a/apps/web/src/schema/workflow/task-category/api-verbs/create.ts +++ b/apps/web/src/schema/opsflow/task-category/api-verbs/create.ts @@ -1,11 +1,11 @@ import type { Tags } from '@/schema/_common/model'; -import type { TaskField } from '@/schema/workflow/_types/task-field-type'; -import type { TaskStatusOption } from '@/schema/workflow/task/type'; +import type { TaskField } from '@/schema/opsflow/_types/task-field-type'; +import type { TaskStatusOptions } from '@/schema/opsflow/task/type'; export interface TaskCategoryCreateParameters { name: string; description?: string; - status_options: TaskStatusOption[]; + status_options: TaskStatusOptions; fields?: TaskField[]; tags?: Tags; package_id: string; diff --git a/apps/web/src/schema/workflow/task-category/api-verbs/delete.ts b/apps/web/src/schema/opsflow/task-category/api-verbs/delete.ts similarity index 100% rename from apps/web/src/schema/workflow/task-category/api-verbs/delete.ts rename to apps/web/src/schema/opsflow/task-category/api-verbs/delete.ts diff --git a/apps/web/src/schema/workflow/task-category/api-verbs/get.ts b/apps/web/src/schema/opsflow/task-category/api-verbs/get.ts similarity index 100% rename from apps/web/src/schema/workflow/task-category/api-verbs/get.ts rename to apps/web/src/schema/opsflow/task-category/api-verbs/get.ts diff --git a/apps/web/src/schema/workflow/task-category/api-verbs/list.ts b/apps/web/src/schema/opsflow/task-category/api-verbs/list.ts similarity index 100% rename from apps/web/src/schema/workflow/task-category/api-verbs/list.ts rename to apps/web/src/schema/opsflow/task-category/api-verbs/list.ts diff --git a/apps/web/src/schema/workflow/task-category/api-verbs/update.ts b/apps/web/src/schema/opsflow/task-category/api-verbs/update.ts similarity index 59% rename from apps/web/src/schema/workflow/task-category/api-verbs/update.ts rename to apps/web/src/schema/opsflow/task-category/api-verbs/update.ts index 6247bf2807..0f4c0b2ced 100644 --- a/apps/web/src/schema/workflow/task-category/api-verbs/update.ts +++ b/apps/web/src/schema/opsflow/task-category/api-verbs/update.ts @@ -1,11 +1,12 @@ import type { Tags } from '@/schema/_common/model'; -import type { TaskField, TaskStatusOption } from '@/schema/workflow/_types/task-field-type'; +import type { TaskField } from '@/schema/opsflow/_types/task-field-type'; +import type { TaskStatusOptions } from '@/schema/opsflow/task/type'; export interface TaskCategoryUpdateParameters { category_id: string; name?: string; description?: string; - status_options: TaskStatusOption[]; + status_options: TaskStatusOptions; fields?: TaskField[]; force?: boolean; tags?: Tags; diff --git a/apps/web/src/schema/workflow/task-category/model.ts b/apps/web/src/schema/opsflow/task-category/model.ts similarity index 62% rename from apps/web/src/schema/workflow/task-category/model.ts rename to apps/web/src/schema/opsflow/task-category/model.ts index 68583c0b62..a810694f93 100644 --- a/apps/web/src/schema/workflow/task-category/model.ts +++ b/apps/web/src/schema/opsflow/task-category/model.ts @@ -1,12 +1,12 @@ import type { Tags } from '@/schema/_common/model'; -import type { TaskField } from '@/schema/workflow/_types/task-field-type'; -import type { TaskStatusOption } from '@/schema/workflow/task/type'; +import type { TaskField } from '@/schema/opsflow/_types/task-field-type'; +import type { TaskStatusOptions } from '@/schema/opsflow/task/type'; export interface TaskCategoryModel { category_id: string; name: string; description: string; - status_options: TaskStatusOption[]; + status_options: TaskStatusOptions; fields:TaskField[]; tags: Tags; package_id: string; diff --git a/apps/web/src/schema/workflow/task-type/api-verbs/create.ts b/apps/web/src/schema/opsflow/task-type/api-verbs/create.ts similarity index 64% rename from apps/web/src/schema/workflow/task-type/api-verbs/create.ts rename to apps/web/src/schema/opsflow/task-type/api-verbs/create.ts index 8c08cb679a..0643987823 100644 --- a/apps/web/src/schema/workflow/task-type/api-verbs/create.ts +++ b/apps/web/src/schema/opsflow/task-type/api-verbs/create.ts @@ -1,10 +1,10 @@ import type { Tags } from '@/schema/_common/model'; -import type { TaskField } from '@/schema/workflow/_types/task-field-type'; +import type { TaskField } from '@/schema/opsflow/_types/task-field-type'; export interface TaskTypeCreateParameters { name: string; description?: string; fields?: TaskField[]; tags?: Tags; - category_id?: string; + category_id: string; } diff --git a/apps/web/src/schema/workflow/task-type/api-verbs/delete.ts b/apps/web/src/schema/opsflow/task-type/api-verbs/delete.ts similarity index 100% rename from apps/web/src/schema/workflow/task-type/api-verbs/delete.ts rename to apps/web/src/schema/opsflow/task-type/api-verbs/delete.ts diff --git a/apps/web/src/schema/workflow/task-type/api-verbs/get.ts b/apps/web/src/schema/opsflow/task-type/api-verbs/get.ts similarity index 100% rename from apps/web/src/schema/workflow/task-type/api-verbs/get.ts rename to apps/web/src/schema/opsflow/task-type/api-verbs/get.ts diff --git a/apps/web/src/schema/workflow/task-type/api-verbs/list.ts b/apps/web/src/schema/opsflow/task-type/api-verbs/list.ts similarity index 100% rename from apps/web/src/schema/workflow/task-type/api-verbs/list.ts rename to apps/web/src/schema/opsflow/task-type/api-verbs/list.ts diff --git a/apps/web/src/schema/workflow/task-type/api-verbs/update.ts b/apps/web/src/schema/opsflow/task-type/api-verbs/update.ts similarity index 76% rename from apps/web/src/schema/workflow/task-type/api-verbs/update.ts rename to apps/web/src/schema/opsflow/task-type/api-verbs/update.ts index f3eefa1e6b..222322242b 100644 --- a/apps/web/src/schema/workflow/task-type/api-verbs/update.ts +++ b/apps/web/src/schema/opsflow/task-type/api-verbs/update.ts @@ -1,5 +1,5 @@ import type { Tags } from '@/schema/_common/model'; -import type { TaskField } from '@/schema/workflow/_types/task-field-type'; +import type { TaskField } from '@/schema/opsflow/_types/task-field-type'; export interface TaskTypeUpdateParameters { task_type_id: string; diff --git a/apps/web/src/schema/workflow/task-type/model.ts b/apps/web/src/schema/opsflow/task-type/model.ts similarity index 80% rename from apps/web/src/schema/workflow/task-type/model.ts rename to apps/web/src/schema/opsflow/task-type/model.ts index 66edb61cb7..5bd439638a 100644 --- a/apps/web/src/schema/workflow/task-type/model.ts +++ b/apps/web/src/schema/opsflow/task-type/model.ts @@ -1,12 +1,12 @@ import type { Tags } from '@/schema/_common/model'; -import type { TaskField } from '@/schema/workflow/_types/task-field-type'; +import type { TaskField } from '@/schema/opsflow/_types/task-field-type'; export interface TaskTypeModel { task_type_id: string; name: string; description: string; - assignee?: string; fields: TaskField[]; + assignee?: string; tags: Tags; category_id: string; domain_id: string; diff --git a/apps/web/src/schema/workflow/task/api-verbs/change-status.ts b/apps/web/src/schema/opsflow/task/api-verbs/change-status.ts similarity index 100% rename from apps/web/src/schema/workflow/task/api-verbs/change-status.ts rename to apps/web/src/schema/opsflow/task/api-verbs/change-status.ts diff --git a/apps/web/src/schema/opsflow/task/api-verbs/create.ts b/apps/web/src/schema/opsflow/task/api-verbs/create.ts new file mode 100644 index 0000000000..f249744361 --- /dev/null +++ b/apps/web/src/schema/opsflow/task/api-verbs/create.ts @@ -0,0 +1,16 @@ +import type { FileModel } from '@/schema/file-manager/model'; +import type { MentionTargets } from '@/schema/opsflow/comment/type'; +import type { TaskPriority } from '@/schema/opsflow/task/type'; + +export interface TaskCreateParameters { + task_type_id: string; + name: string; + status: string; + priority?: TaskPriority; + description?: string; + files?: FileModel[]; + mentions?: MentionTargets; + assignee?: string; + data?: Record; + project_id: string; +} diff --git a/apps/web/src/schema/workflow/task/api-verbs/delete.ts b/apps/web/src/schema/opsflow/task/api-verbs/delete.ts similarity index 100% rename from apps/web/src/schema/workflow/task/api-verbs/delete.ts rename to apps/web/src/schema/opsflow/task/api-verbs/delete.ts diff --git a/apps/web/src/schema/workflow/task/api-verbs/get.ts b/apps/web/src/schema/opsflow/task/api-verbs/get.ts similarity index 100% rename from apps/web/src/schema/workflow/task/api-verbs/get.ts rename to apps/web/src/schema/opsflow/task/api-verbs/get.ts diff --git a/apps/web/src/schema/workflow/task/api-verbs/list.ts b/apps/web/src/schema/opsflow/task/api-verbs/list.ts similarity index 50% rename from apps/web/src/schema/workflow/task/api-verbs/list.ts rename to apps/web/src/schema/opsflow/task/api-verbs/list.ts index f7149a48dc..54fb135cdb 100644 --- a/apps/web/src/schema/workflow/task/api-verbs/list.ts +++ b/apps/web/src/schema/opsflow/task/api-verbs/list.ts @@ -1,10 +1,16 @@ import type { Query } from '@cloudforet/core-lib/space-connector/type'; +import type { TaskPriority, TaskStatusType } from '@/schema/opsflow/task/type'; + export interface TaskListParameters { query?: Query; task_id?: string; name?: string; - status?: string; + status_id?: string; + status_type?: TaskStatusType; + priority?: TaskPriority; + task_type_id?: string; + category_id?: string; project_id?: string; workspace_id?: string; } diff --git a/apps/web/src/schema/opsflow/task/api-verbs/update.ts b/apps/web/src/schema/opsflow/task/api-verbs/update.ts new file mode 100644 index 0000000000..2166713abb --- /dev/null +++ b/apps/web/src/schema/opsflow/task/api-verbs/update.ts @@ -0,0 +1,15 @@ +import type { FileModel } from '@/schema/file-manager/model'; +import type { MentionTargets } from '@/schema/opsflow/comment/type'; +import type { TaskPriority } from '@/schema/opsflow/task/type'; + +export interface TaskUpdateParameters { + task_id: string; + name?: string; + priority?: TaskPriority; + description?: string; + files?: FileModel[]; + mentions?: MentionTargets; + assignee?: string; + data?: Record; + project_id?: string; +} diff --git a/apps/web/src/schema/workflow/task/model.ts b/apps/web/src/schema/opsflow/task/model.ts similarity index 55% rename from apps/web/src/schema/workflow/task/model.ts rename to apps/web/src/schema/opsflow/task/model.ts index 7714c685d3..a8571c581b 100644 --- a/apps/web/src/schema/workflow/task/model.ts +++ b/apps/web/src/schema/opsflow/task/model.ts @@ -1,14 +1,17 @@ -import type { ResourceGroupType } from '@/schema/_common/type'; -import type { TaskStatusType } from '@/schema/workflow/task/type'; +import type { FileModel } from '@/schema/file-manager/model'; +import type { TaskPriority, TaskStatusType } from '@/schema/opsflow/task/type'; export interface TaskModel { task_id: string; name: string; - status: string; + status_id: string; status_type: TaskStatusType; + priority: TaskPriority; description: string; data: Record; - resource_group: Extract; + files: FileModel[]; + task_type_id: string; + category_id: string; project_id: string; workspace_id: string; domain_id: string; diff --git a/apps/web/src/schema/opsflow/task/type.ts b/apps/web/src/schema/opsflow/task/type.ts new file mode 100644 index 0000000000..57d3c8796f --- /dev/null +++ b/apps/web/src/schema/opsflow/task/type.ts @@ -0,0 +1,9 @@ +export type TaskStatusType = 'TODO'|'IN_PROGRESS'|'COMPLETE'; +export interface TaskStatusOption { + status_id: string; + name: string; + color: string; + is_default: boolean; +} +export type TaskStatusOptions = Record; +export type TaskPriority = 'LOW'|'MEDIUM'|'HIGH'; diff --git a/apps/web/src/schema/workflow/comment/api-verbs/create.ts b/apps/web/src/schema/workflow/comment/api-verbs/create.ts deleted file mode 100644 index b029d8cdb9..0000000000 --- a/apps/web/src/schema/workflow/comment/api-verbs/create.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface CommentCreateParameters { - task_id: string; - comment: string; -} diff --git a/apps/web/src/schema/workflow/comment/api-verbs/update.ts b/apps/web/src/schema/workflow/comment/api-verbs/update.ts deleted file mode 100644 index c71685048a..0000000000 --- a/apps/web/src/schema/workflow/comment/api-verbs/update.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { MentionTargets } from '@/schema/workflow/comment/type'; - -export interface CommentUpdateParameters { - comment_id: string; - comment: string; - mention_targets?: MentionTargets; -} diff --git a/apps/web/src/schema/workflow/comment/model.ts b/apps/web/src/schema/workflow/comment/model.ts deleted file mode 100644 index 85854d1bde..0000000000 --- a/apps/web/src/schema/workflow/comment/model.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { ResourceGroupType } from '@/schema/_common/type'; -import type { CommentType, MentionTargets } from '@/schema/workflow/comment/type'; - -export interface WorkflowCommentModel { - comment_id: string; - comment: string; - comment_type: CommentType; - is_edited: boolean; - mention_targets: MentionTargets; - task_id: string; - user_id: string; - resource_group: Extract; - project_id: string; - workspace_id: string; - domain_id: string; - created_at: string; - updated_at: string; -} diff --git a/apps/web/src/schema/workflow/event/api-verbs/list.ts b/apps/web/src/schema/workflow/event/api-verbs/list.ts deleted file mode 100644 index c837421da2..0000000000 --- a/apps/web/src/schema/workflow/event/api-verbs/list.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { Query } from '@cloudforet/core-lib/space-connector/type'; - -export interface WorkflowEventListParameters { - query?: Query; - task_id?: string; -} diff --git a/apps/web/src/schema/workflow/event/model.ts b/apps/web/src/schema/workflow/event/model.ts deleted file mode 100644 index 2f27b32b81..0000000000 --- a/apps/web/src/schema/workflow/event/model.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { ResourceGroupType } from '@/schema/_common/type'; -import type { WorkflowEventType } from '@/schema/workflow/event/type'; - -export interface WorkflowEventModel { - event_id: string; - event_type: WorkflowEventType; - name: string; - description: string; - actor: string; - task_id: string; - resource_group: Extract; - project_id: string; - workspace_id: string; - domain_id: string; - created_at: string; -} diff --git a/apps/web/src/schema/workflow/event/type.ts b/apps/web/src/schema/workflow/event/type.ts deleted file mode 100644 index 5b1ad7bd22..0000000000 --- a/apps/web/src/schema/workflow/event/type.ts +++ /dev/null @@ -1 +0,0 @@ -export type WorkflowEventType = 'CREATED'|'UPDATED'|'CHANGE_STATUS'|'COMMENTED'; diff --git a/apps/web/src/schema/workflow/task/api-verbs/create.ts b/apps/web/src/schema/workflow/task/api-verbs/create.ts deleted file mode 100644 index 02b4a75cbf..0000000000 --- a/apps/web/src/schema/workflow/task/api-verbs/create.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { ResourceGroupType } from '@/schema/_common/type'; -import type { MentionTargets } from '@/schema/workflow/comment/type'; - -export interface TaskCreateParameters { - task_type_id: string; - name: string; - status: string; - description?: string; - mention_targets?: MentionTargets; - assignee?: string; - data?: Record; - resource_group: Extract; - project_id?: string; - workspace_id?: string; -} diff --git a/apps/web/src/schema/workflow/task/api-verbs/update.ts b/apps/web/src/schema/workflow/task/api-verbs/update.ts deleted file mode 100644 index 6a068f2ca4..0000000000 --- a/apps/web/src/schema/workflow/task/api-verbs/update.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { MentionTargets } from '@/schema/workflow/comment/type'; - -export interface TaskUpdateParameters { - task_id: string; - name?: string; - description?: string; - mention_targets?: MentionTargets; - assignee?: string; - data?: Record; - project_id?: string; -} diff --git a/apps/web/src/schema/workflow/task/type.ts b/apps/web/src/schema/workflow/task/type.ts deleted file mode 100644 index 9afdd36737..0000000000 --- a/apps/web/src/schema/workflow/task/type.ts +++ /dev/null @@ -1,6 +0,0 @@ -export type TaskStatusType = 'TODO'|'IN_PROGRESS'|'COMPLETE'; -export interface TaskStatusOption { - name: string; - color: string; - status_type: TaskStatusType; -} From fd839dcb41154499813b152ef87fd1dc8f1f1268 Mon Sep 17 00:00:00 2001 From: Wanjin Noh Date: Wed, 20 Nov 2024 09:46:43 +0900 Subject: [PATCH 03/53] chore: fix wrong type path Signed-off-by: Wanjin Noh --- .../web/src/services/itsm/components/AddOrEditCategoryModal.vue | 2 +- .../src/services/itsm/pages/admin/AdminTaskManagementPage.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/web/src/services/itsm/components/AddOrEditCategoryModal.vue b/apps/web/src/services/itsm/components/AddOrEditCategoryModal.vue index fab7ca75bb..97b35ce060 100644 --- a/apps/web/src/services/itsm/components/AddOrEditCategoryModal.vue +++ b/apps/web/src/services/itsm/components/AddOrEditCategoryModal.vue @@ -4,7 +4,7 @@ import { reactive, computed, onBeforeMount } from 'vue'; import { PButtonModal, PFieldGroup, PTextInput, PTextarea, PSelectDropdown, } from '@cloudforet/mirinae'; -import type { SelectDropdownMenuItem } from '@cloudforet/mirinae/types/inputs/dropdown/select-dropdown/type'; +import type { SelectDropdownMenuItem } from '@cloudforet/mirinae/types/controls/dropdown/select-dropdown/type'; import { useFormValidator } from '@/common/composables/form-validator'; diff --git a/apps/web/src/services/itsm/pages/admin/AdminTaskManagementPage.vue b/apps/web/src/services/itsm/pages/admin/AdminTaskManagementPage.vue index 9fcf8d9be7..4aff3c5cfd 100644 --- a/apps/web/src/services/itsm/pages/admin/AdminTaskManagementPage.vue +++ b/apps/web/src/services/itsm/pages/admin/AdminTaskManagementPage.vue @@ -5,7 +5,7 @@ import { PHeadingLayout, PHeading, PSelectDropdown, PI, PToggleButton, } from '@cloudforet/mirinae'; -import type { SelectDropdownMenuItem } from '@cloudforet/mirinae/types/inputs/dropdown/select-dropdown/type'; +import type { SelectDropdownMenuItem } from '@cloudforet/mirinae/types/controls/dropdown/select-dropdown/type'; import AddOrEditCategoryModal from '@/services/itsm/components/AddOrEditCategoryModal.vue'; import AddOrEditPackageModal from '@/services/itsm/components/AddOrEditPackageModal.vue'; From f5ec9cde5c68eeb222444dae20168c486a1cdf73 Mon Sep 17 00:00:00 2001 From: Wanjin Noh Date: Wed, 20 Nov 2024 09:50:58 +0900 Subject: [PATCH 04/53] feat: add enable landing page component Signed-off-by: Wanjin Noh --- .../itsm/components/EnableLandingPanel.vue | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 apps/web/src/services/itsm/components/EnableLandingPanel.vue diff --git a/apps/web/src/services/itsm/components/EnableLandingPanel.vue b/apps/web/src/services/itsm/components/EnableLandingPanel.vue new file mode 100644 index 0000000000..3a48f617de --- /dev/null +++ b/apps/web/src/services/itsm/components/EnableLandingPanel.vue @@ -0,0 +1,26 @@ + + + From e4ab743f8e9541909c07ca6dda51bb7fc7ab132d Mon Sep 17 00:00:00 2001 From: Wanjin Noh Date: Wed, 20 Nov 2024 09:56:56 +0900 Subject: [PATCH 05/53] feat: replace AddOrEditPackageModal with PackageForm component Signed-off-by: Wanjin Noh --- .../itsm/components/AddOrEditPackageModal.vue | 126 ------- .../services/itsm/components/PackageForm.vue | 320 ++++++++++++++++++ .../itsm/composables/use-category-field.ts | 33 ++ .../itsm/composables/use-workspace-field.ts | 106 ++++++ .../reference/workspace-reference-store.ts | 4 +- 5 files changed, 461 insertions(+), 128 deletions(-) delete mode 100644 apps/web/src/services/itsm/components/AddOrEditPackageModal.vue create mode 100644 apps/web/src/services/itsm/components/PackageForm.vue create mode 100644 apps/web/src/services/itsm/composables/use-category-field.ts create mode 100644 apps/web/src/services/itsm/composables/use-workspace-field.ts diff --git a/apps/web/src/services/itsm/components/AddOrEditPackageModal.vue b/apps/web/src/services/itsm/components/AddOrEditPackageModal.vue deleted file mode 100644 index 148c950b0d..0000000000 --- a/apps/web/src/services/itsm/components/AddOrEditPackageModal.vue +++ /dev/null @@ -1,126 +0,0 @@ - - - - diff --git a/apps/web/src/services/itsm/components/PackageForm.vue b/apps/web/src/services/itsm/components/PackageForm.vue new file mode 100644 index 0000000000..427f5be2bb --- /dev/null +++ b/apps/web/src/services/itsm/components/PackageForm.vue @@ -0,0 +1,320 @@ + + + + + diff --git a/apps/web/src/services/itsm/composables/use-category-field.ts b/apps/web/src/services/itsm/composables/use-category-field.ts new file mode 100644 index 0000000000..469ea26b82 --- /dev/null +++ b/apps/web/src/services/itsm/composables/use-category-field.ts @@ -0,0 +1,33 @@ +import type { Ref } from 'vue'; +import { computed } from 'vue'; + +import type { SelectDropdownMenuItem } from '@cloudforet/mirinae/types/inputs/dropdown/select-dropdown/type'; + +import type { TaskCategoryModel } from '@/schema/opsflow/task-category/model'; + +import { useFieldValidator } from '@/common/composables/form-validator'; + +export const useCategoryField = ({ + taskCategories, +}: { + taskCategories: Ref; +}) => { + const categoryMenuItems = computed(() => taskCategories.value?.map((c) => ({ name: c.category_id, label: c.name })) || []); + const categoryValidator = useFieldValidator( + [], + (value) => (value.length > 0 ? true : 'One or more categories are required'), + ); + const selectedCategoryItems = categoryValidator.value; + const categories = computed(() => selectedCategoryItems.value.map((c) => c.name)); + + const handleUpdateSelectedCategories = (selectedCategories: SelectDropdownMenuItem[]) => { + categoryValidator.setValue(selectedCategories); + }; + return { + categoryMenuItems, + selectedCategoryItems, + categories, + categoryValidator, + handleUpdateSelectedCategories, + }; +}; diff --git a/apps/web/src/services/itsm/composables/use-workspace-field.ts b/apps/web/src/services/itsm/composables/use-workspace-field.ts new file mode 100644 index 0000000000..f3e3ce7483 --- /dev/null +++ b/apps/web/src/services/itsm/composables/use-workspace-field.ts @@ -0,0 +1,106 @@ +import type { Ref } from 'vue'; +import { computed, ref } from 'vue'; + +import { getTextHighlightRegex } from '@cloudforet/mirinae/src'; +import type { AutocompleteHandler, SelectDropdownMenuItem } from '@cloudforet/mirinae/types/controls/dropdown/select-dropdown/type'; + +import type { WorkspaceReferenceMap, WorkspaceItem } from '@/store/reference/workspace-reference-store'; + +import { useFieldValidator } from '@/common/composables/form-validator'; + +const WORKSPACE_SELECTION_TYPES = { + all: { + name: 'all', + label: 'All Workspaces', + }, + specific: { + name: 'specific', + label: 'Specific Workspaces', + }, +}; +export type WorkspaceScope = 'unset'|'all'|'specific'; + +export const useWorkspaceField = ({ + workspaceReferenceMap, +}: { + workspaceReferenceMap: Ref; +}) => { + const workspaceScopes = computed(() => ['unset', 'all', 'specific']); + const currentWorkspaceScope = ref('unset'); + + const workspaceValidator = useFieldValidator( + [], + (value) => { + if (currentWorkspaceScope.value === 'specific') { + return value.length > 0 ? true : 'One or more workspaces are required'; + } + return true; + }, + ); + const selectedWorkspaceItems = workspaceValidator.value; + const selectedWorkspaceIds = computed(() => { + if (currentWorkspaceScope.value === 'all') return []; + return selectedWorkspaceItems.value.map((w) => w.name); + }); + + const allWorkspaceItems = computed(() => (workspaceReferenceMap.value ? Object.values(workspaceReferenceMap.value) : [])); + const workspaceItemsByPackage = computed>(() => { + const map: Record = {}; + Object.values(allWorkspaceItems.value).forEach((item) => { + if (Array.isArray(map[item.name])) { + map[item.name].push(item); + } else { + map[item.name] = [item]; + } + }); + return map; + }); + const workspaceMenuItemsHandler: AutocompleteHandler = async (keyword: string, pageStart = 1, pageLimit = 10) => { + const filteredItems = allWorkspaceItems.value.filter((item) => getTextHighlightRegex(keyword).test(item.label)); + const _totalCount = pageStart - 1 + Number(pageLimit); + const _slicedResults = filteredItems.slice(pageStart - 1, _totalCount); + return { + results: _slicedResults, + more: _totalCount < filteredItems.length, + }; + }; + + const handleChangeWorkspaceSelectionType = (type: WorkspaceScope) => { + if (currentWorkspaceScope.value === type) return; + workspaceValidator.setValue([]); + workspaceValidator.resetValidation(); + currentWorkspaceScope.value = type; + }; + const handleUpdateSelectedWorkspaces = (selectedWorkspaces: SelectDropdownMenuItem[]) => { + workspaceValidator.setValue(selectedWorkspaces); + }; + + const setInitialWorkspaces = (packageId?: string) => { + if (!packageId) { // create case + currentWorkspaceScope.value = 'unset'; + workspaceValidator.setValue([]); + } else { // edit case + const prevSelectedWorkspaceItems = workspaceItemsByPackage.value[packageId] ?? []; + if (prevSelectedWorkspaceItems.length === 0) { // no workspace + currentWorkspaceScope.value = 'unset'; + workspaceValidator.setValue([]); + } else { // edit case && has workspace + currentWorkspaceScope.value = 'specific'; + workspaceValidator.setValue(prevSelectedWorkspaceItems); + } + } + }; + + return { + WORKSPACE_SELECTION_TYPES, + workspaceScopes, + currentWorkspaceScope, + selectedWorkspaceItems, + selectedWorkspaceIds, + workspaceValidator, + workspaceMenuItemsHandler, + handleChangeWorkspaceSelectionType, + handleUpdateSelectedWorkspaces, + setInitialWorkspaces, + }; +}; diff --git a/apps/web/src/store/reference/workspace-reference-store.ts b/apps/web/src/store/reference/workspace-reference-store.ts index 673badb047..5b46ba7c7d 100644 --- a/apps/web/src/store/reference/workspace-reference-store.ts +++ b/apps/web/src/store/reference/workspace-reference-store.ts @@ -19,7 +19,7 @@ import type { import { MANAGED_VARIABLE_MODELS } from '@/lib/variable-models/managed-model-config/base-managed-model-config'; -type PickedWorkspaceModel = Pick; +type PickedWorkspaceModel = Pick; export type WorkspaceItem = Required, 'key'|'label'|'name'|'data'>>; export type WorkspaceReferenceMap = ReferenceMap; @@ -60,7 +60,7 @@ export const useWorkspaceReferenceStore = defineStore('reference-workspace', () const params: WorkspaceListParameters = { query: { - only: ['name', 'workspace_id', 'state', 'tags', 'cost_info', 'service_account_count', 'created_at', 'user_count'], + only: ['name', 'workspace_id', 'state', 'tags', 'cost_info', 'service_account_count', 'created_at', 'user_count', 'packages'], }, }; From e1bed92849fb4cc2fb1636d83008e86ae9acfb5f Mon Sep 17 00:00:00 2001 From: Wanjin Noh Date: Wed, 20 Nov 2024 09:59:38 +0900 Subject: [PATCH 06/53] feat: update task management UI components and forms Signed-off-by: Wanjin Noh --- .../itsm/components/SupportPackagePanel.vue | 20 +++---- .../itsm/components/TaskCategoryPanel.vue | 22 ++++---- .../TaskManagementTemplatePanel.vue | 44 +++++++++++++++ .../pages/admin/AdminTaskManagementPage.vue | 55 +++++-------------- .../admin/task-management-page-store.ts | 54 ++++++++---------- 5 files changed, 103 insertions(+), 92 deletions(-) create mode 100644 apps/web/src/services/itsm/components/TaskManagementTemplatePanel.vue diff --git a/apps/web/src/services/itsm/components/SupportPackagePanel.vue b/apps/web/src/services/itsm/components/SupportPackagePanel.vue index d4f0d1279e..ea5b9c8a2b 100644 --- a/apps/web/src/services/itsm/components/SupportPackagePanel.vue +++ b/apps/web/src/services/itsm/components/SupportPackagePanel.vue @@ -2,7 +2,7 @@ import { onBeforeMount, reactive, computed } from 'vue'; import { - PPaneLayout, PHeadingLayout, PFieldTitle, PButton, PDataTable, + PPaneLayout, PHeadingLayout, PHeading, PButton, PDataTable, PIconButton, } from '@cloudforet/mirinae'; import type { DataTableField } from '@cloudforet/mirinae/src/data-display/tables/data-table/type'; @@ -38,26 +38,26 @@ onBeforeMount(() => {