diff --git a/build/plugins/router.ts b/build/plugins/router.ts index 35c338a..4998540 100644 --- a/build/plugins/router.ts +++ b/build/plugins/router.ts @@ -9,7 +9,7 @@ export function setupElegantRouter() { blank: 'src/layouts/blank-layout/index.vue' }, customRoutes: { - names: [] + names: ['document'] }, routePathTransformer(routeName, routePath) { const key = routeName as RouteKey; diff --git a/public/iconify/mdi.json b/public/iconify/mdi.json index 593dc7a..09abcd6 100644 --- a/public/iconify/mdi.json +++ b/public/iconify/mdi.json @@ -16,6 +16,9 @@ }, "format-horizontal-align-left": { "body": "" + }, + "file-document-multiple-outline": { + "body": "" } } } diff --git a/src/components/advanced/table-column-setting.vue b/src/components/advanced/table-column-setting.vue index d1e6dca..4180aea 100644 --- a/src/components/advanced/table-column-setting.vue +++ b/src/components/advanced/table-column-setting.vue @@ -25,7 +25,7 @@ const columns = defineModel('columns', {
- {{ item.title }} + {{ typeof item.title === 'function' ? item.key.toUpperCase() : item.title }}
diff --git a/src/components/common/log-drawer.vue b/src/components/common/log-drawer.vue index 4a0652a..f61b735 100644 --- a/src/components/common/log-drawer.vue +++ b/src/components/common/log-drawer.vue @@ -282,14 +282,32 @@ const SnailLogComponent = defineComponent({ return <>; } const restOfText = throwable.replace(/^.+(\n|$)/m, ''); - return {`${restOfText}`}; + return {`${restOfText}`}; + }; + + const messageComponent = (message: Api.JobLog.JobMessage) => { + const msg = message.message; + if (!msg) { + return <>; + } + const firstLine = msg.match(/^.+/m); + if (!firstLine) { + return <>; + } + const restOfText = msg.replace(/^.+(\n|$)/m, '').replaceAll('\n', '\n - '); + if (restOfText) { + return ( + {` - ${restOfText}`} + ); + } + return
- {`${msg}`}
; }; const handleUpdateExpanded = (val: string[]) => { expandedNames.value = val; }; - const handleResize = () => { + const handleResize = (_: ResizeObserverEntry) => { expandedNames.value = []; }; @@ -305,6 +323,7 @@ const SnailLogComponent = defineComponent({ class="virtual-list" itemSize={85} item-resizable + ignore-item-resize padding-bottom={16} items={logList.value} scrollbar-props={{ xScrollable: true }} @@ -322,7 +341,7 @@ const SnailLogComponent = defineComponent({ {`[${message.thread}]`}
{`${message.location}: `}
-
- {`${message.message}`}
+
{messageComponent(message)}
{throwableComponent(message)}
@@ -479,6 +498,14 @@ const SnailLogComponent = defineComponent({ max-height: calc(100vh - 101px); } + .v-vl { + min-height: calc(100vh - 101px); + } + + .v-vl-items { + min-height: calc(100vh - 101px - 16px) !important; + } + .n-divider:not(.n-divider--vertical) { margin-top: 6px; margin-bottom: 6px; diff --git a/src/layouts/modules/global-menu/first-level-menu.vue b/src/layouts/modules/global-menu/first-level-menu.vue index fc089f7..50ecace 100644 --- a/src/layouts/modules/global-menu/first-level-menu.vue +++ b/src/layouts/modules/global-menu/first-level-menu.vue @@ -28,6 +28,10 @@ const appStore = useAppStore(); const themeStore = useThemeStore(); const routeStore = useRouteStore(); +const menus = computed(() => { + return routeStore.menus.filter(item => item.show !== false); +}); + interface MixMenuItemProps { /** Menu item label */ label: App.Global.Menu['label']; @@ -80,7 +84,7 @@ function handleClickMixMenu(menu: App.Global.Menu) { -import { computed, reactive, watch } from 'vue'; +import { computed, reactive, ref, watch } from 'vue'; import { useFormRules, useNaiveForm } from '@/hooks/common/form'; import OperateDrawer from '@/components/common/operate-drawer.vue'; import { $t } from '@/locales'; import { fetchAddRetryTask, fetchIdempotentIdGenerate } from '@/service/api'; -import { translateOptions } from '@/utils/common'; +import { isNotNull, translateOptions } from '@/utils/common'; import { retryTaskStatusTypeOptions } from '@/constants/business'; import CodeMirror from '@/components/common/code-mirror.vue'; import SelectGroup from '@/components/common/select-group.vue'; @@ -33,6 +33,7 @@ const visible = defineModel('visible', { default: false }); +const argsList = ref([]); const { formRef, validate, restoreValidation } = useNaiveForm(); const { defaultRequiredRule } = useFormRules(); @@ -74,11 +75,31 @@ const rules: Record = { idempotentId: defaultRequiredRule, bizNo: defaultRequiredRule, executorName: defaultRequiredRule, - argsStr: defaultRequiredRule, + argsStr: { ...defaultRequiredRule, validator: validatorArgsStr }, retryStatus: defaultRequiredRule }; +function validatorArgsStr() { + if (argsList.value.length === 0) { + return false; + } + + try { + argsList.value.forEach(arg => { + if (!isNotNull(arg)) { + throw new Error($t('form.required')); + } + }); + } catch { + return false; + } + + return true; +} + function handleUpdateModelWhenEdit() { + argsList.value = []; + if (props.operateType === 'add') { Object.assign(model, createDefaultModel()); return; @@ -86,6 +107,7 @@ function handleUpdateModelWhenEdit() { if (props.operateType === 'edit' && props.rowData) { Object.assign(model, props.rowData); + argsList.value = JSON.parse(props.rowData.argsStr || '[]'); } } @@ -97,14 +119,14 @@ async function handleSubmit() { await validate(); if (props.operateType === 'add') { - const { groupName, sceneName, idempotentId, bizNo, executorName, argsStr, retryStatus } = model; + const { groupName, sceneName, idempotentId, bizNo, executorName, retryStatus } = model; const { error } = await fetchAddRetryTask({ groupName, sceneName, idempotentId, bizNo, executorName, - argsStr, + argsStr: JSON.stringify(argsList.value), retryStatus }); if (error) return; @@ -184,7 +206,19 @@ async function setIdempotentId() { /> - + + +