diff --git a/apps/vben5/apps/app-antd/package.json b/apps/vben5/apps/app-antd/package.json index 1e1a592ef..4b1e3c565 100644 --- a/apps/vben5/apps/app-antd/package.json +++ b/apps/vben5/apps/app-antd/package.json @@ -41,6 +41,7 @@ "@abp/request": "workspace:*", "@abp/saas": "workspace:*", "@abp/settings": "workspace:*", + "@abp/tasks": "workspace:*", "@abp/ui": "workspace:*", "@vben/access": "workspace:*", "@vben/common-ui": "workspace:*", diff --git a/apps/vben5/apps/app-antd/src/locales/langs/en-US/abp.json b/apps/vben5/apps/app-antd/src/locales/langs/en-US/abp.json index f992975e9..0ba5e1273 100644 --- a/apps/vben5/apps/app-antd/src/locales/langs/en-US/abp.json +++ b/apps/vben5/apps/app-antd/src/locales/langs/en-US/abp.json @@ -107,5 +107,11 @@ "demo": { "title": "Demo", "books": "Books" + }, + "tasks": { + "title": "Task Management", + "jobInfo": { + "title": "Job Manage" + } } } diff --git a/apps/vben5/apps/app-antd/src/locales/langs/zh-CN/abp.json b/apps/vben5/apps/app-antd/src/locales/langs/zh-CN/abp.json index 2117b07a0..d6eaf0e02 100644 --- a/apps/vben5/apps/app-antd/src/locales/langs/zh-CN/abp.json +++ b/apps/vben5/apps/app-antd/src/locales/langs/zh-CN/abp.json @@ -107,5 +107,11 @@ "demo": { "title": "演示", "books": "书籍列表" + }, + "tasks": { + "title": "后台作业", + "jobInfo": { + "title": "作业管理" + } } } diff --git a/apps/vben5/apps/app-antd/src/router/routes/modules/abp.ts b/apps/vben5/apps/app-antd/src/router/routes/modules/abp.ts index d5c084512..1b4e0f24d 100644 --- a/apps/vben5/apps/app-antd/src/router/routes/modules/abp.ts +++ b/apps/vben5/apps/app-antd/src/router/routes/modules/abp.ts @@ -431,6 +431,25 @@ const routes: RouteRecordRaw[] = [ }, ], }, + { + name: 'TaskManagement', + path: '/task-management', + meta: { + title: $t('abp.tasks.title'), + icon: 'eos-icons:background-tasks', + }, + children: [ + { + meta: { + title: $t('abp.tasks.jobInfo.title'), + icon: 'eos-icons:job', + }, + name: 'TaskManagementJobInfos', + path: '/task-management/background-jobs', + component: () => import('#/views/tasks/job-infos/index.vue'), + }, + ], + }, { name: 'AbpDemo', path: '/abp/demos', diff --git a/apps/vben5/apps/app-antd/src/views/tasks/job-infos/index.vue b/apps/vben5/apps/app-antd/src/views/tasks/job-infos/index.vue new file mode 100644 index 000000000..bccd813f0 --- /dev/null +++ b/apps/vben5/apps/app-antd/src/views/tasks/job-infos/index.vue @@ -0,0 +1,15 @@ + + + + + + + diff --git a/apps/vben5/packages/@abp/tasks/package.json b/apps/vben5/packages/@abp/tasks/package.json new file mode 100644 index 000000000..4c0ddb87b --- /dev/null +++ b/apps/vben5/packages/@abp/tasks/package.json @@ -0,0 +1,38 @@ +{ + "name": "@abp/tasks", + "version": "9.0.4", + "homepage": "https://github.com/colinin/abp-next-admin", + "bugs": "https://github.com/colinin/abp-next-admin/issues", + "repository": { + "type": "git", + "url": "git+https://github.com/colinin/abp-next-admin.git", + "directory": "packages/@abp/tasks" + }, + "license": "MIT", + "type": "module", + "sideEffects": [ + "**/*.css" + ], + "exports": { + ".": { + "types": "./src/index.ts", + "default": "./src/index.ts" + } + }, + "dependencies": { + "@abp/components": "workspace:*", + "@abp/core": "workspace:*", + "@abp/request": "workspace:*", + "@abp/ui": "workspace:*", + "@ant-design/icons-vue": "catalog:", + "@vben/access": "workspace:*", + "@vben/common-ui": "workspace:*", + "@vben/hooks": "workspace:*", + "@vben/icons": "workspace:*", + "@vben/layouts": "workspace:*", + "@vben/locales": "workspace:*", + "ant-design-vue": "catalog:", + "vue": "catalog:*", + "vxe-table": "catalog:" + } +} diff --git a/apps/vben5/packages/@abp/tasks/src/api/index.ts b/apps/vben5/packages/@abp/tasks/src/api/index.ts new file mode 100644 index 000000000..9161a791a --- /dev/null +++ b/apps/vben5/packages/@abp/tasks/src/api/index.ts @@ -0,0 +1,2 @@ +export * from './useJobInfosApi'; +export * from './useJobLogsApi'; diff --git a/apps/vben5/packages/@abp/tasks/src/api/useJobInfosApi.ts b/apps/vben5/packages/@abp/tasks/src/api/useJobInfosApi.ts new file mode 100644 index 000000000..8d7b106de --- /dev/null +++ b/apps/vben5/packages/@abp/tasks/src/api/useJobInfosApi.ts @@ -0,0 +1,169 @@ +import type { ListResultDto, PagedResultDto } from '@abp/core'; + +import type { + BackgroundJobDefinitionDto, + BackgroundJobInfoBatchInput, + BackgroundJobInfoCreateDto, + BackgroundJobInfoDto, + BackgroundJobInfoGetListInput, + BackgroundJobInfoUpdateDto, +} from '../types/job-infos'; + +import { useRequest } from '@abp/request'; + +export function useJobInfosApi() { + const { cancel, request } = useRequest(); + + function createApi( + input: BackgroundJobInfoCreateDto, + ): Promise { + return request( + '/api/task-management/background-jobs', + { + data: input, + method: 'POST', + }, + ); + } + + function deleteApi(id: string): Promise { + return request(`/api/task-management/background-jobs/${id}`, { + method: 'DELETE', + }); + } + + function bulkDeleteApi(input: BackgroundJobInfoBatchInput): Promise { + return request(`/api/task-management/background-jobs/bulk-delete`, { + data: input, + method: 'DELETE', + }); + } + + function getApi(id: string): Promise { + return request( + `/api/task-management/background-jobs/${id}`, + { + method: 'GET', + }, + ); + } + + function getPagedListApi( + input?: BackgroundJobInfoGetListInput, + ): Promise> { + return request>( + `/api/task-management/background-jobs`, + { + method: 'GET', + params: input, + }, + ); + } + + function pauseApi(id: string): Promise { + return request(`/api/task-management/background-jobs/${id}/pause`, { + method: 'PUT', + }); + } + + function bulkPauseApi(input: BackgroundJobInfoBatchInput): Promise { + return request(`/api/task-management/background-jobs/bulk-pause`, { + data: input, + method: 'PUT', + }); + } + + function resumeApi(id: string): Promise { + return request(`/api/task-management/background-jobs/${id}/resume`, { + method: 'PUT', + }); + } + + function bulkResumeApi(input: BackgroundJobInfoBatchInput): Promise { + return request(`/api/task-management/background-jobs/bulk-resume`, { + data: input, + method: 'PUT', + }); + } + + function triggerApi(id: string): Promise { + return request(`/api/task-management/background-jobs/${id}/trigger`, { + method: 'PUT', + }); + } + + function bulkTriggerApi(input: BackgroundJobInfoBatchInput): Promise { + return request(`/api/task-management/background-jobs/bulk-trigger`, { + data: input, + method: 'PUT', + }); + } + + function stopApi(id: string): Promise { + return request(`/api/task-management/background-jobs/${id}/stop`, { + method: 'PUT', + }); + } + + function bulkStopApi(input: BackgroundJobInfoBatchInput): Promise { + return request(`/api/task-management/background-jobs/bulk-stop`, { + data: input, + method: 'PUT', + }); + } + + function startApi(id: string): Promise { + return request(`/api/task-management/background-jobs/${id}/start`, { + method: 'PUT', + }); + } + + function bulkStartApi(input: BackgroundJobInfoBatchInput): Promise { + return request(`/api/task-management/background-jobs/bulk-start`, { + data: input, + method: 'PUT', + }); + } + + function updateApi( + id: string, + input: BackgroundJobInfoUpdateDto, + ): Promise { + return request(`/api/task-management/background-jobs/${id}`, { + data: input, + method: 'PUT', + }); + } + + function getDefinitionsApi(): Promise< + ListResultDto + > { + return request>( + `/api/task-management/background-jobs/definitions`, + { + method: 'GET', + }, + ); + } + + return { + bulkDeleteApi, + bulkPauseApi, + bulkResumeApi, + bulkStartApi, + bulkStopApi, + bulkTriggerApi, + cancel, + createApi, + deleteApi, + getApi, + getDefinitionsApi, + getPagedListApi, + pauseApi, + resumeApi, + startApi, + stopApi, + triggerApi, + updateApi, + }; +} diff --git a/apps/vben5/packages/@abp/tasks/src/api/useJobLogsApi.ts b/apps/vben5/packages/@abp/tasks/src/api/useJobLogsApi.ts new file mode 100644 index 000000000..1313d564b --- /dev/null +++ b/apps/vben5/packages/@abp/tasks/src/api/useJobLogsApi.ts @@ -0,0 +1,46 @@ +import type { PagedResultDto } from '@abp/core'; + +import type { + BackgroundJobLogDto, + BackgroundJobLogGetListInput, +} from '../types'; + +import { useRequest } from '@abp/request'; + +export function useJobLogsApi() { + const { cancel, request } = useRequest(); + + function getApi(id: string): Promise { + return request( + `/api/task-management/background-jobs/logs/${id}`, + { + method: 'GET', + }, + ); + } + + function deleteApi(id: string): Promise { + return request(`/api/task-management/background-jobs/logs/${id}`, { + method: 'DELETE', + }); + } + + function getPagedListApi( + input?: BackgroundJobLogGetListInput, + ): Promise> { + return request>( + `/api/task-management/background-jobs/logs`, + { + method: 'GET', + params: input, + }, + ); + } + + return { + cancel, + deleteApi, + getApi, + getPagedListApi, + }; +} diff --git a/apps/vben5/packages/@abp/tasks/src/components/index.ts b/apps/vben5/packages/@abp/tasks/src/components/index.ts new file mode 100644 index 000000000..d7c6b609e --- /dev/null +++ b/apps/vben5/packages/@abp/tasks/src/components/index.ts @@ -0,0 +1 @@ +export { default as JobInfoTable } from './job-infos/JobInfoTable.vue'; diff --git a/apps/vben5/packages/@abp/tasks/src/components/job-infos/JobInfoDetailDrawer.vue b/apps/vben5/packages/@abp/tasks/src/components/job-infos/JobInfoDetailDrawer.vue new file mode 100644 index 000000000..aecc0c0c5 --- /dev/null +++ b/apps/vben5/packages/@abp/tasks/src/components/job-infos/JobInfoDetailDrawer.vue @@ -0,0 +1,303 @@ + + + + + onTabChange(key.toString())" + > + + + + + {{ jobStatusMap[jobInfo.status] }} + + + + {{ jobSourceMap[jobInfo.source] }} + + + + + + + {{ jobPriorityMap[jobInfo.priority] }} + + + + {{ jobInfo.group }} + + + {{ jobInfo.name }} + + + {{ jobInfo.description }} + + + {{ jobInfo.type }} + + + {{ formatToDateTime(jobInfo.creationTime) }} + + + {{ jobInfo.lockTimeOut }} + + + {{ formatToDateTime(jobInfo.beginTime) }} + + + {{ + jobInfo.endTime + ? formatToDateTime(jobInfo.endTime) + : jobInfo.endTime + }} + + + {{ jobTypeMap[jobInfo.jobType] }} + + + {{ jobInfo.cron }} + + + {{ jobInfo.interval }} + + + {{ + jobInfo.lastRunTime + ? formatToDateTime(jobInfo.lastRunTime) + : jobInfo.lastRunTime + }} + + + {{ + jobInfo.nextRunTime + ? formatToDateTime(jobInfo.nextRunTime) + : jobInfo.nextRunTime + }} + + + {{ jobInfo.triggerCount }} + + + {{ jobInfo.maxCount }} + + + {{ jobInfo.tryCount }} + + + {{ jobInfo.maxTryCount }} + + + {{ jobInfo.result }} + + + + + + + + + + + + + + + + + + + + + + + + + + {{ item.runTime }} + + + {{ item.exception ?? item.message }} + + + + + + + + + + diff --git a/apps/vben5/packages/@abp/tasks/src/components/job-infos/JobInfoDrawer.vue b/apps/vben5/packages/@abp/tasks/src/components/job-infos/JobInfoDrawer.vue new file mode 100644 index 000000000..f028d3e63 --- /dev/null +++ b/apps/vben5/packages/@abp/tasks/src/components/job-infos/JobInfoDrawer.vue @@ -0,0 +1,349 @@ + + + + + + + + + + onJobDefineChange(val!.toString())" + /> + + + + {{ $t('TaskManagement.DisplayName:IsEnabled') }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/vben5/packages/@abp/tasks/src/components/job-infos/JobInfoTable.vue b/apps/vben5/packages/@abp/tasks/src/components/job-infos/JobInfoTable.vue new file mode 100644 index 000000000..23427239d --- /dev/null +++ b/apps/vben5/packages/@abp/tasks/src/components/job-infos/JobInfoTable.vue @@ -0,0 +1,736 @@ + + + + + + + + {{ $t('TaskManagement.BackgroundJobs:Start') }} + + + {{ $t('TaskManagement.BackgroundJobs:Pause') }} + + + {{ $t('TaskManagement.BackgroundJobs:AddNew') }} + + + {{ $t('AbpUi.Delete') }} + + + + + {{ row.name }} + + + + {{ jobStatusMap[row.status] }} + + + + + {{ jobTypeMap[row.jobType] }} + + + + + {{ jobPriorityMap[row.priority] }} + + + + + + {{ $t('AbpUi.Edit') }} + + + {{ $t('AbpUi.Delete') }} + + + + onMenuClick(row, info)"> + + {{ $t('TaskManagement.BackgroundJobs:Pause') }} + + + {{ $t('TaskManagement.BackgroundJobs:Resume') }} + + + {{ $t('TaskManagement.BackgroundJobs:Trigger') }} + + + {{ $t('TaskManagement.BackgroundJobs:Start') }} + + + {{ $t('TaskManagement.BackgroundJobs:Stop') }} + + + + + + + + + + + + + diff --git a/apps/vben5/packages/@abp/tasks/src/constants/index.ts b/apps/vben5/packages/@abp/tasks/src/constants/index.ts new file mode 100644 index 000000000..c85954d3e --- /dev/null +++ b/apps/vben5/packages/@abp/tasks/src/constants/index.ts @@ -0,0 +1 @@ +export * from './permissions'; diff --git a/apps/vben5/packages/@abp/tasks/src/constants/permissions.ts b/apps/vben5/packages/@abp/tasks/src/constants/permissions.ts new file mode 100644 index 000000000..826d043a5 --- /dev/null +++ b/apps/vben5/packages/@abp/tasks/src/constants/permissions.ts @@ -0,0 +1,24 @@ +/** 作业管理权限 */ +export const BackgroundJobsPermissions = { + /** 新增 */ + Create: 'TaskManagement.BackgroundJobs.Create', + Default: 'TaskManagement.BackgroundJobs', + /** 删除 */ + Delete: 'TaskManagement.BackgroundJobs.Delete', + /** 管理触发器 */ + ManageActions: 'TaskManagement.BackgroundJobs.ManageActions', + /** 管理系统作业 */ + ManageSystemJobs: 'TaskManagement.BackgroundJobs.ManageSystemJobs', + /** 暂停 */ + Pause: 'TaskManagement.BackgroundJobs.Pause', + /** 恢复 */ + Resume: 'TaskManagement.BackgroundJobs.Resume', + /** 启动 */ + Start: 'TaskManagement.BackgroundJobs.Start', + /** 停止 */ + Stop: 'TaskManagement.BackgroundJobs.Stop', + /** 触发 */ + Trigger: 'TaskManagement.BackgroundJobs.Trigger', + /** 修改 */ + Update: 'TaskManagement.BackgroundJobs.Update', +}; diff --git a/apps/vben5/packages/@abp/tasks/src/hooks/index.ts b/apps/vben5/packages/@abp/tasks/src/hooks/index.ts new file mode 100644 index 000000000..24890e7c9 --- /dev/null +++ b/apps/vben5/packages/@abp/tasks/src/hooks/index.ts @@ -0,0 +1 @@ +export * from './useJobEnumsMap'; diff --git a/apps/vben5/packages/@abp/tasks/src/hooks/useJobEnumsMap.ts b/apps/vben5/packages/@abp/tasks/src/hooks/useJobEnumsMap.ts new file mode 100644 index 000000000..1162e5a72 --- /dev/null +++ b/apps/vben5/packages/@abp/tasks/src/hooks/useJobEnumsMap.ts @@ -0,0 +1,75 @@ +import { reactive } from 'vue'; + +import { $t } from '@vben/locales'; + +import { JobPriority, JobSource, JobStatus, JobType } from '../types/job-infos'; + +export function useJobEnumsMap() { + const jobStatusMap = reactive<{ + [key: number]: string; + }>({ + [JobStatus.Completed]: $t('TaskManagement.DisplayName:Completed'), + [JobStatus.FailedRetry]: $t('TaskManagement.DisplayName:FailedRetry'), + [JobStatus.None]: $t('TaskManagement.DisplayName:None'), + [JobStatus.Paused]: $t('TaskManagement.DisplayName:Paused'), + [JobStatus.Queuing]: $t('TaskManagement.DisplayName:Queuing'), + [JobStatus.Running]: $t('TaskManagement.DisplayName:Running'), + [JobStatus.Stopped]: $t('TaskManagement.DisplayName:Stopped'), + }); + const jobStatusColor = reactive<{ + [key: number]: string; + }>({ + [JobStatus.Completed]: '#339933', + [JobStatus.FailedRetry]: '#FF6600', + [JobStatus.None]: '', + [JobStatus.Paused]: '#CC6633', + [JobStatus.Queuing]: '#008B8B', + [JobStatus.Running]: '#3399CC', + [JobStatus.Stopped]: '#F00000', + }); + + const jobTypeMap = reactive<{ + [key: number]: string; + }>({ + [JobType.Once]: $t('TaskManagement.DisplayName:Once'), + [JobType.Period]: $t('TaskManagement.DisplayName:Period'), + [JobType.Persistent]: $t('TaskManagement.DisplayName:Persistent'), + }); + + const jobPriorityMap = reactive<{ + [key: number]: string; + }>({ + [JobPriority.AboveNormal]: $t('TaskManagement.DisplayName:AboveNormal'), + [JobPriority.BelowNormal]: $t('TaskManagement.DisplayName:BelowNormal'), + [JobPriority.High]: $t('TaskManagement.DisplayName:High'), + [JobPriority.Low]: $t('TaskManagement.DisplayName:Low'), + [JobPriority.Normal]: $t('TaskManagement.DisplayName:Normal'), + }); + + const jobPriorityColor = reactive<{ + [key: number]: string; + }>({ + [JobPriority.AboveNormal]: 'orange', + [JobPriority.BelowNormal]: 'cyan', + [JobPriority.High]: 'red', + [JobPriority.Low]: 'purple', + [JobPriority.Normal]: 'blue', + }); + + const jobSourceMap = reactive<{ + [key: number]: string; + }>({ + [JobSource.None]: $t('TaskManagement.DisplayName:None'), + [JobSource.System]: $t('TaskManagement.DisplayName:System'), + [JobSource.User]: $t('TaskManagement.DisplayName:User'), + }); + + return { + jobPriorityColor, + jobPriorityMap, + jobSourceMap, + jobStatusColor, + jobStatusMap, + jobTypeMap, + }; +} diff --git a/apps/vben5/packages/@abp/tasks/src/index.ts b/apps/vben5/packages/@abp/tasks/src/index.ts new file mode 100644 index 000000000..314dad0cd --- /dev/null +++ b/apps/vben5/packages/@abp/tasks/src/index.ts @@ -0,0 +1,3 @@ +export * from './api'; +export * from './components'; +export * from './types'; diff --git a/apps/vben5/packages/@abp/tasks/src/types/index.ts b/apps/vben5/packages/@abp/tasks/src/types/index.ts new file mode 100644 index 000000000..74f2f0b7a --- /dev/null +++ b/apps/vben5/packages/@abp/tasks/src/types/index.ts @@ -0,0 +1,2 @@ +export * from './job-infos'; +export * from './job-logs'; diff --git a/apps/vben5/packages/@abp/tasks/src/types/job-infos.ts b/apps/vben5/packages/@abp/tasks/src/types/job-infos.ts new file mode 100644 index 000000000..bb519da26 --- /dev/null +++ b/apps/vben5/packages/@abp/tasks/src/types/job-infos.ts @@ -0,0 +1,139 @@ +import type { + ExtensibleAuditedEntityDto, + IHasConcurrencyStamp, + PagedAndSortedResultRequestDto, +} from '@abp/core'; + +enum JobStatus { + Completed = 0, + FailedRetry = 15, + None = -1, + Paused = 20, + Queuing = 5, + Running = 10, + Stopped = 30, +} + +enum JobType { + Once = 0, + Period = 1, + Persistent = 2, +} + +enum JobPriority { + AboveNormal = 20, + BelowNormal = 10, + High = 25, + Low = 5, + Normal = 15, +} + +enum JobSource { + None = -1, + System = 10, + User = 0, +} + +interface BackgroundJobInfoDto + extends ExtensibleAuditedEntityDto, + IHasConcurrencyStamp { + args: Record; + beginTime: string; + cron?: string; + description?: string; + endTime?: string; + group: string; + interval: number; + isAbandoned: boolean; + isEnabled: boolean; + jobType: JobType; + lastRunTime?: string; + lockTimeOut: number; + maxCount: number; + maxTryCount: number; + name: string; + nextRunTime?: string; + priority: JobPriority; + result?: string; + source: JobSource; + status: JobStatus; + triggerCount: number; + tryCount: number; + type: string; +} + +interface BackgroundJobInfoCreateOrUpdateDto { + args: Record; + cron?: string; + description?: string; + interval: number; + isEnabled: boolean; + jobType: JobType; + lockTimeOut: number; + maxCount: number; + maxTryCount: number; + priority: JobPriority; +} + +interface BackgroundJobInfoCreateDto + extends BackgroundJobInfoCreateOrUpdateDto { + beginTime: string; + endTime?: string; + group: string; + name: string; + nodeName?: string; + source: JobSource; + type: string; +} + +interface BackgroundJobInfoUpdateDto + extends BackgroundJobInfoCreateOrUpdateDto, + IHasConcurrencyStamp {} + +interface BackgroundJobInfoGetListInput extends PagedAndSortedResultRequestDto { + beginCreationTime?: Date; + beginLastRunTime?: Date; + beginTime?: Date; + endCreationTime?: Date; + endLastRunTime?: Date; + endTime?: Date; + filter?: string; + group?: string; + isAbandoned?: boolean; + jobType?: JobType; + name?: string; + priority?: JobPriority; + source?: JobSource; + status?: JobStatus; + type?: string; +} + +interface BackgroundJobInfoBatchInput { + jobIds: string[]; +} + +interface BackgroundJobParamterDto { + description?: string; + displayName: string; + name: string; + required: boolean; +} + +interface BackgroundJobDefinitionDto { + description?: string; + displayName: string; + name: string; + paramters: BackgroundJobParamterDto[]; +} + +export { JobPriority, JobSource, JobStatus, JobType }; + +export type { + BackgroundJobDefinitionDto, + BackgroundJobInfoBatchInput, + BackgroundJobInfoCreateDto, + BackgroundJobInfoDto, + BackgroundJobInfoGetListInput, + BackgroundJobInfoUpdateDto, + BackgroundJobParamterDto, +}; diff --git a/apps/vben5/packages/@abp/tasks/src/types/job-logs.ts b/apps/vben5/packages/@abp/tasks/src/types/job-logs.ts new file mode 100644 index 000000000..473dd58c9 --- /dev/null +++ b/apps/vben5/packages/@abp/tasks/src/types/job-logs.ts @@ -0,0 +1,23 @@ +import type { EntityDto, PagedAndSortedResultRequestDto } from '@abp/core'; + +interface BackgroundJobLogDto extends EntityDto { + exception?: string; + jobGroup: string; + jobName: string; + jobType: string; + message: string; + runTime: string; +} + +interface BackgroundJobLogGetListInput extends PagedAndSortedResultRequestDto { + beginRunTime?: string; + endRunTime?: string; + filter?: string; + group?: string; + hasExceptions?: boolean; + jobId?: string; + name?: string; + type?: string; +} + +export type { BackgroundJobLogDto, BackgroundJobLogGetListInput }; diff --git a/apps/vben5/packages/@abp/tasks/tsconfig.json b/apps/vben5/packages/@abp/tasks/tsconfig.json new file mode 100644 index 000000000..ce1a891fb --- /dev/null +++ b/apps/vben5/packages/@abp/tasks/tsconfig.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "@vben/tsconfig/web.json", + "include": ["src"], + "exclude": ["node_modules"] +} diff --git a/apps/vben5/packages/@abp/ui/src/components/properties/PropertyModal.vue b/apps/vben5/packages/@abp/ui/src/components/properties/PropertyModal.vue index f20397c04..c6fd373e2 100644 --- a/apps/vben5/packages/@abp/ui/src/components/properties/PropertyModal.vue +++ b/apps/vben5/packages/@abp/ui/src/components/properties/PropertyModal.vue @@ -13,11 +13,15 @@ const emits = defineEmits<{ }>(); const [Form, formApi] = useVbenForm({ + commonConfig: { + formItemClass: 'w-full', + }, handleSubmit: onSubmit, schema: [ { component: 'Input', componentProps: { + allowClear: true, autocomplete: 'off', }, fieldName: 'key', @@ -25,9 +29,15 @@ const [Form, formApi] = useVbenForm({ rules: 'required', }, { - component: 'Input', + component: 'Textarea', componentProps: { + allowClear: true, autocomplete: 'off', + autoSize: { + minRows: 2, + }, + class: 'w-full', + showCount: true, }, fieldName: 'value', label: $t('component.extra_property_dictionary.value'), @@ -46,6 +56,14 @@ const [Modal, modalApi] = useVbenModal({ onConfirm: async () => { await formApi.validateAndSubmitForm(); }, + onOpenChange(isOpen) { + if (isOpen) { + const input = modalApi.getData(); + if (input) { + formApi.setValues(input); + } + } + }, title: $t('component.extra_property_dictionary.title'), }); function onSubmit(input: Record) { diff --git a/apps/vben5/packages/@abp/ui/src/components/properties/PropertyTable.vue b/apps/vben5/packages/@abp/ui/src/components/properties/PropertyTable.vue index 6274ceb8e..1c10b5c35 100644 --- a/apps/vben5/packages/@abp/ui/src/components/properties/PropertyTable.vue +++ b/apps/vben5/packages/@abp/ui/src/components/properties/PropertyTable.vue @@ -25,6 +25,7 @@ const emits = defineEmits<{ (event: 'delete', data: PropertyInfo): void; }>(); const DeleteOutlined = createIconifyIcon('ant-design:delete-outlined'); +const EditOutlined = createIconifyIcon('ant-design:edit-outlined'); const PlusOutlined = createIconifyIcon('ant-design:plus-outlined'); const getDataResource = computed((): PropertyInfo[] => { @@ -77,6 +78,11 @@ function onCreate() { modalApi.open(); } +function onEdit(prop: Record) { + modalApi.setData(prop); + modalApi.open(); +} + function onDelete(prop: Record) { emits('delete', { key: prop.key!, @@ -108,21 +114,40 @@ function onChange(prop: Record) { - + - - + + - + - {{ $t('component.extra_property_dictionary.actions.delete') }} + {{ $t('component.extra_property_dictionary.actions.update') }} - + + + + + + {{ $t('component.extra_property_dictionary.actions.delete') }} + + +