Browse Source

update

main
wangshaoping 1 year ago
parent
commit
bad0b936b5
  1. 3
      io.sc.platform.core.frontend/package.json
  2. 12
      io.sc.platform.core.frontend/src/components/index.ts
  3. 6
      io.sc.platform.core.frontend/src/i18n/messages.json
  4. 6
      io.sc.platform.core.frontend/src/i18n/messages_tw_CN.json
  5. 6
      io.sc.platform.core.frontend/src/i18n/messages_zh_CN.json
  6. 51
      io.sc.platform.core.frontend/src/menus/menus.json
  7. 5
      io.sc.platform.core.frontend/src/platform/components/form/WForm.vue
  8. 170
      io.sc.platform.core.frontend/src/platform/components/form/elements/WCodeMirror.vue
  9. 4
      io.sc.platform.core.frontend/src/platform/components/form/elements/WColorInput.vue
  10. 4
      io.sc.platform.core.frontend/src/platform/components/form/elements/WColorInputPalette.vue
  11. 18
      io.sc.platform.core.frontend/src/platform/components/form/elements/WCron.vue
  12. 6
      io.sc.platform.core.frontend/src/platform/components/form/elements/WPosition.vue
  13. 0
      io.sc.platform.core.frontend/src/platform/components/form/elements/w-cron-segment/DaySegment.vue
  14. 0
      io.sc.platform.core.frontend/src/platform/components/form/elements/w-cron-segment/HourSegment.vue
  15. 0
      io.sc.platform.core.frontend/src/platform/components/form/elements/w-cron-segment/MinuteSegment.vue
  16. 0
      io.sc.platform.core.frontend/src/platform/components/form/elements/w-cron-segment/MonthSegment.vue
  17. 0
      io.sc.platform.core.frontend/src/platform/components/form/elements/w-cron-segment/SecondSegment.vue
  18. 0
      io.sc.platform.core.frontend/src/platform/components/form/elements/w-cron-segment/WeekSegment.vue
  19. 0
      io.sc.platform.core.frontend/src/platform/components/form/elements/w-cron-segment/YearSegment.vue
  20. 12
      io.sc.platform.core.frontend/src/platform/components/index.ts
  21. 72
      io.sc.platform.core.frontend/src/platform/components/widget/codemirror/Util.ts
  22. 38
      io.sc.platform.core.frontend/src/platform/components/widget/codemirror/WCodemirror.vue
  23. 31
      io.sc.platform.core.frontend/src/platform/components/widget/codemirror/WCodemirror2.vue
  24. 7
      io.sc.platform.core.frontend/src/platform/components/widget/select/WSelect.vue
  25. 25
      io.sc.platform.core.frontend/src/platform/utils/Tools.ts
  26. 58
      io.sc.platform.core.frontend/src/routes/routes.json
  27. 50
      io.sc.platform.core.frontend/src/views/Codemirror.vue
  28. 29
      io.sc.platform.core.frontend/src/views/Component.vue
  29. 37
      io.sc.platform.core.frontend/src/views/Dialog.vue
  30. 30
      io.sc.platform.core.frontend/src/views/Form1.vue
  31. 44
      io.sc.platform.core.frontend/src/views/FormElements.vue
  32. 4
      io.sc.platform.core.frontend/src/views/Grid1.vue
  33. 22
      io.sc.platform.core.frontend/src/views/Select.vue
  34. 64
      io.sc.platform.core.frontend/src/views/Table.vue
  35. 118
      io.sc.platform.core.frontend/src/views/TableTitle.vue
  36. 236
      io.sc.platform.core.frontend/src/views/TreeGrid.vue

3
io.sc.platform.core.frontend/package.json

