('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() {
/>
-
+
+
+
+
+
+
+