Commit a812685084b45ce3c6b6675bb1569e324f742416

Authored by Vben
1 parent c04e8943

feat: add codeEditor component

CHANGELOG.zh_CN.md
@@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
3 ### ✨ Features 3 ### ✨ Features
4 4
5 - 新增图形编辑器示例 5 - 新增图形编辑器示例
  6 +- 新增代码编辑器(包含 Json 编辑器)
6 7
7 ### ⚡ Performance Improvements 8 ### ⚡ Performance Improvements
8 9
package.json
@@ -39,6 +39,7 @@ @@ -39,6 +39,7 @@
39 "@zxcvbn-ts/core": "^0.3.0", 39 "@zxcvbn-ts/core": "^0.3.0",
40 "ant-design-vue": "^2.1.2", 40 "ant-design-vue": "^2.1.2",
41 "axios": "^0.21.1", 41 "axios": "^0.21.1",
  42 + "codemirror": "^5.60.0",
42 "cropperjs": "^1.5.11", 43 "cropperjs": "^1.5.11",
43 "crypto-js": "^4.0.0", 44 "crypto-js": "^4.0.0",
44 "echarts": "^5.1.0", 45 "echarts": "^5.1.0",
@@ -64,6 +65,7 @@ @@ -64,6 +65,7 @@
64 "@commitlint/config-conventional": "^12.1.1", 65 "@commitlint/config-conventional": "^12.1.1",
65 "@iconify/json": "^1.1.330", 66 "@iconify/json": "^1.1.330",
66 "@purge-icons/generated": "^0.7.0", 67 "@purge-icons/generated": "^0.7.0",
  68 + "@types/codemirror": "^0.0.109",
67 "@types/crypto-js": "^4.0.1", 69 "@types/crypto-js": "^4.0.1",
68 "@types/fs-extra": "^9.0.11", 70 "@types/fs-extra": "^9.0.11",
69 "@types/inquirer": "^7.3.1", 71 "@types/inquirer": "^7.3.1",
src/components/CodeEditor/index.ts 0 → 100644
  1 +import type { App } from 'vue';
  2 +import codeEditor from './src/CodeEditor.vue';
  3 +
  4 +export const CodeEditor = Object.assign(codeEditor, {
  5 + install(app: App) {
  6 + app.component(codeEditor.name, codeEditor);
  7 + },
  8 +});
src/components/CodeEditor/src/CodeEditor.vue 0 → 100644
  1 +<template>
  2 + <div class="h-full">
  3 + <CodeMirrorEditor :value="getValue" @change="handleValueChange" :mode="mode" />
  4 + </div>
  5 +</template>
  6 +<script lang="ts">
  7 + import { defineComponent, computed } from 'vue';
  8 + import CodeMirrorEditor from './codemirror/CodeMirror.vue';
  9 + import { isString } from '/@/utils/is';
  10 +
  11 + const MODE = {
  12 + JSON: 'application/json',
  13 + html: 'htmlmixed',
  14 + js: 'javascript',
  15 + };
  16 + export default defineComponent({
  17 + name: 'CodeEditor',
  18 + components: { CodeMirrorEditor },
  19 + props: {
  20 + value: {
  21 + type: [Object, String],
  22 + },
  23 + mode: {
  24 + type: String,
  25 + default: MODE.JSON,
  26 + },
  27 + },
  28 + emits: ['change'],
  29 + setup(props, { emit }) {
  30 + const getValue = computed(() => {
  31 + const { value, mode } = props;
  32 +
  33 + if (mode === MODE.JSON) {
  34 + return isString(value)
  35 + ? JSON.stringify(JSON.parse(value), null, 2)
  36 + : JSON.stringify(value, null, 2);
  37 + }
  38 + return value;
  39 + });
  40 +
  41 + function handleValueChange(v) {
  42 + emit('change', v);
  43 + }
  44 +
  45 + return {
  46 + handleValueChange,
  47 + getValue,
  48 + };
  49 + },
  50 + });
  51 +</script>
src/components/CodeEditor/src/codemirror/CodeMirror.vue 0 → 100644
  1 +<template>
  2 + <div class="relative h-100 !h-full w-full overflow-hidden" ref="el"> </div>
  3 +</template>
  4 +
  5 +<script lang="ts">
  6 + import {
  7 + ref,
  8 + onMounted,
  9 + onUnmounted,
  10 + watchEffect,
  11 + watch,
  12 + defineComponent,
  13 + unref,
  14 + nextTick,
  15 + } from 'vue';
  16 + import { useDebounceFn } from '@vueuse/core';
  17 + import { useAppStore } from '/@/store/modules/app';
  18 +
  19 + import CodeMirror from 'codemirror';
  20 + import './codemirror.css';
  21 + import 'codemirror/theme/idea.css';
  22 + import 'codemirror/theme/material-palenight.css';
  23 +
  24 + // modes
  25 + import 'codemirror/mode/javascript/javascript';
  26 + import 'codemirror/mode/css/css';
  27 + import 'codemirror/mode/htmlmixed/htmlmixed';
  28 + export default defineComponent({
  29 + props: {
  30 + mode: {
  31 + type: String,
  32 + default: 'application/json',
  33 + },
  34 + value: {
  35 + type: String,
  36 + default: '',
  37 + },
  38 + readonly: {
  39 + type: Boolean,
  40 + default: false,
  41 + },
  42 + },
  43 + emits: ['change'],
  44 + setup(props, { emit }) {
  45 + const el = ref();
  46 + let editor: Nullable<CodeMirror.Editor>;
  47 +
  48 + const debounceRefresh = useDebounceFn(refresh, 100);
  49 + const appStore = useAppStore();
  50 +
  51 + watch(
  52 + () => props.value,
  53 + async (v) => {
  54 + await nextTick();
  55 + const oldValue = editor?.getValue();
  56 + v && v !== oldValue && editor?.setValue(v);
  57 + },
  58 + { flush: 'post' }
  59 + );
  60 +
  61 + watchEffect(() => {
  62 + editor?.setOption('mode', props.mode);
  63 + });
  64 +
  65 + watch(
  66 + () => appStore.getDarkMode,
  67 + async () => {
  68 + setTheme();
  69 + },
  70 + {
  71 + immediate: true,
  72 + }
  73 + );
  74 +
  75 + function setTheme() {
  76 + unref(editor)?.setOption(
  77 + 'theme',
  78 + appStore.getDarkMode === 'light' ? 'idea' : 'material-palenight'
  79 + );
  80 + }
  81 +
  82 + function refresh() {
  83 + editor?.refresh();
  84 + }
  85 +
  86 + async function init() {
  87 + const addonOptions = {
  88 + autoCloseBrackets: true,
  89 + autoCloseTags: true,
  90 + foldGutter: true,
  91 + gutters: ['CodeMirror-linenumbers'],
  92 + };
  93 +
  94 + editor = CodeMirror(el.value!, {
  95 + value: '',
  96 + mode: props.mode,
  97 + readOnly: props.readonly,
  98 + tabSize: 2,
  99 + theme: 'material-palenight',
  100 + lineWrapping: true,
  101 + lineNumbers: true,
  102 + ...addonOptions,
  103 + });
  104 + editor?.setValue(props.value);
  105 + setTheme();
  106 + editor?.on('change', () => {
  107 + emit('change', editor?.getValue());
  108 + });
  109 + }
  110 +
  111 + onMounted(async () => {
  112 + await nextTick();
  113 + init();
  114 + window.addEventListener('resize', debounceRefresh);
  115 + setTimeout(refresh, 50);
  116 + });
  117 +
  118 + onUnmounted(() => {
  119 + window.removeEventListener('resize', debounceRefresh);
  120 + editor = null;
  121 + });
  122 + return { el };
  123 + },
  124 + });
  125 +</script>