@ -99,7 +99,6 @@
"dependencies": { "dependencies": {
"@codemirror/autocomplete": "6.11.1", "@codemirror/autocomplete": "6.11.1",
"@codemirror/commands": "6.3.3", "@codemirror/commands": "6.3.3",
"@codemirror/lint": "6.5.0",
"@codemirror/lang-html": "6.4.7", "@codemirror/lang-html": "6.4.7",
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.1", "@codemirror/lang-javascript": "6.2.1",
@ -121,7 +120,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"quasar": "2.14.2", "quasar": "2.14.5",
"tailwindcss": "3.4.0", "tailwindcss": "3.4.0",
"vue": "3.4.3", "vue": "3.4.3",
"vue-codemirror6": "1.2.0", "vue-codemirror6": "1.2.0",

12
io.sc.platform.core.frontend/src/components/index.ts

@ -2,11 +2,7 @@
* , * ,
*/ */
import component from '@/views/Component.vue'; import formElements from '@/views/FormElements.vue';
import dialog from '@/views/Dialog.vue';
import codemirror from '@/views/Codemirror.vue';
import select from '@/views/Select.vue';
import treeGrid from '@/views/TreeGrid.vue';
import likmDialog from '@/views/likm/Dialog.vue'; import likmDialog from '@/views/likm/Dialog.vue';
import likmDrawer from '@/views/likm/Drawer.vue'; import likmDrawer from '@/views/likm/Drawer.vue';
import likmForm from '@/views/likm/Form.vue'; import likmForm from '@/views/likm/Form.vue';
@ -18,11 +14,7 @@ import gridLayout from '@/views/likm/GridLayout.vue';
import likmTreeGrid from '@/views/likm/TreeGrid.vue'; import likmTreeGrid from '@/views/likm/TreeGrid.vue';
const localComponents = { const localComponents = {
'component.testcase.component': component, 'component.testcase.formElements': formElements,
'component.testcase.dialog': dialog,
'component.testcase.codemirror': codemirror,
'component.testcase.select': select,
'component.testcase.treeGrid': treeGrid,
'component.testcase.likmDialog': likmDialog, 'component.testcase.likmDialog': likmDialog,
'component.testcase.likmDrawer': likmDrawer, 'component.testcase.likmDrawer': likmDrawer,
'component.testcase.likmForm': likmForm, 'component.testcase.likmForm': likmForm,

6
io.sc.platform.core.frontend/src/i18n/messages.json

@ -1,8 +1,4 @@
{ {
"menu.testcase": "Test Case", "menu.testcase": "Test Case",
"menu.testcase.component": "Component", "menu.testcase.formElements": "Form Elements"
"menu.testcase.dialog": "Dialog",
"menu.testcase.select": "Select",
"menu.testcase.treeGrid": "Tree Grid",
"menu.testcase.table": "Table"
} }

6
io.sc.platform.core.frontend/src/i18n/messages_tw_CN.json

@ -1,8 +1,4 @@
{ {
"menu.testcase": "測試用例", "menu.testcase": "測試用例",
"menu.testcase.component": "組件", "menu.testcase.formElements": "表單控件"
"menu.testcase.dialog": "Dialog",
"menu.testcase.select": "Select",
"menu.testcase.treeGrid": "Tree Grid",
"menu.testcase.table": "Table"
} }

6
io.sc.platform.core.frontend/src/i18n/messages_zh_CN.json

@ -1,8 +1,4 @@
{ {
"menu.testcase": "测试用例", "menu.testcase": "测试用例",
"menu.testcase.component": "组件", "menu.testcase.formElements": "表单控件"
"menu.testcase.dialog": "Dialog",
"menu.testcase.select": "Select",
"menu.testcase.treeGrid": "Tree Grid",
"menu.testcase.table": "Table"
} }

51
io.sc.platform.core.frontend/src/menus/menus.json

@ -22,55 +22,10 @@
"type": "ROUTE", "type": "ROUTE",
"order": 100, "order": 100,
"parentId": "menu.testcase", "parentId": "menu.testcase",
"id": "menu.testcase.component", "id": "menu.testcase.formElements",
"titleI18nKey": "menu.testcase.component", "titleI18nKey": "menu.testcase.formElements",
"icon": "bi-palette", "icon": "bi-palette",
"routeName": "route.testcase.component" "routeName": "route.testcase.formElements"
},
{
"type": "ROUTE",
"order": 200,
"parentId": "menu.testcase",
"id": "menu.testcase.dialog",
"titleI18nKey": "menu.testcase.dialog",
"icon": "bi-palette",
"routeName": "route.testcase.dialog"
},
{
"type": "ROUTE",
"order": 300,
"parentId": "menu.testcase",
"id": "menu.testcase.codemirror",
"titleI18nKey": "menu.testcase.codemirror",
"icon": "bi-palette",
"routeName": "route.testcase.codemirror"
},
{
"type": "ROUTE",
"order": 400,
"parentId": "menu.testcase",
"id": "menu.testcase.select",
"titleI18nKey": "menu.testcase.select",
"icon": "bi-palette",
"routeName": "route.testcase.select"
},
{
"type": "ROUTE",
"order": 400,
"parentId": "menu.testcase",
"id": "menu.testcase.treeGrid",
"titleI18nKey": "menu.testcase.treeGrid",
"icon": "bi-palette",
"routeName": "route.testcase.treeGrid"
},
{
"type": "ROUTE",
"order": 400,
"parentId": "menu.testcase",
"id": "menu.testcase.table",
"titleI18nKey": "menu.testcase.table",
"icon": "bi-palette",
"routeName": "route.testcase.table"
}, },
{ "type": "GROUP", "order": 30000, "id": "menu.testcase.likm", "titleI18nKey": "测试用例-likm", "icon": "home" }, { "type": "GROUP", "order": 30000, "id": "menu.testcase.likm", "titleI18nKey": "测试用例-likm", "icon": "home" },
{ {

5
io.sc.platform.core.frontend/src/platform/components/form/WForm.vue

@ -72,6 +72,11 @@ let fields_ = ref([...props.fields]);
const screenCols = { xs: 1, sm: 2, md: 3, lg: 4, xl: 6 }; const screenCols = { xs: 1, sm: 2, md: 3, lg: 4, xl: 6 };
const fiedType = { const fiedType = {
checkbox: 'w-checkbox', checkbox: 'w-checkbox',
cron: 'w-cron',
'color-input': 'w-color-input',
'color-input-palette': 'w-color-input-palette',
'code-mirror': 'w-code-mirror',
position: 'w-position',
date: 'w-date', date: 'w-date',
number: 'w-number', number: 'w-number',
select: 'w-select', select: 'w-select',

170
io.sc.platform.core.frontend/src/platform/components/form/elements/WCodeMirror.vue

@ -0,0 +1,170 @@
<template>
<q-field v-bind="attrs" :stack-label="stackLabelRef" @focus="focus" @blur="blur">
<template #control>
<div ref="codemirrorRef" style="width: 100%"></div>
</template>
</q-field>
</template>
<script setup lang="ts">
import { ref, useAttrs, onMounted, onUnmounted, onUpdated } from 'vue';
import { Tools } from '@/platform';
import { EditorView } from '@codemirror/view';
import { EditorState, Compartment } from '@codemirror/state';
import * as view from '@codemirror/view';
import * as language from '@codemirror/language';
import * as commands from '@codemirror/commands';
import * as search from '@codemirror/search';
import * as autocomplete from '@codemirror/autocomplete';
import { LanguageSupport } from '@codemirror/language';
import { html } from '@codemirror/lang-html';
import { java } from '@codemirror/lang-java';
import { javascript } from '@codemirror/lang-javascript';
import { json } from '@codemirror/lang-json';
import { sql } from '@codemirror/lang-sql';
import { xml } from '@codemirror/lang-xml';
const attrs = useAttrs();
const props = defineProps({
modelValue: { type: String, default: '' },
lang: { type: String, default: 'json' },
width: { type: [Number, String], default: '100%' },
height: { type: [Number, String], default: undefined },
rows: { type: Number, default: 4 },
tabSize: { type: Number, default: 4 },
});
const emits = defineEmits(['update:modelValue']);
const basicSetup = [
EditorState.allowMultipleSelections.of(true),
//view.lineNumbers(),
//view.highlightActiveLine(),
view.highlightActiveLineGutter(),
view.highlightSpecialChars(),
view.drawSelection(),
view.dropCursor(),
view.rectangularSelection(),
view.crosshairCursor(),
commands.history(),
//language.foldGutter(),
language.indentOnInput(),
language.syntaxHighlighting(language.defaultHighlightStyle, { fallback: true }),
language.bracketMatching(),
autocomplete.closeBrackets(),
autocomplete.autocompletion(),
search.highlightSelectionMatches(),
view.keymap.of([
...commands.defaultKeymap,
...commands.historyKeymap,
...language.foldKeymap,
...autocomplete.completionKeymap,
...autocomplete.closeBracketsKeymap,
...search.searchKeymap,
//commands.indentWithTab,
]),
];
const getLanguage = (lang: string): LanguageSupport => {
lang = lang || 'json';
switch (lang.toLowerCase()) {
case 'html':
return html();
case 'java':
return java();
case 'javascript':
return javascript();
case 'json':
return json();
case 'sql':
return sql();
case 'xml':
return xml();
default:
return json();
}
};
const codemirrorRef = ref();
// q-field stack-label field label
// field , label
// field , field label , label
const stackLabelRef = ref(!Tools.isUndefinedOrNull(props.modelValue));
let editorView;
let isFocus = false;
onMounted(() => {
if (codemirrorRef.value) {
let language = new Compartment();
let tabSize = new Compartment();
editorView = new EditorView({
extensions: [
basicSetup,
language.of(getLanguage(props.lang)),
tabSize.of(EditorState.tabSize.of(props.tabSize)),
EditorView.theme({
'&': {
outline: 'none !important',
width: Tools.px(props.width),
height: props.height ? Tools.px(props.height) : props.rows * 22 + 'px',
},
}),
// , , blur
EditorView.updateListener.of(function (e) {
emits('update:modelValue', e.state.doc.toString());
}),
],
parent: codemirrorRef.value,
doc: props.modelValue,
});
}
});
onUnmounted(() => {
editorView.destroy();
});
onUpdated(() => {
if (!isFocus) {
// ,,
editorView.dispatch({ changes: { from: 0, to: editorView.state.doc.length, insert: props.modelValue } });
}
});
const focus = () => {
isFocus = true;
stackLabelRef.value = true;
};
const blur = () => {
isFocus = false;
const content = editorView.state.doc.toString();
//emits('update:modelValue', content);
if (content) {
stackLabelRef.value = true;
} else {
stackLabelRef.value = false;
}
};
const getValue = () => {
return editorView.state.doc.toString();
};
const setValue = (value: string) => {
editorView.dispatch({ changes: { from: 0, to: editorView.state.doc.length, insert: value } });
};
defineExpose({
getValue,
setValue,
});
</script>

4
io.sc.platform.core.frontend/src/platform/components/widget/color/WColorInput.vue → io.sc.platform.core.frontend/src/platform/components/form/elements/WColorInput.vue

@ -49,8 +49,8 @@ const props = defineProps({
const emit = defineEmits(['update:modelValue']); const emit = defineEmits(['update:modelValue']);
const isShow = ref(false); const isShow = ref(false);
const colorValueRef = ref(props.modelValue); const colorValueRef = ref(props.modelValue || '#000000');
const restoreValue = toRaw(props.modelValue); const restoreValue = toRaw(props.modelValue || '#000000');
const computedColorValue = computed(() => { const computedColorValue = computed(() => {
return colorValueRef.value; return colorValueRef.value;

4
io.sc.platform.core.frontend/src/platform/components/widget/color/WColorInputPalette.vue → io.sc.platform.core.frontend/src/platform/components/form/elements/WColorInputPalette.vue

@ -271,8 +271,8 @@ const quasarColors = [
]; ];
const isShow = ref(false); const isShow = ref(false);
const colorValueRef = ref(props.modelValue); const colorValueRef = ref(props.modelValue || 'black');
const restoreValue = toRaw(props.modelValue); const restoreValue = toRaw(props.modelValue || 'black');
const computedColorValue = computed(() => { const computedColorValue = computed(() => {
return colorValueRef.value; return colorValueRef.value;

18
io.sc.platform.core.frontend/src/platform/components/widget/cron/WCron.vue → io.sc.platform.core.frontend/src/platform/components/form/elements/WCron.vue

@ -45,13 +45,13 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, useAttrs } from 'vue'; import { ref, useAttrs } from 'vue';
import { Tools } from '@/platform'; import { Tools } from '@/platform';
import SecondSegment from './SecondSegment.vue'; import SecondSegment from './w-cron-segment/SecondSegment.vue';
import MinuteSegment from './MinuteSegment.vue'; import MinuteSegment from './w-cron-segment/MinuteSegment.vue';
import HourSegment from './HourSegment.vue'; import HourSegment from './w-cron-segment/HourSegment.vue';
import DaySegment from './DaySegment.vue'; import DaySegment from './w-cron-segment/DaySegment.vue';
import MonthSegment from './MonthSegment.vue'; import MonthSegment from './w-cron-segment/MonthSegment.vue';
import WeekSegment from './WeekSegment.vue'; import WeekSegment from './w-cron-segment/WeekSegment.vue';
import YearSegment from './YearSegment.vue'; import YearSegment from './w-cron-segment/YearSegment.vue';
const attrs = useAttrs(); const attrs = useAttrs();
@ -63,8 +63,8 @@ const emit = defineEmits(['update:modelValue']);
const isShow = ref(false); const isShow = ref(false);
const selectedTab = ref('second'); const selectedTab = ref('second');
const valueRef = ref(props.modelValue); const valueRef = ref(props.modelValue || '');
const splits = props.modelValue.split(' '); const splits = (props.modelValue || '').split(' ');
const secondValueRef = ref(splits[0]); const secondValueRef = ref(splits[0]);
const minuteValueRef = ref(splits[1]); const minuteValueRef = ref(splits[1]);
const hourValueRef = ref(splits[2]); const hourValueRef = ref(splits[2]);

6
io.sc.platform.core.frontend/src/platform/components/widget/position/WPosition.vue → io.sc.platform.core.frontend/src/platform/components/form/elements/WPosition.vue

@ -49,7 +49,7 @@
import { ref, toRaw, computed } from 'vue'; import { ref, toRaw, computed } from 'vue';
const props = defineProps({ const props = defineProps({
modelValue: { type: String, default: '#000000' }, modelValue: { type: String, default: '' },
restore: { type: Boolean, default: false }, restore: { type: Boolean, default: false },
}); });
const emit = defineEmits(['update:modelValue']); const emit = defineEmits(['update:modelValue']);
@ -57,8 +57,8 @@ const emit = defineEmits(['update:modelValue']);
const positionList = ['top-left', 'top', 'top-right', 'left', 'center', 'right', 'bottom-left', 'bottom', 'bottom-right']; const positionList = ['top-left', 'top', 'top-right', 'left', 'center', 'right', 'bottom-left', 'bottom', 'bottom-right'];
const isShow = ref(false); const isShow = ref(false);
const positionValueRef = ref(props.modelValue); const positionValueRef = ref(props.modelValue || '');
const restoreValue = toRaw(props.modelValue); const restoreValue = toRaw(props.modelValue || '');
const computedStoreBackgroundColorValue = computed(() => { const computedStoreBackgroundColorValue = computed(() => {
const color: string = restoreValue; const color: string = restoreValue;

0
io.sc.platform.core.frontend/src/platform/components/widget/cron/DaySegment.vue → io.sc.platform.core.frontend/src/platform/components/form/elements/w-cron-segment/DaySegment.vue

0
io.sc.platform.core.frontend/src/platform/components/widget/cron/HourSegment.vue → io.sc.platform.core.frontend/src/platform/components/form/elements/w-cron-segment/HourSegment.vue

0
io.sc.platform.core.frontend/src/platform/components/widget/cron/MinuteSegment.vue → io.sc.platform.core.frontend/src/platform/components/form/elements/w-cron-segment/MinuteSegment.vue

0
io.sc.platform.core.frontend/src/platform/components/widget/cron/MonthSegment.vue → io.sc.platform.core.frontend/src/platform/components/form/elements/w-cron-segment/MonthSegment.vue

0
io.sc.platform.core.frontend/src/platform/components/widget/cron/SecondSegment.vue → io.sc.platform.core.frontend/src/platform/components/form/elements/w-cron-segment/SecondSegment.vue

0
io.sc.platform.core.frontend/src/platform/components/widget/cron/WeekSegment.vue → io.sc.platform.core.frontend/src/platform/components/form/elements/w-cron-segment/WeekSegment.vue

0
io.sc.platform.core.frontend/src/platform/components/widget/cron/YearSegment.vue → io.sc.platform.core.frontend/src/platform/components/form/elements/w-cron-segment/YearSegment.vue

12
io.sc.platform.core.frontend/src/platform/components/index.ts

@ -3,17 +3,19 @@ import WPlatformPage from './app/WPlatformPage.vue';
import WHScreenDiv from './layout/WHScreenDiv.vue'; import WHScreenDiv from './layout/WHScreenDiv.vue';
import WVExpandDiv from './layout/WVExpandDiv.vue'; import WVExpandDiv from './layout/WVExpandDiv.vue';
import WIconEmpty from './icon/WIconEmpty.vue'; import WIconEmpty from './icon/WIconEmpty.vue';
import WColorInput from './widget/color/WColorInput.vue';
import WColorInputPalette from './widget/color/WColorInputPalette.vue';
import WCron from './widget/cron/WCron.vue';
import WPosition from './widget/position/WPosition.vue';
import WCodeMirror from './widget/codemirror/WCodeMirror.vue';
import WTreeGrid from './tree/WTreeGrid.vue'; import WTreeGrid from './tree/WTreeGrid.vue';
import WDialog from './dialog/WDialog.vue'; import WDialog from './dialog/WDialog.vue';
import WDrawer from './drawer/WDrawer.vue'; import WDrawer from './drawer/WDrawer.vue';
import WForm from './form/WForm.vue'; import WForm from './form/WForm.vue';
import WCodeMirror from './form/elements/WCodeMirror.vue';
import WColorInput from './form/elements/WColorInput.vue';
import WColorInputPalette from './form/elements/WColorInputPalette.vue';
import WCron from './form/elements/WCron.vue';
import WPosition from './form/elements/WPosition.vue';
import WText from './form/elements/WText.vue'; import WText from './form/elements/WText.vue';
import WNumber from './form/elements/WNumber.vue'; import WNumber from './form/elements/WNumber.vue';
import WTextarea from './form/elements/WTextarea.vue'; import WTextarea from './form/elements/WTextarea.vue';

72
io.sc.platform.core.frontend/src/platform/components/widget/codemirror/Util.ts

@ -1,72 +0,0 @@
import {
EditorView,
lineNumbers,
highlightActiveLineGutter,
highlightSpecialChars,
drawSelection,
dropCursor,
rectangularSelection,
crosshairCursor,
highlightActiveLine,
keymap,
} from '@codemirror/view';
import { EditorState } from '@codemirror/state';
import { foldGutter, indentOnInput, syntaxHighlighting, defaultHighlightStyle, bracketMatching, foldKeymap } from '@codemirror/language';
import { history, defaultKeymap, historyKeymap } from '@codemirror/commands';
import { highlightSelectionMatches, searchKeymap } from '@codemirror/search';
import { closeBrackets, autocompletion, closeBracketsKeymap, completionKeymap } from '@codemirror/autocomplete';
import { lintKeymap } from '@codemirror/lint';
import { html } from '@codemirror/lang-html';
import { java } from '@codemirror/lang-java';
import { javascript } from '@codemirror/lang-javascript';
import { json } from '@codemirror/lang-json';
import { sql } from '@codemirror/lang-sql';
import { xml } from '@codemirror/lang-xml';
export const basicSetup = [
//lineNumbers(),
highlightActiveLineGutter(),
highlightSpecialChars(),
history(),
//foldGutter(),
drawSelection(),
dropCursor(),
EditorState.allowMultipleSelections.of(true),
indentOnInput(),
syntaxHighlighting(defaultHighlightStyle, { fallback: true }),
bracketMatching(),
closeBrackets(),
autocompletion(),
rectangularSelection(),
crosshairCursor(),
//highlightActiveLine(),
highlightSelectionMatches(),
keymap.of([...closeBracketsKeymap, ...defaultKeymap, ...searchKeymap, ...historyKeymap, ...foldKeymap, ...completionKeymap, ...lintKeymap]),
];
export const basicTheme = () => {
return EditorView.theme({
'.cm-editor': {
outline: 'none !important',
},
});
};
export const getLanguage = (lang: string) => {
if (lang === 'html') {
return html();
} else if (lang === 'java') {
return java();
} else if (lang === 'javascript') {
return javascript();
} else if (lang === 'json') {
return json();
} else if (lang === 'sql') {
return sql();
} else if (lang === 'xml') {
return xml();
} else {
return json();
}
};

38
io.sc.platform.core.frontend/src/platform/components/widget/codemirror/WCodemirror.vue

@ -1,38 +0,0 @@
<template>
<q-field :v-bind="attrs">
<template #control>
<div ref="codemirrorRef" class="border border-red-500" style="padding-top: 1px"></div>
</template>
</q-field>
</template>
<script setup lang="ts">
import { ref, useAttrs, onMounted, onUnmounted } from 'vue';
import { EditorView } from '@codemirror/view';
import { basicSetup, basicTheme, getLanguage } from './Util';
const attrs = useAttrs();
const props = defineProps({
lang: { type: String, default: 'json' },
});
const codemirrorRef = ref();
let view;
onMounted(() => {
view = new EditorView({
extensions: [basicSetup, getLanguage(props.lang), basicTheme()],
parent: codemirrorRef.value,
});
});
onUnmounted(() => {
view.destroy();
});
const value = ref('<xml><a name="name"></a></xml>');
</script>
<style>
.cm-editor {
outline: none !important;
}
</style>

31
io.sc.platform.core.frontend/src/platform/components/widget/codemirror/WCodemirror2.vue

@ -1,31 +0,0 @@
<template>
<div>
<CodeMirror basic :lang="language" class="overflow-y-auto" v-bind="attrs"></CodeMirror>
</div>
</template>
<script setup lang="ts">
import { useAttrs, ref, onMounted } from 'vue';
import CodeMirror from 'vue-codemirror6';
import { java } from '@codemirror/lang-java';
import { json } from '@codemirror/lang-json';
import { sql } from '@codemirror/lang-sql';
import { xml } from '@codemirror/lang-xml';
const attrs = useAttrs();
const props = defineProps({
lang: { type: String, default: 'json' },
});
let language = json();
if (props.lang === 'java') {
language = java();
} else if (props.lang === 'json') {
language = json();
} else if (props.lang === 'sql') {
language = sql();
} else if (props.lang === 'xml') {
language = xml();
}
console.log(props.lang);
</script>

7
io.sc.platform.core.frontend/src/platform/components/widget/select/WSelect.vue

@ -1,7 +0,0 @@
<template>
<q-select outlined emit-value map-options v-bind="attrs" />
</template>
<script setup lang="ts">
import { useAttrs } from 'vue';
const attrs = useAttrs();
</script>

25
io.sc.platform.core.frontend/src/platform/utils/Tools.ts

@ -46,6 +46,15 @@ class Tools {
return !Tools.isUndefinedOrNull(obj) && typeof obj === 'string'; return !Tools.isUndefinedOrNull(obj) && typeof obj === 'string';
} }
/**
*
* @param obj
* @returns
*/
public static isNumber(obj: any): boolean {
return !isNaN(parseFloat(obj)) && isFinite(obj);
}
/** /**
* *
* @param obj * @param obj
@ -806,6 +815,22 @@ class Tools {
return (c === 'x' ? random : (random & 0x3) | 0x8).toString(16); return (c === 'x' ? random : (random & 0x3) | 0x8).toString(16);
}); });
} }
/**
*
* @param value
* @returns
*/
public static px(value: any) {
if (Tools.isUndefinedOrNull(value)) {
return null;
}
if (Tools.isNumber(value)) {
return value + 'px';
} else {
return value;
}
}
} }
export { Tools }; export { Tools };

58
io.sc.platform.core.frontend/src/routes/routes.json

@ -1,62 +1,14 @@
[ [
{ {
"name": "route.testcase.component", "name": "route.testcase.formElements",
"path": "testcase/component", "path": "testcase/formElements",
"parent": "/", "parent": "/",
"priority": 0, "priority": 0,
"component": "component.testcase.component", "component": "component.testcase.formElements",
"componentPath": "@/views/Component.vue", "componentPath": "@/views/FormElements.vue",
"redirect": null, "redirect": null,
"meta": { "meta": {
"permissions": ["/testcase/component/**/*"] "permissions": ["/testcase/formElements/**/*"]
}
},
{
"name": "route.testcase.dialog",
"path": "testcase/dialog",
"parent": "/",
"priority": 0,
"component": "component.testcase.dialog",
"componentPath": "@/views/Dialog.vue",
"redirect": null,
"meta": {
"permissions": ["/testcase/dialog/**/*"]
}
},
{
"name": "route.testcase.codemirror",
"path": "testcase/codemirror",
"parent": "/",
"priority": 0,
"component": "component.testcase.codemirror",
"componentPath": "@/views/Codemirror.vue",
"redirect": null,
"meta": {
"permissions": ["/testcase/codemirror/**/*"]
}
},
{
"name": "route.testcase.select",
"path": "testcase/select",
"parent": "/",
"priority": 0,
"component": "component.testcase.select",
"componentPath": "@/views/Select.vue",
"redirect": null,
"meta": {
"permissions": ["/testcase/select/**/*"]
}
},
{
"name": "route.testcase.treeGrid",
"path": "testcase/treeGrid",
"parent": "/",
"priority": 0,
"component": "component.testcase.treeGrid",
"componentPath": "@/views/TreeGrid.vue",
"redirect": null,
"meta": {
"permissions": ["/testcase/treeGrid/**/*"]
} }
}, },
{ {

50
io.sc.platform.core.frontend/src/views/Codemirror.vue

@ -1,50 +0,0 @@
<template>
<!-- <w-codemirror
v-model="value"
lang="xml"
placeholder="Code goes here..."
:autofocus="false"
:tab-size="2"
:style="{ height: '200px', padding: '20px' }"
></w-codemirror> -->
<q-input outlined label="OK"></q-input>
<label class="q-field row no-wrap items-start q-field--outlined q-input q-field--labeled" for="f_eef31e6a-a3a8-4a87-b35c-481f40af889e">
<div class="q-field__inner relative-position col self-stretch">
<div class="q-field__control relative-position row no-wrap" tabindex="-1">
<div class="q-field__control-container col relative-position row no-wrap q-anchor--skip"></div>
</div>
</div>
</label>
<div class="rounded-md" style="border: 1px solid #e5e7eb">
<div class="px-3 text-gray-600 text-xs">OK</div>
<div ref="codemirrorRef" class="py-1"></div>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted, onUnmounted } from 'vue';
import { EditorView, basicSetup } from 'codemirror';
import { javascript } from '@codemirror/lang-javascript';
const codemirrorRef = ref();
let view;
onMounted(() => {
view = new EditorView({
extensions: [basicSetup, javascript()],
parent: codemirrorRef.value,
});
//view.destroy();
});
onUnmounted(() => {
console.log('>>>>>>');
view.destroy();
});
const value = ref('<xml><a name="name"></a></xml>');
</script>
<style>
.cm-editor2 {
outline: none !important;
}
</style>

29
io.sc.platform.core.frontend/src/views/Component.vue

@ -1,29 +0,0 @@
<template>
<q-splitter v-model="splitWidthRef" style="height: 250px">
<template #before>
<q-tabs v-model="selectedTab" vertical no-caps>
<q-tab name="cron" label="w-cron" />
<q-tab name="codemirror" label="w-code-mirror" />
</q-tabs>
</template>
<template #after>
<q-tab-panels v-model="selectedTab" animated swipeable vertical transition-prev="jump-up" transition-next="jump-up">
<q-tab-panel name="cron">
<w-cron v-model="valueRef" label="cron" outlined dense style="width: 200px"></w-cron>
</q-tab-panel>
<q-tab-panel name="codemirror">
<w-code-mirror v-model="valueRef" label="codemirror" lang="sql" outlined dense></w-code-mirror>
<q-input v-model="valueRef" label="codemirror" outlined dense></q-input>
</q-tab-panel>
</q-tab-panels>
</template>
</q-splitter>
</template>
<script setup lang="ts">
import { ref } from 'vue';
const selectedTab = ref('codemirror');
const splitWidthRef = ref(20);
const valueRef = ref('* * * * * *');
</script>

37
io.sc.platform.core.frontend/src/views/Dialog.vue

@ -1,37 +0,0 @@
<template>
<w-dialog
ref="dialogRef"
:persistent="true"
:maximized="true"
title="xxx"
width="50%"
height="50%"
:can-maximize="true"
:actions="[
{
icon: PlatformIconEnum.保存,
label: '保存',
loading: false,
click: async () => {},
},
]"
@maximize="dialogMaximize"
></w-dialog>
</template>
<script setup lang="ts">
import { ref, reactive, onMounted } from 'vue';
import { PlatformIconEnum, DialogManager } from '@/platform';
const dialogRef = ref();
const dialogMaximize = (maximizedToggle: boolean) => {
console.log(maximizedToggle);
};
onMounted(() => {
//dialogRef.value.show();
DialogManager.confirm('kdjflksjdf', () => {
console.log('ok');
});
});
</script>

30
io.sc.platform.core.frontend/src/views/Form1.vue

@ -1,30 +0,0 @@
<template>
<div>
<w-form :fields="fields" :cols-num-auto="false" :cols-num="3"></w-form>
</div>
</template>
<script setup lang="ts">
const fields = [
{
label: '姓名',
name: 'name',
type: 'text',
required: true,
colspan: 2,
button: {
round: false,
icon: 'home',
label: '选择',
click: () => {
console.info('11111');
},
},
},
{
label: '年龄',
name: 'age',
type: 'number',
required: true,
},
];
</script>

44
io.sc.platform.core.frontend/src/views/FormElements.vue

@ -0,0 +1,44 @@
<template>
<q-splitter v-model="splitWidthRef">
<template #before>
<q-tabs v-model="selectedTab" vertical no-caps>
<q-tab name="formElements" label="Form Elements" />
<q-tab name="codemirror" label="w-code-mirror" />
</q-tabs>
</template>
<template #after>
<q-tab-panels v-model="selectedTab" animated swipeable vertical transition-prev="jump-up" transition-next="jump-up">
<q-tab-panel name="formElements">
<w-form
:cols-num="1"
:fields="[
{ name: 'color', label: 'please select color', type: 'color-input', outlined: true, dense: true },
{ name: 'colorPalette', label: 'please select color palette', type: 'color-input-palette', outlined: true, dense: true },
{ name: 'codemirror', label: 'please input SQL', type: 'code-mirror', outlined: true, lang: 'sql', dense: true, rows: 5 },
{ name: 'cron', label: 'please input cron expression', type: 'cron', outlined: true, dense: true },
{ name: 'position', label: 'please select position', type: 'position', outlined: true, dense: true },
]"
>
</w-form>
</q-tab-panel>
<q-tab-panel name="codemirror">
<q-input v-model="valueRef" label="please input number 1:" outlined dense clearable></q-input>
<w-code-mirror v-model="valueRef" label="please input SQL:" lang="sql" outlined dense></w-code-mirror>
<q-input v-model="valueRef" label="please input number 2:" outlined dense clearable></q-input>
</q-tab-panel>
</q-tab-panels>
</template>
</q-splitter>
</template>
<script setup lang="ts">
import { ref } from 'vue';
const selectedTab = ref('formElements');
const splitWidthRef = ref(20);
const valueRef = ref('xxxx');
const focus = () => {
console.log('sfsdf');
};
</script>

4
io.sc.platform.core.frontend/src/views/Grid1.vue

@ -1,4 +0,0 @@
<template>
<div>2222</div>
</template>
<script setup lang="ts"></script>

22
io.sc.platform.core.frontend/src/views/Select.vue

@ -1,22 +0,0 @@
<template>
<w-select v-model="model" :options="options" label="Status" @update:model-value="valueChanged" />
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { EnumTools } from '@/platform';
import { QBtn } from 'quasar';
const { t } = useI18n();
const model = ref('value');
const options = ref();
EnumTools.fetch('io.sc.platform.flowable.enums.ProcessStatus', t).then((data) => {
console.log(data.map);
options.value = data.map;
});
const valueChanged = (value) => {
console.log(value);
};
</script>

64
io.sc.platform.core.frontend/src/views/Table.vue

@ -1,64 +0,0 @@
<template>
<w-grid
:tree="true"
:title="$t('system.corporation.grid.title')"
:data-url="Environment.apiContextPath('/api/system/corporation')"
selection="multiple"
:checkbox-selection="false"
:pageable="false"
:full-screen-button="false"
:tree-icon="
(row) => {
return { name: 'folder', color: 'amber' };
}
"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="['refresh', 'separator', ['addTop', 'addChild'], 'edit', 'remove', 'separator', 'view']"
:columns="[
{ width: '100%', name: 'name', label: $t('name') },
{ width: 150, name: 'code', label: $t('code') },
{ width: 90, name: 'dataComeFrom', label: $t('dataComeFrom'), format: Formater.enum(DataComeFromEnum) },
{ width: 100, name: 'lastModifier', label: $t('lastModifier') },
{ width: 110, name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.dateOnly() },
{ width: 80, name: 'enable', label: $t('status'), format: Formater.enableTag() },
]"
:editor="{
dialog: {
width: '600px',
height: '300px',
},
form: {
colsNum: 1,
fields: [
{ name: 'code', label: $t('code'), type: 'text', required: true },
{ name: 'name', label: $t('name'), type: 'text', required: true },
{ name: 'description', label: $t('description'), type: 'textarea', rows: 1 },
{ name: 'enable', label: $t('enable'), type: 'checkbox', defaultValue: true },
],
},
}"
:viewer="{
panel: {
columnNum: 1,
fields: [
{ name: 'id', label: $t('id') },
{ name: 'code', label: $t('code') },
{ name: 'name', label: $t('name') },
{ name: 'description', label: $t('description') },
{ name: 'enable', label: $t('enable'), format: (value) => value },
{ name: 'dataComeFrom', label: $t('dataComeFrom'), format: (value) => value },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: (value) => value },
],
},
}"
></w-grid>
</template>
<script setup lang="ts">
import { Environment,Formater,Options } from '@/platform';
</script>

118
io.sc.platform.core.frontend/src/views/TableTitle.vue

@ -1,118 +0,0 @@
<template>
<div class="flex flex-nowrap py-2">
<div ref="titleContainerRef" class="flex items-end text-subtitle2 text-no-wrap">{{ title }}</div>
<q-space />
<div ref="actionContainerRef" class="flex flex-nowrap">
<!-- baseActions -->
<template v-for="(action, index) in baseActions" :key="'baseAction_' + index">
<q-separator
v-if="action.separator"
vertical
class="class-action-item"
:style="{
'margin-left': '5px',
'margin-right': '5px',
}"
/>
<q-btn
v-else
v-bind="action"
:id="action.name"
:disable="action.enableIf ? !action.enableIf() : false"
no-wrap
class="class-action-item"
:style="{
'margin-left': '5px',
'margin-right': '5px',
}"
@click="action.click"
/>
</template>
<!-- moreActions -->
<q-btn-dropdown v-if="moreActions && moreActions.length > 0" :label="$t('more')" class="class-action-item" style="margin-left: 5px">
<q-list>
<template v-for="(action, index) in moreActions" :key="'moreAction_' + index">
<q-separator v-if="action.separator" />
<q-item v-else v-close-popup clickable @click="action.click">
<q-item-section avatar style="min-width: 28px; padding-right: 0px">
<q-icon :name="action.icon" size="20px" />
</q-item-section>
<q-item-section>
<q-item-label :v-bind="action">{{ action.label }}</q-item-label>
</q-item-section>
</q-item>
</template>
</q-list>
</q-btn-dropdown>
</div>
<q-resize-observer @resize="onResize" />
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { Tools } from '@/platform/utils';
const props = defineProps({
title: { type: String, default: '' },
actions: {
type: Array,
default: () => {
return [];
},
},
});
const titleContainerRef = ref();
const actionContainerRef = ref();
const actions = props.actions;
const baseActions = ref(actions);
const moreActions = ref([]);
const isActionWidthInitializedRef = ref(false);
const moreActionWidth = 100;
const onResize = (size) => {
if (Tools.isUndefinedOrNull(titleContainerRef.value) || Tools.isUndefinedOrNull(actionContainerRef.value)) {
return;
}
if (!isActionWidthInitializedRef.value) {
const nodes = actionContainerRef.value.getElementsByClassName('class-action-item');
for (let i = 0; i < actions.length; i++) {
actions[i].width = nodes[i].clientWidth + 10;
}
isActionWidthInitializedRef.value = true;
}
const _baseActions = [];
const _moreActions = [];
const length = actions.length;
let availableWidth = size.width - titleContainerRef.value.clientWidth;
let width = 0;
let index = 0;
for (; index < length; index++) {
console.log(index, width + actions[index].width, availableWidth);
if (width + actions[index].width > availableWidth) {
availableWidth -= moreActionWidth;
while (width > availableWidth) {
index--;
width -= actions[index].width;
_baseActions.pop();
}
break;
} else {
_baseActions.push(actions[index]);
width += actions[index].width;
}
}
for (; index < length; index++) {
_moreActions.push(actions[index]);
}
baseActions.value = _baseActions;
moreActions.value = _moreActions;
};
</script>

236
io.sc.platform.core.frontend/src/views/TreeGrid.vue

@ -1,236 +0,0 @@
<template>
<div>
<div v-if="executeProgress.show" class="row pt-2">
<div class="col-2 pl-4">{{ $t('io.sc.engine.mv.result.task.progress') }}</div>
<div class="col-3">
<q-linear-progress size="20px" :value="executeProgress.percentage" color="primary" rounded> </q-linear-progress>
</div>
<div class="col-7 pl-4">{{ executeProgress.message }}</div>
<div class="col-1"></div>
</div>
<w-grid
ref="gridRef"
:title="$t('menu.engine.mv.result')"
:config-button="true"
selection="multiple"
:checkbox-selection="false"
:data-url="Environment.apiContextPath('/api/mv/viewer/result')"
:pageable="true"
:pagination="{
sortBy: 'validateDate',
descending: true,
}"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="[
'refresh',
'separator',
{
name: 'execute',
label: $t('io.sc.engine.mv.result.grid.toolbar.execute'),
icon: 'bi-play-circle',
click: () => {
executorDialogRef.open();
},
},
'separator',
{
name: 'detail',
label: $t('detail'),
icon: 'bi-display',
enableIf: (selecteds) => {
return selecteds && selecteds.length > 0;
},
click: (selecteds) => {
if (selecteds && selecteds.length > 0) {
const selected = selecteds[0];
resultDetailDialogRef.open(selected);
}
},
},
{
extend: 'remove',
click: (selecteds) => {
if (selecteds && selecteds.length > 0) {
const selected = selecteds[0];
axios
.request({
url: Environment.apiContextPath('/api/mv/viewer/result'),
method: 'delete',
data: [{ validateDate: selected.validateDate, modelId: selected.modelId }],
})
.then(() => {
gridRef.refresh();
});
}
},
},
'separator',
'view',
'separator',
'export',
]"
:columns="[
{ width: 150, name: 'validateDate', label: $t('io.sc.engine.mv.result.grid.entity.validateDate') },
{ width: 150, name: 'modelId', label: $t('io.sc.engine.mv.result.grid.entity.modelId') },
{ width: 200, name: 'modelName', label: $t('io.sc.engine.mv.result.grid.entity.modelName') },
{ width: 100, name: 'executeMode', label: $t('io.sc.engine.mv.result.grid.entity.executeMode') },
{ width: 100, name: 'totalSampleCount', label: $t('io.sc.engine.mv.result.grid.entity.totalSampleCount'), align: 'right' },
{ width: 100, name: 'defaultSampleCount', label: $t('io.sc.engine.mv.result.grid.entity.defaultSampleCount'), align: 'right' },
{
width: 900,
name: 'discrimination',
label: $t('io.sc.engine.mv.result.grid.entity.discrimination'),
columns: [
{
name: 'total',
label: $t('io.sc.engine.mv.result.grid.entity.total'),
columns: [
{ width: 100, name: 'auc', label: $t('io.sc.engine.mv.result.grid.entity.auc') },
{ width: 100, name: 'ar', label: $t('io.sc.engine.mv.result.grid.entity.ar') },
{ width: 100, name: 'ks', label: $t('io.sc.engine.mv.result.grid.entity.ks') },
],
},
{
name: 'quantitative',
label: $t('quantitative'),
columns: [
{ width: 100, name: 'aucQuantitative', label: $t('io.sc.engine.mv.result.grid.entity.auc') },
{ width: 100, name: 'arQuantitative', label: $t('io.sc.engine.mv.result.grid.entity.ar') },
{ width: 100, name: 'ksQuantitative', label: $t('io.sc.engine.mv.result.grid.entity.ks') },
],
},
{
name: 'qualitative',
label: $t('qualitative'),
columns: [
{ width: 100, name: 'aucQualitative', label: $t('io.sc.engine.mv.result.grid.entity.auc') },
{ width: 100, name: 'arQualitative', label: $t('io.sc.engine.mv.result.grid.entity.ar') },
{ width: 100, name: 'ksQualitative', label: $t('io.sc.engine.mv.result.grid.entity.ks') },
],
},
],
},
{
width: 200,
name: 'stability',
label: $t('io.sc.engine.mv.result.grid.entity.stability'),
columns: [
{ width: 100, name: 'svd', label: $t('io.sc.engine.mv.result.grid.entity.svd') },
{ width: 100, name: 'psi', label: $t('io.sc.engine.mv.result.grid.entity.psi') },
],
},
{
width: 200,
name: 'scaleValidate',
label: $t('io.sc.engine.mv.result.grid.entity.scaleValidate'),
columns: [
{ width: 100, name: 'chiSquare', label: $t('io.sc.engine.mv.result.grid.entity.chiSquare'), align: 'center', format: passOrNotFormater },
{ width: 100, name: 'binomial', label: $t('io.sc.engine.mv.result.grid.entity.binomial'), align: 'center', format: passOrNotFormater },
],
},
]"
:viewer="{
panel: {
columnNum: 1,
fields: [
{ name: 'validateDate', label: $t('io.sc.engine.mv.result.grid.entity.validateDate') },
{
name: 'runtimeParameters',
label: $t('io.sc.engine.mv.result.grid.entity.runtimeParameters'),
format: (value) => {
let result = '';
for (const item of value) {
result +=
$t('io.sc.engine.mv.result.grid.entity.runtimeParameters.' + item.name) +
':' +
(Tools.isUndefinedOrNull(item.value) ? '' : item.value) +
'<br/>';
}
return result;
},
},
{ name: 'modelId', label: $t('io.sc.engine.mv.result.grid.entity.modelId') },
{ name: 'modelName', label: $t('io.sc.engine.mv.result.grid.entity.modelName') },
{ name: 'executeMode', label: $t('io.sc.engine.mv.result.grid.entity.executeMode') },
{ name: 'totalSampleCount', label: $t('io.sc.engine.mv.result.grid.entity.totalSampleCount') },
{ name: 'defaultSampleCount', label: $t('io.sc.engine.mv.result.grid.entity.defaultSampleCount') },
{ name: 'auc', label: $t('io.sc.engine.mv.result.grid.entity.total.auc') },
{ name: 'ar', label: $t('io.sc.engine.mv.result.grid.entity.total.ar') },
{ name: 'ks', label: $t('io.sc.engine.mv.result.grid.entity.total.ks') },
{ name: 'aucQuantitative', label: $t('io.sc.engine.mv.result.grid.entity.quantitative.auc') },
{ name: 'arQuantitative', label: $t('io.sc.engine.mv.result.grid.entity.quantitative.ar') },
{ name: 'ksQuantitative', label: $t('io.sc.engine.mv.result.grid.entity.quantitative.ks') },
{ name: 'aucQualitative', label: $t('io.sc.engine.mv.result.grid.entity.qualitative.auc') },
{ name: 'arQualitative', label: $t('io.sc.engine.mv.result.grid.entity.qualitative.ar') },
{ name: 'ksQualitative', label: $t('io.sc.engine.mv.result.grid.entity.qualitative.ks') },
{ name: 'svd', label: $t('io.sc.engine.mv.result.grid.entity.svd') },
{ name: 'psi', label: $t('io.sc.engine.mv.result.grid.entity.psi') },
{ name: 'chiSquare', label: $t('io.sc.engine.mv.result.grid.entity.chiSquare'), format: Formater.none() },
{ name: 'binomial', label: $t('io.sc.engine.mv.result.grid.entity.binomial'), format: Formater.none() },
],
},
}"
></w-grid>
</div>
</template>
<script setup lang="ts">
import { ref, reactive } from 'vue';
import { axios, Environment, Tools, Formater, NotifyManager } from '@/platform';
const gridRef = ref();
const resultDetailDialogRef = ref();
const executorDialogRef = ref();
const executeProgress = reactive({
show: false,
percentage: 0,
message: '',
});
let executeProgressInterval;
const passOrNotFormater = (value) => {
if (Tools.isUndefinedOrNull(value)) {
return '';
}
if (value === 'PASS') {
return {
componentType: 'QIcon',
attrs: { name: 'bi-check-circle', size: '20px', color: 'green' },
};
} else {
return {
componentType: 'QIcon',
attrs: { name: 'bi-x-circle', size: '20px', color: 'red' },
};
}
};
const afterStartExecute = () => {
executeProgress.show = true;
executeProgress.percentage = 0;
executeProgressInterval = setInterval(() => {
axios
.get(Environment.apiContextPath('/api/mv/traceExecuteProgress'))
.then((response) => {
const progressInfo = response.data;
executeProgress.percentage = progressInfo.currentWeight / progressInfo.totalWeight;
executeProgress.message = progressInfo.messageKey;
if (executeProgress.percentage >= 1) {
clearInterval(executeProgressInterval);
executeProgress.show = false;
gridRef.value.refresh();
}
})
.catch(() => {
clearInterval(executeProgressInterval);
executeProgress.show = false;
gridRef.value.refresh();
});
}, 1000);
};
axios.get(Environment.apiContextPath('/api/mv/isExistsRunningExecutor')).then((response) => {
if (response.data) {
afterStartExecute();
}
});
</script>
Loading…
Cancel
Save