src/components/CodeEditor/src/codemirror/codeMirror.ts 0 → 100644
  1 +import CodeMirror from 'codemirror';
  2 +import './codemirror.css';
  3 +import 'codemirror/theme/idea.css';
  4 +import 'codemirror/theme/material-palenight.css';
  5 +// import 'codemirror/addon/lint/lint.css';
  6 +
  7 +// modes
  8 +import 'codemirror/mode/javascript/javascript';
  9 +import 'codemirror/mode/css/css';
  10 +import 'codemirror/mode/htmlmixed/htmlmixed';
  11 +// addons
  12 +// import 'codemirror/addon/edit/closebrackets';
  13 +// import 'codemirror/addon/edit/closetag';
  14 +// import 'codemirror/addon/comment/comment';
  15 +// import 'codemirror/addon/fold/foldcode';
  16 +// import 'codemirror/addon/fold/foldgutter';
  17 +// import 'codemirror/addon/fold/brace-fold';
  18 +// import 'codemirror/addon/fold/indent-fold';
  19 +// import 'codemirror/addon/lint/json-lint';
  20 +// import 'codemirror/addon/fold/comment-fold';
  21 +export { CodeMirror };
src/components/CodeEditor/src/codemirror/codemirror.css 0 → 100644
  1 +/* BASICS */
  2 +
  3 +.CodeMirror {
  4 + --base: #545281;
  5 + --comment: hsl(210, 25%, 60%);
  6 + --keyword: #af4ab1;
  7 + --variable: #0055d1;
  8 + --function: #c25205;
  9 + --string: #2ba46d;
  10 + --number: #c25205;
  11 + --tags: #d00;
  12 + --qualifier: #ff6032;
  13 + --important: var(--string);
  14 +
  15 + height: auto;
  16 + height: 100%;
  17 + font-family: var(--font-code);
  18 + direction: ltr;
  19 +}
  20 +
  21 +/* PADDING */
  22 +
  23 +.CodeMirror-lines {
  24 + padding: 4px 0; /* Vertical padding around content */
  25 +}
  26 +
  27 +.CodeMirror pre {
  28 + padding: 0 4px; /* Horizontal padding of content */
  29 +}
  30 +
  31 +.CodeMirror-scrollbar-filler,
  32 +.CodeMirror-gutter-filler {
  33 + background-color: white; /* The little square between H and V scrollbars */
  34 +}
  35 +
  36 +/* GUTTER */
  37 +
  38 +.CodeMirror-gutters {
  39 + white-space: nowrap;
  40 + background-color: transparent;
  41 + border-right: 1px solid #ddd;
  42 +}
  43 +
  44 +.CodeMirror-linenumber {
  45 + min-width: 20px;
  46 + padding: 0 3px 0 5px;
  47 + color: var(--comment);
  48 + text-align: right;
  49 + white-space: nowrap;
  50 + opacity: 0.6;
  51 +}
  52 +
  53 +.CodeMirror-guttermarker {
  54 + color: black;
  55 +}
  56 +
  57 +.CodeMirror-guttermarker-subtle {
  58 + color: #999;
  59 +}
  60 +
  61 +/* FOLD GUTTER */
  62 +
  63 +.CodeMirror-foldmarker {
  64 + font-family: arial;
  65 + line-height: 0.3;
  66 + color: #414141;
  67 + text-shadow: #f96 1px 1px 2px, #f96 -1px -1px 2px, #f96 1px -1px 2px, #f96 -1px 1px 2px;
  68 + cursor: pointer;
  69 +}
  70 +
  71 +.CodeMirror-foldgutter {
  72 + width: 0.7em;
  73 +}
  74 +
  75 +.CodeMirror-foldgutter-open,
  76 +.CodeMirror-foldgutter-folded {
  77 + cursor: pointer;
  78 +}
  79 +
  80 +.CodeMirror-foldgutter-open::after,
  81 +.CodeMirror-foldgutter-folded::after {
  82 + position: relative;
  83 + top: -0.1em;
  84 + display: inline-block;
  85 + font-size: 0.8em;
  86 + content: '>';
  87 + opacity: 0.8;
  88 + transform: rotate(90deg);
  89 + transition: transform 0.2s;
  90 +}
  91 +
  92 +.CodeMirror-foldgutter-folded::after {
  93 + transform: none;
  94 +}
  95 +
  96 +/* CURSOR */
  97 +
  98 +.CodeMirror-cursor {
  99 + width: 0;
  100 + border-right: none;
  101 + border-left: 1px solid black;
  102 +}
  103 +
  104 +/* Shown when moving in bi-directional text */
  105 +.CodeMirror div.CodeMirror-secondarycursor {
  106 + border-left: 1px solid silver;
  107 +}
  108 +
  109 +.cm-fat-cursor .CodeMirror-cursor {
  110 + width: auto;
  111 + background: #7e7;
  112 + border: 0 !important;
  113 +}
  114 +
  115 +.cm-fat-cursor div.CodeMirror-cursors {
  116 + z-index: 1;
  117 +}
  118 +
  119 +.cm-fat-cursor-mark {
  120 + background-color: rgba(20, 255, 20, 0.5);
  121 + -webkit-animation: blink 1.06s steps(1) infinite;
  122 + -moz-animation: blink 1.06s steps(1) infinite;
  123 + animation: blink 1.06s steps(1) infinite;
  124 +}
  125 +
  126 +.cm-animate-fat-cursor {
  127 + width: auto;
  128 + background-color: #7e7;
  129 + border: 0;
  130 + -webkit-animation: blink 1.06s steps(1) infinite;
  131 + -moz-animation: blink 1.06s steps(1) infinite;
  132 + animation: blink 1.06s steps(1) infinite;
  133 +}
  134 +@-moz-keyframes blink {
  135 + 0% {
  136 + }
  137 +
  138 + 50% {
  139 + background-color: transparent;
  140 + }
  141 +
  142 + 100% {
  143 + }
  144 +}
  145 +@-webkit-keyframes blink {
  146 + 0% {
  147 + }
  148 +
  149 + 50% {
  150 + background-color: transparent;
  151 + }
  152 +
  153 + 100% {
  154 + }
  155 +}
  156 +@keyframes blink {
  157 + 0% {
  158 + }
  159 +
  160 + 50% {
  161 + background-color: transparent;
  162 + }
  163 +
  164 + 100% {
  165 + }
  166 +}
  167 +
  168 +.cm-tab {
  169 + display: inline-block;
  170 + text-decoration: inherit;
  171 +}
  172 +
  173 +.CodeMirror-rulers {
  174 + position: absolute;
  175 + top: -50px;
  176 + right: 0;
  177 + bottom: -20px;
  178 + left: 0;
  179 + overflow: hidden;
  180 +}
  181 +
  182 +.CodeMirror-ruler {
  183 + position: absolute;
  184 + top: 0;
  185 + bottom: 0;
  186 + border-left: 1px solid #ccc;
  187 +}
  188 +
  189 +/* DEFAULT THEME */
  190 +.cm-s-default.CodeMirror {
  191 + background-color: transparent;
  192 +}
  193 +
  194 +.cm-s-default .cm-header {
  195 + color: blue;
  196 +}
  197 +
  198 +.cm-s-default .cm-quote {
  199 + color: #090;
  200 +}
  201 +
  202 +.cm-negative {
  203 + color: #d44;
  204 +}
  205 +
  206 +.cm-positive {
  207 + color: #292;
  208 +}
  209 +
  210 +.cm-header,
  211 +.cm-strong {
  212 + font-weight: bold;
  213 +}
  214 +
  215 +.cm-em {
  216 + font-style: italic;
  217 +}
  218 +
  219 +.cm-link {
  220 + text-decoration: underline;
  221 +}
  222 +
  223 +.cm-strikethrough {
  224 + text-decoration: line-through;
  225 +}
  226 +
  227 +.cm-s-default .cm-atom,
  228 +.cm-s-default .cm-def,
  229 +.cm-s-default .cm-property,
  230 +.cm-s-default .cm-variable-2,
  231 +.cm-s-default .cm-variable-3,
  232 +.cm-s-default .cm-punctuation {
  233 + color: var(--base);
  234 +}
  235 +
  236 +.cm-s-default .cm-hr,
  237 +.cm-s-default .cm-comment {
  238 + color: var(--comment);
  239 +}
  240 +
  241 +.cm-s-default .cm-attribute,
  242 +.cm-s-default .cm-keyword {
  243 + color: var(--keyword);
  244 +}
  245 +
  246 +.cm-s-default .cm-variable {
  247 + color: var(--variable);
  248 +}
  249 +
  250 +.cm-s-default .cm-bracket,
  251 +.cm-s-default .cm-tag {
  252 + color: var(--tags);
  253 +}
  254 +
  255 +.cm-s-default .cm-number {
  256 + color: var(--number);
  257 +}
  258 +
  259 +.cm-s-default .cm-string,
  260 +.cm-s-default .cm-string-2 {
  261 + color: var(--string);
  262 +}
  263 +
  264 +.cm-s-default .cm-type {
  265 + color: #085;
  266 +}
  267 +
  268 +.cm-s-default .cm-meta {
  269 + color: #555;
  270 +}
  271 +
  272 +.cm-s-default .cm-qualifier {
  273 + color: var(--qualifier);
  274 +}
  275 +
  276 +.cm-s-default .cm-builtin {
  277 + color: #7539ff;
  278 +}
  279 +
  280 +.cm-s-default .cm-link {
  281 + color: var(--flash);
  282 +}
  283 +
  284 +.cm-s-default .cm-error {
  285 + color: #ff008c;
  286 +}
  287 +
  288 +.cm-invalidchar {
  289 + color: #ff008c;
  290 +}
  291 +
  292 +.CodeMirror-composing {
  293 + border-bottom: 2px solid;
  294 +}
  295 +
  296 +/* Default styles for common addons */
  297 +
  298 +div.CodeMirror span.CodeMirror-matchingbracket {
  299 + color: #0b0;
  300 +}
  301 +
  302 +div.CodeMirror span.CodeMirror-nonmatchingbracket {
  303 + color: #a22;
  304 +}
  305 +
  306 +.CodeMirror-matchingtag {
  307 + background: rgba(255, 150, 0, 0.3);
  308 +}
  309 +
  310 +.CodeMirror-activeline-background {
  311 + background: #e8f2ff;
  312 +}
  313 +
  314 +/* STOP */
  315 +
  316 +/* The rest of this file contains styles related to the mechanics of
  317 + the editor. You probably shouldn't touch them. */
  318 +
  319 +.CodeMirror {
  320 + position: relative;
  321 + overflow: hidden;
  322 + background: white;
  323 +}
  324 +
  325 +.CodeMirror-scroll {
  326 + position: relative;
  327 + height: 100%;
  328 + padding-bottom: 30px;
  329 + margin-right: -30px;
  330 +
  331 + /* 30px is the magic margin used to hide the element's real scrollbars */
  332 +
  333 + /* See overflow: hidden in .CodeMirror */
  334 + margin-bottom: -30px;
  335 + overflow: scroll !important; /* Things will break if this is overridden */
  336 + outline: none; /* Prevent dragging from highlighting the element */
  337 +}
  338 +
  339 +.CodeMirror-sizer {
  340 + position: relative;
  341 + border-right: 30px solid transparent;
  342 +}
  343 +
  344 +/* The fake, visible scrollbars. Used to force redraw during scrolling
  345 + before actual scrolling happens, thus preventing shaking and
  346 + flickering artifacts. */
  347 +.CodeMirror-vscrollbar,
  348 +.CodeMirror-hscrollbar,
  349 +.CodeMirror-scrollbar-filler,
  350 +.CodeMirror-gutter-filler {
  351 + position: absolute;
  352 + z-index: 6;
  353 + display: none;
  354 +}
  355 +
  356 +.CodeMirror-vscrollbar {
  357 + top: 0;
  358 + right: 0;
  359 + overflow-x: hidden;
  360 + overflow-y: scroll;
  361 +}
  362 +
  363 +.CodeMirror-hscrollbar {
  364 + bottom: 0;
  365 + left: 0;
  366 + overflow-x: scroll;
  367 + overflow-y: hidden;
  368 +}
  369 +
  370 +.CodeMirror-scrollbar-filler {
  371 + right: 0;
  372 + bottom: 0;
  373 +}
  374 +
  375 +.CodeMirror-gutter-filler {
  376 + bottom: 0;
  377 + left: 0;
  378 +}
  379 +
  380 +.CodeMirror-gutters {
  381 + position: absolute;
  382 + top: 0;
  383 + left: 0;
  384 + z-index: 3;
  385 + min-height: 100%;
  386 +}
  387 +
  388 +.CodeMirror-gutter {
  389 + display: inline-block;
  390 + height: 100%;
  391 + margin-bottom: -30px;
  392 + white-space: normal;
  393 + vertical-align: top;
  394 +}
  395 +
  396 +.CodeMirror-gutter-wrapper {
  397 + position: absolute;
  398 + z-index: 4;
  399 + background: none !important;
  400 + border: none !important;
  401 +}
  402 +
  403 +.CodeMirror-gutter-background {
  404 + position: absolute;
  405 + top: 0;
  406 + bottom: 0;
  407 + z-index: 4;
  408 +}
  409 +
  410 +.CodeMirror-gutter-elt {
  411 + position: absolute;
  412 + z-index: 4;
  413 + cursor: default;
  414 +}
  415 +
  416 +.CodeMirror-gutter-wrapper ::selection {
  417 + background-color: transparent;
  418 +}
  419 +
  420 +.CodeMirror-gutter-wrapper ::-moz-selection {
  421 + background-color: transparent;
  422 +}
  423 +
  424 +.CodeMirror-lines {
  425 + min-height: 1px; /* prevents collapsing before first draw */
  426 + cursor: text;
  427 +}
  428 +
  429 +.CodeMirror pre {
  430 + position: relative;
  431 + z-index: 2;
  432 + margin: 0;
  433 + overflow: visible;
  434 + font-family: inherit;
  435 + font-size: inherit;
  436 + line-height: inherit;
  437 + color: inherit;
  438 + word-wrap: normal;
  439 + white-space: pre;
  440 + background: transparent;
  441 + border-width: 0;
  442 +
  443 + /* Reset some styles that the rest of the page might have set */
  444 + -moz-border-radius: 0;
  445 + -webkit-border-radius: 0;
  446 + border-radius: 0;
  447 + -webkit-tap-highlight-color: transparent;
  448 + -webkit-font-variant-ligatures: contextual;
  449 + font-variant-ligatures: contextual;
  450 +}
  451 +
  452 +.CodeMirror-wrap pre {
  453 + word-break: normal;
  454 + word-wrap: break-word;
  455 + white-space: pre-wrap;
  456 +}
  457 +
  458 +.CodeMirror-linebackground {
  459 + position: absolute;
  460 + top: 0;
  461 + right: 0;
  462 + bottom: 0;
  463 + left: 0;
  464 + z-index: 0;
  465 +}
  466 +
  467 +.CodeMirror-linewidget {
  468 + position: relative;
  469 + z-index: 2;
  470 + padding: 0.1px; /* Force widget margins to stay inside of the container */
  471 +}
  472 +
  473 +.CodeMirror-rtl pre {
  474 + direction: rtl;
  475 +}
  476 +
  477 +.CodeMirror-code {
  478 + outline: none;
  479 +}
  480 +
  481 +/* Force content-box sizing for the elements where we expect it */
  482 +.CodeMirror-scroll,
  483 +.CodeMirror-sizer,
  484 +.CodeMirror-gutter,
  485 +.CodeMirror-gutters,
  486 +.CodeMirror-linenumber {
  487 + -moz-box-sizing: content-box;
  488 + box-sizing: content-box;
  489 +}
  490 +
  491 +.CodeMirror-measure {
  492 + position: absolute;
  493 + width: 100%;
  494 + height: 0;
  495 + overflow: hidden;
  496 + visibility: hidden;
  497 +}
  498 +
  499 +.CodeMirror-cursor {
  500 + position: absolute;
  501 + pointer-events: none;
  502 +}
  503 +
  504 +.CodeMirror-measure pre {
  505 + position: static;
  506 +}
  507 +
  508 +div.CodeMirror-cursors {
  509 + position: relative;
  510 + z-index: 3;
  511 + visibility: hidden;
  512 +}
  513 +
  514 +div.CodeMirror-dragcursors {
  515 + visibility: visible;
  516 +}
  517 +
  518 +.CodeMirror-focused div.CodeMirror-cursors {
  519 + visibility: visible;
  520 +}
  521 +
  522 +.CodeMirror-selected {
  523 + background: #d9d9d9;
  524 +}
  525 +
  526 +.CodeMirror-focused .CodeMirror-selected {
  527 + background: #d7d4f0;
  528 +}
  529 +
  530 +.CodeMirror-crosshair {
  531 + cursor: crosshair;
  532 +}
  533 +
  534 +.CodeMirror-line::selection,
  535 +.CodeMirror-line > span::selection,
  536 +.CodeMirror-line > span > span::selection {
  537 + background: #d7d4f0;
  538 +}
  539 +
  540 +.CodeMirror-line::-moz-selection,
  541 +.CodeMirror-line > span::-moz-selection,
  542 +.CodeMirror-line > span > span::-moz-selection {
  543 + background: #d7d4f0;
  544 +}
  545 +
  546 +.cm-searching {
  547 + background-color: #ffa;
  548 + background-color: rgba(255, 255, 0, 0.4);
  549 +}
  550 +
  551 +/* Used to force a border model for a node */
  552 +.cm-force-border {
  553 + padding-right: 0.1px;
  554 +}
  555 +
  556 +@media print {
  557 + /* Hide the cursor when printing */
  558 + .CodeMirror div.CodeMirror-cursors {
  559 + visibility: hidden;
  560 + }
  561 +}
  562 +
  563 +/* See issue #2901 */
  564 +.cm-tab-wrap-hack::after {
  565 + content: '';
  566 +}
  567 +
  568 +/* Help users use markselection to safely style text background */
  569 +span.CodeMirror-selectedtext {
  570 + background: none;
  571 +}
src/components/FlowChart/index.ts
1 -import { App } from 'vue'; 1 +import type { App } from 'vue';
2 import dataDialog from './src/DataDialog.vue'; 2 import dataDialog from './src/DataDialog.vue';
3 import flowChart from './src/index.vue'; 3 import flowChart from './src/index.vue';
4 4
src/components/FlowChart/src/index.css 0 → 100644
  1 +.lf-control {
  2 + position: absolute;
  3 + top: 0;
  4 + right: 10px;
  5 + display: flex;
  6 + padding: 0 15px;
  7 + margin: 5px;
  8 + background: rgba(255, 255, 255, 0.8);
  9 + border-radius: 5px;
  10 + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
  11 + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
  12 +}
  13 +
  14 +.lf-control-item {
  15 + display: flex;
  16 + padding: 5px 10px;
  17 + cursor: pointer;
  18 + flex-direction: column;
  19 + align-items: center;
  20 + justify-content: center;
  21 +}
  22 +
  23 +.lf-control-item:hover {
  24 + background: #efefef;
  25 +}
  26 +
  27 +.lf-control-item.disabled {
  28 + cursor: not-allowed;
  29 + filter: opacity(0.6);
  30 +}
  31 +
  32 +.lf-control-item.disabled:hover {
  33 + background: #fff;
  34 +}
  35 +
  36 +.lf-control-item.disabled i {
  37 + pointer-events: none;
  38 +}
  39 +
  40 +.lf-control-item i {
  41 + display: inline-block;
  42 + width: 20px;
  43 + height: 20px;
  44 + vertical-align: middle;
  45 + background-size: cover;
  46 +}
  47 +
  48 +.lf-control-text {
  49 + margin-top: 5px;
  50 + font-size: 12px;
  51 +}
  52 +
  53 +.lf-control-zoomOut {
  54 + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAFMElEQVR4Xu3dsQ3CQBBFQei/KEoDXQG2xAv9h3yDnb0nh7xffgQIXAq82RAgcC0gEK+DwI2AQDwPAgLxBgg0AV+Q5mZqREAgI4e2ZhMQSHMzNSIgkJFDW7MJCKS5mRoREMjIoa3ZBATS3EyNCAhk5NDWbAICaW6mRgQEMnJoazYBgTQ3UyMCAhk5tDWbgECam6kRAYGMHNqaTUAgzc3UiIBARg5tzSYgkOZmakRAICOHtmYTEEhzMzUiIJCRQ1uzCQikuZkaERDIyKGt2QQE0txMjQgIZOTQ1mwCAmlupkYEBDJyaGs2AYE0N1MjAgIZObQ1m4BAmpupEQGBjBzamk1AIM3N1IiAQEYObc0mIJDmZmpEQCAjh7ZmExBIczM1IiCQkUNbswkIpLmZGhEQyMihrdkEBNLcTI0ICGTk0NZsAgJpbqZGBAQycmhrNgGBNDdTIwICGTm0NZuAQJqbqREBgYwc2ppNQCDNzdSIgEBGDm3NJiCQ5mZqREAgI4e2ZhMQSHMzNSIgkJFDW7MJCKS5mRoREMjIoa3ZBATS3EyNCAhk5NDWbAICaW6mRgQEMnJoazYBgTQ3UyMCAhk5tDWbgECam6kRAYGMHNqaTUAgzc3UiIBARg5tzSYgkOZmakRAICOHtmYTEEhzMzUiIJCRQ1uzCQikuZkaERDIyKGt2QQE0txMjQgIZOTQ1mwCAmlupkYEBDJyaGs2AYE0N1MjAgIZObQ1m4BAmpupEQGBjBzamk3gBPJpo6YIPF/gBPJ9/po2JNAEBNLcTI0ICGTk0NZsAgJpbqZGBAQycmhrNgGBNDdTIwICGTm0NZuAQJqbqREBgYwc2ppNQCDNzdSIgEBGDm3NJiCQ5mZqREAgI4e2ZhMQSHMzNSIgkJFDW7MJCKS5mRoREMjIoa3ZBATS3EyNCAhk5NDWbAICaW6mRgQEMnJoazYBgTQ3UyMCAhk5tDWbgECam6kRAYGMHNqaTUAgzc3UiIBARg5tzSYgkOZmakRAICOHtmYTEEhzMzUiIJCRQ1uzCQikuZkaETiB+AOdkWNb83+BE4gfAQIXAgLxNAjcCAjE8yAgEG+AQBPwBWlupkYEBDJyaGs2AYE0N1MjAgIZObQ1m4BAmpupEQGBjBzamk1AIM3N1IiAQEYObc0mIJDmZmpEQCAjh7ZmExBIczM1IiCQkUNbswkIpLmZGhEQyMihrdkEBNLcTI0ICGTk0NZsAgJpbqZGBAQycmhrNgGBNDdTIwICGTm0NZuAQJqbqREBgYwc2ppNQCDNzdSIgEBGDm3NJiCQ5mZqREAgI4e2ZhMQSHMzNSIgkJFDW7MJCKS5mRoREMjIoa3ZBATS3EyNCAhk5NDWbAICaW6mRgQEMnJoazYBgTQ3UyMCAhk5tDWbgECam6kRAYGMHNqaTUAgzc3UiIBARg5tzSYgkOZmakRAICOHtmYTEEhzMzUiIJCRQ1uzCQikuZkaERDIyKGt2QQE0txMjQgIZOTQ1mwCAmlupkYEBDJyaGs2AYE0N1MjAgIZObQ1m4BAmpupEQGBjBzamk1AIM3N1IiAQEYObc0mIJDmZmpEQCAjh7ZmExBIczM1IiCQkUNbswkIpLmZGhEQyMihrdkEBNLcTI0ICGTk0NZsAgJpbqZGBAQycmhrNgGBNDdTIwICGTm0NZuAQJqbqREBgYwc2ppNQCDNzdSIgEBGDm3NJiCQ5mZqREAgI4e2ZhMQSHMzNSIgkJFDW7MJCKS5mRoREMjIoa3ZBATS3EyNCPwAiAUiJ9hUCCUAAAAASUVORK5CYII=);
  55 +}
  56 +
  57 +.lf-control-zoomIn {
  58 + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAGr0lEQVR4Xu3dsW3cABQEUaoIN+F6DDfpJlSFm1ARMi53JAywwse7nHP8s5iYb49faeDP8zy/SuAXWK93+P2F5zzyHwNvrKQGBJLq3MME0m4gkNbnnCaQdgKBtD7nNIG0Ewik9TmnCaSdQCCtzzlNIO0EAml9zmkCaScQSOtzThNIO4FAWp9zmkDaCQTS+pzTBNJOIJDW55wmkHYCgbQ+5zSBtBMIpPU5pwmknUAgrc85TSDtBAJpfc5pAmknEEjrc04TSDuBQFqfc5pA2gkE0vqc0wTSTiCQ1uecJpB2AoG0Puc0gbQTCKT1OacJpJ1AIK3POU0g7QQCaX3OaQJpJxBI63NOE0g7gUBan3OaQNoJBNL6nNME0k4gkNbnnCaQdgKBtD7nNIG0Ewik9TmnCaSdQCCtzzlNIO0EAml9zmkCaScQSOtzThNIO4FAWp9zmkDaCQTS+pzTBNJOIJDW55wmkHYCgbQ+5zSBtBMIpPU5pwmknUAgrc85TSDtBAJpfc5pAmknEEjrc04TSDuBQFqfc5pA2gkE0vqc0wTSTiCQ1uecJpB2AoG0Puc0gbQTCKT1OacJpJ1AIK3POU0g7QQCaX3OaQJpJxBI63NOE0g7gUBan3OaQNoJBNL6nNME0k4gkNbnnCaQdgKBtD7nNIG0Ewik9TmnCaSdQCCtzzlNIO0EAml9zmkCaScQSOtzThNIO4FAWp9zmkDaCQTS+pzTBNJOIJDW55wmkHYCgbQ+5zSBtBMIpPU5pwmknUAgrc85TSDtBAJpfc5pAmknEEjrc04TSDuBQFqfc5pA2gkE0vqc0wTSTiCQ1uecJpB2AoG0Puc0gbQTCKT1OacJpJ1AIK3POU0g7QQCaX3OaQJpJxBI63NOE0g7gUBan3OaQNoJBNL6nNME0k4gkNbnnCaQdgKBtD7nNIG0Ewik9TmnCaSdQCCtzzlNIO0EAml9zmkCaScQSOtzThNIO4FAWp9zmkDaCQTS+pzTBNJOIJDW55z2CuR9/hZ3XuDn8zw/xud8PM/zd/wOZ/7+FcjnmWscwkBsQCCxULhbBgRya0/XxAYEEguFu2VAILf2dE1sQCCxULhbBgRya0/XxAYEEguFu2VAILf2dE1sQCCxULhbBgRya0/XxAYEEguFu2VAILf2dE1sQCCxULhbBgRya0/XxAYEEguFu2VAILf2dE1sQCCxULhbBgRya0/XxAYEEguFu2VAILf2dE1sQCCxULhbBgRya0/XxAYEEguFu2VAILf2dE1sQCCxULhbBgRya0/XxAYEEguFu2VAILf2dE1sQCCxULhbBgRya0/XxAYEEguFu2XgFYgP6HSb+oBO5/JbkF6B+HUGfIKtc/ktSAJpZxBI63NOE0g7gUBan3OaQNoJBNL6nNME0k4gkNbnnCaQdgKBtD7nNIG0Ewik9TmnCaSdQCCtzzlNIO0EAml9zmkCaScQSOtzThNIO4FAWp9zmkDaCQTS+pzTBNJOIJDW55wmkHYCgbQ+5zSBtBMIpPU5pwmknUAgrc85TSDtBAJpfc5pAmknEEjrc04TSDuBQFqfc5pA2gkE0vqc0wTSTiCQ1uecJpB2AoG0Puc0gbQTCKT1OacJpJ1AIK3POU0g7QQCaX3OaQJpJxBI63NOE0g7gUBan3OaQNoJBNL6nNME0k4gkNbnnCaQdgKBtD7nNIG0Ewik9TmnCaSdQCCtzzlNIO0EAml9zmkCaScQSOtzThNIO4FAWp9zmkDaCQTS+pzTBNJOIJDW55wmkHYCgbQ+5zSBtBMIpPU5pwmknUAgrc85TSDtBAJpfc5pAmknEEjrc04TSDuBQFqfc5pA2gkE0vqc0wTSTiCQ1uecJpB2AoG0Puc0gbQTCKT1OacJpJ1AIK3POU0g7QQCaX3OaQJpJxBI63NOE0g7gUBan3OaQNoJBNL6nNME0k4gkNbnnCaQdgKBtD7nNIG0Ewik9TmnCaSdQCCtzzlNIO0EAml9zmkCaScQSOtzThNIO4FAWp9zmkDaCQTS+pzTBNJOIJDW55wmkHYCgbQ+5zSBtBMIpPU5pwmknUAgrc85TSDtBAJpfc5pAmknEEjrc04TSDuBQFqfc5pA2gkE0vqc0wTSTiCQ1uecJpB2AoG0Puc0gbQTCKT1OacJpJ1AIK3POU0g7QQCaX3OaQJpJxBI63NOE0g7gUBan3OaQNoJBNL6nNME0k4gkNbnnCaQdgKBtD7nNIG0Ewik9TmnCaSdQCCtzzlNIO0EAml9zmkCaScQSOtzThNIO4FAWp9z2j95TXI4rwKcnQAAAABJRU5ErkJggg==);
  59 +}
  60 +
  61 +.lf-control-fit {
  62 + background-image: url(data:image/png;base64,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);
  63 +}
  64 +
  65 +.lf-control-undo {
  66 + background-image: url(data:image/png;base64,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);
  67 +}
  68 +
  69 +.lf-control-redo {
  70 + background-image: url(data:image/png;base64,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);
  71 +}
  72 +
  73 +/* menu */
  74 +.lf-menu {
  75 + position: absolute;
  76 + display: none;
  77 + width: 200px;
  78 + padding: 10px 0;
  79 + margin: 0 0 0 10px;
  80 + background: #fff;
  81 + border: 1px solid #efefee;
  82 + border-radius: 3px;
  83 +}
  84 +
  85 +.lf-menu > li {
  86 + position: relative;
  87 + padding: 3px 12px;
  88 + font-size: 12px;
  89 + line-height: 18px;
  90 + list-style: none;
  91 + cursor: pointer;
  92 + transition: all 120ms ease-in-out;
  93 +}
  94 +
  95 +.lf-menu-item__disabled {
  96 + color: #aaa;
  97 + pointer-events: none;
  98 + cursor: default;
  99 + opacity: 0.88;
  100 +}
  101 +
  102 +.lf-menu-item:hover {
  103 + background: #f3f3f3;
  104 +}
  105 +
  106 +/* dnd */
  107 +.lf-dnd {
  108 + position: absolute;
  109 + padding: 15px 5px;
  110 + margin: 5px;
  111 + background: rgba(255, 255, 255, 0.8);
  112 + border-radius: 5px;
  113 + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
  114 +}
  115 +
  116 +.lf-dnd-item {
  117 + margin-top: 5px;
  118 + font-size: 14px;
  119 + text-align: center;
  120 +}
  121 +
  122 +.lf-dnd-item:first-child {
  123 + margin-top: 0;
  124 +}
  125 +
  126 +.lf-dnd-item div {
  127 + width: 40px;
  128 + height: 40px;
  129 +}
  130 +
  131 +.lf-dnd-item div:hover {
  132 + cursor: grab;
  133 +}
  134 +
  135 +.lf-dnd-circle {
  136 + background: url('data:image/png;base64,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')
  137 + center center no-repeat;
  138 +}
  139 +
  140 +.lf-dnd-rect {
  141 + background: url('data:image/png;base64,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')
  142 + center center no-repeat;
  143 +}
  144 +
  145 +.lf-dnd-polygon {
  146 + background: url('data:image/png;base64,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')
  147 + center center no-repeat;
  148 +}
  149 +
  150 +.lf-dnd-triangle {
  151 + background: url('data:image/png;base64,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')
  152 + center center no-repeat;
  153 +}
  154 +
  155 +.lf-dnd-hexagon {
  156 + background: url('data:image/png;base64,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')
  157 + center center no-repeat;
  158 +}
  159 +
  160 +.lf-dnd-star {
  161 + background: url('data:image/png;base64,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')
  162 + center center no-repeat;
  163 +}
  164 +
  165 +.lf-selection-select {
  166 + position: absolute;
  167 + border: 2px dashed darkorange;
  168 +}
  169 +
  170 +.lf-mini-map {
  171 + position: absolute;
  172 + padding-top: 20px;
  173 + overflow: hidden;
  174 + background: rgba(255, 255, 255, 1);
  175 + border: 1px solid #93a3b4;
  176 +}
  177 +
  178 +.lf-mini-map-graph {
  179 + position: relative;
  180 + overflow: hidden;
  181 +}
  182 +
  183 +.lf-minimap-viewport {
  184 + position: absolute;
  185 + top: 0;
  186 + left: 0;
  187 + cursor: grab;
  188 + border: 2px solid rgb(24, 125, 255);
  189 +}
  190 +
  191 +.lf-mini-map-header {
  192 + position: absolute;
  193 + top: 0;
  194 + right: 0;
  195 + left: 0;
  196 + height: 18px;
  197 + padding: 0 10px;
  198 + line-height: 18px;
  199 + text-shadow: 0 1px 0 rgb(255 255 255 / 33%);
  200 + background-color: #a6a6a6;
  201 + background-image: linear-gradient(to top, #b2b2b2, #9b9b9b);
  202 + border: 1px solid #999;
  203 + border-top: #bfbfbf solid 1px;
  204 + border-bottom: #666 solid 1px;
  205 +}
  206 +
  207 +.lf-mini-map-close {
  208 + position: absolute;
  209 + top: 0;
  210 + right: 2px;
  211 + width: 18px;
  212 + height: 18px;
  213 + cursor: pointer;
  214 + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACL0lEQVRoQ+1YT2vUQBT/vS+Smc3u0ZtfwA+hUKEttIIVbMEWrGAL3UItqKCCCipooS3Ynu29ePfqLcnO5Nov0NsrWbc0myxtJpNmGZw9LZk37/3+vCTzQnD8R47jhycwbQe9A94BSwV8C1kKaL3dO2AtoWWC/8+BMJB9ItwHcM6MX0mqtm1EzOU7Y8bvJFV9k3zGDnSFPAVw76oIb8ZavzIpehnbE+Ilg/J7/8Za3THJVYfAHwB3x4owXsSpemNSuCs6zwEu7rl9AmEgt4hQspkIa5FS76uQCKV8RoxSLDP6pi1p7EAGsCvEBkA7ZbC0EuvBp+tI9IR4yqBSDIE3Iq13qwiQj6lFYEgikOsgvC4VJDyJlfo6CUg3kI9BmLBG67EevDUFn8XXJpBt7km5yox3xcIMfpRo/SN/PZRygRhj17J1JqwmSn2oA96awL926iwD/LEIgJjmo3RwMCQadGaZePh/3H5ejrT+XBd8IwSGJKRcAuPLhHZ6mIkMxlFpjbEUp+qbDfjGCGSJQiEWCfS9CiAmLCZK7VWJvSnG6h4oJu8FnTkm3r+uKDHNReng8CZgVdcbJTBqpxkwfk4EQJiJlTquCq5KnCeQV8npFnL6Jnb6Mer0i8zpo4TThzmnj9OjGXardDBrZqDZbmMmdnukdH6oL3xWOTG1vNh6oxn7AYB2PqtUOWC1GdP4Ya5N8I0ONG0Dv6znHZiW8t6BaSvvHfAONKSAf4w2JGTtNBey0xBAkjSEzwAAAABJRU5ErkJggg==');
  215 + background-size: contain;
  216 +}
src/components/FlowChart/src/index.vue
@@ -19,7 +19,7 @@ @@ -19,7 +19,7 @@
19 import { toLogicFlowData } from './adpterForTurbo'; 19 import { toLogicFlowData } from './adpterForTurbo';
20 20
21 import '@logicflow/core/dist/style/index.css'; 21 import '@logicflow/core/dist/style/index.css';
22 - import '@logicflow/extension/lib/style/index.css'; 22 + import './index.css';
23 export default defineComponent({ 23 export default defineComponent({
24 name: 'FlowChart', 24 name: 'FlowChart',
25 components: { FlowChartToolbar }, 25 components: { FlowChartToolbar },
src/components/Tinymce/src/Editor.vue
@@ -12,6 +12,40 @@ @@ -12,6 +12,40 @@
12 </template> 12 </template>
13 13
14 <script lang="ts"> 14 <script lang="ts">
  15 + import tinymce from 'tinymce/tinymce';
  16 + import 'tinymce/themes/silver';
  17 +
  18 + import 'tinymce/icons/default/icons';
  19 + import 'tinymce/plugins/advlist';
  20 + import 'tinymce/plugins/anchor';
  21 + import 'tinymce/plugins/autolink';
  22 + import 'tinymce/plugins/autosave';
  23 + import 'tinymce/plugins/code';
  24 + import 'tinymce/plugins/codesample';
  25 + import 'tinymce/plugins/directionality';
  26 + import 'tinymce/plugins/fullscreen';
  27 + import 'tinymce/plugins/hr';
  28 + import 'tinymce/plugins/insertdatetime';
  29 + import 'tinymce/plugins/link';
  30 + import 'tinymce/plugins/lists';
  31 + import 'tinymce/plugins/media';
  32 + import 'tinymce/plugins/nonbreaking';
  33 + import 'tinymce/plugins/noneditable';
  34 + import 'tinymce/plugins/pagebreak';
  35 + import 'tinymce/plugins/paste';
  36 + import 'tinymce/plugins/preview';
  37 + import 'tinymce/plugins/print';
  38 + import 'tinymce/plugins/save';
  39 + import 'tinymce/plugins/searchreplace';
  40 + import 'tinymce/plugins/spellchecker';
  41 + import 'tinymce/plugins/tabfocus';
  42 + // import 'tinymce/plugins/table';
  43 + import 'tinymce/plugins/template';
  44 + import 'tinymce/plugins/textpattern';
  45 + import 'tinymce/plugins/visualblocks';
  46 + import 'tinymce/plugins/visualchars';
  47 + import 'tinymce/plugins/wordcount';
  48 +
15 import { 49 import {
16 defineComponent, 50 defineComponent,
17 computed, 51 computed,
@@ -25,7 +59,7 @@ @@ -25,7 +59,7 @@
25 59
26 import ImgUpload from './ImgUpload.vue'; 60 import ImgUpload from './ImgUpload.vue';
27 61
28 - import { tinymce, toolbar, plugins } from './tinymce'; 62 + import { toolbar, plugins } from './tinymce';
29 63
30 import { buildShortUUID } from '/@/utils/uuid'; 64 import { buildShortUUID } from '/@/utils/uuid';
31 import { bindHandlers } from './helper'; 65 import { bindHandlers } from './helper';
src/components/Tinymce/src/tinymce.ts
1 -import tinymce from 'tinymce/tinymce';  
2 -import 'tinymce/themes/silver';  
3 -  
4 -import 'tinymce/icons/default/icons';  
5 -import 'tinymce/plugins/advlist';  
6 -import 'tinymce/plugins/anchor';  
7 -import 'tinymce/plugins/autolink';  
8 -import 'tinymce/plugins/autosave';  
9 -import 'tinymce/plugins/code';  
10 -import 'tinymce/plugins/codesample';  
11 -import 'tinymce/plugins/directionality';  
12 -import 'tinymce/plugins/fullscreen';  
13 -import 'tinymce/plugins/hr';  
14 -import 'tinymce/plugins/insertdatetime';  
15 -import 'tinymce/plugins/link';  
16 -import 'tinymce/plugins/lists';  
17 -import 'tinymce/plugins/media';  
18 -import 'tinymce/plugins/nonbreaking';  
19 -import 'tinymce/plugins/noneditable';  
20 -import 'tinymce/plugins/pagebreak';  
21 -import 'tinymce/plugins/paste';  
22 -import 'tinymce/plugins/preview';  
23 -import 'tinymce/plugins/print';  
24 -import 'tinymce/plugins/save';  
25 -import 'tinymce/plugins/searchreplace';  
26 -import 'tinymce/plugins/spellchecker';  
27 -import 'tinymce/plugins/tabfocus';  
28 -// import 'tinymce/plugins/table';  
29 -import 'tinymce/plugins/template';  
30 -import 'tinymce/plugins/textpattern';  
31 -import 'tinymce/plugins/visualblocks';  
32 -import 'tinymce/plugins/visualchars';  
33 -import 'tinymce/plugins/wordcount';  
34 -  
35 // Any plugins you want to setting has to be imported 1 // Any plugins you want to setting has to be imported
36 // Detail plugins list see https://www.tinymce.com/docs/plugins/ 2 // Detail plugins list see https://www.tinymce.com/docs/plugins/
37 // Custom builds see https://www.tinymce.com/download/custom-builds/ 3 // Custom builds see https://www.tinymce.com/download/custom-builds/
@@ -45,5 +11,3 @@ export const toolbar = [ @@ -45,5 +11,3 @@ export const toolbar = [
45 'fontsizeselect lineheight searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indent blockquote undo redo removeformat subscript superscript code codesample', 11 'fontsizeselect lineheight searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indent blockquote undo redo removeformat subscript superscript code codesample',
46 'hr bullist numlist link preview anchor pagebreak insertdatetime media forecolor backcolor fullscreen', 12 'hr bullist numlist link preview anchor pagebreak insertdatetime media forecolor backcolor fullscreen',
47 ]; 13 ];
48 -  
49 -export { tinymce };  
src/locales/lang/en/routes/demo/editor.ts
1 export default { 1 export default {
2 editor: 'Editor', 2 editor: 'Editor',
  3 + jsonEditor: 'Json editor',
3 markdown: 'Markdown editor', 4 markdown: 'Markdown editor',
4 5
5 tinymce: 'Rich text', 6 tinymce: 'Rich text',
src/locales/lang/zh_CN/routes/demo/editor.ts
1 export default { 1 export default {
2 editor: '编辑器', 2 editor: '编辑器',
  3 + jsonEditor: 'Json编辑器',
3 markdown: 'markdown编辑器', 4 markdown: 'markdown编辑器',
4 5
5 tinymce: '富文本', 6 tinymce: '富文本',
src/router/menus/modules/demo/comp.ts
@@ -6,7 +6,9 @@ const menu: MenuModule = { @@ -6,7 +6,9 @@ const menu: MenuModule = {
6 menu: { 6 menu: {
7 name: t('routes.demo.comp.comp'), 7 name: t('routes.demo.comp.comp'),
8 path: '/comp', 8 path: '/comp',
9 - 9 + tag: {
  10 + dot: true,
  11 + },
10 children: [ 12 children: [
11 { 13 {
12 path: 'basic', 14 path: 'basic',
@@ -181,8 +183,18 @@ const menu: MenuModule = { @@ -181,8 +183,18 @@ const menu: MenuModule = {
181 { 183 {
182 name: t('routes.demo.editor.editor'), 184 name: t('routes.demo.editor.editor'),
183 path: 'editor', 185 path: 'editor',
  186 + tag: {
  187 + dot: true,
  188 + },
184 children: [ 189 children: [
185 { 190 {
  191 + path: 'json',
  192 + name: t('routes.demo.editor.jsonEditor'),
  193 + tag: {
  194 + content: 'new',
  195 + },
  196 + },
  197 + {
186 path: 'markdown', 198 path: 'markdown',
187 name: t('routes.demo.editor.markdown'), 199 name: t('routes.demo.editor.markdown'),
188 children: [ 200 children: [
src/router/routes/modules/demo/comp.ts
@@ -304,6 +304,14 @@ const comp: AppRouteModule = { @@ -304,6 +304,14 @@ const comp: AppRouteModule = {
304 }, 304 },
305 children: [ 305 children: [
306 { 306 {
  307 + path: 'json',
  308 + component: () => import('/@/views/demo/editor/json/index.vue'),
  309 + name: 'JsonEditorDemo',
  310 + meta: {
  311 + title: t('routes.demo.editor.jsonEditor'),
  312 + },
  313 + },
  314 + {
307 path: 'markdown', 315 path: 'markdown',
308 component: getParentLayout('MarkdownDemo'), 316 component: getParentLayout('MarkdownDemo'),
309 name: 'MarkdownDemo', 317 name: 'MarkdownDemo',
src/views/demo/editor/json/index.vue 0 → 100644
  1 +<template>
  2 + <PageWrapper title="代码编辑器组件示例" contentFullHeight fixedHeight contentBackground>
  3 + <template #extra>
  4 + <RadioGroup button-style="solid" v-model:value="modeValue" @change="handleModeChange">
  5 + <RadioButton value="application/json"> json数据 </RadioButton>
  6 + <RadioButton value="htmlmixed"> html代码 </RadioButton>
  7 + <RadioButton value="javascript"> javascript代码 </RadioButton>
  8 + </RadioGroup>
  9 + </template>
  10 + <CodeEditor v-model:value="value" :mode="modeValue" />
  11 + </PageWrapper>
  12 +</template>
  13 +<script lang="ts">
  14 + import { defineComponent, ref } from 'vue';
  15 + import { CodeEditor } from '/@/components/CodeEditor';
  16 + import { PageWrapper } from '/@/components/Page';
  17 + import { Radio } from 'ant-design-vue';
  18 +
  19 + const jsonData =
  20 + '{"name":"BeJson","url":"http://www.xxx.com","page":88,"isNonProfit":true,"address":{"street":"科技园路.","city":"江苏苏州","country":"中国"},"links":[{"name":"Google","url":"http://www.xxx.com"},{"name":"Baidu","url":"http://www.xxx.com"},{"name":"SoSo","url":"http://www.xxx.com"}]}';
  21 +
  22 + const jsData = `
  23 + (() => {
  24 + var htmlRoot = document.getElementById('htmlRoot');
  25 + var theme = window.localStorage.getItem('__APP__DARK__MODE__');
  26 + if (htmlRoot && theme) {
  27 + htmlRoot.setAttribute('data-theme', theme);
  28 + theme = htmlRoot = null;
  29 + }
  30 + })();
  31 + `;
  32 +
  33 + const htmlData = `
  34 + <!DOCTYPE html>
  35 +<html lang="en" id="htmlRoot">
  36 + <head>
  37 + <meta charset="UTF-8" />
  38 + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
  39 + <meta name="renderer" content="webkit" />
  40 + <meta
  41 + name="viewport"
  42 + content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0"
  43 + />
  44 + <title><%= title %></title>
  45 + <link rel="icon" href="/favicon.ico" />
  46 + </head>
  47 + <body>
  48 + <div id="app">
  49 + </div>
  50 + </body>
  51 +</html>
  52 + `;
  53 + export default defineComponent({
  54 + components: { CodeEditor, PageWrapper, RadioButton: Radio.Button, RadioGroup: Radio.Group },
  55 + setup() {
  56 + const modeValue = ref('application/json');
  57 + const value = ref(jsonData);
  58 +
  59 + function handleModeChange(e: ChangeEvent) {
  60 + const mode = e.target.value;
  61 + if (mode === 'application/json') {
  62 + value.value = jsonData;
  63 + return;
  64 + }
  65 + if (mode === 'htmlmixed') {
  66 + value.value = htmlData;
  67 + return;
  68 + }
  69 + if (mode === 'javascript') {
  70 + value.value = jsData;
  71 + return;
  72 + }
  73 + }
  74 +
  75 + return { value, modeValue, handleModeChange };
  76 + },
  77 + });
  78 +</script>
vite.config.ts
@@ -58,6 +58,7 @@ export default ({ command, mode }: ConfigEnv): UserConfig =&gt; { @@ -58,6 +58,7 @@ export default ({ command, mode }: ConfigEnv): UserConfig =&gt; {
58 proxy: createProxy(VITE_PROXY), 58 proxy: createProxy(VITE_PROXY),
59 }, 59 },
60 build: { 60 build: {
  61 + minify: 'esbuild',
61 target: 'es2015', 62 target: 'es2015',
62 outDir: OUTPUT_DIR, 63 outDir: OUTPUT_DIR,
63 terserOptions: { 64 terserOptions: {
yarn.lock
@@ -1301,11 +1301,23 @@ @@ -1301,11 +1301,23 @@
1301 resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.1.1.tgz#3348564048e7a2d7398c935d466c0414ebb6a669" 1301 resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.1.1.tgz#3348564048e7a2d7398c935d466c0414ebb6a669"
1302 integrity sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow== 1302 integrity sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow==
1303 1303
  1304 +"@types/codemirror@^0.0.109":
  1305 + version "0.0.109"
  1306 + resolved "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.109.tgz#89d575ff1c7b462c4c3b8654f8bb38e5622e9036"
  1307 + integrity sha512-cSdiHeeLjvGn649lRTNeYrVCDOgDrtP+bDDSFDd1TF+i0jKGPDRozno2NOJ9lTniso+taiv4kiVS8dgM8Jm5lg==
  1308 + dependencies:
  1309 + "@types/tern" "*"
  1310 +
1304 "@types/crypto-js@^4.0.1": 1311 "@types/crypto-js@^4.0.1":
1305 version "4.0.1" 1312 version "4.0.1"
1306 resolved "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.0.1.tgz#3a4bd24518b0e6c5940da4e2659eeb2ef0806963" 1313 resolved "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.0.1.tgz#3a4bd24518b0e6c5940da4e2659eeb2ef0806963"
1307 integrity sha512-6+OPzqhKX/cx5xh+yO8Cqg3u3alrkhoxhE5ZOdSEv0DOzJ13lwJ6laqGU0Kv6+XDMFmlnGId04LtY22PsFLQUw== 1314 integrity sha512-6+OPzqhKX/cx5xh+yO8Cqg3u3alrkhoxhE5ZOdSEv0DOzJ13lwJ6laqGU0Kv6+XDMFmlnGId04LtY22PsFLQUw==
1308 1315
  1316 +"@types/estree@*":
  1317 + version "0.0.47"
  1318 + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.47.tgz#d7a51db20f0650efec24cd04994f523d93172ed4"
  1319 + integrity sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg==
  1320 +
1309 "@types/estree@0.0.39": 1321 "@types/estree@0.0.39":
1310 version "0.0.39" 1322 version "0.0.39"
1311 resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" 1323 resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
@@ -1477,6 +1489,13 @@ @@ -1477,6 +1489,13 @@
1477 resolved "https://registry.npmjs.org/@types/svgo/-/svgo-1.3.5.tgz#18a0166fbcdfbfc7f17d0491da2ea07ee397d3f9" 1489 resolved "https://registry.npmjs.org/@types/svgo/-/svgo-1.3.5.tgz#18a0166fbcdfbfc7f17d0491da2ea07ee397d3f9"
1478 integrity sha512-y9Pw8IK50OqFRDpdI9Is29KlWiENVW9FDvlTmGHelvTfR2brYFJbsClvulZfeq6YKacFrDsG9a39w0kJZdHLaw== 1490 integrity sha512-y9Pw8IK50OqFRDpdI9Is29KlWiENVW9FDvlTmGHelvTfR2brYFJbsClvulZfeq6YKacFrDsG9a39w0kJZdHLaw==
1479 1491
  1492 +"@types/tern@*":
  1493 + version "0.23.3"
  1494 + resolved "https://registry.npmjs.org/@types/tern/-/tern-0.23.3.tgz#4b54538f04a88c9ff79de1f6f94f575a7f339460"
  1495 + integrity sha512-imDtS4TAoTcXk0g7u4kkWqedB3E4qpjXzCpD2LU5M5NAXHzCDsypyvXSaG7mM8DKYkCRa7tFp4tS/lp/Wo7Q3w==
  1496 + dependencies:
  1497 + "@types/estree" "*"
  1498 +
1480 "@types/through@*": 1499 "@types/through@*":
1481 version "0.0.30" 1500 version "0.0.30"
1482 resolved "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz#e0e42ce77e897bd6aead6f6ea62aeb135b8a3895" 1501 resolved "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz#e0e42ce77e897bd6aead6f6ea62aeb135b8a3895"
@@ -2610,6 +2629,11 @@ coa@^2.0.2: @@ -2610,6 +2629,11 @@ coa@^2.0.2:
2610 chalk "^2.4.1" 2629 chalk "^2.4.1"
2611 q "^1.1.2" 2630 q "^1.1.2"
2612 2631
  2632 +codemirror@^5.60.0:
  2633 + version "5.60.0"
  2634 + resolved "https://registry.npmjs.org/codemirror/-/codemirror-5.60.0.tgz#00a8cfd287d5d8737ceb73987f04aee2fe5860da"
  2635 + integrity sha512-AEL7LhFOlxPlCL8IdTcJDblJm8yrAGib7I+DErJPdZd4l6imx8IMgKK3RblVgBQqz3TZJR4oknQ03bz+uNjBYA==
  2636 +
2613 codepage@~1.14.0: 2637 codepage@~1.14.0:
2614 version "1.14.0" 2638 version "1.14.0"
2615 resolved "https://registry.npmjs.org/codepage/-/codepage-1.14.0.tgz#8cbe25481323559d7d307571b0fff91e7a1d2f99" 2639 resolved "https://registry.npmjs.org/codepage/-/codepage-1.14.0.tgz#8cbe25481323559d7d307571b0fff91e7a1d2f99"
@@ -7729,7 +7753,7 @@ rollup-plugin-visualizer@5.3.4: @@ -7729,7 +7753,7 @@ rollup-plugin-visualizer@5.3.4:
7729 source-map "^0.7.3" 7753 source-map "^0.7.3"
7730 yargs "^16.2.0" 7754 yargs "^16.2.0"
7731 7755
7732 -rollup@^2.25.0, rollup@^2.38.5, rollup@^2.44.0: 7756 +rollup@^2.25.0, rollup@^2.38.5, rollup@^2.44.0, rollup@^2.45.2:
7733 version "2.45.2" 7757 version "2.45.2"
7734 resolved "https://registry.npmjs.org/rollup/-/rollup-2.45.2.tgz#8fb85917c9f35605720e92328f3ccbfba6f78b48" 7758 resolved "https://registry.npmjs.org/rollup/-/rollup-2.45.2.tgz#8fb85917c9f35605720e92328f3ccbfba6f78b48"
7735 integrity sha512-kRRU7wXzFHUzBIv0GfoFFIN3m9oteY4uAsKllIpQDId5cfnkWF2J130l+27dzDju0E6MScKiV0ZM5Bw8m4blYQ== 7759 integrity sha512-kRRU7wXzFHUzBIv0GfoFFIN3m9oteY4uAsKllIpQDId5cfnkWF2J130l+27dzDju0E6MScKiV0ZM5Bw8m4blYQ==