diff --git a/.ls-lint.yml b/.ls-lint.yml index f2a2c0e61612099e81d0e552256d80cd1dba9c07..7d35f89c521e7390ed03b89a52bb4160dac0df84 100644 --- a/.ls-lint.yml +++ b/.ls-lint.yml @@ -136,3 +136,10 @@ ignore: - packages/code-editor/package - packages/code-editor/demos - packages/code-editor/types + # mobile-designer + - packages/mobile-designer/.vscode + - packages/mobile-designer/node_modules + - packages/mobile-designer/e2e + - packages/mobile-designer/dist + - packages/mobile-designer/projects + - packages/mobile-designer/public/assets/monaco-editor diff --git a/lerna.json b/lerna.json index 4b81ee2440bd027da052363fc0b993c3fc8970d2..427532846a9fbe559f002b062b6821b7bc4f7a1a 100644 --- a/lerna.json +++ b/lerna.json @@ -9,7 +9,8 @@ "packages/mobile-ui-vue", "packages/devkit", "packages/designer", - "packages/code-editor" + "packages/code-editor", + "packages/mobile-designer" ], "version": "0.0.0", "useWorkspaces": true, diff --git a/packages/mobile-designer/.gitignore b/packages/mobile-designer/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..fcf2dd5bd2d368d0acfb77fa1852cefb8cccaa92 --- /dev/null +++ b/packages/mobile-designer/.gitignore @@ -0,0 +1,27 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +node_modules_0 +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +public/assets/monaco-editor \ No newline at end of file diff --git a/packages/mobile-designer/.vscode/extensions.json b/packages/mobile-designer/.vscode/extensions.json new file mode 100644 index 0000000000000000000000000000000000000000..a7cea0b0678120a1b590d1b6592c7318039b9179 --- /dev/null +++ b/packages/mobile-designer/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/packages/mobile-designer/CHANGELOG.md b/packages/mobile-designer/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..9e675c7e843b8d14d1110cb776baebdeb01f5e05 --- /dev/null +++ b/packages/mobile-designer/CHANGELOG.md @@ -0,0 +1,8 @@ +# @farris/designer + +## 0.0.1 + +### Patch Changes + +- Updated dependencies + - @farris/ui-vue@1.1.1 diff --git a/packages/mobile-designer/README.md b/packages/mobile-designer/README.md new file mode 100644 index 0000000000000000000000000000000000000000..33895ab2002862766f2df205d5783f14cd0c1d74 --- /dev/null +++ b/packages/mobile-designer/README.md @@ -0,0 +1,5 @@ +# Vue 3 + TypeScript + Vite + +This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` + + diff --git a/packages/mobile-designer/package.json b/packages/mobile-designer/package.json new file mode 100644 index 0000000000000000000000000000000000000000..ee9dd435fbaf66642d40745344f98b6470a17c3d --- /dev/null +++ b/packages/mobile-designer/package.json @@ -0,0 +1,60 @@ +{ + "name": "@farris/mobile-designer", + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite --config ./vite.config.dev.ts", + "build": "vue-tsc --noEmit && vite build --config ./vite.config.dev.ts", + "preview": "vite preview --config ./vite.config.dev.ts", + "build:system": "farris-cli build -c ./farris.config.mjs" + }, + "dependencies": { + "@farris/ui-vue": "workspace:^", + "@farris/mobile-ui-vue": "workspace:^", + "@monaco-editor/loader": "^1.4.0", + "monaco-editor": "^0.52.2", + "vue": "^3.2.37" + }, + "devDependencies": { + "@babel/parser": "^7.19.0", + "@babel/preset-env": "^7.19.0", + "@babel/preset-typescript": "^7.18.0", + "@babel/traverse": "^7.19.0", + "@commitlint/cli": "^19.3.0", + "@commitlint/config-conventional": "^19.2.0", + "@farris/cli": "workspace:^", + "@farris/designer-dragula": "0.0.5", + "@testing-library/vue": "^7.0.0", + "@types/jest": "^26.0.24", + "@types/jsonp": "^0.2.3", + "@types/lodash.debounce": "^4.0.7", + "@typescript-eslint/eslint-plugin": "^7.15.0", + "@typescript-eslint/parser": "^7.15.0", + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.0.1", + "@vue/babel-plugin-jsx": "^1.1.1", + "@vue/compiler-sfc": "^3.2.0", + "@vue/test-utils": "^2.0.0", + "@vuedx/typecheck": "^0.7.5", + "@vuedx/typescript-plugin-vue": "^0.7.5", + "babel-jest": "^29.0.3", + "chalk": "^5.0.0", + "commander": "^9.4.0", + "conventional-changelog-cli": "^2.2.2", + "happy-dom": "^8.9.0", + "inquirer": "^9.1.1", + "jest": "^29.0.0", + "ora": "^6.1.2", + "patch-vue-directive-ssr": "^0.0.1", + "sass": "^1.32.2", + "shelljs": "^0.8.4", + "typescript": "^4.6.4", + "vite": "^4.4.1", + "vite-plugin-dts": "^2.1.0", + "vite-plugin-md": "^0.20.0", + "vite-svg-loader": "^4.0.0", + "vitepress": "1.0.0-alpha.8", + "vitepress-theme-demoblock": "1.4.2", + "vue-tsc": "^1.2.0" + } +} \ No newline at end of file diff --git a/packages/mobile-designer/public/assets/farris-all.css b/packages/mobile-designer/public/assets/farris-all.css new file mode 100644 index 0000000000000000000000000000000000000000..e512574e03f8cb179e822dc9c40bc72d3c269f3d --- /dev/null +++ b/packages/mobile-designer/public/assets/farris-all.css @@ -0,0 +1,2 @@ +/**2025-01-20 09:34:17**/ +@charset "UTF-8";.rtv-container .toolbar button:active,.rtv-container .toolbar button:focus,[tabindex="-1"]:focus{outline:0!important}body,caption{text-align:left}.f-calendar-month-view td,.f-icon::before,progress,sub,sup{vertical-align:baseline}.f-page-header-base>.col,.f-page-header-base>[class*=col-],.f-utils-nogutters>.col,.f-utils-nogutters>[class*=col-]{padding-left:0;padding-right:0}.f-utils-fill-auto{flex-shrink:1;flex-grow:1;flex-basis:0;overflow-x:hidden;overflow-y:auto}.f-cmp-footer-hasgap,.f-page-is-managelist .f-section+.f-section,.f-page-is-managelist .f-struct-wrapper+.f-struct-wrapper>.f-section,.f-section-hasgap{margin:.5rem 0 0}.f-cmp-footer-hasgap::before,.f-page-is-managelist .f-section+.f-section::before,.f-page-is-managelist .f-struct-wrapper+.f-struct-wrapper>.f-section::before,.f-section-hasgap::before{content:"";position:absolute;height:.5rem;background:#EFF2F4;left:0;right:0;top:-.5rem}.f-section-header .f-title,.f-tmpl-for-title-withline{color:var(--f-text-01);display:inline-flex;align-items:center;line-height:1.375rem;position:relative;overflow:hidden;padding:0 0 0 .75rem}article,aside,figcaption,figure,footer,header,hgroup,legend,main,nav,section{display:block}label,output{display:inline-block}.f-section-header .f-title>*,.f-tmpl-for-title-withline>*{margin:0 .625rem 0 0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn,.custom-control-label,dl,ol,ol ol,ol ul,ul,ul ol,ul ul{margin-bottom:0}dd,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem}.rtv-container.rtv-container-week .header-cell>span,dd{margin-left:0}.f-section-header .f-title .f-title-text,.f-tmpl-for-title-withline .f-title-text{font-size:.9375rem;line-height:1.375rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.f-section-header .f-title .f-title-subtitle,.f-tmpl-for-title-withline .f-title-subtitle{font-size:.8125rem;color:var(--f-text-08);line-height:1.375rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.f-section-header .f-title::before,.f-tmpl-for-title-withline::before{content:"";width:.25rem;height:1rem;background:var(--f-theme-03);border-radius:2px;position:absolute;top:50%;left:0;margin-top:-.5rem}dl,h1,h2,h3,h4,h5,h6,ol,p,pre,ul{margin-top:0}:root{--f-theme-01:#0E6DED;--f-theme-02:linear-gradient(135deg, #0E6DED 0%, #1B75EF 100%);--f-theme-03:#2A87FF;--f-theme-04:linear-gradient(135deg, #2A87FF 0%, #328BFF 100%);--f-theme-05:#529DFF;--f-theme-06:linear-gradient(135deg, #529DFF 0%, #559FFF 100%);--f-theme-07:linear-gradient(214deg, #3F65FF 0%, #4D9AFF 100%);--f-theme-08:#6388FF;--f-theme-09:linear-gradient(46deg, #2E77FF 0%, #2A87FF 100%);--f-theme-10:#2A62AB;--f-theme-11:linear-gradient(135deg, #2A87FF 0%, #328BFF 100%);--f-theme-12:linear-gradient(135deg, #2A87FF 0%, #328BFF 100%);--f-theme-13:linear-gradient(135deg, rgba(42, 135, 255, 0.1) 0%, rgba(50, 139, 255, 0.1) 100%);--f-theme-more-02:#2E77FF;--f-aid-01:#95BEF1;--f-aid-02:#DBE9FF;--f-aid-03:#E8F2FF;--f-aid-04:#EFF5FF;--f-aid-05:#CFEDFF;--f-aid-06:#EFF2F4;--f-aid-07:linear-gradient(195deg, #FFFBEB 0%, #EFF8F8 100%);--f-aid-08:#F0F6FF;--f-aid-09:#F7FAFF;--f-aid-10:#95C3FF;--f-ornament-01:linear-gradient(135deg, #FC8249 0%, #FE9539 100%);--f-ornament-02:linear-gradient(135deg, #1FC8DC 0%, #41D2BD 100%);--f-ornament-03:linear-gradient(135deg, #4190FF 0%, #657CFF 100%);--f-ornament-04:linear-gradient(135deg, #8B82FF 0%, #A082FF 100%);--f-ornament-05:linear-gradient(135deg, #4EC87A 0%, #52D389 100%);--f-ornament-01-start:#FC8249;--f-ornament-02-start:#1FC8DC;--f-ornament-03-start:#4190FF;--f-ornament-04-start:#8B82FF;--f-ornament-05-start:#4EC87A;--f-neutral-00:#fff;--f-neutral-00-rgb:255,255,255;--f-neutral-01:#303C53;--f-neutral-02:#AEB5C6;--f-neutral-03:#CCD1DD;--f-neutral-04:#D9DEE7;--f-neutral-05:#DEE4ED;--f-neutral-06:#E6E9F0;--f-neutral-07:#E9ECF3;--f-neutral-08:#E8EBF2;--f-neutral-09:#F1F3F7;--f-neutral-10:#F5F6F9;--f-neutral-11:#F7F8FB;--f-neutral-12:#FFFFFF;--f-neutral-13:#E4E7EF;--f-neutral-14:#FAFAFC;--f-neutral-15:#1F2329;--f-neutral-16:#013364;--f-neutral-17:#031233;--f-neutral-18:rgba(255, 255, 255, 0.7);--f-neutral-19:rgba(255, 255, 255, 0.85);--f-neutral-20:#ffffff;--f-neutral-21:#334052;--f-text-00:#fff;--f-text-01:#000;--f-text-02:#2D2F33;--f-text-03:#424347;--f-text-04:#5A5E66;--f-text-05:#6080AD;--f-text-06:#747B8B;--f-text-07:#848C9A;--f-text-08:#A8ADB8;--f-text-09:#B4BCCC;--f-text-10:#C7CFDD;--f-text-11:#ffffff;--f-text-12:#C7D4EE;--f-text-13:rgba(255, 255, 255, 0.85);--f-semantic-info-01:#4D9AFF;--f-semantic-info-02:#AED1FF;--f-semantic-info-03:#EEF5FF;--f-semantic-info-04:linear-gradient(135deg, #657CFF 0%, #4190FF 100%);--f-semantic-submit-01:#62CBCD;--f-semantic-submit-02:#A7E0E1;--f-semantic-submit-03:#F3FBFB;--f-semantic-submit-04:linear-gradient(135deg, #12BFD3 0%, #41D5B9 100%);--f-semantic-success-01:#6CC77F;--f-semantic-success-02:#B5E3BF;--f-semantic-success-03:#F0FAF4;--f-semantic-success-04:linear-gradient(135deg, #3CA78D 0%, #7BCA8B 100%);--f-semantic-warning-01:#F5A144;--f-semantic-warning-02:#FAD0A1;--f-semantic-warning-03:#FEF5EC;--f-semantic-warning-04:linear-gradient(135deg, #FC8249 0%, #FE9539 100%);--f-semantic-warning-06:#F7B500;--f-semantic-danger-01:#F46160;--f-semantic-danger-02:#F9B0AF;--f-semantic-danger-03:#FDEFEF;--f-semantic-danger-04:linear-gradient(135deg, #E55875 0%, #FF7878 100%)}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:.8125rem;font-weight:400;line-height:1.4286;color:var(--f-text-02);background-color:#fff}.text-monospace,code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}p{margin-bottom:1rem}abbr[data-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{padding:0}dt{font-weight:700}blockquote,figure{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0}sub{bottom:-.25em}sup{top:-.5em}a{color:var(--f-theme-03);text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:var(--f-theme-05);text-decoration:none}a:not([href]):not([tabindex]),a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-size:1em}pre{margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:var(--f-text-08);caption-side:bottom}th{text-align:inherit}label{margin-bottom:.3125rem}button{border-radius:0}button:focus{outline:dotted 1px;outline:-webkit-focus-ring-color auto 5px}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}.display-1,.display-2,.display-3,.display-4{line-height:1.2}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:400;color:inherit}.blockquote,.table,hr{margin-bottom:1rem}.display-1,.display-2,.display-3,.display-4,.lead{font-weight:300}.h1,h1{font-size:1.625rem}.h2,h2{font-size:1.5rem}.h3,h3{font-size:1.375rem}.h4,h4{font-size:1.25rem}.accordion .card .card-header .panel-item-title,.farris-panel .card .card-header .panel-item-title,.h5,h5{font-size:1rem;line-height:1.375rem}.h5,h5{font-size:1rem}.btn-lg,.h6,h6{font-size:.875rem}.lead{font-size:1.015625rem}.display-1{font-size:6rem}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-4{font-size:3.5rem}hr{box-sizing:content-box;height:0;overflow:visible;margin-top:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{font-size:1.015625rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"— "}.clearfix::after,.custom-control-label::after,.custom-control-label::before{content:""}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:var(--f-theme-03)!important}.bg-secondary{background-color:#6c757d!important}.bg-success{background-color:var(--f-semantic-success-01)!important}.bg-info{background-color:var(--f-semantic-info-01)!important}.bg-warning{background-color:var(--f-semantic-warning-01)!important}.bg-danger{background-color:#dc3545!important}.bg-light{background-color:#f8f9fa!important}.bg-dark{background-color:#343a40!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid var(--f-neutral-06)!important}.border-top{border-top:1px solid var(--f-neutral-06)!important}.border-right{border-right:1px solid var(--f-neutral-06)!important}.border-bottom{border-bottom:1px solid var(--f-neutral-06)!important}.border-left{border-left:1px solid var(--f-neutral-06)!important}.border-0{border:0!important}.rounded-right,.rounded-top{border-top-right-radius:6px!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:6px!important}.rounded-left,.rounded-top{border-top-left-radius:6px!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:6px!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:var(--f-theme-03)!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:var(--f-semantic-success-01)!important}.border-info{border-color:var(--f-semantic-info-01)!important}.border-warning{border-color:var(--f-semantic-warning-01)!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:6px!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media (min-width:888px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media (min-width:1690px){.d-el-none{display:none!important}.d-el-inline{display:inline!important}.d-el-inline-block{display:inline-block!important}.d-el-block{display:block!important}.d-el-table{display:table!important}.d-el-table-row{display:table-row!important}.d-el-table-cell{display:table-cell!important}.d-el-flex{display:flex!important}.d-el-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.flex-row{flex-direction:row!important}.f-utils-flex-column,.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.f-button-edit-nowrap .input-group,.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex-grow:1!important;flex-shrink:1!important;flex-basis:auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media (min-width:576px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex-grow:1!important;flex-shrink:1!important;flex-basis:auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media (min-width:768px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex-grow:1!important;flex-shrink:1!important;flex-basis:auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media (min-width:888px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex-grow:1!important;flex-shrink:1!important;flex-basis:auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:888px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.fixed-bottom,.fixed-top{position:fixed;z-index:1030;left:0;right:0}.fixed-top{top:0}.fixed-bottom{bottom:0}@supports (position:sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.f-max-width-auto,.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs .nav-item .nav-link .farris-title-auto{max-width:none!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:888px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex-grow:1!important;flex-shrink:1!important;flex-basis:auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}@media (min-width:1690px){.flex-el-row{flex-direction:row!important}.flex-el-column{flex-direction:column!important}.flex-el-row-reverse{flex-direction:row-reverse!important}.flex-el-column-reverse{flex-direction:column-reverse!important}.flex-el-wrap{flex-wrap:wrap!important}.flex-el-nowrap{flex-wrap:nowrap!important}.flex-el-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-el-fill{flex-grow:1!important;flex-shrink:1!important;flex-basis:auto!important}.flex-el-grow-0{flex-grow:0!important}.flex-el-grow-1{flex-grow:1!important}.flex-el-shrink-0{flex-shrink:0!important}.flex-el-shrink-1{flex-shrink:1!important}.justify-content-el-start{justify-content:flex-start!important}.justify-content-el-end{justify-content:flex-end!important}.justify-content-el-center{justify-content:center!important}.justify-content-el-between{justify-content:space-between!important}.justify-content-el-around{justify-content:space-around!important}.align-items-el-start{align-items:flex-start!important}.align-items-el-end{align-items:flex-end!important}.align-items-el-center{align-items:center!important}.align-items-el-baseline{align-items:baseline!important}.align-items-el-stretch{align-items:stretch!important}.align-content-el-start{align-content:flex-start!important}.align-content-el-end{align-content:flex-end!important}.align-content-el-center{align-content:center!important}.align-content-el-between{align-content:space-between!important}.align-content-el-around{align-content:space-around!important}.align-content-el-stretch{align-content:stretch!important}.align-self-el-auto{align-self:auto!important}.align-self-el-start{align-self:flex-start!important}.align-self-el-end{align-self:flex-end!important}.align-self-el-center{align-self:center!important}.align-self-el-baseline{align-self:baseline!important}.align-self-el-stretch{align-self:stretch!important}.float-el-left{float:left!important}.float-el-right{float:right!important}.float-el-none{float:none!important}.m-el-0{margin:0!important}.mt-el-0,.my-el-0{margin-top:0!important}.mr-el-0,.mx-el-0{margin-right:0!important}.mb-el-0,.my-el-0{margin-bottom:0!important}.ml-el-0,.mx-el-0{margin-left:0!important}.m-el-1{margin:.25rem!important}.mt-el-1,.my-el-1{margin-top:.25rem!important}.mr-el-1,.mx-el-1{margin-right:.25rem!important}.mb-el-1,.my-el-1{margin-bottom:.25rem!important}.ml-el-1,.mx-el-1{margin-left:.25rem!important}.m-el-2{margin:.5rem!important}.mt-el-2,.my-el-2{margin-top:.5rem!important}.mr-el-2,.mx-el-2{margin-right:.5rem!important}.mb-el-2,.my-el-2{margin-bottom:.5rem!important}.ml-el-2,.mx-el-2{margin-left:.5rem!important}.m-el-3{margin:1rem!important}.mt-el-3,.my-el-3{margin-top:1rem!important}.mr-el-3,.mx-el-3{margin-right:1rem!important}.mb-el-3,.my-el-3{margin-bottom:1rem!important}.ml-el-3,.mx-el-3{margin-left:1rem!important}.m-el-4{margin:1.5rem!important}.mt-el-4,.my-el-4{margin-top:1.5rem!important}.mr-el-4,.mx-el-4{margin-right:1.5rem!important}.mb-el-4,.my-el-4{margin-bottom:1.5rem!important}.ml-el-4,.mx-el-4{margin-left:1.5rem!important}.m-el-5{margin:3rem!important}.mt-el-5,.my-el-5{margin-top:3rem!important}.mr-el-5,.mx-el-5{margin-right:3rem!important}.mb-el-5,.my-el-5{margin-bottom:3rem!important}.ml-el-5,.mx-el-5{margin-left:3rem!important}.p-el-0{padding:0!important}.pt-el-0,.py-el-0{padding-top:0!important}.pr-el-0,.px-el-0{padding-right:0!important}.pb-el-0,.py-el-0{padding-bottom:0!important}.pl-el-0,.px-el-0{padding-left:0!important}.p-el-1{padding:.25rem!important}.pt-el-1,.py-el-1{padding-top:.25rem!important}.pr-el-1,.px-el-1{padding-right:.25rem!important}.pb-el-1,.py-el-1{padding-bottom:.25rem!important}.pl-el-1,.px-el-1{padding-left:.25rem!important}.p-el-2{padding:.5rem!important}.pt-el-2,.py-el-2{padding-top:.5rem!important}.pr-el-2,.px-el-2{padding-right:.5rem!important}.pb-el-2,.py-el-2{padding-bottom:.5rem!important}.pl-el-2,.px-el-2{padding-left:.5rem!important}.p-el-3{padding:1rem!important}.pt-el-3,.py-el-3{padding-top:1rem!important}.pr-el-3,.px-el-3{padding-right:1rem!important}.pb-el-3,.py-el-3{padding-bottom:1rem!important}.pl-el-3,.px-el-3{padding-left:1rem!important}.p-el-4{padding:1.5rem!important}.pt-el-4,.py-el-4{padding-top:1.5rem!important}.pr-el-4,.px-el-4{padding-right:1.5rem!important}.pb-el-4,.py-el-4{padding-bottom:1.5rem!important}.pl-el-4,.px-el-4{padding-left:1.5rem!important}.p-el-5{padding:3rem!important}.pt-el-5,.py-el-5{padding-top:3rem!important}.pr-el-5,.px-el-5{padding-right:3rem!important}.pb-el-5,.py-el-5{padding-bottom:3rem!important}.pl-el-5,.px-el-5{padding-left:3rem!important}.m-el-auto{margin:auto!important}.mt-el-auto,.my-el-auto{margin-top:auto!important}.mr-el-auto,.mx-el-auto{margin-right:auto!important}.mb-el-auto,.my-el-auto{margin-bottom:auto!important}.ml-el-auto,.mx-el-auto{margin-left:auto!important}}.f-cmp-pt,.f-cmp-py{padding-top:.875rem!important}.f-cmp-pb,.f-cmp-py{padding-bottom:.875rem!important}.f-cmp-mr,.f-cmp-mx{margin-right:.875rem!important}.f-cmp-ml,.f-cmp-mx{margin-left:.875rem!important}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:888px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:var(--f-theme-03)!important}.text-secondary{color:#6c757d!important}.text-success{color:var(--f-semantic-success-01)!important}.text-warning{color:var(--f-semantic-warning-01)!important}.text-danger{color:#dc3545!important}.text-light{color:#f8f9fa!important}.text-dark{color:#343a40!important}.text-body{color:var(--f-text-02)!important}.text-muted{color:var(--f-text-08)!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}body{background:#f0f3f6}input::-ms-clear{display:none}input::-webkit-contacts-auto-fill-button{visibility:hidden;display:none!important;pointer-events:none;position:absolute;right:0}.f-utils-fill-flex-column,.f-utils-flex-column,.f-utils-flex-row,.f-utils-flex-row-wrap{display:flex!important;overflow:hidden}.h1,h1{line-height:2.125rem}.h2,h2{line-height:2}.h3,h3{line-height:1.875rem}.h4,h4{line-height:1.75rem}.h6,h6{line-height:1.25rem}.text-dark{color:var(--f-text-01)}.text-danger{color:var(--f-semantic-danger-01)!important}.text-info{color:var(--f-theme-05)!important}::-webkit-scrollbar{width:7px;height:7px;background-color:var(--f-neutral-14)}::-webkit-scrollbar-track{border-radius:0;background-color:var(--f-neutral-14);border:none;background-clip:padding-box}::-webkit-scrollbar-thumb{background-color:var(--f-neutral-03);border:none;background-clip:content-box;opacity:.6;border-radius:7px}::-webkit-scrollbar-thumb:hover{background:var(--f-text-06)}.f-cmp-mt{margin-top:.875rem!important}.f-cmp-mb{margin-bottom:.875rem!important}.f-cmp-mx-minus{margin-left:-.875rem!important;margin-right:-.875rem!important}.f-cmp-px{padding-left:.875rem!important;padding-right:.875rem!important}.f-cmp-p{padding:.875rem!important}.f-cmp-gutter{border-bottom:10px solid #EFF2F4}.f-split-border-b{border-bottom:1px solid var(--f-neutral-08)}.f-common-px{padding-left:.875rem;padding-right:.875rem}.f-col-h1,.f-col-h10,.f-col-h11,.f-col-h12,.f-col-h2,.f-col-h3,.f-col-h4,.f-col-h5,.f-col-h6,.f-col-h7,.f-col-h8,.f-col-h9,.f-col-w1,.f-col-w10,.f-col-w11,.f-col-w12,.f-col-w2,.f-col-w3,.f-col-w4,.f-col-w5,.f-col-w6,.f-col-w7,.f-col-w8,.f-col-w9{padding-right:14px;padding-left:14px}.f-common-py{padding-top:.875rem;padding-bottom:.875rem}.f-common-py-form{padding-top:.875rem;padding-bottom:.5rem}.f-utils-absolute-all{top:0;bottom:0;position:absolute;right:0;left:0}.accordion .card .card-header,.f-col-h1,.f-col-h10,.f-col-h11,.f-col-h12,.f-col-h2,.f-col-h3,.f-col-h4,.f-col-h5,.f-col-h6,.f-col-h7,.f-col-h8,.f-col-h9,.f-col-w1,.f-col-w10,.f-col-w11,.f-col-w12,.f-col-w2,.f-col-w3,.f-col-w4,.f-col-w5,.f-col-w6,.f-col-w7,.f-col-w8,.f-col-w9,.farris-panel .card .card-header,.rtv-container .toolbar .btns .btn-group button i.f-icon{position:relative}.f-utils-fill-flex-column{flex-shrink:1;flex-grow:1;flex-basis:0;flex-direction:column!important}.f-utils-flex-row{flex-direction:row!important;flex-wrap:nowrap}.f-utils-flex-row-wrap{flex-direction:row!important;flex-wrap:wrap!important}.f-utils-fill-flex-row,.f-utils-fill-flex-row-wrap{flex-shrink:1;display:flex!important;overflow:hidden}.f-utils-fill-flex-row{flex-grow:1;flex-basis:0;flex-direction:row!important;flex-wrap:nowrap!important}.f-utils-fill-flex-row-wrap{flex-grow:1;flex-basis:0;flex-direction:row!important;flex-wrap:wrap!important}.f-utils-fill{flex-shrink:1;flex-grow:1;flex-basis:0;overflow:hidden}.f-utils-overflow-xhya{overflow-x:hidden!important;overflow-y:auto!important}.f-utils-overflow-xayh{overflow-y:hidden!important;overflow-x:auto!important}.f-utils-overflow-xaya{overflow:auto!important}.f-utils-overflow-hidden{overflow:hidden!important}.f-utils-overflow-auto{overflow:auto!important}.f-utils-hcenter-vcenter{display:flex;align-items:center;justify-content:center}.f-overflow-y-auto{overflow-y:auto!important}.f-overflow-y-hidden{overflow-y:hidden!important}.f-overflow-x-auto{overflow-x:auto!important}.f-overflow-x-hidden{overflow-x:hidden!important}@media (min-width:576px){.f-overflow-sm-y-auto{overflow-y:auto!important}.f-overflow-sm-y-hidden{overflow-y:hidden!important}.f-overflow-sm-x-auto{overflow-x:auto!important}.f-overflow-sm-x-hidden{overflow-x:hidden!important}}@media (min-width:768px){.f-overflow-md-y-auto{overflow-y:auto!important}.f-overflow-md-y-hidden{overflow-y:hidden!important}.f-overflow-md-x-auto{overflow-x:auto!important}.f-overflow-md-x-hidden{overflow-x:hidden!important}}@media (min-width:888px){.f-overflow-lg-y-auto{overflow-y:auto!important}.f-overflow-lg-y-hidden{overflow-y:hidden!important}.f-overflow-lg-x-auto{overflow-x:auto!important}.f-overflow-lg-x-hidden{overflow-x:hidden!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}.f-overflow-xl-y-auto{overflow-y:auto!important}.f-overflow-xl-y-hidden{overflow-y:hidden!important}.f-overflow-xl-x-auto{overflow-x:auto!important}.f-overflow-xl-x-hidden{overflow-x:hidden!important}}@media (min-width:1690px){.text-el-left{text-align:left!important}.text-el-right{text-align:right!important}.text-el-center{text-align:center!important}.f-overflow-el-y-auto{overflow-y:auto!important}.f-overflow-el-y-hidden{overflow-y:hidden!important}.f-overflow-el-x-auto{overflow-x:auto!important}.f-overflow-el-x-hidden{overflow-x:hidden!important}}.farris-overflow-y-auto{overflow-x:hidden!important;overflow-y:auto!important}.farris-overflow-y-hidden{overflow-x:hidden!important;overflow-y:hidden!important}.farris-overflow-hidden{overflow:hidden!important}.f-col-w1{min-height:1px;width:8.3333333333%}.f-col-w2{min-height:1px;width:16.6666666667%}.f-col-w3{min-height:1px;width:25%}.f-col-w4{min-height:1px;width:33.3333333333%}.f-col-w5{min-height:1px;width:41.6666666667%}.f-col-w6{min-height:1px;width:50%}.f-col-w7{min-height:1px;width:58.3333333333%}.f-col-w8{min-height:1px;width:66.6666666667%}.f-col-w9{min-height:1px;width:75%}.f-col-w10{min-height:1px;width:83.3333333333%}.f-col-w11{min-height:1px;width:91.6666666667%}.f-col-w12{min-height:1px;width:100%}.f-col-h1{min-height:1px;height:8.3333333333%}.f-col-h2{min-height:1px;height:16.6666666667%}.f-col-h3{min-height:1px;height:25%}.f-col-h4{min-height:1px;height:33.3333333333%}.f-col-h5{min-height:1px;height:41.6666666667%}.f-col-h6{min-height:1px;height:50%}.f-col-h7{min-height:1px;height:58.3333333333%}.f-col-h8{min-height:1px;height:66.6666666667%}.f-col-h9{min-height:1px;height:75%}.f-col-h10{min-height:1px;height:83.3333333333%}.f-col-h11{min-height:1px;height:91.6666666667%}.f-col-h12{min-height:1px;height:100%}.f-utils-text-break{white-space:normal!important;word-break:break-all!important}.f-text-emphasize{color:var(--f-text-01)!important}.f-text-light{color:var(--f-text-04)!important}.f-text-lighter{color:var(--f-text-08)!important}.f-text-mute{color:var(--f-text-09)!important}.f-text-two-line{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;max-height:2.5rem}.f-min-width-auto{min-width:auto!important}.win11Scroll{overflow:overlay;scroll-behavior:smooth}.win11Scroll::-webkit-scrollbar{width:14px;height:14px;border-radius:7px}.win11Scroll::-webkit-scrollbar-thumb{display:none;background-clip:padding-box;border:6px solid transparent;border-radius:14px}.win11Scroll::-webkit-scrollbar-thumb:hover{border:4px solid transparent}.win11Scroll::-webkit-scrollbar-button:single-button{height:14px}.win11Scroll:hover::-webkit-scrollbar-thumb{display:block}.win11Scroll.show::-webkit-scrollbar-thumb{display:block}.win11Scroll::-webkit-scrollbar-corner{background:rgba(0,0,0,0)}.btn-link,.btn-link:hover{background-color:transparent}.win11Scroll::-webkit-scrollbar-track{background-color:transparent}.win11Scroll.nobtn::-webkit-scrollbar:vertical{background:0 0}.win11Scroll.nobtn::-webkit-scrollbar:horizontal{background:0 0}.win11Scroll.nobtn::-webkit-scrollbar-button:single-button{height:0;width:0}.accordion,.farris-panel{border:1px solid var(--f-neutral-13)}.accordion .card,.farris-panel .card{border-top:0;background:var(--f-neutral-00);border-color:var(--f-neutral-13)}.accordion .card .card-header,.farris-panel .card .card-header{border-width:0;background-color:var(--f-neutral-00);color:var(--f-text-02);padding:.5265rem .875rem}.accordion .card .card-header:hover,.accordion .card.f-state-hover,.farris-panel .card .card-header:hover,.farris-panel .card.f-state-hover{color:var(--f-theme-05);border-color:var(--f-neutral-13);background-color:var(--f-neutral-00)}.accordion .card .card-body,.farris-panel .card .card-body{padding:.9375rem}.accordion .card.f-state-disabled .card-header,.farris-panel .card.f-state-disabled .card-header{color:var(--f-text-07);background-color:var(--f-neutral-00);border-color:var(--f-neutral-02)}.accordion .card.f-state-disabled .f-icon,.farris-panel .card.f-state-disabled .f-icon{display:none}.accordion .card.f-state-disabled .accordion-title,.farris-panel .card.f-state-disabled .accordion-title{color:var(--f-text-07)}.accordion .card.f-state-selected .card-header,.farris-panel .card.f-state-selected .card-header{color:var(--f-theme-01);background-color:var(--f-neutral-00);border-color:var(--f-neutral-13)}.accordion .accordion-title,.farris-panel .accordion-title{color:var(--f-text-02)}.accordion .f-accordion-collapse,.accordion .f-accordion-expand,.farris-panel .f-accordion-collapse,.farris-panel .f-accordion-expand{margin-top:-.3125rem;color:var(--f-neutral-01);font-size:1.25rem;width:1.25rem;height:1.25rem;vertical-align:middle}.accordion .f-accordion-collapse::before,.farris-panel .f-accordion-collapse::before{font-family:FarrisIcons;content:"\e013"}.accordion .f-accordion-expand::before,.f-btn-collapse-expand::after,.farris-panel .f-accordion-expand::before{font-family:FarrisIcons;content:"\e015"}.accordion .card-header,.farris-panel .card-header{cursor:pointer}.accordion .panel-item-title,.farris-panel .panel-item-title{float:left}.accordion .panel-item-tool,.farris-panel .panel-item-tool{float:right}.accordion .panel-item-clear,.farris-panel .panel-item-clear{clear:both}.accordion .f-state-disabled,.farris-panel .f-state-disabled{pointer-events:none}.accordion .card,.farris-panel .card{border-left:0;border-right:0}.accordion .active,.farris-panel .active{height:initial;transition:height .35s ease}.accordion .inactive,.farris-panel .inactive{height:0;overflow:hidden;transition:height .35s ease}.farris-panel .card:not(:first-of-type) .card-header:first-child,.farris-panel .card:not(:first-of-type):not(:last-of-type){border-radius:0}.farris-panel .card:first-of-type{border-bottom-right-radius:0;border-bottom-left-radius:0}.farris-panel .card:last-of-type{border-bottom:0;border-top-left-radius:0;border-top-right-radius:0}.f-cmp-panel-pt-card-subgrid .card,.farris-panel-dividing-line .card{border-width:0}.f-cmp-panel-pt-card-subgrid .card .card-header,.farris-panel-dividing-line .card .card-header{border-width:0 0 1px;background:var(--f-neutral-00);border-color:var(--f-neutral-13)}.f-cmp-panel-pt-card-subgrid .card.f-state-selected .card-header,.farris-panel-dividing-line .card.f-state-selected .card-header{background-color:var(--f-neutral-00);border-color:var(--f-neutral-13);color:var(--f-theme-01)}.accordion .card .card-header .f-icon,.btn-secondary,.farris-panel .card .card-header .f-icon{color:var(--f-text-02)}.f-cmp-panel-pt-card-subgrid{margin:0}.f-cmp-panel-has-form .card .card-body{padding:0}.accordion .card .card-header:hover .f-icon,.btn-secondary:hover,.farris-panel .card .card-header:hover .f-icon{color:var(--f-theme-05)}.accordion .card.f-state-selected .card-header .f-icon,.farris-panel .card.f-state-selected .card-header .f-icon{color:var(--f-theme-01)}.rtv-container{width:100%;height:100%;display:flex;flex-direction:column;background:#fff}.rtv-container .room-subject{border-radius:2px}.rtv-container .room-subject dt{font-size:13px;text-overflow:ellipsis;overflow:hidden}.rtv-container .room-subject_category{padding:0 4px;border-radius:4px;margin-right:8px;font-size:12px;display:inline-block;line-height:20px;background:var(--f-aid-02);border:1px solid var(--f-theme-01)}.rtv-container .room-subject dd.other-info{margin:0;line-height:18px;color:var(--f-text-07);text-overflow:ellipsis;overflow:hidden;padding-top:3px}.rtv-container .text-center{align-items:center;justify-content:center}.rtv-container .toolbar{height:50px;width:100%;border-bottom:1px solid var(--f-neutral-07);display:flex;align-items:center;padding-left:20px}.rtv-container .toolbar .view-type{width:131px;height:32px;line-height:32px;background:var(--f-aid-04);border-radius:32px;display:flex;align-items:center}.rtv-container .toolbar .view-type .btn-day,.rtv-container .toolbar .view-type .btn-week{width:64px;height:30px;border-radius:32px;background:0 0;border:0;font-weight:400;cursor:pointer}.rtv-container .toolbar .view-type .btn-active{background:rgba(255,255,255,.75);box-shadow:0 4px 18px 0 rgba(2,75,193,.2);color:var(--f-theme-03);cursor:default}.rtv-container .toolbar .line{height:20px;width:20px;display:inline-block;border-right:1px solid var(--f-neutral-06);margin-right:20px}.rtv-container .toolbar .btns{display:flex;width:112px;margin-right:20px}.rtv-container .toolbar .btns button{height:26px;background:#FFF;border:1px solid #e8ebf2;box-shadow:0 2px 6px 0 rgba(31,35,41,.06);border-radius:6px;outline:0;cursor:pointer}.rtv-container .toolbar .btns .btn-today{width:50px;margin-right:5px}.rtv-container .toolbar .btns .btn-group{width:53px;flex-grow:1;display:flex}.rtv-container .toolbar .btns .btn-group button{width:26px}.rtv-container .toolbar .btns .btn-group button i.f-icon{left:-2px;top:2px}.rtv-container .toolbar .btns .btn-prev{border-radius:6px 0 0 6px}.rtv-container .toolbar .btns .btn-next{border-radius:0 6px 6px 0}.rtv-container .main{flex-grow:1;display:flex;flex-direction:column;overflow:hidden}.rtv-container .main .fixed-left{position:sticky!important;left:0;z-index:9;flex:none!important;width:300px}.rtv-container .main .roomname{align-items:center;justify-content:start;background-color:#fff!important}.rtv-container .main .header{height:40px;overflow:hidden;border-bottom:1px solid #E6E9F0}.rtv-container .main .body .room-cell,.rtv-container .main .header-cell{height:100%;border-right:1px solid var(--f-neutral-06);border-bottom:1px solid var(--f-neutral-06);display:flex}.rtv-container .main .header-row{display:flex;flex-direction:row;width:2700px;height:100%}.rtv-container .main .header-cell>span.time{margin-left:-20px;font-size:14px;color:var(--f-text-04);font-weight:500}.rtv-container .main .time-cell{width:100px;align-items:center}.rtv-container .main .body{flex-grow:1;height:100%}.rtv-container .main .body .room-row{min-height:62px;display:flex;flex-direction:row;width:2700px}.rtv-container .main .body .room-cell{position:relative}.rtv-container .main .body .room-cell .item-content{width:100px;position:absolute;left:0;flex-wrap:nowrap;display:flex;flex-direction:column;line-height:20px;justify-content:center;z-index:1;word-break:normal;white-space:nowrap;overflow:hidden;height:calc(100% - 4px);cursor:pointer}.rtv-container .main .body .room-cell .item-content:hover{box-shadow:2px 2px 7px #bebebe}.rtv-container .main .body .room-cell .item-content .item-content-wrap{border-radius:6px;background:var(--f-aid-02);width:100%;height:100%}.rtv-container .main .body .room-cell .item-content .item-content-wrap.gray{background-color:#f0f0f0}.rtv-container .main .body .room-cell .item-content .item-content-wrap.gray .room-subject_category{border:1px solid #ccc;background:#F2F3F5;color:#878d99}.rtv-container .main .body .room-cell .item-content .item-content-wrap.blue{background:#dae9ff}.rtv-container .main .body .room-cell .item-content .item-content-wrap.blue .room-subject_category{border:1px solid #9bf;background:#9bf;color:#fff}.rtv-container .main .body .room-cell .item-content .item-content-wrap.orange{background:#ffedda}.rtv-container .main .body .room-cell .item-content .item-content-wrap.orange .room-subject_category{border:1px solid #ff772e;background:#ff772e;color:#fff5ea}.rtv-container .main .body .room-cell .item-content .item-content-wrap.mintgreen{background:#daffe0}.rtv-container .main .body .room-cell .item-content .item-content-wrap.mintgreen .room-subject_category{border:1px solid #42fc57;background:#42fc57;color:#449e00}.rtv-container .main .body .room-cell .item-content .item-content-wrap.red{background:#ffdada}.rtv-container .main .body .room-cell .item-content .item-content-wrap.red .room-subject_category{border:1px solid #ff8383;background:#ffa4a4;color:#ae0000}.rtv-container .main .body .room-cell .item-content .item-content-wrap.pink{background:#f6daff}.rtv-container .main .body .room-cell .item-content .item-content-wrap.pink .room-subject_category{border:1px solid #f867d6;background:#f867d6;color:#ffe2ef}.rtv-container .main .body .room-cell .item-content .item-content-wrap.bluegreen{background:#dafffe}.rtv-container .main .body .room-cell .item-content .item-content-wrap.bluegreen .room-subject_category{border:1px solid #2ac3ac;background:#2ac3ac;color:#efffe5}.rtv-container .main .body .room-cell .item-content .selected{outline:var(--f-theme-05) solid 2px;outline-offset:-2px;border-radius:6px}.rtv-container.rtv-container-week .header-cell,.rtv-container.rtv-container-week .room-cell{flex:1}.rtv-container.rtv-container-week .header-row,.rtv-container.rtv-container-week .room-row{width:auto!important}.rtv-container.rtv-container-week .time-cell{line-height:20px;width:150px}.rtv-container.rtv-container-week .time-cell .week-day-subject{cursor:pointer;transition:all .1s ease}.rtv-container.rtv-container-week .time-cell .week-day-subject:hover{background-color:var(--f-aid-02)}.rtv-container.rtv-container-week .time-cell li.selected{border:1px solid var(--f-theme-01);border-radius:4px;background:var(--f-aid-02)}.rtv-container.rtv-container-week .time-cell .rtv-week-day{text-align:center;border-radius:10px;width:20px;margin:0 5px;font-size:13px}.rtv-container.rtv-container-week .time-cell .rtv-week-day.active{background-image:linear-gradient(135deg,var(--f-aid-10) 0,var(--f-theme-05) 100%);color:#fff}.rtv-container.rtv-container-week .time-cell .rtv-week-day-item:before{content:"●";margin-right:3px;top:-2px;position:relative}.reserve-detail-container{display:flex;flex-direction:column;background:#FFF;box-shadow:0 4px 12px 2px rgba(31,35,41,.1);border-radius:16px;width:368px;height:436px;transition:all .12s ease}.reserve-detail-container .detail-header{height:185px;background-image:linear-gradient(116deg,var(--f-aid-10) 0,var(--f-theme-05) 100%);border-radius:16px 16px 0 0}.reserve-detail-container .detail-header.gray{color:#fff;background-image:linear-gradient(116deg,#bcbebf 0,#909293 100%)}.reserve-detail-container .detail-header.blue{color:#fff;background-image:linear-gradient(116deg,#09F 0,#0AF 100%)}.reserve-detail-container .detail-header.orange{color:#fff;background-image:linear-gradient(116deg,#ffc78c 0,#ffab58 100%)}.reserve-detail-container .detail-header.mintgreen{color:#fff;background-image:linear-gradient(116deg,#72cc89 0,#00a804 100%)}.reserve-detail-container .detail-header.red{color:#fff;background-image:linear-gradient(116deg,#ff9797 0,#ff3939 100%)}.reserve-detail-container .detail-header.pink{color:#fff;background-image:linear-gradient(116deg,#f1b9fb 0,#d458ff 100%)}.reserve-detail-container .detail-header.bluegreen{color:#fff;background-image:linear-gradient(116deg,#59ddc9 0,#1694c5 100%)}.reserve-detail-container .detail-header .detail-toolbar{height:44px;justify-content:flex-end;align-items:center;padding-right:15px;display:flex}.reserve-detail-container .detail-header .detail-toolbar span.f-icon{font-size:14px;cursor:pointer;width:32px;height:32px;text-align:center;line-height:32px;border-radius:6px}.reserve-detail-container .detail-header .detail-toolbar span.f-icon:hover{background:rgba(255,255,255,.2)}.reserve-detail-container .detail-header .detail-title{flex:1;padding:0 24px;overflow:hidden}.reserve-detail-container .detail-header .detail-title .detail-place{font-size:16px}.reserve-detail-container .detail-header .detail-title div.title-content{margin:6px 0 16px;font-size:20px;line-height:28px}.reserve-detail-container .detail-header .detail-title div.title-content span.detail-badge{height:18px;border-radius:4px;display:inline-block;font-size:12px;text-align:center;line-height:18px;padding:0 5px}.reserve-detail-container .detail-header .detail-title div.title-content span.detail-badge.gray{border:1px solid #ccc;background:#F2F3F5;color:#878d99}.reserve-detail-container .detail-header .detail-title div.title-content span.detail-badge.blue{border:1px solid #9bf;background:#9bf;color:#fff}.reserve-detail-container .detail-header .detail-title div.title-content span.detail-badge.pink{border:1px solid #f867d6;background:#f867d6;color:#ffe2ef}.reserve-detail-container .detail-header .detail-title div.title-content span.detail-badge.red{border:1px solid #ff8383;background:#ffa4a4;color:#ae0000}.reserve-detail-container .detail-header .detail-title div.title-content span.detail-badge.mintgreen{border:1px solid #42fc57;background:#42fc57;color:#449e00}.reserve-detail-container .detail-header .detail-title div.title-content span.detail-badge.orange{border:1px solid #ff772e;background:#ff772e;color:#fff5ea}.reserve-detail-container .detail-header .detail-title div.title-content span.detail-badge.bluegreen{border:1px solid #48fce0;background:#5efee6;color:#00b8bd}.reserve-detail-container .detail-header .detail-title .detail-timer{height:30px;font-size:14px;line-height:30px}.reserve-detail-container .detail-info-content{flex:1;padding:2px 2px 10px;color:#666;border-radius:0 0 16px 16px}.reserve-detail-container .detail-info-content ul{list-style:none;margin:0;padding:16px;font-size:14px}.reserve-detail-container .detail-info-content ul li{line-height:28px;display:flex;flex-direction:row}.f-calendar-day-view-header-primary,.reserve-detail-container .detail-info-content ul li span.detail-content{flex:1}.reserve-detail-container .detail-info-content ul li span.detail-subtitle{width:70px;display:inline-block}.shading-border-top{border-top:1px solid #fff!important}.f-avatar{position:relative;cursor:pointer;overflow:hidden}.f-avatar.f-avatar-readonly{cursor:default}.f-avatar.f-avatar-circle{border-radius:100%;overflow:hidden}.f-avatar.f-avatar-square{border-radius:0}.f-avatar .f-avatar-defult,.f-avatar .f-avatar-image{display:inline-block;width:100%;height:100%}.f-avatar .f-avatar-icon{display:none;position:absolute;left:0;right:0;top:0;bottom:0;align-items:center;justify-content:center;background:rgba(0,0,0,.3)}.f-avatar .f-avatar-icon .f-icon{font-size:24px;color:#fff}.f-avatar.f-avatar-circle .f-avatar-icon{border-radius:100%}.f-avatar.f-avatar-square .f-avatar-icon{border-radius:0}.f-avatar .f-avatar-upload-loading{position:absolute;left:0;top:0;display:inline-block;width:100%;height:100%;background-color:rgba(0,0,0,.15)}.f-avatar .f-avatar-upload-loading .loading-inner{position:absolute;width:100%;left:0;top:50%;margin-top:-25px;height:50px;line-height:50px;text-align:center;font-size:16px;color:#fff}.f-avatar:hover .f-avatar-icon{display:flex}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:1px solid transparent;padding:.1875rem .875rem;font-size:.8125rem;line-height:1.4286;border-radius:6px;transition:none}@media screen and (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 4px 10px 0 rgba(var(--f-neutral-15),.06)}.btn.disabled,.btn:disabled{opacity:1;box-shadow:none}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled).active,.btn:not(:disabled):not(.disabled).active:focus,.btn:not(:disabled):not(.disabled):active,.btn:not(:disabled):not(.disabled):active:focus{box-shadow:0 4px 10px 0 rgba(var(--f-neutral-15),.06)}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:var(--f-text-00);background:var(--f-theme-04);border-color:var(--f-theme-03);box-shadow:0 4px 10px 0 rgba(var(--f-theme-03),.2);position:relative;z-index:20}.btn-primary:hover,.btn-primary:not(:disabled):not(.disabled).focus,.btn-primary:not(:disabled):not(.disabled):focus{box-shadow:0 4px 10px 0 rgba(var(--f-neutral-15),.06)}.btn-primary:hover{color:var(--f-text-00);background:linear-gradient(135deg,#529DFF 0,#559FFF 100%);border-color:var(--f-theme-05)}.btn-primary.disabled,.btn-primary:disabled{color:var(--f-text-07);background:var(--f-neutral-08);border-color:var(--f-neutral-05);box-shadow:none}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:var(--f-text-00);background:var(--f-theme-02);border-color:var(--f-theme-01);box-shadow:0 4px 10px 0 rgba(var(--f-neutral-15),.06)}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 4px 10px 0 rgba(var(--f-neutral-15),.06)}.btn-secondary,.btn-secondary:hover,.btn-secondary:not(:disabled):not(.disabled).focus,.btn-secondary:not(:disabled):not(.disabled):focus{box-shadow:0 2px 6px 0 rgba(var(--f-neutral-15),.06)}.btn-secondary{background:var(--f-neutral-12);border-color:var(--f-neutral-08)}.btn-secondary:hover{background:var(--f-neutral-12);border-color:var(--f-theme-05)}.btn-secondary.disabled,.btn-secondary:disabled{color:var(--f-text-07);background:var(--f-neutral-08);border-color:var(--f-neutral-05);box-shadow:none}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:var(--f-theme-01);background:var(--f-neutral-12);border-color:var(--f-theme-01);box-shadow:0 2px 6px 0 rgba(var(--f-neutral-15),.06)}.btn-danger,.btn-danger:hover{color:var(--f-semantic-danger-01);box-shadow:0 2px 6px 0 rgba(var(--f-neutral-15),.06)}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 2px 6px 0 rgba(var(--f-neutral-15),.06)}.btn-danger{background:var(--f-neutral-00);border-color:#F9B0AF}.btn-danger:hover{background:rgba(var(--f-semantic-danger-01),.06);border-color:var(--f-semantic-danger-01)}.btn-danger:not(:disabled):not(.disabled).focus,.btn-danger:not(:disabled):not(.disabled):focus{box-shadow:0 2px 6px 0 rgba(var(--f-neutral-15),.06)}.btn-danger.disabled,.btn-danger:disabled{color:var(--f-text-07);background:var(--f-neutral-08);border-color:var(--f-neutral-05);box-shadow:none}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:var(--f-semantic-danger-01);background:rgba(var(--f-semantic-danger-01),.1);border-color:var(--f-semantic-danger-01);box-shadow:0 2px 6px 0 rgba(var(--f-neutral-15),.06)}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 2px 6px 0 rgba(var(--f-neutral-15),.06)}.btn-success,.btn-success:hover,.btn-success:not(:disabled):not(.disabled).focus,.btn-success:not(:disabled):not(.disabled):focus{box-shadow:0 4px 10px 0 rgba(var(--f-neutral-15),.06)}.btn-success,.btn-success:hover{color:var(--f-text-00);background:var(--f-semantic-success-01);border-color:var(--f-semantic-success-01)}.btn-success.disabled,.btn-success:disabled{color:var(--f-text-07);background:var(--f-neutral-08);border-color:var(--f-neutral-05);box-shadow:none}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:var(--f-text-00);background:var(--f-semantic-success-01);border-color:var(--f-semantic-success-01);box-shadow:0 4px 10px 0 rgba(var(--f-neutral-15),.06)}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 4px 10px 0 rgba(var(--f-neutral-15),.06)}.btn-warning,.btn-warning:hover{color:var(--f-text-00);background:var(--f-semantic-warning-01);border-color:var(--f-semantic-warning-01);box-shadow:0 4px 10px 0 rgba(var(--f-neutral-15),.06)}.btn-warning:not(:disabled):not(.disabled).focus,.btn-warning:not(:disabled):not(.disabled):focus{box-shadow:0 4px 10px 0 rgba(var(--f-neutral-15),.06)}.btn-warning.disabled,.btn-warning:disabled{color:var(--f-text-07);background:var(--f-neutral-08);border-color:var(--f-neutral-05);box-shadow:none}.btn-dark,.btn-dark:hover,.btn-dark:not(:disabled):not(.disabled).focus,.btn-dark:not(:disabled):not(.disabled):focus,.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 4px 10px 0 rgba(var(--f-neutral-15),.06)}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:var(--f-text-00);background:var(--f-semantic-warning-01);border-color:var(--f-semantic-warning-01)}.btn-dark{color:var(--f-text-00);background:#343a40;border-color:#343a40}.btn-dark:hover{color:var(--f-text-00);background:#23272b;border-color:#23272b}.btn-dark.disabled,.btn-dark:disabled{color:var(--f-text-07);background:var(--f-neutral-08);border-color:var(--f-neutral-05);box-shadow:none}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:var(--f-text-00);background:#1d2124;border-color:#171a1d;box-shadow:0 4px 10px 0 rgba(var(--f-neutral-15),.06)}.btn-light,.btn-light:hover{color:#212529;box-shadow:0 4px 10px 0 rgba(var(--f-neutral-15),.06)}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 4px 10px 0 rgba(var(--f-neutral-15),.06)}.btn-light{background:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{background:#e2e6ea;border-color:#dae0e5}.btn-light:not(:disabled):not(.disabled).focus,.btn-light:not(:disabled):not(.disabled):focus{box-shadow:0 4px 10px 0 rgba(var(--f-neutral-15),.06)}.btn-light.disabled,.btn-light:disabled{color:var(--f-text-07);background:var(--f-neutral-08);border-color:var(--f-neutral-05);box-shadow:none}.btn-info,.btn-info:hover,.btn-info:not(:disabled):not(.disabled).focus,.btn-info:not(:disabled):not(.disabled):focus,.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 4px 10px 0 rgba(var(--f-neutral-15),.06)}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background:#dae0e5;border-color:#d3d9df}.btn-info{background:var(--f-theme-03);border-color:var(--f-theme-03)}.btn-info:hover{color:var(--f-text-00);background:linear-gradient(135deg,#529DFF 0,#559FFF 100%);border-color:var(--f-theme-05)}.btn-info.disabled,.btn-info:disabled{color:var(--f-text-07);background:var(--f-neutral-08);border-color:var(--f-neutral-05);box-shadow:none}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:var(--f-text-00);background:var(--f-theme-02);border-color:var(--f-theme-02);box-shadow:0 4px 10px 0 rgba(var(--f-neutral-15),.06)}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 4px 10px 0 rgba(var(--f-neutral-15),.06)}.btn-link{font-weight:400;color:var(--f-theme-03);padding:0;border:0;line-height:1.25rem}.btn-lg,.btn-sm{line-height:1.4286;border-radius:6px}.btn-link:hover{color:var(--f-theme-05);text-decoration:none;border-color:transparent}.btn-link.focus,.btn-link:focus{text-decoration:none;border-color:transparent;color:var(--f-theme-01);box-shadow:none}.btn-link.active,.btn-link:active{box-shadow:none!important;color:var(--f-theme-01)}.btn-link.disabled,.btn-link:disabled{color:var(--f-text-07);pointer-events:none}.btn-link+.btn-link{margin-right:.875rem}.btn-lg{padding:.25rem 1.125rem}.btn-sm{padding:.125rem .5rem;font-size:.75rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.btn-warning{color:var(--f-text-00)}.btn-outline-danger.disabled,.btn-outline-danger:disabled,.btn-outline-dark.disabled,.btn-outline-dark:disabled,.btn-outline-info.disabled,.btn-outline-info:disabled,.btn-outline-light.disabled,.btn-outline-light:disabled,.btn-outline-link.disabled,.btn-outline-link:disabled,.btn-outline-primary.disabled,.btn-outline-primary:disabled,.btn-outline-secondary.disabled,.btn-outline-secondary:disabled,.btn-outline-success.disabled,.btn-outline-success:disabled,.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:var(--f-text-07);border-color:var(--f-neutral-05);background:0 0}.btn-info{color:var(--f-text-00)}.f-cursor-pointer{cursor:pointer!important}.f-btn-collapse-expand{color:var(--f-text-03);background-color:transparent;box-shadow:none}.dropdown-submenu .dropdown-toggle,.f-btn-collapse-expand:active,.f-btn-collapse-expand:focus,.f-btn-icon.f-bare,.f-response-content .dropdown-item{box-shadow:none!important}.f-btn-collapse-expand:hover{color:var(--f-theme-05)}.f-btn-collapse-expand:active{color:var(--f-theme-01)}.f-btn-collapse-expand::after{width:1em;height:1em;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-size:1rem;font-style:normal;font-variant:normal;font-weight:400;line-height:1;speak:none;text-transform:none;display:inline-block;vertical-align:middle;margin-left:.25rem}.f-btn-collapse-expand.f-state-expand::after{content:"\e013"}.f-toolbar .f-btn-collapse-expand{padding-right:0}.f-pretend-link{color:var(--f-theme-03)!important;cursor:pointer;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}.f-pretend-link:hover{color:var(--f-theme-05);text-decoration:none}.btn.btn-px{padding-left:2.25rem;padding-right:2.25rem}.f-btn-ml{margin-left:.5rem!important}.f-btn-link-ml,.f-btn-link-mr{margin-left:.875rem!important}.f-btn-mr{margin-right:.625rem!important}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex-grow:0;flex-shrink:1;flex-basis:auto}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group-sm>.btn{padding:.125rem .5rem;font-size:.75rem;line-height:1.4286;border-radius:6px}.btn-group-lg>.btn{padding:.25rem 1.125rem;font-size:.875rem;line-height:1.4286;border-radius:6px}.dropdown-toggle-split{padding-right:.65625rem;padding-left:.65625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropright-top .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropup-left .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before,.dropleft-up .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split{padding-right:.84375rem;padding-left:.84375rem}.btn-group.show .dropdown-toggle{box-shadow:0 4px 10px 0 rgba(var(--f-neutral-15),.06)}.btn-group.show .dropdown-toggle.btn-link{box-shadow:none}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.f-btn-group .f-btn-group-links .btn-link{margin-left:.375rem;margin-right:.375rem}.f-btn-group .f-btn-group-links .btn-link:first-child{margin-left:0}.f-btn-group .f-btn-group-links .btn-link:last-child{margin-right:.1875rem}.f-btn-group .f-btn-group-links .btn-icontext{color:var(--f-theme-03);padding:0 3px;margin:0 0 0 .375rem}.f-btn-group .f-btn-group-links .btn-icontext .f-icon{margin:0}.f-btn-group .f-btn-group-links .btn-icontext:last-child{margin-right:0}.f-btn-group .f-btn-group-dropdown{padding:0 3px;margin-left:.375rem}.f-btn-group .f-btn-group-dropdown .f-btn-dropdown{display:inline-block;border:none;outline:0;background:var(--f-aid-04);color:var(--f-theme-03);width:1rem;height:1rem;line-height:1rem;text-align:center;border-radius:100%;padding:0}.f-btn-group .f-btn-group-dropdown .f-btn-dropdown:hover{cursor:pointer;color:var(--f-theme-03);background:var(--f-aid-03)}.f-btn-group .f-btn-group-dropdown .f-btn-dropdown:focus{color:var(--f-text-00);background:var(--f-theme-02)}.f-btn-group .f-btn-group-dropdown .f-btn-dropdown .f-icon{font-size:.75rem}.f-btn-group .f-btn-group-dropdown .dropdown-menu{min-width:5rem}.f-btn-group-dropdown-menu{z-index:1300!important}.f-btn-group-dropdown-menu .dropdown-item .dropdown-item-icon{margin:0 8px 0 0}.f-button-edit .farris-tags.form-control{padding:0}.f-button-edit .farris-tag-input-box,.f-button-edit .farris-tag-item{line-height:17px!important;margin:2px 6px 2px 0!important}.f-button-edit .farris-tag-input-box .form-control{height:inherit!important;padding:1px 0!important}.f-button-edit-nowrap .farris-tags{overflow:hidden}.f-button-edit-nowrap .farris-tags-item-container{display:flex;flex-wrap:nowrap;overflow:hidden}.f-button-edit .input-group:not(.f-state-disabled,.f-state-readonly) .form-control{border-top-right-radius:0;border-bottom-right-radius:0}.fv-calculator-standard-main{background-color:#f1f1f1;margin:0 auto;box-shadow:0 0 15px #4d4d4d}.fv-calculator-standard-main ul{list-style:none;margin:0;padding:0}.fv-calculator-standard-main li{float:left;text-align:center;cursor:pointer}.fv-calculator-standard-main li img{height:14px}.fv-calculator-standard-main .fv-calculator-title{padding:5px 0;height:30px;line-height:30px;font-size:18px;margin-left:10px}.fv-calculator-standard-main .fv-calculator-result{height:140px;text-align:right;width:100%}.fv-calculator-standard-main .fv-calculator-result-out{margin:0 5px;height:48px;overflow:hidden}.fv-calculator-standard-main .fv-calculator-second{font-size:42px;font-weight:700;overflow-y:auto;white-space:nowrap;text-align:right}.fv-calculator-standard-main .fv-calculator-pre{color:#A7A7A7;padding:0 20px;font-size:16px;height:24px;width:100%;overflow:hidden;position:relative;z-index:99}.fv-calculator-standard-main .fv-calculator-pre .fv-calculator-pre-left{width:16px;text-align:center;line-height:20px;height:24px;position:absolute;z-index:101;left:0;top:0;font-weight:600;cursor:pointer;background:#f1f1f1}.fv-calculator-standard-main .fv-calculator-pre .fv-calculator-pre-right{width:16px;text-align:center;line-height:20px;height:24px;position:absolute;z-index:101;right:0;top:0;font-weight:600;cursor:pointer;background:#f1f1f1}.fv-calculator-pre .fv-calculator-pre-content{text-align:right;height:24px;line-height:24px;white-space:nowrap;overflow-y:auto;overflow-x:hidden}.fv-calculator-pre-left:hover,.fv-calculator-pre-right:hover{color:#1853d1;background:#9b9b9b}.fv-calculator-standard-main .fv-calculator-type{height:auto;text-align:left;font-weight:700;margin:10px 0 20px 10px;font-size:22px}.fv-calculator-standard-main .fv-calculator-type-bar{height:90px;width:100px;position:absolute;top:110px;background-color:#E6E6E6}.fv-calculator-standard-main .fv-calculator-type-bar li{float:left;width:100px;text-align:center;line-height:30px}.fv-calculator-standard-main .active{background-color:#CFCFCF}.fv-calculator-standard-main .fv-calculator-number{font-weight:700;border:1px solid #fff!important;background:#fff!important}.fv-calculator-standard-main .fv-calculator-number:hover{border:1px solid #f1f1f1!important;background:#c6c6c6!important}.fv-calculator-standard-main .fv-calculator-operator:hover{border:1px solid #f1f1f1!important;background:#82bceb!important;color:#fff}.fv-calculator-standard-main .fv-calculator-letter{font-size:16px}.fv-calculator-standard-main{width:500px;height:460px}#fv-calculator-num-symbol{height:270px;font-size:20px;display:flex;flex-wrap:wrap;justify-content:center}#fv-calculator-num-symbol li{line-height:48px;width:23%;margin:5px 0 0 5px;background:#dedede;border:1px solid #dedede;list-style-type:none}#fv-calculator-num-symbol li:hover{background:#c6c6c6;border:1px solid #f1f1f1}.f-calendar-day-view-header,.f-calendar-day-view-item{border-bottom:1px solid #e9e9e9;display:flex}.f-calendar-day-view-item,.f-calendar-day-view-item-lower,.f-calendar-day-view-item-upper,.f-calendar-day-view-item-upper:first-child,.f-calendar-day-view-item:first-child,.f-calendar-week-view-item{border-top:1px solid transparent}.f-calendar-day-view{background-color:#fff;display:flex;flex-direction:column;min-width:860px;height:530px}.f-calendar-day-view-header-corner{width:44px;height:24px}.f-calendar-day-view-header-columns{display:flex}.f-calendar-day-view-header-cell{display:flex;flex:1;padding:4px 4px 8px;font-size:14px;color:rgba(0,0,0,.75);line-height:22px;font-weight:500}.f-calendar-day-view-header-cell .f-calendar-day-view-date{border-radius:20px;width:24px;height:24px;text-align:center;margin-right:4px}.f-calendar-day-view-header-cell .f-calendar-day-view-current{background:#0093f5;color:#fff}.f-calendar-day-view-content{display:flex;flex:1;overflow-y:scroll}.f-calendar-day-view-content-side{width:44px}.f-calendar-day-view-item{height:22px}.f-calendar-day-view-item-upper{border-bottom:1px solid transparent}.f-calendar-day-view-item-lower{border-bottom:1px solid #e9e9e9}.f-calendar-day-view-item-cell{flex:1;height:22px;border-left:1px solid transparent;border-right:1px solid #e9e9e9}.f-calendar-day-view-item-cell:first-child{border-left:1px solid #e9e9e9;border-right:1px solid #e9e9e9}.f-calendar-day-view-item-cell:last-child{border-left:1px solid transparent;border-right:1px solid transparent}.f-calendar-header{display:flex;background-color:#fff}.f-calendar-header>.f-calendar-title{font-weight:600;font-size:24px;line-height:32px;margin:14px 0;padding:0 14px;border-right:1px solid #e9e9e9;width:144px}.f-calendar-header>.f-calendar-navigator{flex:1;display:flex}.f-calendar-header .f-calendar-view-switch{margin:16px 14px;position:relative}.f-calendar-header .f-calendar-view-switch-panel{background-color:#eff5ff;width:200px;height:28px;border-radius:28px;display:flex;font-weight:500}.f-calendar-header .f-calendar-view-switch-panel>span{flex:1;line-height:28px;text-align:center}.f-calendar-header .f-calendar-view-switch>.f-calendar-view-switch-active-view{height:24px;width:62px;position:absolute;background:#fff;box-shadow:0 4px 18px 0 rgba(2,75,193,.2);border-radius:24px;line-height:24px;text-align:center;color:#0091da;font-weight:500;transition:.3s ease-out all}.f-calendar-header>.f-calendar-navigator>.f-calendar-navigator-today{background:#fff;border:1px solid #e8ebf2;box-shadow:0 2px 6px 0 rgba(31,35,41,.06);border-radius:6px;font-size:13px;color:#2d2f33;font-weight:400;margin:auto 6px auto 14px}.f-calendar-header>.f-calendar-navigator>.f-calendar-navigator-button-group{box-shadow:0 2px 6px 0 rgba(31,35,41,.06);border-radius:6px;font-size:13px;color:#2d2f33;font-weight:400;margin:auto 14px auto 0}.f-calendar-header>.f-calendar-navigator>.f-calendar-navigator-button-group>.f-calendar-navigator-previous{background:#fff;border:1px solid #e8ebf2;border-right-color:transparent;border-radius:6px 0 0 6px;padding:.1875rem .375rem}.f-calendar-header>.f-calendar-navigator>.f-calendar-navigator-button-group>.f-calendar-navigator-next{background:#fff;border:1px solid #e8ebf2;border-radius:0 6px 6px 0;padding:.1875rem .375rem}.f-calendar-month-view{min-width:860px;display:flex}.f-calendar-month-view table{display:table!important;margin:initial!important;flex:1;table-layout:fixed;width:-moz-fit-content;width:fit-content}.f-calendar-month-view tr{border-top:initial!important;transition:initial!important}.f-calendar-month-view th{border:initial!important;background-color:initial!important;font-size:14px!important;color:rgba(0,0,0,.75);line-height:22px;font-weight:500!important}.f-calendar-month-view{background-color:#fff}.f-calendar-month-view td{border:1px solid #e9e9e9!important;padding:4px!important;height:100px}.f-calendar-week-view-header,.f-calendar-week-view-item{border-bottom:1px solid #e9e9e9;display:flex}.f-calendar-month-view .f-calendar-month-view-title{display:flex}.f-calendar-month-view .f-calendar-month-view-title>.f-calendar-month-view-date{border-radius:20px;width:24px;height:24px;line-height:24px;text-align:center;font-size:14px}.f-calendar-month-view .f-calendar-month-view-title>.f-calendar-month-view-date-month{flex:1;border-radius:20px;width:24px;height:24px;line-height:24px;text-align:right;font-size:14px}.f-calendar-month-view .f-calendar-month-view-current{background:#0093f5;color:#fff}.f-calendar-month-view .f-calendar-month-view-event-item{background-color:#ebf3ff;font-size:12px;color:#0e6ded;line-height:18px;margin:2px 0;padding:2px 4px}.f-calendar-week-view{background-color:#fff;display:flex;flex-direction:column;min-width:860px;height:530px}.f-calendar-week-view-header-corner{width:44px;height:24px}.f-calendar-week-view-header-primary{flex:1}.f-calendar-week-view-header-columns{display:flex}.f-calendar-week-view-header-cell{flex:1;padding:4px 4px 8px;display:flex;font-size:14px;color:rgba(0,0,0,.75);line-height:22px;font-weight:500}.f-calendar-week-view-header-cell .f-calendar-week-view-date{border-radius:20px;width:24px;height:24px;text-align:center;margin-right:4px}.f-calendar-week-view-header-cell .f-calendar-week-view-current{background:#0093f5;color:#fff}.f-calendar-week-view-content{display:flex;flex:1;overflow-y:scroll}.f-calendar-week-view-content-side{width:44px}.f-calendar-content-primary{flex:1}.f-calendar-side{margin-top:-11px}.f-calendar-side-row{height:22px;padding-right:4px;text-align:end}.f-calendar-side-row-number{height:22px;line-height:22px}.f-calendar-week-view-item{height:22px}.f-calendar-week-view-item:first-child{border-top:1px solid #e9e9e9}.f-calendar-week-view-item-lower,.f-calendar-week-view-item-upper,.f-calendar-week-view-item-upper:first-child{border-top:1px solid transparent}.f-calendar-week-view-item-upper{border-bottom:1px solid transparent}.f-calendar-week-view-item-lower{border-bottom:1px solid #e9e9e9}.f-calendar-week-view-item-cell{flex:1;height:22px;border-left:1px solid transparent;border-right:1px solid #e9e9e9}.f-calendar-week-view-item-cell:first-child{border-left:1px solid #e9e9e9;border-right:1px solid #e9e9e9}.f-calendar-week-view-item-cell:last-child{border-left:1px solid transparent;border-right:1px solid transparent}.f-calendar-event{background:#ebf3ff;border-radius:2px;margin:2px;font-size:12px;color:#0e6ded;padding:2px 4px}.f-capsule-container{color:#6080AD;position:relative;display:inline-block;box-sizing:content-box;padding:0;margin:0;cursor:pointer;white-space:nowrap;min-width:2.5rem;height:1.8rem;overflow:hidden}.f-capsule-container.primary .f-capsule-board{background-color:#eff5ff}.f-capsule-container.secondary .f-capsule-board{background-color:#f2f4f8}.f-capsule-container .f-capsule-pane{display:flex;height:100%;min-height:100%;justify-content:flex-start;align-items:center;top:0;position:relative}.f-capsule-container .f-capsule-pane .f-capsule-item{opacity:1;display:inline-block;font-size:12px;line-height:1.8rem;padding-left:24px;padding-right:24px;z-index:2}.f-capsule-container .f-capsule-pane .f-capsule-item.f-capsule-active-item{font-weight:700}.f-capsule-container.primary .f-capsule-pane .f-capsule-item.f-capsule-active-item{color:#2a87ff}.f-capsule-container .f-capsule-pane .f-capsule-item>i{margin-right:2px;font-size:12px}.f-capsule-container .f-capsule-board{background-color:#f2f4f8;border-radius:1.8rem;height:1.8rem;position:absolute;top:0;z-index:0}.f-capsule{height:calc(100% - 4px);border-radius:1.8rem;position:absolute;background:#fff;left:2px;top:2px;opacity:1;display:inline-block;font-size:12px;padding-left:22px;padding-right:22px;z-index:1}.custom-checkbox .custom-control-input:checked~.custom-control-label::after,.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:none}.custom-control{position:relative;display:block;min-height:1.1607375rem;padding-left:0}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;clip:rect(0,0,0,0);overflow:hidden;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:var(--f-theme-03);background-color:var(--f-neutral-00);box-shadow:none}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 4px 2px rgba(99,136,255,.12);color:var(--f-theme-03)}.custom-control-input:active~.custom-control-label::before{color:var(--f-text-00);background-color:var(--f-theme-03);box-shadow:none}.custom-checkbox .custom-control-input:checked~.custom-control-label::before,.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before,.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before,.custom-control-input:disabled~.custom-control-label::before,.custom-control-label::before,.custom-radio .custom-control-input:checked~.custom-control-label::before,.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:var(--f-neutral-00)}.custom-control-input:disabled~.custom-control-label{color:var(--f-neutral-06)}.custom-control-label{position:relative}.custom-control-label::before{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;box-shadow:0 0 0;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.custom-control-label::after{position:absolute;top:.08036875rem;left:-1.5rem;width:1rem;height:1rem;background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-control-label::before,.f-icon{height:1em;-moz-osx-font-smoothing:grayscale;font-style:normal;font-variant:normal;speak:none;font-family:FarrisIcons;-webkit-font-smoothing:antialiased;text-transform:none}@media screen and (prefers-reduced-motion:reduce){.custom-control-label::before{transition:none}}.custom-control.custom-checkbox,.custom-control.custom-radio{padding-right:.8125rem;margin-bottom:.25rem}.custom-control .custom-control-label::before{color:var(--f-neutral-02)}.custom-control .custom-control-label:hover{cursor:pointer}.custom-control .custom-control-input:disabled~.custom-control-label:hover,.custom-control .custom-control-input[readonly]~.custom-control-label:hover{cursor:default}.custom-control .custom-control-label:hover::before{color:var(--f-theme-05)}.custom-control .custom-control-input:checked~.custom-control-label::before{color:var(--f-theme-03)}.custom-control .custom-control-input[readonly]~.custom-control-label{color:var(--f-text-02)}.custom-control .custom-control-input[readonly]~.custom-control-label::before{color:var(--f-neutral-06)}.custom-control .custom-control-input:disabled~.custom-control-label{color:var(--f-text-02)}.custom-control .custom-control-input:disabled~.custom-control-label::before{color:var(--f-neutral-06)}.custom-control .custom-control-input[disabled]:checked~.custom-control-label::before,.custom-control .custom-control-input[readonly]:checked~.custom-control-label::before{color:rgba(var(--f-theme-03),.2)}.custom-control-label{padding-left:1.5rem;color:var(--f-text-02);display:inline}.custom-control-label::before{width:1em;font-weight:400;display:inline-block;vertical-align:middle;color:var(--f-neutral-02);font-size:14px;line-height:1;top:3px;left:0;position:absolute}.custom-control-label::after{display:none}.custom-checkbox .custom-control-label::before{border-radius:0;content:"\e304"}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{box-shadow:none;font-family:FarrisIcons;content:"\e306";color:var(--f-theme-03)}.custom-checkbox .custom-control-input:checked~.custom-control-label::before,.custom-radio .custom-control-input:checked~.custom-control-label::before{content:"";background-repeat:no-repeat;background-size:contain;background-position:center center;box-shadow:0 2px 6px 0 rgba(var(--f-theme-03),.2)}.custom-checkbox .custom-control-input[disabled]:checked~.custom-control-label::before,.custom-checkbox .custom-control-input[readonly]:checked~.custom-control-label::before,.custom-radio .custom-control-input[disabled]:checked~.custom-control-label::before,.custom-radio .custom-control-input[readonly]:checked~.custom-control-label::before{box-shadow:none;opacity:.4}.custom-checkbox .custom-control-input:checked~.custom-control-label::before{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgd2lkdGg9IjE0cHgiIGhlaWdodD0iMTRweCIgdmlld0JveD0iMCAwIDE0IDE0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KICAgIDx0aXRsZT7nvJbnu4QgMjc8L3RpdGxlPg0KICAgIDxkZWZzPg0KICAgICAgICA8bGluZWFyR3JhZGllbnQgeDE9Ijg3LjE4OTcwNjUlIiB5MT0iMCUiIHgyPSIxOC4yNDA0NDkyJSIgeTI9IjEwMCUiIGlkPSJsaW5lYXJHcmFkaWVudC0xIj4NCiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMzRjY1RkYiIG9mZnNldD0iMCUiPjwvc3RvcD4NCiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiM0RDlBRkYiIG9mZnNldD0iMTAwJSI+PC9zdG9wPg0KICAgICAgICA8L2xpbmVhckdyYWRpZW50Pg0KICAgIDwvZGVmcz4NCiAgICA8ZyBpZD0i5paw54mIIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4NCiAgICAgICAgPGcgaWQ9Iue8lue7hC0yNyI+DQogICAgICAgICAgICA8cmVjdCBpZD0i55+p5b2i5aSH5Lu9LTE0IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTEpIiB4PSIwIiB5PSIwIiB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHJ4PSIzIj48L3JlY3Q+DQogICAgICAgICAgICA8cGF0aCBkPSJNMTAuNjkwOTE2NCw0LjEzNjA2NjY0IEwxMS4zNTMzNzY5LDQuNzU0MDk0OTIgQzExLjQzNDE0MzMsNC44Mjk0NDQyNCAxMS40Mzg1MzQ3LDQuOTU2MDAxMDcgMTEuMzYzMTg1NCw1LjAzNjc2NzUxIEMxMS4zNjMwNjY2LDUuMDM2ODk0ODYgMTEuMzYyOTQ3Niw1LjAzNzAyMjA2IDExLjM2MjgyODUsNS4wMzcxNDkxMSBMNi42MTYzOTg1OSwxMC4wOTgyNDI1IEM2LjU0MDgzODUyLDEwLjE3ODgxMTggNi40MTQyNzA2NSwxMC4xODI4NzI2IDYuMzMzNzAxMzQsMTAuMTA3MzEyNSBDNi4zMzE3ODIyMSwxMC4xMDU1MTI3IDYuMzI5ODk4NzgsMTAuMTAzNjc1MiA2LjMyODA1MjE1LDEwLjEwMTgwMSBMMy4xNDA3NDAxNiw2Ljg2NzAxODkyIEMzLjA2MzIxNDc1LDYuNzg4MzM4ODggMy4wNjQxNTA3NSw2LjY2MTcwOTM0IDMuMTQyODMwNzksNi41ODQxODM5MyBDMy4xNDI5NTUxMSw2LjU4NDA2MTQzIDMuMTQzMDc5Niw2LjU4MzkzOTA5IDMuMTQzMjA0MjQsNi41ODM4MTY5MiBMMy43OTAxMjUxOCw1Ljk0OTcxODg4IEMzLjg2ODg2OTM1LDUuODcyNTM1NTQgMy45OTUyMjY2Myw1Ljg3MzY0MzM2IDQuMDcyNjA1NCw1Ljk1MjE5NTQ5IEw2LjQ1MDE0NjI0LDguMzY1Nzg4ODIgTDYuNDUwMTQ2MjQsOC4zNjU3ODg4MiBMMTAuNDA4NjEwMiw0LjE0NTQ4MzUzIEMxMC40ODQwMzI2LDQuMDY1MDcyMTYgMTAuNjEwMzAzLDQuMDYwODYwMTYgMTAuNjkwOTE2NCw0LjEzNjA2NjY0IFoiIGlkPSLot6/lvoQtMTPlpIfku70iIGZpbGw9IiNGRkZGRkYiIGZpbGwtcnVsZT0ibm9uemVybyI+PC9wYXRoPg0KICAgICAgICA8L2c+DQogICAgPC9nPg0KPC9zdmc+)}.farris-checkradio-ver{display:flex!important;flex-direction:column}.farris-checkradio-hor{flex-wrap:wrap;display:inline-flex}.farris-input-wrap.farris-checkradio-hor{display:inline-flex}.custom-radio .custom-control-label::before{border-radius:50%;content:"\e309"}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:none}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgd2lkdGg9IjE0cHgiIGhlaWdodD0iMTRweCIgdmlld0JveD0iMCAwIDE0IDE0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPg0KICAgIDx0aXRsZT5SZWN0YW5nbGUgMjcxIENvcHkgMTHlpIfku70gMjwvdGl0bGU+DQogICAgPGRlZnM+DQogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iODcuMTg5NzA2NSUiIHkxPSIwJSIgeDI9IjE4LjI0MDQ0OTIlIiB5Mj0iMTAwJSIgaWQ9ImxpbmVhckdyYWRpZW50LTEiPg0KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzNGNjVGRiIgb2Zmc2V0PSIwJSI+PC9zdG9wPg0KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzREOUFGRiIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+DQogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+DQogICAgPC9kZWZzPg0KICAgIDxnIGlkPSLmlrDniYgiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPg0KICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTI3MS1Db3B5LTEx5aSH5Lu9LTIiIHN0cm9rZT0idXJsKCNsaW5lYXJHcmFkaWVudC0xKSIgc3Ryb2tlLXdpZHRoPSI0IiB4PSIyIiB5PSIyIiB3aWR0aD0iMTAiIGhlaWdodD0iMTAiIHJ4PSI1Ij48L3JlY3Q+DQogICAgPC9nPg0KPC9zdmc+)}.farris-checkradio-hor .farris-radio-button:not(:first-child,:last-child) .btn{border-radius:0}.farris-checkradio-hor .farris-radio-button:first-child .btn{border-radius:6px 0 0 6px}.farris-checkradio-hor .farris-radio-button:last-child .btn{border-radius:0 6px 6px 0}.f-color-picker-component{display:inline-block;position:relative;line-height:normal}.f-color-picker-component .color-picker-wrapper{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.f-color-picker-component .color-picker-wrapper .color-picker-input{border-top-right-radius:0;border-bottom-right-radius:0;flex:1 1 auto;width:1%;min-width:200px}.f-color-picker-component .color-picker-wrapper .color-picker-trigger{display:inline-block;box-sizing:border-box;height:calc(1.62503rem + 2px);width:calc(1.62503rem + 2px);padding:.1875rem;border:1px solid #e6e6e6;border-left:none;border-top-right-radius:4px;border-bottom-right-radius:4px;font-size:0;position:relative;cursor:pointer}.f-color-picker-component .color-picker-wrapper .color-picker-trigger .color-picker-trigger-inner{position:relative;display:block;box-sizing:border-box;border:1px solid #999;border-radius:2px;width:100%;height:100%;text-align:center}.f-color-picker-component .color-picker-wrapper .color-picker-trigger .color-picker-trigger-inner.is-alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.f-color-picker-component .color-picker-wrapper .color-picker-trigger .color-picker-trigger-inner div{width:100%;height:100%}.f-color-picker-component .color-picker-panel{display:block;position:absolute;width:300px;z-index:3000;padding:6px;box-sizing:content-box;background-color:#fff;border:1px solid #ebeef5;border-radius:4px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.f-color-picker-component .color-picker-panel.disabled{display:none}.f-color-picker-component .color-picker-panel .color-picker-main{padding-bottom:6px}.f-color-picker-component .color-picker-panel .input-btn{margin-top:6px;text-align:right}.f-color-picker-component .color-picker-panel .input-btn input{float:left;width:180px;height:28px;line-height:28px;cursor:pointer;-webkit-appearance:none;background-color:#fff;border-radius:4px;border:1px solid #dcdfe6;box-sizing:border-box;color:#606266;font-size:inherit;outline:0;padding:0 7px;transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.f-color-picker-component .color-picker-panel .input-btn input:focus{border-color:#409eff}.f-color-picker-component .color-picker-panel .input-btn .btn-clear{background-color:#fff;border:none;outline:0;color:#409eff}.color-picker-wrapper .color-picker-trigger{border-color:var(--f-neutral-04)!important;height:calc(1.375rem + .125rem)!important}.f-alpha-component{display:flex;flex-direction:column;position:relative;box-sizing:border-box;width:280px;height:12px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.f-alpha-component .color-alpha-slider__bar{position:relative;background:linear-gradient(to right,rgba(255,69,0,0) 0,#ff4500 100%);height:100%}.f-alpha-component .color-alpha-slider__thumb{position:absolute;cursor:pointer;box-sizing:border-box;left:189px;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid #f0f0f0;box-shadow:0 0 2px rgba(0,0,0,.6);z-index:1}.f-hue-component{position:relative;box-sizing:border-box;width:12px;height:180px;background-color:red;padding:2px 0;float:right}.f-hue-component .color-hue-slider__bar{position:relative;background:linear-gradient(red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red);height:100%}.f-hue-component .color-hue-slider__thumb{position:absolute;cursor:pointer;box-sizing:border-box;top:10px;left:0;width:100%;height:4px;border-radius:1px;background:#fff;border:1px solid #f0f0f0;box-shadow:0 0 2px rgba(0,0,0,.6);z-index:1}.f-preset-component{display:flex;font-size:12px;margin-top:8px;width:280px}.f-preset-component .color-preset__colors{display:flex;flex:1;flex-wrap:wrap}.f-preset-component .color-preset__colors .color-preset__color-selector{margin:0 0 8px 8px;width:20px;height:20px;border-radius:4px;cursor:pointer}.f-preset-component .color-preset__colors .color-preset__color-selector:nth-child(10n+1){margin-left:0}.f-preset-component .color-preset__colors .color-preset__color-selector.selected{box-shadow:0 0 3px 2px #409eff}.f-preset-component .color-preset__colors .color-preset__color-selector div{display:flex;height:100%;border-radius:3px}.f-sv-panel-component{display:inline-block;position:relative;width:280px;height:180px}.f-sv-panel-component .color-svpanel__white{position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.f-sv-panel-component .color-svpanel__black{position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(0deg,#000,transparent)}.f-sv-panel-component .color-svpanel__cursor{position:absolute}.f-sv-panel-component .color-svpanel__cursor div{cursor:pointer;width:6px;height:6px;box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);border-radius:50%;transform:translate(-3px,-3px)}input-group.actived .input-group{box-shadow:0 0 4px 2px rgba(99,136,255,.12);border-color:var(--f-theme-08)}.f-combo-list-container{overflow:auto;z-index:9;padding:.25rem}.f-combo-list-container .f-empty-title,.f-combo-list-container .f-list-view-group{margin:0}.f-combo-list-container .f-combo-list-search-box{margin:.25rem .5rem}.f-combo-list-container .f-combo-list-search-box .f-combo-list-item{padding:.125rem .5rem}.f-combo-list-item{position:relative;display:block;padding:.3125rem .5rem;background-color:#fff;border-radius:6px}.f-combo-list-item.f-un-select{color:var(--f-text-09)}.f-combo-list-item:not(.f-un-select):hover{background:var(--f-neutral-11);color:var(--f-text-02)}.f-combo-list-item.f-listview-active{color:var(--f-text-02);background:var(--f-neutral-10)}.f-combo-tree-container .fv-tree,.f-combo-tree-container .fv-tree-content{overflow:auto}.condition-list{width:100%;display:flex;flex-direction:column;overflow-y:hidden;resize:vertical;min-height:50px}.condition-list .condition-list-body{height:calc(100% - 32px);overflow-y:auto}.condition-list .condition-list-body-maxh{max-height:380px}.condition-list .condition-list-bottom{position:relative;margin:14px 0 14px 6px}.condition-list .condition-list-reset{position:absolute;right:32px;bottom:4px}.condition-list .add-group-btn{width:100%;background:rgba(239,245,255,.65);border:1px solid #dbe9ff;border-radius:6px;color:#2a87ff;font-size:13px}.condition-list .add-condition-btn{color:#2A87FF;font-size:13px;display:inline-block}.condition-list .add-condition-btn:hover{cursor:pointer}.condition-list .add-condition-btn .f-icon{vertical-align:text-bottom;position:relative;width:16px;height:16px;border-radius:50%}.condition-list .add-condition-btn .f-icon-filter-add::before{position:relative;bottom:3px;left:2px;font-size:12px}.condition-list .add-condition-btn .f-icon-filter-grouping::before{position:relative;bottom:3px;left:1px;font-size:12px}.condition-list .condition-list-content{display:flex}.condition-list .condition-list-content-group{flex:0 0 auto}.condition-list .condition-list-item{padding:4px;display:flex;height:40px}.condition-list .condition-list-item-type{width:200px}.condition-list .condition-list-type button{text-align:left;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.condition-list .condition-list-item-compare{width:134px}.condition-list .condition-list-compare button{text-align:left;position:relative}.condition-list .condition-list-compare .f-icon-arrow-chevron-down::before,.condition-list .condition-list-compare .f-icon-arrowhead-s::before,.condition-list .condition-list-type .f-icon-arrow-chevron-down::before,.condition-list .condition-list-type .f-icon-arrowhead-s::before{position:absolute;right:8px;bottom:4px}.condition-list .condition-list-content .dropdown-toggle::after{display:none}.condition-list .condition-list-item-control{line-height:26px;width:200px}.condition-list .condition-list-item-extend .f-icon{vertical-align:text-bottom}.condition-list .condition-list-item-extend .f-icon:hover{cursor:pointer}.condition-list .condition-list-item-extend .f-icon-plus-sm::before,.condition-list .condition-list-item-extend .f-icon-splus::before{font-size:14px;color:#2a87ff;background-color:#e8f2ff;border-radius:50%;position:relative;top:1px}.condition-list .condition-list-item-extend .f-icon-minus-sm::before,.condition-list .condition-list-item-extend .f-icon-sminus::before{font-size:14px;color:#f46160;background-color:#fadcdd;border-radius:50%;position:relative;top:1px}.condition-list .condition-list-relation{margin:2px 0 2px 12px;border-left:1px solid #dee3f0;position:relative;display:flex;align-items:center;padding-left:12px;font-size:13px;color:#2a87ff;text-align:center;cursor:pointer}.condition-list .condition-list-relation:hover .condition-list-relation-close{display:inline}.condition-list .condition-list-relation-close{position:absolute;top:-4px;display:none}.fv-grid,.fv-grid-header,.fv-grid-header-cell{display:flex;overflow:hidden}.condition-list .condition-list-relation:hover .condition-list-relation-text{text-decoration:underline}.condition-list .condition-list-item .custom-control-label:before{position:relative;top:2px}.condition-list .condition-list-relation button{width:20px}.fv-grid{position:relative;flex-direction:column;border-style:solid;border-width:1px;border-color:transparent;flex:1;color:#424347}.fv-grid-header{position:relative;z-index:2;color:#5a5e66;font-weight:400;border-bottom:1px solid #e4e7ef;background-color:#f4f5f9}.fv-grid-header-corner{background-color:#f4f5f9;border-style:solid;border-width:1px;border-color:transparent;padding:.375rem 0}.fv-grid-header-left-fixed,.fv-grid-header-right-fixed{position:relative;overflow:hidden;background-color:#f4f5f9;z-index:1}.fv-grid-header-left-fixed{box-shadow:4px 0 10px 0 rgba(31,35,41,.06)}.fv-grid-header-right-fixed{box-shadow:-4px 0 10px 0 rgba(31,35,41,.06)}.fv-grid-header-primary{flex:1;position:relative;overflow:hidden;background-color:#f4f5f9}.fv-grid-header-columns{position:relative}.fv-grid-header-cell{position:absolute;border:1px solid transparent;top:0;padding:.4375rem .75rem;line-height:18px;color:#2d2f33;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.fv-grid-header-cell::after{content:"";position:absolute;left:0;top:50%;margin-top:-.5625rem;display:block;height:1.125rem;width:1px;background-color:#e6e9f0}.fv-grid-header-group-columns .fv-grid-header-cell{border-bottom-color:#eaecf3;border-right-color:#eaecf3;padding:0 .75rem;text-align:center}.fv-grid-header-group-columns .fv-grid-header-cell::after{display:none}.fv-grid-content{flex:1;display:flex;position:relative;overflow:hidden;z-index:0;background:#fff}.fv-grid-content-hover{cursor:pointer}.fv-grid-content-side{position:relative}.fv-grid-content-primary{flex:1;position:relative;overflow:hidden}.fv-grid-content-left-fixed,.fv-grid-content-right-fixed{position:relative;overflow:hidden;z-index:1}.fv-grid-content-left-fixed{box-shadow:4px 0 10px 0 rgba(31,35,41,.06);background-color:#fff}.fv-grid-content-right-fixed{box-shadow:-6px 0 6px -4px rgba(0,0,0,.12);background-color:#fff}.fv-grid-data{height:100%}.fv-grid-merge-date{position:absolute;top:0}.fv-grid-row{left:0;position:absolute}.fv-datagrid-strip .fv-grid-row-odd{background-color:#fff}.fv-datagrid-strip .fv-grid-row-even{background-color:#f7f8fb}.fv-grid-row-hover{cursor:pointer;color:#424347;background:#edf5ff!important;border-color:#eaecf3}.fv-grid-row-selected{color:#424347!important;border-color:#95bef1;background-color:#dae9ff!important}.fv-grid-cell,.fv-grid-group-row,.fv-grid-summary-row{border-color:transparent transparent #eaecf3;background-color:transparent;position:absolute;border-style:solid;border-width:1px}.fv-grid-group-row,.fv-grid-summary-row{left:0;font-weight:600}.fv-grid-group-row-icon{width:28px;height:28px;flex-shrink:0;color:rgba(0,0,0,.45);line-height:24px;padding:.25rem .75rem}@keyframes rotate-group-collapse{0%{transform:rotate(0)}100%{transform:rotate(-90deg)}}.fv-grid-group-row-icon-collapse{transform:rotate(-90deg)}.fv-grid-cell{line-height:26px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;top:0;padding:0 .75rem}.fv-grid-wrap-content .fv-grid-cell{text-overflow:initial;overflow:initial;white-space:initial}.fv-grid-cell .f-form-control-textarea,.fv-grid-cell textarea.form-control{min-height:initial}.fv-grid-merged-cell{border-bottom-color:#eaecf3;border-left-color:#eaecf3;background-color:#fff;text-align:center}.fv-grid-sidebar-row{left:0;position:absolute;line-height:24px;border-style:solid;border-width:1px;border-color:transparent transparent #eaecf3;background-color:transparent}.fv-datagrid-strip .fv-grid-sidebar-row-odd{background-color:#fff}.fv-datagrid-strip .fv-grid-sidebar-row-even{background-color:#f7f8fb}.fv-grid-sidebar-row-hover{cursor:pointer;color:#424347;background:#edf5ff!important}.fv-grid-sidebar-row-selected{color:#424347!important;background-color:#dae9ff!important}.fv-grid-sidebar-row-checkbox{vertical-align:middle;margin:.25rem .5rem .25rem 1rem}.fv-grid-sidebar-row-number{display:inline-flex;width:32px;padding:0 .25rem}.fv-grid-content-hover .fv-grid-vertical-scroll{opacity:1}.fv-grid-horizontal-scroll,.fv-grid-vertical-scroll{opacity:0;cursor:default;position:absolute;z-index:1}.fv-grid-vertical-scroll{background-color:transparent;right:0;left:auto!important;width:10px;transition:width .2s linear,opacity .2s linear,background-color .2s linear;height:288px}.fv-grid-vertical-scroll-thumb{transition:background-color .2s linear,width .2s ease-in-out;width:10px;right:0;background-color:rgba(0,0,0,.25);border-radius:10px;position:absolute}.fv-grid-content-hover .fv-grid-horizontal-scroll{opacity:1}.fv-grid-horizontal-scroll{background-color:transparent;bottom:0;top:auto!important;height:10px;transition:width .2s linear,opacity .2s linear,background-color .2s linear;width:812px}.fv-grid-horizontal-scroll-thumb{transition:background-color .2s linear,width .2s ease-in-out;height:10px;bottom:0;background-color:rgba(0,0,0,.25);border-radius:10px;position:absolute}.fv-grid-header-cell>.fv-column-title{flex:1;text-overflow:ellipsis;overflow:hidden;word-break:break-all;white-space:nowrap}.fv-grid-header-cell>.fv-column-resize-bar{display:block;position:absolute!important;top:-2px;bottom:-2px;right:0;margin:0;width:5px;padding:0;cursor:e-resize;border:1px solid transparent}.fv-grid-header-cell:hover>.fv-column-resize-bar{border-right:3px solid #2a87ff;border-top:none}.fv-grid-header-cell:hover>.fv-column-handler{display:block}.fv-grid-header-cell>.fv-column-handler{float:right;cursor:pointer;display:none;color:#2a87ff}.fv-grid-header-cell>.fv-column-handler.fv-column-handler-active{display:block!important;color:#2a87ff}.fv-grid-header-cell>.fv-column-handler:hover{color:#2a87ff}.fv-grid-header-cell>.fv-grid-settings-icon{display:block;cursor:pointer;margin-left:8px}.fv-datagrid-resize-overlay{z-index:98;width:100%;height:100%;cursor:e-resize;background:0 0;position:absolute}.fv-datagrid-resize-proxy{width:1px;border-left:1px dashed #2a87ff;left:0;display:none;position:absolute;height:100%;z-index:99}.fv-datagrid-summary{padding:3px;background-color:#fff}.fv-datagrid-summary .fv-datagird-summary-panel{height:40px;background:linear-gradient(90deg,#eff8f8 0,#fffbeb 100%);border-radius:8px;display:flex;justify-content:space-between}.fv-datagrid-summary-title{line-height:40px;width:100px;padding:0 16px;font-size:14px;font-weight:500}.fv-datagrid-summary-content{display:flex;line-height:40px}.fv-datagrid-summary-field{line-height:40px;margin-right:10px}.fv-datagrid-summary-field-title{font-size:14px;margin:0 16px}.fv-datagrid-summary-field-value{color:#ff6c29;font-size:18px;font-weight:700}.fv-datagrid-pagination{display:flex;flex-direction:row-reverse;background-color:#fff}.fv-column-handler-popover .popover-body{max-width:none}.fv-column-sort-filter-container{width:300px}.fv-column-sort-filter-container .fv-column-filter-section .fv-column-filter-section-title{font-size:15px;margin:10px 0}.fv-column-sort-filter-container .fv-column-filter-section .fv-column-filter-section-editor{margin-bottom:10px;max-height:240px;overflow:hidden;display:flex;flex-direction:column}.fv-column-sort-filter-container .fv-column-sort-filter-footer{display:flex}.fv-column-sort-filter-container .fv-column-sort-filter-footer .fv-column-confirm-section{flex:1;display:flex;flex-direction:row-reverse}.fv-grid-filter-panel{padding:0 6px 4px}.fv-grid-settings{min-width:800px;min-height:480px}.fv-grid-settings .f-btn-icon{color:#878d99!important}.fv-grid-settings .f-btn-icon:hover{color:#529dff!important}.fv-grid-settings .farris-tabs-header-pre{color:#000;font-weight:500}.fv-grid-settings .farris-tabs-header-post,.fv-grid-settings .farris-tabs-header-pre{padding:.75rem .5rem .75rem 1.125rem}.fv-grid-settings .farris-tabs-header{margin:0!important}.fv-grid-settings .container{padding-left:24px;padding-right:24px}.fv-grid-group-panel{border-bottom:1px solid #e4e7ef;background-color:#f4f5f9;height:40px}.fv-grid-hierarchy-cell .custom-checkbox{display:flex;padding-right:0!important;margin:auto 0}.fv-grid-hierarchy-cell .fv-tree-node-toggle,.fv-grid-hierarchy-cell .fv-tree-node-toggle-minus{padding-right:6px}.fv-grid-hierarchy-cell .custom-label{padding-left:1.2rem}.fv-grid-hierarchy-cell div#treeNodeIcons{margin:auto 5px auto 0;color:#a5a6ab}.fv-grid-hierarchy-cell .fv-tree-node-toggle::before{font-family:FarrisIcons;color:#d8dce6;content:"\e11f"}.fv-grid-hierarchy-cell .fv-tree-node-toggle-minus::before{font-family:FarrisIcons;color:#d8dce6;content:"\e122"}.fv-grid-hierarchy-cell .fv-tree-node-toggle:hover::before{color:#59a1ff}.f-datepicker-container{display:flex;position:absolute;margin:.25rem 0 0;padding:0;box-shadow:0 2px 20px 0 rgba(3,18,51,.12);background:var(--f-neutral-20);border-radius:10px;z-index:9999;animation:selectorfadein 60ms;box-sizing:border-box;color:var(--f-text-01);flex-wrap:wrap;font-family:PingFangSC-Regular,Arial}.f-datepicker-container:focus{border:none;outline:0}.f-datepicker-container .arrow{display:none;width:1rem;height:6px;margin:0;position:absolute;left:8px}.f-datepicker-container .arrow::after,.f-datepicker-container .arrow::before{content:"";border-color:transparent;border-style:solid;position:absolute;display:block;border-width:0 6px 6px}.f-datepicker-container .arrow::after{top:1px}.f-datepicker-container .arrow::before{top:0}.f-datepicker-container.container-position-bottom .arrow{top:-6px}.f-datepicker-container.container-position-bottom .arrow::after,.f-datepicker-container.container-position-bottom .arrow::before{border-width:0 6px 6px;border-bottom-color:#fff}.f-datepicker-container.container-position-top{margin:-6px}.f-datepicker-container.container-position-top .arrow{top:auto;bottom:-6px}.f-datepicker-container.container-position-top .arrow::after,.f-datepicker-container.container-position-top .arrow::before{border-width:6px 6px 0;border-top-color:#fff}.f-datepicker-container .f-datepicker-sidebar{position:absolute;top:0;bottom:0;width:100px;border-right:1px solid var(--f-neutral-13);box-sizing:border-box;padding-top:6px;background-color:#fff;overflow:auto}.f-datepicker-container .f-datepicker-sidebar button{display:block;width:100%;border:0;background-color:transparent;line-height:28px;font-size:14px;color:#606266;padding-left:12px;text-align:left;outline:0;cursor:pointer}.f-datepicker-container .f-datepicker-sidebar button:hover{color:#409eff}.f-datepicker-container .f-datepicker-content{width:287px}.f-datepicker-container .f-datepicker-content .f-datepicker-header{display:flex;justify-content:space-between;border-bottom:1px solid var(--f-neutral-13)}.f-datepicker-container .f-datepicker-content .f-datepicker-header .f-datepicker-prev-btn{padding-left:1rem}.f-datepicker-container .f-datepicker-content .f-datepicker-header .f-datepicker-prev-btn .f-datepicker-header-btn{color:var(--f-text-02);padding:1px 8px 1px 0}.f-datepicker-container .f-datepicker-content .f-datepicker-header .f-datepicker-next-btn{padding-right:1rem}.f-datepicker-container .f-datepicker-content .f-datepicker-header .f-datepicker-next-btn .f-datepicker-header-btn{color:var(--f-text-02);padding:1px 0 1px 8px}.f-datepicker-container .f-datepicker-content .f-datepicker-header .f-datepicker-header-btn{height:40px;outline:0;border:0;background:var(--f-neutral-20);line-height:35px;font-size:14px;padding:1px 4px;cursor:pointer}.f-datepicker-container .f-datepicker-content .f-datepicker-header .f-datepicker-header-btn:hover{color:var(--f-theme-05)}.f-datepicker-container .f-datepicker-content .f-datepicker-header .f-datepicker-header-btn:active{color:var(--f-theme-01)}.f-datepicker-container .f-datepicker-content .f-datepicker-header .f-datepicker-header-btn.f-datepicker-header-btn-disabled,.f-datepicker-container .f-datepicker-content .f-datepicker-header .f-datepicker-header-btn.f-datepicker-header-btn-disabled:active,.f-datepicker-container .f-datepicker-content .f-datepicker-header .f-datepicker-header-btn.f-datepicker-header-btn-disabled:hover{color:var(--f-text-07)}.f-datepicker-container .f-datepicker-content .f-datepicker-header .f-datepicker-monthYearText .f-datepicker-header-btn{color:var(--f-text-02)}.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper{width:100%;height:254px;padding:8px 12px}.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table{width:100%;height:100%;max-width:100%;background-color:transparent;border-collapse:collapse;text-align:center;border:0}.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table th{font-weight:400;color:var(--f-text-08)}.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table tr.f-datepicker-selectWeek{cursor:pointer;transition:all .3s}.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table tr.f-datepicker-selectWeek:not(.f-datepicker-selectedWeek):hover{background:var(--f-neutral-10)}.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table tr.f-datepicker-selectedWeek{background:var(--f-neutral-09)}.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table td{padding:0;position:relative}.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table td:focus{border:0;outline:0;box-shadow:none}.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table td.f-datepicker-weeknbr{color:f-text-05}.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table td .f-datepicker-date:hover,.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table td .f-datepicker-month:hover,.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table td .f-datepicker-year:hover,.f-datepicker-container .f-datepicker-select-btn:hover{color:var(--f-theme-05)}.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table td.f-datepicker-range::before{position:absolute;top:3px;right:0;bottom:3px;left:0;display:block;background:var(--f-neutral-10);border:0;border-radius:0;content:""}.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table td .f-datepicker-markdate{position:absolute;top:5px;left:5px;width:4px;height:4px;border-radius:50%}.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table td .f-datepicker-date,.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table td .f-datepicker-month,.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table td .f-datepicker-year{display:block;padding:0;margin:0 auto;text-align:center;background:0 0;border-radius:2px;transition:all .3s ease;cursor:pointer}.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table td .f-datepicker-date:active,.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table td .f-datepicker-month:active,.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table td .f-datepicker-year:active{color:var(--f-theme-01)}.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table td .f-datepicker-date{width:28px;height:28px;line-height:28px;position:relative;z-index:1;border:1px solid transparent;border-radius:100%}.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table td .f-datepicker-month-cell,.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table td .f-datepicker-year-cell{display:inline-block;padding:3px 8px;line-height:20px;border-radius:100%;border:1px solid transparent}.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table td .f-datepicker-current{border:1px solid var(--f-theme-03);color:var(--f-theme-03);background:#fff;box-shadow:0 0 4px 2px rgba(var(--f-theme-03),.12)}.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table td .f-datepicker-range{color:var(--f-theme-03);border:1px solid var(--f-aid-02);background:var(--f-aid-02)}.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table td .f-datepicker-selected{border:1px solid transparent;background:linear-gradient(214deg,#3F65FF 0,#4D9AFF 100%);color:#fff;border-radius:100%;box-shadow:0 2px 6px 0 rgba(var(--f-theme-03),.4)}.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table td .f-datepicker-selected:hover{color:#fff}.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table td .f-datepicker-highlight{background:#75abf2;color:#fff}.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table td .f-datepicker-highlight:hover{color:#fff}.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table td.f-datepicker-no-currmonth{color:var(--f-text-07)}.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table td .f-datepicker-disabled{background-color:var(--f-neutral-09);color:var(--f-text-07)}.f-datepicker-container .f-datepicker-content .f-datepicker-table-wrapper .f-datepicker-table td .f-datepicker-disabled:hover{color:var(--f-text-07)}.f-datepicker-container .datepicker-content-has-timer .time-picker-panel{display:flex;bottom:0}.f-datepicker-container .datepicker-content-has-timer .time-picker-panel .farris-timer-picker{display:flex;flex:1 1 0}.f-datepicker-container .datepicker-content-has-timer .time-picker-panel .farris-timer-picker .time-picker-panel-inner{box-shadow:none;display:flex;flex:1 1 0}.f-datepicker-container .datepicker-content-has-timer .time-picker-panel .farris-timer-picker .time-picker-panel-inner .time-picker-panel-combobox{flex:1 1 0;overflow:hidden}.f-datepicker-container .datepicker-content-has-timer .time-picker-panel .farris-timer-picker .time-picker-panel-inner .time-picker-panel-combobox .time-picker-panel-select{height:100%;max-height:none}.f-datepicker-container .f-datepicker-commitBtn-wrapper{width:100%;text-align:right;height:2.8125rem;display:flex;align-items:center;padding:0 1.5rem;border-top:1px solid var(--f-neutral-13)}.f-datepicker-container .f-datepicker-select-btn{outline:0;border:0;cursor:pointer;flex-shrink:1;flex-grow:1;flex-basis:0}.f-datepicker-container .datepicker-multi-days-wrapper{border-left:1px solid var(--f-neutral-13)}.f-datepicker-multi-selectdays-header{border-bottom:1px solid var(--f-neutral-13)}.f-datepicker-multi-selectdays-clear{color:var(--f-text-09)}.f-datepicker-multi-selectdays-clear:hover{color:var(--f-theme-05)}.f-datepicker-multi-selectdays{color:var(--f-text-02)}.f-datepicker-multi-selectdays:hover{background:var(--f-neutral-10);color:var(--f-text-02)}.f-datepicker-multi-selectdays .remove{color:var(--f-text-09)}.f-datepicker-multi-selectdays .remove:hover{color:var(--f-theme-05)}.f-cmp-datepicker .date-range-wrapper{display:flex;padding-top:0;padding-bottom:0;align-items:center;flex-shrink:1;flex-grow:1;flex-basis:0%;background:0 0}.f-cmp-datepicker .date-range-wrapper .sub-input{outline:0;border:0;height:100%;display:block;width:100%}.f-cmp-datepicker .date-range-wrapper .sub-input.form-control{width:100%;padding:0}.f-cmp-datepicker .date-range-wrapper .sub-input-wrapper-end{flex:1 1 auto}.f-cmp-datepicker .date-range-wrapper .sub-input-wrapper{position:relative}.f-cmp-datepicker .date-range-wrapper .sub-input-wrapper::after{content:"";position:absolute;height:1px;background:var(--f-theme-04);left:0;bottom:0;width:0;transition:all .3s linear}.dropdown,.dropdown-left,.dropdown-submenu,.dropleft,.dropleft-up,.dropright,.dropright-up,.dropup,.dropup-left{position:relative}.f-cmp-datepicker .date-range-wrapper .sub-input-spliter{margin:0 4px;flex-shrink:0;line-height:1;font-size:12px;color:var(--f-text-04)}.f-cmp-datepicker .date-range-wrapper .sub-input-wrapper.f-state-focus::after{width:100%}.f-cmp-datepicker .input-group{display:flex}.f-cmp-datepicker .input-group.f-state-focus{border-color:var(--f-theme-08);box-shadow:0 0 0 2px rgba(var(--f-theme-03),.14)}.f-cmp-datepicker .input-group.f-state-disabled,.f-cmp-datepicker .input-group.f-state-readonly{box-shadow:none}@keyframes selectorfadein{from{opacity:0}to{opacity:1}}.f-datepicker-footer{display:flex;justify-content:space-between;border-top:1px solid #e4e7ef}.f-datepicker-footer .f-datepicker-redirect{margin:4px auto;line-height:32px;font-size:1rem}.f-datepicker-footer .f-datepicker-redirect>button{font-size:14px;font-weight:800}.f-dial .f-dial-range,.f-dial .f-dial-value{fill:none}.f-dial .f-dial-text{font-size:1.3rem;text-align:center}.f-discussion-group-edit{border:1px solid var(--f-neutral-04)!important;background:var(--f-neutral-12)!important}.f-discussion-group-edit .f-discussion-group-edit-container .textarea-editor a{color:var(--f-theme-03)}.f-discussion-group-edit .f-discussion-group-edit-footer{background:var(--f-neutral-09)}.f-discussion-group-edit .f-discussion-group-edit-footer .f-discussion-group-edit-toolbar .f-discussion-group-edit-toolbar-item{color:var(--f-text-06)}.f-discussion-group-edit .f-discussion-group-edit-footer .f-discussion-group-edit-toolbar .f-discussion-group-edit-toolbar-item .toolbar-icon{color:var(--f-text-08)}.f-discussion-group-edit .f-discussion-group-edit-footer .f-discussion-group-edit-toolbar .f-discussion-group-edit-toolbar-about .f-discussion-group-about-dropdown{background:var(--f-neutral-20)!important;box-shadow:0 2px 20px 0 rgba(3,18,51,.12)!important}.f-discussion-group-edit .f-discussion-group-edit-footer .f-discussion-group-edit-toolbar .f-discussion-group-edit-toolbar-about .f-discussion-group-about-dropdown .f-discussion-group-about-dropdown-list-item .f-discussion-group-about-dropdown-list-detail .about-list-detail-text{color:var(--f-text-02)}.f-discussion-group-edit .f-discussion-group-edit-footer .f-discussion-group-edit-toolbar .f-discussion-group-edit-toolbar-about .f-discussion-group-about-dropdown .f-discussion-group-about-dropdown-list-item .f-discussion-group-about-dropdown-list-detail .about-list-detail-subtext{color:var(--f-text-06)}.f-discussion-group-edit .f-discussion-group-edit-footer .f-discussion-group-edit-toolbar .f-discussion-group-edit-toolbar-about .f-discussion-group-about-dropdown .f-discussion-group-about-dropdown-list-item .f-icon-check,.f-discussion-group-edit .f-discussion-group-edit-footer .f-discussion-group-edit-toolbar .f-discussion-group-edit-toolbar-about .f-discussion-group-about-dropdown .f-discussion-group-about-dropdown-list-item .f-icon-tick::before{border:1px solid var(--f-neutral-02);color:#fff}.f-discussion-group-edit .f-discussion-group-edit-footer .f-discussion-group-edit-toolbar .f-discussion-group-edit-toolbar-about .f-discussion-group-about-dropdown .f-discussion-group-about-dropdown-list-item.active .f-icon-check,.f-discussion-group-edit .f-discussion-group-edit-footer .f-discussion-group-edit-toolbar .f-discussion-group-edit-toolbar-about .f-discussion-group-about-dropdown .f-discussion-group-about-dropdown-list-item.active .f-icon-tick::before{background:linear-gradient(214deg,#3F65FF 0,#4D9AFF 100%)}.f-discussion-group-edit .f-discussion-group-edit-footer .f-discussion-group-edit-toolbar .f-discussion-group-edit-toolbar-about .f-discussion-group-about-dropdown .f-discussion-group-about-dropdown-list-item .about-list-item-avatar-tip{background-color:linear-gradient(214deg,#3F65FF 0,#4D9AFF 100%);color:#fff}.f-discussion-group-edit .f-discussion-group-edit-footer .f-discussion-group-edit-toolbar .f-discussion-group-edit-toolbar-about .f-discussion-group-about-dropdown .f-discussion-group-about-dropdown-list-item:not(.about-dropdown-list-item-empty):hover{background:var(--f-neutral-11)}.f-discussion-group-edit .f-discussion-group-edit-footer .f-discussion-group-edit-toolbar .f-discussion-group-edit-toolbar-about .f-discussion-group-about-dropdown .f-about-list-btns{border-top:1px solid var(--f-neutral-06)!important;background:var(--f-neutral-09)!important}.f-discussion-dialog-content-left .f-discussion-tab-content,.f-discussion-dialog-content-right{border:1px solid var(--f-neutral-04)}.f-discussion-group-edit .f-discussion-group-edit-footer .f-discussion-group-edit-toolbar .f-discussion-group-edit-toolbar-dropdown .toolbar-icon{color:var(--f-text-09)}.f-discussion-group-edit .f-discussion-group-edit-footer .f-discussion-group-edit-toolbar .f-discussion-group-edit-toolbar-dropdown .toolbar-dropdown-list{background:0 2px 20px 0 rgba(3,18,51,.12);box-shadow:var(--f-neutral-20)}.f-discussion-group-edit .f-discussion-group-edit-footer .f-discussion-group-edit-toolbar .f-discussion-group-edit-toolbar-dropdown .toolbar-dropdown-list ul li:hover{background:var(--f-neutral-11)}.f-discussion-group-edit .f-discussion-group-edit-footer .f-discussion-group-edit-btns .f-discussion-cancel,.farris-discussion-group-reply-tip{color:var(--f-text-04)}.f-discussion-dialog-content-left .f-discussion-tab-content .f-discussion-personnel-content .f-discussion-personnel-crumbs .crumbs-list-item{color:var(--f-text-02)}.f-discussion-dialog-content-left .f-discussion-tab-content .f-discussion-personnel-content .f-discussion-personnel-crumbs .crumbs-list-item.crumbs-list-item-disabled{color:var(--f-text-07)}.f-discussion-dialog-content-right .f-discussion-selected-personnel-header{background:var(--f-neutral-09)}.f-discussion-dialog-content-right .f-discussion-selected-personnel-content .f-discussion-selected-list .f-discussion-selected-item-text .f-discussion-selected-name{color:var(--f-text-02)}.f-discussion-dialog-content-right .f-discussion-selected-personnel-content .f-discussion-selected-list .f-discussion-selected-item-tip{color:var(--f-text-09)}.f-discussion-dialog-content-right .f-discussion-selected-personnel-content .f-discussion-selected-list .f-discussion-selected-item-remove{color:var(--f-theme-05)}.f-discussion-dialog-content-right .f-discussion-selected-personnel-content .f-discussion-selected-list .f-discussion-selected-item:hover{background:var(--f-neutral-11)}.f-discussion-dialog-content .f-discussion-personnel-item:hover,.f-listview-active .f-tmpl-card--header-multicontent01,.f-listview-active .f-tmpl-list--columns01{background:var(--f-aid-03)}.f-discussion-dialog-content .f-discussion-personnel-item-text .f-discussion-personnel-name{color:var(--f-text-01)}.f-discussion-dialog-content .f-discussion-personnel-item-text .f-discussion-personnel-mail{color:var(--f-text-06)}.f-discussion-dialog-content .f-discussion-personnel-item.active,.f-discussion-dialog-content .f-discussion-personnel-item.selected{background:var(--f-aid-02)}.f-discussion-dialog-content .f-discussion-personnel-item.selected .f-discussion-personnel-mail,.f-discussion-dialog-content .f-discussion-personnel-item.selected .f-discussion-personnel-name{color:#c1c1c1}.f-discussion-dialog-content .f-discussion-section-list-empty .f-icon{color:var(--f-text-08)}.f-discussion-dialog-content .f-discussion-section-list-empty .section-list-empty-text{color:var(--f-text-09)}.f-discussion-dialog-content .f-discussion-personnel-item-tip{color:#fff;background-color:#4796FF}.f-discussion-dialog-content .f-discussion-section-list .section-list-item-name{color:var(--f-text-02);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.f-discussion-dialog-content .f-discussion-section-list .section-list-item-next{color:var(--f-theme-03)}.f-discussion-dialog-content .f-discussion-section-list .section-list-item-next::before{background:var(--f-neutral-06)}.f-discussion-dialog-content .f-discussion-section-list .section-list-item:hover{background:var(--f-neutral-11)}.f-discussion-dialog-content .f-discussion-section-list .person-list-item-content .section-list-item-name{color:var(--f-text-02)}.f-discussion-dialog-content .f-discussion-section-list .person-list-item-content .section-list-item-tip{color:var(--f-text-09)}.f-discussion-person-list-page .section-page-text{color:var(--f-text-05)}.f-discussion-person-list-page:hover .section-page-text{color:var(--f-text-02)}.f-discussion-group-content-item .discussion-item-avatar-tip{color:var(--f-text-00);background-color:var(--f-theme-05)}.dropdown-menu,.f-discussion-group-content-item .discussion-item-inner .discussion-item-username{color:var(--f-text-02)}.f-discussion-group-content-item .discussion-item-inner{border-bottom:1px solid var(--f-neutral-06)}.dropdown-item,.f-discussion-group-content-item .discussion-item-inner .discussion-item-text,.f-discussion-group-content-item .discussion-item-inner .discussion-item-text-reply-content,.f-discussion-group-content-item .discussion-item-inner .discussion-item-text-reply-title{color:var(--f-text-04)}.f-discussion-group-content-item .discussion-item-inner .discussion-item-text-reply{background:var(--f-neutral-09)!important;border-radius:6px!important}.f-discussion-group-content-item .discussion-item-inner .discussion-item-text-reply-title .discussion-item-text-reply-name{color:rgba(var(--f-theme-05),.8)}.f-discussion-group-content-item .discussion-item-inner .discussion-item-footer .discussion-item-time{color:var(--f-text-09)}.f-discussion-group-content-item .discussion-item-inner .discussion-item-footer .discussion-item-btns .discussion-item-btns-start .discussion-item-btns-start-text,.f-discussion-group-content-item .discussion-item-inner .discussion-item-footer .discussion-item-btns .discussion-item-btns-start .f-icon{color:var(--f-text-12)!important}.f-discussion-group-content-item .discussion-item-inner .discussion-item-footer .discussion-item-btns .discussion-item-btns-start:hover .discussion-item-btns-start-text,.f-discussion-group-content-item .discussion-item-inner .discussion-item-footer .discussion-item-btns .discussion-item-btns-start:hover .f-icon{color:var(--f-theme-05)!important}.f-discussion-group-content-item .discussion-item-inner .discussion-item-footer .discussion-item-btns .discussion-item-btns-start:active .discussion-item-btns-start-text,.f-discussion-group-content-item .discussion-item-inner .discussion-item-footer .discussion-item-btns .discussion-item-btns-start:active .f-icon{color:var(--f-theme-01)!important}.f-discussion-group-content-item .discussion-item-inner .discussion-item-text .discussion-item-text-message a{color:var(--f-theme-03)!important}.f-discussion-group-content-item .discussion-item-inner .discussion-item-text .discussion-item-text-message a:hover{color:var(--f-theme-05)!important}.f-discussion-group-content-item .discussion-item-inner .discussion-item-text .discussion-item-text-message a:active{color:var(--f-theme-01)!important}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.125rem;vertical-align:.125rem;content:"";border-top:.25rem solid;border-right:.25rem solid transparent;border-bottom:0;border-left:.25rem solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:300;display:none;float:left;min-width:10rem;padding:.25rem;margin:.25rem 0;font-size:.8125rem;text-align:left;list-style:none;background-color:var(--f-neutral-20);background-clip:padding-box;border:0 solid rgba(0,0,0,.15);border-radius:6px;box-shadow:0 2px 20px 0 rgba(3,18,51,.12)}.dropup .dropdown-toggle::after,.dropup-left .dropdown-toggle::after{display:inline-block;width:0;height:0;vertical-align:.125rem;content:"";border-right:.25rem solid transparent;border-bottom:.25rem solid;border-left:.25rem solid transparent;border-top:0}.dropdown-menu-right{right:0;left:auto}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.25rem}.dropup .dropdown-toggle::after{margin-left:.125rem}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropup-left .dropdown-menu{top:auto;right:0;left:auto;bottom:100%;margin-top:0;margin-bottom:.25rem}.dropup-left .dropdown-toggle::after{margin-left:.125rem}.dropright .dropdown-toggle::after,.dropright-up .dropdown-toggle::after{display:inline-block;width:0;height:0;content:"";border-left:.25rem solid;vertical-align:0;border-top:.25rem solid transparent;border-right:0}.dropup-left .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.25rem}.dropright .dropdown-toggle::after{margin-left:.125rem;border-bottom:.25rem solid transparent}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright-up .dropdown-menu{top:auto;right:auto;left:100%;bottom:0;margin-top:0;margin-left:.25rem}.dropright-up .dropdown-toggle::after{margin-left:.125rem;border-bottom:.25rem solid transparent}.dropleft .dropdown-toggle::before,.dropleft-up .dropdown-toggle::before{width:0;border-right:.25rem solid;border-bottom:.25rem solid transparent;height:0;content:""}.dropright-up .dropdown-toggle:empty::after{margin-left:0}.dropleft-up .dropdown-menu{top:auto;right:100%;left:auto;bottom:0;margin-top:0;margin-bottom:.25rem}.dropleft-up .dropdown-toggle::after{width:0;height:0;margin-left:.125rem;vertical-align:.125rem;content:"";display:none}.dropleft-up .dropdown-toggle::before{display:inline-block;margin-right:.125rem;border-top:.25rem solid transparent;vertical-align:0}.dropleft-up .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.25rem}.dropleft .dropdown-toggle::after{width:0;height:0;margin-left:.125rem;vertical-align:.125rem;content:"";display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.125rem;border-top:.25rem solid transparent;vertical-align:0}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;overflow:hidden;border-top:1px solid var(--f-neutral-06)}.dropdown-item{display:block;line-height:1.25rem;clear:both;font-weight:400;text-align:inherit;white-space:nowrap;background-color:transparent;border:0;cursor:pointer;border-radius:6px}.dropdown-item:focus,.dropdown-item:hover{color:var(--f-text-02);text-decoration:none;background-color:var(--f-neutral-11)}.dropdown-item.active,.dropdown-item:active{color:var(--f-text-02);text-decoration:none;background-color:var(--f-neutral-10)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--f-text-09);background-color:transparent;cursor:default}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.25rem .5rem;margin-bottom:0;font-size:.75rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.3125rem .5rem;color:var(--f-text-04)}.dropdown-divider{margin:.25rem 0}.btn-group .btn+.dropdown-toggle-split{margin-left:-1px}.btn-group .btn-primary+.dropdown-toggle-split{margin-left:-1px;border-left-color:var(--f-neutral-06)}.dropdown-item{padding:.25rem .5rem}.dropdown-left>.dropdown-menu{right:0;left:auto}.dropleft>.dropdown-menu{top:0;right:100%;left:auto!important;margin-right:-1px}.dropdown-submenu .dropdown-item.dropdown-toggle{padding-right:1rem}.dropdown-submenu>.dropdown-toggle.dropdown-toggle-split{position:absolute;width:24px;height:24px;top:50%;right:0;left:auto;margin-top:-12px;cursor:pointer;border-radius:4px;text-align:center}.dropdown-submenu>.dropdown-toggle.dropdown-toggle-split:hover{color:var(--f-text-04);background:var(--f-aid-02)}.dropdown-item .btn-link,.dropdown-item .btn-link:hover,.f-btn-icon.f-bare,.f-btn-icon.f-bare.f-state-active,.f-btn-icon.f-bare.f-state-hover,.f-btn-icon.f-bare:active,.f-btn-icon.f-bare:hover,.f-btn-icon.f-bare:hover.f-state-active,.f-btn-icon.f-bare:hover:active{color:inherit}.dropdown-submenu>.dropdown-item.dropdown-toggle::after,.dropdown-submenu>.dropdown-item.dropdown-toggle::before{position:absolute;top:50%;right:9px;left:auto;margin-top:-4px}.dropdown-submenu.dropleft>.dropdown-item.dropdown-toggle::before,.dropdown-submenu.dropright>.dropdown-item.dropdown-toggle::before{margin-top:-.25rem}.btn-group .btn-secondary+.dropdown-toggle-split,.dropright>.dropdown-menu{margin-left:-1px}.f-response-content .dropdown-item.f-rt-btn,.f-response-content .dropdown-item.f-rt-toggle{cursor:pointer}.f-response-content .dropdown-item.f-rt-btn.disabled,.f-response-content .dropdown-item.f-rt-toggle.disabled{cursor:default}.farris-dropdown.btn-group .dropdown-menu{max-height:unset!important;width:unset!important}.f-filter-footer .footer-container,.f-sort-editor .footer-container{height:2rem;min-height:2rem;background-color:var(--f-neutral-07);line-height:2rem;flex-shrink:0}.f-list-filter .filter-expand{color:var(--f-text-07);cursor:pointer}.f-list-filter .filter-expand:hover{color:var(--f-theme-05)}.f-list-filter .filter-expand.active{color:var(--f-theme-03);background:rgba(var(--f-theme-05),.1)}.f-list-filter .filter-expand .filter-expand-tag{background-color:var(--f-semantic-danger-01)}.f-list-filter .filter-inputs-extend{border:none;background:var(--f-neutral-20)}.f-filter-wrapper .f-filter-inputs-extend .f-filter-typelist-arrow,.f-list-filter .filter-inputs-extend .filter-typelist-arrow{background:0 0;border-top-color:var(--f-neutral-20);border-right-color:transparent;border-bottom-color:transparent;border-left-color:var(--f-neutral-20)}.f-list-filter .filter-inputs-extend .filter-typelist-arrow{box-shadow:-2px -2px 5px rgba(0,0,0,.08)}.f-list-filter .filter-inputs-extend .filter-form-btns .filter-form-btn-reset::after{background:var(--f-neutral-06)}.f-list-filter .filter-search-btn-reset{color:var(--f-text-04)}.f-list-filter .filter-search-btn-reset:hover{color:var(--f-theme-05)}.f-list-filter .filter-inputs-extend{box-shadow:0 0 5px 0 rgba(0,0,0,.15)!important;border-radius:10px}.f-filter{display:block;flex-grow:1;flex-shrink:1;flex-basis:0;max-width:100%}.f-filter-wrapper{display:flex;align-items:flex-start;position:relative}.f-filter-wrapper .f-filter-wrapper-inner{display:flex;align-items:flex-start}.f-filter-wrapper .f-filter-wrapper-inner .f-filter-extend-btn{display:flex;align-items:center;flex-shrink:0;height:26px;line-height:26px;padding-left:10px}.f-filter-wrapper .f-filter-wrapper-inner .f-filter-extend-btn .extend-btn-text{margin-right:2px}.f-filter-wrapper .f-filter-wrapper-inner .f-filter-extend-btn .extend-btn-arrow{margin-left:8px}.f-filter-wrapper .f-filter-wrapper-inner .f-filter-extend-btn-advanced{flex-shrink:0;width:24px;height:24px;margin-left:21px;line-height:24px;color:var(--f-text-07);cursor:pointer}.f-filter-wrapper .f-filter-wrapper-inner .f-filter-extend-btn-advanced:hover{color:var(--f-theme-05)}.f-filter-wrapper .f-filter-wrapper-inner .f-filter-extend-btn-advanced.active{box-shadow:0 2px 5px 0 rgba(0,0,0,.15);color:var(--f-theme-01);background:rgba(var(--f-theme-03),.1);border-radius:2px}.f-filter-wrapper .f-filter-wrapper-inner .f-filter-extend-btn-advanced .f-icon{display:block;line-height:24px;margin:0 auto;font-size:18px}.f-filter-wrapper .f-filter-wrapper-inner .f-filter-extend-btn-advanced .filter-expand-tag{position:absolute;right:0;top:0;display:block;width:6px;height:6px;background-color:#f5222d;border-radius:50%}.f-filter-wrapper .f-filter-inputs-extend{width:429px;right:0;top:38px;border-radius:10px;background-color:var(--f-neutral-20);box-shadow:0 0 5px 0 rgba(0,0,0,.15);z-index:101;padding:20px 0}.f-filter-wrapper .f-filter-inputs-extend .f-filter-typelist-arrow{display:block;position:absolute;right:7px;top:-4px;width:8.49px;height:8.49px;border-style:solid;border-width:4.24px;box-shadow:-2px -2px 5px rgba(0,0,0,.08);transform:translateX(-50%) rotate(45deg)}.f-filter-wrapper .f-filter-inputs-extend .f-filter-form-btns{margin-top:6px;padding:0 14px}.f-filter-wrapper .f-filter-inputs-extend .f-filter-form-btns .btn{margin-left:6px}.f-filter-wrapper .f-filter-inputs-extend .f-filter-form-btns .filter-form-btn-reset{position:relative;padding-right:10px;margin-right:4px}.f-filter-wrapper .f-filter-inputs-extend .f-filter-form-btns .filter-form-btn-reset::after{content:"";position:absolute;right:0;top:50%;width:1px;height:16px;margin-top:-8px;background:#d9d9d9}.f-filter-wrapper .f-filter-main{display:flex}.f-filter-wrapper .f-filter-main .f-filter-list-wrapper{max-width:100%;margin-right:26px;overflow:hidden}.f-filter-wrapper .f-filter-list{display:flex;align-items:center;flex-wrap:nowrap;height:26px}.f-filter-wrapper .f-filter-list .f-filter-item{display:flex;align-items:center;flex-shrink:0;position:relative;height:26px;line-height:26px;margin-right:8px;font-size:13px;color:var(--f-text-02);border:1px solid #fff;border-radius:3px;cursor:pointer}.f-filter-wrapper .f-filter-list .f-filter-item-text{flex-shrink:0;color:var(--f-text-04)}.f-filter-wrapper .f-filter-list .f-filter-item-content{margin-left:4px;color:var(--f-text-02);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.f-filter-wrapper .f-filter-list .f-filter-item-arrow{flex-shrink:0;margin-left:8px;color:var(--f-text-04)}.f-filter-wrapper .f-filter-list .f-filter-item.f-filter-item-edit,.f-filter-wrapper .f-filter-list .f-filter-item:hover{background:rgba(var(--f-aid-05),.35);border-color:var(--f-aid-05)}.f-filter-wrapper .f-filter-list .f-filter-item.f-filter-item-actived{background:rgba(var(--f-aid-05),.35);border:1px solid var(--f-aid-05);border-radius:3px}.f-filter-wrapper .f-filter-list .f-filter-item.f-filter-item-actived:hover .f-filter-item-clear{display:flex}.f-filter-wrapper .f-filter-list .f-filter-item.f-filter-item-actived:hover .f-filter-item-arrow{opacity:0}.f-filter-wrapper .f-filter-list .f-filter-item-clear{display:none;flex-direction:column;justify-content:center;position:absolute;right:2px;top:0;bottom:0;cursor:pointer}.f-filter-wrapper .f-filter-list .f-filter-item-clear .f-icon{font-size:12px;color:#6388FF}.f-filter-wrapper .f-filter-list .f-filter-item-required{flex-shrink:0;margin-right:2px}.f-filter-wrapper .f-filter-list.f-filter-list-extend .f-filter-item-last,.f-filter-wrapper .f-filter-toolbars .btn,.form-group--has-tips .farris-input-wrap{margin-right:18px}.f-filter-wrapper .f-filter-list .f-filter-item-inner{display:flex;align-items:center;max-width:286px}.f-filter-wrapper .f-filter-list.f-filter-list-extend{height:auto}.f-filter-wrapper .f-filter-list.f-filter-list-extend .f-filter-item{margin-bottom:6px}.f-filter-wrapper .f-filter-list-ellipsis{flex-shrink:0;width:48px;height:26px;line-height:20px;padding-right:18px;text-align:center;cursor:pointer}.f-filter-wrapper .f-filter-toolbars{flex-shrink:0;display:flex;align-items:center;padding:3px 0}.f-filter-wrapper .f-filter-list-extend .f-filter-toolbars{margin-bottom:8px}.f-filter-wrapper .f-filter-item-reminder{position:absolute;top:calc(100% - 6px);left:0;padding-top:11px;z-index:100}.f-filter-wrapper .f-filter-item-reminder .reminder-arrow{position:absolute;top:2px;left:10%}.f-filter-wrapper .f-filter-item-reminder .reminder-arrow::after{position:absolute;top:2px;display:block;content:"";border-color:transparent;border-style:solid;border-width:0 6px 8px;border-bottom-color:var(--f-theme-03)}.f-filter-wrapper .f-filter-item-reminder .reminder-inner{padding:8px 12px;font-size:13px;color:#fff;white-space:nowrap;background:linear-gradient(46deg,#2E77FF 0,#2A87FF 100%);box-shadow:2px 2px 8px 0 rgba(0,0,0,.14);border-radius:10px}.f-filter-wrapper .f-filter-item-reminder .reminder-inner .f-icon{margin-right:6px;font-size:13px}.f-filter-panel-form .filter-type-checkboxgroup .farris-form-group .farris-input-wrap .custom-checkbox,.f-filter-panel-form .filter-type-radio .farris-form-group .farris-input-wrap .custom-radio{margin-bottom:0;margin-top:0}.f-filter-panel-form .filter-type-checkboxgroup .farris-form-group .farris-input-wrap .custom-checkbox:last-child,.f-filter-panel-form .filter-type-radio .farris-form-group .farris-input-wrap .custom-radio:last-child{margin-bottom:0}.f-filter-panel-form .filter-type-checkboxgroup .farris-form-group .farris-input-wrap .custom-checkbox .custom-control-label,.f-filter-panel-form .filter-type-radio .farris-form-group .farris-input-wrap .custom-radio .custom-control-label{display:block;width:100%;line-height:30px}.f-filter-panel-form .filter-type-checkboxgroup .farris-form-group .farris-input-wrap .custom-checkbox .custom-control-label::before,.f-filter-panel-form .filter-type-radio .farris-form-group .farris-input-wrap .custom-radio .custom-control-label::before{top:8px}.f-filter-panel-form .filter-type-checkboxgroup .farris-form-group .farris-input-wrap .custom-checkbox:hover,.f-filter-panel-form .filter-type-radio .farris-form-group .farris-input-wrap .custom-radio:hover{background-color:var(--f-neutral-11)}.f-sidebar-filter-main .f-sidebar-filter-footer{display:flex;align-items:center;justify-content:space-between!important;height:72px!important;padding:10px 24px!important;border-top:1px dashed #eaedf3!important;background:var(--f-neutral-00)!important}.f-sidebar-filter-main .f-sidebar-header .f-tmpl-for-title-withline::before{display:none}.f-sidebar-filter-main .f-sidebar-filter-content{padding:24px 48px 24px 12px!important}.f-sidebar-filter-main .f-sidebar-filter-content .farris-form-controls-inline .farris-group-wrap .form-group{margin-bottom:10px}.f-sidebar-filter-main .f-sidebar-filter-btns .btn{height:32px;margin-right:12px}.f-sidebar-filter-main .f-sidebar-filter-btns .f-sidebar-filter-btn-confirm{padding-left:66px;padding-right:66px;margin-right:0}.f-filter-inputs-extend-list .form-group,.f-sidebar-filter-list .form-group{display:block}.f-filter-inputs-extend-list.farris-form-controls-inline .form-group,.f-sidebar-filter-list.farris-form-controls-inline .form-group{display:flex}.f-filter-panel-flexible-icon{flex-shrink:0;margin:0 6px;font-size:14px;color:#999}.f-filter-panel-wrapper{position:fixed;z-index:1050;top:0;left:0;height:100%;width:100%;pointer-events:auto}.f-filter-panel{position:absolute;z-index:100;padding-top:14px}.f-filter-panel-header{display:flex;justify-content:space-between;align-items:center}.f-filter-panel-header .panel-header-title{line-height:22px;font-size:15px;color:rgba(0,0,0,.85);font-weight:600}.f-filter-panel-content{padding-top:8px}.f-filter-panel-content .filter-type-checkboxgroup{max-height:216px;padding:6px 8px 6px 0;border-radius:2px;overflow-y:auto}.f-filter-panel-content .filter-type-checkboxgroup .custom-checkbox{padding-left:14px}.f-filter-panel-footer{display:flex;justify-content:space-between;padding-top:16px;align-items:center}.f-filter-panel-footer .filter-panel-submit{padding-left:22px;padding-right:22px;margin-left:8px}.f-filter-panel-footer .btn-link{padding-right:8px}.f-filter-panel-footer .btn-empty{position:relative;padding-left:8px}.f-filter-panel-footer .btn-empty::before{position:absolute;left:0;top:50%;width:1px;height:16px;margin-top:-8px;background-color:var(--f-neutral-08);content:""}.f-filter-panel .f-filter-panel-inner{position:relative;min-width:380px;padding:14px 24px 18px;background:var(--f-neutral-20);box-shadow:0 2px 12px 0 rgba(31,35,41,.1);border-radius:10px}.f-filter-panel .f-filter-panel-inner.f-filter-panel-inner-xs{padding:10px 4px 16px}.f-filter-panel .f-filter-panel-inner.f-filter-panel-inner-auto{min-width:auto;padding:0}.f-filter-panel-arrow{position:absolute;top:-12px;left:26px}.f-filter-panel-arrow::after{position:absolute;top:2px;display:block;content:"";border-color:transparent;border-style:solid;border-width:0 8px 10px;border-bottom-color:var(--f-neutral-20)}.f-filter-panel.f-filter-panel-radio .f-filter-panel-inner{min-width:230px}.f-filter-panel .f-panel-filter-tip{display:flex;align-items:center;margin-bottom:12px}.f-filter-panel .f-panel-filter-tip .panel-filter-tip-text{margin-right:8px}.f-filter-panel .panel-flexible-range-wrapper{align-items:center}.f-filter-panel .panel-flexible-range-wrapper .f-icon{flex-shrink:0;margin:0 8px;font-size:14px;color:#999}.f-filter-panel .panel-flexible-range-wrapper .f-cmp-datepicker,.f-filter-panel .panel-flexible-range-wrapper .f-cmp-number-spinner{width:150px}.f-filter-panel-date-tags{display:flex;flex-direction:row;align-items:center;padding-top:12px}.f-filter-panel-date-tags .panel-date-tag{height:24px;line-height:22px;padding:0 14px;margin-right:8px;font-size:12px;background-color:var(--f-neutral-00);border:1px solid var(--f-neutral-08);border-radius:13px;cursor:pointer}.f-filter-panel-date-tags .panel-date-tag.active{background:rgba(var(--f-theme-03),.09);border:1px solid}.filter-panel-checkbox{width:100%;height:30px;line-height:30px;margin:0;padding-right:0;background:var(--f-neutral-09)}.filter-panel-checkbox .custom-control-label{display:block;cursor:pointer;width:100%}.filter-panel-checkbox .custom-control-label::before{top:50%;transform:translateY(-50%)}.f-filter-panel-radiogroup .panel-radiogroup-item{display:flex;align-items:center;padding:.5rem 1.375rem;border:0;cursor:pointer}.f-filter-panel-radiogroup .panel-radiogroup-item.panel-radiogroup-item-active{color:var(--f-text-02);background:var(--f-neutral-10);border-radius:3px}.f-filter-panel-radiogroup .panel-radiogroup-item-text{font-size:14px;line-height:18px}.f-filter-panel-radiogroup .panel-radiogroup-item:hover{color:var(--f-text-02);background-color:var(--f-neutral-11)}.f-filter-search-result-panel{position:absolute;left:0;top:26px;z-index:100;width:200px;padding:8px;color:rgba(0,0,0,.85);background-color:#fff;box-shadow:0 2px 12px 0 rgba(31,35,41,.1);border-radius:4px}.f-filter-search-result-panel .search-result-title{line-height:22px;font-size:14px;font-weight:600}.f-filter-search-result-panel .search-result-list .search-result-item{line-height:26px;font-size:14px;cursor:pointer;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.f-filter-search-result-panel .search-result-list .search-result-item:hover{background:rgba(42,135,255,.06)}.f-filter-panel-search-tags{display:flex;flex-direction:row;align-items:center;flex-wrap:wrap;max-width:320px;padding-top:12px}.f-filter-panel-search-tags .panel-search-tag{display:flex;align-items:center;height:24px;line-height:22px;margin-right:8px;margin-bottom:8px;font-size:12px;color:#333;background-color:#fff;border:1px solid rgba(216,220,230,.6);border-radius:2px;cursor:pointer}.f-filter-panel-search-tags .panel-search-tag:last-child{margin-right:0}.f-filter-panel-search-tags .panel-search-tag .panel-search-tag-text{max-width:72px;padding-left:8px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.f-filter-panel-search-tags .panel-search-tag .panel-search-tag-remove{height:22px;line-height:22px;margin-left:6px;margin-right:8px;font-size:14px;color:#999;cursor:pointer}.f-filter-panel-search-tags .panel-search-tag:active{background:rgba(42,135,255,.06);border:1px solid rgba(42,135,255,.16)}.f-filter-container{padding-bottom:12px}.f-filter-wrapper .f-filter-list .f-filter-item{padding:0 20px 0 12px!important}.f-filter-wrapper .f-filter-list .f-filter-item-clear{padding:0 2px!important}.container,.container-fluid{padding-right:14px;padding-left:14px;margin-right:auto;margin-left:auto}.container{width:100%}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:888px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%}.row{display:flex;flex-wrap:wrap;margin-right:-14px;margin-left:-14px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-el,.col-el-1,.col-el-10,.col-el-11,.col-el-12,.col-el-2,.col-el-3,.col-el-4,.col-el-5,.col-el-6,.col-el-7,.col-el-8,.col-el-9,.col-el-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:14px;padding-left:14px}.col{flex-basis:0;flex-grow:1;max-width:100%}.col-auto{flex-grow:0;flex-shrink:0;flex-basis:auto;width:auto;max-width:none}.col-1{flex-grow:0;flex-shrink:0;flex-basis:8.3333333333%;max-width:8.3333333333%}.col-2{flex-grow:0;flex-shrink:0;flex-basis:16.6666666667%;max-width:16.6666666667%}.col-3{flex-grow:0;flex-shrink:0;flex-basis:25%;max-width:25%}.col-4{flex-grow:0;flex-shrink:0;flex-basis:33.3333333333%;max-width:33.3333333333%}.col-5{flex-grow:0;flex-shrink:0;flex-basis:41.6666666667%;max-width:41.6666666667%}.col-6{flex-grow:0;flex-shrink:0;flex-basis:50%;max-width:50%}.col-7{flex-grow:0;flex-shrink:0;flex-basis:58.3333333333%;max-width:58.3333333333%}.col-8{flex-grow:0;flex-shrink:0;flex-basis:66.6666666667%;max-width:66.6666666667%}.col-9{flex-grow:0;flex-shrink:0;flex-basis:75%;max-width:75%}.col-10{flex-grow:0;flex-shrink:0;flex-basis:83.3333333333%;max-width:83.3333333333%}.col-11{flex-grow:0;flex-shrink:0;flex-basis:91.6666666667%;max-width:91.6666666667%}.col-12{flex-grow:0;flex-shrink:0;flex-basis:100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.3333333333%}.offset-2{margin-left:16.6666666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333333333%}.offset-5{margin-left:41.6666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333333333%}.offset-8{margin-left:66.6666666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333333333%}.offset-11{margin-left:91.6666666667%}.f-area-response [class*=col-xs]{flex:none;max-width:none}.f-area-response.f-area-response--xs .col-xs-1{flex-grow:0;flex-shrink:0;flex-basis:8.3333333333%;max-width:8.3333333333%}.f-area-response.f-area-response--xs .col-xs-2{flex-grow:0;flex-shrink:0;flex-basis:16.6666666667%;max-width:16.6666666667%}.f-area-response.f-area-response--xs .col-xs-3{flex-grow:0;flex-shrink:0;flex-basis:25%;max-width:25%}.f-area-response.f-area-response--xs .col-xs-4{flex-grow:0;flex-shrink:0;flex-basis:33.3333333333%;max-width:33.3333333333%}.f-area-response.f-area-response--xs .col-xs-5{flex-grow:0;flex-shrink:0;flex-basis:41.6666666667%;max-width:41.6666666667%}.f-area-response.f-area-response--xs .col-xs-6{flex-grow:0;flex-shrink:0;flex-basis:50%;max-width:50%}.f-area-response.f-area-response--xs .col-xs-7{flex-grow:0;flex-shrink:0;flex-basis:58.3333333333%;max-width:58.3333333333%}.f-area-response.f-area-response--xs .col-xs-8{flex-grow:0;flex-shrink:0;flex-basis:66.6666666667%;max-width:66.6666666667%}.f-area-response.f-area-response--xs .col-xs-9{flex-grow:0;flex-shrink:0;flex-basis:75%;max-width:75%}.f-area-response.f-area-response--xs .col-xs-10{flex-grow:0;flex-shrink:0;flex-basis:83.3333333333%;max-width:83.3333333333%}.f-area-response.f-area-response--xs .col-xs-11{flex-grow:0;flex-shrink:0;flex-basis:91.6666666667%;max-width:91.6666666667%}.f-area-response.f-area-response--xs .col-xs-12{flex-grow:0;flex-shrink:0;flex-basis:100%;max-width:100%}@media (min-width:576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.col-sm-auto{flex-grow:0;flex-shrink:0;flex-basis:auto;width:auto;max-width:none}.col-sm-1{flex-grow:0;flex-shrink:0;flex-basis:8.3333333333%;max-width:8.3333333333%}.col-sm-2{flex-grow:0;flex-shrink:0;flex-basis:16.6666666667%;max-width:16.6666666667%}.col-sm-3{flex-grow:0;flex-shrink:0;flex-basis:25%;max-width:25%}.col-sm-4{flex-grow:0;flex-shrink:0;flex-basis:33.3333333333%;max-width:33.3333333333%}.col-sm-5{flex-grow:0;flex-shrink:0;flex-basis:41.6666666667%;max-width:41.6666666667%}.col-sm-6{flex-grow:0;flex-shrink:0;flex-basis:50%;max-width:50%}.col-sm-7{flex-grow:0;flex-shrink:0;flex-basis:58.3333333333%;max-width:58.3333333333%}.col-sm-8{flex-grow:0;flex-shrink:0;flex-basis:66.6666666667%;max-width:66.6666666667%}.col-sm-9{flex-grow:0;flex-shrink:0;flex-basis:75%;max-width:75%}.col-sm-10{flex-grow:0;flex-shrink:0;flex-basis:83.3333333333%;max-width:83.3333333333%}.col-sm-11{flex-grow:0;flex-shrink:0;flex-basis:91.6666666667%;max-width:91.6666666667%}.col-sm-12{flex-grow:0;flex-shrink:0;flex-basis:100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.3333333333%}.offset-sm-2{margin-left:16.6666666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333333333%}.offset-sm-5{margin-left:41.6666666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333333333%}.offset-sm-8{margin-left:66.6666666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333333333%}.offset-sm-11{margin-left:91.6666666667%}}.f-area-response [class*=col-sm]{flex:none;max-width:none}.f-area-response.f-area-response--sm .col-sm-1{flex-grow:0;flex-shrink:0;flex-basis:8.3333333333%;max-width:8.3333333333%}.f-area-response.f-area-response--sm .col-sm-2{flex-grow:0;flex-shrink:0;flex-basis:16.6666666667%;max-width:16.6666666667%}.f-area-response.f-area-response--sm .col-sm-3{flex-grow:0;flex-shrink:0;flex-basis:25%;max-width:25%}.f-area-response.f-area-response--sm .col-sm-4{flex-grow:0;flex-shrink:0;flex-basis:33.3333333333%;max-width:33.3333333333%}.f-area-response.f-area-response--sm .col-sm-5{flex-grow:0;flex-shrink:0;flex-basis:41.6666666667%;max-width:41.6666666667%}.f-area-response.f-area-response--sm .col-sm-6{flex-grow:0;flex-shrink:0;flex-basis:50%;max-width:50%}.f-area-response.f-area-response--sm .col-sm-7{flex-grow:0;flex-shrink:0;flex-basis:58.3333333333%;max-width:58.3333333333%}.f-area-response.f-area-response--sm .col-sm-8{flex-grow:0;flex-shrink:0;flex-basis:66.6666666667%;max-width:66.6666666667%}.f-area-response.f-area-response--sm .col-sm-9{flex-grow:0;flex-shrink:0;flex-basis:75%;max-width:75%}.f-area-response.f-area-response--sm .col-sm-10{flex-grow:0;flex-shrink:0;flex-basis:83.3333333333%;max-width:83.3333333333%}.f-area-response.f-area-response--sm .col-sm-11{flex-grow:0;flex-shrink:0;flex-basis:91.6666666667%;max-width:91.6666666667%}.f-area-response.f-area-response--sm .col-sm-12{flex-grow:0;flex-shrink:0;flex-basis:100%;max-width:100%}@media (min-width:768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.col-md-auto{flex-grow:0;flex-shrink:0;flex-basis:auto;width:auto;max-width:none}.col-md-1{flex-grow:0;flex-shrink:0;flex-basis:8.3333333333%;max-width:8.3333333333%}.col-md-2{flex-grow:0;flex-shrink:0;flex-basis:16.6666666667%;max-width:16.6666666667%}.col-md-3{flex-grow:0;flex-shrink:0;flex-basis:25%;max-width:25%}.col-md-4{flex-grow:0;flex-shrink:0;flex-basis:33.3333333333%;max-width:33.3333333333%}.col-md-5{flex-grow:0;flex-shrink:0;flex-basis:41.6666666667%;max-width:41.6666666667%}.col-md-6{flex-grow:0;flex-shrink:0;flex-basis:50%;max-width:50%}.col-md-7{flex-grow:0;flex-shrink:0;flex-basis:58.3333333333%;max-width:58.3333333333%}.col-md-8{flex-grow:0;flex-shrink:0;flex-basis:66.6666666667%;max-width:66.6666666667%}.col-md-9{flex-grow:0;flex-shrink:0;flex-basis:75%;max-width:75%}.col-md-10{flex-grow:0;flex-shrink:0;flex-basis:83.3333333333%;max-width:83.3333333333%}.col-md-11{flex-grow:0;flex-shrink:0;flex-basis:91.6666666667%;max-width:91.6666666667%}.col-md-12{flex-grow:0;flex-shrink:0;flex-basis:100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.3333333333%}.offset-md-2{margin-left:16.6666666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333333333%}.offset-md-5{margin-left:41.6666666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333333333%}.offset-md-8{margin-left:66.6666666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333333333%}.offset-md-11{margin-left:91.6666666667%}}.f-area-response [class*=col-md]{flex:none;max-width:none}.f-area-response.f-area-response--md .col-md-1{flex-grow:0;flex-shrink:0;flex-basis:8.3333333333%;max-width:8.3333333333%}.f-area-response.f-area-response--md .col-md-2{flex-grow:0;flex-shrink:0;flex-basis:16.6666666667%;max-width:16.6666666667%}.f-area-response.f-area-response--md .col-md-3{flex-grow:0;flex-shrink:0;flex-basis:25%;max-width:25%}.f-area-response.f-area-response--md .col-md-4{flex-grow:0;flex-shrink:0;flex-basis:33.3333333333%;max-width:33.3333333333%}.f-area-response.f-area-response--md .col-md-5{flex-grow:0;flex-shrink:0;flex-basis:41.6666666667%;max-width:41.6666666667%}.f-area-response.f-area-response--md .col-md-6{flex-grow:0;flex-shrink:0;flex-basis:50%;max-width:50%}.f-area-response.f-area-response--md .col-md-7{flex-grow:0;flex-shrink:0;flex-basis:58.3333333333%;max-width:58.3333333333%}.f-area-response.f-area-response--md .col-md-8{flex-grow:0;flex-shrink:0;flex-basis:66.6666666667%;max-width:66.6666666667%}.f-area-response.f-area-response--md .col-md-9{flex-grow:0;flex-shrink:0;flex-basis:75%;max-width:75%}.f-area-response.f-area-response--md .col-md-10{flex-grow:0;flex-shrink:0;flex-basis:83.3333333333%;max-width:83.3333333333%}.f-area-response.f-area-response--md .col-md-11{flex-grow:0;flex-shrink:0;flex-basis:91.6666666667%;max-width:91.6666666667%}.f-area-response.f-area-response--md .col-md-12{flex-grow:0;flex-shrink:0;flex-basis:100%;max-width:100%}@media (min-width:888px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.col-lg-auto{flex-grow:0;flex-shrink:0;flex-basis:auto;width:auto;max-width:none}.col-lg-1{flex-grow:0;flex-shrink:0;flex-basis:8.3333333333%;max-width:8.3333333333%}.col-lg-2{flex-grow:0;flex-shrink:0;flex-basis:16.6666666667%;max-width:16.6666666667%}.col-lg-3{flex-grow:0;flex-shrink:0;flex-basis:25%;max-width:25%}.col-lg-4{flex-grow:0;flex-shrink:0;flex-basis:33.3333333333%;max-width:33.3333333333%}.col-lg-5{flex-grow:0;flex-shrink:0;flex-basis:41.6666666667%;max-width:41.6666666667%}.col-lg-6{flex-grow:0;flex-shrink:0;flex-basis:50%;max-width:50%}.col-lg-7{flex-grow:0;flex-shrink:0;flex-basis:58.3333333333%;max-width:58.3333333333%}.col-lg-8{flex-grow:0;flex-shrink:0;flex-basis:66.6666666667%;max-width:66.6666666667%}.col-lg-9{flex-grow:0;flex-shrink:0;flex-basis:75%;max-width:75%}.col-lg-10{flex-grow:0;flex-shrink:0;flex-basis:83.3333333333%;max-width:83.3333333333%}.col-lg-11{flex-grow:0;flex-shrink:0;flex-basis:91.6666666667%;max-width:91.6666666667%}.col-lg-12{flex-grow:0;flex-shrink:0;flex-basis:100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.3333333333%}.offset-lg-2{margin-left:16.6666666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333333333%}.offset-lg-5{margin-left:41.6666666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333333333%}.offset-lg-8{margin-left:66.6666666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333333333%}.offset-lg-11{margin-left:91.6666666667%}}.f-area-response [class*=col-lg]{flex:none;max-width:none}.f-area-response.f-area-response--lg .col-lg-1{flex-grow:0;flex-shrink:0;flex-basis:8.3333333333%;max-width:8.3333333333%}.f-area-response.f-area-response--lg .col-lg-2{flex-grow:0;flex-shrink:0;flex-basis:16.6666666667%;max-width:16.6666666667%}.f-area-response.f-area-response--lg .col-lg-3{flex-grow:0;flex-shrink:0;flex-basis:25%;max-width:25%}.f-area-response.f-area-response--lg .col-lg-4{flex-grow:0;flex-shrink:0;flex-basis:33.3333333333%;max-width:33.3333333333%}.f-area-response.f-area-response--lg .col-lg-5{flex-grow:0;flex-shrink:0;flex-basis:41.6666666667%;max-width:41.6666666667%}.f-area-response.f-area-response--lg .col-lg-6{flex-grow:0;flex-shrink:0;flex-basis:50%;max-width:50%}.f-area-response.f-area-response--lg .col-lg-7{flex-grow:0;flex-shrink:0;flex-basis:58.3333333333%;max-width:58.3333333333%}.f-area-response.f-area-response--lg .col-lg-8{flex-grow:0;flex-shrink:0;flex-basis:66.6666666667%;max-width:66.6666666667%}.f-area-response.f-area-response--lg .col-lg-9{flex-grow:0;flex-shrink:0;flex-basis:75%;max-width:75%}.f-area-response.f-area-response--lg .col-lg-10{flex-grow:0;flex-shrink:0;flex-basis:83.3333333333%;max-width:83.3333333333%}.f-area-response.f-area-response--lg .col-lg-11{flex-grow:0;flex-shrink:0;flex-basis:91.6666666667%;max-width:91.6666666667%}.f-area-response.f-area-response--lg .col-lg-12{flex-grow:0;flex-shrink:0;flex-basis:100%;max-width:100%}@media (min-width:1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.col-xl-auto{flex-grow:0;flex-shrink:0;flex-basis:auto;width:auto;max-width:none}.col-xl-1{flex-grow:0;flex-shrink:0;flex-basis:8.3333333333%;max-width:8.3333333333%}.col-xl-2{flex-grow:0;flex-shrink:0;flex-basis:16.6666666667%;max-width:16.6666666667%}.col-xl-3{flex-grow:0;flex-shrink:0;flex-basis:25%;max-width:25%}.col-xl-4{flex-grow:0;flex-shrink:0;flex-basis:33.3333333333%;max-width:33.3333333333%}.col-xl-5{flex-grow:0;flex-shrink:0;flex-basis:41.6666666667%;max-width:41.6666666667%}.col-xl-6{flex-grow:0;flex-shrink:0;flex-basis:50%;max-width:50%}.col-xl-7{flex-grow:0;flex-shrink:0;flex-basis:58.3333333333%;max-width:58.3333333333%}.col-xl-8{flex-grow:0;flex-shrink:0;flex-basis:66.6666666667%;max-width:66.6666666667%}.col-xl-9{flex-grow:0;flex-shrink:0;flex-basis:75%;max-width:75%}.col-xl-10{flex-grow:0;flex-shrink:0;flex-basis:83.3333333333%;max-width:83.3333333333%}.col-xl-11{flex-grow:0;flex-shrink:0;flex-basis:91.6666666667%;max-width:91.6666666667%}.col-xl-12{flex-grow:0;flex-shrink:0;flex-basis:100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.3333333333%}.offset-xl-2{margin-left:16.6666666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333333333%}.offset-xl-5{margin-left:41.6666666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333333333%}.offset-xl-8{margin-left:66.6666666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333333333%}.offset-xl-11{margin-left:91.6666666667%}}.f-area-response [class*=col-xl]{flex:none;max-width:none}.f-area-response.f-area-response--xl .col-xl-1{flex-grow:0;flex-shrink:0;flex-basis:8.3333333333%;max-width:8.3333333333%}.f-area-response.f-area-response--xl .col-xl-2{flex-grow:0;flex-shrink:0;flex-basis:16.6666666667%;max-width:16.6666666667%}.f-area-response.f-area-response--xl .col-xl-3{flex-grow:0;flex-shrink:0;flex-basis:25%;max-width:25%}.f-area-response.f-area-response--xl .col-xl-4{flex-grow:0;flex-shrink:0;flex-basis:33.3333333333%;max-width:33.3333333333%}.f-area-response.f-area-response--xl .col-xl-5{flex-grow:0;flex-shrink:0;flex-basis:41.6666666667%;max-width:41.6666666667%}.f-area-response.f-area-response--xl .col-xl-6{flex-grow:0;flex-shrink:0;flex-basis:50%;max-width:50%}.f-area-response.f-area-response--xl .col-xl-7{flex-grow:0;flex-shrink:0;flex-basis:58.3333333333%;max-width:58.3333333333%}.f-area-response.f-area-response--xl .col-xl-8{flex-grow:0;flex-shrink:0;flex-basis:66.6666666667%;max-width:66.6666666667%}.f-area-response.f-area-response--xl .col-xl-9{flex-grow:0;flex-shrink:0;flex-basis:75%;max-width:75%}.f-area-response.f-area-response--xl .col-xl-10{flex-grow:0;flex-shrink:0;flex-basis:83.3333333333%;max-width:83.3333333333%}.f-area-response.f-area-response--xl .col-xl-11{flex-grow:0;flex-shrink:0;flex-basis:91.6666666667%;max-width:91.6666666667%}.f-area-response.f-area-response--xl .col-xl-12{flex-grow:0;flex-shrink:0;flex-basis:100%;max-width:100%}@media (min-width:1690px){.col-el{flex-basis:0;flex-grow:1;max-width:100%}.col-el-auto{flex-grow:0;flex-shrink:0;flex-basis:auto;width:auto;max-width:none}.col-el-1{flex-grow:0;flex-shrink:0;flex-basis:8.3333333333%;max-width:8.3333333333%}.col-el-2{flex-grow:0;flex-shrink:0;flex-basis:16.6666666667%;max-width:16.6666666667%}.col-el-3{flex-grow:0;flex-shrink:0;flex-basis:25%;max-width:25%}.col-el-4{flex-grow:0;flex-shrink:0;flex-basis:33.3333333333%;max-width:33.3333333333%}.col-el-5{flex-grow:0;flex-shrink:0;flex-basis:41.6666666667%;max-width:41.6666666667%}.col-el-6{flex-grow:0;flex-shrink:0;flex-basis:50%;max-width:50%}.col-el-7{flex-grow:0;flex-shrink:0;flex-basis:58.3333333333%;max-width:58.3333333333%}.col-el-8{flex-grow:0;flex-shrink:0;flex-basis:66.6666666667%;max-width:66.6666666667%}.col-el-9{flex-grow:0;flex-shrink:0;flex-basis:75%;max-width:75%}.col-el-10{flex-grow:0;flex-shrink:0;flex-basis:83.3333333333%;max-width:83.3333333333%}.col-el-11{flex-grow:0;flex-shrink:0;flex-basis:91.6666666667%;max-width:91.6666666667%}.col-el-12{flex-grow:0;flex-shrink:0;flex-basis:100%;max-width:100%}.order-el-first{order:-1}.order-el-last{order:13}.order-el-0{order:0}.order-el-1{order:1}.order-el-2{order:2}.order-el-3{order:3}.order-el-4{order:4}.order-el-5{order:5}.order-el-6{order:6}.order-el-7{order:7}.order-el-8{order:8}.order-el-9{order:9}.order-el-10{order:10}.order-el-11{order:11}.order-el-12{order:12}.offset-el-0{margin-left:0}.offset-el-1{margin-left:8.3333333333%}.offset-el-2{margin-left:16.6666666667%}.offset-el-3{margin-left:25%}.offset-el-4{margin-left:33.3333333333%}.offset-el-5{margin-left:41.6666666667%}.offset-el-6{margin-left:50%}.offset-el-7{margin-left:58.3333333333%}.offset-el-8{margin-left:66.6666666667%}.offset-el-9{margin-left:75%}.offset-el-10{margin-left:83.3333333333%}.offset-el-11{margin-left:91.6666666667%}}.f-area-response [class*=col-el]{flex:none;max-width:none}.f-area-response.f-area-response--el .col-el-1{flex-grow:0;flex-shrink:0;flex-basis:8.3333333333%;max-width:8.3333333333%}.f-area-response.f-area-response--el .col-el-2{flex-grow:0;flex-shrink:0;flex-basis:16.6666666667%;max-width:16.6666666667%}.f-area-response.f-area-response--el .col-el-3{flex-grow:0;flex-shrink:0;flex-basis:25%;max-width:25%}.f-area-response.f-area-response--el .col-el-4{flex-grow:0;flex-shrink:0;flex-basis:33.3333333333%;max-width:33.3333333333%}.f-area-response.f-area-response--el .col-el-5{flex-grow:0;flex-shrink:0;flex-basis:41.6666666667%;max-width:41.6666666667%}.f-area-response.f-area-response--el .col-el-6{flex-grow:0;flex-shrink:0;flex-basis:50%;max-width:50%}.f-area-response.f-area-response--el .col-el-7{flex-grow:0;flex-shrink:0;flex-basis:58.3333333333%;max-width:58.3333333333%}.f-area-response.f-area-response--el .col-el-8{flex-grow:0;flex-shrink:0;flex-basis:66.6666666667%;max-width:66.6666666667%}.f-area-response.f-area-response--el .col-el-9{flex-grow:0;flex-shrink:0;flex-basis:75%;max-width:75%}.f-area-response.f-area-response--el .col-el-10{flex-grow:0;flex-shrink:0;flex-basis:83.3333333333%;max-width:83.3333333333%}.f-area-response.f-area-response--el .col-el-11{flex-grow:0;flex-shrink:0;flex-basis:91.6666666667%;max-width:91.6666666667%}.f-area-response.f-area-response--el .col-el-12{flex-grow:0;flex-shrink:0;flex-basis:100%;max-width:100%}@font-face{font-family:FarrisIcons;font-style:normal;font-weight:400;src:url(data:font/ttf;base64,AAEAAAALAIAAAwAwR1NVQiCLJXoAAAE4AAAAVE9TLzI2JE+JAAABjAAAAGBjbWFwTohH7gAAC/AAACWUZ2x5ZqfrFDEAADaIAAH0DGhlYWQnvvaKAAAA4AAAADZoaGVhCNUHTgAAALwAAAAkaG10eApz/50AAAHsAAAKBGxvY2GWVxNEAAAxhAAABQRtYXhwA6wBEAAAARgAAAAgbmFtZchH0mwAAiqUAAACi3Bvc3QSpDltAAItIAAAK3cAAQAAA4D/gABcBVX/9v/3BQAAAQAAAAAAAAAAAAAAAAAAAoEAAQAAAAEAAGP+/t1fDzz1AAsEAAAAAADh1NlIAAAAAOHU2Uj/9v9xBQADjAAAAAgAAgAAAAAAAAABAAACgQEEACEAAAAAAAIAAAAKAAoAAAD/AAAAAAAAAAEAAAAKADAAPgACREZMVAAObGF0bgAaAAQAAAAAAAAAAQAAAAQAAAAAAAAAAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQAGAAAAAQAAAAQEAgGQAAUAAAKJAswAAACPAokCzAAAAesAMgEIAAACAAUDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBmRWQAwOAA7LcDgP+AAAAD3ACPAAAAAQAAAAAAAAAAAAAAAAACBAAAAAQAAAAEAAAABAAAAAQAAAAEAP//BAD//wQA//8EAP//BAD//wQA//8EAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAQAABAD/+QQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAP/5BAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAP/2BAD/9gQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAD//wQAAAAEAP//BAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAP//BAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAD//wQAAAAEAAAABAD//wQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQA//kEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAD//wQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAD//wQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQA//8EAP//BAD//wQA//8EAAAABAD//wQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQA//8EAAAABAD//wQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQA//8EAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAP//BAAAAAQAAAAEAP//BAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAD//wQAAAAEAAAABAAAAAQA//8EAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEVQAABAAAAAQA//8EAAAABAAAAAQAAAAEAAAABAD//wQAAAAEAAAABAAAAAQAAAAEAP//BAAAAAQAAAAEAAAABEQAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQA//8EAAAABAAAAAQAAAAEkgAABJIAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAASSAAAEAAAABJIAAAQAAAAEAP//BAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAP//BAD//wQAAAAEAAAABAAAAAQAAAAEAP/9BAAAAAQAAAAEAAAABAD//wQA//8EAP/9BAD//wQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAREAAAEAP//BAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAP//BAD//wQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAP//BAAAAAQAAAAEAAAABAAAAAQA//8EAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQB//8EAP//BAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQ8AAAENf/+BAAAAAQA//8EAAAABAD//wQAAAAEAP//BAD//wQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQB//4ETgAABAAAAAVVAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAE/wAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAD//wQA//8EAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAAAAAFAAAAAwAAACwAAAAEAAAHMAABAAAAAAYqAAMAAQAAACwAAwAKAAAHMAAEBf4AAAA4ACAABAAY4DLhSeIO4wrlKuYr5kPmmua85tfnBegs6SLrGOs/60/rb+t/64nrqeu568nr2evp6/nsqey3//8AAOAA4QDiAOMA5QDmAOYt5kXmvObX5wDoAOkA6wTrGutB61HrceuB65rrsOvA69Dr4evw7KDssP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAOACcAS4BSgFeAbICCAI0At4C3gLeAugDQAOEA6wD9gQSBE4EagR6BJgEqgS8BM4E3gTwBQIAAAGPAGsAZgBhAoACfgJ/An0AZwBlAGIAZAJzAnECcgJwAngAYwBsAnwCegJ7AnkAbQBoAGkAagBeAA8AEQAVABMAEgBYAFMCdgJ3AnUBrwBSAFYAUQBZAF0AXwBgAFoCbwBOAFUCXgAEAE8AWwA5ABQAOgA9AAMBrwA/AFwASwJ0AEYAQgBKADwANwA7ADgAPgAKAAgABwBAACECawJsAEgCagHpAm0AKgHoAm4AIwAkACkAJgAWAA0AJQBBAEUATABJAEQARwAoACcAIAAiADYALgAvADIBsAA1Ak4ATQBDAAkCaQBXADQAFwAMADEALQAsADMAMAArAB0AGgAZAAsAHwAbABwAGAAeAAYABQAQAFAAVAGOAYUBiQGMAmgCZwHnAkkCQAGHAYsCSAJHAY0BiAGGAYoBfAGDAX8BgQGCAYABewGEAX4BfQF1AXMBcQFyAXkBdwF6AXQBeAF2AWoBbQFvAWcBaQFsAW4BcAFoAWsBZgFiAV0BZAFfAWEBYwFeAWUBYAFDAUgBSQFAAUIBRgFHAUUBQQFPAVABTQFLAU4BTAFEAVwBWgFbAVYBVAFXAVgBVQFZAVIBUwFKAVEBAAECAQEA/wD6ASYBPQEsATsBOQEvAPsBKgE0APwBBwEJAREBCgEIAQ0BBgEFAQ4BAwEQATMBIQEgAPUAkAE3ARkBMgD4AI4AigEkAI8AiwEXAP0BOgE+AT8BMQD+ARUBEwESAR8A+QEbARQBGAEaATUBIgDzASMBKwELARwBHgEoAScBJQEtATgBNgEEAQwBFgD3APIBKQD0AS4BMAE8AR0BDwCMAI0AngCXAJ8AkQCTAJ0AqACmAKAApwClAKsAnACWAJIAlACbAJoAlQCYAH4AfACjAKQAqgCtAK4AoQB9AIEAiQCHAIQAiACAAIYAhQB7AKkB5wD2AIIAfwCDAG4AegB5AHgAdwB2AHMAdAB1AHIAcQBvAHAArACiAJkA5gDsAOsA7gDpAOoA7wDnAOMA5ADwAO0A5QDoAPEA2QDbANoA4gDcAN4A3QDfAOAA4QDXANAA0wDRANYA1QDUANIAzwDYAMYAzADIAMkAxQDOAMoAxwDNAMsAwQDAAMMAvADCALsAxAC/AL0AvgCwALkArwC1ALQAtgCyALgAsQC6ALcAswJfAlwCYAJmAmUCZAJjAmICYQJdAlsCWgJZAlMCVgJRAlICVAJVAlcCWAJQAk8CTgJNAkwBsAJLAkoCRQJGAkECQgJDAkQCMQIwAj8CPgI9AjwCOwI4AjkCOgIzAjQCNQI2AjcCMgIvAi4CLQIsAisCKgIpAigCJwImAiUCJAIjAiICIAIhAh8CHgIdAhwCGwIaAhkCGAIXAhYCFQIUAhMCEgIRAhACDwIOAg0CDAILAgoCCQIIAgcCBgIFAgQCAwICAgECAAH/Af4B/QH8AfsB+gH5AfgB9wH2AfUB9AHzAfIB8QHwAe8B7gHtAewBrwHrAeoB5gHlAeQB4wHiAeEB4AHfAd4B3QHcAdsB2gHZAdgB1wHWAdUB1AHTAdIB0QHQAc8BzgHNAcwBywHKAckByAHHAcYBxQHEAcMBwgHBAcABvwG+Ab0BvAG7AboBuQG4AbcBtgG1AbQBswGyAbEBsAGvAa4BrQGsAasBqgGpAagBpwGmAaUBpAGjAaIBoQGgAZ8BngGdAZwBmwGWAZUBlAGTAZIBkQGQAZcBmAGZAZoAAgAOAAEAAAEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAHmQAAAAAAAAChwAA4AAAAOAAAAABjwAA4AEAAOABAAAAawAA4AIAAOACAAAAZgAA4AMAAOADAAAAYQAA4AQAAOAEAAACgAAA4AUAAOAFAAACfgAA4AYAAOAGAAACfwAA4AcAAOAHAAACfQAA4AgAAOAIAAAAZwAA4AkAAOAJAAAAZQAA4AoAAOAKAAAAYgAA4AsAAOALAAAAZAAA4AwAAOAMAAACcwAA4A0AAOANAAACcQAA4A4AAOAOAAACcgAA4A8AAOAPAAACcAAA4BAAAOAQAAACeAAA4BEAAOARAAAAYwAA4BIAAOASAAAAbAAA4BMAAOATAAACfAAA4BQAAOAUAAACegAA4BUAAOAVAAACewAA4BYAAOAWAAACeQAA4BcAAOAXAAAAbQAA4BgAAOAYAAAAaAAA4BkAAOAZAAAAaQAA4BoAAOAaAAAAagAA4BsAAOAbAAAAXgAA4BwAAOAcAAAADwAA4B0AAOAdAAAAEQAA4B4AAOAeAAAAFQAA4B8AAOAfAAAAEwAA4CAAAOAgAAAAEgAA4CEAAOAhAAAAWAAA4CIAAOAiAAAAUwAA4CMAAOAjAAACdgAA4CQAAOAkAAACdwAA4CUAAOAlAAACdQAA4CYAAOAmAAABrwAA4CcAAOAnAAAAUgAA4CgAAOAoAAAAVgAA4CkAAOApAAAAUQAA4CoAAOAqAAAAWQAA4CsAAOArAAAAXQAA4CwAAOAsAAAAXwAA4C0AAOAtAAAAYAAA4C4AAOAuAAAAWgAA4C8AAOAvAAACbwAA4DAAAOAwAAAATgAA4DEAAOAxAAAAVQAA4DIAAOAyAAACXgAA4QAAAOEAAAAABAAA4QEAAOEBAAAATwAA4QIAAOECAAAAWwAA4QMAAOEDAAAAOQAA4QQAAOEEAAAAFAAA4QUAAOEFAAAAOgAA4QYAAOEGAAAAPQAA4QcAAOEHAAAAAwAA4QgAAOEIAAABrwAA4QkAAOEJAAAAPwAA4QoAAOEKAAAAXAAA4QsAAOELAAAASwAA4QwAAOEMAAACdAAA4Q0AAOENAAAARgAA4Q4AAOEOAAAAQgAA4Q8AAOEPAAAASgAA4RAAAOEQAAAAPAAA4REAAOERAAAANwAA4RIAAOESAAAAOwAA4RMAAOETAAAAOAAA4RQAAOEUAAAAPgAA4RUAAOEVAAAACgAA4RYAAOEWAAAACAAA4RcAAOEXAAAABwAA4RgAAOEYAAAAQAAA4RkAAOEZAAAAIQAA4RoAAOEaAAACawAA4RsAAOEbAAACbAAA4RwAAOEcAAAASAAA4R0AAOEdAAACagAA4R4AAOEeAAAB6QAA4R8AAOEfAAACbQAA4SAAAOEgAAAAKgAA4SEAAOEhAAAB6AAA4SIAAOEiAAACbgAA4SMAAOEjAAAAIwAA4SQAAOEkAAAAJAAA4SUAAOElAAAAKQAA4SYAAOEmAAAAJgAA4ScAAOEnAAAAFgAA4SgAAOEoAAAADQAA4SkAAOEpAAAAJQAA4SoAAOEqAAAAQQAA4SsAAOErAAAARQAA4SwAAOEsAAAATAAA4S0AAOEtAAAASQAA4S4AAOEuAAAARAAA4S8AAOEvAAAARwAA4TAAAOEwAAAAKAAA4TEAAOExAAAAJwAA4TIAAOEyAAAAIAAA4TMAAOEzAAAAIgAA4TQAAOE0AAAANgAA4TUAAOE1AAAALgAA4TYAAOE2AAAALwAA4TcAAOE3AAAAMgAA4TgAAOE4AAABsAAA4TkAAOE5AAAANQAA4ToAAOE6AAACTgAA4TsAAOE7AAAATQAA4TwAAOE8AAAAQwAA4T0AAOE9AAAACQAA4T4AAOE+AAACaQAA4T8AAOE/AAAAVwAA4UAAAOFAAAAANAAA4UEAAOFBAAAAFwAA4UIAAOFCAAAADAAA4UMAAOFDAAAAMQAA4UQAAOFEAAAALQAA4UUAAOFFAAAALAAA4UYAAOFGAAAAMwAA4UcAAOFHAAAAMAAA4UgAAOFIAAAAKwAA4UkAAOFJAAAAHQAA4gAAAOIAAAAAGgAA4gEAAOIBAAAAGQAA4gIAAOICAAAACwAA4gMAAOIDAAAAHwAA4gQAAOIEAAAAGwAA4gUAAOIFAAAAHAAA4gYAAOIGAAAAGAAA4gcAAOIHAAAAHgAA4ggAAOIIAAAABgAA4gkAAOIJAAAABQAA4goAAOIKAAAAEAAA4gsAAOILAAAAUAAA4gwAAOIMAAAAVAAA4g0AAOINAAABjgAA4g4AAOIOAAABhQAA4wAAAOMAAAABiQAA4wEAAOMBAAABjAAA4wIAAOMCAAACaAAA4wMAAOMDAAACZwAA4wQAAOMEAAAB5wAA4wUAAOMFAAACSQAA4wYAAOMGAAACQAAA4wcAAOMHAAABhwAA4wgAAOMIAAABiwAA4wkAAOMJAAACSAAA4woAAOMKAAACRwAA5QAAAOUAAAABjQAA5QEAAOUBAAABiAAA5QIAAOUCAAABhgAA5QMAAOUDAAABigAA5QQAAOUEAAABfAAA5QUAAOUFAAABgwAA5QYAAOUGAAABfwAA5QcAAOUHAAABgQAA5QgAAOUIAAABggAA5QkAAOUJAAABgAAA5QoAAOUKAAABewAA5QsAAOULAAABhAAA5QwAAOUMAAABfgAA5Q0AAOUNAAABfQAA5Q4AAOUOAAABdQAA5Q8AAOUPAAABcwAA5RAAAOUQAAABcQAA5REAAOURAAABcgAA5RIAAOUSAAABeQAA5RMAAOUTAAABdwAA5RQAAOUUAAABegAA5RUAAOUVAAABdAAA5RYAAOUWAAABeAAA5RcAAOUXAAABdgAA5RgAAOUYAAABagAA5RkAAOUZAAABbQAA5RoAAOUaAAABbwAA5RsAAOUbAAABZwAA5RwAAOUcAAABaQAA5R0AAOUdAAABbAAA5R4AAOUeAAABbgAA5R8AAOUfAAABcAAA5SAAAOUgAAABaAAA5SEAAOUhAAABawAA5SIAAOUiAAABZgAA5SMAAOUjAAABYgAA5SQAAOUkAAABXQAA5SUAAOUlAAABZAAA5SYAAOUmAAABXwAA5ScAAOUnAAABYQAA5SgAAOUoAAABYwAA5SkAAOUpAAABXgAA5SoAAOUqAAABZQAA5gAAAOYAAAABYAAA5gEAAOYBAAABQwAA5gIAAOYCAAABSAAA5gMAAOYDAAABSQAA5gQAAOYEAAABQAAA5gUAAOYFAAABQgAA5gYAAOYGAAABRgAA5gcAAOYHAAABRwAA5ggAAOYIAAABRQAA5gkAAOYJAAABQQAA5goAAOYKAAABTwAA5gsAAOYLAAABUAAA5gwAAOYMAAABTQAA5g0AAOYNAAABSwAA5g4AAOYOAAABTgAA5g8AAOYPAAABTAAA5hAAAOYQAAABRAAA5hEAAOYRAAABXAAA5hIAAOYSAAABWgAA5hMAAOYTAAABWwAA5hQAAOYUAAABVgAA5hUAAOYVAAABVAAA5hYAAOYWAAABVwAA5hcAAOYXAAABWAAA5hgAAOYYAAABVQAA5hkAAOYZAAABWQAA5hoAAOYaAAABUgAA5hsAAOYbAAABUwAA5hwAAOYcAAABSgAA5h0AAOYdAAABUQAA5h4AAOYeAAABAAAA5h8AAOYfAAABAgAA5iAAAOYgAAABAQAA5iEAAOYhAAAA/wAA5iIAAOYiAAAA+gAA5iMAAOYjAAABJgAA5iQAAOYkAAABPQAA5iUAAOYlAAABLAAA5iYAAOYmAAABOwAA5icAAOYnAAABOQAA5igAAOYoAAABLwAA5ikAAOYpAAAA+wAA5ioAAOYqAAABKgAA5isAAOYrAAABNAAA5i0AAOYtAAAA/AAA5i4AAOYuAAABBwAA5i8AAOYvAAABCQAA5jAAAOYwAAABEQAA5jEAAOYxAAABCgAA5jIAAOYyAAABCAAA5jMAAOYzAAABDQAA5jQAAOY0AAABBgAA5jUAAOY1AAABBQAA5jYAAOY2AAABDgAA5jcAAOY3AAABAwAA5jgAAOY4AAABEAAA5jkAAOY5AAABMwAA5joAAOY6AAABIQAA5jsAAOY7AAABIAAA5jwAAOY8AAAA9QAA5j0AAOY9AAAAkAAA5j4AAOY+AAABNwAA5j8AAOY/AAABGQAA5kAAAOZAAAABMgAA5kEAAOZBAAAA+AAA5kIAAOZCAAAAjgAA5kMAAOZDAAAAigAA5kUAAOZFAAABJAAA5kYAAOZGAAAAjwAA5kcAAOZHAAAAiwAA5kgAAOZIAAABFwAA5kkAAOZJAAAA/QAA5koAAOZKAAABOgAA5ksAAOZLAAABPgAA5kwAAOZMAAABPwAA5k0AAOZNAAABMQAA5k4AAOZOAAAA/gAA5k8AAOZPAAABFQAA5lAAAOZQAAABEwAA5lEAAOZRAAABEgAA5lIAAOZSAAABHwAA5lMAAOZTAAAA+QAA5lQAAOZUAAABGwAA5lUAAOZVAAABFAAA5lYAAOZWAAABGAAA5lcAAOZXAAABGgAA5lgAAOZYAAABNQAA5lkAAOZZAAABIgAA5loAAOZaAAAA8wAA5lsAAOZbAAABIwAA5lwAAOZcAAABKwAA5l0AAOZdAAABCwAA5l4AAOZeAAABHAAA5l8AAOZfAAABHgAA5mAAAOZgAAABKAAA5mEAAOZhAAABJwAA5mIAAOZiAAABJQAA5mMAAOZjAAABLQAA5mQAAOZkAAABOAAA5mUAAOZlAAABNgAA5mYAAOZmAAABBAAA5mcAAOZnAAABDAAA5mgAAOZoAAABFgAA5mkAAOZpAAAA9wAA5moAAOZqAAAA8gAA5msAAOZrAAABKQAA5mwAAOZsAAAA9AAA5m0AAOZtAAABLgAA5m4AAOZuAAABMAAA5m8AAOZvAAABPAAA5nAAAOZwAAABHQAA5nEAAOZxAAABDwAA5nIAAOZyAAAAjAAA5nMAAOZzAAAAjQAA5nQAAOZ0AAAAngAA5nUAAOZ1AAAAlwAA5nYAAOZ2AAAAnwAA5ncAAOZ3AAAAkQAA5ngAAOZ4AAAAkwAA5nkAAOZ5AAAAnQAA5noAAOZ6AAAAqAAA5nsAAOZ7AAAApgAA5nwAAOZ8AAAAoAAA5n0AAOZ9AAAApwAA5n4AAOZ+AAAApQAA5n8AAOZ/AAAAqwAA5oAAAOaAAAAAnAAA5oEAAOaBAAAAlgAA5oIAAOaCAAAAkgAA5oMAAOaDAAAAlAAA5oQAAOaEAAAAmwAA5oUAAOaFAAAAmgAA5oYAAOaGAAAAlQAA5ocAAOaHAAAAmAAA5ogAAOaIAAAAfgAA5okAAOaJAAAAfAAA5ooAAOaKAAAAowAA5osAAOaLAAAApAAA5owAAOaMAAAAqgAA5o0AAOaNAAAArQAA5o4AAOaOAAAArgAA5o8AAOaPAAAAoQAA5pAAAOaQAAAAfQAA5pEAAOaRAAAAgQAA5pIAAOaSAAAAiQAA5pMAAOaTAAAAhwAA5pQAAOaUAAAAhAAA5pUAAOaVAAAAiAAA5pYAAOaWAAAAgAAA5pcAAOaXAAAAhgAA5pgAAOaYAAAAhQAA5pkAAOaZAAAAewAA5poAAOaaAAAAqQAA5rwAAOa8AAAB5wAA5tcAAObXAAAA9gAA5wAAAOcAAAAAggAA5wEAAOcBAAAAfwAA5wIAAOcCAAAAgwAA5wMAAOcDAAAAbgAA5wQAAOcEAAAAegAA5wUAAOcFAAAAeQAA6AAAAOgAAAAAeAAA6AEAAOgBAAAAdwAA6AIAAOgCAAAAdgAA6AMAAOgDAAAAcwAA6AQAAOgEAAAAdAAA6AUAAOgFAAAAdQAA6AYAAOgGAAAAcgAA6AcAAOgHAAAAcQAA6AgAAOgIAAAAbwAA6AkAAOgJAAAAcAAA6AoAAOgKAAAArAAA6AsAAOgLAAAAogAA6AwAAOgMAAAAmQAA6A0AAOgNAAAA5gAA6A4AAOgOAAAA7AAA6A8AAOgPAAAA6wAA6BAAAOgQAAAA7gAA6BEAAOgRAAAA6QAA6BIAAOgSAAAA6gAA6BMAAOgTAAAA7wAA6BQAAOgUAAAA5wAA6BUAAOgVAAAA4wAA6BYAAOgWAAAA5AAA6BcAAOgXAAAA8AAA6BgAAOgYAAAA7QAA6BkAAOgZAAAA5QAA6BoAAOgaAAAA6AAA6BsAAOgbAAAA8QAA6BwAAOgcAAAA2QAA6B0AAOgdAAAA2wAA6B4AAOgeAAAA2gAA6B8AAOgfAAAA4gAA6CAAAOggAAAA3AAA6CEAAOghAAAA3gAA6CIAAOgiAAAA3QAA6CMAAOgjAAAA3wAA6CQAAOgkAAAA4AAA6CUAAOglAAAA4QAA6CYAAOgmAAAA1wAA6CcAAOgnAAAA0AAA6CgAAOgoAAAA0wAA6CkAAOgpAAAA0QAA6CoAAOgqAAAA1gAA6CsAAOgrAAAA1QAA6CwAAOgsAAAA1AAA6QAAAOkAAAAA0gAA6QEAAOkBAAAAzwAA6QIAAOkCAAAA2AAA6QMAAOkDAAAAxgAA6QQAAOkEAAAAzAAA6QUAAOkFAAAAyAAA6QYAAOkGAAAAyQAA6QcAAOkHAAAAxQAA6QgAAOkIAAAAzgAA6QkAAOkJAAAAygAA6QoAAOkKAAAAxwAA6QsAAOkLAAAAzQAA6QwAAOkMAAAAywAA6Q0AAOkNAAAAwQAA6Q4AAOkOAAAAwAAA6Q8AAOkPAAAAwwAA6RAAAOkQAAAAvAAA6REAAOkRAAAAwgAA6RIAAOkSAAAAuwAA6RMAAOkTAAAAxAAA6RQAAOkUAAAAvwAA6RUAAOkVAAAAvQAA6RYAAOkWAAAAvgAA6RcAAOkXAAAAsAAA6RgAAOkYAAAAuQAA6RkAAOkZAAAArwAA6RoAAOkaAAAAtQAA6RsAAOkbAAAAtAAA6RwAAOkcAAAAtgAA6R0AAOkdAAAAsgAA6R4AAOkeAAAAuAAA6R8AAOkfAAAAsQAA6SAAAOkgAAAAugAA6SEAAOkhAAAAtwAA6SIAAOkiAAAAswAA6wQAAOsEAAACXwAA6wUAAOsFAAACXAAA6wYAAOsGAAACYAAA6wcAAOsHAAACZgAA6wgAAOsIAAACZQAA6wkAAOsJAAACZAAA6woAAOsKAAACYwAA6wsAAOsLAAACYgAA6wwAAOsMAAACYQAA6w0AAOsNAAACXQAA6w4AAOsOAAACWwAA6w8AAOsPAAACWgAA6xAAAOsQAAACWQAA6xEAAOsRAAACUwAA6xIAAOsSAAACVgAA6xMAAOsTAAACUQAA6xQAAOsUAAACUgAA6xUAAOsVAAACVAAA6xYAAOsWAAACVQAA6xcAAOsXAAACVwAA6xgAAOsYAAACWAAA6xoAAOsaAAACUAAA6xsAAOsbAAACTwAA6xwAAOscAAACTgAA6x0AAOsdAAACTQAA6x4AAOseAAACTAAA6x8AAOsfAAABsAAA6yAAAOsgAAACSwAA6yEAAOshAAACSgAA6yIAAOsiAAACRQAA6yMAAOsjAAACRgAA6yQAAOskAAACQQAA6yUAAOslAAACQgAA6yYAAOsmAAACQwAA6ycAAOsnAAACRAAA6ygAAOsoAAACMQAA6ykAAOspAAACMAAA6yoAAOsqAAACPwAA6ysAAOsrAAACPgAA6ywAAOssAAACPQAA6y0AAOstAAACPAAA6y4AAOsuAAACOwAA6y8AAOsvAAACOAAA6zAAAOswAAACOQAA6zEAAOsxAAACOgAA6zIAAOsyAAACMwAA6zMAAOszAAACNAAA6zQAAOs0AAACNQAA6zUAAOs1AAACNgAA6zYAAOs2AAACNwAA6zcAAOs3AAACMgAA6zgAAOs4AAACLwAA6zkAAOs5AAACLgAA6zoAAOs6AAACLQAA6zsAAOs7AAACLAAA6zwAAOs8AAACKwAA6z0AAOs9AAACKgAA6z4AAOs+AAACKQAA6z8AAOs/AAACKAAA60EAAOtBAAACJwAA60IAAOtCAAACJgAA60MAAOtDAAACJQAA60QAAOtEAAACJAAA60UAAOtFAAACIwAA60YAAOtGAAACIgAA60cAAOtHAAACIAAA60gAAOtIAAACIQAA60kAAOtJAAACHwAA60oAAOtKAAACHgAA60sAAOtLAAACHQAA60wAAOtMAAACHAAA600AAOtNAAACGwAA604AAOtOAAACGgAA608AAOtPAAACGQAA61EAAOtRAAACGAAA61IAAOtSAAACFwAA61MAAOtTAAACFgAA61QAAOtUAAACFQAA61UAAOtVAAACFAAA61YAAOtWAAACEwAA61cAAOtXAAACEgAA61gAAOtYAAACEQAA61kAAOtZAAACEAAA61oAAOtaAAACDwAA61sAAOtbAAACDgAA61wAAOtcAAACDQAA610AAOtdAAACDAAA614AAOteAAACCwAA618AAOtfAAACCgAA62AAAOtgAAACCQAA62EAAOthAAACCAAA62IAAOtiAAACBwAA62MAAOtjAAACBgAA62QAAOtkAAACBQAA62UAAOtlAAACBAAA62YAAOtmAAACAwAA62cAAOtnAAACAgAA62gAAOtoAAACAQAA62kAAOtpAAACAAAA62oAAOtqAAAB/wAA62sAAOtrAAAB/gAA62wAAOtsAAAB/QAA620AAOttAAAB/AAA624AAOtuAAAB+wAA628AAOtvAAAB+gAA63EAAOtxAAAB+QAA63IAAOtyAAAB+AAA63MAAOtzAAAB9wAA63QAAOt0AAAB9gAA63UAAOt1AAAB9QAA63YAAOt2AAAB9AAA63cAAOt3AAAB8wAA63gAAOt4AAAB8gAA63kAAOt5AAAB8QAA63oAAOt6AAAB8AAA63sAAOt7AAAB7wAA63wAAOt8AAAB7gAA630AAOt9AAAB7QAA634AAOt+AAAB7AAA638AAOt/AAABrwAA64EAAOuBAAAB6wAA64IAAOuCAAAB6gAA64MAAOuDAAAB5gAA64QAAOuEAAAB5QAA64UAAOuFAAAB5AAA64YAAOuGAAAB4wAA64cAAOuHAAAB4gAA64gAAOuIAAAB4QAA64kAAOuJAAAB4AAA65oAAOuaAAAB3wAA65sAAOubAAAB3gAA65wAAOucAAAB3QAA650AAOudAAAB3AAA654AAOueAAAB2wAA658AAOufAAAB2gAA66AAAOugAAAB2QAA66EAAOuhAAAB2AAA66IAAOuiAAAB1wAA66MAAOujAAAB1gAA66QAAOukAAAB1QAA66UAAOulAAAB1AAA66YAAOumAAAB0wAA66cAAOunAAAB0gAA66gAAOuoAAAB0QAA66kAAOupAAAB0AAA67AAAOuwAAABzwAA67EAAOuxAAABzgAA67IAAOuyAAABzQAA67MAAOuzAAABzAAA67QAAOu0AAABywAA67UAAOu1AAABygAA67YAAOu2AAAByQAA67cAAOu3AAAByAAA67gAAOu4AAABxwAA67kAAOu5AAABxgAA68AAAOvAAAABxQAA68EAAOvBAAABxAAA68IAAOvCAAABwwAA68MAAOvDAAABwgAA68QAAOvEAAABwQAA68UAAOvFAAABwAAA68YAAOvGAAABvwAA68cAAOvHAAABvgAA68gAAOvIAAABvQAA68kAAOvJAAABvAAA69AAAOvQAAABuwAA69EAAOvRAAABugAA69IAAOvSAAABuQAA69MAAOvTAAABuAAA69QAAOvUAAABtwAA69UAAOvVAAABtgAA69YAAOvWAAABtQAA69cAAOvXAAABtAAA69gAAOvYAAABswAA69kAAOvZAAABsgAA6+EAAOvhAAABsQAA6+IAAOviAAABsAAA6+MAAOvjAAABrwAA6+QAAOvkAAABrgAA6+UAAOvlAAABrQAA6+YAAOvmAAABrAAA6+cAAOvnAAABqwAA6+gAAOvoAAABqgAA6+kAAOvpAAABqQAA6/AAAOvwAAABqAAA6/EAAOvxAAABpwAA6/IAAOvyAAABpgAA6/MAAOvzAAABpQAA6/QAAOv0AAABpAAA6/UAAOv1AAABowAA6/YAAOv2AAABogAA6/cAAOv3AAABoQAA6/gAAOv4AAABoAAA6/kAAOv5AAABnwAA7KAAAOygAAABngAA7KEAAOyhAAABnQAA7KIAAOyiAAABnAAA7KMAAOyjAAABmwAA7KQAAOykAAABlgAA7KUAAOylAAABlQAA7KYAAOymAAABlAAA7KcAAOynAAABkwAA7KgAAOyoAAABkgAA7KkAAOypAAABkQAA7LAAAOywAAABkAAA7LEAAOyx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Ad8B4AHhAeIB4wHkAeUB5gHnAegB6QHqAesB7AHtAe4B7wHwAfEB8gHzAfQB9QH2AfcB+AH5AfoB+wH8Af0B/gH/AgACAQICAgMCBAIFAgYCBwIIAgkCCgILAgwCDQIOAg8CEAIRAhICEwIUAhUCFgIXAhgCGQIaAhsCHAIdAh4CHwIgAiECIgIjAiQCJQImAicCKAIpAioCKwIsAi0CLgIvAjACMQIyAjMCNAI1AjYCNwI4AjkCOgI7AjwCPQI+Aj8CQAJBAkICQwJEAkUCRgJHAkgCSQJKAksCTAJNAk4CTwJQAlECUgJTAlQCVQJWAlcCWAJZAloCWwJcAl0CXgJfAmACYQJiAmMCZAJlAmYCZwJoAmkCagJrAmwCbQJuAm8CcAJxAnICcwJ0AnUCdgJ3AngCeQJ6AnsCfAJ9An4CfwKAAoECggKDAoQChQKGAocCiAKJAooCiwKMAo0CjgKPApACkQKSApMClAKVApYClwKYApkCmgKbApwCnQKeAp8CoAKhAqICowKkAqUCpgKnAqgCqQKqAqsCrAKtAq4CrwKwArECsgKzArQCtQK2ArcCuAK5AroCuwK8Ar0CvgK/AsACwQLCAsMCxALFAsYCxwLIAskCygLLAswCzQLOAs8C0ALRAtIC0wLUAtUC1gLXAtgC2QLaAtsC3ALdAt4C3wLgAuEC4gLjAuQC5QLmAucC6ALpAuoC6wLsAu0C7gLvAvAC8QLyAvMC9AL1AvYC9wL4AvkC+gL7AvwC/QL+Av8DAAMBAwIDAwMEAwUDBgMHAwgDCQMKAwsDDAMNAw4DDwMQAxEDEgMTAxQDFQMWAxcDGAMZAxoDGwMcAx0DHgMfAyADIQMiAyMDJAMlAyYDJwMoAykDKgMrAywDLQMuAy8DMAMxAzIDMwM0AzUDNgM3AzgDOQM6AzsDPAM9Az4DPwNAA0EDQgNDA0QDRQNGA0cDSANJA0oDSwNMA00DTgNPA1ADUQNSA1MDVANVA1YDVwNYA1kDWgNbA1wDXQNeA18DYANhA2IDYwNkA2UDZgNnA2gDaQNqA2sDbANtA24DbwNwA3EDcgNzA3QDdQN2A3cDeAN5A3oDewN8A30DfgN/A4ADgQOCAAphLWNodWxpcmVuCmNsb2NrLWVjYjUKY2xvY2stZTEwNwllMTAwLXVuZG8OZTIwOS1zdWJ0aXRsZXMHZTIwOC1oZBJlMTE3LWNhbmNlbC1jaXJjbGUTZTExNi1jYW5jZWwtb3V0bGluZQxlMTNkLXByZXZpZXcLZTExNS1jYW5jZWwEc3RvcApjYWxjdWxhdG9yDHNvcnQtZGVzYy1zbQ5lbmNsb3N1cmVfZWRpdBJlMDFjLWFycm93LXBhcmVudDENZTIwYS1wbGF5bGlzdBBlMDFkLWFycm93LXJvb3QxEWUwMjAtYXJyb3dzLXN3YXAxF2UwMWYtYXJyb3dzLWRpbWVuc2lvbnMxE2UxMDQtbm9uLXJlY3VycmVuY2UVZTAxZS1hcnJvd3MtcmVzaXppbmcxEGUxMjctc29ydC1hc2Mtc20IZTE0MS1wYW4OZTIwNi12b2x1bWUtdXAKZTIwMS1wYXVzZQllMjAwLXBsYXkMZTIwNC1mb3J3YXJkEGUyMDUtdm9sdW1lLWRvd24UZTE0OS1rcGktc3RhdHVzLW9wZW4PZTIwNy12b2x1bWUtb2ZmC2UyMDMtcmV3aW5kDWUxMzItZG93bmxvYWQSZTExOS1jaGVjay1vdXRsaW5lC2UxMzMtdXBsb2FkEmUxMjMtbWludXMtY2lyY2xlMQ1lMTI0LXNvcnQtYXNjC2UxMjktZmlsdGVyC2UxMjYtdW5zb3J0C2UxMzEtbG9nb3V0CmUxMzAtbG9naW4OZTEyNS1zb3J0LWRlc2MQZTEyMC1wbHVzLWNpcmNsZRRlMTQ4LWtwaS1zdGF0dXMtaG9sZAxlMTQ1LXBsdXMtc20OZTE0NC1jb25uZWN0b3IWZTEzNS1oeXBlcmxpbmstb3Blbi1zbQtlMTM2LWxhdW5jaBRlMTQ3LWtwaS1zdGF0dXMtZGVueQllMTQzLWNhcnQLZTEzNy13aW5kb3cNZTE0Ni1taW51cy1zbQ1lMTQwLXpvb20tb3V0FGUxMzktd2luZG93LW1pbmltaXplE2UxMzQtaHlwZXJsaW5rLW9wZW4SZTExMS1saW5rLXZlcnRpY2FsCWUxMTMtbG9jawtlMTAzLXJlbG9hZA1lMTA1LXJlc2V0LXNtFGUxMTItdW5saW5rLXZlcnRpY2FsFmUxMTAtdW5saW5rLWhvcml6b250YWwOZTEwNi1yZWxvYWQtc20LZTExNC11bmxvY2sLZTEwOS1mbG9wcHkKZTExOC1jaGVjaxFlMTJhLWZpbHRlci1jbGVhchJlMTBlLWF0dGFjaG1lbnQtNDULZTEzYy13cmVuY2gaZTEyZS1maWx0ZXItYWRkLWV4cHJlc3Npb24OZTEyYi1maWx0ZXItc20PZTEwZC1hdHRhY2htZW50FWUxMmYtZmlsdGVyLWFkZC1ncm91cBJlMTFjLWNsb3NlLW91dGxpbmUYZTEyZC1maWx0ZXItc29ydC1kZXNjLXNtFGUxMGYtbGluay1ob3Jpem9udGFsCGUxMGItZGl0F2UxMmMtZmlsdGVyLXNvcnQtYXNjLXNtCmUxM2ItZ2VhcnMJZTAzMC1tZW51CWUxMDEtcmVkbwplMjBiLWF1ZGlvEmUwMjktbGF5b3V0LTEtYnktNBFlMDI3LWhhbmRsZXItZHJhZw9lMDIyLWNhdGVnb3JpemUMZTIwYy1wbGF5LXNtEmUwMzEtbW9yZS12ZXJ0aWNhbAtlMDI4LWxheW91dAxlMTNmLXpvb20taW4SZTAyMS1kcmFnLWFuZC1kcm9wEmUwMmEtbGF5b3V0LTItYnktMgllMDJlLXJvd3MKZTEwMi1yZXNldAplMTBhLXByaW50GGUwMmItbGF5b3V0LXNpZGUtYnktc2lkZRBlMDFiLWFycm93LWRyaWxsE2UwMmMtbGF5b3V0LXN0YWNrZWQMZTAyZC1jb2x1bW5zFWUwMDMtYXJyb3ctNDUtdXAtbGVmdBNlMDBhLWFycm93LWVuZC1kb3duFWUwMTEtYXJyb3dzLW5vLWNoYW5nZQtlMDBiLXNlZWstdxRlMDA5LWFycm93LWVuZC1yaWdodBdlMDAyLWFycm93LTQ1LWRvd24tbGVmdBFlMDA4LWFycm93LWVuZC11cBBlMDE4LWFycm93LXJpZ2h0D2UwMTktYXJyb3ctZG93bg9lMDFhLWFycm93LWxlZnQYZTAwMS1hcnJvdy00NS1kb3duLXJpZ2h0GGUwMTItYXJyb3ctb3ZlcmZsb3ctZG93bg1lMDE3LWFycm93LXVwFmU3MDMtbWFya2VyLXBpbi10YXJnZXQNZTgwOC1kaWdnLWJveAplODA5LWVtYWlsCWU4MDctZGlnZxJlODA2LWRlbGljaW91cy1ib3gMZTgwMy1ibG9nZ2VyEGU4MDQtYmxvZ2dlci1ib3gOZTgwNS1kZWxpY2lvdXMKZTgwMi1pbmJveAllODAxLXVzZXIKZTgwMC1zaGFyZQplNzA1LXVucGluCGU3MDQtcGluDmU2OTktZm9udC1zaXplEGU2ODktcGFuZS1mcmVlemUcZTY5MC10b2dnbGUtZnVsbC1zY3JlZW4tbW9kZRJlNjg4LXRhYmxlLXVubWVyZ2UKZTcwMS1nbG9iZRJlNjk2LWN1c3RvbS1mb3JtYXQPZTY5MS1mb3JtdWxhLWZ4EmU3MDAtZ2xvYmUtb3V0bGluZQ9lNzAyLW1hcmtlci1waW4LZTY5NC1kb2xsYXIVZTY5OC1kZWNpbWFsLWRlY3JlYXNlFWU2OTctZGVjaW1hbC1pbmNyZWFzZQtlNjkzLXN5bWJvbAxlNjk1LXBlcmNlbnQIZTY5Mi1zdW0TZTY0My10ZXh0Ym94LWhpZGRlbhVlNjQ3LXRlbXBsYXRlLW1hbmFnZXIUZTY3Mi1oeXBlcmxpbmstZ2xvYmUbZTY3My1oeXBlcmxpbmstZ2xvYmUtcmVtb3ZlDGU2NDItdGV4dGJveA9lNjQ2LWVkaXQtdG9vbHMLZTYzZC1idXR0b24KZTY3Ny10YWJsZRFlNjgyLXRhYmxlLWRlbGV0ZRVlNjc4LXRhYmxlLXByb3BlcnRpZXMQZTY4My1jZWxscy1tZXJnZRxlNjg2LWNlbGwtc3BsaXQtaG9yaXpvbnRhbGx5FmU2ODEtdGFibGUtY2VsbC1kZWxldGULZTY3NS1hbmNob3IbZTY4Ny1jY2VsbC1zcGxpdC12ZXJ0aWNhbGx5EWU4MGMtZmFjZWJvb2stYm94G2U2ODUtY2VsbHMtbWVyZ2UtdmVydGljYWxseR1lNjg0LWNlbGxzLW1lcmdlLWhvcml6b250YWxseRVlNjgwLXRhYmxlLXJvdy1kZWxldGUPZTY3OS10YWJsZS1jZWxsFGU2NzQtaHlwZXJsaW5rLWVtYWlsF2U2NzYtdGFibGUtbGlnaHQtZGlhbG9nHmU2N2MtdGFibGUtY29sdW1uLWluc2VydC1yaWdodBRlNjhmLXZhbGlkYXRpb24tZGF0YQ1lODBiLWZjYWVib29rD2U2OGEtcm93LWZyZWV6ZRJlNjhiLWNvbHVtbi1mcmVlemUbZTY3ZS10YWJsZS1yb3ctaW5zZXJ0LWJlbG93HWU2N2ItdGFibGUtY29sdW1uLWluc2VydC1sZWZ0G2U2N2QtdGFibGUtcm93LWluc2VydC1hYm92ZRplNjdhLXRhYmxlLWNlbGwtcHJvcGVydGllcxxlNjlhLWltYWdlLWFic29sdXRlLXBvc2l0aW9uEmU2OGMtdG9vbGJhci1mbG9hdBhlNjdmLXRhYmxlLWNvbHVtbi1kZWxldGUOZTgwYS1lbWFpbC1ib3gSZTY4ZC1zcGVsbC1jaGVja2VyFWU2OGUtdmFsaWRhdGlvbi14aHRtbAhlOTE5LWNzcwplOTE3LWh0bWw1B2U5MWYtdmILZTkxZC12YnByb2oUZTkyMi1maWxlLWhvcml6b250YWwIZTkxYi1leGUHZTkxYS1qcwtlOTFjLWNzcHJvagplOTIxLWNsb3VkB2U5MWUtY3MJZTkxOC1odG1sCGU5MjAtc2xuDmU5MTItZmlsZS1hc2N4D2U5MTAtZmlsZS1mbGFzaAllOTE1LWZpbG0JZTkxNi1jc3MzDWU5MTQtZmlsZS16aXANZTkwZS1maWxlLXBkZg1lOTBkLWZpbGUtcHB0EGU5MTEtZmlsZS1jb25maWcNZTkwZi1maWxlLXBzZA1lOTEzLWZpbGUtYmFjDWU5MDctZmlsZS1hZGQOZTkwMy1mb2xkZXItdXAPZTkwYS1maWxlLWV4Y2VsFWU5MDUtYWdncmVnYXRlLWZpZWxkcwllOTA2LWZpbGUIZTkwOS1jc3YIZTkwYy1tZGIQZTkwNC1mb2xkZXItbW9yZQ5lOTBiLWZpbGUtd29yZA1lOTA4LWZpbGUtdHh0EGU5MDEtZm9sZGVyLW9wZW4IZTgyNy1yc3MKZTgyOS12aW1lbwtlOTAwLWZvbGRlcgxlODI4LXJzcy1ib3gQZTgyYy15b3V0dWJlLWJveAxlODJiLXlvdXR1YmUOZTgyYS12aW1lby1ib3gRZTgyNi1kcmliYmJsZS1ib3gPZTkwMi1mb2xkZXItYWRkFmU4MWMtdGVsbC1hLWZyaWVuZC1ib3gPZTgxZS10dW1ibHItYm94C2U4MWQtdHVtYmxyEGU4MjAtdHdpdHRlci1ib3gPZTgyMi15YW1tZXItYm94C2U4MjEteWFtbWVyDGU4MjMtYmVoYW5jZRBlODI0LWJlaGFuY2UtYm94DWU4MjUtZHJpYmJibGUMZTgxZi10d2l0dGVyDmU4MTUtcGludGVyZXN0EmU4MTYtcGludGVyZXN0LWJveBFlODE5LXN0dW1ibGUtdXBvbgtlODBkLWdvb2dsZRBlODE0LW15c3BhY2UtYm94FWU4MWEtc3R1bWJsZS11cG9uLWJveA1lODExLWxpbmtlZGluEWU4MTItbGlua2VkaW4tYm94EGU4MGYtZ29vZ2xlLXBsdXMPZTgwZS1nb29nbGUtYm94D2U4MTgtcmVkZGl0LWJveBRlODEwLWdvb2dsZS1wbHVzLWJveAxlODEzLW15c3BhY2ULZTgxNy1yZWRkaXQSZTgxYi10ZWxsLWEtZnJpZW5kEHN0cmlwLWNzcy1mb3JtYXQOdmlkZW8tZXh0ZXJuYWwTc3RyaXAtc3Bhbi1lbGVtZW50cwpzZWxlY3QtYWxsGHRhYmxlLWFsaWduLWJvdHRvbS1yaWdodBNzdHJpcC1hbGwtZm9ybWF0aW5nCHRleHRhcmVhCmltYWdlLWVkaXQJdGV4dC13cmFwGHRhYmxlLWFsaWduLW1pZGRsZS1yaWdodBJ0YWJsZS1hbGlnbi1yZW1vdmUNdHJhY2stY2hhbmdlcxh0cmFjay1jaGFuZ2VzLXJlamVjdC1hbGwMYWxpZ24tcmVtb3ZlDGFsaWduLWNlbnRlcg1hbGlnbi1qdXN0aWZ5C2FsaWduLXJpZ2h0CWJvcmRlci1ubwxhcHBseS1mb3JtYXQLYm9yZGVyLWxlZnQNYm9yZGVyLWJvdHRvbQtib3JkZXJzLWFsbBdib3JkZXJzLWluc2lkZS12ZXJ0aWNhbA9ib3JkZXJzLW91dHNpZGUZYm9yZGVycy1pbnNpZGUtaG9yaXpvbnRhbARjb3B5CWNsZWFyLWNzcwpib3JkZXItdG9wDGJvcmRlci1yaWdodBtlNjcxLWh5cGVybGluay1saWdodC1kaWFsb2cRYm9yZGVycy1zaG93LWhpZGUOYm9yZGVycy1pbnNpZGUOZGljdGlvbmFyeS1hZGQLY3VzdG9tLWljb24HY29tbWVudBBkb2N1bWVudC1tYW5hZ2VyC2NvcHktZm9ybWF0D2NoYW5nZS1tYW51YWxseQ5jb21tZW50LXJlbW92ZQ1jYWxlbmRhci1kYXRlE2NvbW1lbnRzLXJlbW92ZS1hbGwQaW1hZ2UtbWFwLWVkaXRvcgNjdXQObW9kdWxlLW1hbmFnZXIFcGFzdGUSaW1hZ2UtbGlnaHQtZGlhbG9nDGNvZGUtc25pcHBldAxmb3JtLWVsZW1lbnQNbWVkaWEtbWFuYWdlcg1mbGFzaC1tYW5hZ2VyDXBhcmFncmFwaC1hZGQacGFzdGUtZnJvbS13b3JkLXN0cmlwLWZpbGUPcnVsZS1ob3Jpem9udGFsD3Bhc3RlLWZyb20td29yZA1wYXN0ZS1hcy1odG1sE3N0cmlwLWZvbnQtZWxlbWVudHMXdGFibGUtYWxpZ24tYm90dG9tLWxlZnQQZmluZC1hbmQtcmVwbGFjZRZ0YWJsZS1hbGlnbi10b3AtY2VudGVyCnBhc3RlLWh0bWwVc3RyaXAtd29yZC1mb3JtYXR0aW5nGXRhYmxlLWFsaWduLW1pZGRsZS1jZW50ZXIRZm9ybWF0LWNvZGUtYmxvY2sUdHJhY2stY2hhbmdlcy1yZWplY3QJZ3JvdXAtYm94BGZvcm0ZdGFibGUtYWxpZ24tYm90dG9tLWNlbnRlcgtzaWx2ZXJsaWdodBBwYXN0ZS1wbGFpbi10ZXh0CnNlbGVjdC1ib3gOcGFzdGUtbWFya2Rvd24XdGFibGUtYWxpZ24tbWlkZGxlLWxlZnQUdHJhY2stY2hhbmdlcy1lbmFibGUVdGFibGUtYWxpZ24tdG9wLXJpZ2h0DXN0eWxlLWJ1aWxkZXIUdGFibGUtYWxpZ24tdG9wLWxlZnQUdHJhY2stY2hhbmdlcy1hY2NlcHQYdHJhY2stY2hhbmdlcy1hY2NlcHQtYWxsEWEtZTYwNGZvbnQtZmFtaWx5EGEtZTYwOXN1Yi1zY3JpcHQWYS1lNjA1Zm9yZWdyb3VuZC1jb2xvcgphLWU2MDFib2xkCGEtZTYxMGg0E2EtZTYwOHN0cmlrZXRocm91Z2gXYS1lNjA2Y29udmVydC1sb3dlcmNhc2UXYS1lNjA3Y29udmVydC11cHBlcmNhc2UMYS1lNjAyaXRhbGljD2EtZTYwM3VuZGVybGluZRJhLWU2MWNhbGlnbi1ib3R0b20IYS1lNjBkaDEIYS1lNjBmaDMJYS1lNjBjYWxsCGEtZTYwZWgyEGEtZTYwYXN1cC1zY3JpcHQJYS1lNjBiZGl2EGEtZTYxZGFsaWduLWxlZnQPYS1lNjFhYWxpZ24tdG9wEmEtZTYxYmFsaWduLW1pZGRsZRVhLWU2MTVpbmRlbnQtaW5jcmVhc2UTYS1lNjE4aW5zZXJ0LW1pZGRsZRRhLWU2MTRsaXN0LXVub3JkZXJlZBVhLWU2MTZpbmRlbnQtZGVjcmVhc2UPYS1lNjE3aW5zZXJ0LXVwEWEtZTYxOWluc2VydC1kb3duCGEtZTYxMmg2EmEtZTYxM2xpc3Qtb3JkZXJlZAhhLWU2MTFoNRNhLWU1MjR0aHVtYm5haWxzLXVwFmEtZTUyOWZ1bGwtc2NyZWVuLWV4aXQVYS1lNTI2dGh1bWJuYWlscy1kb3duFWEtZTYwMHBhZ2UtcHJvcGVydGllcxVhLWU1Mjd0aHVtYm5haWxzLWxlZnQaYS1lNTIzYWxpZ24tYm90dG9tLWVsZW1lbnQRYS1lNTI4ZnVsbC1zY3JlZW4WYS1lNTI1dGh1bWJuYWlscy1yaWdodBFhLWU1MmFyZXNldC1jb2xvchphLWU1MjJhbGlnbi1taWRkbGUtZWxlbWVudBJhLWU1MWJiYWNrLWVsZW1lbnQZYS1lNTIwYWxpZ24tcmlnaHQtZWxlbWVudBVhLWU1MWNmb3J3YXJkLWVsZW1lbnQLYS1lNTE4c2hhcGUXYS1lNTIxYWxpZ24tdG9wLWVsZW1lbnQWYS1lNTFkYmFja3dhcmQtZWxlbWVudBNhLWU1MTlyb3VuZC1jb3JuZXJzGGEtZTUxZWFsaWduLWxlZnQtZWxlbWVudBNhLWU1MWFmcm9udC1lbGVtZW50GmEtZTUxZmFsaWduLWNlbnRlci1lbGVtZW50CmEtZTUxMGxpbmUZYS1lNTExYnJpZ2h0bmVzcy1jb250cmFzdAthLWU1MGZwYWludA9hLWU1MTVncmV5c2NhbGUNYS1lNTBlcGFsZXR0ZQ1hLWU1MTdzaGFycGVuE2EtZTUxM2ludmVydC1jb2xvcnMKYS1lNTE2Ymx1chBhLWU1MTJzYXR1cmF0aW9uEmEtZTUxNHRyYW5zcGVyYW5jeQxhLWU1MGFyb3RhdGUTYS1lNTA0em9vbS1iZXN0LWZpdAthLWU1MGRicnVzaBFhLWU1MGNyb3RhdGUtbGVmdAphLWU1MDZjcm9wE2EtZTUwOWZsaXAtdmVydGljYWwMYS1lNTA3bWlycm9yFWEtZTUwOGZsaXAtaG9yaXpvbnRhbBJhLWU1MDVpbWFnZS1yZXNpemUSYS1lNTBicm90YXRlLXJpZ2h0DWEtZTIwZXN0b3Atc20SYS1lNTAyaW1hZ2UtZXhwb3J0FGEtZTMwN3RyaS1zdGF0ZS1udWxsC2EtZTUwMWltYWdlE2EtZTMwMGhlYXJ0LW91dGxpbmUWYS1lNTAzem9vbS1hY3R1YWwtc2l6ZQxhLWUzMDhjaXJjbGULYS1lMzAxaGVhcnQSYS1lNTAwcGhvdG8tY2FtZXJhDmEtZTIwZHBhdXNlLXNtC2NvbGxhcHNlLW5lCXRodW1idGFjawtzLXRodW1idGFjawZtb3ZldG8NZmlsdGVyX2RlbGV0ZQ9maWx0ZXJfZ3JvdXBpbmcKZmlsdGVyX2FkZBNmaWx0ZXJfY2FuY2VsbGF0aW9uBnZlcm5hdgpjdy1hcnJvd2RlCGN3LWhvdGVsB2N3LXRyaXAFemhhZ2UHZGVuZ2hhbw10aXNoaXNodW9taW5nBERyYWcGYmlhbmppBmNoYWthbgJiZwRsaGp0CGR1bGltaW1hEXFpYW5taW5ncWlhbnpoYW5nBmZhbmt1aRRhLUNGX0Rlc2NlbmRpbmdPcmRlchNhLUNGX0FzY2VuZGluZ09yZGVyBWFib3V0CXl1bnhpYW94aRBlbmNsb3N1cmVfZGVsZXRlEmVuY2xvc3VyZV9kb3dubG9hZBBlbmNsb3N1cmVfdXBsb2FkEGVuY2xvc3VyZV9icm93c2UKdXBsb2FkX2JpZw9jYWxlbmRhcnNfbGluZTEJbW9yZV9saW5lDmRyb3AtZG93bl9saW5lEHBlcnNwZWN0aXZlX3ZpZXcKY2hhcnRfdmlldwlmb3JtX3ZpZXcJbGlzdF92aWV3CWNhcmRfdmlldwtyZW1vdmVfZmFjZQtkdWl6aGFuZ2Rhbg1kaXpoaXNoZW5xaW5nDWppbmd4aWFvcmVud3UHYmFpZmFuZwprZWh1Z3VhbnhpCGZheXVuZGFuCWxpYW54aXJlbg1mdWt1YW50b25nemhpD2thaXBpYW9zaGVucWluZw94aWFvc2hvdWRhY2hlbmcOeGlhb3Nob3VxaWFubGkOeGlhb3Nob3VtdWJpYW8Nc2h1anVzaGFuZ2Jhbwx4dWtlc2hhbmdwaW4Jemhlbmd6aGFvDHhpYW9zaG91eXVjZQ94aWFvc2hvdXR1YW5kdWkFaGVscDELaW5mby1jaXJjbGUKZGVwYXJ0bWVudARjb2RlBHBhdGgPZmxvd2xpbmUtbWFudWFsDWZsb3dsaW5lLW1vcmUSZmxvd2xpbmUtc2NoZWR1bGVkEWZsb3dsaW5lLWNhbmNlbGVkEGZsb3dsaW5lLXBlbmRpbmcMZmxvd2xpbmUtcnVuEGZsb3dsaW5lLWNyZWF0ZWQQZmxvd2xpbmUtcnVubmluZxBmbG93bGluZS13YWl0aW5nEGZsb3dsaW5lLXNraXBwZWQNZmxvd2xpbmUtdmlldxBmbG93bGluZS13YXJuaW5nC29yaWVudGF0aW9uBGxhc3QFZmlyc3QOeXVuaGFuZ3NoaWljb24aQ29sdW1uLWZpbHRlcmFuZGRlc2NlbmRpbmcZQ29sdW1uLWZpbHRlcmFuZGFzY2VuZGluZxxDb2x1bW5zLURlZmF1bHRmaWx0ZXJhbmRzb3J0DUNvbHVtbi1maWx0ZXISQ29sdW1ucy1kZXNjZW5kaW5nEUNvbHVtbnMtYXNjZW5kaW5nE0NvbHVtbnMtRGVmYXVsdHNvcnQPbGF1bmNocGFkLWZhY2UyCmxhdW5jaHBhZDIPZi1pY29uLWNoZWNrYm94DGYtaWNvbi1taW51cwpmLWljb24tYWRkCGRyb3Bkb3duCm5hdmlnYXRpb24Ray1pLW1lc3NhZ2VfZXJyb3ITay1pLW1lc3NhZ2Vfc3VjY2VzcwpzdWRva3UtbmV3CGxpc3QtbmV3CXRpbGVkLW5ldwxxaWVodWFuenV6aGkHcmFkaW8tMgZ0ZW5hbnQGc3Vkb2t1BXRpbGVkBWxpc3QxC3Nob3VjYW5namlhCmNvbGxlY3Rpb24DaWRlDG9jY2x1ZGUtZmFjZQdvY2NsdWRlDmxhdW5jaHBhZC1mYWNlCWxhdW5jaHBhZAtpbmZvcm1hdGlvbgdiYWNrbG9nB21lc3NhZ2UJbWF4aW1pemUxBnNlYXJjaAppbmRleC1mYWNlBWluZGV4CHl4c190ZXh0DXl4c19jb250YWluZXILeXhzX2NvbHVtbnMIeXhzX21vdmUIeXhzX2NvcHkKeXhzX2RlbGV0ZQl5eHNfbGV2ZWwJeXhzX2VhcnRoDXl4c19jdXN0b21pemUIc2lnbl9vdXQLdXNlcl9jZW50ZXIGcmVtb3ZlBnBhY2t1cAZjYW1lcmEGbmFycm93DWFtcGxpZmljYXRpb24JY2xvY2t3aXNlEGNvdW50ZXJjbG9ja3dpc2UGZWRpdG9yBHNraW4EYXJlYQhwYXNzd29yZAhsYW5ndWFnZQViYXNpYwhtaW5pbWl6ZQxtYXhpbWl6YXRpb24NbmV3LWRpbWVuc2lvbhFmaWxlLWZvbGRlci1jbG9zZRBmaWxlLWZvbGRlci1vcGVuCG5ldy1lZGl0CG5ldy1mb3JtBXdvbWFuA21hbgZyZWNvcmQEbW9yZQRsaXN0CXRlbGVwaG9uZQhmdW5jdGlvbgtwcm9kdWN0bGlzdA5hdHRhY2htZW50bGlzdBNkb2N1bWVudGluZm9ybWF0aW9uDG5ldy1maWx0cmF0ZQ5uZXctZnVsbHNjcmVlbgdyb29maW5nDUJvdHRvbXNldHRpbmcPcGFnZS10aXRsZS10YXNrEXBhZ2UtdGl0bGUtcmV2aWV3EHBhZ2UtdGl0bGUtc3RhcnQPcGFnZS10aXRsZS10eXBlEXBhZ2UtdGl0bGUtcmVjb3JkEnBhZ2UtdGl0bGUtdm91Y2hlchBwYWdlLXRpdGxlLXF1ZXJ5EXBhZ2UtdGl0bGUtbnVtYmVyEXBhZ2UtdGl0bGUtbWFuYWdlFnBhZ2UtdGl0bGUtbWFpbnRlbmFuY2UVcGFnZS10aXRsZS1kaWN0aW9uYXJ5GHBhZ2UtdGl0bGUtY29uZmlndXJhdGlvbhVwYWdlLXRpdGxlLWFkbWluaXN0ZXIRcGFnZS10aXRsZS1kZWZpbmUXdHJpLXN0YXRlLWluZGV0ZXJtaW5hdGUQcGFuZWwtcmV0cmFjdGlvbgtlZGl0LWJ1dHRvbg5pbnB1dC1sYW5ndWFnZRdhdHRyaWJ1dGUtY29uZmlndXJhdGlvbgtFbmdpbmVlcmluZwNnaXQTcmFkaW9idXR0b24tY2hlY2tlZAxzaGFwZS1jaXJjbGUQY2hlY2tib3gtY2hlY2tlZBVrLWktaG9tZS13ZWF0aGVyLWxlYWYNay1pLWhvbWUtbW9yZQ1rLWktaG9tZS1yaW5nDGstaS1ob21lLWFkZA5rLWktaG9tZS1zZXR1cA5rLWktaG9tZS13b21hbgxrLWktaG9tZS1tYW4Oay1pLXRvcF9hZ2VuY3kMay1pLXRvcF9uZXdzDGstaS10b3BfaG9tZRJrLWktdG9wX2ltX2RlZmF1bHQXay1pLXRvcF9kZXZlbG9wbWVudHRvb2wMay1pLXRvcF9tZW51DmstaS10b3Bfc2VhcmNoCmstaS10b3BfbXkPay1pLWZsYWdfdXJnZW50DGstaS1uZXh0cGFnZRBrLWktcHJldmlvdXNwYWdlE2staS1tZXNzYWdlX3JvdXRpbmUTay1pLUV4aGFsZS1EaXNjb3VudBNrLWktbW9yZS1ob3Jpem9udGFsEGstaS1tZXNzYWdlX2hlbHATay1pLW1lc3NhZ2Vfd2FybmluZxZrLWktc3RlcHMtZGVsaXZlcmdvb2RzFWstaS1zdGVwcy1yZWNlaXZhYmxlcxFrLWktc3RlcHMtaW52b2ljZRRrLWktc3RlcHMtb3V0b2ZzdG9jaxRrLWktc3RlcHMtc2V0dGxlbWVudBNrLWktc3RlcHMtdHJhbnNwb3J0DGstaS1ib29rbWFyaxBrLWktc3Rhci1vdXRsaW5lCGstaS16b29tEGstaS1jbG9zZS1jaXJjbGUQay1pLWNoZWNrLWNpcmNsZQlrLWktY2xvc2UQay1pLXBsdXMtb3V0bGluZRFrLWktbWludXMtb3V0bGluZQtrLWktcmVvcmRlcg1rLWktcmV3aW5kLXNtDmstaS1mb3J3YXJkLXNtE2staS1hcnJvdy1zZWVrLWRvd24Ray1pLWFycm93LXNlZWstdXAKay1pLWRlbGV0ZQlrLWktZ3JvdXAIay1pLWdyaWQPay1pLWdyaWQtbGF5b3V0DmstaS1hcnJvd3Mta3BpFmstaS1hcnJvdy1jaGV2cm9uLWxlZnQXay1pLWFycm93LWNoZXZyb24tcmlnaHQWay1pLWFycm93LWNoZXZyb24tZG93bhRrLWktYXJyb3ctY2hldnJvbi11cBFrLWktYXJyb3ctNjAtbGVmdAtrLWktYXJyb3ctZRFrLWktYXJyb3ctNjAtZG93bg9rLWktYXJyb3ctNjAtdXAAAAA=) format("truetype")}.f-icon{width:1em;font-size:1rem;font-weight:400;line-height:1;text-decoration:none;display:inline-block}.f-icon:focus,.f-icon:hover{text-decoration:none}.f-icon-sm{font-size:.75rem}.f-icon-lg{font-size:1.5rem}.f-icon-none::before{content:"";display:none}.f-icon-arrow-45-up-right::before,.f-icon-collapse-ne::before,.f-icon-resize-ne::before{content:"\e000"}.f-icon-arrow-45-down-right::before,.f-icon-collapse-se::before,.f-icon-resize-se::before{content:"\e001"}.f-icon-arrow-45-down-left::before,.f-icon-collapse-sw::before,.f-icon-resize-sw::before{content:"\e002"}.f-icon-arrow-45-up-left::before,.f-icon-collapse-nw::before,.f-icon-resize-new::before,.f-icon-resize-nw::before{content:"\e003"}.f-icon-arrow-60-up::before,.f-icon-arrow-n::before,.f-icon-expand-n::before,.f-icon-kpi-trend-increase::before,.f-icon-sarrow-n::before{content:"\e004"}.f-icon-arrow-60-right::before,.f-icon-arrow-e::before,.f-icon-expand-e::before,.f-icon-expand::before,.f-icon-sarrow-e::before{content:"\e005"}.f-icon-arrow-60-down::before,.f-icon-arrow-s::before,.f-icon-collapse::before,.f-icon-expand-s::before,.f-icon-kpi-trend-decrease::before,.f-icon-sarrow-s::before{content:"\e006"}.f-icon-arrow-60-left::before,.f-icon-arrow-w::before,.f-icon-expand-w::before,.f-icon-sarrow-w::before{content:"\e007"}.f-icon-arrow-end-up::before{content:"\e008"}.f-icon-arrow-end-right::before,.f-icon-seek-e::before{content:"\e009"}.f-icon-arrow-end-down::before{content:"\e00a"}.f-icon-arrow-end-left::before,.f-icon-seek-w::before{content:"\e00b"}.f-icon-arrow-double-60-up::before,.f-icon-arrow-seek-up::before,.f-icon-seek-n::before{content:"\e00c"}.f-icon-arrow-double-60-right::before,.f-icon-arrow-seek-right::before,.f-icon-forward-sm::before{content:"\e00d"}.f-icon-arrow-double-60-down::before,.f-icon-arrow-seek-down::before,.f-icon-seek-s::before{content:"\e00e"}.f-icon-arrow-double-60-left::before{content:"\e00f"}.f-icon-arrow-chevron-up::before,.f-icon-arrowhead-n::before{content:"\e013"}.f-icon-arrow-chevron-right::before,.f-icon-arrowhead-e::before{content:"\e014"}.f-icon-arrow-chevron-down::before,.f-icon-arrowhead-s::before{content:"\e015"}.f-icon-arrow-chevron-left::before,.f-icon-arrowhead-w::before{content:"\e016"}.f-icon-grid::before{content:"\e023"}.f-icon-grid-layout::before{content:"\e024"}.f-icon-group::before{content:"\e025"}.f-icon-ungroup::before{content:"\e026"}.f-icon-undo-large::before,.f-icon-undo::before{content:"\e100"}.f-icon-redo-large::before,.f-icon-redo::before{content:"\e101"}.f-icon-reset::before{content:"\e102"}.f-icon-refresh::before,.f-icon-reload::before{content:"\e103"}.f-icon-clock::before{content:"\ecb5"}.f-icon-calendar::before{content:"\e108"}.f-icon-save::before{content:"\e109"}.f-icon-edit::before,.f-icon-pencil::before{content:"\e10b"}.f-icon-delete::before,.f-icon-trash::before{content:"\e10c"}.f-icon-attachment::before,.f-icon-clip::before{content:"\e10d"}.f-icon-attachment-45::before,.f-icon-clip-45::before{content:"\e10e"}.f-icon-lock::before{content:"\e113"}.f-icon-unlock::before{content:"\e114"}.f-icon-cancel::before{content:"\e115"}.f-icon-cancel-outline::before,.f-icon-deny::before{content:"\e116"}.f-icon-cancel-circle::before{content:"\e117"}.f-icon-check::before,.f-icon-checkmark::before,.f-icon-tick::before{content:"\e118"}.f-icon-check-outline::before,.f-icon-checkmark-outline::before{content:"\e119"}.f-icon-success::before{content:"\eb7d"}.f-icon-check-circle::before,.f-icon-checkmark-circle::before{content:"\e11a"}.f-icon-x::before{content:"\e11b"}.f-icon-close-outline::before,.f-icon-x-outline::before{content:"\e11c"}.f-icon-error::before{content:"\eb7e"}.f-icon-close-circle::before,.f-icon-x-circle::before,.input-group .input-group-append>.input-group-clear .modal_close::before,.input-group .input-group-prepend>.input-group-clear .modal_close::before{content:"\e11d"}.f-icon-add::before,.f-icon-plus::before{content:"\e11e"}.f-icon-plus-outline::before{content:"\e11f"}.f-icon-plus-circle::before{content:"\e120"}.f-icon-kpi-trend-equal::before,.f-icon-minus::before,.k-minus::before{content:"\e121"}.f-icon-minus-outline::before{content:"\e122"}.f-icon-minus-circle::before{content:"\e123"}.f-icon-filter::before{content:"\e129"}.f-icon-filter-clear::before{content:"\e12a"}.f-icon-filter-sort-asc-sm::before{content:"\e12c"}.f-icon-filter-sort-desc-sm::before{content:"\e12d"}.f-icon-download::before{content:"\e132"}.f-icon-upload::before{content:"\e133"}.f-icon-minimize::before,.f-icon-window-minimize::before{content:"\e139"}.f-icon-cog::before,.f-icon-gear::before{content:"\e13a"}.f-icon-cogs::before,.f-icon-gears::before{content:"\e13b"}.f-icon-eye::before,.f-icon-preview::before{content:"\e13d"}.f-icon-search::before,.f-icon-zoom::before{content:"\e13e"}.f-icon-fav-outline::before,.f-icon-favorite-outline::before{content:"\e300"}.f-icon-fav::before,.f-icon-favorite::before,.f-icon-heart::before{content:"\e301"}.f-icon-bookmark-outline::before,.f-icon-star-outline::before{content:"\e302"}.f-icon-bookmark::before,.f-icon-star::before{content:"\e303"}.f-icon-checkbox::before,.f-icon-shape-rect::before{content:"\e304"}.f-icon-checkbox-checked::before{content:"\e305"}.f-icon-radiobutton::before,.f-icon-shape-circle::before{content:"\e309"}.f-icon-radiobutton-checked::before{content:"\e30a"}.f-icon-folder::before{content:"\e900"}.f-icon-folder-open::before{content:"\e901"}.f-icon-file::before{content:"\e906"}.f-icon-message_help::before{content:"\eb04"}.f-icon-message_routine::before{content:"\eb05"}.f-icon-message_warning::before{content:"\eb06"}.f-icon-previouspage::before{content:"\eb0e"}.f-icon-nextpage::before{content:"\eb0f"}.f-icon-top_menu::before{content:"\eb12"}.f-icon-edit-button::before{content:"\eb25"}.f-icon-file-folder-close::before{content:"\eb47"}.f-icon-file-folder-open::before{content:"\eb48"}.f-icon-maximization::before{content:"\eb4a"}.f-icon-minimize::before{content:"\eb4b"}.f-icon-editor::before{content:"\eb52"}.f-icon-occlude::before{content:"\eb6e"}.f-icon-occlude-face::before{content:"\eb6f"}.f-icon-camera::before{content:"\eb57"}.f-icon-date::before{content:"\eb7f"}.f-icon-dropdown::before{content:"\eb82"}.f-icon-timepicker::before{content:"\e107"}.f-icon-info::before,.f-icon-note::before{content:"\eb05"}.f-icon-question::before{content:"\eb04"}.f-icon-help::before{content:"\e402"}.f-icon-warning::before{content:"\eb06"}.f-icon-drag-vertical::before{content:"\eca0"}.f-icon-page-title-define::before{content:"\eb2a"}.f-icon-page-title-administer::before{content:"\eb2b"}.f-icon-page-title-configuration::before{content:"\eb2c"}.f-icon-page-title-dictionary::before{content:"\eb2d"}.f-icon-page-title-maintenance::before{content:"\eb2e"}.f-icon-page-title-query::before{content:"\eb2f"}.f-icon-page-title-number::before{content:"\eb30"}.f-icon-page-title-manage::before{content:"\eb31"}.f-icon-page-title-review::before{content:"\eb32"}.f-icon-page-title-start::before{content:"\eb33"}.f-icon-page-title-type::before{content:"\eb34"}.f-icon-page-title-record::before{content:"\eb35"}.f-icon-page-title-voucher::before{content:"\eb36"}.f-icon-page-title-task::before{content:"\eb37"}.f-icon-remove_face::before{content:"\ebd4"}.f-icon-enclosure_delete::before{content:"\ebe8"}.f-icon-enclosure_download::before{content:"\ebe7"}.f-icon-enclosure_upload::before{content:"\ebe6"}.f-icon-enclosure_browse::before{content:"\ebe5"}.f-icon-upload_big::before{content:"\ebe4"}.f-icon-arrow-seek-left::before,.f-icon-rewind-sm::before,.f-list-nav.f-list-nav-left .f-list-nav-toggle-sidebar .triangle::before{content:"\e00f"}.f-icon-spin{animation:spinicon 2s infinite linear}@keyframes spinicon{0%{transform:rotate(0)}100%{transform:rotate(359deg)}}.f-icon-with-modifier{position:relative;margin:.25em}.f-icon-modifier{position:absolute;font-size:.5em;bottom:0;right:0;margin:0 -.5em -.5em 0}.f-icon-xs{font-size:.5rem}.f-icon-md,.f-legend-icon::after,.modal_close{font-size:1.25rem}.f-icon-xl{font-size:2rem}.f-icon-arrows-kpi::before,.f-icon-kpi::before{content:"\e010"}.f-icon-arrows-no-change::before{content:"\e011"}.f-icon-arrow-overflow-down::before{content:"\e012"}.f-icon-arrow-up::before{content:"\e017"}.f-icon-arrow-right::before{content:"\e018"}.f-icon-arrow-down::before{content:"\e019"}.f-icon-arrow-left::before{content:"\e01a"}.f-icon-arrow-drill::before{content:"\e01b"}.f-icon-arrow-parent::before{content:"\e01c"}.f-icon-arrow-root::before{content:"\e01d"}.f-icon-arrows-resizing::before{content:"\e01e"}.f-icon-arrows-dimensions::before,.f-icon-dimension::before{content:"\e01f"}.f-icon-arrows-swap::before{content:"\e020"}.f-icon-drag-and-drop::before{content:"\e021"}.f-icon-categorize::before{content:"\e022"}.f-icon-handler-drag::before{content:"\e027"}.f-icon-layout::before{content:"\e028"}.f-icon-layout-1-by-4::before{content:"\e029"}.f-icon-layout-2-by-2::before,.f-icon-page-layout::before{content:"\e02a"}.f-icon-layout-side-by-side::before{content:"\e02b"}.f-icon-layout-stacked::before{content:"\e02c"}.f-icon-columns::before{content:"\e02d"}.f-icon-rows::before{content:"\e02e"}.f-icon-reorder::before{content:"\e02f"}.f-icon-hamburger::before,.f-icon-menu::before{content:"\e030"}.f-icon-more-vertical::before,.f-icon-vbars::before{content:"\e031"}.f-icon-hbars::before,.f-icon-more-horizontal::before{content:"\e032"}.f-icon-recurrence::before{content:"\e103"}.f-icon-non-recurrence::before,.f-icon-refresh-clear::before{content:"\e104"}.f-icon-reset-sm::before{content:"\e105"}.f-icon-recurrence-sm::before,.f-icon-refresh-sm::before,.f-icon-reload-sm::before{content:"\e106"}.f-icon-floppy::before{content:"\e109"}.f-icon-print::before,.f-icon-printer::before{content:"\e10a"}.f-icon-hyperlink::before,.f-icon-link-horizontal::before{content:"\e10f"}.f-icon-hyperlink-remove::before,.f-icon-unlink-horizontal::before{content:"\e110"}.f-icon-link-vertical::before{content:"\e111"}.f-icon-unlink-vertical::before{content:"\e112"}.f-icon-sort-asc::before{content:"\e124"}.f-icon-sort-desc::before{content:"\e125"}.f-icon-sort-clear::before,.f-icon-unsort::before{content:"\e126"}.f-icon-sort-asc-sm::before{content:"\e127"}.f-icon-sort-desc-sm::before{content:"\e128"}.f-icon-filter-sm::before{content:"\e12b"}.f-icon-filter-add-expression::before{content:"\e12e"}.f-icon-filter-add-group::before{content:"\e12f"}.f-icon-login::before{content:"\e130"}.f-icon-logout::before{content:"\e131"}.f-icon-hyperlink-open::before{content:"\e134"}.f-icon-hyperlink-open-sm::before{content:"\e135"}.f-icon-launch::before{content:"\e136"}.f-icon-maximize::before,.f-icon-window-maximize::before,.f-icon-window::before{content:"\e137"}.f-icon-restore::before,.f-icon-tiles::before,.f-icon-window-restore::before,.f-icon-windows::before{content:"\e138"}.f-icon-custom::before{content:"\e13a"}.f-icon-settings::before,.f-icon-wrench::before{content:"\e13c"}.f-icon-zoom-in::before{content:"\e13f"}.f-icon-zoom-out::before{content:"\e140"}.f-icon-move::before,.f-icon-pan::before{content:"\e141"}.f-icon-calculator::before{content:"\e142"}.f-icon-cart::before,.f-icon-shopping-cart::before{content:"\e143"}.f-icon-connector::before{content:"\e144"}.f-icon-plus-sm::before,.f-icon-splus::before{content:"\e145"}.f-icon-minus-sm::before,.f-icon-sminus::before{content:"\e146"}.f-icon-kpi-status-deny::before{content:"\e147"}.f-icon-kpi-status-hold::before{content:"\e148"}.f-icon-kpi-status-open::before{content:"\e149"}.f-icon-play::before{content:"\e200"}.f-icon-pause::before{content:"\e201"}.f-icon-stop::before{content:"\e202"}.f-icon-rewind::before{content:"\e203"}.f-icon-forward::before{content:"\e204"}.f-icon-volume-down::before,.f-icon-volume-low::before{content:"\e205"}.f-icon-volume-high::before,.f-icon-volume-up::before{content:"\e206"}.f-icon-volume-mute::before,.f-icon-volume-off::before{content:"\e207"}.f-icon-hd::before{content:"\e208"}.f-icon-subtitles::before{content:"\e209"}.f-icon-playlist::before{content:"\e20a"}.f-icon-audio::before{content:"\e20b"}.f-icon-play-sm::before{content:"\e20c"}.f-icon-pause-sm::before{content:"\e20d"}.f-icon-stop-sm::before{content:"\e20e"}.f-icon-heart-outline::before{content:"\e300"}.f-icon-tri-state-indeterminate::before{content:"\e306"}.f-icon-tri-state-null::before{content:"\e307"}.f-icon-circle::before{content:"\e308"}.f-icon-bell::before,.f-icon-notification::before{content:"\e400"}.f-icon-exception::before{content:"\e403"}.f-icon-photo-camera::before{content:"\e500"}.f-icon-image::before,.f-icon-photo::before{content:"\e501"}.f-icon-image-export::before,.f-icon-photo-export::before{content:"\e502"}.f-icon-zoom-actual-size::before{content:"\e503"}.f-icon-zoom-best-fit::before{content:"\e504"}.f-icon-image-resize::before{content:"\e505"}.f-icon-crop::before{content:"\e506"}.f-icon-mirror::before{content:"\e507"}.f-icon-flip-horizontal::before{content:"\e508"}.f-icon-flip-vertical::before{content:"\e509"}.f-icon-rotate::before{content:"\e50a"}.f-icon-rotate-cw::before,.f-icon-rotate-right::before{content:"\e50b"}.f-icon-rotate-ccw::before,.f-icon-rotate-left::before{content:"\e50c"}.f-icon-brush::before{content:"\e50d"}.f-icon-palette::before{content:"\e50e"}.f-icon-background::before,.f-icon-droplet::before,.f-icon-paint::before{content:"\e50f"}.f-icon-line::before,.f-icon-shape-line::before{content:"\e510"}.f-icon-brightness-contrast::before{content:"\e511"}.f-icon-saturation::before{content:"\e512"}.f-icon-invert-colors::before{content:"\e513"}.f-icon-opacity::before,.f-icon-transperancy::before{content:"\e514"}.f-icon-greyscale::before{content:"\e515"}.f-icon-blur::before{content:"\e516"}.f-icon-sharpen::before{content:"\e517"}.f-icon-shape::before{content:"\e518"}.f-icon-round-corners::before{content:"\e519"}.f-icon-front-element::before{content:"\e51a"}.f-icon-back-element::before{content:"\e51b"}.f-icon-forward-element::before{content:"\e51c"}.f-icon-backward-element::before{content:"\e51d"}.f-icon-align-left-element::before{content:"\e51e"}.f-icon-align-center-element::before{content:"\e51f"}.f-icon-align-right-element::before{content:"\e520"}.f-icon-align-top-element::before{content:"\e521"}.f-icon-align-middle-element::before{content:"\e522"}.f-icon-align-bottom-element::before{content:"\e523"}.f-icon-thumbnails-up::before{content:"\e524"}.f-icon-thumbnails-right::before{content:"\e525"}.f-icon-thumbnails-down::before{content:"\e526"}.f-icon-thumbnails-left::before{content:"\e527"}.f-icon-full-screen::before,.f-icon-fullscreen-enter::before,.f-icon-fullscreen::before{content:"\e528"}.f-icon-full-screen-exit::before,.f-icon-fullscreen-exit::before{content:"\e529"}.f-icon-background-remove::before,.f-icon-paint-remove::before,.f-icon-reset-color::before{content:"\e52a"}.f-icon-page-properties::before{content:"\e600"}.f-icon-bold::before{content:"\e601"}.f-icon-italic::before{content:"\e602"}.f-icon-underline::before{content:"\e603"}.f-icon-font-family::before{content:"\e604"}.f-icon-foreground-color::before,.f-icon-text::before{content:"\e605"}.f-icon-convert-lowercase::before{content:"\e606"}.f-icon-convert-uppercase::before{content:"\e607"}.f-icon-strike-through::before,.f-icon-strikethrough::before{content:"\e608"}.f-icon-sub-script::before,.f-icon-subscript::before{content:"\e609"}.f-icon-sup-script::before,.f-icon-superscript::before{content:"\e60a"}.f-icon-div::before{content:"\e60b"}.f-icon-all::before{content:"\e60c"}.f-icon-h1::before{content:"\e60d"}.f-icon-h2::before{content:"\e60e"}.f-icon-h3::before{content:"\e60f"}.f-icon-h4::before{content:"\e610"}.f-icon-h5::before{content:"\e611"}.f-icon-h6::before{content:"\e612"}.f-icon-insert-ordered-list::before,.f-icon-list-numbered::before,.f-icon-list-ordered::before{content:"\e613"}.f-icon-insert-unordered-list::before,.f-icon-list-bulleted::before,.f-icon-list-unordered::before{content:"\e614"}.f-icon-indent-increase::before,.f-icon-indent::before{content:"\e615"}.f-icon-indent-decrease::before,.f-icon-outdent::before{content:"\e616"}.f-icon-insert-n::before,.f-icon-insert-top::before,.f-icon-insert-up::before{content:"\e617"}.f-icon-insert-m::before,.f-icon-insert-middle::before{content:"\e618"}.f-icon-insert-bottom::before,.f-icon-insert-down::before,.f-icon-insert-s::before{content:"\e619"}.f-icon-align-top::before{content:"\e61a"}.f-icon-align-middle::before{content:"\e61b"}.f-icon-align-bottom::before{content:"\e61c"}.f-icon-align-left::before,.f-icon-justify-left::before{content:"\e61d"}.f-icon-align-center::before,.f-icon-justify-center::before{content:"\e61e"}.f-icon-align-right::before,.f-icon-justify-right::before{content:"\e61f"}.f-icon-align-justify::before,.f-icon-justify-full::before{content:"\e620"}.f-icon-align-remove::before,.f-icon-justify-clear::before{content:"\e621"}.f-icon-text-wrap::before{content:"\e622"}.f-icon-rule-horizontal::before{content:"\e623"}.f-icon-table-align-top-left::before{content:"\e624"}.f-icon-table-align-top-center::before{content:"\e625"}.f-icon-table-align-top-right::before{content:"\e626"}.f-icon-table-align-middle-left::before{content:"\e627"}.f-icon-table-align-middle-center::before{content:"\e628"}.f-icon-table-align-middle-right::before{content:"\e629"}.f-icon-table-align-bottom-left::before{content:"\e62a"}.f-icon-table-align-bottom-center::before{content:"\e62b"}.f-icon-table-align-bottom-right::before{content:"\e6d7"}.f-icon-table-align-remove::before{content:"\e62d"}.f-icon-all-borders::before,.f-icon-borders-all::before{content:"\e62e"}.f-icon-borders-outside::before,.f-icon-outside-borders::before{content:"\e62f"}.f-icon-borders-inside::before,.f-icon-inside-borders::before{content:"\e630"}.f-icon-borders-inside-horizontal::before,.f-icon-inside-horizontal-borders::before{content:"\e631"}.f-icon-borders-inside-vertical::before,.f-icon-inside-vertical-borders::before{content:"\e632"}.f-icon-border-top::before,.f-icon-top-border::before{content:"\e633"}.f-icon-border-bottom::before,.f-icon-bottom-border::before{content:"\e634"}.f-icon-border-left::before,.f-icon-left-border::before{content:"\e635"}.f-icon-border-right::before,.f-icon-right-border::before{content:"\e636"}.f-icon-border-no::before,.f-icon-no-borders::before{content:"\e637"}.f-icon-borders-show-hide::before{content:"\e638"}.f-icon-border::before,.f-icon-form::before{content:"\e639"}.f-icon-form-element::before{content:"\e63a"}.f-icon-code-snippet::before{content:"\e63b"}.f-icon-select-all::before{content:"\e63c"}.f-icon-button::before{content:"\e63d"}.f-icon-select-box::before{content:"\e63e"}.f-icon-calendar-date::before{content:"\e63f"}.f-icon-group-box::before{content:"\e640"}.f-icon-textarea::before{content:"\e641"}.f-icon-textbox::before{content:"\e642"}.f-icon-textbox-hidden::before{content:"\e643"}.f-icon-paragraph-add::before{content:"\e645"}.f-icon-edit-tools::before{content:"\e646"}.f-icon-template-manager::before{content:"\e647"}.f-icon-change-manually::before{content:"\e648"}.f-icon-track-changes::before{content:"\e649"}.f-icon-track-changes-enable::before{content:"\e64a"}.f-icon-track-changes-accept::before{content:"\e64b"}.f-icon-track-changes-accept-all::before{content:"\e64c"}.f-icon-track-changes-reject::before{content:"\e64d"}.f-icon-track-changes-reject-all::before{content:"\e64e"}.f-icon-document-manager::before{content:"\e64f"}.f-icon-custom-icon::before{content:"\e650"}.f-icon-dictionary-add::before{content:"\e651"}.f-icon-image-insert::before,.f-icon-image-light-dialog::before,.f-icon-insert-image::before{content:"\e652"}.f-icon-image-edit::before{content:"\e653"}.f-icon-image-map-editor::before{content:"\e654"}.f-icon-comment::before{content:"\e655"}.f-icon-comment-remove::before{content:"\e656"}.f-icon-comments-remove-all::before{content:"\e657"}.f-icon-silverlight::before{content:"\e658"}.f-icon-media-manager::before{content:"\e659"}.f-icon-video-external::before{content:"\e65a"}.f-icon-flash-manager::before{content:"\e65b"}.f-icon-find-and-replace::before,.f-icon-find::before{content:"\e65c"}.f-icon-copy::before,.f-icon-files::before{content:"\e65d"}.f-icon-cut::before{content:"\e65e"}.f-icon-paste::before{content:"\e65f"}.f-icon-paste-as-html::before{content:"\e660"}.f-icon-paste-from-word::before{content:"\e661"}.f-icon-paste-from-word-strip-file::before{content:"\e662"}.f-icon-paste-html::before{content:"\e663"}.f-icon-paste-markdown::before{content:"\e664"}.f-icon-paste-plain-text::before{content:"\e665"}.f-icon-apply-format::before{content:"\e666"}.f-icon-clear-css::before,.f-icon-clearformat::before{content:"\e667"}.f-icon-copy-format::before{content:"\e668"}.f-icon-strip-all-formating::before{content:"\e669"}.f-icon-strip-css-format::before{content:"\e66a"}.f-icon-strip-font-elements::before{content:"\e66b"}.f-icon-strip-span-elements::before{content:"\e66c"}.f-icon-strip-word-formatting::before{content:"\e66d"}.f-icon-format-code-block::before{content:"\e66e"}.f-icon-style-builder::before{content:"\e66f"}.f-icon-module-manager::before{content:"\e670"}.f-icon-hyperlink-insert::before,.f-icon-hyperlink-light-dialog::before{content:"\e671"}.f-icon-hyperlink-globe::before{content:"\e672"}.f-icon-hyperlink-globe-remove::before{content:"\e673"}.f-icon-hyperlink-email::before{content:"\e674"}.f-icon-anchor::before{content:"\e675"}.f-icon-create-table::before,.f-icon-table-insert::before,.f-icon-table-light-dialog::before{content:"\e676"}.f-icon-table::before{content:"\e677"}.f-icon-table-properties::before,.f-icon-table-wizard::before{content:"\e678"}.f-icon-table-cell::before{content:"\e679"}.f-icon-table-cell-properties::before{content:"\e67a"}.f-icon-add-column-left::before,.f-icon-table-column-insert-left::before{content:"\e67b"}.f-icon-add-column-right::before,.f-icon-table-column-insert-right::before{content:"\e67c"}.f-icon-add-row-above::before,.f-icon-table-row-insert-above::before{content:"\e67d"}.f-icon-add-row-below::before,.f-icon-table-row-insert-below::before{content:"\e67e"}.f-icon-delete-column::before,.f-icon-table-column-delete::before{content:"\e67f"}.f-icon-delete-row::before,.f-icon-table-row-delete::before{content:"\e680"}.f-icon-table-cell-delete::before{content:"\e681"}.f-icon-table-delete::before{content:"\e682"}.f-icon-cells-merge::before,.f-icon-merge-cells::before{content:"\e683"}.f-icon-cells-merge-horizontally::before,.f-icon-merge-horizontally::before{content:"\e684"}.f-icon-cells-merge-vertically::before,.f-icon-merge-vertically::before{content:"\e685"}.f-icon-cell-split-horizontally::before{content:"\e686"}.f-icon-cell-split-vertically::before{content:"\e687"}.f-icon-normal-layout::before,.f-icon-table-unmerge::before{content:"\e688"}.f-icon-freeze-panes::before,.f-icon-pane-freeze::before{content:"\e689"}.f-icon-freeze-row::before,.f-icon-row-freeze::before{content:"\e68a"}.f-icon-column-freeze::before,.f-icon-freeze-col::before{content:"\e68b"}.f-icon-toolbar-float::before{content:"\e68c"}.f-icon-spell-checker::before{content:"\e68d"}.f-icon-validation-xhtml::before{content:"\e68e"}.f-icon-validation-data::before{content:"\e68f"}.f-icon-toggle-full-screen-mode::before{content:"\e690"}.f-icon-formula-fx::before,.f-icon-fx::before{content:"\e691"}.f-icon-sum::before{content:"\e692"}.f-icon-symbol::before{content:"\e693"}.f-icon-currency::before,.f-icon-dollar::before{content:"\e694"}.f-icon-percent::before{content:"\e695"}.f-icon-custom-format::before,.f-icon-format-number::before{content:"\e696"}.f-icon-decimal-increase::before,.f-icon-increase-decimal::before{content:"\e697"}.f-icon-decimal-decrease::before,.f-icon-decrease-decimal::before{content:"\e698"}.f-icon-font-size::before{content:"\e699"}.f-icon-image-absolute-position::before{content:"\e69a"}.f-icon-globe-outline::before{content:"\e700"}.f-icon-globe::before{content:"\e701"}.f-icon-marker-pin::before{content:"\e702"}.f-icon-marker-pin-target::before{content:"\e703"}.f-icon-pin::before{content:"\e704"}.f-icon-unpin::before{content:"\e705"}.f-icon-share::before{content:"\e800"}.f-icon-user::before{content:"\e801"}.f-icon-inbox::before{content:"\e802"}.f-icon-blogger::before{content:"\e803"}.f-icon-blogger-box::before{content:"\e804"}.f-icon-delicious::before{content:"\e805"}.f-icon-delicious-box::before{content:"\e806"}.f-icon-digg::before{content:"\e807"}.f-icon-digg-box::before{content:"\e808"}.f-icon-email::before,.f-icon-envelop::before,.f-icon-letter::before{content:"\e809"}.f-icon-email-box::before,.f-icon-envelop-box::before,.f-icon-letter-box::before{content:"\e80a"}.f-icon-facebook::before{content:"\e80b"}.f-icon-facebook-box::before{content:"\e80c"}.f-icon-google::before{content:"\e80d"}.f-icon-google-box::before{content:"\e80e"}.f-icon-google-plus::before{content:"\e80f"}.f-icon-google-plus-box::before{content:"\e810"}.f-icon-linkedin::before{content:"\e811"}.f-icon-linkedin-box::before{content:"\e812"}.f-icon-myspace::before{content:"\e813"}.f-icon-myspace-box::before{content:"\e814"}.f-icon-pinterest::before{content:"\e815"}.f-icon-pinterest-box::before{content:"\e816"}.f-icon-reddit::before{content:"\e817"}.f-icon-reddit-box::before{content:"\e818"}.f-icon-stumble-upon::before{content:"\e819"}.f-icon-stumble-upon-box::before{content:"\e81a"}.f-icon-tell-a-friend::before{content:"\e81b"}.f-icon-tell-a-friend-box::before{content:"\e81c"}.f-icon-tumblr::before{content:"\e81d"}.f-icon-tumblr-box::before{content:"\e81e"}.f-icon-twitter::before{content:"\e81f"}.f-icon-twitter-box::before{content:"\e820"}.f-icon-yammer::before{content:"\e821"}.f-icon-yammer-box::before{content:"\e822"}.f-icon-behance::before{content:"\e823"}.f-icon-behance-box::before{content:"\e824"}.f-icon-dribbble::before{content:"\e825"}.f-icon-dribbble-box::before{content:"\e826"}.f-icon-rss::before{content:"\e827"}.f-icon-rss-box::before{content:"\e828"}.f-icon-vimeo::before{content:"\e829"}.f-icon-vimeo-box::before{content:"\e82a"}.f-icon-youtube::before{content:"\e82b"}.f-icon-youtube-box::before{content:"\e82c"}.f-icon-folder-add::before{content:"\e902"}.f-icon-folder-up::before{content:"\e903"}.f-icon-fields-more::before,.f-icon-folder-more::before{content:"\e904"}.f-icon-aggregate-fields::before{content:"\e905"}.f-icon-file-vertical::before,.f-icon-page-portrait::before{content:"\e906"}.f-icon-file-add::before,.f-icon-insert-file::before{content:"\e907"}.f-icon-file-txt::before,.f-icon-txt::before{content:"\e908"}.f-icon-csv::before,.f-icon-file-csv::before{content:"\e909"}.f-icon-excel::before,.f-icon-file-excel::before,.f-icon-file-xls::before,.f-icon-xls::before,.f-icon-xlsa::before{content:"\e90a"}.f-icon-doc::before,.f-icon-file-doc::before,.f-icon-file-word::before,.f-icon-word::before{content:"\e90b"}.f-icon-file-mdb::before,.f-icon-mdb::before{content:"\e90c"}.f-icon-file-ppt::before,.f-icon-ppt::before{content:"\e90d"}.f-icon-file-pdf::before,.f-icon-pdf::before,.f-icon-pdfa::before{content:"\e90e"}.f-icon-file-psd::before,.f-icon-psd::before{content:"\e90f"}.f-icon-file-flash::before,.f-icon-flash::before{content:"\e910"}.f-icon-config::before,.f-icon-file-config::before{content:"\e911"}.f-icon-ascx::before,.f-icon-file-ascx::before{content:"\e912"}.f-icon-bac::before,.f-icon-file-bac::before{content:"\e913"}.f-icon-file-zip::before,.f-icon-zip::before{content:"\e914"}.f-icon-film::before{content:"\e915"}.f-icon-css3::before{content:"\e916"}.f-icon-html5::before{content:"\e917"}.f-icon-html::before,.f-icon-source-code::before,.f-icon-view-source::before{content:"\e918"}.f-icon-css::before{content:"\e919"}.f-icon-js::before{content:"\e91a"}.f-icon-exe::before{content:"\e91b"}.f-icon-csproj::before{content:"\e91c"}.f-icon-vbproj::before{content:"\e91d"}.f-icon-cs::before{content:"\e91e"}.f-icon-vb::before{content:"\e91f"}.f-icon-sln::before{content:"\e920"}.f-icon-cloud::before{content:"\e921"}.f-icon-file-horizontal::before,.f-icon-page-landscape::before{content:"\e922"}.f-icon-steps-transport::before{content:"\eb07"}.f-icon-steps-settlement::before{content:"\eb08"}.f-icon-steps-outofstock::before{content:"\eb09"}.f-icon-steps-invoice::before{content:"\eb0a"}.f-icon-steps-receivables::before{content:"\eb0b"}.f-icon-steps-delivergoods::before{content:"\eb0c"}.f-icon-exhale-discount::before{content:"\eb0d"}.f-icon-flag_urgent::before{content:"\eb10"}.f-icon-top_home::before{content:"\eb11"}.f-icon-top_agency::before{content:"\eb13"}.f-icon-top_news::before{content:"\eb14"}.f-icon-top_im_default::before{content:"\eb15"}.f-icon-top_developmenttool::before{content:"\eb16"}.f-icon-top_search::before{content:"\eb17"}.f-icon-top_my::before{content:"\eb18"}.f-icon-home-man::before{content:"\eb1a"}.f-icon-home-woman::before{content:"\eb1b"}.f-icon-home-setup::before{content:"\eb1c"}.f-icon-home-add::before{content:"\eb1d"}.f-icon-home-ring::before{content:"\eb1e"}.f-icon-home-operation::before{content:"\eb1f"}.f-icon-home-more::before{content:"\eb20"}.f-icon-home-weather-leaf::before{content:"\eb21"}.f-icon-engineering::before{content:"\eb22"}.f-icon-git::before{content:"\eb23"}.f-icon-panel-retraction::before{content:"\eb24"}.f-icon-input-language::before{content:"\eb26"}.f-icon-attribute-configuration::before{content:"\eb27"}.f-icon-bottomsetting::before{content:"\eb28"}.f-icon-roofing::before{content:"\eb29"}.f-icon-new-fullscreen::before{content:"\eb38"}.f-icon-filtrate::before{content:"\eb39"}.f-icon-document-information::before{content:"\eb3a"}.f-icon-attachment-list::before{content:"\eb3b"}.f-icon-product-list::before{content:"\eb3c"}.f-icon-new-function::before{content:"\eb3d"}.f-icon-telephone::before{content:"\eb3e"}.f-icon-list::before{content:"\eb3f"}.f-icon-more::before{content:"\eb41"}.f-icon-record::before{content:"\eb42"}.f-icon-man::before{content:"\eb43"}.f-icon-woman::before{content:"\eb44"}.f-icon-new-form::before{content:"\eb45"}.f-icon-new-edit::before{content:"\eb46"}.f-icon-new-dimension::before{content:"\eb49"}.f-icon-basic::before{content:"\eb4c"}.f-icon-language::before{content:"\eb4d"}.f-icon-password::before{content:"\eb4e"}.f-icon-area::before{content:"\eb4f"}.f-icon-skin::before{content:"\eb51"}.f-icon-counterclockwise::before{content:"\eb53"}.f-icon-clockwise::before{content:"\eb54"}.f-icon-amplification::before{content:"\eb55"}.f-icon-narrow::before{content:"\eb56"}.f-cmp-footer .f-cmp-footer-header .f-toolbar .toolbar--collapse-icon::before,.f-icon-packup::before{content:"\eb58"}.f-icon-remove::before{content:"\eb59"}.f-icon-user_center::before{content:"\eb5a"}.f-icon-sign_out::before{content:"\eb5b"}.f-icon-yxs_customize::before{content:"\eb5c"}.f-icon-yxs_earth::before{content:"\eb5d"}.f-icon-yxs_level::before{content:"\eb5e"}.f-icon-yxs_delete::before{content:"\eb5f"}.f-icon-yxs_copy::before{content:"\eb60"}.f-icon-yxs_move::before{content:"\eb61"}.f-icon-index::before{content:"\eb65"}.f-icon-index-face::before{content:"\eb66"}.f-icon-search::before{content:"\eb67"}.f-icon-message::before{content:"\eb69"}.f-icon-backlog::before{content:"\eb6a"}.f-icon-information::before{content:"\eb6b"}.f-icon-launchpad::before{content:"\eb6c"}.f-icon-launchpad-face::before{content:"\eb6d"}.f-icon-ide::before{content:"\eb71"}.f-icon-collection::before{content:"\eb72"}.f-icon-shoucangjia::before{content:"\eb73"}.f-icon-list1::before{content:"\eb74"}.f-icon-tiled::before{content:"\eb75"}.f-icon-sudoku::before{content:"\eb76"}.f-icon-tenant::before{content:"\eb77"}.f-icon-radio-2::before{content:"\eb78"}.f-icon-qiehuanzuzhi::before{content:"\eb79"}.f-icon-tiled-new::before{content:"\eb7a"}.f-icon-list-new::before{content:"\eb7b"}.f-icon-sudoku-new::before{content:"\eb7c"}.f-icon-danger::before{content:"\eb7e"}.f-icon-default::before{content:"\eb14"}.f-icon-navigation::before{content:"\eb81"}.f-icon-launchpad-face2::before{content:"\eb84"}.f-icon-launchpad2::before{content:"\eb83"}.f-icon-col-filteranddescending::before{content:"\eb9b"}.f-icon-col-filterandascending::before{content:"\eb9a"}.f-icon-col-defaultfilterandsort::before{content:"\eb89"}.f-icon-col-filter::before{content:"\eb88"}.f-icon-col-descending::before{content:"\eb87"}.f-icon-col-ascending::before{content:"\eb86"}.f-icon-col-defaultsort::before{content:"\eb85"}.f-icon-runtime::before{content:"\eb9c"}.f-icon-page-last::before{content:"\eb9e"}.f-icon-page-first::before{content:"\eb9d"}.f-icon-orientation-arrow::before{content:"\eb9f"}.f-icon-flowline-scheduled:before{content:"\eba9"}.f-icon-flowline-canceled::before{content:"\eba8"}.f-icon-flowline-pending::before{content:"\eba7"}.f-icon-flowline-run::before{content:"\eba6"}.f-icon-flowline-created::before{content:"\eba5"}.f-icon-flowline-running::before{content:"\eba4"}.f-icon-flowline-waiting::before{content:"\eba3"}.f-icon-flowline-skipped::before{content:"\eba2"}.f-icon-flowline-view::before{content:"\eba1"}.f-icon-flowline-warning::before{content:"\eba0"}.f-icon-flowline-more::before{content:"\ebb0"}.f-icon-flowline-manual::before{content:"\ebb1"}.f-icon-path::before{content:"\ebb2"}.f-icon-code::before{content:"\ebb3"}.f-icon-department::before{content:"\ebb4"}.f-icon-info-circle::before{content:"\ebb5"}.f-icon-help-01::before{content:"\ebb6"}.f-icon-statement::before{content:"\ebd3"}.f-icon-address-location::before{content:"\ebd2"}.f-icon-task-record::before{content:"\ebd1"}.f-icon-visit:before{content:"\ebd0"}.f-icon-relationship::before{content:"\ebc9"}.f-icon-truck-delivery::before{content:"\ebc8"}.f-icon-concat-list::before{content:"\ebc7"}.f-icon-payment-notice::before{content:"\ebc6"}.f-icon-application-for-invoicing::before{content:"\ebc5"}.f-icon-accomplishment:before{content:"\ebc4"}.f-icon-potential:before{content:"\ebc3"}.f-icon-aim::before{content:"\ebc2"}.f-icon-declaration-form::before{content:"\ebc1"}.f-icon-licensed::before{content:"\ebc0"}.f-icon-profile-picture::before{content:"\ebb9"}.f-icon-forecast-of-completion::before{content:"\ebb8"}.f-icon-team::before{content:"\ebb7"}.f-icon-table_view::before{content:"\ebf7"}.f-icon-card_view::before{content:"\ebd5"}.f-icon-list_view::before{content:"\ebd6"}.f-icon-form_view::before{content:"\ebd7"}.f-icon-chart_view::before{content:"\ebd8"}.f-icon-perspective_view::before{content:"\ebd9"}.f-icon-drop-down_line::before{content:"\ebe1"}.f-icon-more_line::before{content:"\ebe2"}.f-icon-calendars_line1::before{content:"\ebe3"}.f-icon-message_round::before{content:"\ebe9"}.f-icon-col-descendingorder::before{content:"\ebf2"}.f-icon-col-ascendingorder::before{content:"\ebf1"}.f-icon-feedback::before{content:"\ebf3"}.f-icon-signature::before{content:"\ebf4"}.f-icon-indep-password::before{content:"\ebf5"}.f-icon-honor::before{content:"\ebf6"}.f-icon-view-cardview::before{content:"\ebf8"}.f-icon-edit-cardview::before{content:"\ebf9"}.f-icon-description-tips::before{content:"\eca1"}.f-icon-equalsign::before{content:"\eca2"}.f-icon-column-rectangle::before{content:"\eca3"}.f-icon-position::before{content:"\ecb4"}.f-icon-hotel::before{content:"\ecb3"}.f-icon-arrowwide::before{content:"\ecb2"}.f-icon-foldin::before{content:"\ecb1"}.f-icon-filter-cancel::before{content:"\eca4"}.f-icon-filter-add::before{content:"\eca5"}.f-icon-filter-grouping::before{content:"\eca6"}.f-icon-filter-delete::before{content:"\eca7"}.f-icon-moverto::before{content:"\eca8"}.f-icon-thumbtack-fill::before{content:"\eca9"}.f-icon-thumbtack::before{content:"\ecb0"}.f-icon-enclosure-edit::before{content:"\ecb6"}.f-icon-notifier::before{content:"\ecb7"}.f-iconmage{display:inline-block}.f-btn-icon{cursor:pointer;font-size:.8125rem;line-height:1.4286;padding:.1875rem;border:1px solid var(--f-neutral-08);border-radius:6px;position:relative;display:flex;align-items:center;justify-content:center;width:1.6607375rem;height:1.6607375rem}.f-btn-icon.f-bare{border-color:transparent!important;background:0 0!important;transition:color .2s ease-in-out}.f-btn-icon::after,.f-btn-icon::before{border-radius:6px;position:absolute;left:-1px;right:-1px;top:-1px;bottom:-1px;z-index:0;transition:opacity .2s ease-in-out;content:"";opacity:0;pointer-events:none}.f-btn-icon.f-bare::before{display:block}.f-btn-icon::before{background:var(--f-neutral-00);display:none}.f-btn-icon.f-state-hover::before,.f-btn-icon:hover::before{opacity:.08}.f-btn-icon::after{display:none}.btn-icontext{display:inline-flex;align-items:center}.btn-icontext .f-icon{margin:0 .4375rem 0 0}.f-icon-danger,.f-icon-error{color:var(--f-semantic-danger-01)}.f-icon-info,.f-icon-note::before{color:var(--f-semantic-info-01)}.f-icon-question,.f-icon-warning{color:var(--f-semantic-warning-01)}.f-icon-success{color:var(--f-semantic-success-01)}.f-icon-default{color:var(--f-semantic-info-01)}.f-icon-lookup::before{content:"\e032"}.f-page-pre::before{content:"\e016"}.f-page-first::before{content:"\eb9d"}.f-page-last::before{content:"\eb9e"}.f-page-next::before{content:"\e014"}.modal_minimize{font-family:FarrisIcons}.modal_minimize::before{content:"\eb4b"}.modal_maximize{font-family:FarrisIcons}.modal_maximize::before{content:"\eb68"}.f-icon-close::before,.f-icon-group-delete::before,.modal_close::before{content:"\e11b"}.f-icon-close,.f-icon-group-delete::before{font-family:FarrisIcons}.modal_close{font-family:FarrisIcons}.modalrevert::before{content:"\eb4b"}.f-legend-icon::after{content:"";width:1.125rem;height:.875rem;overflow:hidden;display:inline-block;line-height:1.125rem;margin:0 .25rem 0 0;color:var(--f-neutral-01)}.f-legend-collapse::after,.f-legend-show::after{font-size:.875rem;font-family:FarrisIcons}.f-legend-collapse::after{content:"\e013"}.f-legend-show::after{content:"\e015"}.f-cmp-inputgroup .f-transfer-date .search-tag-item.search-field:hover.search-field-remove>.f-icon::before,.f-search-box .search-tag-item.search-field:hover.search-field-remove>.f-icon::before,.f-sidebar-close::before{content:"\e11b"}.f-sidebar-entry::before{content:"\e014"}.farris-image-cropper-frame{display:flex;position:relative;width:100%;max-width:100%;max-height:100%;overflow:hidden;text-align:center}.farris-image-cropper-frame .farris-image-cropper{width:100%;position:relative}.farris-image-cropper-frame .farris-image-cropper .farris-source-image{max-width:100%;max-height:100%;transform-origin:center}.farris-image-cropper-frame .farris-image-overlay{position:absolute;pointer-events:none;touch-action:none;outline:#fff solid 100vw;top:0;left:0}.farris-image-cropper-frame .farris-image-cropper-wrapper{position:absolute;display:flex;color:#53535C;background:0 0;outline:rgba(0,0,0,.3) solid 100vw;outline:solid var(--cropper-outline-color,rgba(0,0,0,.3));touch-action:none}.farris-image-cropper-frame .farris-image-cropper-wrapper:after{position:absolute;content:"";top:0;bottom:0;left:0;right:0;pointer-events:none;border:1px dashed;opacity:.75;color:inherit;z-index:1}.farris-image-cropper-frame .farris-image-cropper-wrapper .farris-image-cropper-move{width:100%;cursor:move;border-radius:100%;border:1px solid #388fff}.farris-image-cropper-frame .farris-image-cropper-wrapper:focus .farris-image-cropper-move{border-color:#1e90ff;border-width:2px}.farris-image-cropper-frame .farris-image-cropper-wrapper .farris-image-cropper-resize{position:absolute;display:inline-block;line-height:6px;padding:8px;opacity:.85;z-index:1}.farris-image-cropper-frame .farris-image-cropper-wrapper .farris-image-cropper-resize .farris-image-cropper-square{display:inline-block;background:#388fff;width:6px;height:6px;border:1px solid #59a1ff;box-sizing:content-box}.f-cmp-inputgroup .input-append-button,.f-cmp-text-input-append .input-append-button,.f-component-text .input-append-button,.input-append-button{background:var(--f-neutral-00)}.farris-image-cropper-frame .farris-image-cropper-wrapper .farris-image-cropper-resize.topleft{top:-12px;left:-12px;cursor:nwse-resize}.farris-image-cropper-frame .farris-image-cropper-wrapper .farris-image-cropper-resize.top{top:-12px;left:calc(50% - 12px);cursor:ns-resize}.farris-image-cropper-frame .farris-image-cropper-wrapper .farris-image-cropper-resize.topright{top:-12px;right:-12px;cursor:nesw-resize}.farris-image-cropper-frame .farris-image-cropper-wrapper .farris-image-cropper-resize.right{top:calc(50% - 12px);right:-12px;cursor:ew-resize}.farris-image-cropper-frame .farris-image-cropper-wrapper .farris-image-cropper-resize.bottomright{bottom:-12px;right:-12px;cursor:nwse-resize}.farris-image-cropper-frame .farris-image-cropper-wrapper .farris-image-cropper-resize.bottom{bottom:-12px;left:calc(50% - 12px);cursor:ns-resize}.farris-image-cropper-frame .farris-image-cropper-wrapper .farris-image-cropper-resize.bottomleft{bottom:-12px;left:-12px;cursor:nesw-resize}.farris-image-cropper-frame .farris-image-cropper-wrapper .farris-image-cropper-resize.left{top:calc(50% - 12px);left:-12px;cursor:ew-resize}.farris-image-cropper-frame .farris-image-cropper-wrapper .farris-image-cropper-resize-bar{position:absolute;z-index:1}.farris-image-cropper-frame .farris-image-cropper-wrapper .farris-image-cropper-resize-bar.top{top:-11px;left:11px;width:calc(100% - 22px);height:22px;cursor:ns-resize}.farris-image-cropper-frame .farris-image-cropper-wrapper .farris-image-cropper-resize-bar.right{top:11px;right:-11px;height:calc(100% - 22px);width:22px;cursor:ew-resize}.farris-image-cropper-frame .farris-image-cropper-wrapper .farris-image-cropper-resize-bar.bottom{bottom:-11px;left:11px;width:calc(100% - 22px);height:22px;cursor:ns-resize}.farris-image-cropper-frame .farris-image-cropper-wrapper .farris-image-cropper-resize-bar.left{top:11px;left:-11px;height:calc(100% - 22px);width:22px;cursor:ew-resize}.farris-image-cropper-frame .farris-image-cropper-wrapper.farris-image-cropper-rounded{outline-color:transparent;width:161px;height:161px}.farris-image-cropper-frame .farris-image-cropper-wrapper.farris-image-cropper-rounded:after{border-radius:100%;box-shadow:0 0 0 100vw rgba(0,0,0,.3);box-shadow:0 0 0 100vw var(--cropper-outline-color,rgba(0,0,0,.3))}@media (orientation:portrait){.farris-image-cropper-frame .farris-image-cropper-wrapper{outline-width:100vh}.farris-image-cropper-frame .farris-image-cropper-wrapper.farris-image-cropper-rounded:after{box-shadow:0 0 0 100vh rgba(0,0,0,.3);box-shadow:0 0 0 100vh var(--cropper-outline-color,rgba(0,0,0,.3))}}.farris-image-cropper-frame .farris-image-cropper-wrapper.farris-image-cropper-rounded .farris-image-cropper-move{border-radius:100%}.farris-image-cropper-frame.farris-image-cropper-disabled .farris-image-cropper-wrapper .farris-image-cropper-move,.farris-image-cropper-frame.farris-image-cropper-disabled .farris-image-cropper-wrapper .farris-image-cropper-resize,.farris-image-cropper-frame.farris-image-cropper-disabled .farris-image-cropper-wrapper .farris-image-cropper-resize-bar{display:none}.farris-image-cropper-frame .farris-image-cropper-error{width:100%;text-align:center;font-size:14px}.farris-image-cropper-frame .farris-image-cropper-loading{position:absolute;top:0;left:0;width:100%;height:100%}.farris-image-cropper-frame .farris-image-cropper-loading .farris-image-cropper-loading-spinner{width:31px;height:31px;margin:0 auto;border:2px solid #388fff;border-radius:50%;border-left-color:transparent;border-right-color:transparent;-webkit-animation:cssload-spin 425ms infinite linear;position:absolute;top:calc(50% - 15px);left:calc(50% - 15px);animation:cssload-spin 425ms infinite linear}.input-group-append,.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text,.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}@keyframes cssload-spin{to{transform:rotate(360deg)}}.f-cmp-static-text-input-append,.f-cmp-text-input-append,.f-cmp-textarea-input-append{display:flex;height:100%}.f-cmp-static-text-input-append,.f-cmp-textarea-input-append{align-items:flex-start}.f-cmp-static-text-input-append .f-form-control-text,.f-cmp-static-text-input-append .f-form-control-textarea{flex:1 1 0}.f-cmp-static-text-input-append .input-append-wrapper,.f-cmp-text-input-append .input-append-wrapper,.f-cmp-textarea-input-append .input-append-wrapper{flex-shrink:0;height:100%}.input-append-text .input-group-text{color:var(--f-text-02);cursor:default}.input-append-button .input-group-text{color:var(--f-theme-03)}.f-cmp-inputgroup .input-append-text .input-group-text,.f-cmp-text-input-append .input-append-text .input-group-text,.f-component-text .input-append-text .input-group-text{color:var(--f-text-02)}.f-cmp-inputgroup .input-append-button .input-group-text,.f-cmp-text-input-append .input-append-button .input-group-text,.f-component-text .input-append-button .input-group-text{color:var(--f-theme-03)}.f-cmp-text-input-append .input-append-wrapper,.f-cmp-textarea-input-append .input-append-wrapper,.f-component-text .input-append-wrapper,.input-group .input-append-wrapper{background:var(--f-neutral-12)}.f-cmp-text-input-append .input-append-wrapper>.input-group-text,.f-cmp-textarea-input-append .input-append-wrapper>.input-group-text,.f-component-text .input-append-wrapper>.input-group-text,.input-group .input-append-wrapper>.input-group-text{border:0;background:0 0}.f-cmp-input-append-form .input-append-wrapper{position:absolute;right:1px;height:auto;top:1px;bottom:1px;border-radius:0 6px 6px 0;display:block}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after,.input-group>.custom-select:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-append-wrapper.f-state-disabled{display:none!important}.was-validated .farris-input-wrap .form-check-input:invalid~.invalid-feedback,.was-validated .farris-input-wrap .form-check-input:invalid~.invalid-tooltip,.was-validated .farris-input-wrap .form-check-input:valid~.valid-feedback,.was-validated .farris-input-wrap .form-check-input:valid~.valid-tooltip{display:block}.f-cmp-text-is-textarea.f-cmp-input-append-form .input-append-wrapper,.f-cmp-textarea-input-append.f-cmp-input-append-form .input-append-wrapper{bottom:auto}.form-control:disabled,.form-control:disabled:hover,.form-control[readonly],.form-control[readonly]:hover{border-color:var(--f-neutral-04);color:var(--f-text-02);background:var(--f-neutral-12);cursor:default}.form-control:hover{background-color:var(--f-neutral-12);color:var(--f-text-02);border-color:var(--f-theme-08);box-shadow:none}.was-validated .farris-input-wrap .custom-control-input:invalid~.custom-control-label,.was-validated .farris-input-wrap .custom-control-input:valid~.custom-control-label,.was-validated .farris-input-wrap .form-check-input:invalid~.form-check-label,.was-validated .farris-input-wrap .form-check-input:valid~.form-check-label{color:var(--f-neutral-04)}.form-control[readonly]:focus{box-shadow:none}.farris-input-wrap .custom-select.is-valid,.farris-input-wrap .form-control.is-valid,.was-validated .farris-input-wrap .custom-select:valid,.was-validated .farris-input-wrap .form-control:valid{border-color:var(--f-neutral-04)}.farris-input-wrap .custom-select.is-valid:focus,.farris-input-wrap .form-control.is-valid:focus,.was-validated .farris-input-wrap .custom-select:valid:focus,.was-validated .farris-input-wrap .form-control:valid:focus{border-color:var(--f-neutral-04);box-shadow:0 0 0 .2rem rgba(var(--f-neutral-04),.25)}.was-validated .farris-input-wrap .custom-control-input:valid~.custom-control-label::before{background-color:rgba(var(--f-neutral-04),.75)}.was-validated .farris-input-wrap .custom-control-input:valid:checked~.custom-control-label::before{background-color:rgba(var(--f-neutral-04),.9)}.was-validated .farris-input-wrap .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(var(--f-neutral-04),.25)}.was-validated .farris-input-wrap .custom-file-input:valid~.custom-file-label{border-color:var(--f-neutral-04)}.was-validated .farris-input-wrap .custom-file-input:valid~.custom-file-label::after{border-color:inherit}.was-validated .farris-input-wrap .custom-file-input:valid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(var(--f-neutral-04),.25)}.farris-input-wrap .custom-select.is-invalid,.farris-input-wrap .form-control.is-invalid,.was-validated .farris-input-wrap .custom-select:invalid,.was-validated .farris-input-wrap .form-control:invalid{border-color:var(--f-neutral-04)}.farris-input-wrap .custom-select.is-invalid:focus,.farris-input-wrap .form-control.is-invalid:focus,.was-validated .farris-input-wrap .custom-select:invalid:focus,.was-validated .farris-input-wrap .form-control:invalid:focus{border-color:var(--f-neutral-04);box-shadow:0 0 0 .2rem rgba(var(--f-neutral-04),.25)}.was-validated .farris-input-wrap .custom-control-input:invalid~.custom-control-label::before{background-color:rgba(var(--f-neutral-04),.75)}.was-validated .farris-input-wrap .custom-control-input:invalid:checked~.custom-control-label::before{background-color:rgba(var(--f-neutral-04),.9)}.was-validated .farris-input-wrap .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(var(--f-neutral-04),.25)}.was-validated .farris-input-wrap .custom-file-input:invalid~.custom-file-label{border-color:var(--f-neutral-04)}.was-validated .farris-input-wrap .custom-file-input:invalid~.custom-file-label::after{border-color:inherit}.was-validated .farris-input-wrap .custom-file-input:invalid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(var(--f-neutral-04),.25)}.f-cmp-inputgroup .f-state-focus,.input-group.f-state-focus{box-shadow:0 0 0,0 0 4px 2px rgba(99,136,255,.12);outline:0}input:-internal-autofill-selected{background:var(--f-neutral-12)}.f-empty-input-placeholder{padding-top:1.1607375rem;margin-top:.375rem;height:calc(1.375rem + .125rem);margin-bottom:.375rem;box-sizing:content-box}textarea::-webkit-input-placeholder{color:var(--f-text-09)!important}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;flex-grow:1;flex-shrink:1;flex-basis:0;width:1%;margin-bottom:0}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-file{display:flex;align-items:center}.input-group-append,.input-group-prepend{display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-prepend{margin-right:-1px}.input-group-text{display:flex;align-items:center;padding:.1875rem .5rem;margin-bottom:0;font-size:.8125rem;font-weight:400;line-height:1.4286;color:var(--f-text-02);text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid var(--f-neutral-04);border-radius:6px}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{height:calc(1.750025rem + 2px);padding:.25rem .3125rem;font-size:.875rem;line-height:1.4286;border-radius:6px}.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{height:calc(1.32145rem + 2px);padding:.125rem .4375rem;font-size:.75rem;line-height:1.4286;border-radius:6px}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.input-group.f-state-focus{border-color:var(--f-theme-08)}.input-group{border:1px solid var(--f-neutral-04);border-radius:6px}.input-group .form-control{border:0;height:1.375rem;box-shadow:none}.input-group .form-control:focus{box-shadow:none}.input-group .input-group-prepend{border-radius:6px 0 0 6px}.input-group .input-group-append{border-radius:0 6px 6px 0}.input-group .input-group-append,.input-group .input-group-prepend{background:#e4e7eb}.input-group .input-group-append>.btn,.input-group .input-group-append>.dropdown,.input-group .input-group-append>.input-group-text,.input-group .input-group-prepend>.btn,.input-group .input-group-prepend>.dropdown,.input-group .input-group-prepend>.input-group-text{border:0}.input-group .input-group-append>.input-group-text,.input-group .input-group-prepend>.input-group-text{background:0 0}.input-group .input-group-append>.input-group-clear,.input-group .input-group-prepend>.input-group-clear{padding:0 8px;border-radius:6px!important;background:var(--f-neutral-12)}.input-group .input-group-append>.input-group-clear .modal_close,.input-group .input-group-prepend>.input-group-clear .modal_close{color:var(--f-text-10);font-size:.75rem}.input-group .input-group-append>.input-group-clear:hover .modal_close,.input-group .input-group-prepend>.input-group-clear:hover .modal_close{color:var(--f-text-08)}.input-group:not(.farris-input-group-readonly):not(.farris-input-group-disable):not(.f-state-readonly):not(.f-state-disabled):not(.f-state-focus):hover{border-color:var(--f-theme-08)}.f-cmp-inputgroup .input-group-before-tips{background:var(--f-neutral-04);border:none;border-right:1px solid var(--f-neutral-04);position:relative;border-radius:6px 0 0 6px;padding:0 8px;display:flex;align-items:center}.f-cmp-inputgroup .input-group-before-tips .f-icon{font-size:14px}.f-cmp-inputgroup .input-group-before-tips .tips-arrow{width:4px;height:4px;margin:-4px 0 0;position:absolute;top:50%;right:0}.f-cmp-inputgroup .input-group-before-tips .tips-arrow::after,.f-cmp-inputgroup .input-group-before-tips .tips-arrow::before{content:"";border-color:transparent;border-style:solid;border-width:4px 4px 4px 0;position:absolute}.f-cmp-inputgroup .input-group-before-tips .tips-arrow::before{left:0;border-right-color:var(--f-neutral-04)}.f-cmp-inputgroup .input-group-before-tips .tips-arrow::after{left:1px;border-right-color:var(--f-neutral-12)}.f-cmp-inputgroup .f-state-disabled,.f-cmp-inputgroup .f-state-editable{border-color:var(--f-neutral-04);background:var(--f-neutral-12)}.f-cmp-inputgroup.input-group{flex-wrap:nowrap}.f-cmp-inputgroup .input-group-append{margin-left:0;background:var(--f-neutral-12)}.f-cmp-inputgroup.input-group>.form-control:not(:last-child){border-radius:6px}.f-cmp-inputgroup .input-group-text{justify-content:center;color:rgba(0,0,0,.25);padding-left:.26786875rem;padding-right:.26786875rem;cursor:pointer}.f-cmp-inputgroup .input-group-text:hover{color:var(--f-theme-05)}.f-cmp-inputgroup .f-state-disabled .input-group-append,.f-cmp-inputgroup .f-state-readonly .input-group-append,.f-cmp-inputgroup .farris-input-group-disable .input-group-append,.f-cmp-inputgroup .farris-input-group-readonly .input-group-append{background:var(--f-neutral-12)}.f-cmp-inputgroup .f-state-disabled .input-group-append:not(.input-append-wrapper),.f-cmp-inputgroup .f-state-readonly .input-group-append:not(.input-append-wrapper),.f-cmp-inputgroup .farris-input-group-disable .input-group-append:not(.input-append-wrapper),.f-cmp-inputgroup .farris-input-group-readonly .input-group-append:not(.input-append-wrapper){display:none}.f-cmp-inputgroup .f-state-disabled .input-append-wrapper,.f-cmp-inputgroup .f-state-readonly .input-append-wrapper,.f-cmp-inputgroup .farris-input-group-disable .input-append-wrapper,.f-cmp-inputgroup .farris-input-group-readonly .input-append-wrapper{color:var(--f-text-02)}.f-cmp-inputgroup .f-state-disabled .input-append-wrapper .input-append-text:hover,.f-cmp-inputgroup .f-state-readonly .input-append-wrapper .input-append-text:hover,.f-cmp-inputgroup .farris-input-group-disable .input-append-wrapper .input-append-text:hover,.f-cmp-inputgroup .farris-input-group-readonly .input-append-wrapper .input-append-text:hover{color:inherit}.f-cmp-inputgroup .f-state-disabled .append-force-show,.f-cmp-inputgroup .f-state-readonly .append-force-show,.f-cmp-inputgroup .farris-input-group-disable .append-force-show,.f-cmp-inputgroup .farris-input-group-readonly .append-force-show{display:flex}.f-cmp-inputgroup .f-state-disabled .input-group-text,.f-cmp-inputgroup .f-state-readonly .input-group-text,.f-cmp-inputgroup .farris-input-group-disable .input-group-text,.f-cmp-inputgroup .farris-input-group-readonly .input-group-text{cursor:default}.f-cmp-inputgroup .f-state-disabled .form-control{color:var(--f-text-02)}.f-cmp-inputgroup .f-state-editable .form-control{color:var(--f-text-02)!important}.f-cmp-inputgroup .f-state-focus{border-color:var(--f-theme-08)}.f-cmp-inputgroup .f-state-readonly{box-shadow:none;background:var(--f-neutral-12);border-color:var(--f-neutral-04)}.f-cmp-inputgroup .f-state-readonly .form-control{color:var(--f-text-02)}.f-cmp-inputgroup .f-cmp-inputgroup--multi-wrapper{display:flex;flex-direction:row;align-items:center}.f-cmp-inputgroup .f-cmp-inputgroup--multi-wrapper .multi--content{flex-shrink:1;flex-grow:1;flex-basis:0;overflow:hidden;height:100%;word-break:break-all}.f-cmp-inputgroup .f-cmp-inputgroup--multi-wrapper .multi--content .multi--close{color:var(--f-text-10);font-size:14px;cursor:pointer;margin-left:4px}.f-cmp-inputgroup .f-cmp-inputgroup--multi-wrapper .multi--content .multi--close::before{content:"\e11d"}.f-cmp-inputgroup .f-cmp-inputgroup--multi-wrapper .multi--item{display:inline-flex;align-items:center;border-radius:4px;margin:0 4px 0 0;padding:0 6px;background:var(--f-neutral-09)}.f-cmp-inputgroup .f-cmp-inputgroup--multi-wrapper .multi--item:last-child{margin:0}.f-cmp-inputgroup .f-cmp-inputgroup--multi-wrapper .multi--more{flex-shrink:0;font-size:13px;color:var(--f-theme-03);display:flex;align-items:center}.f-cmp-inputgroup .f-cmp-inputgroup--multi-wrapper .multi--more .multi--more-icon{font-size:13px}.f-cmp-inputgroup .f-cmp-inputgroup--multi-wrapper .multi--more .multi--more-icon::before{content:"\e11e"}.f-cmp-inputgroup .f-cmp-inputgroup--multi-wrapper .multi-date-display .multi--item{padding:0 14px 0 6px}.f-cmp-inputgroup .f-cmp-inputgroup--multi-wrapper .multi-date-display .multi-date-display-readonly{padding:0 6px}.language-textbox-panel{background:var(--f-neutral-20)!important;margin:.25rem 0 0;border-radius:10px;box-shadow:0 2px 20px 0 rgba(3,18,51,.12)!important}.f-layout-pane.f-page-content-main,.f-splitter-pane.f-splitter-pane-bottom,.f-splitter-pane.f-splitter-pane-left,.f-splitter-pane.f-splitter-pane-right,.f-splitter-pane.f-splitter-pane-top{box-shadow:0 0 8px 0 rgba(0,28,64,.08)}.language-textbox-panel .list-group-item{background:0 0}.f-layout{flex-shrink:1;flex-grow:1;flex-basis:0;display:flex;flex-direction:row;flex-wrap:nowrap;overflow:hidden;position:relative}.f-layout-pane.f-page-content-main{flex-shrink:1;flex-grow:1;flex-basis:0;overflow:auto;display:flex}.f-layout-pane.f-page-content-nav{display:flex;flex-direction:column;box-shadow:none!important;padding:0;position:relative;z-index:100}.f-layout-pane>.f-layout-resize-bar.f-layout-resize-bar-e{cursor:e-resize;width:.4375rem;right:-.3125rem;height:100%;top:0}.f-layout-pane>.f-layout-resize-bar.f-layout-resize-bar-w{cursor:w-resize;width:.4375rem;left:-.3125rem;height:100%;top:0}.f-layout-pane>.f-layout-resize-bar.f-layout-resize-bar-s{cursor:s-resize;height:.4375rem;bottom:-.3125rem;width:100%;left:0}.f-layout-pane>.f-layout-resize-bar.f-layout-resize-bar-n{cursor:n-resize;height:.4375rem;top:-.3125rem;width:100%;left:0}.f-layout-pane>.f-layout-resize-bar{position:absolute;font-size:.1px;display:block;touch-action:none}.f-layout-pane>.f-layout-resize-bar:hover{background:rgba(42,135,255,.07)}.f-layout-resize-overlay{z-index:98;width:100%;height:100%;cursor:e-resize;background:0 0;position:absolute}.f-layout-horizontal-resize-proxy{width:.4375rem;background:rgba(42,135,255,.07);left:0;display:none;position:absolute;height:100%;z-index:100}.f-layout-vertical-resize-proxy{height:.4375rem;background:rgba(42,135,255,.07);top:0;display:none;position:absolute;width:100%;z-index:100}.f-list-nav{height:100%;min-height:200px}.f-list-nav .f-list-nav-in{position:relative;height:100%;background-color:#fff;box-shadow:1px 1px 8px 0 rgba(0,28,64,.08);z-index:100}.f-list-nav .f-list-nav-main{display:flex;flex-direction:column;height:100%;overflow-x:hidden}.f-list-nav .f-list-nav-main .f-list-nav-footer,.f-list-nav .f-list-nav-main .f-list-nav-header{flex-shrink:0}.f-list-nav .f-list-nav-main .f-list-nav-content{flex-grow:1;flex-shrink:1;flex-basis:0;overflow-y:auto;padding:.625rem 0}.f-list-nav .f-list-nav-main .f-list-nav-header .f-list-nav-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding:.625rem .875rem .375rem!important;border:none!important;font-size:17px;color:var(--f-text-02);line-height:24px}.f-list-nav.f-list-nav-left{padding-right:0}.f-list-nav.f-list-nav-right{padding-left:0}.f-list-nav.f-list-nav-bottom,.f-list-nav.f-list-nav-top{width:100%;height:auto;min-height:auto}.f-list-nav .f-list-nav-in>.ng-resizable-handle{z-index:105}.splitter-pane-collapse-animate{transition:width .5s ease 0s}.f-template-listnav-row .list-nav-link{margin:4px 8px;border-radius:8px;color:var(--f-text-02);display:flex;align-items:center;padding:.5625rem 1.25rem}.f-template-listnav-row .list-nav-link.link-disable{background-color:#F9F9F9}.f-template-listnav-row .list-nav-link .nav-item-name{flex:1;font-size:.875rem;line-height:1.25rem;color:var(--f-text-02);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.f-template-listnav-row .list-nav-link .nav-item-counter{display:inline-block;padding:0 .3125rem;height:.875rem;line-height:.875rem;border-radius:.5rem;font-size:.625rem;color:var(--f-theme-03)}.f-template-listnav-row .list-nav-link:hover{background:var(--f-aid-02)}.f-listview-active .f-template-listnav-row .list-nav-link{border:none;background:var(--f-theme-04);box-shadow:0 4px 10px 0 rgba(var(--f-theme-03),.2)}.f-listview-active .f-template-listnav-row .list-nav-link .nav-item-name{color:#fff}.f-listview-active .f-template-listnav-row .list-nav-link .nav-item-counter{color:#fff;font-size:13px;background:0 0}.f-list-nav .f-list-nav-toggle-sidebar{width:22px;height:22px;background:#fff;border:1px solid var(--f-neutral-07);display:flex;align-items:center;position:absolute;z-index:120;margin:0;cursor:pointer}.f-list-nav .f-list-nav-toggle-sidebar .triangle{color:var(--f-text-02);border:none;font-family:FarrisIcons;width:14px;height:14px;-webkit-font-smoothing:antialiased;font-size:14px;font-weight:400;text-transform:none;display:block;line-height:14px;margin:0 auto}.f-list-nav .f-list-nav-toggle-sidebar .triangle::before{line-height:1}.f-list-nav .f-list-nav-toggle-sidebar .active,.f-list-nav .f-list-nav-toggle-sidebar:hover{border-color:var(--f-theme-03);color:#fff;background-image:linear-gradient(214deg,#3F65FF 0,#4D9AFF 100%);box-shadow:0 3px 8px 0 rgba(var(--f-semantic-info-01),.4)}.f-list-nav.f-list-nav-left .f-list-nav-toggle-sidebar{border-radius:12px;top:14px;right:-12px;left:auto}.f-list-nav.f-list-nav-left .f-list-nav-toggle-sidebar .triangle{border:none}.f-list-nav.f-list-nav-left .f-list-nav-toggle-sidebar.active{right:-12px;transform:rotateY(180deg)}.f-list-nav.f-list-nav-right .f-list-nav-toggle-sidebar{border-radius:12px;top:14px;left:-12px;right:auto}.f-list-nav.f-list-nav-right .f-list-nav-toggle-sidebar .triangle{border:none}.f-list-nav.f-list-nav-right .f-list-nav-toggle-sidebar .triangle::before{content:"\e00d"}.f-list-nav.f-list-nav-right .f-list-nav-toggle-sidebar.active{left:-12px;transform:rotateY(180deg)}.f-list-nav.f-list-nav-top .f-list-nav-toggle-sidebar{border-radius:12px;top:auto;bottom:-12px;right:14px;width:22px;height:22px;left:auto}.f-list-nav.f-list-nav-top .f-list-nav-toggle-sidebar .triangle{border:none}.f-list-nav.f-list-nav-top .f-list-nav-toggle-sidebar .triangle::before{content:"\e00c"}.f-list-nav.f-list-nav-top .f-list-nav-toggle-sidebar.active{top:auto;left:auto;right:14px;bottom:-12px;transform:rotateX(180deg)}.f-list-nav.f-list-nav-bottom .f-list-nav-toggle-sidebar{border-radius:12px;top:-12px;bottom:auto;right:14px;width:22px;height:22px;left:auto}.f-list-nav.f-list-nav-bottom .f-list-nav-toggle-sidebar .triangle{border:none}.f-list-nav.f-list-nav-bottom .f-list-nav-toggle-sidebar .triangle::before{content:"\e00e"}.f-list-nav.f-list-nav-bottom .f-list-nav-toggle-sidebar.active{right:14px;left:auto;top:-12px;bottom:auto;transform:rotateX(180deg)}.f-template-timeline-new-row .f-timeline{padding-right:26px}.f-template-timeline-new-row .f-timeline .timeline-date{position:relative;padding-bottom:16px;padding-left:18px;color:rgba(0,0,0,.45);font-size:14px;line-height:20px}.f-template-timeline-new-row .f-timeline .timeline-date::before{position:absolute;left:0;top:0;width:1px;height:35px;border-left:1px dotted #dcdcdc;content:"";z-index:9}.f-template-timeline-new-row .f-timeline .timeline-date::after{position:absolute;left:-3px;top:6.5px;display:block;width:7px;height:7px;background:#66B869;border-radius:100%;content:"";z-index:10}.f-template-timeline-new-row .f-timeline .timeline-content-wrapper{padding-left:18px;padding-bottom:13px;border-left:1px dotted #dcdcdc}.f-template-timeline-new-row .f-timeline .timeline-content-wrapper .timeline-content{padding:15px 14px;background:#F9F9F9;border:1px solid #F2F2F2}.f-template-timeline-new-row .f-timeline .timeline-content-wrapper .timeline-content-title{padding-bottom:12px;font-size:14px;line-height:20px;color:rgba(0,0,0,.65);border-bottom:1px solid rgba(220,220,220,.6)}.f-template-timeline-new-row .f-timeline .timeline-content-wrapper .timeline-content-title .title-sum{line-height:22px;font-size:16px;color:#F49730}.f-template-timeline-new-row .f-timeline .timeline-content-wrapper .timeline-content-main .content-data{font-size:0;margin-top:16px}.f-template-timeline-new-row .f-timeline .timeline-content-wrapper .timeline-content-main .content-data li{display:inline-block;padding-right:30px;margin-bottom:18px;font-size:14px;line-height:20px;color:rgba(0,0,0,.65)}.f-template-timeline-new-row .f-timeline.f-timeline-first .timeline-date::before{height:28px;top:7px}.f-template-timeline-new-row .f-timeline.f-timeline-success .timeline-date::after{background:var(--f-semantic-success-01)}.f-template-timeline-new-row .f-timeline.f-timeline-info .timeline-date::after{background-color:var(--f-semantic-info-01)}.f-template-timeline-new-row .f-timeline.f-timeline-error .timeline-date::after{background-color:var(--f-semantic-danger-01)}.f-template-timeline-new-row .f-timeline.f-timeline-warn .timeline-date::after{background-color:var(--f-semantic-warning-01)}.f-list-view .f-list-view-hover,.f-tmpl-subgrid-by-card .subgrid-by-card-item.f-state-edit{background:linear-gradient(270deg,rgba(235,244,255,.6) 0,#EBF4FF 100%)}.f-listview-fill{flex-grow:1;flex-shrink:1;flex-basis:0;overflow:hidden}.f-listview-fill .f-list-view{height:100%}.f-listview-fill .f-list-view .f-list-view-footer,.f-listview-fill .f-list-view .f-list-view-header{flex-shrink:0}.f-listview-fill .f-list-view .f-list-view-content{overflow-y:auto;flex-grow:1;flex-shrink:1;flex-basis:0}.f-list-view{display:flex;flex-direction:column;overflow:hidden}.f-list-view .f-list-view-content{flex:1;overflow:auto}.f-list-view .f-list-view-group{padding:0}.f-list-view .f-paging-wrapper{padding:14px 0}.f-list-view .f-list-view-group-item{display:flex;align-items:center;float:none;text-align:initial}.f-list-view .f-list-view-group-item.f-none-border{border-bottom:0}.f-list-view .f-list-view-group-item.f-listview-active,.f-list-view .f-list-view-group-item.f-listview-hover{cursor:pointer;color:#424347}.f-list-view .f-list-view-group-item.f-listview-active{border-color:#529dff}.f-list-view .f-list-view-group-item.f-un-select{color:#848c9a}.f-list-view .f-list-view-group-item .f-list-content{flex:1 1 auto;width:100%}.f-list-view .f-list-view-draggable-item{border:1px solid #e2e3e5;background-color:#fafbfd;border-radius:10px;margin:4px 2px}.f-list-view .f-list-view-draggable-item.f-listview-hover{cursor:pointer;color:#424347;background:#edf5ff!important}.f-list-view .f-list-view-draggable-item.f-listview-hover .f-list-remove-icon{display:initial}.f-list-view .f-list-view-draggable-item.f-listview-active{border-color:#529dff}.f-list-view .f-list-view-draggable-item.moving{opacity:0}.f-list-view .f-list-select{padding:0 0 0 14px}.f-list-view .f-list-select .listview-checkbox{margin:.25rem 0}.f-list-view .f-list-pin{color:#2986ff;padding:0 14px 0 0}.f-list-view .f-list-remove{width:30px;color:#f4625f;padding:0 14px 0 0}.f-list-view .f-list-remove-icon{display:none}.f-list-view .f-list-handle{padding:0 14px 0 0}.f-list-view .f-list-view-emptydata .f-empty-title{font-size:14px;line-height:22px;color:#999;padding:20px 0;text-align:center}.f-list-view.small-item .f-list-select{padding:initial}::highlight(search-result){background-color:#f06;color:#fff}.f-list-view-group-item .custom-control.listview-checkbox{margin-right:0;padding-right:4px}.f-listview-card-content-fill .f-list-content{height:100%;display:flex;flex-direction:column}.f-listview-card-content-fill .f-list-content>*{height:100%}.f-tmpl-card-listview--header-multicontent02 .f-list-view{margin:0}.f-tmpl-card-listview--header-multicontent02 .f-list-view-group{margin:0 -10px}.f-tmpl-card-listview--header-multicontent02 .f-list-view-content{overflow-x:hidden}.f-tmpl-card--header-multicontent02{position:relative;margin:0 10px 20px}.f-tmpl-card--header-multicontent02 .f-list-select{position:absolute;padding:0!important;top:10px;left:14px}.f-tmpl-card--header-multicontent02 .f-list-select .custom-checkbox{margin:0;padding:0}.f-tmpl-card--header-multicontent02 .f-list-select .custom-control-label::before{font-size:1rem}.f-tmpl-card--header-multicontent02 .header-multicontent02{background:#FEFEFF;border:1px solid #E9ECF3;border-radius:6px;width:310px;margin:0}.f-tmpl-card--header-multicontent02 .header-multicontent02 .text-label{color:#5A5E66}.f-tmpl-card--header-multicontent02 .header-multicontent02 .f-emphasize{font-size:16px;color:var(--f-semantic-warning-01)}.f-tmpl-card--header-multicontent02 .header-multicontent02 .header-multicontent02--header{padding:0 0 0 38px;height:40px;display:flex;align-items:center;border-bottom:1px solid #E9ECF3}.f-tmpl-card--header-multicontent02 .header-multicontent02 .header-multicontent02--header .f-title{margin:0;flex-shrink:1;flex-grow:1;flex-basis:0;font-size:16px;font-weight:600;color:#2D2F33;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.f-tmpl-card--header-multicontent02 .header-multicontent02 .header-multicontent02--header .f-state{margin:0 0 0 8px}.f-tmpl-card--header-multicontent02 .header-multicontent02 .header-multicontent02--header .f-state .badge{border-radius:20px 0 0 20px;height:28px;line-height:28px;padding:0 13px}.f-tmpl-card--header-multicontent02 .header-multicontent02 .header-multicontent02--content{padding:14px 0 0 14px;color:#2D2F33;font-size:13px}.f-tmpl-card--header-multicontent02 .header-multicontent02 .header-multicontent02--content p{margin:0 0 10px}.f-tmpl-card--header-multicontent02 .header-multicontent02 .header-multicontent02--footer{padding:8px 14px 18px}.f-tmpl-card--header-multicontent02 .header-multicontent02 .header-multicontent02--footer p{margin:0}.f-tmpl-card--header-multicontent02 .header-multicontent02 .header-multicontent02--footer .footer--auxiliary{width:32px;border-radius:16px;margin:0 8px 0 0}.f-tmpl-card--header-multicontent02 .header-multicontent02 .header-multicontent02--footer .footer--auxiliary img{display:block;width:32px;height:32px}.f-tmpl-card--header-multicontent02 .header-multicontent02 .header-multicontent02--footer .text--name{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:13px;color:#5A5E66}.f-tmpl-card--header-multicontent02 .header-multicontent02 .header-multicontent02--footer .icon-btn{padding:2px;margin:0 8px;cursor:pointer}.f-tmpl-card--header-multicontent02 .header-multicontent02 .header-multicontent02--footer .icon-btn.disabled{color:var(--f-text-07)}.f-tmpl-card--header-multicontent02 .header-multicontent02 .header-multicontent02--footer .icon-btn:hover{color:var(--f-theme-03)}.f-tmpl-card--header-multicontent02 .header-multicontent02 .header-multicontent02--footer .icon-btn .f-icon{font-size:14px}.f-tmpl-list01-container{border-top:1px solid rgba(0,0,0,.07);border-bottom:1px solid rgba(0,0,0,.07);margin-top:-1px}.f-tmpl-list01-container .f-list-select{padding-right:0!important}.f-tmpl-list01-container .gutter{margin:0 30px 0 0}.f-tmpl-list01-container .list01--header{font-size:13px;margin:0 0 3px}.f-tmpl-list01-container .list01--header .f-title{font-weight:600;margin:0 8px 0 0;vertical-align:top}.f-tmpl-list01-container .list01--header li{display:inline-block;margin:0 30px 3px 0}.f-tmpl-list01-container .list01--des span:last-child,.f-tmpl-list01-container .list01--header li:last-child{margin-right:0}.f-tmpl-list01-container .list01--header .badge{border-radius:10px;line-height:20px;padding:0 8px}.f-tmpl-list01-container .list01--des{font-size:12px;color:rgba(0,0,0,.5)}.modal-header,.modal-header .close,.modal-header .close:not(:disabled):not(.disabled):focus,.modal-header .close:not(:disabled):not(.disabled):hover,.ng-busy-default-sign,.ng-busy-default-text{color:var(--f-text-02)}.f-tmpl-list01-container .list01--des span{display:inline-block;margin-bottom:3px}.f-tmpl-list01-container .list01--content{padding:16px 12px 16px 8px}.f-tmpl-list01-container .list01--toolbar{width:150px;padding:0 14px;text-align:right}.f-list-view-footer .f-paging-wrapper{padding:0!important}.f-list-view-footer .f-paging-wrapper .pagination-container{height:2.5rem}.f-list-view-footer .f-paging-wrapper .pagination{padding:.875rem 0 0}.f-component-loading{z-index:1060;top:0;left:0;right:0;bottom:0;position:absolute}.farris-loading-backdrop{position:absolute;top:0;left:0;right:0;bottom:0;z-index:1061;opacity:0;background-color:transparent}.farris-loading{position:absolute;top:50%;left:50%}.ng-busy-default-wrapper{text-align:center}.ng-busy-default-sign{position:relative;display:flex;align-items:center;z-index:1063;padding:8px 16px 8px 8px;border:0 solid #E5E9EF;border-radius:8px;box-shadow:0 6px 16px -8px rgba(0,0,0,.06),0 0 30px 12px rgba(0,0,0,.04);background:#fff}.ng-busy-default-text{display:inline-block;margin-left:.375rem;max-width:25rem;text-align:left;padding:0 4px;font-size:15px}.ng-busy-default-spinner{position:relative;display:inline-block;width:1.5625rem;height:1.5625rem;vertical-align:middle}.ng-busy-default-spinner div{position:absolute;left:44.5%;top:37%;width:10%;height:26%;background:#666;border-radius:3.125rem;box-shadow:0 0 3px rgba(0,0,0,.2);opacity:0;animation:busy-spinner-anim 1s linear infinite}.f-loading-round{font-size:10px;margin:0;width:100%;height:100%;border-radius:50%;position:relative;animation:loadingRountAnimation 1s infinite linear;transform:translateZ(0)}.f-loading-round::before{width:50%;height:50%;background:var(--f-theme-03);border-radius:100% 0 0;position:absolute;top:0;left:0;content:""}.f-loading-round::after{background:#fff;width:90%;height:90%;border-radius:50%;content:"";margin:auto;position:absolute;top:0;left:0;bottom:0;right:0}.f-loading-dot,.f-loading-dot-wrapper{height:100%;width:100%;overflow:hidden}@keyframes loadingRountAnimation{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.f-loading-dot-wrapper .dot1{background:var(--f-semantic-danger-01)}.f-loading-dot-wrapper .dot2{background:var(--f-semantic-warning-01)}.f-loading-dot-wrapper .dot3{background:var(--f-semantic-success-01)}.f-loading-dot{position:absolute;margin:auto;top:0;bottom:0;left:0;right:0;animation:fLoadingDotRotate 1.8s linear infinite}.f-loading-dot-wrapper{position:relative}.f-loading-dot-wrapper .dot{position:absolute;margin:auto;width:25%;height:25%;border-radius:100%;transition:all 1s ease}.f-loading-dot-wrapper .dot1{top:0;bottom:0;left:0;animation:dotsY 1.8s linear infinite}.f-loading-dot-wrapper .dot2{left:0;right:0;top:0;animation:dotsX 1.8s linear infinite}.f-loading-dot-wrapper .dot3{top:0;bottom:0;right:0;animation:dotsY 1.8s linear infinite}.f-loading-dot-wrapper .dot4{background:var(--f-semantic-info-01);left:0;right:0;bottom:0;animation:dotsX 1.8s linear infinite}@keyframes fLoadingDotRotate{0%{transform:rotate(0)}10%{width:100%;height:100%}66%{width:25%;height:25%}100%{transform:rotate(360deg);width:100%;height:100%}}@keyframes dotsY{66%{opacity:.3;width:25%}77%{opacity:1;width:0}}@keyframes dotsX{66%{opacity:.3;height:25%}77%{opacity:1;height:0}}.modal-tips{padding:.5625rem .625rem .5625rem 1.25rem}.modal-tips .modal-tips-content{margin-top:0;margin-left:2.25rem;margin-right:1.75rem}.modal-tips .modal-tips-title{color:var(--f-text-04);font-size:.875rem;line-height:1.25rem;font-weight:400;margin:0}.modal-tips .toast-msg{margin:0;word-break:break-all;font-size:1rem;line-height:1.375rem}.modal-tips .only-toast-msg{color:var(--f-text-04);font-size:1rem;line-height:1.375rem}.modal-tips .toast-msg-title{margin:1px 0 0;word-break:break-all;font-size:1rem;line-height:1.375rem;color:var(--f-text-01)}.modal-tips .toast-msg-detail{word-break:break-all;color:var(--f-text-06);font-size:.875rem;margin:.625rem 0 0}.modal-tips .modal-tips-iconwrap .f-icon{font-size:1.625rem;margin-right:.75rem}.modal-footer .btn,.modal-footer .k-button{font-size:.8125rem;padding:.375rem 1.3125rem}.message-container{height:8.75rem;display:flex;flex-direction:column}.message-container .btn{min-width:3.75rem;margin:auto .3125rem}.farris-messager{display:flex}.farris-messager .icon{background-position:center .1875rem;background-size:4.375rem;background-repeat:no-repeat;width:4.375rem;height:4.375rem}.farris-messager .msg{flex:1 1 auto}.modal-message .modal-tips,.modal-message .modal-tips.messager-type-error{padding:1.875rem 1.5rem 1.75rem 1.875rem}.modal-message .modal-tips .modal-tips-content{padding:0}.modal-message .modal-tips .modal-tips-iconwrap{margin:0}.modal-message .modal-tips .modal-tips-iconwrap .f-icon{font-size:1.625rem}.modal-message .modal-footer{background:#fff!important;box-shadow:none;border:none;padding:0 1.5rem 1.25rem 1.875rem}.modal-message .modal-cotnent--has-header .modal-tips{padding:1.875rem 1.5rem 1.75rem 1.875rem}.modal.farris-modal .modal-message.model-dialog-maximize{width:60%!important;max-width:50rem!important;height:auto!important;max-height:60%!important;top:0!important;left:0!important;margin:0!important}.modal,.modal-backdrop{top:0;left:0;bottom:0;right:0}.modal.farris-modal .modal-message .modal-body{padding:0}.modal-open{overflow:hidden}.modal-open .modal{overflow-y:auto}.modal{position:fixed;z-index:1050;display:none;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-25%)}@media screen and (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:translate(0,0)}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - .5rem * 2)}.modal-dialog-centered::before{display:block;height:calc(100vh - .5rem * 2);content:""}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:0 solid #E5E9EF;border-radius:16px;box-shadow:0 2px 12px 0 rgba(0,0,0,.06);outline:0}.modal-backdrop{position:fixed;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.15}.modal-title{margin-bottom:0;line-height:1.375rem}.modal-body{position:relative;flex-grow:1;flex-shrink:1;flex-basis:auto;padding:.625rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:3.125rem;height:3.125rem;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:31.25rem;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - 1.75rem * 2)}.modal-dialog-centered::before{height:calc(100vh - 1.75rem * 2)}.modal-content{box-shadow:0 2px 12px 0 rgba(0,0,0,.06)}.modal-sm{max-width:18.75rem}}@media (min-width:888px){.modal-lg{max-width:50rem}}.modal-header{display:flex;justify-content:space-between;flex-shrink:0;padding:.75rem .5rem .75rem 1.125rem;background:#fff;align-items:center;border-top-left-radius:16px;border-top-right-radius:16px;border-bottom:none}.modal-header .close{opacity:1;padding:.1875rem;margin:-.25rem 0;border:1px solid transparent;font-size:1rem;width:1.6607375rem;height:1.6607375rem}.modal-title{font-size:1rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.modal-footer,.showtype-modal .fe-modal-footer-base{display:flex;align-items:center;justify-content:flex-end;flex-shrink:0;background:var(--f-neutral-00);padding:.875rem 1.5rem;box-shadow:none}.modal-footer>:not(:first-child),.showtype-modal .fe-modal-footer-base>:not(:first-child){margin-left:.3125rem}.modal-footer>:not(:last-child),.showtype-modal .fe-modal-footer-base>:not(:last-child){margin-right:.3125rem}.modal-open .modal{overflow-x:auto}.modal.farris-modal .actions{flex:1;margin:-.25rem 0}.modal.farris-modal .actions ul{list-style:none;margin:0;padding:0;display:flex;justify-content:flex-end}.modal.farris-modal .actions .f-btn-icon{cursor:pointer;color:var(--f-text-07);text-align:center}.modal.farris-modal .actions .f-btn-icon:hover{color:var(--f-theme-05)}.f-cmp-footer .f-cmp-footer-header .f-toolbar .toolbar--collapse-icon:hover,.modal.farris-modal .actions .f-btn-icon:active{color:var(--f-theme-01)}.modal.farris-modal .actions .modal-tips-iconwrap .f-icon{font-size:2rem}.fe-cmp-page-modal .action-list .f-icon,.fe-cmp-page-modal .close-icon .f-icon{font-size:14px}.modal.farris-modal .actions .modal-tips-iconwrap .modal-tips-content{padding-top:.25rem}.modal.farris-modal .ng-draggable{cursor:move}.modal.farris-modal .modal-dialog{max-width:none;margin:0;top:50%;left:50%;position:absolute;pointer-events:all}.modal.farris-modal.fade .modal-dialog{transform:none;transition:none}.modal.farris-modal .modal-content{height:100%;overflow:hidden}.modal.farris-modal .modal-body{padding:0}.farris-messager{flex-direction:column;position:absolute;top:0;bottom:0;left:0;right:0}.farris-messager .modal-tips{margin-bottom:0;flex-shrink:1;flex-grow:1;flex-basis:auto;overflow-y:auto;display:flex;flex-direction:row}.farris-messager .modal-tips .modal-tips-iconwrap{margin:.5625rem 0;padding:0}.farris-messager .modal-tips .modal-tips-content{margin:0;padding:.5625rem .9375rem .5625rem 0}.farris-messager .fixdiv{overflow:auto}.f-modal-fitContent{display:flex!important;align-items:center;justify-content:center}.f-modal-fitContent-scroll{align-items:flex-start}.f-modal-fitContent .modal-dialog{position:relative!important;top:0!important;left:0!important;margin:1.875rem 0!important;min-height:7.5rem}.f-modal-fitContent .farris-messager{position:relative!important}.overlay-container{position:fixed;z-index:9999;pointer-events:none;top:0;left:0;height:100%;width:100%}.fe-cmp-page-modal .action-wrapper{position:absolute;right:-12px;top:-12px;z-index:400}.fe-cmp-page-modal .action-wrapper .close-icon{background:rgba(0,0,0,.4);width:22px;height:22px;border-radius:12px;color:#fff;text-align:center;line-height:22px;display:block;cursor:pointer}.fe-cmp-page-modal .action-wrapper .close-icon:hover{background:rgba(0,0,0,.6)}.fe-cmp-page-modal .action-list{position:absolute;right:-32px;top:20px;color:rgba(255,255,255,.85)}.fe-cmp-page-modal .action-list .action-list--item{display:block;width:32px;height:32px;text-align:center}.fe-cmp-page-modal .action-list .action-list--icon{display:block;cursor:pointer;margin:0 auto;line-height:32px;border-radius:0 3px 3px 0}.fe-cmp-page-modal .action-list .action-list--icon:hover{color:#fff}.fe-cmp-page-modal .action-list .max-icon{background:linear-gradient(-63deg,#517BFF 0,#74A1FF 95%)}.fe-cmp-page-modal .action-list .close-icon{background:linear-gradient(-51deg,#FE6568 0,#FA6568 0,#F67574 100%)}.fe-cmp-page-modal .modal-body{border-radius:16px}.fe-cmp-page-modal.modal .modal-content{overflow:visible}.farris-modal{background-color:rgba(0,0,0,.45)}.farris-nav{display:flex;flex-direction:row;align-items:center;border-bottom:1px solid #e9e9e9;overflow:hidden;border-color:var(--f-neutral-06)!important}.farris-nav-item{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.farris-nav-item-link{padding:.75rem 1rem;cursor:pointer;border-bottom:2px solid transparent}.farris-nav-item-link-text{position:relative;font-size:1rem;font-weight:400}.farris-nav-item-tag{position:absolute;right:-.75rem;top:calc(10px - 100%);padding:0 .375rem;color:#fff;font-size:.75rem;line-height:1.125rem;border-radius:1.125rem;background-color:var(--f-semantic-danger-01)}.nav,.pagination{padding-left:0;list-style:none}.farris-nav.farris-nav-vertical{flex-direction:column;align-items:flex-start}.farris-nav.farris-nav-vertical .farris-nav-item{width:100%}.farris-nav-item-link-text{color:var(--f-text-03)}.farris-nav-item.active .farris-nav-item-link{border-color:var(--f-theme-03)}.farris-nav-item.active .farris-nav-item-link-text{color:var(--f-theme-03)}.farris-nav-item.disabled .farris-nav-item-link-text{color:var(--f-text-07)}.farris-nav-item:hover:not(.disabled):not(.active) .farris-nav-item-link-text{color:var(--f-theme-05)}.nav{display:flex;flex-wrap:wrap;margin-bottom:0}.nav-link{display:block;padding:.5rem 1rem}.f-cmp-footer-accordion.f-state-collapse .f-cmp-footer-content,.tab-content>.tab-pane{display:none}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:6px;border-top-right-radius:6px}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:6px}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--f-text-00);background:var(--f-theme-04)}.nav-fill .nav-item{flex-grow:1;flex-shrink:1;flex-basis:auto;text-align:center}.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.active{display:block}.farris-notify{position:fixed;z-index:999999}.farris-notify.toasty-position-top-left{top:.75rem;left:.75rem}.farris-notify.toasty-position-top-right{top:.75rem;right:.75rem}.farris-notify.toasty-position-bottom-right{bottom:.75rem;right:.75rem}.farris-notify.toasty-position-bottom-left{bottom:.75rem;left:.75rem}.farris-notify.toasty-position-top-center{top:.75rem;left:50%;transform:translate(-50%,0)}.farris-notify.toasty-position-bottom-center{bottom:.75rem;left:50%;transform:translate(-50%,0)}.farris-notify.toasty-position-center-center{top:50%;left:50%;transform:translate(-50%,0)}.f-message-strip .toast,.farris-notify .toast{margin:0 0 .625rem;padding:0;width:24rem;border:1px solid var(--f-neutral-08);background:#fff;display:table;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:8px;position:relative}.f-message-strip .toast .toast-close,.farris-notify .toast .toast-close{position:absolute;border:0;top:.625rem;right:.625rem;color:rgba(0,0,0,.25)}.f-message-strip .toast.toasty-type-danger,.f-message-strip .toast.toasty-type-info,.f-message-strip .toast.toasty-type-success,.f-message-strip .toast.toasty-type-warning,.farris-notify .toast.toasty-type-danger,.farris-notify .toast.toasty-type-info,.farris-notify .toast.toasty-type-success,.farris-notify .toast.toasty-type-warning{border-color:var(--f-neutral-08)}.f-message-strip .toast .toast-close .modal_close,.farris-notify .toast .toast-close .modal_close{font-size:1rem}.f-message-strip .toast .toast-close.f-btn-icon.f-bare,.farris-notify .toast .toast-close.f-btn-icon.f-bare{outline:unset}.f-message-strip .toast .modal-tips,.farris-notify .toast .modal-tips{padding:.625rem .75rem .625rem 1.25rem}.f-message-strip .toast .modal-tips-content,.farris-notify .toast .modal-tips-content{margin:0 1.75rem}.f-message-strip .toast .modal-tips-iconwrap .f-icon,.farris-notify .toast .modal-tips-iconwrap .f-icon{font-size:1rem;border-radius:100%;vertical-align:middle}.f-message-strip .toast.toasty-type-info .modal-tips-iconwrap .f-icon,.farris-notify .toast.toasty-type-info .modal-tips-iconwrap .f-icon{box-shadow:0 3px 8px 0 rgba(var(--f-semantic-info-01),.3)}.f-message-strip .toast.toasty-type-success .modal-tips-iconwrap .f-icon,.farris-notify .toast.toasty-type-success .modal-tips-iconwrap .f-icon{box-shadow:0 3px 8px 0 rgba(var(--f-semantic-success-01),.3)}.f-message-strip .toast.toasty-type-danger .modal-tips-iconwrap .f-icon,.farris-notify .toast.toasty-type-danger .modal-tips-iconwrap .f-icon{box-shadow:0 3px 8px 0 rgba(var(--f-semantic-danger-01),.3)}.f-message-strip .toast.toasty-type-warning .modal-tips-iconwrap .f-icon,.farris-notify .toast.toasty-type-warning .modal-tips-iconwrap .f-icon{box-shadow:0 3px 8px 0 rgba(var(--f-semantic-warning-01),.3)}.farris-notify .toast.toasty-type-danger,.farris-notify .toast.toasty-type-info,.farris-notify .toast.toasty-type-success,.farris-notify .toast.toasty-type-warning{background:#fff}.f-message-strip .toast{width:100%;box-shadow:none}.f-message-strip .toast.toasty-type-info{background:var(--f-semantic-info-03)}.f-message-strip .toast.toasty-type-success{background:var(--f-semantic-success-03)}.f-message-strip .toast.toasty-type-danger{background:var(--f-semantic-danger-03)}.f-message-strip .toast.toasty-type-warning{background:var(--f-semantic-warning-03)}.f-message-strip .toast .modal-tips{display:flex;padding:.5rem 1rem}.f-message-strip .toast .modal-tips-content{margin:0}.f-catch-attention-debounce{position:relative;z-index:1;outline:var(--f-theme-03) solid 1px;animation:debounceAttention .2s ease 0s infinite normal}@keyframes debounceAttention{0%{outline:solid var(--f-theme-03)}100%{outline:solid 18px}}.farris-notify .toast-title-beforeshow{opacity:0}@keyframes farrisMoveUpIn{0%{transform:translateY(-100%);transform-origin:0 0;opacity:0}100%{transform:translateY(0);transform-origin:0 0;opacity:1}}@keyframes farrisMoveUpOut{0%{transform:translateY(0);transform-origin:0 0;opacity:1}100%{transform:translateY(-100%);transform-origin:0 0;opacity:0}}.f-cmp-footer-accordion.f-state-collapse .f-toolbar .toolbar--collapse-icon,.f-cmp-number-spinner .btn-number-flag-up .number-arrow-chevron,.pagination .pg-pagelist.show .pg-pagelist-info .f-icon{transform:rotate(180deg)}.toast.fadeIn{animation:farrisMoveUpIn .2s linear}.toast.fadeOut{animation:farrisMoveUpOut .2s linear}.f-cmp-number-spinner .sub-btn-group{border-right:1px solid var(--f-neutral-04)}.f-cmp-number-spinner .number-arrow-chevron{font-size:12px;min-width:12px}.f-cmp-number-spinner .input-group .btn-group-number,.input-group .btn-group-number{background:var(--f-neutral-12);border-color:var(--f-neutral-04)}.f-cmp-number-spinner .input-group .btn-group-number.btn-number-flag .number-arrow-chevron,.input-group .btn-group-number.btn-number-flag .number-arrow-chevron{color:var(--f-text-07);border-left:1px solid var(--f-neutral-04)}.f-cmp-number-spinner .input-group .btn-group-number.btn-number-flag .number-arrow-chevron:nth-child(2),.input-group .btn-group-number.btn-number-flag .number-arrow-chevron:nth-child(2){border-top:1px solid var(--f-neutral-04)}.f-cmp-number-spinner .input-group .btn-group-number.btn-number-flag .number-arrow-chevron:active,.f-cmp-number-spinner .input-group .btn-group-number.btn-number-flag .number-arrow-chevron:hover,.input-group .btn-group-number.btn-number-flag .number-arrow-chevron:active,.input-group .btn-group-number.btn-number-flag .number-arrow-chevron:hover{color:var(--f-theme-05);background:var(--f-neutral-12)}.f-cmp-number-spinner .input-group .btn-group-number.btn-number-flag .number-arrow-chevron.not-allowed,.input-group .btn-group-number.btn-number-flag .number-arrow-chevron.not-allowed{background:var(--f-neutral-12)}.input-group .btn-group-number{height:100%;flex-direction:column;background-color:var(--f-neutral-12);border-left:1px solid var(--f-neutral-04);width:1.375rem;overflow:hidden;margin:0}.input-group .btn-group-number .btn-number-flag{height:50%;display:flex;box-shadow:none;padding:0 5px;margin-left:1px;overflow:hidden;transition:all .1s linear}.input-group .btn-group-number .btn-number-flag .number-arrow-chevron{flex:1;line-height:1}.input-group .btn-group-number .btn-number-flag:hover{height:60%!important}.input-group .btn-group-number .btn-number-flag:nth-child(2){border-top:1px solid #d9d9d9}input::-webkit-inner-spin-button,input::-webkit-outer-spin-button{-webkit-appearance:none!important;margin:0}.input-group.number-range{position:relative}.input-group.number-range .input-container{display:flex;padding:0}.input-group.number-range .input-container .sub-input-group{flex:1;position:relative;display:flex;transition:all .3s ease-out}.input-group.number-range .input-container .sub-input-group .sub-input{width:100%;border:none;outline:0;background-color:rgba(0,0,0,0);min-width:2px;padding:.125rem 4px .125rem .5rem}.input-group.number-range .input-container .sub-input-group:first-child .sub-btn-group{border-radius:0}.input-group.number-range .input-container .spliter{width:15px;text-align:center}.number-range .input-container .sub-input-group .sub-input{background-color:transparent}.number-range .input-container .sub-input-group .sub-input::-moz-placeholder{color:var(--f-text-09)}.number-range .input-container .sub-input-group .sub-input::placeholder{color:var(--f-text-09)}.number-range .input-container .sub-input-group .sub-input:disabled::-moz-placeholder,.number-range .input-container .sub-input-group .sub-input[readonly]::-moz-placeholder{color:var(--f-text-09)}.number-range .input-container .sub-input-group .sub-input:disabled::placeholder,.number-range .input-container .sub-input-group .sub-input[readonly]::placeholder{color:var(--f-text-09)}.f-order .f-list-view-emptydata .f-empty-title{padding:10px 0;margin-bottom:0}.f-order .f-order-item{border:none;background-color:initial}.f-order .f-order-item.f-listview-hover{cursor:pointer;color:#424347;background:#edf5ff!important}.f-order .f-order-item.f-listview-hover .f-list-remove-icon{display:initial}.f-order .f-order-item.f-listview-active{border-color:none}.f-order .f-order-item.moving{opacity:0}.f-order .f-order-add-button{display:flex!important;align-items:center!important}.f-order .f-order-add-icon{width:1.2rem;height:1.2rem;background-color:#f0f8ff;border-radius:1.2rem;display:inline-block;margin-right:4px}.f-order .f-order-add-icon .f-icon{line-height:1.2!important}.f-order .f-order-header{display:flex;margin:4px 60px 0 0}.f-order .f-order-header .f-order-header-order-field,.f-order .f-order-header .f-order-header-order-type{flex:1}.f-order .f-order-header .f-order-header-order-field{margin:0 4px 0 10px}.f-order .f-order-header .f-order-header-order-type{margin:0 10px 0 4px}.f-order .f-order-item-content{display:flex;margin:4px 0}.f-order .f-order-item-content .f-order-item-content-order-field,.f-order .f-order-item-content .f-order-item-content-order-type{flex:1}.f-order .f-order-item-content .f-order-item-content-order-field{margin:0 4px 0 10px}.f-order .f-order-item-content .f-order-item-content-order-type{margin:0 10px 0 4px}.f-cmp-footer{display:flex;flex-direction:column;padding:.875rem;margin:0;background:var(--f-neutral-19);border-radius:4px;box-shadow:0 4px 10px 0 rgba(31,35,41,.1)}.f-cmp-footer .f-cmp-footer-header{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:space-between;margin:0 0 .5rem;border-bottom:1px dashed rgba(0,0,0,.1);padding:0 0 .75rem}.f-cmp-footer .f-cmp-footer-header .f-content{display:inline-flex;align-items:center;white-space:nowrap;flex-shrink:1;flex-grow:1;flex-basis:0}.f-cmp-footer .f-cmp-footer-header .f-toolbar{min-width:10rem;flex-shrink:0;display:inline-flex;align-items:center;justify-content:flex-end;color:var(--f-text-04);margin-left:auto}.f-cmp-footer .f-cmp-footer-header .f-toolbar .toolbar--collapse{cursor:pointer}.f-cmp-footer .f-cmp-footer-header .f-toolbar .toolbar--collapse-icon{font-family:FarrisIcons;margin:0 .375rem;font-size:.875rem;transition:transform .1s linear}.popover,.tooltip{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;text-shadow:none;text-transform:none;letter-spacing:normal;word-spacing:normal;line-break:auto;word-break:normal;word-wrap:break-word}.f-cmp-footer-accordion.f-state-collapse .f-cmp-footer-header{border-bottom:none;margin-bottom:0;padding-bottom:0}.f-tmpl-footer-same-gutter{margin:0 10rem 0 0}.f-page-header-el-mt,.f-page-header-el-my{margin-top:.8125rem}.f-page-header-el-mb,.f-page-header-el-my{margin-bottom:.8125rem}.f-cmp-footer-hasgap{position:relative}.f-cmp-footer-nogap::before{display:none!important}#page-header,.f-page-header,.f-pt-header{z-index:unset}.f-page-card #page-header,.f-page-card .f-page-header,.f-page-card .f-pt-header{z-index:105!important}.f-page-header{flex-shrink:0;background:var(--f-neutral-00);box-shadow:none}.f-page-header-el-mx{margin-left:.875rem;margin-right:.875rem}.f-page-header-base{padding:.75rem .875rem;min-height:2.875rem;display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:space-between}.f-page-header-base .f-title{display:inline-flex;align-items:center}.f-page-header-base .f-title .f-title-text{font-size:1.0625rem;line-height:1.625rem;color:var(--f-text-01);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin:0 .875rem 0 0}.f-page-header-base .f-title .f-title-icon{display:inline-flex;width:1.625rem;height:1.625rem;line-height:1.625rem;text-align:center;background:var(--f-ornament-02);border-radius:.25rem;color:var(--f-text-00);justify-content:center;align-items:center;flex-shrink:0;overflow:hidden;margin:0 .625rem 0 0}.f-page-header-base .f-title .f-title-icon img{display:block;width:1.625rem;height:1.625rem}.f-page-header-base .f-title .f-title-icon .f-icon::before{vertical-align:bottom}.f-page-header-base .f-title .f-title-subtitle{padding:0 0 0 .875rem;font-size:.8125rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-left:1px solid var(--f-neutral-08);margin:0 .875rem 0 0}.f-page-header-base .f-title .f-title-pagination,.f-page-header-base .f-title .f-title-status{margin:0 .875rem 0 0}.f-page-header-base .f-title .f-title-pagination span{width:1.25rem;height:1.25rem;margin:0 .375rem 0 0;color:var(--f-text-02);line-height:1.125rem;border-width:1px;border-style:solid;border-color:var(--f-neutral-08);border-radius:6px;background:var(--f-neutral-12);cursor:pointer}.f-page-header-base .f-title .f-title-pagination span.f-state-disabled{cursor:default;color:var(--f-text-07);border-color:var(--f-neutral-05);background:var(--f-neutral-09)}.f-page-header-base .f-title .f-title-pagination span:not(.f-state-disabled):hover{color:var(--f-theme-05);border-color:var(--f-theme-05);background:var(--f-neutral-12)}.f-page-header-base .f-title .f-title-pagination span:last-child{margin:0}.f-page-header-base .f-content{display:inline-flex;align-items:center;white-space:nowrap;flex-shrink:1;flex-grow:1;flex-basis:0}.f-page-header-base .f-toolbar{flex-shrink:0;display:inline-flex;align-items:center;justify-content:flex-end;color:var(--f-text-04);margin-left:auto}.f-text-orna-bill,.f-text-orna-dict,.f-text-orna-manage,.f-text-orna-param,.f-text-orna-query{color:var(--f-text-00)!important}.f-page-header-base .f-toolbar-viewchange{margin-left:.375rem}.page-item:first-child .page-link,.page-link{margin-left:0}.f-text-orna-manage{background:linear-gradient(135deg,#4190FF 0,#657CFF 100%)!important;box-shadow:0 3px 10px 0 rgba(var(--f-ornament-03-start),.3)}.f-text-orna-dict{background:linear-gradient(135deg,#4EC87A 0,#52D389 100%)!important;box-shadow:0 3px 10px 0 rgba(var(--f-ornament-05-start),.3)}.f-text-orna-bill{background:linear-gradient(135deg,#1FC8DC 0,#41D2BD 100%)!important;box-shadow:0 3px 10px 0 rgba(var(--f-ornament-02-start),.3)}.f-text-orna-query{background:linear-gradient(135deg,#FC8249 0,#FE9539 100%)!important;box-shadow:0 3px 10px 0 rgba(var(--f-ornament-01-start),.3)}.f-text-orna-param{background:linear-gradient(135deg,#8B82FF 0,#A082FF 100%)!important;box-shadow:0 3px 10px 0 rgba(var(--f-ornament-04-start),.3)}.page-link,.page-link:hover{background-color:var(--f-neutral-12)}.f-color-orna-manage{color:var(--f-ornament-03-start)!important}.f-color-orna-dict{color:var(--f-ornament-05-start)!important}.f-color-orna-bill{color:var(--f-ornament-02-start)!important}.f-color-orna-query{color:var(--f-ornament-01-start)!important}.f-color-orna-param{color:var(--f-ornament-04-start)!important}.pagination{display:flex;border-radius:6px}.page-link{position:relative;display:block;padding:.1875rem;line-height:1rem;color:var(--f-text-02);border:1px solid var(--f-neutral-08)}.page-item:first-child .page-link,.pagination-lg .page-item:first-child .page-link,.pagination-sm .page-item:first-child .page-link{border-top-left-radius:6px;border-bottom-left-radius:6px}.page-item:last-child .page-link,.pagination-lg .page-item:last-child .page-link,.pagination-sm .page-item:last-child .page-link{border-top-right-radius:6px;border-bottom-right-radius:6px}.page-link:hover{z-index:2;text-decoration:none}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 4px 2px rgba(99,136,255,.12)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item.active .page-link{z-index:1;color:var(--f-text-00);background:var(--f-theme-06)!important;border-color:var(--f-theme-05)}.page-item.disabled .page-link{color:var(--f-text-07);pointer-events:none;cursor:auto;background:var(--f-neutral-09);border-color:var(--f-neutral-05);box-shadow:none}.page-link,.query-solution .solution-action .icon-group .f-icon-remove,.switch small,.switch.checked small{box-shadow:0 2px 6px 0 rgba(var(--f-neutral-15),.06)}.pagination-lg .page-link{padding:.75rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-link{padding:.1875rem;font-size:.75rem;line-height:1.5}.ngx-pagination::after,.ngx-pagination::before{content:" ";display:table}.ngx-pagination::after{clear:both}.ngx-pagination li{-webkit-user-select:none;-moz-user-select:none;user-select:none;margin-right:.0625rem;border-radius:0;display:inline-block}.ngx-pagination a,.ngx-pagination button{color:var(--f-text-02);display:block;cursor:pointer}.ngx-pagination .current{cursor:default}.ngx-pagination .f-icon{vertical-align:baseline}.ngx-pagination .disabled{color:var(--f-neutral-09);cursor:default}.ngx-pagination .disabled:hover{background:0 0}.ngx-pagination .pagination-next a::after,.ngx-pagination .pagination-next.disabled::after,.ngx-pagination .pagination-previous a::before,.ngx-pagination .pagination-previous.disabled::before{display:inline-block;margin-right:.5rem}.ngx-pagination .small-screen,.pagination-container .page-item.ellipsis:hover>.page-link>.page-link-label,.pagination-container .page-item.ellipsis>.page-link>.f-icon{display:none}.ngx-pagination .show-for-sr{position:absolute!important;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}.pagination{font-size:.75rem;padding:.625rem}.page-link{border-radius:6px;min-width:calc(1rem + .375rem + 2px);height:calc(1rem + .375rem + 2px);text-align:center;overflow:hidden}.page-link .f-icon{vertical-align:top}.page-link:focus{color:var(--f-theme-02);border-color:var(--f-theme-02)}.page-link.disabled{color:var(--f-text-07);background:var(--f-neutral-09);border-color:var(--f-neutral-05);box-shadow:none}.page-link:hover{color:var(--f-theme-05);background:var(--f-neutral-12);border-color:var(--f-theme-05)}.page-link:active{color:var(--f-theme-01);background:var(--f-neutral-12);border-color:var(--f-theme-01)}.page-item{margin:0 3px}.pagination-lg .page-link{height:auto;width:auto}.page-item.current .page-link,.page-item.current:active .page-link,.page-item.current:hover .page-link{z-index:1;color:var(--f-text-00);background:var(--f-theme-06)!important;border-color:var(--f-theme-05);box-shadow:0 2px 6px 0 rgba(var(--f-neutral-15),.15)}.page-item .page-link .f-icon{vertical-align:baseline}.pagination .pg-pagelist{margin:0 12px;height:100%}.pagination .pg-pagelist .pg-pagelist-info{font-size:13px;color:var(--f-text-02);cursor:pointer;height:100%;display:inline-flex;align-items:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pagination .pg-pagelist .pg-pagelist-info:hover,.pagination .pg-pagelist.show .pg-pagelist-info{color:var(--f-theme-03)}.pagination .pg-pagelist .pg-pagelist-info .cur-pagesize{padding:0 4px;font-size:15px;line-height:20px;font-weight:600}.pagination .pg-pagelist .pg-pagelist-info .f-icon{font-size:12px;margin:0 0 0 8px;transition:transform .2s linear}.pagination .pg-pagelist .dropdown-menu{min-width:120px;margin-bottom:.25rem}.pagination .pg-pagelist .dropdown-menu .dropdown-item{padding-left:14px}.pagination .pagination-message{color:var(--f-text-02);font-size:13px;display:inline-flex;align-items:center;height:100%}.pagination .pagination-message .badge{font-size:13px}.pagination .pagination-message .pg-message-total{font-size:15px;font-weight:600;padding:0 4px;line-height:20px}.badge,.popover,.table thead th,.tooltip{font-weight:400}.farris-gotopagenumber{text-align:center;-moz-appearance:textfield;width:40px}.farris-gotopagenumber::-webkit-inner-spin-button,.farris-gotopagenumber::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.pagination-container .page-item.ellipsis>.page-link{background:0 0;border:none;box-shadow:none;line-height:8px;font-size:16px}.f-tooltip-default,.f-tooltip-info .f-tooltip-text,.popover,.popover-header,.tooltip-inner{background-color:rgba(var(--f-neutral-00-rgb),.9)}.pagination-container .page-item.ellipsis:hover>.page-link{line-height:20px}.badge-round-success,.pagination-container .page-item.ellipsis:hover>.page-link>.f-icon{display:inline-block!important}@media screen and (max-width:601px){.ngx-pagination.responsive .small-screen{display:inline-block}.ngx-pagination.responsive li:not(.small-screen):not(.pagination-previous):not(.pagination-next){display:none}}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;line-height:1.4286;text-align:left;text-align:start;text-decoration:none;white-space:normal;font-size:.75rem;background-clip:padding-box;border:1px solid var(--f-neutral-00);border-radius:4px;box-shadow:0 2px 8px 0 rgba(0,32,74,.15)}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 6px}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(var(--f-neutral-00-rgb),.4)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-top .arrow::after{bottom:1px;border-top-color:rgba(var(--f-neutral-00-rgb),.9)}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:6px 0}.bs-popover-auto[x-placement^=left],.bs-popover-left,.bs3.bs-popover-auto[x-placement^=left],.bs3.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::before{left:0;border-right-color:rgba(var(--f-neutral-00-rgb),.4)}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-right .arrow::after{left:1px;border-right-color:rgba(var(--f-neutral-00-rgb),.9)}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(var(--f-neutral-00-rgb),.4)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:rgba(var(--f-neutral-00-rgb),.9)}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid rgba(var(--f-neutral-00-rgb),.9)}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:6px 0}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::before{right:0;border-left-color:rgba(var(--f-neutral-00-rgb),.4)}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-left .arrow::after{right:1px;border-left-color:rgba(var(--f-neutral-00-rgb),.9)}.popover-header{line-height:1;padding:.5rem .75rem;margin-bottom:0;font-size:.8125rem;color:var(--f-text-01);border-bottom:1px solid rgba(var(--f-neutral-00-rgb),.9);border-top-left-radius:calc(6px - 1px);border-top-right-radius:calc(6px - 1px)}.bs3.popover-top,.bs3.popover.top{margin-bottom:10px}.popover-header:empty{display:none}.popover-body{max-width:17.25rem;padding:.5rem .75rem;color:var(--f-text-02)}.bs3.popover.top>.arrow{margin-left:-2px}.popover.bottom>.arrow{margin-left:-4px}.bs3.bs-popover-auto[x-placement^=left] .arrow,.bs3.bs-popover-auto[x-placement^=right] .arrow,.bs3.bs-popover-left .arrow,.bs3.bs-popover-right .arrow{margin:.3rem 0}.bs-popover-bottom-left .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-bottom-left .arrow::before{top:0;border-bottom-color:rgba(255,255,255,.4)!important}.bs-popover-bottom-left .arrow::after,.bs-popover-bottom-left .arrow::before{border-width:0 .5rem .5rem}.bs-popover-bottom-left .arrow::after{top:1px;border-bottom-color:#fff!important}.popover.popover-fitcontent .popover-body{max-width:initial;padding:initial}.popover .arrow-left .arrow{left:calc(50% - 10px)}.f-progress-step .f-progress-step-list{display:flex;flex-direction:row;align-items:center}.f-progress-step .step{display:inline-block}.f-progress-step .step .f-progressstep-row{display:flex;position:relative;padding-right:.4375rem;padding-bottom:.9375rem}.f-progress-step .step .f-progressstep-row .f-progress-step-content{display:inline-block}.f-progress-step .step .f-progressstep-row .f-progress-step-content .step-icon{display:inline-block;width:1.875rem;height:1.875rem;margin-right:.5rem;margin-left:.5rem;line-height:1.875rem;border-radius:100%;font-size:.75rem;text-align:center;vertical-align:middle}.f-progress-step .step .f-progressstep-row .f-progress-step-content .f-progress-step-title{display:inline-block;vertical-align:middle}.f-progress-step .step .f-progressstep-row .f-progress-step-content .f-progress-step-title .step-message,.f-progress-step .step .f-progressstep-row .f-progress-step-content .f-progress-step-title .step-name{margin-bottom:0}.f-progress-step .step .f-progressstep-row .f-progress-step-content .f-progress-step-title .step-name{font-size:.875rem;line-height:1.25rem;padding-right:.625rem}.f-progress-step .step .f-progressstep-row .f-progress-step-content .f-progress-step-title .step-name.step-name-success{opacity:.85}.f-progress-step .step .f-progressstep-row .f-progress-step-line{flex:1 1 auto;position:relative;display:inline-flex;min-width:3.75rem;vertical-align:middle}.f-progress-step .step .f-progressstep-row .f-progress-step-line::after{content:"";left:0;height:.125rem;overflow:hidden;position:absolute;right:.625rem;top:50%;margin-top:-.0625rem}.f-progress-step .step .f-progressstep-row .f-progress-step-line .triangle{position:absolute;right:0;top:50%;display:inline-block;width:.4375rem;height:.4375rem;margin-top:-.21875rem;transform:rotate(45deg)}.f-progress-step .f-progress-step-list-block .step{display:block}.f-progress-step .f-progress-step-list-block .step .f-progressstep-row{padding:0;flex-direction:column}.f-progress-step .f-progress-step-list-block .step .f-progressstep-row .f-progress-step-line{flex:1 1 auto;width:.625rem;min-width:.625rem;min-height:2.5rem;margin:.5rem 0 1.25rem 1.375rem}.f-progress-step .f-progress-step-list-block .step .f-progressstep-row .f-progress-step-line::after{content:"";border-top:0}.f-progress-step .f-progress-step-list-block .step .f-progressstep-row .f-progress-step-line .triangle{top:auto;left:-.3125rem;bottom:-.5rem;border-top:0}.f-progress-step .f-progress-step-list-block .step .f-progressstep-row .f-progress-step-line .f-progress-step-title .step-name{padding-right:.875rem}.f-progress-step .f-progress-step-horizontal-fill{display:flex;justify-content:space-between;flex-wrap:wrap}.f-progress-step .f-progress-step-horizontal-fill .step{flex:1 1 auto}.f-progress-step .f-progress-step-vertical-fill{display:flex;flex-direction:column;align-content:space-between}.f-progress-step .f-progress-step-vertical-fill .step{display:flex;flex:1 1 auto}.f-progress-step .f-progress-step-vertical-fill .step .f-progressstep-row{flex:1 1 auto;display:flex}.f-progress-step li.clickable{cursor:pointer}.f-progress-step li.click-disable{cursor:not-allowed}.f-progress-step .f-progress-step-empty{color:#000;opacity:.65;font-size:.875rem}.f-progress-step .f-progressstep-row-multi{display:flex;flex-direction:column;align-items:left}.f-progress-step .f-progressstep-row-multi .f-progressstep-multi-item-content{display:flex;flex-direction:row;align-items:center;cursor:pointer}.f-progress-step .f-progressstep-row-multi .f-step-multi-item{position:relative;padding-right:.4375rem;padding-bottom:.9375rem}.f-progress-step .f-progressstep-row-multi .f-step-multi-item:last-child{padding-bottom:0}.f-progress-step .f-progress-step-list-block .step .f-progressstep-row.f-progressstep-row-multi{flex-direction:row}.f-progress-step .f-progress-step-list-block .step .f-progressstep-row.f-progressstep-row-multi .f-step-multi-item{padding:0;flex-direction:column}.f-progress-step .f-progress-step-list-block .step .f-progressstep-row.f-progressstep-row-multi .f-step-multi-item .f-progress-step-line{display:block}.f-progress-step .step .f-progressstep-row .f-progress-step-content .step-icon{color:#fff;background:var(--f-neutral-02)}.f-progress-step .step .f-progressstep-row .f-progress-step-content .f-progress-step-title .step-name{color:#8C8C8C}.f-progress-step .step .f-progressstep-row .f-progress-step-content .f-progress-step-title .step-name.step-name-success{color:var(--f-text-03)}.f-progress-step .step .f-progressstep-row .f-progress-step-line::after{border-top:2px dotted rgba(0,0,0,.2)}.f-progress-step .step .f-progressstep-row .f-progress-step-line .triangle{border-top:1px solid rgba(0,0,0,.2);border-right:1px solid rgba(0,0,0,.2)}.f-progress-step .step .f-progressstep-row .f-progress-step-line.f-progress-step-line-success .triangle,.f-progress-step .step .f-progressstep-row .f-progress-step-line.f-progress-step-line-success::after{border-color:var(--f-theme-03)}.f-progress-step .step .f-progressstep-row.step-finish .f-progress-step-content .step-icon{color:#fff;background:linear-gradient(135deg,#529DFF 0,#559FFF 100%)}.f-progress-step .step .f-progressstep-row.step-finish:hover .f-progress-step-content .step-icon{background:var(--f-theme-04)}.f-progress-step .step .f-progressstep-row.step-finish:active .f-progress-step-content .step-icon{background:var(--f-theme-02)}.f-progress-step .step .f-progressstep-row.step-active .f-progress-step-content .step-icon{color:#fff;background:var(--f-theme-04)}.f-progress-step .step .f-progressstep-row.step-active:hover .f-progress-step-content .step-icon{background:linear-gradient(135deg,#529DFF 0,#559FFF 100%)}.f-progress-step .step .f-progressstep-row.step-active:active .f-progress-step-content .step-icon{background:var(--f-theme-02)}.f-progress-step .step .f-progressstep-row.step-error .f-progress-step-content .step-icon{background:#F46160}.f-progress-step .f-progress-step-list-block .step .f-progressstep-row .f-progress-step-line{border-left:2px dotted rgba(0,0,0,.2)}.f-progress-step .f-progress-step-list-block .step .f-progressstep-row .f-progress-step-line .triangle{border-bottom:1px solid rgba(0,0,0,.2)}.f-progress-step .f-progress-step-list-block .step .f-progressstep-row .f-progress-step-line.f-progress-step-line-success,.f-progress-step .f-progress-step-list-block .step .f-progressstep-row .f-progress-step-line.f-progress-step-line-success .triangle{border-color:var(--f-theme-05)}.f-progress-step .f-progress-step-empty{color:var(--f-text-05)}.f-progress-step .f-progressstep-row-multi .f-step-multi-item.f-step-multi-item-active .f-progress-step-title .step-name,.f-progress-step .f-progressstep-row-multi .f-step-multi-item.f-step-multi-item-finish .f-progress-step-title .step-name{color:var(--f-text-03)!important}.f-progress-step .f-progressstep-row-multi .f-step-multi-item.f-step-multi-item-active .step-icon{background:var(--f-theme-04)}.f-progress-step .f-progressstep-row-multi .f-step-multi-item.f-step-multi-item-finish .step-icon,.f-progress-step .f-progressstep-row-multi .f-step-multi-item:hover.f-step-multi-item-active .step-icon{background:linear-gradient(135deg,#529DFF 0,#559FFF 100%)}.f-progress-step .f-progressstep-row-multi .f-step-multi-item:hover.f-step-multi-item-finish .step-icon{background:var(--f-theme-04)}.f-progress{display:inline-block;font-size:.875rem;color:rgba(0,0,0,.65)}.f-progress.f-progress-line{position:relative;width:100%}.f-progress.f-progress-line .f-progress-text .f-progress-text-icon{font-size:1.25rem}.f-progress .f-progress-outer{display:inline-block;width:100%}.f-progress .f-progress-inner{position:relative;display:inline-block;width:100%;overflow:hidden;vertical-align:middle;background-color:#efefef;border-radius:100px}.f-progress .f-progress-bg,.f-progress .f-progress-success-bg{position:relative;border-radius:100px;transition:all .4s cubic-bezier(.08,.82,.17,1) 0s}.f-progress .f-progress-success-bg{position:absolute;top:0;left:0}.f-progress .f-progress-text{display:inline-block;width:1.75rem;margin-left:.5rem;color:rgba(0,0,0,.65);font-size:1em;line-height:1;white-space:nowrap;text-align:left;vertical-align:middle;word-break:normal}.f-progress-status-active .f-progress-bg::before{position:absolute;top:0;right:0;bottom:0;left:0;background:#fff;border-radius:.625rem;opacity:0;animation:f-progress-active 2.4s ease-in-out infinite;content:""}.condition-with-line.farris-form-controls-inline .input-group,.query-solution .farris-panel{border:none}.f-progress-show-info .f-progress-outer{padding-right:48px;margin-right:-48px}.f-progress.f-progress-circle .f-progress-inner{position:relative;line-height:1;background-color:transparent}.f-progress.f-progress-circle .f-progress-text{position:absolute;top:50%;left:50%;width:100%;margin:0;padding:0;color:rgba(0,0,0,.65);line-height:1;white-space:normal;text-align:center;transform:translate(-50%,-50%)}.f-progress.f-progress-circle .f-progress-text .f-progress-text-icon{font-size:1.3em}@keyframes f-progress-active{0%{width:0;opacity:.1}20%{width:0;opacity:.5}100%{width:100%;opacity:0}}.f-progress .f-progress-bg{background:var(--f-theme-04)}.f-progress .f-progress-success-bg,.f-progress-status-success .f-progress-bg{background:var(--f-semantic-success-01)}.f-progress-status-error .f-progress-bg{background:var(--f-semantic-danger-01)}.f-progress.f-progress-circle .f-progress-text .f-progress-text-icon.f-icon-checkmark{color:var(--f-semantic-success-01)}.f-progress.f-progress-circle .f-progress-text .f-progress-text-icon.f-icon-x{color:var(--f-semantic-danger-01)}.f-progress .f-progress-inner:not(.f-progress-circle-gradient) .f-progress-circle-path{stroke:var(--f-semantic-info-01)}.f-progress-status-success .f-progress-inner:not(.f-progress-circle-gradient) .f-progress-circle-path{stroke:var(--f-semantic-success-01)}.f-progress-status-error .f-progress-inner:not(.f-progress-circle-gradient) .f-progress-circle-path{stroke:var(--f-semantic-danger-01)}.farris-star-rating{cursor:pointer;display:flex;position:relative}.farris-star-rating .default-light-color{color:#FBDB10}.farris-star-rating .default-dark-color{color:#E8E8E8}.star-dark-area span,.star-light-area span{box-sizing:content-box;padding-right:4px}.farris-star-rating .f-star-sm{font-size:14px}.farris-star-rating .f-star-md{font-size:16px}.farris-star-rating .f-star-lg{font-size:18px}.farris-star-rating .f-star-exlarge{font-size:24px}.farris-star-rating .star-dark-area{overflow:hidden;display:flex;flex-wrap:nowrap}.farris-star-rating .f-utils-fill{padding-left:2px;font-size:14px}.farris-star-rating .font-small{line-height:14px}.farris-star-rating .font-middle{line-height:16px}.farris-star-rating .font-large{line-height:18px}.farris-star-rating .font-exlarge{line-height:24px}.farris-star-rating .star-light-area{position:absolute;left:0;top:0;z-index:2;width:0%;overflow:hidden;display:flex;flex-wrap:nowrap}.farris-star-rating .star-dark-area span,.farris-star-rating .star-light-area span{flex-shrink:0}.f-toolbar{flex-shrink:0;display:inline-flex;align-items:center;justify-content:flex-end}.f-toolbar .f-btn-separator{display:inline-block;width:1px;background-color:#c2cbd1;height:1em;margin:0 .5rem}.f-response-toolbar{display:block}.query-solution .solution-header{height:auto!important;margin-bottom:10px!important;display:flex;align-items:center;justify-content:space-between}.query-solution .solution-header-title{padding:.25rem 6px .25rem 12px;border-radius:6px;display:flex;flex-direction:row;align-items:center;color:var(--f-theme-03);font-size:.8125rem;vertical-align:middle;cursor:pointer}.query-solution .solution-header-title .header-title--change{margin:0 4px}.query-solution .solution-header-title .solution-header-title-text{margin-right:6px;overflow:hidden;height:22px}.query-solution .solution-header-title .f-accordion-expand{color:var(--f-theme-03)}.query-solution .solution-header-title .f-icon{font-size:16px;margin:0;width:auto;height:auto}.query-solution .solution-action{display:flex;align-items:center;flex-shrink:0}.query-solution .solution-action .dropdown .btn{border:0}.query-solution .solution-action .icon-group{display:flex!important;align-items:center}.query-solution .solution-action .icon-group .f-icon-remove{color:var(--f-text-02);background:var(--f-neutral-12);border:1px solid var(--f-neutral-08);border-radius:6px;width:calc(1.375rem + .125rem);height:calc(1.375rem + .125rem);text-align:center;line-height:20px;display:block}.query-solution .solution-action .icon-group .f-icon-remove:hover{border-color:var(--f-theme-05);color:var(--f-theme-05);background:var(--f-neutral-12)}.query-solution .solution-action .icon-group .f-icon-home-setup,.query-solution .solution-action .icon-group .f-icon-packup{font-size:.875rem}.query-solution .solution-action .icon-group .icon-group-packup{margin-right:0;margin-left:4px}.query-solution .solution-action span{vertical-align:inherit}.query-solution .solution-action .divide{color:var(--f-neutral-13);position:relative;margin:0 .3125rem}.query-solution .solution-action .divide::after{position:absolute;content:"";height:12px;width:1px;background-color:var(--f-neutral-13);left:0;top:50%;margin-top:-6px}.query-solution .solution-header-title-menu{margin-top:8px}.query-solution .solution-header-title-menu-inner{position:relative;width:18.9375rem}.query-solution .solution-header-title-menu-inner .menu-item--change{margin:0 4px 0 0}.query-solution .solution-header-title-menu-inner .solution-header-title-menu-arrow{position:absolute;content:"";display:block;left:1.5rem;top:-.5rem;width:8.49px;height:8.49px;background:0 0;border-style:solid;border-width:4.24px;box-shadow:-2px -2px 5px rgba(0,0,0,.08);transform:translateX(-50%) rotate(45deg);border-color:#fff transparent transparent #fff}.query-solution .solution-header-title-menu-inner .solution-header-dropdown-item{cursor:pointer;display:flex;flex-direction:row;align-items:center}.query-solution .solution-header-title-menu-inner .solution-header-dropdown-item.solution-header-dropdown-item-active{background:var(--f-neutral-10)}.query-solution .solution-header-title-menu-inner .solution-header-dropdown-item .solution-header-dropdown-item-title{flex-shrink:1;flex-grow:1;flex-basis:0;padding-right:.25rem;color:var(--f-text-02);font-size:.875rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.query-solution .solution-header-title-menu-inner .solution-header-dropdown-item .solution-header-dropdown-item-tip{flex-shrink:0;height:1.125rem;min-width:2.5rem;padding:0 4px;line-height:1.125rem;font-size:.75rem;background:var(--f-semantic-success-01);color:#fff;border-radius:2px;text-align:center}.query-solution .solution-header-title-menu-inner .solution-header-dropdown-item-btns{display:flex;flex-direction:row;align-items:center;justify-content:flex-end;height:2.25rem;padding:0 .875rem;line-height:2.25rem;border-top:1px solid rgba(0,0,0,.07)}.query-solution .solution-header-title-menu-inner .solution-header-dropdown-item-btns .dropdown-item-btn{margin-left:.5rem;color:var(--f-theme-03);cursor:pointer}.query-solution .summary-condition{flex-shrink:0;flex-grow:1;flex-basis:0;overflow:hidden;margin:0 12px 0 0;display:flex}.query-solution .summary-condition--item .summary-condition--label,.summary-list--tips .summary-condition--label{margin:0 2px 0 0}.query-solution .summary-list{overflow:hidden}.query-solution .summary-condition-wrapper{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;background:var(--f-aid-02);border:1px solid var(--f-aid-01);border-radius:3px;font-size:13px;color:#2D2F33;line-height:24px;height:26px;box-shadow:0 1px 4px 0 rgba(0,28,65,.08)}.query-solution .summary-condition--item{padding:0 12px;vertical-align:top}.query-solution .summary-condition--item .summary-condition--text{margin:0 0 0 8px}.query-solution .summary-condition--spliter{width:1px;height:14px;background:#DDE1EB;display:inline-block;margin:5px 0 0}.query-solution{padding:16px;background:#fff}.query-solution .solution-header .dropdown-item{width:100%}.query-solution .solution-header-title{background:unset}.query-solution .solution-header .dropdown-menu{width:300px;max-height:unset}.query-solution .solution-header-title-btns{border-top:1px solid rgba(0,0,0,.07);text-align:right;width:100%;color:#2A87FF;padding:8px 0}.solutionmanager-inner{padding:0 14px;flex:1;height:100%}.solutionmanager-inner .solutionmanager-grid-delete{font-size:.875rem;color:var(--f-theme-03)}.summary-list--tips .summary-condition--text{margin:0 0 0 8px}.summary-list--tips .summary-condition--gutter{margin:0 10px 0 4px}.summary-list--tips .tooltip{margin-top:-6px}.summary-list--tips .tooltip-inner{text-align:left;background:rgba(var(--f-neutral-00-rgb),.9);color:var(--f-text-02);font-size:13px;line-height:24px}.summary-list--tips .arrow{left:35px!important}.summary-list--tips .arrow::before{border-width:0 .3rem .3rem;border-bottom-color:rgba(var(--f-neutral-00-rgb),.4)}.farris-form.condition-div{margin-right:-5px;margin-left:-5px}.farris-form.condition-div .qlabel-gutter{display:none}.farris-form.condition-div>[class*=col-]{padding-left:5px!important;padding-right:5px!important}.condition-with-line.farris-form-controls-inline .qlabel-gutter{display:inline;margin-left:2px}.condition-with-line.farris-form-controls-inline .qradio-group .qlabel-gutter{margin-right:8px}.condition-with-line.farris-form-controls-inline .farris-input-wrap{flex-basis:0}.condition-with-line.farris-form-controls-inline .common-group{border:1px solid #D8DCE6;border-radius:3px;padding-left:8px;padding-right:1px}.condition-with-line.farris-form-controls-inline .common-group .col-form-label{font-size:13px;color:#6A6F79;width:auto;margin-right:0;flex-grow:0;flex-shrink:1;flex-basis:auto;max-width:220px}.condition-with-line.farris-form-controls-inline .common-group .f-solution-radio-group{flex-shrink:1;flex-grow:1;flex-basis:0}.condition-with-line.farris-form-controls-inline .common-group .input-group,.condition-with-line.farris-form-controls-inline .common-group .input-group.f-state-focus{outline:0;box-shadow:none;border:none}.condition-with-line.farris-form-controls-inline .common-group:not(.q-state-readonly):hover{border-color:var(--f-theme-08);box-shadow:0 0 0,0 0 4px 2px rgba(99,136,255,.12)}.condition-with-line.farris-form-controls-inline .farris-group-multi-label .farris-group-wrap .col-form-label .farris-label-text{text-align:left}.condition-with-fixed.farris-form-controls-inline .datepicker-range-group .farris-input-wrap,.condition-with-fixed.farris-form-controls-inline .number-range-group .farris-input-wrap{min-width:120px}.condition-with-line.f-form-label-xl .farris-group-wrap .col-form-label{max-width:153px}.query-solution .condition-div{max-height:204px;overflow-y:auto}.querycondition-advanced .add-condition-btn .f-icon{background-color:var(--f-aid-03)}.querycondition-advanced .add-condition-btn{color:var(--f-theme-03)}.f-search-box-panel{height:100%;z-index:9998;position:absolute;overflow:auto;background:var(--f-neutral-20);box-shadow:0 2px 20px 0 rgba(3,18,51,.12);border-radius:3px}.f-search-field-container .switch.switch-small{min-width:1.88rem;height:.85rem}.f-search-field-container .switch.switch-small small{top:0}.multi-date-display:empty:before{color:var(--f-text-09)}.f-cmp-inputgroup .f-transfer-date .search-tag-item,.f-search-box .search-tag-item{cursor:default;padding:0 20px 0 5px!important;background:var(--f-aid-04)!important;border:1px solid var(--f-aid-05);position:relative;margin-right:3px!important;margin-top:1px!important;margin-bottom:0!important;line-height:19px;height:22px;float:left;max-width:200px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;display:inline!important;border-radius:6px}.f-cmp-inputgroup .f-transfer-date .search-tag-item .f-icon,.f-search-box .search-tag-item .f-icon{cursor:pointer;position:absolute;right:2px;font-size:12px;top:7px}.f-cmp-inputgroup .f-transfer-date .search-tag-item.search-field,.f-search-box .search-tag-item.search-field{background:0 0;border:0;cursor:pointer;height:26px;line-height:24px}.f-cmp-inputgroup .f-transfer-date .search-tag-item.search-field:hover,.f-search-box .search-tag-item.search-field:hover{color:var(--f-theme-03)}.f-cmp-inputgroup .f-transfer-date .search-tag-item.search-field.selected,.f-search-box .search-tag-item.search-field.selected{background:rgba(207,237,255,.35);border-color:var(--f-aid-05)}.f-cmp-inputgroup .f-transfer-date .search-tag-item.search-field.has-filter,.f-search-box .search-tag-item.search-field.has-filter{background-color:#f2f8ff;border:1px solid #e4f0ff}.f-cmp-inputgroup .f-transfer-date .inputbox,.f-search-box .inputbox{flex:1;position:relative;min-width:50px;height:24px;margin:0;padding:0;float:left;overflow:hidden}.f-cmp-inputgroup .f-transfer-date.f-search-fields .multi--item.search-tag-item,.f-cmp-inputgroup .f-transfer-date.f-search-shadow-fields .multi--item.search-tag-item,.f-search-box.f-search-fields .multi--item.search-tag-item,.f-search-box.f-search-shadow-fields .multi--item.search-tag-item{margin-bottom:4px!important}.f-cmp-inputgroup .f-transfer-date .search-input,.f-search-box .search-input{position:absolute;top:0;align-items:center;display:flex;left:-2px;width:100%}.f-cmp-inputgroup .f-transfer-date.f-search-shadow-fields.active,.f-search-box.f-search-shadow-fields.active{border-color:var(--f-theme-05)}.f-cmp-inputgroup .f-transfer-date.f-search-fields .more,.f-search-box.f-search-fields .more{padding-right:20px}.f-cmp-inputgroup .f-transfer-date.f-search-fields .more::after,.f-search-box.f-search-fields .more::after{content:"...";position:absolute;right:10px;top:0;cursor:pointer}.f-cmp-inputgroup .f-transfer-date.f-state-disabled .search-tag-item{background:var(--f-neutral-09);border-color:var(--f-neutral-09);color:var(--f-text-02)}.f-cmp-inputgroup .f-transfer-date.f-state-disabled .multi--more-text{color:var(--f-text-09)}.search-tip-info{height:32px;line-height:32px;border-bottom:1px solid var(--f-neutral-04);font-size:12px;color:#848C9A;margin-bottom:5px;padding:0 7px;align-items:center;justify-content:space-between}.search-tip-info .f-icon-close,.search-tip-info .f-icon-group-delete::before{cursor:pointer;top:2px;position:relative;right:-5px;font-size:12px}.search-tip-info .f-icon-close:hover,.search-tip-info .f-icon-group-delete:hover::before{color:red}.lookup-filter-bar .clear-search-fields{width:28px;height:28px;display:flex;align-items:center;justify-content:center;border:1px solid var(--f-neutral-04);margin-left:3px;border-radius:3px;cursor:pointer}.lookup-filter-bar .clear-search-fields:hover{color:var(--f-aid-10);border-color:var(--f-theme-05)}.search-box-container{background-color:#fff;background-clip:padding-box}.search-box-container-title{color:#878d99;text-align:left;margin-bottom:10px}.f-section{display:flex;flex-direction:column;position:relative;padding:.625rem .875rem .75rem;margin:0;border-radius:8px;background:#fff}.f-section.f-section-fill{flex-shrink:1;flex-grow:1;flex-basis:0;overflow:hidden}.f-section.f-section-fill>.f-section-content{flex-shrink:1;flex-grow:1;flex-basis:0;display:flex;flex-direction:column}.f-section.f-section-content-fill{display:flex;flex-direction:column}.f-section.f-section-content-fill .f-section-content{flex-shrink:1;flex-grow:1;flex-basis:0;display:flex;flex-direction:column}.f-section-header{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:space-between;padding:0 .625rem 0 0;margin:0 0 .5rem}.f-section-header .f-title::before .f-content{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.f-section-header .f-toolbar{flex-shrink:0;display:inline-flex;align-items:center;justify-content:flex-end;color:var(--f-text-04);margin-left:auto}.f-section-header .f-btn-collapse-expand span,.f-section.f-state-collapse>.f-section-extend{display:none}.f-section-header .f-btn-collapse-expand{color:var(--f-theme-03)}.f-section-header .f-btn-collapse-expand::after{width:1rem;height:1rem;font-size:.875rem;line-height:1rem;margin-left:0;color:var(--f-text-07);background:var(--f-neutral-07);border-radius:10px}.f-section-header .f-btn-collapse-expand:hover::after{background:var(--f-neutral-05)}.f-section-header .f-max-accordion .f-icon-maximize,.f-section-header .f-max-accordion .f-icon-minimize{color:var(--f-text-03);font-size:14px;cursor:pointer;margin-left:.5rem;vertical-align:middle}.f-section-header .f-max-accordion .f-icon-maximize:hover,.f-section-header .f-max-accordion .f-icon-minimize:hover{color:var(--f-theme-05)}.f-section-header .f-max-accordion .f-icon-maximize:active,.f-section-header .f-max-accordion .f-icon-minimize:active{color:var(--f-theme-01)}.f-section-extend{margin:0 0 .75rem}.f-page-main .f-section-like-query.f-section,.f-page-main .f-section-query.f-section,.switch{margin:0}.f-section-accordion.f-state-collapse>.f-section-header{margin-bottom:0}.f-section-accordion.f-state-collapse>.f-section-content{height:0;overflow:hidden;flex:0 1 0}.f-section-maximize{position:fixed;top:0;bottom:0;left:0;right:0;z-index:1031;background:var(--f-neutral-19)}.f-section-maximize>.f-section-content{flex-shrink:1;flex-grow:1;flex-basis:0;display:flex;flex-direction:column;overflow-y:auto;overflow-x:hidden}.f-section-maximize>.f-section-content>.f-struct-is-subgrid{flex-shrink:1;flex-grow:1;flex-basis:0;display:flex;flex-direction:column}.f-section-maximize>.f-section-content>.f-struct-is-subgrid .f-grid-is-sub{flex-shrink:1;flex-grow:1;flex-basis:0;height:auto}.f-section-maximize .f-tabs-content-fill .f-struct-is-subgrid{flex-shrink:1;flex-grow:1;flex-basis:0;display:flex;flex-direction:column}.f-section-maximize .f-tabs-content-fill .f-grid-is-sub{flex-shrink:1;flex-grow:1;flex-basis:0;height:auto}.f-section-form.f-section-custom-accordion.f-state-collapse .f-form-layout>:not(.f-state-visible),.f-section-form.f-section-custom-accordion.f-state-collapse .f-section-formgroup-inputs>:not(.f-state-visible),.f-section-form.f-section-custom-accordion.f-state-collapse .f-section-formgroup.f-state-visible>:not(.f-state-visible){display:none}.f-section-form.f-section-custom-accordion.f-state-collapse .f-section-formgroup-inputs.f-state-visible-all>*{display:initial}.f-section-nogap::before,.f-section-nogutter::before{display:none!important}.f-section-tabs{padding:0 .875rem 1rem}.f-section-treegrid.f-section-in-nav{flex-shrink:1;flex-grow:1;flex-basis:0}.f-section-treegrid.f-section-in-nav>.f-section-content{flex-shrink:1;flex-grow:1;flex-basis:0;display:flex;flex-direction:column}.f-section-treegrid.f-section-in-nav>.f-section-content .f-componet-treetable{flex-shrink:1;flex-grow:1;flex-basis:0}.f-section--header-manage .f-section-header .f-title::before{background:linear-gradient(135deg,#4190FF 0,#657CFF 100%)!important}.f-section--header-dict .f-section-header .f-title::before{background:linear-gradient(135deg,#4EC87A 0,#52D389 100%)!important}.f-section--header-bill .f-section-header .f-title::before{background:linear-gradient(135deg,#1FC8DC 0,#41D2BD 100%)!important}.f-section--header-query .f-section-header .f-title::before{background:linear-gradient(135deg,#FC8249 0,#FE9539 100%)!important}.f-section--header-param .f-section-header .f-title::before{background:linear-gradient(135deg,#8B82FF 0,#A082FF 100%)!important}.f-title-noline{padding-left:0}.f-title-noline::before{display:none}.f-section .f-section-content--toolbar{padding:0 0 0 .75rem;margin-top:.40625rem;margin-bottom:.40625rem}.f-section .f-section-header--toolbar{overflow:hidden;flex:1;margin-left:.875rem!important}.f-splitter{flex-shrink:1;flex-grow:1;flex-basis:0;display:flex;flex-direction:row;flex-wrap:nowrap;overflow:hidden;position:relative}.f-splitter-pane{position:relative;padding:0}.f-splitter-pane.f-splitter-pane-main{flex-shrink:1;flex-grow:1;flex-basis:0;overflow:auto;display:flex}.f-splitter-pane>.f-splitter-resize-bar{position:absolute;font-size:.1px;display:block;touch-action:none}.f-splitter-pane>.f-splitter-resize-bar:hover{background:rgba(42,135,255,.07)}.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-e{cursor:e-resize;width:.4375rem;right:-.3125rem;height:100%;top:0}.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-w{cursor:w-resize;width:.4375rem;left:-.3125rem;height:100%;top:0}.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-s{cursor:s-resize;height:.4375rem;bottom:-.3125rem;width:100%;left:0}.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-n{cursor:n-resize;height:.4375rem;top:-.3125rem;width:100%;left:0}.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-e::before,.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-n::before,.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-s::before,.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-w::before{content:"";position:absolute;background:#E9ECF3}.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-e::after,.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-n::after,.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-s::after,.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-w::after{content:"";position:absolute;top:50%;left:50%;width:6px;height:60px;margin:-30px 0 0 -3px;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgd2lkdGg9IjdweCIgaGVpZ2h0PSI2MHB4IiB2aWV3Qm94PSIwIDAgNyA2MCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDY0ICg5MzUzNykgLSBodHRwczovL3NrZXRjaC5jb20gLS0+DQogICAgPHRpdGxlPue8lue7hCAyMjwvdGl0bGU+DQogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+DQogICAgPGcgaWQ9IuaWsOeJiCIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+DQogICAgICAgIDxnIGlkPSI2LuW3puagkeWPs+S4u+S7jiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQ1NS4wMDAwMDAsIC00MTguMDAwMDAwKSI+DQogICAgICAgICAgICA8ZyBpZD0i57yW57uELTIyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0NTUuNTAwMDAwLCA0MTguMDAwMDAwKSI+DQogICAgICAgICAgICAgICAgPHBhdGggZD0iTTMsMCBDNSwxLjc3NTIwMjYgNiwzLjE3ODcxMTM4IDYsNC4yMTA1MjYzMiBDNiwxMi4xMDQzMjc2IDYsNTMuNzk4NDE1MyA2LDU1Ljc4OTQ3MzcgQzYsNTYuNzEzMzQ4NiA1LDU4LjExNjg1NzQgMyw2MCBDMSw1OC4xMTAyOTA0IDAsNTYuNzA2NzgxNiAwLDU1Ljc4OTQ3MzcgQzAsMzMuMDcyNzA3MSAwLDE1Ljg5NDM0MTIgMCw0LjIxMDUyNjMyIEMwLDMuMzUxODIxNjQgMSwxLjk0ODMxMjg3IDMsMCBaIiBpZD0i55+p5b2iIiBmaWxsPSIjRTlFQ0YzIj48L3BhdGg+DQogICAgICAgICAgICAgICAgPHBhdGggZD0iTTMsNDUgQzMuNTUyMjg0NzUsNDUgNCw0NS40NDc3MTUzIDQsNDYgQzQsNDYuNTUyMjg0NyAzLjU1MjI4NDc1LDQ3IDMsNDcgQzIuNDQ3NzE1MjUsNDcgMiw0Ni41NTIyODQ3IDIsNDYgQzIsNDUuNDQ3NzE1MyAyLjQ0NzcxNTI1LDQ1IDMsNDUgWiBNMyw0MSBDMy41NTIyODQ3NSw0MSA0LDQxLjQ0NzcxNTMgNCw0MiBDNCw0Mi41NTIyODQ3IDMuNTUyMjg0NzUsNDMgMyw0MyBDMi40NDc3MTUyNSw0MyAyLDQyLjU1MjI4NDcgMiw0MiBDMiw0MS40NDc3MTUzIDIuNDQ3NzE1MjUsNDEgMyw0MSBaIE0zLDM3IEMzLjU1MjI4NDc1LDM3IDQsMzcuNDQ3NzE1MyA0LDM4IEM0LDM4LjU1MjI4NDcgMy41NTIyODQ3NSwzOSAzLDM5IEMyLjQ0NzcxNTI1LDM5IDIsMzguNTUyMjg0NyAyLDM4IEMyLDM3LjQ0NzcxNTMgMi40NDc3MTUyNSwzNyAzLDM3IFogTTMsMzMgQzMuNTUyMjg0NzUsMzMgNCwzMy40NDc3MTUzIDQsMzQgQzQsMzQuNTUyMjg0NyAzLjU1MjI4NDc1LDM1IDMsMzUgQzIuNDQ3NzE1MjUsMzUgMiwzNC41NTIyODQ3IDIsMzQgQzIsMzMuNDQ3NzE1MyAyLjQ0NzcxNTI1LDMzIDMsMzMgWiBNMywyOSBDMy41NTIyODQ3NSwyOSA0LDI5LjQ0NzcxNTMgNCwzMCBDNCwzMC41NTIyODQ3IDMuNTUyMjg0NzUsMzEgMywzMSBDMi40NDc3MTUyNSwzMSAyLDMwLjU1MjI4NDcgMiwzMCBDMiwyOS40NDc3MTUzIDIuNDQ3NzE1MjUsMjkgMywyOSBaIE0zLDI1IEMzLjU1MjI4NDc1LDI1IDQsMjUuNDQ3NzE1MyA0LDI2IEM0LDI2LjU1MjI4NDcgMy41NTIyODQ3NSwyNyAzLDI3IEMyLjQ0NzcxNTI1LDI3IDIsMjYuNTUyMjg0NyAyLDI2IEMyLDI1LjQ0NzcxNTMgMi40NDc3MTUyNSwyNSAzLDI1IFogTTMsMjEgQzMuNTUyMjg0NzUsMjEgNCwyMS40NDc3MTUzIDQsMjIgQzQsMjIuNTUyMjg0NyAzLjU1MjI4NDc1LDIzIDMsMjMgQzIuNDQ3NzE1MjUsMjMgMiwyMi41NTIyODQ3IDIsMjIgQzIsMjEuNDQ3NzE1MyAyLjQ0NzcxNTI1LDIxIDMsMjEgWiBNMywxNyBDMy41NTIyODQ3NSwxNyA0LDE3LjQ0NzcxNTMgNCwxOCBDNCwxOC41NTIyODQ3IDMuNTUyMjg0NzUsMTkgMywxOSBDMi40NDc3MTUyNSwxOSAyLDE4LjU1MjI4NDcgMiwxOCBDMiwxNy40NDc3MTUzIDIuNDQ3NzE1MjUsMTcgMywxNyBaIE0zLDEzIEMzLjU1MjI4NDc1LDEzIDQsMTMuNDQ3NzE1MyA0LDE0IEM0LDE0LjU1MjI4NDcgMy41NTIyODQ3NSwxNSAzLDE1IEMyLjQ0NzcxNTI1LDE1IDIsMTQuNTUyMjg0NyAyLDE0IEMyLDEzLjQ0NzcxNTMgMi40NDc3MTUyNSwxMyAzLDEzIFoiIGlkPSLlvaLnirbnu5PlkIgiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4NCiAgICAgICAgICAgIDwvZz4NCiAgICAgICAgPC9nPg0KICAgIDwvZz4NCjwvc3ZnPg==);background-repeat:no-repeat;background-size:cover;background-position:center center}.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-e:hover,.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-n:hover,.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-s:hover,.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-w:hover{background:0 0}.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-e:hover::before,.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-n:hover::before,.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-s:hover::before,.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-w:hover::before{background-image:linear-gradient(214deg,#3F65FF 0,#4D9AFF 100%);box-shadow:0 2px 5px 0 rgba(42,135,255,.2)}.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-e:hover::after,.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-n:hover::after,.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-s:hover::after,.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-w:hover::after{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgd2lkdGg9IjdweCIgaGVpZ2h0PSI2MHB4IiB2aWV3Qm94PSIwIDAgNyA2MCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4NCiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDY0ICg5MzUzNykgLSBodHRwczovL3NrZXRjaC5jb20gLS0+DQogICAgPHRpdGxlPue8lue7hCAyMjwvdGl0bGU+DQogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+DQogICAgPGRlZnM+DQogICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT0iNTAuMzcxODk3MSUiIHkxPSIwJSIgeDI9IjQ5LjY4MjQwNDUlIiB5Mj0iMTAwJSIgaWQ9ImxpbmVhckdyYWRpZW50LTEiPg0KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzNGNjVGRiIgb2Zmc2V0PSIwJSI+PC9zdG9wPg0KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzREOUFGRiIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+DQogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+DQogICAgPC9kZWZzPg0KICAgIDxnIGlkPSLmlrDniYgiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPg0KICAgICAgICA8ZyBpZD0iNi7lt6bmoJHlj7PkuLvku47lpIfku70tMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQ1NS4wMDAwMDAsIC00MTguMDAwMDAwKSI+DQogICAgICAgICAgICA8ZyBpZD0i57yW57uELTIyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0NTUuNTAwMDAwLCA0MTguMDAwMDAwKSI+DQogICAgICAgICAgICAgICAgPHBhdGggZD0iTTMsMCBDNSwxLjc3NTIwMjYgNiwzLjE3ODcxMTM4IDYsNC4yMTA1MjYzMiBDNiwxMi4xMDQzMjc2IDYsNTMuNzk4NDE1MyA2LDU1Ljc4OTQ3MzcgQzYsNTYuNzEzMzQ4NiA1LDU4LjExNjg1NzQgMyw2MCBDMSw1OC4xMTAyOTA0IDAsNTYuNzA2NzgxNiAwLDU1Ljc4OTQ3MzcgQzAsMzMuMDcyNzA3MSAwLDE1Ljg5NDM0MTIgMCw0LjIxMDUyNjMyIEMwLDMuMzUxODIxNjQgMSwxLjk0ODMxMjg3IDMsMCBaIiBpZD0i55+p5b2iIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTEpIj48L3BhdGg+DQogICAgICAgICAgICAgICAgPHBhdGggZD0iTTMsNDUgQzMuNTUyMjg0NzUsNDUgNCw0NS40NDc3MTUzIDQsNDYgQzQsNDYuNTUyMjg0NyAzLjU1MjI4NDc1LDQ3IDMsNDcgQzIuNDQ3NzE1MjUsNDcgMiw0Ni41NTIyODQ3IDIsNDYgQzIsNDUuNDQ3NzE1MyAyLjQ0NzcxNTI1LDQ1IDMsNDUgWiBNMyw0MSBDMy41NTIyODQ3NSw0MSA0LDQxLjQ0NzcxNTMgNCw0MiBDNCw0Mi41NTIyODQ3IDMuNTUyMjg0NzUsNDMgMyw0MyBDMi40NDc3MTUyNSw0MyAyLDQyLjU1MjI4NDcgMiw0MiBDMiw0MS40NDc3MTUzIDIuNDQ3NzE1MjUsNDEgMyw0MSBaIE0zLDM3IEMzLjU1MjI4NDc1LDM3IDQsMzcuNDQ3NzE1MyA0LDM4IEM0LDM4LjU1MjI4NDcgMy41NTIyODQ3NSwzOSAzLDM5IEMyLjQ0NzcxNTI1LDM5IDIsMzguNTUyMjg0NyAyLDM4IEMyLDM3LjQ0NzcxNTMgMi40NDc3MTUyNSwzNyAzLDM3IFogTTMsMzMgQzMuNTUyMjg0NzUsMzMgNCwzMy40NDc3MTUzIDQsMzQgQzQsMzQuNTUyMjg0NyAzLjU1MjI4NDc1LDM1IDMsMzUgQzIuNDQ3NzE1MjUsMzUgMiwzNC41NTIyODQ3IDIsMzQgQzIsMzMuNDQ3NzE1MyAyLjQ0NzcxNTI1LDMzIDMsMzMgWiBNMywyOSBDMy41NTIyODQ3NSwyOSA0LDI5LjQ0NzcxNTMgNCwzMCBDNCwzMC41NTIyODQ3IDMuNTUyMjg0NzUsMzEgMywzMSBDMi40NDc3MTUyNSwzMSAyLDMwLjU1MjI4NDcgMiwzMCBDMiwyOS40NDc3MTUzIDIuNDQ3NzE1MjUsMjkgMywyOSBaIE0zLDI1IEMzLjU1MjI4NDc1LDI1IDQsMjUuNDQ3NzE1MyA0LDI2IEM0LDI2LjU1MjI4NDcgMy41NTIyODQ3NSwyNyAzLDI3IEMyLjQ0NzcxNTI1LDI3IDIsMjYuNTUyMjg0NyAyLDI2IEMyLDI1LjQ0NzcxNTMgMi40NDc3MTUyNSwyNSAzLDI1IFogTTMsMjEgQzMuNTUyMjg0NzUsMjEgNCwyMS40NDc3MTUzIDQsMjIgQzQsMjIuNTUyMjg0NyAzLjU1MjI4NDc1LDIzIDMsMjMgQzIuNDQ3NzE1MjUsMjMgMiwyMi41NTIyODQ3IDIsMjIgQzIsMjEuNDQ3NzE1MyAyLjQ0NzcxNTI1LDIxIDMsMjEgWiBNMywxNyBDMy41NTIyODQ3NSwxNyA0LDE3LjQ0NzcxNTMgNCwxOCBDNCwxOC41NTIyODQ3IDMuNTUyMjg0NzUsMTkgMywxOSBDMi40NDc3MTUyNSwxOSAyLDE4LjU1MjI4NDcgMiwxOCBDMiwxNy40NDc3MTUzIDIuNDQ3NzE1MjUsMTcgMywxNyBaIE0zLDEzIEMzLjU1MjI4NDc1LDEzIDQsMTMuNDQ3NzE1MyA0LDE0IEM0LDE0LjU1MjI4NDcgMy41NTIyODQ3NSwxNSAzLDE1IEMyLjQ0NzcxNTI1LDE1IDIsMTQuNTUyMjg0NyAyLDE0IEMyLDEzLjQ0NzcxNTMgMi40NDc3MTUyNSwxMyAzLDEzIFoiIGlkPSLlvaLnirbnu5PlkIgiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4NCiAgICAgICAgICAgIDwvZz4NCiAgICAgICAgPC9nPg0KICAgIDwvZz4NCjwvc3ZnPg==);box-shadow:0 2px 5px 0 rgba(42,135,255,.2)}.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-n::before,.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-s::before{height:1px;top:50%;left:0;right:0}.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-n::after,.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-s::after{transform:rotate(90deg)}.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-e::before,.f-splitter-pane>.f-splitter-resize-bar.f-splitter-resize-bar-w::before{width:1px;top:0;left:50%;bottom:0}.f-splitter-resize-overlay{z-index:98;width:100%;height:100%;cursor:e-resize;background:0 0;position:absolute}.f-splitter-horizontal-resize-proxy,.f-splitter-vertical-resize-proxy{background:rgba(42,135,255,.04);display:none;position:absolute;z-index:100}.f-splitter-horizontal-resize-proxy{width:.4375rem;left:0;height:100%}.f-splitter-vertical-resize-proxy{height:.4375rem;top:0;width:100%}.f-component-text{display:block;width:100%;overflow:hidden}.f-form-control-text{height:calc(1.375rem + .125rem);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.f-form-control-textarea{height:calc(calc(1.375rem + .125rem) + 2.321475rem);word-break:break-all;overflow-y:auto;white-space:pre-wrap}.f-form-control-textarea,textarea.form-control{min-height:60px}.f-form-control-text,.f-form-control-textarea{display:block;padding:.1875rem .5rem;font-size:.8125rem;line-height:1.4286;color:var(--f-text-02);background:0 0;background-clip:padding-box;border:1px solid transparent;border-bottom-color:var(--f-neutral-06);border-radius:0}.f-state-view .form-group .farris-label-text{color:var(--f-text-02)}.f-form-control-textarea.f-component-text-auto-size{min-height:calc(calc(1.5357375rem + 2px) + 1.1607375rem);height:auto}.f-form-control-text.f-component-text-auto-size{overflow-y:auto;word-break:break-all;white-space:pre-wrap;min-height:calc(1.5357375rem + 2px);height:auto}.switch{color:var(--f-text-00);background:var(--f-neutral-04);position:relative;display:inline-block;box-sizing:content-box;padding:0;cursor:pointer;transition:.3s ease-out all;white-space:nowrap}.switch.checked{background:var(--f-theme-04)}.switch.disabled{background:rgba(var(--f-neutral-04),.5)}.switch.disabled .switch-pane{opacity:.5}.switch.checked.disabled{background:rgba(var(--f-theme-03),.5)}.switch.readonly{background:rgba(var(--f-neutral-04),.5)}.switch.readonly .switch-pane{opacity:.5}.switch.checked.readonly{background:rgba(var(--f-theme-03),.5)}.switch small{right:calc(100% - 1.875rem);border-radius:100%;position:absolute;transition:.3s ease-out all;background:var(--f-neutral-00)}.switch.switch-small{min-width:1.625rem;height:.75rem;border-radius:.75rem}.switch.switch-small small{width:.875rem;height:.875rem;left:0;top:-2px}.switch.switch-small.checked small{right:-1px;left:auto}.switch.switch-small>.switch-pane>span{font-size:12px;line-height:.75rem}.switch.switch-small>.switch-pane .switch-label-checked{padding-right:1rem;padding-left:.25rem}.switch.switch-small>.switch-pane .switch-label-unchecked{padding-left:1rem;padding-right:.25rem}.switch.switch-medium{min-width:2.5rem;height:1.375rem;border-radius:1.375rem}.switch.switch-medium small{width:1.125rem;height:1.125rem;left:2px;top:2px}.switch.switch-medium.checked small{right:2px;left:auto}.switch.switch-medium>.switch-pane>span{font-size:12px;line-height:1.375rem}.switch.switch-medium>.switch-pane .switch-label-checked{padding-right:1.625rem;padding-left:.4583333333rem}.switch.switch-medium>.switch-pane .switch-label-unchecked{padding-left:1.625rem;padding-right:.4583333333rem}.switch.switch-large{min-width:2.75rem;height:1.5rem;border-radius:1.5rem}.switch.switch-large small{width:1.25rem;height:1.25rem;left:2px;top:2px}.switch.switch-large.checked small{right:2px;left:auto}.switch.switch-large>.switch-pane>span{font-size:14px;line-height:1.5rem}.switch.switch-large>.switch-pane .switch-label-checked{padding-right:1.75rem;padding-left:.5rem}.switch.switch-large>.switch-pane .switch-label-unchecked{padding-left:1.75rem;padding-right:.5rem}.switch.checked .switch-pane{top:0}.switch.checked .switch-pane .switch-label-checked{opacity:1;display:inline-block}.switch.checked .switch-pane .switch-label-unchecked{opacity:0;display:none}.switch.disabled,.switch.readonly{cursor:not-allowed}.switch.square,.switch.square small{border-radius:4px}.switch .switch-pane{display:flex;flex-direction:column;height:100%;min-height:100%;justify-content:flex-start;align-items:center;top:0;position:relative;pointer-events:none}.switch .switch-pane>span{display:block;min-height:100%}.switch .switch-pane .switch-label-checked{color:var(--f-text-00);opacity:0;display:none}.switch .switch-pane .switch-label-unchecked{opacity:1;display:inline-block}.f-datagrid-cell-content .switch.switch-medium{min-width:1.625rem;height:.75rem;border-radius:.75rem}.f-datagrid-cell-content .switch.switch-medium small{width:.875rem;height:.875rem;left:0;top:-1px;box-shadow:0 2px 3px 0 rgba(0,0,0,.16)}.f-datagrid-cell-content .switch.switch-medium.checked small{right:0;left:auto}.f-datagrid-cell-content .switch.switch-medium>.switch-pane>span{font-size:12px;line-height:.75rem}.f-datagrid-cell-content .switch.switch-medium>.switch-pane .switch-label-checked{padding-right:1rem;padding-left:.25rem}.f-datagrid-cell-content .switch.switch-medium>.switch-pane .switch-label-unchecked{padding-left:1rem;padding-right:.25rem}.table{width:100%;background-color:var(--f-neutral-00);table-layout:fixed}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid var(--f-neutral-07)}.table thead th{vertical-align:middle;border-bottom:2px solid var(--f-neutral-07)}.table tbody+tbody{border-top:2px solid var(--f-neutral-07)}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid var(--f-neutral-07)}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(even){background-color:var(--f-neutral-11)}.table-active,.table-active>td,.table-active>th,.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th,.table-hover tbody tr:hover{background-color:var(--f-aid-03)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:var(--f-neutral-07)}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:887.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}@media (max-width:1689.98px){.table-responsive-el{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-el>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.table thead{background:var(--f-neutral-09);color:var(--f-text-04)}.table thead th{padding:.4375rem .75rem;line-height:1.25rem;border-width:0 0 1px;border-color:var(--f-neutral-13);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;position:relative}.table thead th::after{content:"";position:absolute;right:0;top:50%;margin-top:-.5625rem;display:block;height:1.125rem;width:1px;background-color:var(--f-neutral-06)}.table thead th:last-child::after{display:none}.table td{border-top-width:0;border-bottom:1px solid var(--f-neutral-07);border-color:var(--f-neutral-07);padding:.25rem .75rem;height:calc(.5rem + 1px + 1.1607375rem);line-height:1.25rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.table td.selected,.table th.selected,.table tr.selected{border-color:var(--f-neutral-07);color:var(--f-text-03);background-color:var(--f-aid-02)}.table-striped tbody tr.selected:nth-of-type(even){background-color:var(--f-aid-02)}.f-datagrid-norecords{width:100%;position:relative;flex:1 1 0;height:100%;justify-content:center}.f-datagrid-norecords-content,.f-table-norecords-content,.f-transfer-norecords .f-transfer-norecords-content{height:7.5rem;padding:5rem 0 0;width:100%;text-align:center;font-size:1rem;color:var(--f-text-07);background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKkAAABNCAYAAAGqB3QtAAAAAXNSR0IArs4c6QAAMg1JREFUeAHtfQmQHcd5Xs+bedfeC4CLg8RJgAABghcIguIhgjJl6r7JHFJFkR3FScqRGCd2WUpsUbaS2FKVK1FZiZVSLEuiKIXUaR0QE5KQXBZJUyBAAlgQFwkQWOLee9/9Zibf93f3zLyHt8ACWIgLkr37pq+//+7+++tj+hqlLlB96avPzPv8VzfPa2bjNDuci/2Hjz09t173UtVK2XFTKee+d9/6ig1/XowPHz6c37VrKJXJDDnp9HzH81xn3Bt1KscyKW/WhPO2W28d8mwMSf3kcPEIY3RUqFSKulbUn9y654u7XhpUmc6sSnsLVCbjqfXXLfs8yZ999tlUPt8t5DaMCRprJ4cLR5A7FQahSoF5GCAO6IEfnHhmx4vfzrlplQbT229e+WdxqNg0KeOBY8NH/Hqgavz5gfJrvqoFvqpXA7V08WWSGwcRUc3qbl+gTfGzpSjoHYah/GBSq5b1qZ27X9FusL+w7+WIwx03X30aU3qaOCO6yAC+5KmuROqorll1Oa3ixpz4NfygT6Ykxc/3793g+H7RcbxiKlUtrFmz5tjHH/3s/L/6jf90dO/BkyKGul9nNoR5tV6bjF/knkKWna629B7XDfasXbvixWKQX3vvI58Os45HPkYcKDQxM1yofN+PfhGn6TZ88duPX9nMc1JENBM22x/64dNzu72UU3ZTjj9WTam8UrbWnTPTJ598Mr9w4UI1NDSUGhrynHx+HAU/W5VKE6lCwXVmzXKdlkxZIaxHpCPoU6hpTHEu7amsl1YpL6W8tFNcf+2KL/385z93Nm7c6Ozatas1UwY8NaqrMQsnYgx3VuEMmGbANA2mt950ek2z9OQTqZ88tuXI2tXLVB01q46iFx2lXq2zllXU8mVXRLWsVQ1ryZTcXx4YPOKjyi5dNEftA2aLpYqqw14qFaPIEbh2+81XL44cjKFl7SJ+6U+GVCuW6BrGGsBUs1ZJ6iepXc7zz+9eqpTb6+SColN1Cw/s/cqLE2Ol9Jfv/qOjPrLOLJNJtV5HyxWqoZFhiYgPx3Fqb73jutNT2t7uFZQq7vnet761d+3a5Yf/YNlvf6GrvV2dKA67vjQGKKpA1/eA8mUkkC/1GlLdSk0q01bE0+n21z94ZqFXrUr8LqBdFXMOYq06H/9ndx5oFdevLbGbN/d3KFWVBrKAbo+J8ZDKLuiDgydSqqNTuSX0QlBltwS9Qy2aXRs+dGiw9wMfuOcE3VsCix7TpQDS1MMPP+xu3Li6pNTIBH/z8tWJpbPcwsJuNdHdvXqio0NNdKjZEz09Zfwum1g0OzvRPk8V0ul0prc3U9zcf6KDYD8nybLFYSaaA4md2TZdjrU7oQqe3LbnLxnGQ1+dctESKVcaD/bd7L5TeNxy44qWXTbDJVVzvEm/08ybHnv22rXXLPsZKwTHDBgnSPrYAEV2VJ4AFYeVyGcFwv+8eb3SdErrJyVtWkH4zeo9vfs/LWLjMOmwoDkAW8cADQyKQxLGxKG50Xa64UfFGm7pSEC6lw8dkdK46sqFpJAMhJAqxytDoyitKSb6nCTLxBw+OnSE7RcT192dVz2dbXSO1L6DJ1ShVBV/0rEUymW0yoyJ+SHymDHag7D25jetWRwFPouhQbLbdu5Zj0FhBxhyfFJ16uHJeiqVG+tIH7hr6dLyux76/fB3f/Hn4Rdv+/1jTMTISPG0xGbTrioUdSIZNzNVRbtpIU0UIKi2M8HnoBwwc3bu27eqDpUJsxXXrdWLeDgTEzU00tV169bV7v3ep0sYz7oOiuvOq9arlanFp5b3LKoFSAiEJ9hlcfsYloqdUIA9lBJAUY+ZXkQkGqcQFbB2z8YbpixZyRcSzIzPeBVn81VI6pd/tKWtOlyYy6gzve3Hf+fdN8VDjqb0vCoJRQLn5EtlqZVxN8tRDNDcnq19/IO3DDSl87R2vdl/2u1ff/TR9m63u6NSKTntqk+6VL7GKtWm3BR1pSb8Wuq33nfn4WTkDS1A0mM6zay4eDPtGh93HQ7EkaZqV1snXpcmnCwiKmVzSGA7xgNacF6mXRL8ECQ/O5Mu3XPPdQVxmM5ENfPasmVLujp3rsfm//hx1xlMn3QyQ0OIt0+l02YAYwYyfIfvVb3q2LFCSnVzYDMBum7FDF30Go9mzh946qnqFVdcUR0f31OdXatVN27cWOnrU9XeXr9Sqx2tlUoDzEu1vTq3qtRwLZ0Oq+musDq/vb2S7VbVXK5bjxubpdBsPzlSvVGFtR9r8TvSHbL9FDuySp3zB0n7U1tf+AvMLAi0OCjxXDb4aRm4uHjbsYMVDy99665d9uePPPKIc++99yq+UnV2dgqrfD4veiaTmfrI6sRQ+e2O4/9vx3YzJjeMEG2/9OnkyjISO8z2HY/F5qWROJtQBGIWzmVURR5TUn2zcpuQij9mXyiJRShJlJUkuZhEihhgvfXGlZ+gMxU6L61rDT2YUof2b/uCsZ5VszzPSkgCjqquXbMMaUW/XtcDFelOkXg7JJSZB8iUr5DsOUNMdyxZPF8ypTMJRsycEVGrd9NWiZmyRJlIMmDkEhHNNDIx0Kk4GBEzHnhDFLcAL3cHDiba70QiSTA0UviXQniWx5QS+tMnnv10Mx+TpChhkmJDxMQy0fSso5ZxTq1cjiePWPH4E+WoB4zpjNo5FT05HToydCTkiB8JgYapMv1CT7/+PUfhjpEUoQB/4lDGpvCz1Zbpp6L99vWt5+c0ReNzShJtDEIbRrCIMJlIuq5ZOV/82E7Rn1IQOAiGWaE0rtm0MRPnoqSdO5cAjMQWe6twmHrGhINOBYs3oFnEiZQnxalB04pFS7eGhD7f/+JvcJoEMxs15fi1bMrf7rr5patWLdvD0N/o/78suKMtORlHjLoT3pgtQcaQQnGLm2BtTxCe1SgY3bZj/61gWc2mUpgvrdUyTq6KOY5atephKtWpfv7gNz71zfd+9t+9/Wv3430uVJxtZfyCRUoYomOx8m2Ub6V8O6Xw2ISNjI9IIhx5EWGStbRpf+ubr205h9wq1d6uXfuvgRRP1WqpOnqqqqqiooblairl1oaGBmonT56slVPV+z/48KfuHxpipJSGoE9rJhnEouTa2CWlcGCl0kEg6URQlJhQTvWBoq8OUmrF4mhtYiKoVSqV2l133QVJavXsjpf+c2b3zkJd1dvn9PSqo8ePw4Mxak0QS/EiUZImPpL+bBqIUXE24axdmLzGHnFpvcYyNll2OE9WVgsuryi845fLmBXPCanrVh2MQJ0KbFmlZx8z2Ta/W9186L77zg2nrxuhfu97v+yruHlpkfmahmUPxbUPqmq1gvlutp/GQTsrtHyajjSY7v0XH7ztZeN1Ru11IdQf4VURM8hGcWo5fmMs462dHuUyp5mh2jHUx3tyNpsP7fsynfU0NPR6qfzhd90RLyfQs0m9ZoS6b9++7MBANR3lr+8ylR4ewlL1iDMEx1niMVue4+OjDt56RXl4l6ehUMCrbzfegY3yaO/qVpznH8OPr8RYRNLywpy/Vo0F9Pa333AKvaheMDIUl6SGbpwTHZ59e5VMrF6tMvv3O/tgyQ8MGOAsUdnsUacyf36Y9TxnIfw4LZM5flz8BwfTzjzsbThGNzMHoRTWRPrWQDsp8xFjKCB4o4BmKxZMZ2d3yHkJBdz29vbCbcy5664bNBEJL1SdGqusCn3/CcZqh6+Nb9rah24c4lI1+JsRvVDp8ZZ5PwRhYrT/wsGj148OFTLCoPmBJjFuFfVEObYyRO1ntVIBe90x5fJ5oa3INBjSksfwcaw8fvPNqwhMxZXbmD0KKbPfGYgKiD5L5D971BM6rCxjYui4c9NNNxk4x6Ev2DQ0VroDo9X/I2/9EB5mWrRQkoI0scj8ixVYUpCRPwWfSBKHZsbOleeETyR3TnNgPQl2vbBEGrphnYkm/W940J1Gx3H99TcsaznrwJrAkFSf/exnnQceeABj2Ybp8MgfVV9Gs5GDDjZ9z8Hxyr1Bvf7fG9AI9kmkMjYrJPM2IHb7fi2JMwIQf5jpZoa6GKoHxaee2/cV8qEiaVKoEGXsBk+xQafcqUg71dU7HWJqz4smVEb/k8e3/Ol1a678bZplKojiANr4OmPfEiggmvkqQ3cBNB0Yxrx2i5nva2xY4JUMT5ZtubTqm9sjzYrUDCN2FhgLiJmMzEag5Nnb1bYc6Jp0PYE056MuilCRafenjz/LfkBdd82VRhAQCau4ERwFQ8UnzXzZFYHRhf8JO1c54SvLXM3hSRvgxZ/60qWcG9FCFAPNIkSDb8Zv3YwZbe7Bnu62W7XP9DynXag/fnzL01i3W2STR6ESpVTSQVEIkK4WINzErv0tWu26oIQBAemprL/WxUnC+9Wybh3w7tvRlscaOIdOmmeyeYnMwkyHt24p1XZNd7eMvrTHBTwb5nwugI/a9MTzK4OgttnkpYEV3/NZlUUCrIw6vw00V8zrVvlcRrbtvPTyKcwQa8GTiCXPKRqp9slQho9vGNaB6JGJCTX6YkFoNSkaBAMdWztQ5ZmW2q03rVrawA6dElSL1CWpzm420Z2d8HwpuCeAqST6mHcRDAVkGF6+oBd7x9Bdt1Cck+XcF2kFnTAR2ZoHdfxQC8oVrLaJnJqYMHcmomZ/DOxqd2xYvbgpxLRYpw2pk6cmzi1FyTzyZ3eoTR7Ozh8rtYMbTxkODytQcZDAnHvWwobkxbkBKXylN2GT/uR3sdQZhbp1377LvFpqfa0WBm4qDDAcqvt+6Gfd6rPYw4rdUJOr9z78h1vb0vlrkc0T0pZOTnpWH6I0Bp02iVDY1MKP+40o8KiaizMpUPXpIfZGf41/8Zr2R0uh7t69u7Psp69zy+h3A38wk0KysXkXHUbgpV2/EqhF27fvCTzP8zHn7lPPZILgRDZ76taFC7H9DLM65coNt16xVv2rxz43//0r7h596+U3F4koZpTPF9FuSsZgobvuzLS/FZKt+pSoDMlMeItSjUs9Tc44beGxzdRxkR+FadBqOkxt135CMM0PiW379gOrVNpvh9h8P+Vi6j4IXEgQ++YhNGQR/+k03FwXIvQDrA5D84NcLudj9yN/wR/tfnCcmRWGjvN3o0Njb2Zar15wpXrh6IvqK/c8cJQykaoKd2bJCopmKxDqQgNH9voWUZpWh2dgCcNxLP5GxkZEcCJIaTzBkIqJkYLQgk36A8O137zz9L2qEu4CH96BAwdy45id9epeCbUoyLhprNmMB5lcBgKtBm1tmTr2tQZYDQgwaeEXi8Xgyiuv5OtYYHvKZ/v3L7+t+/ovPzn83O8gsfBRb+7t7hLhANlErdpypD+7bt5qzgGLYpUWRSEYBGmBajkQpVQp8Iv23YooxVkXAoJyTkgXFuhF2Ml1EtBSsHgIv4R/4u1TM5zGp7cUm+Gefnrfqc5lHUFPpeKPjY35pVIpXL16dd0K7Uzxca2Fg8SNc9cP3tJ9/X/54sFv/HsgLMsMUiCvDB1XtUpV3bRgTUWQwozhZ+UjqKRFMn96TESqhIMXSSSoKQRaaJfVMLjJK3ETjXYDjyZ/Iv9iqUmycrGimzl8MTGSmrP07b1Zt5jHu0Mu6Er5Qdn10244fmLf46OcODmf1L7uBPrV72/rqY+PYcuxnv6zQqthfcrlVj2juDs+DPzh3/3o3VgRnbqKGEw9yKVJ+cADYWrR9b+63B4t4NAkn9dC5dqUa44c2HlW5rIOIdN+ecesI+94x4qoHziTBF4XAuWqqZ9dILtb3QpQGM9eYxEPdki36nLSmiqvrNC1FUIvlZWfro197P136S0L4tH6kZj4ak3wWnCtZxfNaWv3/BA/xV9K/9qh5/mDWx4T0/rn+elsW52/nEr5OVX1c/kU3PIdDz/8ZKIoWkum5UC/Neml6foodg1XqyVfuZ2Kf9iYq1dOuZKK9z/H0SumEDZ2FWOxD/tbqFeIZM8TM3POw7LVbJlLg/IiQ7dW6jVV5fv7+zNHSqUIRdGKqNkkTAHojcE06RXRIldDXS4fQdgT4zj0pFdESzgJZVev7XI1Q+W6S+V33HLL2IM/fbqrzfVz9dCp33vPm0YwzJRRwWtCoBirOtj7C2D1yX96WC8tUwBUXIrmOU6q5BK0OOBROVZC04claLMKHQudFHpXNk2yDJ1YggY3uGnBd3W1lW+/fdX4a0KgmzcfyHF5WSkuLGMJORMvK8+eXQsH01heFh9scLXLy5A9Bc8xEUWtha6Jxsf1CihWlbm6rCKkc62/SfBjWFvtMuv/AwOrsR59iSueC2AWGtb0YefOdLrHS8Z6Td8KncvFVFwypm7X9Gmm4gllMUDwVBR+s9BlTZ+bLqgg/M56d7ysKo6X4APV3Y5UnEceUQo7/2Xr/8aNG8PkEQCcc5DcJdfpX4bQV5g8DwxQgAexkSILndI+rHj82ypevEAzN1JYFaEdDvZQh5aupbgA/dRoqR9v172c2zidqX53tkvODf5MpnnJ4xqQhLciakoPpjqeeGrri3/Y5BxZsefBqNM3R1ifVKpNoiep3RxRcSoOZtGUXxh8hYJPCp1I5+6VWPADzpIlS4TdUWyOoMy5aknR42je9CL01HBpH6Yi9IEgRMBpNkk93+hEaFawkh4tPBhFkNpJ6Ozimi2cpH+pVP3Ocy8ckAMENgj1aG0euyD0H1btpWBgg95qDZ/egYO5dBDUvdyX37T6ihEecLF87UEX2vfu3etcddVVYWfnRkcB7MR7s+CXL18+tZM6NoKp6KdGigdQDVFvmC47qwMbUm/nP8knSjUt8IuoE2i1yG3wB/nwqbH/tfvQ0TKDWkXhUHLUeYTZboqwbtz5Lp6aDM4SQvS8m/vm2rWXy/I42TQrjiLgFiWRZit4Ct0orgAGDfmyPheqDw6XDoep0E2i0vKUKTVOn+n8aOTSnBSkJW7WQWPRe+DIiS8ePcY+WCthh4egE+uBPL2k3bSQm7fvWIE6yt204cZlz1s+F6pLnBfKpDn87N78QgqIVV6r1uVm5pI1SYuUiL8RdHMcSxf0faKrrc1GYLwtE+q+cbMM4Ga94cN5VCD5V9MpTEaYiMLEP03anN62BbraNwrTVnvbPkYpMPm2QhZ/ps6msIX/NasWfrIty5OdBuAQklZatza6+SzhhIPjpF66+borHzcBpk1rzO20sdWM9r988ge5rHczZ+m5VmQzJLPsBluSR5h5HgVtle7GQEtyvcShcY4FWDN77+hZehMeK517Fy3su4oZsTXC3uLEVNgmQvyNQMUtCPfO6u3YSJrpVLb8p5On8PrxE1teipma3MOBQtPIpQB0S28X5cRGKUZdlglH6RrF8JG/eOPWh8PxASctOD26ELSYoIaTZQPkO1cNjU58OHaYHtNFEeiPH9/6MKYKZPbWCsAKkVJMZk77U0bIvkggzphGqJYI16giHiQxtFz04+mq4yeHtD+HaFTUrRks6Epk8mfLB/y+gPj1bIgEuvDHtAv0p49tex/WDm6Pk4bhOP/Ys1tJCsqsFVmlF9yscG07Kzy0N1oL4SJONFHF7AJMFBVVuYrdemYBzvKIaEgPwfJH4drmZ3ikuIfW6VLTKtDvb97Wg82J/6MxcTZLdDVmotFY4+qunfiUNyobLKnb4BSJMVOTjWbQDx0+xuCiouGZdWjWiVTjNjxa2NLsfb72aRUotkLsOj0hceZttbZIpFxZla2yVVqjC9mll+1VSGQKIgpPJxPebjTb/9KAuJIHBSbBE7mM7LolsewXjI4WPwnyC1bTNmOPnc37oyJvSFZcVVGnBRaUEzNLwTBfbTlPLcDdR3Q/NVRQJwfHYeImBYwlQairuwQQFpSrsILQAmyFJx8jPkHr7v2HrOzFj0K3/jbu225aeQU4Trsi/4umDh8dxmGE8EM285JxZl7LVfS5l3VgI61efbQJ4S0Du188LsK0+52i/aMmPAXNQsEu5721eu0qhiXfVipqYRL+k10l2Sr8ubglKsO5BJs6bZQHI0VbRcmhoz17mjDp7uI9kVt5qKLwxoT3ZXGXB+ENAo7nhT3MVqiRHSSt/GMm02uatio/WbKY/WTHo6ueUsvMzYaThVu5tE9Vqr7a99IxvOUkxGolJgHhbuQr7aohExIrdwodhXCa/2QRX6D7xUeoZBK5I7Lwz8zOmW2Xv86c+mzGVVdczoVGSoe/GIFixkNGY2bPKKOSHzskGORHcwt/hr8Y6qIJ9J9v/mrcMEqumUOdhTbstZ+q0lfOUUBaSBLO8KGZxgbBifDQWVFHvNL7M2orWOMvfC7C44xVfstze27H9QudKexoxo41H1NePvYRnrh+zQrMzp9ZvX/RytKPDv7dY+9arMf4knEj0cHhguqbM7UXlIlictrTSNIgXUuTKNWvmhSsFjFaatJQiPKn8Z30P3Pqz9+3JUKBhtT2XS/ejXUS3MEUlhw/KKadVNHxw5IXptqe37XvRtA4W7b0L3quf9+a557bc3kyCe956A8+9d3tj6lNB//+7sPjJ6JCsx3KRLGCuwLPvlWI2w4PHMK6pJWjaTbELm1j1BAIgilYrfT5KLu/lAyI8KR/Mr3TadYNUxPH5/v33AFk4swWdjQDnNzhbHc6Qw+wJ9wPSmXscE5jh7Pn+9ir62Gv+MqVK18hq3c++Hs70bOuWXHZIrXv5CH1V2/5j9jJrKus6KBh1nkojPWVcqA7laDKuNndzHFYQ0d60LJa437EvYVi8SpxIAPmCJ6UPS3C17jRxfqfy+0pEm6KD0EPInV37N59s6rh7tMsBCl7V9CUQ5i8phfTYb6L7eHKT8EGITuhX8N+IGweD3BDi//Arq9sR0oHP/rDP/n41977x7/06/5symfd4qvV7mMvqaeP7chtmHsN6i7FYBQIdD7x5NEh/rOKGmHancya2kokER60dgjGuDQFx086BN0ihYXRZv/Ib5oNcsH4zp17bghDr5JKBUUfVyFARkXsnSrmUl7RyXu4XNMrQpIl183AnC6Wy34RO9SKWHItFgpwT6V+AUlcPVEr/f0HH/kUpbId+8rV9oG9gqJv79qEfeLIa6vMikecK9ssxC7axLBReDhZeVFHZdY/EAgi6SZmTdfKX3Od/mdq69adq1C9i049wDXwXlHl3EI+lSqiIkOAuKm0Vium0z78UoVqdaQ0Pn68uGBBZ7Grq6uEfffFDRuWF1JO+n5mgCggajo6On4z7XrquZdewGXXdTVaHHOTAtDVsVEoNmtWINbeSmc8VOTJHUUMw/YR/9pMpIs/dIP6Zn+GvxjKy+XyNR70QIvmu67yy4gZ1xjKgYVMJue3t9cD3BcI4Fb8HTt2BH19fcHcuXMb9uD/w7N7Nnz+pb/R6WOuINR2XPhdqQ2red2XqSODxxvbNKGEWDCXRnJdHelo37lpTEFIfE8XYhNegmhBCq15ZYDQhIkmFaFaoRvJnuZvSKdd87DOXchm9bEZLNQHuDE8yOLUB7YB4PRHqj48PBosW7bM5xJpq9h5cIFLGh9b+P7/9jeHf3A/siz/zNCcnllq4WXz1eHj5tMMRjgahSbL0LTdeCKctJ+JWSb6659JAQUYSZBo1HGK8BheeIACVYHhpEaIow5P48VSqXXrrj6OXROlMq6WaWtrK2KnRHH79u3Fa6+9trhixYoKroqoTSbMrTtevIkJ45LsZdlZxbt7b3mQx13s7DozUwUKb15wbbEhA8ihVEE6mtzJ5K/JNBbQtFAlUIvsYyaevK3SZ/DR60PQ/LGaU8nECt3kjP7p/jb8tOtInFz1PO2MX4cMo6bmdZj311WWWWn++m9/2aGKqrOSCXM85cLb2HCbFX76VjYKxEtnQvrRHCku1Vcq8EN1T6eLlVKmMLR/w8QDD7TuBqJw02RoTMw0MX2DzcyQAC5ma6tW67OGlS/zyzw9hIPPYXyKiOmMp7EawMmjXImrBknJqwapU/HqQc4fdADU2Wz38D9951rujI/7NqGankcU6fSwe4PLqy0BtJip73//yTn1tJPWJ7Hs0ZW8nMjKZLJhtWq3LehrxywFT2nRzB20ovN4HE5qaYVjRuZEF/35VZ5WgG93y6fuu++uM96yYBhOWXsDpFMW1cwmZHf+yKNP9bb73ZkCjl21m6NWckVlAWnnKSwo/YkHbY6f3PpdhF8Kn0DjsRceXoh9aeI5Tg1wfdcozfFRxAjWEcAzE8HoRz5yC852XLh6A6QXLsNXnQNbz0c2bdOrdua0oNy/ivZMH2DTDZuYDWCJ2QR2JQ88SWjdbaY02Al7WZl2bCCCPZPNhY2gx/dN4O4b90w2CN3KkeP33XcfpjXOX70B0vOX3a8tpIDwkV1YGxh18/mMM3v23HCAR1G6u33V3++3zV/VZe+jtYnivbQ8hVlv6wh5N611xxRtZLZu/D6dnwegoBPO0RJ1EvAkjkDP4SqOzBpEY54R9+OisaYOMjrrC4fbYS+oZXM7BzlFRBbno05L8PkweSPM9Epg8+bNAGRfroSvj84yrPVFyrNhG8QJVk/u6qWXnGalgRsaqHiyw5jtIUtxx0M+nKRGCW7g3bjCSMUTrzx4SdVFhIvSJ1/bAHR6WbDLKVjY8/m2sBXo5WgyTsbajzPmUQFOnnxpuLd3XUetNpqJWncgOjqqbADfmfLG3/WudaXkS9gbINWl8ao/OabctGlTBsskeqeXSRFPA8tN0/O0g9HEos9L0mhOqeJ2cF5Aba1jOLQ6ew68T+G27+hCahxuldD6cmoamy+oNt4CdgK93umHFvAEens7bz60oIeBQG/CPv3j1p01QtcGAp2tu/ibFt6CXs7b26a8UxXfjbucSfcGSCmFV1mxO9+/f7+ctm5Oij5lvQTOB7XXEpq10hd0o9vHCdTE+V/x5OlrrAmG1HkC2wTBqeDIlDTGp7Jjb20C/u29BDwinwbYu3p6wrGREYetvG7hScpWPlZRCw8ne3yevhbsMaUBu2nRky18mK9WCNQ48clQb5h/bRJgC4oT6u5Gc1LdRsyP1o2Pj+Mcr/54Hd15iBqfAhA9eabXhknqcsB6Hw5Y2xPW8IyvFVBqCcB+8CB1fJBJbqPXYLc87AFsfj6AYKd78toBQfixxpPwNix1fRXBCZhMK09HtvQKnxrgZRyJFr4R7CSk0qDHDoaZd4HGqeHC+0InhdxwTbvlTjfJQqN/TMsQejU8XhPXh2stTex7Ju4mknPWbF+NJVu/p6ftWxhb2WnIyXixoQBW44P4vIH/M5/5DIHRshGx56TJkGelYReddipey9AMeh5et1c0WB14x7hyl4ObEMNWoCfQq9XlSMcu1XiVw0AiXUsQ40FBe/YovpFRwTcysrzqQV/vcJjYp1qov5dhW3ftiBF2YjjDRh64t/jHtzQ85GN1/GkYG2gm6ENDlbVBKngEBYchvN41JiVmEMidD7KTTOzwsXPTZsHeXi1h88JNFXIiTOi4sI/StwgV7ApOLLrFjzRWSXhYbMk0hDfuTJ+pHTo87VCVSnXT1p0v78SmIqwtTk1J0vDQlUuHSQH95iR7xMRmQc6yWwt89fcVYIAbdqnwBoYQeysc7ljx0tH207gJgGcUXAypkcXzOh6cM2dOsRXgk627Tsw6aGdr4VeDZhd++vsiOpx+Jlt4adoPCubVwSVL6nc5Tt3KPRlmxphPjRY3YLfIQwBkXkAF4AhYmUIKUwBmdLtNhX5GWbBKJglQgDgCOyFHUFs+NlDCHoPbep5Bt2khiTEzXgvosbHC13fsHxiGG50nVYIR+sIQQScCqE4uYWhItA6QWaUvYzC+sTMvv4iUGI1DgzlQ1Z6u8EFcB8J+WhRbeCgx45rQs7bwyZbdtPCRZJKAj68l6XTQoMu1JHzyPh4zpIm2iJ1RYDqZr/5zZLz2lrpf/yo6xXTUikqyCDJkQVpQZsXadUtpt0IlwWZBI8Gt+Jp1eAo3utOMkhRww9wQXnwTD8uHYUhrvGi26six4b88eOSE4WxdT9c1hgxMiUlMh9srV8RigWrAZwEdgTSJSsM+6SStL9zpxhY2m2v77g2rF2IUe3FVcliDmBwMbRSGNslIWSus6MQ9Kb8k4Yw0Dw8X3osDK19C4nSZNBQ18pUArLS8IEwCldChXTJtaU0h29bP6lYwIi3EE/OLzQ1CSgCU7mcKD2BUX3jxyP8cGp38nSAGVAKo4OtJ09/Yktpm0mZFAxU262ASanlagJp0/mLDjSueMiQzUrOynJGJmyxRQ6OVjwRB/fMalKRKApQg0mBMhrduAjYLbgKVYS3AjLttOSW88TOUEfiSvCNzC1qCfDIho1cY2bFr4GsT5dNnWQRfBmS2lWTjGYMUl9Ca1tSCUehMGHtLWJQ2YyBQCdJUWO9ff+OqHze3Ws30M8E+mfxmQtrOmIbNm0PvylVDX0k5KY7ItZJmD7CzOroxGs3OfU0jQwOBptjR/WiQwmaCaTo85eYfult+Yo6pNKYBNcQjzRbHAkIjWhROD0e0m02LcMGD8YcqdbyjI7MC10cDQk1FcprVOpCDNWsjqmbkpn0S/hK9bKcPO3LZ982Z0/mCOF0Cj+ZcXAJJVuqnm7d+CCfZvrhyxeJneJUUEy2FbcuIOt0ISIMwOlmwwZTEjbgLeGw4CU16ACgOxGCiyFeDS8OEJHIEwITTQKRoCWCCUCvNy7jT0Xjgnpy9CH/VrN4u1dnF9UEze8FgpmW0CY57BMufREgH6XQdiexkbwu4eSwN9+/0drd/Qohn+COej5jhCWXyHnvsH2Zjf/jPANDLT0+uLjRb8AJQEvHNVMCgx6KEDEFlqMVMMp53sa0c7QIoCUdKcdCaASgtwgM0mgwoMS2p5SX4Rvyajq2YPvPSgHvw43sCz7ycGhpVo+MFdfn8OTJkEYAK8BgD+EgUoE8MZ0zqJGoxG7DqEJJkSZ+AWFvlCf8PDY8U3o0PG71rdmdnf8JrxhmZpUtC/eTxZz9TUe4OIKEFQJkFgYrkJWq7pImjjwamUBkyS21mV9BQWRey0mbNh+aEH2x2Sob8qAQcBqC0x2DXYaXVhbGBEy0MCMDhQ0wMJgTYTKwOvHxEYcqqoWU03kJmHwxFNgSzgNAAlE6RHy2JFtb6UcfyQdYJUv9vZKQQfdWW7jNNzfiW9KePbV0dOsGPAJymbbitRRkBNPKWYhQb/YgHYtAWYuRrHHSXHAVuMNjW2XbbrWhjgCIomEf8yQkR23hjg6bj+Jd+VAxzAvcA4u1fLb5iriQ2Od5kOmxrSl2GAra5MUBt7t6FsXkk08Q4caXvO9CqHoL5/T097Zy2nFHKZm1GJYqJAQBSP3l860PoCB9DqZ0RoI1godj5o6aLlqUeNVamhKjxpylh0v8MpRXsuqOGlYRGCcDJ17S2dJazwpYgQRdFCrfm+JPxScUCP94Iwh9bdTZ+VdytuA8310mrypQacDJlSaDqKOlvIqdmSvZMYGXeow4AH05By/qjkdGJbyJvWiwJdq+mcUaC9GdPbHsnPos9AAluPJtwUJ6iRBPR0qQdIyDBnXQNtKCSQoI7yl5UsmQyHkQjBNrPPgk28rVdvoaTjdFSaT2KH9Zk/JI88JH4TOS8Liz+I7/47xha1QMH8Y3fCIRNLSlL0WYCNMnxpx7Hgl8UNk4js01/m03awfmukdHS4bGx4m0x5atrmnHdPe4r/je4DmIZwPDQ2UTjOsF8gkZmgJLEpkBE+AaAIn4QC8BAKwUS+Sk1v6+z5WV+lm0d1/gcfmUI59LqcGILzT920bi+oqEJsyHiwtcuBDbiZZwGFTJ84EuQ3PBFKpsgq5OQKlSVelXteemwmCMG4mcfhqm1ih6H187sG8LabeuvXtxANsMtNhczPJmtk6ev5VS4llMXKmEjyoA0cjf+9G5uUPK4A3V+X0/rCFq4FnBj2ssDwzom8GOMtru349EoOpsuq5NfIgGSWtjxufq9VVz9SfuZCiTpT5YEfVIl/ZPu1kx/NJy122++tEA641pSK9Bz11EECQDY8BofujQJYpo6O/JqzizOR567asc9tIuv6FWDuNR3vFAGA/a1jBrxt0CJrShClPAP5XPRBKVJG/2gpKIJXRMCDXNDpmnFYl3iPGrSycJbemFxSTwueZDGIGChJArAtF7WlXSZrKcunzv1VnOyEiRQ+aPi/ObeA/iidI2f2kD8Jgk2XXpuFM4mPQxjK44MGmBh3dKtsYasVKZkVuBvIcjwVNqbTxuGXKwZlXGS8Ml0kM+loHQzcCmkdJI0SpeHEoy6etIZQFBLlJWa09s5CZfzd+aHTK5aOlcDNGKjW2wCQiclkQoYY8DBhH8pBGIMgNcXWSHdkRk8EuakP1+G6Cdj26mGTyQlSu4MN1xwS9rff6IjyIzOTVW9zopfz3v42JTvV+rYazvhec6451VPrFmzpjpdcvjoTz73T+67+q1/8ZXnfvCPkzzZhghQBRUaBnH/r+24tRJB9A6iZNgLNeuxIeNgCogCbdZ8T0eFvGnzhQkAo9L4IrCZByrNRYw2X2LReaSvzS91OxaeSvgg2cTqCGb805bmlBOK1sHd1r/3Gtdx54fYPh8qfIEGCiYc3HZ5ZWSICzRx6RV0l20Je7IgSLm5ALfEvnLNNVcOoAvUZWFiBRWcGt1aJegD3/7D9TUVPHPboutUsV5Wzx/dG/zW1e8ZvWHO1WUpVpY2FSPVD9F1a6a95uJK6ba2KW+S14HO8tx74IQqVaq2ARdqyTlM1JPxM1lUbBGtwl7ZvZVSGS9OdEsC3JqtTt8YyBao5BObY9qYV8LNcWpvue2axTbuS0Fn6qestm8/sApImw/Bh8AfQClFEbpYAKZbCHASkV7ohTVVV7wJGvfuslOCn4cbT6ukCjOZ/ASubckqYIX2dIDr2sQd3xXx08HISG3wlltWmFPgcfLe+eB/2IQQb+Nr7cfWv1s9+OwmfAa9pq7omFv71LqPnZJNRCRHWbPAwRK/uKgIASq6t+fx/YiODM6bY/Mb+Fk/TTHZU/MDqHAVTV0NjhQwFq1HLZnmrcPquJkKo2gwFt2CmlYRbn5Q31sslvBhDxK0KhITMPKzdFZPRnKW8I6q3X372sU2xKWgt8qRwjGB1Nve9uGO7u56etTzahuWL5/YuXP/0sBVl6kaROmhHYD8CU7BHsxpFD0wacAKTAJ6QZoA9AKc88GNgQRiGTSZEPcbCx3MAHCZH0mWoN89+vSijT0rDnW68+qeV6mvWrVqKNnCvv3r9x/DnOhcdq8Le+epq/oWqcf3PCNy7sl2+f/1tn97gps7bJESoAQLVeRmLMmXHGbGKktvA9guWbuDt+WHPtuGsuHFDn/rTlJLH/OHidWWf/BnAdQB0kKhiJZUz7ta2nPVpxIesqvdfce1i8+V96tJH4G0v78/U1OZNU5dZQlCj+iDHIkejxJNxy0hW8dqWAEwM6EPWsAOtFQVaQkJQlxnCfBp4BK7QZDDKUJ8e9HguF7PBvjsZ1iv51Fk4+iC24Lf2/rlRwGK9QIpU9IA3TbcqPunD3/gcz+456uf3IpIrpdEQ9rvue5O9cTuX6nxckEK+8a5V5f+9XX/aITJpQJtxMqwM6DR2SbMkkCiWZQxNAOUzOweUxOFaDFIySAJZM0w5gsOppu3UZFBTUA6Mck8KV+rICIozV2MDWb96qUrTVSgmgzPxvCQZ+2tb75uceR9CRjkxbK//8A8ApRFhi+KFFP4VAO+MVCCDnMIcyDmugsdt7/XPbqncRWKW3A9XqOP27fhVnVdXKVfgz1bSnVmigB6oVLJlKAXe3oyuBm+WuL1+uPjGVyzX5eb4QuFYyXcBF+EXzEVOt/TqOEIC+JGqeAf1/iH3/vQdz4ddHa0r+JnlPkCVEc3+4s9W9S6JavlOn58S0L96sjO/PHioCslyBIlYEwhsPBoRsssLgSWgNj4a0JS2BAMTcCRQIehmStMLHhNGdOyYgitDsBAUDa8tgk1XpiEHyzJ+BmMdqbLpo12VHPhKxVB7IAsdCpqml5f2D7V8BL4Enp4bEF9r9rjlMMipeSi+QMog5wXhKVSgK5ZN331uovNSF7oZnEBfB0Ll04u8P2CygW5YBQfdsHtl7D7Yb6zE61jPfCrPWHVPxHOm9cr7vzCez6fD4eHh4MNG9ZRytI8ADS6mdBC+7MPffdTd0L4byMKBKpSHvptFsWS68CtWCzm0fExdXJkSHnLPeVhAbqCsSlL7eXRo15f2yzu02B2oqKgieHoZAtZg8jQ0DOZErR4Egbu1IUXzbAQOFrpO9WtmZSGm9AnoqeXjh9B43SxEsFD3GKemg8iY5oSccm2D7ET/JaesZOPtUsg2FuHbwynUz7TnzIFxe9h+CmOC/Fu49bDjMoGNfTgqUoY1mrjIS7Uh1+NXT/effwQn2uAEZ9F9tMhPpMRLFhwWYhPPgQEIuwAdykcHx8IN27cSMmddvovKRQUmItz6e9BSd0U1AOMz8KtDx7528XHy4NXs7D4z0IQ0bOgaYDq7uhStVxdPY/vcCxfsERth46SU92Z9hiDmrTpSSZCKu7CFyYLQh0fHNjiGaCKm6SDQfSWushq0sO4rdJGy9m6Wt3Gb6eREnkDiQWbhNakcNO8Of9Bk4G2YShwNO5nDx/MrA1OVihn1D3OYe7evRsvKDWgtCP0K8NhxUdrWhwMOzoWoxUshfjiQ1goFIL58+ezlZTWELdg6J0WFFpja3jGCJOeL7wwMHtb/8v4tEYgw44Udh55AOpHFrzn+8+N7Hpu89Az96Kz43UYUjrSVevyEthmvLQq+1U1u7cHH4zxVU+u018xawma1NYqAg8MGgSGGch11067hgE56BZPYqfVKHb1utXSo0DrLhwnCaO5akrQSfyEmtQX6PjTiRM30uk4QCvkcTptCjUvHT6ZDks5aXhLYBlcAjolK+rhhx92169fnyYIMT40reG4tIbnC0LLezJ9W/+B6/G2vrLZ38fXLvmHTerqucKuZTvH9r6j6BeHMN3EO9fktCNx0tc+a2nWzfTxy11dTsexG+eufGXt/JWD0nxrHGnWDWZYUCWCxLWu1tu2WAwU7WyCpz1nxzgjgBpQCa1loGPT9JpYOBlnDUBDi65InHnCE33Q8NjoaG8TGxusQWdtbkU3mXtDYFhQGf13vOXGS+Jsk037/wdcVdoyTI9pdwAAAABJRU5ErkJggg==) top center no-repeat;position:absolute;top:50%;margin:-3.75rem 0 0 -.625rem;line-height:2.5rem}.f-transfer-norecords{height:100%;position:relative}.table-hover tbody .f-table-norecords-row:hover{background:initial}.f-table-norecords,.f-table-norecords .f-table-norecords-row td{border:none}.farris-tabs{position:relative;display:flex;flex:1 1 auto}.farris-tabs .margin-right-14{margin-right:14px}.farris-tabs .farris-tabs-header-extend{height:auto;display:flex;align-items:center}.farris-tabs .farris-tabs-header{display:flex;flex-shrink:0;flex-grow:0;align-items:center;margin:0 0 .625rem;padding:.75rem 0 0}.farris-tabs .farris-tabs-header .farris-tabs-title{position:relative;display:flex;width:100%}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer{margin:0}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer.spacer-sides{margin:0 1.5625rem}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer.spacer-sides-dropdown{margin:0 3.75rem 0 1.75rem}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs{overflow:hidden}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs .nav-item{color:var(--f-text-04);border-width:0;border-style:solid;border-color:transparent;font-size:1rem;margin:0 2rem 0 0;position:relative}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs .nav-item::after{content:"";position:absolute;bottom:0;left:0;right:0;height:3px;display:none;border-radius:10px;box-shadow:0 2px 6px 0 rgba(78,148,255,.4)}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs .nav-item:hover{color:var(--f-theme-05);border-color:transparent}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs .nav-item .nav-link{border:none;padding:0 0 .375rem;color:inherit;cursor:pointer;text-decoration:none}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs .nav-item .nav-link.tabs-text-truncate{overflow:hidden;white-space:nowrap;display:flex;align-items:center}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs .nav-item .nav-link.disabled{color:var(--f-text-07);background-color:transparent;border-color:transparent;pointer-events:none}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs .nav-item .nav-link .st-tab-text{max-width:310px;overflow:hidden}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs .nav-item .nav-link .farris-title-text-custom{position:relative}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs .nav-item .nav-link .farris-title-text-custom::after{content:"";height:100%;position:absolute;right:0;width:30px;background-image:linear-gradient(to left,rgba(255,255,255,.8) 0,rgba(255,255,255,.3) 100%)}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs .nav-item.f-state-active{border-color:var(--f-theme-03);color:var(--f-theme-03)}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs .nav-item.f-state-active::after{display:block;background:var(--f-theme-04)}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs.nav-fill .nav-item.f-state-active::after,.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs.nav-pills .nav-item .nav-link .farris-title-text-custom::after,.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs.nav-pills .nav-item.f-state-active::after,.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs.nav-pills.nav-fill .nav-item.f-state-active::after{display:none}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs .nav-item.f-state-active:hover{border-color:var(--f-theme-05)}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs .nav-item.f-state-active .nav-link{color:var(--f-theme-03)}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs .nav-item:active{color:var(--f-theme-02);border-color:transparent}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs.nav-fill .nav-item{flex-shrink:1;flex-grow:1;flex-basis:0;background:var(--f-neutral-10);border:none;margin-right:0;margin-left:0}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs.nav-fill .nav-item.f-state-active{background-color:var(--f-neutral-00)}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs.nav-fill .nav-item .nav-link{padding-top:.4375rem;padding-bottom:.4375rem;justify-content:center}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs.nav-fill .nav-item .nav-link .st-tab-text{max-width:none}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs.nav-pills .nav-item{border:none;font-size:.875rem;margin:0 .875rem 0 0}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs.nav-pills .nav-item .nav-link{padding:.3125rem .75rem;color:var(--f-text-02);background:var(--f-neutral-09)}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs.nav-pills .nav-item .nav-link:hover{color:var(--f-theme-03);background:var(--f-aid-02)}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs.nav-pills .nav-item .nav-link.disabled{opacity:.6}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs.nav-pills .nav-item.f-state-active .nav-link{color:var(--f-text-00);background:var(--f-theme-04)}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs.nav-pills.nav-fill .nav-item{margin-left:0;margin-right:0}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .sc-nav-btn{position:absolute;z-index:120}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .sc-nav-btn:has(>.show){z-index:140}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .sc-nav-btn .dropdown-toggle-split,.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .sc-nav-btn .sc-nav-rg,.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .sc-nav-btn.sc-nav-lr{height:1.25rem;width:1.25rem;border-radius:6px;border:1px solid var(--f-neutral-06);background:var(--f-neutral-12)}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .sc-nav-btn .dropdown-toggle-split:hover,.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .sc-nav-btn .sc-nav-rg:hover,.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .sc-nav-btn.sc-nav-lr:hover{border-color:var(--f-theme-05)}.farris-tabs .farris-tabs-header.farris-tabs-inContent .farris-tabs-title,.farris-tabs .farris-tabs-header.farris-tabs-inHead{border-bottom:none}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .sc-nav-btn.sc-nav-lr{left:0;top:50%;margin-top:-.625rem}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .sc-nav-btn.sc-nav-lr::after{content:" ";width:.5rem;height:.5rem;border-top:1px solid var(--f-text-04);border-right:1px solid var(--f-text-04);transform:rotate(225deg);position:absolute;top:.25rem;left:.4375rem}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .sc-nav-btn .sc-nav-rg{padding:0}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .sc-nav-btn .sc-nav-rg::after{content:" ";width:.5rem;height:.5rem;border-top:1px solid var(--f-text-04);border-right:1px solid var(--f-text-04);transform:rotate(45deg);position:absolute;top:.25rem;right:.4375rem}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .sc-nav-btn .dropdown-toggle-split{color:var(--f-text-04);margin-left:.3125rem;padding:0}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .sc-nav-btn.dropdown{position:absolute;top:50%;margin-top:-.625rem;right:.375rem}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .sc-nav-btn .dropdown-toggle:active,.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .sc-nav-btn .dropdown-toggle:hover{color:var(--f-theme-05)}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .sc-nav-btn .dropdown-toggle::after{width:1em;height:1em;content:"\eb82";font-family:FarrisIcons;border:none;font-size:12px;line-height:1;vertical-align:1px}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .sc-nav-lr:hover:after,.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .sc-nav-rg:hover:after{border-top:1px solid var(--f-theme-05);border-right:1px solid var(--f-theme-05)}.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .sc-nav-lr:active:after,.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .sc-nav-rg:active:after{border-top:1px solid var(--f-theme-01);border-right:1px solid var(--f-theme-01)}.farris-tabs .farris-tabs-header.farris-tabs-inHead .farris-tabs-title{width:41.6666667%}.farris-tabs .farris-tabs-header.farris-tabs-inHead .farris-tabs-toolbar{flex:1;align-items:center;width:30%;display:flex;justify-content:flex-end;margin-left:.875rem}.farris-tabs .farris-tabs-header.farris-tabs-inContent .farris-tabs-toolbar{margin:.625rem 0}.farris-tabs .farris-tabs-header.farris-tabs-nav-fill,.farris-tabs .farris-tabs-header.farris-tabs-nav-fill .farris-tabs-title,.farris-tabs .farris-tabs-header.farris-tabs-nav-pills,.farris-tabs .farris-tabs-header.farris-tabs-nav-pills .farris-tabs-title{border:none}.farris-tabs .farris-tabs-header .farris-tabs-toolbar .btn-link{margin-right:.75rem}.farris-tabs .farris-tabs-header .farris-tabs-toolbar .btn-link:last-child{margin-right:0}.farris-tabs .farris-tabs-header .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0;right:0;left:auto;min-height:80px}.farris-tabs .farris-tabs-header .st-drop-close{width:1rem;height:1rem;text-align:center;cursor:pointer;position:relative;opacity:0}.farris-tabs .farris-tabs-header .st-drop-close .material-icons{font-size:1rem;margin:-.625rem 0 0 .3125rem}.farris-tabs .farris-tabs-header .active{color:var(--f-theme-03)}.farris-tabs .farris-tabs-header .active .st-drop-close{opacity:.6}.farris-tabs .farris-tabs-header .active .st-drop-close:hover{opacity:1}.farris-tabs .farris-tabs-header .f-tabs-toolbar-btn{padding:.125rem .8125rem;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;position:relative;color:var(--f-theme-03);border:none;background:0 0;white-space:nowrap}.farris-tabs .farris-tabs-header .f-tabs-toolbar-btn:hover{color:var(--f-theme-05)}.farris-tabs .farris-tabs-header .f-tabs-toolbar-btn:active{color:var(--f-theme-02)}.farris-tabs .farris-tabs-header .farris-tabs-inline-flex{display:inline-flex}.farris-tabs .scroll-tab-tooltips{padding:0;margin:0;width:7.5rem;text-align:left}.farris-tabs .scroll-tab-tooltips li{list-style:none;padding:0;margin:0}.farris-tabs.f-tabs-content-fill .f-tab-active,.farris-tabs.f-tabstrip-fill .f-tab-active{display:flex;flex:1 1 auto;flex-direction:column;overflow:auto}.farris-tabs.f-tabs-content-fill .f-tab-active{position:relative}.farris-tabs .f-tab-d-none{display:none}.farris-tabs.f-tabs-header-sm .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs .nav-item .nav-link{padding-top:.25rem;padding-bottom:.25rem}.f-cmp-tabs-with-pill .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs .nav-item{border-radius:4px 4px 0 0;padding:0 .625rem;margin:0 1rem 0 0}.f-cmp-tabs-with-pill .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs .nav-item.f-state-active{border-color:var(--f-theme-03);color:#fff;background:var(--f-theme-03)}.f-cmp-tabs-with-pill .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs .nav-item.f-state-active:hover{border-color:var(--f-theme-03)}.f-cmp-tabs-with-pill .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs .nav-item.f-state-active .nav-link{color:#fff}.nav-pills .nav-link{padding:.3125rem .75rem}.farris-tabs-toolbar .sc-nav-btn .morebtn{padding-right:12px;padding-left:12px;margin-right:0!important}.lookup-tabs-nav .nav-item-selected{color:var(--f-theme-03)!important}.lookup-tabs-nav .lookup-selected-total{color:var(--f-text-00)!important;background:var(--f-theme-04)!important}.lookup-tabs-nav .tabs-ink-bar{background:linear-gradient(214deg,#3F65FF 0,#4D9AFF 100%)!important}.farris-tabs-inContent .farris-tabs-toolbar:has(.f-component-tabs-view){display:flex}.farris-tabs-inContent .farris-tabs-toolbar .f-component-tabs-view{height:auto}.farris-tabs.one-page{overflow:hidden}.farris-tabs.one-page .farris-tabs-content{overflow:auto;position:relative}.farris-tabs .st-drop-close{line-height:1}.farris-tabs .tabs-li-absolute{padding:4px;margin:0;position:relative}.farris-tabs .farris-tabs-header{flex-wrap:nowrap!important}.farris-tabs .tabs-li-absolute input{line-height:26px;height:26px;padding-right:24px}.farris-tabs .tabs-icon-search{position:absolute;right:4px;top:50%;font-size:14px;padding:0 4px;width:auto;height:24px;color:rgba(0,0,0,.25);margin-top:-12px;line-height:20px}.farris-tabs .dropdown-no-data{height:26px;line-height:26px;text-align:center;padding-top:5px}.farris-tabs .farris-tabs-header .farris-tabs-header-post,.farris-tabs .farris-tabs-header .farris-tabs-header-pre,.farris-tabs .farris-tabs-header .farris-tabs-title.scroll-tabs .spacer .farris-nav-tabs .nav-item{flex-shrink:0}.farris-tabs .farris-tabs-header .farris-tabs-title{flex:1 0}.farris-tags .farris-tags-item-container li.farris-tag-item{border-color:#E6E6E6}.farris-tags .farris-tags-item-container.farris-tag-item-capsule .farris-tag-item{border-radius:24px}.farris-tags .farris-tags-item-container.farris-tag-item-capsule .farris-tag-item.farris-tag-item-checkable:not(.farris-tag-item-checked){background:#fff;border:1px solid #e6e6e6;cursor:pointer}.farris-tags.farris-tags-nowrap{overflow:hidden}.farris-tags.farris-tags-nowrap .farris-tags-item-container{display:flex;flex-wrap:nowrap;overflow:hidden}.farris-tags .farris-tags-item-container .farris-tag-item{background:rgba(var(--f-theme-03),.06);border:1px solid;color:var(--f-text-02);display:inline-block;padding:0 8px;margin:0 10px 0 0;line-height:24px;font-size:13px;white-space:nowrap;border-radius:3px;cursor:default;opacity:1;transition:all .3s cubic-bezier(.78,.14,.15,.86)}.farris-tags .farris-tags-item-container .farris-tag-item a,.farris-tags .farris-tags-item-container .farris-tag-item a:hover{color:var(--f-text-02)}.farris-tags .farris-tags-item-container .farris-tag-item>a:first-child:last-child{display:inline-block;margin:0 -8px;padding:0 8px}.farris-tags .farris-tags-item-container .farris-tag-item .tag-delete{color:var(--f-text-06);display:inline-block;font-size:10px;width:16px;text-align:right;margin:0;cursor:pointer;transition:all .3s cubic-bezier(.78,.14,.15,.86);position:relative;z-index:10}.farris-tags .farris-tags-item-container .farris-tag-item .tag-delete .f-icon{font-size:12px}.farris-tags .farris-tags-item-container .farris-tag-item .tag-delete:hover{color:var(--f-text-02)}.farris-tags .farris-tags-item-container .farris-tag-item>.f-icon+span,.farris-tags .farris-tags-item-container .farris-tag-item>span+.f-icon{margin-left:7px}.farris-tags .farris-tags-item-container .farris-tag-item.farris-tag-item-success{color:var(--f-semantic-success-01);border-color:var(--f-semantic-success-02);background:var(--f-semantic-success-03)}.farris-tags .farris-tags-item-container .farris-tag-item.farris-tag-item-success.farris-tag-item-actived{color:var(--f-semantic-success-03);border-color:var(--f-semantic-success-01);background:var(--f-semantic-success-01)}.farris-tags .farris-tags-item-container .farris-tag-item.farris-tag-item-info{color:var(--f-semantic-info-01);border-color:var(--f-semantic-info-02);background:var(--f-semantic-info-03)}.farris-tags .farris-tags-item-container .farris-tag-item.farris-tag-item-info.farris-tag-item-actived{color:var(--f-semantic-info-03);border-color:var(--f-semantic-info-01);background:var(--f-semantic-info-01)}.farris-tags .farris-tags-item-container .farris-tag-item.farris-tag-item-error{color:var(--f-semantic-danger-01);border-color:var(--f-semantic-danger-02);background:var(--f-semantic-danger-03)}.farris-tags .farris-tags-item-container .farris-tag-item.farris-tag-item-error.farris-tag-item-actived{color:var(--f-semantic-danger-03);border-color:var(--f-semantic-danger-01);background:var(--f-semantic-danger-01)}.farris-tags .farris-tags-item-container .farris-tag-item.farris-tag-item-warning{color:var(--f-semantic-warning-01);border-color:var(--f-semantic-warning-02);background:var(--f-semantic-warning-03)}.farris-tags .farris-tags-item-container .farris-tag-item.farris-tag-item-warning.farris-tag-item-actived{color:var(--f-semantic-warning-03);border-color:var(--f-semantic-warning-01);background:var(--f-semantic-warning-01)}.farris-tags .farris-tags-item-container .farris-tag-item.farris-tag-item-checkdisabled{cursor:not-allowed;color:rgba(0,0,0,.45)}.farris-tags .farris-tags-item-container .farris-tag-item.farris-tag-item-checked{background-color:#fff}.farris-tags .farris-tags-item-container .farris-tag-item:last-child{margin-right:0}.farris-tags .farris-tags-item-container .farris-tag-item.farris-tag-item-checkable:not(.farris-tag-item-checked){color:var(--f-text-02);background-color:transparent;border-color:transparent}.farris-tags .farris-tags-item-container .farris-tag-item.farris-tag-item-checkable:not(.farris-tag-item-checked):active{color:var(--f-text-02)}.farris-tags .farris-tags-item-container .farris-tag-item.farris-tag-item-checkable:not(.farris-tag-item-checked):hover{color:var(--f-theme-03)}.farris-tags .farris-tags-item-container .farris-tag-item.farris-tag-item-checkdisabled{background-color:transparent;border-color:transparent;color:var(--f-text-07)}.farris-tags .farris-tags-item-container .farris-tag-item.farris-tag-item-actived,.farris-tags .farris-tags-item-container .farris-tag-item.farris-tag-item-checked{background:var(--f-theme-03);border-color:var(--f-theme-03);color:var(--f-text-00)}.farris-tags .farris-tags-item-container .farris-tag-add-button{cursor:pointer;background:#fff;border-radius:6px;border:1px dashed var(--f-neutral-04)}.farris-tags .farris-tags-item-container .farris-tag-add-button .farris-tag-add-text{color:var(--f-text-06)}.farris-tags .farris-tags-item-container .farris-tag-add-button .f-icon{color:var(--f-text-04)}.farris-tags .farris-tags-item-container .farris-tag-add-button:hover{border-color:var(--f-theme-05)}.farris-tags .farris-tags-item-container .farris-tag-add-button:hover .f-icon,.farris-tags .farris-tags-item-container .farris-tag-add-button:hover .farris-tag-add-text{color:var(--f-theme-05)}.farris-tags .farris-tags-item-container .farris-tag-add-button.farris-tag-add-button-disabled{opacity:.6;border-style:solid;cursor:not-allowed}.farris-tags .farris-tags-item-container .farris-tag-add-button.farris-tag-add-button-disabled .farris-tag-add-text{color:rgba(0,0,0,.25)}.farris-tags .farris-tags-item-container .farris-tag-add-button.farris-tag-add-button-disabled,.farris-tags .farris-tags-item-container .farris-tag-add-button.farris-tag-add-button-disabled:hover{background:var(--f-neutral-08);border-color:var(--f-neutral-05)}.farris-tags .farris-tags-item-container .farris-tag-add-button.farris-tag-add-button-disabled .f-icon,.farris-tags .farris-tags-item-container .farris-tag-add-button.farris-tag-add-button-disabled .farris-tag-add-text,.farris-tags .farris-tags-item-container .farris-tag-add-button.farris-tag-add-button-disabled:hover .f-icon,.farris-tags .farris-tags-item-container .farris-tag-add-button.farris-tag-add-button-disabled:hover .farris-tag-add-text{color:var(--f-text-07)}.farris-tags .farris-tags-item-container .farris-tag-input-box{display:inline-block}.farris-tags .farris-tags-item-container .farris-tag-input-box .form-control{height:24px;width:100px}.farris-tags .farris-tags-item-container .farris-tag-input-box .form-control:focus{box-shadow:none}.farris-tags.farris-tags-checkable .farris-tag-item{line-height:22px}.time-picker-panel{box-sizing:border-box;margin:0;padding:0;color:var(--f-text-04);font-size:14px;font-variant:tabular-nums;line-height:1.5;list-style:none;font-feature-settings:"tnum";position:absolute;z-index:9999}.time-picker-panel .time-picker-panel-inner{position:relative;left:0;font-size:14px;text-align:left;list-style:none;background:var(--f-neutral-20);margin:.25rem 0 0;background-clip:padding-box;border-radius:10px;outline:0;box-shadow:0 2px 20px 0 rgba(3,18,51,.12);padding:3px 0}.time-picker-panel .time-picker-panel-inner .time-picker-panel-input-wrap{position:relative;padding:7px 2px 7px 12px;border-bottom:1px solid var(--f-neutral-08)}.time-picker-panel .time-picker-panel-inner .time-picker-panel-input-wrap .time-picker-panel-input:-moz-placeholder-shown{text-overflow:ellipsis}.time-picker-panel .time-picker-panel-inner .time-picker-panel-input-wrap .time-picker-panel-input:placeholder-shown{text-overflow:ellipsis}.time-picker-panel .time-picker-panel-inner .time-picker-panel-input-wrap .time-picker-panel-input{width:100%;max-width:154px;margin:0;padding:0;line-height:normal;border:0;outline:0;cursor:auto}.time-picker-panel .time-picker-panel-inner .time-picker-panel-combobox{zoom:1}.time-picker-panel .time-picker-panel-inner .time-picker-panel-combobox .time-picker-panel-select{position:relative;float:left;width:4.125rem;max-height:192px;overflow:hidden;font-size:14px;border-left:1px solid var(--f-neutral-08)}.time-picker-panel .time-picker-panel-inner .time-picker-panel-combobox .time-picker-panel-select ul{width:4.125rem;margin:0;padding:0 0 160px;list-style:none}.time-picker-panel .time-picker-panel-inner .time-picker-panel-combobox .time-picker-panel-select ul li{height:2rem;margin:0 6px;padding:0;border-radius:6px;line-height:2rem;text-align:center;list-style:none;cursor:pointer;transition:all .3s;-webkit-user-select:none;-moz-user-select:none;user-select:none;color:var(--f-text-02)}.calendar-time-picker .calendar-time-picker-panel .calendar-time-picker-inner .calendar-time-picker-combobox .calendar-time-picker-select:first-child,.time-picker-panel .time-picker-panel-inner .time-picker-panel-combobox .time-picker-panel-select:first-child{margin-left:0;border-left:0}.time-picker-panel .time-picker-panel-inner .time-picker-panel-combobox .time-picker-panel-select ul li:hover{color:var(--f-theme-03)}.time-picker-panel .time-picker-panel-inner .time-picker-panel-combobox .time-picker-panel-select ul li.time-picker-panel-select-option-selected{background:var(--f-aid-02);color:var(--f-theme-03)}.time-picker-panel .time-picker-panel-inner .time-picker-panel-combobox .time-picker-panel-select ul li.time-picker-panel-select-option-disabled,.time-picker-panel .time-picker-panel-inner .time-picker-panel-combobox .time-picker-panel-select ul li.time-picker-panel-select-option-disabled:hover{color:var(--f-text-07)}.time-picker-panel .time-picker-panel-inner .time-picker-panel-combobox .time-picker-panel-select:last-child{border-right:0}.time-picker-panel .time-picker-panel-inner .time-picker-panel-combobox .time-picker-panel-select:hover{overflow-y:auto}.time-picker-panel .time-picker-panel-inner .time-picker-panel-combobox::after,.time-picker-panel .time-picker-panel-inner .time-picker-panel-combobox::before{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.calendar-time-picker{display:block;height:228px;width:100%;background:var(--f-neutral-20)}.calendar-time-picker .calendar-time-picker-panel{z-index:9999;width:100%;color:var(--f-text-04)}.calendar-time-picker .calendar-time-picker-panel .calendar-time-picker-inner{position:relative;display:inline-block;width:100%;overflow:hidden;font-size:14px;line-height:1.5;text-align:left;list-style:none;background:var(--f-neutral-20);background-clip:padding-box;outline:0}.calendar-time-picker .calendar-time-picker-panel .calendar-time-picker-inner .calendar-time-picker-combobox{width:100%;display:flex}.calendar-time-picker .calendar-time-picker-panel .calendar-time-picker-inner .calendar-time-picker-combobox .calendar-time-picker-column-3 .calendar-time-picker-select{width:33.33%}.calendar-time-picker .calendar-time-picker-panel .calendar-time-picker-inner .calendar-time-picker-combobox .calendar-time-picker-select{position:relative;flex:1;height:226px;overflow:hidden;font-size:14px;border-right:1px solid var(--f-neutral-08)}.calendar-time-picker .calendar-time-picker-panel .calendar-time-picker-inner .calendar-time-picker-combobox .calendar-time-picker-select ul{width:100%;max-height:206px;margin:0;padding:0;list-style:none}.calendar-time-picker .calendar-time-picker-panel .calendar-time-picker-inner .calendar-time-picker-combobox .calendar-time-picker-select li{color:var(--f-text-02);height:2rem;margin:0 6px;line-height:2rem;border-radius:6px;text-align:center;list-style:none;cursor:pointer;transition:all .3s;-webkit-user-select:none;-moz-user-select:none;user-select:none}.calendar-time-picker .calendar-time-picker-panel .calendar-time-picker-inner .calendar-time-picker-combobox .calendar-time-picker-select li:hover{color:var(--f-theme-03)}.calendar-time-picker .calendar-time-picker-panel .calendar-time-picker-inner .calendar-time-picker-combobox .calendar-time-picker-select li:last-child::after{display:block;height:202px;content:""}.calendar-time-picker .calendar-time-picker-panel .calendar-time-picker-inner .calendar-time-picker-combobox .calendar-time-picker-select li.calendar-time-picker-select-option-selected{color:var(--f-theme-03);background:var(--f-aid-02)}.calendar-time-picker .calendar-time-picker-panel .calendar-time-picker-inner .calendar-time-picker-combobox .calendar-time-picker-select li.calendar-time-picker-select-option-disabled,.calendar-time-picker .calendar-time-picker-panel .calendar-time-picker-inner .calendar-time-picker-combobox .calendar-time-picker-select li.calendar-time-picker-select-option-disabled:hover{color:var(--f-text-09);background:#f8f9fa;cursor:not-allowed}.calendar-time-picker .calendar-time-picker-panel .calendar-time-picker-inner .calendar-time-picker-combobox .calendar-time-picker-select:hover{overflow-y:auto}.time-picker-overlay{top:0;bottom:0;left:0;right:0;position:fixed;z-index:8888;display:none}.time-picker-overlay .time-picker-panel-box{top:0;left:0;height:100%;width:100%;position:absolute;z-index:8888;flex-direction:column;min-width:1px;min-height:1px;transform:translate(0,0)}.input-group .input-group-append.f-cmp-iconbtn-wrapper{align-items:center;background:var(--f-neutral-12)}.input-group .input-group-append.f-cmp-iconbtn-wrapper .f-cmp-iconbtn{background:var(--f-neutral-12);cursor:pointer;padding:0 .5rem;color:var(--f-text-08)}.input-group .input-group-append.f-cmp-iconbtn-wrapper .f-cmp-iconbtn:hover{color:var(--f-theme-05)}.input-group .input-group-append.f-cmp-iconbtn-wrapper .f-cmp-iconbtn:active{color:var(--f-theme-03)}.input-group .input-group-append.f-cmp-iconbtn-wrapper .f-cmp-iconbtn .f-icon{font-size:.75rem}.f-component-timepicker .timepicker-btn{padding:0 .5rem;color:var(--f-text-07)}.f-component-timepicker .timepicker-btn:hover{color:var(--f-theme-05)}.tooltip{position:absolute;z-index:1070;display:block;margin:0;line-height:1.4286;text-align:left;text-align:start;text-decoration:none;white-space:normal;font-size:.75rem;opacity:0}.tooltip.show{opacity:1}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:rgba(var(--f-neutral-00-rgb),.4)}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:rgba(var(--f-neutral-00-rgb),.4)}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:rgba(var(--f-neutral-00-rgb),.4)}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:rgba(var(--f-neutral-00-rgb),.4)}.tooltip-inner{max-width:18.75rem;max-height:6.25rem;overflow:hidden;padding:.5rem .625rem;color:var(--f-text-02);text-align:left;box-shadow:0 2px 8px 0 rgba(0,0,0,.15);border-radius:6px}.tooltip-inner-lg{max-width:37.5rem;max-height:initial;overflow:initial}.f-tooltip{position:absolute;display:none;padding:.25em .5em;max-width:12.5em;line-height:1.2rem;border-radius:5px}.f-tooltip-left,.f-tooltip-right{padding:0 .6em}.f-tooltip-bottom,.f-tooltip-top{padding:.6em 0}.f-tooltip-bottom-left,.f-tooltip-top-left,.f-tooltip-top-right{padding:0}.f-tooltip-default{color:var(--f-text-02);border:1px solid var(--f-neutral-00)}.fv-grid-hierarchy-cell,.fv-tree{border-style:solid;border-width:1px}.f-tooltip-text{padding:.5em .3em;white-space:pre-line;border-radius:3px;box-shadow:0 2px 8px 0 rgba(0,32,74,.15)}.f-tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid;border-width:1em}.f-tooltip-right .f-tooltip-arrow{top:50%;left:0;margin-top:-.5em;border-width:1em 1em 1em 0;border-right-color:var(--f-neutral-00)}.f-tooltip-left .f-tooltip-arrow{top:50%;right:0;margin-top:-.5em;border-width:1em 0 1em 1em;border-left-color:var(--f-neutral-00)}.f-tooltip-bottom .f-tooltip-arrow,.f-tooltip-top .f-tooltip-arrow{left:50%;margin-left:-.5em;border-width:1em;border-top-color:var(--f-neutral-00)}.f-tooltip-top .f-tooltip-arrow{bottom:0;border-bottom-width:0}.f-tooltip-bottom-left .f-tooltip-arrow,.f-tooltip-top-left .f-tooltip-arrow{left:10px;margin-left:-.5em;border-bottom-width:0}.f-tooltip-top-left .f-tooltip-arrow,.f-tooltip-top-right .f-tooltip-arrow{bottom:0;margin-bottom:-.5em}.f-tooltip-bottom-right .f-tooltip-arrow,.f-tooltip-top-right .f-tooltip-arrow{right:10px;margin-right:-.5em;border-bottom-width:0}.f-tooltip-bottom .f-tooltip-arrow{top:0;border-top-width:0}.f-tooltip-bottom-left .f-tooltip-arrow{top:0}.f-tooltip-info.f-tooltip-top-left .f-tooltip-arrow,.f-tooltip-info.f-tooltip-top-right .f-tooltip-arrow{border-top-color:rgba(var(--f-neutral-00-rgb),.9)}.f-tooltip-info.f-tooltip-bottom .f-tooltip-arrow{border-bottom-color:rgba(var(--f-neutral-00-rgb),.9)}.f-tooltip-info.f-tooltip-right .f-tooltip-arrow{border-right-color:rgba(var(--f-neutral-00-rgb),.9)}.f-tooltip-info.f-tooltip-left .f-tooltip-arrow{border-left-color:rgba(var(--f-neutral-00-rgb),.9)}.f-tooltip-info .f-tooltip-text{box-shadow:0 2px 8px 0 rgba(0,32,74,.15)}.f-tooltip-danger .f-tooltip-text{color:var(--f-semantic-danger-01);background-color:var(--f-semantic-danger-03);border-color:var(--f-semantic-danger-02)}.f-tooltip-danger.f-tooltip-top .f-tooltip-arrow,.f-tooltip-danger.f-tooltip-top-left .f-tooltip-arrow{border-top-color:var(--f-semantic-danger-02)}.f-transfer{padding:.125rem;border:1px solid var(--f-neutral-06);border-radius:6px}.f-transfer .option-pane,.f-transfer .option-pane-content .columns-box{padding:0}.transfer-search-box{margin:.75rem .875rem}.f-transfer .transfer-search-box .f-cmp-inputgroup .input-group,.f-transfer .transfer-search-box .f-cmp-inputgroup .input-group>.form-control:not(:last-child){border-radius:6px}.f-transfer .transfer-search-box .f-cmp-inputgroup .input-group>.input-group-append{border-radius:0 6px 6px 0}.f-transfer .transfer-search-box .f-cmp-inputgroup .input-group>.input-group-append>.input-group-clear{border-radius:6px!important}.f-transfer .option-pane .option-pane-group{padding:.375rem 0}.f-transfer .option-pane .f-transfer-list-item{padding:.375rem .875rem;cursor:default;margin:0;border-radius:0;color:var(--f-text-03)}.f-transfer .option-pane .f-transfer-list-item .f-list-select{padding:0}.f-transfer .option-pane .f-transfer-list-item.f-un-select{color:var(--f-text-08)}.f-transfer .option-pane .f-transfer-list-item:not(.f-un-select):hover{background:var(--f-neutral-11)}.f-transfer .option-pane .f-transfer-list-item.f-listview-active{background:var(--f-neutral-10)}.f-transfer .option-pane .f-transfer-list-item .custom-checkbox{padding:0;margin:0;width:100%;overflow:hidden}.f-transfer .option-pane .f-transfer-list-item .custom-control-label{padding-left:1.375rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.f-transfer .selection-pane{border-left:1px solid var(--f-neutral-06);padding:0}.f-transfer .selection-pane .selection-pane-title{padding:.875rem .875rem .375rem;background:var(--f-neutral-10);color:var(--f-text-01);display:flex}.f-transfer .selection-pane .selection-pane-title>.selection-count{font-size:18px;margin:0 .25rem}.f-transfer .selection-pane .selection-pane-title>.selection-title-action{font-size:13px;color:#2a87ff;flex:1;text-align:right}.f-transfer .selection-pane .selection-pane-title>.selection-title-action>i{margin:0 .5rem}.fv-grid-hierarchy-cell{position:absolute;text-overflow:ellipsis;white-space:nowrap;top:0;padding:0 .75rem;display:flex;flex-direction:column;align-items:center;z-index:1;line-height:28px;border-color:transparent transparent #eaecf3;background-color:transparent;overflow:hidden}.fv-tree,.fv-tree-content,.fv-tree-content-primary{overflow:scroll;position:relative}.fv-tree{display:flex;flex-direction:column;border-color:transparent;flex:1;color:#424347;width:100%}.fv-tree-content{flex:1;display:flex;width:100%;z-index:0;background:#fff}.fv-tree-content-hover{cursor:pointer}.fv-tree-content-primary{flex:1}.fv-tree-data{height:100%;width:100%;position:relative;overflow:hidden}.fv-tree-data .fv-grid-hierarchy-cell{border:none}.fv-tree-node{left:0;width:100%;position:absolute}.fv-tree-node.selected,.fv-tree-node:active,.fv-tree-node:hover{left:0;position:absolute;background:#e7f1ff}.fv-tree-strip .fv-tree-node-odd{background-color:#fff}.fv-tree-strip .fv-tree-node-even{background-color:#f7f8fb}.fv-tree-node-hover{cursor:pointer;color:#424347;background:#edf5ff!important}.fv-tree-node-selected{color:#424347!important;background-color:#dae9ff!important}.fv-tree-node-cell{position:absolute;text-overflow:ellipsis;white-space:nowrap;top:0;padding:0 .75rem;display:flex;flex-direction:column;align-items:center;z-index:1;line-height:28px;border-style:solid;border-width:1px;border-color:transparent transparent #eaecf3;background-color:transparent}.fv-tree-data :first-child .fv-tree-node-cell{background:0 0;border-left:none}.fv-tree-node-cell-input{font-size:12px;height:12px;width:12px;border:1px solid #aeb5c6}.fv-tree-node-cell .f-icon.f-icon-checkbox-checked{color:#2a87ff!important}.fv-tree-node-cell .custom-control-input:checked~.custom-control-label::before{color:#2a87ff}.fv-tree-node-cell input[type=checkbox]{display:none}.fv-tree-node-cell input[type=checkbox]+label{position:relative;padding-left:18px;cursor:pointer;display:flex}.fv-tree-node-cell input[type=checkbox]+label::before{content:"\e304";font-family:FarrisIcons;position:absolute;left:0;top:0;color:#d8dce6}.fv-tree-node-cell input[type=checkbox]:indeterminate+label::before{content:"\e306";font-family:FarrisIcons;position:absolute;left:0;top:0;color:#2a87ff}.fv-upload-and-preview .ffileUploadAndPreview{font-size:13px}.fv-upload-and-preview .ffileUploadAndPreview-content-fill{flex-grow:1;flex-shrink:1;flex-basis:0;display:flex;flex-direction:column;overflow:hidden}.fv-upload-and-preview .ffileUploadAndPreview-content-fill .uploadAndpreview--header{flex-shrink:0}.fv-upload-and-preview .ffileUploadAndPreview-content-fill .uploadAndpreview--content{flex-grow:1;flex-shrink:1;flex-basis:0;overflow:auto}.fv-upload-and-preview .uploadAndpreview--header{display:flex;align-items:center;margin:0 0 9px;position:relative}.fv-upload-and-preview .uploadAndpreview--header .ffileupload--browser{position:absolute;margin:0;padding:0;left:1em;top:-9000px;width:calc(100% - 2em);opacity:0;font-size:0}.fv-upload-and-preview .uploadAndpreview--header .header--left-container{display:flex;align-items:center}.fv-upload-and-preview .uploadAndpreview--header .upload-container{height:44px;background:#FAFCFD;border:1px dashed #D8DFED;border-radius:6px;padding:0 22px;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:130px;display:inline-block;line-height:44px;align-items:center;max-width:160px}.fv-upload-and-preview .uploadAndpreview--header .upload-container.f-state-disabled{opacity:.6;cursor:default}.fv-upload-and-preview .uploadAndpreview--header .upload-container .upload-icon{color:#2F8AFF;font-size:18px;margin:0 10px 0 0}.fv-upload-and-preview .uploadAndpreview--header .header--right-container{margin-left:auto;min-height:44px;display:flex;align-items:center}.fv-upload-and-preview .uploadAndpreview--header .header--countInfo{min-height:44px;display:flex;align-items:center;font-size:14px}.fv-upload-and-preview .uploadAndpreview--header .header--countInfo .count{font-size:16px;font-weight:600;margin:0 6px}.fv-upload-and-preview .uploadAndpreview--content{margin-bottom:10px}.fv-upload-and-preview .uploadAndpreview--table td{border-left:none;border-right:none;vertical-align:middle!important;padding-top:12px;padding-bottom:12px}.fv-upload-and-preview .uploadAndpreview--table .td--hascheckbox{position:relative;padding-left:44px}.fv-upload-and-preview .smooth-dnd-ghost .td--hascheckbox .preview-checkbox,.fv-upload-and-preview .uploadAndpreview--table .td--hascheckbox .preview-checkbox{position:absolute;top:50%;margin-top:-8px;left:14px}.fv-upload-and-preview .uploadAndpreview--title-container{display:flex;overflow:hidden}.fv-upload-and-preview .uploadAndpreview--title-container .uploadAndpreview--right{align-self:center;flex:1 1 0;overflow:hidden}.fv-upload-and-preview .uploadAndpreview--right .item-content--title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;cursor:pointer}.fv-upload-and-preview .uploadAndpreview--right .item-content--title.no-preview{cursor:default}.fv-upload-and-preview .uploadAndpreview--title-container .ffilepreview--filetype-icon{width:28px;height:28px}.fv-upload-and-preview .uploadAndpreview--state-container p{margin:0;padding:0}.fv-upload-and-preview .uploadAndpreview--state-container .f-icon{font-size:18px}.fv-upload-and-preview .ffileupload--support-info .support-info--wrapper{padding:0 8px;margin:0 0 8px}.fv-upload-and-preview .ffileupload--support-info .support-info--wrapper li{color:#B4BCCC;margin:0;padding:0;display:inline-block}.fv-upload-and-preview .uploadAndpreview--date-container,.fv-upload-and-preview .uploadAndpreview--filesize-container{color:rgba(45,47,51,.45);font-size:12px}.fv-upload-and-preview .uploadAndpreview--state-container .f-icon{margin:0 8px 0 0}.fv-upload-and-preview .uploadAndpreview--nodata{padding:0 8px;margin:0 0 8px;color:#B4BCCC}.fv-upload-and-preview .uploadAndpreview--action-container{display:flex;flex-direction:row;align-items:center;min-width:90px;height:100%}.fv-upload-and-preview .uploadAndpreview--action-container .preview-btn{height:22px;width:22px;border-radius:16px;display:inline-block;padding:0;color:#2b87ff;text-align:center;border:none;margin:0 14px 0 0}.fv-upload-and-preview .uploadAndpreview--action-container .preview-btn[disabled]{color:gray;opacity:.5;cursor:not-allowed;background:#e6e6e6;border:1px solid #bdbdbd}.fv-upload-and-preview .uploadAndpreview--action-container .preview-btn:not([disabled]):hover{color:#fff}.fv-upload-and-preview .uploadAndpreview--action-container .preview-btn .f-icon{margin:0 auto;display:block;font-size:16px;position:relative}.fv-upload-and-preview .ffilepreview--filetype-zip{background-image:url(data:image/png;base64,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)}.fv-upload-and-preview .ffilepreview--filetype-xls{background-image:url(data:image/png;base64,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dGUAMjAxOS0xMi0yOFQwOTozMTo1NiswMDowMLhrE7kAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTktMDEtMDhUMTk6NDM6NTkrMDA6MDCdstIMAAAAIHRFWHRzb2Z0d2FyZQBodHRwczovL2ltYWdlbWFnaWNrLm9yZ7zPHZ0AAAAYdEVYdFRodW1iOjpEb2N1bWVudDo6UGFnZXMAMaf/uy8AAAAYdEVYdFRodW1iOjpJbWFnZTo6SGVpZ2h0ADUxMo+NU4EAAAAXdEVYdFRodW1iOjpJbWFnZTo6V2lkdGgANTEyHHwD3AAAABl0RVh0VGh1bWI6Ok1pbWV0eXBlAGltYWdlL3BuZz+yVk4AAAAXdEVYdFRodW1iOjpNVGltZQAxNTQ2OTc2NjM5OiA9twAAABN0RVh0VGh1bWI6OlNpemUAMjc5NTUxQgHjNFMAAABadEVYdFRodW1iOjpVUkkAZmlsZTovLy9kYXRhL3d3d3Jvb3Qvd3d3LmVhc3lpY29uLm5ldC9jZG4taW1nLmVhc3lpY29uLmNuL2ZpbGVzLzExOC8xMTg0MjYwLnBuZ1tLqmgAAAAASUVORK5CYII=)}.fv-upload-and-preview .ffilepreview--filetype-txt{background-image:url(data:image/png;base64,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)}.fv-upload-and-preview .ffilepreview--filetype-ppt{background-image:url(data:image/png;base64,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)}.fv-upload-and-preview .ffilepreview--filetype-pdf{background-image:url(data:image/png;base64,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)}.fv-upload-and-preview .ffilepreview--filetype-img{background-image:url(data:image/png;base64,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)}.fv-upload-and-preview .ffilepreview--filetype-doc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAAB3RJTUUH5AIKAwAGv1lbXAAAFbdJREFUeNrtW3mMXdV5/33n3vuW2d6sxgvjcTAYjMGBkuAxhOKUOEQlIaY0KSWRIpJGCWr7R6RUQlHVlGxNoipqI0VEURq1aiCKSUKWKhvQpHGJbbANGDBmDDbjsZnxrO/N8pb77j1f/7jbOefe92ZcKf9xpTvvvbN+5/ft55wB3nzefN58/oAPXXSP7/wKQ6+cwOLAIOzB9RD9g4DvAU4eVOgAOQ5g2YAQIABsdGdSJo4qsxpGxRGFrFcwCKW5SXxzWy9Ghy+B5/nwPA+u66JaraLeqMOxHczMTOP8G5MQK/Mobrkad++5+aKWa6+1YfGfHwHXqrDsPLy774P/o38r2IPrB1nKITTqm7lRHxRuI4dcHrAdQFjhQhIusPojG5MUVlobBVAGwapXQW4By0uLaDQ9NN0mGo066vW6KxmzolOcZcbM1OTk7Kf/9q/r/3vkKL71n99FV1c37r3r/Wta96oSlPvy99F50y64r53Cyn17qfM7T1whSn37qKf3VtjOVZTPl8CyByAHJEBEYCKAlMWysvSokAACgRUIKPzLzEpB2IEVcgkAEXD+ddzJZXz+XbvQX8jDlxLMDCklAG4SiaVGvV5ues2TCwsLB+bm5n502027x5586iCuuXobfv74Idz3wTv+/wAV/mU//OkpFHfdCn9qYrPYOHK/6C79JXKFEbLttAQQQNxaOsCrzahI22qcJQH/3Gn4Lx3F3TsuxxfeNYrBjgIks9EuANzzPNRqtdcr5fIjZ86c+ebIyOaJXz7+JDZt2oh73tcaJKslOF/7AXhlCYOf/QTqz7x8izW89Vuib/Ae5Au9IJG5msiuZOJAq4Nj2pnUb3UuAnixDDk9iRPT85heqeHG4fXoyjmZ4AohUCgUejs7O2/p7ukenZqaeuWeO9979vDRY/jQfR/FDx55eO0AdfzTo/DmJzH04CdQefjAHdbGLd+h7tIOCJFeiIGGanyJ9Pq4TnkjiVtVZAwQiQi8WAbPTIIYeOlCANLu4fXobAFSBFSxWBzu6Ojc++LJV8bev/e2U7/87e/wgfs+jp/t/16qfSZPS0+8Cn9pBby4cIu1acvDoqtnOLUGbjOCZpmNNmutU4Y3F0sh+v65M/BfOqrVfeDaK/DFvaPoK+ZT6mY+lUpl4vTp1z40ODBwYMNAH/pKvak2KQkqfuW7kA0XsjI/bA1v/ZboLu0I5HkN3KXkk3kVjbr4AMOYg8CVQIJifBl4eXoeU8s1jK4iSQBQyOdLOSe3/ZWxU4/PzJcrt93xXvx4//e1NsLsxNUVVD/+blgbRj5JXT2jDICZweDgM+NFRh2iPjD6Rt+l8htGH9brYI7LjOBr8Dt6CQzJjEePj+HvHz+EmWodgtpwggi9fX2jl1122f3vunk3LS2vtOej+PpPUezuAjxvm9hy5a+ps2skc+AsK9xO5dbyZMRI7SWQIM+dgTxxNHMoMPDBnVfgc3uzvVsyDGFxcXH8xRMn3p1znLHfvjGHf9x3e7YEDc6eg3PV9aCevn2UL4yYBjV+0aIMLdqv5TX60lraI7ssMvz7j5/CZ584jIVao6UkMTOKxeLIYH//vne8/Qbcyxe0eg2gpVwXavu/XaDuvlth2QmRJnuyPNHFLM58Zft+kfcjA0wyaGOlPuqz//kxfOZXBzFXa61utm2jr79/z+f+9RuFJ+odep2G1uAlEIPrBsmyr1LjmWjiyFZrwaBiv4kNPE0P1bI86MikDEjJ3KmuahnrdRwFq0r/Hxw/BcmML96+u2UwmXOcq25+2/VDAE20BIhKA2Aph+DkSwgHiUGKgFK5FVfoQEVgmZKnJZ4Z8RMneUkCAmtD6NhmBKVqXKVq7g+PvwqLCA/u3YWhzqIGEjOjUCiUSv0Dg45laQBpKsa+B65XRyBljyrirIq7Ksasv1mqEzsZGHUw2skWY0CfNxqPDPo4q68RjH7/uTH8w68PYy7Du0kpu6sr1RHpeVq5rmK5PKTbGADgkMmdVhGzEslpUxoSpAZ8WoAdSZahNpQaMO3VyFAV9acmaXGeTHj0+VMAgC+9Z7cWTBKRQ0Qb+rs7WwPE+Q7AdXNMItYpbmVHoK+KZZhamE9G8prKLjLSDVbQjINOjUkUSk22+9a2Vowmjx4PQPrC7aMYCG2SEAKObfdt2bSxNUBk5wAnj2jLQc2r0nFJImJsFGVxO3uMVSoUNVMlTqs0bVRG6sKs5IUhevufGwMz4/O3j2KoswgigmVZHULoyYW+YSYstHLvLYO2jJQis22WJBpcjj3QWsYDoIu3CaBBX8a4jz4/BgLh8+8ZRV/egUXkmG2MHUVK3rZuucUKWJdqdb8LJhczxiNew1zqnGYMcBFPNM3+58YgCHhw79vhiHTqZQAUyXOGCLUjxKizCBAEeBKQbBj6NkPYFLhVV2qmJrufjIBnCCIQAf5FgZXo3/5nx+D7Pu7a1J0SVh2geFIDZqmP2eqRDFzZZeHv3tKBXltgvObjK2eqmHGl0i09iATwvnU53LOhgBwRDpabeOhsFXVpqBzpk8meQey5+SZ87NIiHEH4xUwD332j3haPVoD/xGUcfHEWZ/VA2gAo8gqcNoBam1Y8YSAH4N0DOfQ5Aj4DT865+K/pBuw2MUCOgL9YX8CdQ3kAwI0lG4/PNnB80YOVpXLhInMdnbjn6g24e2PQ79TrNcBfTutJSzFU6qWP8xN19F0OqNmYPpbkOGhTAzANszYvAThb9fHysg8gULXrugOjr7VVAkhfApsLFm7oSXjVawtc02lDxtsa6f6SgUGHMFoKvI4rGc+UXfg+g/1wOyV+ZfCZKg9fX4J9CeLgBAutAFKj3azINBUNR4lmlGxKYKHJeHLWjce8seSgIFpEuhKQEtjaYWFdLiFFUNDPYmoZHUsGLita2JAPAJpqSLyw2ITIoCvRDLNMeWF8zwKIVDbJDNbJ4I02vLRVKxtnR8ouqqHFvLLLwuaClbTP2OS6seQgJ3S7dEPJRr9DQT+Zpocl463dNrpD3T1cbmKqJiFMDsftDe6bqhGP3wYgU1oicY7HDFWDpOJlDU4IAC8veThfD9RsU8HC20o2pMk5GXx0CMLO7kC95lyJGTfwCFs6LIwUrCSpjOYKacgRcGNvErb8bs5F1ZPZEhHlY62kR20nNUQMFWNKsnYZNlYmMBNGyPRvwcCFusRTc81AKgG8reTAUgENv0sJDOUErg4Beq7i4ffzgXr2OQJ7BnMak0gmjOq3BbZ3JcAeW2hCMOmCYXjlWKgiOysNQUPisLMlCGF6oUAaSEqyh5yIl7JiRZRYMlyf8ft5FzIk7LoeB902YjFmpe2OzsT+PDnTwE8mG3G/P+qxURAUq250CiuZcX2Pja2dgf15bcXHeNUHKdwiZY54/xrJvnZMR0wPMhEytjsY0mfAR+zNmFnnhIzYz6HdUsQ3jFsEgGPlZqwul3dauKzDgm+IOIHxjoEcChah6ge263ilibmw384eB0MOBTRpcwNvjcEDjiy4KLsSIqJHkZCANtbmzTIpMWhtJaiFB2NDaLQ6JSyI7BwxMFH1cXIp8Jm9jsA13Y7u5iXQZQns7AnsyETVx+llH+MrPsaWg34bCwI7ux3NfjEDBQHs6ssBAGo+479nXPiK+pl2N1qbWhcrgtTXwP4aAIpFWvVWiheJxV1RGQ49UiTeS02JZ0J7IgjYO5RHjnQ1uyQnsK0rUJNXlj3M1iWqnsQzC4H9KliEWwdzEIR4DikZ6/MC20L7c67m4/lyM/Bemsok9GheUIl/ojJSVaytF4tdqil+qnol31NeTCZSxpLx5EwDy14w4/ZuGwMOxRz1JWNHt411+YCEw/Mu6p6ELxlH5l14kR3qddBjUSIVknFFp42NxaDfs+Umput+EIyqRlcmv9V1Zx1/x2tfFSAzk1dsS5brNNVRCwWYcHLRw0Q1kNktnRYu77IDOyQBkoQdPTYcQaj5jBcqXkzQ0/MuTq8Evy/vsnFpwVK8JOGWgRzyIvC4h+ZcNPwWDFXpl2l6VTMRcbatiiVeKpQiaShsRrBHMYuS38QMAcZs3cfRhUDNOizC7v5ccCOIGb0O4Z1h7vXqsofnF1xYCOzXhZrES5VAzYZyAtf3OpChF+20gF0Dgf2Zrkv8z7SrB7hZwZkR6KbWAQPQVgDFiwXSHTVLbb7ZdZ7PODTrxkP+8VAOHSKIfzYUBLaG9uflRQ8LDRnHWw1P4mCYrhABu/odOCF/RooWrgj7nVxs4lzVCxbRSnK4zRtrSQKUuVlhSJCx2AyxXI1ZOpGEYwtNLIRue1uXjU15C57PuLbkYCjMo56ec9Hwkn4E4Nh8E4vNgOh3DOWxLicgfcaV3TYGw37PzDex6LJGVztAtG2uDNVTopdsgPQUJrw6YHgAUtSIJMfizan8LRh8bLGJo6E3u6QgsK3HBgG4tmTDImDZY7yw0NTURDDw6pKHc9XADm0qBvZLEHDbJXnYFGTvv59pxF42oAd68Mc6PVEeqYbz0eUIioSjnYrFjwwmSxnnWCQzpMuIVaJEdLnJeDpUl5wgjPbn0O8Q9qwL7M9kzcdry804yIvUbKbm4zcXGgCALptwfV/gzd4a5l+vr/h4qRL2i+lJS3+STiiHEGFbNd3gqO+qcZC5q4jWiV6cPCqoR8lsTJhkHJx1UQ+z++v6HGzvdjDSEcQxh2ddTNeCHceIYADwJOOZWTfeRt01kMPVJQeXhfHP4RkX51f8tP1R6YlMqhIIqu20LIDT604DFG9nJKOTEiwmd3QUjxehIpX2ikILACfLTYyvBKzZ2ZvDn28uoi/Mvw7PNtDwElWIglMB4NkFF9PhrsD2koO96/PocYINjYOzDXhSCWiVXC0yAVA+Yy9rbNMwDE+MdgAhCqQ4MdjqkXCsVqooJ4Oq5dEOIzEwU/fxQuju+3OEO4eLsAVQdiWOzzeDOQ0uCgDnV3y8WA7c/dYuCx+/vAsWAfMNiWfn3HCxxpG1ZC2P1rY7DJ5G5ZGkr7rdASNXgQlsyj22ULvoe1hf9xi/OF+HZMAWhOGOwAudr/oYX/aSXUCVgQwsuxK/mQzskCMIQ4WA3FcqTZxe8iDCoNa0gyzT9Jhbtmpgq85pbnfoR8+KXYm3uZWTjUjzUk9UoR5rGjbs+XkX8w2JwULCk+PzTczWJaIsOrnhERzjMAPH5lzUfEZR2b1/arqBRVeCwmOb4EK6ogLMYDOiUUKImNzwMzq7T3YeWwAU62iYiEYHfdHWcOr+j0IURaoXXfkNV8wIktXXFj08fHoF7xsuwiJgsSnx07NVeJIhzMsLCFRcADi+0MCPx6vYvS4PAjCx4uPR8WpYb7pYZV7lQE4912elHau0q+raDiAog2noRgAqW2pkzErKEBrdFETHn322jK+fWIJFgdrNNWTshbSDGeUIulyX+JtDC+jLBceeS55EpRnESoGckAYsiGINiE0EQuGOpCNEh8K2KmCrShCzhIh235AQyoZsxtdjVLHKOlsPCSMArs94Yzk5Vwn/pUNrqgIbaWytKVFtSr1NPBcbR9ot6FHGTEBgjflgZhjHPsbJKgeJErM+uDmRBkIkZlG3SPwSzqjfM4+h9S56eVilgaBJdfI9kqh43ZwxbFSmShQi0Eii0g4gzwc8P33XJyOAijnMOhiJEiqLNjRX/b+NyGyxSrgCBJugqtf+UvTo6p6aW725JZVpKGCsBFxe0O9K616s6QKNBiAlWFhpKlQCgUwio0WZUhDXQeEcKU00exd+kRnTZEneKvSoIGngRvNHWzu+V/XnJ7XuOkBuFWjWmsnWXMYjk4FNl6lhwcoQRqXmDTmrCafVTiJbDcNyTVg5JYhJTJQmJ4yhJNj3F2RlpjVAaDYA8CwkNyHhqChTyOE4ZyJ9Qm3x1AKcKGiLxpRacVoizEWwTo8qkS0vX3G6jk2aAh1vgnmKXf12iHHDzAZyHeMgsQRGfzxJNI4yaOzSIyLDH2xKiwFm3N+8P6h6RkOAzABVtS8xHQZDYlLVS6YqSEqfoIlYomDtrQGSi/MAeNbqGqigYPersYSxlpShjKIjU6o0YBWumtISf1VVxuxn0BOVxTGMOS+QCu2yxyTArZfl0vwMGXqs7yguXoA8f2IGXvNkkr8kEaZ5/BzPHBHIyu/wjfd4dAEKPhVPkpVImglnVvLJBlrm8baeJ3JcHjvSqNz3TsqJE7OyMt0aoOLkJHJ7Plbn6uKB+KKMeQ9YiTFSyWvGGwMXn3LqIKntTCDNDJxMQMKKmB65Gj2UeEx1Xt8DVysHnHf+VZ2Wy60BWrr2Ovinj4Kr5R9yszEeERxfgJKUXAow6YwuGJjlioibZ2iZ7cKG6vlBzBuG7pEkpY+lAG0TTFNvg6ExPc3GOFfLP5JnjsB/yxWtAcKD+8Bzp+F+ad8pVBe/B+mnFkbq6FGlom+xSsb3cVQQVbYhOaxT9UlxaalNL+KU5KmXLSgGNyGYkdCTGHdlHt8D1xYfcb+0b0zOnoZ88M/aAASAckXkHniMee7sQ7xSOZQsijUAEuQSohKbobRTN/1VUVINhaYGUT8ds1jq1IMBgx42xkwdQCg7n9FmEFcXD8nZsw/lHngMyHUghQcynuJXj0G6K+Bq+RYa3PwwFbqHTXGPo3rDvWqjqnELjPYtZ1f6tqA0M9DLCBv0Ok4CuWiM+tIEz018CIWeA8LpRP2BG1JkZJ5qeFMvwR8/BDH63gNy4fz9XFuaMA8SW55BaVKCNke+nH2HsNVr7hKq4GR4t9g2IWscBteWJnj+jfvtm+44wGefhj/zYiafMv9vXh58DPaeD0OefAr5P7n3lD925AhZznZYuUtjTCPP0lICKFWpJ5CkjZO6ExA3YZj/cpACh1rMoTngkB7pg2uVQyifv1+M/ukT3s8fAnX2ofm1j2RO0U7I4XzqP4DlC6CR3UDljWGULv0kij33kp3fAsvWR+EWamTOZKoYI0NnWrRHRt+slZh1DEB6gbdqLH2PF849JEobzsqJQ6CudXBbgLMqQACQ+/S/A307gaVx4Mt3gT/z2DbK9+5DsXQrCfsqtvMlQPYQ4ABCySHU1asPr21qimIcyt6EYxVZNb+IY4gmQEvwGhVI7yTqSwe4Wvmh++X3n3Ie+AlbXVvgL76A5lc/3J6M1QCKgfrUt0HNKmTpLRDrroH33MMFMbh9kLr7h7hZ3QzGBiKrl4RdZCAPZjueIXL50U48GeplhtmktE+VZ+DMAIg8AhosvRrYL4NoipziuFyen+X5sRnnho/U/Yln4S+8DnKK8L7+0TWte80Axc9XfoaO3x2Du3U9KD8E6ukPrqeLAkSxH9zRB5TWQ3QHai8QhzCBmQljfDXJjExSvKElEXQUYXkUfUeqHHkiP7HDsgLQwhTYXQDX5gG/DrIcyOU5oDELnJ0G79oB74G7LnrJbz5vPm8+f7Dn/wCP1QJfqEXQtgAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxOS0xMi0yOFQwOTozMTo1NiswMDowMLhrE7kAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTktMDEtMDhUMTk6NDM6NTkrMDA6MDCdstIMAAAAIHRFWHRzb2Z0d2FyZQBodHRwczovL2ltYWdlbWFnaWNrLm9yZ7zPHZ0AAAAYdEVYdFRodW1iOjpEb2N1bWVudDo6UGFnZXMAMaf/uy8AAAAYdEVYdFRodW1iOjpJbWFnZTo6SGVpZ2h0ADUxMo+NU4EAAAAXdEVYdFRodW1iOjpJbWFnZTo6V2lkdGgANTEyHHwD3AAAABl0RVh0VGh1bWI6Ok1pbWV0eXBlAGltYWdlL3BuZz+yVk4AAAAXdEVYdFRodW1iOjpNVGltZQAxNTQ2OTc2NjM5OiA9twAAABN0RVh0VGh1bWI6OlNpemUAMjgzMDU1Qum3qxEAAABadEVYdFRodW1iOjpVUkkAZmlsZTovLy9kYXRhL3d3d3Jvb3Qvd3d3LmVhc3lpY29uLm5ldC9jZG4taW1nLmVhc3lpY29uLmNuL2ZpbGVzLzExOC8xMTg0MjQ4LnBuZybzQKIAAAAASUVORK5CYII=)}.fv-upload-and-preview .ffilepreview--filetype-any{background-image:url(data:image/png;base64,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)}.fv-upload-and-preview .ffilepreview--filetype-wps{background-image:url(data:image/png;base64,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)}.fv-upload-and-preview .ffilepreview--filetype-wpt{background-image:url(data:image/png;base64,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)}.fv-upload-and-preview .ffilepreview--item-icon{margin:0 .625rem 0 0}.fv-upload-and-preview .ffilepreview--filetype-icon{display:inline-block;width:38px;height:38px;background-repeat:no-repeat;background-position:0 0;background-size:cover}.fv-upload-and-preview .smooth-dnd-ghost.uploadAndpreview--preview-item.smooth-dnd-draggable-wrapper{background-color:#dae9ff}.fv-upload-and-preview .upfile-drag-handle{position:relative;top:-2px;margin-right:5px;cursor:grab}.fv-upload-and-preview .upfile-drag-handle:active{cursor:grabbing}.fv-upload-and-preview .upload-progress{display:inline-block;font-size:.875rem;color:rgba(0,0,0,.65)}.fv-upload-and-preview .upload-progress.upload-progress-line{position:relative;width:100%}.fv-upload-and-preview .upload-progress.upload-progress-line .upload-progress-text .upload-progress-text-icon{font-size:1.25rem}.fv-upload-and-preview .upload-progress .upload-progress-outer{display:inline-block;width:100%}.fv-upload-and-preview .upload-progress .upload-progress-inner{position:relative;display:inline-block;width:100%;overflow:hidden;vertical-align:middle;background-color:#efefef;border-radius:100px}.fv-upload-and-preview .upload-progress .upload-progress-bg,.fv-upload-and-preview .upload-progress .upload-progress-success-bg{position:relative;border-radius:100px;height:6px;transition:all .4s cubic-bezier(.08,.82,.17,1) 0s}.fv-upload-and-preview .upload-progress .upload-progress-success-bg{position:absolute;top:0;left:0}.fv-upload-and-preview .upload-progress .upload-progress-text{display:inline-block;width:1.75rem;margin-left:.5rem;color:rgba(0,0,0,.65);font-size:1em;line-height:1;white-space:nowrap;text-align:left;vertical-align:middle;word-break:normal}.fv-upload-and-preview .upload-progress.upload-progress-status-active .upload-progress-bg::before{position:absolute;top:0;right:0;bottom:0;left:0;background:#fff;border-radius:.625rem;opacity:0;animation:upload-progress-active 2.4s ease-in-out infinite;content:""}.fv-upload-and-preview .upload-progress-show-info .upload-progress-outer{padding-right:48px;margin-right:-48px}@keyframes upload-progress-active{0%{width:0;opacity:.1}20%{width:0;opacity:.5}100%{width:100%;opacity:0}}.fv-upload-and-preview .uploadAndpreview--action-container .preview-btn{color:var(--f-theme-03)!important;background:var(--f-aid-02)!important}.fv-upload-and-preview .uploadAndpreview--action-container .preview-btn:not([disabled]):hover{background:var(--f-theme-05)!important}.fv-upload-and-preview .uploadAndpreview--action-container .preview-btn:not([disabled]) .f-icon:hover{color:#fff;width:22px}.fv-upload-and-preview .uploadAndpreview--table .uploadAndpreview--currentfile{background-color:var(--f-aid-02)}.fv-upload-and-preview .uploadAndpreview--table .uploadAndpreview--currentfile .preview-btn{background-color:var(--f-aid-03)}.f-verify-list .list-icon,.f-verify-nums .nums-count,.f-verify-nums .nums-icon{color:var(--f-semantic-danger-01)}.f-verify-list .list-warning{color:var(--f-semantic-warning-01)}.f-verify-detail{position:absolute;left:14px;bottom:16px;z-index:900}.f-verify-detail .f-verify-detail-content{position:relative}.f-verify-detail .f-verify-detail-content .f-verify-form-main{position:absolute;padding-bottom:.5rem;left:0;bottom:1.75rem;width:28.125rem}.f-page-has-query .f-page-header .f-page-header-base,.f-page-has-scheme .f-page-header .f-page-header-base,.f-verify-detail .f-verify-detail-content .f-verify-form-main .f-verify-form-content .f-verify-form-content-list .f-verify-forms-title{padding:.75rem .875rem}.f-verify-detail .f-verify-detail-content .f-verify-form-main .f-verify-form-content{border-radius:.125rem;width:100%}.f-verify-detail .f-verify-detail-content .f-verify-form-main .f-verify-form-content .f-verify-form-content-arrow{display:block;position:absolute;left:1.125rem;bottom:.25rem;width:.625rem;height:.625rem;background:0 0;border-style:solid;border-width:.3125rem;transform:translateX(-50%) rotate(45deg)}.f-verify-detail .f-verify-detail-content .f-verify-form-main .f-verify-form-content .f-verify-form-content-list{position:relative}.f-verify-detail .f-verify-detail-content .f-verify-form-main .f-verify-form-content .f-verify-form-content-list .f-verify-close{position:absolute;right:.75rem;top:.625rem;font-size:.75rem;cursor:pointer;width:1.25rem;height:1.25rem;line-height:1.25rem;text-align:center}.f-verify-detail .f-verify-detail-content .f-verify-form-main .f-verify-form-content .f-verify-form-content-list .f-verify-forms-list{overflow-y:auto}.f-verify-detail .f-verify-detail-content .f-verify-form-main .f-verify-form-content .f-verify-form-content-list .f-verify-forms-list .f-verify-list-content{display:none}.f-verify-detail .f-verify-detail-content .f-verify-form-main .f-verify-form-content .f-verify-form-content-list .f-verify-forms-list .f-verify-list-content.active{display:block}.f-verify-detail .f-verify-detail-content .f-verify-form-main .f-verify-form-content .f-verify-form-content-list .f-verify-forms-list .f-verify-list{cursor:pointer;position:relative;padding:.5rem .875rem .5rem 2.5rem}.f-verify-detail .f-verify-detail-content .f-verify-form-main .f-verify-form-content .f-verify-form-content-list .f-verify-forms-list .f-verify-list .list-icon{position:absolute;left:.875rem;top:.75rem;font-size:.875rem}.f-page,.f-page-root{top:0;bottom:0;right:0;left:0;overflow:hidden;position:absolute}.f-verify-detail .f-verify-detail-content .f-verify-form-main .f-verify-form-content .f-verify-form-content-list .f-verify-forms-list .f-verify-list .list-con p{margin-bottom:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.f-verify-detail .f-verify-detail-content .f-verify-form-main .f-verify-form-content .f-verify-form-content-list .f-verify-forms-list .f-verify-list .list-con .list-title{font-size:.875rem;line-height:1.375rem}.f-verify-detail .f-verify-detail-content .f-verify-form-main .f-verify-form-content .f-verify-form-content-list .f-verify-forms-list .f-verify-list .list-con .list-msg{font-size:.75rem;line-height:1.25rem}.f-verify-detail .f-verify-nums{padding:.125rem .5rem;cursor:pointer}.f-verify-detail .f-verify-nums .nums-icon{margin-right:.25rem;vertical-align:middle}.f-verify-detail .f-verify-nums .nums-count{font-size:.875rem;line-height:1.25rem}.f-verify-detail .f-verify-detail-content .f-verify-form-main .f-verify-form-content{background:var(--f-neutral-20);box-shadow:0 2px 8px 0 rgba(var(--f-neutral-15),.15)}.f-verify-detail .f-verify-detail-content .f-verify-form-main .f-verify-form-content .f-verify-form-content-arrow{box-shadow:2px 2px 5px rgba(var(--f-neutral-15),.08);border-color:transparent var(--f-neutral-20) var(--f-neutral-20) transparent}.f-verify-detail .f-verify-forms-title .btn-group{border-radius:14px;padding:3px;background:var(--f-aid-04)}.f-verify-detail .f-verify-forms-title .btn-group .verify-title-btn{color:var(--f-text-02);border:1px solid var(--f-neutral-08);background:var(--f-neutral-12);box-shadow:0 4px 10px 0 rgba(var(--f-neutral-15),.06);margin:0;border-radius:0}.f-verify-detail .f-verify-forms-title .btn-group .verify-title-btn:first-child{border-radius:14px 0 0 14px}.f-verify-detail .f-verify-forms-title .btn-group .verify-title-btn:last-child{border-radius:0 14px 14px 0}.f-verify-detail .f-verify-forms-title .btn-group .verify-title-btn.disabled{color:var(--f-text-07);border-color:var(--f-neutral-05);background:var(--f-neutral-08);box-shadow:none}.f-verify-detail .f-verify-forms-title .btn-group .verify-title-btn+.verify-title-btn{margin-left:-1px}.f-verify-detail .f-verify-forms-title .btn-group .verify-title-btn.f-state-selected{color:var(--f-text-00);border-color:var(--f-theme-03);background:var(--f-theme-04);box-shadow:0 4px 10px 0 rgba(var(--f-theme-03),.2)}.f-verify-detail .f-verify-forms-title .f-verify-close{color:var(--f-text-07)}.f-verify-detail .f-verify-forms-list .f-verify-list-content{padding:0 18px}.f-verify-detail .f-verify-forms-list .f-verify-list-content .f-verify-list{border-top:1px dotted var(--f-neutral-05)!important;padding:.5rem .875rem .5rem 2.5rem}.f-verify-detail .f-verify-forms-list .f-verify-list-content .f-verify-list:last-child{border:none}.f-verify-detail .f-verify-forms-list .f-verify-list-content .f-verify-list .list-icon{color:var(--f-semantic-danger-01)}.f-verify-detail .f-verify-forms-list .f-verify-list-content .f-verify-list .list-icon.list-warning{color:var(--f-semantic-warning-01)}.f-verify-detail .f-verify-forms-list .f-verify-list-content .f-verify-list .list-con .list-title{font-size:.875rem;color:var(--f-text-02);line-height:1.375rem}.f-verify-detail .f-verify-forms-list .f-verify-list-content .f-verify-list .list-con .list-msg{font-size:.75rem;color:rgba(var(--f-text-06),.9);line-height:1.25rem}.f-verify-detail .f-verify-nums{border-radius:6px!important;background:var(--f-semantic-danger-03);box-shadow:0 2px 8px 0 rgba(var(--f-neutral-15),.15)}@font-face{font-family:FarrisIcons;font-style:normal;font-weight:400;src:url(data:font/ttf;base64,AAEAAAALAIAAAwAwR1NVQiCLJXoAAAE4AAAAVE9TLzI2JE+JAAABjAAAAGBjbWFwTohH7gAAC/AAACWUZ2x5ZqfrFDEAADaIAAH0DGhlYWQnvvaKAAAA4AAAADZoaGVhCNUHTgAAALwAAAAkaG10eApz/50AAAHsAAAKBGxvY2GWVxNEAAAxhAAABQRtYXhwA6wBEAAAARgAAAAgbmFtZchH0mwAAiqUAAACi3Bvc3QSpDltAAItIAAAK3cAAQAAA4D/gABcBVX/9v/3BQAAAQAAAAAAAAAAAAAAAAAAAoEAAQAAAAEAAGP+/t1fDzz1AAsEAAAAAADh1NlIAAAAAOHU2Uj/9v9xBQADjAAAAAgAAgAAAAAAAAABAAACgQEEACEAAAAAAAIAAAAKAAoAAAD/AAAAAAAAAAEAAAAKADAAPgACREZMVAAObGF0bgAaAAQAAAAAAAAAAQAAAAQAAAAAAAAAAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQAGAAAAAQAAAAQEAgGQAAUAAAKJAswAAACPAokCzAAAAesAMgEIAAACAAUDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBmRWQAwOAA7LcDgP+AAAAD3ACPAAAAAQAAAAAAAAAAAAAAAAACBAAAAAQAAAAEAAAABAAAAAQAAAAEAP//BAD//wQA//8EAP//BAD//wQA//8EAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAQAABAD/+QQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAP/5BAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAP/2BAD/9gQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAD//wQAAAAEAP//BAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAP//BAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAD//wQAAAAEAAAABAD//wQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQA//kEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAD//wQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAD//wQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQA//8EAP//BAD//wQA//8EAAAABAD//wQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQA//8EAAAABAD//wQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQA//8EAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAP//BAAAAAQAAAAEAP//BAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAD//wQAAAAEAAAABAAAAAQA//8EAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEVQAABAAAAAQA//8EAAAABAAAAAQAAAAEAAAABAD//wQAAAAEAAAABAAAAAQAAAAEAP//BAAAAAQAAAAEAAAABEQAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQA//8EAAAABAAAAAQAAAAEkgAABJIAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAASSAAAEAAAABJIAAAQAAAAEAP//BAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAP//BAD//wQAAAAEAAAABAAAAAQAAAAEAP/9BAAAAAQAAAAEAAAABAD//wQA//8EAP/9BAD//wQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAREAAAEAP//BAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAP//BAD//wQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAP//BAAAAAQAAAAEAAAABAAAAAQA//8EAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQB//8EAP//BAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQ8AAAENf/+BAAAAAQA//8EAAAABAD//wQAAAAEAP//BAD//wQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQB//4ETgAABAAAAAVVAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAE/wAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAD//wQA//8EAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAAAAAFAAAAAwAAACwAAAAEAAAHMAABAAAAAAYqAAMAAQAAACwAAwAKAAAHMAAEBf4AAAA4ACAABAAY4DLhSeIO4wrlKuYr5kPmmua85tfnBegs6SLrGOs/60/rb+t/64nrqeu568nr2evp6/nsqey3//8AAOAA4QDiAOMA5QDmAOYt5kXmvObX5wDoAOkA6wTrGutB61HrceuB65rrsOvA69Dr4evw7KDssP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAOACcAS4BSgFeAbICCAI0At4C3gLeAugDQAOEA6wD9gQSBE4EagR6BJgEqgS8BM4E3gTwBQIAAAGPAGsAZgBhAoACfgJ/An0AZwBlAGIAZAJzAnECcgJwAngAYwBsAnwCegJ7AnkAbQBoAGkAagBeAA8AEQAVABMAEgBYAFMCdgJ3AnUBrwBSAFYAUQBZAF0AXwBgAFoCbwBOAFUCXgAEAE8AWwA5ABQAOgA9AAMBrwA/AFwASwJ0AEYAQgBKADwANwA7ADgAPgAKAAgABwBAACECawJsAEgCagHpAm0AKgHoAm4AIwAkACkAJgAWAA0AJQBBAEUATABJAEQARwAoACcAIAAiADYALgAvADIBsAA1Ak4ATQBDAAkCaQBXADQAFwAMADEALQAsADMAMAArAB0AGgAZAAsAHwAbABwAGAAeAAYABQAQAFAAVAGOAYUBiQGMAmgCZwHnAkkCQAGHAYsCSAJHAY0BiAGGAYoBfAGDAX8BgQGCAYABewGEAX4BfQF1AXMBcQFyAXkBdwF6AXQBeAF2AWoBbQFvAWcBaQFsAW4BcAFoAWsBZgFiAV0BZAFfAWEBYwFeAWUBYAFDAUgBSQFAAUIBRgFHAUUBQQFPAVABTQFLAU4BTAFEAVwBWgFbAVYBVAFXAVgBVQFZAVIBUwFKAVEBAAECAQEA/wD6ASYBPQEsATsBOQEvAPsBKgE0APwBBwEJAREBCgEIAQ0BBgEFAQ4BAwEQATMBIQEgAPUAkAE3ARkBMgD4AI4AigEkAI8AiwEXAP0BOgE+AT8BMQD+ARUBEwESAR8A+QEbARQBGAEaATUBIgDzASMBKwELARwBHgEoAScBJQEtATgBNgEEAQwBFgD3APIBKQD0AS4BMAE8AR0BDwCMAI0AngCXAJ8AkQCTAJ0AqACmAKAApwClAKsAnACWAJIAlACbAJoAlQCYAH4AfACjAKQAqgCtAK4AoQB9AIEAiQCHAIQAiACAAIYAhQB7AKkB5wD2AIIAfwCDAG4AegB5AHgAdwB2AHMAdAB1AHIAcQBvAHAArACiAJkA5gDsAOsA7gDpAOoA7wDnAOMA5ADwAO0A5QDoAPEA2QDbANoA4gDcAN4A3QDfAOAA4QDXANAA0wDRANYA1QDUANIAzwDYAMYAzADIAMkAxQDOAMoAxwDNAMsAwQDAAMMAvADCALsAxAC/AL0AvgCwALkArwC1ALQAtgCyALgAsQC6ALcAswJfAlwCYAJmAmUCZAJjAmICYQJdAlsCWgJZAlMCVgJRAlICVAJVAlcCWAJQAk8CTgJNAkwBsAJLAkoCRQJGAkECQgJDAkQCMQIwAj8CPgI9AjwCOwI4AjkCOgIzAjQCNQI2AjcCMgIvAi4CLQIsAisCKgIpAigCJwImAiUCJAIjAiICIAIhAh8CHgIdAhwCGwIaAhkCGAIXAhYCFQIUAhMCEgIRAhACDwIOAg0CDAILAgoCCQIIAgcCBgIFAgQCAwICAgECAAH/Af4B/QH8AfsB+gH5AfgB9wH2AfUB9AHzAfIB8QHwAe8B7gHtAewBrwHrAeoB5gHlAeQB4wHiAeEB4AHfAd4B3QHcAdsB2gHZAdgB1wHWAdUB1AHTAdIB0QHQ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AAAAhAAA5pUAAOaVAAAAiAAA5pYAAOaWAAAAgAAA5pcAAOaXAAAAhgAA5pgAAOaYAAAAhQAA5pkAAOaZAAAAewAA5poAAOaaAAAAqQAA5rwAAOa8AAAB5wAA5tcAAObXAAAA9gAA5wAAAOcAAAAAggAA5wEAAOcBAAAAfwAA5wIAAOcCAAAAgwAA5wMAAOcDAAAAbgAA5wQAAOcEAAAAegAA5wUAAOcFAAAAeQAA6AAAAOgAAAAAeAAA6AEAAOgBAAAAdwAA6AIAAOgCAAAAdgAA6AMAAOgDAAAAcwAA6AQAAOgEAAAAdAAA6AUAAOgFAAAAdQAA6AYAAOgGAAAAcgAA6AcAAOgHAAAAcQAA6AgAAOgIAAAAbwAA6AkAAOgJAAAAcAAA6AoAAOgKAAAArAAA6AsAAOgLAAAAogAA6AwAAOgMAAAAmQAA6A0AAOgNAAAA5gAA6A4AAOgOAAAA7AAA6A8AAOgPAAAA6wAA6BAAAOgQAAAA7gAA6BEAAOgRAAAA6QAA6BIAAOgSAAAA6gAA6BMAAOgTAAAA7wAA6BQAAOgUAAAA5wAA6BUAAOgVAAAA4wAA6BYAAOgWAAAA5AAA6BcAAOgXAAAA8AAA6BgAAOgYAAAA7QAA6BkAAOgZAAAA5QAA6BoAAOgaAAAA6AAA6BsAAOgbAAAA8QAA6BwAAOgcAAAA2QAA6B0AAOgdAAAA2wAA6B4AAOgeAAAA2gAA6B8AAOgfAAAA4gAA6CAAAOggAAAA3AAA6CEAAOghAAAA3gAA6CIAAOgiAAAA3QAA6CMAAOgjAAAA3wAA6CQAAOgkAAAA4AAA6CUAAOglAAAA4QAA6CYAAOgmAAAA1wAA6CcAAOgnAAAA0AAA6CgAAOgoAAAA0wAA6CkAAOgpAAAA0QAA6CoAAOgqAAAA1gAA6CsAAOgrAAAA1QAA6CwAAOgsAAAA1AAA6QAAAOkAAAAA0gAA6QEAAOkBAAAAzwAA6QIAAOkCAAAA2AAA6QMAAOkDAAAAxgAA6QQAAOkEAAAAzAAA6QUAAOkFAAAAyAAA6QYAAOkGAAAAyQAA6QcAAOkHAAAAxQAA6QgAAOkIAAAAzgAA6QkAAOkJAAAAygAA6QoAAOkKAAAAxwAA6QsAAOkLAAAAzQAA6QwAAOkMAAAAywAA6Q0AAOkNAAAAwQAA6Q4AAOkOAAAAwAAA6Q8AAOkPAAAAwwAA6RAAAOkQAAAAvAAA6REAAOkRAAAAwgAA6RIAAOkSAAAAuwAA6RMAAOkTAAAAxAAA6RQAAOkUAAAAvwAA6RUAAOkVAAAAvQAA6RYAAOkWAAAAvgAA6RcAAOkXAAAAsAAA6RgAAOkYAAAAuQAA6RkAAOkZAAAArwAA6RoAAOkaAAAAtQAA6RsAAOkbAAAAtAAA6RwAAOkcAAAAtgAA6R0AAOkdAAAAsgAA6R4AAOkeAAAAuAAA6R8AAOkfAAAAsQAA6SAAAOkgAAAAugAA6SEAAOkhAAAAtwAA6SIAAOkiAAAAswAA6wQAAOsEAAACXwAA6wUAAOsFAAACXAAA6wYAAOsGAAACYAAA6wcAAOsHAAACZgAA6wgAAOsIAAACZQAA6wkAAOsJAAACZAAA6woAAOsKAAACYwAA6wsAAOsLAAACYgAA6wwAAOsMAAACYQAA6w0AAOsNAAACXQAA6w4AAOsOAAACWwAA6w8AAOsPAAACWgAA6xAAAOsQAAACWQAA6xEAAOsRAAACUwAA6xIAAOsSAAACVgAA6xMAAOsTAAACUQAA6xQAAOsUAAACUgAA6xUAAOsVAAACVAAA6xYAAOsWAAACVQAA6xcAAOsXAAACVwAA6xgAAOsYAAACWAAA6xoAAOsaAAACUAAA6xsAAOsbAAACTwAA6xwAAOscAAACTgAA6x0AAOsdAAACTQAA6x4AAOseAAACTAAA6x8AAOsfAAABsAAA6yAAAOsgAAACSwAA6yEAAOshAAACSgAA6yIAAOsiAAACRQAA6yMAAOsjAAACRgAA6yQAAOskAAACQQAA6yUAAOslAAACQgAA6yYAAOsmAAACQwAA6ycAAOsnAAACRAAA6ygAAOsoAAACMQAA6ykAAOspAAACMAAA6yoAAOsqAAACPwAA6ysAAOsrAAACPgAA6ywAAOssAAACPQAA6y0AAOstAAACPAAA6y4AAOsuAAACOwAA6y8AAOsvAAACOAAA6zAAAOswAAACOQAA6zEAAOsxAAACOgAA6zIAAOsyAAACMwAA6zMAAOszAAACNAAA6zQAAOs0AAACNQAA6zUAAOs1AAACNgAA6zYAAOs2AAACNwAA6zcAAOs3AAACMgAA6zgAAOs4AAACLwAA6zkAAOs5AAACLgAA6zoAAOs6AAACLQAA6zsAAOs7AAACLAAA6zwAAOs8AAACKwAA6z0AAOs9AAACKgAA6z4AAOs+AAACKQAA6z8AAOs/AAACKAAA60EAAOtBAAACJwAA60IAAOtCAAACJgAA60MAAOtDAAACJQAA60QAAOtEAAACJAAA60UAAOtFAAACIwAA60YAAOtGAAACIgAA60cAAOtHAAACIAAA60gAAOtIAAACIQAA60kAAOtJAAACHwAA60oAAOtKAAACHgAA60sAAOtLAAACHQAA60wAAOtMAAACHAAA600AAOtNAAACGwAA604AAOtOAAACGgAA608AAOtPAAACGQAA61EAAOtRAAACGAAA61IAAOtSAAACFwAA61MAAOtTAAACFgAA61QAAOtUAAACFQAA61UAAOtVAAACFAAA61YAAOtWAAACEwAA61cAAOtXAAACEgAA61gAAOtYAAACEQAA61kAAOtZAAACEAAA61oAAOtaAAACDwAA61sAAOtbAAACDgAA61wAAOtcAAACDQAA610AAOtdAAACDAAA614AAOteAAACCwAA618AAOtfAAACCgAA62AAAOtgAAACCQAA62EAAOthAAACCAAA62IAAOtiAAACBwAA62MAAOtjAAACBgAA62QAAOtkAAACBQAA62UAAOtlAAACBAAA62YAAOtmAAACAwAA62cAAOtnAAACAgAA62gAAOtoAAACAQAA62kAAOtpAAACAAAA62oAAOtqAAAB/wAA62sAAOtrAAAB/gAA62wAAOtsAAAB/QAA620AAOttAAAB/AAA624AAOtuAAAB+wAA628AAOtvAAAB+gAA63EAAOtxAAAB+QAA63IAAOtyAAAB+AAA63MAAOtzAAAB9wAA63QAAOt0AAAB9gAA63UAAOt1AAAB9QAA63YAAOt2AAAB9AAA63cAAOt3AAAB8wAA63gAAOt4AAAB8gAA63kAAOt5AAAB8QAA63oAAOt6AAAB8AAA63sAAOt7AAAB7wAA63wAAOt8AAAB7gAA630AAOt9AAAB7QAA634AAOt+AAAB7AAA638AAOt/AAABrwAA64EAAOuBAAAB6wAA64IAAOuCAAAB6gAA64MAAOuDAAAB5gAA64QAAOuEAAAB5QAA64UAAOuFAAAB5AAA64YAAOuGAAAB4wAA64cAAOuHAAAB4gAA64gAAOuIAAAB4QAA64kAAOuJAAAB4AAA65oAAOuaAAAB3wAA65sAAOubAAAB3gAA65wAAOucAAAB3QAA650AAOudAAAB3AAA654AAOueAAAB2wAA658AAOufAAAB2gAA66AAAOugAAAB2QAA66EAAOuhAAAB2AAA66IAAOuiAAAB1wAA66MAAOujAAAB1gAA66QAAOukAAAB1QAA66UAAOulAAAB1AAA66YAAOumAAAB0wAA66cAAOunAAAB0gAA66gAAOuoAAAB0QAA66kAAOupAAAB0AAA67AAAOuwAAABzwAA67EAAOuxAAABzgAA67IAAOuyAAABzQAA67MAAOuzAAABzAAA67QAAOu0AAABywAA67UAAOu1AAABygAA67YAAOu2AAAByQAA67cAAOu3AAAByAAA67gAAOu4AAABxwAA67kAAOu5AAABxgAA68AAAOvAAAABxQAA68EAAOvBAAABxAAA68IAAOvCAAABwwAA68MAAOvDAAABwgAA68QAAOvEAAABwQAA68UAAOvFAAABwAAA68YAAOvGAAABvwAA68cAAOvHAAABvgAA68gAAOvIAAABvQAA68kAAOvJAAABvAAA69AAAOvQAAABuwAA69EAAOvRAAABugAA69IAAOvSAAABuQAA69MAAOvTAAABuAAA69QAAOvUAAABtwAA69UAAOvVAAABtgAA69YAAOvWAAABtQAA69cAAOvXAAABtAAA69gAAOvYAAABswAA69kAAOvZAAABsgAA6+EAAOvhAAABsQAA6+IAAOviAAABsAAA6+MAAOvjAAABrwAA6+QAAOvkAAABrgAA6+UAAOvlAAABrQAA6+YAAOvmAAABrAAA6+cAAOvnAAABqwAA6+gAAOvoAAABqgAA6+kAAOvpAAABqQAA6/AAAOvwAAABqAAA6/EAAOvxAAABpwAA6/IAAOvyAAABpgAA6/MAAOvzAAABpQAA6/QAAOv0AAABpAAA6/UAAOv1AAABowAA6/YAAOv2AAABogAA6/cAAOv3AAABoQAA6/gAAOv4AAABoAAA6/kAAOv5AAABnwAA7KAAAOygAAABngAA7KEAAOyhAAABnQAA7KIAAOyiAAABnAAA7KMAAOyjAAABmwAA7KQAAOykAAABlgAA7KUAAOylAAABlQAA7KYAAOymAAABlAAA7KcAAOynAAABkwAA7KgAAOyoAAABkgAA7KkAAOypAAABkQAA7LAAAOywAAABkAAA7LEAAOyx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Ad8B4AHhAeIB4wHkAeUB5gHnAegB6QHqAesB7AHtAe4B7wHwAfEB8gHzAfQB9QH2AfcB+AH5AfoB+wH8Af0B/gH/AgACAQICAgMCBAIFAgYCBwIIAgkCCgILAgwCDQIOAg8CEAIRAhICEwIUAhUCFgIXAhgCGQIaAhsCHAIdAh4CHwIgAiECIgIjAiQCJQImAicCKAIpAioCKwIsAi0CLgIvAjACMQIyAjMCNAI1AjYCNwI4AjkCOgI7AjwCPQI+Aj8CQAJBAkICQwJEAkUCRgJHAkgCSQJKAksCTAJNAk4CTwJQAlECUgJTAlQCVQJWAlcCWAJZAloCWwJcAl0CXgJfAmACYQJiAmMCZAJlAmYCZwJoAmkCagJrAmwCbQJuAm8CcAJxAnICcwJ0AnUCdgJ3AngCeQJ6AnsCfAJ9An4CfwKAAoECggKDAoQChQKGAocCiAKJAooCiwKMAo0CjgKPApACkQKSApMClAKVApYClwKYApkCmgKbApwCnQKeAp8CoAKhAqICowKkAqUCpgKnAqgCqQKqAqsCrAKtAq4CrwKwArECsgKzArQCtQK2ArcCuAK5AroCuwK8Ar0CvgK/AsACwQLCAsMCxALFAsYCxwLIAskCygLLAswCzQLOAs8C0ALRAtIC0wLUAtUC1gLXAtgC2QLaAtsC3ALdAt4C3wLgAuEC4gLjAuQC5QLmAucC6ALpAuoC6wLsAu0C7gLvAvAC8QLyAvMC9AL1AvYC9wL4AvkC+gL7AvwC/QL+Av8DAAMBAwIDAwMEAwUDBgMHAwgDCQMKAwsDDAMNAw4DDwMQAxEDEgMTAxQDFQMWAxcDGAMZAxoDGwMcAx0DHgMfAyADIQMiAyMDJAMlAyYDJwMoAykDKgMrAywDLQMuAy8DMAMxAzIDMwM0AzUDNgM3AzgDOQM6AzsDPAM9Az4DPwNAA0EDQgNDA0QDRQNGA0cDSANJA0oDSwNMA00DTgNPA1ADUQNSA1MDVANVA1YDVwNYA1kDWgNbA1wDXQNeA18DYANhA2IDYwNkA2UDZgNnA2gDaQNqA2sDbANtA24DbwNwA3EDcgNzA3QDdQN2A3cDeAN5A3oDewN8A30DfgN/A4ADgQOCAAphLWNodWxpcmVuCmNsb2NrLWVjYjUKY2xvY2stZTEwNwllMTAwLXVuZG8OZTIwOS1zdWJ0aXRsZXMHZTIwOC1oZBJlMTE3LWNhbmNlbC1jaXJjbGUTZTExNi1jYW5jZWwtb3V0bGluZQxlMTNkLXByZXZpZXcLZTExNS1jYW5jZWwEc3RvcApjYWxjdWxhdG9yDHNvcnQtZGVzYy1zbQ5lbmNsb3N1cmVfZWRpdBJlMDFjLWFycm93LXBhcmVudDENZTIwYS1wbGF5bGlzdBBlMDFkLWFycm93LXJvb3QxEWUwMjAtYXJyb3dzLXN3YXAxF2UwMWYtYXJyb3dzLWRpbWVuc2lvbnMxE2UxMDQtbm9uLXJlY3VycmVuY2UVZTAxZS1hcnJvd3MtcmVzaXppbmcxEGUxMjctc29ydC1hc2Mtc20IZTE0MS1wYW4OZTIwNi12b2x1bWUtdXAKZTIwMS1wYXVzZQllMjAwLXBsYXkMZTIwNC1mb3J3YXJkEGUyMDUtdm9sdW1lLWRvd24UZTE0OS1rcGktc3RhdHVzLW9wZW4PZTIwNy12b2x1bWUtb2ZmC2UyMDMtcmV3aW5kDWUxMzItZG93bmxvYWQSZTExOS1jaGVjay1vdXRsaW5lC2UxMzMtdXBsb2FkEmUxMjMtbWludXMtY2lyY2xlMQ1lMTI0LXNvcnQtYXNjC2UxMjktZmlsdGVyC2UxMjYtdW5zb3J0C2UxMzEtbG9nb3V0CmUxMzAtbG9naW4OZTEyNS1zb3J0LWRlc2MQZTEyMC1wbHVzLWNpcmNsZRRlMTQ4LWtwaS1zdGF0dXMtaG9sZAxlMTQ1LXBsdXMtc20OZTE0NC1jb25uZWN0b3IWZTEzNS1oeXBlcmxpbmstb3Blbi1zbQtlMTM2LWxhdW5jaBRlMTQ3LWtwaS1zdGF0dXMtZGVueQllMTQzLWNhcnQLZTEzNy13aW5kb3cNZTE0Ni1taW51cy1zbQ1lMTQwLXpvb20tb3V0FGUxMzktd2luZG93LW1pbmltaXplE2UxMzQtaHlwZXJsaW5rLW9wZW4SZTExMS1saW5rLXZlcnRpY2FsCWUxMTMtbG9jawtlMTAzLXJlbG9hZA1lMTA1LXJlc2V0LXNtFGUxMTItdW5saW5rLXZlcnRpY2FsFmUxMTAtdW5saW5rLWhvcml6b250YWwOZTEwNi1yZWxvYWQtc20LZTExNC11bmxvY2sLZTEwOS1mbG9wcHkKZTExOC1jaGVjaxFlMTJhLWZpbHRlci1jbGVhchJlMTBlLWF0dGFjaG1lbnQtNDULZTEzYy13cmVuY2gaZTEyZS1maWx0ZXItYWRkLWV4cHJlc3Npb24OZTEyYi1maWx0ZXItc20PZTEwZC1hdHRhY2htZW50FWUxMmYtZmlsdGVyLWFkZC1ncm91cBJlMTFjLWNsb3NlLW91dGxpbmUYZTEyZC1maWx0ZXItc29ydC1kZXNjLXNtFGUxMGYtbGluay1ob3Jpem9udGFsCGUxMGItZGl0F2UxMmMtZmlsdGVyLXNvcnQtYXNjLXNtCmUxM2ItZ2VhcnMJZTAzMC1tZW51CWUxMDEtcmVkbwplMjBiLWF1ZGlvEmUwMjktbGF5b3V0LTEtYnktNBFlMDI3LWhhbmRsZXItZHJhZw9lMDIyLWNhdGVnb3JpemUMZTIwYy1wbGF5LXNtEmUwMzEtbW9yZS12ZXJ0aWNhbAtlMDI4LWxheW91dAxlMTNmLXpvb20taW4SZTAyMS1kcmFnLWFuZC1kcm9wEmUwMmEtbGF5b3V0LTItYnktMgllMDJlLXJvd3MKZTEwMi1yZXNldAplMTBhLXByaW50GGUwMmItbGF5b3V0LXNpZGUtYnktc2lkZRBlMDFiLWFycm93LWRyaWxsE2UwMmMtbGF5b3V0LXN0YWNrZWQMZTAyZC1jb2x1bW5zFWUwMDMtYXJyb3ctNDUtdXAtbGVmdBNlMDBhLWFycm93LWVuZC1kb3duFWUwMTEtYXJyb3dzLW5vLWNoYW5nZQtlMDBiLXNlZWstdxRlMDA5LWFycm93LWVuZC1yaWdodBdlMDAyLWFycm93LTQ1LWRvd24tbGVmdBFlMDA4LWFycm93LWVuZC11cBBlMDE4LWFycm93LXJpZ2h0D2UwMTktYXJyb3ctZG93bg9lMDFhLWFycm93LWxlZnQYZTAwMS1hcnJvdy00NS1kb3duLXJpZ2h0GGUwMTItYXJyb3ctb3ZlcmZsb3ctZG93bg1lMDE3LWFycm93LXVwFmU3MDMtbWFya2VyLXBpbi10YXJnZXQNZTgwOC1kaWdnLWJveAplODA5LWVtYWlsCWU4MDctZGlnZxJlODA2LWRlbGljaW91cy1ib3gMZTgwMy1ibG9nZ2VyEGU4MDQtYmxvZ2dlci1ib3gOZTgwNS1kZWxpY2lvdXMKZTgwMi1pbmJveAllODAxLXVzZXIKZTgwMC1zaGFyZQplNzA1LXVucGluCGU3MDQtcGluDmU2OTktZm9udC1zaXplEGU2ODktcGFuZS1mcmVlemUcZTY5MC10b2dnbGUtZnVsbC1zY3JlZW4tbW9kZRJlNjg4LXRhYmxlLXVubWVyZ2UKZTcwMS1nbG9iZRJlNjk2LWN1c3RvbS1mb3JtYXQPZTY5MS1mb3JtdWxhLWZ4EmU3MDAtZ2xvYmUtb3V0bGluZQ9lNzAyLW1hcmtlci1waW4LZTY5NC1kb2xsYXIVZTY5OC1kZWNpbWFsLWRlY3JlYXNlFWU2OTctZGVjaW1hbC1pbmNyZWFzZQtlNjkzLXN5bWJvbAxlNjk1LXBlcmNlbnQIZTY5Mi1zdW0TZTY0My10ZXh0Ym94LWhpZGRlbhVlNjQ3LXRlbXBsYXRlLW1hbmFnZXIUZTY3Mi1oeXBlcmxpbmstZ2xvYmUbZTY3My1oeXBlcmxpbmstZ2xvYmUtcmVtb3ZlDGU2NDItdGV4dGJveA9lNjQ2LWVkaXQtdG9vbHMLZTYzZC1idXR0b24KZTY3Ny10YWJsZRFlNjgyLXRhYmxlLWRlbGV0ZRVlNjc4LXRhYmxlLXByb3BlcnRpZXMQZTY4My1jZWxscy1tZXJnZRxlNjg2LWNlbGwtc3BsaXQtaG9yaXpvbnRhbGx5FmU2ODEtdGFibGUtY2VsbC1kZWxldGULZTY3NS1hbmNob3IbZTY4Ny1jY2VsbC1zcGxpdC12ZXJ0aWNhbGx5EWU4MGMtZmFjZWJvb2stYm94G2U2ODUtY2VsbHMtbWVyZ2UtdmVydGljYWxseR1lNjg0LWNlbGxzLW1lcmdlLWhvcml6b250YWxseRVlNjgwLXRhYmxlLXJvdy1kZWxldGUPZTY3OS10YWJsZS1jZWxsFGU2NzQtaHlwZXJsaW5rLWVtYWlsF2U2NzYtdGFibGUtbGlnaHQtZGlhbG9nHmU2N2MtdGFibGUtY29sdW1uLWluc2VydC1yaWdodBRlNjhmLXZhbGlkYXRpb24tZGF0YQ1lODBiLWZjYWVib29rD2U2OGEtcm93LWZyZWV6ZRJlNjhiLWNvbHVtbi1mcmVlemUbZTY3ZS10YWJsZS1yb3ctaW5zZXJ0LWJlbG93HWU2N2ItdGFibGUtY29sdW1uLWluc2VydC1sZWZ0G2U2N2QtdGFibGUtcm93LWluc2VydC1hYm92ZRplNjdhLXRhYmxlLWNlbGwtcHJvcGVydGllcxxlNjlhLWltYWdlLWFic29sdXRlLXBvc2l0aW9uEmU2OGMtdG9vbGJhci1mbG9hdBhlNjdmLXRhYmxlLWNvbHVtbi1kZWxldGUOZTgwYS1lbWFpbC1ib3gSZTY4ZC1zcGVsbC1jaGVja2VyFWU2OGUtdmFsaWRhdGlvbi14aHRtbAhlOTE5LWNzcwplOTE3LWh0bWw1B2U5MWYtdmILZTkxZC12YnByb2oUZTkyMi1maWxlLWhvcml6b250YWwIZTkxYi1leGUHZTkxYS1qcwtlOTFjLWNzcHJvagplOTIxLWNsb3VkB2U5MWUtY3MJZTkxOC1odG1sCGU5MjAtc2xuDmU5MTItZmlsZS1hc2N4D2U5MTAtZmlsZS1mbGFzaAllOTE1LWZpbG0JZTkxNi1jc3MzDWU5MTQtZmlsZS16aXANZTkwZS1maWxlLXBkZg1lOTBkLWZpbGUtcHB0EGU5MTEtZmlsZS1jb25maWcNZTkwZi1maWxlLXBzZA1lOTEzLWZpbGUtYmFjDWU5MDctZmlsZS1hZGQOZTkwMy1mb2xkZXItdXAPZTkwYS1maWxlLWV4Y2VsFWU5MDUtYWdncmVnYXRlLWZpZWxkcwllOTA2LWZpbGUIZTkwOS1jc3YIZTkwYy1tZGIQZTkwNC1mb2xkZXItbW9yZQ5lOTBiLWZpbGUtd29yZA1lOTA4LWZpbGUtdHh0EGU5MDEtZm9sZGVyLW9wZW4IZTgyNy1yc3MKZTgyOS12aW1lbwtlOTAwLWZvbGRlcgxlODI4LXJzcy1ib3gQZTgyYy15b3V0dWJlLWJveAxlODJiLXlvdXR1YmUOZTgyYS12aW1lby1ib3gRZTgyNi1kcmliYmJsZS1ib3gPZTkwMi1mb2xkZXItYWRkFmU4MWMtdGVsbC1hLWZyaWVuZC1ib3gPZTgxZS10dW1ibHItYm94C2U4MWQtdHVtYmxyEGU4MjAtdHdpdHRlci1ib3gPZTgyMi15YW1tZXItYm94C2U4MjEteWFtbWVyDGU4MjMtYmVoYW5jZRBlODI0LWJlaGFuY2UtYm94DWU4MjUtZHJpYmJibGUMZTgxZi10d2l0dGVyDmU4MTUtcGludGVyZXN0EmU4MTYtcGludGVyZXN0LWJveBFlODE5LXN0dW1ibGUtdXBvbgtlODBkLWdvb2dsZRBlODE0LW15c3BhY2UtYm94FWU4MWEtc3R1bWJsZS11cG9uLWJveA1lODExLWxpbmtlZGluEWU4MTItbGlua2VkaW4tYm94EGU4MGYtZ29vZ2xlLXBsdXMPZTgwZS1nb29nbGUtYm94D2U4MTgtcmVkZGl0LWJveBRlODEwLWdvb2dsZS1wbHVzLWJveAxlODEzLW15c3BhY2ULZTgxNy1yZWRkaXQSZTgxYi10ZWxsLWEtZnJpZW5kEHN0cmlwLWNzcy1mb3JtYXQOdmlkZW8tZXh0ZXJuYWwTc3RyaXAtc3Bhbi1lbGVtZW50cwpzZWxlY3QtYWxsGHRhYmxlLWFsaWduLWJvdHRvbS1yaWdodBNzdHJpcC1hbGwtZm9ybWF0aW5nCHRleHRhcmVhCmltYWdlLWVkaXQJdGV4dC13cmFwGHRhYmxlLWFsaWduLW1pZGRsZS1yaWdodBJ0YWJsZS1hbGlnbi1yZW1vdmUNdHJhY2stY2hhbmdlcxh0cmFjay1jaGFuZ2VzLXJlamVjdC1hbGwMYWxpZ24tcmVtb3ZlDGFsaWduLWNlbnRlcg1hbGlnbi1qdXN0aWZ5C2FsaWduLXJpZ2h0CWJvcmRlci1ubwxhcHBseS1mb3JtYXQLYm9yZGVyLWxlZnQNYm9yZGVyLWJvdHRvbQtib3JkZXJzLWFsbBdib3JkZXJzLWluc2lkZS12ZXJ0aWNhbA9ib3JkZXJzLW91dHNpZGUZYm9yZGVycy1pbnNpZGUtaG9yaXpvbnRhbARjb3B5CWNsZWFyLWNzcwpib3JkZXItdG9wDGJvcmRlci1yaWdodBtlNjcxLWh5cGVybGluay1saWdodC1kaWFsb2cRYm9yZGVycy1zaG93LWhpZGUOYm9yZGVycy1pbnNpZGUOZGljdGlvbmFyeS1hZGQLY3VzdG9tLWljb24HY29tbWVudBBkb2N1bWVudC1tYW5hZ2VyC2NvcHktZm9ybWF0D2NoYW5nZS1tYW51YWxseQ5jb21tZW50LXJlbW92ZQ1jYWxlbmRhci1kYXRlE2NvbW1lbnRzLXJlbW92ZS1hbGwQaW1hZ2UtbWFwLWVkaXRvcgNjdXQObW9kdWxlLW1hbmFnZXIFcGFzdGUSaW1hZ2UtbGlnaHQtZGlhbG9nDGNvZGUtc25pcHBldAxmb3JtLWVsZW1lbnQNbWVkaWEtbWFuYWdlcg1mbGFzaC1tYW5hZ2VyDXBhcmFncmFwaC1hZGQacGFzdGUtZnJvbS13b3JkLXN0cmlwLWZpbGUPcnVsZS1ob3Jpem9udGFsD3Bhc3RlLWZyb20td29yZA1wYXN0ZS1hcy1odG1sE3N0cmlwLWZvbnQtZWxlbWVudHMXdGFibGUtYWxpZ24tYm90dG9tLWxlZnQQZmluZC1hbmQtcmVwbGFjZRZ0YWJsZS1hbGlnbi10b3AtY2VudGVyCnBhc3RlLWh0bWwVc3RyaXAtd29yZC1mb3JtYXR0aW5nGXRhYmxlLWFsaWduLW1pZGRsZS1jZW50ZXIRZm9ybWF0LWNvZGUtYmxvY2sUdHJhY2stY2hhbmdlcy1yZWplY3QJZ3JvdXAtYm94BGZvcm0ZdGFibGUtYWxpZ24tYm90dG9tLWNlbnRlcgtzaWx2ZXJsaWdodBBwYXN0ZS1wbGFpbi10ZXh0CnNlbGVjdC1ib3gOcGFzdGUtbWFya2Rvd24XdGFibGUtYWxpZ24tbWlkZGxlLWxlZnQUdHJhY2stY2hhbmdlcy1lbmFibGUVdGFibGUtYWxpZ24tdG9wLXJpZ2h0DXN0eWxlLWJ1aWxkZXIUdGFibGUtYWxpZ24tdG9wLWxlZnQUdHJhY2stY2hhbmdlcy1hY2NlcHQYdHJhY2stY2hhbmdlcy1hY2NlcHQtYWxsEWEtZTYwNGZvbnQtZmFtaWx5EGEtZTYwOXN1Yi1zY3JpcHQWYS1lNjA1Zm9yZWdyb3VuZC1jb2xvcgphLWU2MDFib2xkCGEtZTYxMGg0E2EtZTYwOHN0cmlrZXRocm91Z2gXYS1lNjA2Y29udmVydC1sb3dlcmNhc2UXYS1lNjA3Y29udmVydC11cHBlcmNhc2UMYS1lNjAyaXRhbGljD2EtZTYwM3VuZGVybGluZRJhLWU2MWNhbGlnbi1ib3R0b20IYS1lNjBkaDEIYS1lNjBmaDMJYS1lNjBjYWxsCGEtZTYwZWgyEGEtZTYwYXN1cC1zY3JpcHQJYS1lNjBiZGl2EGEtZTYxZGFsaWduLWxlZnQPYS1lNjFhYWxpZ24tdG9wEmEtZTYxYmFsaWduLW1pZGRsZRVhLWU2MTVpbmRlbnQtaW5jcmVhc2UTYS1lNjE4aW5zZXJ0LW1pZGRsZRRhLWU2MTRsaXN0LXVub3JkZXJlZBVhLWU2MTZpbmRlbnQtZGVjcmVhc2UPYS1lNjE3aW5zZXJ0LXVwEWEtZTYxOWluc2VydC1kb3duCGEtZTYxMmg2EmEtZTYxM2xpc3Qtb3JkZXJlZAhhLWU2MTFoNRNhLWU1MjR0aHVtYm5haWxzLXVwFmEtZTUyOWZ1bGwtc2NyZWVuLWV4aXQVYS1lNTI2dGh1bWJuYWlscy1kb3duFWEtZTYwMHBhZ2UtcHJvcGVydGllcxVhLWU1Mjd0aHVtYm5haWxzLWxlZnQaYS1lNTIzYWxpZ24tYm90dG9tLWVsZW1lbnQRYS1lNTI4ZnVsbC1zY3JlZW4WYS1lNTI1dGh1bWJuYWlscy1yaWdodBFhLWU1MmFyZXNldC1jb2xvchphLWU1MjJhbGlnbi1taWRkbGUtZWxlbWVudBJhLWU1MWJiYWNrLWVsZW1lbnQZYS1lNTIwYWxpZ24tcmlnaHQtZWxlbWVudBVhLWU1MWNmb3J3YXJkLWVsZW1lbnQLYS1lNTE4c2hhcGUXYS1lNTIxYWxpZ24tdG9wLWVsZW1lbnQWYS1lNTFkYmFja3dhcmQtZWxlbWVudBNhLWU1MTlyb3VuZC1jb3JuZXJzGGEtZTUxZWFsaWduLWxlZnQtZWxlbWVudBNhLWU1MWFmcm9udC1lbGVtZW50GmEtZTUxZmFsaWduLWNlbnRlci1lbGVtZW50CmEtZTUxMGxpbmUZYS1lNTExYnJpZ2h0bmVzcy1jb250cmFzdAthLWU1MGZwYWludA9hLWU1MTVncmV5c2NhbGUNYS1lNTBlcGFsZXR0ZQ1hLWU1MTdzaGFycGVuE2EtZTUxM2ludmVydC1jb2xvcnMKYS1lNTE2Ymx1chBhLWU1MTJzYXR1cmF0aW9uEmEtZTUxNHRyYW5zcGVyYW5jeQxhLWU1MGFyb3RhdGUTYS1lNTA0em9vbS1iZXN0LWZpdAthLWU1MGRicnVzaBFhLWU1MGNyb3RhdGUtbGVmdAphLWU1MDZjcm9wE2EtZTUwOWZsaXAtdmVydGljYWwMYS1lNTA3bWlycm9yFWEtZTUwOGZsaXAtaG9yaXpvbnRhbBJhLWU1MDVpbWFnZS1yZXNpemUSYS1lNTBicm90YXRlLXJpZ2h0DWEtZTIwZXN0b3Atc20SYS1lNTAyaW1hZ2UtZXhwb3J0FGEtZTMwN3RyaS1zdGF0ZS1udWxsC2EtZTUwMWltYWdlE2EtZTMwMGhlYXJ0LW91dGxpbmUWYS1lNTAzem9vbS1hY3R1YWwtc2l6ZQxhLWUzMDhjaXJjbGULYS1lMzAxaGVhcnQSYS1lNTAwcGhvdG8tY2FtZXJhDmEtZTIwZHBhdXNlLXNtC2NvbGxhcHNlLW5lCXRodW1idGFjawtzLXRodW1idGFjawZtb3ZldG8NZmlsdGVyX2RlbGV0ZQ9maWx0ZXJfZ3JvdXBpbmcKZmlsdGVyX2FkZBNmaWx0ZXJfY2FuY2VsbGF0aW9uBnZlcm5hdgpjdy1hcnJvd2RlCGN3LWhvdGVsB2N3LXRyaXAFemhhZ2UHZGVuZ2hhbw10aXNoaXNodW9taW5nBERyYWcGYmlhbmppBmNoYWthbgJiZwRsaGp0CGR1bGltaW1hEXFpYW5taW5ncWlhbnpoYW5nBmZhbmt1aRRhLUNGX0Rlc2NlbmRpbmdPcmRlchNhLUNGX0FzY2VuZGluZ09yZGVyBWFib3V0CXl1bnhpYW94aRBlbmNsb3N1cmVfZGVsZXRlEmVuY2xvc3VyZV9kb3dubG9hZBBlbmNsb3N1cmVfdXBsb2FkEGVuY2xvc3VyZV9icm93c2UKdXBsb2FkX2JpZw9jYWxlbmRhcnNfbGluZTEJbW9yZV9saW5lDmRyb3AtZG93bl9saW5lEHBlcnNwZWN0aXZlX3ZpZXcKY2hhcnRfdmlldwlmb3JtX3ZpZXcJbGlzdF92aWV3CWNhcmRfdmlldwtyZW1vdmVfZmFjZQtkdWl6aGFuZ2Rhbg1kaXpoaXNoZW5xaW5nDWppbmd4aWFvcmVud3UHYmFpZmFuZwprZWh1Z3VhbnhpCGZheXVuZGFuCWxpYW54aXJlbg1mdWt1YW50b25nemhpD2thaXBpYW9zaGVucWluZw94aWFvc2hvdWRhY2hlbmcOeGlhb3Nob3VxaWFubGkOeGlhb3Nob3VtdWJpYW8Nc2h1anVzaGFuZ2Jhbwx4dWtlc2hhbmdwaW4Jemhlbmd6aGFvDHhpYW9zaG91eXVjZQ94aWFvc2hvdXR1YW5kdWkFaGVscDELaW5mby1jaXJjbGUKZGVwYXJ0bWVudARjb2RlBHBhdGgPZmxvd2xpbmUtbWFudWFsDWZsb3dsaW5lLW1vcmUSZmxvd2xpbmUtc2NoZWR1bGVkEWZsb3dsaW5lLWNhbmNlbGVkEGZsb3dsaW5lLXBlbmRpbmcMZmxvd2xpbmUtcnVuEGZsb3dsaW5lLWNyZWF0ZWQQZmxvd2xpbmUtcnVubmluZxBmbG93bGluZS13YWl0aW5nEGZsb3dsaW5lLXNraXBwZWQNZmxvd2xpbmUtdmlldxBmbG93bGluZS13YXJuaW5nC29yaWVudGF0aW9uBGxhc3QFZmlyc3QOeXVuaGFuZ3NoaWljb24aQ29sdW1uLWZpbHRlcmFuZGRlc2NlbmRpbmcZQ29sdW1uLWZpbHRlcmFuZGFzY2VuZGluZxxDb2x1bW5zLURlZmF1bHRmaWx0ZXJhbmRzb3J0DUNvbHVtbi1maWx0ZXISQ29sdW1ucy1kZXNjZW5kaW5nEUNvbHVtbnMtYXNjZW5kaW5nE0NvbHVtbnMtRGVmYXVsdHNvcnQPbGF1bmNocGFkLWZhY2UyCmxhdW5jaHBhZDIPZi1pY29uLWNoZWNrYm94DGYtaWNvbi1taW51cwpmLWljb24tYWRkCGRyb3Bkb3duCm5hdmlnYXRpb24Ray1pLW1lc3NhZ2VfZXJyb3ITay1pLW1lc3NhZ2Vfc3VjY2VzcwpzdWRva3UtbmV3CGxpc3QtbmV3CXRpbGVkLW5ldwxxaWVodWFuenV6aGkHcmFkaW8tMgZ0ZW5hbnQGc3Vkb2t1BXRpbGVkBWxpc3QxC3Nob3VjYW5namlhCmNvbGxlY3Rpb24DaWRlDG9jY2x1ZGUtZmFjZQdvY2NsdWRlDmxhdW5jaHBhZC1mYWNlCWxhdW5jaHBhZAtpbmZvcm1hdGlvbgdiYWNrbG9nB21lc3NhZ2UJbWF4aW1pemUxBnNlYXJjaAppbmRleC1mYWNlBWluZGV4CHl4c190ZXh0DXl4c19jb250YWluZXILeXhzX2NvbHVtbnMIeXhzX21vdmUIeXhzX2NvcHkKeXhzX2RlbGV0ZQl5eHNfbGV2ZWwJeXhzX2VhcnRoDXl4c19jdXN0b21pemUIc2lnbl9vdXQLdXNlcl9jZW50ZXIGcmVtb3ZlBnBhY2t1cAZjYW1lcmEGbmFycm93DWFtcGxpZmljYXRpb24JY2xvY2t3aXNlEGNvdW50ZXJjbG9ja3dpc2UGZWRpdG9yBHNraW4EYXJlYQhwYXNzd29yZAhsYW5ndWFnZQViYXNpYwhtaW5pbWl6ZQxtYXhpbWl6YXRpb24NbmV3LWRpbWVuc2lvbhFmaWxlLWZvbGRlci1jbG9zZRBmaWxlLWZvbGRlci1vcGVuCG5ldy1lZGl0CG5ldy1mb3JtBXdvbWFuA21hbgZyZWNvcmQEbW9yZQRsaXN0CXRlbGVwaG9uZQhmdW5jdGlvbgtwcm9kdWN0bGlzdA5hdHRhY2htZW50bGlzdBNkb2N1bWVudGluZm9ybWF0aW9uDG5ldy1maWx0cmF0ZQ5uZXctZnVsbHNjcmVlbgdyb29maW5nDUJvdHRvbXNldHRpbmcPcGFnZS10aXRsZS10YXNrEXBhZ2UtdGl0bGUtcmV2aWV3EHBhZ2UtdGl0bGUtc3RhcnQPcGFnZS10aXRsZS10eXBlEXBhZ2UtdGl0bGUtcmVjb3JkEnBhZ2UtdGl0bGUtdm91Y2hlchBwYWdlLXRpdGxlLXF1ZXJ5EXBhZ2UtdGl0bGUtbnVtYmVyEXBhZ2UtdGl0bGUtbWFuYWdlFnBhZ2UtdGl0bGUtbWFpbnRlbmFuY2UVcGFnZS10aXRsZS1kaWN0aW9uYXJ5GHBhZ2UtdGl0bGUtY29uZmlndXJhdGlvbhVwYWdlLXRpdGxlLWFkbWluaXN0ZXIRcGFnZS10aXRsZS1kZWZpbmUXdHJpLXN0YXRlLWluZGV0ZXJtaW5hdGUQcGFuZWwtcmV0cmFjdGlvbgtlZGl0LWJ1dHRvbg5pbnB1dC1sYW5ndWFnZRdhdHRyaWJ1dGUtY29uZmlndXJhdGlvbgtFbmdpbmVlcmluZwNnaXQTcmFkaW9idXR0b24tY2hlY2tlZAxzaGFwZS1jaXJjbGUQY2hlY2tib3gtY2hlY2tlZBVrLWktaG9tZS13ZWF0aGVyLWxlYWYNay1pLWhvbWUtbW9yZQ1rLWktaG9tZS1yaW5nDGstaS1ob21lLWFkZA5rLWktaG9tZS1zZXR1cA5rLWktaG9tZS13b21hbgxrLWktaG9tZS1tYW4Oay1pLXRvcF9hZ2VuY3kMay1pLXRvcF9uZXdzDGstaS10b3BfaG9tZRJrLWktdG9wX2ltX2RlZmF1bHQXay1pLXRvcF9kZXZlbG9wbWVudHRvb2wMay1pLXRvcF9tZW51DmstaS10b3Bfc2VhcmNoCmstaS10b3BfbXkPay1pLWZsYWdfdXJnZW50DGstaS1uZXh0cGFnZRBrLWktcHJldmlvdXNwYWdlE2staS1tZXNzYWdlX3JvdXRpbmUTay1pLUV4aGFsZS1EaXNjb3VudBNrLWktbW9yZS1ob3Jpem9udGFsEGstaS1tZXNzYWdlX2hlbHATay1pLW1lc3NhZ2Vfd2FybmluZxZrLWktc3RlcHMtZGVsaXZlcmdvb2RzFWstaS1zdGVwcy1yZWNlaXZhYmxlcxFrLWktc3RlcHMtaW52b2ljZRRrLWktc3RlcHMtb3V0b2ZzdG9jaxRrLWktc3RlcHMtc2V0dGxlbWVudBNrLWktc3RlcHMtdHJhbnNwb3J0DGstaS1ib29rbWFyaxBrLWktc3Rhci1vdXRsaW5lCGstaS16b29tEGstaS1jbG9zZS1jaXJjbGUQay1pLWNoZWNrLWNpcmNsZQlrLWktY2xvc2UQay1pLXBsdXMtb3V0bGluZRFrLWktbWludXMtb3V0bGluZQtrLWktcmVvcmRlcg1rLWktcmV3aW5kLXNtDmstaS1mb3J3YXJkLXNtE2staS1hcnJvdy1zZWVrLWRvd24Ray1pLWFycm93LXNlZWstdXAKay1pLWRlbGV0ZQlrLWktZ3JvdXAIay1pLWdyaWQPay1pLWdyaWQtbGF5b3V0DmstaS1hcnJvd3Mta3BpFmstaS1hcnJvdy1jaGV2cm9uLWxlZnQXay1pLWFycm93LWNoZXZyb24tcmlnaHQWay1pLWFycm93LWNoZXZyb24tZG93bhRrLWktYXJyb3ctY2hldnJvbi11cBFrLWktYXJyb3ctNjAtbGVmdAtrLWktYXJyb3ctZRFrLWktYXJyb3ctNjAtZG93bg9rLWktYXJyb3ctNjAtdXAAAAA=) format("truetype")}.f-page{display:flex;flex-direction:column;background:#EFF2F4}.f-page-main{flex-shrink:1;flex-grow:1;flex-basis:0;background:var(--f-neutral-19);box-shadow:0 2px 20px 0 rgba(3,18,51,.05);margin:.5rem}.f-page-has-query .f-page-main,.f-page-has-scheme .f-page-main{box-shadow:1px 3px 4px 0 rgba(0,28,64,.04)}.f-page-main>.f-section:last-child{margin-bottom:0}.f-page-main>.f-section:last-child::after{display:none}.f-page-is-managelist .f-page-main,.f-page-is-managelistwithsidebar .f-page-main{display:flex;flex-direction:column;overflow:hidden}.f-page-has-scheme .f-page-header{border-radius:.5rem .5rem 0 0}.f-page-has-query .f-page-main{margin-top:-.75rem}.f-page-has-query .f-page-header{margin:.5rem .5rem 0;border-radius:.5rem .5rem 0 0}.f-page-navigate .f-page-main{display:flex;flex-direction:column;overflow:hidden}.f-page-navigate .f-page-content{flex-shrink:1;flex-grow:1;flex-basis:0;display:flex;flex-direction:row;flex-wrap:nowrap;overflow:hidden}.f-page-navigate .f-page-content>.col,.f-page-navigate .f-page-content>[class*=col-]{padding-left:0;padding-right:0}.f-page-navigate .f-page-content-nav{display:flex;flex-direction:column;box-shadow:none;padding:0;position:relative;z-index:100}.f-page-navigate .f-page-content-main>.f-section:last-child::after,.f-scrollspy-container .f-struct-subsub-wrapper::after{display:none}.f-page-navigate .f-page-content-nav-extend{padding:.875rem .875rem 0}.f-page-navigate .f-page-content-main{flex-shrink:1;flex-grow:1;flex-basis:0;overflow:auto}.f-page-navigate .f-page-content-nav.f-component-splitter-pane{padding:0}.f-page-is-listnav .f-page-content-main{position:relative;margin:0 0 0 -.25rem}.f-page-is-listnav .f-page-content-main .f-section-query.f-section,.f-page-is-listnav .f-page-content-main .f-section-scheme.f-section{margin:.5rem .5rem 0;padding:.625rem .875rem .125rem}.f-page-is-listnav .f-page-content-main .f-page-header{margin:.5rem .5rem 0}.f-page-is-listnav .f-page-content-main .f-page-header-base{padding-left:.75rem;padding-right:.75rem}.f-page-is-listnav .f-page-content-main .f-page-footer{padding-left:.75rem;padding-right:.75rem;margin-bottom:.5rem}.f-page-is-grid-grid .f-page-content-main,.f-page-is-tree-grid .f-page-content-main{display:flex;flex-direction:column}.f-page-card .f-page-main{overflow:auto}.f-page-is-wizard .f-page-main{display:flex;flex-direction:column;overflow:hidden}.f-page-is-managelist .f-section+.f-section,.f-page-is-managelist .f-struct-wrapper+.f-struct-wrapper>.f-section{margin:.5rem 0 0}.f-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.f-content{flex-shrink:1;flex-grow:1;flex-basis:0}.f-struct-like-card{background:#fff;border-radius:4px;margin:0 0 .5rem}.f-page-is-mainsubcard .f-page-main,.f-page-is-mainsubcard.f-page-is-sidescrollspy .f-page-main .f-scrollspy-content{margin:0}.f-page-is-mainsubcard .f-page-main::-webkit-scrollbar-track,.f-page-is-mainsubcard.f-page-is-sidescrollspy .f-page-main .f-scrollspy-content::-webkit-scrollbar-track{background-color:#EFF2F4}.f-page-is-mainsubcard .f-page-main>.f-struct-like-card:last-child,.f-page-is-mainsubcard.f-page-is-sidescrollspy .f-page-main .f-scrollspy-content>.f-struct-like-card:last-child{margin-bottom:0}.f-struct-subsub-wrapper{position:relative}.f-struct-subsub-wrapper::before{content:"";height:4px;background:#fff;display:block;margin:0 0 4px;box-shadow:2px 3px 3px 0 rgba(31,35,41,.08)}.f-struct-subsub-wrapper::after{content:"";position:absolute;width:16px;height:16px;background:#fff;top:-4px;left:50%;box-shadow:2px 2px 3px 0 rgba(31,35,41,.08);transform:rotate(45deg);z-index:100}.f-scrollspy-container .f-struct-subsub-wrapper{position:initial}.f-cmp-lib-portlet,.f-viewchange-content-item lib-portlet{height:100%}.f-area-hide{opacity:0;visibility:hidden;z-index:100;position:absolute;transform:scaleY(0);transform-origin:100% top;backface-visibility:hidden;transition:opacity .12s linear .12s,visibility .12s linear .12s,transform .12s linear .12s}.f-area-show{opacity:1;visibility:visible;transform:scaleY(1)}.f-page-is-listnav-with-header .f-page-content-main{flex-shrink:1;flex-grow:1;flex-basis:0;display:flex;flex-direction:column}.f-page-content-main-extend{padding:20px 22px 0}.f-page-content-main-header{text-align:center}.f-page-content-main-header .f-title{margin:0 auto;font-size:20px}.f-page-content-main-header .f-description{margin:0 auto;color:var(--f-text-04)}.f-page-content-main-overflow{flex-shrink:1;flex-grow:1;flex-basis:0;overflow:auto;padding:20px 22px}.f-page-content-main-overflow .f-struct-like-card{margin:0 auto;width:100%;max-width:1092px;box-shadow:none}.f-subgrid-by-table-footer{padding:0 .875rem}.f-subgrid-by-table-footer .btn{color:var(--f-semantic-info-01);background:var(--f-semantic-info-03);width:100%;justify-content:center;height:36px}.f-subgrid-by-table-footer .btn:disabled{color:var(--f-text-07);background:var(--f-neutral-08)}.f-section-oa-table .f-section-header .f-title{padding-left:0}.f-section-oa-table .f-section-header .f-title::before{display:none}.f-section-form.f-section{padding:.625rem 0 .25rem}.f-section-form .f-section-header{padding:0 .875rem;margin-bottom:.875rem}.f-form-layout{display:flex;flex-wrap:wrap}.f-form-layout .f-section-formgroup{flex:0 0 100%;max-width:100%}.f-section-formgroup .f-section-formgroup-legend{width:100%}.f-section-formgroup-legend{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:space-between}.f-section-formgroup-legend .f-header{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:space-between;justify-content:flex-start;color:var(--f-text-04);flex-shrink:1;flex-grow:1;flex-basis:auto;padding:0 .875rem;cursor:pointer;font-size:.875rem}.f-section-formgroup-legend .f-toolbar{justify-content:flex-start}.f-section-formgroup-legend .f-toolbar .btn{border:none;display:flex;align-items:center;font-size:13px;padding-left:.375rem;padding-right:.375rem}.f-section-formgroup-legend .f-btn-collapse-expand{color:var(--f-text-04)}.f-section-formgroup-legend .f-btn-collapse-expand::after{margin:0;font-size:14px}.f-section-formgroup-legend:hover .f-title,.f-section-formgroup-legend:hover .f-toolbar .f-btn-collapse-expand{color:var(--f-theme-05)}.f-section-formgroup-legend:active .f-title,.f-section-formgroup-legend:active .f-toolbar .f-btn-collapse-expand{color:var(--f-theme-01)}.f-section-formgroup-legend.legend-with-toolbar{height:2rem}.f-section-formgroup-legend.legend-with-toolbar .f-header{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:space-between;flex-shrink:1;flex-grow:1;flex-basis:auto;border:1px solid var(--f-aid-08);padding:0 .875rem;height:1.875rem;background:var(--f-aid-09)}.f-section-formgroup-legend.legend-with-toolbar .f-title{font-size:.875rem;color:var(--f-text-02);flex-shrink:1;flex-grow:1;flex-basis:0;cursor:pointer}.f-section-formgroup-inputs{display:flex;flex-wrap:wrap}.f-section-formgroup.f-state-collapse .f-section-formgroup-inputs{display:none}.f-section-formgroup+.f-section-formgroup{margin:.375rem 0 0}.f-cmp-grid-is-sub{min-height:19.375rem}.farris-subgrid{min-height:25.625rem}.f-section-grid.f-section-in-main,.f-section-grid.f-section-in-managelist,.f-section-grid.f-section-in-nav{flex-shrink:1;flex-grow:1;flex-basis:0}.f-section-grid.f-section-in-main .f-section-content,.f-section-grid.f-section-in-managelist .f-section-content,.f-section-grid.f-section-in-nav .f-section-content{flex-shrink:1;flex-grow:1;flex-basis:0;display:flex;flex-direction:column}.f-section-grid.f-section-in-main .f-component-grid,.f-section-grid.f-section-in-managelist .f-component-grid,.f-section-grid.f-section-in-nav .f-component-grid{flex-shrink:1;flex-grow:1;flex-basis:0}.f-section-extend-gridfilter,.f-tmpl-staticinfo-wrapper .staticinfo--header,.f-tmpl-staticinfo-wrapper .staticinfo--header .f-title{display:flex;align-items:center}.f-section-grid .f-component-grid{overflow:hidden}.f-grid-is-sub,.f-grid-is-subsub{height:21.875rem}.f-section-extend-gridfilter{background:var(--f-aid-02);border:1px solid;border-radius:2px;height:2.375rem;padding:.25rem .875rem}.f-page .f-page::before,.f-page-has-scheme .f-page-main .f-page-header::before,.f-page-is-listnav::before,.f-page-is-midcard::before{display:none}.f-section-extend-gridfilter>*{margin:0 .625rem 0 0}.f-grid-is-sub .f-component-grid{flex-shrink:1;flex-grow:1;flex-basis:0;overflow:hidden}.f-page .f-page{background:0 0}.f-page .f-page .f-page-layout{box-shadow:none}.f-page .f-page .f-page-header{margin:0}.f-page .f-page .f-page-main{margin-right:0;margin-left:0;margin-bottom:0}.f-page .f-page-has-scheme .f-section-scheme.f-section{margin-top:0;margin-right:0;margin-left:0}.f-page .f-page-has-scheme .f-page-header{margin-top:.5rem}.f-page-header,.farris-header{box-shadow:none}.f-page-header+.f-page-main,.f-page-header+.farris-split-section,.farris-header+.f-page-main,.farris-header+.farris-split-section{margin-top:0}.f-page-main{border-radius:8px 8px 12px 12px}.f-struct-like-card{box-shadow:none}.f-page.f-page-card,.f-page.f-page-is-managelist,.f-page.f-page-is-managelistwithsidebar,.f-page.f-page-is-onepage,.f-page.f-page-navigate{z-index:10}.f-page.f-page-card::before,.f-page.f-page-is-managelist::before,.f-page.f-page-is-managelistwithsidebar::before,.f-page.f-page-is-onepage::before,.f-page.f-page-navigate::before{z-index:-1;position:absolute;content:"";top:.5rem;bottom:.5rem;left:.5rem;right:.5rem;background:var(--f-neutral-18);box-shadow:0 2px 8px 0 rgba(var(--f-neutral-16),.1);border-radius:12px}.f-page-card .f-page-header,.f-page-card .farris-header,.f-page-is-managelist .f-page-header,.f-page-is-managelist .farris-header,.f-page-is-managelistwithsidebar .f-page-header,.f-page-is-managelistwithsidebar .farris-header,.f-page-is-onepage .f-page-header,.f-page-is-onepage .farris-header,.f-page-navigate .f-page-header,.f-page-navigate .farris-header{margin:.5rem .5rem 0;background:0 0}.f-page-footer{margin-left:.5rem;margin-right:.5rem;margin-bottom:.5rem;background:0 0}.f-page-main+.f-page-footer{margin-top:-.5rem}.f-page-navigate .f-page-main{background:rgba(255,255,255,.7);margin:0 .5rem .5rem}.f-page-navigate .f-page-content-nav{border-right:1px solid var(--f-neutral-07)}.f-page-navigate .f-page-content-nav.has-resize-bar{border-right:none}.f-page-navigate .f-page-content-nav .f-page,.f-page-navigate .f-page-content-nav .farris-main-area{background:0 0}.f-page-navigate .f-page-content-main .f-page-main{background:#fff}.f-page-headerextend{margin:.5rem .5rem 0}.f-page-is-sidescrollspy .f-page-main .f-scrollspy-content{padding:0}.f-scrollspy-tabs{position:relative;box-shadow:0 -2px 20px 0 rgba(3,18,51,.05)!important;z-index:100}.f-scrollspy-tabs .f-scrollspy-monitor-btn.active::after{background-image:var(--f-theme-11);left:14px!important;right:14px!important;width:auto!important;margin:0!important}.f-page-is-midcard .f-page-header{margin:0;background:0 0;box-shadow:none}.f-page-has-scheme .f-page-header{margin:0 .5rem;background:var(--f-neutral-19);position:relative}.f-page-has-scheme .f-page-header::before{content:"";position:absolute;top:-1px;left:0;right:0;box-shadow:0 2px 20px 0 rgba(3,18,51,.05);bottom:5px;z-index:-1;border-radius:.5rem .5rem 0 0}.f-page-has-scheme .f-page-main{margin-top:-.5rem}.f-page-is-mainsubcard .f-page-main{margin:.5rem}.f-page-is-mainsubcard .f-page-header+.f-page-main,.f-page-is-mainsubcard .farris-header+.f-page-main{margin-top:0}.f-page-is-mainsubcard .f-page-main,.f-page-is-mainsubcard.f-page-is-sidescrollspy .f-page-main .f-scrollspy-content{padding:0}.f-page-is-listnav-with-header .f-page-main{background:0 0}.f-page-is-listnav-with-header .f-page-content-main{background:var(--f-neutral-18)}.f-page-is-listnav .f-page-content,.f-page-is-listnav .f-page-content .f-page-content-main .f-page-card,.f-page-is-listnav .f-page-content .f-page-content-main .f-page-is-managelist,.f-page-is-listnav .f-page-content .f-page-content-nav .f-page{background:0 0}.f-page-is-listnav>.f-page-main{margin:.5rem}.f-page-is-listnav .f-page-content .f-page-content-nav{padding:0;box-shadow:0 0 8px 0 rgba(0,28,64,.08);border-right:none}.f-page-is-listnav .f-page-content .f-page-content-nav .f-page::before{top:0;left:0;right:0;bottom:0;border-radius:0;display:block}.f-page-is-listnav .f-page-content .f-page-content-main{margin:0}.f-page-is-listnav .f-page-content .f-page-content-main .f-page-card::before,.f-page-is-listnav .f-page-content .f-page-content-main .f-page-is-managelist::before{top:0;left:0;right:0;bottom:0;border-radius:0;display:block}.f-page .f-list-nav .f-list-nav-in{background:0 0!important;box-shadow:none!important}.f-page.f-page-is-midcard{overflow-y:auto;display:block}.f-page.f-page-is-midcard::-webkit-scrollbar-track{background-color:#EFF2F4}.f-page-layout{background:var(--f-neutral-19);box-shadow:0 2px 8px 0 rgba(var(--f-neutral-16),.1);border-radius:12px;margin:1rem}.f-page-layout .f-page-header{box-shadow:none}.f-page-layout .f-page-header .f-page-header-base{padding-top:1rem;padding-bottom:1rem}.f-page-container{margin:0 auto}@media (min-width:888px){.f-page-container{width:80%}.farris-form .farris-group-wrap{max-width:26.625rem}.farris-form .farris-group-auto .farris-group-wrap,.farris-form-auto .farris-group-wrap{max-width:none}}@media (min-width:1200px){.f-page-container{width:80%}}@media (min-width:1690px){.f-page-container{width:60%}}.f-btn-wrapper{padding-top:18px;padding-bottom:16px;text-align:center}.f-btn-wrapper .btn-lg{margin:0 6px}.f-tmpl-staticinfo-top{font-size:12px;color:rgba(0,0,0,.45);padding:0 0 40px}.f-tmpl-staticinfo-wrapper{background:rgba(42,135,255,.05);border:1px solid rgba(42,135,255,.2);border-radius:3px;padding:14px 20px 6px;margin:0 0 6px}.f-tmpl-staticinfo-wrapper .staticinfo--header .f-title .f-title-icon{margin:0 0 0 12px;border:1px solid #80B8FF;background:#D8E9FF;color:#4796FF;text-align:center;border-radius:2px}.f-tmpl-staticinfo-wrapper .staticinfo--header .f-title .f-title-icon:before{font-size:12px;line-height:14px;display:block}.f-tmpl-staticinfo-wrapper .staticinfo--header .f-title .f-title-icon.f-icon-woman{color:#FF7E7E;border-color:#FCABAB;background:#FFE9E9}.f-tmpl-staticinfo-wrapper .staticinfo--header .f-title .f-title-text{font-size:17px;color:#2D2F33;line-height:30px;margin:0}.f-tmpl-staticinfo-wrapper .staticinfo--content{padding:12px 0 0}.f-tmpl-staticinfo-wrapper .staticinfo--list{display:flex;margin:0 -14px 0 0;flex-wrap:wrap}.f-tmpl-staticinfo-wrapper .staticinfo--list .staticinfo--list-item{position:relative;padding:0 14px 0 0;margin:0 14px 8px 0;color:#36434D;font-size:14px;display:flex;align-items:center}.f-tmpl-staticinfo-wrapper .staticinfo--list .staticinfo--list-item:last-child::after,.f-tmpl-subgrid-by-card-list .f-list-view-multiple .f-list-select .custom-control{display:none}.f-tmpl-staticinfo-wrapper .staticinfo--list .staticinfo--list-item .f-icon{color:#878D99;font-size:13px;margin:0 4px 0 0}.f-tmpl-staticinfo-wrapper .staticinfo--list .staticinfo--list-item .f-title{margin:0 4px 0 0}.f-tmpl-staticinfo-wrapper .staticinfo--list .staticinfo--list-item::after{content:"";height:10px;width:1px;background:#E4E7EF;top:50%;margin-top:-5px;right:0;position:absolute}.f-section-scheme.f-section{background:0 0;margin:.5rem .5rem 0;padding:.625rem .875rem .25rem;box-shadow:none;border-radius:6px 6px 0 0}.f-section-like-query.f-section,.f-section-query.f-section{background:var(--f-neutral-19);margin:.5rem .5rem 0;padding:.625rem .875rem .25rem}.f-section-like-query .f-list-filter.list-filter-autolabel,.f-section-query .f-list-filter.list-filter-autolabel{padding-bottom:0!important}.f-section-like-query.f-section-form{margin:0!important;padding:.625rem 0 .25rem!important}.f-section-scheme{padding:0!important}.f-page-child-fill{flex-direction:column;flex:1 1 0;display:flex!important}.f-page-child-fill .f-struct-like-card-child-fill{display:flex;flex-direction:column;flex:1 1 0;overflow-y:auto}.f-page-child-fill .f-struct-wrapper.f-struct-wrapper-child{flex:1 1 0;flex-direction:column;display:flex;min-height:26.875rem}.f-page-child-fill .f-struct-wrapper.f-struct-wrapper-child:has(>.f-section-accordion.f-state-collapse){min-height:unset;display:block;flex:initial}.f-page-child-fill .f-struct-wrapper.f-struct-wrapper-child .f-section .f-component-tabs{flex:1 1 0;display:flex!important;flex-direction:column!important;overflow:hidden}.f-page-child-fill .f-struct-wrapper-child .f-struct-is-subgrid{flex:1 1 0;flex-direction:column;display:flex}.f-page-child-fill .f-struct-wrapper-child .f-grid-is-sub{height:auto;flex:1 1 0;flex-direction:column;display:flex}.f-page-child-fill .f-struct-wrapper.f-struct-wrapper-child .f-section .f-multiview-fill,.f-page-child-fill .f-struct-wrapper.f-struct-wrapper-child .f-section .f-multiview-fill .f-viewchange-content-item{display:flex;flex-direction:column;flex:1 1 0}.f-page-child-fill .f-struct-wrapper-child .f-section.f-section-fill .f-section-content{overflow:auto}.f-tmpl-subgrid-by-card{position:relative}.f-tmpl-subgrid-by-card .subgrid-by-card-item{padding:12px 12px 10px 40px;border-bottom:1px solid #E9E9E9;position:relative}.f-tmpl-subgrid-by-card .subgrid-by-card-item .card-item--order{position:absolute;top:16px;left:14px;border-radius:2px;background:#51BD78;line-height:1rem;color:#fff;font-size:12px;text-align:center;padding:0 2px;min-width:16px}.f-tmpl-subgrid-by-card .subgrid-by-card-item .card-item--header{padding:0;position:relative;margin:0 0 8px}.f-tmpl-subgrid-by-card .subgrid-by-card-item .card-item--header .card-item--toolbar{position:absolute;right:0;top:0}.f-tmpl-subgrid-by-card .subgrid-by-card-item .card-item--detail,.f-tmpl-subgrid-by-card .subgrid-by-card-item .card-item--title{font-size:1rem}.f-tmpl-subgrid-by-card .subgrid-by-card-item .card-item--detail{font-size:14px;padding:0;color:rgba(0,0,0,.75)}.f-tmpl-subgrid-by-card .subgrid-by-card-item .card-item--detail .card-item--item{margin-bottom:4px}.f-tmpl-subgrid-by-card-list .f-list-view-multiple .f-list-select{position:absolute;width:20px;height:20px;right:0;bottom:0}.f-tmpl-subgrid-by-card-list .f-list-view-multiple .f-list-select::before{position:absolute;font-size:12px;content:"\e118";color:#fff;font-family:FarrisIcons;z-index:100;right:0;bottom:-3px}.f-tmpl-subgrid-by-card-list .f-list-view-multiple .f-list-select::after{content:"";width:20px;height:20px;border:10px solid #fff;border-color:#fff #E6E6E6 #e6e6e6 #fff;position:absolute;bottom:0;right:0}.f-tmpl-subgrid-by-card-list .f-list-view-multiple .f-listview-active .subgrid-by-card-item{background:linear-gradient(270deg,rgba(235,244,255,.6) 0,#EBF4FF 100%)}.f-tmpl-subgrid-by-card-list .f-list-view-multiple .f-listview-active .f-list-select::after{border-color:#fff #63B7FF #63B7FF #fff}.f-tmpl-subgrid-by-card-list .f-list-view-multiple .f-tmpl-subgrid-by-card:hover .f-list-select::after{border-color:#fff #2A87FF #2A87FF #fff}.f-tmpl-subgrid-by-card-list .subgrid-by-card-footer{margin:8px 0 0;border:1px dashed #D9D9D9;height:28px}.f-tmpl-subgrid-by-card-list .subgrid-by-card-footer .btn{display:block;text-align:center;width:100%;height:100%}.farris-split-section{background:var(--f-neutral-19);box-shadow:0 2px 20px 0 rgba(3,18,51,.05);border-radius:8px;margin:.5rem;overflow:hidden;flex-wrap:nowrap}.farris-split-section .farris-lsection{padding:.875rem;box-shadow:1px 1px 4px 0 rgba(0,28,64,.1)}.farris-header,.farris-header+.farris-header{box-shadow:none}.farris-split-section .farris-rsection{padding:.875rem}.f-form-next-tab{margin-bottom:.3125rem!important}.farris-header{min-height:2.875rem;padding:.75rem .875rem;flex-shrink:0;background:var(--f-neutral-00)}.farris-form-title{margin:0;color:var(--f-text-01);font-size:1.0625rem;line-height:1.625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.farris-card-content-bg .farris-panel .card-body{padding:.9375rem 0 0;background:var(--f-neutral-00)}.farris-card-section{padding:.875rem 0 .5rem}.farris-main-area{top:0;bottom:0;position:absolute;right:0;left:0;margin:0 auto;display:flex;background:#EFF2F4;overflow:hidden}.farris-cardpart-title{font-size:1rem;line-height:1.375rem;color:var(--f-text-01);margin:0 0 .75rem}.farris-grid-toolbar{display:flex;margin:0 0 .5rem;flex-shrink:0}.farris-grid-toolbar .farris-grid-title{padding:0;margin:0;font-size:1rem;line-height:1.375rem;color:var(--f-text-01)}.f-header-navbar{padding:0}.form-control{display:block;width:100%;height:calc(1.5357375rem + 2px);padding:.1875rem .5rem;font-size:.8125rem;line-height:1.4286;color:var(--f-text-02);background-color:var(--f-neutral-12);background-clip:padding-box;border:1px solid var(--f-neutral-04);border-radius:6px;box-shadow:0 0 0;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:var(--f-text-02);background-color:var(--f-neutral-12);border-color:var(--f-theme-08);outline:0;box-shadow:0 0 0,0 0 4px 2px rgba(99,136,255,.12)}.form-control::-moz-placeholder{color:var(--f-text-09);opacity:1}.form-control::placeholder{color:var(--f-text-09);opacity:1}.form-control:disabled,.form-control[readonly]{background-color:var(--f-neutral-12);opacity:1}select.form-control:focus::-ms-value{color:var(--f-text-02);background-color:var(--f-neutral-12)}.form-control-file,.form-control-range{display:block;width:100%}.form-control-plaintext{display:block;width:100%;padding-top:.1875rem;padding-bottom:.1875rem;margin-bottom:0;line-height:1.4286;color:var(--f-text-01);background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.32145rem + 2px);padding:.125rem .4375rem;font-size:.75rem;line-height:1.4286;border-radius:6px}.form-control-lg{height:calc(1.750025rem + 2px);padding:.25rem .3125rem;font-size:.875rem;line-height:1.4286;border-radius:6px}select.form-control[multiple],select.form-control[size],textarea.form-control{height:auto}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:var(--f-text-08)}.form-check-label{margin-bottom:0}.form-check-inline{display:inline-flex;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.col-form-label{font-size:inherit;line-height:1.4286}.col-form-label-lg{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.4286}.col-form-label-sm{padding-top:calc(.125rem + 1px);padding-bottom:calc(.125rem + 1px);font-size:.75rem;line-height:1.4286}.form-group{margin-bottom:.375rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:flex;align-items:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:flex;flex-grow:0;flex-shrink:0;flex-basis:auto;flex-flow:row wrap;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.farris-form{flex-shrink:0}.farris-input-wrap{display:block;position:relative}.farris-input-wrap .form-control{width:100%;display:block}.farris-input-wrap .form-control.form-control-invalid{border-color:var(--f-semantic-danger-01)}.farris-input-wrap .form-control.form-control-invalid:focus{box-shadow:0 0 2px 1px rgba(244,97,96,.3)}.farris-input-wrap .input-group .form-control{width:1%}.farris-input-wrap .farris-feedback{position:absolute;top:100%;left:0;padding:.1875rem .5rem;z-index:122;display:none;border-radius:6px;transition:all .2s linear;cursor:pointer}.farris-input-wrap .farris-feedback .f-feedback-message{font-size:.8125rem;line-height:1.4286}.farris-input-wrap .farris-feedback .f-feedback-icon{font-size:14px}.farris-input-wrap .farris-feedback.f-state-invalid,.farris-input-wrap .farris-feedback.f-state-valid{display:block}.farris-input-wrap .farris-feedback.f-state-invalid{background:var(--f-semantic-danger-03);color:var(--f-semantic-danger-01)}.farris-input-wrap .farris-feedback.f-state-valid{background:var(--f-semantic-success-03);color:var(--f-semantic-success-01)}.farris-form-group{flex-wrap:nowrap!important}.farris-form-group .col-form-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.farris-form-group .farris-input-wrap .custom-control-label{display:inline}.farris-form-group .farris-input-wrap .custom-checkbox,.farris-form-group .farris-input-wrap .custom-radio{margin-bottom:0;margin-top:.125rem}.farris-label-info{padding:0 .25rem 0 0;flex-shrink:0}.farris-form-controls-inline .farris-group-wrap .farris-input-wrap,.form-inline .farris-input-wrap{flex-shrink:1;flex-grow:1;flex-basis:auto;min-width:1px}.farris-form-controls-inline .farris-group-wrap .col-form-label,.form-inline .col-form-label{display:flex;align-items:center;justify-content:flex-end!important;flex-direction:row!important}.farris-form-controls-inline .farris-group-wrap,.farris-form-inline{display:block}.farris-form-controls-inline .farris-group-wrap .col-form-label,.farris-form-inline .col-form-label{width:6rem;flex-shrink:0;margin-right:.625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;justify-content:flex-end!important;flex-direction:row!important;align-self:start}.farris-form-controls-inline .farris-group-wrap .col-form-label>*,.farris-form-inline .col-form-label>*{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.farris-form-controls-inline .farris-group-wrap .col-form-label.col-form-label-multi,.farris-form-inline .col-form-label.col-form-label-multi{word-break:break-all;white-space:initial}.farris-form-controls-inline .farris-group-wrap .col-form-label.col-form-label-multi .farris-label-info,.farris-form-inline .col-form-label.col-form-label-multi .farris-label-info{align-self:flex-start;line-height:1.4286}.farris-form-controls-inline .farris-group-wrap .col-form-label.col-form-label-multi .farris-label-text,.farris-form-inline .col-form-label.col-form-label-multi .farris-label-text{white-space:initial;text-align:right;max-height:2.321475rem;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.farris-form-controls-inline .farris-group-wrap .form-group,.farris-form-inline .form-group{margin-bottom:.5rem;flex-wrap:nowrap!important}.farris-form-controls-inline .farris-group-multi-label .farris-group-wrap,.form-inline .farris-group-multi-label .farris-group-wrap{margin-bottom:0}.farris-form-controls-inline .farris-group-multi-label .farris-group-wrap .col-form-label,.form-inline .farris-group-multi-label .farris-group-wrap .col-form-label{padding-top:0;padding-bottom:0;word-break:break-all;white-space:initial}.farris-form-controls-inline .farris-group-multi-label .farris-group-wrap .col-form-label .farris-label-info,.form-inline .farris-group-multi-label .farris-group-wrap .col-form-label .farris-label-info{align-self:flex-start;line-height:1.4286}.farris-form-controls-inline .farris-group-multi-label .farris-group-wrap .col-form-label .farris-label-text,.form-inline .farris-group-multi-label .farris-group-wrap .col-form-label .farris-label-text{white-space:pre-wrap;text-align:right;max-height:2.321475rem;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.farris-form-controls-inline .farris-group-multi-label .farris-group-wrap .farris-input-wrap,.form-inline .farris-group-multi-label .farris-group-wrap .farris-input-wrap{align-self:flex-start}.farris-form-controls-inline.f-form-label-sm .farris-group-wrap .col-form-label,.farris-form-inline.f-form-label-sm .col-form-label{width:4.25rem}.farris-form-controls-inline.f-form-label-lg .farris-group-wrap .col-form-label,.farris-form-inline.f-form-label-lg .col-form-label{width:7.75rem}.farris-form-controls-inline.f-form-label-xl .farris-group-wrap .col-form-label,.farris-form-inline.f-form-label-xl .col-form-label{width:9.5rem}.farris-form-controls-inline.f-form-label-el .farris-group-wrap .col-form-label,.farris-form-inline.f-form-label-el .col-form-label{width:13rem}.farris-form-controls-inline .f-empty-input-placeholder,.farris-form-inline .f-empty-input-placeholder{padding-top:0;margin-top:0;margin-bottom:.5rem}.farris-form-controls-inline .form-group{display:flex;flex:0 0 auto;flex-flow:row wrap;align-items:center;margin-bottom:0}.farris-form-controls-inline .farris-group-ver .col-form-label,.farris-form-controls-inline .farris-group-ver .form-group{display:block}.f-checkradio-no-label .farris-form-controls-inline .col-form-label,.f-checkradio-no-label .farris-form-inline .col-form-label{width:1px;overflow:hidden;height:calc(1.5357375rem + 1px * 2)}.f-checkradio-no-label .farris-form-controls-inline .custom-checkbox,.f-checkradio-no-label .farris-form-controls-inline .custom-radio,.f-checkradio-no-label .farris-form-inline .custom-checkbox,.f-checkradio-no-label .farris-form-inline .custom-radio{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.f-form-lable-auto .col-form-label{width:auto!important}.farris-form-controls-inline .f-checkradio-no-label .col-form-label,.farris-form-inline .f-checkradio-no-label .col-form-label{width:1px;overflow:hidden;height:calc(1.4286 * 1.4286 + .1875rem * 2 + 1px * 2)}.custom-control-label{margin-left:0}.f-input-underline .form-control{border-radius:0;background:0 0;border-width:0 0 1px;border-color:var(--f-neutral-02);border-style:solid}.f-input-underline .form-control:focus{background:0 0;border-color:var(--f-theme-08);color:var(--f-text-02);box-shadow:none}.f-input-underline .form-control:disabled,.f-input-underline .form-control:disabled:hover{background:0 0;border-color:var(--f-neutral-04);border-style:dashed;color:var(--f-text-02)}.f-input-underline .form-control:disabled::-moz-placeholder,.f-input-underline .form-control[readonly]::-moz-placeholder{color:var(--f-text-09)}.f-input-underline .form-control:disabled::placeholder,.f-input-underline .form-control[readonly]::placeholder{color:var(--f-text-09)}.f-input-underline .form-control[readonly],.f-input-underline .form-control[readonly]:hover{background:0 0;border-color:var(--f-neutral-04);border-style:dashed;color:var(--f-text-02)}.f-input-underline .f-cmp-inputgroup.actived .input-group{box-shadow:none}.f-input-underline .input-group{border-radius:0;border-width:0 0 1px;border-color:var(--f-neutral-02);border-style:solid}.f-input-underline .input-group .form-control{border:0}.f-input-underline .input-group.f-state-disabled,.f-input-underline .input-group.f-state-readonly{border-color:var(--f-neutral-04);border-style:dashed}.f-input-underline .input-group.f-state-focus{box-shadow:none}.f-state-form-view .farris-group-wrap .farris-label-text{color:var(--f-text-02)}.f-state-form-view .form-control:focus{background:var(--f-neutral-12);border-color:transparent;color:var(--f-text-02);box-shadow:none}.f-state-form-view .form-control:disabled,.f-state-form-view .form-control:disabled:hover,.f-state-form-view .form-control[readonly],.f-state-form-view .form-control[readonly]:hover{background:var(--f-neutral-12);border-color:transparent;color:var(--f-text-02)}.f-state-form-view .input-group,.f-state-form-view .input-group.f-state-disabled,.f-state-form-view .input-group.f-state-readonly{border-color:transparent}.farris-input-wrap .f-cmp-inputgroup.ng-invalid.ng-dirty .input-group,.farris-input-wrap .f-cmp-inputgroup.ng-invalid.ng-dirty .input-group:hover,.farris-input-wrap .f-cmp-inputgroup.ng-invalid.ng-touched .input-group,.farris-input-wrap .f-cmp-inputgroup.ng-invalid.ng-touched .input-group:hover,.farris-input-wrap .form-control.ng-invalid.ng-dirty,.farris-input-wrap .form-control.ng-invalid.ng-touched{border-color:#dc3545}.f-form-controls-fixed-with .farris-input-wrap{width:3.75rem}.f-checkradio-single{margin:0;padding:0;width:1rem;height:1rem;min-height:1rem;display:inline-flex}.f-checkradio-single .custom-control-label::after,.f-checkradio-single .custom-control-label::before{top:0;left:0}.f-form-table{width:100%;table-layout:fixed}.f-form-table td{padding-left:14px;padding-right:14px}.farris-input-wrap .form-control.ng-invalid.ng-dirty:focus,.farris-input-wrap .form-control.ng-invalid.ng-touched:focus{box-shadow:0 0 2px 1px rgba(220,53,69,.3)}.f-form-state-default .farris-input-wrap .form-control:disabled,.f-form-state-default .farris-input-wrap .form-control[readonly]{color:var(--f-text-02);background:var(--f-neutral-12);border-color:var(--f-neutral-04)}.f-form-state-default .farris-input-wrap .form-control:disabled+.input-append-wrapper,.f-form-state-default .farris-input-wrap .form-control[readonly]+.input-append-wrapper{background:var(--f-neutral-12)}.f-form-state-default .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-default .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-default .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-default .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-default .f-component-timepicker .input-group .form-control:disabled,.f-form-state-default .f-component-timepicker .input-group .form-control[readonly]{color:var(--f-text-02);background:var(--f-neutral-12)}.f-form-state-default .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-default .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-default .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-default .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-default .f-component-timepicker .input-group.f-state-disabled,.f-form-state-default .f-component-timepicker .input-group.f-state-readonly{background:var(--f-neutral-12);border-color:var(--f-neutral-04)}.f-form-state-default .f-cmp-inputgroup .input-group.f-state-disabled .form-control,.f-form-state-default .f-cmp-inputgroup .input-group.f-state-readonly .form-control,.f-form-state-default .f-cmp-number-spinner .input-group.f-state-disabled .form-control,.f-form-state-default .f-cmp-number-spinner .input-group.f-state-readonly .form-control,.f-form-state-default .f-component-timepicker .input-group.f-state-disabled .form-control,.f-form-state-default .f-component-timepicker .input-group.f-state-readonly .form-control{color:var(--f-text-02);background:var(--f-neutral-12)!important}.f-form-state-default .f-cmp-inputgroup .input-group.f-state-disabled .input-group-append,.f-form-state-default .f-cmp-inputgroup .input-group.f-state-readonly .input-group-append,.f-form-state-default .f-cmp-number-spinner .input-group.f-state-disabled .input-group-append,.f-form-state-default .f-cmp-number-spinner .input-group.f-state-readonly .input-group-append,.f-form-state-default .f-component-timepicker .input-group.f-state-disabled .input-group-append,.f-form-state-default .f-component-timepicker .input-group.f-state-readonly .input-group-append{background:var(--f-neutral-12)}.f-form-state-default .f-cmp-inputgroup .input-group.f-state-editable .form-control,.f-form-state-default .f-cmp-number-spinner .input-group.f-state-editable .form-control,.f-form-state-default .f-component-timepicker .input-group.f-state-editable .form-control{color:var(--f-text-02);border-color:var(--f-neutral-04);background:var(--f-neutral-12)}.f-form-state-default .f-state-readonly.k-datepicker .k-picker-wrap,.f-form-state-default .farris-input-wrap .k-autocomplete.k-state-disabled,.f-form-state-default .farris-input-wrap .k-combobox .k-dropdown-wrap.k-state-disabled,.f-form-state-default .farris-input-wrap .k-dateinput .k-dateinput-wrap.k-state-disabled,.f-form-state-default .farris-input-wrap .k-datepicker .k-picker-wrap.k-state-disabled,.f-form-state-default .farris-input-wrap .k-datetimepicker .k-picker-wrap.k-state-disabled,.f-form-state-default .farris-input-wrap .k-dropdown .k-dropdown-wrap.k-state-disabled,.f-form-state-default .farris-input-wrap .k-multiselect-wrap.k-state-disabled,.f-form-state-default .farris-input-wrap .k-numerictextbox .k-numeric-wrap.k-state-disabled,.f-form-state-default .farris-input-wrap .k-timepicker .k-picker-wrap.k-state-disabled{color:var(--f-text-02);background:var(--f-neutral-12);border-color:var(--f-neutral-04)}.f-form-state-default .farris-input-wrap .f-state-readonly.k-autocomplete,.f-form-state-default .farris-input-wrap .f-state-readonly.k-combobox .k-dropdown-wrap,.f-form-state-default .farris-input-wrap .f-state-readonly.k-dateinput .k-dateinput-wrap,.f-form-state-default .farris-input-wrap .f-state-readonly.k-datepicker .k-picker-wrap,.f-form-state-default .farris-input-wrap .f-state-readonly.k-datetimepicker .k-picker-wrap,.f-form-state-default .farris-input-wrap .f-state-readonly.k-dropdown .k-dropdown-wrap,.f-form-state-default .farris-input-wrap .f-state-readonly.k-multiselect-wrap,.f-form-state-default .farris-input-wrap .f-state-readonly.k-numerictextbox .k-numeric-wrap,.f-form-state-default .farris-input-wrap .f-state-readonly.k-timepicker .k-picker-wrap,.f-form-state-default .farris-input-wrap .k-state-disabled.k-dateinput .k-dateinput-wrap,.f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-autocomplete,.f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-combobox .k-dropdown-wrap,.f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-dateinput .k-dateinput-wrap,.f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-datepicker .k-picker-wrap,.f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-datetimepicker .k-picker-wrap,.f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-dropdown .k-dropdown-wrap,.f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-multiselect-wrap,.f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-numerictextbox .k-numeric-wrap,.f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-timepicker .k-picker-wrap{color:var(--f-text-02);background:var(--f-neutral-12);border-color:var(--f-neutral-04)}.f-form-state-default .farris-editor.farris-editor-readonly .mce-container{color:var(--f-text-02);background:var(--f-neutral-12)}.f-form-state-default .farris-html-editor .ql-container.ql-disabled{color:var(--f-text-02);background:var(--f-neutral-12);border-color:var(--f-neutral-04)!important}.f-form-state-default .f-form-pretend-lines .farris-input-wrap .form-control:disabled,.f-form-state-default .f-form-pretend-lines .farris-input-wrap .form-control[readonly]{color:var(--f-text-07);background:var(--f-neutral-10);border-color:var(--f-neutral-06)}.f-form-state-default .f-form-pretend-lines .farris-input-wrap .form-control:disabled+.input-append-wrapper,.f-form-state-default .f-form-pretend-lines .farris-input-wrap .form-control[readonly]+.input-append-wrapper{background:var(--f-neutral-10)}.f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group .form-control:disabled,.f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group .form-control[readonly]{color:var(--f-text-02);background:var(--f-neutral-12)}.f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-disabled,.f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-readonly{background:var(--f-neutral-10);border-color:var(--f-neutral-06)}.f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-disabled .form-control,.f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-readonly .form-control,.f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-disabled .form-control,.f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-readonly .form-control,.f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-disabled .form-control,.f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-readonly .form-control{color:var(--f-text-07);background:var(--f-neutral-10)!important}.f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-disabled .input-group-append,.f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-readonly .input-group-append,.f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-disabled .input-group-append,.f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-readonly .input-group-append,.f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-disabled .input-group-append,.f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-readonly .input-group-append{background:var(--f-neutral-10)}.f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-editable .form-control,.f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-editable .form-control,.f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-editable .form-control{color:var(--f-text-02);border-color:var(--f-neutral-04);background:var(--f-neutral-12)}.f-form-state-default .f-form-pretend-lines .f-state-readonly.k-datepicker .k-picker-wrap,.f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-autocomplete.k-state-disabled,.f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-combobox .k-dropdown-wrap.k-state-disabled,.f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-dateinput .k-dateinput-wrap.k-state-disabled,.f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-datepicker .k-picker-wrap.k-state-disabled,.f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-datetimepicker .k-picker-wrap.k-state-disabled,.f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-dropdown .k-dropdown-wrap.k-state-disabled,.f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-multiselect-wrap.k-state-disabled,.f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-numerictextbox .k-numeric-wrap.k-state-disabled,.f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-timepicker .k-picker-wrap.k-state-disabled{color:var(--f-text-07);background:var(--f-neutral-10);border-color:var(--f-neutral-06)}.f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-autocomplete,.f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-combobox .k-dropdown-wrap,.f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-dateinput .k-dateinput-wrap,.f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-datepicker .k-picker-wrap,.f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-datetimepicker .k-picker-wrap,.f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-dropdown .k-dropdown-wrap,.f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-multiselect-wrap,.f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-numerictextbox .k-numeric-wrap,.f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-timepicker .k-picker-wrap,.f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-state-disabled.k-dateinput .k-dateinput-wrap,.f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-autocomplete,.f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-combobox .k-dropdown-wrap,.f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-dateinput .k-dateinput-wrap,.f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-datepicker .k-picker-wrap,.f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-datetimepicker .k-picker-wrap,.f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-dropdown .k-dropdown-wrap,.f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-multiselect-wrap,.f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-numerictextbox .k-numeric-wrap,.f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-timepicker .k-picker-wrap{color:var(--f-text-07);background:var(--f-neutral-10);border-color:var(--f-neutral-06)}.f-form-state-default .f-form-pretend-lines .farris-editor.farris-editor-readonly .mce-container{color:var(--f-text-07);background:var(--f-neutral-10)}.f-form-state-default .f-form-pretend-lines .farris-html-editor .ql-container.ql-disabled{color:var(--f-text-07);background:var(--f-neutral-10);border-color:var(--f-neutral-06)!important}.f-form-state-create .farris-input-wrap .form-control:disabled,.f-form-state-create .farris-input-wrap .form-control[readonly],.f-form-state-edit .farris-input-wrap .form-control:disabled,.f-form-state-edit .farris-input-wrap .form-control[readonly],.f-input-text-light .farris-input-wrap .form-control:disabled,.f-input-text-light .farris-input-wrap .form-control[readonly]{color:var(--f-text-07);background:var(--f-neutral-10);border-color:var(--f-neutral-06)}.f-form-state-create .farris-input-wrap .form-control:disabled+.input-append-wrapper,.f-form-state-create .farris-input-wrap .form-control[readonly]+.input-append-wrapper,.f-form-state-edit .farris-input-wrap .form-control:disabled+.input-append-wrapper,.f-form-state-edit .farris-input-wrap .form-control[readonly]+.input-append-wrapper,.f-input-text-light .farris-input-wrap .form-control:disabled+.input-append-wrapper,.f-input-text-light .farris-input-wrap .form-control[readonly]+.input-append-wrapper{background:var(--f-neutral-10)}.f-form-state-create .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-create .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-create .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-create .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-create .f-component-timepicker .input-group .form-control:disabled,.f-form-state-create .f-component-timepicker .input-group .form-control[readonly],.f-form-state-edit .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-edit .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-edit .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-edit .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-edit .f-component-timepicker .input-group .form-control:disabled,.f-form-state-edit .f-component-timepicker .input-group .form-control[readonly],.f-input-text-light .f-cmp-inputgroup .input-group .form-control:disabled,.f-input-text-light .f-cmp-inputgroup .input-group .form-control[readonly],.f-input-text-light .f-cmp-number-spinner .input-group .form-control:disabled,.f-input-text-light .f-cmp-number-spinner .input-group .form-control[readonly],.f-input-text-light .f-component-timepicker .input-group .form-control:disabled,.f-input-text-light .f-component-timepicker .input-group .form-control[readonly]{color:var(--f-text-02);background:var(--f-neutral-12)}.f-form-state-create .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-create .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-create .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-create .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-create .f-component-timepicker .input-group.f-state-disabled,.f-form-state-create .f-component-timepicker .input-group.f-state-readonly,.f-form-state-edit .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-edit .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-edit .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-edit .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-edit .f-component-timepicker .input-group.f-state-disabled,.f-form-state-edit .f-component-timepicker .input-group.f-state-readonly,.f-input-text-light .f-cmp-inputgroup .input-group.f-state-disabled,.f-input-text-light .f-cmp-inputgroup .input-group.f-state-readonly,.f-input-text-light .f-cmp-number-spinner .input-group.f-state-disabled,.f-input-text-light .f-cmp-number-spinner .input-group.f-state-readonly,.f-input-text-light .f-component-timepicker .input-group.f-state-disabled,.f-input-text-light .f-component-timepicker .input-group.f-state-readonly{background:var(--f-neutral-10);border-color:var(--f-neutral-06)}.f-form-state-create .f-cmp-inputgroup .input-group.f-state-disabled .form-control,.f-form-state-create .f-cmp-inputgroup .input-group.f-state-readonly .form-control,.f-form-state-create .f-cmp-number-spinner .input-group.f-state-disabled .form-control,.f-form-state-create .f-cmp-number-spinner .input-group.f-state-readonly .form-control,.f-form-state-create .f-component-timepicker .input-group.f-state-disabled .form-control,.f-form-state-create .f-component-timepicker .input-group.f-state-readonly .form-control,.f-form-state-edit .f-cmp-inputgroup .input-group.f-state-disabled .form-control,.f-form-state-edit .f-cmp-inputgroup .input-group.f-state-readonly .form-control,.f-form-state-edit .f-cmp-number-spinner .input-group.f-state-disabled .form-control,.f-form-state-edit .f-cmp-number-spinner .input-group.f-state-readonly .form-control,.f-form-state-edit .f-component-timepicker .input-group.f-state-disabled .form-control,.f-form-state-edit .f-component-timepicker .input-group.f-state-readonly .form-control,.f-input-text-light .f-cmp-inputgroup .input-group.f-state-disabled .form-control,.f-input-text-light .f-cmp-inputgroup .input-group.f-state-readonly .form-control,.f-input-text-light .f-cmp-number-spinner .input-group.f-state-disabled .form-control,.f-input-text-light .f-cmp-number-spinner .input-group.f-state-readonly .form-control,.f-input-text-light .f-component-timepicker .input-group.f-state-disabled .form-control,.f-input-text-light .f-component-timepicker .input-group.f-state-readonly .form-control{color:var(--f-text-07);background:var(--f-neutral-10)!important}.f-form-state-create .f-cmp-inputgroup .input-group.f-state-disabled .input-group-append,.f-form-state-create .f-cmp-inputgroup .input-group.f-state-readonly .input-group-append,.f-form-state-create .f-cmp-number-spinner .input-group.f-state-disabled .input-group-append,.f-form-state-create .f-cmp-number-spinner .input-group.f-state-readonly .input-group-append,.f-form-state-create .f-component-timepicker .input-group.f-state-disabled .input-group-append,.f-form-state-create .f-component-timepicker .input-group.f-state-readonly .input-group-append,.f-form-state-edit .f-cmp-inputgroup .input-group.f-state-disabled .input-group-append,.f-form-state-edit .f-cmp-inputgroup .input-group.f-state-readonly .input-group-append,.f-form-state-edit .f-cmp-number-spinner .input-group.f-state-disabled .input-group-append,.f-form-state-edit .f-cmp-number-spinner .input-group.f-state-readonly .input-group-append,.f-form-state-edit .f-component-timepicker .input-group.f-state-disabled .input-group-append,.f-form-state-edit .f-component-timepicker .input-group.f-state-readonly .input-group-append,.f-input-text-light .f-cmp-inputgroup .input-group.f-state-disabled .input-group-append,.f-input-text-light .f-cmp-inputgroup .input-group.f-state-readonly .input-group-append,.f-input-text-light .f-cmp-number-spinner .input-group.f-state-disabled .input-group-append,.f-input-text-light .f-cmp-number-spinner .input-group.f-state-readonly .input-group-append,.f-input-text-light .f-component-timepicker .input-group.f-state-disabled .input-group-append,.f-input-text-light .f-component-timepicker .input-group.f-state-readonly .input-group-append{background:var(--f-neutral-10)}.f-form-state-create .f-cmp-inputgroup .input-group.f-state-editable .form-control,.f-form-state-create .f-cmp-number-spinner .input-group.f-state-editable .form-control,.f-form-state-create .f-component-timepicker .input-group.f-state-editable .form-control,.f-form-state-edit .f-cmp-inputgroup .input-group.f-state-editable .form-control,.f-form-state-edit .f-cmp-number-spinner .input-group.f-state-editable .form-control,.f-form-state-edit .f-component-timepicker .input-group.f-state-editable .form-control,.f-input-text-light .f-cmp-inputgroup .input-group.f-state-editable .form-control,.f-input-text-light .f-cmp-number-spinner .input-group.f-state-editable .form-control,.f-input-text-light .f-component-timepicker .input-group.f-state-editable .form-control{color:var(--f-text-02);border-color:var(--f-neutral-04);background:var(--f-neutral-12)}.f-form-state-create .f-state-readonly.k-datepicker .k-picker-wrap,.f-form-state-create .farris-input-wrap .k-autocomplete.k-state-disabled,.f-form-state-create .farris-input-wrap .k-combobox .k-dropdown-wrap.k-state-disabled,.f-form-state-create .farris-input-wrap .k-dateinput .k-dateinput-wrap.k-state-disabled,.f-form-state-create .farris-input-wrap .k-datepicker .k-picker-wrap.k-state-disabled,.f-form-state-create .farris-input-wrap .k-datetimepicker .k-picker-wrap.k-state-disabled,.f-form-state-create .farris-input-wrap .k-dropdown .k-dropdown-wrap.k-state-disabled,.f-form-state-create .farris-input-wrap .k-multiselect-wrap.k-state-disabled,.f-form-state-create .farris-input-wrap .k-numerictextbox .k-numeric-wrap.k-state-disabled,.f-form-state-create .farris-input-wrap .k-timepicker .k-picker-wrap.k-state-disabled,.f-form-state-edit .f-state-readonly.k-datepicker .k-picker-wrap,.f-form-state-edit .farris-input-wrap .k-autocomplete.k-state-disabled,.f-form-state-edit .farris-input-wrap .k-combobox .k-dropdown-wrap.k-state-disabled,.f-form-state-edit .farris-input-wrap .k-dateinput .k-dateinput-wrap.k-state-disabled,.f-form-state-edit .farris-input-wrap .k-datepicker .k-picker-wrap.k-state-disabled,.f-form-state-edit .farris-input-wrap .k-datetimepicker .k-picker-wrap.k-state-disabled,.f-form-state-edit .farris-input-wrap .k-dropdown .k-dropdown-wrap.k-state-disabled,.f-form-state-edit .farris-input-wrap .k-multiselect-wrap.k-state-disabled,.f-form-state-edit .farris-input-wrap .k-numerictextbox .k-numeric-wrap.k-state-disabled,.f-form-state-edit .farris-input-wrap .k-timepicker .k-picker-wrap.k-state-disabled,.f-input-text-light .f-state-readonly.k-datepicker .k-picker-wrap,.f-input-text-light .farris-input-wrap .k-autocomplete.k-state-disabled,.f-input-text-light .farris-input-wrap .k-combobox .k-dropdown-wrap.k-state-disabled,.f-input-text-light .farris-input-wrap .k-dateinput .k-dateinput-wrap.k-state-disabled,.f-input-text-light .farris-input-wrap .k-datepicker .k-picker-wrap.k-state-disabled,.f-input-text-light .farris-input-wrap .k-datetimepicker .k-picker-wrap.k-state-disabled,.f-input-text-light .farris-input-wrap .k-dropdown .k-dropdown-wrap.k-state-disabled,.f-input-text-light .farris-input-wrap .k-multiselect-wrap.k-state-disabled,.f-input-text-light .farris-input-wrap .k-numerictextbox .k-numeric-wrap.k-state-disabled,.f-input-text-light .farris-input-wrap .k-timepicker .k-picker-wrap.k-state-disabled{color:var(--f-text-07);background:var(--f-neutral-10);border-color:var(--f-neutral-06)}.f-form-state-create .farris-input-wrap .f-state-readonly.k-autocomplete,.f-form-state-create .farris-input-wrap .f-state-readonly.k-combobox .k-dropdown-wrap,.f-form-state-create .farris-input-wrap .f-state-readonly.k-dateinput .k-dateinput-wrap,.f-form-state-create .farris-input-wrap .f-state-readonly.k-datepicker .k-picker-wrap,.f-form-state-create .farris-input-wrap .f-state-readonly.k-datetimepicker .k-picker-wrap,.f-form-state-create .farris-input-wrap .f-state-readonly.k-dropdown .k-dropdown-wrap,.f-form-state-create .farris-input-wrap .f-state-readonly.k-multiselect-wrap,.f-form-state-create .farris-input-wrap .f-state-readonly.k-numerictextbox .k-numeric-wrap,.f-form-state-create .farris-input-wrap .f-state-readonly.k-timepicker .k-picker-wrap,.f-form-state-create .farris-input-wrap .k-state-disabled.k-dateinput .k-dateinput-wrap,.f-form-state-create .farris-input-wrap [ng-reflect-readonly=true].k-autocomplete,.f-form-state-create .farris-input-wrap [ng-reflect-readonly=true].k-combobox .k-dropdown-wrap,.f-form-state-create .farris-input-wrap [ng-reflect-readonly=true].k-dateinput .k-dateinput-wrap,.f-form-state-create .farris-input-wrap [ng-reflect-readonly=true].k-datepicker .k-picker-wrap,.f-form-state-create .farris-input-wrap [ng-reflect-readonly=true].k-datetimepicker .k-picker-wrap,.f-form-state-create .farris-input-wrap [ng-reflect-readonly=true].k-dropdown .k-dropdown-wrap,.f-form-state-create .farris-input-wrap [ng-reflect-readonly=true].k-multiselect-wrap,.f-form-state-create .farris-input-wrap [ng-reflect-readonly=true].k-numerictextbox .k-numeric-wrap,.f-form-state-create .farris-input-wrap [ng-reflect-readonly=true].k-timepicker .k-picker-wrap,.f-form-state-edit .farris-input-wrap .f-state-readonly.k-autocomplete,.f-form-state-edit .farris-input-wrap .f-state-readonly.k-combobox .k-dropdown-wrap,.f-form-state-edit .farris-input-wrap .f-state-readonly.k-dateinput .k-dateinput-wrap,.f-form-state-edit .farris-input-wrap .f-state-readonly.k-datepicker .k-picker-wrap,.f-form-state-edit .farris-input-wrap .f-state-readonly.k-datetimepicker .k-picker-wrap,.f-form-state-edit .farris-input-wrap .f-state-readonly.k-dropdown .k-dropdown-wrap,.f-form-state-edit .farris-input-wrap .f-state-readonly.k-multiselect-wrap,.f-form-state-edit .farris-input-wrap .f-state-readonly.k-numerictextbox .k-numeric-wrap,.f-form-state-edit .farris-input-wrap .f-state-readonly.k-timepicker .k-picker-wrap,.f-form-state-edit .farris-input-wrap .k-state-disabled.k-dateinput .k-dateinput-wrap,.f-form-state-edit .farris-input-wrap [ng-reflect-readonly=true].k-autocomplete,.f-form-state-edit .farris-input-wrap [ng-reflect-readonly=true].k-combobox .k-dropdown-wrap,.f-form-state-edit .farris-input-wrap [ng-reflect-readonly=true].k-dateinput .k-dateinput-wrap,.f-form-state-edit .farris-input-wrap [ng-reflect-readonly=true].k-datepicker .k-picker-wrap,.f-form-state-edit .farris-input-wrap [ng-reflect-readonly=true].k-datetimepicker .k-picker-wrap,.f-form-state-edit .farris-input-wrap [ng-reflect-readonly=true].k-dropdown .k-dropdown-wrap,.f-form-state-edit .farris-input-wrap [ng-reflect-readonly=true].k-multiselect-wrap,.f-form-state-edit .farris-input-wrap [ng-reflect-readonly=true].k-numerictextbox .k-numeric-wrap,.f-form-state-edit .farris-input-wrap [ng-reflect-readonly=true].k-timepicker .k-picker-wrap,.f-input-text-light .farris-input-wrap .f-state-readonly.k-autocomplete,.f-input-text-light .farris-input-wrap .f-state-readonly.k-combobox .k-dropdown-wrap,.f-input-text-light .farris-input-wrap .f-state-readonly.k-dateinput .k-dateinput-wrap,.f-input-text-light .farris-input-wrap .f-state-readonly.k-datepicker .k-picker-wrap,.f-input-text-light .farris-input-wrap .f-state-readonly.k-datetimepicker .k-picker-wrap,.f-input-text-light .farris-input-wrap .f-state-readonly.k-dropdown .k-dropdown-wrap,.f-input-text-light .farris-input-wrap .f-state-readonly.k-multiselect-wrap,.f-input-text-light .farris-input-wrap .f-state-readonly.k-numerictextbox .k-numeric-wrap,.f-input-text-light .farris-input-wrap .f-state-readonly.k-timepicker .k-picker-wrap,.f-input-text-light .farris-input-wrap .k-state-disabled.k-dateinput .k-dateinput-wrap,.f-input-text-light .farris-input-wrap [ng-reflect-readonly=true].k-autocomplete,.f-input-text-light .farris-input-wrap [ng-reflect-readonly=true].k-combobox .k-dropdown-wrap,.f-input-text-light .farris-input-wrap [ng-reflect-readonly=true].k-dateinput .k-dateinput-wrap,.f-input-text-light .farris-input-wrap [ng-reflect-readonly=true].k-datepicker .k-picker-wrap,.f-input-text-light .farris-input-wrap [ng-reflect-readonly=true].k-datetimepicker .k-picker-wrap,.f-input-text-light .farris-input-wrap [ng-reflect-readonly=true].k-dropdown .k-dropdown-wrap,.f-input-text-light .farris-input-wrap [ng-reflect-readonly=true].k-multiselect-wrap,.f-input-text-light .farris-input-wrap [ng-reflect-readonly=true].k-numerictextbox .k-numeric-wrap,.f-input-text-light .farris-input-wrap [ng-reflect-readonly=true].k-timepicker .k-picker-wrap{color:var(--f-text-07);background:var(--f-neutral-10);border-color:var(--f-neutral-06)}.f-form-state-create .farris-editor.farris-editor-readonly .mce-container,.f-form-state-edit .farris-editor.farris-editor-readonly .mce-container,.f-input-text-light .farris-editor.farris-editor-readonly .mce-container{color:var(--f-text-07);background:var(--f-neutral-10)}.f-form-state-create .farris-html-editor .ql-container.ql-disabled,.f-form-state-edit .farris-html-editor .ql-container.ql-disabled,.f-input-text-light .farris-html-editor .ql-container.ql-disabled{color:var(--f-text-07);background:var(--f-neutral-10);border-color:var(--f-neutral-06)!important}.f-form-state-create .f-form-state-default .farris-input-wrap .form-control:disabled,.f-form-state-create .f-form-state-default .farris-input-wrap .form-control[readonly],.f-form-state-edit .f-form-state-default .farris-input-wrap .form-control:disabled,.f-form-state-edit .f-form-state-default .farris-input-wrap .form-control[readonly],.f-input-text-light .f-form-state-default .farris-input-wrap .form-control:disabled,.f-input-text-light .f-form-state-default .farris-input-wrap .form-control[readonly]{color:var(--f-text-02);background:var(--f-neutral-12);border-color:var(--f-neutral-04)}.f-form-state-create .f-form-state-default .farris-input-wrap .form-control:disabled+.input-append-wrapper,.f-form-state-create .f-form-state-default .farris-input-wrap .form-control[readonly]+.input-append-wrapper,.f-form-state-edit .f-form-state-default .farris-input-wrap .form-control:disabled+.input-append-wrapper,.f-form-state-edit .f-form-state-default .farris-input-wrap .form-control[readonly]+.input-append-wrapper,.f-input-text-light .f-form-state-default .farris-input-wrap .form-control:disabled+.input-append-wrapper,.f-input-text-light .f-form-state-default .farris-input-wrap .form-control[readonly]+.input-append-wrapper{background:var(--f-neutral-12)}.f-form-state-create .f-form-state-default .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .f-component-timepicker .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .f-component-timepicker .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .f-component-timepicker .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .f-component-timepicker .input-group .form-control[readonly],.f-input-text-light .f-form-state-default .f-cmp-inputgroup .input-group .form-control:disabled,.f-input-text-light .f-form-state-default .f-cmp-inputgroup .input-group .form-control[readonly],.f-input-text-light .f-form-state-default .f-cmp-number-spinner .input-group .form-control:disabled,.f-input-text-light .f-form-state-default .f-cmp-number-spinner .input-group .form-control[readonly],.f-input-text-light .f-form-state-default .f-component-timepicker .input-group .form-control:disabled,.f-input-text-light .f-form-state-default .f-component-timepicker .input-group .form-control[readonly]{color:var(--f-text-02);background:var(--f-neutral-12)}.f-form-state-create .f-form-state-default .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .f-component-timepicker .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .f-component-timepicker .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .f-component-timepicker .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .f-component-timepicker .input-group.f-state-readonly,.f-input-text-light .f-form-state-default .f-cmp-inputgroup .input-group.f-state-disabled,.f-input-text-light .f-form-state-default .f-cmp-inputgroup .input-group.f-state-readonly,.f-input-text-light .f-form-state-default .f-cmp-number-spinner .input-group.f-state-disabled,.f-input-text-light .f-form-state-default .f-cmp-number-spinner .input-group.f-state-readonly,.f-input-text-light .f-form-state-default .f-component-timepicker .input-group.f-state-disabled,.f-input-text-light .f-form-state-default .f-component-timepicker .input-group.f-state-readonly{background:var(--f-neutral-12);border-color:var(--f-neutral-04)}.f-form-state-create .f-form-state-default .f-cmp-inputgroup .input-group.f-state-disabled .form-control,.f-form-state-create .f-form-state-default .f-cmp-inputgroup .input-group.f-state-readonly .form-control,.f-form-state-create .f-form-state-default .f-cmp-number-spinner .input-group.f-state-disabled .form-control,.f-form-state-create .f-form-state-default .f-cmp-number-spinner .input-group.f-state-readonly .form-control,.f-form-state-create .f-form-state-default .f-component-timepicker .input-group.f-state-disabled .form-control,.f-form-state-create .f-form-state-default .f-component-timepicker .input-group.f-state-readonly .form-control,.f-form-state-edit .f-form-state-default .f-cmp-inputgroup .input-group.f-state-disabled .form-control,.f-form-state-edit .f-form-state-default .f-cmp-inputgroup .input-group.f-state-readonly .form-control,.f-form-state-edit .f-form-state-default .f-cmp-number-spinner .input-group.f-state-disabled .form-control,.f-form-state-edit .f-form-state-default .f-cmp-number-spinner .input-group.f-state-readonly .form-control,.f-form-state-edit .f-form-state-default .f-component-timepicker .input-group.f-state-disabled .form-control,.f-form-state-edit .f-form-state-default .f-component-timepicker .input-group.f-state-readonly .form-control,.f-input-text-light .f-form-state-default .f-cmp-inputgroup .input-group.f-state-disabled .form-control,.f-input-text-light .f-form-state-default .f-cmp-inputgroup .input-group.f-state-readonly .form-control,.f-input-text-light .f-form-state-default .f-cmp-number-spinner .input-group.f-state-disabled .form-control,.f-input-text-light .f-form-state-default .f-cmp-number-spinner .input-group.f-state-readonly .form-control,.f-input-text-light .f-form-state-default .f-component-timepicker .input-group.f-state-disabled .form-control,.f-input-text-light .f-form-state-default .f-component-timepicker .input-group.f-state-readonly .form-control{color:var(--f-text-02);background:var(--f-neutral-12)!important}.f-form-state-create .f-form-state-default .f-cmp-inputgroup .input-group.f-state-disabled .input-group-append,.f-form-state-create .f-form-state-default .f-cmp-inputgroup .input-group.f-state-readonly .input-group-append,.f-form-state-create .f-form-state-default .f-cmp-number-spinner .input-group.f-state-disabled .input-group-append,.f-form-state-create .f-form-state-default .f-cmp-number-spinner .input-group.f-state-readonly .input-group-append,.f-form-state-create .f-form-state-default .f-component-timepicker .input-group.f-state-disabled .input-group-append,.f-form-state-create .f-form-state-default .f-component-timepicker .input-group.f-state-readonly .input-group-append,.f-form-state-edit .f-form-state-default .f-cmp-inputgroup .input-group.f-state-disabled .input-group-append,.f-form-state-edit .f-form-state-default .f-cmp-inputgroup .input-group.f-state-readonly .input-group-append,.f-form-state-edit .f-form-state-default .f-cmp-number-spinner .input-group.f-state-disabled .input-group-append,.f-form-state-edit .f-form-state-default .f-cmp-number-spinner .input-group.f-state-readonly .input-group-append,.f-form-state-edit .f-form-state-default .f-component-timepicker .input-group.f-state-disabled .input-group-append,.f-form-state-edit .f-form-state-default .f-component-timepicker .input-group.f-state-readonly .input-group-append,.f-input-text-light .f-form-state-default .f-cmp-inputgroup .input-group.f-state-disabled .input-group-append,.f-input-text-light .f-form-state-default .f-cmp-inputgroup .input-group.f-state-readonly .input-group-append,.f-input-text-light .f-form-state-default .f-cmp-number-spinner .input-group.f-state-disabled .input-group-append,.f-input-text-light .f-form-state-default .f-cmp-number-spinner .input-group.f-state-readonly .input-group-append,.f-input-text-light .f-form-state-default .f-component-timepicker .input-group.f-state-disabled .input-group-append,.f-input-text-light .f-form-state-default .f-component-timepicker .input-group.f-state-readonly .input-group-append{background:var(--f-neutral-12)}.f-form-state-create .f-form-state-default .f-cmp-inputgroup .input-group.f-state-editable .form-control,.f-form-state-create .f-form-state-default .f-cmp-number-spinner .input-group.f-state-editable .form-control,.f-form-state-create .f-form-state-default .f-component-timepicker .input-group.f-state-editable .form-control,.f-form-state-edit .f-form-state-default .f-cmp-inputgroup .input-group.f-state-editable .form-control,.f-form-state-edit .f-form-state-default .f-cmp-number-spinner .input-group.f-state-editable .form-control,.f-form-state-edit .f-form-state-default .f-component-timepicker .input-group.f-state-editable .form-control,.f-input-text-light .f-form-state-default .f-cmp-inputgroup .input-group.f-state-editable .form-control,.f-input-text-light .f-form-state-default .f-cmp-number-spinner .input-group.f-state-editable .form-control,.f-input-text-light .f-form-state-default .f-component-timepicker .input-group.f-state-editable .form-control{color:var(--f-text-02);border-color:var(--f-neutral-04);background:var(--f-neutral-12)}.f-form-state-create .f-form-state-default .f-state-readonly.k-datepicker .k-picker-wrap,.f-form-state-create .f-form-state-default .farris-input-wrap .k-autocomplete.k-state-disabled,.f-form-state-create .f-form-state-default .farris-input-wrap .k-combobox .k-dropdown-wrap.k-state-disabled,.f-form-state-create .f-form-state-default .farris-input-wrap .k-dateinput .k-dateinput-wrap.k-state-disabled,.f-form-state-create .f-form-state-default .farris-input-wrap .k-datepicker .k-picker-wrap.k-state-disabled,.f-form-state-create .f-form-state-default .farris-input-wrap .k-datetimepicker .k-picker-wrap.k-state-disabled,.f-form-state-create .f-form-state-default .farris-input-wrap .k-dropdown .k-dropdown-wrap.k-state-disabled,.f-form-state-create .f-form-state-default .farris-input-wrap .k-multiselect-wrap.k-state-disabled,.f-form-state-create .f-form-state-default .farris-input-wrap .k-numerictextbox .k-numeric-wrap.k-state-disabled,.f-form-state-create .f-form-state-default .farris-input-wrap .k-timepicker .k-picker-wrap.k-state-disabled,.f-form-state-edit .f-form-state-default .f-state-readonly.k-datepicker .k-picker-wrap,.f-form-state-edit .f-form-state-default .farris-input-wrap .k-autocomplete.k-state-disabled,.f-form-state-edit .f-form-state-default .farris-input-wrap .k-combobox .k-dropdown-wrap.k-state-disabled,.f-form-state-edit .f-form-state-default .farris-input-wrap .k-dateinput .k-dateinput-wrap.k-state-disabled,.f-form-state-edit .f-form-state-default .farris-input-wrap .k-datepicker .k-picker-wrap.k-state-disabled,.f-form-state-edit .f-form-state-default .farris-input-wrap .k-datetimepicker .k-picker-wrap.k-state-disabled,.f-form-state-edit .f-form-state-default .farris-input-wrap .k-dropdown .k-dropdown-wrap.k-state-disabled,.f-form-state-edit .f-form-state-default .farris-input-wrap .k-multiselect-wrap.k-state-disabled,.f-form-state-edit .f-form-state-default .farris-input-wrap .k-numerictextbox .k-numeric-wrap.k-state-disabled,.f-form-state-edit .f-form-state-default .farris-input-wrap .k-timepicker .k-picker-wrap.k-state-disabled,.f-input-text-light .f-form-state-default .f-state-readonly.k-datepicker .k-picker-wrap,.f-input-text-light .f-form-state-default .farris-input-wrap .k-autocomplete.k-state-disabled,.f-input-text-light .f-form-state-default .farris-input-wrap .k-combobox .k-dropdown-wrap.k-state-disabled,.f-input-text-light .f-form-state-default .farris-input-wrap .k-dateinput .k-dateinput-wrap.k-state-disabled,.f-input-text-light .f-form-state-default .farris-input-wrap .k-datepicker .k-picker-wrap.k-state-disabled,.f-input-text-light .f-form-state-default .farris-input-wrap .k-datetimepicker .k-picker-wrap.k-state-disabled,.f-input-text-light .f-form-state-default .farris-input-wrap .k-dropdown .k-dropdown-wrap.k-state-disabled,.f-input-text-light .f-form-state-default .farris-input-wrap .k-multiselect-wrap.k-state-disabled,.f-input-text-light .f-form-state-default .farris-input-wrap .k-numerictextbox .k-numeric-wrap.k-state-disabled,.f-input-text-light .f-form-state-default .farris-input-wrap .k-timepicker .k-picker-wrap.k-state-disabled{color:var(--f-text-02);background:var(--f-neutral-12);border-color:var(--f-neutral-04)}.f-form-state-create .f-form-state-default .farris-input-wrap .f-state-readonly.k-autocomplete,.f-form-state-create .f-form-state-default .farris-input-wrap .f-state-readonly.k-combobox .k-dropdown-wrap,.f-form-state-create .f-form-state-default .farris-input-wrap .f-state-readonly.k-dateinput .k-dateinput-wrap,.f-form-state-create .f-form-state-default .farris-input-wrap .f-state-readonly.k-datepicker .k-picker-wrap,.f-form-state-create .f-form-state-default .farris-input-wrap .f-state-readonly.k-datetimepicker .k-picker-wrap,.f-form-state-create .f-form-state-default .farris-input-wrap .f-state-readonly.k-dropdown .k-dropdown-wrap,.f-form-state-create .f-form-state-default .farris-input-wrap .f-state-readonly.k-multiselect-wrap,.f-form-state-create .f-form-state-default .farris-input-wrap .f-state-readonly.k-numerictextbox .k-numeric-wrap,.f-form-state-create .f-form-state-default .farris-input-wrap .f-state-readonly.k-timepicker .k-picker-wrap,.f-form-state-create .f-form-state-default .farris-input-wrap .k-state-disabled.k-dateinput .k-dateinput-wrap,.f-form-state-create .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-autocomplete,.f-form-state-create .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-combobox .k-dropdown-wrap,.f-form-state-create .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-dateinput .k-dateinput-wrap,.f-form-state-create .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-datepicker .k-picker-wrap,.f-form-state-create .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-datetimepicker .k-picker-wrap,.f-form-state-create .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-dropdown .k-dropdown-wrap,.f-form-state-create .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-multiselect-wrap,.f-form-state-create .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-numerictextbox .k-numeric-wrap,.f-form-state-create .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-timepicker .k-picker-wrap,.f-form-state-edit .f-form-state-default .farris-input-wrap .f-state-readonly.k-autocomplete,.f-form-state-edit .f-form-state-default .farris-input-wrap .f-state-readonly.k-combobox .k-dropdown-wrap,.f-form-state-edit .f-form-state-default .farris-input-wrap .f-state-readonly.k-dateinput .k-dateinput-wrap,.f-form-state-edit .f-form-state-default .farris-input-wrap .f-state-readonly.k-datepicker .k-picker-wrap,.f-form-state-edit .f-form-state-default .farris-input-wrap .f-state-readonly.k-datetimepicker .k-picker-wrap,.f-form-state-edit .f-form-state-default .farris-input-wrap .f-state-readonly.k-dropdown .k-dropdown-wrap,.f-form-state-edit .f-form-state-default .farris-input-wrap .f-state-readonly.k-multiselect-wrap,.f-form-state-edit .f-form-state-default .farris-input-wrap .f-state-readonly.k-numerictextbox .k-numeric-wrap,.f-form-state-edit .f-form-state-default .farris-input-wrap .f-state-readonly.k-timepicker .k-picker-wrap,.f-form-state-edit .f-form-state-default .farris-input-wrap .k-state-disabled.k-dateinput .k-dateinput-wrap,.f-form-state-edit .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-autocomplete,.f-form-state-edit .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-combobox .k-dropdown-wrap,.f-form-state-edit .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-dateinput .k-dateinput-wrap,.f-form-state-edit .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-datepicker .k-picker-wrap,.f-form-state-edit .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-datetimepicker .k-picker-wrap,.f-form-state-edit .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-dropdown .k-dropdown-wrap,.f-form-state-edit .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-multiselect-wrap,.f-form-state-edit .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-numerictextbox .k-numeric-wrap,.f-form-state-edit .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-timepicker .k-picker-wrap,.f-input-text-light .f-form-state-default .farris-input-wrap .f-state-readonly.k-autocomplete,.f-input-text-light .f-form-state-default .farris-input-wrap .f-state-readonly.k-combobox .k-dropdown-wrap,.f-input-text-light .f-form-state-default .farris-input-wrap .f-state-readonly.k-dateinput .k-dateinput-wrap,.f-input-text-light .f-form-state-default .farris-input-wrap .f-state-readonly.k-datepicker .k-picker-wrap,.f-input-text-light .f-form-state-default .farris-input-wrap .f-state-readonly.k-datetimepicker .k-picker-wrap,.f-input-text-light .f-form-state-default .farris-input-wrap .f-state-readonly.k-dropdown .k-dropdown-wrap,.f-input-text-light .f-form-state-default .farris-input-wrap .f-state-readonly.k-multiselect-wrap,.f-input-text-light .f-form-state-default .farris-input-wrap .f-state-readonly.k-numerictextbox .k-numeric-wrap,.f-input-text-light .f-form-state-default .farris-input-wrap .f-state-readonly.k-timepicker .k-picker-wrap,.f-input-text-light .f-form-state-default .farris-input-wrap .k-state-disabled.k-dateinput .k-dateinput-wrap,.f-input-text-light .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-autocomplete,.f-input-text-light .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-combobox .k-dropdown-wrap,.f-input-text-light .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-dateinput .k-dateinput-wrap,.f-input-text-light .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-datepicker .k-picker-wrap,.f-input-text-light .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-datetimepicker .k-picker-wrap,.f-input-text-light .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-dropdown .k-dropdown-wrap,.f-input-text-light .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-multiselect-wrap,.f-input-text-light .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-numerictextbox .k-numeric-wrap,.f-input-text-light .f-form-state-default .farris-input-wrap [ng-reflect-readonly=true].k-timepicker .k-picker-wrap{color:var(--f-text-02);background:var(--f-neutral-12);border-color:var(--f-neutral-04)}.f-form-state-create .f-form-state-default .farris-editor.farris-editor-readonly .mce-container,.f-form-state-edit .f-form-state-default .farris-editor.farris-editor-readonly .mce-container,.f-input-text-light .f-form-state-default .farris-editor.farris-editor-readonly .mce-container{color:var(--f-text-02);background:var(--f-neutral-12)}.f-form-state-create .f-form-state-default .farris-html-editor .ql-container.ql-disabled,.f-form-state-edit .f-form-state-default .farris-html-editor .ql-container.ql-disabled,.f-input-text-light .f-form-state-default .farris-html-editor .ql-container.ql-disabled{color:var(--f-text-02);background:var(--f-neutral-12);border-color:var(--f-neutral-04)!important}.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap .form-control:disabled,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap .form-control[readonly],.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap .form-control:disabled,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap .form-control[readonly],.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap .form-control:disabled,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap .form-control[readonly]{color:var(--f-text-07);background:var(--f-neutral-10);border-color:var(--f-neutral-06)}.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap .form-control:disabled+.input-append-wrapper,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap .form-control[readonly]+.input-append-wrapper,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap .form-control:disabled+.input-append-wrapper,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap .form-control[readonly]+.input-append-wrapper,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap .form-control:disabled+.input-append-wrapper,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap .form-control[readonly]+.input-append-wrapper{background:var(--f-neutral-10)}.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group .form-control[readonly],.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group .form-control:disabled,.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group .form-control[readonly],.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group .form-control:disabled,.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group .form-control[readonly],.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group .form-control:disabled,.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group .form-control[readonly]{color:var(--f-text-02);background:var(--f-neutral-12)}.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-readonly,.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-disabled,.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-readonly,.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-disabled,.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-readonly,.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-disabled,.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-readonly{background:var(--f-neutral-10);border-color:var(--f-neutral-06)}.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-disabled .form-control,.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-readonly .form-control,.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-disabled .form-control,.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-readonly .form-control,.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-disabled .form-control,.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-readonly .form-control,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-disabled .form-control,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-readonly .form-control,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-disabled .form-control,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-readonly .form-control,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-disabled .form-control,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-readonly .form-control,.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-disabled .form-control,.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-readonly .form-control,.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-disabled .form-control,.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-readonly .form-control,.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-disabled .form-control,.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-readonly .form-control{color:var(--f-text-07);background:var(--f-neutral-10)!important}.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-disabled .input-group-append,.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-readonly .input-group-append,.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-disabled .input-group-append,.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-readonly .input-group-append,.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-disabled .input-group-append,.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-readonly .input-group-append,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-disabled .input-group-append,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-readonly .input-group-append,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-disabled .input-group-append,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-readonly .input-group-append,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-disabled .input-group-append,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-readonly .input-group-append,.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-disabled .input-group-append,.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-readonly .input-group-append,.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-disabled .input-group-append,.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-readonly .input-group-append,.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-disabled .input-group-append,.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-readonly .input-group-append{background:var(--f-neutral-10)}.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-editable .form-control,.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-editable .form-control,.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-editable .form-control,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-editable .form-control,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-editable .form-control,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-editable .form-control,.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-cmp-inputgroup .input-group.f-state-editable .form-control,.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-cmp-number-spinner .input-group.f-state-editable .form-control,.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-component-timepicker .input-group.f-state-editable .form-control{color:var(--f-text-02);border-color:var(--f-neutral-04);background:var(--f-neutral-12)}.f-form-state-create .f-form-state-default .f-form-pretend-lines .f-state-readonly.k-datepicker .k-picker-wrap,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-autocomplete.k-state-disabled,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-combobox .k-dropdown-wrap.k-state-disabled,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-dateinput .k-dateinput-wrap.k-state-disabled,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-datepicker .k-picker-wrap.k-state-disabled,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-datetimepicker .k-picker-wrap.k-state-disabled,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-dropdown .k-dropdown-wrap.k-state-disabled,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-multiselect-wrap.k-state-disabled,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-numerictextbox .k-numeric-wrap.k-state-disabled,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-timepicker .k-picker-wrap.k-state-disabled,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .f-state-readonly.k-datepicker .k-picker-wrap,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-autocomplete.k-state-disabled,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-combobox .k-dropdown-wrap.k-state-disabled,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-dateinput .k-dateinput-wrap.k-state-disabled,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-datepicker .k-picker-wrap.k-state-disabled,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-datetimepicker .k-picker-wrap.k-state-disabled,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-dropdown .k-dropdown-wrap.k-state-disabled,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-multiselect-wrap.k-state-disabled,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-numerictextbox .k-numeric-wrap.k-state-disabled,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-timepicker .k-picker-wrap.k-state-disabled,.f-input-text-light .f-form-state-default .f-form-pretend-lines .f-state-readonly.k-datepicker .k-picker-wrap,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-autocomplete.k-state-disabled,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-combobox .k-dropdown-wrap.k-state-disabled,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-dateinput .k-dateinput-wrap.k-state-disabled,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-datepicker .k-picker-wrap.k-state-disabled,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-datetimepicker .k-picker-wrap.k-state-disabled,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-dropdown .k-dropdown-wrap.k-state-disabled,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-multiselect-wrap.k-state-disabled,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-numerictextbox .k-numeric-wrap.k-state-disabled,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-timepicker .k-picker-wrap.k-state-disabled{color:var(--f-text-07);background:var(--f-neutral-10);border-color:var(--f-neutral-06)}.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-autocomplete,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-combobox .k-dropdown-wrap,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-dateinput .k-dateinput-wrap,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-datepicker .k-picker-wrap,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-datetimepicker .k-picker-wrap,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-dropdown .k-dropdown-wrap,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-multiselect-wrap,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-numerictextbox .k-numeric-wrap,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-timepicker .k-picker-wrap,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-state-disabled.k-dateinput .k-dateinput-wrap,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-autocomplete,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-combobox .k-dropdown-wrap,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-dateinput .k-dateinput-wrap,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-datepicker .k-picker-wrap,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-datetimepicker .k-picker-wrap,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-dropdown .k-dropdown-wrap,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-multiselect-wrap,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-numerictextbox .k-numeric-wrap,.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-timepicker .k-picker-wrap,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-autocomplete,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-combobox .k-dropdown-wrap,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-dateinput .k-dateinput-wrap,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-datepicker .k-picker-wrap,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-datetimepicker .k-picker-wrap,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-dropdown .k-dropdown-wrap,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-multiselect-wrap,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-numerictextbox .k-numeric-wrap,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-timepicker .k-picker-wrap,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-state-disabled.k-dateinput .k-dateinput-wrap,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-autocomplete,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-combobox .k-dropdown-wrap,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-dateinput .k-dateinput-wrap,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-datepicker .k-picker-wrap,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-datetimepicker .k-picker-wrap,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-dropdown .k-dropdown-wrap,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-multiselect-wrap,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-numerictextbox .k-numeric-wrap,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-timepicker .k-picker-wrap,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-autocomplete,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-combobox .k-dropdown-wrap,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-dateinput .k-dateinput-wrap,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-datepicker .k-picker-wrap,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-datetimepicker .k-picker-wrap,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-dropdown .k-dropdown-wrap,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-multiselect-wrap,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-numerictextbox .k-numeric-wrap,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap .f-state-readonly.k-timepicker .k-picker-wrap,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap .k-state-disabled.k-dateinput .k-dateinput-wrap,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-autocomplete,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-combobox .k-dropdown-wrap,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-dateinput .k-dateinput-wrap,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-datepicker .k-picker-wrap,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-datetimepicker .k-picker-wrap,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-dropdown .k-dropdown-wrap,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-multiselect-wrap,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-numerictextbox .k-numeric-wrap,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-input-wrap [ng-reflect-readonly=true].k-timepicker .k-picker-wrap{color:var(--f-text-07);background:var(--f-neutral-10);border-color:var(--f-neutral-06)}.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-editor.farris-editor-readonly .mce-container,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-editor.farris-editor-readonly .mce-container,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-editor.farris-editor-readonly .mce-container{color:var(--f-text-07);background:var(--f-neutral-10)}.f-form-state-create .f-form-state-default .f-form-pretend-lines .farris-html-editor .ql-container.ql-disabled,.f-form-state-edit .f-form-state-default .f-form-pretend-lines .farris-html-editor .ql-container.ql-disabled,.f-input-text-light .f-form-state-default .f-form-pretend-lines .farris-html-editor .ql-container.ql-disabled{color:var(--f-text-07);background:var(--f-neutral-10);border-color:var(--f-neutral-06)!important}.f-form-state-default .f-form-state-create .farris-input-wrap .form-control:disabled,.f-form-state-default .f-form-state-create .farris-input-wrap .form-control[readonly],.f-form-state-default .f-form-state-edit .farris-input-wrap .form-control:disabled,.f-form-state-default .f-form-state-edit .farris-input-wrap .form-control[readonly],.f-form-state-default .f-input-text-light .farris-input-wrap .form-control:disabled,.f-form-state-default .f-input-text-light .farris-input-wrap .form-control[readonly]{color:var(--f-text-07);background:var(--f-neutral-10);border-color:var(--f-neutral-06)}.f-form-state-default .f-form-state-create .farris-input-wrap .form-control:disabled+.input-append-wrapper,.f-form-state-default .f-form-state-create .farris-input-wrap .form-control[readonly]+.input-append-wrapper,.f-form-state-default .f-form-state-edit .farris-input-wrap .form-control:disabled+.input-append-wrapper,.f-form-state-default .f-form-state-edit .farris-input-wrap .form-control[readonly]+.input-append-wrapper,.f-form-state-default .f-input-text-light .farris-input-wrap .form-control:disabled+.input-append-wrapper,.f-form-state-default .f-input-text-light .farris-input-wrap .form-control[readonly]+.input-append-wrapper{background:var(--f-neutral-10)}.f-form-state-default .f-form-state-create .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-default .f-form-state-create .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-default .f-form-state-create .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-default .f-form-state-create .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-default .f-form-state-create .f-component-timepicker .input-group .form-control:disabled,.f-form-state-default .f-form-state-create .f-component-timepicker .input-group .form-control[readonly],.f-form-state-default .f-form-state-edit .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-default .f-form-state-edit .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-default .f-form-state-edit .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-default .f-form-state-edit .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-default .f-form-state-edit .f-component-timepicker .input-group .form-control:disabled,.f-form-state-default .f-form-state-edit .f-component-timepicker .input-group .form-control[readonly],.f-form-state-default .f-input-text-light .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-default .f-input-text-light .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-default .f-input-text-light .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-default .f-input-text-light .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-default .f-input-text-light .f-component-timepicker .input-group .form-control:disabled,.f-form-state-default .f-input-text-light .f-component-timepicker .input-group .form-control[readonly]{color:var(--f-text-02);background:var(--f-neutral-12)}.f-form-state-default .f-form-state-create .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-default .f-form-state-create .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-default .f-form-state-create .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-default .f-form-state-create .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-default .f-form-state-create .f-component-timepicker .input-group.f-state-disabled,.f-form-state-default .f-form-state-create .f-component-timepicker .input-group.f-state-readonly,.f-form-state-default .f-form-state-edit .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-default .f-form-state-edit .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-default .f-form-state-edit .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-default .f-form-state-edit .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-default .f-form-state-edit .f-component-timepicker .input-group.f-state-disabled,.f-form-state-default .f-form-state-edit .f-component-timepicker .input-group.f-state-readonly,.f-form-state-default .f-input-text-light .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-default .f-input-text-light .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-default .f-input-text-light .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-default .f-input-text-light .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-default .f-input-text-light .f-component-timepicker .input-group.f-state-disabled,.f-form-state-default .f-input-text-light .f-component-timepicker .input-group.f-state-readonly{background:var(--f-neutral-10);border-color:var(--f-neutral-06)}.f-form-state-default .f-form-state-create .f-cmp-inputgroup .input-group.f-state-disabled .form-control,.f-form-state-default .f-form-state-create .f-cmp-inputgroup .input-group.f-state-readonly .form-control,.f-form-state-default .f-form-state-create .f-cmp-number-spinner .input-group.f-state-disabled .form-control,.f-form-state-default .f-form-state-create .f-cmp-number-spinner .input-group.f-state-readonly .form-control,.f-form-state-default .f-form-state-create .f-component-timepicker .input-group.f-state-disabled .form-control,.f-form-state-default .f-form-state-create .f-component-timepicker .input-group.f-state-readonly .form-control,.f-form-state-default .f-form-state-edit .f-cmp-inputgroup .input-group.f-state-disabled .form-control,.f-form-state-default .f-form-state-edit .f-cmp-inputgroup .input-group.f-state-readonly .form-control,.f-form-state-default .f-form-state-edit .f-cmp-number-spinner .input-group.f-state-disabled .form-control,.f-form-state-default .f-form-state-edit .f-cmp-number-spinner .input-group.f-state-readonly .form-control,.f-form-state-default .f-form-state-edit .f-component-timepicker .input-group.f-state-disabled .form-control,.f-form-state-default .f-form-state-edit .f-component-timepicker .input-group.f-state-readonly .form-control,.f-form-state-default .f-input-text-light .f-cmp-inputgroup .input-group.f-state-disabled .form-control,.f-form-state-default .f-input-text-light .f-cmp-inputgroup .input-group.f-state-readonly .form-control,.f-form-state-default .f-input-text-light .f-cmp-number-spinner .input-group.f-state-disabled .form-control,.f-form-state-default .f-input-text-light .f-cmp-number-spinner .input-group.f-state-readonly .form-control,.f-form-state-default .f-input-text-light .f-component-timepicker .input-group.f-state-disabled .form-control,.f-form-state-default .f-input-text-light .f-component-timepicker .input-group.f-state-readonly .form-control{color:var(--f-text-07);background:var(--f-neutral-10)!important}.f-form-state-default .f-form-state-create .f-cmp-inputgroup .input-group.f-state-disabled .input-group-append,.f-form-state-default .f-form-state-create .f-cmp-inputgroup .input-group.f-state-readonly .input-group-append,.f-form-state-default .f-form-state-create .f-cmp-number-spinner .input-group.f-state-disabled .input-group-append,.f-form-state-default .f-form-state-create .f-cmp-number-spinner .input-group.f-state-readonly .input-group-append,.f-form-state-default .f-form-state-create .f-component-timepicker .input-group.f-state-disabled .input-group-append,.f-form-state-default .f-form-state-create .f-component-timepicker .input-group.f-state-readonly .input-group-append,.f-form-state-default .f-form-state-edit .f-cmp-inputgroup .input-group.f-state-disabled .input-group-append,.f-form-state-default .f-form-state-edit .f-cmp-inputgroup .input-group.f-state-readonly .input-group-append,.f-form-state-default .f-form-state-edit .f-cmp-number-spinner .input-group.f-state-disabled .input-group-append,.f-form-state-default .f-form-state-edit .f-cmp-number-spinner .input-group.f-state-readonly .input-group-append,.f-form-state-default .f-form-state-edit .f-component-timepicker .input-group.f-state-disabled .input-group-append,.f-form-state-default .f-form-state-edit .f-component-timepicker .input-group.f-state-readonly .input-group-append,.f-form-state-default .f-input-text-light .f-cmp-inputgroup .input-group.f-state-disabled .input-group-append,.f-form-state-default .f-input-text-light .f-cmp-inputgroup .input-group.f-state-readonly .input-group-append,.f-form-state-default .f-input-text-light .f-cmp-number-spinner .input-group.f-state-disabled .input-group-append,.f-form-state-default .f-input-text-light .f-cmp-number-spinner .input-group.f-state-readonly .input-group-append,.f-form-state-default .f-input-text-light .f-component-timepicker .input-group.f-state-disabled .input-group-append,.f-form-state-default .f-input-text-light .f-component-timepicker .input-group.f-state-readonly .input-group-append{background:var(--f-neutral-10)}.f-form-state-default .f-form-state-create .f-cmp-inputgroup .input-group.f-state-editable .form-control,.f-form-state-default .f-form-state-create .f-cmp-number-spinner .input-group.f-state-editable .form-control,.f-form-state-default .f-form-state-create .f-component-timepicker .input-group.f-state-editable .form-control,.f-form-state-default .f-form-state-edit .f-cmp-inputgroup .input-group.f-state-editable .form-control,.f-form-state-default .f-form-state-edit .f-cmp-number-spinner .input-group.f-state-editable .form-control,.f-form-state-default .f-form-state-edit .f-component-timepicker .input-group.f-state-editable .form-control,.f-form-state-default .f-input-text-light .f-cmp-inputgroup .input-group.f-state-editable .form-control,.f-form-state-default .f-input-text-light .f-cmp-number-spinner .input-group.f-state-editable .form-control,.f-form-state-default .f-input-text-light .f-component-timepicker .input-group.f-state-editable .form-control{color:var(--f-text-02);border-color:var(--f-neutral-04);background:var(--f-neutral-12)}.f-form-state-default .f-form-state-create .f-state-readonly.k-datepicker .k-picker-wrap,.f-form-state-default .f-form-state-create .farris-input-wrap .k-autocomplete.k-state-disabled,.f-form-state-default .f-form-state-create .farris-input-wrap .k-combobox .k-dropdown-wrap.k-state-disabled,.f-form-state-default .f-form-state-create .farris-input-wrap .k-dateinput .k-dateinput-wrap.k-state-disabled,.f-form-state-default .f-form-state-create .farris-input-wrap .k-datepicker .k-picker-wrap.k-state-disabled,.f-form-state-default .f-form-state-create .farris-input-wrap .k-datetimepicker .k-picker-wrap.k-state-disabled,.f-form-state-default .f-form-state-create .farris-input-wrap .k-dropdown .k-dropdown-wrap.k-state-disabled,.f-form-state-default .f-form-state-create .farris-input-wrap .k-multiselect-wrap.k-state-disabled,.f-form-state-default .f-form-state-create .farris-input-wrap .k-numerictextbox .k-numeric-wrap.k-state-disabled,.f-form-state-default .f-form-state-create .farris-input-wrap .k-timepicker .k-picker-wrap.k-state-disabled,.f-form-state-default .f-form-state-edit .f-state-readonly.k-datepicker .k-picker-wrap,.f-form-state-default .f-form-state-edit .farris-input-wrap .k-autocomplete.k-state-disabled,.f-form-state-default .f-form-state-edit .farris-input-wrap .k-combobox .k-dropdown-wrap.k-state-disabled,.f-form-state-default .f-form-state-edit .farris-input-wrap .k-dateinput .k-dateinput-wrap.k-state-disabled,.f-form-state-default .f-form-state-edit .farris-input-wrap .k-datepicker .k-picker-wrap.k-state-disabled,.f-form-state-default .f-form-state-edit .farris-input-wrap .k-datetimepicker .k-picker-wrap.k-state-disabled,.f-form-state-default .f-form-state-edit .farris-input-wrap .k-dropdown .k-dropdown-wrap.k-state-disabled,.f-form-state-default .f-form-state-edit .farris-input-wrap .k-multiselect-wrap.k-state-disabled,.f-form-state-default .f-form-state-edit .farris-input-wrap .k-numerictextbox .k-numeric-wrap.k-state-disabled,.f-form-state-default .f-form-state-edit .farris-input-wrap .k-timepicker .k-picker-wrap.k-state-disabled,.f-form-state-default .f-input-text-light .f-state-readonly.k-datepicker .k-picker-wrap,.f-form-state-default .f-input-text-light .farris-input-wrap .k-autocomplete.k-state-disabled,.f-form-state-default .f-input-text-light .farris-input-wrap .k-combobox .k-dropdown-wrap.k-state-disabled,.f-form-state-default .f-input-text-light .farris-input-wrap .k-dateinput .k-dateinput-wrap.k-state-disabled,.f-form-state-default .f-input-text-light .farris-input-wrap .k-datepicker .k-picker-wrap.k-state-disabled,.f-form-state-default .f-input-text-light .farris-input-wrap .k-datetimepicker .k-picker-wrap.k-state-disabled,.f-form-state-default .f-input-text-light .farris-input-wrap .k-dropdown .k-dropdown-wrap.k-state-disabled,.f-form-state-default .f-input-text-light .farris-input-wrap .k-multiselect-wrap.k-state-disabled,.f-form-state-default .f-input-text-light .farris-input-wrap .k-numerictextbox .k-numeric-wrap.k-state-disabled,.f-form-state-default .f-input-text-light .farris-input-wrap .k-timepicker .k-picker-wrap.k-state-disabled{color:var(--f-text-07);background:var(--f-neutral-10);border-color:var(--f-neutral-06)}.f-form-state-default .f-form-state-create .farris-input-wrap .f-state-readonly.k-autocomplete,.f-form-state-default .f-form-state-create .farris-input-wrap .f-state-readonly.k-combobox .k-dropdown-wrap,.f-form-state-default .f-form-state-create .farris-input-wrap .f-state-readonly.k-dateinput .k-dateinput-wrap,.f-form-state-default .f-form-state-create .farris-input-wrap .f-state-readonly.k-datepicker .k-picker-wrap,.f-form-state-default .f-form-state-create .farris-input-wrap .f-state-readonly.k-datetimepicker .k-picker-wrap,.f-form-state-default .f-form-state-create .farris-input-wrap .f-state-readonly.k-dropdown .k-dropdown-wrap,.f-form-state-default .f-form-state-create .farris-input-wrap .f-state-readonly.k-multiselect-wrap,.f-form-state-default .f-form-state-create .farris-input-wrap .f-state-readonly.k-numerictextbox .k-numeric-wrap,.f-form-state-default .f-form-state-create .farris-input-wrap .f-state-readonly.k-timepicker .k-picker-wrap,.f-form-state-default .f-form-state-create .farris-input-wrap .k-state-disabled.k-dateinput .k-dateinput-wrap,.f-form-state-default .f-form-state-create .farris-input-wrap [ng-reflect-readonly=true].k-autocomplete,.f-form-state-default .f-form-state-create .farris-input-wrap [ng-reflect-readonly=true].k-combobox .k-dropdown-wrap,.f-form-state-default .f-form-state-create .farris-input-wrap [ng-reflect-readonly=true].k-dateinput .k-dateinput-wrap,.f-form-state-default .f-form-state-create .farris-input-wrap [ng-reflect-readonly=true].k-datepicker .k-picker-wrap,.f-form-state-default .f-form-state-create .farris-input-wrap [ng-reflect-readonly=true].k-datetimepicker .k-picker-wrap,.f-form-state-default .f-form-state-create .farris-input-wrap [ng-reflect-readonly=true].k-dropdown .k-dropdown-wrap,.f-form-state-default .f-form-state-create .farris-input-wrap [ng-reflect-readonly=true].k-multiselect-wrap,.f-form-state-default .f-form-state-create .farris-input-wrap [ng-reflect-readonly=true].k-numerictextbox .k-numeric-wrap,.f-form-state-default .f-form-state-create .farris-input-wrap [ng-reflect-readonly=true].k-timepicker .k-picker-wrap,.f-form-state-default .f-form-state-edit .farris-input-wrap .f-state-readonly.k-autocomplete,.f-form-state-default .f-form-state-edit .farris-input-wrap .f-state-readonly.k-combobox .k-dropdown-wrap,.f-form-state-default .f-form-state-edit .farris-input-wrap .f-state-readonly.k-dateinput .k-dateinput-wrap,.f-form-state-default .f-form-state-edit .farris-input-wrap .f-state-readonly.k-datepicker .k-picker-wrap,.f-form-state-default .f-form-state-edit .farris-input-wrap .f-state-readonly.k-datetimepicker .k-picker-wrap,.f-form-state-default .f-form-state-edit .farris-input-wrap .f-state-readonly.k-dropdown .k-dropdown-wrap,.f-form-state-default .f-form-state-edit .farris-input-wrap .f-state-readonly.k-multiselect-wrap,.f-form-state-default .f-form-state-edit .farris-input-wrap .f-state-readonly.k-numerictextbox .k-numeric-wrap,.f-form-state-default .f-form-state-edit .farris-input-wrap .f-state-readonly.k-timepicker .k-picker-wrap,.f-form-state-default .f-form-state-edit .farris-input-wrap .k-state-disabled.k-dateinput .k-dateinput-wrap,.f-form-state-default .f-form-state-edit .farris-input-wrap [ng-reflect-readonly=true].k-autocomplete,.f-form-state-default .f-form-state-edit .farris-input-wrap [ng-reflect-readonly=true].k-combobox .k-dropdown-wrap,.f-form-state-default .f-form-state-edit .farris-input-wrap [ng-reflect-readonly=true].k-dateinput .k-dateinput-wrap,.f-form-state-default .f-form-state-edit .farris-input-wrap [ng-reflect-readonly=true].k-datepicker .k-picker-wrap,.f-form-state-default .f-form-state-edit .farris-input-wrap [ng-reflect-readonly=true].k-datetimepicker .k-picker-wrap,.f-form-state-default .f-form-state-edit .farris-input-wrap [ng-reflect-readonly=true].k-dropdown .k-dropdown-wrap,.f-form-state-default .f-form-state-edit .farris-input-wrap [ng-reflect-readonly=true].k-multiselect-wrap,.f-form-state-default .f-form-state-edit .farris-input-wrap [ng-reflect-readonly=true].k-numerictextbox .k-numeric-wrap,.f-form-state-default .f-form-state-edit .farris-input-wrap [ng-reflect-readonly=true].k-timepicker .k-picker-wrap,.f-form-state-default .f-input-text-light .farris-input-wrap .f-state-readonly.k-autocomplete,.f-form-state-default .f-input-text-light .farris-input-wrap .f-state-readonly.k-combobox .k-dropdown-wrap,.f-form-state-default .f-input-text-light .farris-input-wrap .f-state-readonly.k-dateinput .k-dateinput-wrap,.f-form-state-default .f-input-text-light .farris-input-wrap .f-state-readonly.k-datepicker .k-picker-wrap,.f-form-state-default .f-input-text-light .farris-input-wrap .f-state-readonly.k-datetimepicker .k-picker-wrap,.f-form-state-default .f-input-text-light .farris-input-wrap .f-state-readonly.k-dropdown .k-dropdown-wrap,.f-form-state-default .f-input-text-light .farris-input-wrap .f-state-readonly.k-multiselect-wrap,.f-form-state-default .f-input-text-light .farris-input-wrap .f-state-readonly.k-numerictextbox .k-numeric-wrap,.f-form-state-default .f-input-text-light .farris-input-wrap .f-state-readonly.k-timepicker .k-picker-wrap,.f-form-state-default .f-input-text-light .farris-input-wrap .k-state-disabled.k-dateinput .k-dateinput-wrap,.f-form-state-default .f-input-text-light .farris-input-wrap [ng-reflect-readonly=true].k-autocomplete,.f-form-state-default .f-input-text-light .farris-input-wrap [ng-reflect-readonly=true].k-combobox .k-dropdown-wrap,.f-form-state-default .f-input-text-light .farris-input-wrap [ng-reflect-readonly=true].k-dateinput .k-dateinput-wrap,.f-form-state-default .f-input-text-light .farris-input-wrap [ng-reflect-readonly=true].k-datepicker .k-picker-wrap,.f-form-state-default .f-input-text-light .farris-input-wrap [ng-reflect-readonly=true].k-datetimepicker .k-picker-wrap,.f-form-state-default .f-input-text-light .farris-input-wrap [ng-reflect-readonly=true].k-dropdown .k-dropdown-wrap,.f-form-state-default .f-input-text-light .farris-input-wrap [ng-reflect-readonly=true].k-multiselect-wrap,.f-form-state-default .f-input-text-light .farris-input-wrap [ng-reflect-readonly=true].k-numerictextbox .k-numeric-wrap,.f-form-state-default .f-input-text-light .farris-input-wrap [ng-reflect-readonly=true].k-timepicker .k-picker-wrap{color:var(--f-text-07);background:var(--f-neutral-10);border-color:var(--f-neutral-06)}.f-form-state-default .f-form-state-create .farris-editor.farris-editor-readonly .mce-container,.f-form-state-default .f-form-state-edit .farris-editor.farris-editor-readonly .mce-container,.f-form-state-default .f-input-text-light .farris-editor.farris-editor-readonly .mce-container{color:var(--f-text-07);background:var(--f-neutral-10)}.f-form-state-default .f-form-state-create .farris-html-editor .ql-container.ql-disabled,.f-form-state-default .f-form-state-edit .farris-html-editor .ql-container.ql-disabled,.f-form-state-default .f-input-text-light .farris-html-editor .ql-container.ql-disabled{color:var(--f-text-07);background:var(--f-neutral-10);border-color:var(--f-neutral-06)!important}.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .form-control:disabled,.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .form-control[readonly],.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .form-control:disabled,.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .form-control[readonly],.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .form-control:disabled,.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .form-control[readonly],.f-form-state-create .farris-card-content-bg .farris-input-wrap .form-control:disabled,.f-form-state-create .farris-card-content-bg .farris-input-wrap .form-control[readonly],.f-form-state-create .farris-card-section .farris-input-wrap .form-control:disabled,.f-form-state-create .farris-card-section .farris-input-wrap .form-control[readonly],.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .form-control:disabled,.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .form-control[readonly],.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .form-control:disabled,.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .form-control[readonly],.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .form-control:disabled,.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .form-control[readonly],.f-form-state-edit .farris-card-content-bg .farris-input-wrap .form-control:disabled,.f-form-state-edit .farris-card-content-bg .farris-input-wrap .form-control[readonly],.f-form-state-edit .farris-card-section .farris-input-wrap .form-control:disabled,.f-form-state-edit .farris-card-section .farris-input-wrap .form-control[readonly]{border-width:1px;border-color:var(--f-neutral-06)}.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-create .farris-card-content-bg .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-create .farris-card-content-bg .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-create .farris-card-content-bg .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-create .farris-card-section .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-create .farris-card-section .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-create .farris-card-section .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-edit .farris-card-content-bg .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-edit .farris-card-content-bg .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-edit .farris-card-content-bg .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-edit .farris-card-section .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-edit .farris-card-section .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-edit .farris-card-section .farris-input-wrap .farris-html-editor .ql-container.ql-disabled{border-width:1px!important;border-color:var(--f-neutral-06)}.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-create .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-create .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-create .farris-card-section .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-create .farris-card-section .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-edit .farris-card-section .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-edit .farris-card-section .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly]{border:0}.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-create .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-create .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-create .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-create .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-create .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-create .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-create .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-create .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-edit .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-edit .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus{border-width:1px;border-color:var(--f-neutral-06)}.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-create .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-create .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-edit .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-editable{border-width:1px;border-color:var(--f-neutral-04)}.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-create .f-section-form .f-form-layout .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-create .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-create .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-edit .f-section-form .f-form-layout .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-edit .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-focus{border-color:var(--f-theme-08);color:var(--f-text-02)}.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .form-control:disabled,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .form-control[readonly],.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .form-control:disabled,.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .form-control[readonly],.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .form-control:disabled,.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .form-control[readonly],.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .form-control:disabled,.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .form-control[readonly],.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .form-control:disabled,.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .form-control[readonly],.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .form-control:disabled,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .form-control[readonly],.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .form-control:disabled,.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .form-control[readonly],.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .form-control:disabled,.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .form-control[readonly],.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .form-control:disabled,.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .form-control[readonly],.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .form-control:disabled,.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .form-control[readonly]{border-width:0 0 1px;border-radius:0;border-style:solid;border-color:var(--f-neutral-06)}.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .farris-html-editor .ql-container.ql-disabled{border-width:0 0 1px!important;border-radius:0;border-style:solid;border-color:var(--f-neutral-06)}.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly]{border:0}.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus{border-width:0 0 1px;border-radius:0;border-style:solid;border-color:var(--f-neutral-06)}.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-editable{border-width:1px;border-color:var(--f-neutral-04)}.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-create .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-create .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-focus{border-color:var(--f-theme-08);color:var(--f-text-02)}.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .form-control:disabled,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .form-control[readonly],.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .form-control:disabled,.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .form-control[readonly],.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .form-control:disabled,.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .form-control[readonly],.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .form-control:disabled,.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .form-control[readonly],.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .form-control:disabled,.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .form-control[readonly],.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .form-control:disabled,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .form-control[readonly],.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .form-control:disabled,.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .form-control[readonly],.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .form-control:disabled,.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .form-control[readonly],.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .form-control:disabled,.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .form-control[readonly],.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .form-control:disabled,.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .form-control[readonly]{border-width:1px;border-color:var(--f-neutral-06)}.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .farris-html-editor .ql-container.ql-disabled{border-width:1px!important;border-color:var(--f-neutral-06)}.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly]{border:0}.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus{border-width:1px;border-color:var(--f-neutral-06)}.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-editable{border-width:1px;border-color:var(--f-neutral-04)}.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-create .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-create .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-create .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-create .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-edit .f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-focus{border-color:var(--f-theme-08);color:var(--f-text-02)}.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .form-control:disabled,.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .form-control[readonly],.f-form-state-default .f-section-form .farris-form .farris-input-wrap .form-control:disabled,.f-form-state-default .f-section-form .farris-form .farris-input-wrap .form-control[readonly],.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .form-control:disabled,.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .form-control[readonly],.f-form-state-default .farris-card-content-bg .farris-input-wrap .form-control:disabled,.f-form-state-default .farris-card-content-bg .farris-input-wrap .form-control[readonly],.f-form-state-default .farris-card-section .farris-input-wrap .form-control:disabled,.f-form-state-default .farris-card-section .farris-input-wrap .form-control[readonly]{border-width:0 0 1px;border-radius:0;border-style:solid;border-color:var(--f-neutral-06)}.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-default .f-section-form .farris-form .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-default .f-section-form .farris-form .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-default .f-section-form .farris-form .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-default .farris-card-content-bg .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-default .farris-card-content-bg .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-default .farris-card-content-bg .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-default .farris-card-section .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-default .farris-card-section .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-default .farris-card-section .farris-input-wrap .farris-html-editor .ql-container.ql-disabled{border-width:0 0 1px!important;border-radius:0;border-style:solid;border-color:var(--f-neutral-06)}.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-default .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-default .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-default .farris-card-section .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-default .farris-card-section .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly]{border:0}.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-default .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-default .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-default .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-default .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-default .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-default .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-default .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-default .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus{border-width:0 0 1px;border-radius:0;border-style:solid;border-color:var(--f-neutral-06)}.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-default .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-default .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-editable{border-width:1px;border-color:var(--f-neutral-04)}.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-default .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-default .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-default .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-default .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-default .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-default .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-default .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-focus{border-color:var(--f-theme-08);color:var(--f-text-02)}.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .form-control:disabled,.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .form-control[readonly],.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .form-control:disabled,.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .form-control[readonly],.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .form-control:disabled,.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .form-control[readonly],.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .form-control:disabled,.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .form-control[readonly],.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .form-control:disabled,.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .form-control[readonly]{border-width:1px;border-color:var(--f-neutral-06)}.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .farris-html-editor .ql-container.ql-disabled{border-width:1px!important;border-color:var(--f-neutral-06)}.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly]{border:0}.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus{border-width:1px;border-color:var(--f-neutral-06)}.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-editable{border-width:1px;border-color:var(--f-neutral-04)}.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-default .f-rregion-mtable-form-next-tab .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-default .f-section-form .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-default .f-sidebar-content .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-default .farris-card-content-bg .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-default .farris-card-section .f-form-pretend-lines .farris-input-wrap .f-component-timepicker .input-group.f-state-focus{border-color:var(--f-theme-08);color:var(--f-text-02)}.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .form-control:disabled,.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .form-control[readonly],.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .form-control:disabled,.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .form-control[readonly],.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .form-control:disabled,.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .form-control[readonly],.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .form-control:disabled,.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .form-control[readonly],.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .form-control:disabled,.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .form-control[readonly],.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .form-control:disabled,.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .form-control[readonly],.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .form-control:disabled,.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .form-control[readonly],.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .form-control:disabled,.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .form-control[readonly],.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .form-control:disabled,.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .form-control[readonly],.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .form-control:disabled,.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .form-control[readonly]{border-width:1px;border-color:var(--f-neutral-06)}.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .farris-html-editor .ql-container.ql-disabled,.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .farris-editor.farris-editor-disabled .mce-tinymce,.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .farris-editor.farris-editor-readonly .mce-tinymce,.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .farris-html-editor .ql-container.ql-disabled{border-width:1px!important;border-color:var(--f-neutral-06)}.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly],.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group .form-control:disabled,.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group .form-control[readonly],.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group .form-control:disabled,.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group .form-control[readonly],.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .f-component-timepicker .input-group .form-control:disabled,.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .f-component-timepicker .input-group .form-control[readonly]{border:0}.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled,.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly,.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled,.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly,.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-readonly.f-state-focus,.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled,.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-disabled.f-state-focus,.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly,.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-readonly.f-state-focus{border-width:1px;border-color:var(--f-neutral-06)}.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-editable,.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-editable,.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-editable,.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-editable{border-width:1px;border-color:var(--f-neutral-04)}.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-default .f-form-state-create .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-default .f-form-state-create .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-default .f-form-state-create .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-default .f-form-state-create .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-default .f-form-state-create .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-default .f-form-state-edit .f-rregion-mtable-form-next-tab .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-default .f-form-state-edit .f-section-form .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-default .f-form-state-edit .f-sidebar-content .farris-form .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-default .f-form-state-edit .farris-card-content-bg .farris-input-wrap .f-component-timepicker .input-group.f-state-focus,.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-inputgroup .input-group.f-state-focus,.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .f-cmp-number-spinner .input-group.f-state-focus,.f-form-state-default .f-form-state-edit .farris-card-section .farris-input-wrap .f-component-timepicker .input-group.f-state-focus{border-color:var(--f-theme-08);color:var(--f-text-02)}.f-form-pretend-lines .f-form-control-text,.f-form-pretend-lines .f-form-control-textarea{border-width:1px!important;color:var(--f-text-07);background:var(--f-neutral-10);border-color:var(--f-neutral-06)}.form-group--has-tips{position:relative}.form-group--has-tips .farris-label-tips{position:absolute;right:0;bottom:calc(.6875rem + 1px);margin-bottom:-7px}.farris-label-tips,.farris-label-tips--highlight{display:inline-block;width:14px;height:14px;border:1px solid var(--f-theme-03);background:var(--f-aid-04);color:var(--f-theme-03);border-radius:7px;line-height:1;text-align:center}.farris-label-tips .f-icon,.farris-label-tips--highlight .f-icon{font-size:13px;vertical-align:top;transform:scale(.7)}.badge,.farris-label-tips--highlight .f-icon{vertical-align:baseline}.farris-label-tips--highlight:has(.f-icon-question),.farris-label-tips:has(.f-icon-question){border-color:var(--f-semantic-warning-01)}.farris-label-tips--highlight{border:none;color:#fff;background-image:linear-gradient(225deg,#FFB362 0,#FF8538 100%)}.form-label-plaintext .farris-label-text{color:var(--f-text-08)}.form-row{margin-right:-.5rem;margin-left:-.5rem}.form-row>.col,.form-row>[class*=col-]{padding-right:.5rem;padding-left:.5rem}.col-form-label{padding-top:0;padding-bottom:0;margin-bottom:.375rem;margin-left:0}.farris-form-controls-inline .farris-group-wrap .col-form-label,.farris-form-inline .col-form-label{padding-top:calc(.1875rem + 1px);padding-bottom:calc(.1875rem + 1px);margin-bottom:0}.f-list-view-content .f-list-view-group .f-list-content .f-tmpl-card--header-multicontent01 .header-multicontent01--content .header-multicontent01--footer{min-height:31px}.f-component-wizard-page-detail-footer{border-top:1px solid var(--f-neutral-08);padding:.75rem .875rem .875rem}.f-tmpl-card--header-multicontent01{background:#FEFEFF;border:1px solid #E4E7EF;border-radius:4px;width:19.375rem;margin:0 1rem 1rem 0;box-shadow:0 2px 10px 0 rgba(0,25,58,.1)}.f-tmpl-card--header-multicontent01 .header-multicontent01--header{color:#fff;border-radius:4px;height:2.5rem;padding:0 1.375rem;position:relative;background:linear-gradient(225deg,var(--f-aid-01),var(--f-theme-03))}.f-tmpl-card--header-multicontent01 .header-multicontent01--header .f-title{font-size:1rem;line-height:2.5rem;margin:0}.f-tmpl-card--header-multicontent01 .header-multicontent01--header .f-state{text-align:center;position:absolute;top:-1px;right:-1px;width:3.75rem;height:1.5rem;line-height:1.5rem;color:#fff;font-size:.75rem}.f-tmpl-card--header-multicontent01 .header-multicontent01--header .f-state span{display:block;border-radius:0 0 0 6px}.f-tmpl-card--header-multicontent01 .header-multicontent01--content{padding:1rem 1.375rem;position:relative}.f-tmpl-card--header-multicontent01 .header-multicontent01--content .f-title{font-size:1rem;height:22px}.f-tmpl-card--header-multicontent01 .header-multicontent01--content p{margin:0 0 .5rem}.f-tmpl-card--header-multicontent01 .header-multicontent01--content .f-state{position:absolute;right:0;top:13px}.f-tmpl-card--header-multicontent01 .header-multicontent01--content .f-state span{border-radius:4px 0 0 4px;padding-top:4px;padding-bottom:4px}.f-tmpl-card--header-multicontent01 .header-multicontent01--footer .f-emphasize{font-size:1.375rem;color:#F7962A}.f-tmpl-card--header-multicontent01 .header-multicontent01--footer .f-toolbar{margin:0}.f-tmpl-card--header-multicontent01 .header-multicontent01--footer .f-toolbar span{cursor:pointer;margin:0 1rem 0 0}.f-tmpl-list--columns01{display:flex;flex-wrap:no-wrap;border:1px solid #ddd;position:relative;margin:-1px 8px 0;flex-direction:row;padding:20px 8px 12px;align-items:center}.f-tmpl-list--columns01 p{margin-bottom:4px}.f-tmpl-list--columns01 .f-state{position:absolute;top:-1px;left:0}.f-tmpl-list--columns01 .f-state span{border-radius:0 0 4px 4px;padding-left:12px;padding-right:11px}.f-tmpl-list--columns01 .f-emphasize{font-size:1.375rem;color:#F7962A}.f-template-common-row{padding:12px 16px;align-items:center}.f-template-common-row .item-action-primary{display:inline-block;margin-right:16px;width:60px;height:60px;border-radius:50%;overflow:hidden}.f-template-common-row .item-action-primary .ap-img{display:block;width:60px;height:60px;border-radius:50%}.f-template-common-row .listview-item-content{border-bottom:1px solid #d9d9d9;flex:1 1 auto}.f-template-common-row .listview-item-content .listview-item-main{flex-grow:1;flex-shrink:1;flex-basis:0}.f-template-common-row .listview-item-content .listview-item-title{font-size:16px;color:rgba(0,0,0,.85)}.f-template-common-row .listview-item-content .listview-item-subtitle{font-size:14px;color:rgba(0,0,0,.45)}.badge-pill-success,.badge-success{color:#fff}.f-template-common-row .listview-item-content .listview-item-btns .btn{margin-left:6px;margin-right:6px}.f-listview-active .f-tmpl-list--columns01{box-shadow:0 2px 10px 0 rgba(0,25,58,.1)}.badge-arrow-left-success,.badge-arrow-right-success,.badge-pill-success,.badge-round-success,.badge-success{background:var(--f-semantic-success-01)}.f-listview-active .f-template-common-row .listview-item-content{border-color:var(--f-theme-03)}.f-page-is-onepage .f-onepage-tabs{margin:0 .5rem}.f-onepage-content{overflow-y:auto}.badge{display:inline-block;padding:.1875rem .5rem;font-size:.75rem;line-height:1;text-align:center;white-space:nowrap;border-radius:6px}.badge-pill,.badge-pill-border-success,.badge-pill-success{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-border-arrow-left-success,.badge-border-success,.badge-pill-border-success{color:var(--f-semantic-success-01);background:var(--f-semantic-success-03)}.badge-pill-border-success{border:1px solid var(--f-semantic-success-01)}.badge-border-success{padding:.125rem .4375rem;border:1px solid var(--f-semantic-success-02);border-radius:2px}.badge-border-arrow-left-success{border:1px solid var(--f-semantic-success-02);position:relative;margin-left:12px}.badge-border-arrow-left-success::after,.badge-border-arrow-left-success::before{width:0;height:0;content:"";position:absolute;top:50%;border:solid transparent}.badge-border-arrow-left-success::before{left:-12px;z-index:2;margin-top:-6px;border-right-color:var(--f-semantic-success-02);border-width:6px 12px 6px 0}.badge-border-arrow-left-success::after{z-index:3;left:-10px;margin-top:-5px;border-right-color:var(--f-semantic-success-03);border-width:5px 10px 5px 0}.badge-border-arrow-right-success{position:relative;margin-right:12px}.badge-border-arrow-right-success::after,.badge-border-arrow-right-success::before{width:0;height:0;content:"";position:absolute;top:50%;border:solid transparent}.badge-border-arrow-right-success::before{left:-12px;z-index:2;margin-top:-6px;border-right-color:var(--f-semantic-success-02);border-width:6px 0 6px 12px}.badge-border-arrow-right-success::after{z-index:3;left:-10px;margin-top:-5px;border-right-color:var(--f-semantic-success-03);border-width:5px 0 5px 10px}.badge-arrow-left-success::before,.badge-arrow-right-success::before{margin-top:-8px;border-top:8px solid transparent;border-bottom:8px solid transparent;content:"";top:50%}.badge-arrow-left-success{position:relative;color:#fff;margin-left:8px}.badge-arrow-left-success::before{position:absolute;border-right:8px solid transparent;border-left:0 solid transparent;left:-8px;border-right-color:var(--f-semantic-success-01)}.badge-arrow-right-success{position:relative;color:#fff;margin-right:8px}.badge-arrow-right-success::before{position:absolute;border-left:8px solid transparent;border-right:0 solid transparent;right:-8px;border-left-color:var(--f-semantic-success-01)}.badge-round-success{width:6px;height:6px;border-radius:3px;line-height:1;overflow:hidden;padding:0}.badge-round-outer-success{position:relative;width:14px;height:14px;display:block;background:rgba(var(--f-semantic-success-01),.18);border-radius:7px}.badge-round-outer-success::after{content:"";width:8px;height:8px;position:absolute;top:50%;left:50%;margin:-4px 0 0 -4px;border-radius:4px;background:var(--f-semantic-success-01)}.badge-pill-border-info,.badge-pill-info{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-info,.badge-pill-info{color:#fff;background:var(--f-semantic-info-01)}.badge-border-arrow-left-info,.badge-border-info,.badge-pill-border-info{color:var(--f-semantic-info-01);background:var(--f-semantic-info-03)}.badge-pill-border-info{border:1px solid var(--f-semantic-info-01)}.badge-border-info{padding:.125rem .4375rem;border:1px solid var(--f-semantic-info-02);border-radius:2px}.badge-border-arrow-left-info{border:1px solid var(--f-semantic-info-02);position:relative;margin-left:12px}.badge-arrow-left-info,.badge-arrow-right-info,.badge-round-info{background:var(--f-semantic-info-01)}.badge-border-arrow-left-info::after,.badge-border-arrow-left-info::before{width:0;height:0;content:"";position:absolute;top:50%;border:solid transparent}.badge-border-arrow-left-info::before{left:-12px;z-index:2;margin-top:-6px;border-right-color:var(--f-semantic-info-02);border-width:6px 12px 6px 0}.badge-border-arrow-left-info::after{z-index:3;left:-10px;margin-top:-5px;border-right-color:var(--f-semantic-info-03);border-width:5px 10px 5px 0}.badge-border-arrow-right-info{position:relative;margin-right:12px}.badge-border-arrow-right-info::after,.badge-border-arrow-right-info::before{width:0;height:0;content:"";position:absolute;top:50%;border:solid transparent}.badge-round-info,.badge-round-warning{width:6px;border-radius:3px;padding:0;display:inline-block!important;line-height:1;overflow:hidden;height:6px}.badge-border-arrow-right-info::before{left:-12px;z-index:2;margin-top:-6px;border-right-color:var(--f-semantic-info-02);border-width:6px 0 6px 12px}.badge-border-arrow-right-info::after{z-index:3;left:-10px;margin-top:-5px;border-right-color:var(--f-semantic-info-03);border-width:5px 0 5px 10px}.badge-arrow-left-info::before,.badge-arrow-right-info::before{margin-top:-8px;border-top:8px solid transparent;border-bottom:8px solid transparent}.badge-arrow-left-info{position:relative;color:#fff;margin-left:8px}.badge-arrow-left-info::before{content:"";position:absolute;top:50%;border-right:8px solid transparent;border-left:0 solid transparent;left:-8px;border-right-color:var(--f-semantic-info-01)}.badge-arrow-right-info{position:relative;color:#fff;margin-right:8px}.badge-arrow-right-info::before,.badge-round-outer-info::after{position:absolute;content:"";top:50%}.badge-arrow-right-info::before{border-left:8px solid transparent;border-right:0 solid transparent;right:-8px;border-left-color:var(--f-semantic-info-01)}.badge-round-outer-info{position:relative;width:14px;height:14px;display:block;background:rgba(var(--f-semantic-info-01),.18);border-radius:7px}.badge-round-outer-info::after{width:8px;height:8px;left:50%;margin:-4px 0 0 -4px;border-radius:4px;background:var(--f-semantic-info-01)}.badge-pill-border-warning,.badge-pill-warning{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-arrow-left-warning,.badge-arrow-right-warning,.badge-pill-warning,.badge-round-outer-warning::after,.badge-round-warning,.badge-warning{background:var(--f-semantic-warning-01)}.badge-pill-warning,.badge-warning{color:#fff}.badge-border-arrow-left-warning,.badge-border-warning,.badge-pill-border-warning{color:var(--f-semantic-warning-01);background:var(--f-semantic-warning-03)}.badge-pill-border-warning{border:1px solid var(--f-semantic-warning-01)}.badge-border-warning{padding:.125rem .4375rem;border:1px solid var(--f-semantic-warning-02);border-radius:2px}.badge-border-arrow-left-warning{border:1px solid var(--f-semantic-warning-02);position:relative;margin-left:12px}.badge-border-arrow-left-warning::after,.badge-border-arrow-left-warning::before{width:0;height:0;content:"";position:absolute;top:50%;border:solid transparent}.badge-border-arrow-left-warning::before{left:-12px;z-index:2;margin-top:-6px;border-right-color:var(--f-semantic-warning-02);border-width:6px 12px 6px 0}.badge-border-arrow-left-warning::after{z-index:3;left:-10px;margin-top:-5px;border-right-color:var(--f-semantic-warning-03);border-width:5px 10px 5px 0}.badge-border-arrow-right-warning{position:relative;margin-right:12px}.badge-border-arrow-right-warning::after,.badge-border-arrow-right-warning::before{width:0;height:0;content:"";position:absolute;top:50%;border:solid transparent}.badge-border-arrow-right-warning::before{left:-12px;z-index:2;margin-top:-6px;border-right-color:var(--f-semantic-warning-02);border-width:6px 0 6px 12px}.badge-border-arrow-right-warning::after{z-index:3;left:-10px;margin-top:-5px;border-right-color:var(--f-semantic-warning-03);border-width:5px 0 5px 10px}.badge-arrow-left-warning::before,.badge-arrow-right-warning::before{margin-top:-8px;border-top:8px solid transparent;border-bottom:8px solid transparent;content:"";top:50%}.badge-arrow-left-warning{position:relative;color:#fff;margin-left:8px}.badge-arrow-left-warning::before{position:absolute;border-right:8px solid transparent;border-left:0 solid transparent;left:-8px;border-right-color:var(--f-semantic-warning-01)}.badge-arrow-right-warning{position:relative;color:#fff;margin-right:8px}.badge-arrow-right-warning::before{position:absolute;border-left:8px solid transparent;border-right:0 solid transparent;right:-8px;border-left-color:var(--f-semantic-warning-01)}.badge-round-outer-warning{position:relative;width:14px;height:14px;display:block;background:rgba(var(--f-semantic-warning-01),.18);border-radius:7px}.badge-round-outer-warning::after{content:"";width:8px;height:8px;position:absolute;top:50%;left:50%;margin:-4px 0 0 -4px;border-radius:4px}.badge-pill-border-danger,.badge-pill-danger{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-danger,.badge-pill-danger{color:#fff;background:#F46160}.badge-border-arrow-left-danger,.badge-border-danger,.badge-pill-border-danger{color:#F46160;background:var(--f-semantic-danger-03)}.badge-pill-border-danger{border:1px solid #F46160}.badge-border-danger{padding:.125rem .4375rem;border:1px solid var(--f-semantic-danger-02);border-radius:2px}.badge-border-arrow-left-danger{border:1px solid var(--f-semantic-danger-02);position:relative;margin-left:12px}.badge-border-arrow-left-danger::after,.badge-border-arrow-left-danger::before{width:0;height:0;content:"";position:absolute;top:50%;border:solid transparent}.badge-border-arrow-left-danger::before{left:-12px;z-index:2;margin-top:-6px;border-right-color:var(--f-semantic-danger-02);border-width:6px 12px 6px 0}.badge-border-arrow-left-danger::after{z-index:3;left:-10px;margin-top:-5px;border-right-color:var(--f-semantic-danger-03);border-width:5px 10px 5px 0}.badge-border-arrow-right-danger{position:relative;margin-right:12px}.badge-border-arrow-right-danger::after,.badge-border-arrow-right-danger::before{width:0;height:0;content:"";position:absolute;top:50%;border:solid transparent}.badge-border-arrow-right-danger::before{left:-12px;z-index:2;margin-top:-6px;border-right-color:var(--f-semantic-danger-02);border-width:6px 0 6px 12px}.badge-border-arrow-right-danger::after{z-index:3;left:-10px;margin-top:-5px;border-right-color:var(--f-semantic-danger-03);border-width:5px 0 5px 10px}.badge-arrow-left-danger::before,.badge-arrow-right-danger::before{margin-top:-8px;border-top:8px solid transparent;border-bottom:8px solid transparent}.badge-arrow-left-danger{background:#F46160;position:relative;color:#fff;margin-left:8px}.badge-arrow-left-danger::before{content:"";position:absolute;top:50%;border-right:8px solid transparent;border-left:0 solid transparent;left:-8px;border-right-color:#F46160}.badge-arrow-right-danger{background:#F46160;position:relative;color:#fff;margin-right:8px}.badge-arrow-right-danger::before,.badge-round-outer-danger::after{position:absolute;content:"";top:50%}.badge-arrow-right-danger::before{border-left:8px solid transparent;border-right:0 solid transparent;right:-8px;border-left-color:#F46160}.badge-round-danger{width:6px;height:6px;border-radius:3px;display:inline-block!important;line-height:1;overflow:hidden;padding:0;background:#F46160}.badge-round-outer-danger{position:relative;width:14px;height:14px;display:block;background:rgba(244,97,96,.18);border-radius:7px}.badge-round-outer-danger::after{width:8px;height:8px;left:50%;margin:-4px 0 0 -4px;border-radius:4px;background:#F46160}.badge-pill-border-primary,.badge-pill-primary{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-arrow-left-primary,.badge-arrow-right-primary,.badge-pill-primary,.badge-primary,.badge-round-primary{background:var(--f-theme-03)}.badge-pill-primary,.badge-primary{color:#fff}.badge-border-arrow-left-primary,.badge-border-primary,.badge-pill-border-primary{color:var(--f-theme-03);background:var(--f-semantic-info-03)}.badge-pill-border-primary{border:1px solid var(--f-theme-03)}.badge-border-primary{padding:.125rem .4375rem;border:1px solid var(--f-theme-05);border-radius:2px}.badge-border-arrow-left-primary{border:1px solid var(--f-theme-05);position:relative;margin-left:12px}.badge-border-arrow-left-primary::after,.badge-border-arrow-left-primary::before{width:0;height:0;content:"";position:absolute;top:50%;border:solid transparent}.badge-border-arrow-left-primary::before{left:-12px;z-index:2;margin-top:-6px;border-right-color:var(--f-theme-05);border-width:6px 12px 6px 0}.badge-border-arrow-left-primary::after{z-index:3;left:-10px;margin-top:-5px;border-right-color:var(--f-semantic-info-03);border-width:5px 10px 5px 0}.badge-border-arrow-right-primary{position:relative;margin-right:12px}.badge-border-arrow-right-primary::after,.badge-border-arrow-right-primary::before{width:0;height:0;content:"";position:absolute;top:50%;border:solid transparent}.badge-round-continue,.badge-round-primary{border-radius:3px;display:inline-block!important;line-height:1;overflow:hidden}.badge-border-arrow-right-primary::before{left:-12px;z-index:2;margin-top:-6px;border-right-color:var(--f-theme-05);border-width:6px 0 6px 12px}.badge-border-arrow-right-primary::after{z-index:3;left:-10px;margin-top:-5px;border-right-color:var(--f-semantic-info-03);border-width:5px 0 5px 10px}.badge-arrow-left-primary::before,.badge-arrow-right-primary::before{margin-top:-8px;border-top:8px solid transparent;border-bottom:8px solid transparent;content:"";top:50%}.badge-arrow-left-primary{position:relative;color:#fff;margin-left:8px}.badge-arrow-left-primary::before{position:absolute;border-right:8px solid transparent;border-left:0 solid transparent;left:-8px;border-right-color:var(--f-theme-03)}.badge-arrow-right-primary{position:relative;color:#fff;margin-right:8px}.badge-arrow-right-primary::before{position:absolute;border-left:8px solid transparent;border-right:0 solid transparent;right:-8px;border-left-color:var(--f-theme-03)}.badge-round-primary{width:6px;height:6px;padding:0}.badge-round-outer-primary{position:relative;width:14px;height:14px;display:block;background:rgba(var(--f-theme-03),.18);border-radius:7px}.badge-round-outer-primary::after{content:"";width:8px;height:8px;position:absolute;top:50%;left:50%;margin:-4px 0 0 -4px;border-radius:4px;background:var(--f-theme-03)}.badge-pill-border-continue,.badge-pill-continue{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-continue,.badge-pill-continue{color:#fff;background:var(--f-semantic-submit-01)}.badge-border-arrow-left-continue,.badge-border-continue,.badge-pill-border-continue{color:var(--f-semantic-submit-01);background:var(--f-semantic-submit-03)}.badge-pill-border-continue{border:1px solid var(--f-semantic-submit-01)}.badge-border-continue{padding:.125rem .4375rem;border:1px solid var(--f-semantic-submit-02);border-radius:2px}.badge-border-arrow-left-continue{border:1px solid var(--f-semantic-submit-02);position:relative;margin-left:12px}.badge-arrow-left-continue,.badge-arrow-right-continue,.badge-round-continue{background:var(--f-semantic-submit-01)}.badge-border-arrow-left-continue::after,.badge-border-arrow-left-continue::before{width:0;height:0;content:"";position:absolute;top:50%;border:solid transparent}.badge-border-arrow-left-continue::before{left:-12px;z-index:2;margin-top:-6px;border-right-color:var(--f-semantic-submit-02);border-width:6px 12px 6px 0}.badge-border-arrow-left-continue::after{z-index:3;left:-10px;margin-top:-5px;border-right-color:var(--f-semantic-submit-03);border-width:5px 10px 5px 0}.badge-border-arrow-right-continue{position:relative;margin-right:12px}.badge-border-arrow-right-continue::after,.badge-border-arrow-right-continue::before{width:0;height:0;content:"";position:absolute;top:50%;border:solid transparent}.badge-border-arrow-right-continue::before{left:-12px;z-index:2;margin-top:-6px;border-right-color:var(--f-semantic-submit-02);border-width:6px 0 6px 12px}.badge-border-arrow-right-continue::after{z-index:3;left:-10px;margin-top:-5px;border-right-color:var(--f-semantic-submit-03);border-width:5px 0 5px 10px}.badge-arrow-left-continue::before,.badge-arrow-right-continue::before{margin-top:-8px;border-top:8px solid transparent;border-bottom:8px solid transparent;content:"";top:50%}.badge-arrow-left-continue{position:relative;color:#fff;margin-left:8px}.badge-arrow-left-continue::before{position:absolute;border-right:8px solid transparent;border-left:0 solid transparent;left:-8px;border-right-color:var(--f-semantic-submit-01)}.badge-arrow-right-continue{position:relative;color:#fff;margin-right:8px}.badge-arrow-right-continue::before{position:absolute;border-left:8px solid transparent;border-right:0 solid transparent;right:-8px;border-left-color:var(--f-semantic-submit-01)}.badge-round-continue{width:6px;height:6px;padding:0}.badge-round-outer-continue{position:relative;width:14px;height:14px;display:block;background:rgba(var(--f-semantic-submit-01),.18);border-radius:7px}.badge-round-outer-continue::after{content:"";width:8px;height:8px;position:absolute;top:50%;left:50%;margin:-4px 0 0 -4px;border-radius:4px;background:var(--f-semantic-submit-01)}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:6px}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:6px;border-top-right-radius:6px}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:6px;border-bottom-left-radius:6px}.card-body{flex-grow:1;flex-shrink:1;flex-basis:auto;padding:1.25rem}.card-footer,.card-header{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03)}.card-title{margin-bottom:.75rem}.card-header,.card-subtitle,.card-text:last-child{margin-bottom:0}.card-subtitle{margin-top:-.375rem}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header-pills,.card-header-tabs{margin-right:-.625rem;margin-left:-.625rem}.card-header{border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(6px - 1px) calc(6px - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(6px - 1px) calc(6px - 1px)}.card-header-tabs{margin-bottom:-.75rem;border-bottom:0}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(6px - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(6px - 1px);border-top-right-radius:calc(6px - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(6px - 1px);border-bottom-left-radius:calc(6px - 1px)}.card-deck{display:flex;flex-direction:column}.card-deck .card{margin-bottom:14px}@media (min-width:576px){.card-deck{flex-flow:row wrap;margin-right:-14px;margin-left:-14px}.card-deck .card{display:flex;flex-grow:1;flex-shrink:0;flex-basis:0%;flex-direction:column;margin-right:14px;margin-bottom:0;margin-left:14px}}.card-group{display:flex;flex-direction:column}.card-group>.card{margin-bottom:14px}@media (min-width:576px){.card-group{flex-flow:row wrap}.card-group>.card{flex-grow:1;flex-shrink:0;flex-basis:0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:6px}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:6px;border-top-right-radius:6px}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:6px;border-bottom-left-radius:6px}.card-group>.card:not(:first-child):not(:last-child):not(:only-child),.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}.card-columns{-moz-column-count:3;column-count:3;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.card-columns .card{margin-bottom:.75rem}.accordion .card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion .card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion .card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion .card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.f-form-is-table{box-shadow:0 2px 10px 0 rgba(0,0,0,.04)}.table.table-bordered.f-table-has-form td:first-child{border-left:unset}.table.table-bordered.f-table-has-form td:last-child{border-right:unset}.table.table-bordered.f-table-has-form>:first-child td{border-top:unset}.f-table-has-form{overflow:hidden;box-shadow:0 0 0 1px var(--f-neutral-07);border-radius:10px;margin:0}.f-table-has-form td{padding:0;height:43px;border:1px solid var(--f-neutral-07)}.f-table-has-form .farris-group-wrap--label{padding:.75rem 1rem;width:124px}.f-table-has-form .farris-group-wrap--label .farris-label-wrap{height:100%}.f-table-has-form .farris-group-wrap--label .form-group--has-tips{display:flex}.f-table-has-form .farris-group-wrap--label .form-group--has-tips .farris-label-tips{position:relative;bottom:auto;margin:1px 0 0 4px;flex-shrink:0}.f-table-has-form .farris-group-wrap--label .form-group--has-tips .col-form-label{flex:1 1 0}.f-table-has-form .farris-group-wrap--label .col-form-label{display:flex;margin:0;align-items:center;flex-shrink:0;justify-content:flex-end!important;flex-direction:row!important;align-self:start;word-break:break-all;min-width:82px;height:100%}.f-table-has-form .farris-group-wrap--label .farris-label-text{text-align:right;white-space:pre-wrap}.f-table-has-form .farris-group-wrap--label .farris-label-info{padding:0 .25rem 0 0;flex-shrink:0;line-height:1.4286;white-space:nowrap}.f-table-has-form .farris-group-wrap--input{position:relative;overflow:initial}.f-table-has-form .farris-group-wrap--input .farris-input-wrap{height:100%}.f-table-has-form .farris-group-wrap--input .farris-input-wrap.farris-textarea-wrap{min-height:60px}.f-table-has-form .farris-group-wrap--input .farris-input-wrap .form-control{height:100%;border:none;border-radius:0;padding-left:1rem}.f-table-has-form .farris-group-wrap--input .farris-input-wrap .form-control.form-control-invalid,.f-table-has-form .farris-group-wrap--input .farris-input-wrap .form-control.form-control-invalid:focus{box-shadow:inset 0 0 0 1pxvar --f-semantic-danger-01}.f-table-has-form .farris-group-wrap--input .farris-input-wrap .f-cmp-inputgroup,.f-table-has-form .farris-group-wrap--input .farris-input-wrap .f-component-timepicker{height:100%}.f-table-has-form .farris-group-wrap--input .farris-input-wrap .f-cmp-inputgroup .input-group,.f-table-has-form .farris-group-wrap--input .farris-input-wrap .f-cmp-number-spinner .input-group,.f-table-has-form .farris-group-wrap--input .farris-input-wrap .f-component-timepicker .input-group{height:100%;border:none}.f-table-has-form .farris-group-wrap--input .farris-input-wrap .f-cmp-number-spinner .input-group .btn-group-number{height:100%}.f-table-has-form .farris-group-wrap--input .farris-input-wrap .f-cmp-number-spinner .input-group .btn-group-number .btn-number-flag,.f-table-has-form .farris-group-wrap--input .farris-input-wrap .f-cmp-number-spinner .input-group .btn-group-number .btn-number-flag:nth-child(2){border:none}.f-table-has-form .farris-group-wrap--input .farris-input-wrap .f-cmp-number-spinner .number-arrow-chevron,.f-table-has-form .farris-group-wrap--input .farris-input-wrap .input-group .input-group-append.f-cmp-iconbtn-wrapper .f-cmp-iconbtn .f-icon{font-size:1rem}.f-table-has-form .farris-group-wrap--input .farris-input-wrap .lookupbox .input-group-append .f-icon-lookup{font-size:1.125rem}.f-table-has-form .farris-group-wrap--input .farris-input-wrap farris-checkboxgroup .farris-input-wrap,.f-table-has-form .farris-group-wrap--input .farris-input-wrap farris-radiogroup .farris-input-wrap{padding:.75rem 1rem}.f-table-has-form .farris-group-wrap--input .farris-input-wrap .farris-checkradio-hor{align-items:center}.f-table-has-form .farris-group-wrap--input .farris-html-editor{border:none}.f-table-has-form .farris-group-wrap--input .farris-html-editor-border .ql-container.ql-disabled{border:none!important;padding:.75rem 1rem}.f-table-has-form .farris-group-wrap--input .farris-switch-outlayer{height:100%;display:flex;align-items:center;margin-left:1rem}.f-table-has-form .farris-group-wrap--input>.farris-input-wrap>.custom-control{height:100%;display:flex;align-items:center;padding:.75rem 1rem}.f-table-has-form .farris-group-wrap--input .f-component-text{height:100%;display:flex;align-items:center}.f-table-has-form .farris-group-wrap--input .f-component-text .f-form-control-text,.f-table-has-form .farris-group-wrap--input .f-component-text .f-form-control-textarea{border-color:transparent;padding-left:1rem}.f-table-has-form .input-group .input-group-append{padding-right:.5rem}.f-table-has-form .input-group .input-append-wrapper{padding-right:0}.f-table-has-form .input-group .input-group-append.f-cmp-iconbtn-wrapper{padding-right:.5rem}.f-table-has-form .input-group .input-group-append.f-cmp-iconbtn-wrapper .datepicker-clear{right:.5rem!important}.f-table-has-form .input-append-wrapper .input-group-text{padding-left:1rem;padding-right:1rem}.f-table-has-form .input-append-button{border-left:1px solid var(--f-neutral-07);margin-left:1px}.f-table-has-form .f-cmp-static-text-input-append .input-append-button,.f-table-has-form .f-cmp-text-input-append .input-append-button,.f-table-has-form .f-cmp-textarea-input-append .input-append-button{margin-left:0}.f-table-has-form .farris-editor .farris-editor-placeholder,.f-table-has-form .farris-editor .mce-tinymce{border:none}.f-table-has-form .farris-input-wrap .f-cmp-text-is-textarea{flex-direction:row}.f-table-has-form .farris-input-wrap .f-cmp-text-is-textarea .f-form-control-textarea{flex:1 1 0;width:100%}.f-table-has-form .farris-input-wrap .f-personnel-selector,.f-table-has-form .farris-input-wrap .f-personnel-selector .s-select-help{height:100%}.f-table-has-form .farris-input-wrap .f-personnel-selector .s-input-group{border:none!important}.f-table-has-form .farris-input-wrap .farris-tags{white-space:pre-wrap;height:100%;display:flex;align-items:center;margin-left:1rem}.f-table-has-form .farris-input-wrap .farris-tags .farris-tags-item-container{word-break:break-all;padding-left:4px}.f-table-has-form .farris-input-wrap .farris-tags .farris-tags-item-container .farris-tag-item{margin-top:4px;margin-bottom:4px;white-space:pre-wrap}@-moz-document url-prefix(){.f-table-has-form tr{height:43px}.f-table-has-form td{height:100%}} \ No newline at end of file diff --git a/packages/mobile-designer/public/assets/farris-mobile-page.css b/packages/mobile-designer/public/assets/farris-mobile-page.css new file mode 100644 index 0000000000000000000000000000000000000000..6c30cece8c14516dc4d9e3b36684b4c0d620da53 --- /dev/null +++ b/packages/mobile-designer/public/assets/farris-mobile-page.css @@ -0,0 +1,5124 @@ +@charset "UTF-8"; + +#app, +.fm-page { + position: absolute; + left: 0; + right: 0; + top: 0 +} + +a, +abbr, +acronym, +address, +applet, +article, +aside, +audio, +b, +big, +blockquote, +body, +canvas, +caption, +center, +cite, +code, +dd, +del, +details, +dfn, +div, +dl, +dt, +em, +embed, +fieldset, +figcaption, +figure, +footer, +form, +h1, +h2, +h3, +h4, +h5, +h6, +header, +hgroup, +html, +i, +iframe, +img, +ins, +kbd, +label, +legend, +li, +mark, +menu, +nav, +object, +ol, +output, +p, +pre, +q, +ruby, +s, +samp, +section, +small, +span, +strike, +strong, +sub, +summary, +sup, +table, +tbody, +td, +tfoot, +th, +thead, +time, +tr, +tt, +u, +ul, +var, +video { + margin: 0; + padding: 0 +} + +html { + line-height: 1; + -webkit-tap-highlight-color: transparent +} + +ol, +ul { + list-style: none +} + +table { + border-collapse: collapse; + border-spacing: 0 +} + +caption, +td, +th { + font-weight: 400; + vertical-align: middle +} + +blockquote, +q { + quotes: none +} + +blockquote::after, +blockquote::before, +q::after, +q::before { + content: ''; + content: none +} + +a img { + border: none +} + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +menu, +nav, +section, +summary { + display: block +} + +*, +::after, +::before { + box-sizing: border-box +} + +#app, +body, +html { + overflow: hidden; + -webkit-overflow-scrolling: auto +} + +body { + min-height: 100vh; + display: flex; + color: #333; + background-color: #fff +} + +a { + text-decoration: none; + background: 0 0 +} + +button, +input[type=number], +input[type=text], +input[type=password], +input[type=email], +input[type=search], +select, +textarea { + margin: 0; + font-family: inherit; + -moz-appearance: none; + appearance: none; + -webkit-appearance: none +} + +#app { + bottom: 0 +} + +@supports ((height:constant(safe-area-inset-top)) or (height:env(safe-area-inset-top))) and (-webkit-overflow-scrolling:touch) { + #app { + bottom: 20px + } + + #app #app { + bottom: 0 + } +} + +.fm-text-light { + color: #888 +} + +.fm-text-lighter { + color: #777 +} + +.fm-text-lightest { + color: #666 +} + +.fm-text-emph { + color: #333 +} + +.fm-text-primary { + color: #3A90FF +} + +.fm-utils-clearfix::after { + content: ''; + clear: both; + overflow: hidden +} + +.fm-page { + flex: 1; + display: flex; + flex-direction: column; + background: #f9fafb; + overflow: hidden; + bottom: 0; + -webkit-overflow-scrolling: auto +} + +.fm-page-header { + flex-shrink: 0 +} + +.fm-page-main { + flex-basis: 0; + flex-shrink: 1; + flex-grow: 1; + padding-bottom: 12px; + overflow: auto; + display: flex; + flex-direction: column +} + +.fm-page-main::-webkit-scrollbar { + display: none +} + +.fm-page-navbar { + flex-shrink: 0 +} + +.fm-page-footer { + background-color: #fff +} + +.fm-page-footer-btns { + display: flex; + flex-direction: row; + align-items: center; + height: 100% +} + +.fm-page-footer-btns-item { + flex: 1; + display: flex; + flex-direction: column; + text-align: center; + justify-content: center +} + +.fm-page-footer-btns-item-icon { + margin-bottom: 4px; + font-size: 18px +} + +.fm-page-footer-btns-item-text { + font-size: 12px; + color: #999 +} + +.fm-page-footer-btns-item:hover .fm-page-footer-btns-item-icon { + font-size: 22px; + color: #3a90ff +} + +.fm-page-footer-btns-item:hover .fm-page-footer-btns-item-text { + color: #3a90ff +} + +.fm-form-control { + display: block; + width: 100%; + min-width: 0; + height: 22px; + margin: 0; + padding: 0 4px; + font-size: 14px; + color: #333; + line-height: inherit; + text-align: left; + background-color: transparent; + border: 1px solid #ddd; + border-radius: 3px; + resize: none +} + +.fm-form-control:focus { + border-color: #3499f6 +} + +.fm-textarea { + border-radius: 4px; + padding: 6px 16px; + width: 100%; + border: 1px solid #ddd; + outline: 0; + font-size: 14px; + line-height: 24px; + color: #333; + display: inline-flex; + vertical-align: middle +} + +.fm-textarea:focus { + border-color: #3499f6 +} + +.align-baseline { + vertical-align: baseline !important +} + +.align-top { + vertical-align: top !important +} + +.align-middle { + vertical-align: middle !important +} + +.align-bottom { + vertical-align: bottom !important +} + +.align-text-bottom { + vertical-align: text-bottom !important +} + +.align-text-top { + vertical-align: text-top !important +} + +.bg-info { + background-color: #4D9AFF !important +} + +.bg-submit { + background-color: #5AC1C3 !important +} + +.bg-success { + background-color: #5CC171 !important +} + +.bg-warning { + background-color: #FF9800 !important +} + +.bg-danger { + background-color: #F24645 !important +} + +.bg-white { + background-color: #fff !important +} + +.bg-transparent { + background-color: transparent !important +} + +.border { + border: 1px solid #DDD; + border-radius: 0 +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .border { + position: relative; + border: none + } + + html:not([data-scale]) .border::before { + content: ''; + position: absolute; + left: 0; + top: 0; + width: 200%; + height: 200%; + border: 1px solid #DDD; + border-radius: 0; + transform-origin: 0 0; + transform: scale(.5); + box-sizing: border-box; + pointer-events: none + } +} + +.border-top { + border-top: 1px solid #DDD; + position: relative +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .border-top { + border-top: none + } + + html:not([data-scale]) .border-top::before { + content: ''; + position: absolute; + background-color: #DDD; + display: block; + z-index: 1; + top: 0; + right: auto; + bottom: auto; + left: 0; + width: 100%; + height: 1PX; + transform-origin: 50% 50%; + transform: scaleY(.5) + } +} + +.border-right { + border-right: 1px solid #DDD; + position: relative +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .border-right { + border-right: none + } + + html:not([data-scale]) .border-right::after { + content: ''; + position: absolute; + display: block; + z-index: 1; + top: 0; + right: 0; + bottom: auto; + left: auto; + width: 1PX; + height: 100%; + background: #DDD; + transform-origin: 100% 50%; + transform: scaleX(.5) + } +} + +.border-bottom { + border-bottom: 1px solid #DDD; + position: relative +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .border-bottom { + border-bottom: none + } + + html:not([data-scale]) .border-bottom::after { + content: ''; + position: absolute; + background-color: #DDD; + display: block; + z-index: 1; + top: auto; + right: auto; + bottom: 0; + left: 0; + width: 100%; + height: 1PX; + transform-origin: 50% 100%; + transform: scaleY(.5) + } +} + +.border-left { + border-left: 1px solid #DDD; + position: relative +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .border-left { + border-left: none + } + + html:not([data-scale]) .border-left::before { + content: ''; + position: absolute; + background-color: #DDD; + display: block; + z-index: 1; + top: 0; + right: auto; + bottom: auto; + left: 0; + width: 1PX; + height: 100%; + transform-origin: 100% 50%; + transform: scaleX(.5) + } +} + +.border-0::before, +.border-bottom-0::after, +.border-left-0::before, +.border-right-0::after, +.border-top-0::before { + display: none !important +} + +.border-0 { + border: 0 +} + +.border-top-0 { + border-top: 0 +} + +.border-right-0 { + border-right: 0 +} + +.border-bottom-0 { + border-bottom: 0 +} + +.border-left-0 { + border-left: 0 +} + +.clearfix::after { + display: block; + clear: both; + content: "" +} + +.display-none { + display: none !important +} + +.display-inline { + display: inline !important +} + +.display-inline-block { + display: inline-block !important +} + +.d-block, +.display-block { + display: block !important +} + +.display-table { + display: table !important +} + +.display-table-row { + display: table-row !important +} + +.display-table-cell { + display: table-cell !important +} + +.d-flex, +.display-flex, +.fm-utils-flex-column { + display: flex !important +} + +.display-inline-flex { + display: inline-flex !important +} + +.flex-direction-row, +.flex-row { + flex-direction: row !important +} + +.flex-column, +.flex-direction-column { + flex-direction: column !important +} + +.flex-direction-row-reverse, +.flex-row-reverse { + flex-direction: row-reverse !important +} + +.flex-column-reverse, +.flex-direction-column-reverse { + flex-direction: column-reverse !important +} + +.flex-row, +.fm-utils-flex-row { + flex-direction: row !important +} + +.float-left { + float: left !important +} + +.float-right { + float: right !important +} + +.float-none { + float: none !important +} + +.position-static { + position: static !important +} + +.position-relative { + position: relative !important +} + +.position-absolute { + position: absolute !important +} + +.position-fixed { + position: fixed !important +} + +.position-sticky { + position: -webkit-sticky !important; + position: sticky !important +} + +.fixed-bottom, +.fixed-top { + position: fixed; + z-index: 1030; + right: 0; + left: 0 +} + +.fixed-top { + top: 0 +} + +.fixed-bottom { + bottom: 0 +} + +.shadow-none { + box-shadow: none !important +} + +.w-25 { + width: 25% !important +} + +.w-50 { + width: 50% !important +} + +.w-75 { + width: 75% !important +} + +.w-100 { + width: 100% !important +} + +.w-auto { + width: auto !important +} + +.h-25 { + height: 25% !important +} + +.h-50 { + height: 50% !important +} + +.h-75 { + height: 75% !important +} + +.h-100 { + height: 100% !important +} + +.h-auto { + height: auto !important +} + +.mw-100 { + max-width: 100% !important +} + +.mh-100 { + max-height: 100% !important +} + +.m-0 { + margin: 0 !important +} + +.mt-0, +.my-0 { + margin-top: 0 !important +} + +.mr-0, +.mx-0 { + margin-right: 0 !important +} + +.mb-0, +.my-0 { + margin-bottom: 0 !important +} + +.ml-0, +.mx-0 { + margin-left: 0 !important +} + +.p-0 { + padding: 0 !important +} + +.pt-0, +.py-0 { + padding-top: 0 !important +} + +.pr-0, +.px-0 { + padding-right: 0 !important +} + +.pb-0, +.py-0 { + padding-bottom: 0 !important +} + +.pl-0, +.px-0 { + padding-left: 0 !important +} + +.m-base { + margin: 4px !important +} + +.mt-base, +.my-base { + margin-top: 4px !important +} + +.mr-base, +.mx-base { + margin-right: 4px !important +} + +.mb-base, +.my-base { + margin-bottom: 4px !important +} + +.ml-base, +.mx-base { + margin-left: 4px !important +} + +.p-base { + padding: 4px !important +} + +.pt-base, +.py-base { + padding-top: 4px !important +} + +.pr-base, +.px-base { + padding-right: 4px !important +} + +.pb-base, +.py-base { + padding-bottom: 4px !important +} + +.pl-base, +.px-base { + padding-left: 4px !important +} + +.m-xs { + margin: 8px !important +} + +.mt-xs, +.my-xs { + margin-top: 8px !important +} + +.mr-xs, +.mx-xs { + margin-right: 8px !important +} + +.mb-xs, +.my-xs { + margin-bottom: 8px !important +} + +.ml-xs, +.mx-xs { + margin-left: 8px !important +} + +.p-xs { + padding: 8px !important +} + +.pt-xs, +.py-xs { + padding-top: 8px !important +} + +.pr-xs, +.px-xs { + padding-right: 8px !important +} + +.pb-xs, +.py-xs { + padding-bottom: 8px !important +} + +.pl-xs, +.px-xs { + padding-left: 8px !important +} + +.m-sm { + margin: 12px !important +} + +.mt-sm, +.my-sm { + margin-top: 12px !important +} + +.mr-sm, +.mx-sm { + margin-right: 12px !important +} + +.mb-sm, +.my-sm { + margin-bottom: 12px !important +} + +.ml-sm, +.mx-sm { + margin-left: 12px !important +} + +.p-sm { + padding: 12px !important +} + +.pt-sm, +.py-sm { + padding-top: 12px !important +} + +.pr-sm, +.px-sm { + padding-right: 12px !important +} + +.pb-sm, +.py-sm { + padding-bottom: 12px !important +} + +.pl-sm, +.px-sm { + padding-left: 12px !important +} + +.m-md { + margin: 16px !important +} + +.mt-md, +.my-md { + margin-top: 16px !important +} + +.mr-md, +.mx-md { + margin-right: 16px !important +} + +.mb-md, +.my-md { + margin-bottom: 16px !important +} + +.ml-md, +.mx-md { + margin-left: 16px !important +} + +.p-md { + padding: 16px !important +} + +.pt-md, +.py-md { + padding-top: 16px !important +} + +.pr-md, +.px-md { + padding-right: 16px !important +} + +.pb-md, +.py-md { + padding-bottom: 16px !important +} + +.pl-md, +.px-md { + padding-left: 16px !important +} + +.m-lg { + margin: 24px !important +} + +.mt-lg, +.my-lg { + margin-top: 24px !important +} + +.mr-lg, +.mx-lg { + margin-right: 24px !important +} + +.mb-lg, +.my-lg { + margin-bottom: 24px !important +} + +.ml-lg, +.mx-lg { + margin-left: 24px !important +} + +.p-lg { + padding: 24px !important +} + +.pt-lg, +.py-lg { + padding-top: 24px !important +} + +.pr-lg, +.px-lg { + padding-right: 24px !important +} + +.pb-lg, +.py-lg { + padding-bottom: 24px !important +} + +.pl-lg, +.px-lg { + padding-left: 24px !important +} + +.m-xl { + margin: 32px !important +} + +.mt-xl, +.my-xl { + margin-top: 32px !important +} + +.mr-xl, +.mx-xl { + margin-right: 32px !important +} + +.mb-xl, +.my-xl { + margin-bottom: 32px !important +} + +.ml-xl, +.mx-xl { + margin-left: 32px !important +} + +.p-xl { + padding: 32px !important +} + +.pt-xl, +.py-xl { + padding-top: 32px !important +} + +.pr-xl, +.px-xl { + padding-right: 32px !important +} + +.pb-xl, +.py-xl { + padding-bottom: 32px !important +} + +.pl-xl, +.px-xl { + padding-left: 32px !important +} + +.m-auto { + margin: auto !important +} + +.mt-auto, +.my-auto { + margin-top: auto !important +} + +.mr-auto, +.mx-auto { + margin-right: auto !important +} + +.mb-auto, +.my-auto { + margin-bottom: auto !important +} + +.ml-auto, +.mx-auto { + margin-left: auto !important +} + +.text-justify { + text-align: justify !important +} + +.text-nowrap { + white-space: nowrap !important +} + +.text-align-left { + text-align: left !important +} + +.text-align-right { + text-align: right !important +} + +.text-align-center { + text-align: center !important +} + +.text-lowercase { + text-transform: lowercase !important +} + +.text-uppercase { + text-transform: uppercase !important +} + +.text-capitalize { + text-transform: capitalize !important +} + +.font-weight-light { + font-weight: 300 !important +} + +.font-weight-normal { + font-weight: 400 !important +} + +.font-weight-bold { + font-weight: 700 !important +} + +.font-italic { + font-style: italic !important +} + +.text-white { + color: #fff !important +} + +.visible { + visibility: visible +} + +.invisible { + visibility: hidden +} + +.d-flex { + display: flex +} + +.d-inline-flex { + display: inline-flex +} + +.d-block { + display: block +} + +.d-inline-block { + display: inline-block +} + +.d-inline { + display: inline +} + +.flex-column { + flex-direction: column !important +} + +.flex-row-reverse { + flex-direction: row-reverse !important +} + +.flex-column-reverse { + flex-direction: column-reverse !important +} + +.flex-wrap { + flex-wrap: wrap !important +} + +.flex-nowrap { + flex-wrap: nowrap !important +} + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important +} + +.flex-fill { + flex: 1 1 auto !important +} + +.flex-grow-0 { + flex-grow: 0 !important +} + +.flex-grow-1 { + flex-grow: 1 !important +} + +.flex-shrink-0 { + flex-shrink: 0 !important +} + +.flex-shrink-1 { + flex-shrink: 1 !important +} + +.justify-content-start { + justify-content: flex-start !important +} + +.justify-content-end { + justify-content: flex-end !important +} + +.justify-content-center { + justify-content: center !important +} + +.justify-content-between { + justify-content: space-between !important +} + +.justify-content-around { + justify-content: space-around !important +} + +.align-items-start { + align-items: flex-start !important +} + +.align-items-end { + align-items: flex-end !important +} + +.align-items-center { + align-items: center !important +} + +.align-items-baseline { + align-items: baseline !important +} + +.align-items-stretch { + align-items: stretch !important +} + +.align-content-start { + align-content: flex-start !important +} + +.align-content-end { + align-content: flex-end !important +} + +.align-content-center { + align-content: center !important +} + +.align-content-between { + align-content: space-between !important +} + +.align-content-around { + align-content: space-around !important +} + +.align-content-stretch { + align-content: stretch !important +} + +.align-self-auto { + align-self: auto !important +} + +.align-self-start { + align-self: flex-start !important +} + +.align-self-end { + align-self: flex-end !important +} + +.align-self-center { + align-self: center !important +} + +.align-self-baseline { + align-self: baseline !important +} + +.align-self-stretch { + align-self: stretch !important +} + +.fm-utils-absolute-all { + top: 0; + bottom: 0; + position: absolute; + right: 0; + left: 0 +} + +.fm-utils-flex-column { + flex-direction: column !important; + overflow: hidden +} + +.fm-utils-fill-flex-column, +.fm-utils-fill-flex-row { + flex-shrink: 1; + display: flex !important; + overflow: hidden +} + +.fm-utils-fill-flex-column { + flex-grow: 1; + flex-basis: 0; + flex-direction: column !important +} + +.fm-utils-flex-row { + display: flex !important; + overflow: hidden; + flex-wrap: nowrap +} + +.fm-utils-flex-row-wrap { + display: flex !important; + flex-direction: row !important; + overflow: hidden; + flex-wrap: wrap !important +} + +.fm-utils-fill-flex-row { + flex-grow: 1; + flex-basis: 0; + flex-direction: row !important; + flex-wrap: nowrap !important +} + +.fm-utils-fill-flex-row-wrap { + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + display: flex !important; + flex-direction: row !important; + overflow: hidden; + flex-wrap: wrap !important +} + +.fm-utils-fill { + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + overflow: hidden +} + +.fm-utils-fill-auto { + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + overflow-x: hidden; + overflow-y: auto +} + +.fm-utils-overflow-xhya { + overflow-x: hidden !important; + overflow-y: auto !important +} + +.fm-utils-overflow-xayh { + overflow-y: hidden !important; + overflow-x: auto !important +} + +.fm-utils-overflow-xaya { + overflow: auto !important +} + +.fm-utils-overflow-hidden { + overflow: hidden !important +} + +.fm-utils-overflow-auto { + overflow: auto !important +} + +.fm-overflow-x-auto { + overflow-x: auto !important +} + +.fm-overflow-x-hidden, +.fm-overflow-y-auto, +.fm-overflow-y-hidden { + overflow-x: hidden !important +} + +.fm-overflow-y-auto { + overflow-y: auto !important +} + +.fm-overflow-y-hidden { + overflow-y: hidden !important +} + +.fm-overflow-hidden { + overflow: hidden !important +} + +.fm-utils-text-break { + white-space: normal !important; + word-break: break-all !important +} + +.fm-utils-display-none { + display: none !important +} + +.fm-multi-ellipsis-l2, +.fm-multi-ellipsis-l3 { + display: -webkit-box; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis +} + +.fm-ellipsis { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis +} + +.fm-multi-ellipsis-l2 { + -webkit-line-clamp: 2 +} + +.fm-multi-ellipsis-l3 { + -webkit-line-clamp: 3 +} + +.fm-float-button-wrapper { + position: absolute; + right: 16px; + bottom: 50px +} + +.fm-listview-error { + background: #fff; + box-shadow: 0 2px 6px 0 rgba(0, 0, 0, .12) +} + +.fm-error-cell { + position: relative; + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 16px; + height: 32px +} + +.fm-error-cell:not(:last-child)::after { + content: ''; + height: 1px; + position: absolute; + background-color: #f1f1f1; + display: block; + z-index: 1; + bottom: 0; + left: 16px; + right: 0; + transform: translateY(.5) +} + +.fm-error-text { + font-size: 13px; + color: #f24645; + line-height: 22px +} + +.fm-error-icon { + background: #F24645; + color: #fff; + border-radius: 100%; + margin-right: 4px +} + +.fm-without-last-child .fm-bottom-line { + border-bottom: 1px solid var(--fm-border-color); + position: relative +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .fm-without-last-child .fm-bottom-line { + border-bottom: none + } + + html:not([data-scale]) .fm-without-last-child .fm-bottom-line::after { + content: ''; + position: absolute; + background-color: var(--fm-border-color); + display: block; + z-index: 1; + top: auto; + right: auto; + bottom: 0; + left: 0; + width: 100%; + height: 1PX; + transform-origin: 50% 100%; + transform: scaleY(.5) + } +} + +.fm-tmpl-single-header { + height: 32px; + display: flex; + align-items: center; + padding: 0 0 0 16px; + background: #F8F9FB +} + +.fm-tmpl-single-header h6 { + color: #999; + font-size: 15px; + font-weight: 400; + margin: 0 +} + +.fm-tmpl-singlelist-with-iconarea { + background: #fff; + overflow: hidden +} + +.fm-tmpl-singlelist-with-iconarea .singlelist--item { + align-items: center; + padding: 0 0 0 16px; + display: flex +} + +.fm-tmpl-singlelist-with-iconarea .singlelist--item:last-child .singlelist--item-title-wrapper { + border-bottom: none +} + +.fm-tmpl-singlelist-with-iconarea .singlelist--item .item-img-round--wrapper .item-img-round--img { + width: 26px; + height: 26px; + border-radius: 13px +} + +.fm-tmpl-singlelist-with-iconarea .singlelist--item .item-img-round--wrapper .item-img-round--img .fm-icon { + line-height: 26px +} + +.fm-tmpl-singlelist-with-iconarea .singlelist--item-title-wrapper { + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + color: #333; + font-size: 16px; + line-height: 22px; + padding: 11px 0 10px; + border-bottom: 1px solid #ddd; + position: relative +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .fm-tmpl-singlelist-with-iconarea .singlelist--item-title-wrapper { + border-bottom: none + } + + html:not([data-scale]) .fm-tmpl-singlelist-with-iconarea .singlelist--item-title-wrapper::after { + content: ''; + position: absolute; + background-color: #ddd; + display: block; + z-index: 1; + top: auto; + right: auto; + bottom: 0; + left: 0; + width: 100%; + height: 1PX; + transform-origin: 50% 100%; + transform: scaleY(.5) + } +} + +.item-img-round--wrapper { + margin: 0 10px 0 0 +} + +.item-img-round--wrapper .item-img-round--img { + width: 30px; + height: 30px; + border-radius: 15px; + text-align: center; + color: #fff +} + +.item-img-round--wrapper .item-img-round--img .fm-icon { + font-size: 18px; + line-height: 30px +} + +.item-img-round--wrapper .fm-bg-yellow { + background: #FBB902 +} + +.item-img-round--wrapper .fm-bg-orange { + background: #FF9800 +} + +.item-img-round--wrapper .fm-bg-blue { + background: #4D9AFF +} + +.item-img-round--wrapper .fm-bg-lightblue { + background: #5ACBCD +} + +.item-img-round--wrapper .fm-bg-purple { + background: #817EFF +} + +.item-img-round--wrapper .fm-bg-darkgreen { + background: #51BD78 +} + +.fm-tmpl-header-with-img { + display: flex; + align-items: center +} + +.fm-tmpl-header-with-img h5 { + font-size: 16px; + color: #333; + margin: 0; + font-weight: 400 +} + +.fm-tmpl-header-with-img .header-with-img--img-wrapper { + margin: 0 8px 0 0 +} + +.fm-tmpl-header-with-img .header-with-img--img-wrapper .header-with-img--img { + width: 20px; + height: 20px; + border-radius: 10px; + line-height: 20px; + text-align: center; + color: #fff; + background-image: linear-gradient(180deg, #64CDFB 1%, #3A90FF 100%) +} + +.fm-tmpl-header-with-img .header-with-img--img-wrapper .header-with-img--img .fm-icon { + font-size: 12px +} + +.fm-tmpl-header-with-img .header-with-img--img-wrapper .fm-bg-blue { + color: #fff; + background-image: linear-gradient(180deg, #64CDFB 1%, #3A90FF 100%) +} + +.fm-tmpl-header-with-img .header-with-img--img-wrapper .fm-bg-orange { + color: #fff; + background-image: linear-gradient(180deg, #FFB951 15%, #FF9800 100%) +} + +.fm-tmpl-header-with-img .header-with-img--img-wrapper .fm-bg-green { + color: #fff; + background-image: linear-gradient(180deg, #7ACC8D 15%, #51BD78 100%) +} + +.fm-cmp-collapse-style::after { + display: none +} + +.fm-cmp-collapse-style .van-collapse-item__title { + align-items: center +} + +.fm-cmp-collapse-style .van-collapse-item__content { + padding: 0 +} + +.fm-cmp-collapse-style.van-collapse { + margin: 0 0 12px +} + +.fm-cmp-collapse-style.van-collapse:last-child { + margin-bottom: 0 +} + +.fm-tmpl-collapse-sub::after { + border-bottom: 0 +} + +.fm-tmpl-collapse-sub-header { + display: flex; + flex-direction: column-reverse +} + +.fm-tmpl-collapse-sub-header .van-collapse-item__title .expand, +.fm-tmpl-collapse-sub-header .van-collapse-item__title--expanded .collapse { + display: none +} + +.fm-tmpl-collapse-sub-header .van-collapse-item__title { + color: #888; + flex-direction: row-reverse; + justify-content: center +} + +.fm-tmpl-collapse-sub-header .van-collapse-item__title h6 { + color: #888; + font-size: 13px; + font-weight: 400 +} + +.fm-tmpl-collapse-sub-header .van-collapse-item__title .collapse-icon { + margin: 0 8px; + transition: transform .3s +} + +.fm-tmpl-collapse-sub-header .van-collapse-item__title--expanded .expand { + display: inline-block +} + +.fm-tmpl-collapse-sub-header .van-collapse-item__title--expanded .collapse-icon { + transform: rotate(180deg) +} + +.fm-btn-block-wrapper { + height: 42px; + background: #fff; + display: flex; + align-items: center +} + +.fm-btn-block-wrapper .fm-button { + font-size: 14px !important; + height: 100% +} + +.fm-btn-with-icon .fm-btn-text { + margin: 0 8px +} + +.fm-btn-with-icon .fm-btn-icon { + font-size: 14px +} + +.fm-tmpl-list-with-img-detail.fm-tmpl-list-with-border { + margin-bottom: 12px +} + +.fm-tmpl-list-with-img-detail.fm-tmpl-list-with-border .img-detail--item { + margin-bottom: 0; + border-bottom: 1px solid #ddd; + position: relative +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .fm-tmpl-list-with-img-detail.fm-tmpl-list-with-border .img-detail--item { + border-bottom: none + } + + html:not([data-scale]) .fm-tmpl-list-with-img-detail.fm-tmpl-list-with-border .img-detail--item::after { + content: ''; + position: absolute; + background-color: #ddd; + display: block; + z-index: 1; + top: auto; + right: auto; + bottom: 0; + left: 0; + width: 100%; + height: 1PX; + transform-origin: 50% 100%; + transform: scaleY(.5) + } +} + +.fm-round-bg { + margin: 4px auto 0; + width: 36px; + height: 36px; + background: #3A90FF; + border-radius: 20px; + line-height: 36px; + font-size: 13px; + text-align: center; + overflow: hidden; + white-space: nowrap +} + +.fm-round-bg-text { + color: #FFF +} + +.fm-tmpl-list-with-img-detail .img-detail--item { + padding: 12px 16px; + background: #fff; + border-bottom: 1px solid #ddd; + position: relative +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .fm-tmpl-list-with-img-detail .img-detail--item { + border-bottom: none + } + + html:not([data-scale]) .fm-tmpl-list-with-img-detail .img-detail--item::after { + content: ''; + position: absolute; + background-color: #ddd; + display: block; + z-index: 1; + top: auto; + right: auto; + bottom: 0; + left: 0; + width: 100%; + height: 1PX; + transform-origin: 50% 100%; + transform: scaleY(.5) + } +} + +.fm-tmpl-list-with-img-detail .img-detail--item .img-detail--item-content { + display: flex; + position: relative +} + +.fm-tmpl-list-with-img-detail .img-detail--item .img-detail--status { + position: absolute; + right: 0; + top: 23px +} + +.fm-tmpl-list-with-img-detail .img-detail--item .img-detail--content { + position: relative; + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0 +} + +.fm-tmpl-list-with-img-detail .img-detail--item .img-detail--header { + display: flex; + align-items: center; + justify-content: space-between; + margin: 0 0 6px +} + +.fm-tmpl-list-with-img-detail .img-detail--item .img-detail--header .title { + line-height: 22px; + font-weight: 400; + font-size: 16px; + color: #333 +} + +.fm-tmpl-list-with-img-detail .img-detail--item .img-detail--header .time { + line-height: 18px; + color: #999; + font-size: 13px +} + +.fm-tmpl-list-with-img-detail .img-detail--item .img-detail--info { + line-height: 18px; + color: #999; + font-size: 13px; + margin: 0 0 4px +} + +.fm-tmpl-list-with-img-detail .img-detail--item .img-detail--info>.gutter { + margin: 0 14px 0 0 +} + +.fm-tmpl-list-with-img-detail .img-detail--item .img-detail--actions { + padding: 18px 0 0; + text-align: right +} + +.fm-tmpl-list-with-img-detail .img-detail--item .img-detail--actions .fm-button { + margin-left: 13px +} + +.fm-tmpl-list-with-img-detail .img-detail--item .img-detail--actions .fm-button:first-child { + margin-left: 0 +} + +.fm-tmpl-result { + display: flex; + flex-direction: column; + padding-top: 40px; + align-items: center +} + +.fm-tmpl-result-header .fm-result-title { + display: flex; + flex-direction: row; + font-size: 20px; + color: #333 +} + +.fm-tmpl-result-header .fm-result-title .fm-result-title-number { + color: #FF9800 +} + +.fm-tmpl-result-content { + max-width: 84%; + padding-top: 30px; + padding-bottom: 30px; + text-align: center +} + +.fm-tmpl-result-content .fm-result-img { + width: 140px; + height: 140px; + margin: 0 auto +} + +.fm-tmpl-result-content .fm-result-img img { + display: block; + width: 140px; + height: 140px +} + +.fm-tmpl-result-content .fm-result-text { + padding-top: 30px; + padding-bottom: 10px; + font-size: 16px; + color: #333; + text-align: center +} + +.fm-tmpl-result-content .fm-result-tip { + line-height: 22px; + font-size: 16px; + color: #888; + text-align: center +} + +.fm-tmpl-result-footer { + width: 140px; + margin: 0 auto +} + +.fm-tmpl-result-footer .fm-result-btn { + margin-bottom: 16px +} + +.fm-tmpl-result-footer .fm-result-btn:last-child { + margin-bottom: 0 +} + +.fm-tabbar-style { + border-top: 1px solid #ddd; + position: relative +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .fm-tabbar-style { + border-top: none + } + + html:not([data-scale]) .fm-tabbar-style::before { + content: ''; + position: absolute; + background-color: #ddd; + display: block; + z-index: 1; + top: 0; + right: auto; + bottom: auto; + left: 0; + width: 100%; + height: 1PX; + transform-origin: 50% 50%; + transform: scaleY(.5) + } +} + +.fm-tabbar-style .show-fixed-width { + padding: 0 17px; + flex-shrink: 0; + flex-grow: 0; + flex-basis: auto +} + +.fm-tabbar-style .show-fixed-width+.show-left-width { + padding: 7px 16px 7px 0 +} + +.fm-tabbar-style .show-fixed-width .van-tabbar-item__icon .fm-icon { + font-size: 19px +} + +.fm-tabbar-style .show-fixed-width .van-tabbar-item__text { + font-size: 12px; + transform: scale(.8333) +} + +.fm-tabbar-style .show-left-width { + padding: 7px 16px +} + +.fm-tabbar-style .show-left-width .fm-button { + height: 100% +} + +.fm-tmpl-detail-header { + padding-left: 16px; + background-color: #fff +} + +.fm-tmpl-detail-header-inner { + display: flex; + flex-direction: row; + align-items: center; + padding: 16px 16px 16px 0; + border-bottom: 1px solid #DDD; + position: relative +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .fm-tmpl-detail-header-inner { + border-bottom: none + } + + html:not([data-scale]) .fm-tmpl-detail-header-inner::after { + content: ''; + position: absolute; + background-color: #DDD; + display: block; + z-index: 1; + top: auto; + right: auto; + bottom: 0; + left: 0; + width: 100%; + height: 1PX; + transform-origin: 50% 100%; + transform: scaleY(.5) + } +} + +.fm-approve-flow-wrapper .fm-approve-flow-item .fm-approve-flow-item-header-icon .header-icon::before, +.fm-approve-flow-wrapper .fm-approve-flow-item-content .fm-approve-flow-item-main-avatar .avatar-icon::before { + content: "\e6b4" +} + +.fm-tmpl-detail-header-inner .detail-header--avatar { + width: 40px; + margin-right: 10px; + border-radius: 50%; + overflow: hidden +} + +.fm-tmpl-detail-header-inner .detail-header--avatar img { + display: block; + width: 40px; + height: 40px +} + +.fm-tmpl-detail-header-inner .detail-header--content { + flex: 1 +} + +.fm-tmpl-detail-header-inner .detail-header--content-title { + margin-bottom: 3px; + font-size: 15px; + color: #333 +} + +.fm-tmpl-detail-header-inner .detail-header--content-subtitle { + font-size: 13px; + color: #888 +} + +.fm-static-input-list { + padding: 16px 0 16px 16px; + background-color: #fff; + margin: 0 0 8px +} + +.fm-static-input-list .fm-listview-item:last-child .fm-static-input-info { + margin-bottom: 0 +} + +.fm-static-input-info { + display: flex; + flex-direction: row; + align-items: center; + margin-bottom: 8px; + line-height: 20px +} + +.fm-static-input-info .input-info--label { + width: 92px; + font-size: 14px; + color: #999; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.fm-static-input-info .input-info--text { + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + padding-left: 8px; + font-size: 14px; + color: #333 +} + +.fm-static-input-info .input-info--accessory { + display: flex; + flex-direction: row; + align-items: center; + flex-wrap: wrap +} + +.fm-static-input-info .input-info--accessory-item { + flex-shrink: 0; + width: 28px; + height: 28px; + margin-right: 12px; + border-radius: 3px; + overflow: hidden +} + +.fm-static-input-info .input-info--accessory-item img { + display: block; + width: 28px +} + +.fm-static-input-info .input-info--accessory-item:last-child { + margin-right: 0 +} + +.fm-approve-flow-wrapper { + padding: 12px 16px; + background-color: #fff +} + +.fm-approve-flow-wrapper .fm-approve-flow-item { + padding-left: 7px +} + +.fm-approve-flow-wrapper .fm-approve-flow-item-header { + position: relative; + border-left: 1px dashed #D4D4D4 +} + +.fm-approve-flow-wrapper .fm-approve-flow-item-header-inner { + position: relative; + display: flex; + flex-direction: row; + align-items: center; + padding-left: 28px +} + +.fm-approve-flow-wrapper .fm-approve-flow-item-header-inner .fm-approve-flow-item-header-icon { + position: absolute; + left: -8px; + top: 0; + z-index: 100 +} + +.fm-approve-flow-wrapper .fm-approve-flow-item-header-inner .fm-approve-flow-item-header-icon .fm-icon { + background-color: #fff; + font-size: 15px; + color: #34AAFF; + border-radius: 50% +} + +.fm-approve-flow-wrapper .fm-approve-flow-item-header-inner .fm-approve-flow-item-header-icon img { + background: #fff +} + +.fm-approve-flow-wrapper .fm-approve-flow-item-header-inner .fm-approve-flow-item-header-content { + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + line-height: 21px; + font-size: 15px; + color: #4C4C4C; + font-weight: 700 +} + +.fm-approve-flow-wrapper .fm-approve-flow-item-header-inner .fm-approve-flow-item-header-right { + flex-shrink: 0; + padding-left: 6px +} + +.fm-approve-flow-wrapper .fm-approve-flow-item-header-inner .fm-approve-flow-item-header-right .fm-icon { + color: #979797 +} + +.fm-approve-flow-wrapper .fm-approve-flow-item-header-state { + margin-top: 6px; + padding-left: 28px; + font-size: 13px; + color: #FF9002 +} + +.fm-approve-flow-wrapper .fm-approve-flow-item-content { + display: flex; + flex-direction: row; + align-items: flex-start; + padding: 12px 0 30px 28px; + border-left: 1px dashed #D4D4D4 +} + +.fm-approve-flow-wrapper .fm-approve-flow-item-content .fm-approve-flow-item-main { + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + display: flex; + flex-direction: row; + align-items: flex-start +} + +.fm-approve-flow-wrapper .fm-approve-flow-item-content .fm-approve-flow-item-main-avatar { + position: relative; + display: flex; + flex-direction: row; + align-items: center; + width: 36px; + height: 36px +} + +.fm-approve-flow-wrapper .fm-approve-flow-item-content .fm-approve-flow-item-main-avatar-img { + display: block; + width: 36px; + height: 36px; + border-radius: 50% +} + +.fm-approve-flow-wrapper .fm-approve-flow-item-content .fm-approve-flow-item-main-avatar-icon { + position: absolute; + right: 4px; + bottom: -4px; + font-size: 14px; + color: #34AAFF; + background-color: #fff; + border-radius: 50% +} + +.fm-approve-flow-wrapper .fm-approve-flow-item-content .fm-approve-flow-item-main-text { + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + padding: 0 6px 0 9px +} + +.fm-approve-flow-wrapper .fm-approve-flow-item-content .fm-approve-flow-item-main-text-title { + font-size: 13px; + color: rgba(51, 51, 51, .65) +} + +.fm-approve-flow-wrapper .fm-approve-flow-item-content .fm-approve-flow-item-main-text-subtitle { + margin-top: 2px; + line-height: 20px; + font-size: 14px; + color: #333 +} + +.fm-approve-flow-wrapper .fm-approve-flow-item-content .fm-approve-flow-item-date { + font-size: 13px; + color: rgba(51, 51, 51, .65) +} + +.fm-approve-flow-wrapper .fm-approve-flow-item.fm-approve-flow-item-approved .fm-approve-flow-item-content .fm-approve-flow-item-main-avatar-icon, +.fm-approve-flow-wrapper .fm-approve-flow-item.fm-approve-flow-item-approved .fm-approve-flow-item-header .fm-approve-flow-item-header-icon .fm-icon, +.fm-approve-flow-wrapper .fm-approve-flow-item.fm-approve-flow-item-approved .fm-approve-flow-item-header .fm-approve-flow-item-header-state { + color: #1AD0C8 +} + +.fm-approve-flow-wrapper .fm-approve-flow-item.fm-approve-flow-item-approved .fm-approve-flow-item-content .fm-approve-flow-item-main-avatar .avatar-icon::before, +.fm-approve-flow-wrapper .fm-approve-flow-item.fm-approve-flow-item-approved .fm-approve-flow-item-header .fm-approve-flow-item-header-icon .header-icon::before { + content: "\e6b3" +} + +.fm-approve-flow-wrapper .fm-approve-flow-item:last-child .fm-approve-flow-item-header { + border-left: 0 +} + +.fm-approve-flow-wrapper .fm-approve-flow-item:last-child .fm-approve-flow-item-header::before { + display: none !important +} + +.fm-approve-flow-wrapper .fm-approve-flow-item:last-child .fm-approve-flow-item-content { + padding-bottom: 12px; + border-left: none +} + +.fm-approve-nopass, +.fm-approve-pass { + position: fixed; + top: 48px; + right: 14px; + width: 110px; + height: 110px; + z-index: 1000 +} + +.fm-approve--detail-header { + padding-left: 16px; + background-color: #fff +} + +.fm-approve--detail-header-inner { + display: flex; + flex-direction: row; + align-items: center; + padding: 17px 16px 17px 0; + border-bottom: 1px solid #DDD; + position: relative +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .fm-approve--detail-header-inner { + border-bottom: none + } + + html:not([data-scale]) .fm-approve--detail-header-inner::after { + content: ''; + position: absolute; + background-color: #DDD; + display: block; + z-index: 1; + top: auto; + right: auto; + bottom: 0; + left: 0; + width: 100%; + height: 1PX; + transform-origin: 50% 100%; + transform: scaleY(.5) + } +} + +.fm-approve--detail-header-inner .detail-header--avatar { + width: 40px; + margin-right: 10px; + border-radius: 50%; + overflow: hidden +} + +.fm-approve--detail-header-inner .detail-header--avatar img { + display: block; + width: 40px; + height: 40px +} + +.fm-approve--detail-header-inner .detail-header---info { + flex: 1 +} + +.fm-approve--detail-header-inner .detail-header---info-title { + margin-bottom: 3px; + font-size: 15px; + color: #333 +} + +.fm-approve--detail-header-inner .detail-header---info-subtitle { + font-size: 13px; + color: #888 +} + +.fm-apply-list-wrapper { + padding: 0 16px 16px; + background-color: #fff; + margin: 0 0 12px +} + +.fm-apply-list-item { + display: flex; + flex-direction: row; + align-items: flex-start; + margin-bottom: 8px; + line-height: 20px +} + +.fm-apply-list-item-label { + width: 92px; + font-size: 14px; + color: #999; + text-align: right; + word-break: break-all +} + +.fm-apply-list-item-text { + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + padding-left: 14px; + font-size: 14px; + color: #333; + word-break: break-all +} + +.fm-apply-list-item-accessory { + display: flex; + flex-direction: row; + align-items: center; + flex-wrap: wrap +} + +.fm-apply-list-item-accessory-item { + flex-shrink: 0; + width: 28px; + height: 28px; + margin-right: 12px; + border-radius: 3px; + overflow: hidden +} + +.fm-apply-list-item-accessory-item img { + display: block; + width: 28px +} + +.fm-apply-list-item-accessory-item:last-child { + margin-right: 0 +} + +.fm-apply-list-item:last-child { + margin-bottom: 0 +} + +.fm-apply-panel-title, +.fm-apply-plate-title { + height: 28px; + line-height: 28px; + padding-left: 10px; + margin-bottom: 0; + background: #F6F6F6; + border-radius: 2px +} + +.fm-apply-panel-action, +.fm-apply-plate-action { + padding: 0 6px; + margin: 0 0 0 auto; + color: #D8D8D8 +} + +.fm-apply-panel-action:hover, +.fm-apply-plate-action:hover { + background: #3A90FF; + color: #fff +} + +.fm-apply-panel { + padding-top: 0 +} + +.fm-apply-panel .fm-apply-list { + padding-top: 10px; + padding-bottom: 14px +} + +.fm-apply-panel .fm-apply-list+.fm-apply-list { + border-top: 1px solid #E8E8E8 +} + +.fm-apply-panel-list { + padding: 0 16px; + background-color: #fff; + margin: 0; + border-bottom: 1px solid #E8E8E8 +} + +.fm-apply-panel-list:last-child { + border-bottom: none +} + +.fm-apply-panel-list .panel-list--header { + height: 42px; + display: flex; + align-items: center +} + +.fm-apply-panel-list .panel-list--header .panel-list--header-title { + font-size: 15px; + line-height: 21px; + color: #333; + padding: 0 0 0 10px; + position: relative +} + +.fm-apply-panel-list .panel-list--header .panel-list--header-title::before { + content: ''; + position: absolute; + left: 0; + top: 50%; + width: 3px; + height: 14px; + margin: -7px 0 0; + background: #55BBF6 +} + +.fm-apply-details { + margin: 0 0 14px; + background: #fff +} + +.fm-apply-main { + border-bottom: 1px solid #E8E8E8 +} + +.fm-avatar-with-state { + position: relative; + display: flex; + flex-direction: row; + align-items: center; + width: 36px; + height: 36px +} + +.fm-avatar-with-state--img { + display: block; + width: 36px; + height: 36px; + border-radius: 50% +} + +.fm-avatar-with-state--icon { + position: absolute; + right: 4px; + bottom: -4px; + font-size: 14px; + color: #34AAFF; + background-color: #fff; + border-radius: 50% +} + +.fm-avatar-with-state .avatar-icon::before { + content: "\e6b3" +} + +.fm-avatar-with-state .fm-round-bg { + background: rgba(77, 154, 255, .6) +} + +.fm-avatar-with-state.fm-state-running .avatar-icon::before { + content: "\e6b4" +} + +.fm-feature-select-person { + display: flex; + flex-direction: row; + flex-wrap: wrap; + padding: 0 0 14px +} + +.fm-feature-select-person .select-person--item { + position: relative; + display: flex; + align-items: center; + margin: 0 16px 0 0 +} + +.fm-feature-select-person .select-person--item .fm-avatar-with-state { + width: 48px; + height: 48px +} + +.fm-feature-select-person .select-person--item .fm-avatar-with-state .fm-avatar-with-state--img { + width: 48px; + height: 48px; + border-radius: 24px +} + +.fm-feature-select-person .select-person--item .fm-avatar-with-state .fm-avatar-with-state--icon { + right: 0; + top: 0; + cursor: pointer +} + +.fm-feature-select-person .select-person--item .fm-avatar-with-state .fm-avatar-with-state--icon::before { + content: "\e016" +} + +.fm-feature-select-person .select-person--item .fm-avatar-with-state .fm-avatar-with-state--icon:hover { + background: #F24645; + color: #fff +} + +.fm-feature-select-person .select-person--item .fm-round-bg { + width: 48px; + height: 48px; + border-radius: 24px; + line-height: 48px +} + +.fm-feature-select-person .select-person--icon { + margin: 0 0 0 3px; + color: #A6A6A6 +} + +.fm-feature-select-person .select-person--icon::before { + content: "→" +} + +.fm-tmpl-search-container { + position: relative; + padding: 7px 16px; + display: flex; + flex-direction: row; + align-items: center; + background: #fff +} + +.fm-tmpl-search-container .fm-tmpl-search-type { + flex-shrink: 0; + margin: 0 10px 0 0 +} + +.fm-tmpl-search-container .fm-tmpl-search-type.fm-state-active { + color: #3A90FF +} + +.fm-tmpl-search-container .fm-tmpl-search-inner { + flex: 1 1 0 +} + +.fm-tmpl-search-container .fm-tmpl-search-inner .van-search { + padding: 0 +} + +.fm-tmpl-search-container .fm-tmpl-search-tree-select { + position: absolute; + left: 0; + right: 0; + top: 100%; + z-index: 10 +} + +.fm-page-listview { + display: flex; + flex-direction: column +} + +.fm-page-listview .fm-page-main { + padding-bottom: 0; + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + overflow: hidden +} + +.fm-page-listview .fm-page-main .fm-tmpl-list-extend, +.fm-page-listview .fm-page-main .fm-tmpl-search-container { + flex-shrink: 0 +} + +.fm-page-listview .fm-page-main .fm-tmpl-list-container { + display: flex; + flex-direction: column; + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + overflow: hidden +} + +.fm-page-listview .fm-page-main .fm-tmpl-list-container .fm-tmpl-list-footer { + display: flex; + flex-direction: row; + align-items: center; + height: 54px; + padding: 0 16px; + background: #fff; + box-shadow: 0 -2px 8px 0 rgba(81, 120, 159, .12) +} + +.fm-page-listview .fm-page-main .fm-tmpl-list-container .fm-tmpl-list-footer .fm-tmpl-list-footer-btn { + flex: 1; + text-align: center +} + +.fm-page-listview .fm-page-main .fm-tmpl-list-container .fm-tmpl-search-tree-overlay { + position: absolute; + left: 0; + bottom: 0; + right: 0; + top: 0; + z-index: 9; + background-color: rgba(0, 0, 0, .4) +} + +.fm-page-listview .fm-page-main .fm-tmpl-list-container .fm-tmpl-add-btn { + position: absolute; + right: 16px; + bottom: 50px +} + +.fm-page-listview .fm-page-main .fm-tmpl-list-container .fm-tmpl-add-btn-inner { + width: 48px; + height: 48px; + text-align: center; + line-height: 48px; + border-radius: 50%; + background-image: linear-gradient(-45deg, #65A7FF 0, #3A90FF 100%); + box-shadow: 0 2px 5px 0 rgba(124, 163, 254, .57) +} + +.fm-page-listview .fm-page-main .fm-tmpl-list-container .fm-tmpl-add-btn-inner .fm-icon { + color: #fff; + font-size: 16px +} + +.fm-page-listview .fm-page-main .fm-tmpl-list-container .van-pull-refresh { + display: flex; + flex-direction: column; + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + overflow: hidden +} + +.fm-page-listview .fm-page-main .fm-tmpl-list-container .van-pull-refresh .van-pull-refresh__track { + display: flex; + flex-direction: column; + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0 +} + +.fm-page-listview .fm-page-main .fm-tmpl-list-container .fm-listview-wrapper .van-pull-refresh { + overflow: inherit +} + +.fm-page-listview .fm-page-main .fm-tmpl-list-add .fm-tmpl-add-btn { + bottom: 16px +} + +.fm-page-listview .fm-page-main .fm-tmpl-list-add .fm-listview-container.fm-listview-container-fill .fm-listview-main { + padding-bottom: 70px +} + +.fm-page-listview .fm-page-main .fm-tmpl-tabs { + flex: 1; + display: flex; + flex-direction: column +} + +.fm-page-listview .fm-page-main .fm-tmpl-tabs .fm-tab-bar, +.fm-page-listview .fm-page-main .fm-tmpl-tabs .van-tabs__wrap { + flex-shrink: 0 +} + +.fm-page-listview .fm-page-main .fm-tmpl-tabs .fm-tabs-content, +.fm-page-listview .fm-page-main .fm-tmpl-tabs .fm-tabs-content .fm-tab-pane, +.fm-page-listview .fm-page-main .fm-tmpl-tabs .van-tabs__content { + display: flex; + flex-direction: column; + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + overflow: hidden +} + +.fm-page-listview .fm-page-main .fm-tmpl-tabs .van-tabs__content .van-tab__pane { + display: flex; + flex-direction: column; + flex: 1 +} + +.fm-page-listview .fm-page-main .fm-tmpl-tabs .fm-tmpl-tabs-content { + display: flex; + flex-direction: column; + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + overflow: hidden +} + +.fm-page-card .fm-page-footer, +.fm-tmpl-list-extend { + flex-shrink: 0 +} + +.fm-btn-link { + color: #3A90FF +} + +.fm-page-card { + display: flex; + flex-direction: column +} + +.fm-page-card .fm-page-main { + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + overflow: auto +} + +.fm-page-card .fm-page-main .fm-page-card-btns { + padding: 30px 16px 0 +} + +.fm-tmpl-struct-wrapper { + flex-shrink: 0; + margin-top: 12px +} + +.fm-tmpl-section-header, +.fm-tmpl-section-header .fm-toolbar { + align-items: center; + display: flex +} + +.fm-tmpl-struct-wrapper .fm-tmpl-section { + margin-top: 12px +} + +.fm-tmpl-struct-wrapper .fm-tmpl-section:first-child { + margin-top: 0 +} + +.fm-tmpl-section { + background-color: #fff +} + +.fm-tmpl-section-header { + justify-content: space-between; + padding: 11px 16px 10px +} + +.fm-tmpl-section-header .fm-title { + position: relative; + padding-left: 16px +} + +.fm-tmpl-section-header .fm-title::before { + content: ''; + position: absolute; + left: 0; + top: 50%; + width: 3px; + height: 14px; + margin: -7px 0 0; + background: #3A90FF +} + +.fm-tmpl-listview-product .tmpl-product-title-collect .collect-text, +.fm-tmpl-section-header .fm-toolbar-item-text { + margin-left: 4px +} + +.fm-tmpl-section-header .fm-title-text { + font-size: 15px; + line-height: 21px; + color: #333 +} + +.fm-tmpl-section-header .fm-toolbar-item { + display: flex; + align-items: center; + padding-left: 16px; + font-size: 15px; + color: #3A90FF +} + +.fm-tmpl-section-header .fm-toolbar-item-icon { + font-size: 16px +} + +.fm-tmpl-section-content { + padding: 0 16px +} + +.fm-tmpl-button-wrapper { + padding: 30px 16px 0; + flex-shrink: 0 +} + +.fm-tmpl-button-wrapper .fm-tmpl-btns { + display: flex; + align-items: center +} + +.fm-tmpl-button-wrapper .fm-tmpl-btns .fm-button { + flex: 1; + margin-right: 11px +} + +.fm-tmpl-button-wrapper .fm-tmpl-btns.fm-button:last-child { + margin-right: 0 +} + +.fm-tmpl-section-btn { + display: flex; + flex-direction: row; + align-items: center; + padding: 0 16px; + border-top: 1px solid #ddd; + position: relative +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .fm-tmpl-section-btn { + border-top: none + } + + html:not([data-scale]) .fm-tmpl-section-btn::before { + content: ''; + position: absolute; + background-color: #ddd; + display: block; + z-index: 1; + top: 0; + right: auto; + bottom: auto; + left: 0; + width: 100%; + height: 1PX; + transform-origin: 50% 50%; + transform: scaleY(.5) + } +} + +.fm-tmpl-section-btn .fm-button { + flex: 1; + position: relative +} + +.fm-tmpl-section-btn .fm-button::after { + position: absolute; + right: 0; + top: 50%; + width: 1px; + height: 16px; + margin-top: -8px; + background: #ddd; + transform: scaleX(.5); + content: '' +} + +.fm-tmpl-section-btn .fm-button:last-child::after { + display: none +} + +.fm-card-tmpl-header { + height: 36px; + line-height: 36px; + background-color: #f9f9fb; + padding-left: 16px +} + +.fm-edit-input-list { + position: relative +} + +.fm-banner-warpper { + position: relative; + background: url(imgs/questionnaire-header.png) center/cover no-repeat; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + flex-shrink: 0 +} + +.fm-banner-warpper .fm-banner-title, +.fm-banner-warpper .fm-banner-title-sub { + color: #fff; + text-shadow: 0 2px 8px rgba(0, 26, 123, .52) +} + +.fm-banner-warpper .fm-banner-title { + font-size: 24px; + line-height: 33px +} + +.fm-banner-warpper .fm-banner-title-sub { + font-size: 12px; + line-height: 17px; + padding-top: 4px +} + +@media screen and (max-width:375px) { + .fm-banner-warpper { + height: 98px + } +} + +@media screen and (min-width:375px) and (max-width:414px) { + .fm-banner-warpper { + height: 116px + } +} + +@media screen and (min-width:414px) { + .fm-banner-warpper { + height: 128px + } +} + +.fm-stamp-wrapper { + width: 68px; + height: 68px; + position: absolute; + right: 16px; + top: 12px; + background: url(imgs/questionnaire-submitted.png) center/contain no-repeat; + z-index: 9 +} + +.fm-card-uploader-content { + padding: 10px 16px +} + +.fm-page-header-staff { + background: linear-gradient(90deg, #2899F6 0, #3E76F9 50%, #4384F8 100%) +} + +.fm-page-header-staff .fm-navbar { + background: 0 0 +} + +.fm-page-header-staff .fm-navbar .fm-navbar-left-arrow, +.fm-page-header-staff .fm-navbar .fm-navbar-title { + color: #fff +} + +.fm-navbar-right-text { + color: #333; + font-size: 16px +} + +.fm-input-wrapper:not(:last-child) .van-cell::after { + display: block +} + +.fm-inner-cell .van-checkbox__label::after, +.fm-inner-cell .van-radio__label::after, +.fm-input-wrapper:last-child .van-cell::after { + display: none +} + +.fm-radio-readonly .fm-inner-cell .van-radio .van-radio__icon .van-icon { + background-color: #fff +} + +.fm-radio-readonly .fm-inner-cell .van-radio .van-radio__icon--checked .van-icon { + background-color: #1989fa; + border-color: #1989fa +} + +.fm-form-item-wrapper { + position: relative; +} + +html:not([data-scale]) .fm-input-wrapper:not(:last-child) .fm-cell:not(.fm-no-hairline)::after, +html:not([data-scale]) .fm-form-item-wrapper:not(:last-child):not(.fm-no-hairline)::after, +html:not([data-scale]) .fm-form-designer-item-wrapper:not(:last-child) .fm-form-item-wrapper:not(.fm-no-hairline)::after { + content: ''; + position: absolute; + background-color: #ddd; + display: block; + z-index: 1; + top: auto; + right: auto; + bottom: 0; + left: 0; + width: 100%; + height: 1px; + transform-origin: 50% 100%; +} + +.fm-input-wrapper:not(:last-child) .fm-cell::after, +.fm-form-item-wrapper:not(:last-child)::after, +.fm-form-designer-item-wrapper:not(:last-child) .fm-form-item-wrapper::after { + left: 16px !important; +} + +.fm-input-label-tips { + display: flex; + align-items: center; + padding-left: 4px +} + +.fm-input-label-tips-content { + font-size: 14px; + color: #333; + line-height: 20px; + padding: 6px 16px +} + +.fm-tmpl-listview-timeline { + margin-left: 5px +} + +.fm-tmpl-listview-timeline .fm-tmpl-timeline-text { + position: relative; + padding-left: 22px; + padding-bottom: 2px; + line-height: 20px; + font-size: 14px; + color: #666 +} + +.fm-tmpl-listview-timeline .fm-tmpl-timeline-text::after { + position: absolute; + left: -5px; + top: 5px; + width: 10px; + height: 10px; + background-color: #ddd; + border-radius: 50%; + content: '' +} + +.fm-tmpl-listview-timeline .fm-tmpl-timeline-text::before { + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 1px; + background-color: #ddd; + content: '' +} + +.fm-tmpl-listview-timeline .fm-tmpl-timeline-date { + padding-bottom: 20px; + padding-left: 22px; + font-size: 12px; + color: #999; + border-left: 1px solid #ddd +} + +.fm-tmpl-listview-timeline.fm-tmpl-listview-timeline-first .fm-tmpl-timeline-text:before { + top: 5px +} + +.fm-tmpl-listview-timeline.fm-tmpl-listview-timeline-last .fm-tmpl-timeline-text:before { + height: 5px +} + +.fm-tmpl-listview-timeline.fm-tmpl-listview-timeline-last .fm-tmpl-timeline-date { + border-color: transparent +} + +.fm-tmpl-listview-goods { + padding-left: 16px; + display: flex; + padding-top: 10px +} + +.fm-tmpl-listview-goods .fm-tmpl-goods-img { + flex-shrink: 0; + width: 86px; + height: 86px; + margin-right: 10px; + overflow: hidden +} + +.fm-tmpl-listview-goods .fm-tmpl-goods-img img { + display: block; + width: 86px; + height: 86px +} + +.fm-tmpl-listview-goods .fm-tmpl-goods-content { + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + overflow: hidden; + padding-right: 16px; + padding-bottom: 10px; + border-bottom: 1px solid #ddd; + position: relative +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .fm-input-wrapper:not(:last-child) .fm-cell:not(.fm-no-hairline)::after { + transform: scaleY(.5) + } + + html:not([data-scale]) .fm-tmpl-listview-goods .fm-tmpl-goods-content { + border-bottom: none + } + + html:not([data-scale]) .fm-tmpl-listview-goods .fm-tmpl-goods-content::after { + content: ''; + position: absolute; + background-color: #ddd; + display: block; + z-index: 1; + top: auto; + right: auto; + bottom: 0; + left: 0; + width: 100%; + height: 1PX; + transform-origin: 50% 100%; + transform: scaleY(.5) + } +} + +.fm-tmpl-listview-goods .fm-tmpl-goods-content .fm-tmpl-goods-name { + position: relative; + min-height: 40px; + padding-right: 28px; + margin-bottom: 4px; + line-height: 20px; + font-size: 16px; + color: #666 +} + +.fm-tmpl-listview-goods .fm-tmpl-goods-content .fm-tmpl-goods-name .fm-tmpl-goods-add { + position: absolute; + right: 0; + top: 30px; + width: 24px; + height: 24px; + line-height: 24px; + text-align: center; + background-color: #ececec; + border-radius: 50% +} + +.fm-tmpl-listview-goods .fm-tmpl-goods-content .fm-tmpl-goods-name .fm-tmpl-goods-add .fm-icon { + font-size: 12px; + color: #999 +} + +.fm-tmpl-listview-goods .fm-tmpl-goods-content .fm-tmpl-goods-price { + display: flex; + align-items: flex-end; + line-height: 22px; + margin-bottom: 3px; + color: #fa6400 +} + +.fm-tmpl-listview-goods .fm-tmpl-goods-content .fm-tmpl-goods-price-prefix { + font-size: 12px +} + +.fm-tmpl-listview-goods .fm-tmpl-goods-content .fm-tmpl-goods-price-text { + font-size: 16px +} + +.fm-tmpl-listview-goods .fm-tmpl-goods-content .fm-tmpl-goods-shop { + display: flex; + align-items: center; + line-height: 16px; + font-size: 12px; + color: #888 +} + +.fm-tmpl-listview-goods .fm-tmpl-goods-content .fm-tmpl-goods-shop .fm-icon { + margin-right: 3px; + font-size: 12px +} + +.fm-tmpl-listview-order { + padding-left: 16px +} + +.fm-tmpl-listview-order-inner { + padding: 12px 16px 12px 0; + border-bottom: 1px solid #ddd; + position: relative +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .fm-tmpl-listview-order-inner { + border-bottom: none + } + + html:not([data-scale]) .fm-tmpl-listview-order-inner::after { + content: ''; + position: absolute; + background-color: #ddd; + display: block; + z-index: 1; + top: auto; + right: auto; + bottom: 0; + left: 0; + width: 100%; + height: 1PX; + transform-origin: 50% 100%; + transform: scaleY(.5) + } +} + +.fm-tmpl-listview-order .fm-tmpl-listview-order-name { + margin-bottom: 3px; + line-height: 21px; + font-size: 15px; + color: #333 +} + +.fm-tmpl-listview-order .order-line-item { + display: flex; + flex-direction: row; + align-items: center +} + +.fm-tmpl-listview-order .order-line-item-left { + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + overflow: hidden +} + +.fm-tmpl-listview-order .order-line-item-right { + flex-shrink: 0 +} + +.fm-tmpl-listview-order .fm-tmpl-listview-order-number { + line-height: 20px; + margin-bottom: 10px +} + +.fm-tmpl-listview-order .fm-tmpl-listview-order-number .order-number-text { + font-size: 14px; + color: #888 +} + +.fm-tmpl-listview-order .fm-tmpl-listview-order-msg { + line-height: 18px; + font-size: 13px +} + +.fm-tmpl-listview-order .fm-tmpl-listview-order-msg .order-msg-date { + color: #888 +} + +.fm-tmpl-listview-order .fm-tmpl-listview-order-msg .order-msg-price { + color: #ff7300 +} + +.fm-tmpl-listview-shop { + padding: 0 8px 10px; + background: #f9fafb +} + +.fm-tmpl-listview-shop-inner { + background: #fff +} + +.fm-tmpl-listview-shop-header { + padding: 10px 10px 18px; + display: flex; + flex-direction: row +} + +.fm-tmpl-listview-shop-header .shop-header-img { + flex-shrink: 0; + width: 46px; + height: 46px; + margin-right: 10px +} + +.fm-tmpl-listview-shop-header .shop-header-img img { + display: block; + width: 100%; + height: 100% +} + +.fm-tmpl-listview-shop-header .shop-header-msg { + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + overflow: hidden +} + +.fm-tmpl-listview-shop-header .shop-header-msg .shop-header-name { + display: flex; + justify-content: space-between; + margin-bottom: 6px +} + +.fm-tmpl-listview-shop-header .shop-header-msg .shop-header-name-text { + padding-right: 6px; + line-height: 22px; + font-size: 16px; + color: #333 +} + +.fm-tmpl-listview-shop .shop-content-item, +.fm-tmpl-listview-shop-header .shop-header-msg .shop-header-site { + line-height: 18px; + font-size: 13px; + color: #999 +} + +.fm-tmpl-listview-shop-header .shop-header-msg .shop-header-name-status { + flex-shrink: 0 +} + +.fm-tmpl-listview-shop .shop-content-item { + margin-bottom: 8px; + padding: 0 10px +} + +.fm-tmpl-listview-shop-footer { + border-top: 1px solid #ddd; + position: relative +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .fm-tmpl-listview-shop-footer { + border-top: none + } + + html:not([data-scale]) .fm-tmpl-listview-shop-footer::before { + content: ''; + position: absolute; + background-color: #ddd; + display: block; + z-index: 1; + top: 0; + right: auto; + bottom: auto; + left: 0; + width: 100%; + height: 1PX; + transform-origin: 50% 50%; + transform: scaleY(.5) + } + + .fm-tmpl-listview-shop-footer .shop-footer-btns .shop-footer-btn-item::after { + transform: scaleX(.5) + } +} + +.fm-tmpl-listview-shop-footer .shop-footer-btns { + display: flex; + flex-direction: row; + align-items: center +} + +.fm-tmpl-listview-shop-footer .shop-footer-btns .shop-footer-btn-item { + position: relative; + flex: 1; + height: 44px; + padding: 0 6px; + line-height: 44px; + font-size: 12px; + color: #999; + text-align: center; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.fm-tmpl-listview-shop-footer .shop-footer-btns .shop-footer-btn-item .fm-icon { + font-size: 14px; + margin-right: 4px +} + +.fm-tmpl-listview-shop-footer .shop-footer-btns .shop-footer-btn-item::after { + position: absolute; + right: 0; + top: 50%; + width: 1px; + height: 22px; + margin-top: -11px; + background-color: #ddd; + content: '' +} + +.fm-tmpl-listview-shop-footer .shop-footer-btns .shop-footer-btn-item:last-child::after { + display: none +} + +.fm-tmpl-listview-shop-first { + padding-top: 10px +} + +.fm-tmpl-listview-menu { + padding-bottom: 10px; + background: #f9fafb +} + +.fm-tmpl-listview-menu-inner { + padding: 10px 16px 0; + background-color: #fff +} + +.fm-tmpl-listview-menu-text { + margin-bottom: 10px; + line-height: 20px; + font-size: 14px; + color: #666 +} + +.fm-tmpl-listview-menu-content .menu-list { + display: flex; + align-items: center; + flex-wrap: wrap +} + +.fm-tmpl-listview-menu-content .menu-list-item { + flex: 0 0 25%; + display: flex; + flex-direction: column; + align-items: center; + margin-bottom: 10px +} + +.fm-tmpl-listview-menu-content .menu-list-item-icon { + width: 46px; + height: 46px; + margin-bottom: 6px; + line-height: 46px; + text-align: center; + color: #fff; + border-radius: 16px; + background-color: #40a9ff +} + +.fm-tmpl-listview-menu-content .menu-list-item-icon .fm-icon { + font-size: 26px +} + +.fm-tmpl-listview-menu-content .menu-list-item-text { + line-height: 20px; + font-size: 14px; + color: #666 +} + +.fm-tmpl-listview-menu-last { + padding-bottom: 0 +} + +.fm-tmpl-listview-menus.fm-listview-content { + display: flex; + align-items: center; + flex-wrap: wrap +} + +.fm-tmpl-listview-menus .fm-listview-item { + flex: 0 0 33.3333% +} + +.fm-tmpl-listview-menus-item { + display: flex; + flex-direction: column; + align-items: center; + margin-bottom: 16px +} + +.fm-tmpl-listview-menus-item .menu-list-item-icon { + width: 46px; + height: 46px; + margin-bottom: 6px; + line-height: 46px; + text-align: center; + color: #fff; + border-radius: 16px; + background-color: #40a9ff +} + +.fm-tmpl-listview-menus-item .menu-list-item-icon .fm-icon { + font-size: 26px +} + +.fm-tmpl-listview-menus-item .menu-list-item-text { + line-height: 20px; + font-size: 14px; + color: #666 +} + +.fm-tmpl-listview-basic { + display: flex; + align-items: flex-start; + padding: 0 16px; + margin-bottom: 8px; + font-size: 14px; + line-height: 20px +} + +.fm-tmpl-listview-basic .basic-lable { + flex-shrink: 0; + width: 82px; + margin-right: 14px; + color: #999; + text-align: right +} + +.fm-tmpl-listview-basic .basic-text { + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + overflow: hidden; + color: #333 +} + +.fm-tmpl-listview-basic-last { + margin-bottom: 0 +} + +.fm-tmpl-listview-list { + padding-left: 16px +} + +.fm-tmpl-listview-list .fm-tmpl-listview-list-inner { + display: flex; + justify-content: space-between; + height: 44px; + padding-right: 16px; + font-size: 15px; + color: #333; + line-height: 44px; + border-bottom: 1px solid #ddd; + position: relative +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .fm-tmpl-listview-list .fm-tmpl-listview-list-inner { + border-bottom: none + } + + html:not([data-scale]) .fm-tmpl-listview-list .fm-tmpl-listview-list-inner::after { + content: ''; + position: absolute; + background-color: #ddd; + display: block; + z-index: 1; + top: auto; + right: auto; + bottom: 0; + left: 0; + width: 100%; + height: 1PX; + transform-origin: 50% 100%; + transform: scaleY(.5) + } +} + +.fm-tmpl-listview-list .fm-tmpl-listview-list-inner .list-text { + color: #FBB902 +} + +.fm-tmpl-listview-list-last .fm-tmpl-listview-list-inner { + border-bottom: 0 +} + +.fm-tmpl-listview-list-last .fm-tmpl-listview-list-inner::after { + display: none !important +} + +.fm-tmpl-listview-sign { + padding: 0 16px; + background: #fff +} + +.fm-tmpl-listview-sign .fm-tmpl-listview-sign-inner { + margin-left: 12px +} + +.fm-tmpl-listview-sign .fm-tmpl-sign-text { + position: relative; + padding-left: 18px +} + +.fm-tmpl-listview-sign .fm-tmpl-sign-text .fm-tmpl-sign-circle { + position: absolute; + left: -8px; + top: 2px; + width: 18px; + height: 18px; + border-radius: 50%; + background-color: rgba(54, 165, 246, .2) +} + +.fm-tmpl-listview-sign .fm-tmpl-sign-text .text { + line-height: 22px; + font-size: 16px; + color: #333; + font-weight: 600 +} + +.fm-tmpl-listview-sign .fm-tmpl-sign-text::after { + position: absolute; + left: -5px; + top: 5px; + width: 6px; + height: 6px; + border: 3px solid #fff; + background-color: #36a5f6; + border-radius: 50%; + content: ''; + box-sizing: content-box +} + +.fm-tmpl-listview-sign .fm-tmpl-sign-text::before { + position: absolute; + left: -.5px; + top: 0; + bottom: 0; + width: 1px; + border: 1px dashed #ddd; + background-color: transparent; + content: ''; + transform: scaleX(.5) +} + +.fm-tmpl-listview-sign .fm-tmpl-sign-content { + padding: 10px 0 10px 18px; + border-left: 1px dashed #ddd +} + +.fm-tmpl-listview-sign .fm-tmpl-sign-content-inner { + padding: 10px 12px; + background: #f4f7f9 +} + +.fm-tmpl-listview-sign .fm-tmpl-sign-content-name { + display: flex; + align-items: center; + padding-bottom: 6px; + line-height: 20px +} + +.fm-tmpl-listview-sign .fm-tmpl-sign-content-name .fm-icon { + margin-right: 6px; + font-size: 16px; + color: #36a5f6 +} + +.fm-tmpl-listview-sign .fm-tmpl-sign-content-name .name-text { + font-size: 15px; + color: #333 +} + +.fm-tmpl-listview-sign .fm-tmpl-sign-content-label { + padding-bottom: 10px; + font-size: 14px; + color: #999 +} + +.fm-tmpl-listview-sign .fm-tmpl-sign-content-imgs { + display: flex; + align-items: center; + flex-wrap: wrap +} + +.fm-tmpl-listview-sign .fm-tmpl-sign-content-imgs .fm-tmpl-sign-content-img { + width: 60px; + height: 60px; + margin-right: 10px; + margin-bottom: 10px; + overflow: hidden +} + +.fm-tmpl-listview-sign .fm-tmpl-sign-content-imgs .fm-tmpl-sign-content-img img { + display: block; + width: 100%; + height: 100%; + -o-object-fit: scale-down; + object-fit: scale-down +} + +.fm-tmpl-listview-sign.fm-tmpl-listview-sign-last { + padding-bottom: 12px +} + +.fm-tmpl-listview-sign.fm-tmpl-listview-sign-last .fm-tmpl-sign-content { + border-left: none +} + +.fm-tmpl-listview-sign.fm-tmpl-listview-sign-last .fm-tmpl-sign-text::before { + height: 6px +} + +.fm-tmpl-listview-sign.fm-tmpl-listview-sign-first { + padding-top: 12px +} + +.fm-tmpl-listview-sign.fm-tmpl-listview-sign-first .fm-tmpl-sign-text::before { + top: 6px +} + +.fm-tmpl-listview-bill { + padding-left: 12px +} + +.fm-tmpl-listview-bill-content { + display: flex +} + +.fm-tmpl-listview-bill-content .bill-img-round-wrapper { + padding-top: 12px; + margin-right: 10px +} + +.fm-tmpl-listview-bill-content .bill-img-round-wrapper .bill-img-round-img { + width: 30px; + height: 30px; + border-radius: 50%; + text-align: center; + color: #fff; + background: #3a90ff +} + +.fm-tmpl-listview-bill-content .bill-img-round-wrapper .bill-img-round-img .fm-icon { + font-size: 18px; + line-height: 30px +} + +.fm-tmpl-listview-bill-content .bill-detail-content { + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + padding: 12px 16px 8px 0; + border-bottom: 1px solid #ddd; + position: relative +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .fm-tmpl-listview-bill-content .bill-detail-content { + border-bottom: none + } + + html:not([data-scale]) .fm-tmpl-listview-bill-content .bill-detail-content::after { + content: ''; + position: absolute; + background-color: #ddd; + display: block; + z-index: 1; + top: auto; + right: auto; + bottom: 0; + left: 0; + width: 100%; + height: 1PX; + transform-origin: 50% 100%; + transform: scaleY(.5) + } +} + +.fm-tmpl-listview-bill-content .bill-detail-content .bill-detail-header { + display: flex; + align-items: center; + justify-content: space-between; + margin: 0 0 6px +} + +.fm-tmpl-listview-bill-content .bill-detail-content .bill-detail-header .title { + line-height: 22px; + font-weight: 400; + font-size: 16px; + color: #333 +} + +.fm-tmpl-listview-bill-content .bill-detail-content .bill-detail-header .time { + line-height: 18px; + color: #999; + font-size: 13px +} + +.fm-tmpl-listview-bill-content .bill-detail-content .bill-detail-info { + display: flex; + margin-bottom: 4px +} + +.fm-tmpl-listview-bill-content .bill-detail-content .bill-detail-info-text { + display: flex; + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + align-items: flex-start; + line-height: 18px; + font-size: 13px; + color: #999 +} + +.fm-tmpl-listview-bill-content .bill-detail-content .bill-detail-info-text .title { + flex-shrink: 0 +} + +.fm-tmpl-listview-bill-content .bill-detail-content .bill-detail-info-text .text-orange { + color: #FF9800 +} + +.fm-tmpl-listview-bill-content .bill-detail-content .bill-detail-info-status { + padding-left: 6px; + margin-top: -2px +} + +.fm-tmpl-listview-client { + padding: 0 8px 10px; + background: #f9fafb +} + +.fm-tmpl-listview-client-inner { + background: #fff +} + +.fm-tmpl-listview-client-header { + padding: 10px 10px 18px; + display: flex; + flex-direction: row +} + +.fm-tmpl-listview-client-header .client-header-icon { + flex-shrink: 0; + width: 46px; + height: 46px; + line-height: 46px; + margin-right: 10px; + text-align: center; + background-color: #3a90ff; + border-radius: 6px +} + +.fm-tmpl-listview-client-header .client-header-icon .fm-icon { + font-size: 24px; + color: #fff +} + +.fm-tmpl-listview-client-header .client-header-msg { + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + overflow: hidden +} + +.fm-tmpl-listview-client-header .client-header-msg .client-header-name { + display: flex; + justify-content: space-between; + margin-bottom: 6px +} + +.fm-tmpl-listview-client-header .client-header-msg .client-header-name-status, +.fm-tmpl-listview-liaison .liaison-header-tag { + flex-shrink: 0 +} + +.fm-tmpl-listview-client-header .client-header-msg .client-header-name-text { + padding-right: 6px; + line-height: 22px; + font-size: 16px; + color: #333 +} + +.fm-tmpl-listview-client-header .client-header-msg .client-header-name-time { + font-size: 13px; + color: #999 +} + +.fm-tmpl-listview-client-header .client-header-msg .client-header-site { + line-height: 18px; + font-size: 13px; + color: #999 +} + +.fm-tmpl-listview-client-content .client-content-info { + display: flex; + align-items: center +} + +.fm-tmpl-listview-client-content .text-orange { + font-size: 14px; + color: #FF9800 +} + +.fm-tmpl-listview-client .client-content-item { + display: flex; + align-items: center; + flex: 1; + margin-bottom: 8px; + padding: 0 10px; + line-height: 18px; + font-size: 13px; + color: #999 +} + +.fm-tmpl-listview-client .client-content-item .fm-icon { + font-size: 14px; + margin-right: 2px +} + +.fm-tmpl-listview-client-first { + padding-top: 10px +} + +.fm-tmpl-listview-client.fm-tmpl-listview-client-simple .fm-tmpl-listview-client-header { + padding-bottom: 10px +} + +.fm-tmpl-listview-client.fm-tmpl-listview-client-simple .fm-tmpl-listview-client-header .client-header-msg .client-header-name { + margin-bottom: 0 +} + +.fm-tmpl-listview-client .text-success { + color: #5CC171 +} + +.fm-tmpl-listview-client .text-warning { + color: #FF9800 +} + +.fm-tmpl-listview-client .text-danger { + color: #F24645 +} + +.fm-tmpl-listview-client .text-submit { + color: #5AC1C3 +} + +.fm-tmpl-listview-client .text-info { + color: #4D9AFF +} + +.fm-tmpl-extend-card { + padding: 12px 16px +} + +.fm-tmpl-extend-card-inner { + position: relative; + background-image: linear-gradient(152deg, #53bdfd 0, #287cf3 97%); + box-shadow: 0 2px 4px 0 rgba(57, 66, 100, .04); + border-radius: 10px; + overflow: hidden +} + +.fm-tmpl-extend-card-inner .fm-tmpl-extend-card-list { + display: flex; + justify-content: space-between; + align-items: center; + padding: 20px +} + +.fm-tmpl-extend-card-inner .fm-tmpl-extend-card-list .fm-tmpl-extend-card-item { + display: flex; + flex-direction: column; + align-items: center; + flex: 1; + color: #fff +} + +.fm-tmpl-extend-card-inner .fm-tmpl-extend-card-list .fm-tmpl-extend-card-item .extend-card-item-text { + display: flex; + align-items: baseline +} + +.fm-tmpl-extend-card-inner .fm-tmpl-extend-card-list .fm-tmpl-extend-card-item .extend-card-item-text .item-text { + display: block; + font-size: 24px; + line-height: 32px +} + +.fm-tmpl-extend-card-inner .fm-tmpl-extend-card-list .fm-tmpl-extend-card-item .extend-card-item-text .item-text-tip { + font-size: 12px +} + +.fm-tmpl-extend-card-inner .fm-tmpl-extend-card-list .fm-tmpl-extend-card-item .extend-card-item-text .card-item-title { + font-size: 14px +} + +.fm-tmpl-extend-card-inner::before { + right: -7%; + top: 20%; + width: 80%; + height: 340%; + border-radius: 50%; + opacity: .23; + background-image: linear-gradient(180deg, #63ccfa 0, #36a5f6 100%); + z-index: 1 +} + +.fm-tmpl-extend-card-inner::after { + right: -37%; + bottom: -10%; + width: 60%; + height: 240%; + border-radius: 50%; + opacity: .15; + background-image: linear-gradient(134deg, #3addd5 0, #24c2d8 100%); + z-index: 0 +} + +.fm-tmpl-listview-liaison { + padding-left: 16px; + margin-top: 10px; + background-color: #fff +} + +.fm-tmpl-listview-liaison .liaison-header { + display: flex; + flex-direction: row; + justify-content: space-between; + padding: 12px 16px 12px 0; + border-bottom: 1px solid #ddd; + position: relative +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .fm-tmpl-listview-liaison .liaison-header { + border-bottom: none + } + + html:not([data-scale]) .fm-tmpl-listview-liaison .liaison-header::after { + content: ''; + position: absolute; + background-color: #ddd; + display: block; + z-index: 1; + top: auto; + right: auto; + bottom: 0; + left: 0; + width: 100%; + height: 1PX; + transform-origin: 50% 100%; + transform: scaleY(.5) + } +} + +.fm-tmpl-listview-liaison .liaison-header-title { + flex: 1 1 0; + padding-right: 16px; + font-size: 16px; + color: #333; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis +} + +.fm-tmpl-listview-liaison .liaison-content { + padding: 10px 0 +} + +.fm-tmpl-listview-liaison .liaison-content-info { + display: flex; + flex-direction: row; + align-items: center; + line-height: 18px; + color: #999; + font-size: 13px; + margin: 0 0 6px +} + +.fm-tmpl-listview-booklist .booklist-btns .fm-button, +.fm-tmpl-listview-liaison .liaison-actions .fm-button { + margin-left: 13px +} + +.fm-tmpl-listview-liaison .liaison-content-info-title { + flex-shrink: 0; + width: 100px; + padding-right: 10px +} + +.fm-tmpl-listview-liaison .liaison-content-info-text { + flex: 1 1 0; + color: #333 +} + +.fm-tmpl-listview-liaison .liaison-actions { + padding: 0 16px 10px; + text-align: right +} + +.fm-tmpl-listview-liaison .liaison-actions .fm-button:first-child { + margin-left: 0 +} + +.fm-tmpl-listview-approve { + padding: 10px 0 10px 16px; + background-color: #fff +} + +.fm-tmpl-listview-approve .fm-approve-flow-item { + padding-left: 7px +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-header { + border-left: 1px dashed #ddd; + position: relative +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .fm-tmpl-listview-approve .fm-approve-flow-item-header { + border-left: none + } + + html:not([data-scale]) .fm-tmpl-listview-approve .fm-approve-flow-item-header::before { + content: ''; + position: absolute; + background-color: #ddd; + display: block; + z-index: 1; + top: 0; + right: auto; + bottom: auto; + left: 0; + width: 1PX; + height: 100%; + transform-origin: 100% 50%; + transform: scaleX(.5) + } +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-header-inner { + position: relative; + display: flex; + flex-direction: row; + align-items: center; + padding-left: 20px +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-header-inner .fm-approve-flow-item-header-icon { + position: absolute; + left: -7px; + top: 0; + z-index: 100; + display: flex; + align-items: center; + justify-content: center; + width: 15px; + height: 15px; + background-color: rgba(58, 144, 255, .4); + border-radius: 50% +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-header-inner .fm-approve-flow-item-header-icon-inner { + width: 7px; + height: 7px; + background-color: #3a90ff; + border-radius: 50% +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-header-inner .fm-approve-flow-item-header-content { + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + line-height: 21px; + font-size: 15px; + color: #4c4c4c; + font-weight: 700 +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-header-inner .fm-approve-flow-item-header-right { + flex-shrink: 0; + padding-left: 6px +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-header-inner .fm-approve-flow-item-header-right .fm-icon { + color: #979797 +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-content { + padding: 12px 0 30px 20px; + border-left: 1px dashed #d4d4d4; + position: relative +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .fm-tmpl-listview-approve .fm-approve-flow-item-content { + border-left: none + } + + html:not([data-scale]) .fm-tmpl-listview-approve .fm-approve-flow-item-content::before { + content: ''; + position: absolute; + background-color: #d4d4d4; + display: block; + z-index: 1; + top: 0; + right: auto; + bottom: auto; + left: 0; + width: 1PX; + height: 100%; + transform-origin: 100% 50%; + transform: scaleX(.5) + } +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-content .fm-approve-flow-item-list { + display: flex; + flex-direction: row; + align-items: flex-start; + margin-bottom: 14px +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-content .fm-approve-flow-item-list:last-child { + margin-bottom: 0 +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-content .fm-approve-flow-item-list-avatar { + position: relative; + display: flex; + flex-direction: row; + align-items: center; + width: 36px; + height: 36px +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-content .fm-approve-flow-item-list-avatar-img { + display: block; + width: 36px; + height: 36px; + border-radius: 50% +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-content .fm-approve-flow-item-list-content { + flex: 1 1 0; + margin-left: 10px +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-content .fm-approve-flow-item-list-content .item-list-content-main { + display: flex; + align-items: center; + justify-content: space-between; + height: 36px +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-last .fm-approve-flow-item-content::before, +.fm-tmpl-listview-approve .fm-approve-flow-item-last .fm-approve-flow-item-header::before { + display: none !important +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-content .fm-approve-flow-item-list-content .item-list-content-left, +.fm-tmpl-listview-approve .fm-approve-flow-item-content .fm-approve-flow-item-list-content .item-list-content-left .item-list-content-name { + font-size: 14px; + color: #666 +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-content .fm-approve-flow-item-list-content .item-list-content-left .item-list-content-status { + margin-left: 8px; + color: #3a90ff +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-content .fm-approve-flow-item-list-content .item-list-content-left .item-list-content-status-success { + color: #5cc171 +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-content .fm-approve-flow-item-list-content .item-list-content-left .item-list-content-status-apply { + color: #3a90ff +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-content .fm-approve-flow-item-list-content .item-list-content-left .item-list-content-status-running { + color: #ff9800 +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-content .fm-approve-flow-item-list-content .item-list-content-date { + flex-shrink: 0; + font-size: 13px; + color: #999 +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-content .fm-approve-flow-item-list-content .item-list-content-message { + line-height: 20px; + font-size: 14px; + color: #333 +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-content .fm-approve-flow-item-date { + font-size: 13px; + color: rgba(51, 51, 51, .65) +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-running .fm-approve-flow-item .fm-approve-flow-item-header-inner .fm-approve-flow-item-header-icon { + background-color: rgba(255, 152, 0, .4) +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-running .fm-approve-flow-item .fm-approve-flow-item-header-inner .fm-approve-flow-item-header-icon .fm-approve-flow-item-header-icon-inner { + background-color: #ff9800 +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-last .fm-approve-flow-item-header { + border-left: 0 +} + +.fm-tmpl-listview-approve .fm-approve-flow-item-last .fm-approve-flow-item-content { + padding-bottom: 12px; + border-left: 0 +} + +.fm-tmpl-listview-product-header { + padding: 12px 14px; + line-height: 20px; + font-size: 14px; + color: #3a90ff +} + +.fm-tmpl-listview-product-item .fm-listview-item .fm-listview-item-content { + transform: none +} + +.fm-tmpl-listview-product { + padding: 12px 16px 0 +} + +.fm-tmpl-listview-product .fm-tmpl-listview-product-inner { + padding-bottom: 12px; + border-bottom: 1px solid #ddd; + position: relative +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .fm-tmpl-listview-product .fm-tmpl-listview-product-inner { + border-bottom: none + } + + html:not([data-scale]) .fm-tmpl-listview-product .fm-tmpl-listview-product-inner::after { + content: ''; + position: absolute; + background-color: #ddd; + display: block; + z-index: 1; + top: auto; + right: auto; + bottom: 0; + left: 0; + width: 100%; + height: 1PX; + transform-origin: 50% 100%; + transform: scaleY(.5) + } +} + +.fm-tmpl-listview-product .tmpl-product-title { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 12px +} + +.fm-tmpl-listview-product .tmpl-product-title .tmpl-product-title-collect { + flex-shrink: 0 +} + +.fm-tmpl-listview-product .tmpl-product-title-text { + font-size: 17px; + color: #333 +} + +.fm-tmpl-listview-product .tmpl-product-title-collect { + flex-shrink: 0; + font-size: 14px; + color: #666 +} + +.fm-tmpl-listview-product .tmpl-product-title-collect.tmpl-product-title-collected .fm-icon { + color: #ff9800 +} + +.fm-tmpl-listview-product .tmpl-product-content { + position: relative; + padding-right: 40px +} + +.fm-tmpl-listview-product .tmpl-product-content-item { + display: flex; + align-items: center; + margin-bottom: 10px; + font-size: 14px; + color: #666 +} + +.fm-tmpl-listview-product .tmpl-product-content .tmpl-product-add-btn { + position: absolute; + right: 0; + bottom: 0 +} + +.fm-tmpl-listview-product .tmpl-product-content .tmpl-product-add-btn .fm-button-add { + width: 30px; + height: 30px +} + +.fm-tmpl-listview-product .tmpl-product-content .tmpl-product-add-btn .fm-button-add .fm-icon { + font-size: 14px +} + +.fm-tmpl-listview-product .tmpl-product-footer { + display: flex; + align-items: center; + justify-content: space-between; + margin-top: 6px +} + +.fm-tmpl-listview-product .tmpl-product-footer .tmpl-product-price { + margin-right: 10px; + font-size: 17px; + color: red; + font-weight: 600 +} + +.fm-tmpl-listview-product .tmpl-product-footer .fm-popover .fm-popover-inner { + border-radius: 10px; + box-shadow: none +} + +.fm-tmpl-listview-product .tmpl-product-footer .fm-popover .fm-popover-arrow, +.fm-tmpl-listview-product .tmpl-product-footer .fm-popover .fm-popover-inner { + border: 1px solid #ddd +} + +.fm-tmpl-listview-product .tmpl-product-footer .fm-popover .fm-popover-inner-wrapper { + padding: 0 +} + +.fm-tmpl-listview-product .tmpl-product-footer .fm-popover .fm-popover-inner-wrapper .fm-popover-item { + min-width: 50px; + height: 46px; + line-height: 46px; + text-align: center; + font-size: 16px; + color: #666 +} + +.fm-tmpl-listview-product .tmpl-product-footer .fm-overlay { + background: 0 0 +} + +.fm-tmpl-listview-product .tmpl-product-footer .tmpl-product-unit { + padding: 3px 6px; + border-radius: 6px; + background-color: rgba(58, 144, 255, .2); + font-size: 14px; + color: #333 +} + +.fm-tmpl-listview-product .tmpl-product-footer .tmpl-product-unit-text { + margin-right: 4px +} + +.fm-tmpl-listview-product .tmpl-product-footer .tmpl-product-unit .fm-icon { + font-size: 12px; + color: #666 +} + +.fm-tmpl-listview-product .tmpl-product-footer .tmpl-product-footer-right { + flex-shrink: 0; + font-size: 12px; + color: #666 +} + +.fm-tmpl-listview-product.fm-tmpl-listview-product-first { + padding-top: 0 +} + +.fm-card-tmpl-booklist-header { + padding: 11px 16px; + line-height: 22px; + font-size: 16px; + color: #333; + font-weight: 600 +} + +.fm-tmpl-listview-booklist { + padding: 0 16px; + color: #333; + border-bottom: 1px solid #ddd; + position: relative +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .fm-tmpl-listview-booklist { + border-bottom: none + } + + html:not([data-scale]) .fm-tmpl-listview-booklist::after { + content: ''; + position: absolute; + background-color: #ddd; + display: block; + z-index: 1; + top: auto; + right: auto; + bottom: 0; + left: 0; + width: 100%; + height: 1PX; + transform-origin: 50% 100%; + transform: scaleY(.5) + } +} + +.fm-tmpl-listview-booklist-last { + border-bottom: 0 +} + +.fm-tmpl-listview-booklist-last::after { + display: none !important +} + +.fm-tmpl-listview-booklist .booklist-header { + display: flex; + flex-direction: row; + align-items: flex-start; + justify-content: space-between; + padding: 12px 0 6px; + line-height: 22px; + font-size: 16px +} + +.fm-tmpl-listview-booklist .booklist-header-price { + flex-shrink: 0; + color: #fa6400 +} + +.fm-tmpl-listview-booklist .booklist-main { + padding-bottom: 8px +} + +.fm-tmpl-listview-booklist .booklist-main-item { + line-height: 18px; + padding-bottom: 4px; + font-size: 13px; + color: #999 +} + +.fm-tmpl-listview-booklist .booklist-btns { + padding: 8px 0 6px; + text-align: right +} + +.fm-tmpl-dialog-plan, +.fm-tmpl-dialog-type { + border-radius: 5px !important +} + +.fm-tmpl-dialog-plan .fm-dialog-footer, +.fm-tmpl-dialog-type .fm-dialog-footer { + border-top: 1px solid #ddd; + position: relative +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + + html:not([data-scale]) .fm-tmpl-dialog-plan .fm-dialog-footer, + html:not([data-scale]) .fm-tmpl-dialog-type .fm-dialog-footer { + border-top: none + } + + html:not([data-scale]) .fm-tmpl-dialog-plan .fm-dialog-footer::before, + html:not([data-scale]) .fm-tmpl-dialog-type .fm-dialog-footer::before { + content: ''; + position: absolute; + background-color: #ddd; + display: block; + z-index: 1; + top: 0; + right: auto; + bottom: auto; + left: 0; + width: 100%; + height: 1PX; + transform-origin: 50% 50%; + transform: scaleY(.5) + } +} + +.fm-tmpl-dialog-plan .fm-dialog-footer .fm-button, +.fm-tmpl-dialog-type .fm-dialog-footer .fm-button { + font-size: 14px; + color: #666 +} + +.fm-tmpl-dialog-type-content { + padding: 20px +} + +.fm-tmpl-dialog-type-content .fm-dialog-type-list { + display: flex; + align-items: center; + justify-content: center +} + +.fm-tmpl-dialog-type-content .fm-dialog-type-list-item { + flex: 1 +} + +.fm-tmpl-dialog-type-content .fm-dialog-type-list-item .type-list-item-icon { + width: 60px; + height: 60px; + margin: 0 auto; + line-height: 60px; + text-align: center; + border: 1px solid #3D91FF; + border-radius: 50% +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .fm-tmpl-dialog-type-content .fm-dialog-type-list-item .type-list-item-icon { + position: relative; + border: none + } + + html:not([data-scale]) .fm-tmpl-dialog-type-content .fm-dialog-type-list-item .type-list-item-icon::before { + content: ''; + position: absolute; + left: 0; + top: 0; + width: 200%; + height: 200%; + border: 1px solid #3D91FF; + border-radius: 100%; + transform-origin: 0 0; + transform: scale(.5); + box-sizing: border-box; + pointer-events: none + } +} + +.fm-tmpl-dialog-type-content .fm-dialog-type-list-item .type-list-item-icon .fm-icon { + font-size: 26px; + color: #3D91FF +} + +.fm-tmpl-dialog-type-content .fm-dialog-type-list-item .type-list-item-text { + margin-top: 12px; + font-size: 16px; + text-align: center; + color: #666 +} + +.fm-tmpl-dialog-type-content .fm-dialog-type-list-item:active .type-list-item-icon { + background-color: #3D91FF +} + +.fm-tmpl-dialog-type-content .fm-dialog-type-list-item:active .type-list-item-icon .fm-icon { + color: #fff +} + +.fm-tmpl-dialog-plan-content { + padding: 20px 30px +} + +.fm-tmpl-dialog-plan-content .fm-dialog-plan-item { + display: flex; + justify-content: center; + height: 40px; + line-height: 40px; + margin-bottom: 16px; + align-items: center; + color: #666; + border: 1px solid #ddd; + border-radius: 4px +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .fm-tmpl-dialog-plan-content .fm-dialog-plan-item { + position: relative; + border: none + } + + html:not([data-scale]) .fm-tmpl-dialog-plan-content .fm-dialog-plan-item::before { + content: ''; + position: absolute; + left: 0; + top: 0; + width: 200%; + height: 200%; + border: 1px solid #ddd; + border-radius: 8px; + transform-origin: 0 0; + transform: scale(.5); + box-sizing: border-box; + pointer-events: none + } +} + +.fm-tmpl-dialog-plan-content .fm-dialog-plan-item .plan-item-icon { + margin-right: 14px +} + +.fm-tmpl-dialog-plan-content .fm-dialog-plan-item .fm-icon { + color: #666 +} + +.fm-tmpl-dialog-plan-content .fm-dialog-plan-item:active, +.fm-tmpl-dialog-plan-content .fm-dialog-plan-item:active .fm-icon { + color: #3D91FF +} + +.fm-tmpl-dialog-plan-content .fm-dialog-plan-item:active::before { + border-color: #3D91FF !important +} + +.fm-title { + position: relative; + padding-left: 16px +} + +.fm-title::before { + content: ''; + position: absolute; + left: 0; + top: 50%; + width: 5px; + height: 16px; + margin: -8px 0 0; + background: #3A90FF +} + +.fm-title-text { + font-size: 16px; + line-height: 21px; + color: #333 +} + +.fm-tmpl-search-action { + position: relative +} + +.fm-tmpl-search-action .fm-icon { + font-size: 20px; + color: #666 +} + +.fm-tmpl-search-action-badge { + position: absolute; + top: 0; + right: 0; + min-width: 16px; + padding: 0 3px; + margin-top: 4px; + color: #fff; + font-weight: 500; + font-size: 12px; + line-height: 14px; + text-align: center; + background-color: #ee0a24; + border: 1px solid #fff; + border-radius: 16px; + transform: translate(50%, -50%); + transform-origin: 100% +} + +.fm-list-view-swipe-toolbar { + display: flex; + align-items: center; + justify-content: center; + padding: 0 12px; + height: 100%; + background-color: #f24645; + font-size: 16px; + color: #fff +} + +.fm-static-text-common { + padding: 12px 16px; + background-color: #fff; + margin-bottom: 10px; + font-size: 13px; + line-height: 1.42; + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + text-align: left; + white-space: pre-wrap; + word-wrap: break-word +} + +.fm-static-text-common p { + margin-top: 0; + margin-bottom: 0; +} + +.fm-static-text-common p:not(:last-child) { + padding-bottom: 18px +} + +.fm-tmpl-listview-common { + font-size: 16px; + color: #333; + padding: 12px 16px 12px 0; + margin-left: 16px; + border-bottom: 1px solid #ddd; + position: relative +} + +.fm-tmpl-listview-common .fm-tmpl-row { + display: flex; + justify-content: space-between +} + +.fm-tmpl-listview-common .fm-tmpl-row:not(:last-child) { + padding-bottom: 8px +} + +.fm-tmpl-listview-common .fm-tmpl-col { + display: flex; + align-items: flex-start +} + +.fm-tmpl-listview-common .fm-tmpl-title { + line-height: 22px +} + +.fm-tmpl-listview-common .fm-tmpl-price { + font-size: 18px; + line-height: 22px; + color: #fa6400 +} + +.fm-tmpl-listview-common .fm-tmpl-label { + font-size: 14px; + line-height: 20px; + display: flex; + overflow: hidden +} + +.fm-tmpl-listview-common .fm-tmpl-label .fm-tmpl-label-title { + color: #999; + width: 92px +} + +.fm-tmpl-listview-common .fm-tmpl-label .fm-tmpl-label-text { + flex: 1; + overflow: hidden; + text-overflow: ellipsis +} + +.fm-tmpl-listview-common .fm-tmpl-col-1 { + flex: 1; + white-space: nowrap; + overflow: hidden +} + +.fm-tmpl-listview-common .fm-tmpl-col-1:not(:last-child) { + padding-right: 10px +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .fm-tmpl-listview-common { + border-bottom: none + } + + html:not([data-scale]) .fm-tmpl-listview-common::after { + content: ''; + position: absolute; + background-color: #ddd; + display: block; + z-index: 1; + top: auto; + right: auto; + bottom: 0; + left: 0; + width: 100%; + height: 1PX; + transform-origin: 50% 100%; + transform: scaleY(.5) + } +} + +.fm-tmpl-listview-cell .fm-tmpl-row:not(:last-child) { + padding-bottom: 3px +} + +.fm-tmpl-listview-cell .fm-tmpl-label { + font-size: 13px; + line-height: 18px; + color: #999 +} + +.fm-tmpl-listview-cell .fm-tmpl-label .fm-tmpl-label-title { + width: auto +} + +.fm-tmpl-listview-card { + margin: 10px 12px 10px; + padding: 0; + border-radius: 8px; + background: #fff; + overflow: hidden; + box-shadow: 0 2px 8px 0 rgba(81, 120, 159, .12) +} + +.fm-tmpl-listview-card .fm-tmpl-listview-content { + padding: 16px +} + +.fm-tmpl-listview-card .fm-tmpl-listview-content .fm-tmpl-label { + color: #666 +} + +.fm-tmpl-listview-card .fm-tmpl-listview-common-footer { + border-top: 1px solid #ddd; + position: relative +} + +@media (-webkit-min-device-pixel-ratio:2), +(min-resolution:2dppx) { + html:not([data-scale]) .fm-tmpl-listview-card .fm-tmpl-listview-common-footer { + border-top: none + } + + html:not([data-scale]) .fm-tmpl-listview-card .fm-tmpl-listview-common-footer::before { + content: ''; + position: absolute; + background-color: #ddd; + display: block; + z-index: 1; + top: 0; + right: auto; + bottom: auto; + left: 0; + width: 100%; + height: 1PX; + transform-origin: 50% 50%; + transform: scaleY(.5) + } +} + +.fm-listview-item:last-child .fm-tmpl-listview-card { + margin-bottom: 10px +} + +.fm-common-text { + display: inline; + color: #666; + word-break: break-all; +} + +.fm-common-label { + display: inline-block; + white-space: nowrap; +} + +.fm-common-content {} + +.fm-common-title { + display: inline; + color: #333; + word-break: break-all; + font-weight: 500; +} + + +.fm-title-sm { + font-size: 15px; + line-height: 22px; +} + +.fm-title-md { + font-size: 16px; + line-height: 24px; +} + +.fm-title-lg { + font-size: 17px; + line-height: 26px; +} + +.fm-title-xl { + font-size: 22px; + line-height: 32px; +} + +.fm-text-xs { + font-size: 12px; + line-height: 20px +} + +.fm-text-sm { + font-size: 13px; + line-height: 20px +} + +.fm-text-md { + font-size: 14px; + line-height: 22px +} + +.fm-text-lg { + font-size: 15px; + line-height: 22px +} + +.fm-text-xl { + font-size: 16px; + line-height: 24px +} + +.layout-bordered { + border-bottom: 1px solid #E6E6E6; +} + +.layout-bordered .layout-bordered { + border-bottom: none; +} + +.fm-listview-item:last-child .layout-bordered { + border-bottom: none; +} diff --git a/packages/mobile-designer/public/assets/icon/iconfont.css b/packages/mobile-designer/public/assets/icon/iconfont.css new file mode 100644 index 0000000000000000000000000000000000000000..0ef374b24a1acb4f70e6218d6ef764f42a93e487 --- /dev/null +++ b/packages/mobile-designer/public/assets/icon/iconfont.css @@ -0,0 +1,490 @@ +@font-face { + font-family: 'fd-i-Family'; + src: url('iconfont.ttf?t=1640255080725') format('truetype'); +} + +.fd-i-Family { + font-family: 'fd-i-Family' !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.fd_pc-response-layout-4:before { + content: '\e601'; +} + +.fd_pc-response-layout-3:before { + content: '\e602'; +} + +.fd_pc-response-layout-2:before { + content: '\e603'; +} + +.fd_pc-response-layout-1:before { + content: '\e604'; +} +.fd_pc-city-selector:before { + content: '\e600'; +} +.fd_pc-shenpiyijian:before { + content: '\e073'; +} + +.fd_pc-eventCode:before { + content: '\e071'; +} + +.fd_pc-delete-element:before { + content: '\e070'; +} + +.fd_pc-enable-function:before { + content: '\e06f'; +} + +.fd_pc-dragHandler:before { + content: '\e06e'; +} + +.fd_pc-editEvent:before { + content: '\e06d'; +} + +.fd_pc-extend-setting:before { + content: '\e06c'; +} + +.fd_pc-variable-setting:before { + content: '\e06b'; +} + +.fd_pc-leaf-node:before { + content: '\e06a'; +} + +.fd_pc-import-from-cdm:before { + content: '\e069'; +} + +.fd_pc-root-node:before { + content: '\e068'; +} + +.fd_pc-push:before { + content: '\e6067'; +} + +.fd_pc-save-sync:before { + content: '\e066'; +} + +.fd_pc-delete-obj:before { + content: '\e065'; +} + +.fd_pc-sync-bizelements:before { + content: '\e064'; +} + +.fd_pc-basic-info:before { + content: '\e063'; +} + +.fd_pc-advanced-setting:before { + content: '\e062'; +} + +.fd_pc-add-new-element:before { + content: '\e061'; +} + +.fd_pc-corner-marks-right-bottom:before { + content: '\e060'; +} + +.fd_pc-add-virtual-element:before { + content: '\e05f'; +} + +.fd_pc-cancel:before { + content: '\e05e'; +} + +.fd_pc-add-child-obj:before { + content: '\e05d'; +} + +.fd_pc-add-same-obj:before, +.fd_pc-imageupload:before { + content: '\e05c'; +} + +.fd_pc-yilaiguanxi:before { + content: '\e05b'; +} + +.fd_pc-shanchu:before { + content: '\e05a'; +} + +.fd_pc-gengduo:before { + content: '\e059'; +} + +.fd_pc-git:before { + content: '\e058'; +} + +.fd_pc-shouji:before { + content: '\e057'; +} + +.fd_pc-diannao:before { + content: '\e056'; +} + +.fd_pc-quanxian:before { + content: '\e055'; +} + +.fd_pc-daorudaochu:before { + content: '\e054'; +} + +.fd_pc-dayinshezhi:before { + content: '\e053'; +} + +.fd_pc-yewuliu:before { + content: '\e052'; +} + +.fd_pc-shujuzhuanhuanguize:before { + content: '\e051'; +} + +.fd_pc-shenjirizhi:before { + content: '\e050'; +} + +.fd_pc-bianmaguize:before { + content: '\e04f'; +} + +.fd_pc-zhuanyebanshejiqi:before { + content: '\e04e'; +} + +.fd_pc-lingdaimashejiqi:before { + content: '\e04d'; +} + +.fd_pc-didaimashejiqi:before { + content: '\e04c'; +} + +.fd_pc-geshidingzhi:before { + content: '\e04b'; +} + +.fd_pc-kuozhankaifa:before { + content: '\e04a'; +} + +.fd_pc-dingzhi:before { + content: '\e049'; +} + +.fd_pc-ziyuanguanliqi:before { + content: '\e048'; +} + +.fd_pc-zhedieshouqi:before { + content: '\e047'; +} + +.fd_pc-zhediezhankai:before { + content: '\e046'; +} + +.fd_pc-xianshiID:before { + content: '\e045'; +} + +.fd_pc-sousuo:before { + content: '\e044'; +} + +.fd_pc-shuaxin:before { + content: '\e043'; +} + +.fd_pc-anheimoshiqidongtai:before { + content: '\e042'; +} + +.fd_pc-anheimoshi:before { + content: '\e041'; +} +.fd_pc-tag:before { + content: '\e040'; +} + +.fd_pc-html-template:before { + content: '\e03f'; +} + +.fd_pc-button-group:before { + content: '\e03e'; +} + +.fd_pc-display-field:before, +.fd_pc-static-text:before { + content: '\e03d'; +} + +.fd_pc-QdpFramework:before { + content: '\e03c'; +} + +.fd_pc-check-group:before { + content: '\e03b'; +} + +.fd_pc-list-nav:before { + content: '\e03a'; +} + +.fd_pc-nav-tab:before { + content: '\e039'; +} + +.fd_pc-file-upload:before { + content: '\e038'; +} + +.fd_pc-section:before { + content: '\e037'; +} + +.fd_pc-jingtaiwenben:before { + content: '\e036'; +} + +.fd_pc-discussion-list:before { + content: '\e035'; +} + +.fd_pc-personnel-selector:before { + content: '\e034'; +} + +.fd_pc-gags:before { + content: '\e033'; +} + +.fd_pc-module:before { + content: '\e032'; +} + +.fd_pc-multi-select:before { + content: '\e031'; +} + +.fd_pc-sidebar:before { + content: '\e030'; +} + +.fd_pc-steps:before { + content: '\e02f'; +} + +.fd_pc-splitter:before { + content: '\e02e'; +} + +.fd_pc-scrollspy:before { + content: '\e02d'; +} + +.fd_pc-multi-view-container:before { + content: '\e02c'; +} + +.fd_pc-list-view:before { + content: '\e02b'; +} + +.fd_pc-charts:before { + content: '\e02a'; +} + +.fd_pc-image:before { + content: '\e029'; +} + +.fd_pc-scroll-collapsible-area:before { + content: '\e028'; +} + +.fd_pc-modal-footer:before { + content: '\e027'; +} + +.fd_pc-wizard:before { + content: '\e026'; +} + +.fd_pc-page-header:before { + content: '\e025'; +} + +.fd_pc-component:before { + content: '\e024'; +} + +.fd_pc-data-grid:before { + content: '\e023'; +} + +.fd_pc-mingxibiao2:before { + content: '\e022'; +} + +.fd_pc-tubiao:before { + content: '\e021'; +} + +.fd_pc-query-solution:before { + content: '\e020'; +} + +.fd_pc-liushuihao:before { + content: '\e01f'; +} + +.fd_pc-switch:before { + content: '\e01e'; +} + +.fd_pc-lookup:before { + content: '\e01d'; +} + +.fd_pc-erweima:before { + content: '\e01c'; +} + +.fd_pc-radio-group:before { + content: '\e01b'; +} + +.fd_pc-organization-selector:before { + content: '\e01a'; +} + +.fd_pc-approval-logs:before { + content: '\e019'; +} + +.fd_pc-combo-list:before { + content: '\e018'; +} + +.fd_pc-input-group:before { + content: '\e017'; +} + +.fd_pc-textarea:before { + content: '\e016'; +} + +.fd_pc-tabs:before { + content: '\e015'; +} + +.fd_pc-OCR:before { + content: '\e014'; +} + +.fd_pc-number-spinner:before { + content: '\e013'; +} + +.fd_pc-field-set:before { + content: '\e012'; +} + +.fd_pc-list-filter:before { + content: '\e011'; +} + +.fd_pc-avatar:before { + content: '\e010'; +} + +.fd_pc-date-picker:before { + content: '\e00f'; +} + +.fd_pc-language-text-box:before { + content: '\e00e'; +} + +.fd_pc-discussion-editor:before { + content: '\e00d'; +} + +.fd_pc-button:before { + content: '\e00c'; +} + +.fd_pc-yuyinshuru:before { + content: '\e00b'; +} + +.fd_pc-rich-text-box:before { + content: '\e00a'; +} + +.fd_pc-dizhi:before { + content: '\e009'; +} + +.fd_pc-time-picker:before { + content: '\e008'; +} + +.fd_pc-input-group:before { + content: '\e007'; +} + +.fd_pc-view-model:before { + content: '\e006'; +} + +.fd_pc-check-box:before { + content: '\e005'; +} + +.fd_pc-file-upload:before { + content: '\e004'; +} + +.fd_pc-tree-grid:before { + content: '\e003'; +} + +.fd_pc-response-form:before { + content: '\e002'; +} + +.fd_pc-content-container:before { + content: '\e001'; +} + +.fd_pc-fenlanmianban:before { + content: '\e000'; +} diff --git a/packages/mobile-designer/public/assets/icon/iconfont.ttf b/packages/mobile-designer/public/assets/icon/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ae8d3ff7e1832d16ec45ed40a09b4972d1a7fb13 Binary files /dev/null and b/packages/mobile-designer/public/assets/icon/iconfont.ttf differ diff --git a/packages/mobile-designer/public/assets/mobile-style-vue.css b/packages/mobile-designer/public/assets/mobile-style-vue.css new file mode 100644 index 0000000000000000000000000000000000000000..25ec13d84d72c424e9b2d6d121ff665f0d14aaec --- /dev/null +++ b/packages/mobile-designer/public/assets/mobile-style-vue.css @@ -0,0 +1 @@ +@charset "UTF-8";:root{--fm-black: #000;--fm-white: #fff;--fm-gray-1: #f2f3f5;--fm-gray-2: #eee;--fm-gray-3: #ddd;--fm-gray-4: #ccc;--fm-gray-5: #999;--fm-gray-6: #666;--fm-gray-7: #333;--fm-red: #F24645;--fm-red-light: #f9e8e8;--fm-blue: #3A90FF;--fm-blue-2: #65a7ff;--fm-blue-light: #ecf2fe;--fm-green: #5CC171;--fm-green-2: #5AC1C3;--fm-green-light: #e9f5ed;--fm-orange: #FF9800;--fm-orange-2: #FA6400;--fm-orange-3: #FFB400;--fm-orange-light: #faf0e1;--fm-primary-color: var(--fm-blue);--fm-success-color: var(--fm-green);--fm-danger-color: var(--fm-red);--fm-warning-color: var(--fm-orange);--fm-submit-color: var(--fm-green-2);--fm-primary-color-light: var(--fm-blue-light);--fm-success-color-light: var(--fm-green-light);--fm-danger-color-light: var(--fm-red-light);--fm-warning-color-light: var(--fm-orange-light);--fm-text-color: var(--fm-gray-7);--fm-text-color-light: var(--fm-gray-5);--fm-active-color: var(--fm-gray-1);--fm-disabled-color: var(--fm-gray-4);--fm-readonly-color: var(--fm-gray-6);--fm-active-opacity: .7;--fm-readonly-opacity: .6;--fm-disabled-opacity: .5;--fm-background: var(--fm-gray-1);--fm-background-white: var(--fm-white);--fm-box-shadow-color: var(--fm-gray-1);--fm-padding-base: 4px;--fm-padding-xs: 8px;--fm-padding-sm: 12px;--fm-padding-md: 16px;--fm-padding-lg: 24px;--fm-padding-xl: 32px;--fm-padding-horizontal-xs: 0 var(--fm-padding-xs);--fm-padding-horizontal-sm: 0 var(--fm-padding-sm);--fm-padding-horizontal-md: 0 var(--fm-padding-md);--fm-padding-horizontal-lg: 0 var(--fm-padding-lg);--fm-margin-base: 4px;--fm-margin-xs: 8px;--fm-margin-sm: 12px;--fm-margin-md: 16px;--fm-margin-lg: 24px;--fm-margin-xl: 32px;--fm-margin-horizontal-xs: 0 var(--fm-margin-xs);--fm-margin-horizontal-sm: 0 var(--fm-margin-sm);--fm-margin-horizontal-md: 0 var(--fm-margin-md);--fm-margin-horizontal-lg: 0 var(--fm-margin-lg);--fm-font-bold-light: 500;--fm-font-bold: 600;--fm-font-size: 16px;--fm-line-height: 1.2;--fm-font-size-xs: 10px;--fm-font-size-sm: 12px;--fm-font-size-md: 14px;--fm-font-size-lg: 16px;--fm-gradient-blue: linear-gradient(-45deg,var(--fm-blue-2) 0%, var(--fm-blue) 100%);--fm-gradient-orange: linear-gradient(-45deg,var(--fm-orange) 0%, var(--fm-orange-2) 100%);--fm-base-font: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, Segoe UI, Arial, Roboto, "PingFang SC", "miui", "Hiragino Sans GB", "Microsoft Yahei", sans-serif;--fm-price-font: avenir-heavy, "PingFang SC", helvetica neue, arial, sans-serif;--fm-duration-base: .3s;--fm-duration-fast: .2s;--fm-ease-out: ease-out;--fm-ease-in: ease-in;--fm-noborder: none;--fm-radius-sm: 2px;--fm-radius-md: 4px;--fm-radius-lg: 8px;--fm-radius-max: 999px;--fm-zindex-1: 9;--fm-zindex-2: 10;--fm-zindex-3: 99;--fm-zindex-4: 100;--fm-zindex-5: 999;--fm-zindex-6: 1000}*,*:before,*:after{box-sizing:border-box}body,h1,h2,h3,h4,p,figure,blockquote,dl,dd{margin:0}ul[role=list],ol[role=list]{list-style:none}html:focus-within{scroll-behavior:smooth}body{min-height:100vh;text-rendering:optimizeSpeed;line-height:1.5;font-family:-apple-system,Noto Sans,Helvetica Neue,Helvetica,Nimbus Sans L,Arial,Liberation Sans,PingFang SC,Hiragino Sans GB,Noto Sans CJK SC,Source Han Sans SC,Source Han Sans CN,Microsoft YaHei,Wenquanyi Micro Hei,WenQuanYi Zen Hei,ST Heiti,SimHei,WenQuanYi Zen Hei Sharp,sans-serif}a:not([class]){text-decoration-skip-ink:auto}img,picture{max-width:100%;display:block}input,button,textarea,select{font:inherit}@font-face{font-family:farrisMobile;font-style:normal;font-weight:400;src:url(data:font/ttf;base64,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AADmFAAAACUAAOYVAADmFQAAACYAAOYWAADmFgAAACcAAOYXAADmFwAAACgAAOYYAADmGAAAACkAAOYZAADmGQAAAHYAAOYaAADmGgAAAHUAAOYbAADmGwAAAHQAAOYcAADmHAAAAHMAAOYdAADmHQAAACoAAOYeAADmHgAAACsAAOYfAADmHwAAAHAAAOYgAADmIAAAAHEAAOYhAADmIQAAAHIAAOYiAADmIgAAAG8AAOYjAADmIwAAACwAAOYkAADmJAAAAGUAAOYlAADmJQAAAGYAAOYmAADmJgAAAGcAAOYnAADmJwAAAGgAAOYoAADmKAAAAGkAAOYpAADmKQAAAGoAAOYqAADmKgAAAGsAAOYrAADmKwAAAGwAAOYsAADmLAAAAG0AAOYtAADmLQAAAG4AAOYuAADmLgAAAGMAAOYvAADmLwAAAGQAAOYwAADmMAAAAGIAAOYyAADmMgAAADQAAOYzAADmMwAAAC0AAOY0AADmNAAAAC4AAOY2AADmNgAAAC8AAOY3AADmNwAAADAAAOY5AADmOQAAADEAAOY6AADmOgAAADIAAOZVAADmVQAAADUAAOZWAADmVgAAADoAAOZXAADmVwAAADcAAOZYAADmWAAAADgAAOZZAADmWQAAAD0AAOZaAADmWgAAAF4AAOZbAADmWwAAAF8AAOZcAADmXAAAAGAAAOZdAADmXQAAAGEAAOZeAADmXgAAADYAAOZfAADmXwAAADsAAOZgAADmYAAAADwAAOZhAADmYQAAADkAAOZiAADmYgAAAD4AAOZjAADmYwAAAD8AAOZkAADmZAAAAEAAAOZlAADmZQAAAEEAAOZmAADmZgAAAEIAAOZnAADmZwAAAEMAAOZoAADmaAAAAEQAAOZpAADmaQAAAEUAAOZqAADmagAAAEYAAOZrAADmawAAAEcAAOZsAADmbAAAAEgAAOZtAADmbQAAAEkAAOZuAADmbgAAAEoAAOZvAADmbwAAAEsAAOZwAADmcAAAAEwAAOZxAADmcQAAAE0AAOZyAADmcgAAAE4AAOZzAADmcwAAAE8AAOZ0AADmdAAAAFAAAOZ1AADmdQAAAFEAAOZ2AADmdgAAAFIAAOZ3AADmdwAAAFMAAOZ4AADmeAAAAFQAAOZ5AADmeQAAAFUAAOZ6AADmegAAAFYAAOZ7AADmewAAAFcAAOZ8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AV8BYAFhAWIBYwFkAWUBZgFnAWgBaQFqAWsBbAFtAW4BbwFwAXEBcgFzAXQBdQF2AXcBeAF5AXoBewF8AX0BfgF/AYABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+AAlzLW1vcmUtbzEIcy1kZWxldGUIcy1iYWNrLW8Gcy1zY2FuEHMtb3JnYW5pemF0aW9uLW8Jcy1ncm91cC1vCXMtZmlsdGVyMQlzLWNsZWFyLW8Ocy1pbGx1c3RyYXRlLW8Icy1tb21lbnQIcy1zaG9wLW8Kcy1tb21lbnQtbwZzLXNob3AKcy1yZXZva2UtbwpzLXN1Ym1pdC1vB3MtYXBwLW8Gcy1ib29rBXMtYXBwBHMtbXkJcy1jb21tZW50C3MtY29tbWVudC1vCHMtYm9vay1vBnMtbXktbwxzLWxvY2F0aW9uLW8Kcy1sb2NhdGlvbgZzLW5ld3MIcy1uZXdzLW8Jcy1TZW5kaW5nCnMtSW1wb3J0LW8Icy1FZGl0LW8Icy1RUmNvZGULcy1CcmllZmNhc2URcy1Ob3RpZmljYXRpb25vZmYIcy1QZW5jaWwIcy1TdGFyLW8Jcy1CYXJDb2RlD3MtU2FsZU1lc3NhZ2UtbwxzLUxpc3R2aWV3LW8Lcy1QaWN0dXJlLW8Ocy1TYXZlRmlsbGV0LW8Ocy1TaG9wcGluZ2NhcnQJcy1QZW5kaW5nDnMtRXhwYW5kdmlldy1vCHMtTG9jay1vCXMtU2VydmljZQpzLVdhbGxldC1vEHMtU2hvcHBpbmdjYXJ0LW8Lcy1TZXR0aW5nLW8Ncy1VbmZvbGRSZWMtbwlzLVByb2ZpbGUGTGluay1vDVVzZXJTZXR0aW5nLW8Jcy1hZ3JlZS1vDHMtYXJyb3ctZG93bgdzLWFkZC1vB3MtYW5uZXgMcy1hcnJvdy1sZWZ0CnMtYXJyb3ctdXAScy1jaGVja2JveC1jaGVja2VkCnMtY2hlY2tib3gHcy1hcnJvdwpzLWV4Y2hhbmdlB3MtY2xlYXIJcy1jaGVja2VkB3MtZXllLW8Lcy1jbG9zZS1leWUEcy1hdAxzLWZlZWRiYWNrLW8Pcy1mb2xkLWNpcmNsZS1vB3MtY3Jvc3MHcy1taW51cwZzLWZpbGUPcy1mb2xkLXRyaWFuZ2xlCHMtZmlsdGVyCXMtZm9yd29yZAZzLXBsdXMJcy1maWxlZGVsCHMtZm9sZC1vCXMtaW1hZ2UtbwhzLW1vcmUtbw5zLXJlZGlvLWNpcmNsZQpzLXJlamVjdC1vCXMtc3VjY2VzcwlzLXJlZnJlc2gGcy1zdGFyDXMtcHJvY2Vzc2Zsb3cRcy11bmZvbGQtY2lyY2xlLW8Icy1yZXdpbmQKcy11bmZvbGQtbwtzLXdhcm5pbmctbxFzLXVuZm9sZC10cmlhbmdsZQlzLXByaW50LW8Kcy1zZWFyY2gtbwhBaXJwbGFuZQVUcmFpbgNCdXMEVGF4aQxvdmVydGltZW1lYWwTZm0taS10cmFmZmljZGV0YWlscw9mbS1pLXRyYWZmaWNzdWITZm0taS1hY2NvbW1vZGF0aW9uMQ1mbS1pLWJ1c2luZXNzC2ZtLWktYnVkZ2V0CWZtLWktZ2lmdBFmbS1pLWNhbmNlbGxhdGlvbgxmbS1pLWludm9pY2UJZm0taS1saXN0CmZtLWktbWVhbHMIZm0taS1wYXkMZm0taS1zdWJzaWR5B3Nob3V6aGUTZm0taS1jb3N0YWxsb2NhdGlvbgxmbS1pLXBheW1lbnQOZm0taS1JdGluZXJhcnkOZm0taS1tb3JleGUwMmQPZm0taS1pbWFnZXhlMDJlEGZtLWktcmVqZWN0eGUwMmYPZm0taS1hZ3JlZXhlMDMxDWZtLWktY2FyZGZvbGQPZm0taS1jYXJkdW5mb2xkEWZtLWktdHJhZmZpY290aGVyD2ZtLWktYm90dG9tc2F2ZRBmbS1pLXRyYWZmaWNib2F0D2ZtLWktdHJhZmZpY2NhchFmbS1pLXRyYWZmaWNwbGFuZRFmbS1pLXRyYWZmaWN0cmFpbg9mbS1pLXRyYWZmaWNidXMMZm0taS1hZGRncmF5CmZtLWktY2xvc2UIZm0taS1hZGQJZm0taS1tb3JlCmZtLWktY2hlY2sPZm0taS1iYWNrY2lyY2xlCmZtLWktYWdyZWUMZm0taS1sb2FkaW5nDGZtLWktZmlsZWRlbAlmbS1pLWZpbGUQZm0taS1wcm9jZXNzZmxvdwxmbS1pLXJlZHN0YXIQZm0taS1yaWdodGNpcmNsZQ9mbS1pLXRpbWVjaXJjbGUOZm0taS1zY3JlZW5pbmcMZm0taS11bmNoZWNrDmZtLWktb3BlcmF0aW9uE2ZtLWktYXBwcm92YWxhbW91bnQLZm0taS1hZ3JlZWQOZm0taS1pbnByb2Nlc3MNZm0taS1mZWVkYmFjawpmbS1pLXByaW50DmZtLWktaW1wb3J0YW50GmZtLWktYW1vdW50b2ZyZWltYnVyc2VtZW50FGZtLWktc2FmZXR5YXNzaXN0YW50C2ZtLWktcmVtaW5kDWZtLWktZXllb3BwZW4NZm0taS1leWVjbG9zZRBmbS1pLVBob3RvZ3JhcGh5D2ZtLWktcGhvdG9ncmFwaA9mbS1pLWFkZHBpY3R1cmUTZm0taS10b3Bfb3RoZXItZmFjZQ5mbS1pLXRvcF9vdGhlcgtmbS1pLWRlbGV0ZQ1mbS1pLW5leHRwYWdlDmZtLWktYWRkYnV0dG9uFmZtLWktd2FpdGZvcnByb2Nlc3NpbmcTZm0taS13YXJuaW5nbWVzc2FnZRJmbS1pLWZhaWx1cmVwcm9tcHQUZm0taS1zdWNjZXNzZnVsaGludHMKZm0taS1vdGhlcgxmbS1pLXJldHJhY3QOZm0taS1kcm9wLWRvd24LZm0taS1jYW5jZWwLZm0taS1zZWFyY2gTZm0taS1tdWx0aXBsZWNob2ljZRFmbS1pLXNpbmdsZWNob2ljZQ9mbS1pLW1pY3JvcGhvbmUXZm0taS1hcnJvdy1jaGV2cm9uLWxlZnQPZm0taS1oZWxwY2VudGVyDmZtLWktc3dlZXBjb2RlDmZtLWktZ3JvdXBjaGF0DmZtLWktYWRkZnJpZW5kC2ZtLWktdG9wX215EGZtLWktdG9wX215LWZhY2UPZm0taS10b3BfZnJpZW5kFGZtLWktdG9wX2ZyaWVuZC1mYWNlFWZtLWktdG9wX3B1YmxpY3ByYWlzZRpmbS1pLXRvcF9wdWJsaWNwcmFpc2UtZmFjZQ1mbS1pLXRvcF9ob21lEmZtLWktdG9wX2hvbWUtZmFjZQAAAAA=) format("truetype")}@keyframes fm-fade-in{0%{opacity:0}to{opacity:1}}@keyframes fm-fade-out{0%{opacity:1}to{opacity:0}}.fm-fade-enter-active{animation:.3s fm-fade-in both ease-out}.fm-fade-leave-active{animation:.3s fm-fade-out both ease-in}.fm-slide-up-enter-from,.fm-slide-up-leave-to{transform:translate3d(0,100%,0)}.fm-slide-down-enter-from,.fm-slide-down-leave-to{transform:translate3d(0,-100%,0)}.fm-slide-left-enter-from,.fm-slide-left-leave-to{transform:translate3d(-100%,0,0)}.fm-slide-right-enter-from,.fm-slide-right-leave-to{transform:translate3d(100%,0,0)}.fm-slide-up-enter-active,.fm-slide-down-enter-active,.fm-slide-left-enter-active,.fm-slide-right-enter-active{transition-timing-function:ease-out}.fm-slide-up-leave-active,.fm-slide-down-leave-active,.fm-slide-left-leave-active,.fm-slide-right-leave-active{transition-timing-function:ease-in}.fm-slide-in-enter-active,.fm-slide-in-leave-active,.fm-slide-out-enter-active,.fm-slide-out-leave-active{will-change:transform;transition:all .3s;height:100%;width:100%;top:0;position:absolute;backface-visibility:hidden;perspective:1000}.fm-slide-in-leave-to,.fm-slide-out-enter-from{transform:translate(-100%);opacity:0}.fm-slide-in-enter-from,.fm-slide-out-leave-to{transform:translate(100%);opacity:0}@keyframes fm-drop-down-in{0%{height:0;opacity:0}to{opacity:1}}@keyframes fm-drop-down-out{0%{opacity:1}to{height:0;opacity:0}}.fm-drop-down-enter-active{animation:.3s fm-drop-down-in both ease-out}.fm-drop-down-leave-active{animation:.3s fm-drop-down-out both ease-in}@keyframes fm-rotate{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}:root{--fm-button-height: 42px;--fm-button-padding: 0 14px;--fm-button-radius: 2px;--fm-button-border-width: 1px;--fm-button-color: var(--fm-white);--fm-button-line-height: var(--fm-line-height);--fm-button-font-size: var(--fm-font-size);--fm-button-plain-background: var(--fm-white);--fm-button-lg-height: 46px;--fm-button-lg-font-size: 18px;--fm-button-md-height: 38px;--fm-button-md-font-size: 14px;--fm-button-sm-height: 34px;--fm-button-sm-padding: 0 8px;--fm-button-sm-font-size: 12px;--fm-button-xs-height: 28px;--fm-button-xs-font-size: 10px;--fm-button-secondary-color: var(--fm-blue-light)}.fm-button{position:relative;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;text-align:center;margin:0;border:none;transition:opacity .2s;color:var(--fm-button-color);height:var(--fm-button-height);padding:var(--fm-button-padding);font-size:var(--fm-button-font-size);line-height:var(--fm-button-line-height);border-radius:var(--fm-button-radius)}.fm-button--primary,.fm-button--info{background:var(--fm-primary-color)}.fm-button--secondary{color:var(--fm-primary-color);background:var(--fm-button-secondary-color)}.fm-button--danger{background-color:var(--fm-danger-color)}.fm-button--warning{background-color:var(--fm-warning-color)}.fm-button--success{background-color:var(--fm-success-color)}.fm-button--plain{box-shadow:none;background:var(--fm-button-plain-background)}.fm-button--plain.fm-button--primary,.fm-button--plain.fm-button--info{color:var(--fm-primary-color);border:var(--fm-button-border-width) solid var(--fm-primary-color)}.fm-button--plain.fm-button--success{color:var(--fm-success-color);border:var(--fm-button-border-width) solid var(--fm-success-color)}.fm-button--plain.fm-button--danger{color:var(--fm-danger-color);border:var(--fm-button-border-width) solid var(--fm-danger-color)}.fm-button--plain.fm-button--warning{color:var(--fm-button-warning-color);border:var(--fm-button-border-width) solid var(--fm-button-warning-color)}.fm-button--noborder{border:none!important}.fm-button--large{height:var(--fm-button-lg-height);font-size:var(--fm-button-lg-font-size)}.fm-button--normal{height:var(--fm-button-md-height);font-size:var(--fm-button-md-font-size)}.fm-button--small{height:var(--fm-button-sm-height);padding:var(--fm-button-sm-padding);font-size:var(--fm-button-sm-font-size)}.fm-button--mini{height:var(--fm-button-xs-height);padding:var(--fm-button-sm-padding);font-size:var(--fm-button-xs-font-size)}.fm-button--block{display:flex;width:100%}.fm-button--disabled{cursor:not-allowed;opacity:var(--fm-disabled-opacity)}.fm-button--loading:before,.fm-button--disabled:before{display:none}.fm-button--round{border-radius:var(--fm-radius-max)}.fm-button--square{border-radius:0}.fm-button__loading{display:inline-block;width:20px;max-width:100%;height:20px;max-height:100%;vertical-align:middle;animation:fm-rotate 2s linear infinite}.fm-button__loading circle{animation:fm-circular 1.5s ease-in-out infinite;stroke:currentColor;stroke-width:4;stroke-linecap:round}.fm-button__loading-icon-circular{color:#fff}.fm-button__loading-text{margin-left:6px}.fm-button__icon:not(:last-child){margin-right:6px}.fm-button:before{position:absolute;top:50%;left:50%;width:100%;height:100%;background-color:#000;border:inherit;border-color:#000;border-radius:inherit;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);opacity:0;content:" "}.fm-button:active:before{opacity:.1}.fm-button-edit__tags{min-height:24px;flex:1;display:flex;overflow:auto}.fm-button-edit__tag:not(:last-child){margin-right:6px}:root{--fm-cell-padding: 10px 16px;--fm-cell-margin: 5px;--fm-cell-line-height: 24px;--fm-cell-font-size: var(--fm-font-size);--fm-cell-background: var(--fm-background-white);--fm-cell-color: var(--fm-text-color);--fm-cell-label-font-size: 12px;--fm-cell-label-line-height: 18px;--fm-cell-label-color: var(--fm-text-color-light);--fm-cell-required-color: var(--fm-danger-color)}.fm-cell{width:100%;padding:var(--fm-cell-padding);background-color:var(--fm-cell-background);color:var(--fm-cell-color);font-size:var(--fm-cell-font-size);line-height:var(--fm-cell-line-height);position:relative;display:flex;overflow:hidden}.fm-cell-bottom-border,.fm-cell:not(:last-child){border-bottom:1px solid #ddd;position:relative}@media (min-resolution: 1dppx){html:not([data-scale]) .fm-cell-bottom-border,html:not([data-scale]) .fm-cell:not(:last-child){border-bottom:none}html:not([data-scale]) .fm-cell-bottom-border:after,html:not([data-scale]) .fm-cell:not(:last-child):after{content:"";position:absolute;background-color:#ddd;display:block;z-index:1;inset:auto auto 0 0;width:100%;height:1px;transform-origin:50% 100%;transform:scaleY(.5)}}.fm-cell-bottom-border:after,.fm-cell:not(:last-child):after{left:16px!important}.fm-cell.fm-cell-all-width:not(:last-child):after{left:0!important}.fm-cell--clickable{cursor:pointer}.fm-cell--clickable:active{background-color:var(--fm-active-color)}.fm-cell--required .fm-cell-title{position:relative}.fm-cell--required .fm-cell-title .fm-cell-title-text:after{padding-left:2px;color:var(--fm-cell-required-color);font-size:12px;content:"*"}.fm-cell__title,.fm-cell__value{flex:1;font-size:inherit}.fm-cell__title{display:inline-block;overflow:hidden}.fm-cell__title-text{display:flex;word-break:break-all}.fm-cell__title-text span{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.fm-cell__right{display:flex;overflow:hidden;flex-direction:column}.fm-cell__right-content{display:flex;flex:1}.fm-cell__right--fill{flex:1}.fm-cell__value{position:relative;overflow:hidden;text-align:right;vertical-align:middle;word-wrap:break-word}.fm-cell__value--alone{text-align:left}.fm-cell__label{margin-top:var(--fm-cell-margin);color:var(--fm-cell-label-color);font-size:var(--fm-cell-label-font-size);line-height:var(--fm-cell-label-line-height)}.fm-cell--center{align-items:center}.fm-cell__extra,.fm-cell__left-icon,.fm-cell__right-icon{min-width:1em;font-size:var(--fm-cell-font-size);line-height:var(--fm-cell-line-height);display:flex;align-items:center}.fm-cell__left-icon{margin-right:var(--fm-cell-margin)}.fm-cell__extra,.fm-cell__right-icon{margin-left:var(--fm-cell-margin)}.fm-cell--noborder .fm-cell:after{display:none!important}.fm-cell--card{padding-left:0;padding-right:0}.fm-checkbox-group{display:flex;overflow:visible;text-align:left;flex-wrap:wrap}.fm-checkbox-group--vertical{flex-direction:column}.fm-checkbox-group--vertical .fm-checkbox:not(:last-child){margin-bottom:8px}.fm-checkbox{margin-top:4px;margin-bottom:4px}:root{--fm-checker-color: var(--fm-text-color);--fm-checker-font-size: var(--fm-font-size);--fm-checker-icon-color: var(--fm-text-color-light);--fm-checker-icon-background: var(--fm-background-white);--fm-checker-icon-radius: var(--fm-radius-md);--fm-checker-checked-icon-color: var(--fm-primary-color);--fm-checker-button-background: var(--fm-gray-2);--fm-checker-disabled-color: var(--fm-disabled-color);--fm-checker-disabled-icon-color: var(--fm-gray-1)}.fm-checker{display:flex;align-items:center;color:var(--fm-checker-color);font-size:var(--fm-checker-font-size)}.fm-checker__icon{display:inline-block;align-items:center}.fm-checker__icon .fm-icon{display:block;height:20px;width:20px;line-height:18px;font-size:14px;text-align:center;border-radius:var(--fm-checker-icon-radius);border:1px solid var(--fm-checker-icon-color);color:var(--fm-checker-icon-background);background-color:var(--fm-checker-icon-background)}.fm-checker__label{margin-left:8px;margin-right:8px;display:inline-block;line-height:20px}.fm-checker:first-child .fm-checker_button{margin-left:0}.fm-checker--round .fm-checker__icon .fm-icon{border-radius:100%}.fm-checker--button .fm-checker__label{font-size:13px;text-align:center;border-radius:14px;line-height:28px;padding:0 12px;min-width:60px;margin-right:0;color:var(--fm-checker-color);background:var(--fm-checker-button-background)}.fm-checker--checked .fm-checker__icon .fm-icon{color:var(--fm-checker-icon-background);border-color:var(--fm-checker-checked-icon-color);background-color:var(--fm-checker-checked-icon-color)}.fm-checker--checked.fm-checker--button .fm-checker__label{color:var(--fm-checker-icon-background);border-color:var(--fm-checker-color);background-color:var(--fm-checker-checked-icon-color)}.fm-checker--readonly{opacity:var(--fm-readonly-opacity)}.fm-checker--disabled{color:var(--fm-checker-disabled-color)}.fm-checker--disabled .fm-checker__icon .fm-icon{border-color:var(--fm-checker-disabled-color);background-color:var(--fm-checker-disabled-icon-color);color:var(--fm-checker-disabled-icon-color)}.fm-checker--disabled.fm-checker--checked .fm-checker__icon .fm-icon{background-color:var(--fm-checker-disabled-color);border-color:var(--fm-checker-disabled-color)}:root{--fm-icon-font-size: 14px;--fm-icon-color: inherit}.fm-icon{font-family:farrisMobile!important;font-size:var(--fm-icon-font-size);font-style:normal;color:var(--fm-icon-color);display:inline-block;width:1em;height:1em;font-weight:400;line-height:1;vertical-align:middle;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fm-icon:before{display:inline-block}.fm-icon-filter:before{content:"\e697"}.fm-icon-cardfold:before{content:"\e6b7"}.fm-icon-cardunfold:before{content:"\e6b8"}.fm-icon-trafficother:before{content:"\e6b9"}.fm-icon-bottomsave:before{content:"\e6ba"}.fm-icon-trafficboat:before{content:"\e6bb"}.fm-icon-trafficcar:before{content:"\e6bc"}.fm-icon-trafficplane:before{content:"\e6bd"}.fm-icon-traffictrain:before{content:"\e6be"}.fm-icon-trafficbus:before{content:"\e6bf"}.fm-icon-addgray:before{content:"\e6a7"}.fm-icon-close:before{content:"\e6a8"}.fm-icon-add-line:before{content:"\e6a9"}.fm-icon-more:before{content:"\e6aa"}.fm-icon-check:before{content:"\e6ab"}.fm-icon-backcircle:before{content:"\e6ac"}.fm-icon-agree:before{content:"\e6ad"}.fm-icon-loading:before{content:"\e6ae"}.fm-icon-filedel:before{content:"\e6af"}.fm-icon-file:before{content:"\e6b0"}.fm-icon-processflow:before{content:"\e6b1"}.fm-icon-redstar:before{content:"\e6b2"}.fm-icon-rightcircle:before{content:"\e6b3"}.fm-icon-timecircle:before{content:"\e6b4"}.fm-icon-screening:before{content:"\e6b5"}.fm-icon-uncheck:before{content:"\e6b6"}.fm-icon-operation:before{content:"\e02c"}.fm-icon-approvalamount:before{content:"\e02b"}.fm-icon-agreed:before{content:"\e02a"}.fm-icon-inprocess:before{content:"\e029"}.fm-icon-feedback:before{content:"\e028"}.fm-icon-print:before{content:"\e027"}.fm-icon-important:before{content:"\e026"}.fm-icon-amountofreimbursement:before{content:"\e025"}.fm-icon-safetyassistant:before{content:"\e024"}.fm-icon-remind:before{content:"\e023"}.fm-icon-eyeoppen:before{content:"\e022"}.fm-icon-eyeclose:before{content:"\e01e"}.fm-icon-photography:before{content:"\e021"}.fm-icon-photograph:before{content:"\e020"}.fm-icon-addpicture:before{content:"\e01f"}.fm-icon-top_other-face:before{content:"\e01d"}.fm-icon-top_other:before{content:"\e01c"}.fm-icon-delete:before{content:"\e01b"}.fm-icon-nextpage:before{content:"\e01a"}.fm-icon-addbutton:before{content:"\e019"}.fm-icon-waitforprocessing:before{content:"\e018"}.fm-icon-warningmessage:before{content:"\e017"}.fm-icon-failureprompt:before{content:"\e016"}.fm-icon-successfulhints:before{content:"\e015"}.fm-icon-other:before{content:"\e014"}.fm-icon-retract:before{content:"\e013"}.fm-icon-drop-down:before{content:"\e012"}.fm-icon-cancel:before{content:"\e011"}.fm-icon-search:before{content:"\e010"}.fm-icon-multiplechoice:before{content:"\e00f"}.fm-icon-singlechoice:before{content:"\e00e"}.fm-icon-microphone:before{content:"\e00d"}.fm-icon-arrow-chevron-left:before{content:"\e00c"}.fm-icon-helpcenter:before{content:"\e00b"}.fm-icon-sweepcode:before{content:"\e00a"}.fm-icon-groupchat:before{content:"\e009"}.fm-icon-addfriend:before{content:"\e008"}.fm-icon-top_my:before{content:"\e007"}.fm-icon-top_my-face:before{content:"\e006"}.fm-icon-top_friend:before{content:"\e005"}.fm-icon-top_friend-face:before{content:"\e004"}.fm-icon-top_publicpraise:before{content:"\e003"}.fm-icon-top_publicpraise-face:before{content:"\e002"}.fm-icon-top_home:before{content:"\e001"}.fm-icon-top_home-face:before{content:"\e000"}.fm-icon-s-agree-o:before{content:"\e655"}.fm-icon-s-arrow-down:before{content:"\e656"}.fm-icon-s-add-o:before{content:"\e657"}.fm-icon-s-annex:before{content:"\e658"}.fm-icon-s-arrow:before{content:"\e659"}.fm-icon-s-arrow-up:before{content:"\e65e"}.fm-icon-s-checkbox-checked:before{content:"\e65f"}.fm-icon-s-checkbox:before{content:"\e660"}.fm-icon-s-arrow-left:before{content:"\e661"}.fm-icon-s-exchange:before{content:"\e662"}.fm-icon-s-clear:before{content:"\e663"}.fm-icon-s-checked:before{content:"\e664"}.fm-icon-s-eye-o:before{content:"\e665"}.fm-icon-s-close-eye:before{content:"\e666"}.fm-icon-s-at:before{content:"\e667"}.fm-icon-s-feedback-o:before{content:"\e668"}.fm-icon-s-fold-circle-o:before{content:"\e669"}.fm-icon-s-cross:before{content:"\e66a"}.fm-icon-s-minus:before{content:"\e66b"}.fm-icon-s-file:before{content:"\e66c"}.fm-icon-s-fold-triangle:before{content:"\e66d"}.fm-icon-s-filter:before{content:"\e66e"}.fm-icon-s-forword:before{content:"\e66f"}.fm-icon-s-plus:before{content:"\e670"}.fm-icon-s-filedel:before{content:"\e671"}.fm-icon-s-fold-o:before{content:"\e672"}.fm-icon-s-image-o:before{content:"\e673"}.fm-icon-s-more-o:before{content:"\e674"}.fm-icon-s-redio-circle:before{content:"\e675"}.fm-icon-s-reject-o:before{content:"\e676"}.fm-icon-s-success:before{content:"\e677"}.fm-icon-s-refresh:before{content:"\e678"}.fm-icon-s-star:before{content:"\e679"}.fm-icon-s-processflow:before{content:"\e67a"}.fm-icon-s-unfold-circle-o:before{content:"\e67b"}.fm-icon-s-rewind:before{content:"\e67c"}.fm-icon-s-unfold-o:before{content:"\e67d"}.fm-icon-s-save-o:before{content:"\e67e"}.fm-icon-s-warning-o:before{content:"\e67f"}.fm-icon-s-unfold-triangle:before{content:"\e680"}.fm-icon-s-print-o:before{content:"\e681"}.fm-icon-s-search-o:before{content:"\e682"}.fm-icon-s-news:before{content:"\e683"}.fm-icon-s-news-o:before{content:"\e684"}.fm-icon-s-shop:before{content:"\e68c"}.fm-icon-s-sending:before{content:"\e60b"}.fm-icon-s-import-o:before{content:"\e60c"}.fm-icon-s-edit-o:before{content:"\e60d"}.fm-icon-s-qrcode:before{content:"\e60e"}.fm-icon-s-briefcase:before{content:"\e60f"}.fm-icon-s-notificationoff:before{content:"\e610"}.fm-icon-s-pencil:before{content:"\e611"}.fm-icon-s-star-o:before{content:"\e612"}.fm-icon-s-barcode:before{content:"\e613"}.fm-icon-s-salemessage-o:before{content:"\e614"}.fm-icon-s-listview-o:before{content:"\e615"}.fm-icon-s-picture-o:before{content:"\e616"}.fm-icon-s-savefillet-o:before{content:"\e617"}.fm-icon-s-shoppingcart:before{content:"\e618"}.fm-icon-s-pending:before{content:"\e61d"}.fm-icon-s-expandview-o:before{content:"\e61e"}.fm-icon-s-lock-o:before{content:"\e623"}.fm-icon-s-my:before{content:"\e692"}.fm-icon-s-service:before{content:"\e633"}.fm-icon-s-wallet-o:before{content:"\e634"}.fm-icon-s-shoppingcart-o:before{content:"\e636"}.fm-icon-s-setting-o:before{content:"\e637"}.fm-icon-s-my-o:before{content:"\e696"}.fm-icon-s-unfoldrec-o:before{content:"\e639"}.fm-icon-s-profile:before{content:"\e63a"}.fm-icon-s-link-o:before{content:"\e609"}.fm-icon-s-usersetting-o:before{content:"\e632"}.fm-icon-s-shop-o:before{content:"\e68a"}.fm-icon-s-list:before{content:"\e62a"}.fm-icon-s-location-o:before{content:"\e685"}.fm-icon-s-location:before{content:"\e686"}.fm-icon-s-moment:before{content:"\e689"}.fm-icon-s-moment-o:before{content:"\e68b"}.fm-icon-s-revoke-o:before{content:"\e687"}.fm-icon-s-submit-o:before{content:"\e688"}.fm-icon-s-app-o:before{content:"\e68f"}.fm-icon-s-app:before{content:"\e691"}.fm-icon-s-book-o:before{content:"\e695"}.fm-icon-s-book:before{content:"\e690"}.fm-icon-s-comment:before{content:"\e693"}.fm-icon-s-comment-o:before{content:"\e694"}.fm-icon-s-illustrate-o:before{content:"\e68d"}.fm-icon-s-clear-o:before{content:"\e68e"}.fm-icon-friend:before{content:"\e005"}.fm-icon-scan:before{content:"\e69a"}.fm-icon-back:before{content:"\e69b"}.fm-icon-menu:before{content:"\e69d"}:root{--fm-navbar-background: var(--fm-background-white);--fm-navbar-color: var(--fm-text-color);--fm-navbar-height: 44px;--fm-navbar-title-size: 17px;--fm-navbar-side-size: 16px;--fm-navbar-arrow-size: 18px}.fm-navbar{position:relative;z-index:9;display:flex;align-items:center;line-height:1.5;text-align:center;user-select:none;height:var(--fm-navbar-height);color:var(--fm-navbar-color);background-color:var(--fm-navbar-background)}.fm-navbar.fm-navbar-fixed{position:fixed;top:0;left:0;width:100%}.fm-navbar.fm-navbar-border-bottom{border-bottom:1px solid #eee;position:relative}@media (min-resolution: 1dppx){html:not([data-scale]) .fm-navbar.fm-navbar-border-bottom{border-bottom:none}html:not([data-scale]) .fm-navbar.fm-navbar-border-bottom:after{content:"";position:absolute;background-color:#eee;display:block;z-index:1;inset:auto auto 0 0;width:100%;height:1px;transform-origin:50% 100%;transform:scaleY(.5)}}.fm-navbar-title{max-width:60%;margin:0 auto;font-weight:500;font-size:var(--fm-navbar-title-size);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.fm-navbar-left,.fm-navbar-right{position:absolute;top:0;bottom:0;display:flex;align-items:center;max-width:30%;padding:0 16px;font-size:var(--fm-navbar-side-size);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;cursor:pointer}.fm-navbar-left{left:0}.fm-navbar-left:active{opacity:var(--fm-active-opacity)}.fm-navbar-left.fm-navbar-left-padding{padding-left:14px}.fm-navbar-right{right:0}.fm-navbar-right .fm-navbar-text:active{opacity:var(--fm-active-opacity)}.fm-navbar .fm-navbar-left-arrow{min-width:1em;margin-right:4px;font-size:var(--fm-navbar-arrow-size)}:root{--fm-input-group-size: var(--fm-font-size);--fm-input-group-color: var(--fm-text-color);--fm-input-group-sub-size: 13px;--fm-input-group-padding: 10px 16px;--fm-input-group-sub-color: var(--fm-text-color-light);--fm-input-group-border-color: var(--fm-gray-2)}.fm-input-group{display:flex;flex-direction:column;background-color:var(--fm-white)}.fm-input-group--padding{padding:var(--fm-input-group-padding)}.fm-input-group__body{flex:1;display:flex;align-items:center;min-height:24px}.fm-input-group__body--border{border:1px solid var(--fm-input-group-border-color);padding:4px 8px;border-radius:4px}.fm-input-group__control{display:flex;width:100%;min-width:0;margin:0;padding:0;border:0;resize:none;line-height:inherit;background-color:transparent;color:var(--fm-input-group-color);font-size:var(--fm-input-group-size);outline:none}.fm-input-group__control::placeholder{color:var(--fm-input-group-sub-color)}.fm-input-group__control:disabled{opacity:1;cursor:not-allowed;color:var(--fm-disabled-color);-webkit-text-fill-color:currentColor}.fm-input-group__control::-webkit-search-cancel-button{display:none}.fm-input-group__control--readonly{cursor:default;color:var(--fm-readonly-color)}.fm-input-group__control--left{justify-content:flex-start;text-align:left}.fm-input-group__control--center{justify-content:center;text-align:center}.fm-input-group__control--right{justify-content:flex-end;text-align:right}.fm-input-group__clear{cursor:pointer;margin-right:-8px;padding:4px 8px;color:var(--fm-input-group-sub-color);flex-shrink:0;box-sizing:content-box}.fm-input-group__left-icon{margin:auto 4px auto 0}.fm-input-group__right-icon{margin:auto 0 auto 4px}.fm-input-group__word-limit{margin-top:4px;line-height:18px;text-align:right;font-size:var(--fm-input-group-sub-size);color:var(--fm-input-group-sub-color)}.fm-radio-group{display:flex;overflow:visible;text-align:left;flex-wrap:wrap}.fm-radio-group--vertical{flex-direction:column}.fm-radio-group--vertical .fm-radio:not(:last-child){margin-bottom:8px}.fm-radio{margin-top:4px;margin-bottom:4px}:root,:host{--fm-rate-icon-size: 20px;--fm-rate-icon-gutter: var(--fm-padding-base);--fm-rate-icon-void-color: var(--fm-gray-4);--fm-rate-icon-full-color: var(--fm-orange-3);--fm-rate-icon-disabled-color: var(--fm-gray-4)}.fm-rate{display:inline-flex;cursor:pointer;user-select:none;flex-wrap:wrap}.fm-rate__item{position:relative}.fm-rate__item:not(:last-child){padding-right:var(--fm-rate-icon-gutter)}.fm-rate__icon{display:block;width:1em;color:var(--fm-rate-icon-void-color);font-size:var(--fm-rate-icon-size)}.fm-rate__icon--half{position:absolute;top:0;left:0;overflow:hidden;pointer-events:none;color:var(--fm-rate-icon-full-color)}.fm-rate__icon--full{color:var(--fm-rate-icon-full-color)}.fm-rate__icon--disabled{color:var(--fm-rate-icon-disabled-color)}.fm-rate--disabled{cursor:not-allowed}.fm-rate--readonly{cursor:default}:root{--fm-form-item-size: var(--fm-font-size);--fm-form-item-color: var(--fm-text-color);--fm-form-item-label-width: 105px;--fm-form-item-sub-size: 13px}.fm-form-item{font-size:var(--fm-form-item-size);color:var(--fm-form-item-color)}.fm-form-item--vertical{flex-direction:column}.fm-form-item--vertical .fm-form-item__label{margin-bottom:4px}.fm-form-item__label{display:flex;flex:none;align-items:flex-start;text-align:left;width:var(--fm-form-item-label-width);margin-right:4px}.fm-form-item__label--left{justify-content:flex-start}.fm-form-item__label--center{justify-content:center}.fm-form-item__label--right{justify-content:flex-end}.fm-form-item__label--required{position:relative}.fm-form-item__label--required .fm-cell__title-text:after{padding-left:2px;color:var(--fm-cell-required-color);font-size:12px;content:"*"}.fm-form-item__content{display:flex}.fm-form-item__content .fm-input-group{padding:0;flex:1}.fm-form-item__content--left{justify-content:flex-start}.fm-form-item__content--left input.fm-input-group__control{justify-content:flex-start;text-align:left}.fm-form-item__content--center{justify-content:center}.fm-form-item__content--center input.fm-input-group__control{justify-content:flex-center;text-align:center}.fm-form-item__content--right{justify-content:flex-end}.fm-form-item__content--right input.fm-input-group__control{justify-content:flex-end;text-align:right}.fm-form-item__error-message{color:var(--fm-danger-color);font-size:var(--fm-form-item-sub-size)}.fm-form-item__error-message--left{text-align:left}.fm-form-item__error-message--center{text-align:center}.fm-form-item__error-message--right{text-align:right}:root{--fm-overlay-background: rgba(0, 0, 0, .4);--fm-overlay-zindex: 98}.fm-overlay{width:100%;position:fixed;top:0;left:0;z-index:var(--fm-overlay-zindex);background-color:var(--fm-overlay-background);bottom:0}@supports ((bottom: constant(safe-area-inset-bottom)) or (bottom: env(safe-area-inset-bottom))) and (-webkit-overflow-scrolling: touch){.fm-overlay{bottom:constant(safe-area-inset-bottom);bottom:env(safe-area-inset-bottom)}}:root{--fm-popup-background: var(--fm-white);--fm-popup-zindex: var(--fm-zindex-3);--fm-popup-radius: 16px}.fm-popup{position:fixed;max-height:100%;overflow-y:auto;background-color:var(--fm-popup-background);transition:all var(--fm-duration-base);z-index:var(--fm-popup-zindex)}.fm-popup--center{top:50%;left:50%;transform:translate(-50%,-50%)}.fm-popup--center.fm-popup--round{border-radius:var(--fm-popup-radius)}.fm-popup--top,.fm-popup--bottom{left:0;right:0}.fm-popup--top{top:0}.fm-popup--top.fm-popup--round{border-radius:0 0 var(--fm-popup-radius) var(--fm-popup-radius)}.fm-popup--bottom{bottom:0}@supports ((bottom: constant(safe-area-inset-bottom)) or (bottom: env(safe-area-inset-bottom))) and (-webkit-overflow-scrolling: touch){.fm-popup--bottom{bottom:constant(safe-area-inset-bottom);bottom:env(safe-area-inset-bottom)}}.fm-popup--bottom.fm-popup--round{border-radius:var(--fm-popup-radius) var(--fm-popup-radius) 0 0}.fm-popup--left,.fm-popup--right{top:0;bottom:0}@supports ((bottom: constant(safe-area-inset-bottom)) or (bottom: env(safe-area-inset-bottom))) and (-webkit-overflow-scrolling: touch){.fm-popup--left,.fm-popup--right{bottom:constant(safe-area-inset-bottom);bottom:env(safe-area-inset-bottom)}}.fm-popup--left{left:0}.fm-popup--left.fm-popup--round{border-radius:0 var(--fm-popup-radius) var(--fm-popup-radius) 0}.fm-popup--right{right:0}.fm-popup--right.fm-popup--round{border-radius:var(--fm-popup-radius) 0 0 var(--fm-popup-radius)}:root{--fm-switch-background: var(--fm-text-color-light);--fm-switch-on-color: var(--fm-primary-color)}.fm-switch{position:relative;cursor:pointer;display:inline-block;transition:background-color var(--fm-duration-base);background-color:var(--fm-switch-background)}.fm-switch--disabled{cursor:not-allowed;opacity:var(--fm-disabled-opacity)}.fm-switch--readonly{cursor:default;opacity:var(--fm-readonly-opacity)}.fm-switch--loading{cursor:default}.fm-switch--on{background-color:var(--fm-switch-on-color)}.fm-switch--on .fm-switch__loadding{color:var(--fm-switch-on-color)}.fm-switch__node{display:flex;align-items:center;justify-content:center;position:absolute;top:1px;left:1px;z-index:1;width:28px;height:28px;border-radius:100%;background-color:var(--fm-white);transition:transform var(--fm-duration-base) cubic-bezier(.3,1.05,.4,1.05)}:root{--fm-toast-zindex: var(--fm-zindex-5);--fm-toast-color: var(--fm-white);--fm-toast-font-size: 16px;--fm-toast-background: var(--fm-gray-7);--fm-toast-icon-font-size: 48px}.fm-toast{position:fixed;top:50%;left:50%;display:-webkit-box;display:-webkit-flex;display:flex;flex-direction:column;align-items:center;justify-content:center;box-sizing:content-box;max-width:70%;padding:16px;line-height:20px;white-space:pre-wrap;text-align:center;word-wrap:break-word;border-radius:7px;transform:translate(-50%,-50%);color:var(--fm-toast-color);z-index:var(--fm-toast-zindex);font-size:var(--fm-toast-font-size);background-color:var(--fm-toast-background)}.fm-toast--top{top:50px;transform:translate(-50%)}.fm-toast--bottom{top:auto;bottom:50px}.fm-toast--info,.fm-toast--success,.fm-toast--warning,.fm-toast--error{width:88px;min-height:88px}.fm-toast__icon-wrapper{margin-bottom:8px}.fm-toast--default{padding:8px 16px}.fm-toast--loading{min-width:84px;min-height:84px}.fm-toast--loading-icon{position:relative;display:inline-block;width:30px;height:30px;margin-bottom:8px;vertical-align:middle;animation:fm-rotate 2s linear infinite}.fm-toast--loading-icon circle{animation:fm-circular 1.5s ease-in-out infinite;stroke:currentColor;stroke-width:4;stroke-linecap:round}:root{--fm-notify-color: var(--fm-white);--fm-notify-zindex: var(--fm-zindex-5);--fm-notify-info-background: var(--fm-primary-color);--fm-notify-success-background: var(--fm-success-color);--fm-notify-warning-background: var(--fm-warning-color);--fm-notify-error-background: var(--fm-danger-color)}.fm-notify{position:fixed;left:0;top:0;z-index:var(--fm-notify-zindex);display:flex;align-items:center;justify-content:center;width:100%;max-height:100%;padding:8px 16px;box-sizing:border-box;color:var(--fm-notify-color);font-size:14px;line-height:20px;white-space:pre-wrap;text-align:center;word-wrap:break-word;overflow-y:auto}.fm-notify--info{background-color:var(--fm-notify-info-background)}.fm-notify--success{background-color:var(--fm-notify-success-background)}.fm-notify--warning{background-color:var(--fm-notify-warning-background)}.fm-notify--error{background-color:var(--fm-notify-error-background)}:root{--fm-dialog-background: var(--fm-background-2);--fm-dialog-padding-top: 24px;--fm-dialog-padding-left: 16px;--fm-dialog-header-font-size: 17px;--fm-dialog-header-line-height: 24px;--fm-dialog-content-font-size: 15px;--fm-dialog-content-line-height: 20px;--fm-dialog-footer-height: 50px;--fm-border-color: var(--fm-gray-4)}@media screen and (min-width: 375px){.fm-dialog{width:320px}}@media screen and (min-width: 280px) and (max-width: 375px){.fm-dialog{width:240px}}.fm-dialog{display:flex;flex-direction:column;background-color:var(--fm-dialog-background);overflow:hidden}.fm-dialog__header{padding-top:var(--fm-dialog-padding-top);padding-left:var(--fm-dialog-header-padding-left);padding-right:var(--fm-dialog-header-padding-left);font-weight:var(--fm-font-bold-light);font-size:var(--fm-dialog-header-font-size);color:var(--fm-text-color);line-height:var(--fm-dialog-header-line-height);text-align:center}.fm-dialog__content{max-height:70vh;overflow-y:auto}.fm-dialog__content__message{padding:var(--fm-dialog-padding-top) var(--fm-dialog-padding-left);font-size:var(--fm-dialog-content-font-size);line-height:var(--fm-dialog-content-line-height);white-space:pre-wrap;text-align:center;word-wrap:break-word}.fm-dialog__content__message--has-title{padding-top:11px;color:var(--fm-text-color-light)}.fm-dialog__content--prompt{padding:14px}.fm-dialog__content--prompt__input{display:block}.fm-dialog__footer{display:flex;flex-direction:row;align-items:center;border-top:1px solid var(--fm-border-color);position:relative}@media (min-resolution: 1dppx){html:not([data-scale]) .fm-dialog__footer{border-top:none}html:not([data-scale]) .fm-dialog__footer:before{content:"";position:absolute;background-color:var(--fm-border-color);display:block;z-index:1;inset:0 auto auto 0;width:100%;height:1px;transform-origin:50% 50%;transform:scaleY(.5)}}.fm-dialog__footer .fm-button{border:0;height:var(--fm-dialog-footer-height);border-right:1px solid var(--fm-border-color);position:relative}@media (min-resolution: 1dppx){html:not([data-scale]) .fm-dialog__footer .fm-button{border-right:none}html:not([data-scale]) .fm-dialog__footer .fm-button:after{content:"";position:absolute;background-color:var(--fm-border-color);display:block;z-index:1;inset:0 0 auto auto;width:1px;height:100%;background:var(--fm-border-color);transform-origin:100% 50%;transform:scaleX(.5)}}.fm-dialog__footer .fm-button:last-child{border-right:0}.fm-dialog__footer .fm-button:last-child:after{display:none!important}.fm-dialog__footer .fm-button--default{color:var(--fm-text-color)}.fm-dialog__footer--is-column{flex-direction:column}.fm-dialog__footer--is-column__button{border-top:1px solid var(--fm-border-color);position:relative}@media (min-resolution: 1dppx){html:not([data-scale]) .fm-dialog__footer--is-column__button{border-top:none}html:not([data-scale]) .fm-dialog__footer--is-column__button:before{content:"";position:absolute;background-color:var(--fm-border-color);display:block;z-index:1;inset:0 auto auto 0;width:100%;height:1px;transform-origin:50% 50%;transform:scaleY(.5)}}.fm-dialog__footer--is-column__button:first-child{border-top:0}.fm-dialog__footer--is-column__button:first-child:before{display:none!important}.fm-dialog.fm-dialog--relative{position:relative}.fm-dialog.fm-dialog--relative__header{padding-right:40px}.fm-dialog__close{position:absolute;right:16px;top:16px;width:22px;height:22px;line-height:22px;text-align:center}.fm-dialog__close .fm-icon{font-size:15px;color:var(--fm-text-color-2)}:root,:host{--fm-loading-color: var(--fm-gray-5);--fm-loading-text-font-size: 14px;--fm-loading-text-line-height: 1.4}.fm-loading{display:flex;align-items:center;position:relative;color:var(--fm-loading-color)}.fm-loading__text{color:var(--fm-loading-color);font-size:var(--fm-loading-text-font-size);line-height:var(--fm-loading-text-line-height);margin-left:var(--fm-margin-xs)}.fm-loading--vertical{flex-direction:column}.fm-loading--vertical .fm-loading__text{margin-top:var(--fm-margin-xs);margin-left:0}.fm-loading__circular{display:block;animation:fm-rotate 2s linear infinite}.fm-loading__circular circle{animation:fm-circular 1.5s ease-in-out infinite;stroke:currentColor;stroke-width:3;stroke-linecap:round}.fm-loading__spinner{display:block;position:relative;animation:fm-rotate 1s linear infinite;animation-timing-function:steps(12)}.fm-loading__line{position:absolute;top:0;left:0;width:100%;height:100%}.fm-loading__line-inner{display:block;width:2px;height:25%;margin:0 auto;background-color:currentColor;border-radius:40%}.fm-loading__ring{display:block;animation:fm-rotate .75s linear infinite;border:4px solid;border-right-color:transparent;border-radius:50%}@keyframes fm-circular{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40}to{stroke-dasharray:90,150;stroke-dashoffset:-120}}.fm-loading__line--1{transform:rotate(30deg);opacity:1}.fm-loading__line--2{transform:rotate(60deg);opacity:.9375}.fm-loading__line--3{transform:rotate(90deg);opacity:.875}.fm-loading__line--4{transform:rotate(120deg);opacity:.8125}.fm-loading__line--5{transform:rotate(150deg);opacity:.75}.fm-loading__line--6{transform:rotate(180deg);opacity:.6875}.fm-loading__line--7{transform:rotate(210deg);opacity:.625}.fm-loading__line--8{transform:rotate(240deg);opacity:.5625}.fm-loading__line--9{transform:rotate(270deg);opacity:.5}.fm-loading__line--10{transform:rotate(300deg);opacity:.4375}.fm-loading__line--11{transform:rotate(330deg);opacity:.375}.fm-loading__line--12{transform:rotate(360deg);opacity:.3125}:root,:host{--fm-pull-refresh-head-height: 50px;--fm-pull-refresh-head-font-size: var(--fm-font-size-md);--fm-pull-refresh-head-text-color: var(--fm-text-color-light);--fm-pull-refresh-animation-duration: .3s}.fm-pull-refresh{overflow:hidden}.fm-pull-refresh__track{position:relative;height:100%}.fm-pull-refresh__track--not-pulling{transition:transform ease var(--fm-pull-refresh-animation-duration)}.fm-pull-refresh__head{position:absolute;left:0;width:100%;height:var(--fm-pull-refresh-head-height);color:var(--fm-pull-refresh-head-text-color);font-size:var(--fm-pull-refresh-head-font-size);line-height:var(--fm-pull-refresh-head-height);text-align:center;transform:translateY(-100%);display:flex;justify-content:center;align-items:center;flex-direction:column;overflow:hidden}:root,:host{--fm-list-text-color: var(--fm-gray-5);--fm-list-text-font-size: var(--fm-font-size-md, 14px);--fm-list-text-line-height: 50px;--fm-list-loading-icon-size: 16px}.fm-list__loading,.fm-list__error,.fm-list__load-more,.fm-list__finished-info{color:var(--fm-list-text-color);font-size:var(--fm-list-text-font-size);line-height:var(--fm-list-text-line-height);text-align:center}.fm-list__loading-container{display:flex;height:var(--fm-list-text-line-height);justify-content:center;align-items:center}:root,:host{--fm-listview-checkbox-container-width: 40px;--fm-listview-toolbar-height: 42px;--fm-listview-split-line-color: rgb(230, 235, 235);--fm-listview-empty-text-color: var(--fm-gray-5);--fm-listview-empty-text-font-size: var(--fm-font-size-md, 14px);--fm-listview-empty-text-line-height: 50px}.fm-list-view--fill{height:100%;flex-grow:1;flex-shrink:1;display:flex;flex-direction:column;overflow:hidden}.fm-list-view--fill .fm-list-view__track{flex:1 1 0;overflow:auto;-webkit-overflow-scrolling:touch}.fm-list-view--fill .fm-pull-refresh{min-height:100%}.fm-list-view .fm-list{user-select:none;-webkit-user-select:none}.fm-list-view__item{display:flex;position:relative;overflow:hidden}.fm-list-view__item-checker{display:flex;position:absolute;height:100%;width:var(--fm-listview-checkbox-container-width);justify-content:center;align-items:center}.fm-list-view__item-content{flex:1;transform:translate(0)}.fm-list-view__content--split .fm-list-view__item:not(:last-child):not(.fm-list-view__item--child){border-bottom:1px solid var(--fm-listview-split-line-color)}.fm-list-view--multi-select .fm-list-view__item-content{transform:translate(var(--fm-listview-checkbox-container-width))}.fm-list-view__item--group{display:block}.fm-list-view__item-group-header{padding:10px 16px;line-height:20px;font-size:var(--fm-font-size-md);color:var(--fm-gray-5)}.fm-list-view__empty-message{display:block;color:var(--fm-listview-empty-text-color);font-size:var(--fm-listview-empty-text-font-size);line-height:var(--fm-listview-empty-text-line-height);text-align:center}.fm-list-view__item-text{padding:13px 20px;color:var(--fm-gray-7);font-size:var(--fm-font-size)}.fm-list-view__toolbar{display:flex;align-items:center;height:var(--fm-listview-toolbar-height)}.fm-list-view__toolbar-item{flex:1}:root,:host{--fm-swipe-cell-button-text-color: var(--fm-white);--fm-swipe-cell-button-bg-color: var(--fm-gray-4);--fm-swipe-cell-button-font-size: var(--fm-font-size);--fm-swipe-cell-button-icon-size: var(--fm-font-size);--fm-swipe-cell-button-padding: var(--fm-padding-md)}.fm-swipe-cell{position:relative;overflow:hidden}.fm-swipe-cell__wrapper{transition-timing-function:cubic-bezier(.18,.89,.32,1);transition-property:transform}.fm-swipe-cell__left,.fm-swipe-cell__right{position:absolute;top:0;height:100%;display:flex}.fm-swipe-cell__left{left:0;transform:translate3d(-100%,0,0);flex-direction:row-reverse}.fm-swipe-cell__right{right:0;transform:translate3d(100%,0,0)}.fm-swipe-cell__button{display:inline-flex;justify-content:center;align-items:center;height:100%;padding:0 var(--fm-swipe-cell-button-padding);color:var(--fm-swipe-cell-button-text-color);background-color:var(--fm-swipe-cell-button-bg-color)}.fm-swipe-cell__icon{font-size:var(--fm-swipe-cell-button-icon-size)}.fm-swipe-cell__text{font-size:var(--fm-swipe-cell-button-font-size)}.fm-swipe-cell__icon+.fm-swipe-cell__text:not(:empty){margin-left:6px}:root,:host{--fm-action-sheet-max-height: 80%;--fm-action-sheet-border-radius: 12px;--fm-action-sheet-description-color: var(--fm-gray-5);--fm-action-sheet-description-line-height: 22px;--fm-action-sheet-description-font-size: var(--fm-font-size-md);--fm-action-sheet-description-padding: 12px 16px;--fm-action-sheet-item-default-background: var(--fm-background-white);--fm-action-sheet-item-active-background: #f2f3f5;--fm-action-sheet-item-padding: 13px 16px;--fm-action-sheet-item-text-color: #1a1a1a;--fm-action-sheet-item-disabled-text-color: #bdbdbd;--fm-action-sheet-item-subtitle-color: var(--fm-gray-5);--fm-action-sheet-item-icon-size: 18px;--fm-action-sheet-item-icon-margin-right: 8px;--fm-action-sheet-item-title-font-size: var(--fm-font-size-lg);--fm-action-sheet-item-title-line-height: 24px;--fm-action-sheet-item-subtitle-font-size: var(--fm-font-size-sm);--fm-action-sheet-item-subtitle-line-height: 18px;--fm-action-sheet-item-subtitle-margin-top: 2px;--fm-action-sheet-footer-gap-color: #f5f5f5;--fm-action-sheet-divider-color: #e7e7e7;--fm-action-sheet-cancel-height: 48px;--fm-action-sheet-cancel-color: #1a1a1a;--fm-action-sheet-cancel-font-size: var(--fm-font-size-lg);--fm-action-sheet-cancel-font-weight: 500}.fm-action-sheet{display:flex;flex-direction:column;max-height:var(--fm-action-sheet-max-height);overflow:hidden;user-select:none}.fm-action-sheet--round{border-top-left-radius:var(--fm-action-sheet-border-radius);border-top-right-radius:var(--fm-action-sheet-border-radius)}.fm-action-sheet__description{flex-shrink:0;color:var(--fm-action-sheet-description-color);line-height:var(--fm-action-sheet-description-line-height);font-size:var(--fm-action-sheet-description-font-size);text-align:center;padding:var(--fm-action-sheet-description-padding);position:relative}.fm-action-sheet__description--left{text-align:left}.fm-action-sheet__content{flex:1 auto;overflow-y:auto;-webkit-overflow-scrolling:touch}.fm-action-sheet__item,.fm-action-sheet__cancel{background-color:var(--fm-action-sheet-item-default-background)}.fm-action-sheet__item:active,.fm-action-sheet__cancel:active{background-color:var(--fm-action-sheet-item-active-background)}.fm-action-sheet__item{display:flex;position:relative;flex-wrap:wrap;align-items:center;justify-content:center;text-align:center;padding:var(--fm-action-sheet-item-padding);color:var(--fm-action-sheet-item-text-color);cursor:pointer}.fm-action-sheet__item-icon{font-size:var(--fm-action-sheet-item-icon-size);margin-right:var(--fm-action-sheet-item-icon-margin-right)}.fm-action-sheet__item-title{font-size:var(--fm-action-sheet-item-title-font-size);line-height:var(--fm-action-sheet-item-title-line-height)}.fm-action-sheet__item-subtitle{font-size:var(--fm-action-sheet-item-subtitle-font-size);line-height:var(--fm-action-sheet-item-subtitle-line-height);width:100%;margin-top:var(--fm-action-sheet-item-subtitle-margin-top);color:var(--fm-action-sheet-item-subtitle-color);overflow-wrap:break-word}.fm-action-sheet__item--left{text-align:left;justify-content:flex-start}.fm-action-sheet__item--disabled{color:var(--fm-action-sheet-item-disabled-text-color);cursor:not-allowed}.fm-action-sheet__item--disabled:active{background-color:var(--fm-action-sheet-item-default-background)}.fm-action-sheet__description:after,.fm-action-sheet__item:after{content:"";display:block;position:absolute;height:1px;bottom:0;left:0;right:0;transform:scaleY(.5);background-color:var(--fm-action-sheet-divider-color)}.fm-action-sheet__footer-gap{height:8px;background-color:var(--fm-action-sheet-footer-gap-color)}.fm-action-sheet__cancel{display:flex;flex-direction:column;justify-content:center;align-items:center;height:var(--fm-action-sheet-cancel-height);cursor:pointer;color:var(--fm-action-sheet-cancel-color);font-size:var(--fm-action-sheet-cancel-font-size);font-weight:var(--fm-action-sheet-cancel-font-weight)}:root{--fm-tab-bar-item-color: var(--fm-text-color);--fm-tab-bar-item-active-color: var(--fm-primary-color);--fm-tab-bar-item-font-size: 16px}.fm-tab-bar-item{flex:1 0 auto;position:relative;display:inline-flex;align-items:center;justify-content:center;margin:0 12px;line-height:44px}.fm-tab-bar-item--actived{color:var(--fm-tab-bar-item-active-color)}.fm-tab-bar-item--disabled{color:var(--fm-disabled-color)}.fm-tab-bar-item--dot .fm-tab-bar-item__text:after{content:"";position:absolute;top:0;right:0;width:8px;height:8px;background-color:var(--fm-danger-color);border-radius:100%;transform:translate(100%,100%)}.fm-tab-bar-item__text{position:relative;display:flex;justify-content:center;min-width:40px}.fm-tab-bar-item__ink{position:absolute;bottom:0;left:0;right:0;height:4px;background-color:var(--fm-tab-bar-item-active-color);border-radius:2px}.fm-tab-bar-item__badge{position:absolute;top:2px;right:0;padding:0 4px;max-width:28px;font-weight:500;font-size:12px;line-height:14px;border-radius:7px;color:var(--fm-background-white);background-color:var(--fm-danger-color);transform:translate(50%)}.fm-tab-bar-item__icon{position:relative;display:flex;align-items:center;justify-content:center;padding-right:4px}:root{--fm-tab-bar-height: 44px;--fm-tab-bar-background: var(--fm-background-white);--fm-tab-bar-color: var(--fm-text-color);--fm-tab-bar-active-color: var(--fm-primary-color);--fm-tab-bar-font-size: 16px}.fm-tab-bar{position:relative;background:var(--fm-tab-bar-background);color:var(--fm-tab-bar-color);font-size:var(--fm-tab-bar-font-size)}.fm-tab-bar--bottom-line{border-bottom:1px solid #ddd;position:relative}@media (min-resolution: 1dppx){html:not([data-scale]) .fm-tab-bar--bottom-line{border-bottom:none}html:not([data-scale]) .fm-tab-bar--bottom-line:after{content:"";position:absolute;background-color:#ddd;display:block;z-index:1;inset:auto auto 0 0;width:100%;height:1px;transform-origin:50% 100%;transform:scaleY(.5)}}.fm-tab-bar__scroll-wrapper{position:relative;width:100%;overflow:hidden}.fm-tab-bar__list{display:flex;justify-content:space-between;min-width:100%;transition:all .3s cubic-bezier(.17,.89,.45,1)}.fm-tab-bar__ink{position:absolute;bottom:0;left:0;display:block;height:4px;background-color:var(--fm-tab-bar-active-color);transition:all var(--fm-duration-base);border-radius:2px}.fm-tab-bar__ink--disabled{background-color:var(--fm-disabled-color)}.fm-tabs{overflow:hidden}.fm-tabs__content{display:flex}.fm-tab{display:block;flex-shrink:0;width:100%;height:100%;overflow:auto;word-break:break-all}.fm-tab--collapse{height:0;overflow:visible}:root{--fm-tag-padding: 0 6px;--fm-tag-height: 18px;--fm-tag-font-size: 12px;--fm-tag-border-radius: 2px;--fm-tag-color: var(--fm-white)}.fm-tag{position:relative;display:inline-flex;align-items:center;white-space:nowrap;padding:0 4px;color:var(--fm-tag-color);font-size:var(--fm-tag-font-size);line-height:var(--fm-tag-height);border-radius:var(--fm-tag-border-radius)}.fm-tag--primary{background-color:var(--fm-primary-color)}.fm-tag--success{background-color:var(--fm-success-color)}.fm-tag--danger{background-color:var(--fm-danger-color)}.fm-tag--warning{background-color:var(--fm-warning-color)}.fm-tag--plain{background-color:var(--fm-white)}.fm-tag--plain.fm-tag--primary{border:1px solid var(--fm-primary-color);color:var(--fm-primary-color)}.fm-tag--plain.fm-tag--success{border:1px solid var(--fm-success-color);color:var(--fm-success-color)}.fm-tag--plain.fm-tag--warning{border:1px solid var(--fm-warning-color);color:var(--fm-warning-color)}.fm-tag--plain.fm-tag--danger{border:1px solid var(--fm-danger-color);color:var(--fm-danger-color)}.fm-tag--medium{padding:2px 6px}.fm-tag--large{padding:4px 8px;font-size:14px;border-radius:4px}.fm-tag--round{border-radius:100px}.fm-tag--mark{border-radius:0 100px 100px 0}.fm-tag__close{font-size:8px;margin-left:4px}.fm-tag--large .fm-tag__close{font-size:10px}:root{--fm-picker-background: var(--fm-white);--fm-picker-toolbar-height: 44px}.fm-picker{position:relative;background-color:var(--fm-picker-background);user-select:none}.fm-picker__toolbar{display:flex;justify-content:space-between;align-items:center;height:var(--fm-picker-toolbar-height)}.fm-picker__toolbar-left,.fm-picker__toolbar-right{padding:0 16px}.fm-picker__toolbar-title{font-weight:500;font-size:16px;max-width:50%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.fm-picker__content{position:relative;display:flex;cursor:grab}.fm-picker__columns{display:flex;flex:1;overflow:hidden}.fm-picker__column{flex:1}.fm-picker__column-item{display:flex;align-items:center;justify-content:center;height:44px}.fm-picker__mask{position:absolute;top:0;left:0;z-index:1;width:100%;height:100%;background-image:linear-gradient(180deg,#ffffffe6,#fff6),linear-gradient(0deg,#ffffffe6,#fff6);background-repeat:no-repeat;background-position:top,bottom;transform:translateZ(0);pointer-events:none}.fm-picker__frame{position:absolute;top:50%;left:16px;right:16px;height:88px;z-index:2;pointer-events:none;border-width:1px 0;border-style:solid;border-color:#ebedf0;transform:translateY(-50%) scaleY(.5)}.fm-picker-group__header{text-align:left}.fm-picker-group__toolbar{display:flex;justify-content:space-between;align-items:center;height:var(--fm-picker-toolbar-height)}.fm-picker-group__toolbar-left,.fm-picker-group__toolbar-right{padding:0 16px}.fm-picker-group__toolbar-title{font-weight:500;font-size:16px;max-width:50%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.fm-picker-group__tab-bar{display:inline-block}.fm-page-container{flex:1;display:flex;flex-direction:column;background:#f9fafb;overflow:hidden;-webkit-overflow-scrolling:auto;position:absolute;inset:0}.fm-page-body-container{flex-basis:0;flex-shrink:1;flex-grow:1;padding-bottom:12px;overflow:auto;display:flex;flex-direction:column}.fm-page-header-container{flex-shrink:0}.fm-page-footer-container{background-color:#fff} diff --git a/packages/mobile-designer/public/assets/monaco-editor.config.json b/packages/mobile-designer/public/assets/monaco-editor.config.json new file mode 100644 index 0000000000000000000000000000000000000000..f3c810396986a6fc4095b63fe1f27f26d26546e2 --- /dev/null +++ b/packages/mobile-designer/public/assets/monaco-editor.config.json @@ -0,0 +1,4 @@ +{ + "vsPath": "/assets/monaco-editor/min/vs" +} + diff --git a/packages/mobile-designer/public/assets/template-rules/card-fill-in-form-template.json b/packages/mobile-designer/public/assets/template-rules/card-fill-in-form-template.json new file mode 100644 index 0000000000000000000000000000000000000000..1138d231611fff88f61eeaba50ba6d92fe33ddad --- /dev/null +++ b/packages/mobile-designer/public/assets/template-rules/card-fill-in-form-template.json @@ -0,0 +1,14 @@ +{ + "f-page-layout": { + "description": "页面主区域容器", + "canAccept": false, + "canMove": false, + "canDelete": false + }, + "f-page-container": { + "description": "页面中心区域", + "canAccept": true, + "canMove": false, + "canDelete": false + } +} \ No newline at end of file diff --git a/packages/mobile-designer/public/assets/template-rules/card-template.json b/packages/mobile-designer/public/assets/template-rules/card-template.json new file mode 100644 index 0000000000000000000000000000000000000000..e4893b36cf096703fb0500987073ff201a1111f2 --- /dev/null +++ b/packages/mobile-designer/public/assets/template-rules/card-template.json @@ -0,0 +1,45 @@ +{ + + "f-struct-like-card": { + "description": "页面主区域like-card,若只有一个,那么不可移动、删除,但可以接收控件", + "canAccept": true, + "canMove": { + "invalidContext": [ + { + "parent": { + "class": "f-page-main", + "isUnique": true + } + }, + { + "parent": { + "class": "f-scrollspy-content", + "isUnique": true + } + } + ] + }, + "canDelete": { + "invalidContext": [ + { + "parent": { + "class": "f-page-main", + "isUnique": true + } + }, + { + "parent": { + "class": "f-scrollspy-content", + "isUnique": true + } + } + ] + } + }, + "f-scrollspy-content": { + "description": "滚动监听容器", + "canMove": false, + "canDelete": false, + "canAccept": false + } +} \ No newline at end of file diff --git a/packages/mobile-designer/public/assets/template-rules/common.json b/packages/mobile-designer/public/assets/template-rules/common.json new file mode 100644 index 0000000000000000000000000000000000000000..192e509fe036ea07b05689822c0bc37a0434ddc9 --- /dev/null +++ b/packages/mobile-designer/public/assets/template-rules/common.json @@ -0,0 +1,429 @@ +{ + "f-page": { + "description": "页面根容器", + "canAccept": false, + "canMove": false, + "canDelete": false + }, + "f-page-header": { + "description": "页面头部", + "canAccept": false, + "canMove": false, + "canDelete": false + }, + "f-page-main": { + "description": "页面主区域", + "canMove": { + "invalidContext": [ + { + "parent": [ + { + "class": "f-page" + } + ] + } + ] + }, + "canDelete": { + "invalidContext": [ + { + "parent": [ + { + "class": "f-page" + } + ] + } + ] + }, + "canAccept": false + }, + "f-grid-is-sub": { + "description": "表格组件的父级容器", + "canAccept": { + "invalidContext": [ + { + "parent": { + "class": "f-struct-is-subgrid" + }, + "firstLevelChild": { + "class": "f-component-grid" + } + }, + { + "parent": { + "class": "f-struct-is-subgrid" + }, + "firstLevelChild": { + "class": "f-component-treetable" + } + } + ] + }, + "canMove": { + "invalidContext": [ + { + "parent": { + "class": "f-struct-is-subgrid" + }, + "firstLevelChild": { + "class": "f-component-grid" + } + }, + { + "parent": { + "class": "f-struct-is-subgrid" + }, + "firstLevelChild": { + "class": "f-component-treetable" + } + } + ] + }, + "canDelete": { + "invalidContext": [ + { + "parent": { + "class": "f-struct-is-subgrid" + }, + "firstLevelChild": { + "class": "f-component-grid" + } + }, + { + "parent": { + "class": "f-struct-is-subgrid" + }, + "firstLevelChild": { + "class": "f-component-treetable" + } + } + ] + } + }, + "f-section-grid": { + "description": "表格组件内的父级分组面板", + "canMove": { + "invalidContext": [ + { + "parent": [ + { + "class": "f-struct-wrapper" + } + ], + "contents": [ + { + "class": "f-component-grid" + } + ] + } + ] + }, + "canDelete": { + "invalidContext": [ + { + "parent": [ + { + "class": "f-struct-wrapper" + } + ], + "contents": [ + { + "class": "f-component-grid" + } + ] + } + ] + }, + "canAccept": { + "invalidContext": [ + { + "parent": [ + { + "class": "f-struct-wrapper" + } + ], + "contents": [ + { + "class": "f-component-grid" + } + ] + } + ] + } + }, + "f-struct-wrapper": { + "description": "子表分组面板的父容器(container>section>component-ref)、子表tab的父容器(container>section>tab)", + "canMove": true, + "canDelete": true, + "canAccept": { + "invalidContext": [ + { + "firstLevelChild": { + "type": "section", + "class": "f-section-tabs" + }, + "secondLevelChild": { + "type": "tabs" + } + }, + { + "firstLevelChild": { + "type": "section", + "class": "f-section-in-main" + }, + "secondLevelChild": { + "type": "component-ref" + } + }, + { + "firstLevelChild": { + "type": "section", + "class": "f-section-in-mainsubcard" + }, + "secondLevelChild": { + "type": "component-ref" + } + } + ] + } + }, + "f-section-form": { + "description": "卡片面板的父级分组面板、附件的父级分组面板", + "canMove": { + "invalidContext": [ + { + "parent": { + "type": "component" + }, + "firstLevelChild": { + "class": "f-form-layout" + } + }, + { + "parent": { + "type": "component" + }, + "firstLevelChild": { + "type": "uploader" + } + } + ] + }, + "canDelete": { + "invalidContext": [ + { + "parent": { + "type": "component" + }, + "firstLevelChild": { + "class": "f-form-layout" + } + }, + { + "parent": { + "type": "component" + }, + "firstLevelChild": { + "type": "uploader" + } + } + ] + }, + "canAccept": { + "invalidContext": [ + { + "parent": { + "type": "component" + }, + "firstLevelChild": { + "class": "f-form-layout" + } + }, + { + "parent": { + "type": "component" + }, + "firstLevelChild": { + "type": "uploader" + } + } + ] + } + }, + "f-form-layout": { + "description": "卡片面板", + "canDelete": false, + "canAccept": true, + "canMove": false + }, + "f-component-tabs": { + "description": "子表区域固定层级:container>section>tabs", + "canDelete": false, + "canAccept": false, + "canMove": false + }, + "f-component-grid": { + "description": "表格组件", + "canDelete": false, + "canAccept": false, + "canMove": false + }, + "f-section-in-mainsubcard": { + "description": "子表区域的父级section,container>section>tabs或者container>section>component-ref", + "canMove": { + "invalidContext": [ + { + "parent": { + "class": "f-struct-wrapper" + }, + "firstLevelChild": { + "class": "f-component-tabs" + } + }, + { + "parent": { + "class": "f-struct-wrapper" + }, + "firstLevelChild": { + "type": "component-ref" + } + } + ] + }, + "canDelete": { + "invalidContext": [ + { + "parent": { + "class": "f-struct-wrapper" + }, + "firstLevelChild": { + "class": "f-component-tabs" + } + }, + { + "parent": { + "class": "f-struct-wrapper" + }, + "firstLevelChild": { + "type": "component-ref" + } + } + ] + }, + "canAccept": { + "invalidContext": [ + { + "parent": { + "class": "f-struct-wrapper" + }, + "firstLevelChild": { + "class": "f-component-tabs" + } + }, + { + "parent": { + "class": "f-struct-wrapper" + }, + "firstLevelChild": { + "type": "component-ref" + } + } + ] + } + }, + "f-section-in-main": { + "description": "子表区域的父级section,container>section>tabs或者container>section>component-ref", + "canMove": { + "invalidContext": [ + { + "parent": { + "class": "f-struct-wrapper" + }, + "firstLevelChild": { + "class": "f-component-tabs" + } + }, + { + "parent": { + "class": "f-struct-wrapper" + }, + "firstLevelChild": { + "type": "component-ref" + } + } + ] + }, + "canDelete": { + "invalidContext": [ + { + "parent": { + "class": "f-struct-wrapper" + }, + "firstLevelChild": { + "class": "f-component-tabs" + } + }, + { + "parent": { + "class": "f-struct-wrapper" + }, + "firstLevelChild": { + "type": "component-ref" + } + } + ] + }, + "canAccept": { + "invalidContext": [ + { + "parent": { + "class": "f-struct-wrapper" + }, + "firstLevelChild": { + "class": "f-component-tabs" + } + }, + { + "parent": { + "class": "f-struct-wrapper" + }, + "firstLevelChild": { + "type": "component-ref" + } + } + ] + } + }, + "f-page-content": { + "description": "分栏面板", + "canMove": false, + "canDelete": false, + "canAccept": false + }, + "f-page-content-nav": { + "description": "分栏面板导航区域(左侧)", + "canMove": false, + "canDelete": false, + "canAccept": false + }, + "f-page-content-main": { + "description": "分栏面板主区域(右侧)", + "canMove": false, + "canDelete": false, + "canAccept": true + }, + "f-section-scheme": { + "description": "筛选方案的外层Section", + "canMove": true, + "canDelete": true, + "canAccept": { + "invalidContext": [ + { + "firstLevelChild": { + "type": "query-solution" + } + } + ] + } + } +} \ No newline at end of file diff --git a/packages/mobile-designer/public/assets/template-rules/double-list-template.json b/packages/mobile-designer/public/assets/template-rules/double-list-template.json new file mode 100644 index 0000000000000000000000000000000000000000..6e2129c22e98daba47ae91ed51fb82b9a00fc7da --- /dev/null +++ b/packages/mobile-designer/public/assets/template-rules/double-list-template.json @@ -0,0 +1,32 @@ +{ + "f-struct-wrapper": { + "description": "双列表模板主表表格", + "canMove": { + "invalidContext": [ + { + "parent": { + "class": "f-page-content-nav" + } + } + ] + }, + "canDelete": { + "invalidContext": [ + { + "parent": { + "class": "f-page-content-nav" + } + } + ] + }, + "canAccept": { + "invalidContext": [ + { + "parent": { + "class": "f-page-content-nav" + } + } + ] + } + } +} \ No newline at end of file diff --git a/packages/mobile-designer/public/assets/template-rules/list-card-template.json b/packages/mobile-designer/public/assets/template-rules/list-card-template.json new file mode 100644 index 0000000000000000000000000000000000000000..ad09c122e5ad26439529ecff5cc92d52ba6a2d97 --- /dev/null +++ b/packages/mobile-designer/public/assets/template-rules/list-card-template.json @@ -0,0 +1,23 @@ +{ + "f-struct-wrapper": { + "description": "表格组件", + "canMove": { + "invalidContext": [ + { + "parent": { + "class": "f-page-content-nav" + } + } + ] + }, + "canDelete": { + "invalidContext": [ + { + "parent": { + "class": "f-page-content-nav" + } + } + ] + } + } +} \ No newline at end of file diff --git a/packages/mobile-designer/public/assets/template-rules/list-template.json b/packages/mobile-designer/public/assets/template-rules/list-template.json new file mode 100644 index 0000000000000000000000000000000000000000..830be9b3f14f76f38a9d4d5b55bf909916924bef --- /dev/null +++ b/packages/mobile-designer/public/assets/template-rules/list-template.json @@ -0,0 +1,32 @@ +{ + "f-struct-wrapper": { + "description": "管理列表的表格", + "canMove": { + "invalidContext": [ + { + "parent": { + "class": "f-page-main" + } + } + ] + }, + "canDelete": { + "invalidContext": [ + { + "parent": { + "class": "f-page-main" + } + } + ] + }, + "canAccept": { + "invalidContext": [ + { + "parent": { + "class": "f-page-main" + } + } + ] + } + } +} \ No newline at end of file diff --git a/packages/mobile-designer/public/assets/template-rules/tree-card-template.json b/packages/mobile-designer/public/assets/template-rules/tree-card-template.json new file mode 100644 index 0000000000000000000000000000000000000000..da3232b152cf736503893bc57307f0694bb9b15e --- /dev/null +++ b/packages/mobile-designer/public/assets/template-rules/tree-card-template.json @@ -0,0 +1,74 @@ +{ + "f-struct-wrapper": { + "description": "表格组件", + "canMove": { + "invalidContext": [ + { + "parent": { + "class": "f-page-content-nav" + } + } + ] + }, + "canDelete": { + "invalidContext": [ + { + "parent": { + "class": "f-page-content-nav" + } + } + ] + } + }, + "f-section-treegrid": { + "description": "树表格组件的父级分组面板", + "canMove": { + "invalidContext": [ + { + "parent": [ + { + "class": "f-struct-wrapper" + } + ], + "contents": [ + { + "class": "f-component-treetable" + } + ] + } + ] + }, + "canDelete": { + "invalidContext": [ + { + "parent": [ + { + "class": "f-struct-wrapper" + } + ], + "contents": [ + { + "class": "f-component-treetable" + } + ] + } + ] + }, + "canAccept": { + "invalidContext": [ + { + "parent": [ + { + "class": "f-struct-wrapper" + } + ], + "contents": [ + { + "class": "f-component-treetable" + } + ] + } + ] + } + } +} \ No newline at end of file diff --git a/packages/mobile-designer/public/assets/template-rules/tree-list-template.json b/packages/mobile-designer/public/assets/template-rules/tree-list-template.json new file mode 100644 index 0000000000000000000000000000000000000000..6dc69c872df09bc574556f2976e851f826faa835 --- /dev/null +++ b/packages/mobile-designer/public/assets/template-rules/tree-list-template.json @@ -0,0 +1,83 @@ +{ + "f-struct-wrapper": { + "description": "左树右列表模板的树组件", + "canMove": { + "invalidContext": [ + { + "parent": { + "class": "f-page-content-nav" + } + } + ] + }, + "canDelete": { + "invalidContext": [ + { + "parent": { + "class": "f-page-content-nav" + } + } + ] + }, + "canAccept": { + "invalidContext": [ + { + "parent": { + "class": "f-page-content-nav" + } + } + ] + } + }, + "f-section-treegrid": { + "description": "树表格组件的父级分组面板", + "canMove": { + "invalidContext": [ + { + "parent": [ + { + "class": "f-struct-wrapper" + } + ], + "contents": [ + { + "class": "f-component-treetable" + } + ] + } + ] + }, + "canDelete": { + "invalidContext": [ + { + "parent": [ + { + "class": "f-struct-wrapper" + } + ], + "contents": [ + { + "class": "f-component-treetable" + } + ] + } + ] + }, + "canAccept": { + "invalidContext": [ + { + "parent": [ + { + "class": "f-struct-wrapper" + } + ], + "contents": [ + { + "class": "f-component-treetable" + } + ] + } + ] + } + } +} \ No newline at end of file diff --git a/packages/mobile-designer/public/designer-canvas/date-navigation.json b/packages/mobile-designer/public/designer-canvas/date-navigation.json new file mode 100644 index 0000000000000000000000000000000000000000..7daf6525164ddc7c126adead823f46dd7403ccea --- /dev/null +++ b/packages/mobile-designer/public/designer-canvas/date-navigation.json @@ -0,0 +1,96 @@ +{ + "id": "root-component", + "type": "component", + "componentType": "frame", + "contents": [ + { + "id": "root-layout", + "type": "content-container", + "appearance": { + "class": "f-page f-page-navigate f-page-is-listnav" + }, + "size": null, + "contents": [ + { + "id": "root-layout-content", + "type": "content-container", + "appearance": { + "class": "f-page-main" + }, + "size": null, + "contents": [ + { + "id": "page-content", + "type": "layout", + "appearance": { + "class": "f-page-content" + }, + "size": null, + "contents": [ + { + "id": "list-nav", + "type": "layout-pane", + "position": "left", + "width": "400", + "contents": [ + { + "id": "page-header", + "type": "page-header", + "icon": "f-icon f-icon-page-title-administer", + "title": "预约日历" + }, + { + "id": "schedule-content", + "type": "section", + "contents": [ + { + "id": "date-view-navgigation", + "type": "date-view" + } + ] + } + ] + }, + { + "id": "page-content-main", + "type": "layout-pane", + "position": "center", + "contents": [ + { + "id": "page-content-layout", + "type": "content-container", + "appearance": { + "class": "f-page f-page-is-managelist " + }, + "contents": [ + { + "id": "page-main", + "type": "content-container", + "appearance": { + "class": "f-page-main" + }, + "contents": [ + { + "id": "schedule-content", + "type": "section", + "contents": [ + { + "id": "schedule", + "type": "calendar" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/packages/mobile-designer/public/designer-canvas/drag-over.json b/packages/mobile-designer/public/designer-canvas/drag-over.json new file mode 100644 index 0000000000000000000000000000000000000000..0c9297e2b00054b873c6fba7c136967ef7cc2951 --- /dev/null +++ b/packages/mobile-designer/public/designer-canvas/drag-over.json @@ -0,0 +1,537 @@ +{ + "id": "root-component", + "type": "component", + "componentType": "frame", + "contents": [ + { + "id": "root-layout", + "type": "content-container", + "appearance": { + "class": "f-page f-page-navigate f-page-is-grid-card" + }, + "contents": [ + { + "id": "page-header", + "type": "page-header", + "appearance": { + "class": "f-page-header" + }, + "icon": "f-icon f-icon-page-title-dictionary", + "title": "项目字典", + "toolbar": { + "type": "response-toolbar", + "buttons": [ + { + "id": "button-add", + "type": "response-toolbar-item", + "appearance": { + "class": "btn-primary" + }, + "text": "新增" + }, + { + "id": "button-edit", + "type": "response-toolbar-item", + "text": "编辑" + }, + { + "id": "button-save", + "type": "response-toolbar-item", + "text": "保存" + }, + { + "id": "button-cancel", + "type": "response-toolbar-item", + "text": "取消" + }, + { + "id": "button-delete", + "type": "response-toolbar-item", + "text": "删除" + } + ] + } + }, + { + "id": "main-container", + "type": "content-container", + "appearance": { + "class": "f-page-main" + }, + "contents": [ + { + "id": "content-splitter", + "type": "splitter", + "appearance": { + "class": "f-page-content" + }, + "contents": [ + { + "id": "content-list", + "type": "splitter-pane", + "appearance": { + "class": "f-col-w6 f-page-content-nav" + }, + "contents": [ + { + "id": "data-grid-component", + "type": "component", + "componentType": "data-grid", + "appearance": { + "class": "f-struct-wrapper f-utils-fill-flex-column" + }, + "contents": [ + { + "id": "data-grid-section", + "type": "section", + "appearance": { + "class": "f-section-grid f-section-in-nav" + }, + "showHeader": false, + "contents": [ + { + "id": "dataGrid", + "type": "data-grid", + "appearance": { + "class": "f-component-grid" + }, + "columns": [ + { + "id": "code_6d5f8d5b_1fvq", + "type": "GridField", + "title": "项目编号", + "field": "code", + "dataType": "string", + "binding": { + "type": "Form", + "path": "code", + "field": "6d5f8d5b-c68a-47fa-9f3b-f3805489cfae" + }, + "resizable": true + }, + { + "id": "name_2efe6193_lljv", + "type": "GridField", + "title": "项目名称", + "field": "name", + "dataType": "string", + "binding": { + "type": "Form", + "path": "name", + "field": "2efe6193-278c-4b5f-9f31-cdd8ee48751a" + }, + "resizable": true + }, + { + "id": "projectStatus_7d2dd238_3d6l", + "type": "GridField", + "title": "项目状态", + "binding": { + "type": "Form", + "path": "projectStatus", + "field": "7d2dd238-42a7-4643-a849-cdac3b4fe13f", + "fullPath": "ProjectStatus" + }, + "field": "projectStatus", + "dataType": "enum", + "data": [ + { + "name": "进行中", + "value": "1" + }, + { + "name": "已结项", + "value": "2" + } + ], + "resizable": true + } + ] + } + ] + } + ] + } + ], + "position": "left" + }, + { + "id": "content-main", + "type": "splitter-pane", + "appearance": { + "class": "f-page-content-main" + }, + "contents": [ + { + "id": "detail-form-component", + "type": "component", + "componentType": "form-col-1", + "appearance": { + "class": "f-struct-wrapper" + }, + "contents": [ + { + "id": "detail-form-section", + "type": "section", + "appearance": { + "class": "f-section-form f-section-in-main" + }, + "mainTitle": "基本信息", + "contents": [ + { + "id": "detail-form-layout", + "type": "response-form", + "appearance": { + "class": "f-form-layout farris-form farris-form-controls-inline" + }, + "contents": [ + { + "id": "code_6d5f8d5b_9fr4", + "type": "form-group", + "label": "项目编号", + "appearance": { + "class": "col-12 col-md-6 col-xl-6 col-el-6" + }, + "editor": { + "type": "input-group" + } + }, + { + "id": "name_2efe6193_39dg", + "type": "form-group", + "label": "项目名称", + "appearance": { + "class": "col-12 col-md-6 col-xl-6 col-el-6" + }, + "editor": { + "type": "input-group" + } + }, + { + "id": "projectType_ddd6903b_6eoa", + "type": "form-group", + "label": "项目类别", + "appearance": { + "class": "col-12 col-md-6 col-xl-6 col-el-6" + }, + "editor": { + "type": "combo-list", + "data": [ + { + "name": "产品类", + "value": "Product" + }, + { + "name": "服务类", + "value": "Service" + }, + { + "name": "其他类", + "value": "Other" + } + ] + } + }, + { + "id": "projectStatus_7d2dd238_bbnz", + "type": "form-group", + "label": "项目状态", + "appearance": { + "class": "col-12 col-md-6 col-xl-6 col-el-6" + }, + "editor": { + "type": "combo-list", + "data": [ + { + "name": "进行中", + "value": "1" + }, + { + "name": "已结项", + "value": "2" + } + ] + } + }, + { + "id": "department_Department_name_bfbd5da4_8fuc", + "type": "form-group", + "label": "所属部门", + "appearance": { + "class": "col-12 col-md-6 col-xl-6 col-el-6" + }, + "editor": { + "type": "lookup", + "mappingFields": {"code": "department_code"} + } + } + ] + } + ] + } + ] + }, + { + "id": "advanced-form-component", + "type": "component", + "componentType": "form-col-1", + "appearance": { + "class": "f-struct-wrapper" + }, + "contents": [ + { + "id": "advanced-form-section", + "type": "section", + "appearance": { + "class": "f-section-form f-section-in-main" + }, + "mainTitle": "高级信息", + "contents": [ + { + "id": "advanced-form-layout", + "type": "content-container", + "appearance": { + "class": "f-form-layout farris-form farris-form-controls-inline" + }, + "contents": [ + { + "id": "total_29cf60dd_mmq3", + "type": "form-group", + "label": "项目金额", + "appearance": { + "class": "col-12" + }, + "editor": { + "type": "number-spinner" + } + }, + { + "id": "description_847d76a3_gzfo", + "type": "form-group", + "label": "项目备注", + "appearance": { + "class": "col-12" + }, + "editor": { + "type": "text" + } + } + ] + } + ] + } + ] + }, + { + "id": "detail-container", + "type": "content-container", + "appearance": { + "class": "f-struct-wrapper" + }, + "size": null, + "contents": [ + { + "id": "detail-section", + "type": "section", + "appearance": { + "class": "f-section-tabs f-section-in-mainsubcard" + }, + "showHeader": false, + "contents": [ + { + "id": "detail-tab", + "type": "tabs", + "controlSource": "Farris", + "appearance": { + "class": "f-component-tabs f-tabs-has-grid" + }, + "contents": [ + { + "id": "bxddemodetail-tab-page", + "type": "tab-page", + "title": "报销明细", + "appearance": null, + "contents": [ + { + "id": "bxddemodetail-component", + "type": "component", + "appearance": { + "class": "f-struct-is-subgrid" + }, + "contents": [ + { + "id": "bxddemodetail-component-layout", + "type": "content-container", + "appearance": { + "class": "f-grid-is-sub f-utils-flex-column" + }, + "contents": [ + { + "id": "dataGrid_bxddemodetail", + "type": "data-grid", + "dataSource": "bxdDemoDetails", + "columns": [ + { + "id": "detailDate_f72e0c49_t5rz", + "type": "GridField", + "title": "费用日期", + "field": "detailDate", + "dataType": "datetime", + "editor": { + "id": "detailDate_f72e0c49_7fjv", + "type": "date-picker", + "title": "日期选择" + } + }, + { + "id": "amount_d99e60e7_lkns", + "type": "GridField", + "title": "报销金额", + "field": "amount", + "dataType": "number", + "editor": { + "id": "amount_d99e60e7_mcnp", + "type": "number-spinner", + "title": "数值框" + } + }, + { + "id": "description_10492a0d_ldc1", + "type": "GridField", + "title": "费用说明", + "field": "description", + "dataType": "string", + "editor": { + "id": "description_10492a0d_rj53", + "type": "input-group", + "title": "多行文本框" + } + }, + { + "id": "invoiceNumber_4b707cce_m1tt", + "type": "GridField", + "title": "发票号码", + "field": "invoiceNumber", + "dataType": "string", + "editor": { + "id": "invoiceNumber_4b707cce_qrci", + "type": "input-group", + "title": "文本" + } + } + ], + "appearance": { + "class": "f-component-grid f-utils-fill" + } + } + ] + } + ], + "componentType": "dataGrid" + } + ], + "toolbar": { + "id": "bxddemodetail-tab-toolbar", + "type": "response-toolbar", + "position": "inHead", + "buttons": [ + { + "id": "bxddemodetailAddButton", + "type": "response-toolbar-item", + "text": "新增", + "appearance": { + "class": "btn btn-secondary f-btn-ml" + } + }, + { + "id": "bxddemodetailRemoveButton", + "type": "response-toolbar-item", + "text": "删除", + "appearance": { + "class": "btn btn-secondary f-btn-ml" + } + } + ] + } + }, + { + "id": "bxddemoattachment-tab-page", + "type": "tab-page", + "title": "附件", + "appearance": null, + "contents": [ + { + "id": "bxddemoattachment-component", + "type": "component", + "appearance": { + "class": "f-struct-is-subgrid" + }, + "contents": [ + { + "id": "bxddemoattachment-component-layout", + "type": "content-container", + "appearance": { + "class": "f-grid-is-sub f-utils-flex-column" + }, + "contents": [ + { + "id": "dataGrid_bxddemoattachment", + "type": "uploader", + "dataSource": "bxddemoattachments", + "appearance": { + "class": "f-component-grid f-utils-fill" + } + } + ] + } + ], + "componentType": "dataGrid" + } + ], + "toolbar": { + "id": "bxddemoattachment-tab-toolbar", + "type": "response-toolbar", + "position": "inHead", + "buttons": [ + { + "id": "bxddemoattachmentAddButton", + "type": "response-toolbar-item", + "text": "上传", + "appearance": { + "class": "btn btn-secondary f-btn-ml" + } + }, + { + "id": "bxddemoattachmentRemoveButton", + "type": "response-toolbar-item", + "text": "删除", + "appearance": { + "class": "btn btn-secondary f-btn-ml" + } + } + ] + } + } + ] + } + ], + "toolbar": { + "id": "detail-section-toolbar", + "type": "SectionToolbar", + "position": "inHead", + "contents": [] + } + } + ] + } + ], + "position": "main" + } + ] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/packages/mobile-designer/public/designer-canvas/flow-app.json b/packages/mobile-designer/public/designer-canvas/flow-app.json new file mode 100644 index 0000000000000000000000000000000000000000..ab6af2346866fafb7251bd7d5fd3490a33a471f1 --- /dev/null +++ b/packages/mobile-designer/public/designer-canvas/flow-app.json @@ -0,0 +1,117 @@ +{ + "id": "root-component", + "type": "process", + "contents": [ + { + "id": "start-event", + "type": "start-event" + }, + { + "id": "start-event_smoke-detector-activity", + "type": "sequence-flow", + "source": "start-event", + "target": "smoke-detector-activity" + }, + { + "id": "smoke-detector-activity", + "type": "component-node", + "content": [ + { + "id": "smoke-detector", + "type": "smoke-detector" + } + ] + }, + { + "id": "smoke-detector-activity_smoke-detector-event", + "type": "sequence-flow", + "source": "smoke-detector-activity", + "target": "smoke-detector-event" + }, + { + "id": "smoke-detector-event", + "type": "event-node", + "content": [ + { + "id": "report-smoke", + "type": "device-event" + } + ] + }, + { + "id": "smoke-detector-event_greater_than_500", + "type": "sequence-flow", + "source": "smoke-detector-event", + "target": "greater_than_500" + }, + { + "id": "greater_than_500", + "type": "logic-node", + "content": [ + { + "property": "smoke", + "compare": "greater_than", + "value": 500 + } + ] + }, + { + "id": "smoke-alert", + "type": "task-node", + "content": [ + { + "service": "alter", + "params": [] + } + ] + }, + { + "id": "end-event", + "type": "end-event" + } + ], + "diagrams": [ + { + "id": "start-event", + "position": { + "x": 900, + "y": 700 + } + }, + { + "id": "smoke-detector-activity", + "position": { + "x": 900, + "y": 700 + } + }, + { + "id": "smoke-detector-event", + "position": { + "x": 900, + "y": 700 + } + }, + { + "id": "greater_than_500", + "position": { + "x": 900, + "y": 700 + } + }, + { + "id": "smoke-alert", + "position": { + "x": 900, + "y": 700 + } + }, + { + "id": "end-event", + "position": { + "x": 900, + "y": 700 + } + } + ] +} \ No newline at end of file diff --git a/packages/mobile-designer/public/designer-canvas/flow.json b/packages/mobile-designer/public/designer-canvas/flow.json new file mode 100644 index 0000000000000000000000000000000000000000..85cb174839285a3226bf2d90119594505717dfe7 --- /dev/null +++ b/packages/mobile-designer/public/designer-canvas/flow.json @@ -0,0 +1,203 @@ +{ + "id": "root-component", + "type": "component", + "componentType": "frame", + "contents": [ + { + "id": "data-grid-node", + "type": "flow-node", + "position": { + "x": 900, + "y": 700 + }, + "content": [ + { + "id": "smoke-detector", + "type": "smoke-detector" + } + ] + }, + { + "id": "detail-form-node", + "type": "flow-node", + "position": { + "x": 900, + "y": 100 + }, + "content": [ + { + "id": "detail-form-component", + "type": "component", + "componentType": "form-col-1", + "appearance": { + "class": "f-struct-wrapper" + }, + "contents": [ + { + "id": "detail-form-section", + "type": "section", + "appearance": { + "class": "f-section-form f-section-in-main" + }, + "mainTitle": "基本信息", + "contents": [ + { + "id": "detail-form-layout", + "type": "response-form", + "appearance": { + "class": "f-form-layout farris-form farris-form-controls-inline" + }, + "contents": [ + { + "id": "code_6d5f8d5b_9fr4", + "type": "form-group", + "label": "项目编号", + "appearance": { + "class": "col-12 col-md-6 col-xl-6 col-el-6" + }, + "editor": { + "type": "input-group" + } + }, + { + "id": "name_2efe6193_39dg", + "type": "form-group", + "label": "项目名称", + "appearance": { + "class": "col-12 col-md-6 col-xl-6 col-el-6" + }, + "editor": { + "type": "input-group" + } + }, + { + "id": "projectType_ddd6903b_6eoa", + "type": "form-group", + "label": "项目类别", + "appearance": { + "class": "col-12 col-md-6 col-xl-6 col-el-6" + }, + "editor": { + "type": "combo-list", + "data": [ + { + "name": "产品类", + "value": "Product" + }, + { + "name": "服务类", + "value": "Service" + }, + { + "name": "其他类", + "value": "Other" + } + ] + } + }, + { + "id": "projectStatus_7d2dd238_bbnz", + "type": "form-group", + "label": "项目状态", + "appearance": { + "class": "col-12 col-md-6 col-xl-6 col-el-6" + }, + "editor": { + "type": "combo-list", + "data": [ + { + "name": "进行中", + "value": "1" + }, + { + "name": "已结项", + "value": "2" + } + ] + } + }, + { + "id": "department_Department_name_bfbd5da4_8fuc", + "type": "form-group", + "label": "所属部门", + "appearance": { + "class": "col-12 col-md-6 col-xl-6 col-el-6" + }, + "editor": { + "type": "lookup", + "mappingFields": { + "code": "department_code" + } + } + } + ] + } + ] + } + ] + } + ] + }, + { + "id": "advanced-form-node", + "type": "flow-node", + "position": { + "x": 600, + "y": 400 + }, + "content": [ + { + "id": "advanced-form-component", + "type": "component", + "componentType": "form-col-1", + "appearance": { + "class": "f-struct-wrapper" + }, + "contents": [ + { + "id": "advanced-form-section", + "type": "section", + "appearance": { + "class": "f-section-form f-section-in-main" + }, + "mainTitle": "高级信息", + "contents": [ + { + "id": "advanced-form-layout", + "type": "content-container", + "appearance": { + "class": "f-form-layout farris-form farris-form-controls-inline" + }, + "contents": [ + { + "id": "total_29cf60dd_mmq3", + "type": "form-group", + "label": "项目金额", + "appearance": { + "class": "col-12" + }, + "editor": { + "type": "number-spinner" + } + }, + { + "id": "description_847d76a3_gzfo", + "type": "form-group", + "label": "项目备注", + "appearance": { + "class": "col-12" + }, + "editor": { + "type": "text" + } + } + ] + } + ] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/packages/mobile-designer/public/designer-canvas/list-card.json b/packages/mobile-designer/public/designer-canvas/list-card.json new file mode 100644 index 0000000000000000000000000000000000000000..889ab589c4eee238d8581b84cb470fc670edf3eb --- /dev/null +++ b/packages/mobile-designer/public/designer-canvas/list-card.json @@ -0,0 +1,588 @@ +{ + "id": "root-component", + "type": "component", + "componentType": "frame", + "contents": [ + { + "id": "root-layout", + "type": "content-container", + "appearance": { + "class": "f-page f-page-navigate f-page-is-grid-card" + }, + "contents": [ + { + "id": "page-header", + "type": "page-header", + "appearance": { + "class": "f-page-header" + }, + "icon": "f-icon f-icon-page-title-dictionary", + "title": "项目字典", + "toolbar": { + "type": "response-toolbar", + "buttons": [ + { + "id": "button-add", + "type": "ToolBarItem", + "appearance": { + "class": "btn-primary" + }, + "text": "新增" + }, + { + "id": "button-edit", + "type": "ToolBarItem", + "text": "编辑" + }, + { + "id": "button-save", + "type": "ToolBarItem", + "text": "保存" + }, + { + "id": "button-cancel", + "type": "ToolBarItem", + "text": "取消" + }, + { + "id": "button-delete", + "type": "ToolBarItem", + "text": "删除" + } + ] + } + }, + { + "id": "main-container", + "type": "content-container", + "appearance": { + "class": "f-page-main" + }, + "contents": [ + { + "id": "content-splitter", + "type": "splitter", + "appearance": { + "class": "f-page-content" + }, + "contents": [ + { + "id": "content-list", + "type": "splitter-pane", + "appearance": { + "class": "f-col-w6 f-page-content-nav" + }, + "contents": [ + { + "id": "data-grid-component", + "type": "component", + "componentType": "data-grid", + "appearance": { + "class": "f-struct-wrapper f-utils-fill-flex-column" + }, + "contents": [ + { + "id": "data-grid-section", + "type": "section", + "appearance": { + "class": "f-section-grid f-section-in-nav" + }, + "showHeader": false, + "contents": [ + { + "id": "dataGrid", + "type": "data-grid", + "appearance": { + "class": "f-component-grid" + }, + "columns": [ + { + "id": "code_6d5f8d5b_1fvq", + "type": "GridField", + "title": "项目编号", + "field": "code", + "dataType": "string", + "binding": { + "type": "Form", + "path": "code", + "field": "6d5f8d5b-c68a-47fa-9f3b-f3805489cfae" + }, + "resizable": true + }, + { + "id": "name_2efe6193_lljv", + "type": "GridField", + "title": "项目名称", + "field": "name", + "dataType": "string", + "binding": { + "type": "Form", + "path": "name", + "field": "2efe6193-278c-4b5f-9f31-cdd8ee48751a" + }, + "resizable": true + }, + { + "id": "projectStatus_7d2dd238_3d6l", + "type": "GridField", + "title": "项目状态", + "binding": { + "type": "Form", + "path": "projectStatus", + "field": "7d2dd238-42a7-4643-a849-cdac3b4fe13f", + "fullPath": "ProjectStatus" + }, + "field": "projectStatus", + "dataType": "enum", + "data": [ + { + "name": "进行中", + "value": "1" + }, + { + "name": "已结项", + "value": "2" + } + ], + "resizable": true + } + ] + } + ] + } + ] + } + ], + "position": "left" + }, + { + "id": "content-main", + "type": "splitter-pane", + "appearance": { + "class": "f-page-content-main" + }, + "contents": [ + { + "id": "detail-form-component", + "type": "component", + "componentType": "form-col-1", + "appearance": { + "class": "f-struct-wrapper" + }, + "contents": [ + { + "id": "detail-form-section", + "type": "section", + "appearance": { + "class": "f-section-form f-section-in-main" + }, + "mainTitle": "基本信息", + "enableMaximize": true, + "enableAccordion": "default", + "contents": [ + { + "id": "detail-form-layout", + "type": "content-container", + "appearance": { + "class": "f-form-layout farris-form farris-form-controls-inline" + }, + "contents": [ + { + "id": "code_6d5f8d5b_9fr4", + "type": "form-group", + "label": "项目编号", + "appearance": { + "class": "col-12" + }, + "editor": { + "type": "input-group" + } + }, + { + "id": "name_2efe6193_39dg", + "type": "form-group", + "label": "项目名称", + "appearance": { + "class": "col-12" + }, + "editor": { + "type": "input-group" + } + }, + { + "id": "projectType_ddd6903b_6eoa", + "type": "form-group", + "label": "项目类别", + "appearance": { + "class": "col-12" + }, + "editor": { + "type": "combo-list", + "data": [ + { + "name": "产品类", + "value": "Product" + }, + { + "name": "服务类", + "value": "Service" + }, + { + "name": "其他类", + "value": "Other" + } + ] + } + }, + { + "id": "projectStatus_7d2dd238_bbnz", + "type": "form-group", + "label": "项目状态", + "appearance": { + "class": "col-12" + }, + "editor": { + "type": "combo-list", + "data": [ + { + "name": "进行中", + "value": "1" + }, + { + "name": "已结项", + "value": "2" + } + ] + } + }, + { + "id": "department_Department_name_bfbd5da4_8fuc", + "type": "form-group", + "label": "所属部门", + "appearance": { + "class": "col-12" + }, + "editor": { + "type": "lookup", + "mappingFields": {"code": "department_code"} + } + } + ] + } + ] + } + ] + }, + { + "id": "advanced-form-component", + "type": "component", + "componentType": "form-col-1", + "appearance": { + "class": "f-struct-wrapper" + }, + "contents": [ + { + "id": "advanced-form-section", + "type": "section", + "appearance": { + "class": "f-section-form f-section-in-main" + }, + "mainTitle": "高级信息", + "contents": [ + { + "id": "advanced-form-layout", + "type": "content-container", + "appearance": { + "class": "f-form-layout farris-form farris-form-controls-inline" + }, + "contents": [ + { + "id": "total_29cf60dd_mmq3", + "type": "form-group", + "label": "项目金额", + "appearance": { + "class": "col-12" + }, + "editor": { + "type": "number-spinner" + } + }, + { + "id": "description_847d76a3_gzfo", + "type": "form-group", + "label": "项目备注", + "appearance": { + "class": "col-12" + }, + "editor": { + "type": "text" + } + } + ] + } + ] + } + ] + }, + { + "id": "detail-container", + "type": "content-container", + "appearance": { + "class": "f-struct-wrapper" + }, + "size": null, + "contents": [ + { + "id": "detail-section", + "type": "section", + "appearance": { + "class": "f-section-tabs f-section-in-mainsubcard" + }, + "contents": [ + { + "id": "detail-tab", + "type": "tabs", + "controlSource": "Farris", + "appearance": { + "class": "f-component-tabs f-tabs-has-grid" + }, + "contents": [ + { + "id": "bxddemodetail-tab-page", + "type": "tab-page", + "title": "报销明细", + "appearance": null, + "contents": [ + { + "id": "bxddemodetail-component", + "type": "component", + "appearance": { + "class": "f-struct-is-subgrid" + }, + "contents": [ + { + "id": "bxddemodetail-component-layout", + "type": "content-container", + "appearance": { + "class": "f-grid-is-sub f-utils-flex-column" + }, + "contents": [ + { + "id": "dataGrid_bxddemodetail", + "type": "data-grid", + "dataSource": "bxdDemoDetails", + "columns": [ + { + "id": "detailDate_f72e0c49_t5rz", + "type": "GridField", + "title": "费用日期", + "field": "detailDate", + "dataType": "datetime", + "editor": { + "id": "detailDate_f72e0c49_7fjv", + "type": "date-picker", + "title": "日期选择" + } + }, + { + "id": "amount_d99e60e7_lkns", + "type": "GridField", + "title": "报销金额", + "field": "amount", + "dataType": "number", + "editor": { + "id": "amount_d99e60e7_mcnp", + "type": "number-spinner", + "title": "数值框" + } + }, + { + "id": "description_10492a0d_ldc1", + "type": "GridField", + "title": "费用说明", + "field": "description", + "dataType": "string", + "editor": { + "id": "description_10492a0d_rj53", + "type": "input-group", + "title": "多行文本框" + } + }, + { + "id": "invoiceNumber_4b707cce_m1tt", + "type": "GridField", + "title": "发票号码", + "field": "invoiceNumber", + "dataType": "string", + "editor": { + "id": "invoiceNumber_4b707cce_qrci", + "type": "input-group", + "title": "文本" + } + } + ], + "appearance": { + "class": "f-component-grid f-utils-fill" + } + } + ] + } + ], + "componentType": "dataGrid" + } + ], + "toolbar": { + "id": "bxddemodetail-tab-toolbar", + "type": "TabToolbar", + "position": "inHead", + "contents": [ + { + "id": "bxddemodetailAddButton", + "type": "TabToolbarItem", + "text": "新增", + "appearance": { + "class": "btn btn-secondary f-btn-ml" + } + }, + { + "id": "bxddemodetailRemoveButton", + "type": "TabToolbarItem", + "text": "删除", + "appearance": { + "class": "btn btn-secondary f-btn-ml" + } + } + ] + } + }, + { + "id": "bxddemoattachment-tab-page", + "type": "tab-page", + "title": "附件", + "appearance": null, + "contents": [ + { + "id": "bxddemoattachment-component", + "type": "component", + "appearance": { + "class": "f-struct-is-subgrid" + }, + "contents": [ + { + "id": "bxddemoattachment-component-layout", + "type": "content-container", + "appearance": { + "class": "f-grid-is-sub f-utils-flex-column" + }, + "contents": [ + { + "id": "dataGrid_bxddemoattachment", + "type": "data-grid", + "dataSource": "bxddemoattachments", + "columns": [ + { + "id": "description_10492a0d_ldc1", + "type": "GridField", + "title": "文件名", + "field": "description", + "dataType": "string", + "editor": { + "id": "description_10492a0d_rj53", + "type": "input-group", + "title": "多行文本框" + } + }, + { + "id": "amount_d99e60e7_lkns", + "type": "GridField", + "title": "文件大小", + "field": "amount", + "dataType": "number", + "editor": { + "id": "amount_d99e60e7_mcnp", + "type": "number-spinner", + "title": "数值框" + } + }, + { + "id": "invoiceNumber_4b707cce_m1tt", + "type": "GridField", + "title": "上传人", + "field": "invoiceNumber", + "dataType": "string", + "editor": { + "id": "invoiceNumber_4b707cce_qrci", + "type": "input-group", + "title": "文本" + } + }, + { + "id": "detailDate_f72e0c49_t5rz", + "type": "GridField", + "title": "上传日期", + "field": "detailDate", + "dataType": "datetime", + "editor": { + "id": "detailDate_f72e0c49_7fjv", + "type": "date-picker", + "title": "日期选择" + } + } + ], + "appearance": { + "class": "f-component-grid f-utils-fill" + } + } + ] + } + ], + "componentType": "dataGrid" + } + ], + "toolbar": { + "id": "bxddemoattachment-tab-toolbar", + "type": "TabToolbar", + "position": "inHead", + "contents": [ + { + "id": "bxddemoattachmentAddButton", + "type": "TabToolbarItem", + "text": "上传", + "appearance": { + "class": "btn btn-secondary f-btn-ml" + } + }, + { + "id": "bxddemoattachmentRemoveButton", + "type": "TabToolbarItem", + "text": "删除", + "appearance": { + "class": "btn btn-secondary f-btn-ml" + } + } + ] + } + } + ] + } + ], + "toolbar": { + "id": "detail-section-toolbar", + "type": "SectionToolbar", + "position": "inHead", + "contents": [] + } + } + ] + } + ], + "position": "main" + } + ] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/packages/mobile-designer/public/designer-canvas/list-dic.json b/packages/mobile-designer/public/designer-canvas/list-dic.json new file mode 100644 index 0000000000000000000000000000000000000000..110da1a70a64b050945664e98a6ff70bdb9c7289 --- /dev/null +++ b/packages/mobile-designer/public/designer-canvas/list-dic.json @@ -0,0 +1,6908 @@ +{ + "module": { + "id": "ListCard01", + "code": "ListCard01", + "name": "ListCard01", + "caption": "ListCard01", + "type": "Module", + "creator": "wang-xh", + "creationDate": "2022-11-23T08:42:24.121Z", + "updateVersion": "191104", + "showTitle": true, + "bootstrap": "list-card-template", + "templateId": "list-card-template", + "schemas": [ + { + "name": "ListCard01_frm", + "id": "e3ae5b9b-bb53-4a28-ac46-64c9a022ed13", + "sourceType": "vo", + "variables": [], + "sourceUri": "api/igix02/cardforms/v1.0/ListCard01_frm", + "code": "ListCard01_frm", + "extendProperties": { + "enableStdTimeFormat": true + }, + "entities": [ + { + "name": "费用报销单", + "id": "66b57644-24af-405e-a7cd-18e2f126209b", + "type": { + "$type": "EntityType", + "fields": [ + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "TextBox" + }, + "require": true, + "multiLanguage": false, + "readonly": false, + "name": "主键", + "id": "ec6903ef-de5c-4f90-a38b-3de97d7ba130", + "type": { + "$type": "StringType", + "length": 36, + "name": "String", + "displayName": "字符串" + }, + "path": "ID", + "label": "id", + "code": "ID", + "originalId": "ec6903ef-de5c-4f90-a38b-3de97d7ba130", + "bindingPath": "id", + "bindingField": "id" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "DateBox", + "format": "'yyyy-MM-dd'" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "版本", + "id": "43203959-2c65-489d-a397-38b6d82804ec", + "type": { + "$type": "DateTimeType", + "name": "DateTime", + "displayName": "日期时间" + }, + "path": "Version", + "label": "version", + "code": "Version", + "originalId": "43203959-2c65-489d-a397-38b6d82804ec", + "bindingPath": "version", + "bindingField": "version" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "TextBox" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "编号", + "id": "2bc14a88-2227-4179-a1bc-810d22e815f1", + "type": { + "$type": "StringType", + "length": 36, + "name": "String", + "displayName": "字符串" + }, + "path": "Code", + "label": "code", + "code": "Code", + "originalId": "2bc14a88-2227-4179-a1bc-810d22e815f1", + "bindingPath": "code", + "bindingField": "code" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "TextBox" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "报销人员", + "id": "8316a964-114c-4803-9d27-b4a3da3848f4", + "type": { + "$type": "StringType", + "length": 36, + "name": "String", + "displayName": "字符串" + }, + "path": "EmployeeID", + "label": "employeeID", + "code": "EmployeeID", + "originalId": "8316a964-114c-4803-9d27-b4a3da3848f4", + "bindingPath": "employeeID", + "bindingField": "employeeID" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "TextBox" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "所属部门", + "id": "417fa398-ef66-4499-8adc-ea899952613b", + "type": { + "$type": "StringType", + "length": 36, + "name": "String", + "displayName": "字符串" + }, + "path": "DomainID", + "label": "domainID", + "code": "DomainID", + "originalId": "417fa398-ef66-4499-8adc-ea899952613b", + "bindingPath": "domainID", + "bindingField": "domainID" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "TextBox" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "单据编号", + "id": "fc56451d-7cbf-4cd8-bb6f-dcbbf47e3550", + "type": { + "$type": "StringType", + "length": 36, + "name": "String", + "displayName": "字符串" + }, + "path": "BillCode", + "label": "billCode", + "code": "BillCode", + "originalId": "fc56451d-7cbf-4cd8-bb6f-dcbbf47e3550", + "bindingPath": "billCode", + "bindingField": "billCode" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "NumericBox" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "报帐金额", + "id": "06058119-c97a-4e12-b48e-79670e105139", + "type": { + "$type": "NumericType", + "length": 18, + "name": "Number", + "displayName": "数字", + "precision": 2 + }, + "path": "TotalSum", + "label": "totalSum", + "code": "TotalSum", + "originalId": "06058119-c97a-4e12-b48e-79670e105139", + "bindingPath": "totalSum", + "bindingField": "totalSum" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "EnumField" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "报销类型", + "id": "49cafd4f-2c1b-41f4-bd49-79de929e7a1b", + "type": { + "$type": "EnumType", + "name": "Enum", + "displayName": "枚举", + "enumValues": [ + { + "disabled": false, + "name": "手机费", + "value": "SJFY" + }, + { + "disabled": true, + "name": "交通费", + "value": "JTFY" + }, + { + "disabled": false, + "name": "差旅费", + "value": "CLFY" + }, + { + "disabled": false, + "name": "其他1", + "value": "QT1" + }, + { + "disabled": false, + "name": "其他2", + "value": "QT2" + }, + { + "disabled": false, + "name": "其他3", + "value": "QT3" + }, + { + "disabled": false, + "name": "其他4", + "value": "QT4" + }, + { + "disabled": false, + "name": "其他5", + "value": "QT5" + }, + { + "disabled": false, + "name": "其他6", + "value": "QT6" + }, + { + "disabled": false, + "name": "其他7", + "value": "QT7" + } + ], + "valueType": { + "$type": "StringType", + "length": 36, + "name": "String", + "displayName": "字符串" + } + }, + "path": "BillType", + "label": "billType", + "code": "BillType", + "originalId": "49cafd4f-2c1b-41f4-bd49-79de929e7a1b", + "bindingPath": "billType", + "bindingField": "billType" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "DateBox", + "format": "'yyyy-MM-dd'" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "制单日期", + "id": "65c51759-a66c-4469-b984-05a1ae592f13", + "type": { + "$type": "DateTimeType", + "name": "DateTime", + "displayName": "日期时间" + }, + "path": "BillDate", + "label": "billDate", + "code": "BillDate", + "originalId": "65c51759-a66c-4469-b984-05a1ae592f13", + "bindingPath": "billDate", + "bindingField": "billDate" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "TextBox" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "密级ID", + "id": "4b64b4ba-8c8e-40a5-9790-a9c30af23498", + "type": { + "$type": "StringType", + "length": 36, + "name": "String", + "displayName": "字符串" + }, + "path": "SecID", + "label": "secID", + "code": "SecID", + "originalId": "4b64b4ba-8c8e-40a5-9790-a9c30af23498", + "bindingPath": "secID", + "bindingField": "secID" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "NumericBox" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "密级", + "id": "e049afd6-e1b4-43e1-ba51-f128e08b5a4b", + "type": { + "$type": "NumericType", + "length": 0, + "name": "Number", + "displayName": "数字", + "precision": 0 + }, + "path": "SecLevel", + "label": "secLevel", + "code": "SecLevel", + "originalId": "e049afd6-e1b4-43e1-ba51-f128e08b5a4b", + "bindingPath": "secLevel", + "bindingField": "secLevel" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "TextBox" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "所属项目", + "id": "7d8136ad-e005-4b09-86d7-c9d4bfd43698", + "type": { + "$type": "StringType", + "length": 36, + "name": "String", + "displayName": "字符串" + }, + "path": "ProjectID", + "label": "projectID", + "code": "ProjectID", + "originalId": "7d8136ad-e005-4b09-86d7-c9d4bfd43698", + "bindingPath": "projectID", + "bindingField": "projectID" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "MultiTextBox" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "报销说明", + "id": "49d34e9a-9cd3-4b2c-96ed-2754eb24e390", + "type": { + "$type": "TextType", + "length": 2000, + "name": "Text", + "displayName": "文本" + }, + "path": "BillNote", + "label": "billNote", + "code": "BillNote", + "originalId": "49d34e9a-9cd3-4b2c-96ed-2754eb24e390", + "bindingPath": "billNote", + "bindingField": "billNote" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "TextBox" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "项目经理", + "id": "e5779bd6-bc1d-4434-84f2-33b157cb9bcc", + "type": { + "$type": "StringType", + "length": 36, + "name": "String", + "displayName": "字符串" + }, + "path": "ProjectMrg", + "label": "projectMrg", + "code": "ProjectMrg", + "originalId": "e5779bd6-bc1d-4434-84f2-33b157cb9bcc", + "bindingPath": "projectMrg", + "bindingField": "projectMrg" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "TextBox" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "稽核状态", + "id": "14d1f442-35bb-44d1-ad01-86f639edb7b7", + "type": { + "$type": "StringType", + "length": 1, + "name": "String", + "displayName": "字符串" + }, + "path": "AuditStatus", + "label": "auditStatus", + "code": "AuditStatus", + "originalId": "14d1f442-35bb-44d1-ad01-86f639edb7b7", + "bindingPath": "auditStatus", + "bindingField": "auditStatus" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "CheckBox" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "是否在职", + "id": "e8d64e40-4dcc-418f-b4ef-487648245a79", + "type": { + "$type": "BooleanType", + "name": "Boolean", + "displayName": "布尔" + }, + "path": "IsOnline", + "label": "isOnline", + "code": "IsOnline", + "originalId": "e8d64e40-4dcc-418f-b4ef-487648245a79", + "bindingPath": "isOnline", + "bindingField": "isOnline" + }, + { + "$type": "SimpleField", + "editor": { + "$type": "TextBox" + }, + "multiLanguage": false, + "require": true, + "readonly": false, + "defaultValue": "", + "code": "TestRequire", + "label": "testRequire", + "name": "测试必填", + "id": "c82b3cd7-e36e-483f-8ebf-466dadb4a595", + "type": { + "$type": "StringType", + "displayName": "字符串", + "length": 36, + "name": "String" + }, + "path": "TestRequire", + "originalId": "c82b3cd7-e36e-483f-8ebf-466dadb4a595", + "bindingPath": "testRequire", + "bindingField": "testRequire" + }, + { + "$type": "ComplexField", + "path": "TestCompany", + "code": "TestCompany", + "label": "testCompany", + "originalId": "ec877cb1-b2ae-4f40-89fe-70229e807535", + "bindingPath": "testCompany", + "bindingField": "testCompany", + "name": "公司", + "id": "ec877cb1-b2ae-4f40-89fe-70229e807535", + "type": { + "$type": "EntityType", + "entities": [], + "primary": "testCompany", + "fields": [ + { + "$type": "SimpleField", + "require": false, + "multiLanguage": false, + "defaultValue": "", + "editor": { + "$type": "TextBox" + }, + "readonly": false, + "path": "TestCompany.TestCompany", + "code": "TestCompany", + "label": "testCompany", + "originalId": "b678df96-32bd-4603-9a04-c18f3bcd370a", + "bindingPath": "testCompany.testCompany", + "bindingField": "testCompany", + "name": "公司", + "id": "b678df96-32bd-4603-9a04-c18f3bcd370a", + "type": { + "$type": "StringType", + "length": 36, + "name": "String", + "displayName": "字符串" + } + }, + { + "$type": "SimpleField", + "require": false, + "multiLanguage": false, + "defaultValue": "", + "editor": { + "$type": "TextBox" + }, + "readonly": false, + "path": "TestCompany.TestCompany_Code", + "code": "Code", + "label": "testCompany_Code", + "originalId": "8d12bad0-87bd-49c0-9bd3-b91a25777824", + "bindingPath": "testCompany.testCompany_Code", + "bindingField": "testCompany_TestCompany_Code", + "name": "编号", + "id": "8d12bad0-87bd-49c0-9bd3-b91a25777824", + "type": { + "$type": "StringType", + "length": 36, + "name": "String", + "displayName": "字符串" + } + }, + { + "$type": "SimpleField", + "require": false, + "multiLanguage": false, + "defaultValue": "", + "editor": { + "$type": "TextBox" + }, + "readonly": false, + "path": "TestCompany.TestCompany_Name", + "code": "Name", + "label": "testCompany_Name", + "originalId": "fef37ce4-5ace-4a10-a206-fa91bd01d32b", + "bindingPath": "testCompany.testCompany_Name", + "bindingField": "testCompany_TestCompany_Name", + "name": "名称", + "id": "fef37ce4-5ace-4a10-a206-fa91bd01d32b", + "type": { + "$type": "StringType", + "length": 36, + "name": "String", + "displayName": "字符串" + } + } + ], + "name": "CompanyHelp01B678", + "displayName": "公司帮助01" + } + }, + { + "$type": "ComplexField", + "path": "TestUDT", + "code": "TestUDT", + "label": "testUDT", + "originalId": "89e0bf48-1f95-4a24-af50-28333e5774bb", + "bindingPath": "testUDT", + "bindingField": "testUDT", + "name": "UDT字段", + "id": "89e0bf48-1f95-4a24-af50-28333e5774bb", + "type": { + "$type": "ObjectType", + "name": "Amount89e0", + "fields": [ + { + "$type": "SimpleField", + "require": false, + "multiLanguage": false, + "defaultValue": "", + "editor": { + "$type": "NumericBox" + }, + "readonly": false, + "path": "TestUDT.Amount", + "code": "Amount", + "label": "amount", + "originalId": "ca619711-cf65-4688-818e-50db8ac130d3", + "bindingPath": "testUDT.amount", + "bindingField": "testUDT_Amount", + "name": "金额", + "id": "89e0bf48-cf65-4688-818e-50db8ac130d3", + "type": { + "$type": "NumericType", + "precision": 8, + "length": 28, + "name": "Number", + "displayName": "数字" + } + } + ], + "displayName": "金额" + } + }, + { + "$type": "ComplexField", + "path": "TestMultiUDT", + "code": "TestMultiUDT", + "label": "testMultiUDT", + "originalId": "7a9ff557-576d-41e3-a086-b0907e6a5b5a", + "bindingPath": "testMultiUDT", + "bindingField": "testMultiUDT", + "name": "多值UDT", + "id": "7a9ff557-576d-41e3-a086-b0907e6a5b5a", + "type": { + "$type": "ObjectType", + "name": "AdministrativeInfo7a9f", + "fields": [ + { + "$type": "SimpleField", + "require": false, + "multiLanguage": false, + "defaultValue": "", + "editor": { + "$type": "TextBox" + }, + "readonly": false, + "path": "TestMultiUDT.CreatedBy", + "code": "CreatedBy", + "label": "createdBy", + "originalId": "06b8f722-cbd0-415b-b9b5-2dd85c02e3d8", + "bindingPath": "testMultiUDT.createdBy", + "bindingField": "testMultiUDT_CreatedBy", + "name": "创建人", + "id": "7a9ff557-cbd0-415b-b9b5-2dd85c02e3d8", + "type": { + "$type": "StringType", + "length": 256, + "name": "String", + "displayName": "字符串" + } + }, + { + "$type": "SimpleField", + "require": false, + "multiLanguage": false, + "defaultValue": "", + "editor": { + "$type": "DateBox", + "format": "'yyyy-MM-dd'" + }, + "readonly": false, + "path": "TestMultiUDT.CreatedOn", + "code": "CreatedOn", + "label": "createdOn", + "originalId": "c4b07f76-1961-459e-8e08-c613ea144d1c", + "bindingPath": "testMultiUDT.createdOn", + "bindingField": "testMultiUDT_CreatedOn", + "name": "创建时间", + "id": "7a9ff557-1961-459e-8e08-c613ea144d1c", + "type": { + "$type": "DateTimeType", + "name": "DateTime", + "displayName": "日期时间" + } + }, + { + "$type": "SimpleField", + "require": false, + "multiLanguage": false, + "defaultValue": "", + "editor": { + "$type": "TextBox" + }, + "readonly": false, + "path": "TestMultiUDT.LastChangedBy", + "code": "LastChangedBy", + "label": "lastChangedBy", + "originalId": "980fa808-db7d-4441-a911-2d11ca7e8a44", + "bindingPath": "testMultiUDT.lastChangedBy", + "bindingField": "testMultiUDT_LastChangedBy", + "name": "最后修改人", + "id": "7a9ff557-db7d-4441-a911-2d11ca7e8a44", + "type": { + "$type": "StringType", + "length": 256, + "name": "String", + "displayName": "字符串" + } + }, + { + "$type": "SimpleField", + "require": false, + "multiLanguage": false, + "defaultValue": "", + "editor": { + "$type": "DateBox", + "format": "'yyyy-MM-dd'" + }, + "readonly": false, + "path": "TestMultiUDT.LastChangedOn", + "code": "LastChangedOn", + "label": "lastChangedOn", + "originalId": "fde64ec2-495b-4f29-a8fa-30644dd72fe6", + "bindingPath": "testMultiUDT.lastChangedOn", + "bindingField": "testMultiUDT_LastChangedOn", + "name": "最后修改时间", + "id": "7a9ff557-495b-4f29-a8fa-30644dd72fe6", + "type": { + "$type": "DateTimeType", + "name": "DateTime", + "displayName": "日期时间" + } + } + ], + "displayName": "更新信息" + } + }, + { + "$type": "SimpleField", + "require": false, + "multiLanguage": false, + "defaultValue": "", + "readonly": false, + "editor": { + "$type": "TextBox" + }, + "originalId": "01c3ea04-ddc0-49b5-91b8-165d2ba242b9", + "name": "TestEnum1", + "id": "01c3ea04-ddc0-49b5-91b8-165d2ba242b9", + "type": { + "$type": "StringType", + "length": 36, + "name": "String", + "displayName": "字符串" + }, + "path": "TestEnum1", + "bindingPath": "testEnum1", + "bindingField": "testEnum1", + "code": "TestEnum1", + "label": "testEnum1" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "readonly": false, + "editor": { + "$type": "NumericBox" + }, + "multiLanguage": false, + "require": false, + "name": "TestNumber", + "id": "9370fbf8-cd9f-4509-a754-07f8fd56756d", + "type": { + "$type": "NumericType", + "length": 0, + "name": "Number", + "displayName": "数字", + "precision": 0 + }, + "path": "TestNumber", + "label": "testNumber", + "code": "TestNumber", + "originalId": "9370fbf8-cd9f-4509-a754-07f8fd56756d", + "bindingField": "testNumber", + "bindingPath": "testNumber" + } + ], + "primary": "id", + "entities": [ + { + "name": "费用报销单明细", + "id": "3f8688b2-a502-4f70-b15a-4cf8ade5d0b6", + "type": { + "$type": "EntityType", + "fields": [ + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "TextBox" + }, + "require": true, + "multiLanguage": false, + "readonly": false, + "name": "主键", + "id": "25557dd7-56b4-419e-aad0-de1b54bfee31", + "type": { + "$type": "StringType", + "length": 36, + "name": "String", + "displayName": "字符串" + }, + "path": "ID", + "label": "id", + "code": "ID", + "originalId": "25557dd7-56b4-419e-aad0-de1b54bfee31", + "bindingPath": "id", + "bindingField": "id" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "TextBox" + }, + "require": true, + "multiLanguage": false, + "readonly": false, + "name": "上级对象主键", + "id": "e3f17427-7824-42d3-bc1a-e3d41f0076e1", + "type": { + "$type": "StringType", + "length": 36, + "name": "String", + "displayName": "字符串" + }, + "path": "ParentID", + "label": "parentID", + "code": "ParentID", + "originalId": "e3f17427-7824-42d3-bc1a-e3d41f0076e1", + "bindingPath": "parentID", + "bindingField": "parentID" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "DateBox", + "format": "'yyyy-MM-dd'" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "费用日期", + "id": "4f801f00-b0d5-48e5-8bcc-f88486ae8520", + "type": { + "$type": "DateTimeType", + "name": "DateTime", + "displayName": "日期时间" + }, + "path": "BillDetailDate", + "label": "billDetailDate", + "code": "BillDetailDate", + "originalId": "4f801f00-b0d5-48e5-8bcc-f88486ae8520", + "bindingPath": "billDetailDate", + "bindingField": "billDetailDate" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "NumericBox" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "报销金额", + "id": "a47bc34b-5070-4d72-8aaf-d7dcb8385118", + "type": { + "$type": "NumericType", + "length": 18, + "name": "Number", + "displayName": "数字", + "precision": 2 + }, + "path": "BillDetailAmount", + "label": "billDetailAmount", + "code": "BillDetailAmount", + "originalId": "a47bc34b-5070-4d72-8aaf-d7dcb8385118", + "bindingPath": "billDetailAmount", + "bindingField": "billDetailAmount" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "MultiTextBox" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "费用说明", + "id": "5d3a34e2-08f8-4298-8ea1-1e3c060f49b0", + "type": { + "$type": "TextType", + "length": 0, + "name": "Text", + "displayName": "文本" + }, + "path": "BillDetailNote", + "label": "billDetailNote", + "code": "BillDetailNote", + "originalId": "5d3a34e2-08f8-4298-8ea1-1e3c060f49b0", + "bindingPath": "billDetailNote", + "bindingField": "billDetailNote" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "TextBox" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "发票号码", + "id": "525b9081-9c36-4ecb-8cb0-795bf1232ed1", + "type": { + "$type": "StringType", + "length": 36, + "name": "String", + "displayName": "字符串" + }, + "path": "InvoiceNO", + "label": "invoiceNO", + "code": "InvoiceNO", + "originalId": "525b9081-9c36-4ecb-8cb0-795bf1232ed1", + "bindingPath": "invoiceNO", + "bindingField": "invoiceNO" + } + ], + "primary": "id", + "entities": [], + "name": "FYBXDMXWxh", + "displayName": "费用报销单明细" + }, + "label": "fybxdmxWxhs", + "code": "FYBXDMXWxh" + }, + { + "name": "费用报销借款明细", + "id": "3bb0d9da-c106-4d36-bf4c-52b4d04b9738", + "type": { + "$type": "EntityType", + "fields": [ + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "TextBox" + }, + "require": true, + "multiLanguage": false, + "readonly": false, + "name": "主键", + "id": "ec6523d1-c5c8-4626-8fd5-46ec8a3e5875", + "type": { + "$type": "StringType", + "length": 36, + "name": "String", + "displayName": "字符串" + }, + "path": "ID", + "label": "id", + "code": "ID", + "originalId": "ec6523d1-c5c8-4626-8fd5-46ec8a3e5875", + "bindingPath": "id", + "bindingField": "id" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "TextBox" + }, + "require": true, + "multiLanguage": false, + "readonly": false, + "name": "上级对象主键", + "id": "081a30bb-f339-4d9a-9ca0-d03e748d618b", + "type": { + "$type": "StringType", + "length": 36, + "name": "String", + "displayName": "字符串" + }, + "path": "ParentID", + "label": "parentID", + "code": "ParentID", + "originalId": "081a30bb-f339-4d9a-9ca0-d03e748d618b", + "bindingPath": "parentID", + "bindingField": "parentID" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "TextBox" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "内码", + "id": "cbc92c22-a1be-4741-a280-acc3ca1cb342", + "type": { + "$type": "StringType", + "length": 36, + "name": "String", + "displayName": "字符串" + }, + "path": "JKD_NM", + "label": "jkD_NM", + "code": "JKD_NM", + "originalId": "cbc92c22-a1be-4741-a280-acc3ca1cb342", + "bindingPath": "jkD_NM", + "bindingField": "jkD_NM" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "TextBox" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "报销单内码", + "id": "a11eae89-459e-4ea2-a452-caedf3eedeb5", + "type": { + "$type": "StringType", + "length": 36, + "name": "String", + "displayName": "字符串" + }, + "path": "JKD_BXDNM", + "label": "jkD_BXDNM", + "code": "JKD_BXDNM", + "originalId": "a11eae89-459e-4ea2-a452-caedf3eedeb5", + "bindingPath": "jkD_BXDNM", + "bindingField": "jkD_BXDNM" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "TextBox" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "借款单编号", + "id": "612ca50e-685f-465b-ae1b-d45fb7bf9d4d", + "type": { + "$type": "StringType", + "length": 36, + "name": "String", + "displayName": "字符串" + }, + "path": "JKD_BH", + "label": "jkD_BH", + "code": "JKD_BH", + "originalId": "612ca50e-685f-465b-ae1b-d45fb7bf9d4d", + "bindingPath": "jkD_BH", + "bindingField": "jkD_BH" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "TextBox" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "借款人", + "id": "d88367a5-9e18-461c-9196-59eca7c72967", + "type": { + "$type": "StringType", + "length": 36, + "name": "String", + "displayName": "字符串" + }, + "path": "JKD_JKR", + "label": "jkD_JKR", + "code": "JKD_JKR", + "originalId": "d88367a5-9e18-461c-9196-59eca7c72967", + "bindingPath": "jkD_JKR", + "bindingField": "jkD_JKR" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "NumericBox" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "借款金额", + "id": "caa72303-6a41-4cd5-9977-7d9b204648da", + "type": { + "$type": "NumericType", + "length": 20, + "name": "Number", + "displayName": "数字", + "precision": 8 + }, + "path": "JKD_JKJE", + "label": "jkD_JKJE", + "code": "JKD_JKJE", + "originalId": "caa72303-6a41-4cd5-9977-7d9b204648da", + "bindingPath": "jkD_JKJE", + "bindingField": "jkD_JKJE" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "DateBox", + "format": "'yyyy-MM-dd'" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "借款日期", + "id": "b5fb787d-460d-4054-85ed-3de00a5cc20d", + "type": { + "$type": "DateTimeType", + "name": "DateTime", + "displayName": "日期时间" + }, + "path": "JKD_JKRQ", + "label": "jkD_JKRQ", + "code": "JKD_JKRQ", + "originalId": "b5fb787d-460d-4054-85ed-3de00a5cc20d", + "bindingPath": "jkD_JKRQ", + "bindingField": "jkD_JKRQ" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "DateBox", + "format": "'yyyy-MM-dd'" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "还款日期", + "id": "114ac11a-60c2-42c0-9959-030e2ac59375", + "type": { + "$type": "DateTimeType", + "name": "DateTime", + "displayName": "日期时间" + }, + "path": "JKD_HKRQ", + "label": "jkD_HKRQ", + "code": "JKD_HKRQ", + "originalId": "114ac11a-60c2-42c0-9959-030e2ac59375", + "bindingPath": "jkD_HKRQ", + "bindingField": "jkD_HKRQ" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "MultiTextBox" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "备注", + "id": "f183f705-f534-4d7b-ac9b-05da2d49aaeb", + "type": { + "$type": "TextType", + "length": 0, + "name": "Text", + "displayName": "文本" + }, + "path": "JKD_NOTE", + "label": "jkD_NOTE", + "code": "JKD_NOTE", + "originalId": "f183f705-f534-4d7b-ac9b-05da2d49aaeb", + "bindingPath": "jkD_NOTE", + "bindingField": "jkD_NOTE" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "TextBox" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "创建人", + "id": "ff630349-2c65-4f14-9c6e-7a8f33360dd1", + "type": { + "$type": "StringType", + "length": 128, + "name": "String", + "displayName": "字符串" + }, + "path": "Creator", + "label": "creator", + "code": "Creator", + "originalId": "ff630349-2c65-4f14-9c6e-7a8f33360dd1", + "bindingPath": "creator", + "bindingField": "creator" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "DateBox", + "format": "'yyyy-MM-dd'" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "创建时间", + "id": "c1417328-2327-4be6-b2d9-16aea44979c9", + "type": { + "$type": "DateTimeType", + "name": "DateTime", + "displayName": "日期时间" + }, + "path": "CreatedDate", + "label": "createdDate", + "code": "CreatedDate", + "originalId": "c1417328-2327-4be6-b2d9-16aea44979c9", + "bindingPath": "createdDate", + "bindingField": "createdDate" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "TextBox" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "最后修改人", + "id": "bad1b510-359d-4e74-935c-d7f3f3b61f22", + "type": { + "$type": "StringType", + "length": 128, + "name": "String", + "displayName": "字符串" + }, + "path": "LastModifier", + "label": "lastModifier", + "code": "LastModifier", + "originalId": "bad1b510-359d-4e74-935c-d7f3f3b61f22", + "bindingPath": "lastModifier", + "bindingField": "lastModifier" + }, + { + "$type": "SimpleField", + "defaultValue": "", + "editor": { + "$type": "DateBox", + "format": "'yyyy-MM-dd'" + }, + "require": false, + "multiLanguage": false, + "readonly": false, + "name": "最后修改时间", + "id": "a6ba3039-4344-4c89-8552-5886c9ba3b37", + "type": { + "$type": "DateTimeType", + "name": "DateTime", + "displayName": "日期时间" + }, + "path": "LastModifiedDate", + "label": "lastModifiedDate", + "code": "LastModifiedDate", + "originalId": "a6ba3039-4344-4c89-8552-5886c9ba3b37", + "bindingPath": "lastModifiedDate", + "bindingField": "lastModifiedDate" + } + ], + "primary": "id", + "entities": [], + "name": "FYBXJKMXWxh", + "displayName": "费用报销借款明细" + }, + "label": "fybxjkmxWxhs", + "code": "FYBXJKMXWxh" + }, + { + "name": "附件", + "id": "2a7f9b73-1ec6-4b85-bc60-5a9926a5a6ee", + "type": { + "$type": "EntityType", + "entities": [], + "fields": [ + { + "$type": "SimpleField", + "require": true, + "multiLanguage": false, + "defaultValue": "", + "readonly": false, + "editor": { + "$type": "TextBox" + }, + "originalId": "422bc655-de98-4a64-9cb6-adfdb1d8626d", + "name": "主键", + "id": "422bc655-de98-4a64-9cb6-adfdb1d8626d", + "type": { + "$type": "StringType", + "length": 36, + "name": "String", + "displayName": "字符串" + }, + "path": "ID", + "bindingPath": "id", + "bindingField": "id", + "code": "ID", + "label": "id" + }, + { + "$type": "SimpleField", + "require": true, + "multiLanguage": false, + "defaultValue": "", + "readonly": false, + "editor": { + "$type": "TextBox" + }, + "originalId": "5024e959-0d94-4394-b43b-cf84ec71c472", + "name": "上级对象主键", + "id": "5024e959-0d94-4394-b43b-cf84ec71c472", + "type": { + "$type": "StringType", + "length": 36, + "name": "String", + "displayName": "字符串" + }, + "path": "ParentID", + "bindingPath": "parentID", + "bindingField": "parentID", + "code": "ParentID", + "label": "parentID" + }, + { + "$type": "ComplexField", + "originalId": "46aa683e-e84f-4abd-857e-b364e5dd3e62", + "name": "附件UDT", + "id": "46aa683e-e84f-4abd-857e-b364e5dd3e62", + "type": { + "$type": "ObjectType", + "name": "AttachmentInfo46aa", + "fields": [ + { + "$type": "SimpleField", + "require": false, + "multiLanguage": false, + "defaultValue": "", + "readonly": false, + "editor": { + "$type": "TextBox" + }, + "originalId": "ff73a947-4fd6-49ff-a18a-f466a068f905", + "name": "附件Id", + "id": "46aa683e-4fd6-49ff-a18a-f466a068f905", + "type": { + "$type": "StringType", + "length": 36, + "name": "String", + "displayName": "字符串" + }, + "path": "Attach.AttachmentId", + "bindingPath": "attach.attachmentId", + "bindingField": "attach_AttachmentId", + "code": "AttachmentId", + "label": "attachmentId" + }, + { + "$type": "SimpleField", + "require": false, + "multiLanguage": false, + "defaultValue": "", + "readonly": false, + "editor": { + "$type": "TextBox" + }, + "originalId": "026b07a9-1497-4526-86f9-290aab400e0b", + "name": "附件名称", + "id": "46aa683e-1497-4526-86f9-290aab400e0b", + "type": { + "$type": "StringType", + "length": 128, + "name": "String", + "displayName": "字符串" + }, + "path": "Attach.FileName", + "bindingPath": "attach.fileName", + "bindingField": "attach_FileName", + "code": "FileName", + "label": "fileName" + }, + { + "$type": "SimpleField", + "require": false, + "multiLanguage": false, + "defaultValue": "", + "readonly": false, + "editor": { + "$type": "NumericBox" + }, + "originalId": "6369fb66-dd56-4cab-a54b-577a65f9eb6e", + "name": "附件大小", + "id": "46aa683e-dd56-4cab-a54b-577a65f9eb6e", + "type": { + "$type": "NumericType", + "length": 128, + "name": "Number", + "displayName": "数字", + "precision": 8 + }, + "path": "Attach.FileSize", + "bindingPath": "attach.fileSize", + "bindingField": "attach_FileSize", + "code": "FileSize", + "label": "fileSize" + }, + { + "$type": "SimpleField", + "require": false, + "multiLanguage": false, + "defaultValue": "", + "readonly": false, + "editor": { + "$type": "DateBox", + "format": "'yyyy-MM-dd'" + }, + "originalId": "ff677864-a1f5-4f6c-9c82-ddb10864c652", + "name": "附件上传时间", + "id": "46aa683e-a1f5-4f6c-9c82-ddb10864c652", + "type": { + "$type": "DateTimeType", + "name": "DateTime", + "displayName": "日期时间" + }, + "path": "Attach.FileCreateTime", + "bindingPath": "attach.fileCreateTime", + "bindingField": "attach_FileCreateTime", + "code": "FileCreateTime", + "label": "fileCreateTime" + } + ], + "displayName": "附件信息" + }, + "path": "Attach", + "bindingPath": "attach", + "bindingField": "attach", + "code": "Attach", + "label": "attach" + }, + { + "$type": "SimpleField", + "require": false, + "multiLanguage": false, + "defaultValue": "", + "readonly": false, + "editor": { + "$type": "TextBox" + }, + "originalId": "ec2ff50d-2138-44d9-b619-36968bb2d1e8", + "name": "名称", + "id": "ec2ff50d-2138-44d9-b619-36968bb2d1e8", + "type": { + "$type": "StringType", + "length": 36, + "name": "String", + "displayName": "字符串" + }, + "path": "Name", + "bindingPath": "name", + "bindingField": "name", + "code": "Name", + "label": "name" + } + ], + "primary": "id", + "name": "SalesOrderAttach", + "displayName": "附件" + }, + "code": "SalesOrderAttach", + "label": "salesOrderAttachs" + } + ], + "name": "FYBXDWxh", + "displayName": "费用报销单" + }, + "label": "fybxdWxhs", + "code": "FYBXDWxh" + } + ], + "eapiId": "258bb32c-bbdc-4ffc-b450-86e7a780777e", + "voPath": "igix02/cardForms/cardForm01/bo-cardform01-front/metadata/components", + "voNameSpace": "Inspur.GS.igix02.cardForms.cardForm01.cardForm01.Front", + "eapiCode": "ListCard01_frm", + "eapiName": "ListCard01_frm", + "eapiNameSpace": "Inspur.GS.igix02.cardForms.cardForm01.cardForm01.Front" + } + ], + "states": [], + "contents": [], + "stateMachines": [ + { + "id": "ListCard01_state_machine", + "name": "ListCard01状态机", + "uri": "69212797-a952-4adc-b8ff-8dd370750ce3", + "nameSpace": "Inspur.GS.igix02.cardForms.cardForm01.cardForm01.Front", + "code": "ListCard01_frm" + } + ], + "viewmodels": [ + { + "id": "root-viewmodel", + "code": "root-viewmodel", + "name": "费用报销单", + "fields": [], + "stateMachine": "ListCard01_state_machine", + "serviceRefs": [], + "commands": [], + "states": [ + { + "id": "88df8aa7-36a4-4088-a56e-2bf3023da902", + "code": "dd", + "name": "梵蒂冈的dd", + "type": "String", + "category": "locale" + } + ], + "bindTo": "/", + "enableUnifiedSession": false + }, + { + "id": "data-grid-component-viewmodel", + "code": "data-grid-component-viewmodel", + "name": "费用报销单", + "fields": [ + { + "type": "Form", + "id": "8316a964-114c-4803-9d27-b4a3da3848f4", + "fieldName": "employeeID", + "groupId": null, + "groupName": null, + "updateOn": "blur" + }, + { + "type": "Form", + "id": "fc56451d-7cbf-4cd8-bb6f-dcbbf47e3550", + "fieldName": "billCode", + "groupId": null, + "groupName": null, + "updateOn": "blur" + }, + { + "type": "Form", + "id": "06058119-c97a-4e12-b48e-79670e105139", + "fieldName": "totalSum", + "groupId": null, + "groupName": null, + "updateOn": "blur" + } + ], + "commands": [ + { + "id": "fda876c8-7230-46e7-af3d-d38233642275", + "code": "loadList1", + "name": "加载列表数据", + "params": [ + { + "name": "filter", + "shownName": "过滤条件", + "value": "", + "defaultValue": null + }, + { + "name": "sort", + "shownName": "排序条件", + "value": "", + "defaultValue": null + } + ], + "handlerName": "loadList", + "cmpId": "7c48ef46-339c-42d4-8365-a21236c63044", + "shortcut": {}, + "extensions": [], + "isInvalid": false + }, + { + "id": "22576fc1-08fb-49a9-b132-295c7392b481", + "code": "remove1", + "name": "删除当前数据", + "params": [ + { + "name": "id", + "shownName": "待删除数据的标识", + "value": "{DATA~/data-grid-component/id}", + "defaultValue": null + }, + { + "name": "refreshCommandName", + "shownName": "删除后回调方法", + "value": "", + "defaultValue": null + }, + { + "name": "refreshCommandFrameId", + "shownName": "目标组件", + "value": "", + "defaultValue": null + }, + { + "name": "ifSave", + "shownName": "是否执行保存", + "value": "", + "defaultValue": null + }, + { + "name": "successMsg", + "shownName": "删除成功提示信息", + "value": "", + "defaultValue": null + } + ], + "handlerName": "remove", + "cmpId": "7c48ef46-339c-42d4-8365-a21236c63044", + "shortcut": {}, + "extensions": [], + "isInvalid": false + }, + { + "id": "8788c27e-722a-4b98-9d57-98eafb526fe5", + "code": "loadCard1", + "name": "加载卡片数据", + "params": [], + "handlerName": "loadCard", + "cmpId": "7c48ef46-339c-42d4-8365-a21236c63044", + "shortcut": {}, + "extensions": [], + "isInvalid": false + }, + { + "id": "ef281c13-4480-4256-901e-4bef5f92bd9e", + "code": "add1", + "name": "新增一条数据", + "params": [], + "handlerName": "add", + "cmpId": "7c48ef46-339c-42d4-8365-a21236c63044", + "shortcut": {}, + "extensions": [], + "isInvalid": false + }, + { + "id": "e7cf83c2-e52d-4dce-aded-047a819c8068", + "code": "changePage1", + "name": "切换页码", + "params": [ + { + "name": "loadCommandName", + "shownName": "切换页面后回调方法", + "value": "loadList1", + "defaultValue": null + }, + { + "name": "loadCommandFrameId", + "shownName": "目标组件", + "value": "data-grid-component", + "defaultValue": null + } + ], + "handlerName": "changePage", + "cmpId": "7c48ef46-339c-42d4-8365-a21236c63044", + "shortcut": {}, + "extensions": [], + "isInvalid": false + }, + { + "id": "fa47fbf9-4ab7-44a3-8af1-a2531bac2af6", + "code": "datagridcomponentviewmodelFilter1", + "name": "过滤列表数据1", + "params": [ + { + "name": "commandName", + "shownName": "过滤回调方法", + "value": "loadList1", + "defaultValue": null + }, + { + "name": "frameId", + "shownName": "目标组件", + "value": "data-grid-component", + "defaultValue": null + } + ], + "handlerName": "Filter", + "cmpId": "70b4abd4-9f2c-4b7c-90e9-6ac6f4b74c72", + "shortcut": {}, + "extensions": [], + "isInvalid": false + }, + { + "id": "2edb99f5-63a3-4f30-a15e-3313fdf6ace8", + "code": "datagridcomponentviewmodelremoveFileRows1", + "name": "批量删除文件数据1", + "params": [ + { + "name": "fileInfoFieldPath", + "shownName": "文件信息字段路径", + "value": "", + "defaultValue": null + } + ], + "handlerName": "removeFileRows", + "cmpId": "31c1022c-ab40-4e8d-bc31-85d539f1d36c", + "shortcut": {}, + "extensions": [], + "isInvalid": false + } + ], + "serviceRefs": [], + "states": [], + "bindTo": "/", + "parent": "root-viewmodel", + "pagination": { + "enable": true, + "pageSize": 20, + "pageList": "10,20,30,50,100" + }, + "enableValidation": false, + "allowEmpty": true + }, + { + "id": "detail-form-component-viewmodel", + "code": "detail-form-component-viewmodel", + "name": "费用报销单", + "fields": [ + { + "type": "Form", + "id": "8316a964-114c-4803-9d27-b4a3da3848f4", + "fieldName": "employeeID", + "groupId": null, + "groupName": null, + "updateOn": "blur", + "fieldSchema": { + "editor": { + "$type": "EnumField" + }, + "name": "报销人员", + "require": false, + "readonly": false, + "type": { + "enumValues": [ + { + "disabled": false, + "value": "SJFY", + "name": "手机费" + }, + { + "disabled": true, + "value": "JTFY", + "name": "交通费" + }, + { + "disabled": false, + "value": "CLFY", + "name": "差旅费" + }, + { + "disabled": false, + "value": "QT1", + "name": "其他1" + }, + { + "disabled": false, + "value": "QT2", + "name": "其他2" + }, + { + "disabled": false, + "value": "QT3", + "name": "其他3" + }, + { + "disabled": false, + "value": "QT4", + "name": "其他4" + }, + { + "disabled": false, + "value": "QT5", + "name": "其他5" + }, + { + "disabled": false, + "value": "QT6", + "name": "其他6" + }, + { + "disabled": false, + "value": "QT7", + "name": "其他7" + }, + { + "disabled": false, + "value": "aa", + "name": "aa" + }, + { + "disabled": false, + "value": "bbb", + "name": "bbb" + }, + { + "disabled": false, + "value": "ccc", + "name": "ccc" + }, + { + "disabled": false, + "value": "ddd", + "name": "ddd" + }, + { + "disabled": false, + "value": "wewe", + "name": "wwe" + }, + { + "disabled": false, + "value": "323", + "name": "23" + }, + { + "disabled": false, + "value": "xcvxv", + "name": "xxzfs" + }, + { + "disabled": false, + "value": "ceeee", + "name": "cddd" + } + ] + } + } + }, + { + "type": "Form", + "id": "417fa398-ef66-4499-8adc-ea899952613b", + "fieldName": "domainID", + "groupId": null, + "groupName": null, + "updateOn": "blur", + "fieldSchema": { + "editor": { + "$type": "LookupEdit", + "dataSource": { + "uri": "FYBXDWxh.domainID", + "displayName": "系统用户帮助", + "idField": "id", + "type": "ViewObject" + }, + "valueField": "id", + "textField": "name", + "displayType": "List", + "mapFields": "", + "helpId": "915a0b20-975a-4df1-8cfd-888c3dda0009" + }, + "name": "所属部门", + "require": false, + "readonly": false + } + }, + { + "type": "Form", + "id": "06058119-c97a-4e12-b48e-79670e105139", + "fieldName": "totalSum", + "groupId": null, + "groupName": null, + "updateOn": "blur" + }, + { + "type": "Form", + "id": "fc56451d-7cbf-4cd8-bb6f-dcbbf47e3550", + "fieldName": "billCode", + "groupId": "", + "groupName": "", + "valueChanging": "", + "valueChanged": "", + "updateOn": "blur", + "fieldSchema": { + "editor": { + "$type": "TextBox" + } + } + }, + { + "type": "Form", + "id": "49cafd4f-2c1b-41f4-bd49-79de929e7a1b", + "fieldName": "billType", + "groupId": "", + "groupName": "", + "valueChanging": "", + "valueChanged": "", + "updateOn": "change", + "fieldSchema": { + "editor": { + "$type": "EnumField" + } + } + } + ], + "commands": [ + { + "id": "d12acc4e-6274-44dc-95e6-cedeb5e66707", + "code": "edit1", + "name": "编辑数据", + "params": [ + { + "name": "id", + "shownName": "待编辑数据的标识", + "value": "{DATA~/detail-form-component/id}", + "defaultValue": null + }, + { + "name": "transitionAction", + "shownName": "状态机动作", + "value": "Edit", + "defaultValue": null + } + ], + "handlerName": "edit", + "cmpId": "7c48ef46-339c-42d4-8365-a21236c63044", + "shortcut": {}, + "extensions": [], + "isInvalid": false + }, + { + "id": "5707d460-c441-45c4-8fe1-f77abd9f75b1", + "code": "save1", + "name": "保存变更", + "params": [ + { + "name": "loadCmdName", + "shownName": "保存后回调方法", + "value": "", + "defaultValue": null + }, + { + "name": "loadCmdFrameId", + "shownName": "目标组件", + "value": "", + "defaultValue": null + }, + { + "name": "successMsg", + "shownName": "保存成功提示信息", + "value": "", + "defaultValue": null + } + ], + "handlerName": "save", + "cmpId": "7c48ef46-339c-42d4-8365-a21236c63044", + "shortcut": {}, + "extensions": [], + "isInvalid": false + }, + { + "id": "b3897b4b-a37f-48e3-afb3-8489cec02806", + "code": "cancel1", + "name": "取消变更", + "params": [ + { + "name": "loadCmdName", + "shownName": "取消后回调方法", + "value": "", + "defaultValue": null + }, + { + "name": "loadCmdFrameId", + "shownName": "目标组件", + "value": "", + "defaultValue": null + } + ], + "handlerName": "cancel", + "cmpId": "7c48ef46-339c-42d4-8365-a21236c63044", + "shortcut": {}, + "extensions": [], + "isInvalid": false + } + ], + "serviceRefs": [], + "states": [ + { + "id": "78203c63-898b-44c7-8103-40fe00158c4a", + "category": "locale", + "code": "isTestEnum1Visible", + "name": "isTestEnum1Visible", + "type": "Boolean" + } + ], + "bindTo": "/", + "parent": "root-viewmodel", + "enableValidation": true + }, + { + "id": "fybxdmxwxh-l5rr-component-viewmodel", + "code": "fybxdmxwxh-l5rr-component-viewmodel", + "name": "费用报销单明细", + "bindTo": "/fybxdmxWxhs", + "parent": "root-viewmodel", + "fields": [ + { + "type": "Form", + "id": "25557dd7-56b4-419e-aad0-de1b54bfee31", + "fieldName": "id", + "groupId": null, + "groupName": null, + "updateOn": "blur", + "fieldSchema": {} + }, + { + "type": "Form", + "id": "e3f17427-7824-42d3-bc1a-e3d41f0076e1", + "fieldName": "parentID", + "groupId": null, + "groupName": null, + "updateOn": "blur", + "fieldSchema": {} + }, + { + "type": "Form", + "id": "4f801f00-b0d5-48e5-8bcc-f88486ae8520", + "fieldName": "billDetailDate", + "groupId": null, + "groupName": null, + "updateOn": "blur", + "fieldSchema": {} + }, + { + "type": "Form", + "id": "a47bc34b-5070-4d72-8aaf-d7dcb8385118", + "fieldName": "billDetailAmount", + "groupId": null, + "groupName": null, + "updateOn": "blur", + "fieldSchema": {} + }, + { + "type": "Form", + "id": "5d3a34e2-08f8-4298-8ea1-1e3c060f49b0", + "fieldName": "billDetailNote", + "groupId": null, + "groupName": null, + "updateOn": "blur", + "fieldSchema": {} + }, + { + "type": "Form", + "id": "525b9081-9c36-4ecb-8cb0-795bf1232ed1", + "fieldName": "invoiceNO", + "groupId": null, + "groupName": null, + "updateOn": "blur", + "fieldSchema": {} + } + ], + "commands": [ + { + "id": "c883b753-69ce-4954-96a7-0e1965424262", + "code": "fybxdmxwxhl5rrAddItem1", + "name": "增加一条子表数据1", + "params": [], + "handlerName": "AddItem", + "cmpId": "45be24f9-c1f7-44f7-b447-fe2ada458a61", + "shortcut": {}, + "extensions": [] + }, + { + "id": "c02ea525-57fe-472d-bb28-ff755f3695f5", + "code": "fybxdmxwxhl5rrRemoveItem1", + "name": "删除一条子表数据1", + "params": [ + { + "name": "id", + "shownName": "待删除子表数据的标识", + "value": "{DATA~/#{fybxdmxwxh-l5rr-component}/fybxdmxWxhs/id}" + } + ], + "handlerName": "RemoveItem", + "cmpId": "45be24f9-c1f7-44f7-b447-fe2ada458a61", + "shortcut": {}, + "extensions": [] + } + ], + "states": [], + "enableValidation": true, + "pagination": { + "enable": false + }, + "allowEmpty": true + }, + { + "id": "fybxjkmxwxh-73yo-component-viewmodel", + "code": "fybxjkmxwxh-73yo-component-viewmodel", + "name": "费用报销借款明细", + "bindTo": "/fybxjkmxWxhs", + "parent": "root-viewmodel", + "fields": [ + { + "type": "Form", + "id": "ec6523d1-c5c8-4626-8fd5-46ec8a3e5875", + "fieldName": "id", + "groupId": null, + "groupName": null, + "updateOn": "blur", + "fieldSchema": {} + }, + { + "type": "Form", + "id": "081a30bb-f339-4d9a-9ca0-d03e748d618b", + "fieldName": "parentID", + "groupId": null, + "groupName": null, + "updateOn": "blur", + "fieldSchema": {} + }, + { + "type": "Form", + "id": "cbc92c22-a1be-4741-a280-acc3ca1cb342", + "fieldName": "jkD_NM", + "groupId": null, + "groupName": null, + "updateOn": "blur", + "fieldSchema": {} + }, + { + "type": "Form", + "id": "a11eae89-459e-4ea2-a452-caedf3eedeb5", + "fieldName": "jkD_BXDNM", + "groupId": null, + "groupName": null, + "updateOn": "blur", + "fieldSchema": {} + }, + { + "type": "Form", + "id": "612ca50e-685f-465b-ae1b-d45fb7bf9d4d", + "fieldName": "jkD_BH", + "groupId": null, + "groupName": null, + "updateOn": "blur", + "fieldSchema": {} + }, + { + "type": "Form", + "id": "d88367a5-9e18-461c-9196-59eca7c72967", + "fieldName": "jkD_JKR", + "groupId": null, + "groupName": null, + "updateOn": "blur", + "fieldSchema": {} + }, + { + "type": "Form", + "id": "caa72303-6a41-4cd5-9977-7d9b204648da", + "fieldName": "jkD_JKJE", + "groupId": null, + "groupName": null, + "updateOn": "blur", + "fieldSchema": {} + }, + { + "type": "Form", + "id": "b5fb787d-460d-4054-85ed-3de00a5cc20d", + "fieldName": "jkD_JKRQ", + "groupId": null, + "groupName": null, + "updateOn": "blur", + "fieldSchema": {} + }, + { + "type": "Form", + "id": "114ac11a-60c2-42c0-9959-030e2ac59375", + "fieldName": "jkD_HKRQ", + "groupId": null, + "groupName": null, + "updateOn": "blur", + "fieldSchema": {} + }, + { + "type": "Form", + "id": "f183f705-f534-4d7b-ac9b-05da2d49aaeb", + "fieldName": "jkD_NOTE", + "groupId": null, + "groupName": null, + "updateOn": "blur", + "fieldSchema": {} + }, + { + "type": "Form", + "id": "ff630349-2c65-4f14-9c6e-7a8f33360dd1", + "fieldName": "creator", + "groupId": null, + "groupName": null, + "updateOn": "blur", + "fieldSchema": {} + }, + { + "type": "Form", + "id": "c1417328-2327-4be6-b2d9-16aea44979c9", + "fieldName": "createdDate", + "groupId": null, + "groupName": null, + "updateOn": "blur", + "fieldSchema": {} + }, + { + "type": "Form", + "id": "bad1b510-359d-4e74-935c-d7f3f3b61f22", + "fieldName": "lastModifier", + "groupId": null, + "groupName": null, + "updateOn": "blur", + "fieldSchema": {} + }, + { + "type": "Form", + "id": "a6ba3039-4344-4c89-8552-5886c9ba3b37", + "fieldName": "lastModifiedDate", + "groupId": null, + "groupName": null, + "updateOn": "blur", + "fieldSchema": {} + } + ], + "commands": [ + { + "id": "7142f821-5754-46cb-baec-c95389f6dbca", + "code": "fybxjkmxwxh73yoAddItem1", + "name": "增加一条子表数据1", + "params": [], + "handlerName": "AddItem", + "cmpId": "45be24f9-c1f7-44f7-b447-fe2ada458a61", + "shortcut": {}, + "extensions": [] + }, + { + "id": "ad8c714b-7422-40f5-bfd9-f124865ab3c2", + "code": "fybxjkmxwxh73yoRemoveItem1", + "name": "删除一条子表数据1", + "params": [ + { + "name": "id", + "shownName": "待删除子表数据的标识", + "value": "{DATA~/#{fybxjkmxwxh-73yo-component}/fybxjkmxWxhs/id}" + } + ], + "handlerName": "RemoveItem", + "cmpId": "45be24f9-c1f7-44f7-b447-fe2ada458a61", + "shortcut": {}, + "extensions": [] + } + ], + "states": [], + "enableValidation": true, + "pagination": { + "enable": false + }, + "allowEmpty": true + } + ], + "components": [ + { + "id": "root-component", + "type": "Component", + "componentType": "Frame", + "viewModel": "root-viewmodel", + "onInit": "", + "contents": [ + { + "id": "root-layout", + "type": "ContentContainer", + "appearance": { + "class": "f-page f-page-navigate f-page-is-grid-card" + }, + "size": null, + "contents": [ + { + "id": "page-header", + "type": "ContentContainer", + "appearance": { + "class": "f-page-header" + }, + "size": null, + "contents": [ + { + "id": "header-nav", + "type": "ContentContainer", + "appearance": { + "class": "f-page-header-base" + }, + "size": null, + "contents": [ + { + "id": "header-title-container", + "type": "ContentContainer", + "appearance": { + "class": "f-title" + }, + "size": null, + "contents": [ + { + "id": "page-header-title", + "type": "HtmlTemplate", + "html": "

ListCard01

" + } + ], + "visible": true, + "isScrollspyContainer": false, + "draggable": false, + "isLikeCardContainer": false + }, + { + "id": "page-header-toolbar", + "type": "ToolBar", + "appearance": { + "class": "col-7 f-toolbar" + }, + "size": null, + "items": [ + { + "id": "button-add", + "type": "ToolBarItem", + "appearance": { + "class": "btn-primary" + }, + "disable": "!viewModel.stateMachine['canAdd']", + "text": "新增", + "visible": true, + "click": "root-viewmodel.data-grid-component-viewmodel.add1", + "items": [], + "usageMode": "button", + "modalConfig": null, + "visibleControlledByRules": true, + "disableControlledByRules": true + }, + { + "id": "button-edit", + "type": "ToolBarItem", + "appearance": null, + "disable": "!viewModel.stateMachine['canEdit']", + "text": "编辑", + "visible": true, + "click": "root-viewmodel.detail-form-component-viewmodel.edit1", + "items": [], + "usageMode": "button", + "modalConfig": null, + "visibleControlledByRules": true, + "disableControlledByRules": true + }, + { + "id": "button-save", + "type": "ToolBarItem", + "appearance": null, + "disable": "!viewModel.stateMachine['canSave']", + "text": "保存", + "visible": true, + "click": "root-viewmodel.detail-form-component-viewmodel.save1", + "items": [], + "usageMode": "button", + "modalConfig": null, + "visibleControlledByRules": true, + "disableControlledByRules": true + }, + { + "id": "button-cancel", + "type": "ToolBarItem", + "appearance": null, + "disable": "!viewModel.stateMachine['canCancel']", + "text": "取消", + "visible": true, + "click": "root-viewmodel.detail-form-component-viewmodel.cancel1", + "items": [], + "usageMode": "button", + "modalConfig": null, + "visibleControlledByRules": true, + "disableControlledByRules": true + }, + { + "id": "button-delete", + "type": "ToolBarItem", + "appearance": null, + "disable": "!viewModel.stateMachine['canRemove']", + "text": "删除", + "visible": true, + "click": "root-viewmodel.data-grid-component-viewmodel.remove1", + "items": [], + "usageMode": "button", + "modalConfig": null, + "visibleControlledByRules": true, + "disableControlledByRules": true + } + ], + "visible": true, + "buttonSize": "default", + "popDirection": "default" + } + ], + "visible": true, + "isScrollspyContainer": false, + "draggable": false, + "isLikeCardContainer": false + } + ], + "visible": true, + "isScrollspyContainer": false, + "draggable": false, + "isLikeCardContainer": false + }, + { + "id": "main-container", + "type": "ContentContainer", + "appearance": { + "class": "f-page-main" + }, + "contents": [ + { + "id": "content-splitter", + "type": "Splitter", + "appearance": { + "class": "f-page-content " + }, + "size": null, + "contents": [ + { + "id": "content-list", + "type": "SplitterPane", + "appearance": { + "class": "f-col-w6 f-page-content-nav" + }, + "size": null, + "resizable": true, + "resizeHandlers": "e", + "contents": [ + { + "id": "data-grid-component-ref", + "type": "ComponentRef", + "component": "data-grid-component", + "visible": true + } + ], + "visible": true + }, + { + "id": "content-main", + "type": "SplitterPane", + "appearance": { + "class": "f-page-content-main" + }, + "size": null, + "contents": [ + { + "id": "detail-component-ref", + "type": "ComponentRef", + "component": "detail-form-component", + "visible": true + }, + { + "id": "container_1103", + "type": "ContentContainer", + "appearance": { + "class": "f-struct-wrapper" + }, + "visible": true, + "contents": [ + { + "id": "section_1103", + "type": "Section", + "appearance": { + "class": "f-section-tabs f-section-in-main" + }, + "visible": true, + "mainTitle": "主标题", + "subTitle": "", + "headerClass": "", + "titleClass": "", + "extendedHeaderAreaClass": "", + "toolbarClass": "", + "extendedAreaClass": "", + "contentTemplateClass": "", + "fill": false, + "expanded": true, + "enableMaximize": false, + "enableAccordion": true, + "accordionMode": "default", + "showHeader": false, + "headerTemplate": "", + "titleTemplate": "", + "extendedHeaderAreaTemplate": "", + "toolbarTemplate": "", + "extendedAreaTemplate": "", + "contents": [ + { + "id": "tab_1103", + "type": "Tab", + "controlSource": "Farris", + "appearance": { + "class": "f-component-tabs" + }, + "selected": "tabpage_1103", + "size": null, + "position": "top", + "contentFill": false, + "autoTitleWidth": true, + "titleLength": 7, + "contents": [ + { + "id": "tabpage_1103", + "type": "TabPage", + "controlSource": "Farris", + "title": "费用报销借款明细", + "appearance": { + "class": "", + "style": "" + }, + "size": { + "width": null + }, + "removeable": false, + "headerTemplate": null, + "contents": [ + { + "id": "fybxdmxwxh-l5rr-component-ref", + "type": "ComponentRef", + "component": "fybxdmxwxh-l5rr-component", + "visible": true + } + ], + "toolbar": { + "id": "tab_toolbar_1103", + "type": "TabToolbar", + "position": "inHead", + "contents": [ + { + "id": "fybxdmxwxh-l5rr-component-button-add", + "type": "TabToolbarItem", + "title": "新增", + "disable": false, + "appearance": { + "class": "btn btn-secondary f-btn-ml" + }, + "visible": true, + "click": "root-viewModel.fybxdmxwxh-l5rr-component-viewmodel.fybxdmxwxhl5rrAddItem1", + "visibleControlledByRules": true, + "disableControlledByRules": true, + "items": [], + "split": false + }, + { + "id": "fybxdmxwxh-l5rr-component-button-remove", + "type": "TabToolbarItem", + "title": "删除", + "disable": false, + "appearance": { + "class": "btn btn-secondary f-btn-ml" + }, + "visible": true, + "click": "root-viewModel.fybxdmxwxh-l5rr-component-viewmodel.fybxdmxwxhl5rrRemoveItem1", + "visibleControlledByRules": true, + "disableControlledByRules": true, + "items": [], + "split": false + } + ] + }, + "enableExtend": false, + "extendTemplate": "", + "visible": true + }, + { + "id": "tabpage_8177", + "type": "TabPage", + "controlSource": "Farris", + "title": "费用报销借款明细", + "appearance": { + "class": "", + "style": "" + }, + "size": { + "width": null + }, + "removeable": false, + "headerTemplate": null, + "contents": [ + { + "id": "fybxjkmxwxh-73yo-component-ref", + "type": "ComponentRef", + "component": "fybxjkmxwxh-73yo-component", + "visible": true + } + ], + "toolbar": { + "id": "tab_toolbar_8177", + "type": "TabToolbar", + "position": "inHead", + "contents": [ + { + "id": "fybxjkmxwxh-73yo-component-button-add", + "type": "TabToolbarItem", + "title": "新增", + "disable": false, + "appearance": { + "class": "btn btn-secondary f-btn-ml" + }, + "visible": true, + "click": "root-viewModel.fybxjkmxwxh-73yo-component-viewmodel.fybxjkmxwxh73yoAddItem1", + "visibleControlledByRules": true, + "disableControlledByRules": true, + "items": [], + "split": false + }, + { + "id": "fybxjkmxwxh-73yo-component-button-remove", + "type": "TabToolbarItem", + "title": "删除", + "disable": false, + "appearance": { + "class": "btn btn-secondary f-btn-ml" + }, + "visible": true, + "click": "root-viewModel.fybxjkmxwxh-73yo-component-viewmodel.fybxjkmxwxh73yoRemoveItem1", + "visibleControlledByRules": true, + "disableControlledByRules": true, + "items": [], + "split": false + } + ] + }, + "enableExtend": false, + "extendTemplate": "", + "visible": true + } + ], + "tabChange": null, + "tabRemove": null, + "visible": true, + "beforeSelect": null, + "currentTabPageInDesignerView": "tabpage_1103" + } + ], + "isScrollSpyItem": false, + "toolbar": { + "type": "SectionToolbar", + "position": "inHead", + "contents": [] + } + } + ], + "isScrollspyContainer": false, + "isLikeCardContainer": false + } + ], + "visible": true, + "resizable": false, + "resizeHandlers": "" + } + ], + "visible": true, + "orientation": "horizontal", + "draggable": false + } + ], + "visible": true, + "isScrollspyContainer": false, + "draggable": false, + "isLikeCardContainer": false + } + ], + "visible": true, + "isScrollspyContainer": false, + "draggable": false, + "isLikeCardContainer": false + } + ], + "appearance": null, + "visible": true, + "afterViewInit": null + }, + { + "id": "data-grid-component", + "type": "Component", + "componentType": "dataGrid", + "viewModel": "data-grid-component-viewmodel", + "appearance": { + "class": "f-struct-wrapper f-utils-fill-flex-column" + }, + "onInit": "loadList1", + "contents": [ + { + "id": "data-grid-section", + "type": "Section", + "appearance": { + "class": "f-section-grid f-section-in-nav" + }, + "size": null, + "visible": true, + "mainTitle": "", + "subTitle": "", + "headerClass": "", + "titleClass": "", + "extendedHeaderAreaClass": "", + "toolbarClass": "", + "extendedAreaClass": "", + "contentTemplateClass": "", + "fill": false, + "expanded": true, + "enableMaximize": true, + "enableAccordion": true, + "accordionMode": "default", + "showHeader": false, + "headerTemplate": "", + "titleTemplate": "", + "extendedHeaderAreaTemplate": "", + "toolbarTemplate": "", + "extendedAreaTemplate": "", + "contents": [ + { + "id": "dataGrid", + "type": "DataGrid", + "controlSource": "Farris", + "appearance": { + "class": "f-component-grid" + }, + "size": null, + "dataSource": "fybxdWxhs", + "fields": [ + { + "id": "employeeID_8316a964_rnt1", + "type": "GridField", + "controlSource": "Farris", + "caption": "报销人员", + "captionTemplate": null, + "dataField": "employeeID", + "dataType": "string", + "binding": { + "type": "Form", + "path": "employeeID", + "field": "8316a964-114c-4803-9d27-b4a3da3848f4" + }, + "enumData": null, + "appearance": null, + "size": { + "width": 120 + }, + "displayTemplate": null, + "editor": null, + "draggable": false, + "frozen": "none", + "sortable": true, + "sortOrder": null, + "resizeable": true, + "aggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "groupAggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "styler": "", + "colTemplate": "", + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "textAlign": "left", + "hAlign": "left", + "vAlign": "middle", + "formatter": { + "type": "none" + }, + "showTips": false, + "tipContent": null, + "multiLanguage": false, + "enableFilter": false, + "headerStyler": "", + "localization": false, + "path": "employeeID", + "readonly": false, + "idField": "value", + "textField": "name", + "visible": true, + "allowGrouping": true, + "tipMode": "auto", + "localizationType": "Date", + "captionTipContent": "", + "captionTipStyler": "", + "enableBatchEdit": false, + "visibleControlledByRules": true, + "readonlyControlledByRules": true + }, + { + "id": "billCode_fc56451d_4pga", + "type": "GridField", + "controlSource": "Farris", + "caption": "单据编号", + "captionTemplate": null, + "dataField": "billCode", + "dataType": "string", + "binding": { + "type": "Form", + "path": "billCode", + "field": "fc56451d-7cbf-4cd8-bb6f-dcbbf47e3550" + }, + "enumData": null, + "appearance": null, + "size": { + "width": 120 + }, + "displayTemplate": null, + "editor": null, + "draggable": false, + "frozen": "none", + "sortable": true, + "sortOrder": null, + "resizeable": true, + "aggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "groupAggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "styler": "", + "colTemplate": "", + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "textAlign": "left", + "hAlign": "left", + "vAlign": "middle", + "formatter": { + "type": "none" + }, + "showTips": false, + "tipContent": null, + "multiLanguage": false, + "enableFilter": false, + "headerStyler": "", + "localization": false, + "path": "billCode", + "readonly": false, + "idField": "value", + "textField": "name", + "visible": true, + "allowGrouping": true, + "tipMode": "auto", + "localizationType": "Date", + "captionTipContent": "", + "captionTipStyler": "", + "enableBatchEdit": false, + "visibleControlledByRules": true, + "readonlyControlledByRules": true + }, + { + "id": "totalSum_06058119_7jr9", + "type": "GridField", + "controlSource": "Farris", + "caption": "报帐金额", + "captionTemplate": null, + "dataField": "totalSum", + "dataType": "number", + "binding": { + "type": "Form", + "path": "totalSum", + "field": "06058119-c97a-4e12-b48e-79670e105139" + }, + "enumData": null, + "appearance": null, + "size": { + "width": 120 + }, + "displayTemplate": null, + "editor": null, + "draggable": false, + "frozen": "none", + "sortable": true, + "sortOrder": null, + "resizeable": true, + "aggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "groupAggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "styler": "", + "colTemplate": "", + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "textAlign": "left", + "hAlign": "left", + "vAlign": "middle", + "formatter": { + "type": "number", + "precision": 2, + "thousand": ",", + "decimal": "." + }, + "showTips": false, + "tipContent": null, + "multiLanguage": false, + "enableFilter": false, + "headerStyler": "", + "localization": false, + "path": "totalSum", + "readonly": false, + "idField": "value", + "textField": "name", + "visible": true, + "allowGrouping": true, + "tipMode": "auto", + "captionTipContent": "", + "captionTipStyler": "", + "enableBatchEdit": false, + "visibleControlledByRules": true, + "readonlyControlledByRules": true + } + ], + "focusedItem": null, + "focusedIndex": null, + "identifyField": null, + "multiSelect": false, + "selectable": null, + "showCheckbox": false, + "showAllCheckbox": false, + "checkOnSelect": false, + "selectOnCheck": false, + "itemTemplate": null, + "toolBar": null, + "summary": null, + "groupable": false, + "group": null, + "showGroupColumn": true, + "groupFormatter": null, + "groupStyler": null, + "groupFooter": false, + "onSelectionChange": "loadCard1", + "fieldEditable": false, + "appendRow": null, + "disable": "viewModel.stateMachine['editable']", + "pageChange": "changePage1", + "pageSizeChanged": "changePage1", + "fitColumns": false, + "autoFitColumns": false, + "styler": "", + "multiSort": false, + "showBorder": false, + "striped": true, + "showLineNumber": false, + "disableRow": null, + "beforeSelect": null, + "beforeUnSelect": null, + "beforeCheck": null, + "beforeUnCheck": null, + "dblClickRow": null, + "showFooter": false, + "footerTemplate": "", + "footerDataFrom": "client", + "footerDataCommand": null, + "enableFilterRow": false, + "remoteFilter": false, + "showFilterBar": false, + "useControlPanel": false, + "autoHeight": false, + "showSelectedList": false, + "selectedItemFormatter": null, + "lineNumberWidth": 36, + "enableMorePageSelect": false, + "pagination": true, + "lockPagination": "viewModel.stateMachine&&viewModel.stateMachine['editable']", + "showPageSize": false, + "editable": null, + "fixedColumns": [], + "enableCommandColumn": false, + "onEditClicked": "", + "onDeleteClicked": "", + "commandColumnWidth": 120, + "showCommandColumn": true, + "checkedChange": null, + "footerHeight": 29, + "filterType": "none", + "enableSmartFilter": false, + "lineNumberTitle": "", + "rowClick": null, + "headerWrap": false, + "emptyTemplate": null, + "emptyDataHeight": 240, + "rowHeight": 30, + "enableHighlightCell": false, + "enableEditCellStyle": false, + "showRowGroupPanel": false, + "enableDragColumn": false, + "groupSummaryPosition": "groupFooterRow", + "clearSelectionsWhenDataIsEmpty": true, + "keepSelect": true, + "enableEditByCard": "none", + "visible": true, + "showGotoInput": false, + "scrollBarShowMode": "auto", + "showScrollArrow": false, + "footerPosition": "bottom", + "footerStyler": null, + "selectOnEditing": false, + "selectionMode": "default", + "enableContextMenu": false, + "disableGroupOnEditing": true, + "enableSimpleMode": false, + "enableScheme": false, + "beforeEdit": null, + "nowrap": true, + "mergeCell": false, + "remoteSort": false, + "columnSorted": null, + "enableHeaderGroup": false, + "headerGroup": null, + "AutoColumnWidthUseDblclick": true, + "virtualized": false, + "virtualizedAsyncLoad": false, + "scrollYLoad": null, + "pagerContentTemplate": null, + "expandGroupRows": true, + "maxHeight": 0, + "draggable": false, + "useBlankWhenDataIsEmpty": false, + "pageList": "10,20,30,50,100", + "pageSize": 20, + "allowEmpty": true, + "checked": null, + "unChecked": null, + "checkAll": null, + "unCheckAll": null, + "filterChanged": null, + "enableEditStateFilterSorting": false, + "showConfirmWhenSchemeChanged": false, + "enableSetMultiHeaders": false + } + ], + "isScrollSpyItem": false, + "toolbar": { + "type": "SectionToolbar", + "position": "inHead", + "contents": [] + } + } + ], + "visible": true, + "afterViewInit": null + }, + { + "id": "detail-form-component", + "type": "Component", + "componentType": "form-col-1", + "viewModel": "detail-form-component-viewmodel", + "onInit": "", + "appearance": { + "class": "f-struct-wrapper" + }, + "contents": [ + { + "id": "detail-form-section", + "type": "Section", + "appearance": { + "class": "f-section-form f-section-in-main" + }, + "visible": true, + "mainTitle": "基本信息", + "subTitle": "", + "headerClass": "", + "titleClass": "", + "extendedHeaderAreaClass": "", + "toolbarClass": "", + "extendedAreaClass": "", + "contentTemplateClass": "", + "fill": false, + "expanded": true, + "enableMaximize": false, + "enableAccordion": false, + "accordionMode": "default", + "showHeader": true, + "headerTemplate": "", + "titleTemplate": "", + "extendedHeaderAreaTemplate": "", + "toolbarTemplate": "", + "extendedAreaTemplate": "", + "contents": [ + { + "id": "detail-form-layout", + "type": "Form", + "appearance": { + "class": "f-form-layout farris-form farris-form-controls-inline" + }, + "size": null, + "contents": [ + { + "id": "employeeID_8316a964_h043", + "type": "EnumField", + "titleSourceType": "static", + "title": "报销人员", + "controlSource": "Farris", + "appearance": { + "class": "col-12" + }, + "size": null, + "binding": { + "type": "Form", + "path": "employeeID", + "field": "8316a964-114c-4803-9d27-b4a3da3848f4", + "fullPath": "EmployeeID" + }, + "placeholder": "", + "readonly": "!viewModel.stateMachine['editable']", + "require": false, + "disable": false, + "enumData": [ + { + "disabled": false, + "value": "SJFY", + "name": "手机费" + }, + { + "disabled": true, + "value": "JTFY", + "name": "交通费" + }, + { + "disabled": false, + "value": "CLFY", + "name": "差旅费" + }, + { + "disabled": false, + "value": "QT1", + "name": "其他1" + }, + { + "disabled": false, + "value": "QT2", + "name": "其他2" + }, + { + "disabled": false, + "value": "QT3", + "name": "其他3" + }, + { + "disabled": false, + "value": "QT4", + "name": "其他4" + }, + { + "disabled": false, + "value": "QT5", + "name": "其他5" + }, + { + "disabled": false, + "value": "QT6", + "name": "其他6" + }, + { + "disabled": false, + "value": "QT7", + "name": "其他7" + }, + { + "disabled": false, + "value": "aa", + "name": "aa" + }, + { + "disabled": false, + "value": "bbb", + "name": "bbb" + }, + { + "disabled": false, + "value": "ccc", + "name": "ccc" + }, + { + "disabled": false, + "value": "ddd", + "name": "ddd" + }, + { + "disabled": false, + "value": "wewe", + "name": "wwe" + }, + { + "disabled": false, + "value": "323", + "name": "23" + }, + { + "disabled": false, + "value": "xcvxv", + "name": "xxzfs" + }, + { + "disabled": false, + "value": "ceeee", + "name": "cddd" + } + ], + "idField": "value", + "textField": "name", + "holdPlace": true, + "isTextArea": true, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "visible": false, + "tabindex": -1, + "hasDefaultFocus": false, + "focusState": null, + "titleWidth": null, + "multiSelect": false, + "uri": "", + "autoWidth": true, + "enableClear": false, + "onClear": null, + "valueChanged": null, + "onShown": null, + "onHidden": null, + "editable": false, + "enableCancelSelected": false, + "beforeShow": null, + "beforeHide": null, + "dataSourceType": "static", + "viewType": "text", + "noSearch": false, + "maxSearchLength": 36, + "enableAppend": false, + "inputAppendType": "button", + "inputAppendDisabled": false, + "autoHeight": false, + "maxHeight": 500, + "showDisabledItem": true, + "path": "employeeID", + "isRTControl": false, + "labelAutoOverflow": false, + "updateOn": "blur", + "visibleControlledByRules": true, + "readonlyControlledByRules": true, + "requireControlledByRules": true + }, + { + "id": "domainID_417fa398_h4dm", + "type": "LookupEdit", + "titleSourceType": "static", + "title": "所属部门", + "appearance": { + "class": "col-12" + }, + "size": null, + "binding": { + "type": "Form", + "path": "domainID", + "field": "417fa398-ef66-4499-8adc-ea899952613b", + "fullPath": "DomainID" + }, + "readonly": "!viewModel.stateMachine['editable']", + "require": false, + "disable": false, + "placeholder": "", + "dataSource": { + "uri": "FYBXDWxh.domainID", + "displayName": "系统用户帮助", + "idField": "id", + "type": "ViewObject" + }, + "textField": "name", + "valueField": "id", + "displayType": "List", + "multiSelect": false, + "pageList": "10,20,30,50", + "pageSize": 20, + "pageIndex": null, + "pagination": null, + "dialogTitle": "", + "showMaxButton": null, + "showCloseButton": null, + "resizable": null, + "buttonAlign": null, + "mapFields": "", + "lookupStyle": "popup", + "holdPlace": true, + "isTextArea": true, + "useTip": false, + "useFavorite": true, + "noSearch": false, + "maxSearchLength": 36, + "enableToSelect": true, + "isRecordSize": false, + "lookupPicking": null, + "lookupPicked": null, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "visible": false, + "enableExtendLoadMethod": true, + "editable": false, + "enableFullTree": false, + "enableClear": true, + "clear": null, + "loadTreeDataType": "default", + "expandLevel": -1, + "enableCascade": false, + "cascadeStatus": "enable", + "onShown": null, + "onHidden": null, + "beforeShow": null, + "beforeHide": null, + "tabindex": 0, + "hasDefaultFocus": false, + "focusState": null, + "titleWidth": null, + "textAlign": "left", + "useExtendInfo": false, + "extInfoFields": null, + "extInfoFormatter": null, + "customFormatter": null, + "customNavFormatter": null, + "selectFirstInNav": false, + "loadDataWhenOpen": true, + "onlySelectLeaf": "default", + "viewType": "text", + "autoHeight": false, + "maxHeight": 500, + "autoWidth": true, + "showHeader": true, + "beforeSelectData": null, + "enableAppend": false, + "inputAppendType": "button", + "inputAppendDisabled": false, + "enableContextMenu": false, + "quickSelect": { + "enable": false, + "showItemsCount": 10, + "formatter": null, + "showMore": true + }, + "treeToList": false, + "navTreeToList": false, + "showNavigation": true, + "showCascadeControl": true, + "linkConfig": { + "enable": false, + "config": [] + }, + "path": "domainID", + "isRTControl": false, + "labelAutoOverflow": false, + "updateOn": "blur", + "helpId": "915a0b20-975a-4df1-8cfd-888c3dda0009", + "showSelected": false, + "useNewLayout": false, + "enableMultiFieldSearch": false, + "separator": ",", + "visibleControlledByRules": true, + "readonlyControlledByRules": true, + "requireControlledByRules": true + }, + { + "id": "billCode_fc56451d_20oa", + "type": "TextBox", + "titleSourceType": "static", + "title": "单据编号", + "appearance": { + "class": "col-12 col-md-12 col-xl-12 col-el-12" + }, + "size": null, + "binding": { + "type": "Form", + "path": "billCode", + "field": "fc56451d-7cbf-4cd8-bb6f-dcbbf47e3550", + "fullPath": "BillCode" + }, + "readonly": "!viewModel.stateMachine['editable']", + "require": false, + "disable": false, + "placeholder": "", + "maxLength": 36, + "holdPlace": false, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "visible": true, + "isTextArea": true, + "isPassword": false, + "tabindex": 0, + "hasDefaultFocus": false, + "focusState": null, + "titleWidth": null, + "enableTips": true, + "enableAppend": false, + "inputAppendType": "button", + "inputAppendDisabled": false, + "path": "billCode", + "format": null, + "validation": null, + "value": null, + "formatValidation": { + "type": "none", + "expression": "", + "message": "" + }, + "autoHeight": false, + "maxHeight": 500, + "labelAutoOverflow": false, + "updateOn": "blur", + "fieldValueChanging": "", + "fieldValueChanged": "", + "visibleControlledByRules": true, + "readonlyControlledByRules": true, + "requireControlledByRules": true + }, + { + "id": "billType_49cafd4f_o0ec", + "type": "EnumField", + "titleSourceType": "static", + "title": "报销类型", + "controlSource": "Farris", + "appearance": { + "class": "col-12 col-md-12 col-xl-12 col-el-12" + }, + "size": null, + "binding": { + "type": "Form", + "path": "billType", + "field": "49cafd4f-2c1b-41f4-bd49-79de929e7a1b", + "fullPath": "BillType" + }, + "placeholder": "", + "readonly": "!viewModel.stateMachine['editable']", + "require": false, + "disable": false, + "enumData": [ + { + "disabled": false, + "name": "手机费", + "value": "SJFY" + }, + { + "disabled": true, + "name": "交通费", + "value": "JTFY" + }, + { + "disabled": false, + "name": "差旅费", + "value": "CLFY" + }, + { + "disabled": false, + "name": "其他1", + "value": "QT1" + }, + { + "disabled": false, + "name": "其他2", + "value": "QT2" + }, + { + "disabled": false, + "name": "其他3", + "value": "QT3" + }, + { + "disabled": false, + "name": "其他4", + "value": "QT4" + }, + { + "disabled": false, + "name": "其他5", + "value": "QT5" + }, + { + "disabled": false, + "name": "其他6", + "value": "QT6" + }, + { + "disabled": false, + "name": "其他7", + "value": "QT7" + } + ], + "idField": "value", + "textField": "name", + "holdPlace": false, + "isTextArea": true, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "visible": true, + "tabindex": 0, + "hasDefaultFocus": false, + "focusState": null, + "titleWidth": null, + "multiSelect": false, + "uri": "", + "autoWidth": true, + "enableClear": false, + "onClear": null, + "valueChanged": null, + "onShown": null, + "onHidden": null, + "editable": false, + "enableCancelSelected": false, + "beforeShow": null, + "beforeHide": null, + "dataSourceType": "static", + "viewType": "text", + "noSearch": false, + "maxSearchLength": null, + "enableAppend": false, + "inputAppendType": "button", + "inputAppendDisabled": false, + "autoHeight": false, + "maxHeight": 500, + "path": "billType", + "labelAutoOverflow": false, + "updateOn": "change", + "fieldValueChanging": "", + "fieldValueChanged": "", + "showDisabledItem": true, + "visibleControlledByRules": true, + "readonlyControlledByRules": true, + "requireControlledByRules": true + }, + { + "id": "totalSum_06058119_u7se", + "type": "NumericBox", + "titleSourceType": "static", + "title": "报帐金额", + "controlSource": "Farris", + "appearance": { + "class": "col-12" + }, + "size": null, + "binding": { + "type": "Form", + "path": "totalSum", + "field": "06058119-c97a-4e12-b48e-79670e105139" + }, + "readonly": "!viewModel.stateMachine['editable']", + "require": false, + "disable": false, + "placeholder": "", + "textAlign": "left", + "precisionSourceType": "static", + "precision": 2, + "validation": null, + "maxValue": null, + "minValue": null, + "step": 1, + "useThousands": true, + "formatter": null, + "parser": null, + "nullable": true, + "bigNumber": false, + "maxLength": 18, + "holdPlace": false, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "visible": true, + "isTextArea": true, + "tabindex": -1, + "hasDefaultFocus": false, + "focusState": null, + "titleWidth": null, + "showZero": true, + "showButton": true, + "path": "totalSum", + "localization": false, + "enableAppend": false, + "inputAppendType": "button", + "inputAppendDisabled": false, + "autoHeight": false, + "maxHeight": 500, + "visibleControlledByRules": true, + "readonlyControlledByRules": true, + "requireControlledByRules": true + } + ], + "controlsInline": true, + "formAutoIntl": true, + "visible": true, + "draggable": false, + "labelAutoOverflow": false + } + ], + "isScrollSpyItem": false, + "toolbar": { + "type": "SectionToolbar", + "position": "inHead", + "contents": [] + } + } + ], + "visible": true, + "afterViewInit": null + }, + { + "id": "fybxdmxwxh-l5rr-component", + "type": "Component", + "viewModel": "fybxdmxwxh-l5rr-component-viewmodel", + "componentType": "dataGrid", + "appearance": { + "class": "f-struct-is-subgrid" + }, + "visible": true, + "onInit": null, + "afterViewInit": null, + "contents": [ + { + "id": "fybxdmxwxh-l5rr-component-layout", + "type": "ContentContainer", + "appearance": { + "class": "f-grid-is-sub f-utils-flex-column" + }, + "visible": true, + "contents": [ + { + "id": "fybxdmxwxh-l5rr-dataGrid", + "type": "DataGrid", + "controlSource": "Farris", + "appearance": { + "class": "f-component-grid f-utils-fill" + }, + "disable": false, + "dataSource": "fybxdmxWxhs", + "fields": [ + { + "id": "id_25557dd7_johg", + "type": "GridField", + "controlSource": "Farris", + "caption": "主键", + "binding": { + "type": "Form", + "path": "id", + "field": "25557dd7-56b4-419e-aad0-de1b54bfee31", + "fullPath": "ID" + }, + "appearance": null, + "size": { + "width": 120 + }, + "readonly": false, + "dataField": "id", + "dataType": "string", + "displayTemplate": null, + "captionTemplate": null, + "editor": { + "id": "id_25557dd7_tg0m", + "type": "TextBox", + "titleSourceType": "static", + "title": "主键", + "appearance": { + "class": "" + }, + "size": null, + "binding": { + "type": "Form", + "path": "id", + "field": "25557dd7-56b4-419e-aad0-de1b54bfee31", + "fullPath": "ID" + }, + "require": true, + "disable": false, + "placeholder": "", + "format": null, + "validation": null, + "value": null, + "maxLength": 36, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "visible": true, + "holdPlace": false, + "isTextArea": true, + "isPassword": false, + "tabindex": -1, + "hasDefaultFocus": false, + "focusState": null, + "titleWidth": null, + "enableTips": true, + "path": "id", + "enableAppend": false, + "inputAppendType": "button", + "inputAppendDisabled": false, + "formatValidation": { + "type": "none", + "expression": "", + "message": "" + }, + "autoHeight": false, + "maxHeight": 500, + "requireControlledByRules": false + }, + "draggable": false, + "frozen": "none", + "sortable": true, + "enumData": null, + "idField": "value", + "textField": "name", + "aggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "groupAggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "textAlign": "left", + "hAlign": "left", + "vAlign": "middle", + "formatter": { + "type": "none" + }, + "showTips": false, + "tipContent": null, + "multiLanguage": false, + "visible": true, + "enableFilter": false, + "headerStyler": "", + "styler": "", + "localization": false, + "allowGrouping": true, + "tipMode": "auto", + "captionTipContent": "", + "captionTipStyler": "", + "enableBatchEdit": false, + "localizationType": "Date", + "visibleControlledByRules": true, + "readonlyControlledByRules": false + }, + { + "id": "parentID_e3f17427_3xlb", + "type": "GridField", + "controlSource": "Farris", + "caption": "上级对象主键", + "binding": { + "type": "Form", + "path": "parentID", + "field": "e3f17427-7824-42d3-bc1a-e3d41f0076e1", + "fullPath": "ParentID" + }, + "appearance": null, + "size": { + "width": 120 + }, + "readonly": false, + "dataField": "parentID", + "dataType": "string", + "displayTemplate": null, + "captionTemplate": null, + "editor": { + "id": "parentID_e3f17427_8hl5", + "type": "TextBox", + "titleSourceType": "static", + "title": "上级对象主键", + "appearance": { + "class": "" + }, + "size": null, + "binding": { + "type": "Form", + "path": "parentID", + "field": "e3f17427-7824-42d3-bc1a-e3d41f0076e1", + "fullPath": "ParentID" + }, + "require": true, + "disable": false, + "placeholder": "", + "format": null, + "validation": null, + "value": null, + "maxLength": 36, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "visible": true, + "holdPlace": false, + "isTextArea": true, + "isPassword": false, + "tabindex": -1, + "hasDefaultFocus": false, + "focusState": null, + "titleWidth": null, + "enableTips": true, + "path": "parentID", + "enableAppend": false, + "inputAppendType": "button", + "inputAppendDisabled": false, + "formatValidation": { + "type": "none", + "expression": "", + "message": "" + }, + "autoHeight": false, + "maxHeight": 500, + "requireControlledByRules": false + }, + "draggable": false, + "frozen": "none", + "sortable": true, + "enumData": null, + "idField": "value", + "textField": "name", + "aggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "groupAggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "textAlign": "left", + "hAlign": "left", + "vAlign": "middle", + "formatter": { + "type": "none" + }, + "showTips": false, + "tipContent": null, + "multiLanguage": false, + "visible": true, + "enableFilter": false, + "headerStyler": "", + "styler": "", + "localization": false, + "allowGrouping": true, + "tipMode": "auto", + "captionTipContent": "", + "captionTipStyler": "", + "enableBatchEdit": false, + "localizationType": "Date", + "visibleControlledByRules": true, + "readonlyControlledByRules": false + }, + { + "id": "billDetailDate_4f801f00_vx5u", + "type": "GridField", + "controlSource": "Farris", + "caption": "费用日期", + "binding": { + "type": "Form", + "path": "billDetailDate", + "field": "4f801f00-b0d5-48e5-8bcc-f88486ae8520", + "fullPath": "BillDetailDate" + }, + "appearance": null, + "size": { + "width": 120 + }, + "readonly": false, + "dataField": "billDetailDate", + "dataType": "datetime", + "displayTemplate": null, + "captionTemplate": null, + "editor": { + "id": "billDetailDate_4f801f00_6re7", + "type": "DateBox", + "titleSourceType": "static", + "title": "费用日期", + "controlSource": "Farris", + "appearance": { + "class": "" + }, + "size": null, + "binding": { + "type": "Form", + "path": "billDetailDate", + "field": "4f801f00-b0d5-48e5-8bcc-f88486ae8520", + "fullPath": "BillDetailDate" + }, + "require": false, + "disable": false, + "placeholder": "", + "validation": null, + "value": null, + "editable": true, + "dateRange": false, + "showTime": true, + "showType": 1, + "dateFormat": "yyyy-MM-dd HH:mm:ss", + "returnFormat": "yyyy-MM-dd HH:mm:ss", + "maxValue": null, + "minValue": null, + "disableDates": [], + "showWeekNumbers": false, + "dateRangeDatesDelimiter": "~", + "shortcuts": [], + "fieldType": "DateTime", + "useDefault": false, + "holdPlace": false, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "visible": true, + "isTextArea": true, + "tabindex": -1, + "hasDefaultFocus": false, + "focusState": null, + "titleWidth": null, + "localization": false, + "enableAppend": false, + "inputAppendType": "button", + "inputAppendDisabled": false, + "autoHeight": false, + "maxHeight": 500, + "hourStep": 1, + "minuteStep": 1, + "secondStep": 1, + "firstDayOfWeek": "mo", + "path": "billDetailDate", + "localizationType": "DateTime", + "format": "'yyyy-MM-dd'", + "requireControlledByRules": true + }, + "draggable": false, + "frozen": "none", + "sortable": true, + "enumData": null, + "idField": "value", + "textField": "name", + "aggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "groupAggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "textAlign": "left", + "hAlign": "left", + "vAlign": "middle", + "formatter": { + "type": "date", + "dateFormat": "yyyy-MM-dd HH:mm:ss" + }, + "showTips": false, + "tipContent": null, + "multiLanguage": false, + "visible": true, + "enableFilter": false, + "headerStyler": "", + "styler": "", + "localization": false, + "allowGrouping": true, + "tipMode": "auto", + "captionTipContent": "", + "captionTipStyler": "", + "enableBatchEdit": false, + "localizationType": "DateTime", + "visibleControlledByRules": true, + "readonlyControlledByRules": true + }, + { + "id": "billDetailAmount_a47bc34b_0l1j", + "type": "GridField", + "controlSource": "Farris", + "caption": "报销金额", + "binding": { + "type": "Form", + "path": "billDetailAmount", + "field": "a47bc34b-5070-4d72-8aaf-d7dcb8385118", + "fullPath": "BillDetailAmount" + }, + "appearance": null, + "size": { + "width": 120 + }, + "readonly": false, + "dataField": "billDetailAmount", + "dataType": "number", + "displayTemplate": null, + "captionTemplate": null, + "editor": { + "id": "billDetailAmount_a47bc34b_tn65", + "type": "NumericBox", + "titleSourceType": "static", + "title": "报销金额", + "controlSource": "Farris", + "appearance": { + "class": "" + }, + "size": null, + "binding": { + "type": "Form", + "path": "billDetailAmount", + "field": "a47bc34b-5070-4d72-8aaf-d7dcb8385118", + "fullPath": "BillDetailAmount" + }, + "require": false, + "disable": false, + "placeholder": "", + "textAlign": "left", + "precisionSourceType": "static", + "precision": 2, + "validation": null, + "maxValue": null, + "minValue": null, + "step": 1, + "useThousands": true, + "formatter": null, + "parser": null, + "nullable": true, + "bigNumber": false, + "maxLength": 18, + "holdPlace": false, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "visible": true, + "isTextArea": true, + "tabindex": -1, + "hasDefaultFocus": false, + "focusState": null, + "titleWidth": null, + "localization": false, + "showZero": true, + "showButton": true, + "enableAppend": false, + "inputAppendType": "button", + "inputAppendDisabled": false, + "autoHeight": false, + "maxHeight": 500, + "path": "billDetailAmount", + "requireControlledByRules": true + }, + "draggable": false, + "frozen": "none", + "sortable": true, + "enumData": null, + "idField": "value", + "textField": "name", + "aggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "groupAggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "textAlign": "left", + "hAlign": "left", + "vAlign": "middle", + "formatter": { + "type": "number", + "precision": 2, + "thousand": ",", + "decimal": "." + }, + "showTips": false, + "tipContent": null, + "multiLanguage": false, + "visible": true, + "enableFilter": false, + "headerStyler": "", + "styler": "", + "localization": false, + "allowGrouping": true, + "tipMode": "auto", + "captionTipContent": "", + "captionTipStyler": "", + "enableBatchEdit": false, + "visibleControlledByRules": true, + "readonlyControlledByRules": true + }, + { + "id": "billDetailNote_5d3a34e2_8ppk", + "type": "GridField", + "controlSource": "Farris", + "caption": "费用说明", + "binding": { + "type": "Form", + "path": "billDetailNote", + "field": "5d3a34e2-08f8-4298-8ea1-1e3c060f49b0", + "fullPath": "BillDetailNote" + }, + "appearance": null, + "size": { + "width": 120 + }, + "readonly": false, + "dataField": "billDetailNote", + "dataType": "string", + "displayTemplate": null, + "captionTemplate": null, + "editor": { + "id": "billDetailNote_5d3a34e2_3yi0", + "type": "MultiTextBox", + "titleSourceType": "static", + "title": "费用说明", + "appearance": { + "class": "" + }, + "size": null, + "binding": { + "type": "Form", + "path": "billDetailNote", + "field": "5d3a34e2-08f8-4298-8ea1-1e3c060f49b0", + "fullPath": "BillDetailNote" + }, + "require": false, + "disable": false, + "placeholder": "", + "maxLength": 0, + "holdPlace": false, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "visible": true, + "isTextArea": true, + "tabindex": -1, + "hasDefaultFocus": false, + "focusState": null, + "titleWidth": null, + "editType": "default", + "dialogWidth": 500, + "dialogHeight": 400, + "autoHeight": false, + "maxHeight": 500, + "enableWordCount": false, + "countType": "surplus", + "onlyShowInDialog": false, + "enableAppend": false, + "inputAppendType": "button", + "inputAppendDisabled": false, + "useComments": false, + "path": "billDetailNote", + "requireControlledByRules": true + }, + "draggable": false, + "frozen": "none", + "sortable": true, + "enumData": null, + "idField": "value", + "textField": "name", + "aggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "groupAggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "textAlign": "left", + "hAlign": "left", + "vAlign": "middle", + "formatter": { + "type": "none" + }, + "showTips": false, + "tipContent": null, + "multiLanguage": false, + "visible": true, + "enableFilter": false, + "headerStyler": "", + "styler": "", + "localization": false, + "allowGrouping": true, + "tipMode": "auto", + "captionTipContent": "", + "captionTipStyler": "", + "enableBatchEdit": false, + "visibleControlledByRules": true, + "readonlyControlledByRules": true, + "localizationType": "Date" + }, + { + "id": "invoiceNO_525b9081_z3rx", + "type": "GridField", + "controlSource": "Farris", + "caption": "发票号码", + "binding": { + "type": "Form", + "path": "invoiceNO", + "field": "525b9081-9c36-4ecb-8cb0-795bf1232ed1", + "fullPath": "InvoiceNO" + }, + "appearance": null, + "size": { + "width": 120 + }, + "readonly": false, + "dataField": "invoiceNO", + "dataType": "string", + "displayTemplate": null, + "captionTemplate": null, + "editor": { + "id": "invoiceNO_525b9081_resd", + "type": "TextBox", + "titleSourceType": "static", + "title": "发票号码", + "appearance": { + "class": "" + }, + "size": null, + "binding": { + "type": "Form", + "path": "invoiceNO", + "field": "525b9081-9c36-4ecb-8cb0-795bf1232ed1", + "fullPath": "InvoiceNO" + }, + "require": false, + "disable": false, + "placeholder": "", + "format": null, + "validation": null, + "value": null, + "maxLength": 36, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "visible": true, + "holdPlace": false, + "isTextArea": true, + "isPassword": false, + "tabindex": -1, + "hasDefaultFocus": false, + "focusState": null, + "titleWidth": null, + "enableTips": true, + "path": "invoiceNO", + "enableAppend": false, + "inputAppendType": "button", + "inputAppendDisabled": false, + "formatValidation": { + "type": "none", + "expression": "", + "message": "" + }, + "autoHeight": false, + "maxHeight": 500, + "requireControlledByRules": true + }, + "draggable": false, + "frozen": "none", + "sortable": true, + "enumData": null, + "idField": "value", + "textField": "name", + "aggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "groupAggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "textAlign": "left", + "hAlign": "left", + "vAlign": "middle", + "formatter": { + "type": "none" + }, + "showTips": false, + "tipContent": null, + "multiLanguage": false, + "visible": true, + "enableFilter": false, + "headerStyler": "", + "styler": "", + "localization": false, + "allowGrouping": true, + "tipMode": "auto", + "captionTipContent": "", + "captionTipStyler": "", + "enableBatchEdit": false, + "localizationType": "Date", + "visibleControlledByRules": true, + "readonlyControlledByRules": true + } + ], + "focusedItem": null, + "focusedIndex": null, + "pagination": false, + "lockPagination": "viewModel.stateMachine&&viewModel.stateMachine['editable']", + "showPageSize": false, + "identifyField": null, + "multiSelect": false, + "showCheckbox": false, + "selectable": null, + "itemTemplate": null, + "toolBar": null, + "summary": null, + "showAllCheckbox": false, + "fieldEditable": true, + "editable": null, + "groupable": false, + "group": null, + "showGroupColumn": true, + "groupFormatter": null, + "groupStyler": null, + "groupFooter": false, + "fitColumns": false, + "onSelectionChange": "", + "styler": "", + "fixedColumns": [], + "enableCommandColumn": false, + "onEditClicked": "", + "onDeleteClicked": "", + "commandColumnWidth": 120, + "showCommandColumn": true, + "checkedChange": null, + "disableRow": null, + "beforeSelect": null, + "beforeUnSelect": null, + "beforeCheck": null, + "beforeUnCheck": null, + "multiSort": false, + "autoFitColumns": false, + "showFooter": false, + "footerTemplate": "", + "footerDataFrom": "client", + "footerDataCommand": null, + "footerHeight": 29, + "filterType": "none", + "enableFilterRow": false, + "enableSmartFilter": false, + "remoteFilter": false, + "showFilterBar": false, + "showBorder": false, + "striped": true, + "showLineNumber": false, + "lineNumberTitle": "", + "appendRow": null, + "pageChange": null, + "dblClickRow": null, + "useControlPanel": false, + "autoHeight": false, + "rowClick": null, + "showSelectedList": false, + "selectedItemFormatter": null, + "lineNumberWidth": 36, + "enableMorePageSelect": false, + "headerWrap": false, + "emptyTemplate": null, + "emptyDataHeight": 240, + "maxHeight": 300, + "rowHeight": 30, + "enableHighlightCell": false, + "enableEditCellStyle": false, + "showRowGroupPanel": false, + "enableDragColumn": false, + "groupSummaryPosition": "groupFooterRow", + "clearSelectionsWhenDataIsEmpty": true, + "keepSelect": true, + "enableEditByCard": "none", + "pageSizeChanged": null, + "visible": true, + "showGotoInput": false, + "scrollBarShowMode": "auto", + "showScrollArrow": false, + "footerPosition": "bottom", + "footerStyler": null, + "selectOnEditing": false, + "selectionMode": "default", + "enableContextMenu": false, + "disableGroupOnEditing": true, + "enableSimpleMode": false, + "enableScheme": false, + "beforeEdit": null, + "nowrap": true, + "mergeCell": false, + "remoteSort": false, + "columnSorted": null, + "checkOnSelect": false, + "selectOnCheck": false, + "enableHeaderGroup": false, + "headerGroup": null, + "AutoColumnWidthUseDblclick": true, + "virtualized": false, + "virtualizedAsyncLoad": false, + "scrollYLoad": null, + "pagerContentTemplate": null, + "expandGroupRows": true, + "useBlankWhenDataIsEmpty": false, + "checked": null, + "unChecked": null, + "checkAll": null, + "unCheckAll": null, + "filterChanged": null, + "enableEditStateFilterSorting": false, + "showConfirmWhenSchemeChanged": false, + "enableSetMultiHeaders": false, + "allowEmpty": true + } + ], + "isScrollspyContainer": false, + "isLikeCardContainer": false + } + ] + }, + { + "id": "fybxjkmxwxh-73yo-component", + "type": "Component", + "viewModel": "fybxjkmxwxh-73yo-component-viewmodel", + "componentType": "dataGrid", + "appearance": { + "class": "f-struct-is-subgrid" + }, + "visible": true, + "onInit": null, + "afterViewInit": null, + "contents": [ + { + "id": "fybxjkmxwxh-73yo-component-layout", + "type": "ContentContainer", + "appearance": { + "class": "f-grid-is-sub f-utils-flex-column" + }, + "visible": true, + "contents": [ + { + "id": "fybxjkmxwxh-73yo-dataGrid", + "type": "DataGrid", + "controlSource": "Farris", + "appearance": { + "class": "f-component-grid f-utils-fill" + }, + "disable": false, + "dataSource": "fybxjkmxWxhs", + "fields": [ + { + "id": "id_ec6523d1_h0p6", + "type": "GridField", + "controlSource": "Farris", + "caption": "主键", + "binding": { + "type": "Form", + "path": "id", + "field": "ec6523d1-c5c8-4626-8fd5-46ec8a3e5875", + "fullPath": "ID" + }, + "appearance": null, + "size": { + "width": 120 + }, + "readonly": false, + "dataField": "id", + "dataType": "string", + "displayTemplate": null, + "captionTemplate": null, + "editor": { + "id": "id_ec6523d1_4uzg", + "type": "TextBox", + "titleSourceType": "static", + "title": "主键", + "appearance": { + "class": "" + }, + "size": null, + "binding": { + "type": "Form", + "path": "id", + "field": "ec6523d1-c5c8-4626-8fd5-46ec8a3e5875", + "fullPath": "ID" + }, + "require": true, + "disable": false, + "placeholder": "", + "format": null, + "validation": null, + "value": null, + "maxLength": 36, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "visible": true, + "holdPlace": false, + "isTextArea": true, + "isPassword": false, + "tabindex": -1, + "hasDefaultFocus": false, + "focusState": null, + "titleWidth": null, + "enableTips": true, + "path": "id", + "enableAppend": false, + "inputAppendType": "button", + "inputAppendDisabled": false, + "formatValidation": { + "type": "none", + "expression": "", + "message": "" + }, + "autoHeight": false, + "maxHeight": 500, + "requireControlledByRules": false + }, + "draggable": false, + "frozen": "none", + "sortable": true, + "enumData": null, + "idField": "value", + "textField": "name", + "aggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "groupAggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "textAlign": "left", + "hAlign": "left", + "vAlign": "middle", + "formatter": { + "type": "none" + }, + "showTips": false, + "tipContent": null, + "multiLanguage": false, + "visible": true, + "enableFilter": false, + "headerStyler": "", + "styler": "", + "localization": false, + "allowGrouping": true, + "tipMode": "auto", + "captionTipContent": "", + "captionTipStyler": "", + "enableBatchEdit": false, + "localizationType": "Date", + "visibleControlledByRules": true, + "readonlyControlledByRules": false + }, + { + "id": "parentID_081a30bb_3p1o", + "type": "GridField", + "controlSource": "Farris", + "caption": "上级对象主键", + "binding": { + "type": "Form", + "path": "parentID", + "field": "081a30bb-f339-4d9a-9ca0-d03e748d618b", + "fullPath": "ParentID" + }, + "appearance": null, + "size": { + "width": 120 + }, + "readonly": false, + "dataField": "parentID", + "dataType": "string", + "displayTemplate": null, + "captionTemplate": null, + "editor": { + "id": "parentID_081a30bb_3kru", + "type": "TextBox", + "titleSourceType": "static", + "title": "上级对象主键", + "appearance": { + "class": "" + }, + "size": null, + "binding": { + "type": "Form", + "path": "parentID", + "field": "081a30bb-f339-4d9a-9ca0-d03e748d618b", + "fullPath": "ParentID" + }, + "require": true, + "disable": false, + "placeholder": "", + "format": null, + "validation": null, + "value": null, + "maxLength": 36, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "visible": true, + "holdPlace": false, + "isTextArea": true, + "isPassword": false, + "tabindex": -1, + "hasDefaultFocus": false, + "focusState": null, + "titleWidth": null, + "enableTips": true, + "path": "parentID", + "enableAppend": false, + "inputAppendType": "button", + "inputAppendDisabled": false, + "formatValidation": { + "type": "none", + "expression": "", + "message": "" + }, + "autoHeight": false, + "maxHeight": 500, + "requireControlledByRules": false + }, + "draggable": false, + "frozen": "none", + "sortable": true, + "enumData": null, + "idField": "value", + "textField": "name", + "aggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "groupAggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "textAlign": "left", + "hAlign": "left", + "vAlign": "middle", + "formatter": { + "type": "none" + }, + "showTips": false, + "tipContent": null, + "multiLanguage": false, + "visible": true, + "enableFilter": false, + "headerStyler": "", + "styler": "", + "localization": false, + "allowGrouping": true, + "tipMode": "auto", + "captionTipContent": "", + "captionTipStyler": "", + "enableBatchEdit": false, + "localizationType": "Date", + "visibleControlledByRules": true, + "readonlyControlledByRules": false + }, + { + "id": "jkD_NM_cbc92c22_7dws", + "type": "GridField", + "controlSource": "Farris", + "caption": "内码", + "binding": { + "type": "Form", + "path": "jkD_NM", + "field": "cbc92c22-a1be-4741-a280-acc3ca1cb342", + "fullPath": "JKD_NM" + }, + "appearance": null, + "size": { + "width": 120 + }, + "readonly": false, + "dataField": "jkD_NM", + "dataType": "string", + "displayTemplate": null, + "captionTemplate": null, + "editor": { + "id": "jkD_NM_cbc92c22_c2ic", + "type": "TextBox", + "titleSourceType": "static", + "title": "内码", + "appearance": { + "class": "" + }, + "size": null, + "binding": { + "type": "Form", + "path": "jkD_NM", + "field": "cbc92c22-a1be-4741-a280-acc3ca1cb342", + "fullPath": "JKD_NM" + }, + "require": false, + "disable": false, + "placeholder": "", + "format": null, + "validation": null, + "value": null, + "maxLength": 36, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "visible": true, + "holdPlace": false, + "isTextArea": true, + "isPassword": false, + "tabindex": -1, + "hasDefaultFocus": false, + "focusState": null, + "titleWidth": null, + "enableTips": true, + "path": "jkD_NM", + "enableAppend": false, + "inputAppendType": "button", + "inputAppendDisabled": false, + "formatValidation": { + "type": "none", + "expression": "", + "message": "" + }, + "autoHeight": false, + "maxHeight": 500, + "requireControlledByRules": true + }, + "draggable": false, + "frozen": "none", + "sortable": true, + "enumData": null, + "idField": "value", + "textField": "name", + "aggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "groupAggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "textAlign": "left", + "hAlign": "left", + "vAlign": "middle", + "formatter": { + "type": "none" + }, + "showTips": false, + "tipContent": null, + "multiLanguage": false, + "visible": true, + "enableFilter": false, + "headerStyler": "", + "styler": "", + "localization": false, + "allowGrouping": true, + "tipMode": "auto", + "captionTipContent": "", + "captionTipStyler": "", + "enableBatchEdit": false, + "localizationType": "Date", + "visibleControlledByRules": true, + "readonlyControlledByRules": true + }, + { + "id": "jkD_BXDNM_a11eae89_lb06", + "type": "GridField", + "controlSource": "Farris", + "caption": "报销单内码", + "binding": { + "type": "Form", + "path": "jkD_BXDNM", + "field": "a11eae89-459e-4ea2-a452-caedf3eedeb5", + "fullPath": "JKD_BXDNM" + }, + "appearance": null, + "size": { + "width": 120 + }, + "readonly": false, + "dataField": "jkD_BXDNM", + "dataType": "string", + "displayTemplate": null, + "captionTemplate": null, + "editor": { + "id": "jkD_BXDNM_a11eae89_3gte", + "type": "TextBox", + "titleSourceType": "static", + "title": "报销单内码", + "appearance": { + "class": "" + }, + "size": null, + "binding": { + "type": "Form", + "path": "jkD_BXDNM", + "field": "a11eae89-459e-4ea2-a452-caedf3eedeb5", + "fullPath": "JKD_BXDNM" + }, + "require": false, + "disable": false, + "placeholder": "", + "format": null, + "validation": null, + "value": null, + "maxLength": 36, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "visible": true, + "holdPlace": false, + "isTextArea": true, + "isPassword": false, + "tabindex": -1, + "hasDefaultFocus": false, + "focusState": null, + "titleWidth": null, + "enableTips": true, + "path": "jkD_BXDNM", + "enableAppend": false, + "inputAppendType": "button", + "inputAppendDisabled": false, + "formatValidation": { + "type": "none", + "expression": "", + "message": "" + }, + "autoHeight": false, + "maxHeight": 500, + "requireControlledByRules": true + }, + "draggable": false, + "frozen": "none", + "sortable": true, + "enumData": null, + "idField": "value", + "textField": "name", + "aggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "groupAggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "textAlign": "left", + "hAlign": "left", + "vAlign": "middle", + "formatter": { + "type": "none" + }, + "showTips": false, + "tipContent": null, + "multiLanguage": false, + "visible": true, + "enableFilter": false, + "headerStyler": "", + "styler": "", + "localization": false, + "allowGrouping": true, + "tipMode": "auto", + "captionTipContent": "", + "captionTipStyler": "", + "enableBatchEdit": false, + "localizationType": "Date", + "visibleControlledByRules": true, + "readonlyControlledByRules": true + }, + { + "id": "jkD_BH_612ca50e_nsex", + "type": "GridField", + "controlSource": "Farris", + "caption": "借款单编号", + "binding": { + "type": "Form", + "path": "jkD_BH", + "field": "612ca50e-685f-465b-ae1b-d45fb7bf9d4d", + "fullPath": "JKD_BH" + }, + "appearance": null, + "size": { + "width": 120 + }, + "readonly": false, + "dataField": "jkD_BH", + "dataType": "string", + "displayTemplate": null, + "captionTemplate": null, + "editor": { + "id": "jkD_BH_612ca50e_u1el", + "type": "TextBox", + "titleSourceType": "static", + "title": "借款单编号", + "appearance": { + "class": "" + }, + "size": null, + "binding": { + "type": "Form", + "path": "jkD_BH", + "field": "612ca50e-685f-465b-ae1b-d45fb7bf9d4d", + "fullPath": "JKD_BH" + }, + "require": false, + "disable": false, + "placeholder": "", + "format": null, + "validation": null, + "value": null, + "maxLength": 36, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "visible": true, + "holdPlace": false, + "isTextArea": true, + "isPassword": false, + "tabindex": -1, + "hasDefaultFocus": false, + "focusState": null, + "titleWidth": null, + "enableTips": true, + "path": "jkD_BH", + "enableAppend": false, + "inputAppendType": "button", + "inputAppendDisabled": false, + "formatValidation": { + "type": "none", + "expression": "", + "message": "" + }, + "autoHeight": false, + "maxHeight": 500, + "requireControlledByRules": true + }, + "draggable": false, + "frozen": "none", + "sortable": true, + "enumData": null, + "idField": "value", + "textField": "name", + "aggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "groupAggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "textAlign": "left", + "hAlign": "left", + "vAlign": "middle", + "formatter": { + "type": "none" + }, + "showTips": false, + "tipContent": null, + "multiLanguage": false, + "visible": true, + "enableFilter": false, + "headerStyler": "", + "styler": "", + "localization": false, + "allowGrouping": true, + "tipMode": "auto", + "captionTipContent": "", + "captionTipStyler": "", + "enableBatchEdit": false, + "localizationType": "Date", + "visibleControlledByRules": true, + "readonlyControlledByRules": true + }, + { + "id": "jkD_JKR_d88367a5_pfwc", + "type": "GridField", + "controlSource": "Farris", + "caption": "借款人", + "binding": { + "type": "Form", + "path": "jkD_JKR", + "field": "d88367a5-9e18-461c-9196-59eca7c72967", + "fullPath": "JKD_JKR" + }, + "appearance": null, + "size": { + "width": 120 + }, + "readonly": false, + "dataField": "jkD_JKR", + "dataType": "string", + "displayTemplate": null, + "captionTemplate": null, + "editor": { + "id": "jkD_JKR_d88367a5_aqlt", + "type": "TextBox", + "titleSourceType": "static", + "title": "借款人", + "appearance": { + "class": "" + }, + "size": null, + "binding": { + "type": "Form", + "path": "jkD_JKR", + "field": "d88367a5-9e18-461c-9196-59eca7c72967", + "fullPath": "JKD_JKR" + }, + "require": false, + "disable": false, + "placeholder": "", + "format": null, + "validation": null, + "value": null, + "maxLength": 36, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "visible": true, + "holdPlace": false, + "isTextArea": true, + "isPassword": false, + "tabindex": -1, + "hasDefaultFocus": false, + "focusState": null, + "titleWidth": null, + "enableTips": true, + "path": "jkD_JKR", + "enableAppend": false, + "inputAppendType": "button", + "inputAppendDisabled": false, + "formatValidation": { + "type": "none", + "expression": "", + "message": "" + }, + "autoHeight": false, + "maxHeight": 500, + "requireControlledByRules": true + }, + "draggable": false, + "frozen": "none", + "sortable": true, + "enumData": null, + "idField": "value", + "textField": "name", + "aggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "groupAggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "textAlign": "left", + "hAlign": "left", + "vAlign": "middle", + "formatter": { + "type": "none" + }, + "showTips": false, + "tipContent": null, + "multiLanguage": false, + "visible": true, + "enableFilter": false, + "headerStyler": "", + "styler": "", + "localization": false, + "allowGrouping": true, + "tipMode": "auto", + "captionTipContent": "", + "captionTipStyler": "", + "enableBatchEdit": false, + "localizationType": "Date", + "visibleControlledByRules": true, + "readonlyControlledByRules": true + }, + { + "id": "jkD_JKJE_caa72303_zx46", + "type": "GridField", + "controlSource": "Farris", + "caption": "借款金额", + "binding": { + "type": "Form", + "path": "jkD_JKJE", + "field": "caa72303-6a41-4cd5-9977-7d9b204648da", + "fullPath": "JKD_JKJE" + }, + "appearance": null, + "size": { + "width": 120 + }, + "readonly": false, + "dataField": "jkD_JKJE", + "dataType": "number", + "displayTemplate": null, + "captionTemplate": null, + "editor": { + "id": "jkD_JKJE_caa72303_qdkf", + "type": "NumericBox", + "titleSourceType": "static", + "title": "借款金额", + "controlSource": "Farris", + "appearance": { + "class": "" + }, + "size": null, + "binding": { + "type": "Form", + "path": "jkD_JKJE", + "field": "caa72303-6a41-4cd5-9977-7d9b204648da", + "fullPath": "JKD_JKJE" + }, + "require": false, + "disable": false, + "placeholder": "", + "textAlign": "left", + "precisionSourceType": "static", + "precision": 8, + "validation": null, + "maxValue": null, + "minValue": null, + "step": 1, + "useThousands": true, + "formatter": null, + "parser": null, + "nullable": true, + "bigNumber": false, + "maxLength": 20, + "holdPlace": false, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "visible": true, + "isTextArea": true, + "tabindex": -1, + "hasDefaultFocus": false, + "focusState": null, + "titleWidth": null, + "localization": false, + "showZero": true, + "showButton": true, + "enableAppend": false, + "inputAppendType": "button", + "inputAppendDisabled": false, + "autoHeight": false, + "maxHeight": 500, + "path": "jkD_JKJE", + "requireControlledByRules": true + }, + "draggable": false, + "frozen": "none", + "sortable": true, + "enumData": null, + "idField": "value", + "textField": "name", + "aggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "groupAggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "textAlign": "left", + "hAlign": "left", + "vAlign": "middle", + "formatter": { + "type": "number", + "precision": 8, + "thousand": ",", + "decimal": "." + }, + "showTips": false, + "tipContent": null, + "multiLanguage": false, + "visible": true, + "enableFilter": false, + "headerStyler": "", + "styler": "", + "localization": false, + "allowGrouping": true, + "tipMode": "auto", + "captionTipContent": "", + "captionTipStyler": "", + "enableBatchEdit": false, + "visibleControlledByRules": true, + "readonlyControlledByRules": true + }, + { + "id": "jkD_JKRQ_b5fb787d_b2l8", + "type": "GridField", + "controlSource": "Farris", + "caption": "借款日期", + "binding": { + "type": "Form", + "path": "jkD_JKRQ", + "field": "b5fb787d-460d-4054-85ed-3de00a5cc20d", + "fullPath": "JKD_JKRQ" + }, + "appearance": null, + "size": { + "width": 120 + }, + "readonly": false, + "dataField": "jkD_JKRQ", + "dataType": "datetime", + "displayTemplate": null, + "captionTemplate": null, + "editor": { + "id": "jkD_JKRQ_b5fb787d_nf4c", + "type": "DateBox", + "titleSourceType": "static", + "title": "借款日期", + "controlSource": "Farris", + "appearance": { + "class": "" + }, + "size": null, + "binding": { + "type": "Form", + "path": "jkD_JKRQ", + "field": "b5fb787d-460d-4054-85ed-3de00a5cc20d", + "fullPath": "JKD_JKRQ" + }, + "require": false, + "disable": false, + "placeholder": "", + "validation": null, + "value": null, + "editable": true, + "dateRange": false, + "showTime": true, + "showType": 1, + "dateFormat": "yyyy-MM-dd HH:mm:ss", + "returnFormat": "yyyy-MM-dd HH:mm:ss", + "maxValue": null, + "minValue": null, + "disableDates": [], + "showWeekNumbers": false, + "dateRangeDatesDelimiter": "~", + "shortcuts": [], + "fieldType": "DateTime", + "useDefault": false, + "holdPlace": false, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "visible": true, + "isTextArea": true, + "tabindex": -1, + "hasDefaultFocus": false, + "focusState": null, + "titleWidth": null, + "localization": false, + "enableAppend": false, + "inputAppendType": "button", + "inputAppendDisabled": false, + "autoHeight": false, + "maxHeight": 500, + "hourStep": 1, + "minuteStep": 1, + "secondStep": 1, + "firstDayOfWeek": "mo", + "path": "jkD_JKRQ", + "localizationType": "DateTime", + "format": "'yyyy-MM-dd'", + "requireControlledByRules": true + }, + "draggable": false, + "frozen": "none", + "sortable": true, + "enumData": null, + "idField": "value", + "textField": "name", + "aggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "groupAggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "textAlign": "left", + "hAlign": "left", + "vAlign": "middle", + "formatter": { + "type": "date", + "dateFormat": "yyyy-MM-dd HH:mm:ss" + }, + "showTips": false, + "tipContent": null, + "multiLanguage": false, + "visible": true, + "enableFilter": false, + "headerStyler": "", + "styler": "", + "localization": false, + "allowGrouping": true, + "tipMode": "auto", + "captionTipContent": "", + "captionTipStyler": "", + "enableBatchEdit": false, + "localizationType": "DateTime", + "visibleControlledByRules": true, + "readonlyControlledByRules": true + }, + { + "id": "jkD_HKRQ_114ac11a_eftn", + "type": "GridField", + "controlSource": "Farris", + "caption": "还款日期", + "binding": { + "type": "Form", + "path": "jkD_HKRQ", + "field": "114ac11a-60c2-42c0-9959-030e2ac59375", + "fullPath": "JKD_HKRQ" + }, + "appearance": null, + "size": { + "width": 120 + }, + "readonly": false, + "dataField": "jkD_HKRQ", + "dataType": "datetime", + "displayTemplate": null, + "captionTemplate": null, + "editor": { + "id": "jkD_HKRQ_114ac11a_n0sc", + "type": "DateBox", + "titleSourceType": "static", + "title": "还款日期", + "controlSource": "Farris", + "appearance": { + "class": "" + }, + "size": null, + "binding": { + "type": "Form", + "path": "jkD_HKRQ", + "field": "114ac11a-60c2-42c0-9959-030e2ac59375", + "fullPath": "JKD_HKRQ" + }, + "require": false, + "disable": false, + "placeholder": "", + "validation": null, + "value": null, + "editable": true, + "dateRange": false, + "showTime": true, + "showType": 1, + "dateFormat": "yyyy-MM-dd HH:mm:ss", + "returnFormat": "yyyy-MM-dd HH:mm:ss", + "maxValue": null, + "minValue": null, + "disableDates": [], + "showWeekNumbers": false, + "dateRangeDatesDelimiter": "~", + "shortcuts": [], + "fieldType": "DateTime", + "useDefault": false, + "holdPlace": false, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "visible": true, + "isTextArea": true, + "tabindex": -1, + "hasDefaultFocus": false, + "focusState": null, + "titleWidth": null, + "localization": false, + "enableAppend": false, + "inputAppendType": "button", + "inputAppendDisabled": false, + "autoHeight": false, + "maxHeight": 500, + "hourStep": 1, + "minuteStep": 1, + "secondStep": 1, + "firstDayOfWeek": "mo", + "path": "jkD_HKRQ", + "localizationType": "DateTime", + "format": "'yyyy-MM-dd'", + "requireControlledByRules": true + }, + "draggable": false, + "frozen": "none", + "sortable": true, + "enumData": null, + "idField": "value", + "textField": "name", + "aggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "groupAggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "textAlign": "left", + "hAlign": "left", + "vAlign": "middle", + "formatter": { + "type": "date", + "dateFormat": "yyyy-MM-dd HH:mm:ss" + }, + "showTips": false, + "tipContent": null, + "multiLanguage": false, + "visible": true, + "enableFilter": false, + "headerStyler": "", + "styler": "", + "localization": false, + "allowGrouping": true, + "tipMode": "auto", + "captionTipContent": "", + "captionTipStyler": "", + "enableBatchEdit": false, + "localizationType": "DateTime", + "visibleControlledByRules": true, + "readonlyControlledByRules": true + }, + { + "id": "jkD_NOTE_f183f705_hjh2", + "type": "GridField", + "controlSource": "Farris", + "caption": "备注", + "binding": { + "type": "Form", + "path": "jkD_NOTE", + "field": "f183f705-f534-4d7b-ac9b-05da2d49aaeb", + "fullPath": "JKD_NOTE" + }, + "appearance": null, + "size": { + "width": 120 + }, + "readonly": false, + "dataField": "jkD_NOTE", + "dataType": "string", + "displayTemplate": null, + "captionTemplate": null, + "editor": { + "id": "jkD_NOTE_f183f705_se2d", + "type": "MultiTextBox", + "titleSourceType": "static", + "title": "备注", + "appearance": { + "class": "" + }, + "size": null, + "binding": { + "type": "Form", + "path": "jkD_NOTE", + "field": "f183f705-f534-4d7b-ac9b-05da2d49aaeb", + "fullPath": "JKD_NOTE" + }, + "require": false, + "disable": false, + "placeholder": "", + "maxLength": 0, + "holdPlace": false, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "visible": true, + "isTextArea": true, + "tabindex": -1, + "hasDefaultFocus": false, + "focusState": null, + "titleWidth": null, + "editType": "default", + "dialogWidth": 500, + "dialogHeight": 400, + "autoHeight": false, + "maxHeight": 500, + "enableWordCount": false, + "countType": "surplus", + "onlyShowInDialog": false, + "enableAppend": false, + "inputAppendType": "button", + "inputAppendDisabled": false, + "useComments": false, + "path": "jkD_NOTE", + "requireControlledByRules": true + }, + "draggable": false, + "frozen": "none", + "sortable": true, + "enumData": null, + "idField": "value", + "textField": "name", + "aggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "groupAggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "textAlign": "left", + "hAlign": "left", + "vAlign": "middle", + "formatter": { + "type": "none" + }, + "showTips": false, + "tipContent": null, + "multiLanguage": false, + "visible": true, + "enableFilter": false, + "headerStyler": "", + "styler": "", + "localization": false, + "allowGrouping": true, + "tipMode": "auto", + "captionTipContent": "", + "captionTipStyler": "", + "enableBatchEdit": false, + "visibleControlledByRules": true, + "readonlyControlledByRules": true, + "localizationType": "Date" + }, + { + "id": "creator_ff630349_ynnt", + "type": "GridField", + "controlSource": "Farris", + "caption": "创建人", + "binding": { + "type": "Form", + "path": "creator", + "field": "ff630349-2c65-4f14-9c6e-7a8f33360dd1", + "fullPath": "Creator" + }, + "appearance": null, + "size": { + "width": 120 + }, + "readonly": false, + "dataField": "creator", + "dataType": "string", + "displayTemplate": null, + "captionTemplate": null, + "editor": { + "id": "creator_ff630349_ukjs", + "type": "TextBox", + "titleSourceType": "static", + "title": "创建人", + "appearance": { + "class": "" + }, + "size": null, + "binding": { + "type": "Form", + "path": "creator", + "field": "ff630349-2c65-4f14-9c6e-7a8f33360dd1", + "fullPath": "Creator" + }, + "require": false, + "disable": false, + "placeholder": "", + "format": null, + "validation": null, + "value": null, + "maxLength": 128, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "visible": true, + "holdPlace": false, + "isTextArea": true, + "isPassword": false, + "tabindex": -1, + "hasDefaultFocus": false, + "focusState": null, + "titleWidth": null, + "enableTips": true, + "path": "creator", + "enableAppend": false, + "inputAppendType": "button", + "inputAppendDisabled": false, + "formatValidation": { + "type": "none", + "expression": "", + "message": "" + }, + "autoHeight": false, + "maxHeight": 500, + "requireControlledByRules": true + }, + "draggable": false, + "frozen": "none", + "sortable": true, + "enumData": null, + "idField": "value", + "textField": "name", + "aggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "groupAggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "textAlign": "left", + "hAlign": "left", + "vAlign": "middle", + "formatter": { + "type": "none" + }, + "showTips": false, + "tipContent": null, + "multiLanguage": false, + "visible": true, + "enableFilter": false, + "headerStyler": "", + "styler": "", + "localization": false, + "allowGrouping": true, + "tipMode": "auto", + "captionTipContent": "", + "captionTipStyler": "", + "enableBatchEdit": false, + "localizationType": "Date", + "visibleControlledByRules": true, + "readonlyControlledByRules": true + }, + { + "id": "createdDate_c1417328_iakr", + "type": "GridField", + "controlSource": "Farris", + "caption": "创建时间", + "binding": { + "type": "Form", + "path": "createdDate", + "field": "c1417328-2327-4be6-b2d9-16aea44979c9", + "fullPath": "CreatedDate" + }, + "appearance": null, + "size": { + "width": 120 + }, + "readonly": false, + "dataField": "createdDate", + "dataType": "datetime", + "displayTemplate": null, + "captionTemplate": null, + "editor": { + "id": "createdDate_c1417328_tref", + "type": "DateBox", + "titleSourceType": "static", + "title": "创建时间", + "controlSource": "Farris", + "appearance": { + "class": "" + }, + "size": null, + "binding": { + "type": "Form", + "path": "createdDate", + "field": "c1417328-2327-4be6-b2d9-16aea44979c9", + "fullPath": "CreatedDate" + }, + "require": false, + "disable": false, + "placeholder": "", + "validation": null, + "value": null, + "editable": true, + "dateRange": false, + "showTime": true, + "showType": 1, + "dateFormat": "yyyy-MM-dd HH:mm:ss", + "returnFormat": "yyyy-MM-dd HH:mm:ss", + "maxValue": null, + "minValue": null, + "disableDates": [], + "showWeekNumbers": false, + "dateRangeDatesDelimiter": "~", + "shortcuts": [], + "fieldType": "DateTime", + "useDefault": false, + "holdPlace": false, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "visible": true, + "isTextArea": true, + "tabindex": -1, + "hasDefaultFocus": false, + "focusState": null, + "titleWidth": null, + "localization": false, + "enableAppend": false, + "inputAppendType": "button", + "inputAppendDisabled": false, + "autoHeight": false, + "maxHeight": 500, + "hourStep": 1, + "minuteStep": 1, + "secondStep": 1, + "firstDayOfWeek": "mo", + "path": "createdDate", + "localizationType": "DateTime", + "format": "'yyyy-MM-dd'", + "requireControlledByRules": true + }, + "draggable": false, + "frozen": "none", + "sortable": true, + "enumData": null, + "idField": "value", + "textField": "name", + "aggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "groupAggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "textAlign": "left", + "hAlign": "left", + "vAlign": "middle", + "formatter": { + "type": "date", + "dateFormat": "yyyy-MM-dd HH:mm:ss" + }, + "showTips": false, + "tipContent": null, + "multiLanguage": false, + "visible": true, + "enableFilter": false, + "headerStyler": "", + "styler": "", + "localization": false, + "allowGrouping": true, + "tipMode": "auto", + "captionTipContent": "", + "captionTipStyler": "", + "enableBatchEdit": false, + "localizationType": "DateTime", + "visibleControlledByRules": true, + "readonlyControlledByRules": true + }, + { + "id": "lastModifier_bad1b510_jhzj", + "type": "GridField", + "controlSource": "Farris", + "caption": "最后修改人", + "binding": { + "type": "Form", + "path": "lastModifier", + "field": "bad1b510-359d-4e74-935c-d7f3f3b61f22", + "fullPath": "LastModifier" + }, + "appearance": null, + "size": { + "width": 120 + }, + "readonly": false, + "dataField": "lastModifier", + "dataType": "string", + "displayTemplate": null, + "captionTemplate": null, + "editor": { + "id": "lastModifier_bad1b510_s1t4", + "type": "TextBox", + "titleSourceType": "static", + "title": "最后修改人", + "appearance": { + "class": "" + }, + "size": null, + "binding": { + "type": "Form", + "path": "lastModifier", + "field": "bad1b510-359d-4e74-935c-d7f3f3b61f22", + "fullPath": "LastModifier" + }, + "require": false, + "disable": false, + "placeholder": "", + "format": null, + "validation": null, + "value": null, + "maxLength": 128, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "visible": true, + "holdPlace": false, + "isTextArea": true, + "isPassword": false, + "tabindex": -1, + "hasDefaultFocus": false, + "focusState": null, + "titleWidth": null, + "enableTips": true, + "path": "lastModifier", + "enableAppend": false, + "inputAppendType": "button", + "inputAppendDisabled": false, + "formatValidation": { + "type": "none", + "expression": "", + "message": "" + }, + "autoHeight": false, + "maxHeight": 500, + "requireControlledByRules": true + }, + "draggable": false, + "frozen": "none", + "sortable": true, + "enumData": null, + "idField": "value", + "textField": "name", + "aggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "groupAggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "textAlign": "left", + "hAlign": "left", + "vAlign": "middle", + "formatter": { + "type": "none" + }, + "showTips": false, + "tipContent": null, + "multiLanguage": false, + "visible": true, + "enableFilter": false, + "headerStyler": "", + "styler": "", + "localization": false, + "allowGrouping": true, + "tipMode": "auto", + "captionTipContent": "", + "captionTipStyler": "", + "enableBatchEdit": false, + "localizationType": "Date", + "visibleControlledByRules": true, + "readonlyControlledByRules": true + }, + { + "id": "lastModifiedDate_a6ba3039_d19m", + "type": "GridField", + "controlSource": "Farris", + "caption": "最后修改时间", + "binding": { + "type": "Form", + "path": "lastModifiedDate", + "field": "a6ba3039-4344-4c89-8552-5886c9ba3b37", + "fullPath": "LastModifiedDate" + }, + "appearance": null, + "size": { + "width": 120 + }, + "readonly": false, + "dataField": "lastModifiedDate", + "dataType": "datetime", + "displayTemplate": null, + "captionTemplate": null, + "editor": { + "id": "lastModifiedDate_a6ba3039_t6cn", + "type": "DateBox", + "titleSourceType": "static", + "title": "最后修改时间", + "controlSource": "Farris", + "appearance": { + "class": "" + }, + "size": null, + "binding": { + "type": "Form", + "path": "lastModifiedDate", + "field": "a6ba3039-4344-4c89-8552-5886c9ba3b37", + "fullPath": "LastModifiedDate" + }, + "require": false, + "disable": false, + "placeholder": "", + "validation": null, + "value": null, + "editable": true, + "dateRange": false, + "showTime": true, + "showType": 1, + "dateFormat": "yyyy-MM-dd HH:mm:ss", + "returnFormat": "yyyy-MM-dd HH:mm:ss", + "maxValue": null, + "minValue": null, + "disableDates": [], + "showWeekNumbers": false, + "dateRangeDatesDelimiter": "~", + "shortcuts": [], + "fieldType": "DateTime", + "useDefault": false, + "holdPlace": false, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "visible": true, + "isTextArea": true, + "tabindex": -1, + "hasDefaultFocus": false, + "focusState": null, + "titleWidth": null, + "localization": false, + "enableAppend": false, + "inputAppendType": "button", + "inputAppendDisabled": false, + "autoHeight": false, + "maxHeight": 500, + "hourStep": 1, + "minuteStep": 1, + "secondStep": 1, + "firstDayOfWeek": "mo", + "path": "lastModifiedDate", + "localizationType": "DateTime", + "format": "'yyyy-MM-dd'", + "requireControlledByRules": true + }, + "draggable": false, + "frozen": "none", + "sortable": true, + "enumData": null, + "idField": "value", + "textField": "name", + "aggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "groupAggregate": { + "type": "none", + "formatter": { + "type": "none" + } + }, + "linkedLabelEnabled": false, + "linkedLabelClick": null, + "textAlign": "left", + "hAlign": "left", + "vAlign": "middle", + "formatter": { + "type": "date", + "dateFormat": "yyyy-MM-dd HH:mm:ss" + }, + "showTips": false, + "tipContent": null, + "multiLanguage": false, + "visible": true, + "enableFilter": false, + "headerStyler": "", + "styler": "", + "localization": false, + "allowGrouping": true, + "tipMode": "auto", + "captionTipContent": "", + "captionTipStyler": "", + "enableBatchEdit": false, + "localizationType": "DateTime", + "visibleControlledByRules": true, + "readonlyControlledByRules": true + } + ], + "focusedItem": null, + "focusedIndex": null, + "pagination": false, + "lockPagination": "viewModel.stateMachine&&viewModel.stateMachine['editable']", + "showPageSize": false, + "identifyField": null, + "multiSelect": false, + "showCheckbox": false, + "selectable": null, + "itemTemplate": null, + "toolBar": null, + "summary": null, + "showAllCheckbox": false, + "fieldEditable": true, + "editable": null, + "groupable": false, + "group": null, + "showGroupColumn": true, + "groupFormatter": null, + "groupStyler": null, + "groupFooter": false, + "fitColumns": false, + "onSelectionChange": "", + "styler": "", + "fixedColumns": [], + "enableCommandColumn": false, + "onEditClicked": "", + "onDeleteClicked": "", + "commandColumnWidth": 120, + "showCommandColumn": true, + "checkedChange": null, + "disableRow": null, + "beforeSelect": null, + "beforeUnSelect": null, + "beforeCheck": null, + "beforeUnCheck": null, + "multiSort": false, + "autoFitColumns": false, + "showFooter": false, + "footerTemplate": "", + "footerDataFrom": "client", + "footerDataCommand": null, + "footerHeight": 29, + "filterType": "none", + "enableFilterRow": false, + "enableSmartFilter": false, + "remoteFilter": false, + "showFilterBar": false, + "showBorder": false, + "striped": true, + "showLineNumber": false, + "lineNumberTitle": "", + "appendRow": null, + "pageChange": null, + "dblClickRow": null, + "useControlPanel": false, + "autoHeight": false, + "rowClick": null, + "showSelectedList": false, + "selectedItemFormatter": null, + "lineNumberWidth": 36, + "enableMorePageSelect": false, + "headerWrap": false, + "emptyTemplate": null, + "emptyDataHeight": 240, + "maxHeight": 300, + "rowHeight": 30, + "enableHighlightCell": false, + "enableEditCellStyle": false, + "showRowGroupPanel": false, + "enableDragColumn": false, + "groupSummaryPosition": "groupFooterRow", + "clearSelectionsWhenDataIsEmpty": true, + "keepSelect": true, + "enableEditByCard": "none", + "pageSizeChanged": null, + "visible": true, + "showGotoInput": false, + "scrollBarShowMode": "auto", + "showScrollArrow": false, + "footerPosition": "bottom", + "footerStyler": null, + "selectOnEditing": false, + "selectionMode": "default", + "enableContextMenu": false, + "disableGroupOnEditing": true, + "enableSimpleMode": false, + "enableScheme": false, + "beforeEdit": null, + "nowrap": true, + "mergeCell": false, + "remoteSort": false, + "columnSorted": null, + "checkOnSelect": false, + "selectOnCheck": false, + "enableHeaderGroup": false, + "headerGroup": null, + "AutoColumnWidthUseDblclick": true, + "virtualized": false, + "virtualizedAsyncLoad": false, + "scrollYLoad": null, + "pagerContentTemplate": null, + "expandGroupRows": true, + "useBlankWhenDataIsEmpty": false, + "checked": null, + "unChecked": null, + "checkAll": null, + "unCheckAll": null, + "filterChanged": null, + "enableEditStateFilterSorting": false, + "showConfirmWhenSchemeChanged": false, + "enableSetMultiHeaders": false, + "allowEmpty": true + } + ], + "isScrollspyContainer": false, + "isLikeCardContainer": false + } + ] + } + ], + "webcmds": [ + { + "id": "7c48ef46-339c-42d4-8365-a21236c63044", + "path": "/projects/packages/Inspur.GS.Gsp.Web.WebCmp/webcmd", + "name": "ListCardController.webcmd", + "refedHandlers": [ + { + "host": "fda876c8-7230-46e7-af3d-d38233642275", + "handler": "loadList" + }, + { + "host": "8788c27e-722a-4b98-9d57-98eafb526fe5", + "handler": "loadCard" + }, + { + "host": "ef281c13-4480-4256-901e-4bef5f92bd9e", + "handler": "add" + }, + { + "host": "d12acc4e-6274-44dc-95e6-cedeb5e66707", + "handler": "edit" + }, + { + "host": "5707d460-c441-45c4-8fe1-f77abd9f75b1", + "handler": "save" + }, + { + "host": "b3897b4b-a37f-48e3-afb3-8489cec02806", + "handler": "cancel" + }, + { + "host": "22576fc1-08fb-49a9-b132-295c7392b481", + "handler": "remove" + }, + { + "host": "e7cf83c2-e52d-4dce-aded-047a819c8068", + "handler": "changePage" + } + ], + "code": "ListCardController", + "nameSpace": "Inspur.GS.Gsp.Web.WebCmp" + }, + { + "id": "70b4abd4-9f2c-4b7c-90e9-6ac6f4b74c72", + "path": "Gsp/Web/webcmp/bo-webcmp/metadata/webcmd", + "name": "ListController.webcmd", + "refedHandlers": [ + { + "host": "fa47fbf9-4ab7-44a3-8af1-a2531bac2af6", + "handler": "Filter" + } + ], + "code": "ListController", + "nameSpace": "Inspur.GS.Gsp.Web.WebCmp" + }, + { + "id": "ebb526d7-87c8-42bf-87cf-0cf880e3c928", + "path": "igix02/cardForms/cardForm01/bo-cardform01-front/metadata/components", + "name": "ListCard01_frm_Controller.webcmd", + "refedHandlers": [ + { + "host": "b21abae6-bf14-4404-b4bd-7255d2fd70a4", + "handler": "RemoveRows1" + } + ], + "code": "ListCard01_frm_Controller", + "nameSpace": "Inspur.GS.igix02.cardForms.cardForm01.cardForm01.Front" + }, + { + "id": "31c1022c-ab40-4e8d-bc31-85d539f1d36c", + "path": "Gsp/Web/AttachmentCmp/bo-attachmentcmp/metadata/webcmd", + "name": "FileController.webcmd", + "code": "FileController", + "nameSpace": "Inspur.GS.Gsp.Web.AttachmentCmp", + "refedHandlers": [ + { + "host": "2edb99f5-63a3-4f30-a15e-3313fdf6ace8", + "handler": "removeFileRows" + } + ] + }, + { + "id": "45be24f9-c1f7-44f7-b447-fe2ada458a61", + "path": "/projects/packages/Inspur.GS.Gsp.Web.WebCmp/webcmd", + "name": "AdvancedListCardController.webcmd", + "refedHandlers": [ + { + "host": "c883b753-69ce-4954-96a7-0e1965424262", + "handler": "AddItem" + }, + { + "host": "c02ea525-57fe-472d-bb28-ff755f3695f5", + "handler": "RemoveItem" + }, + { + "host": "7142f821-5754-46cb-baec-c95389f6dbca", + "handler": "AddItem" + }, + { + "host": "ad8c714b-7422-40f5-bfd9-f124865ab3c2", + "handler": "RemoveItem" + } + ], + "code": "AdvancedListCardController", + "nameSpace": "Inspur.GS.Gsp.Web.WebCmp" + }, + { + "id": "8d21e69c-70b3-44f6-88b5-fd6a8d3ce11b", + "path": "igix/Web/WebCmp/bo-webcmp/metadata/webcmd", + "name": "PopController.webcmd", + "refedHandlers": [], + "code": "PopController", + "nameSpace": "Inspur.GS.Gsp.Web.WebCmp" + }, + { + "id": "eb07c2e4-7cc1-4d95-aad0-410823006d71", + "path": "igix/Web/WebCmp/bo-webcmp/metadata/webcmd", + "name": "CommandController.webcmd", + "refedHandlers": [], + "code": "CommandController", + "nameSpace": "Inspur.GS.Gsp.Web.WebCmp" + } + ], + "serviceRefs": [], + "projectName": "bo-cardform01-front", + "showType": "page", + "toolbar": { + "items": {}, + "configs": { + "modal": {} + } + }, + "expressions": [], + "metadataId": "f22d1ee5-d7c9-491c-9433-29cb8871aee0", + "actions": [ + { + "sourceComponent": { + "id": "button-add", + "viewModelId": "data-grid-component-viewmodel", + "map": [ + { + "event": { + "label": "click", + "name": "点击事件" + }, + "targetComponent": { + "id": "data-grid-component", + "viewModelId": "data-grid-component-viewmodel" + }, + "command": { + "id": "ef281c13-4480-4256-901e-4bef5f92bd9e", + "label": "add1", + "name": "新增一条数据", + "handlerName": "add", + "params": [], + "cmpId": "7c48ef46-339c-42d4-8365-a21236c63044", + "isNewGenerated": false, + "isInvalid": false + }, + "controller": { + "id": "7c48ef46-339c-42d4-8365-a21236c63044", + "label": "ListCardController", + "name": "列卡控制器" + } + } + ] + } + }, + { + "sourceComponent": { + "id": "button-edit", + "viewModelId": "detail-form-component-viewmodel", + "map": [ + { + "event": { + "label": "click", + "name": "点击事件" + }, + "targetComponent": { + "id": "detail-form-component", + "viewModelId": "detail-form-component-viewmodel" + }, + "command": { + "id": "d12acc4e-6274-44dc-95e6-cedeb5e66707", + "label": "edit1", + "name": "编辑数据", + "handlerName": "edit", + "params": [ + { + "name": "id", + "shownName": "待编辑数据的标识", + "value": "{DATA~/detail-form-component/id}", + "defaultValue": null + }, + { + "name": "transitionAction", + "shownName": "状态机动作", + "value": "Edit", + "defaultValue": null + } + ], + "cmpId": "7c48ef46-339c-42d4-8365-a21236c63044", + "isNewGenerated": false, + "isInvalid": false + }, + "controller": { + "id": "7c48ef46-339c-42d4-8365-a21236c63044", + "label": "ListCardController", + "name": "列卡控制器" + } + } + ] + } + }, + { + "sourceComponent": { + "id": "button-save", + "viewModelId": "detail-form-component-viewmodel", + "map": [ + { + "event": { + "label": "click", + "name": "点击事件" + }, + "targetComponent": { + "id": "detail-form-component", + "viewModelId": "detail-form-component-viewmodel" + }, + "command": { + "id": "5707d460-c441-45c4-8fe1-f77abd9f75b1", + "label": "save1", + "name": "保存变更", + "handlerName": "save", + "params": [ + { + "name": "loadCmdName", + "shownName": "保存后回调方法", + "value": "", + "defaultValue": null + }, + { + "name": "loadCmdFrameId", + "shownName": "目标组件", + "value": "", + "defaultValue": null + }, + { + "name": "successMsg", + "shownName": "保存成功提示信息", + "value": "", + "defaultValue": null + } + ], + "cmpId": "7c48ef46-339c-42d4-8365-a21236c63044", + "isNewGenerated": false, + "isInvalid": false + }, + "controller": { + "id": "7c48ef46-339c-42d4-8365-a21236c63044", + "label": "ListCardController", + "name": "列卡控制器" + } + } + ] + } + }, + { + "sourceComponent": { + "id": "button-cancel", + "viewModelId": "detail-form-component-viewmodel", + "map": [ + { + "event": { + "label": "click", + "name": "点击事件" + }, + "targetComponent": { + "id": "detail-form-component", + "viewModelId": "detail-form-component-viewmodel" + }, + "command": { + "id": "b3897b4b-a37f-48e3-afb3-8489cec02806", + "label": "cancel1", + "name": "取消变更", + "handlerName": "cancel", + "params": [ + { + "name": "loadCmdName", + "shownName": "取消后回调方法", + "value": "", + "defaultValue": null + }, + { + "name": "loadCmdFrameId", + "shownName": "目标组件", + "value": "", + "defaultValue": null + } + ], + "cmpId": "7c48ef46-339c-42d4-8365-a21236c63044", + "isNewGenerated": false, + "isInvalid": false + }, + "controller": { + "id": "7c48ef46-339c-42d4-8365-a21236c63044", + "label": "ListCardController", + "name": "列卡控制器" + } + } + ] + } + }, + { + "sourceComponent": { + "id": "button-delete", + "viewModelId": "data-grid-component-viewmodel", + "map": [ + { + "event": { + "label": "click", + "name": "点击事件" + }, + "targetComponent": { + "id": "data-grid-component", + "viewModelId": "data-grid-component-viewmodel" + }, + "command": { + "id": "22576fc1-08fb-49a9-b132-295c7392b481", + "label": "remove1", + "name": "删除当前数据", + "handlerName": "remove", + "params": [ + { + "name": "id", + "shownName": "待删除数据的标识", + "value": "{DATA~/data-grid-component/id}", + "defaultValue": null + }, + { + "name": "refreshCommandName", + "shownName": "删除后回调方法", + "value": "", + "defaultValue": null + }, + { + "name": "refreshCommandFrameId", + "shownName": "目标组件", + "value": "", + "defaultValue": null + }, + { + "name": "ifSave", + "shownName": "是否执行保存", + "value": "", + "defaultValue": null + }, + { + "name": "successMsg", + "shownName": "删除成功提示信息", + "value": "", + "defaultValue": null + } + ], + "cmpId": "7c48ef46-339c-42d4-8365-a21236c63044", + "isNewGenerated": false, + "isInvalid": false + }, + "controller": { + "id": "7c48ef46-339c-42d4-8365-a21236c63044", + "label": "ListCardController", + "name": "列卡控制器" + } + } + ] + } + }, + { + "sourceComponent": { + "id": "fybxdmxwxh-l5rr-component-button-add", + "viewModelId": "fybxdmxwxh-l5rr-component-viewmodel", + "map": [ + { + "event": { + "label": "click", + "name": "点击事件" + }, + "targetComponent": { + "id": "fybxdmxwxh-l5rr-component", + "viewModelId": "fybxdmxwxh-l5rr-component-viewmodel" + }, + "command": { + "id": "c883b753-69ce-4954-96a7-0e1965424262", + "label": "fybxdmxwxhl5rrAddItem1", + "name": "增加一条子表数据1", + "handlerName": "AddItem", + "params": [], + "cmpId": "45be24f9-c1f7-44f7-b447-fe2ada458a61", + "isNewGenerated": false, + "isInvalid": false + }, + "controller": { + "id": "45be24f9-c1f7-44f7-b447-fe2ada458a61", + "label": "AdvancedListCardController", + "name": "高级列卡控制器" + } + } + ] + } + }, + { + "sourceComponent": { + "id": "fybxdmxwxh-l5rr-component-button-remove", + "viewModelId": "fybxdmxwxh-l5rr-component-viewmodel", + "map": [ + { + "event": { + "label": "click", + "name": "点击事件" + }, + "targetComponent": { + "id": "fybxdmxwxh-l5rr-component", + "viewModelId": "fybxdmxwxh-l5rr-component-viewmodel" + }, + "command": { + "id": "c02ea525-57fe-472d-bb28-ff755f3695f5", + "label": "fybxdmxwxhl5rrRemoveItem1", + "name": "删除一条子表数据1", + "handlerName": "RemoveItem", + "params": [ + { + "name": "id", + "shownName": "待删除子表数据的标识", + "value": "{DATA~/#{fybxdmxwxh-l5rr-component}/fybxdmxWxhs/id}" + } + ], + "cmpId": "45be24f9-c1f7-44f7-b447-fe2ada458a61", + "isNewGenerated": false, + "isInvalid": false + }, + "controller": { + "id": "45be24f9-c1f7-44f7-b447-fe2ada458a61", + "label": "AdvancedListCardController", + "name": "高级列卡控制器" + } + } + ] + } + }, + { + "sourceComponent": { + "id": "fybxjkmxwxh-73yo-component-button-add", + "viewModelId": "fybxjkmxwxh-73yo-component-viewmodel", + "map": [ + { + "event": { + "label": "click", + "name": "点击事件" + }, + "targetComponent": { + "id": "fybxjkmxwxh-73yo-component", + "viewModelId": "fybxjkmxwxh-73yo-component-viewmodel" + }, + "command": { + "id": "7142f821-5754-46cb-baec-c95389f6dbca", + "label": "fybxjkmxwxh73yoAddItem1", + "name": "增加一条子表数据1", + "handlerName": "AddItem", + "params": [], + "cmpId": "45be24f9-c1f7-44f7-b447-fe2ada458a61", + "isNewGenerated": false, + "isInvalid": false + }, + "controller": { + "id": "45be24f9-c1f7-44f7-b447-fe2ada458a61", + "label": "AdvancedListCardController", + "name": "高级列卡控制器" + } + } + ] + } + }, + { + "sourceComponent": { + "id": "fybxjkmxwxh-73yo-component-button-remove", + "viewModelId": "fybxjkmxwxh-73yo-component-viewmodel", + "map": [ + { + "event": { + "label": "click", + "name": "点击事件" + }, + "targetComponent": { + "id": "fybxjkmxwxh-73yo-component", + "viewModelId": "fybxjkmxwxh-73yo-component-viewmodel" + }, + "command": { + "id": "ad8c714b-7422-40f5-bfd9-f124865ab3c2", + "label": "fybxjkmxwxh73yoRemoveItem1", + "name": "删除一条子表数据1", + "handlerName": "RemoveItem", + "params": [ + { + "name": "id", + "shownName": "待删除子表数据的标识", + "value": "{DATA~/#{fybxjkmxwxh-73yo-component}/fybxjkmxWxhs/id}" + } + ], + "cmpId": "45be24f9-c1f7-44f7-b447-fe2ada458a61", + "isNewGenerated": false, + "isInvalid": false + }, + "controller": { + "id": "45be24f9-c1f7-44f7-b447-fe2ada458a61", + "label": "AdvancedListCardController", + "name": "高级列卡控制器" + } + } + ] + } + }, + { + "sourceComponent": { + "id": "dataGrid", + "viewModelId": "data-grid-component-viewmodel", + "map": [ + { + "event": { + "label": "onSelectionChange", + "name": "行切换事件" + }, + "targetComponent": { + "id": "data-grid-component", + "viewModelId": "data-grid-component-viewmodel" + }, + "command": { + "id": "8788c27e-722a-4b98-9d57-98eafb526fe5", + "label": "loadCard1", + "name": "加载卡片数据", + "handlerName": "loadCard", + "params": [], + "cmpId": "7c48ef46-339c-42d4-8365-a21236c63044", + "isNewGenerated": false, + "isInvalid": false + }, + "controller": { + "id": "7c48ef46-339c-42d4-8365-a21236c63044", + "label": "ListCardController", + "name": "列卡控制器" + } + }, + { + "event": { + "label": "pageChange", + "name": "切换页码事件" + }, + "targetComponent": { + "id": "data-grid-component", + "viewModelId": "data-grid-component-viewmodel" + }, + "command": { + "id": "e7cf83c2-e52d-4dce-aded-047a819c8068", + "label": "changePage1", + "name": "切换页码", + "handlerName": "changePage", + "params": [ + { + "name": "loadCommandName", + "shownName": "切换页面后回调方法", + "value": "loadList1", + "defaultValue": null + }, + { + "name": "loadCommandFrameId", + "shownName": "目标组件", + "value": "data-grid-component", + "defaultValue": null + } + ], + "cmpId": "7c48ef46-339c-42d4-8365-a21236c63044", + "isNewGenerated": false, + "isInvalid": false + }, + "controller": { + "id": "7c48ef46-339c-42d4-8365-a21236c63044", + "label": "ListCardController", + "name": "列卡控制器" + } + }, + { + "event": { + "label": "pageSizeChanged", + "name": "分页条数变化事件" + }, + "targetComponent": { + "id": "data-grid-component", + "viewModelId": "data-grid-component-viewmodel" + }, + "command": { + "id": "e7cf83c2-e52d-4dce-aded-047a819c8068", + "label": "changePage1", + "name": "切换页码", + "handlerName": "changePage", + "params": [ + { + "name": "loadCommandName", + "shownName": "切换页面后回调方法", + "value": "loadList1", + "defaultValue": null + }, + { + "name": "loadCommandFrameId", + "shownName": "目标组件", + "value": "data-grid-component", + "defaultValue": null + } + ], + "cmpId": "7c48ef46-339c-42d4-8365-a21236c63044", + "isNewGenerated": false, + "isInvalid": false + }, + "controller": { + "id": "7c48ef46-339c-42d4-8365-a21236c63044", + "label": "ListCardController", + "name": "列卡控制器" + } + } + ] + } + }, + { + "sourceComponent": { + "id": "data-grid-component", + "viewModelId": "data-grid-component-viewmodel", + "map": [ + { + "event": { + "label": "onInit", + "name": "初始化事件" + }, + "targetComponent": { + "id": "data-grid-component", + "viewModelId": "data-grid-component-viewmodel" + }, + "command": { + "id": "fda876c8-7230-46e7-af3d-d38233642275", + "label": "loadList1", + "name": "加载列表数据", + "handlerName": "loadList", + "params": [ + { + "name": "filter", + "shownName": "过滤条件", + "value": "", + "defaultValue": null + }, + { + "name": "sort", + "shownName": "排序条件", + "value": "", + "defaultValue": null + } + ], + "cmpId": "7c48ef46-339c-42d4-8365-a21236c63044", + "isNewGenerated": false, + "isInvalid": false + }, + "controller": { + "id": "7c48ef46-339c-42d4-8365-a21236c63044", + "label": "ListCardController", + "name": "列卡控制器" + } + } + ] + } + } + ], + "declarations": { + "events": [], + "commands": [], + "states": [] + }, + "subscriptions": [], + "extraImports": [] + }, + "options": { + "enableTextArea": true, + "renderMode": "compile", + "enableDragAndDropToModifyLayout": false, + "changeSetPolicy": "valid", + "enableServerSideChangeDetection": false + } +} \ No newline at end of file diff --git a/packages/mobile-designer/public/designer-canvas/management-list.json b/packages/mobile-designer/public/designer-canvas/management-list.json new file mode 100644 index 0000000000000000000000000000000000000000..c86289c2531cdbf50ea34daab4eec76ed92569a5 --- /dev/null +++ b/packages/mobile-designer/public/designer-canvas/management-list.json @@ -0,0 +1,248 @@ +{ + "id": "root-component", + "type": "component", + "name": "根组件", + "componentType": "frame", + "contents": [ + { + "id": "root-layout", + "type": "content-container", + "appearance": { + "class": "f-page f-page-is-managelist f-page-has-scheme" + }, + "contents": [ + { + "id": "query-solution-1718595759352", + "type": "query-solution", + "appearance": { + "id": "undefined-1718595759352", + "class": "f-section-scheme f-section-in-managelist" + }, + "fields": [{ + "id": "date", + "labelCode": "date", + "code": "date", + "name": "日期", + "editor": { + "type": "date", + "require": "false", + "returnFormat": "yyyy-MM-dd", + "format": "yyyy-MM-dd" + + } + }], + "isControlInline": true, + "filterText": "筛选文案", + "expanded": false + }, + { + "id": "page-header", + "type": "page-header", + "appearance": { + "class": "f-page-header" + }, + "icon": "f-icon f-icon-page-title-administer", + "title": "报销单据管理列表", + "toolbar": { + "type": "response-toolbar", + "buttons": [ + { + "id": "button-add", + "type": "ToolBarItem", + "appearance": { + "class": "btn-primary" + }, + "text": "新增" + }, + { + "id": "button-edit", + "type": "ToolBarItem", + "text": "编辑" + }, + { + "id": "button-view", + "type": "ToolBarItem", + "text": "查看" + }, + { + "id": "button-delete", + "type": "ToolBarItem", + "text": "删除" + }, + { + "id": "toolBarItem_6575", + "type": "ToolBarItem", + "text": "稽核通过" + }, + { + "id": "toolBarItem_8063", + "type": "ToolBarItem", + "text": "稽核不通过" + }, + { + "id": "button-view-changeLog", + "type": "ToolBarItem", + "text": "查看业务变更日志" + }, + { + "id": "button-print", + "type": "ToolBarItem", + "text": "打印" + } + ] + } + }, + { + "id": "page-main", + "type": "content-container", + "appearance": { + "class": "f-page-main" + }, + "contents": [ + { + "id": "filter-bar-1719903249152", + "type": "filter-bar", + "appearance": { + "id": "undefined-1719903249152" + }, + "resetText": "清空已选wenan", + "showReset": false, + "mode": "display-only" + }, + { + "id": "data-grid-component", + "type": "component", + "appearance": { + "class": "f-struct-wrapper f-utils-fill-flex-column" + }, + "contents": [ + { + "id": "data-grid-section", + "type": "section", + "appearance": { + "class": "f-section-grid f-section-in-managelist" + }, + "showHeader":false, + "contents": [ + { + "id": "dataGrid", + "type": "data-grid", + "appearance": { + "class": "f-component-grid" + }, + "columns": [ + { + "id": "billType_0ac6dd9f_rsnc", + "type": "GridField", + "title": "报销类型", + "field": "billType", + "dataType": "enum", + "enumData": [ + { + "name": "差旅费", + "value": "CL" + }, + { + "name": "手机费", + "value": "SJ" + }, + { + "name": "交通费", + "value": "JT" + } + ] + }, + { + "id": "employee_Employee_Name_24534726_vdxd", + "type": "GridField", + "title": "报销人", + "field": "employee.employee_Name", + "dataType": "string" + }, + { + "id": "code_729c8ec9_ukae", + "type": "GridField", + "title": "单据编号", + "field": "code", + "dataType": "string" + }, + { + "id": "department_Department_name_8e551f99_w82g", + "type": "GridField", + "title": "所属部门", + "field": "department.department_name", + "dataType": "string" + }, + { + "id": "totalSum_25592d80_8whb", + "type": "GridField", + "title": "报帐金额", + "field": "totalSum", + "dataType": "number" + }, + { + "id": "billState_BillState_e77749d1_2qzj", + "type": "GridField", + "title": "单据状态", + "field": "billState.billState", + "dataType": "enum", + "enumData": [ + { + "name": "制单", + "value": "Billing" + }, + { + "name": "提交审批", + "value": "SubmitApproval" + }, + { + "name": "审批通过", + "value": "Approved" + }, + { + "name": "审批不通过", + "value": "ApprovalNotPassed" + } + ] + }, + { + "id": "createDate_ac6fab1f_45bs", + "type": "GridField", + "title": "制单日期", + "field": "createDate", + "dataType": "datetime" + }, + { + "id": "auditStatus_5aeb26bc_5jnn", + "type": "GridField", + "title": "稽核状态", + "field": "auditStatus", + "dataType": "enum", + "enumData": [ + { + "name": "未稽核", + "value": "None" + }, + { + "name": "通过", + "value": "Passed" + }, + { + "name": "未通过", + "value": "Reject" + } + ] + } + ] + } + ] + } + ], + "componentType": "data-grid" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/packages/mobile-designer/public/designer-canvas/navigation.json b/packages/mobile-designer/public/designer-canvas/navigation.json new file mode 100644 index 0000000000000000000000000000000000000000..9d5106262a797464e0542911fc19b9033ec411c2 --- /dev/null +++ b/packages/mobile-designer/public/designer-canvas/navigation.json @@ -0,0 +1,68 @@ +{ + "id": "root-component", + "type": "component", + "componentType": "frame", + "contents": [ + { + "id": "root-layout", + "type": "content-container", + "appearance": { + "class": "f-page f-page-navigate f-page-is-listnav" + }, + "size": null, + "contents": [ + { + "id": "root-layout-content", + "type": "content-container", + "appearance": { + "class": "f-page-main" + }, + "size": null, + "contents": [ + { + "id": "page-content", + "type": "layout", + "appearance": { + "class": "f-page-content" + }, + "size": null, + "contents": [ + { + "id": "list-nav", + "type": "layout-pane", + "position": "left", + "width": "400", + "contents": [] + }, + { + "id": "page-content-main", + "type": "layout-pane", + "position": "center", + "contents": [ + { + "id": "page-content-layout", + "type": "content-container", + "appearance": { + "class": "f-page f-page-is-managelist " + }, + "contents": [ + { + "id": "page-main", + "type": "content-container", + "appearance": { + "class": "f-page-main" + }, + "contents": [] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/packages/mobile-designer/public/designer-canvas/project-info.json b/packages/mobile-designer/public/designer-canvas/project-info.json new file mode 100644 index 0000000000000000000000000000000000000000..4e23cca80c918b7551331765d41261764740c7a7 --- /dev/null +++ b/packages/mobile-designer/public/designer-canvas/project-info.json @@ -0,0 +1,1054 @@ +{ + "id": "root-component", + "type": "component", + "componentType": "frame", + "contents": [ + { + "id": "root-layout", + "type": "content-container", + "appearance": { + "class": "f-page f-page-card f-page-is-mainsubcard" + }, + "contents": [ + { + "id": "page-header", + "type": "page-header", + "appearance": { + "class": "f-page-header" + }, + "icon": "f-icon f-icon-page-title-record", + "title": "添加计划卡片" + }, + { + "id": "main-container", + "type": "content-container", + "appearance": { + "class": "f-page-main" + }, + "contents": [ + { + "id": "like-card-container", + "type": "content-container", + "appearance": { + "class": "f-struct-like-card" + }, + "contents": [ + { + "id": "basic-form-component", + "type": "component", + "componentType": "form-col-4", + "appearance": { + "class": "f-struct-wrapper" + }, + "contents": [ + { + "id": "basic-form-section", + "type": "section", + "appearance": { + "class": "f-section-form f-section-in-mainsubcard" + }, + "mainTitle": "基本信息", + "contents": [ + { + "id": "basic-form-layout", + "type": "response-form", + "appearance": { + "class": "f-form-layout farris-form farris-form-controls-inline" + }, + "contents": [ + { + "id": "entryName_3b41420a_8d8s", + "type": "form-group", + "label": "项目名称", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "input-group" + } + }, + { + "id": "projectNumber_4a244f92_u81b", + "type": "form-group", + "label": "项目编号", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "input-group" + } + }, + { + "id": "projectType_c578493a_7z97", + "type": "form-group", + "label": "项目类型", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "combo-list", + "data": [ + { + "name": "重大", + "value": "major" + }, + { + "name": "重点", + "value": "keynote" + }, + { + "name": "一般", + "value": "general" + } + ] + } + }, + { + "id": "priority_33bbe4c4_4fwq", + "type": "form-group", + "label": "优先级", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "combo-list", + "data": [ + { + "name": "低", + "value": "0" + }, + { + "name": "中", + "value": "1" + }, + { + "name": "高", + "value": "2" + } + ] + } + }, + { + "id": "customerName_84a0dff1_bfbu", + "type": "form-group", + "label": "客户名称", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "input-group" + } + }, + { + "id": "projectPhase_9f51cccb_1vcj", + "type": "form-group", + "label": "项目阶段", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "combo-list", + "data": [ + { + "name": "计划中", + "value": "0" + }, + { + "name": "立项中", + "value": "1" + }, + { + "name": "实施中", + "value": "2" + }, + { + "name": "已验收", + "value": "3" + } + ] + } + }, + { + "id": "projectManager_43bd544d_xc5k", + "type": "form-group", + "label": "项目经理", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "input-group" + } + }, + { + "id": "updateInfo_CreatedBy_1c3b33f4_wp9s", + "type": "form-group", + "label": "创建人", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "input-group" + } + }, + { + "id": "updateInfo_CreatedOn_1c3b33f4_529o", + "type": "form-group", + "label": "创建时间", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "date-picker" + } + }, + { + "id": "updateInfo_LastChangedBy_1c3b33f4_nga1", + "type": "form-group", + "label": "最后修改人", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "input-group" + } + }, + { + "id": "updateInfo_LastChangedOn_1c3b33f4_3z4k", + "type": "form-group", + "label": "最后修改时间", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "date-picker" + } + }, + { + "id": "projectDescription_f3ab1fbf_omx3", + "type": "form-group", + "label": "项目说明", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "input-group" + } + } + ] + } + ] + } + ] + }, + { + "id": "proinfomg-02xn-component", + "type": "component", + "componentType": "form-col-4", + "appearance": { + "class": "f-struct-wrapper" + }, + "contents": [ + { + "id": "proinfomg-02xn-form-section", + "type": "section", + "appearance": { + "class": "f-section-form f-section-in-mainsubcard" + }, + "mainTitle": "实施进展", + "contents": [ + { + "id": "proinfomg-02xn-form-layout", + "type": "response-form", + "appearance": { + "class": "f-form-layout farris-form farris-form-controls-inline" + }, + "contents": [ + { + "id": "plannedDuration_8ff4d999_y21n", + "type": "form-group", + "label": "计划工期", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "number-spinner" + } + }, + { + "id": "startDate_abd56175_bu85", + "type": "form-group", + "label": "开始日期", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "date-picker" + } + }, + { + "id": "endDate_217cee38_ofcp", + "type": "form-group", + "label": "结束日期", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "date-picker" + } + }, + { + "id": "schedule_42551086_lher", + "type": "form-group", + "label": "项目进度", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "number-spinner" + } + }, + { + "id": "taskSituationSub_215d09e8_nc1a", + "type": "form-group", + "label": "任务情况(未完成)", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "number-spinner" + } + }, + { + "id": "delayRate_3e1fe3a3_jndm", + "type": "form-group", + "label": "延误率", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "number-spinner" + } + }, + { + "id": "overExpenditure_2db76154_ixe0", + "type": "form-group", + "label": "是否超支", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "combo-list", + "data": [ + { + "name": "是", + "value": "yes" + }, + { + "name": "否", + "value": "no" + } + ] + } + } + ] + } + ] + } + ] + }, + { + "id": "proinfomg-fd2s-component", + "type": "component", + "componentType": "form-col-4", + "appearance": { + "class": "f-struct-wrapper" + }, + "contents": [ + { + "id": "proinfomg-fd2s-form-section", + "type": "section", + "appearance": { + "class": "f-section-form f-section-in-mainsubcard" + }, + "mainTitle": "项目预算", + "contents": [ + { + "id": "proinfomg-fd2s-form-layout", + "type": "response-form", + "appearance": { + "class": "f-form-layout farris-form farris-form-controls-inline" + }, + "contents": [ + { + "id": "contractAmount_2860f46f_29na", + "type": "form-group", + "label": "合同额(万元)", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "number-spinner" + } + }, + { + "id": "repayAmount_c7e60c93_zmp5", + "type": "form-group", + "label": "回款额", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "number-spinner" + } + }, + { + "id": "expectedRevenue_e8ab1901_0z0p", + "type": "form-group", + "label": "预计收入", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "number-spinner" + } + }, + { + "id": "profitRate_7f57dc06_7g0j", + "type": "form-group", + "label": "利润率", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "number-spinner" + } + }, + { + "id": "projectSource_d6643525_h4zh", + "type": "form-group", + "label": "项目来源", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "combo-list", + "data": [ + { + "name": "集团外", + "value": "InGroup" + }, + { + "name": "集团内", + "value": "OutGroup" + }, + { + "name": "研发", + "value": "Dev" + } + ] + } + }, + { + "id": "profit_20ae771d_ksmh", + "type": "form-group", + "label": "利润(万元)", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "number-spinner" + } + }, + { + "id": "cost_c2886ec2_jjz1", + "type": "form-group", + "label": "成本", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "number-spinner" + } + }, + { + "id": "budget_8b87967d_4vt9", + "type": "form-group", + "label": "预算", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "number-spinner" + } + }, + { + "id": "profitRateShow_9b108590_gipy", + "type": "form-group", + "label": "利率关联", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "input-group" + } + }, + { + "id": "profitRateShow_ProfitRateShow_Profit_f927ad64_gdru", + "type": "form-group", + "label": "利润", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "number-spinner" + } + }, + { + "id": "profitRateShow_ProfitRateShow_ProfitRate_56e3c428_px3e", + "type": "form-group", + "label": "利润率", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "number-spinner" + } + }, + { + "id": "profitRateShow_ProfitRateShow_Name_d02f639c_h8md", + "type": "form-group", + "label": "关联利润", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "input-group" + } + } + ] + } + ] + } + ] + }, + { + "id": "detail-container-taskmanager", + "type": "content-container", + "appearance": { + "class": "f-utils-flex-column" + }, + "contents": [ + { + "id": "detail-section-taskmanager", + "type": "section", + "appearance": { + "class": " f-section-in-mainsubcard" + }, + "mainTitle": "任务管理", + "contents": [ + { + "id": "taskmanager-component", + "type": "component", + "componentType": "data-grid", + "appearance": { + "class": "f-struct-is-subgrid" + }, + "contents": [ + { + "id": "taskmanager-component-layout", + "type": "content-container", + "appearance": { + "class": "f-grid-is-sub f-utils-flex-column" + }, + "contents": [ + { + "id": "dataGrid_taskmanager", + "type": "data-grid", + "appearance": { + "class": "f-component-grid f-utils-fill" + }, + "columns": [ + { + "id": "projectPeriod_8873e280_vv6q", + "type": "GridField", + "title": "项目阶段", + "field": "projectPeriod", + "dataType": "string", + "editor": { + "type": "input-group" + } + }, + { + "id": "childPeriod_519e9a86_2r5x", + "type": "GridField", + "title": "子阶段", + "field": "childPeriod", + "dataType": "string", + "editor": { + "type": "input-group" + } + }, + { + "id": "projectDesc_c9e08592_21o1", + "type": "GridField", + "title": "阶段任务概述", + "field": "projectDesc", + "dataType": "string", + "editor": { + "type": "input-group" + } + }, + { + "id": "startDate_1061795c_q7dr", + "type": "GridField", + "title": "开始时间", + "field": "startDate", + "dataType": "datetime", + "editor": { + "type": "date-picker" + } + }, + { + "id": "endDate_de243f0b_1bak", + "type": "GridField", + "title": "结束时间", + "field": "endDate", + "dataType": "datetime", + "editor": { + "type": "date-picker" + } + }, + { + "id": "reponsibility_Reponsibility_name_6742d702_x5up", + "type": "GridField", + "title": "责任人", + "field": "reponsibility.reponsibility_name", + "dataType": "string", + "editor": { + "type": "input-group" + } + }, + { + "id": "deliverables_8599ab72_afbj", + "type": "GridField", + "title": "交付物", + "field": "deliverables", + "dataType": "string", + "editor": { + "type": "input-group" + } + }, + { + "id": "note_055bebe1_q89w", + "type": "GridField", + "title": "备注", + "field": "note", + "dataType": "string", + "editor": { + "type": "input-group" + } + } + ] + } + ] + } + ] + } + ], + "toolbar": { + "id": "detail-section-taskmanager-toolbar", + "type": "response-toolbar", + "position": "inHead", + "contents": [ + { + "id": "taskmanagerAddButton", + "type": "response-toolbar-item", + "text": "新增", + "appearance": { + "class": "btn btn-secondary f-btn-ml" + } + }, + { + "id": "taskmanagerRemoveButton", + "type": "response-toolbar-item", + "text": "删除", + "appearance": { + "class": "btn btn-secondary f-btn-ml" + } + } + ] + } + } + ] + }, + { + "id": "detail-container-proinfomgteam", + "type": "content-container", + "appearance": { + "class": "f-utils-flex-column" + }, + "contents": [ + { + "id": "detail-section-proinfomgteam", + "type": "section", + "appearance": { + "class": " f-section-in-mainsubcard" + }, + "mainTitle": "项目管理团队", + "contents": [ + { + "id": "proinfomgteam-component", + "type": "component", + "componentType": "dataGrid", + "appearance": { + "class": "f-struct-is-subgrid" + }, + "contents": [ + { + "id": "proinfomgteam-component-layout", + "type": "content-container", + "appearance": { + "class": "f-grid-is-sub f-utils-flex-column" + }, + "contents": [ + { + "id": "dataGrid_proinfomgteam", + "type": "data-grid", + "columns": [ + { + "id": "role_9b630cd6_ydh1", + "type": "GridField", + "title": "角色", + "field": "role", + "dataType": "enum", + "editor": { + "type": "combo-list", + "data": [ + { + "name": "项目经理", + "value": "promanage" + }, + { + "name": "架构师", + "value": "architects" + }, + { + "name": "产品经理", + "value": "productmanager" + }, + { + "name": "ui设计师", + "value": "ui" + }, + { + "name": "开发", + "value": "dev" + }, + { + "name": "测试", + "value": "test" + }, + { + "name": "运维", + "value": "operation" + } + ] + } + }, + { + "id": "roleResponsibility_476f5ea5_g21g", + "type": "GridField", + "title": "角色职责", + "field": "roleResponsibility", + "dataType": "string", + "editor": { + "type": "input-group" + } + }, + { + "id": "levelCode_b155eef0_yf0y", + "type": "GridField", + "title": "级别", + "field": "levelCode", + "dataType": "enum", + "editor": { + "type": "combo-list", + "data": [ + { + "name": "低", + "value": "0" + }, + { + "name": "中", + "value": "1" + }, + { + "name": "高", + "value": "2" + } + ] + } + }, + { + "id": "cost_9831c3bb_j49x", + "type": "GridField", + "title": "成本(人/天)", + "field": "cost", + "dataType": "number", + "editor": { + "type": "number-spinner" + } + }, + { + "id": "estWorkingHours_3a358106_05my", + "type": "GridField", + "title": "预计工时(人/天)", + "field": "estWorkingHours", + "dataType": "number", + "editor": { + "type": "number-spinner" + } + }, + { + "id": "total_ab4014b9_oh46", + "type": "GridField", + "title": "预计人力成本(元)", + "dataType": "number", + "editor": { + "type": "number-spinner" + } + } + ], + "appearance": { + "class": "f-component-grid f-utils-fill" + } + } + ] + } + ] + } + ], + "toolbar": { + "id": "SectionToolbar", + "type": "response-toolbar", + "position": "inHead", + "contents": [ + { + "id": "proinfomgteamAddButton", + "type": "response-toolbar-item", + "text": "新增", + "appearance": { + "class": "btn btn-secondary f-btn-ml" + } + }, + { + "id": "proinfomgteamRemoveButton", + "type": "response-toolbar-item", + "text": "删除", + "appearance": { + "class": "btn btn-secondary f-btn-ml" + } + } + ] + } + } + ] + }, + { + "id": "detail-container-laborcosts", + "type": "content-container", + "appearance": { + "class": "f-utils-flex-column" + }, + "contents": [ + { + "id": "detail-section-laborcosts", + "type": "section", + "appearance": { + "class": " f-section-in-mainsubcard" + }, + "mainTitle": "人力成本", + "contents": [ + { + "id": "laborcosts-component", + "type": "component", + "componentType": "dataGrid", + "appearance": { + "class": "f-struct-is-subgrid" + }, + "contents": [ + { + "id": "laborcosts-component-layout", + "type": "content-container", + "appearance": { + "class": "f-grid-is-sub f-utils-flex-column" + }, + "contents": [ + { + "id": "dataGrid_laborcosts", + "type": "data-grid", + "dataSource": "laborcostss", + "columns": [ + { + "id": "roleName_81ce2aa5_1ndb", + "type": "GridField", + "title": "角色名称", + "field": "roleName", + "dataType": "string", + "editor": { + "id": "roleName_81ce2aa5_1ndb", + "type": "input-group", + "title": "角色名称" + } + }, + { + "id": "unit_d6e72a20_f506", + "type": "GridField", + "title": "单位", + "field": "unit", + "dataType": "string", + "editor": { + "id": "roleName_81ce2aa5_1ndb", + "type": "input-group", + "title": "单位" + } + }, + { + "id": "cost_37ee6449_t3dw", + "type": "GridField", + "title": "成本(人/天)", + "dataType": "number", + "editor": { + "id": "cost_37ee6449_t3dw", + "type": "input-group", + "title": "成本(人/天)" + } + }, + { + "id": "costTotal_61e61f59_678i", + "type": "GridField", + "title": "费用小计", + "dataType": "number", + "editor": { + "id": "costTotal_61e61f59_678i", + "type": "input-group", + "title": "费用小计" + } + } + ], + "appearance": { + "class": "f-component-grid f-utils-fill" + } + } + ] + } + ] + } + ], + "toolbar": { + "id": "detail-section-laborcosts-toolbar", + "type": "response-toolbar", + "position": "inHead", + "buttons": [ + { + "id": "laborcostsAddButton", + "type": "response-toolbar-item", + "text": "新增", + "appearance": { + "class": "btn btn-secondary f-btn-ml" + } + }, + { + "id": "laborcostsRemoveButton", + "type": "response-toolbar-item", + "text": "删除", + "appearance": { + "class": "btn btn-secondary f-btn-ml" + } + } + ] + } + } + ] + }, + { + "id": "htmltemplate_6260", + "type": "html-template", + "html": "
\r\n\t
\r\n\t\t
\r\n\t\t\t
预计成本:
\r\n\t\t\t
{{viewModel['bindingData']['estimatedCost']}}
\r\n\t\t\t
预计利润:
\r\n\t\t\t
{{viewModel['bindingData']['expectedProfit']}}
\r\n\t\t\t
预计利润率:
\r\n\t\t\t
{{viewModel['bindingData']['expectedProfitMargin']}} %
\r\n\t\t
\r\n\t
\r\n
" + }, + { + "id": "proinfomg-s3hp-component", + "type": "component", + "componentType": "form-col-4", + "appearance": { + "class": "f-struct-wrapper" + }, + "contents": [ + { + "id": "proinfomg-s3hp-form-section", + "type": "section", + "appearance": { + "class": "f-section-form f-section-in-mainsubcard" + }, + "mainTitle": "项目信息管理", + "contents": [ + { + "id": "proinfomg-s3hp-form-layout", + "type": "response-form", + "appearance": { + "class": "f-form-layout farris-form farris-form-controls-inline" + }, + "contents": [ + { + "id": "estimatedCost_3a6306ae_tzii", + "type": "form-group", + "label": "预计成本", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "number-spinner" + } + }, + { + "id": "expectedProfit_021322b0_c90k", + "type": "form-group", + "label": "预计利润", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "number-spinner" + } + }, + { + "id": "expectedProfitMargin_543c5c4d_mks2", + "type": "form-group", + "label": "预计利润率", + "appearance": { + "class": "col-12 col-md-6 col-xl-3 col-el-6" + }, + "editor": { + "type": "number-spinner" + } + } + ] + } + ], + "toolbar": { + "id": "proinfomg-s3hp-form-section-toolbar", + "type": "response-toolbar", + "position": "inHead", + "contents": [] + } + } + ] + } + ] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/packages/mobile-designer/src/app-providers.ts b/packages/mobile-designer/src/app-providers.ts new file mode 100644 index 0000000000000000000000000000000000000000..19bb1d125f07731b107a092ad7859ca6b9a7e12d --- /dev/null +++ b/packages/mobile-designer/src/app-providers.ts @@ -0,0 +1,34 @@ + +import { FLoadingService,FTooltipDirective, FMessageBoxService, F_MODAL_SERVICE_TOKEN, LookupSchemaRepositoryToken, FieldSelectorRepositoryToken, F_NOTIFY_SERVICE_TOKEN, FNotifyService, ControllerSchemaRepositorySymbol } from "@farris/ui-vue/components"; +import { App } from "vue"; +import { MetadataService } from "./components/composition/metadata.service"; +import { MetadataPathToken, MetadataServiceToken } from "./components/types"; +import { LookupFieldSelectorService, LookupSchemaService } from "./components/composition/schema-repository"; +import { ControllerSelectorSchemaService } from "./components/composition/schema-repository/controller/controller-selector.service"; +import { FM_MODAL_SERVICE_TOKEN, FModalService,FM_UI_PROVIDER_SERVICE_TOKEN } from "@farris/mobile-ui-vue/components"; +import { uiProviderService } from './components/composition/ui-provider/ui-provider'; + +export default { + install(app: App): void { + app.provide(FM_MODAL_SERVICE_TOKEN, new FModalService(app)); + app.provide(F_MODAL_SERVICE_TOKEN, new FModalService(app)); + app.provide('FLoadingService', FLoadingService); + + const metadataService = new MetadataService(); + app.provide(MetadataServiceToken, metadataService); + + const metadataPath = metadataService.getMetadataPath(); + app.provide(MetadataPathToken, metadataPath); + + app.provide('FMessageBoxService', FMessageBoxService); + + app.provide(LookupSchemaRepositoryToken, new LookupSchemaService(metadataService)); + app.provide(FieldSelectorRepositoryToken, new LookupFieldSelectorService(metadataService)); + app.provide(F_NOTIFY_SERVICE_TOKEN, new FNotifyService()); + app.provide(ControllerSchemaRepositorySymbol, new ControllerSelectorSchemaService(metadataService)); + + app.directive('tooltip', FTooltipDirective);'' + app.provide(FM_UI_PROVIDER_SERVICE_TOKEN, uiProviderService()); + + } +}; diff --git a/packages/mobile-designer/src/app.vue b/packages/mobile-designer/src/app.vue new file mode 100644 index 0000000000000000000000000000000000000000..9a1d92489b3fdbee61d96fa674732414cad3ffb0 --- /dev/null +++ b/packages/mobile-designer/src/app.vue @@ -0,0 +1,30 @@ +import { defineComponent } from "vue"; + + + + diff --git a/packages/mobile-designer/src/assets/vue.svg b/packages/mobile-designer/src/assets/vue.svg new file mode 100644 index 0000000000000000000000000000000000000000..770e9d333ee70e75fe7c0bad7fb13e4f6ed4627a --- /dev/null +++ b/packages/mobile-designer/src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/mobile-designer/src/components/components/change-set/change-set.component.tsx b/packages/mobile-designer/src/components/components/change-set/change-set.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..1ba9a17d9fa667fb16fdd98ea95a8bffc57b6604 --- /dev/null +++ b/packages/mobile-designer/src/components/components/change-set/change-set.component.tsx @@ -0,0 +1,335 @@ +import { computed, defineComponent, inject, onMounted, reactive, ref, Teleport } from "vue"; +import { FCheckbox } from "@farris/ui-vue/components"; +import { FTabs, FTabPage } from "@farris/ui-vue/components"; +import { FTreeGrid } from "@farris/ui-vue/components"; +import { FRadioGroup } from "@farris/ui-vue/components"; +import { ChangeSetProps, changeSetProps } from "./change-set.props"; +import { FormSchema } from "../../../components/types"; +import { useSchemaChangeset } from "./composition/use-schema-changeset"; +import { SchemaPropName } from "./composition/prop-name"; +import { useUpdateEntity } from "./composition/use-update-entity"; +import { useUpdateControls } from "./composition/use-update-controls"; + + +export default defineComponent({ + name: 'FDesignerChangeSet', + props: changeSetProps, + emits: ['submit', 'cancel'], + setup(props: ChangeSetProps, context) { + const changeSetOfAddedTreeGrid = ref(); + const changeSetOfRemovedTreeGrid = ref(); + const modificationNavigationTreeGrid = ref(); + const modificationDetailsTreeGrid = ref(); + const currentFormSchema = ref(props.currentFormSchema || {}); + const targetFormSchema = ref(props.targetFormSchema || {}); + const changeSetOfAdded = ref([]); + const changeSetOfRemoved = ref([]); + /** 新增字段--全选 */ + const addFieldSelectedAll = ref(true); + /** 删除字段---全选 */ + const deleteFieldSelectedAll = ref(true); + + const columnOption = { + fitColumns: true, + fitMode: 'average' + }; + const rowNumberOption = { enable: false }; + + const scopeOfApplyModification = ref(false); + + const useSchemaChangesetComposition = useSchemaChangeset(); + const { + addSelected, addedTreeData, changeContrast, changeComplexFieldTypeList, changeFieldTypeEditorTypeList, + changeFieldTypeList, changeList, changeLeftTreeData, changeSelected, deleteSelected, deletedTreeData, + selectedAll, show + } = useSchemaChangesetComposition; + + const columnsOfAddOrRemomveChangeSet = [ + { field: 'name', title: '名称' }, + { field: 'bindingField', title: '绑定字段' }, + { field: 'select', title: '更新' } + ]; + /** 变更字段左侧树列配置 */ + const columnsOfModificationNavigate = [{ field: 'name', title: '字段名称' }]; + /** 变更树表列配置 */ + const columnsOfModificationDetails = [ + { field: 'propName', title: '属性名称' }, + { field: 'propCode', title: '属性编号' }, + { field: 'oldValue', title: '当前值' }, + { field: 'newValue', title: '新值' }, + { field: 'select', title: '更新', width: 120 } + ]; + const updateRadioTypes = [{ value: false, text: '部分更新' }, { value: true, text: '全部更新' }]; + const toastWarningStyle = computed(() => { + return { + 'color': '#7f5423', + 'background-color': '#fdecda', + 'border-color': '#fce5cb', + 'border-radius': '3px', + 'padding': '.75rem 1.25rem' + }; + }); + + const selectedTreeKey = ref(''); + + const shouldShowFieldTypeEditorChangedWarning = computed(() => changeFieldTypeEditorTypeList.value.indexOf(selectedTreeKey.value) > -1); + + const shouldShowFieldTypeChangedWaring = computed(() => changeFieldTypeList.value.indexOf(selectedTreeKey.value) > -1); + + const shouldShowComplexFieldTypeChangedWarning = computed(() => changeComplexFieldTypeList.value.indexOf(selectedTreeKey.value) > -1); + + const changeSelectedDetails = computed(() => changeSelected.value[selectedTreeKey.value]); + + function onModificationNavigationChanged(seletedItems: any[]) { + if (seletedItems && seletedItems.length) { + const modificationChangesetItem = seletedItems[0]; + selectedTreeKey.value = modificationChangesetItem.id; + if (modificationDetailsTreeGrid.value) { + const latestModificationDetails = changeContrast.value[selectedTreeKey.value]; + modificationDetailsTreeGrid.value.updateDataSource(latestModificationDetails); + } + } + } + + function onClickAddSelectCheckbox(checked: boolean) { + if (!checked) { + addFieldSelectedAll.value = false; + } + + } + + function onClickAddFieldSelectAllCheckbox(checked: boolean) { + Object.keys(addSelected.value).forEach((fieldId: string) => { + addSelected.value[fieldId] = checked; + }); + } + + function onClickDeleteSelectCheckbox(checked: boolean) { + if (!checked) { + deleteFieldSelectedAll.value = false; + } + + } + + function onClickDeleteFieldSelectAllCheckbox(checked: boolean) { + Object.keys(deleteSelected.value).forEach((fieldId: string) => { + deleteSelected.value[fieldId] = checked; + }); + } + + function batchSelectModificationDetails(changeList, isSelect, selectedTreeKey) { + changeList.forEach(change => { + if (change.selectable) { + changeSelected.value[selectedTreeKey][change.data.propPath] = isSelect; + } else if (change.children && change.children.length > 0) { + batchSelectModificationDetails(change.children, isSelect, selectedTreeKey); + } + }); + } + + /** + * 勾选变更列表中的复选框时,判断列表的全选按钮的勾选状态 + */ + function checkAllSelected(fieldId: string, flag: boolean) { + if (!changeContrast.value[fieldId]) { + return; + } + + if (!flag) { + selectedAll.value[selectedTreeKey.value] = false; + } + let hasUnSelected = false; + const allChanges = changeList.value.filter(c => c.fieldId === fieldId); + if (allChanges.length) { + allChanges.forEach(node => { + if (changeSelected.value[fieldId] && !changeSelected.value[fieldId][node.propPath]) { + hasUnSelected = true; + } + }); + selectedAll.value[selectedTreeKey.value] = !hasUnSelected; + } + } + + /** + * 勾选变更列表中的复选框 + */ + function onClickChangeSelectCheckbox(fieldId: string, propPath: string) { + if (!changeContrast.value[fieldId]) { + return; + } + const flag = changeSelected.value[fieldId][propPath]; + const node = changeContrast.value[fieldId].find(c => c.data.propPath); + + // 联动属性 + const allChanges = changeList.value.filter(c => c.fieldId === fieldId); + const changePaths = allChanges.length > 0 ? allChanges.map(f => f.propPath) : []; + const relatedProps = SchemaPropName.getRelatedProps(node.data.isEntity, propPath, changePaths); + if (relatedProps && relatedProps.length) { + relatedProps.forEach(prop => { + changeSelected.value[fieldId][prop] = changeSelected.value[fieldId][propPath]; + }); + } + checkAllSelected(fieldId, flag); + } + + function onClickChangeFieldSelectAllCheckbox(fieldId: string, propPath: string) { + const latestModificationDetails = changeContrast.value[selectedTreeKey.value]; + batchSelectModificationDetails(latestModificationDetails, selectedAll.value[selectedTreeKey.value], selectedTreeKey.value); + } + function selectChangeItem(changeList: any[], isSelect: boolean, selectedTreeKey: string) { + changeList.forEach(change => { + if (change.selectable) { + changeSelected.value[selectedTreeKey][change.data.propPath] = isSelect; + } else if (change.children && change.children.length > 0) { + selectChangeItem(change.children, isSelect, selectedTreeKey); + } + }); + } + /** + * 【更新】tab页的字段全选 + */ + function clickChangeFieldSelectAllRadio(newValue: boolean) { + scopeOfApplyModification.value = newValue; + Object.keys(changeContrast.value).forEach(treeKey => { + selectedAll.value[treeKey] = scopeOfApplyModification.value; + selectChangeItem(changeContrast.value[treeKey], scopeOfApplyModification.value, treeKey); + }); + + } + + onMounted(() => { + show(currentFormSchema.value, targetFormSchema.value); + // 新增、删除全选按钮 + addFieldSelectedAll.value = Object.keys(addSelected.value).length > 0; + deleteFieldSelectedAll.value = Object.keys(deleteSelected.value).length > 0; + if (changeSetOfAddedTreeGrid.value) { + changeSetOfAddedTreeGrid.value.updateDataSource(addedTreeData.value); + } + if (changeSetOfRemovedTreeGrid.value) { + changeSetOfRemovedTreeGrid.value.updateDataSource(deletedTreeData.value); + } + if (modificationNavigationTreeGrid.value) { + modificationNavigationTreeGrid.value.updateDataSource(changeLeftTreeData.value); + } + }); + + function onSubmit() { + const updateEntityUtil = useUpdateEntity(props, useSchemaChangesetComposition); + if (!updateEntityUtil.checkIsNeedUpdate()) { + context.emit('cancel'); + return; + } + // 更新实体 + updateEntityUtil.updateEntity(); + + // 更新控件 + const updateControlsUtil = useUpdateControls(props, useSchemaChangesetComposition); + updateControlsUtil.updateFormControls(); + + context.emit('submit', {}); + } + function onCancel() { + context.emit('cancel'); + } + + function renderToolTipCell(cellData: any, isOldValueCell: boolean) { + let currentTooltipStr = ''; + if (!cellData || typeof (cellData) !== 'object') { + currentTooltipStr = cellData; + } + currentTooltipStr = JSON.stringify(cellData, null, 2); + const tooltipValue = reactive({ content: `
${currentTooltipStr} 
`, placement: isOldValueCell ? 'left' : 'right' }); + + return 查看; + } + return () => { + return ( +
+ + + + {{ + 'cellTemplate': ({ cell, row }) => { + const isCheckCellInDetail = !row.raw.hasChildren && cell.field === 'select'; + return isCheckCellInDetail ? : + (cell.data != null ? cell.data.toString() : cell.data); + }, + 'headerCellTemplate': ({ headerCell }) => { + const isCheckCellInHeader = headerCell.field === 'select'; + return isCheckCellInHeader ?
+ {headerCell.title} +
: {headerCell.title}; + } + }} +
+
+ + + {{ + 'cellTemplate': ({ cell, row }) => { + const isCheckCellInDetail = !row.raw.hasChildren && cell.field === 'select'; + return isCheckCellInDetail ? : + (cell.data != null ? cell.data.toString() : cell.data); + }, + 'headerCellTemplate': ({ headerCell }) => { + const isCheckCellInHeader = headerCell.field === 'select'; + return isCheckCellInHeader ?
+ {headerCell.title} +
: {headerCell.title}; + } + }} +
+
+ +
+
+ +
+
+ {!scopeOfApplyModification.value &&
+
+ +
+
+ {shouldShowFieldTypeEditorChangedWarning.value &&
字段类型/编辑器类型已更改,请选中以下所有变更!更新后将自动替换相关控件。
} + {shouldShowFieldTypeChangedWaring.value &&
字段类型已更改,请选中以下所有变更!
} + {shouldShowComplexFieldTypeChangedWarning.value &&
字段类型已更改,更新后需要手动删除已经绑定此关联字段的控件,并重新添加。
} +
+ + {{ + 'cellTemplate': ({ cell, row }) => { + const isCheckCellInDetail = cell.field === 'select' && row.raw.selectable; + const isRichTextContentCellInDetail = row.raw.isObject && (cell.field === 'oldValue' || cell.field === 'newValue'); + return isCheckCellInDetail ? onClickChangeSelectCheckbox(row.raw.fieldId, row.raw.propPath)}> : + (isRichTextContentCellInDetail ? renderToolTipCell(cell.data, cell.field === 'oldValue') : (cell.data != null ? cell.data.toString() : cell.data)); + }, + 'headerCellTemplate': ({ headerCell }) => { + const isCheckCellInHeader = headerCell.field === 'select'; + return isCheckCellInHeader ?
+ {headerCell.title} +
: {headerCell.title}; + } + }} +
+
+
+
} + +
+
+ + +
+ ); + }; + } +}); diff --git a/packages/mobile-designer/src/components/components/change-set/change-set.props.ts b/packages/mobile-designer/src/components/components/change-set/change-set.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..838cfae2e5e3e13135f776d43f6a6de8b5a6705e --- /dev/null +++ b/packages/mobile-designer/src/components/components/change-set/change-set.props.ts @@ -0,0 +1,10 @@ +import { ExtractPropTypes, PropType } from "vue"; +import { FormSchema } from "../../../components/types"; + +export const changeSetProps = { + currentFormSchema: { type: Object as PropType }, + targetFormSchema: { type: Object as PropType }, + designerService: { type: Object } +} as Record; + +export type ChangeSetProps = ExtractPropTypes; diff --git a/packages/mobile-designer/src/components/components/change-set/composition/prop-name.ts b/packages/mobile-designer/src/components/components/change-set/composition/prop-name.ts new file mode 100644 index 0000000000000000000000000000000000000000..321d761379236b12af7f479bfcc90501e6c7e074 --- /dev/null +++ b/packages/mobile-designer/src/components/components/change-set/composition/prop-name.ts @@ -0,0 +1,66 @@ +export class SchemaPropName { + static propNameMap = { + $type: '类型', + id: 'ID', + originalId: '原始ID', + code: '编号', + name: '名称', + label: '标签', + bindingField: '绑定字段', + defaultValue: '默认值', + require: '必填', + readonly: '只读', + type: '类型属性', + length: '长度', + precision: '精度', + editor: '编辑器属性', + format: '格式', + valueType: '值类型', + enumValues: '枚举项', + dataSource: '帮助数据源', + textField: '文本字段', + valueField: '值字段', + displayType: '显示类型', + helpId: '帮助元数据ID', + mapFields: '帮助映射', + path: '路径', + editable: '允许编辑', + multiLanguage: '多语', + displayName: '展示名称' + }; + + static getName(propCode: string) { + return this.propNameMap[propCode] || propCode; + } + + /** + * 联动属性 + * @param isEntity 是否为表节点 + * @param propPath 手动变更的属性path + */ + static getRelatedProps(isEntity = false, propPath: string, changeIds: any[]): string[] { + let relatedProps: any[] = []; + if (isEntity) { + relatedProps = [ + ['code', 'label', 'type.name'], + ['name', 'type.displayName'] + ]; + } else { + relatedProps = [ + ['code', 'label', 'bindingPath', 'bindingField', 'path'], + ['type', 'editor', 'multiLanguage'], + ['type.$type', 'type.name', 'type.displayName'] + ]; + } + + for (const related of relatedProps) { + const index = related.findIndex(r => r === propPath); + if (index > -1) { + return related.filter(r => r !== propPath && changeIds.includes(r)); + } + } + return []; + } +} + + diff --git a/packages/mobile-designer/src/components/components/change-set/composition/use-schema-changeset.ts b/packages/mobile-designer/src/components/components/change-set/composition/use-schema-changeset.ts new file mode 100644 index 0000000000000000000000000000000000000000..1336001240743b2328dcb21bf9a0018c3b5faeeb --- /dev/null +++ b/packages/mobile-designer/src/components/components/change-set/composition/use-schema-changeset.ts @@ -0,0 +1,554 @@ +import { Ref, ref } from 'vue'; +import { cloneDeep } from 'lodash-es'; +import { FormSchema, FormSchemaEntity, FormSchemaEntityField } from './../../../types/entity-schema'; +import { HierarchyItem } from '@farris/ui-vue/components'; +import { SchemaPropName } from './prop-name'; + +export function useSchemaChangeset() { + + /** 新增字段树表绑定数据 */ + const addedTreeData: Ref = ref([]); + + /** 删除字段树表绑定数据 */ + const deletedTreeData: Ref = ref([]); + + /** 变更字段左侧树绑定数据 */ + const changeLeftTreeData: Ref = ref([]); + + /** 选中的新增字段 */ + const addSelected = ref({}); + + /** 选中的删除字段 */ + const deleteSelected = ref({}); + + const addedFields = ref({}); + + /** 新增的表 */ + const addedTable: Ref = ref([]); + + /** 删除的表 */ + const deletedTable: Ref = ref([]); + + /** 旧schema */ + const currentSchemaEntities: Ref = ref([]); + + /** 新schema */ + const targetSchemaEntities: Ref = ref([]); + + /** 平铺的变更集合 */ + const changeList: Ref = ref([]); + + /** 变更集合 */ + const changeContrast = ref({}); + + /** 选中的变更集合 */ + const changeSelected = ref({}); + + /** 字段的全选 */ + const selectedAll = ref({}); + + /** 变更字段类型和编辑器类型的字段集合,用于页面中提示用户进行全选操作 */ + const changeFieldTypeEditorTypeList: Ref = ref([]); + + /** 变更字段类型,但编辑器类型不变的字段集合,用于页面中提示用户进行全选操作 */ + const changeFieldTypeList: Ref = ref([]); + + /** 变更复杂字段类型的字段集合,用于页面中提示用户将会删除已有控件,需要手动添加 */ + const changeComplexFieldTypeList: Ref = ref([]); + + /** 全选变更checkbox */ + let selectAllChange = false; + + /** 变更字段左侧树选中节点id */ + let selectedTreeKey = ''; + + /** 是否显示变更列表 */ + let showChangeContrast = false; + + function init(currentFormSchema: FormSchema, targetFormSchema: FormSchema) { + addSelected.value = {}; + deleteSelected.value = {}; + addedTreeData.value = []; + deletedTreeData.value = []; + addedFields.value = {}; + + currentSchemaEntities.value = cloneDeep(currentFormSchema.entities); + targetSchemaEntities.value = targetFormSchema.entities; + + + changeSelected.value = {}; + changeLeftTreeData.value = []; + changeContrast.value = {}; + changeList.value = []; + + showChangeContrast = false; + selectedTreeKey = ''; + + addedTable.value = []; + + selectAllChange = false; + selectedAll.value = {}; + changeFieldTypeEditorTypeList.value = []; + changeComplexFieldTypeList.value = []; + + } + + /** + * 对比实体基本信息(code、name)的差异, + * @param oldEntity 现有实体 + * @param newEntity 新实体 + */ + function constractEntityBasicObject(oldEntity: FormSchemaEntity, newEntity: FormSchemaEntity): boolean { + + const diffTree: any[] = []; + Object.keys(oldEntity).forEach(propCode => { + if (propCode !== 'type') { + if (oldEntity[propCode] !== newEntity[propCode]) { + const data = { + isEntity: true, + entityId: oldEntity.id, + propPath: propCode, + fieldId: oldEntity.id, + propCode, + propName: SchemaPropName.getName(propCode), + oldValue: oldEntity[propCode], + newValue: newEntity[propCode] + }; + diffTree.push({ selectable: true, data, children: [] }); + changeList.value.push(data); + } + } else { + const oldType = oldEntity.type; + const newType = newEntity.type; + ['name', 'displayName'].forEach(typePropCode => { + if (oldType[typePropCode] !== newType[typePropCode]) { + const data = { + isEntity: true, + entityId: oldEntity.id, + propPath: `type.${typePropCode}`, + fieldId: oldEntity.id, + propCode: typePropCode, + propName: `类型${SchemaPropName.getName(typePropCode)}`, + oldValue: oldType[typePropCode], + newValue: newType[typePropCode] + }; + diffTree.push({ selectable: true, data, children: [] }); + changeList.value.push(data); + } + }); + + } + }); + + changeContrast.value[oldEntity.id] = diffTree; + changeSelected.value[oldEntity.id] = {}; + selectedAll.value[oldEntity.id] = false; + + return diffTree.length > 0; + + } + + function contrastBasicProp(oldValue, newValue, fieldId, path, selectable = true): HierarchyItem[] { + const diffTree: HierarchyItem[] = []; + Object.keys(oldValue).forEach(propCode => { + if (typeof (oldValue[propCode]) !== 'object' && typeof (oldValue[propCode]) !== 'undefined') { + // 为了适配默认值属性int和string之间的差异,故不采用!== + // eslint-disable-next-line eqeqeq + if (oldValue[propCode] != newValue[propCode]) { + const data = { + propPath: path + propCode, fieldId, propCode, propName: SchemaPropName.getName(propCode), + oldValue: oldValue[propCode], newValue: newValue[propCode] === undefined ? '无' : newValue[propCode] + }; + diffTree.push({ selectable, data, children: [] }); + changeList.value.push(data); + } + } + }); + + return diffTree; + } + + function sortJsonByKey(jsonData) { + const newkey = Object.keys(jsonData).sort(); + const newObj = {}; + // tslint:disable-next-line:prefer-for-of + for (const key of newkey) { + newObj[key] = jsonData[key]; + } + return newObj; + } + + function compareJsonByString(json1: any, json2: any): boolean { + const sortedJson1 = sortJsonByKey(json1); + const sortedJson2 = sortJsonByKey(json2); + return JSON.stringify(sortedJson1) === JSON.stringify(sortedJson2); + } + + /** + * 枚举数组的禁用属性是后面追加的,为避免现有表单大面积对比出差异,这里增加特殊判断:若枚举值都是disabled=false,则认为不需要更新,也不需要通知用户变更 + */ + function checkEnumValuesChanged(oldEnumValues: any[], newEnumValues: any[]) { + if (oldEnumValues.length !== newEnumValues.length) { + return true; + } + + // 若旧枚举值没有禁用属性,但新枚举值有,说明是首次更新枚举特性。 + if (!Object.prototype.hasOwnProperty.call(oldEnumValues[0], 'disabled') && + Object.prototype.hasOwnProperty.call(newEnumValues[0], 'disabled') + ) { + const newEnumValueCopy = cloneDeep(newEnumValues); + newEnumValueCopy.map(v => { if (!v.disabled) { delete v.disabled; } }); + return JSON.stringify(oldEnumValues) !== JSON.stringify(newEnumValueCopy); + } + return JSON.stringify(oldEnumValues) !== JSON.stringify(newEnumValues); + } + + /** + * 对比属性差异 + * @param oldValue + * @param newValue + * @param fieldId + * @param path + */ + function contrastObject(oldValue, newValue, fieldId, path) { + const diffTree: HierarchyItem[] = [], propPath = path ? path + '.' : '', childLeftTree: HierarchyItem[] = []; + let deletedFields: HierarchyItem[] = []; + // 遍历基础属性 + const basicDiff = contrastBasicProp(oldValue, newValue, fieldId, propPath); + if (basicDiff && basicDiff.length > 0) { + diffTree.push(...basicDiff); + } + + // 新增属性 + Object.keys(newValue).forEach(propCode => { + if (propCode === 'editor') { + return; + } + if (!Object.keys(oldValue).includes(propCode)) { + const data = { + propPath: propPath + propCode, + fieldId, + propCode, + propName: SchemaPropName.getName(propCode), + newValue: newValue[propCode], + oldValue: '无' + }; + diffTree.push({ selectable: true, data, children: [] }); + changeList.value.push(data); + } + }); + + + if (oldValue.type && newValue.type) { + const oldType = oldValue.type; const newType = newValue.type; + // 类型变化后将type和editor整体覆盖,不再向下对比差异 + if (oldType.$type !== newType.$type) { + // 排除类型变化,但编辑器不变的场景:日期和日期时间类型对应的控件类型都是DateBox + if (!(oldValue.editor && newValue.editor && oldValue.editor.$type === newValue.editor.$type)) { + const type = { + propPath: propPath + 'type', fieldId, propCode: 'type', propName: SchemaPropName.getName('type'), + oldValue: oldType, newValue: newType + }; + const editor = { + propPath: propPath + 'editor', + fieldId, + propCode: 'editor', + propName: SchemaPropName.getName('editor'), + oldValue: oldValue.editor === undefined ? '无' : oldValue.editor, + newValue: newValue.editor + }; + diffTree.push({ selectable: true, data: type, isObject: true, children: [] }); + diffTree.push({ selectable: true, data: editor, isObject: true, children: [] }); + changeList.value.push(type); + changeList.value.push(editor); + + changeContrast.value[oldValue.id] = diffTree; + changeSelected.value[oldValue.id] = {}; + selectedAll.value[oldValue.id] = false; + + changeFieldTypeEditorTypeList.value.push(oldValue.id); + return { leftTree: { data: { ...oldValue } }, deletedFields }; + } + changeFieldTypeList.value.push(oldValue.id); + + } else if (oldType.name !== newType.name) { + // 复杂类型字段,更换了引用的对象 + const complexTypeDiff = { + propPath: propPath + 'type', + propCode: 'type', + propName: SchemaPropName.getName('type'), + fieldId, + oldValue: oldType, + newValue: newType, + oldValueShowName: oldType.displayName || oldType.name, + newValueShowName: newType.displayName + }; + diffTree.push({ selectable: true, data: complexTypeDiff, isObject: true, children: [] }); + changeList.value.push(complexTypeDiff); + changeContrast.value[oldValue.id] = diffTree; + changeSelected.value[oldValue.id] = {}; + selectedAll.value[oldValue.id] = false; + changeComplexFieldTypeList.value.push(oldValue.id); + return { leftTree: { data: { ...oldValue } }, deletedFields }; + } else if (oldValue.multiLanguage !== newValue.multiLanguage) { + // 类型不变,但编辑器需要改变---目前场景:修改多语属性,但要排除现有表单新增多语为false的场景 + if (!(oldValue.multiLanguage === undefined && newValue.multiLanguage === false)) { + if (!compareJsonByString(oldType, newType)) { + const type = { + propPath: propPath + 'type', fieldId, propCode: 'type', propName: SchemaPropName.getName('type'), + oldValue: oldType, newValue: newType + }; + diffTree.push({ selectable: true, data: type, isObject: true, children: [] }); + changeList.value.push(type); + } + + const editor = { + propPath: propPath + 'editor', + fieldId, + propCode: 'editor', + propName: SchemaPropName.getName('editor'), + oldValue: oldValue.editor, + newValue: newValue.editor + }; + diffTree.push({ selectable: true, data: editor, isObject: true, children: [] }); + changeList.value.push(editor); + + changeContrast.value[oldValue.id] = diffTree; + changeSelected.value[oldValue.id] = {}; + selectedAll.value[oldValue.id] = false; + + changeFieldTypeEditorTypeList.value.push(oldValue.id); + return { leftTree: { data: { ...oldValue } }, deletedFields }; + } + + } + + const typeDiff = contrastBasicProp(oldType, newType, fieldId, propPath + 'type.'); + if (oldType.valueType && newType.valueType) { + const valueTypeDiff = contrastBasicProp(oldType.valueType, newType.valueType, fieldId, propPath + 'type.valueType.'); + if (valueTypeDiff && valueTypeDiff.length > 0) { + typeDiff.push({ + selectable: false, children: valueTypeDiff, expanded: true, + data: { + propPath: propPath + 'type.valueType', fieldId, propCode: 'valueType', + propName: SchemaPropName.getName('valueType') + } + }); + } + } + if (oldType.enumValues && newType.enumValues && checkEnumValuesChanged(oldType.enumValues, newType.enumValues)) { + const data = { + propPath: propPath + 'type.enumValues', fieldId, propCode: 'enumValues', + propName: SchemaPropName.getName('enumValues'), oldValue: oldType.enumValues, newValue: newType.enumValues + }; + typeDiff.push({ selectable: true, data, isObject: true, children: [] }); + changeList.value.push(data); + + } + if (oldType.fields) { + oldType.fields.forEach(oldEle => { + const newEle = newType.fields.find(f => f.id === oldEle.id); + if (!newEle) { + // 已删除字段 + deletedFields.push({ data: oldEle, selectable: true, children: [] }); + deleteSelected.value[oldEle.id] = true; + } else { + const { leftTree: eleLeftTree, deletedFields: deletedChildFields } = contrastObject(oldEle, newEle, oldEle.id, ''); + if (eleLeftTree) { + childLeftTree.push(eleLeftTree); + } + if (deletedChildFields.length > 0) { + deletedFields.push(...deletedChildFields); + } + } + }); + } + if (typeDiff && typeDiff.length > 0) { + diffTree.push({ + selectable: false, children: typeDiff, expanded: true, + data: { + propPath: propPath + 'type', + fieldId, + propCode: 'type', + propName: SchemaPropName.getName('type') + } + }); + } + } + + // 编辑器属性整体更新 + if (oldValue.editor && newValue.editor) { + const editorDiff = contrastBasicProp(oldValue.editor, newValue.editor, fieldId, propPath + 'editor.', false); + if (editorDiff && editorDiff.length > 0) { + const data = { + propPath: propPath + 'editor', + fieldId, + propCode: 'editor', + propName: SchemaPropName.getName('editor'), + oldValue: oldValue.editor, + newValue: newValue.editor + }; + diffTree.push({ selectable: true, data, isObject: true, children: [] }); + changeList.value.push(data); + } + } + + let leftTree; + + // 字段本身变化 + if (diffTree.length > 0 || childLeftTree.length > 0) { + changeContrast.value[oldValue.id] = diffTree; + changeSelected.value[oldValue.id] = {}; + leftTree = { data: { ...oldValue } }; + selectedAll.value[oldValue.id] = false; + if (childLeftTree.length > 0) { + leftTree['children'] = childLeftTree; + leftTree['expanded'] = true; + } + } + + if (deletedFields.length > 0) { + deletedFields = [{ data: { ...oldValue }, children: deletedFields, selectable: false, expanded: true }]; + } + + return { leftTree, deletedFields }; + } + + /** + * 获取已删除字段、变更字段 + * @param currentSchemaEntities + * @param targetSchemaEntities + */ + function recursiveOldSchema(currentSchemaEntities: FormSchemaEntity[], targetSchemaEntities: FormSchemaEntity[]) { + if (!currentSchemaEntities || currentSchemaEntities.length === 0 || !targetSchemaEntities) { + return; + } + currentSchemaEntities.forEach(entity => { + const newEntity = targetSchemaEntities.find(e => e.id === entity.id); + if (!newEntity) { // 删除表 + deletedTreeData.value.push({ id: entity.id, data: entity, selectable: true, children: [], expanded: true }); + deletedTable.value.push(entity.id); + deleteSelected.value[entity.id] = true; + return; + } + + // 表的信息变更(编号、名称) + const isEntityChanged = constractEntityBasicObject(entity, newEntity); + + const deletedFields: HierarchyItem[] = []; + const otherFields: HierarchyItem[] = []; + entity.type.fields.forEach(field => { + const newField = newEntity.type.fields.find(f => f.id === field.id); + if (!newField) { // 已删除字段 + deletedFields.push({ data: field, selectable: true, children: [] }); + deleteSelected.value[field.id] = true; + } else { + // 对比字段属性差异 + const { leftTree, deletedFields: deletedChildFields } = contrastObject(field, newField, field.id, ''); + if (leftTree) { + otherFields.push(leftTree); + } + if (deletedChildFields.length > 0) { + deletedFields.push(...deletedChildFields); + } + } + }); + if (deletedFields.length > 0) { + deletedTreeData.value.push({ data: entity, selectable: false, children: deletedFields, expanded: true }); + } + if (otherFields.length > 0) { + changeLeftTreeData.value.push({ data: entity, children: otherFields, expanded: true }); + } else if (isEntityChanged) { + changeLeftTreeData.value.push({ data: entity, children: [], expanded: true }); + } + + if (entity.type.entities && entity.type.entities.length > 0) { + recursiveOldSchema(entity.type.entities, newEntity.type.entities as FormSchemaEntity[]); + } + }); + } + + function recursiveField(newFields: FormSchemaEntityField[], oldFields: FormSchemaEntityField[], parentId) { + const added: HierarchyItem[] = []; + newFields.forEach(newField => { + if (!oldFields) { + added.push({ data: newField, selectable: true, children: [] }); + addSelected.value[newField.id] = true; + addedFields.value[parentId].push(newField); + return; + } + const oldField = oldFields.find(f => f.id === newField.id); + if (!oldField) { + added.push({ data: newField, selectable: true, children: [] }); + addSelected.value[newField.id] = true; + addedFields.value[parentId].push(newField); + return; + } + // 字段类型相同,并且有下级字段:遍历下级字段 + if (oldField.type.name === newField.type.name && newField.type.fields) { + addedFields.value[newField.id] = []; + const childAddedFields = recursiveField(newField.type.fields, oldField.type.fields as FormSchemaEntityField[], newField.id); + if (childAddedFields.length > 0) { + added.push({ data: newField, selectable: false, children: childAddedFields, expanded: true }); + } + } + }); + return added; + } + + /** + * 获取新增字段 + * @param oldSchemaEntities + * @param newSchemaEntities + */ + function recursiveNewSchema(oldSchemaEntities: FormSchemaEntity[], newSchemaEntities: FormSchemaEntity[], parentEntityId: string = '') { + if (!oldSchemaEntities || !newSchemaEntities || newSchemaEntities.length === 0) { + return; + } + newSchemaEntities.forEach(entity => { + const oldEntity = oldSchemaEntities.find(e => e.id === entity.id); + if (!oldEntity) { // 新增表 + addSelected.value[entity.id] = true; + addedTreeData.value.push({ data: entity, selectable: true, children: [], expanded: true }); + addedTable.value.push({ parentEntityId, entity }); + return; + } + addedFields.value[entity.id] = []; + const added = recursiveField(entity.type.fields, oldEntity.type.fields, entity.id); + + const { type, ...basicEntity } = entity; + if (added.length > 0) { + addedTreeData.value.push({ data: basicEntity, selectable: false, children: added, expanded: true }); + } + if (entity.type.entities && entity.type.entities.length > 0) { + const oldChildEntities = oldEntity && oldEntity.type ? oldEntity.type.entities : []; + recursiveNewSchema(oldChildEntities as FormSchemaEntity[], entity.type.entities, entity.id); + } + }); + } + + function show(currentFormSchema: FormSchema, targetFormSchema: FormSchema) { + init(currentFormSchema, targetFormSchema); + recursiveOldSchema(currentSchemaEntities.value, targetSchemaEntities.value); + recursiveNewSchema(currentSchemaEntities.value, targetSchemaEntities.value); + } + + return { + addSelected, + addedTreeData, + changeContrast, + changeComplexFieldTypeList, + changeFieldTypeEditorTypeList, + changeFieldTypeList, + changeLeftTreeData, + changeList, + changeSelected, + deleteSelected, + deletedTreeData, + selectedAll, + show, + addedTable, + deletedTable, + addedFields + }; +} diff --git a/packages/mobile-designer/src/components/components/change-set/composition/use-update-controls.ts b/packages/mobile-designer/src/components/components/change-set/composition/use-update-controls.ts new file mode 100644 index 0000000000000000000000000000000000000000..572f8a0d0c50dd42b2771bd8ac0787929d1f3c37 --- /dev/null +++ b/packages/mobile-designer/src/components/components/change-set/composition/use-update-controls.ts @@ -0,0 +1,471 @@ +import { get, mergeWith, set } from "lodash-es"; +import { DesignViewModel } from "../../../../components/types/design-viewmodel"; +import { FormSchemaEntity } from "../../../../components/types"; +import { ChangeSetProps } from "../change-set.props"; +import { SchemaDOMMapping } from "@farris/ui-vue/components"; + +/** + * 变更实体 + */ +class SchemaChangeEntity { + [fieldId: string]: [{ + propPath: string; + newValue: any; + oldValue?: any; + }] +} + +export function useUpdateControls( + props: ChangeSetProps, + useSchemaChangesetComposition: any +) { + const changeSelected = useSchemaChangesetComposition.changeSelected.value; + const changeList = useSchemaChangesetComposition.changeList.value; + + const { formSchemaUtils: useFormSchema, designViewModelUtils: dgVMService, schemaService, controlCreatorUtils } = props.designerService; + + /** + * 根据bindTo获取对应表信息 + * @param entities 实体 + * @param bindTo VM绑定 + */ + function getTableBasicInfoByCode(entities: FormSchemaEntity[], entityCode: string, isMainEntity = true, parentLabel = ''): any { + if (!entities || entities.length === 0) { + return; + } + + for (const entity of entities) { + if (entityCode === entity.code) { + return { + id: entity.id, + code: entity.code, + name: entity.name, + label: entity.label, + isMainEntity, + parentLabel + }; + } + const entityType = entity.type; + + if (entityType && entityType.entities && entityType.entities.length > 0) { + const basicInfo = getTableBasicInfoByCode(entityType.entities, entityCode, false, entity.label); + if (basicInfo) { + return basicInfo; + } + } + } + + } + /** + * 修改表编号后,同步修改VM中的bindTo属性、命令参数中的表编号 + */ + function syncViewModelAfterEntityCodeChange(newLabel: string, oldLabel: string) { + useFormSchema.getViewModels().forEach(viewModel => { + if (viewModel.bindTo === '/') { + return; + } + // 1、修改vm中bindTo属性 + const bindToList = viewModel.bindTo.split('/'); + bindToList.forEach((bindToLabel, index) => { + if (bindToLabel === oldLabel) { + bindToList[index] = newLabel; + } + }); + viewModel.bindTo = bindToList.join('/'); + + // 2、修改vm命令的参数中用到的表编号 + if (viewModel.commands && viewModel.commands.length) { + viewModel.commands.forEach(command => { + if (command.params && command.params.length) { + command.params.forEach(param => { + if (param.value && param.value.includes(`/${oldLabel}/`)) { + param.value = param.value.replace(`/${oldLabel}/`, `/${newLabel}/`); + } + }); + } + }); + } + + }); + } + /** + * 修改表编号后,若表单中有对应的DataGrid或TreeGrid控件,需要将控件的dataSource属性替换为新表label + */ + function syncDataGridAfterEntityCodeChange(newLabel: string, oldLabel: string) { + useFormSchema.getComponents().forEach(component => { + if (component.componentType === 'data-grid') { + // 定位到表格控件 + const dataGridNode = useFormSchema.selectNode(component, + (item) => ['data-grid', 'tree-grid'].includes(item.type)); + + // 替换dataSource属性 + if (dataGridNode && dataGridNode.dataSource && dataGridNode.dataSource === oldLabel) { + dataGridNode.dataSource = newLabel; + } + } + }); + + + } + /** + * 表单schema中实体信息(编号)更新后,同步vm、控件的逻辑 + * @param entityChangeSet 实体变更集 + */ + function refreshAfterEntityCodeChange(entityChangeSet: SchemaChangeEntity) { + Object.keys(entityChangeSet).forEach(entityId => { + const changeSet = entityChangeSet[entityId]; + // 编号变更 + const codeChange = changeSet.find(change => change.propPath === 'code'); + const labelChange = changeSet.find(change => change.propPath === 'label'); + if (!codeChange || !labelChange) { + return; + } + const { schemaService } = props.designerService; + const newEntityInfo = getTableBasicInfoByCode(schemaService.getSchemaEntities(), codeChange.newValue); + if (!newEntityInfo) { + return; + } + const newLabel = newEntityInfo.label; + const oldLabel = labelChange.oldValue; + + syncViewModelAfterEntityCodeChange(newLabel, oldLabel); + + syncDataGridAfterEntityCodeChange(newLabel, oldLabel); + }); + } + function assignControlDom(oldControlDom, metadata) { + for (const key of Object.keys(oldControlDom)) { + delete oldControlDom[key]; + } + Object.assign(oldControlDom, metadata); + } + + /** + * 若字段配置了表达式,需要删除表达式 + */ + function clearExpressionByFieldId(fieldIdList: string[]) { + let expressions = useFormSchema.getExpressions(); + if (expressions && expressions.length && fieldIdList.length) { + expressions = expressions.filter(e => !fieldIdList.includes(e.fieldId)); + useFormSchema.setExpressions(expressions); + } + } + + /** + * 根据VMID和字段ID删除字段 + * @param viewModelId VMID + * @param fieldIdList 字段ID列表 + */ + function deleteFieldById(viewModelId: string, fieldIdList: string[]) { + const dgViewModel = dgVMService.getDgViewModel(viewModelId); + if (!dgViewModel) { return; } + + dgViewModel.removeField(fieldIdList); + + clearExpressionByFieldId(fieldIdList); + /* 若绑定字段配置了界面规则,需删除界面规则中有关的字段记录 */ + // fieldIdList.forEach(fieldId => { + // useFormSchema.deleteFormRule(fieldId); + // }) + } + /** + * 对于table中的输入控件,若绑定字段被移除,需要自动清除单元格的绑定。 + * @param controls + * @param viewModelId + */ + function updateTableEditorAfterSchemaFieldRemoved(controls: any[], viewModelId: string) { + if (controls && controls.length) { + const fieldIds: string[] = []; + controls.forEach(control => { + if (control.showInTable && control.binding && control.binding.field) { + fieldIds.push(control.binding.field); + assignControlDom(control, { type: null, binding: null }); + } + + if (control.tdType === 'staticText' && control.staticText) { + control.staticText.text = ''; + control.staticText.require = false; + } + }); + + deleteFieldById(viewModelId, fieldIds); + } + } + + /** + * schema变更字段类型后替换DOM控件 + * @param controls + * @param dgField + */ + function changeControlType(controls, dgField, dgViewModel: DesignViewModel) { + // 删除VM上针对原字段的修改 + const schema = schemaService.getFieldByIDAndVMID(dgField.id, dgViewModel.id); + dgViewModel.clearFieldChange(schema.schemaField, dgField); + + clearExpressionByFieldId([dgField.id]); + // clearFormruleByFieldId([dgField.id]); + + controls.forEach(control => { + const isTableStaticTd = control.type === 'TableTd' && control.tdType === 'staticText'; + if (dgField.$type === 'ComplexField') { + // table内的输入控件自动移除单元格的绑定数据 + if (control.showInTable) { + assignControlDom(control, { type: null, binding: null }); + deleteFieldById(dgViewModel.id, [dgField.id]); + } + if (isTableStaticTd) { + control.staticText.text = ''; + control.staticText.require = false; + } + return; + } + if (isTableStaticTd) { + return; + } + + if (control.type === 'data-grid-column' || control.type === 'tree-grid-column') { + const editable = control.editor ? true : false; + const metadata = controlCreatorUtils.setGridFieldProperty(control.type, dgField, null, editable); + // 保留原id、field + metadata.id = control.id; + metadata.field = control.field; + assignControlDom(control, metadata); + } else { + // if (control.showInTable) { + // metadata = this.controlCreatorService.createTableTdControlBySchemaFeild(dgField, ''); + // } else { + const metadata = controlCreatorUtils.setFormFieldProperty(dgField, ''); + // } + // 保留原id、name、样式 + metadata.id = control.id; + metadata.label = control.label; + metadata.appearance = control.appearance; + + // 只读属性:除非配置为表达式,否则都沿用旧控件的只读值 + // if (!(control.readonly && control.readonly.type === 'Expression')) { + // metadata['readonly'] = control.readonly; + // } + assignControlDom(control, metadata); + + + } + }); + + + } + /** + * 根据schema的变更获取DOM对应的变更 + * @param controlDom 控件DOM + * @param changeObjects schema变更集合 + */ + function getDomChangeBySchemaChange(controlDom, changeObjects) { + const schemaChangePaths = changeObjects.map(c => c.propPath); + const mappingArray = SchemaDOMMapping.mappingDomPropAndSchemaProp(controlDom); + const domChangeset = {}; + mappingArray.map(m => { + if (schemaChangePaths.includes(m.schemaField)) { + const changeObject = changeObjects.find(c => c.propPath === m.schemaField); + + // 只读、必填属性单独处理: 需要同步的场景有:1、控件设置为boolean时(状态机、表达式等不更新)2、vo上属性由false改成true + if (m.schemaField === 'readonly') { + if (typeof (controlDom.readonly) === 'boolean' || changeObject.newValue === true) { + set(domChangeset, m.domField, changeObject.newValue); + } + } else if (m.schemaField === 'require') { + if (typeof (controlDom.require) === 'boolean' || changeObject.newValue === true) { + set(domChangeset, m.domField, changeObject.newValue); + } + } + else { + set(domChangeset, m.domField, changeObject.newValue); + } + } + }); + + return domChangeset; + } + + /** + * 根据控件变更集更新控件。 + * @param fieldChanges 字段变更集 + * @param controls 控件列表 + * @param dgField 字段 + * @param viewModelId 模型ID + */ + function updateControlsBySchemaChange(fieldChanges, controls, dgField, viewModelId) { + let updateChanges: any[] = []; + const viewModel = useFormSchema.getViewModelById(viewModelId); + const viewModelField = viewModel.fields.find(field => field.id === dgField.id); + const { fieldSchema } = viewModelField; + + // ① 收集需要在控件上变更的属性:VM上没有变更记录 或者 变更的属性不在VM的变更记录中 + if (!fieldSchema) { // 字段没有变更记录 + updateChanges = updateChanges.concat(fieldChanges); + } else { + // 判断变更是否在fieldSchema中,若在不更control,若不在,更control(因为表单对控件的变更优先于VO的变更)。枚举数据除外 + fieldChanges.forEach(change => { + const propInVm = get(fieldSchema, change.propPath, 'notFound'); + if (propInVm === 'notFound' || change.propPath === 'type.enumValues') { + updateChanges.push(change); + } + }); + } + if (updateChanges.length === 0) { + return; + } + + // ③ 更新control属性 + controls.forEach(control => { + if (control.type === 'TableTd' && control.tdType === 'staticText') { + return; + } + + const domChangeset = getDomChangeBySchemaChange(control, updateChanges); + + // 数组类型不再合并,全量替换:用户枚举数据的更改 + function customizer(objValue, srcValue) { + if (Array.isArray(objValue)) { + return srcValue; + } + } + mergeWith(control, domChangeset, customizer); + + // 若schema bindingField 变更,需要同步viewmodel field中的fieldName值 + const bindingFieldProp = updateChanges.find(c => c.propPath === 'bindingField'); + if (bindingFieldProp) { + viewModelField.fieldName = bindingFieldProp.newValue; + } + + // 数字类型从普通浮点数转为大数字:不更换控件,但要修改控件bigNumber属性 + // if (control.type === 'number-spinner') { + // const bigNumber = updateChanges.find(c => c.propPath === 'type.$type' && c.newValue.includes('NumericType')); + // if (bigNumber) { + // control.bigNumber = bigNumber.newValue === FormSchemaEntityFieldType$Type.BigNumericType; + // } + // } + // if ((control.type === 'GridField' || control.type === 'TreeGridField') && + // control.editor && control.dataType === 'number') { + // const bigNumber = updateChanges.find(c => c.propPath === 'type.$type' && c.newValue.includes('NumericType')); + // if (bigNumber) { + // control.editor.bigNumber = bigNumber.newValue === FormSchemaEntityFieldType$Type.BigNumericType; + // } + // } + }); + + } + /** + * 同步卡片、列表等直接绑定字段的控件 + */ + function refreshBindingControls(changes: SchemaChangeEntity) { + const dgViewModels = dgVMService.getDgViewModels(); + dgViewModels.forEach(dgViewModel => { + if (!dgViewModel.fields || dgViewModel.fields.length === 0) { + return; + } + dgViewModel.fields.forEach(field => { + // 1、 获取当前VM对应的组件中绑定该字段的所有控件 + const controls = useFormSchema.getControlsInCmpWidthBinding(dgViewModel.id, field.id); + // 字段不存在:若是table类型,则需要自动移除编辑器 + if (field.isSchemaRemoved) { + updateTableEditorAfterSchemaFieldRemoved(controls, dgViewModel.id); + } + const fieldChanges = changes[field.id]; + + + if (!fieldChanges) { + return; + } + + if (!controls && controls.length === 0) { + return; + } + + // 2、判断是否需要替换控件:字段类型更改并且后替换控件 + // udt和关联字段,不要同步,需要手动删除。 + const typeChange = fieldChanges.find(c => c.propPath === 'type.$type'); + const editorChange = fieldChanges.find(c => c.propPath === 'editor' || c.propPath === 'editor.$type'); + const multiLanguageChange = fieldChanges.find(c => c.propPath === 'multiLanguage' && c.newValue === true); + + // ① 替换控件 + if (typeChange && editorChange) { + changeControlType(controls, field, dgViewModel); + return; + } + + // 若多语属性由false-->true,需要替换控件 + if (multiLanguageChange && editorChange) { + changeControlType(controls, field, dgViewModel); + return; + } + + // ② 不需要替换控件 + updateControlsBySchemaChange(fieldChanges, controls, field, dgViewModel.id); + }); + }); + } + /** + * 更新Dg ViewModel 和 DOM结构 + */ + function updateFormControls() { + + // 1、收集实体、字段变更集 + const fieldChangeSet = {}; // fieldId: { propPath, newValue}, 平铺type和editor的改动 + const entityChangeSet = {}; // entityId:{ propPath, newValue} + Object.keys(changeSelected).forEach(fieldId => { + const selectedChange = changeSelected[fieldId]; + const fieldChanges: any[] = []; + const entityChanges: any[] = []; + Object.keys(selectedChange).forEach(propPath => { + if (selectedChange[propPath]) { + const changeInfo = changeList.find(change => change.fieldId === fieldId && change.propPath === propPath); + if (changeInfo.isEntity) { + + entityChanges.push({ + propPath, + newValue: changeInfo.newValue, + oldValue: changeInfo.oldValue + }); + return; + } + if ((propPath === 'editor' || propPath === 'type') && changeInfo.newValue) { + Object.keys(changeInfo.newValue).forEach(key => { + fieldChanges.push({ propPath: propPath + '.' + key, newValue: changeInfo.newValue[key] }); + }); + } else { + fieldChanges.push({ + propPath, + newValue: changeInfo.newValue + }); + } + } + }); + if (fieldChanges.length > 0) { + fieldChangeSet[fieldId] = fieldChanges; + } + if (entityChanges.length) { + entityChangeSet[fieldId] = entityChanges; + } + }); + + // 2、 调用实体编号更新后的同步服务 + refreshAfterEntityCodeChange(entityChangeSet); + + + // 3、重新组装 DgVM + dgVMService.assembleDesignViewModel(); + + // 4、 调用设计器定义的同步控件服务 + refreshBindingControls(fieldChangeSet); + + Array.from(document.getElementsByClassName('dgComponentSelected') as HTMLCollectionOf).forEach( + (element: HTMLElement) => element.classList.remove('dgComponentSelected') + ); + + Array.from(document.getElementsByClassName('dgComponentFocused') as HTMLCollectionOf).forEach( + (element: HTMLElement) => element.classList.remove('dgComponentFocused') + ); + } + + + return { updateFormControls }; +} diff --git a/packages/mobile-designer/src/components/components/change-set/composition/use-update-entity.ts b/packages/mobile-designer/src/components/components/change-set/composition/use-update-entity.ts new file mode 100644 index 0000000000000000000000000000000000000000..60b73bd743ea6ac5248c1978515cd4e0541db181 --- /dev/null +++ b/packages/mobile-designer/src/components/components/change-set/composition/use-update-entity.ts @@ -0,0 +1,175 @@ +import { cloneDeep, set } from "lodash-es"; +import { FormSchemaEntity, FormSchemaEntityField, UseFormSchema } from "../../../../components/types"; +import { ChangeSetProps } from "../change-set.props"; + +export function useUpdateEntity( + props: ChangeSetProps, + useSchemaChangesetComposition: any +) { + const addSelected = useSchemaChangesetComposition.addSelected.value; + const deleteSelected = useSchemaChangesetComposition.deleteSelected.value; + const changeSelected = useSchemaChangesetComposition.changeSelected.value; + const addedTable = useSchemaChangesetComposition.addedTable.value; + const deletedTable = useSchemaChangesetComposition.deletedTable.value; + const addedFields = useSchemaChangesetComposition.addedFields.value; + const changeList = useSchemaChangesetComposition.changeList.value; + + + /** + * 检查是否需要更新,若没有选中字段则不提示“更新成功” + */ + function checkIsNeedUpdate(): boolean { + const deleteSelectedData = Object.keys(deleteSelected).filter(value => deleteSelected[value]); + if (deleteSelectedData.length > 0) { + return true; + } + const addSelectedData = Object.keys(addSelected).filter(value => addSelected[value]); + if (addSelectedData.length > 0) { + return true; + } + + const changeSelectedData = Object.keys(changeSelected).filter(fieldId => { + const changeset = Object.keys(changeSelected[fieldId]).filter(propKey => changeSelected[fieldId][propKey]); + if (changeset.length > 0) { + return true; + } + return false; + }); + if (changeSelectedData.length > 0) { + return true; + } + return false; + } + /** + * 处理同步实体的变更 + */ + function handleChangesetEntity(currrentEntity: FormSchemaEntity) { + // 获取勾选的变更集 + const changeSelectedData = changeSelected[currrentEntity.id]; + const propPathSet: string[] = []; + if (changeSelectedData) { + Object.keys(changeSelectedData).forEach(key => { + if (changeSelectedData[key]) { + propPathSet.push(key); + } + }); + + // 根据propPath 更新字段属性值 + propPathSet.forEach(path => { + const newValue = changeList.find(change => change.entityId === currrentEntity.id && change.propPath === path); + set(currrentEntity, path, newValue.newValue); + }); + } + } + /** + * 处理同步实体中字段的变更 + */ + function handleChangesetField(currentFields: FormSchemaEntityField[]): any[] { + currentFields = currentFields.filter(currentField => { + // 已删除字段 + if (deleteSelected[currentField.id]) { + return false; + } + return true; + }); + currentFields.forEach(currentField => { + // 获取勾选的变更集 + const changeSelectedData = changeSelected[currentField.id]; + const propPathSet: string[] = []; + if (changeSelectedData) { + Object.keys(changeSelectedData).forEach(key => { + if (changeSelectedData[key]) { + propPathSet.push(key); + } + }); + // 根据propPath 更新字段属性值(若path中的路径不存在,则会创建相应属性并赋值;若新值为undefined,则会删除相应属性) + propPathSet.forEach(path => { + const newValue = changeList.find(c => c.fieldId === currentField.id && c.propPath === path); + // 为适配页面显示,将不存在的属性写成了无,故此处再改回undefined + newValue.newValue = newValue.newValue === '无' ? undefined : newValue.newValue; + set(currentField, path, newValue.newValue); + }); + } + + + // 下级字段 + if (currentField.type.fields) { + currentField.type.fields = handleChangesetField(currentField.type.fields); + } + + // 新增下级字段 + const addedDownFields = addedFields[currentField.id]; + if (addedDownFields && addedDownFields.length > 0) { + addedDownFields.forEach(field => { + if (addSelected[field.id] && currentField.type.fields) { + currentField.type.fields.push(field); + } + }); + } + }); + + return currentFields; + + } + function handleChangeSet(currentSchemaEntities: FormSchemaEntity[], targetSchemaEntities: FormSchemaEntity[]) { + // 删除表 + if (deletedTable.length > 0) { + currentSchemaEntities = currentSchemaEntities.filter(entity => !deleteSelected[entity.id]); + } + + currentSchemaEntities.forEach(entity => { + const newEntity = targetSchemaEntities.find(targetEntity => targetEntity.id === entity.id); + if (!newEntity) { + return; + } + handleChangesetEntity(entity); + entity.type.fields = handleChangesetField(entity.type.fields); + // 根节点下新增字段 + if (addedFields[entity.id] && addedFields[entity.id].length > 0) { + addedFields[entity.id].forEach(field => { + if (addSelected[field.id]) { + entity.type.fields.push(field); + } + }); + } + // 处理子表 + if (entity.type.entities && entity.type.entities?.length > 0 && newEntity.type.entities) { + entity.type.entities = handleChangeSet(entity.type.entities, newEntity.type.entities); + } + + // 新增子表 + if (addedTable.length > 0) { + const addedEntities = addedTable.filter(addTable => addTable.parentEntityId === entity.id); + if (addedEntities && addedEntities.length) { + addedEntities.forEach(a => { + if (addSelected[a.entity.id]) { + entity.type.entities = entity.type.entities || []; + entity.type.entities.push(a.entity); + } + }); + } + } + }); + return currentSchemaEntities; + + } + function updateEntity() { + const { currentFormSchema } = props; + + // 直接覆盖extendProperties 节点 + currentFormSchema.extendProperties = props.targetFormSchema.extendProperties; + + // 应用变更集 + props.currentFormSchema.entities = cloneDeep(handleChangeSet(props.currentFormSchema?.entities, props.targetFormSchema?.entities)); + + // 处理主对象变更的情况 + const addedRootEntity = addedTable.find(table => table.parentEntityId === ''); + if (addedRootEntity && addSelected[addedRootEntity.entity.id]) { + props.currentFormSchema.entities.push(addedRootEntity.entity); + } + } + return { + checkIsNeedUpdate, + updateEntity + }; +} diff --git a/packages/mobile-designer/src/components/components/code-view/components/code-tabs.component.tsx b/packages/mobile-designer/src/components/components/code-view/components/code-tabs.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..c1f65f91544a9eb5fb2854ff871a60a1c4692639 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/components/code-tabs.component.tsx @@ -0,0 +1,161 @@ +/** + * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { computed, defineComponent, inject, provide, ref, SetupContext, onMounted } from 'vue'; +import { CodeTabsProps, codeTabsProps } from '../props/code-tabs.props'; +import "./code-tabs.scss"; +import { CodeTab } from '../composition/type/tab'; + +export default defineComponent({ + name: 'FDesignCodeTabs', + props: codeTabsProps, + emits: ['selected', 'unselected', 'beforeClose', 'selecting'] as (string[] & ThisType) | undefined, + setup(props: CodeTabsProps, context: SetupContext) { + let currentTab; + const tabs = ref(props.tabs || []); + onMounted(() => { + }); + /** 将标签滚动到可视区域内 */ + function intoView(tab: CodeTab) { + const elId = tab.id + '-link'; + const tabHeaderEl = document.getElementById(elId); + if (tabHeaderEl) { + tabHeaderEl.scrollIntoView(); + } + } + /** 通过标签实例选中标签 */ + function selectTab(tab: CodeTab) { + if (!tab || currentTab === tab) { + return; + } + // 取消之前被选中的标签 + if (currentTab) { + currentTab.active = false; + context.emit('unselected', currentTab); + } + currentTab=tab; + // 选中新的标签 + tab.active = true; + intoView(tab); + context.emit('selected', tab); + } + /** 处理标签点击事件 */ + function onTabClick(tab: CodeTab) { + context.emit("selecting", tab); + selectTab(tab); + } + function clearTabId(id: string) { + if (id) { + const lastIdx = id.lastIndexOf('-link'); + if (lastIdx > -1) { + return id.substring(0, lastIdx); + } + return id; + } + return id; + } + + function getTab(id: string): CodeTab { + id = clearTabId(id); + return tabs.value.find(n => n.id === id); + } + /** 通过id选中标签 */ + function selectById(tabId: string) { + const tab = getTab(tabId); + selectTab(tab); + } + function getTabIndex(id: string) { + id = clearTabId(id); + return tabs.value.findIndex(n => n.id === id); + } + /** + * 添加一个新的标签 + * @param tab 标签实例 + * @param active 是否设置为被选中状态 + */ + function addTab(tab: CodeTab, active: boolean = true) { + if (!tabs.value || !tabs.value.length || tabs.value.length === 1) { + tabs.value.push(tab); + } else { + // 在当前被选中标签之后添加新的标签 + const activeIndex = getTabIndex(currentTab.id); + tabs.value.splice(activeIndex + 1, 0, tab); + } + if (active) { + selectTab(tab); + } + intoView(tab); + } + + function removeTab(tabId: string) { + const index = getTabIndex(tabId); + tabs.value = tabs.value.filter(n => n.id !== tabId); + // 如果右侧存在标签页则优先打开右侧的,否则选中左侧的 + if (tabs.value.length > index) { + selectTab(tabs.value[index]); + } else if (index - 1 > -1) { + selectTab(tabs.value[index - 1]); + } + } + + /** 关闭全部标签 */ + function closeAll() { + tabs.value = []; + } + + /** 触发标签关闭事件 */ + function onCloseTab(tab: CodeTab, event: Event) { + event.stopPropagation(); + context.emit("beforeClose", tab); + } + + /** + * 关闭其它所有标签 + * @param ignoreTab 标签实例 + */ + function closeOtherTabs(ignoreTab: CodeTab) { + tabs.value = tabs.value.filter(n => n.id === ignoreTab.id); + selectTab(ignoreTab); + } + context.expose({ addTab,closeOtherTabs,removeTab,closeAll,selectById,getTab}); + + return () => { + return ( +
+
+
    + {tabs.value.map((tab) => { + return
  • onTabClick(tab)}> +
    + + + {tab.title} + + onCloseTab(tab, event)}> + +
    +
  • ; + })} +
+
+
+ + ); + }; + } +}); diff --git a/packages/mobile-designer/src/components/components/code-view/components/code-tabs.scss b/packages/mobile-designer/src/components/components/code-view/components/code-tabs.scss new file mode 100644 index 0000000000000000000000000000000000000000..e96cedd8215de0012c3c27c2e90f163b7f1e8396 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/components/code-tabs.scss @@ -0,0 +1,168 @@ +.tab-item.from-ide-code-view { + box-sizing: border-box; + display: flex; + align-items: center; +} + + + +.tab-item.from-ide-code-view .tab-item-content .tab-item-close { + margin-right: 5px; + color: #878787; +} + +.tab-item.from-ide-code-view .tab-item-content .tab-item-icon { + padding-left: 0px; +} + +.tab-item.from-ide-code-view .tab-item-content .tab-item-text { + display: block; + padding: 0px 6px 2px 14px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.monaco-aria-container { + display: none !important; +} + +/*----------------light theme begin-----------------*/ +$tabs-height: 40px; +$tabs-bg-color: #FFFFFF; + +$tab-item-border-color: #E0E4E8; +$tab-item-border-color-active: #5B89FE; + +$tab-item-close-btn-color: #DADEE4; +$tab-item-close-btn-color-active: #8592A6; +$tab-item-close-btn-bg-color: #E4E5E6; + +$tab-item-text-color: #8DA3CE; +$tab-item-text-color-active: #202D40; +/*----------------light theme end-------------------*/ + +.ide-tabs.from-ide-code-view { + position: relative; + height: $tabs-height; + background-color: $tabs-bg-color; + user-select: none; + flex: 1 1 0; + overflow-x: auto; + overflow-y: hidden; + + .smooth-dnd-container.horizontal { + display: inline-flex; + } + + .tab-list-wrapper { + position: relative; + width: 100%; + height: 100%; + } + + .tab-list { + box-sizing: border-box; + margin: 0; + padding: 0; + flex-wrap: nowrap; + overflow: hidden; + display: inline-flex; + } + + // 标签项 + .tab-list .tab-item { + box-sizing: border-box; + display: flex; + position: relative; + height: $tabs-height; + align-items: center; + cursor: pointer !important; + + .tab-item-content { + display: flex; + align-items: center; + height: $tabs-height; + overflow: hidden; + border-left: 1px solid transparent; + border-right: 1px solid transparent; + + // 标签右侧关闭按钮 + .tab-item-close { + margin-right: 5px; + color: $tab-item-close-btn-color; + + &.f-icon-close:hover { + background-color: $tab-item-close-btn-bg-color; + color: $tab-item-close-btn-color-active; + border-radius: 3px; + cursor: pointer !important; + } + } + + // 标签左侧图标 + .tab-item-icon { + padding-left: 0px; + } + + // 标签标题文本 + .tab-item-text { + display: block; + padding: 0px 6px 2px 14px; + white-space: nowrap; + color: $tab-item-text-color; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: 200px; + } + } + + &.active { + cursor: default !important; + + &::after { + content: ''; + display: block; + position: absolute; + left: 0; + right: 0; + bottom: 0; + height: 2px; + background-color: $tab-item-border-color-active; + border-radius: 1.5px; + } + + .tab-item-text { + color: $tab-item-text-color-active; + } + + .tab-item-close.f-icon-close { + color: $tab-item-close-btn-color-active; + } + } + } + +} + +.code-view-tabs-context-menu--wrapper .f-context-target-focus { + display: none !important; +} + +.code-view-tabs-context-menu--wrapper { + .f-context-menu-panel { + border: none !important; + box-shadow: 0px 1px 6px rgba(0, 0, 0, .16) !important; + color: #616161; + background-color: #FFFFFF; + outline: none; + user-select: none; + font-size: 13px; + + .menu-item.active, + .menu-item:hover:not(.menu-sep) { + background-color: #E8EBF3 !important; + } + } +} \ No newline at end of file diff --git a/packages/mobile-designer/src/components/components/code-view/components/code-view.component.tsx b/packages/mobile-designer/src/components/components/code-view/components/code-view.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..cac8442c262095e673d6b1f2672ed123d1404ff0 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/components/code-view.component.tsx @@ -0,0 +1,269 @@ +/** + * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { computed, defineComponent, inject, onMounted, onUnmounted, provide, ref, SetupContext, watch } from 'vue'; +import { codeViewProps, CodeViewProps } from '../props/code-view.props'; +import FNavTreeDesign from './nav-tree.component'; +import { FSplitter, FSplitterPane, FNotifyService, FLoadingService } from '@farris/ui-vue/components'; +import './code-view.scss'; +import FDesignCodeTabs from './code-tabs.component'; +import { EditorController } from '../composition/handler/editor.controller'; +import FEditorPanelsDesign from './editor-panels.component'; +import { throttle } from 'lodash-es'; +import { CommonEvent } from '../composition/event-bus/lib/event-bus'; +import { FrmCmpBuilder } from '../composition/handler/frm-cmp-builder'; +import { ClassNavTreeDataSource } from '../composition/handler/class-nav-tree.service'; +import { TreeDataSource } from '../composition/handler/tree-data-source.service'; + +export default defineComponent({ + name: 'FCodeViewDesign', + props: codeViewProps, + emits: ['changeView', 'saveAll'] as (string[] & ThisType) | undefined, + setup(props: CodeViewProps, context: SetupContext) { + const notifyService: any = new FNotifyService(); + const loadingService: any = inject('FLoadingService'); + const frmCmpBuilder = new FrmCmpBuilder(); + // 顶部标签页 + const tabInstance = ref(); + // 编辑器面板 + const editorPanelsInstance = ref(); + const editorController = new EditorController(); + // 文件导航树 + const fileTreeInstance = ref(); + const fileTreeDataSource = new TreeDataSource(); + // 类导航树 + const classTreeInstance = ref(); + // 类导航数据 + const classNavTreeDataSource = new ClassNavTreeDataSource(editorController); + + const eventBusId = ref(editorController.getEventBusId()); + const filePath = ref(''); + provide('editorService', editorController); + function switchViewChangeHandler(ev) { + context.emit('changeView', 'designer'); + } + function checkEntryFilePath(path: string) { + if (path.startsWith("/")) { return path; } + return '/' + path; + } + // 处理路径 + const entryFilePath = ref(checkEntryFilePath(props.entryFilePath)); + function detectFileDirtyHandler(info) { + context.emit('detectFileDirty', info); + } + // 初始化EditorController + editorController.init(tabInstance, editorPanelsInstance, fileTreeInstance, classTreeInstance, detectFileDirtyHandler); + // 赋值路径 + editorController.getContextService().setEntryFilePath(entryFilePath.value); + // 处理尺寸变化 + const resizedContainer = ref(); + const splitterPaneContainer = ref(); + let lastHeightRecord; // 初始高度 + const observer = new ResizeObserver((entries: ResizeObserverEntry[]) => { + if (entries.length) { + const currentHeight = entries[0].contentRect.height; + if (currentHeight !== lastHeightRecord) { + // 在这里可以触发相应的操作,比如更新数据等 + lastHeightRecord = currentHeight; + splitterPaneContainer.value.reset(); + } + } + }); + + watch(() => props.entryFilePath, (newValue) => { + entryFilePath.value = checkEntryFilePath(newValue); + editorController.getContextService().setEntryFilePath(entryFilePath.value); + }); + + onMounted(() => { + lastHeightRecord = resizedContainer.value.offsetHeight; + fileTreeInstance.value.setDataService(fileTreeDataSource); + classTreeInstance.value.setDataService(classNavTreeDataSource); + const element = resizedContainer.value; + observer.observe(element); + }); + + onUnmounted(() => { + observer.disconnect(); + }); + /** + * 处理保存按钮点击事件 + */ + async function handleSaveBtnClicked(): Promise { + const results = await editorController.doSaveAllFile(props.directlyNotifySaveAllResults); + context.emit('saveAll', results); + } + + /** + * + * @returns + */ + function renderSwitchButton() { + return ( +
+
+
switchViewChangeHandler(event)}> +
+ 设计器 +
+
+
+
+ 代码 +
+
+
+
+ ); + } + + /** + * 刷新导航树 + * @param tsFilePath + */ + function refreshNavTree(tsFilePath) { + fileTreeInstance.value.reloadTreeData(tsFilePath); + } + function open(path: string) { + editorController.openFile(path); + filePath.value = path; + } + /** + * 点击文件导航树 + * @param data + */ + function selectFileNavRowHandler(data) { + open(data.path); + } + function saveHandler(event) { + event && event.stopPropagation(); + throttle(() => { + handleSaveBtnClicked(); + }, 600)(); + } + /** + * 关闭标签页 + * @param tab + */ + function beforeCloseTab(tab) { + editorController.closeFile(tab.id); + } + /** + * 选中标签页 + * @param tab + */ + function selectTab(tab) { + editorController.handleTabSelected(tab.id); + } + /** + * 向标签页发送新通知 + * @param path 标签页路径 + * @param event 通知事件 + * @returns 被通知的标签页针对该事件反馈的结果(如果标签页不存在则返回null) + */ + function sendNotification(path: string, event: CommonEvent) { + return editorController.sendNotification(path, event); + } + async function executeCommand(command: string): Promise { + if (command === 'frm-file.refresh') { + fileTreeInstance.value.reloadTreeData(); + // editorController.detectChangesFromRoot(); + return; + } + if (command === 'frm-file.addWebCmp') { + const frmPath = editorController.getContextService().entryFilePath.value; + const result = await frmCmpBuilder.addNewCmp(frmPath); + if (!result) { + return; // 用户点击取消 + } + if (result.hasError) { + notifyService.error(result && result.errorTip || '构件创建失败,请刷新后重试'); + } else { + // 打开文件 + editorController.openFile(result.tsFilePath); + } + if (result.hasNewFile) { + fileTreeInstance.value.reloadTreeData(result.tsFilePath); + } + return; + } + } + function getFileNavHeaderHTML() { + return
+ 文件导航 +
+
executeCommand("frm-file.refresh")}> + +
+
executeCommand("frm-file.addWebCmp")}> + +
+
+ {/*
+ +
*/} +
; + } + function getClassNavHeaderHTML() { + return
+ 类导航 + {/*
+ +
*/} +
; + } + context.expose({ refreshNavTree, open, sendNotification }); + + return () => { + return ( +
+
+ {renderSwitchButton()} +
+ beforeCloseTab(tab)} onSelected={(tab) => selectTab(tab)}> +
+ +
+
+
+ + + + {/* 文件导航 */} + + {getFileNavHeaderHTML()} +
+ selectFileNavRowHandler(data)}> +
+
+ {/* 类导航 */} +
+ {getClassNavHeaderHTML()} +
+ +
+
+
+
+
+ +
+
+
+
+ ); + }; + } +}); diff --git a/packages/mobile-designer/src/components/components/code-view/components/code-view.scss b/packages/mobile-designer/src/components/components/code-view/components/code-view.scss new file mode 100644 index 0000000000000000000000000000000000000000..dcd675ebd38d254e8016f1ef27b03162baacd21a --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/components/code-view.scss @@ -0,0 +1,176 @@ +$tab-bar-shadow: 0px 6px 10px -6px rgba(53, 78, 200, .1); +$tab-bar-border-color: #F0F3F8; +$divider-image: linear-gradient(180deg, transparent 0%, rgba(40, 60, 93, .1) 23%, rgba(40, 60, 93, .1) 52%, rgba(40, 60, 93, .1) 84%, transparent 100%); + +.code-editor-wrapper { + box-sizing: border-box; + height: 100%; + display: flex; + flex-direction: column; + min-width: 550px; + min-height: 200px; + background-color: #FFFFFF; + + /** 切换标签*/ + .view-type-panel { + padding: 2px; + background: #F0F3F9; + border-radius: 5px; + margin-right: 15px; + margin-top: 5px; + margin-bottom: 5px; + display: flex; + margin-left: 17px; + height: 28px; + min-width: 145px; + cursor: pointer; + color: #8DA3CE; + align-self: center; + + >div { + background: #F4F5F9; + display: flex; + text-align: center; + align-items: center; + padding: 0 8px; + border-radius: 4px; + + span { + width: 18px; + height: 15px; + margin-right: 4px; + } + } + + >div.active { + color: #5B89FE; + background: #fff; + box-shadow: 0 0 4px 0 rgb(161 179 255 / 37%); + } + } + + .tab-bar { + box-sizing: content-box; + flex: 0 0 40px; + display: flex; + border-bottom: 1px solid $tab-bar-border-color; + box-shadow: $tab-bar-shadow; + + .switch-btn { + flex: 0 0 172px; + display: flex; + align-items: center; + justify-content: center; + } + + .tabs { + flex: 1 1 0; + overflow: hidden; + } + + .btn-tool-bar { + flex: 0 0 90px; + display: flex; + flex-direction: row-reverse; + padding-right: 24px; + align-items: center; + } + + .tab-bar-divider { + width: 1px; + height: 29px; + background-image: $divider-image; + position: relative; + top: 50%; + transform: translateY(-50%); + margin-right: 15px; + } + } + + .main-area { + box-sizing: border-box; + flex: 1 1 0; + overflow: hidden; + + .editor-area { + box-sizing: border-box; + height: 100%; + } + } +} + +.app-custom-save-btn { + border-radius: 6px !important; + box-shadow: 0px 4px 10px 0px rgba(69, 144, 255, .25) !important; + background-image: linear-gradient(-51deg, #328BFF 0%, #2A87FF 100%) !important; +} + +.app-full-height { + height: 100% !important; +} + +.app-util-hide { + display: none !important; +} + +$tool-bar-button-interval: 6px; + +.split-panel-header { + height: 44px; + cursor: pointer; + display: flex; + align-items: center; + z-index: 10; + padding: 0 15px; + + .split-panel-header--toolbar { + z-index: 1001; + margin-left: auto; + display: flex; + padding: 0px $tool-bar-button-interval 0 0; + + .toolbar-item { + display: flex; + align-items: center; + justify-content: center; + background-repeat: no-repeat; + color: #8592A6; + font-size: 1em; + margin-left: $tool-bar-button-interval; + cursor: pointer; + + &:hover { + background-color: #e9ecef; + color: #495057; + } + } + } + + .header-icon { + display: flex; + align-items: center; + justify-content: center; + color: #8592a6; + cursor: pointer; + overflow: hidden; + width: 24px; + height: 24px; + background-color: transparent; + border-radius: 4px; + + .f-icon { + font-size: 14px; + } + + &:hover { + background-color: #e9ecef; + color: #495057; + } + + &.header-icon--toggler { + .f-icon { + font-size: 18px; + } + } + } +} \ No newline at end of file diff --git a/packages/mobile-designer/src/components/components/code-view/components/editor-panels.component.tsx b/packages/mobile-designer/src/components/components/code-view/components/editor-panels.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..d04f8e335fe74a29fbe9f737878a2d6a64be8195 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/components/editor-panels.component.tsx @@ -0,0 +1,117 @@ +/** + * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { defineComponent, ref, SetupContext, onMounted, onUnmounted } from 'vue'; +import './code-view.scss'; +import { cloneDeep } from 'lodash-es'; +import { DEFAULT_PLUGINS_URL_MAP } from '../composition/config/plugins.config'; +import FViewIframeDesign from './view-iframe.component'; +import { EditorPanelsProps, editorPanelsProps } from '../props/editor-panels.props'; + +export default defineComponent({ + name: 'FEditorPanelsDesign', + props: editorPanelsProps, + emits: [''] as (string[] & ThisType) | undefined, + setup(props: EditorPanelsProps, context: SetupContext) { + /** 代码编辑器插件数据 */ + const editorPanels = ref([] as any); + + /** 当前显示的文件路径 */ + const activePath=ref(''); + + /** + * 获取打开该文件所需的插件的地址 + * @param path 文件路径 + * @returns 插件地址 + */ + function getPluginUrl(path: string): string { + // 合并默认配置与自定义配置 + const config = cloneDeep(DEFAULT_PLUGINS_URL_MAP) || {}; + const customConfig = config && config['fileSuffix2PluginsUrlMap'] || {}; + Object.assign(config, customConfig); + // 返回符合要求的路径配置 + for (const suffixKey in config) { + if (path.endsWith(suffixKey)) { + return config[suffixKey]; + } + } + return ''; + } + /** + * 获取代码编辑器面板页面的Url + * @param path 文件路径 + * @param param 额外的查询参数 + * @returns 编辑面板路径 + */ + function getCodeEditorPanelUrl(path: string, param?: { [key: string]: string }): string { + const pluginUrl = getPluginUrl(path); + if (!pluginUrl) { + return ""; + } + let url = `${pluginUrl}/index.html?id=${path}&eventBusId=${props.eventBusId}&fromCodeView=true`; + if (param) { + for (const key in param) { + if (key === 'id') { + continue; + } + url += `&${key}=${param[key]}`; + } + } + return url; + } + + function show(path: string): boolean { + const targetPanel = editorPanels.value.find(panel => panel.path === path); + if (!targetPanel) { + return false; + } + activePath.value = path; + return true; + } + + function open(path: string, param?: { [key: string]: string }): boolean { + if (show(path)) { + return true; + } + const newPanel = { path, url: getCodeEditorPanelUrl(path, param) }; + if (!newPanel.url) { + return false; + } + editorPanels.value.push(newPanel); + show(path); + return true; + } + + function close(path: string) { + const idx = editorPanels.value.findIndex(panel => panel.path === path); + if (idx >= 0) { + if (activePath.value === path) { + activePath.value = ''; + } + editorPanels.value.splice(idx, 1); + } + } + context.expose({ close, open, show }); + + return () => { + return (editorPanels.value.map(frame => ( +
+ +
+ )) + ); + }; + } +}); diff --git a/packages/mobile-designer/src/components/components/code-view/components/fields-getter.component.tsx b/packages/mobile-designer/src/components/components/code-view/components/fields-getter.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..afc1e646556ae65556cc9580933159e422b81b61 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/components/fields-getter.component.tsx @@ -0,0 +1,137 @@ +/** + * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { defineComponent, SetupContext, onMounted, reactive, ref } from 'vue'; +import { fieldsGetterProps, FieldsGetterProps } from '../props/fields-getter.props'; + +export default defineComponent({ + name: 'FFieldsGetterDesign', + props: fieldsGetterProps, + emits: ['confirm', 'cancel'] as (string[] & ThisType) | undefined, + setup(props: FieldsGetterProps, context: SetupContext) { + /** 编辑中的字段值 */ + const data = {}; + /** 字段错误提示映射,如果为空则说明没有错误 */ + const fieldErrorMap = reactive({}); + /** 初始化各个字段 */ + function init(): void { + for (const field of props.fields) { + data[field.code] = ref(''); + fieldErrorMap[field.code] = ""; + } + } + init(); + /** 处理取消按钮点击事件 */ + function cancelHandler(reject: boolean = false): void { + context.emit('cancel'); + } + function handleFieldError(error: string, fieldCode: string): void { + fieldErrorMap[fieldCode] = error; + } + + function verifyFieldValue(field) { + let noError = true; + let required = false; + if (field.required) { + if (typeof field.required === 'function') { + required = field.required(data); + } else { + required = true; + } + } + if (required && !data[field.code].value) { + const errorInfo = `请填写${field.name}字段`; + handleFieldError(errorInfo, field.code); + noError = false; + } else { + handleFieldError("", field.code); + } + if (noError && field.validate && typeof field.validate === 'function') { + let error = null; + try { + error = field.validate(data[field.code].value); + } catch (err) { + console.error('参数检验时出错', err); + } + if (error) { + handleFieldError(error, field.code); + noError = false; + } else { + handleFieldError("", field.code); + } + } + return noError; + } + /** 处理确定按钮点击事件 */ + function confirmHandler(): void { + // 进行必填校验以及合法性检查 + let noError = true; + for (const field of props.fields) { + noError = verifyFieldValue(field); + } + if (noError) { + const result={}; + for(const fieldCode in data){ + result[fieldCode]=data[fieldCode].value; + } + context.emit('confirm', result); + } + } + function handleFieldChange(event, fieldCode: string): void { + const target = event.target as HTMLInputElement; + data[fieldCode].value = target.value; + const currentField = props.fields.find(item => item.code === fieldCode); + verifyFieldValue(currentField); + } + onMounted(() => { + + }); + + return () => { + return (
+
+ {props.fields.map((field) => ( +
+
+
+
+ {field.name} +
+
+ handleFieldChange(event, field.code)} + /> +
+ {fieldErrorMap[field.code]} +
+
+
+
+
+ ))} +
+ +
+ ); + }; + } +}); diff --git a/packages/mobile-designer/src/components/components/code-view/components/nav-tree.component.tsx b/packages/mobile-designer/src/components/components/code-view/components/nav-tree.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..c971abf22a7801102b5a12228721fb6f77a19aeb --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/components/nav-tree.component.tsx @@ -0,0 +1,200 @@ +/** + * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { defineComponent, ref, SetupContext, onMounted, watch } from 'vue'; +import { navTreeProps, NavTreeProps } from '../props/nav-tree.props'; +import { VisualData, VisualDataCell, FTreeView } from '@farris/ui-vue/components'; +import { NavTreeNode } from '../composition/type/tree'; +import { CommonFileNavTreeDataService } from '../composition/type/nav/common-file'; +import { NavTreeNodeIconService } from '../composition/type/nav/node-icon'; + +export default defineComponent({ + name: 'FNavTreeDesign', + props: navTreeProps, + emits: ['selectRow'] as (string[] & ThisType) | undefined, + setup(props: NavTreeProps, context: SetupContext) { + const treeGridInstance = ref(); + // 资源是否加载完成 + const loadedSource = ref(false); + /** + * 由文件路径到树节点Id的映射 + * @remarks 在导航树中可能存在多个文件路径相同的节点,所以需要记录右侧编辑器中的文件是由那个节点双击打开的 + */ + const path2IdMap = new Map(); + + let currentId = ''; + let treeData: any = []; + // 取数服务 + let dataService: CommonFileNavTreeDataService; + // 获取图标服务 + let iconService: NavTreeNodeIconService | undefined; + const columns = [{ + field: 'name', + title: '', + visible: true, + width: 100, + formatter: (cell: VisualDataCell, visualDataRow: VisualData) => { + return visualDataRow.raw['CodeViewNav--ContentInnerHTML']; + } + }]; + const rowNumber = { enable: false }; + /** + * 清空选中状态 + */ + function clearSelection(): void { + treeGridInstance.value?.selectItemById(); + } + + function findNodeByPath(node: NavTreeNode, path: string): NavTreeNode | null { + if (!node || !node.data) { + return null; + } + if (node.data.path === path) { + return node; + } + if (node.children && node.children.length > 0) { + for (const child of node.children) { + const target = findNodeByPath(child, path); + if (target) { + return target; + } + } + } + return null; + } + /** + * 通过文件路径获取文件条目标识 + * @remarks 当不存在路径标识映射时,通过该方法获取文件条目标识 + * @param path 文件路径 + * @returns 条目标识 + */ + function getIdByPath(path: string): string { + const nodes = treeData; + for (const node of nodes) { + const target = findNodeByPath(node, path); + if (target) { + return target.id; + } + } + return ''; + } + /** + * 根据文件路径选中节点 + * @param path 文件路径 + * @returns 是否成功,如果节点不存在则失败 + */ + function selectByPath(path: string): boolean { + if (!path) { + clearSelection(); + return false; + } + // 优先通过路径标识映射获取对应标识 + let id = path2IdMap.get(path); + if (!id) { + id = getIdByPath(path); + } + if (id) { + treeGridInstance.value?.selectItemById(id); + currentId = id; + } + return true; + } + /** + * 重新加载导航树节点数据 + * @param selectNodePath 数据加载完成后,选中该路径节点 + */ + function reloadTreeData(selectNodePath = ''): Promise { + // 如果没有指定节点,则尝试选中之前选中的节点 + // selectNodePath = selectNodePath || ( + // treeCmp.treeTable.selectedRow + // && treeCmp.treeTable.selectedRow.data + // && treeCmp.treeTable.selectedRow.data.path + // ); + // 如果数据服务或者根路径为空则直接清空树数据 + if (props.entryFilePath) { + return dataService['getChildrenWithValidId'](props.entryFilePath).then((data) => { + treeData = data; + treeGridInstance.value?.updateDataSource(treeData); + selectByPath(selectNodePath); + }); + // setIcon(); + } else { + return new Promise((resolve, reject) => { + // 模拟异步请求 + treeData = []; + treeGridInstance.value?.updateDataSource(treeData); + resolve(); + }); + } + } + /** + * 直接设置导航树数据和图标服务 + */ + function setDataService(dataSource: CommonFileNavTreeDataService,iconSource?: NavTreeNodeIconService): void { + dataService = dataSource; + iconService = iconSource; + // 注册刷新导航树数据回调函数,让数据服务可以通过该方法控制导航树何时刷新数据 + if (dataService) { + dataService['refreshNavTreeCallback'] = async () => { + await reloadTreeData(); + }; + } + loadedSource.value = true; + } + // 监听资源加载 + watch(loadedSource, () => { + reloadTreeData(); + }); + + onMounted(() => { + if (dataService) { + loadedSource.value = true; + reloadTreeData(); + } + }); + function clickRowHandler(item) { + // 仅支持打开TS + if (!dataService || item.path.indexOf('.webcmd') > -1 || item.path.indexOf('.webcmp') > -1) { + return; + } + const { data } = item; + // 执行服务自定义节点双击处理回调 + const toOpenFile = dataService.handleDblClick(item); + if (toOpenFile && data.canOpen) { + path2IdMap.set(data.path, data.id); + context.emit('selectRow', item); + } + } + /** 更新导航树节点图标 */ + function setIcon(): void { + + } + + context.expose({ reloadTreeData, setDataService,selectByPath }); + + return () => { + return ( + clickRowHandler(dataItem)} + > + ); + }; + } +}); diff --git a/packages/mobile-designer/src/components/components/code-view/components/view-iframe.component.tsx b/packages/mobile-designer/src/components/components/code-view/components/view-iframe.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..e1794902458d3a55531ace774f2d50b4ed18ce96 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/components/view-iframe.component.tsx @@ -0,0 +1,131 @@ +/** + * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { defineComponent, ref, SetupContext, onMounted, onBeforeUnmount } from 'vue'; +import './code-view.scss'; +import { ViewIframeProps, viewIframeProps } from '../props/view-iframe.props'; + +export default defineComponent({ + name: 'FViewIframeDesign', + props: viewIframeProps, + emits: ['iframeClick'] as (string[] & ThisType) | undefined, + setup(props: ViewIframeProps, context: SetupContext) { + const iframeInstance = ref(); + function handleLoadEvent(): void { + props.handleLoad && props.handleLoad(iframeInstance.value); + } + function init() { + const iframeEl: HTMLIFrameElement = iframeInstance.value; + iframeEl.addEventListener('load', () => { + + if (!iframeEl.contentDocument) { + return; + } + + // 向外传递click事件 + iframeEl.contentDocument.addEventListener('click', (e) => { + // 当前元素 + // el.nativeElement.click(); + context.emit('iframeClick', e); + }); + + // 向外传递按键事件,实现全局支持快捷键操作 + iframeEl.contentDocument.addEventListener('keydown', (e) => { + // 全局按键事件 + // controller.keydownEmitter.next(e); + }); + + // 向外传递mouseup事件,防止滚动条粘到光标上 + iframeEl.contentDocument.addEventListener('mouseup', (e) => { + if (!e.isTrusted) { + return; + } + const el: HTMLIFrameElement = iframeInstance.value; + const boundingClientRect = el.getBoundingClientRect(); + const xOffset = boundingClientRect.left; + const yOffset = boundingClientRect.top; + try { + const upEvt = new MouseEvent("mouseup", { + "bubbles": true, + "cancelable": false, + "screenX": e.screenX, + "screenY": e.screenY, + "clientX": e.clientX + xOffset, + "clientY": e.clientY + yOffset, + "ctrlKey": e.ctrlKey, + "shiftKey": e.shiftKey, + "altKey": e.altKey, + "metaKey": e.metaKey, + "button": e.button, + "buttons": e.buttons, + "relatedTarget": e.relatedTarget + }); + document.dispatchEvent(upEvt); + } catch (err) { + console.error(err); + } + }); + + // 向外传递mousemove事件,让滚动条可以拖动 + iframeEl.contentDocument.addEventListener('mousemove', (e) => { + if (!e.isTrusted) { + return; + } + const el: HTMLIFrameElement = iframeInstance.value; + const boundingClientRect = el.getBoundingClientRect(); + const xOffset = boundingClientRect.left; + const yOffset = boundingClientRect.top; + try { + const moveEvt = new MouseEvent("mousemove", { + "bubbles": true, + "cancelable": false, + "screenX": e.screenX, + "screenY": e.screenY, + "clientX": e.clientX + xOffset, + "clientY": e.clientY + yOffset, + "ctrlKey": e.ctrlKey, + "shiftKey": e.shiftKey, + "altKey": e.altKey, + "metaKey": e.metaKey, + "button": e.button, + "buttons": e.buttons, + "relatedTarget": e.relatedTarget + }); + document.dispatchEvent(moveEvt); + } catch (err) { + console.error(err); + } + }); + }); + } + onMounted(() => { + init(); + }); + + onBeforeUnmount(() => { + iframeInstance.value.src = 'about:blank'; + iframeInstance.value.contentWindow.document.write(''); + iframeInstance.value.contentWindow.document.clear && iframeInstance.value.contentWindow.document.clear(); + iframeInstance.value.parentNode.removeChild(iframeInstance.value); + iframeInstance.value = null; + }); + + return () => { + return ( + + ); + }; + } +}); diff --git a/packages/mobile-designer/src/components/components/code-view/composition/config/plugins.config.ts b/packages/mobile-designer/src/components/components/code-view/composition/config/plugins.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..ca3ac2e64f54791211cc0bc3a38070c4f66cd8da --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/config/plugins.config.ts @@ -0,0 +1,25 @@ + +/** + * 文件打开方式 + * @remarks 由文件后缀名到插件名称的映射 + */ +export interface IOpenWithConfig { + [key: string]: string; +} +/** + * 代码视图全局配置 + */ +export interface IdeCodeViewConfig { + + /** 文件后缀名到打开该文件所需的插件地址的映射 */ + fileSuffix2PluginsUrlMap?: IOpenWithConfig; + +} + +/** + * 默认的打开方式配置,由文件后缀名到插件名称的映射 + * @remarks 不建议使用该参数(与外部框架的实现耦合),应该始终由外层组件传入自定义的打开方式配置 + */ +export const DEFAULT_PLUGINS_URL_MAP = { + ".ts": "/platform/dev/main/web/webide/plugins-new/code-editor-vue" +}; diff --git a/packages/mobile-designer/src/components/components/code-view/composition/entity/metadata-generator.ts b/packages/mobile-designer/src/components/components/code-view/composition/entity/metadata-generator.ts new file mode 100644 index 0000000000000000000000000000000000000000..48d8a5be809f1e1f86ad89123fb9b4f6674bf33b --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/entity/metadata-generator.ts @@ -0,0 +1,29 @@ +export class MetadataDto { + id: string; + nameSpace: string; + code: string; + name: string; + fileName: string; + type: string; + bizobjectID: string; + relativePath: string; + extendProperty: string; + content: string; + extendable: boolean; + nameLanguage:Record; + constructor(id: string, nameSpace: string, code: string, name: string, fileName: string, type: string, bizobjectID: string, relativePath: string, extendProperty: string, content: string, extendable: boolean, nameLanguage= {}) { + this.id = id; + this.nameSpace = nameSpace; + this.code = code; + this.name = name; + this.fileName = fileName; + this.type = type; + this.bizobjectID = bizobjectID; + this.relativePath = relativePath; + this.extendProperty = extendProperty; + this.content = content; + this.extendable = extendable; + this.nameLanguage = nameLanguage; + + } +} diff --git a/packages/mobile-designer/src/components/components/code-view/composition/event-bus/handler.ts b/packages/mobile-designer/src/components/components/code-view/composition/event-bus/handler.ts new file mode 100644 index 0000000000000000000000000000000000000000..ee708a23af811252f728680cd26ec7c0fd1f888d --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/event-bus/handler.ts @@ -0,0 +1,81 @@ +import { IdService } from '../../../view-model-designer/method-manager/service/id.service'; +import { EventBus } from './lib/event-bus'; +import { EVENT_BUS_INSTANSE_TOKEN } from './lib/types'; + + +export class EventBusHandler { + + /** 销毁后不可重新获取 */ + private destroyed: boolean = false; + + /** 每个代码视图页面上存在一个单例的事件总线 */ + get eventBus(): EventBus { + if (this.destroyed) { + throw new Error("代码视图已销毁,无法继续操作"); + } + return this.getInstance(); + } + + /** 该事件总线被赋值到window.top上,子页面通过指定的标识获取对应的事件总线实例 */ + get eventBusId(): string { + if (this.destroyed) { + throw new Error("代码视图已销毁,无法继续操作"); + } + if (!this._eventBusId) { + this.getInstance(); + } + return this._eventBusId; + } + + private _eventBus: EventBus | null = null; + private _eventBusId: string = ''; + private idService; + constructor() { + this.idService = new IdService(); + } + + /** + * 获取事件总线实例 + * @remarks 并且将该事件总线实例赋到window.top上 + * @returns 事件总线实例 + */ + public getInstance(): EventBus { + if (!this._eventBus) { + // 如果尚未初始化事件总线,则在top上新增一个事件总线实例 + this._eventBusId = this.genEventBusId(); + this._eventBus = new EventBus(); + if (window.top) { + window.top[this._eventBusId] = this._eventBus; + } + } + return this._eventBus; + } + + /** 生成一个事件总线实例标识 */ + private genEventBusId(): string { + let newIdSuffix: string; + while (true) { + newIdSuffix = this.idService.uuid().replace("-", ""); + if (window.top && !window.top[EVENT_BUS_INSTANSE_TOKEN + newIdSuffix]) { + return EVENT_BUS_INSTANSE_TOKEN + newIdSuffix; + } + } + } + + /** 销毁本组件的事件总线 */ + public destroy(): void { + if (this.destroyed) { + return; + } + try { + this._eventBus && this._eventBus.destroy(); + if (this._eventBusId && window.top) { + window.top[this._eventBusId] = null; + delete window.top[this._eventBusId]; + } + } finally { + this.destroyed = true; + } + } + +} diff --git a/packages/mobile-designer/src/components/components/code-view/composition/event-bus/lib/event-bus.ts b/packages/mobile-designer/src/components/components/code-view/composition/event-bus/lib/event-bus.ts new file mode 100644 index 0000000000000000000000000000000000000000..6b54d35b8a3eae8246916447715bbdebc5d1f67f --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/event-bus/lib/event-bus.ts @@ -0,0 +1,207 @@ +import { EditorEventType } from '../../type/editor-event'; +import { EventPipe } from './event-pipe'; +import { IDisposable, IEventBus, SaveCallback, SaveCallbackInfo } from './types'; +import { Observable, Subscriber } from 'rxjs'; +/** + * 外层通知事件 + * @remarks + * 调用代码视图组件的外层组件/框架可以通过代码视图组件上的接口,向代码视图内部的指定标签页发出通知 + * 通知的响应方法由编辑页面自己实现 + * 该通知将被推入到事件总线的通知队列中,编辑页应该订阅通知队列更新事件 + */ +export interface CommonEvent { + + /** 事件类型 */ + eventName: string; + + /** 事件负载 */ + eventPayload?: any; + + /** 自动生成的事件的唯一ID */ + __EVENT_ID__?: string; +} + +export class EventBus implements IEventBus { + + /** 全局上下文键值对 */ + private context: { [key: string]: any } = {}; + + /** 导航树节点上的附加信息 */ + private appendInfo: { [key: string]: any } = {}; + + private eventMap = new Map>(); + + /** + * 外层框架通知队列 + * @remarks + * 注意:该事件队列是为了让标签页和代码视图的外层框架交互而设立的 + * 外层框架指的是引用了代码视图组件的表单设计器或者BE设计器 + * 如果外层框架希望通知代码视图中的某一个标签页,则可以通过该事件队列对其进行通知 + * CommonEvent中的事件名与事件总线中事件的事件名相互独立,互不冲突 + * 注意:关闭标签页后必须清空其对应的通知队列 + */ + private notificationQueue = new Map(); + + private notificationResultObsMap = new Map[]>(); + + /** + * 标签页保存回调函数 + * @remarks 统一注册保存回调以便统一反馈提示信息 + */ + private saveCallbackMap = new Map(); + + public subscribe(eventName: string, eventHandler: (value: any) => void, caller: object, token?: string): IDisposable { + return this.getEventPipe(eventName, token || '').subscribe(eventHandler, caller); + } + + public emit(eventName: string, value: any, token?: string): void { + const eventPipeList = this.eventMap.get(eventName); + if (!eventPipeList) { + return; + } + for (const eventPipe of eventPipeList) { + // token为null的事件管道会接受其类型的所有的事件 + // token不为null的事件管道仅接受满足其token的事件 + if (eventPipe.matchToken(token || '') || !eventPipe.getToken()) { + eventPipe.post(value); + } + } + } + + private getEventPipe(eventName: string, token: string): EventPipe { + let eventPipeList = this.eventMap.get(eventName); + if (!eventPipeList) { + eventPipeList = new Array(); + this.eventMap.set(eventName, eventPipeList); + } + let eventPipe = eventPipeList.find(item => item.matchToken(token)); + if (!eventPipe) { + eventPipe = new EventPipe(token, eventPipeList); + } + return eventPipe; + } + + public setGlobalContextParam(key: string, value: string): any { + const last = this.context[key]; + this.context[key] = value; + return last; + } + + public getGlobalContextParam(key: string): any { + return this.context[key]; + } + + public getUrlParam(global: Window, key: string): string { + const params = new URLSearchParams(global.location.search); + return decodeURI(params.get(key) || ""); + } + + public setAppendInfo(path: string, value: any): any { + const last = this.appendInfo[path]; + this.appendInfo[path] = value; + return last; + } + + public getAppendInfo(path: string): any { + return this.appendInfo[path]; + } + + public pushNotificationQueue(path: string, event: CommonEvent): Observable { + const eventID = Guid.newGuid(); + event.__EVENT_ID__ = eventID; + this.notificationResultObsMap.set(eventID, []); + const resultObs = new Observable((subscriber) => { + const subs = this.notificationResultObsMap.get(eventID); + if (!subs) { + subscriber.complete(); + return; + } + subs.push(subscriber); + }); + // 首先将事件入队到对应的标签页 + let queue = this.notificationQueue.get(path); + if (!queue) { + queue = new Array(); + } + queue.push(event); + this.notificationQueue.set(path, queue); + // 通知该标签页其通知队列已变更 + this.emit(EditorEventType.NotificationQueueUpdated, null, path); + return resultObs; + } + + public responseNotificationResult(event: CommonEvent, result: any, isFinalResult: boolean = true): void { + const eventID = event && event.__EVENT_ID__; + if (!eventID) { + return; + } + const subscribers = this.notificationResultObsMap.get(eventID); + if (!subscribers) { + return; + } + for (const sub of subscribers) { + sub.next(result); + isFinalResult && sub.complete(); + } + if (isFinalResult) { + this.notificationResultObsMap.delete(eventID); + } + } + + public clearNotificationQueue(path: string): void { + this.notificationQueue.delete(path); + } + + public hasMoreNotification(path: string): boolean { + const queue = this.notificationQueue.get(path); + return !!queue && queue.length > 0; + } + + public fetchNotification(path: string): CommonEvent | undefined { + const queue = this.notificationQueue.get(path); + if (!queue || queue.length === 0) { + return undefined; + } + return queue.shift(); + } + + public registerSaveCallback(path: string, callback: SaveCallback, alwaysSave: boolean = true): void { + if (!!path && !!callback && typeof callback === 'function') { + this.saveCallbackMap.set(path, { callback, alwaysSave }); + } + } + + public clearSaveCallback(path: string): void { + this.saveCallbackMap.delete(path); + } + + public getSaveCallback(path: string): SaveCallbackInfo { + return this.saveCallbackMap.get(path); + } + + public destroy(): void { + this.context = undefined; + this.appendInfo = undefined; + this.eventMap = undefined; + this.notificationQueue = undefined; + this.saveCallbackMap = undefined; + } + +} + +// @dynamic +export class Guid { + + static newGuid() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + // tslint:disable-next-line:no-bitwise + const r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); + } + + static shortId() { + return Math.floor((Math.random() * 35 + 1) * 36 * 36 * 36).toString(36); + } + +} diff --git a/packages/mobile-designer/src/components/components/code-view/composition/event-bus/lib/event-pipe.ts b/packages/mobile-designer/src/components/components/code-view/composition/event-bus/lib/event-pipe.ts new file mode 100644 index 0000000000000000000000000000000000000000..b8f3ad0d88d6710238c5377f9c77e59cdaed16c9 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/event-bus/lib/event-pipe.ts @@ -0,0 +1,70 @@ +import { Subject, Subscription } from "rxjs"; +import { IDisposable } from "./types"; + +export class EventPipe implements IDisposable { + + private eventSubject: Subject; + + private subscriptionMap: Map; + + private token: string; + + private parentEventPipeList: Array; + + constructor(token: string, parentEventPipeList: Array) { + this.eventSubject = new Subject(); + this.subscriptionMap = new Map(); + this.token = token; + this.parentEventPipeList = parentEventPipeList; + if (this.parentEventPipeList) { + this.parentEventPipeList.push(this); + } + } + + public unsubscribe(subscriber: object): void { + let subscription = this.subscriptionMap.get(subscriber); + if (subscription) { + subscription.unsubscribe(); + subscription = null; + this.subscriptionMap.delete(subscriber); + } else { + return; + } + if (this.subscriptionMap.size === 0 && this.parentEventPipeList) { + const index = this.parentEventPipeList.findIndex(item => item === this); + if (index >= 0) { + this.parentEventPipeList.splice(index, 1); + } + } + } + + public post(value: any) { + this.eventSubject.next(value); + } + + public subscribe(eventHandler: (value: any) => void, caller: object): IDisposable { + const subscription = this.eventSubject.subscribe((value) => eventHandler.call(caller, value)); + this.subscriptionMap.set( caller, subscription ); + return this; + } + + /** + * 判断是否匹配 + * @param token 订阅者标识 + * @returns 是否匹配 + */ + public matchToken(token: string): boolean { + if (!!token !== !!this.token) { + return false; + } + if (!!token && !!this.token && this.token !== token) { + return false; + } + return true; + } + + public getToken(): string { + return this.token; + } + +} diff --git a/packages/mobile-designer/src/components/components/code-view/composition/event-bus/lib/types.ts b/packages/mobile-designer/src/components/components/code-view/composition/event-bus/lib/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..9533d54abbc1f89ef876e3e9c7be82678d60b303 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/event-bus/lib/types.ts @@ -0,0 +1,162 @@ +import { Observable } from 'rxjs'; +import { CommonEvent } from '../../interface/event'; + +export const EVENT_BUS_INSTANSE_TOKEN = "IdeCodeViewEventBus"; + +/** 标签页保存回调函数 */ +export type SaveCallback = () => Promise; + +/** 标签页保存结果 */ +export interface SaveResult { + + /** 是否成功 */ + success: boolean; + + /** 成功或失败提示信息,为空则使用默认提示 */ + tip?: string; + + /** 保存文件路径(可能会在提示信息中展示) */ + curPath?: string; + + /** 保存文件的关联文件主路径 */ + mainPath?: string; + + /** 保存文件名称(可能会在提示信息中展示) */ + name?: string; +} + +export interface SaveCallbackInfo { + callback: SaveCallback; + alwaysSave: boolean; +} + +export interface IDisposable { + + /** + * 取消订阅 + * @param subscriber 订阅者 + */ + unsubscribe(subscriber: object): void; + +} + +export interface IEventBus { + + /** + * 订阅事件 + * @param eventName 事件名称,由大小写英文字母或数字组成 + * @param eventHandler 事件处理方法 + * @param caller 订阅者 + * @param token 订阅者标识,如果为空则共用同一个事件管道,如果非空,则新建一个事件管道 + */ + subscribe(eventName: string, eventHandler: (value: any) => void, caller: object, token?: string): IDisposable; + + /** + * 发送事件 + * @param eventName 事件名称 + * @param value 事件数据 + * @param token 订阅者标识 + */ + emit(eventName: string, value: any, token?: string): void; + + /** + * 设置全局上下文参数 + * @param key 键 + * @param value 值 + * @returns 该键的历史值 + */ + setGlobalContextParam(key: string, value: string): any; + + /** + * 获取全局上下文参数 + * @param key 键 + */ + getGlobalContextParam(key: string): any; + + /** + * 设置节点附加信息 + * @param path 文件路径 + * @param value 附加信息 + * @returns 该键的历史值 + */ + setAppendInfo(path: string, value: any): any; + + /** + * 获取节点附加信息 + * @param path 文件路径(通过url上的id取得) + * @remarks 获取导航树节点上的appendInfo字段 + */ + getAppendInfo(path: string): any; + + /** + * 从url中获取查询参数 + * @remarks 获取当前页面对应的文件路径:getUrlParam(window, 'id') + * @param global window对象 + * @param key 键值 + * @returns 参数值 + */ + getUrlParam(global: Window, key: string): string; + + /** + * 发送外层通知事件 + * @remarks 由代码视图组件调用,不向标签页开放 + * @param path 标签页路径 + * @param event 通知事件 + */ + pushNotificationQueue(path: string, event: CommonEvent): Observable; + + /** + * 由标签页反馈通知结果 + * @param event 通知事件 + * @param result 通知事件的结果 + * @param isFinalResult 是否最终结果 + */ + responseNotificationResult(event: CommonEvent, result: any, isFinalResult: boolean): void; + + /** + * 清空标签页的通知队列 + * @remarks 当关闭标签页时必须调用该方法(由代码视图组件调用,不向标签页开放) + * @param path 标签页路径 + */ + clearNotificationQueue(path: string): void; + + /** + * 是否还有新通知 + * @remarks 由标签页调用,用于判断是否还有新的通知尚未处理 + * @param path 标签页路径 + */ + hasMoreNotification(path: string): boolean; + + /** + * 读取外层通知 + * @remarks 由标签页调用,从通知队列中读取一个外层通知 + * @param path 标签页路径 + */ + fetchNotification(path: string): CommonEvent; + + /** + * 注册保存回调函数 + * @param path 标签页路径 + * @param callback 标签页保存回调函数 + * @param alwaysSave 是否总是执行保存,默认为false(如果该值为true,则只要标签页打开,不管其是否有变更都执行保存) + * @remarks + * 该方法由标签页在初始化完成后调用,注册自己的保存回调函数以便代码视图汇总保存结果并统一反馈提示信息 + * 当只保存当前页时,无论alwaysSave的值是多少,都会重新保存(alwaysSave只在保存全部时生效) + */ + registerSaveCallback(path: string, callback: SaveCallback, alwaysSave?: boolean): void; + + /** + * 在标签页关闭时清除其注册的保存回调函数 + * @remarks 该方法由代码视图组件调用,不对标签页开放 + * @param path 标签页路径 + */ + clearSaveCallback(path: string): void; + + /** + * 获取标签页注册的保存回调 + * @remarks 由代码视图组件调用,不向标签页开放 + * @param path 标签页路径 + */ + getSaveCallback(path: string): SaveCallbackInfo; + +} diff --git a/packages/mobile-designer/src/components/components/code-view/composition/handler/class-nav-tree.service.ts b/packages/mobile-designer/src/components/components/code-view/composition/handler/class-nav-tree.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..793cbd31bd31f8f570f9d73ab9c718d6f58c6349 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/handler/class-nav-tree.service.ts @@ -0,0 +1,161 @@ +import { CodeLocationInfo, CodeOutlineInfo, IClass, IMethod } from "../type/code-outline"; +import { CommonFileNavTreeDataService } from "../type/nav/common-file"; +import { EditorEventType } from "../type/editor-event"; +import { NavTreeNode } from "../type/tree"; +import { EditorController } from "./editor.controller"; + +const ICON_CLASS = "nav-treenode-icon nav-treenode-icon--outline_class"; +const ICON_METHOD = "nav-treenode-icon nav-treenode-icon--outline_method"; + +/** 类视图导航数据服务 */ + +export class ClassNavTreeDataSource extends CommonFileNavTreeDataService { + + /** 由打开页签的文件路径到其代码大纲导航树数据的映射 */ + private mainPath2OutlineData = new Map(); + + /** 用于生成递增的节点id序列号 */ + private counter = 0; + constructor(editorController: EditorController) { + super(); + this.editorController = editorController; + this.afterPropertySet(); + } + afterPropertySet(): void { + this.subscribeOuterEvent(); + } + + private subscribeOuterEvent(): void { + const eventBus = this.editorController?.eventBus; + // 订阅代码大纲变化事件,维护大纲数据映射(新增或更新条目) + eventBus?.subscribe(EditorEventType.CodeOutlineChanged, (info: CodeOutlineInfo) => { + this.handleCodeOutlineChanged(info); + }, this); + // 订阅当前标签页切换事件,在当前页签变更时,通知导航树组件刷新数据 + eventBus?.subscribe(EditorEventType.TabSelected, () => { + this.handleTabSelected(); + }, this); + // 订阅标签页关闭事件,当文件关闭时,维护大纲数据映射(删除对应的条目) + eventBus?.subscribe(EditorEventType.CloseFile, (path: string) => { + this.handleCloseFile(path); + }, this); + } + + private handleCodeOutlineChanged(info: CodeOutlineInfo): void { + if (!info || !info.path || !info.classes) { + return; + } + const treeData = this.mapIClass2TreeData(info.classes, info.path); + this.mainPath2OutlineData.set(info.path, treeData); + this.handleTabSelected(); + } + + private handleTabSelected(): void { + if (this.refreshNavTreeCallback && typeof this.refreshNavTreeCallback === 'function') { + this.refreshNavTreeCallback(); + } + } + + private handleCloseFile(path: string): void { + if (!!path && this.mainPath2OutlineData.has(path)) { + this.mainPath2OutlineData.delete(path); + } + this.handleTabSelected(); + } + + /** + * 将类结构信息转化为大纲树节点数据 + * @remarks 同时在此处完成图标样式类的指定 + */ + private mapIClass2TreeData(classes: IClass[], path: string): NavTreeNode[] { + this.counter = 0; + const nodes = [] as any; + for (const _class of classes) { + const newClassNode = this.createClassNode(_class, path); + if (_class.methods) { + for (const _method of _class.methods) { + const newMethodNode = this.createMethodNode(_class, _method, path); + newClassNode.children?.push(newMethodNode); + } + } + nodes.push(newClassNode); + } + return nodes; + } + private createClassNode(_class: IClass, path: string): NavTreeNode { + const serialNumber = ++this.counter; + const id = `${path}_${_class.code}_${serialNumber}`; + return { + id, + data: { + id, + name: _class.code, + path, + canOpen: false, + icon: ICON_CLASS, + appendInfo: { + className: _class.code + } as CodeLocationInfo + }, + icon: ICON_CLASS, + expandedIcon: ICON_CLASS, + collapsedIcon: ICON_CLASS, + children: [], + expanded: true, + leaf: false + }; + } + private createMethodNode(_class: IClass, _method: IMethod, path: string): NavTreeNode { + const serialNumber = ++this.counter; + const id = `${path}_${_class.code}_${_method.code}_${serialNumber}`; + return { + id, + data: { + id, + name: _method.code, + path, + canOpen: false, + icon: ICON_METHOD, + appendInfo: { + className: _class.code, + methodName: _method.code + } as CodeLocationInfo + }, + icon: ICON_METHOD, + expandedIcon: ICON_METHOD, + collapsedIcon: ICON_METHOD, + children: [], + expanded: false, + leaf: true + }; + } + + enableLayeredLoading(): boolean { + return false; + } + + getChildren(): Promise { + const empty = Promise.resolve([]); + const contextService = this.editorController?.getContextService(); + if (contextService) { + const curPath = contextService.currentFileItem && contextService.currentFileItem.mainPath; + if (!curPath) { // 当前文件已被关闭,暂无数据 + return empty; + } + const treeData = this.mainPath2OutlineData.get(curPath); + if (treeData) { + return Promise.resolve(treeData); + } + } + return empty; + } + + handleDblClick(node: NavTreeNode): boolean { + // 通过事件总线将大纲定位信息发送给对应的页签,通知其定位代码 + if (!!node && !!node.data && !!node.data.appendInfo) { + this.editorController?.eventBus.emit(EditorEventType.CodeOutlineLocateRequest, node.data.appendInfo, node.data.path); + } + return false; + } + +} \ No newline at end of file diff --git a/packages/mobile-designer/src/components/components/code-view/composition/handler/context.service.ts b/packages/mobile-designer/src/components/components/code-view/composition/handler/context.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..c5c7b30a74a64e3a7430ed3b18c6c1c004d0db1a --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/handler/context.service.ts @@ -0,0 +1,137 @@ + +import { FileItem } from "../type/file-item"; +import { RelevantFileService } from "./relevant-file.service"; +import { ref } from 'vue'; + +/** + * 代码编辑器上下文服务 + * @remarks 保存了主要的状态数据,供组件之间交互同步 + */ + +export class ContextService { + + /** + * 入口文件路径,由外层组件传递进来 + * @remarks + * 该路径是整个代码视图的起点,一旦该路径变动,整个代码视图都要刷新 + * 分三种情况: + * 1. 为空,则表示尚未初始化 + * 2. 为“/”,则表示是整个代码视图 + * 3. 为具体的一个文件路径,则表示是某个元数据关联的代码视图 + */ + public entryFilePath = ref(''); + + /** + * 设置入口文件路径 + * @param path 入口文件路径 + */ + public setEntryFilePath(path: string) { + // 通知入口文件变更 + this.entryFilePath.value = path; + } + + /** 已经被打开的文件条目集合 */ + fileItems: FileItem[] = []; + + private _currentFilePath: string = ''; + private relSrv: RelevantFileService; + constructor() { + this.relSrv = new RelevantFileService(); + } + + /** 当前正在显示的文件路径 */ + get currentFilePath(): string { + return this._currentFilePath; + } + set currentFilePath(path: string) { + if (!!path && this.isFileExist(path)) { + this._currentFilePath = path; + } else { + this._currentFilePath = ''; + } + } + + /** 当前正在显示的文件条目 */ + get currentFileItem(): FileItem | undefined { + return this.fileItems.find(item => item.curPath === this._currentFilePath); + } + + /** + * 根据文件路径获取已经被打开的文件条目 + * @param path 文件路径 + * @returns 文件条目 + */ + public getFileItemByPath(path: string): FileItem | undefined { + return this.fileItems.find(item => item.relPaths.includes(path)); + } + + /** + * 判断文件是否已经打开 + * @remarks 文件的关联文件被打开也算这个文件被打开 + * @param path 文件路径 + * @returns 是否已经打开 + */ + public isFileExist(path: string): boolean { + return this.fileItems.findIndex(item => item.relPaths.includes(path)) >= 0; + } + + /** + * 新增文件条目 + * @param path 文件路径 + * @returns 文件条目,如果文件已存在则返回null + */ + public addFile(path: string): FileItem | null { + if (!path || this.isFileExist(path)) { + return null; + } + // 注意,关联文件服务返回的关联文件路径数组中的第一个文件为“主文件” + const relPaths = this.relSrv.getRelevantFilePaths(path); + const mainPath = relPaths ? relPaths[0] : ''; + const curPath = path; + const newFileItem = new FileItem(mainPath, this.relSrv.getRelevantFilePaths(path) || [], curPath); + this.fileItems.push(newFileItem); + return newFileItem; + } + + /** + * 新增并显示文件条目 + * @param path 文件路径 + * @returns 文件条目,如果文件已存在则返回null + */ + public openFile(path: string): FileItem | null { + const item = this.addFile(path); + if (item) { + this._currentFilePath = path; + return item; + } + return null; + } + + /** + * 移除文件条目 + * @param path 文件路径 + * @returns 是否成功 + */ + public removeFile(path: string): boolean { + const idx = this.fileItems.findIndex(item => item.relPaths.includes(path)); + if (idx >= 0) { + this.fileItems.splice(idx, 1); + if (this.fileItems.length === 0) { + this._currentFilePath = ''; + } + return true; + } + return false; + } + + /** 是否存在尚未保存的文件 */ + public hasDirtyFile(): boolean { + for (const item of this.fileItems) { + if (item.isDirty) { + return true; + } + } + return false; + } + +} diff --git a/packages/mobile-designer/src/components/components/code-view/composition/handler/editor.controller.ts b/packages/mobile-designer/src/components/components/code-view/composition/handler/editor.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..0fda0a0ccc253d7f63d024baa97f91999cc29d11 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/handler/editor.controller.ts @@ -0,0 +1,520 @@ +/** + * 代码编辑器中央控制器 + * @remarks + * 掌握标签页、中心编辑器等组件实例,对外封装打开文件、关闭文件等基本接口 + */ +import { throttle } from "lodash-es"; +import { EventBusHandler } from "../event-bus/handler"; +import { IEventBus, SaveResult } from "../event-bus/lib/types"; +import { FileItem } from "../type/file-item"; +import { CodeTab } from "../type/tab"; +import { ContextService } from "./context.service"; +import { FMessageBoxService } from "@farris/ui-vue/components"; +import { FNotifyService } from "@farris/ui-vue/components"; +import { CommonEvent } from "../event-bus/lib/event-bus"; +import { Observable } from "rxjs"; +import { NavTreeData } from "../type/tree"; +import { EditorEventType } from "../type/editor-event"; + +export class EditorController { + context: ContextService; + DEFAULT_SAVE_ALL_SUCCESS_TIP = "全部保存成功"; + DEFAULT_SAVE_SUCCESS_TIP = "保存成功"; + DEFAULT_SAVE_FAILED_TIP = "保存失败"; + // 标签页 + tabs: any; + editors: any; + fileNavTree: any; + classNavTree: any; + messageService: any; + notifyService: any; + eventBusHandler: EventBusHandler; + /** 保存当前页签的文件 - 节流版本 */ + public throttledSaveCurrentFile: () => void; + get eventBus(): IEventBus { + return this.eventBusHandler && this.eventBusHandler.eventBus; + } + /** + * 通知表单设计器代码编辑器内容已修改 + */ + private detectFileDirtyHandler = (data) => { }; + constructor() { + this.eventBusHandler = new EventBusHandler(); + this.notifyService = new FNotifyService(); + this.messageService = FMessageBoxService; + this.context = new ContextService(); + this.eventBusHandler.getInstance(); + this.throttledSaveCurrentFile = throttle(() => { + this.doSaveCurrentFile(true); + }, 600); + } + public getEventBusId(): string { + return this.eventBusHandler.eventBusId; + } + public getContextService(): ContextService { + return this.context; + } + /** + * 初始化 + * @param tabInstanceRef + * @param editorPanelsInstanceRef + * @param fileNavTreeInstanceRef + * @param classNavTreeInstanceRef + * @param detectFileDirtyHandler + */ + public init(tabInstanceRef: any, editorPanelsInstanceRef: any, fileNavTreeInstanceRef: any, classNavTreeInstanceRef: any, detectFileDirtyHandler): void { + this.tabs = tabInstanceRef; + this.editors = editorPanelsInstanceRef; + this.detectFileDirtyHandler = detectFileDirtyHandler; + this.fileNavTree = fileNavTreeInstanceRef; + this.classNavTree = classNavTreeInstanceRef; + // 订阅内部和外部事件 + this.subscribeOuterEvent(); + } + + private subscribeOuterEvent(): void { + // 监听导航树打开文件事件 + this.eventBus.subscribe(EditorEventType.OpenFile, (info: { path: string, data: NavTreeData }) => { + this.openFile(info.path, info.data.appendInfo); + // this.root.detectChanges(); + }, this); + // 监听文件内容变更事件 + this.eventBus.subscribe(EditorEventType.FileChanged, (info: { path: string, changed: boolean }) => { + const fileItem = this.context.getFileItemByPath(info.path); + const tab = this.tabs.value.getTab(info.path); + if (!fileItem || !tab) { + return; + } + fileItem.isCodeFileDirty = !!info.changed; + tab.isDirty = fileItem.isDirty; + this.notifyFormDirtyInfo(); + // this.root.detectChanges(); + }, this); + // 监听设计器文件内容变更事件 + this.eventBus.subscribe(EditorEventType.DesignerFileChanged, (info: { path: string, changed: boolean }) => { + const fileItem = this.context.getFileItemByPath(info.path); + const tab = this.tabs.value.getTab(info.path); + if (!fileItem || !tab) { + return; + } + fileItem.isDesignerFileDirty = !!info.changed; + tab.isDirty = fileItem.isDirty; + // 通知表单,代码编辑器已修改 + this.notifyFormDirtyInfo(); + // this.root.detectChanges(); + }, this); + // 监听代发消息提示事件 + this.eventBus.subscribe(EditorEventType.NotifyMessage, (option) => { + if (!!option && !!option.type) { + this.notifyService[option.type](option); + // this.root.detectChanges(); + } + }, this); + this.eventBus.subscribe(EditorEventType.TabSelected, (path: string) => { + this.fileNavTree?.value?.selectByPath(path); + this.classNavTree?.value?.selectByPath(path); + }, this); + } + /** + * 处理标签页选中事件 + * @param path 文件路径 + */ + public handleTabSelected(path: string): void { + const fileItem = this.context.getFileItemByPath(path); + // 如果路径与上下文中记录的当前文件路径不符,则需要切换相关组件的内容 + if (path !== this.context.currentFilePath && !!fileItem) { + this.showFile(fileItem.curPath); + } + // 通知左侧导航树切换选中节点(注意:该事件必须在当前文件路径变更之后发出) + this.eventBus.emit(EditorEventType.TabSelected, fileItem?.curPath); + } + public openFile(path: string, appendInfo?: any): void { + // 判断文件是否已经被打开 + const isFileExist = this.context.isFileExist(path); + if (isFileExist) { + // 如果文件已经被打开,则直接显示已有文件 + const oldFileItem = this.context.getFileItemByPath(path); + const mainPath = oldFileItem && oldFileItem.mainPath; + if (!!mainPath && !!appendInfo) { + this.eventBus.setAppendInfo(mainPath, appendInfo); + } + this.showFile(path); + return; + } + // 文件没有被打开,新增页签并切换编辑器 + const newFileItem = this.context.openFile(path); + if (!newFileItem) { + return; // 传入的path是可能为空的 + } + if (!!newFileItem.mainPath && !!appendInfo) { + this.eventBus.setAppendInfo(newFileItem.mainPath, appendInfo); + } + this.tabs.value.addTab(new CodeTab(newFileItem.mainPath, newFileItem.title, newFileItem.icon), true); + const success = this.editors.value.open(newFileItem.mainPath, { "open": path }); + if (!success) { + console.error("不存在针对该文件的打开方式配置", newFileItem.mainPath); + return; + } + this.showFile(path); // 为了更新关联文件标题以及切换关联文件内容 + } + + public showFile(path: string): void { + // 获取当前已有文件条目 + const fileItem = this.context.getFileItemByPath(path); + // 如果正在显示这个页签,则仅需要进行关联文件切换 + const isCurrentTab = this.context.currentFilePath === path; + // 切换当前显示文件路径 + this.context.currentFilePath = path; + // 如果路径切换不成功,说明文件条目不存在 + if (this.context.currentFilePath !== path) { + return; + } + const mainPath = fileItem?.mainPath; + if (fileItem) { + fileItem.curPath = path; + } + // 按照新的路径更新标签页的标题和图标 + this.updateTabTitle(path); + // 按照新的路径进行关联文件切换 + // this.eventBus.emit(EditorEventType.SwitchRelevantFile, path, mainPath); + // 显示目标页签和标签页 + if (!isCurrentTab) { + this.tabs.value.selectById(mainPath); + this.editors.value.show(mainPath); + } + } + + /** + * 更新标签页的标题和图标 + * @param path 文件路径 + */ + private updateTabTitle(path: string): void { + const fileItem = this.context.getFileItemByPath(path); + if (!fileItem) { + return; + } + // const tab = this.tabs.value.getTab(fileItem.mainPath); + // tab.updateTitle( + // FileItem.getTitleFromPath(path), + // FileItem.getIconFromPath(path) + // ); + } + /** + * + */ + + public closeFile(path: string, force?: boolean): void { + const fileItem = this.context.getFileItemByPath(path); + if (!fileItem) { + return; + } + if (!fileItem.isDirty || force) { + this.directCloseFile(fileItem); + return; + } + this.closeFiles([fileItem]).then(() => { + this.notifyFormDirtyInfo(); + }); + } + /** + * 关闭指定的几个文件条目(对应的标签页) + * @remarks 如果存在未保存的文件则先显示该文件并弹框提示用户是否保存 + * @param items 文件条目 + * @returns 返回Observable以便在执行完成后追加操作,别忘记订阅 + */ + private async closeFiles(items: FileItem[]): Promise { + const self = this; + const promises = items.map(item => { + return new Promise((resolve) => { + // 如果文件未修改则直接关闭 + if (!item.isDirty) { + self.directCloseFile(item); + resolve(null); + } else { // 如果存在未保存的修改,则提示用户成功保存后关闭 + this.showFile(item.curPath); // 询问用户是否保存前先切换到对应的页面 + // 优先显示标签页中的标题 + const tab = this.tabs && this.tabs.value.getTab(item.mainPath); + const title = tab && tab.title || item.title; + const messageBox = this.messageService.show({ + title: `是否要保存对${title}的更改?`, + detail: '如果不保存,你的更改将丢失。', + okButtonText: '', + cancelButtonText: '', + buttons: [ + { + text: '保存', + class: 'btn btn-primary', + handle: () => { + self.saveAndCloseFile(item.mainPath, true); + messageBox.close(); + resolve(null); + } + }, + { + text: '不保存', + class: 'btn btn-secondary', + handle: () => { + self.directCloseFile(item); + messageBox.close(); + // this.root.closeWithoutSave.emit(); + resolve(null); + } + }, + { + text: '取消', + class: 'btn btn-secondary', + handle: () => { + messageBox.close(); + resolve(null); + } + } + ] + }); + } + }); + }); + // 等待所有 Promise 完成 + await Promise.all(promises); + } + /** + * 保存并关闭文件 + * @param path 标签页路径 + * @param ignoreSuccessTip 不弹出保存成功提示 + */ + private async saveAndCloseFile(path: string, ignoreSuccessTip: boolean = false): Promise { + const result = await this.doSaveCurrentFile(true, path, ignoreSuccessTip); + if (result && result.success) { + this.closeFile(path, true); + } + } + /** 直接关闭文件 */ + private directCloseFile(item: FileItem) { + if (this.context.removeFile(item.mainPath)) { + const { mainPath } = item; + this.eventBus.emit(EditorEventType.CloseFile, mainPath, mainPath); + this.tabs.value.removeTab(mainPath); + this.editors.value.close(mainPath); + this.eventBus.clearNotificationQueue(mainPath); + this.eventBus.clearSaveCallback(mainPath); + // 当文件关闭时,需要将当前文件路径也设置为空 + if (this.context.currentFileItem && this.context.currentFileItem.mainPath === mainPath) { + this.context.currentFilePath = ''; + } + } + } + + // public switchView(force?: boolean): void { + // if (!!force) { + // this.directSwitchView(); + // return; + // } + // const hasDirtyFile = this.context.hasDirtyFile(); + // if (hasDirtyFile) { + // const message = this.msgSrv.show('warning', '存在尚未保存的文件,是否继续跳转?', { + // initialState: { + // buttons: [ + // { + // text: '保存并跳转', + // cls: 'btn btn-primary', + // handle: async () => { + // message.close(); + // try { + // const results = await this.doSaveAllFile(true, true); + // this.root.saved.emit() + // if (this.isAllSavedSuccess(results)) { + // this.directSwitchView(); + // } + // } catch (err) { } + // } + // }, + // { + // text: '仅跳转', + // cls: 'btn btn-secondary', + // handle: () => { + // message.close(); + // this.root.closeWithoutSave.emit(); + // this.directSwitchView(); + // } + // }, + // { + // text: '取消', + // cls: 'btn btn-secondary', + // handle: () => { + // message.close(); + // } + // } + // ] + // } + // }); + // } else { + // this.directSwitchView(); + // } + // } + /** + * 直接关闭所有标签页 + */ + private closeAllFileDirectly(): void { + const items = this.context.fileItems; + const itemsToRemove = [] as any; + for (const item of items) { + itemsToRemove.push(item); + } + for (const itemToRemove of itemsToRemove) { + try { + this.directCloseFile(itemToRemove); + } catch (err) { + console.log("销毁标签页失败", err); + } + } + } + public async doSaveAllFile(notifyResult: boolean = false, ignoreSuccessTip: boolean = false): Promise { + const resultArr = await this.saveAllFile(); + for (const result of resultArr) { + if (result && !!result.mainPath && !!result.success) { + this.resetFileChanged(result.mainPath); + } + } + if (notifyResult && resultArr && resultArr.length > 0) { + this.notifyAllSaveResult(resultArr, ignoreSuccessTip); + } + return resultArr; + } + /** + * 保存全部文件 + * @remarks 将保存全部有变更的文件(标签页可能配置“未变更也保存”选项) + * @returns 保存结果 + */ + private async saveAllFile(): Promise { + // 为保存结果设置默认的路径和名称信息 + const setDefaultPath = (fileItem: FileItem, saveResult: SaveResult): SaveResult => { + saveResult && (saveResult.curPath = fileItem.curPath); + saveResult && (saveResult.mainPath = fileItem.mainPath); + saveResult && (saveResult.name = fileItem.title); + return saveResult; + } + const results: Promise[] = []; + for (const fileItem of this.context.fileItems) { + const { mainPath } = fileItem; + const callbackInfo = this.eventBus.getSaveCallback(mainPath); + const callback = callbackInfo && callbackInfo.callback; + if (!callback || typeof callback !== 'function') { + continue; + } + // 如果文件数据未变更且未设置“未变更也保存”选项,则不保存该条目 + const { alwaysSave } = callbackInfo; + if (!fileItem.isDirty && !alwaysSave) { + continue; + } + const saveResult = callback().then((result) => { + return setDefaultPath(fileItem, result); + }).catch(() => { + return setDefaultPath(fileItem, { success: false }); + }); + results.push(saveResult); + } + let saveResultArr: SaveResult[] = []; + try { + saveResultArr = await Promise.all(results); + } catch (err) { + console.error(err); + } + // this.root.saved.emit(); + return saveResultArr; + } + /** + * 保存当前文件 + * @param path 指定一个标签页路径,保存该标签页的文件(而不是保存当前文件) + * @remarks 无论当前文件是否有变更都重新执行其保存回调函数 + * @returns 保存结果,如果为空则表示当前没有文件被打开 + */ + private async saveCurrentFile(path?: string): Promise { + // 获取当前文件条目路径 + const fileItem = path ? this.context.getFileItemByPath(path) : this.context.currentFileItem; + if (!fileItem) { + return Promise.resolve(null); + } + // 获取保存回调函数 + const callbackInfo = this.eventBus.getSaveCallback(fileItem.mainPath); + const callback = callbackInfo && callbackInfo.callback; + if (!callback || typeof callback !== 'function') { + return Promise.resolve(null); + } + // 执行保存操作 + let saveResult: SaveResult | null = null; + try { + saveResult = await callback(); + } catch { + saveResult = { success: false }; + } + // this.root.saved.emit(); + saveResult && (saveResult.curPath = fileItem.curPath); + saveResult && (saveResult.mainPath = fileItem.mainPath); + saveResult && (saveResult.name = fileItem.title); + return saveResult; + } + public async doSaveCurrentFile(notifyResult: boolean = false, path?: string, ignoreSuccessTip: boolean = false): Promise { + const result = await this.saveCurrentFile(path); + if (result && !!result.mainPath && !!result.success) { + this.resetFileChanged(result.mainPath); + } + if (notifyResult && !!result) { + if (!result.success || !ignoreSuccessTip) { // 判断是否忽略成功提示信息 + this.notifyOneSaveResult(result); + } + } + return result; + } + private resetFileChanged(mainPath: string): void { + const fileItem = this.context.getFileItemByPath(mainPath); + const tab = this.tabs.value.getTab(mainPath); + if (!fileItem || !tab) { + return; + } + fileItem.isCodeFileDirty = false; + fileItem.isDesignerFileDirty = false; + tab.isDirty = fileItem.isDirty; + // this.root.detectChanges(); + } + private notifyAllSaveResult(results: SaveResult[], ignoreSuccessTip: boolean = false): void { + if (!results || results.length === 0) { + return; + } + let allSuccess = true; + for (const result of results) { + if (!result.success) { + const tip = this.DEFAULT_SAVE_FAILED_TIP; + const message = `${result.name} ${tip}`; + this.messageService.error(message); + allSuccess = false; + } + } + if (allSuccess && !ignoreSuccessTip) { + this.notifyService.success({ position: 'top-center', message: this.DEFAULT_SAVE_ALL_SUCCESS_TIP }); + } + } + + private notifyOneSaveResult(result: SaveResult): void { + if (!result) { + return; + } + if (result.success) { + this.notifyService.success({ position: 'top-center', message: this.DEFAULT_SAVE_SUCCESS_TIP }); + } else { + this.notifyService.error({ position: 'top-center', type: 'error', msg: this.DEFAULT_SAVE_FAILED_TIP, timeout: 3500 }); + } + } + public sendNotification(path: string, event: CommonEvent): Observable | null { + // 如果找不到path对应的文件条目,说明文件尚未打开,静默失败 + const fileItem = this.context.getFileItemByPath(path); + if (!fileItem || !fileItem.mainPath) { + return null; + } + return this.eventBus.pushNotificationQueue(fileItem.mainPath, event); + } + private notifyFormDirtyInfo() { + if (this.detectFileDirtyHandler) { + const flag = this.context.hasDirtyFile(); + this.detectFileDirtyHandler(flag); + } + } +} diff --git a/packages/mobile-designer/src/components/components/code-view/composition/handler/field-getter.tsx b/packages/mobile-designer/src/components/components/code-view/composition/handler/field-getter.tsx new file mode 100644 index 0000000000000000000000000000000000000000..b1b8202c16a8342f8d6a5e3d3b26e86c4b1bc14a --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/handler/field-getter.tsx @@ -0,0 +1,34 @@ +import { FModalService, F_MODAL_SERVICE_TOKEN } from "@farris/ui-vue/components"; +import { inject } from "vue"; +import FFieldsGetterDesign from "../../components/fields-getter.component"; + +/** 用于新增前端控制器构件 */ +export function fieldGetterController() { + + const modalService: FModalService | null = inject(F_MODAL_SERVICE_TOKEN, null); + + async function getFields(title, fields, width, height) { + let resolveFunc: (value: any) => void; + let rejectFunc: (reason?: any) => void; + let myModal: any = null; + const result = new Promise((resolve, reject) => { + resolveFunc = resolve; + rejectFunc = reject; + }); + function resultHandler(state, data) { + state ? resolveFunc(data) : rejectFunc(data); + myModal?.destroy(); + } + myModal = modalService?.open({ + fitContent: false, + width: width, + height: height, + title: title, + showButtons: false, + render: () => ( resultHandler(true, data)} onCancel={() => resultHandler(false, {})}>) + }); + return result; + } + + return { getFields }; +} diff --git a/packages/mobile-designer/src/components/components/code-view/composition/handler/frm-cmp-builder.ts b/packages/mobile-designer/src/components/components/code-view/composition/handler/frm-cmp-builder.ts new file mode 100644 index 0000000000000000000000000000000000000000..0e0b97ce254179e2f926321147e2eafdf2f8e7bf --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/handler/frm-cmp-builder.ts @@ -0,0 +1,206 @@ + +import axios from "axios"; +import { MetadataDto } from "../entity/metadata-generator"; +import { checkCode, checkName } from "../utils/valid"; +import { FieldOption } from "../type/fields-getter"; +import { MetadataService } from "../../../../composition/metadata.service"; +import { NavDataUtilService } from "./nav-data-util.service"; +import { fieldGetterController } from "./field-getter"; + +/** 新建前端构件的结果 */ +export interface CmpBuildResult { + /** ts文件路径,用于在代码视图中直接打开新构件 */ + tsFilePath: string; + /** 是否新增了文件,如果是则需要刷新导航树 */ + hasNewFile: boolean; + /** 是否存在错误,默认不存在 */ + hasError?: boolean; + /** 错误提示信息 */ + errorTip?: string; +} +/** 构件元数据基本信息 */ +interface CmpBuildInfo { + code: string; + name: string; + namespace: string; + bizObjId: string; + relativePath: string; + extendProperty: any; + tsFilePathName: string; +} + +/** 用于新增前端控制器构件 */ +export class FrmCmpBuilder { + metadataService: MetadataService; + navDataUtilService: NavDataUtilService; + fieldGetter; + constructor() { + this.metadataService = new MetadataService(); + this.navDataUtilService = new NavDataUtilService(); + this.fieldGetter = fieldGetterController(); + } + /** + * 弹框新增一个前端控制器构件 + * @param frmPath 表单元数据地址 + * @returns 新建结果,为空则表示用户点击了取消 + */ + async addNewCmp(frmPath: string): Promise { + const fields: FieldOption[] = [{ + code: 'code', + name: '构件编号', + placeholder: '可选,默认为“Controller”,需遵守js变量名规则', + validate: (value: string) => { + if (!value) { + return ''; + } + const error = checkCode(value); + return error ? '编号' + error : ''; + } + }, { + code: 'name', + name: '构件名称', + placeholder: '可选,默认与构件编号相同', + validate: (value: string) => { + if (!value) { + return ''; + } + const error = checkName(value); + return error ? '名称' + error : ''; + } + }]; + const fieldsMap = await this.fieldGetter.getFields("新增前端构件", fields, 550, 220).catch(() => null); + if (fieldsMap) { + const code: string = fieldsMap.code || 'Controller'; + const name: string = fieldsMap.name || code; + return this.doAddNewCmp(code.trim(), name.trim(), frmPath); + } + return null; + } + + /** + * 直接新增一个前端控制器构件 + * @remarks 如果已经存在部分文件则进行补全 + * @param code 构件编号 + * @param name 构件名称 + * @param frmPath 表单元数据路径 + */ + async doAddNewCmp(code: string, name: string, frmPath: string): Promise { + // 获取表单元数据的编号和名称 + const frmMeta = await this.navDataUtilService.loadMetadata(frmPath).then((data) => data).catch(() => null); + if (!frmMeta) { + return { + hasError: true, + errorTip: '无法获取到对应的表单元数据,请刷新后重试', + tsFilePath: '', hasNewFile: false + }; + } + // 生成新的构件的基本信息 + const buildInfo: CmpBuildInfo = { + code: frmMeta.code + '_frm_' + code, + name: (frmMeta.name || frmMeta.code) + '_frm_' + name, + namespace: frmMeta.nameSpace, + bizObjId: frmMeta.bizobjectID, + relativePath: frmMeta.relativePath, + extendProperty: { IsCommon: false, FormCode: frmMeta.code }, + tsFilePathName: '' + }; + buildInfo.tsFilePathName = '/' + buildInfo.relativePath + '/' + buildInfo.code + '.ts'; + const webCmpFileName = buildInfo.code + '.webcmp'; + const webCmdFileName = buildInfo.code + '.webcmd'; + // 判断构件文件是否已经存在 + const notHasWebCmp$ = this.metadataService.validateRepeatName(frmMeta.relativePath, webCmpFileName) + .then(data => data) + .catch(() => undefined); + const notHasWebCmd$ = this.metadataService.validateRepeatName(frmMeta.relativePath, webCmdFileName) + .then(data => data) + .catch(() => undefined); + const [notHasWebCmp, notHasWebCmd] = await Promise.all([notHasWebCmp$, notHasWebCmd$]); + if (notHasWebCmp === undefined || notHasWebCmd === undefined) { + return { + hasError: true, + errorTip: '获取文件状态信息失败,请刷新后重试', + tsFilePath: '', hasNewFile: false + }; + } + if (!notHasWebCmp && !notHasWebCmd) { + return { tsFilePath: buildInfo.tsFilePathName, hasNewFile: false }; + } + const createWebCmpError = notHasWebCmp && (await this.createWebCmp(buildInfo)); + if (createWebCmpError) { + return { + hasError: true, + errorTip: createWebCmpError, + tsFilePath: '', hasNewFile: true + }; + } + const createWebCmdError = notHasWebCmd && (await this.createWebCmd(buildInfo)); + if (createWebCmdError) { + return { + hasError: true, + errorTip: createWebCmdError, + tsFilePath: '', hasNewFile: true + }; + } + return { tsFilePath: buildInfo.tsFilePathName, hasNewFile: true }; + } + + /** + * 新建一个前端服务构件 + * @param buildInfo 构件基本信息 + * @returns 错误信息,为空则表示创建成功 + */ + async createWebCmp(buildInfo: CmpBuildInfo): Promise { + const fileName = buildInfo.code + '.webcmp'; + const metadataDto = new MetadataDto( + '', buildInfo.namespace, buildInfo.code, buildInfo.name, fileName, 'WebComponent', + buildInfo.bizObjId, buildInfo.relativePath, JSON.stringify(buildInfo.extendProperty), '', false + ); + const initedDto = await this.metadataService.initializeMetadataEntity(metadataDto).then((data) => data).catch(() => null); + if (!initedDto) { + return '构件信息初始化失败,请刷新后重试'; + } + initedDto.fileName = metadataDto.fileName; + const webComponent = JSON.parse(initedDto.content); + webComponent.Source = buildInfo.relativePath + '/' + buildInfo.code + '.ts'; + initedDto.content = JSON.stringify(webComponent); + // 发送请求,创建元数据文件 + const createResult = await this.metadataService.createMetadata(initedDto).then((data) => data).catch(() => null); + if (!createResult || !createResult.ok) { + return '构件元数据文件创建失败,请刷新后重试'; + } + // 创建服务构件附带的ts文件 + const tsUrl = '/api/dev/main/v1.0/tsfile/create?path=' + buildInfo.tsFilePathName + '&formType=Vue'; + + try { + await axios.post(tsUrl, {}); + return ''; + } catch (error) { + console.error(error); + return 'ts文件创建失败,请刷新后重试'; + } + } + + /** + * 新建一个前端命令构件 + * @param buildInfo 构件基本信息 + * @returns 错误信息,为空则表示创建成功 + */ + async createWebCmd(buildInfo: CmpBuildInfo): Promise { + const fileName = buildInfo.code + '.webcmd'; + const metadataDto = new MetadataDto( + '', buildInfo.namespace, buildInfo.code, buildInfo.name, fileName, 'WebCommand', + buildInfo.bizObjId, buildInfo.relativePath, JSON.stringify(buildInfo.extendProperty), '', false + ); + const initedDto = await this.metadataService.initializeMetadataEntity(metadataDto).then((data) => data).catch(() => null); + if (!initedDto) { + return '构件信息初始化失败,请刷新后重试'; + } + initedDto.fileName = metadataDto.fileName; + const createResult = await this.metadataService.createMetadata(initedDto).then((data) => data).catch(() => null); + if (!createResult || !createResult.ok) { + return '构件元数据文件创建失败,请刷新后重试'; + } + return ''; + } + +} diff --git a/packages/mobile-designer/src/components/components/code-view/composition/handler/nav-data-util.service.ts b/packages/mobile-designer/src/components/components/code-view/composition/handler/nav-data-util.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..45957e3a6629bf85f5fa483575f8413da0944b81 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/handler/nav-data-util.service.ts @@ -0,0 +1,146 @@ +import { MetadataDto } from "src/components/types"; +import { MetadataType } from "../type/metadata"; +import { MetadataService } from "../../../../composition/metadata.service"; +import axios from "axios"; + +const SERVER_IP: string = ''; +const API_METADATAS = "/api/dev/main/v1.0/metadatas"; + + +export class NavDataUtilService { + private metadataService; + constructor() { + this.metadataService = new MetadataService(); + } + + public getProjectPathFromFrmPath(frmPath: string): string { + if (!frmPath) { + return ''; + } + frmPath = frmPath.replace(/\\/g, '/'); + const lastIdx = this.lastIndexOf(frmPath, '/', 3); + return lastIdx > 0 ? frmPath.substring(0, lastIdx) : ''; + } + + /** + * 找到倒数第n个子串 + * @param str 待搜索串 + * @param char 子串 + * @param index 倒数第几个 + */ + public lastIndexOf(str: string, searchString: string, index: number): number { + if (!str || !searchString || index < 1) { + return -1; + } + let position = str.length - 1; + let idx = -1; + for (; index > 0; index--) { + idx = str.lastIndexOf(searchString, position); + if (idx >= 0) { + position = idx - 1; + } else { + return -1; + } + } + return idx; + } + + /** + * 获取项目下的元数据描述集合 + * @param path 项目路径 + */ + public getProjectMetas(path: string): Promise { + if (!path) { + return new Promise((resolve, reject) => { + resolve([]); + }); + } + let url = SERVER_IP + API_METADATAS + "/filter"; + url += `?path=${path}`; + return axios.get(url).then(res => res.data); + } + + /** + * 获取元数据 + * @param path 元数据路径 + * @returns 元数据 + */ + public loadMetadata(path: string): Promise { + const uri = path.replace(/\\/g, '/'); + const fileName = uri.substring(uri.lastIndexOf('/') + 1); + const filePath = uri.substring(uri.startsWith('/') ? 1 : 0, uri.lastIndexOf('/')); + return this.metadataService.loadMetadata(fileName, filePath); + } + + /** + * 通过文件名称匹配元数据 + * @param path 元数据路径 + * @returns 元数据描述 + */ + public findMetaByFilename(path: string, metas: MetadataDto[]): MetadataDto | null { + path = path.replace(/\\/g, '/'); + const fileName = path.substring(path.lastIndexOf('/') + 1); + for (const meta of metas) { + if (meta.fileName === fileName) { + return meta; + } + } + return null; + } + + /** + * 根据表单编号和元数据类型过滤元数据 + * @param metaArr 元数据数组 + * @param frmCode 表单编号 + * @param type 元数据类型 + */ + public filterMetadataByFrmCodeAndType(metaArr: MetadataDto[], frmCode: string, type: MetadataType): MetadataDto[] { + const result: MetadataDto[] = []; + const codePrefix = `${frmCode}_frm_`; + for (const meta of metaArr) { + if (meta.type === type) { + const extendProperty = meta.extendProperty && JSON.parse(meta.extendProperty); + if (extendProperty && extendProperty['FormCode']) { + // 优先通过扩展属性判断 + if (extendProperty['FormCode'] === frmCode) { + result.push(meta); + } + } else { + // 如果不存在相关属性则通过编号前缀判断 + if (meta.code.startsWith(codePrefix)) { + result.push(meta); + } + } + } + } + return result; + } + + /** + * 获取去除表单编号前缀的元数据名称 + * @param meta 元数据(命令构件、Web构件等) + * @param frmCode 表单编号 + * @returns 去除表单编号前缀的元数据名称 + */ + public getMetadataNameWithoutFrmCode(meta: MetadataDto, frmCode: string): string { + const prefixToDelete = `${frmCode}_frm_`; + return meta.name && meta.name.startsWith(prefixToDelete) ? meta.name.substring(prefixToDelete.length) : meta.name; + } + + /** + * 获取元数据的路径 + * @param meta 元数据信息 + * @param projectBasePath 项目基础路径 + * @returns 元数据的路径 + */ + public getRelativePath(meta: MetadataDto, projectBasePath: string): string { + const absolutePath = meta.relativePath; + const pathArr = absolutePath.split(projectBasePath).filter((str: string) => !!str); + if (pathArr.length > 0) { + return projectBasePath + pathArr.pop() + "/" + meta.fileName; + } else { + return absolutePath + "/" + meta.fileName; + } + } + +} diff --git a/packages/mobile-designer/src/components/components/code-view/composition/handler/relevant-file.service.ts b/packages/mobile-designer/src/components/components/code-view/composition/handler/relevant-file.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..7a5efc304036175a8dc617c8a41c45ff94a622a6 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/handler/relevant-file.service.ts @@ -0,0 +1,57 @@ +import { RelevantFileGroup, getRelevantFilePath } from "../type/relevant-file"; +/** + * 关联文件配置 + * @remarks + * 注意: + * 1. 上方配置优先级高于下方,通过配置顺序实现贪婪匹配 + * 2. 此处的文件后缀需要带着前面的“.”符号 + */ +const RELEVANT_FILE: RelevantFileGroup[] = [ + { suffixes: [".ts", ".webcmp", ".webcmd"] } +]; +export class RelevantFileService { + /** + * 获取该文件的关联文件配置 + * @param path 文件路径 + * @returns 关联文件配置 + */ + private getRelevantFileGroup(path: string): RelevantFileGroup | null { + if (!path) { + return null; + } + // 从上至下依次遍历关联文件配置,如果存在与本文件相同的后缀,则找到关联文件组 + for (const fileGroup of RELEVANT_FILE) { + for (const suffix of fileGroup.suffixes) { + if (path.endsWith(suffix)) { + fileGroup.getRelevantFilePath = fileGroup.getRelevantFilePath ? fileGroup.getRelevantFilePath : getRelevantFilePath; + return fileGroup; + } + } + } + return null; + } + + /** + * 获取该文件的关联文件的路径集合(返回值包含入参) + * @param path 文件路径 + * @returns 关联文件路径集合 + */ + public getRelevantFilePaths(path: string): string[] | null { + const groupConfig = this.getRelevantFileGroup(path); + if (!groupConfig) { + return [path]; + } + const relPaths = [] as any; + for (const suffix of groupConfig.suffixes) { + if (!path.endsWith(suffix)) { + relPaths.push( + groupConfig.getRelevantFilePath ? groupConfig.getRelevantFilePath(path, suffix) : '' + ); + } else { + relPaths.push(path); + } + } + return relPaths; + } + +} diff --git a/packages/mobile-designer/src/components/components/code-view/composition/handler/tree-data-source.service.ts b/packages/mobile-designer/src/components/components/code-view/composition/handler/tree-data-source.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..09619e8a87d5d19894e612431491049c6a627de1 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/handler/tree-data-source.service.ts @@ -0,0 +1,213 @@ +import { IdService } from "../../../view-model-designer/method-manager/service/id.service"; +import { MetadataDto } from "../../../../types"; +import { NavTreeData, NavTreeNode } from "../type/tree"; +import { MetadataType } from "../type/metadata"; +import { NavDataUtilService } from "./nav-data-util.service"; +import { getValidId } from "../utils/valid"; +import { CommonFileNavTreeDataService } from "../type/nav/common-file"; + +/** + * 处理树绑定的数据 + */ +export class TreeDataSource extends CommonFileNavTreeDataService{ + private navDataUtilService; + private idService; + constructor() { + super(); + this.navDataUtilService = new NavDataUtilService(); + this.idService = new IdService(); + } + + enableLayeredLoading(): boolean { + return false; + } + + /** 已用id集合,用于防止生成的id重复 */ + private idSet: Set = new Set(); + + async getChildren(rootPath: string): Promise { + if (!rootPath) { + return new Promise((resolve, reject) => { + resolve([]); + }); + } + this.idSet = new Set(); + // 获取当前工程下的所有元数据 + const projectPath = this.navDataUtilService.getProjectPathFromFrmPath(rootPath); + const metas = await this.navDataUtilService.getProjectMetas(projectPath); + // 获取表单元数据描述 + const frmMeta = this.navDataUtilService.findMetaByFilename(rootPath, metas); + // 获取表单编号 + const frmCode = frmMeta?.code || ''; + // 根据表单编号过滤出当前表单下的所有命令构件元数据 + const webcmdMetaArr = this.navDataUtilService.filterMetadataByFrmCodeAndType(metas, frmCode, MetadataType.WebCommand); + const roots: NavTreeNode[] = []; + for (const webcmdMeta of webcmdMetaArr) { + roots.push( + this.getWebcmdNode(webcmdMeta, projectPath) + ); + } + // 对于每一个命令构件节点,查看其是否含有关联的服务构件节点 + const linkedWebcmps: MetadataDto[] = []; + for (const webcmdNode of roots) { + const webcmp = this.findWebcmpByFilename(metas, webcmdNode.data.metadataDto.fileName); + if (webcmp) { + linkedWebcmps.push(webcmp); + const webcmpNode = this.getWebcmpNode(webcmp, projectPath); + webcmdNode.children = [webcmpNode]; + } + } + // 可能存在属于表单,但是没有对应命令构件的服务构件 + const webcmpMetaArr = this.navDataUtilService.filterMetadataByFrmCodeAndType(metas, frmCode, MetadataType.WebComponent); + for (const webcmp of webcmpMetaArr) { + if (!linkedWebcmps.find(cmp => cmp.id === webcmp.id)) { + roots.push(this.getWebcmpNode(webcmp, projectPath)); + } + } + // 可能存在不属于表单的元数据,将它们单独列出来 + const nonFormCmds = this.filterNonFormCmp(metas, MetadataType.WebCommand); + for (const nonFormCmd of nonFormCmds) { + roots.push(this.getWebcmdNode(nonFormCmd, projectPath)); + } + const nonFormCmps = this.filterNonFormCmp(metas, MetadataType.WebComponent); + for (const nonFormCmp of nonFormCmps) { + roots.push(this.getWebcmdNode(nonFormCmp, projectPath)); + } + this.idSet = new Set(); + return roots; + } + + /** 获取命令构件节点 */ + private getWebcmdNode(webcmd: MetadataDto, projectPath: string): NavTreeNode { + const nodeData: NavTreeData = { + id: this.generateUniqueId(webcmd), + name: webcmd.fileName, + path: this.navDataUtilService.getRelativePath(webcmd, projectPath), + metadataDto: webcmd, + canOpen: true + }; + const cmdNode: NavTreeNode = { + id: nodeData.id || '', + data: nodeData, + children: [], + expanded: true + }; + return cmdNode; + } + + /** + * 寻找和webcmd同名的webdmp元数据文件 + * @param metas 元数据集合 + * @param filename webcmd的文件名 + * @returns webcmp元数据 + */ + private findWebcmpByFilename(metas: MetadataDto[], filename: string): MetadataDto | null { + const name = this.getFilenameWithoutSuffix(filename); + if (name) { + for (const meta of metas) { + if (meta.type !== MetadataType.WebComponent) { + continue; + } + const metaName = this.getFilenameWithoutSuffix(meta.fileName); + if (metaName === name) { + return meta; + } + } + } + return null; + } + + /** 通过元数据生成唯一标识 */ + private generateUniqueId(meta: MetadataDto): string { + const newId = getValidId(this.generateId(meta)); + let uniqueId = newId; + let suffix = 1; + while (this.idSet.has(uniqueId)) { + ++suffix; + uniqueId = `${newId}_${suffix}`; + } + this.idSet.add(uniqueId); + return uniqueId; + } + private generateId(meta: MetadataDto): string { + if (meta) { + return meta.relativePath + "/" + meta.fileName; + } else { + return this.idService.generate(); + } + } + + private getWebcmpNode(webcmp: MetadataDto, projectPath: string): NavTreeNode { + const nodeData: NavTreeData = { + id: this.generateUniqueId(webcmp), + name: webcmp.fileName, + path: this.navDataUtilService.getRelativePath(webcmp, projectPath), + metadataDto: webcmp, + canOpen: true + }; + const cmpNode: NavTreeNode = { + id: nodeData.id || '', + data: nodeData, + children: [], + expanded: true + }; + // 如果该webcmp节点的extendProperty的IsCommon为false,则追加ts代码文件节点 + const extendProperty = webcmp.extendProperty && JSON.parse(webcmp.extendProperty); + if (!!extendProperty && !extendProperty['IsCommon']) { + cmpNode.children = [this.getTsNode(cmpNode)]; + } + return cmpNode; + } + + private getTsNode(webcmpNode: NavTreeNode): NavTreeNode { + const nodeData: NavTreeData = { + id: this.generateUniqueId(webcmpNode.data.metadataDto) + ".ts", + name: this.changeFilenameSuffix(webcmpNode.data.name, '.ts'), + path: this.changeFilenameSuffix(webcmpNode.data.path, '.ts'), + canOpen: true + }; + const tsNode: NavTreeNode = { + id: nodeData.id || '', + data: nodeData, + children: [], + leaf: true + }; + return tsNode; + } + + /** 修改文件的后缀名,返回新的文件名字符串 */ + private changeFilenameSuffix(name: string, newSuffix: string): string { + const idx = name.lastIndexOf('.'); + if (idx < 0) { + return ''; + } + const prefix = name.substring(0, idx); + return prefix + newSuffix; + } + + /** 去除文件的后缀名,返回文件的名称前缀 */ + private getFilenameWithoutSuffix(filename: string): string { + if (!filename) { + return ''; + } + const idx = filename.lastIndexOf('.'); + if (idx >= 0) { + return filename.substring(0, idx); + } + return ''; + } + + private filterNonFormCmp(metas: MetadataDto[], type: MetadataType): MetadataDto[] { + // extendProperty为空,则不属于表单元数据 + const cmps = [] as any; + for (const meta of metas) { + if (meta.type === type) { + if (!meta.extendProperty) { + cmps.push(meta); + } + } + } + return cmps; + } + +} diff --git a/packages/mobile-designer/src/components/components/code-view/composition/type/code-outline.ts b/packages/mobile-designer/src/components/components/code-view/composition/type/code-outline.ts new file mode 100644 index 0000000000000000000000000000000000000000..1fa1b4f8234f9a35ec33b6c0ce08aeb9cc016e6b --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/type/code-outline.ts @@ -0,0 +1,66 @@ +export interface IParam { + /** 参数名 */ + code: string; + /** 参数类型 */ + type?: string; + /** 参数描述 */ + description?: string; +} +export interface IMethod { + /** 方法名 */ + code: string; + /** 访问权限 */ + accessibility?: "public" | "private" | "protected" | null; + /** 方法类型,ts独有属性 */ + kind?: "get" | "set" | "method" | "constructor"; + /** 方法概述 */ + name?: string; + /** 方法返回值类型 */ + type?: string; + /** 方法返回值描述 */ + returns?: string; + /** 方法描述 */ + description?: string; + /** 方法形参列表 */ + params?: IParam[]; +} +export interface IClass { + /** 类名 */ + code: string; + /** 是否导出,ts独有属性 */ + exported?: boolean; + /** 类概述 */ + name?: string; + /** 类描述 */ + description?: string; + /** 类的方法列表 */ + methods?: IMethod[]; +} + +/** + * 代码分析结果 + * @remarks 由代码编辑器分析得出,辅助设计器组件完成保存操作 + */ +export interface CodeAnalysisResult { + /** 代码文件内容 */ + content: string; + /** 如果代码具有类结构,则给出类的描述信息 */ + classes?: IClass[]; +} + +/** 代码大纲信息 */ +export interface CodeOutlineInfo { + /** 代码文件路径 */ + path: string; + /** 代码类结构信息,如果为空则表示不支持 */ + classes?: IClass[]; +} + +/** + * 代码大纲定位信息 + * @remarks 用于向代码编辑页发送定位请求时 + */ +export interface CodeLocationInfo { + className?: string; + methodName?: string; +} diff --git a/packages/mobile-designer/src/components/components/code-view/composition/type/editor-event.ts b/packages/mobile-designer/src/components/components/code-view/composition/type/editor-event.ts new file mode 100644 index 0000000000000000000000000000000000000000..745a08e6ce2b959244d0e12d6d0c4de4e3b826d2 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/type/editor-event.ts @@ -0,0 +1,89 @@ +/** + * 事件类别 + * @remarks 用于订阅或发起事件 + */ +export enum EditorEventType { + + /** + * 打开文件 + * @remarks + * 当用户双击导航树中的文件条目时,应该在右侧中心面板处打开一个编辑页面 + * 通过该事件通知控制器打开新的标签页,需传递一个文件路径 + */ + OpenFile = "OpenFile", + + /** + * 关闭文件 + * @remarks + * 当用户关闭文件时,对应的标签页被销毁,需要提前释放订阅事件等资源 + * 该事件由代码视图发出,由代码编辑页接收事件并自行释放资源 + * 参数:string - 即将关闭文件的路径 + */ + CloseFile = "CloseFile", + + /** + * 代码文件修改状态变更 + * @remarks + * 代码内容变更时,应该更新标签页状态(是否未保存) + * 参数:{ path: string; changed: boolean; } + */ + FileChanged = "FileChanged", + /** + * 设计器文件修改状态变更 + * @remarks + * 设计器元数据内容变更时,也应该更新标签页状态(是否未保存) + * 参数:{ path: string; changed: boolean; } + */ + DesignerFileChanged = "DesignerFileChanged", + + /** + * 代码大纲变化 + * @remarks + * 由代码编辑页面发送,代码视图接收到该事件后进行类导航数据的更新 + * 参数:{ path: string; classes?: IClass[]; } + */ + CodeOutlineChanged = "CodeOutlineChanged", + + /** + * 代码大纲定位请求 + * @remarks + * 由代码视图发送,代码编辑页接收后切换到代码编辑器并定位光标位置 + */ + CodeOutlineLocateRequest = "CodeOutlineLocateRequest", + + /** + * 标签页切换文件 + * @remarks + * 当用户通过页签切换当前标签页时,需要通过该事件通知左侧导航树也切换当前选中节点 + */ + TabSelected = "TabSelected", + + /** + * 切换关联文件 + * @remarks + * 当打开一个关联文件组时,其对应的多个文件共用一个标签页(编辑页面) + * 这个编辑页面中可能同时包含代码编辑器和设计器,而设计器也可能包含多个状态 + * 比如: + * .ts .webcmp .webcmd是一组关联文件,共用一个编辑页面 + * 其中,ts文件对应代码编辑器,webcmp和webcmd文件则分别对应了构件设计器的两个状态 + * 当用户双击这三个文件中的任一一个时,编辑页面应该切换到对应的状态 + * 通过该事件通知编辑页面,并传递一个文件路径参数以表明用户到底希望编辑页面显示什么状态 + */ + SwitchRelevantFile = "SwitchRelevantFile", + + /** + * 由代码视图组件代替编辑页面发送保存结果反馈等提示消息 + * @remarks + * 参数是一个NotifyOptions对象 + */ + NotifyMessage = "NotifyMessage", + + /** + * 外层框架通知事件队列更新 + * @remarks + * 通知特定的标签页,其外层通知队列有更新 + * 无负载 + */ + NotificationQueueUpdated = "NotificationQueueUpdated" + +}; diff --git a/packages/mobile-designer/src/components/components/code-view/composition/type/fields-getter.ts b/packages/mobile-designer/src/components/components/code-view/composition/type/fields-getter.ts new file mode 100644 index 0000000000000000000000000000000000000000..58bea25a1c0a468f0625929d9f86dbb00900dd3b --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/type/fields-getter.ts @@ -0,0 +1,20 @@ + +export interface FieldOption { + /** 字段编号 */ + code: string; + + /** 字段名称 */ + name: string; + + /** 是否必填 */ + required?: boolean | ((data: any) => boolean); + + /** 是否隐藏 */ + hide?: boolean | ((data: any) => boolean); + + /** 提示信息 */ + placeholder?: string; + + /** 校验字段合法性,返回错误信息 */ + validate?: (value: any) => string; + } \ No newline at end of file diff --git a/packages/mobile-designer/src/components/components/code-view/composition/type/file-item.ts b/packages/mobile-designer/src/components/components/code-view/composition/type/file-item.ts new file mode 100644 index 0000000000000000000000000000000000000000..32877e6caa2417c413f6e988a37eefeaddd93f33 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/type/file-item.ts @@ -0,0 +1,88 @@ +/** + * 文件条目 + * @remarks + * 描述了一个通过导航树打开的代码文件或者元数据文件(组) + * 关于关联文件: + * 关联文件是一组在业务上密切相关的文件,它们一般同时存在,可以通过路径来判断两个文件是否相关 + * 比如:.ts .webcmp .webcmd 就是一组关联文件 + * 一组关联文件共用一个标签页,依次双击打开一组关联文件中的每个文件,只会打开一个标签页 + * mainPath - 主文件:一组关联文件中最主要的文件,框架将会以主文件的路径作为参数打开一个标签页 + * curPath - 当前展示的文件:在导航树中双击一个关联文件,虽然不打开一个新的页签,但是应该在当前已打开的这个页签中进行切换操作 + * relPaths - 关联文件路径集合:该数组记录了这个关联文件组中所有文件的路径 + */ +export class FileItem { + + /** + * 主文件路径 + * @remarks 该字段禁止为空 + */ + mainPath: string; + + /** + * 当前展示的文件路径 + * @remarks 如果不存在关联文件则该字段与mainPath相等 + */ + curPath: string; + + /** + * 关联文件的路径集合 + * @remarks 该数组中包含mainPath,所以用该数组判断文件是否打开即可 + */ + relPaths: string[]; + + /** 代码文件是否变更 */ + isCodeFileDirty: boolean; + /** 代码文件关联的设计器的元数据文件是否变更 */ + isDesignerFileDirty: boolean; + + /** 变更是否未保存 */ + get isDirty(): boolean { + return this.isCodeFileDirty || this.isDesignerFileDirty; + } + + /** 标题,一般是路径中的文件名 */ + title: string; + + /** 文件图标类,一般根据文件后缀自动生成 */ + icon: string; + + constructor(mainPath: string, relPaths?: string[], curPath?: string, isCodeFileDirty?: boolean, title?: string, icon?: string) { + this.mainPath = mainPath; + this.relPaths = relPaths ? relPaths : []; + this.curPath = curPath || mainPath; + this.isCodeFileDirty = isCodeFileDirty ? true : false; + this.isDesignerFileDirty = false; + this.title = title ? title : FileItem.getTitleFromPath(this.curPath); + this.icon = icon ? icon : FileItem.getIconFromPath(this.curPath); + } + + /** + * 根据文件路径获取文件名 + * @param path 文件路径 + * @returns 文件名 + */ + public static getTitleFromPath(path: string): string { + if (!path || typeof path !== 'string') { + return "new file"; + } + // 截取路径中的文件名 + const idx = path.lastIndexOf('/'); // @todo 关于路径分隔符 + if (idx < 0 || idx + 1 === path.length) { + return path; + } + return path.substring(idx + 1); + } + + /** + * 根据文件路径获取文件图标类 + * @param path 文件路径 + * @returns 文件图标类 + */ + public static getIconFromPath(path: string): string { + if (!path || typeof path !== 'string') { + return ""; + } + return ""; // @todo 根据文件后缀生成对应的图标类 + } + +} diff --git a/packages/mobile-designer/src/components/components/code-view/composition/type/handler/editor-handler.ts b/packages/mobile-designer/src/components/components/code-view/composition/type/handler/editor-handler.ts new file mode 100644 index 0000000000000000000000000000000000000000..4f5a1e08ab0f5bfaa1475ddbe9bb80a663557188 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/type/handler/editor-handler.ts @@ -0,0 +1,27 @@ +/** + * 中央编辑器区域组件接口 + */ +export interface EditorHandler { + + /** + * 新建并打开文件,如果文件已存在则仅打开文件 + * @param path 文件路径 + * @param param 额外的查询参数,“id”已经被占用 + * @returns 是否成功(如果未配置打开方式则会导致失败) + */ + open(path: string, param?: { [key: string]: string }): boolean; + + /** + * 打开已有文件 + * @param path 文件路径 + * @returns 是否存在 + */ + show(path: string): boolean; + + /** + * 关闭文件 + * @param path 文件路径 + */ + close(path: string): void; + +} diff --git a/packages/mobile-designer/src/components/components/code-view/composition/type/handler/tabs-handler.ts b/packages/mobile-designer/src/components/components/code-view/composition/type/handler/tabs-handler.ts new file mode 100644 index 0000000000000000000000000000000000000000..621e01e960871905bb2c4c7127c6fe3c8006e1b9 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/type/handler/tabs-handler.ts @@ -0,0 +1,33 @@ +import { EventEmitter } from "@angular/core"; +import { Tab } from "../tab"; + +/** + * 标签页组件接口 + */ +export interface TabsHandler { + + /** 页签数据 */ + tabs: Tab[]; + + /** 页签选中事件 */ + selected: EventEmitter; + + /** 页签关闭事件 */ + beforeClose: EventEmitter; + + /** 根据id设置当前选中页签 */ + selectById(tabId: string): void; + + /** 新增一个页签 */ + addTab(tab: Tab, active?: boolean): void; + + /** 删除一个页签 */ + removeTab(tabId: string): void; + + /** 通过id获取页签数据 */ + getTab(id: string): Tab; + + /** 仅需调用一次,执行css样式的动态加载 */ + globalInit(): void; + +} diff --git a/packages/mobile-designer/src/components/components/code-view/composition/type/metadata.ts b/packages/mobile-designer/src/components/components/code-view/composition/type/metadata.ts new file mode 100644 index 0000000000000000000000000000000000000000..3763e9e0bac7189e7dbfd80b6a3811f73036f8f0 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/type/metadata.ts @@ -0,0 +1,15 @@ +/** + * 元数据类型 MetadataDto.type + */ +export enum MetadataType { + Form = "Form", + ResourceMetadata = "ResourceMetadata", + StateMachine = "StateMachine", + GSPViewModel = "GSPViewModel", + ExternalApi = "ExternalApi", + PageFlowMetadata = "PageFlowMetadata", + WebCommand = "WebCommand", + WebComponent = "WebComponent", + BEMgrComponent = "BEMgrComponent", + GSPBusinessEntity = "GSPBusinessEntity" +} diff --git a/packages/mobile-designer/src/components/components/code-view/composition/type/nav-panel.ts b/packages/mobile-designer/src/components/components/code-view/composition/type/nav-panel.ts new file mode 100644 index 0000000000000000000000000000000000000000..fbae8815d9ac2545c65eaec1048fb052bc0e7fe9 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/type/nav-panel.ts @@ -0,0 +1,142 @@ +// import { CommonFileNavTreeDataService } from "../nav-data/common-file"; +// import { ToolbarConfigService } from "../nav-data/tool-bar"; +// import { NavTreeNodeIconService } from "../nav-data/node-icon"; + +// /** +// * 导航面板配置 +// * @remarks +// * 由外部传入,定义了左侧导航面板是如何组织的 +// * 让使用者既可以配置导航面板的视图结构,又可以配置导航树的数据服务 +// */ +// export interface NavPanelConfig { + +// /** +// * 导航面板的id +// * @remarks 作为导航面板组件的id,需要保证全局唯一 +// */ +// id: string; + +// /** +// * 导航面板的标题 +// * @remarks 显示标题栏时必填 +// */ +// title?: string; + +// /** +// * 是否隐藏标题栏 +// * @remarks +// * 默认显示,如果标题栏隐藏则该面板永远展开,无法收折 +// * (如果隐藏标题栏,则位于其上的按钮工具栏也将被隐藏) +// */ +// hideTitleBar?: boolean; + +// /** +// * 仅当隐藏标题栏的情况下,主体内容的上边距 +// * @remarks +// * 如果隐藏标题栏,则其下的导航树组件应该有一个上边距,否则不美观,单位:px,默认:8 +// */ +// marginTopWhenHideTitleBar?: number; + +// /** +// * 导航树数据服务 +// * @remarks +// * 为该面板下的导航树组件提供节点数据 +// * 默认情况下,双击导航树节点会打开一个新的标签页,你也可以阻止该默认行为,实现其它的自定义交互逻辑 +// */ +// navTreeDataService?: CommonFileNavTreeDataService; + +// /** +// * 导航树节点图标类生成服务 +// * @remarks +// * 为导航树节点设置图标的css类 +// * 1. 当服务非空时,优先使用该服务指定节点图标的css类 +// * 2. 当服务为空时,如果navTreeDataService返回的树节点中的icon、expandedIcon、collapsedIcon字段均非空,则直接使用这三个字段的值 +// * 3. 如果服务为空,且节点中的图标相关字段也为空,则将使用默认的图标服务根据文件后缀名匹配图标 +// */ +// navTreeNodeIconService?: NavTreeNodeIconService; + +// /** +// * 导航面板工具栏配置 +// * @remarks 配置标题栏右侧的图标按钮组,如果隐藏标题栏则不显示 +// */ +// toolbarConfigService?: ToolbarConfigService; + +// /** +// * 是否主要导航树 +// * @remarks +// * 主要导航树会随着当前页签的变化而切换自己的当前选中节点 +// * 默认所有导航树都是主要导航树 +// */ +// isMainNavTree?: boolean; + +// /** +// * 数据为空时的占位消息 +// * @remarks 导航树数据为空时显示,默认为:暂无数据 +// */ +// emptyMessage?: string; + +// /** +// * 导航树搜索栏配置 +// * @remarks 支持对导航树节点数据进行搜索过滤 +// */ +// searchBarConfig?: NavTreeSearchBarConfig; + +// /** +// * 是否禁用搜索服务 +// * @remarks +// * 如果导航树的节点较多且刷新频繁,当永远不启用搜索栏时应当禁用搜索服务以提高性能 +// * 默认不会禁用搜索服务(推荐在永远不会显示搜索栏时设置本字段为true) +// */ +// disableSearchService?: boolean; + +// /** 是否启用虚拟列表,默认不启用 */ +// virtualized?: boolean; + +// /** +// * 主体内容模板 +// * @remarks +// * 默认使用导航树组件作为导航面板的主体内容,如果设置此字段,将替换默认的导航树组件 +// * 此种模式下,用户需要自行实现相关的交互逻辑(导航面板不再提供任何默认实现) +// * 可以通过代码视图组件上的getEditorController方法获取代码视图控制器实例,并以之实现对代码视图中各个部件的控制 +// */ +// templateRef?: TemplateRef; + +// /** +// * 主体内容模板的上下文 +// * @remarks 参考TemplateRef的context参数 +// */ +// templateRefContext?: any; + +// } + +/** + * 导航树搜索栏配置 + * @remarks 支持对导航树节点数据进行搜索过滤 + */ +export interface NavTreeSearchBarConfig { + + /** + * 是否启用搜索栏 + * @remarks 默认不启用 + */ + enable: boolean; + + /** + * 搜索框为空时的占位文本 + * @remarks 默认为“搜索” + */ + placeholder?: string; + + /** + * 是否显示“全部收折/展开”按钮 + * @remarks 默认显示该按钮,启用分层加载时应该隐藏该按钮 + */ + showToggleButton?: boolean; + + /** + * 搜索结果为空时的提示信息 + * @remarks 默认为“搜索结果为空” + */ + emptySearchResultTip?: string; + +} diff --git a/packages/mobile-designer/src/components/components/code-view/composition/type/nav/common-file.ts b/packages/mobile-designer/src/components/components/code-view/composition/type/nav/common-file.ts new file mode 100644 index 0000000000000000000000000000000000000000..52df7101a094a6f72a6074a4b373b924e77b31a0 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/type/nav/common-file.ts @@ -0,0 +1,100 @@ +import { EditorController } from "../../handler/editor.controller"; +import { escapeTextForBrowser } from "../../utils/escape"; +import { getValidId } from "../../utils/valid"; +import { NavTreeNode } from "../tree"; +const NODE_CONTENT_FIELD = 'CodeViewNav--ContentInnerHTML'; +/** + * 通用文件导航树 - 数据服务基类 + */ +export class CommonFileNavTreeDataService { + constructor() { } + + /** + * 刷新导航树数据 + * @remarks 子类可以通过调用本方法实现导航树刷新(afterPropertySet被调用后本属性可用) + */ + protected refreshNavTreeCallback?: () => void; + + /** + * 代码视图控制器实例 + * @remarks + * 提供导航树服务对标签页以及其它部件的控制能力(afterPropertySet被调用后本属性可用) + * afterPropertySet、getChildren、handleDblClick被调用时,该属性保证非空 + * 编写预置模板时该属性无效(preset-panel,直接通过依赖注入获取控制器实例即可) + */ + protected editorController?: EditorController; + + /** + * 属性设置完成后回调 + * @remarks + * 当editorController、refreshNavTreeCallback属性设置完成后本方法被调用 + * 如果需要在服务初始化时通过控制器的事件总线订阅一些消息,你需要覆盖本方法(本方法被调用之前,控制器实例可能为空) + */ + afterPropertySet(): void { } + + /** + * 是否启用分层加载 + * @remarks 如果不启用分层加载,则认为一次加载完所有节点 + */ + enableLayeredLoading(): boolean { + return false; + } + + /** + * 获取导航树的节点数据 + * @param rootPath 该导航树的根节点路径,例如:如果该导航树是表单元数据导航树,则该路径为表单元数据的路径 + * @param curPath 当前正要展开的节点的路径,启用分层加载时将会传递此参数 + */ + getChildren(rootPath?: string, curPath?: string): Promise { + return Promise.resolve([]); + } + + /** + * 树节点双击事件处理回调 + * @remarks + * 如果返回true则将打开节点的path对应的页签,如果返回false则不再进行其它处理 + * 默认将打开/切换页签,覆盖本方法以实现自定义双击事件 + * @param node 树节点 + * @returns 是否继续执行打开文件操作 + */ + handleDblClick(node: NavTreeNode): boolean { + return true; + } + public async getChildrenWithValidId(rootPath = ''): Promise { + return this.getChildren(rootPath).then((data) => { + const nodes = data; + for (const node of nodes) { + this.traverseTree(node, (n) => { + n.id = getValidId(n.id); + if (!n.data) { + return; + } + n.data.id = n.id; + const name = n.data && n.data.name || ''; + n.data[NODE_CONTENT_FIELD] = escapeTextForBrowser(name); + }); + } + return nodes; + }); + } + + /** + * 递归遍历树 + * @param node 树节点 + * @param handleNode 处理每一个树节点 + */ + private traverseTree( + node: NavTreeNode, + handleNode: (node: NavTreeNode) => void + ): void { + if (!node) { + return; + } + handleNode(node); + if (node.children && node.children.length > 0) { + for (const child of node.children) { + this.traverseTree(child, handleNode); + } + } + } +} diff --git a/packages/mobile-designer/src/components/components/code-view/composition/type/nav/node-icon.ts b/packages/mobile-designer/src/components/components/code-view/composition/type/nav/node-icon.ts new file mode 100644 index 0000000000000000000000000000000000000000..b71343b2cd0145b8fa4224bcf96a32252019b500 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/type/nav/node-icon.ts @@ -0,0 +1,21 @@ +import { NavTreeNode } from "../interface/tree"; + +/** + * 导航树节点图标类生成服务 + */ +export abstract class NavTreeNodeIconService { + + /** + * 设置导航树节点的图标(css类) + * @remarks + * 每次都重新为整棵树设置图标 + * 如果需要为导航树使用自定义的图标,你需要在本方法设置节点(NavTreeNode)中的如下字段: + * 1. icon - 作为叶子节点时的图标 + * 2. expandedIcon - 作为非叶子节点,展开状态下的图标 + * 3. collapsedIcon - 作为非叶子节点,收折状态下的图标 + * 一般情况下,三个字段的值应该是一致的,除非节点展开和收折状态需要使用不同的图标 + * @param nodes 导航树的根节点数组 + */ + abstract setIconProp(nodes: NavTreeNode[]): void; + +} diff --git a/packages/mobile-designer/src/components/components/code-view/composition/type/placeholder.ts b/packages/mobile-designer/src/components/components/code-view/composition/type/placeholder.ts new file mode 100644 index 0000000000000000000000000000000000000000..946490f8b7567295f222e283db97156c1db17e6c --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/type/placeholder.ts @@ -0,0 +1,12 @@ +/** + * 代码视图快捷键描述 + * @remarks 用于展示在空状态的快捷键列表中 + */ +export interface ShortcutKeyDesc { + /** 快捷键的名称 */ + name: string; + /** 快捷键的组成 */ + keys: string[]; + /** 快捷键的额外描述,用于设置title属性 */ + title?: string; +} diff --git a/packages/mobile-designer/src/components/components/code-view/composition/type/relevant-file.ts b/packages/mobile-designer/src/components/components/code-view/composition/type/relevant-file.ts new file mode 100644 index 0000000000000000000000000000000000000000..9ab5b61c1f19e08738ce95a374794c9d20953476 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/type/relevant-file.ts @@ -0,0 +1,37 @@ +/** + * 关联文件组 + * @remarks 记录了一组关联的文件,请查看readme文档 + */ +export interface RelevantFileGroup { + + /** + * 关联文件的后缀集合 + * @remarks + * 需要带着“.” + * 该数组中的第一个后缀为该关联文件组中的“主文件” + * 当用户双击导航树中的一个文件条目,如果该文件条目存在关联文件,则框架以该关联文件组的主文件的url打开一个标签页 + */ + suffixes: string[]; + + /** 通过一个文件的路径获取其它关联文件的路径 */ + getRelevantFilePath?(path: string, suffix: string): string; + +} + +/** + * 根据文件路径获取其关联文件的路径(缺省时的选择,仅替换文件后缀) + * @param path 文件路径 + * @param suffix 关联文件后缀 + * @returns 关联文件路径 + */ +export const getRelevantFilePath = (path: string, suffix: string): string => { + if (!path || !suffix) { + return null; + } + // 注意,此处采用第一个“.”符号,获取最长的文件后缀名 + const lastDotIdx = path.indexOf('.'); + if (lastDotIdx > 0) { + return path.substring(0, lastDotIdx) + suffix; + } + return null; +}; diff --git a/packages/mobile-designer/src/components/components/code-view/composition/type/tab.ts b/packages/mobile-designer/src/components/components/code-view/composition/type/tab.ts new file mode 100644 index 0000000000000000000000000000000000000000..153cd265ef21cf2a67c9b6dc4dcf61a39ec8fd90 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/type/tab.ts @@ -0,0 +1,43 @@ +import { FileItem } from "./file-item"; + +/** + * 标签页 + * @remarks 标签页数据由控制器实例化后提供给标签页组件 + */ +export class CodeTab { + + /** 标签标识,一般为路径 */ + id: string; + + /** 标签标题 */ + title: string; + + /** 标签图标类 */ + icon: string; + + /** 是否为当前tab */ + active: boolean | undefined; + + /** 是否启用关闭功能 */ + removable = true; + + /** 变更是否未保存 */ + isDirty = false; + + constructor(id: string, title: string, icon = "", removable = true) { + this.id = id; + this.title = title; + this.icon = icon; + this.removable = removable; + } + /** + * 更新标题和图标 + * @param title 标题 + * @param icon 图标 + */ + public updateTitle(title: string, icon?: string): void { + this.title = title; + this.icon = icon || this.icon; + } + +} diff --git a/packages/mobile-designer/src/components/components/code-view/composition/type/tool-bar.ts b/packages/mobile-designer/src/components/components/code-view/composition/type/tool-bar.ts new file mode 100644 index 0000000000000000000000000000000000000000..27eb8a927a40c835e57ba5f71d52d2452518addc --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/type/tool-bar.ts @@ -0,0 +1,24 @@ +/** + * 工具栏条目 + * @remarks 导航面板标题栏右侧的图标按钮组 + */ +export interface TabToolbarItem { + + /** 工具栏按钮的唯一标识 */ + id: string; + + /** 点击按钮后要执行的命令*/ + command: string; + + /** 文本提示信息 */ + tooltip?: string; + + /** 显示的css图标类 */ + icon?: string; + + /** 通过innerHTML加载svg图标,本字符串是svg图标串 */ + svgIcon?: string; + /** 当svgIcon不为空时,使用svgClass而不是icon */ + svgClass?: string; + +} diff --git a/packages/mobile-designer/src/components/components/code-view/composition/type/tree.ts b/packages/mobile-designer/src/components/components/code-view/composition/type/tree.ts new file mode 100644 index 0000000000000000000000000000000000000000..d64a84edc0256e4aa7a41a44fc3dd20f80d2275d --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/type/tree.ts @@ -0,0 +1,73 @@ + +/** + * 一般文件导航树节点数据 + */ +export interface NavTreeData { + + /** 节点的唯一标识,将与NavTreeNode中的id相同,无需传入 */ + id?: string; + + /** 用于展示的节点名称 */ + name: string; + + /** 节点路径,是判别文件打开方式的最重要依据 */ + path: string; + + /** 节点是否可被双击打开,默认不能打开 */ + canOpen?: boolean; + + /** + * 节点图标的附加信息 + * @remarks 可以传入一个类型标识字符串,帮助图标服务判断该节点应该采用哪一个图标 + */ + icon?: string; + + /** 对应的元数据描述 MetadataDto*/ + metadataDto?: any; + + /** 节点的附加信息 */ + appendInfo?: any; + +} + +/** + * 一般文件导航树节点 + * @remarks 提供给导航树组件的节点数据 + */ +export interface NavTreeNode { + + /** + * 节点的唯一标识,不可为空 + * @remarks + * 由大小写英文字母、数字、中划线、下划线组成 + * 其它字符将被自动过滤掉,请确保id的唯一性 + * 希望id是尽量不变的,对于同一条数据,刷新后其id应该保持不变(否则选中状态将失效) + */ + id: string; + + /** 节点关联的数据 */ + data: NavTreeData; + + /** 子节点 */ + children?: NavTreeNode[]; + + /** 是否为叶子节点,默认为非叶子节点,主要用于分层加载时 */ + leaf?: boolean; + + /** 是否展开,默认不展开 */ + expanded?: boolean; + + /** 是否允许选中,默认允许 */ + selectable?: boolean; + + /** 节点展开图标 */ + expandedIcon?: string; + /** 节点收折图标 */ + collapsedIcon?: string; + /** 节点叶子图标 */ + icon?: string; + + /** 本节点的父节点(运行时自动生成,传入无效) */ + parent?: NavTreeNode; +} + diff --git a/packages/mobile-designer/src/components/components/code-view/composition/utils/escape.ts b/packages/mobile-designer/src/components/components/code-view/composition/utils/escape.ts new file mode 100644 index 0000000000000000000000000000000000000000..83d7e86129e2dc1c4ce734fa7102de6936bac2a0 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/utils/escape.ts @@ -0,0 +1,72 @@ +const matchHtmlRegExp = /["'&<>]/; + +/** + * Escapes special characters and HTML entities in a given html string. + * + * @param text HTML string to escape for later insertion + * @return An escaped string. + */ +export function escapeHtml(text: string): string { + const str = '' + text; + const match = matchHtmlRegExp.exec(str); + + if (!match) { + return str; + } + + let escape: any = void 0; + let html = ''; + let lastIndex = 0; + let { index } = match; + for (; index < str.length; index++) { + switch (str.charCodeAt(index)) { + case 34: + // " + escape = '"'; + break; + case 38: + // & + escape = '&'; + break; + case 39: + // ' + escape = '''; // modified from escape-html; used to be ''' + break; + case 60: + // < + escape = '<'; + break; + case 62: + // > + escape = '>'; + break; + default: + continue; + } + + if (lastIndex !== index) { + html += str.substring(lastIndex, index); + } + + lastIndex = index + 1; + html += escape; + } + return lastIndex !== index ? html + str.substring(lastIndex, index) : html; +} +// end code copied and modified from escape-html + +/** + * Escapes text to prevent scripting attacks. + * + * @param text Text value to escape. + * @return An escaped string. + */ +export function escapeTextForBrowser(text: string | boolean | number): string { + if (typeof text === 'boolean' || typeof text === 'number') { + // this shortcircuit helps perf for types that we know will never have + // special characters, especially given that this function is used often + // for numeric dom ids. + return '' + text; + } + return escapeHtml(text); +} diff --git a/packages/mobile-designer/src/components/components/code-view/composition/utils/valid.ts b/packages/mobile-designer/src/components/components/code-view/composition/utils/valid.ts new file mode 100644 index 0000000000000000000000000000000000000000..d4c1ed5046c80542457b8921add973aa4575b862 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/composition/utils/valid.ts @@ -0,0 +1,32 @@ +/** + * 去除标识串中作为id的非法字符,仅保留大小写英文字母、数字、中划线、下划线 + * @param id 标识串 + */ +export function getValidId(id: string): string { + return id.split('').filter((char) => { + const regExp = /^[0-9a-zA-Z-_]{1}$/g; + return regExp.test(char); + }).join(''); +} +/** + * 编号是否合法 + * @remarks 编号应由大小写英文字母、数字、下划线、$符号构成,不能由数字开头 + * @param code 编号 + * @returns 错误提示 + */ +export function checkCode(code: string): string { + const errorTip = "应由大小写英文字母、数字、下划线、$符号构成,不能由数字、下划线开头,且不能以_结尾"; + const regExp = /^[A-Za-z$][A-Za-z0-9_$]*(?, default: [] }, +} as Record; + +export type CodeTabsProps = ExtractPropTypes; + diff --git a/packages/mobile-designer/src/components/components/code-view/props/code-view.props.ts b/packages/mobile-designer/src/components/components/code-view/props/code-view.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..12526de34ebffa585bc28ecc8698605a8ca9b7d6 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/props/code-view.props.ts @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { ExtractPropTypes } from 'vue'; + +export const codeViewProps = { + entryFilePath: { type: String, default: '' }, + usePresetConfigs: { type: Boolean, default: true }, + /** + * 保存全部时直接反馈保存结果 + * @remarks + * 右上角的“保存”按钮即为保存全部按钮,当点击该按钮时应该同时保存代码视图和外层的表单或BE设计器 + * 默认应该由外层的设计器组件通过接收saveAll事件的参数,统一地反馈保存结果 + * 当保存全部时,不推荐通过本组件直接反馈结果,因为设计器也应该反馈结果,导致弹出多条反馈信息 + */ + directlyNotifySaveAllResults: { type: Boolean, default: false }, +} as Record; + +export type CodeViewProps = ExtractPropTypes; + diff --git a/packages/mobile-designer/src/components/components/code-view/props/editor-panels.props.ts b/packages/mobile-designer/src/components/components/code-view/props/editor-panels.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..d52366d8ab843899815236ca352341fe27e0c6a7 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/props/editor-panels.props.ts @@ -0,0 +1,23 @@ +/** + * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { ExtractPropTypes, PropType } from 'vue'; + +export const editorPanelsProps = { + eventBusId: { type: String, default: '' } +} as Record; + +export type EditorPanelsProps = ExtractPropTypes; + diff --git a/packages/mobile-designer/src/components/components/code-view/props/fields-getter.props.ts b/packages/mobile-designer/src/components/components/code-view/props/fields-getter.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..3e56c6b4c6cef53867ef1bb5464d839810a14a8f --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/props/fields-getter.props.ts @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { ExtractPropTypes, PropType } from 'vue'; +import { FieldOption } from '../composition/type/fields-getter'; + +export const fieldsGetterProps = { + fields: { type: Object as PropType>, default: [] }, + /** 点击确定按钮的回调函数 */ + resolveFunc: { type: Object as PropType<(value: any) => void>, default: (value = null) => { } }, + /** 点击取消按钮的回调函数 */ + rejectFunc: { type: Object as PropType<(reason: any) => void>, default: (reason = null) => { } }, + +} as Record; + +export type FieldsGetterProps = ExtractPropTypes; + diff --git a/packages/mobile-designer/src/components/components/code-view/props/nav-tree.props.ts b/packages/mobile-designer/src/components/components/code-view/props/nav-tree.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..f12b0704411211726375f30641a35097be0dffd3 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/props/nav-tree.props.ts @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { ExtractPropTypes} from 'vue'; +export const navTreeProps = { + entryFilePath: { type: String, default: '' }, +} as Record; + +export type NavTreeProps = ExtractPropTypes; + diff --git a/packages/mobile-designer/src/components/components/code-view/props/view-iframe.props.ts b/packages/mobile-designer/src/components/components/code-view/props/view-iframe.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..66f7f8223a89d5268bf78a98656ea4a3cb965e80 --- /dev/null +++ b/packages/mobile-designer/src/components/components/code-view/props/view-iframe.props.ts @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { ExtractPropTypes, PropType } from 'vue'; + +export const viewIframeProps = { + url: { type: String, default: '' }, + handleLoad: { type: Object as PropType<(iframeElement: HTMLIFrameElement) => void>, default: (iframeElement) => { } } +} as Record; + +export type ViewIframeProps = ExtractPropTypes; + diff --git a/packages/mobile-designer/src/components/components/entity-tree-view/components/entity-tree-view.component.tsx b/packages/mobile-designer/src/components/components/entity-tree-view/components/entity-tree-view.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..cbbffff34b161b6a8fdf2592d3b2b7fef29783b2 --- /dev/null +++ b/packages/mobile-designer/src/components/components/entity-tree-view/components/entity-tree-view.component.tsx @@ -0,0 +1,141 @@ +/** + * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { defineComponent, inject, ref, SetupContext, watch, nextTick } from 'vue'; +import { FButton } from '@farris/ui-vue/components'; +import { FSearchBox } from "@farris/ui-vue/components"; +import { FTreeView } from '@farris/ui-vue/components'; +import { UseEntityTreeData } from '../composition/use-entity-tree-data'; +import { entityTreeProps, EntityTreeProps } from './entity-tree-view.props'; +import { useUpdateEntitySchema } from '../composition/use-update-entity-schema'; +import { UseControlCreator, UseDesignViewModel, UseFormSchema, UseSchemaService } from '../../../../components/types'; +import { cloneDeep } from 'lodash-es'; +import '../composition/entity-tree-view.css'; +import './entity-tree-view.scss'; +import { RowOptions, VisualData } from '@farris/ui-vue/components'; +import { FLoadingService } from '@farris/ui-vue/components'; + +export default defineComponent({ + name: 'FEntityTreeView', + props: entityTreeProps, + emits: ['entityUpdated'] as (string[] & ThisType) | undefined, + setup(props: EntityTreeProps, context: SetupContext) { + const entityTreeRef = ref(); + const dragularCompostion = ref(props.dragula); + const useFormSchema: any = inject('useFormSchema'); + const { treeViewData, resolveEntityTreeData, assignExpandState, setTreeDraggable, appendTreeToDragulaContainer } = UseEntityTreeData(useFormSchema); + const schemaService = inject('schemaService') as UseSchemaService; + const designViewModelUtils = inject('designViewModelUtils') as UseDesignViewModel; + const controlCreatorUtils = inject('controlCreatorUtils') as UseControlCreator; + const useUpdateEntitySchemaComposition = useUpdateEntitySchema(schemaService, useFormSchema, designViewModelUtils, controlCreatorUtils, context); + const loadingService: FLoadingService | any = inject('FLoadingService'); + + /** 原始实体数据 */ + const entityData = ref(props.data.module?.entity); + + /** 树节点图标 */ + const treeNodeIconsData = { + fold: 'f-icon f-icon-file-folder-close text-primary mr-1', + unfold: 'f-icon f-icon-file-folder-open text-primary mr-1', + leafnodes: 'f-icon f-icon-preview mr-1' + }; + + /** 获取树表绑定数据 */ + function getTreeViewData() { + if (!entityData.value) { + return; + } + const oldTreeViewData = cloneDeep(treeViewData.value); + treeViewData.value = []; + const mainEntity = entityData.value[0].entities[0]; + resolveEntityTreeData(mainEntity, 0, null); + + assignExpandState(treeViewData.value, oldTreeViewData); + } + + /** 刷新实体树 */ + function refreshEntityTree() { + getTreeViewData(); + if (entityTreeRef.value && entityTreeRef.value.updateDataSource) { + entityTreeRef.value.updateDataSource(treeViewData.value); + + nextTick(() => { + setTreeDraggable(); + }); + } + } + function onClick(payload: MouseEvent) { + useUpdateEntitySchemaComposition.synchronizeFromViewObject(loadingService); + } + + context.expose({ refreshEntityTree }); + + getTreeViewData(); + + // 配置行样式、行收折等特性 + const rowOptions: Partial = { + customRowStyle: (dataItem: any) => { + return { + 'occupied': dataItem?.isOccupied, + 'no-drag': !dataItem?.draggable, + 'drag-copy': dataItem?.draggable, + [`id=${dataItem.id}`]: true + }; + }, + customRowStatus: (visualData: VisualData) => { + if (visualData.collapse === undefined) { + visualData.collapse = visualData.raw.collapse; + } + return visualData; + } + }; + + watch( + () => props.dragula, + (newValue: any) => { + dragularCompostion.value = newValue; + if (dragularCompostion.value?.getDragulaInstance) { + appendTreeToDragulaContainer(dragularCompostion.value.getDragulaInstance()); + } + } + ); + + function onTreeNodeExpanded() { + nextTick(() => { + setTreeDraggable(); + }); + } + function renderHeader() { + return
+ {/* */} +
+ {/* + */} + +
+
; + } + + return () => { + return
+ + {{ header: renderHeader }} + +
; + }; + } +}); diff --git a/packages/mobile-designer/src/components/components/entity-tree-view/components/entity-tree-view.props.ts b/packages/mobile-designer/src/components/components/entity-tree-view/components/entity-tree-view.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..20d9236e70e5d88ac33c2f9d13ef6a4b749c23cf --- /dev/null +++ b/packages/mobile-designer/src/components/components/entity-tree-view/components/entity-tree-view.props.ts @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { ExtractPropTypes } from 'vue'; + +export const entityTreeProps = { + /** 表单schema */ + data: { type: Object, default: [] }, + /** 拖拽框架 */ + dragula: { type: Object } + +} as Record; + +export type EntityTreeProps = ExtractPropTypes; diff --git a/packages/mobile-designer/src/components/components/entity-tree-view/components/entity-tree-view.scss b/packages/mobile-designer/src/components/components/entity-tree-view/components/entity-tree-view.scss new file mode 100644 index 0000000000000000000000000000000000000000..0e161e53b83bb73bac5bda56483be0a26ebd05dc --- /dev/null +++ b/packages/mobile-designer/src/components/components/entity-tree-view/components/entity-tree-view.scss @@ -0,0 +1,17 @@ +.designer-schema-tree { + .designer-schema-tree-header { + // display: flex; + display: inline-block; + position: absolute; + right: 6px; + top: 4px; + + .toolbar-action { + color: rgb(199, 205, 220); + background: #0000; + height: 100%; + width: 26px; + padding: 0 !important; + } + } +} \ No newline at end of file diff --git a/packages/mobile-designer/src/components/components/entity-tree-view/composition/entity-tree-view.css b/packages/mobile-designer/src/components/components/entity-tree-view/composition/entity-tree-view.css new file mode 100644 index 0000000000000000000000000000000000000000..b67b0b5a81db8ddcc02ebebd4bf7f7d8c0fd3603 --- /dev/null +++ b/packages/mobile-designer/src/components/components/entity-tree-view/composition/entity-tree-view.css @@ -0,0 +1,31 @@ +.designer-schema-tree { + display: block; + height: 100%; + color: #212529 !important; + background: #fcfdff; + padding-left: 4px; +} + +.designer-schema-tree .fv-grid { + height: 100% !important; +} + +.designer-schema-tree .fv-grid .fv-grid-content { + background: #fcfdff !important; +} + +.designer-schema-tree .fv-grid .fv-grid-data { + overflow: auto; +} + +.designer-schema-tree .fv-grid .fv-grid-row-selected { + border-radius: 10px; +} + +.designer-schema-tree .fv-grid .fv-grid-row-hover { + border-radius: 10px; +} + +.designer-schema-tree .fv-grid .fv-grid-row.occupied .f-icon-preview { + color: #2a87ff !important; +} \ No newline at end of file diff --git a/packages/mobile-designer/src/components/components/entity-tree-view/composition/use-entity-tree-data.ts b/packages/mobile-designer/src/components/components/entity-tree-view/composition/use-entity-tree-data.ts new file mode 100644 index 0000000000000000000000000000000000000000..ef66b45f4d3c911b6b60ae6e5e65502579697f6a --- /dev/null +++ b/packages/mobile-designer/src/components/components/entity-tree-view/composition/use-entity-tree-data.ts @@ -0,0 +1,190 @@ +import { FormSchemaEntity, FormSchemaEntityField, FormSchemaEntityField$Type, UseFormSchema } from "../../../types"; +import { ref } from 'vue'; + +export function UseEntityTreeData(useFormSchema: UseFormSchema) { + + /** 树表绑定数据 */ + const treeViewData: any = ref([]); + + function getViewModelFieldsByEntity(entityPath: string): Map { + const fieldsMap = new Map(); + if (!useFormSchema) { + return fieldsMap; + } + const viewModels = useFormSchema.getViewModels(); + /** 记录每个字段出现了多少次 */ + const fieldsCountingMap = new Map(); + + // 可能多个视图模型绑定同一个实体 + const matchingViewModels = viewModels.filter(viewModel => viewModel.bindTo === entityPath); + matchingViewModels.forEach(viewModel => { + const component = useFormSchema.getComponentByViewModelId(viewModel.id); + if (!component || !viewModel.fields?.length) { + return; + } + + viewModel.fields.forEach(field => { + const count = fieldsCountingMap.has(field.id) ? (fieldsCountingMap.get(field.id) || 0) + 1 : 1; + fieldsCountingMap.set(field.id, count); + }); + }); + fieldsCountingMap.forEach((count, id) => { + fieldsMap.set(id, true); + }); + return fieldsMap; + } + /** + * 将实体内的字段组装为树结构 + */ + function resolveFieldNodesInEntity(fields: FormSchemaEntityField[], layer: number, parentNode: any, treeData: any[] = [], occupiedFieldsMap: Map) { + fields.forEach(field => { + + const fieldTreeData = { + data: field, + id: field.id, + name: field.name, + layer, + parent: parentNode && parentNode.id, + hasChildren: false, + isOccupied: occupiedFieldsMap?.has(field.id), + collapse: false, + draggable: true + }; + treeData.push(fieldTreeData); + // 关联表字段 / UDT字段 + if (field.type && field.type.fields && field.type.fields.length > 0) { + fieldTreeData.hasChildren = true; + fieldTreeData.collapse = true; + fieldTreeData.draggable = false; + resolveFieldNodesInEntity(field.type.fields, layer + 1, field, treeData, occupiedFieldsMap); + } + }); + } + + /** + * 组装实体树绑定数据 + */ + function resolveEntityTreeData(entity: FormSchemaEntity, layer: number, parentNode: any, entityPath: string = '/') { + const occupiedFieldsMap = getViewModelFieldsByEntity(entityPath); + const entityTreeData = { + data: entity, + id: entity.id, + name: entity.name, + nodeType: 'entity', + layer, + parent: parentNode && parentNode.id, + hasChildren: true, + entityPath, + collapse: false, + draggable: true + }; + treeViewData.value.push(entityTreeData); + + if (entity.type && entity.type.fields && entity.type.fields.length > 0) { + resolveFieldNodesInEntity(entity.type.fields, layer + 1, entity, treeViewData.value, occupiedFieldsMap); + } + + if (entity.type.entities && entity.type.entities.length > 0) { + const childentityTreeData = { + id: `childEntity_${entity.id}`, + name: '子表', + layer: layer + 1, + parent: entity.id, + hasChildren: true, + collapse: false, + draggable: false + }; + treeViewData.value.push(childentityTreeData); + + entity.type.entities.forEach((childEntity: any) => { + const childEntityPath = `${entityPath === '/' ? '' : entityPath}/${childEntity.label}`; + resolveEntityTreeData(childEntity, layer + 2, childentityTreeData, childEntityPath); + + }); + } + } + /** + * 刷新实体树时保留上次的树节点展开状态 + * @param currentTreeData 新的treeData + * @param oldTreeData 旧的treeData + */ + function assignExpandState(currentTreeData: any[], oldTreeData: any[]) { + currentTreeData.map(currentTreeNode => { + const oldTreeNode = oldTreeData.find(oldData => oldData.id === currentTreeNode.id); + if (oldTreeNode) { + currentTreeNode.collapse = oldTreeNode['__fv_collapse__']; + } + }); + } + /** + * 将树表body节点添加到拖拽框架 + */ + function appendTreeToDragulaContainer(dragulaInstance: any) { + if (!dragulaInstance) { + return; + } + const entityTreeElement = document.querySelector('.designer-schema-tree'); + if (!entityTreeElement) { + return; + } + dragulaInstance.containers = dragulaInstance.containers.filter( + (element: HTMLElement) => !element.className.includes('.fv-grid-data') + ); + + const entityTreeBody = entityTreeElement.querySelector('.fv-grid-data'); + if (entityTreeBody) { + dragulaInstance.containers.push(entityTreeBody); + } + } + /** + * 为实体树行节点添加字段信息,方便后续拖拽时获取字段/实体表信息 + */ + function addDraggableClassToGridRow(entityTreeBody: HTMLElement) { + Array.from(entityTreeBody.children).forEach(rowElement => { + const elementClassList = Array.from(rowElement.classList || []); + const idClass = elementClassList.find(className => className.startsWith('id=')); + if (!idClass) { + return; + } + const nodeId = idClass.replace('id=', ''); + const treeNode = treeViewData.value.find(nodeData => nodeData.id === nodeId); + + // 简单字段节点 + if (treeNode?.data?.$type === FormSchemaEntityField$Type.SimpleField) { + rowElement.setAttribute('data-sourceType', 'field'); + rowElement.setAttribute('data-fieldId', nodeId); + rowElement.setAttribute('data-category', 'input'); + } + + // 实体节点 + if (treeNode?.nodeType === 'entity') { + rowElement.setAttribute('data-sourceType', 'entity'); + rowElement.setAttribute('data-fieldId', nodeId); + rowElement.setAttribute('data-category', 'dataCollection'); + } + }); + } + /** + * 设置实体树可拖拽 + */ + function setTreeDraggable() { + const entityTreeElement = document.querySelector('.designer-schema-tree'); + if (!entityTreeElement) { + return; + } + const entityTreeBody = entityTreeElement.querySelector('.fv-grid-data') as HTMLElement; + if (!entityTreeBody) { + return; + } + // body节点不接收拖拽进来的内容 + if (!entityTreeBody.className.includes('no-drop')) { + entityTreeBody.className += ' no-drop'; + } + // 配置tr节点拖拽相关属性 + if (entityTreeBody.children && entityTreeBody.children.length) { + addDraggableClassToGridRow(entityTreeBody); + } + + } + return { resolveEntityTreeData, assignExpandState, setTreeDraggable, treeViewData, appendTreeToDragulaContainer }; +} diff --git a/packages/mobile-designer/src/components/components/entity-tree-view/composition/use-update-entity-schema.tsx b/packages/mobile-designer/src/components/components/entity-tree-view/composition/use-update-entity-schema.tsx new file mode 100644 index 0000000000000000000000000000000000000000..a704ddd80818802cc7da35751633cfde188a84c3 --- /dev/null +++ b/packages/mobile-designer/src/components/components/entity-tree-view/composition/use-update-entity-schema.tsx @@ -0,0 +1,197 @@ +import { inject, ref, SetupContext } from "vue"; +import { FMessageBoxService } from '@farris/ui-vue/components'; +import { F_MODAL_SERVICE_TOKEN, FModalService } from "@farris/ui-vue/components"; +import { FormSchema, FormSchemaEntity, FormSchemaEntityField, UseControlCreator, UseDesignViewModel, UseFormSchema, UseSchemaService } from "../../../types"; +import FDesignerChangeSet from '../../change-set/change-set.component'; +import { FLoadingService } from "@farris/ui-vue/components"; + +export function useUpdateEntitySchema( + schemaService: UseSchemaService, + useFormSchema: UseFormSchema, + designViewModelUtils: UseDesignViewModel, + controlCreatorUtils: UseControlCreator, + context: SetupContext +) { + const modalService: FModalService | null = inject(F_MODAL_SERVICE_TOKEN, null); + const modalInstance = ref(); + + /** + * 判断主对象ID是否变更 + */ + function mainEntitiyIdHasChanged(currentSchemaEntities: FormSchemaEntity[], newSchemaEntities: FormSchemaEntity[]) { + const currentMainEntity = currentSchemaEntities[0]; + const currentMainEntityId = currentMainEntity.id; + const newMainEntityId = newSchemaEntities[0].id; + return currentMainEntityId !== newMainEntityId; + } + + /** + * 旧表单升级:遍历schema字段 + */ + function recursiveField(oldField: FormSchemaEntityField, newField, formSchemaString: string): string { + if (!oldField || !newField) { + return formSchemaString; + } + if (oldField.$type === 'SimpleField') { + // 简单字段:原表单中所有的id全量替换为新schema字段的id + const regExp = new RegExp(oldField.id, 'g'); + formSchemaString = formSchemaString.replace(regExp, newField.id); + } else if (oldField.type.fields && oldField.type.fields.length > 0) { + // 复杂字段 + oldField.type.fields.forEach(f => { + const childField = newField.type.fields.find(n => n.originalId === f.originalId); + formSchemaString = recursiveField(f, childField, formSchemaString); + }); + } + return formSchemaString; + } + + /** + * 旧表单升级:遍历schema实体,原表单中所有的id全量替换为新schema字段的id + */ + function recursiveSchema( + currentSchemaEntities: FormSchemaEntity[], + newSchemaEntities: FormSchemaEntity[], + formSchemaString: string + ): string { + if (!currentSchemaEntities || currentSchemaEntities.length === 0 || !newSchemaEntities || newSchemaEntities.length === 0) { + return formSchemaString; + } + currentSchemaEntities.forEach(entity => { + const entityId = entity.id; + const newEntity = newSchemaEntities.find(e => e.id === entityId); + if (!newEntity) { + return; + } + entity.type.fields.forEach(field => { + const newField = newEntity.type.fields.find(f => f.originalId === field.originalId); + formSchemaString = recursiveField(field, newField, formSchemaString); + }); + if (entity.type.entities && entity.type.entities.length > 0) { + formSchemaString = recursiveSchema(entity.type.entities, newEntity.type.entities as FormSchemaEntity[], formSchemaString); + } + }); + + return formSchemaString; + } + + /** + * 升级历史实体结构, 解决id与originalId不匹配的问题 + */ + function updateEntitySchemaToLatest( + currentSchemaEntities: FormSchemaEntity[], + newSchemaEntities: FormSchemaEntity[] + ): FormSchemaEntity[] { + const currentFormSchema = useFormSchema.getFormSchema(); + let currentFormSchemaString = JSON.stringify(currentFormSchema); + + currentFormSchemaString = recursiveSchema(currentSchemaEntities, newSchemaEntities, currentFormSchemaString); + useFormSchema.setFormSchema(JSON.parse(currentFormSchemaString)); + + const schema = useFormSchema.getSchemas() as FormSchema; + return schema.entities; + } + + /** + * 旧表单升级:判断主表的主键字段id和originalId是否相等 => 判断表单是否需要更新 + */ + function checkIfNeedToUpdateEntitySchema(oldSchemaEntities: FormSchemaEntity[]): boolean { + if (!oldSchemaEntities || oldSchemaEntities.length === 0) { + return false; + } + const mainEntity = oldSchemaEntities[0]; + const primaryLabel = mainEntity.type.primary; + const { fields } = mainEntity.type; + const primaryField = fields.find(f => f.label === primaryLabel); + if (primaryField && primaryField.id === primaryField.originalId) { + return false; + } + return true; + } + /** + * 关闭弹窗 + */ + function onCancelChangesetModal() { + if (modalInstance?.value?.close) { + modalInstance.value.close(); + } + } + function onSubmitChangesetModal() { + if (modalInstance?.value?.close) { + modalInstance.value.close(); + } + // 触发更新实体树 + context.emit('entityUpdated'); + } + /** + * 更新Schema节点 + */ + function updateEntitySchema(currentFormSchema: FormSchema, targetFormSchema: FormSchema) { + // 升级历史实体结构:解决id与originalId不匹配的问题 + const updateVersion = useFormSchema.getUpdateVersion(); + if (updateVersion && updateVersion <= '190103' && checkIfNeedToUpdateEntitySchema(currentFormSchema.entities)) { + currentFormSchema.entities = updateEntitySchemaToLatest(currentFormSchema.entities, targetFormSchema.entities); + } + const designerService = { + formSchemaUtils: useFormSchema, + designViewModelUtils, + schemaService, + controlCreatorUtils + }; + const dialog = modalService?.open({ + title: '更新实体结构', + draggable: true, + fitContent: false, + height: 560, + width: 950, + showButtons: false, + render: () => { + return ; + } + }); + + modalInstance.value = dialog?.modalRef?.value; + } + + /** + * 校验并更新Schema + */ + function checkAndUppdateEntitySchema(currentSchema: FormSchema, newSchema: FormSchema) { + if (!newSchema) { + return; + } + + if (mainEntitiyIdHasChanged(currentSchema.entities, newSchema.entities)) { + FMessageBoxService.question('询问', '视图对象主对象的Id已经变更, 更新后需要重新添加控件, 是否继续更新?', + () => { + // 场景①:表单主对象ID已更改,但用户选择更新 + updateEntitySchema(currentSchema, newSchema); + }, () => { + // 场景②:表单主对象ID已更改,但用户选择不更新 + return; + }); + } else { + // 场景③:表单主对象ID未更改,表单升级后更新schema节点 + updateEntitySchema(currentSchema, newSchema); + } + } + + /** + * 由视图对象向页面同步实体结构 + */ + function synchronizeFromViewObject(loadingService: FLoadingService | any) { + const loadingInstance = loadingService.show(); + const schema = useFormSchema.getSchemas() as FormSchema; + schemaService.convertViewObjectToEntitySchema(schema.id, '').then((newSchema: FormSchema | undefined) => { + if (newSchema) { + checkAndUppdateEntitySchema(schema, newSchema); + } + loadingInstance.value?.close(); + }); + } + + return { synchronizeFromViewObject }; + +} diff --git a/packages/mobile-designer/src/components/components/flow-designer/flow-designer.component.tsx b/packages/mobile-designer/src/components/components/flow-designer/flow-designer.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..3989673b9348d77ca57d23fba112958c4d31037b --- /dev/null +++ b/packages/mobile-designer/src/components/components/flow-designer/flow-designer.component.tsx @@ -0,0 +1,84 @@ +import { defineComponent, provide, ref } from "vue"; +import { ComponentSchema, FFlowCanvas, FDesignerOutline, FDesignerToolbox, FPropertyPanel, FSplitter, FSplitterPane, FTabs, FTabPage } from "@farris/ui-vue/components"; +import { FlowDesignerProps, flowDesignerProps } from "./flow-designer.props"; +import { useComponentSchemaService } from '../../composition/component-schema.service'; + +export default defineComponent({ + name: 'FFlowDesigner', + props: flowDesignerProps, + emits: [], + setup(props: FlowDesignerProps, context) { + const schema = ref(props.schema); + const componentSchema = schema.value.module ? ref(schema.value.module.components[0]) : ref(schema.value); + + const dragulaCompostion = ref(); + const fillTabs = ref(true); + const controlTreeRef = ref(); + const entityTreeRef = ref(); + + function onCanvasInitialized(dragula: any) { + dragulaCompostion.value = dragula; + } + + const propertyConfig = ref(); + const propertyName = ref(); + const focusingSchema = ref(); + + const schemaService = useComponentSchemaService(); + schemaService.load(componentSchema.value); + provide('SchemaService', schemaService); + + function onDesignItemClicked(schemaType: string, schemaValue: ComponentSchema) { + propertyName.value = schemaType; + focusingSchema.value = schemaValue; + + if (controlTreeRef.value && controlTreeRef.value.selectControlTreeNode) { + controlTreeRef.value.selectControlTreeNode(schemaValue); + } + } + + function onCanvasChanged() { + if (entityTreeRef.value && entityTreeRef.value.refreshEntityTree) { + entityTreeRef.value.refreshEntityTree(); + } + if (controlTreeRef.value && controlTreeRef.value.refreshControlTree) { + controlTreeRef.value.refreshControlTree(); + } + } + + return () => { + return ( + + +
+ + + + + + + + + {/* */} + + +
+
+ + + + +
+ ); + }; + } +}); diff --git a/packages/mobile-designer/src/components/components/flow-designer/flow-designer.props.ts b/packages/mobile-designer/src/components/components/flow-designer/flow-designer.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..1715ab1cb305c9c3938cfe4df3561ea9b7156d35 --- /dev/null +++ b/packages/mobile-designer/src/components/components/flow-designer/flow-designer.props.ts @@ -0,0 +1,7 @@ +import { ExtractPropTypes } from "vue"; + +export const flowDesignerProps = { + schema: { type: Object, default: {} } +} as Record; + +export type FlowDesignerProps = ExtractPropTypes; diff --git a/packages/mobile-designer/src/components/components/form-designer/form-designer.component.tsx b/packages/mobile-designer/src/components/components/form-designer/form-designer.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..1ec8f05696cfc94949488be2bd5230d16dc0225c --- /dev/null +++ b/packages/mobile-designer/src/components/components/form-designer/form-designer.component.tsx @@ -0,0 +1,224 @@ +import { Ref, computed, defineComponent, inject, onMounted, provide, ref, nextTick } from "vue"; +import { ComponentSchema, DesignerComponentInstance, FTabs, FTabPage, FSplitter, + FSplitterPane, FPropertyPanel, FDesignerOutline } from "@farris/ui-vue/components"; +import { FormDesignerProps, formDesignerProps } from "./form-designer.props"; +import { useComponentSchemaService } from '../../composition/component-schema.service'; +import MonacoEditor from '../monaco-editor/monaco-editor.component'; +import modulePropertyConfig from '../../types/form-property-config.json'; +import FEntityTreeView from '../entity-tree-view/components/entity-tree-view.component'; +import { afterPropeControlPropertyChangedService } from "../../composition/control-property-changed.service"; +import { UseControlCreator, UseDesignViewModel, UseFormSchema, UseSchemaService } from "../../types"; +import { propertyConfigSchemaMap,FDesignerToolbox ,FDesignerCanvas, getPropertyConfigBySchema, SchemaService} from '@farris/mobile-ui-vue/components'; +import toolboxItems from './toolbox.json'; + +export default defineComponent({ + name: 'FFormDesigner', + props: formDesignerProps, + emits: [], + setup(props: FormDesignerProps, context) { + const propertyPanelInstance = ref(); + const schema = ref(props.schema); + const componentSchema = schema.value.module ? ref(schema.value.module.components[0]) : ref(schema.value); + const componentId = ref(componentSchema['id'] || 'root-component'); + const dragulaCompostion = ref(); + const fillTabs = ref(true); + const controlTreeRef = ref(); + const entityTreeRef = ref(); + const monacoEditorRef = ref(); + + function onCanvasInitialized(dragula: any) { + dragulaCompostion.value = dragula; + } + const canvasRef = ref(); + const propertyConfig = ref(); + const propertyName = ref(); + const focusingSchema = ref(); + const schemaService = useComponentSchemaService(); + schemaService.load(componentSchema.value); + provide('SchemaService', schemaService); + const designViewModelUtils = inject('designViewModelUtils') as UseDesignViewModel; + const schemaUtil = inject('schemaService') as UseSchemaService; + + const useFormSchema: any = inject('useFormSchema') as UseFormSchema; + function onDesignItemClicked(schemaType: string, schemaValue: ComponentSchema, componentId: string, componentInstance: DesignerComponentInstance) { + propertyName.value = schemaType; + propertyPanelInstance?.value?.updateDesignerItem(componentInstance, componentId); + focusingSchema.value = schemaValue; + if (!schemaValue || !schemaValue.type) { + propertyConfig.value = []; + } else { + propertyConfig.value = getPropertyConfigBySchema(schemaValue, schemaService as SchemaService, componentInstance ,componentId); + } + + if (controlTreeRef.value && controlTreeRef.value.selectControlTreeNode) { + controlTreeRef.value.selectControlTreeNode(schemaValue); + } + } + + function onCanvasChanged() { + if (entityTreeRef.value && entityTreeRef.value.refreshEntityTree) { + entityTreeRef.value.refreshEntityTree(); + } + if (controlTreeRef.value && controlTreeRef.value.refreshControlTree) { + controlTreeRef.value.refreshControlTree(); + } + } + + function onPropertyChanged(event: any) { + const { changeObject, designerItem } = event; + if (changeObject.needRefreshControlTree && controlTreeRef.value && controlTreeRef.value.refreshControlTree) { + controlTreeRef.value.refreshControlTree(); + } + const afterPropeControlPropertyChanged = afterPropeControlPropertyChangedService(useFormSchema, designViewModelUtils, schemaUtil); + afterPropeControlPropertyChanged.afterPropertyChanged(event); + + if (designerItem?.onPropertyChanged) { + designerItem?.onPropertyChanged(event); + } + } + + const activeDesignerView = ref('formDesigner'); + + /** 代码编辑器的显示文本 */ + const formSchemaCodes = ref(''); + function onChangeDesignerView(viewName: string) { + activeDesignerView.value = viewName; + if (viewName === 'formDesignerCode') { + formSchemaCodes.value = JSON.stringify(schema.value, null, 4); + } + } + + const showDesignerView = computed(() => (itemType: string) => { + return itemType !== activeDesignerView.value; + }); + + const formDesignerViewClass = computed(() => { + return { + 'pl-2 pr-2 mr-2 d-flex': true, + 'f-designer-view-tabs-item': true, + 'active': activeDesignerView.value === 'formDesigner' + }; + }); + + const formDesignerCodeViewClass = computed(() => { + return { + 'pl-2 pr-2 d-flex': true, + 'f-designer-view-tabs-item': true, + 'active': activeDesignerView.value === 'formDesignerCode' + }; + }); + + function getRootNode(selection) { + const selectionSchema = selection.rawSchema; + + if (selectionSchema.type === "component" && selectionSchema.componentType && selectionSchema.componentType.toLowerCase() === 'page') { + return selection; + } else { + return getRootNode(selection.parentNode); + } + } + + propertyConfigSchemaMap['Module'] = modulePropertyConfig; + function onOutlineChanged(selection: any) { + const selectionSchema = selection.rawSchema; + if (selectionSchema?.type === 'Module') { + propertyName.value = 'Module'; + propertyPanelInstance?.value?.updateDesignerItem(null, selectionSchema.id); + focusingSchema.value = selectionSchema; + if (!selectionSchema || !selectionSchema.type) { + propertyConfig.value = []; + } else { + propertyConfig.value = getPropertyConfigBySchema(selectionSchema, schemaService as SchemaService, null ,selectionSchema.id); + } + + } + + if (activeDesignerView.value === 'formDesignerCode' && selectionSchema) { + monacoEditorRef.value?.setPosition(selectionSchema.id); + } + + if (selectionSchema?.type !== 'Module') { + const pageComponent = getRootNode(selection); + console.log(pageComponent); + if (componentId.value !== pageComponent.originalId) { + componentId.value = pageComponent.originalId; + + const component = schema.value.module.components.find(component => component.id === pageComponent.originalId) + componentSchema.value = component; + + canvasRef?.value?.updateDesignerItem(component, component.id); + propertyPanelInstance?.value?.updateDesignerItem(null, selectionSchema.id); + + } + } + } + + function reloadPropertyPanel() { + propertyPanelInstance?.value.reloadPropertyPanel(); + } + + function onEntityUpdated() { + onCanvasChanged(); + canvasRef.value?.refreshCanvas(); + nextTick(() => { + propertyPanelInstance?.value.updatePropertyConfig(); + }); + } + + context.expose({ reloadPropertyPanel, onChangeDesignerView }); + + return () => { + return ( + + +
+ + + + + + + + + + + +
+
+ +
+
+ + +
+
+
onChangeDesignerView('formDesigner')} + class={formDesignerViewClass.value}>可视化设计器
+
onChangeDesignerView('formDesignerCode')} + class={formDesignerCodeViewClass.value}>设计时代码
+
+
+
+
+ ); + }; + } +}); diff --git a/packages/mobile-designer/src/components/components/form-designer/form-designer.props.ts b/packages/mobile-designer/src/components/components/form-designer/form-designer.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..84f0d44faf995813fd0dde177239aaefa6743503 --- /dev/null +++ b/packages/mobile-designer/src/components/components/form-designer/form-designer.props.ts @@ -0,0 +1,7 @@ +import { ExtractPropTypes } from "vue"; + +export const formDesignerProps = { + schema: { type: Object, default: {} } +} as Record; + +export type FormDesignerProps = ExtractPropTypes; diff --git a/packages/mobile-designer/src/components/components/form-designer/toolbox.json b/packages/mobile-designer/src/components/components/form-designer/toolbox.json new file mode 100644 index 0000000000000000000000000000000000000000..6bed2972c224b9d64265f5504a1b5289ffd134bd --- /dev/null +++ b/packages/mobile-designer/src/components/components/form-designer/toolbox.json @@ -0,0 +1,172 @@ +[ + { + "type": "basic", + "name": "基础组件", + "items": [ + { + "id": "button", + "type": "button", + "name": "按钮", + "category": "basic", + "icon": "button" + }, + { + "id": "buttonGroup", + "type": "Button-group", + "name": "按钮组", + "category": "basic", + "icon": "button-group" + } + ] + }, + { + "type": "navigation", + "name": "导航类控件", + "items": [ + { + "id": "navbar", + "type": "navigation-bar", + "name": "导航栏", + "category": "navigation", + "icon": "nav-tab" + } + ] + }, + { + "type": "container", + "name": "容器类控件", + "items": [ + { + "id": "PageHeaderContainer", + "type": "page-header-container", + "name": "页头容器", + "category": "container", + "icon": "content-container" + }, + { + "id": "PageFooterContainer", + "type": "page-footer-container", + "name": "页尾容器", + "category": "container", + "icon": "content-container" + }, + { + "id": "ContentContainer", + "type": "content-container", + "name": "通用容器", + "category": "container", + "icon": "content-container" + }, + { + "id": "FloatContainer", + "type": "float-container", + "name": "浮动容器", + "category": "container", + "icon": "content-container" + }, + { + "id": "form", + "type": "form", + "name": "字段卡片", + "category": "container", + "icon": "response-form" + }, + { + "id": "card", + "type": "card", + "name": "卡片", + "category": "container", + "icon": "section" + } + ] + }, + { + "type": "input", + "name": "表单输入控件", + "items": [ + { + "id": "textbox", + "type": "input-group", + "name": "文本框", + "category": "input", + "icon": "input-group" + }, + { + "id": "textarea", + "type": "textarea", + "name": "多行文本", + "category": "input", + "icon": "textarea" + }, + { + "id": "numericbox", + "type": "numeric-box", + "name": "数值", + "category": "input", + "icon": "number-spinner" + }, + { + "id": "datepicker", + "type": "date-picker", + "name": "日期选择", + "category": "input", + "icon": "date-picker" + }, + { + "id": "timepicker", + "type": "time-picker", + "name": "时间选择", + "category": "input", + "icon": "date-picker" + }, + { + "id": "radiogroup", + "type": "radio-group", + "name": "单选组", + "category": "input", + "icon": "radio-group" + }, + { + "id": "checkgroup", + "type": "check-group", + "name": "复选框组", + "category": "input", + "icon": "check-box" + }, + { + "id": "checkbox", + "type": "check-box", + "name": "复选框", + "category": "input", + "icon": "check-box" + }, + { + "id": "enumfield", + "type": "EnumField", + "name": "选择器", + "category": "input", + "icon": "input-group" + }, + { + "id": "switchfield", + "type": "switch-field", + "name": "开关", + "category": "input", + "icon": "switch" + } + ] + }, + { + "type": "display", + "name": "展示类控件", + "items": [ + { + "id": "ListView", + "type": "list-view", + "name": "列表", + "category": "display", + "icon": "list-view" + } + ] + } +] \ No newline at end of file diff --git a/packages/mobile-designer/src/components/components/form-settings/form-settings.component.tsx b/packages/mobile-designer/src/components/components/form-settings/form-settings.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..3a96be236fe72a0bd2fcadf162216dbd82d23e63 --- /dev/null +++ b/packages/mobile-designer/src/components/components/form-settings/form-settings.component.tsx @@ -0,0 +1,156 @@ +import { SetupContext, defineComponent, inject, ref } from "vue"; +import { formSettingsDesignerProps, FormSettingsDesignerProps } from "./form-settings.props"; +import { UseFormSchema } from "../../types"; +import { FMessageBoxService } from "@farris/ui-vue/components"; +import { FNotifyService } from "@farris/ui-vue/components"; + +import './form-settings.scss'; + +export default defineComponent({ + name: 'FFormSettings', + props: formSettingsDesignerProps, + emits: [], + setup(props: FormSettingsDesignerProps) { + const useFormSchema = inject('useFormSchema') as UseFormSchema; + const formSchema = useFormSchema.getFormSchema(); + const options = ref(formSchema?.options || {}); + const notifyService: any = new FNotifyService(); + const messageService: any = new FMessageBoxService(); + const radioEnumData = [ + { value: 'valid', name: '仅合法变更' }, + { value: 'entire', name: '全部变更' } + ]; + + // const rootViewModel: any = formSchema.module.viewmodels.find(v => !v.parent); + + if (notifyService) { + notifyService.globalConfig = { position: 'top-center', timeout: 3000, showCloseButton: true }; + } + + /** + * 修改卡片组件内输入控件的静态文本属性 + */ + function changeInputTextArea(componentSchema: any) { + + // TODO: 筛选输入类控件 + if (componentSchema.type === 'form-group') { + componentSchema.isTextArea = options.value.enableTextArea; + return; + } + componentSchema.contents && (componentSchema.contents as any[]) + .forEach((content: any) => changeInputTextArea(content)); + } + + /** + * 刷新静态文本 + */ + function refreshInputTextArea() { + if (!messageService || !messageService.question) { + return; + } + messageService.question('输入类控件将启用静态文本属性,确定刷新?', undefined, () => { + useFormSchema.getFormSchema().module.components.filter((component: any) => + component.componentType.startsWith('form').forEach((formComponent: any) => changeInputTextArea(formComponent))); + notifyService.success('刷新成功'); + + }); + } + + return () => { + // return ( + //
+ //
+ //
+ //
+ //

静态文本

+ //
+ //
+ // 启用静态文本后输入类控件在只读状态下仅展示文本信息。 + //
+ //
+ // + //
+ // + //
+ // + //
+ //
+ //
+ //
+ //
+ //
+ //

复用会话

+ //
+ //
+ // 在组合表单的使用场景中开启该设置后,多个表单可以共用一个会话。 + //
+ //
+ // + //
+ // + //
+ //
+ //
+ //
+ //
+ //
+ //
+ //

数据类型转换

+ //
+ //
+ // 启用数据类型转换后,表单变量和VO变量会被转换为对应的数据类型。 + //
+ //
+ // + //
+ // + //
+ //
+ //
+ //
+ //
+ //
+ //
+ //

变更集提交策略

+ //
+ //
+ // 变更提交策略是指表单数据发生变化时前端往后端提交变更集的策略。 + // 仅合法变更策略是指仅提交校验通过的变更项,适用于大部分场景。全部变更策略是指提交所有数据变化到后端,适用于暂存场景。 + //
+ //
+ // + //
+ //
+ //
+ //
+ //
+ //
+ //

服务器端变更检查

+ //
+ //
+ // 菜单或应用关闭前及取消变更时调用后端接口确认后端缓存中的数据是否已经保存并提示用户。 + // 该特性依赖HasChanges接口,请确认已在Api接口文档中添加。 + //
+ //
+ // + //
+ // + //
+ //
+ //
+ //
+ //
+ + // ); + }; + } + +}); diff --git a/packages/mobile-designer/src/components/components/form-settings/form-settings.props.ts b/packages/mobile-designer/src/components/components/form-settings/form-settings.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..95df75171aed4fd4bc8a0ce7001dd9c1406a715c --- /dev/null +++ b/packages/mobile-designer/src/components/components/form-settings/form-settings.props.ts @@ -0,0 +1,7 @@ +import { ExtractPropTypes } from "vue"; + +export const formSettingsDesignerProps = { + schema: { type: Object, default: {} } +} as Record; + +export type FormSettingsDesignerProps = ExtractPropTypes; diff --git a/packages/mobile-designer/src/components/components/form-settings/form-settings.scss b/packages/mobile-designer/src/components/components/form-settings/form-settings.scss new file mode 100644 index 0000000000000000000000000000000000000000..9d39cc6c6f69ad8b1ac0045622f510029b7c7763 --- /dev/null +++ b/packages/mobile-designer/src/components/components/form-settings/form-settings.scss @@ -0,0 +1,58 @@ +.f-designer-option-panel { + box-shadow: 0 0 10px 0 #eceff4; + border-radius: 5px; + background: #fff; + padding: 8px 14px; + width: 70%; + margin: 14px auto; + overflow: auto; + + .f-section-header { + + margin: 0 0 4px; + + + } + + .text-muted { + color: #969ba5 !important; + } + + .badge { + padding: .25rem .5rem; + } + + .col-form-label { + justify-content: start !important; + width: auto; + display: inline-block; + } + + .badge { + padding: .25rem .5rem; + } + + small { + font-size: 90%; + } + + .mr-4 { + display: inline-block; + margin: 4px 24px 3px 10px; + } + + .custom-control-label { + display: inline-block; + + } + + .custom-control.custom-radio { + margin: 8px 8px 6px 1px; + display: inline-block !important; + } + + .form-group { + margin: 4px 1px 3px 1px; + } + +} \ No newline at end of file diff --git a/packages/mobile-designer/src/components/components/monaco-editor/monaco-editor.component.tsx b/packages/mobile-designer/src/components/components/monaco-editor/monaco-editor.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..c8e67576452d91cfde73c6f2ed1c05e6c7971047 --- /dev/null +++ b/packages/mobile-designer/src/components/components/monaco-editor/monaco-editor.component.tsx @@ -0,0 +1,95 @@ +import { defineComponent, watch, onBeforeUnmount, onMounted, ref } from "vue"; +import loader from "@monaco-editor/loader"; +import { MonacoEditorProps, monacoEditorProps } from "./monaco-editor.props"; + +export default defineComponent({ + name: 'FMonacoEditor', + props: monacoEditorProps, + setup(props: MonacoEditorProps, context) { + const editorContainer = ref(); + let editorInstance: any = null; + const codeValues = ref(props.modelValue); + + async function getMonacoEditorConfig() { + return fetch('assets/monaco-editor.config.json').then((config: Record) => { + return config.json(); + }); + } + + async function initMonacoEditor() { + if (editorContainer.value && !editorInstance) { + const config = await getMonacoEditorConfig(); + const { vsPath } = config; + loader.config({ paths: { vs: window.location.origin + vsPath } }); + loader.config({ "vs/nls": { availableLanguages: { "*": "zh-cn" } } }); + + loader.init().then((monaco) => { + editorInstance = monaco.editor.create(editorContainer.value, { + value: codeValues.value, + language: props.language, + theme: props.theme, + folding: true, + readOnly: props.readOnly + }); + }); + } + } + + watch(() => props.modelValue, (newValue) => { + codeValues.value = newValue; + editorInstance?.setValue(newValue); + }); + const resizeObserver = new ResizeObserver(entries => { + editorInstance?.layout(); + }); + + function getContent() { + return editorInstance?.getValue(); + } + + onMounted(() => { + initMonacoEditor(); + resizeObserver.observe(editorContainer.value); + }); + + onBeforeUnmount(() => { + if (editorInstance) { + editorInstance.dispose(); + } + + if (resizeObserver) { + resizeObserver.unobserve(editorContainer.value); + resizeObserver.disconnect(); + } + }); + + const setPosition = (controlId: string) => { + if (!editorInstance || !controlId) { + return; + } + // 查找匹配的文本 + const matches = editorInstance.getModel().findMatches(controlId, false, false, false, null, true); + + if (matches.length > 0) { + // 获取第一个匹配项的位置 + const firstMatch = matches[0]; + const {range} = firstMatch; + + // 将光标定位到匹配的位置 + editorInstance.setPosition(range.getStartPosition()); + + // 滚动到匹配的位置 + editorInstance.revealRangeInCenter(range); + } + }; + + context.expose({ + getContent, + setPosition + }); + + return () => { + return
; + }; + } +}); diff --git a/packages/mobile-designer/src/components/components/monaco-editor/monaco-editor.props.ts b/packages/mobile-designer/src/components/components/monaco-editor/monaco-editor.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..d5bbd94c85a1d6ea62b5fe51ae21b12a4e12a845 --- /dev/null +++ b/packages/mobile-designer/src/components/components/monaco-editor/monaco-editor.props.ts @@ -0,0 +1,10 @@ +import { ExtractPropTypes } from "vue"; + +export const monacoEditorProps = { + modelValue: { type: String, default: '' }, + language: { type: String, default: 'typescript' }, + theme: { type: String, default: 'vs-dark' }, + readOnly: { type: Boolean, default: false } +}; + +export type MonacoEditorProps = ExtractPropTypes; diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-editor/method-editor.component.tsx b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-editor/method-editor.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..1b05b37784489e886f6079df9f9c79fe23867e5e --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-editor/method-editor.component.tsx @@ -0,0 +1,125 @@ +import { SetupContext, defineComponent, ref, inject } from "vue"; +import { FNotifyService } from "@farris/ui-vue/components"; +import { methodEditorProps, MethodEditorProps } from "./method-editor.props"; +import { UseFormSchema } from "../../../../../types"; + +export default defineComponent({ + name: 'FMethodEditor', + props: methodEditorProps, + emits: ['cancel','submit'], + setup(props: MethodEditorProps, context) { + + const commandData = ref({ + id: props.command?.id, + code: props.command?.code || '', + name: props.command?.name || '' + }); + + const commandsInViewModel = ref(props.activeViewModel?.commands || []); + const activeViewModelId = ref(props.activeViewModel?.id || ''); + + const notifyService: any = new FNotifyService(); + notifyService.globalConfig = { position: 'top-center' }; + + const useFormSchema = inject('useFormSchema') as UseFormSchema; + + /** + * 校验方法编号、名称是否合规 + */ + function validateCommand() { + // 1、同一个视图模型下名称不可重复 + const commandNames = commandsInViewModel.value.map((command: any) => { + if (command.id !== commandData.value.id) { return command.name; } + }); + if (commandNames.includes(commandData.value.name.trim())) { + notifyService.warning({ message: `【${commandData.value.name.trim()}】已存在,请修改!` }); + return false; + } + + const newCommandCode = commandData.value.code.trim(); + // 2、当前视图模型下编号不可重复,编号不区分大小写 + const commandCodes = commandsInViewModel.value.filter((command) => command.id !== commandData.value.id) + .map((command) => command.code.toLowerCase()); + if (commandCodes.includes(newCommandCode.toLowerCase())) { + notifyService.warning({ message: `【${newCommandCode}】已存在,请修改!` }); + return false; + } + + // 3、其他视图模型下编号不可重复 + const viewModels = useFormSchema.getFormSchema().module.viewmodels; + viewModels.filter((viewModel) => viewModel.id !== activeViewModelId.value) + .forEach((viewModel) => { + const commandCodesInViewModel = viewModel.commands.map((command) => command.code.toLowerCase()); + if (commandCodesInViewModel.includes(newCommandCode)) { + notifyService.warning({ message: '视图模型【' + viewModel.id + '】中已存在命令编号【' + newCommandCode + '】,请修改!' }); + return false; + } + }); + + // 4、编号格式:由英文字母开头,英文字母、数字和下划线组成 + const reg1 = /^[a-zA-Z][a-zA-Z0-9_]*$/; + if (!reg1.test(newCommandCode)) { + notifyService.warning({ message: '方法编号必须以英文字母开头,并且只能由英文字母、数字、下划线组成!' }); + return false; + } + return true; + } + + function onCancelClicked() { + context.emit('cancel'); + } + function onSubmitClicked() { + if (!validateCommand()) { + return; + } + + context.emit('submit', { + code: commandData.value.code.trim(), + name: commandData.value.name.trim() + }); + } + + return () => { + return ( +
+
+
+ +
+
+ +
+ +
+
+
+ +
+
+ +
+ +
+
+
+
+
+ + + +
+ ); + }; + } +}); diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-editor/method-editor.props.ts b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-editor/method-editor.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..fb2875dfa39e031b1e74447c2ab074d879e35b88 --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-editor/method-editor.props.ts @@ -0,0 +1,9 @@ +import { ExtractPropTypes } from "vue"; +import { Command } from "../../entity/command"; + +export const methodEditorProps = { + command: { type: Command }, + activeViewModel: { type: Object, default: [] } +} as Record; + +export type MethodEditorProps = ExtractPropTypes; diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..f3e76e370da923d046d0334a315baae9b9c794c8 --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.component.tsx @@ -0,0 +1,243 @@ +import { DataColumn, RowOptions, VisualData } from "@farris/ui-vue/components"; +import { FEventParameter } from "@farris/ui-vue/components"; +import { FTreeGrid } from "@farris/ui-vue/components"; +import { FormViewModel } from "../../../../../types"; +import { defineComponent, ref, computed, reactive, onMounted, inject } from "vue"; +import { useViewModelMethod } from "./use-method"; +import { Command } from "../../entity/command"; +import { ParamConfig } from "../../entity/param"; +import { MethodListProps, methodListProps } from "./method-list.props"; + +import './method-list.scss'; +import { useEventParameterData } from "../../../../../composition/use-event-parameter-data"; +import { useParameterEditorData } from "../../../../../composition/use-parameter-editor-data"; + +export default defineComponent({ + name: 'FMethodList', + props: methodListProps, + emits: [], + setup(props: MethodListProps, context) { + + const useFormSchemaComposition: any = inject('useFormSchema', null); + const useFormStateMachineComposition: any = inject('useFormStateMachine', null); + /** 树表格实例 */ + const treeGridRef = ref(); + + const columns: DataColumn[] = [ + { field: 'name', title: '方法名称', dataType: 'string' }, + { field: 'code', title: '方法编号', dataType: 'string' } + ]; + + const rowNumberOption = computed(() => { return { enable: false }; }); + + const { commandsData, activeViewModel, selectedTreeNode, isCommandNodeSelected, + paramsData, selectTreeNodeIndex, updateCommandParamFromWebCmd, onChangeSelectedCommand, updateViewModel, + isValidCommandSelected + } = useViewModelMethod(props); + + const { getEventParameterData } = useEventParameterData(useFormSchemaComposition, useFormStateMachineComposition); + const { assembleOutline, assembleSchemaFieldsByComponent, + assembleStateVariables, + } = useParameterEditorData(useFormSchemaComposition); + + // 初始化加载数据设置节点全部收起 + const rowOption: Partial = { + customRowStatus: (visualData: VisualData) => { + if(visualData.collapse === undefined){ + visualData.collapse = visualData.raw.collapse; + } + return visualData; + } + }; + + /** + * 由外部触发刷新方法 + */ + function refreshMethodList(newCommandsData: Array, newActiveViewModel: FormViewModel, selectedCommandId?: string) { + commandsData.value = newCommandsData || []; + activeViewModel.value = newActiveViewModel; + treeGridRef.value.updateDataSource(commandsData.value); + treeGridRef.value.clearSelection(); + + if (commandsData.value.length) { + treeGridRef.value.selectItemById(selectedCommandId || selectedTreeNode.value?.id || commandsData.value[0].id); + } else { + selectedTreeNode.value = null; + paramsData.value = []; + } + } + + + onMounted(() => { + }); + + context.expose({ refreshMethodList, selectedTreeNode, isCommandNodeSelected, isValidCommandSelected }); + + /** + * 渲染方法的来源信息 + */ + function renderCommandSource() { + const selectedData = selectedTreeNode.value?.data; + if (isCommandNodeSelected.value && selectedData && selectedData.controllerName) { + return
+
+
+
+

方法来源

+
+
+
+
+
+
+ + {selectedData.handlerShowName ? + : ''} + +
+
+
+ +
+
+
; + } + } + /** + * 渲染操作的来源信息 + */ + function renderHandlerSource() { + const selectedData = selectedTreeNode.value?.data; + if (!isCommandNodeSelected.value && selectedData && selectedData.componentName) { + return
+
+
+
+

构件

+
+
+
+
+
+
+ +
+
+
+ +
+
+
; + } + } + + /** + * 渲染方法参数面板 + */ + function renderParameterPanel() { + const selectedData = selectedTreeNode.value?.data; + + if (isCommandNodeSelected.value && selectedData && paramsData.value?.length > 0) { + + return
+
+
+

方法参数

+ {selectedData.needRefreshParam ? + + 更新 + : ''} + +
+
+
+ {paramsData.value.map((paramData: ParamConfig, index: number) => { + const data = reactive(getEventParameterData(paramData.controlSource?.context?.data?.value) || []); + const paramDescriptionTooltip = reactive({ content: paramData.description, placement: 'top' }); + return
+
+
+ + +
+ { + commandsData.value[selectTreeNodeIndex.value] = selectedTreeNode.value; + updateViewModel(commandsData.value); + }} + onValueChange={() => { + commandsData.value[selectTreeNodeIndex.value] = selectedTreeNode.value; + updateViewModel(commandsData.value); + }} + > + +
+
+
+
; + })} +
+
; + } + } + return () => { + return ( + +
+
+ +
+
+ {renderCommandSource()} + {renderHandlerSource()} + {renderParameterPanel()} +
+
+ ); + }; + } +}); diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.props.ts b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..a836bf76d98bdb1c773546fcb6e465334304478f --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.props.ts @@ -0,0 +1,9 @@ +import { ExtractPropTypes } from "vue"; +import { Command } from "../../entity/command"; + +export const methodListProps = { + commandsData: { type: Array }, + activeViewModel: { type: Object } +} as Record; + +export type MethodListProps = ExtractPropTypes; diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.scss b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.scss new file mode 100644 index 0000000000000000000000000000000000000000..d6c556c6645971a2bb42924eedf6a65b18a5a3ee --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-list/method-list.scss @@ -0,0 +1,30 @@ +.view-model-method-list { + margin-left: 1rem !important; + padding-top: .25rem !important; + overflow-y: hidden !important; + overflow-x: auto !important; + + .main-panel { + min-width: 800px; + margin-bottom: 10px; + + .command-panel { + border-radius: 6px; + width: 50%; + + .fv-grid-cell { + user-select: text; + } + } + + .param-panel { + .text-tip { + font-size: 14px; + } + + .update-param>.f-icon { + font-size: 14px; + } + } + } +} \ No newline at end of file diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-list/use-method.ts b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-list/use-method.ts new file mode 100644 index 0000000000000000000000000000000000000000..553ce60ce78f1b114157707803d92b5db6b0d6b0 --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-list/use-method.ts @@ -0,0 +1,101 @@ +import { computed, inject, ref } from "vue"; +import { UseFormSchema } from "../../../../../types"; +import { MethodListProps } from "./method-list.props"; +import { Command } from "../../entity/command"; +import { ParamConfig } from "../../entity/param"; + +export function useViewModelMethod(props: MethodListProps) { + + /** 方法列表绑定数据源 */ + const commandsData = ref(props.commandsData || []); + + /** 当前选中的表格行数据 */ + const selectedTreeNode = ref(); + + /** 当前是否选中方法行。选中方法:true;选中操作或者分支:false */ + const isCommandNodeSelected = ref(false); + /** 当前是否选中有效的方法行 */ + const isValidCommandSelected = computed(() => { return isCommandNodeSelected.value && (selectedTreeNode.value ? !selectedTreeNode.value.data?.isInValid : false); }); + /** 当前选中方法的参数列表 */ + const paramsData = ref([]); + + /** 当前方法所属的视图模型 */ + const activeViewModel = ref(props.activeViewModel); + + const useFormSchema = inject('useFormSchema') as UseFormSchema; + + const selectTreeNodeIndex = ref(0); + + /** + * 更新参数列表 + */ + function refreshParamListData() { + if (commandsData.value.length === 0) { + paramsData.value = []; + return; + } + if (isCommandNodeSelected.value) { + paramsData.value = selectedTreeNode.value.data.params || []; + } else { + paramsData.value = []; + } + } + + /** + * 切换选中的方法 + */ + function onChangeSelectedCommand(selectedItems: any[]) { + selectedTreeNode.value = selectedItems[0]; + selectTreeNodeIndex.value = commandsData.value.findIndex(command => command.id === selectedTreeNode.value.id); + isCommandNodeSelected.value = !selectedTreeNode.value.parent; + + refreshParamListData(); + } + + /** + * 将变更同步到表单DOM中 + * @param commands 命令列表 + */ + function updateViewModel(commands: any[]) { + if (!commands || !activeViewModel.value) { + return; + } + + activeViewModel.value.commands = commands.length > 0 ? commands + .filter((command: any) => command.data instanceof Command && command.data.toJson) + .map((commandData: any) => { + return commandData.data.toJson(); + }) : []; + + const originalViewModel = useFormSchema?.getViewModelById(activeViewModel.value.id); + if (originalViewModel) { + originalViewModel.commands = activeViewModel.value.commands; + } + + } + + /** + * 更新当前命令的参数信息---用于构件中参数被移除的场景 + */ + function updateCommandParamFromWebCmd() { + selectedTreeNode.value.data.params = selectedTreeNode.value.data.params.filter((parameter: ParamConfig) => !parameter.isDisused); + selectedTreeNode.value.data.needRefreshParam = false; + + refreshParamListData(); + + updateViewModel(commandsData.value); + } + + return { + commandsData, + activeViewModel, + selectedTreeNode, + isCommandNodeSelected, + paramsData, + selectTreeNodeIndex, + onChangeSelectedCommand, + updateCommandParamFromWebCmd, + updateViewModel, + isValidCommandSelected + }; +} diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-selector/method-selector.component.tsx b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-selector/method-selector.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..eb0ae91bc86c315aedc2c65a0a19da2e67e505e9 --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-selector/method-selector.component.tsx @@ -0,0 +1,145 @@ +import { DataColumn, FLoadingService, FNotifyService, FTreeGrid, FSchemaSelector,ControllerSchemaRepositorySymbol,FModal } from "@farris/ui-vue/components"; +import { SetupContext, defineComponent, ref, inject, onMounted } from "vue"; +import { methodSelectorProps, MethodSelectorProps } from "./method-selector.props"; +import { useWebCommandSelector } from "./use-web-command-selector"; +import { WebCommand, WebCommandMetadata } from "../../entity/web-command"; + +import './method-selector.scss'; +import { UseFormSchema } from "../../../../../types"; + +export default defineComponent({ + name: 'FMethodSelector', + props: methodSelectorProps, + emits: ['submit', 'cancel'], + setup(props: MethodSelectorProps, context) { + const notifyService: any = new FNotifyService(); + notifyService.globalConfig = { position: 'top-center' }; + + const methodSelectorGridRef = ref(); + const columns: DataColumn[] = [ + { field: 'name', title: '方法名称', dataType: 'string' }, + { field: 'code', title: '方法编号', dataType: 'string' } + ]; + const rowNumberOption = { enable: false }; + const selectionOption = { enableSelectRow: true, multiSelect: true, showCheckbox: true, multiSelectMode: 'OnCheckAndClick' }; + const hierarchy = { cascadeOption: { autoCheckChildren: true, autoCheckParent: true } }; + + const useFormSchema = inject('useFormSchema') as UseFormSchema; + const { webCommandsTreeData, loadWebCommands, addControllerMetadata } = useWebCommandSelector(); + const showControllerSelectorModal = ref(false); + const controllerSelectorRef = ref(); + const controllerSelectorParams = ref(); + const newWebControllers: any = ref([]); + onMounted(() => { + const LoadingService: any = inject('FLoadingService'); + const instance = LoadingService?.show(); + loadWebCommands().then(() => { + methodSelectorGridRef.value.updateDataSource(webCommandsTreeData.value); + instance.value.close(); + }, (error: any) => { + instance.value.close(); + }); + + controllerSelectorParams.value = { + formBasicInfo: useFormSchema?.getFormMetadataBasicInfo() + }; + }); + + function onSubmitClicked() { + const selectedItems = methodSelectorGridRef.value.getSelectedItems(); + if (!selectedItems.length) { + notifyService.warning({ message: '请先选择方法' }); + return; + } + + const selectedCommands: Array<{ command: WebCommand; controller: WebCommandMetadata }> = []; + const newControllers: any[] = []; + selectedItems.forEach((selection: any) => { + const selectionData = selection.data; + // 去除控制器节点 + if (selectionData.data.isController) { + return; + } + const controllerNode: any = webCommandsTreeData.value.find((treeItem: any) => treeItem.id === selection.parent); + const newContoller = newWebControllers.value.find(controller => controller.id === controllerNode?.data.data.originalData.Id); + if (newContoller) { + newControllers.push(newContoller); + } + selectedCommands.push({ + command: selectionData.data.originalData, + controller: controllerNode?.data.data.originalData + }); + + }); + if (!selectedCommands.length) { + notifyService.warning('请先选择方法'); + return; + } + context.emit('submit', { + selectedCommands, + newWebControllers: newControllers + }); + + } + function onCancelClicked() { + context.emit('cancel'); + } + + function onClickAddController() { + showControllerSelectorModal.value = true; + } + async function onSubmitController(selectedController: any) { + + await addControllerMetadata(selectedController, newWebControllers.value); + + methodSelectorGridRef.value.updateDataSource(webCommandsTreeData.value); + + showControllerSelectorModal.value = false; + } + function onCancelController(e) { + showControllerSelectorModal.value = false; + } + return () => { + return ( +
+
+
+
+ 添加控制器 +
+
+
+ +
+ + + { + showControllerSelectorModal.value ? + + + : '' + } +
+ ); + }; + } +}); diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-selector/method-selector.props.ts b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-selector/method-selector.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..e61a39e81f993db51547587484b46f7c5f651dbf --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-selector/method-selector.props.ts @@ -0,0 +1,7 @@ +import { ExtractPropTypes } from "vue"; + +export const methodSelectorProps = { + +} as Record; + +export type MethodSelectorProps = ExtractPropTypes; diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-selector/method-selector.scss b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-selector/method-selector.scss new file mode 100644 index 0000000000000000000000000000000000000000..8b572dd93a5489af34c99525a71eda032fe138fc --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-selector/method-selector.scss @@ -0,0 +1,63 @@ +.method-panel { + padding-left: 12px; + padding-right: 12px; +} + +.f-method-selector { + height: 100%; + padding-left: 12px; + padding-right: 12px; + + .method-toolbar { + display: flex; + align-items: center; + line-height: 18px; + color: #34495e; + padding-top: 4px; + padding-bottom: 10px; + } + + .method-toolbar .toolbar-item { + display: flex; + cursor: pointer; + } + + .method-toolbar .toolbar-item .toolbar-item-icon { + position: relative; + height: 15px; + width: 15px; + border: 1px solid #5b89fe; + border-radius: 3px; + margin-right: 6px; + } + + .method-toolbar .toolbar-item .toolbar-item-icon::after { + content: "T"; + position: absolute; + top: 0; + left: 2px; + font-size: 12px; + line-height: 12px; + color: #4e56c4; + } + + .method-toolbar .toolbar-item .toolbar-item-icon::before { + font-family: FarrisIcons; + display: flex; + justify-content: center; + align-items: flex-end; + height: 10px; + width: 10px; + line-height: 8px; + color: #00cdba; + background-color: #fff; + position: absolute; + bottom: -2px; + right: -4px; + content: "\e11e"; + } + + .grid-panel { + border-radius: 6px; + } +} \ No newline at end of file diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-selector/use-web-command-selector.ts b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-selector/use-web-command-selector.ts new file mode 100644 index 0000000000000000000000000000000000000000..603112f3378bf2d799dab784ecc7f87516dba7a9 --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/components/method-selector/use-web-command-selector.ts @@ -0,0 +1,200 @@ +import { inject, ref } from "vue"; +import { FormWebCmd, UseFormSchema } from "../../../../../types"; +import { MetadataService } from "../../../../../composition/metadata.service"; +import { IdService } from "../../service/id.service"; +import { MethodBuilder } from "../../composition/build-method"; +import axios from 'axios'; +import { getAllSupportedControllers, getSupportedControllerMethods } from "../../../../../composition/command/supported-controller"; + +export function useWebCommandSelector() { + + const useFormSchema = inject('useFormSchema') as UseFormSchema; + + /** 树表格绑定数据 */ + const webCommandsTreeData: any = ref([]); + + const selectedCommands = ref([]); + + /** + * 校验控制器唯一 + * @param webcmdsData + */ + function unique(webcmdsData: Array): Array { + const uniquedWebCmdsData: any[] = []; + webcmdsData.forEach(webcmdData => { + const isExisted = uniquedWebCmdsData.find(res => res.data && webcmdData.data.id === res.data.id); + if (!isExisted) { + uniquedWebCmdsData.push(webcmdData); + } + }); + + return uniquedWebCmdsData; + } + /** + * 组装单条控制器的树节点数据 + */ + function resolveSingleWebCommand(commandContent: any) { + const commands = commandContent.Commands ? (commandContent.Commands as any[]).map((command: any) => { + return { + data: { + id: new IdService().generate(), // 部分构件下的命令id是重复的,影响了树表的勾选,故此处重置id + name: command.Name, + code: command.Code, + originalData: command, + isController: false + }, + children: [] + }; + }) : []; + return { + data: { + id: commandContent.Id, + name: commandContent.Name, + code: commandContent.Code, + originalData: commandContent, + isController: true + }, + children: commands + }; + } + /** + * 将控制器组装成树表格要求的层级结构。 + * @param metadataContentList 控制器元数据列表 + */ + function resolveWebCommandTreeData(commandsMetadataContent: any[]) { + selectedCommands.value = []; + + let commandsData = commandsMetadataContent.map((commandContent: any) => { + return resolveSingleWebCommand(commandContent); + }); + commandsData = unique(commandsData); + + // 转换为farris vue treegrid需要的结构 + const useMethodComposition = new MethodBuilder(useFormSchema); + webCommandsTreeData.value = []; + useMethodComposition.convertCommandsDataToTreeGridFormat(commandsData, webCommandsTreeData.value, 0, null); + return webCommandsTreeData.value; + } + /** + * 返回目前支持的控制器命令 + */ + function filterSupportedCommand(controllerContent: any) { + const { Id: controllerId, Commands: allCommands } = controllerContent; + return getSupportedControllerMethods(controllerId, allCommands); + } + /** + * 加载当前页面相关的所有控制器及其方法 + */ + function loadWebCommands(): Promise { + + const webCmdInfos = useFormSchema.getFormSchema()?.module?.webcmds; + const formMetaBasicInfo = useFormSchema.getFormMetadataBasicInfo(); + webCommandsTreeData.value = []; + return new Promise((resolve, reject) => { + if (!formMetaBasicInfo) { + reject(); + return; + } + + const { relativePath } = formMetaBasicInfo; + const supportedControllers = getAllSupportedControllers(); + + new MetadataService().GetMetadataListByType(relativePath, '.webcmd').then((response: any) => { + const allCommandsMetadata: any[] = response.data; + const commandsMetadataInThePage = allCommandsMetadata.filter((commandMetadata: any) => { + const hasExtendProperty = !!commandMetadata.extendProperty; + const extendPropertyObject = hasExtendProperty ? JSON.parse(commandMetadata.extendProperty) : {} as Record; + const beloneToThePage = extendPropertyObject.FormCode === formMetaBasicInfo.code; + return beloneToThePage; + }).reduce((result: Map, commandMetadataInThePage: any) => { + result.set(commandMetadataInThePage.id, { + id: commandMetadataInThePage.id, + path: commandMetadataInThePage.relativePath, + name: commandMetadataInThePage.fileName + }); + return result; + }, new Map); + + const allCommandInfoReferencedInThePage = webCmdInfos.reduce((result: Map, commandInfo: FormWebCmd) => { + result.set(commandInfo.id, commandInfo); + return result; + }, commandsMetadataInThePage); + + const requestCommandsMetadata = Array.from(allCommandInfoReferencedInThePage.values()) + .map((commandInfo: FormWebCmd) => new MetadataService().queryMetadataById(relativePath, commandInfo.id) + .catch(() => { console.log(`获取元数据${commandInfo.name}失败,请检查。`); }) + ); + + axios.all(requestCommandsMetadata).then(axios.spread((...commandsMetadata) => { + const commandsMetadataContent = commandsMetadata.filter((item: any) => { + if (!item.data) { + return false; + } + // 如果是自定义构件 + if (item.data.nameSpace.includes('.Front')) { + return true; + } + return supportedControllers[item.data.id]; + }) + .map((item: any) => { + const content = JSON.parse(item.data.content); + const supportedCommands = item.data.nameSpace.includes('.Front') ? content.Commands : filterSupportedCommand(content); + content.Commands = supportedCommands; + return content; + }); + + resolveWebCommandTreeData(commandsMetadataContent); + resolve(commandsMetadataContent); + })); + }, (error) => { + reject(); + }); + + }); + } + /** + * 新增控制器后事件 + */ + async function addControllerMetadata(newController: any, newWebControllers: any[]) { + const exsitedWebCmdInfos = useFormSchema.getFormSchema()?.module?.webcmds; + if (exsitedWebCmdInfos.findIndex(item => item.id === newController.id) >= 0) { + console.log('相同的控制器已经存在'); + return; + } + if (newWebControllers.findIndex(item => item.id === newController.id) >= 0) { + console.log('相同的控制器已经存在'); + return; + } + const formMetaBasicInfo = useFormSchema.getFormMetadataBasicInfo(); + const { relativePath } = formMetaBasicInfo; + let newWebCmdMetadata; + await new MetadataService().getPickMetadata(relativePath, newController).then((result: any) => { + newWebCmdMetadata = result?.metadata; + const metadataContent = JSON.parse(newWebCmdMetadata?.content); + metadataContent.Commands =newWebCmdMetadata.nameSpace.includes('.Front') ? metadataContent.Commands : filterSupportedCommand(metadataContent); + const newWebCmd = resolveSingleWebCommand(metadataContent); + const newWebCmdTreeData = []; + const useMethodComposition = new MethodBuilder(useFormSchema); + useMethodComposition.convertCommandsDataToTreeGridFormat([newWebCmd], newWebCmdTreeData, 0, null); + + webCommandsTreeData.value = webCommandsTreeData.value.concat(newWebCmdTreeData); + }); + + if (newWebCmdMetadata) { + const newWebCommand = { + id: newWebCmdMetadata.id, + path: newWebCmdMetadata.relativePath, + name: newWebCmdMetadata.fileName, + code: newWebCmdMetadata.code, + nameSpace: newWebCmdMetadata.nameSpace + }; + newWebControllers.push(newWebCommand); + } + } + + return { + loadWebCommands, + webCommandsTreeData, + addControllerMetadata + }; +} diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/composition/build-method.ts b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/composition/build-method.ts new file mode 100644 index 0000000000000000000000000000000000000000..96cf549a4f9fea73ab1ea888e3679cca125fb2d8 --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/composition/build-method.ts @@ -0,0 +1,352 @@ + +import axios from 'axios'; +import { FormViewModel, FormWebCmd, UseFormSchema } from "../../../../types"; +import { Command } from "../entity/command"; +import { WebCommand, WebCommandMetadata } from "../entity/web-command"; +import { IdService } from "../service/id.service"; +import { MetadataService } from "../../../../composition/metadata.service"; +import { cloneDeep } from 'lodash-es'; + +export class MethodBuilder { + + constructor(private useFormSchema: UseFormSchema) { }; + + private commands: Command[] | any[] = []; + + private commandsTreeData: any[] = []; + + /** + * 加载表单相关的控制器和控制器内的方法,并组装为树表格所需的结构 + * @param commandsJson + * @returns + */ + public build(commandsJson: any[]): Promise { + return new Promise((resolve, reject) => { + this.loadWebcmd().then((webcmds: WebCommandMetadata[]) => { + this.commands = []; + + for (const commandJson of commandsJson) { + if (commandJson.isInvalid) { + const node = { + data: commandJson, + selectable: true, + id: commandJson.id, + code: commandJson.code, + cmpId: commandJson.cmpId, + isInValid: true + } as any; + this.commands.push(node); + continue; + } + + const webcmd = webcmds.find(item => item.Id === commandJson.cmpId); + if (!webcmd) { + continue; + } + + const webCommand = webcmd.Commands.find(item => item.Code === commandJson.handlerName); + if (!webCommand) { + const node = { + data: commandJson, + selectable: true, + id: commandJson.id, + code: commandJson.code, + cmpId: commandJson.cmpId, + isInValid: true + } as any; + this.commands.push(node); + continue; + } + + const command = new Command(webCommand, commandJson, webcmd); + + // 唯一化id,如果添加多个相同命令,操作的id会重复,树节点开不开。 + this.recursiveUniqueId(command.children); + + this.commands.push(command); + + // 记录命令的参数是否需要刷新 + if (command.params.length) { + const disusedParam = command.params.find(param => param.isDisused); + command.needRefreshParam = !!disusedParam; + } + } + + this.commandsTreeData = []; + this.convertCommandsDataToTreeGridFormat(this.commands, this.commandsTreeData, 0, null); + + resolve(this.commandsTreeData); + }, err => { + // 若使用this.error 会导致流的中断,故使用next并增加flag标识 + resolve({ + flag: 'error', + msg: err + }); + }); + }); + + } + + /** + * 加载表单相关的控制器 + * @returns + */ + private loadWebcmd(): Promise { + const webCmdInfos = this.useFormSchema.getCommands(); + + const metadataInfo = this.useFormSchema.getFormMetadataBasicInfo(); + + return new Promise((resolve, reject) => { + if (!metadataInfo || !webCmdInfos) { + resolve([]); + return; + } + const relativePath = metadataInfo ? metadataInfo.relativePath : ''; + + const requestCommandsMetadata = webCmdInfos.map((commandInfo: FormWebCmd) => { + return new MetadataService().queryMetadataById(relativePath, commandInfo.id).catch(error => { + console.log(`获取元数据${commandInfo.name}失败,请检查。`); + }); + }); + + axios.all(requestCommandsMetadata).then(axios.spread((...metadataList) => { + const metadataContentList = metadataList.filter((item: any) => !!item.data) + .map((item: any) => JSON.parse(item.data.content)); + resolve(metadataContentList); + })); + + }); + + } + + /** + * 唯一化操作的id。如果添加多个相同命令,操作的id会重复,树节点的展开有问题 + */ + private recursiveUniqueId(arr: any[]) { + const idService = new IdService(); + arr.forEach(item => { + item.id = idService.generate(); + if (item.children && item.children.length) { + this.recursiveUniqueId(item.children); + } + }); + } + + /** + * 将方法列表转化为farris 树表格需要的结构 + * @param commandsData + * @param commandTreeViewData + * @param layer + * @param parentTreeNode + */ + public convertCommandsDataToTreeGridFormat(commandsData: any[], commandTreeViewData: any[], layer = 0, parentTreeNode: any) { + commandsData.forEach((commandData: any) => { + const commandTreeData = { + data: commandData, + id: commandData.id || commandData.data.id, + code: commandData.code || commandData.data.code, + name: commandData.name || commandData.data.name, + layer, + parent: parentTreeNode && parentTreeNode.id, + hasChildren: true, + collapse: true + }; + commandTreeViewData.push(commandTreeData); + + if (commandData.children && commandData.children.length) { + this.convertCommandsDataToTreeGridFormat(commandData.children, commandTreeViewData, layer + 1, commandTreeData); + } else { + commandTreeData.hasChildren = false; + } + }); + } + + /** + * 移除方法 + */ + public removeCommand(selectedTreeNode: any, activeViewModel: FormViewModel) { + // 删除后自动定位到下一条方法 + let nextCommandId = ''; + const index = this.commands.findIndex(item => item.id === selectedTreeNode.id); + if (index > -1 && index < this.commands.length - 1) { + const nextSelectedCommand = this.commands[index + 1].data; + nextCommandId = nextSelectedCommand?.id; + } + this.commands.splice(index, 1); + + this.removeWebCommandHandler(selectedTreeNode.data); + + const oldCommandsTreeData = cloneDeep(this.commandsTreeData); + this.commandsTreeData = []; + this.convertCommandsDataToTreeGridFormat(this.commands, this.commandsTreeData, 0, null); + this.assignTreeCollapseState(this.commandsTreeData, oldCommandsTreeData); + this.updateViewModel(this.commands, activeViewModel); + + return { nextCommandId, commandsTreeData: this.commandsTreeData }; + } + + /** + * 新增方法 + * @param newCommandDatas x + * @param activeViewModel + * @returns + */ + public addCommand( + newCommandDatas: { + selectedCommands: Array<{ command: WebCommand; controller: WebCommandMetadata }>; + newWebControllers: FormWebCmd[] + }, + activeViewModel: FormViewModel + ) { + if (!newCommandDatas.selectedCommands?.length) { + return; + } + + // 新增的构件 + const webcmdList = this.useFormSchema.getFormSchema().module.webcmds; + newCommandDatas.newWebControllers.forEach(newController => { + if (!webcmdList.find(controller => controller.id === newController.id)) { + webcmdList.push(newController); + } + }); + // 新增的命令 + newCommandDatas.selectedCommands.forEach((newCommandData: { command: WebCommand; controller: WebCommandMetadata }) => { + const selectedCommand = newCommandData.command; + const { controller } = newCommandData; + + const command = new Command(selectedCommand, controller.Id, controller); + command.id = new IdService().generate(); + command.isNewGenerated = false; + + this.recursiveUniqueId(command.children); + + // 处理code、name + this.refreshCommandCodeName(command, activeViewModel.id); + + this.commands.push(command); + + this.addWebCommandHandler(command); + + }); + const oldCommandsTreeData = cloneDeep(this.commandsTreeData); + this.commandsTreeData = []; + this.convertCommandsDataToTreeGridFormat(this.commands, this.commandsTreeData, 0, null); + this.assignTreeCollapseState(this.commandsTreeData, oldCommandsTreeData); + this.updateViewModel(this.commands, activeViewModel); + return this.commandsTreeData; + + } + + /** + * 方法重命名 + */ + public editCommand(selectedTreeNode: any, activeViewModel: FormViewModel, newCommandData: any) { + Object.assign(selectedTreeNode.data, newCommandData); + Object.assign(selectedTreeNode, newCommandData); + + this.updateViewModel(this.commands, activeViewModel); + + return this.commandsTreeData; + } + + /** + * 获取唯一的方法编号、名称 + */ + private refreshCommandCodeName(command: Command, viewModelId: string) { + + // 获取唯一的方法编号 + const codeSet = this.getViewModelCommandLabel(); + let i = 1; + let newCode; + const vmId = viewModelId.replace(/-/g, '').replace('component', '').replace('viewmodel', ''); + while (true) { + newCode = vmId + command.code + i; + if (!codeSet.has(newCode.toLowerCase())) { + break; + } + ++i; + } + + // 解决不同控制器handler重名的问题: 当前VMID+命令code+1 + command.name += i; + command.code = command.code.slice(0, 1).toUpperCase() + command.code.slice(1); + command.code = vmId + command.code + i; + } + + private getViewModelCommandLabel() { + const codeSet = new Set(); + const viewmodel = this.useFormSchema.getFormSchema().module.viewmodels; + viewmodel.forEach(viewmodelItem => { + viewmodelItem.commands.forEach(commandItem => { + codeSet.add(commandItem.code.toLowerCase()); + }); + }); + return codeSet; + } + + /** + * 记录方法的引用:向"webCmds"节点添加引用 + */ + private addWebCommandHandler(command: Command) { + const webCmds = this.useFormSchema.getFormSchema().module.webcmds; + if (webCmds instanceof Array) { + const webcmd = webCmds.find(item => item.id === command.cmpId); + if (webcmd) { + webcmd.refedHandlers = webcmd.refedHandlers || []; + webcmd.refedHandlers.push({ host: command.id, handler: command.handlerName }); + } + } + } + + /** + * 移除方法的引用:向"webCmds"节点移除引用 + */ + private removeWebCommandHandler(command: Command) { + const webCmds = this.useFormSchema.getFormSchema().module.webcmds; + if (webCmds instanceof Array) { + const webcmdIndex = webCmds.findIndex(item => item.id === command.cmpId); + if (webcmdIndex > -1) { + const webcmd = webCmds[webcmdIndex]; + const handlers = webcmd.refedHandlers || []; + const index = handlers.findIndex(item => item.host === command.id); + handlers.splice(index, 1); + if (handlers.length === 0) { + webCmds.splice(webcmdIndex, 1); + } + } + } + } + + /** + * 将变更同步到表单DOM中 + * @param commands 命令列表 + */ + private updateViewModel(commands: Array, activeViewModel: FormViewModel) { + if (!commands || !activeViewModel) { + return; + } + + activeViewModel.commands = commands.length > 0 ? commands.filter((command: Command) => command instanceof Command && command.toJson) + .map((command: Command) => command.toJson()) : []; + + const originalViewModel = this.useFormSchema?.getViewModelById(activeViewModel.id); + if (originalViewModel) { + originalViewModel.commands = activeViewModel.commands; + } + + } + /** + * 更新树表数据后,保持上次的收折状态。 + */ + private assignTreeCollapseState(currentTreeData: any, oldTreeData: any) { + if (oldTreeData.length) { + currentTreeData.map(currentTreeNode => { + const oldTreeNode = oldTreeData.find(oldData => oldData.id === currentTreeNode.id); + if (oldTreeNode) { + currentTreeNode.collapse = oldTreeNode['__fv_collapse__']; + } + }); + } + + } +} diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/composition/use-view-model-list.ts b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/composition/use-view-model-list.ts new file mode 100644 index 0000000000000000000000000000000000000000..767a658a12d69fda9445cf45e42a9c9471dcd93f --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/composition/use-view-model-list.ts @@ -0,0 +1,108 @@ +import { inject } from 'vue'; +import { ComponentType, FormViewModel, UseFormSchema } from '../../../../types'; +import { useViewModelName } from './use-view-model-name'; + +/** + * 按照组件引用顺序构造视图模型列表 + */ +export function useViewModelNavigation() { + + const viewModelNameBuilder = useViewModelName(); + let componentListInModalFrame: any[] = []; + const useFormSchema = inject('useFormSchema') as UseFormSchema; + const formSchema = useFormSchema.getFormSchema(); + + function getAllComponentIdsBySort(componentSchema: any, componentIdList: string[], isInModalFrame = false) { + if (!componentSchema) { + return componentIdList; + } + if (componentSchema.type === 'component-ref') { + componentIdList.push(componentSchema.component); + + if (isInModalFrame) { + componentListInModalFrame.push(componentSchema.component); + } + } + + if (!componentSchema.contents || componentSchema.contents.length === 0) { + return componentIdList; + } + + componentSchema.contents.forEach((content: any) => { + getAllComponentIdsBySort(content, componentIdList, isInModalFrame); + }); + + return componentIdList; + } + + /** + * 按照组件引用的顺序排列ViewModel节点 + */ + function sortViewModels() { + const predicateFunction = (component: any)=> component.componentType && component.componentType.toLowerCase() === 'page' + const pageComponents = useFormSchema.getComponetsByPredicate(predicateFunction); + + if (!pageComponents) { + return []; + } + const componentIdList: string[] = []; + const sortedViewModels: FormViewModel[] = []; + + pageComponents.forEach(pageComponent=>{ + getAllComponentIdsBySort(pageComponent, componentIdList); + + const rootViewModel = useFormSchema.getViewModelById(pageComponent.viewModel); + if (rootViewModel) { + sortedViewModels.push(rootViewModel); + } + + }) + + const components = formSchema.module.components.filter(component => component.componentType !== ComponentType.Frame); + componentIdList.forEach(componentId => { + const targetComponent = components.find(component => component.id === componentId); + if (targetComponent) { + sortedViewModels.push(useFormSchema.getViewModelById(targetComponent.viewModel) as FormViewModel); + } + }); + + return sortedViewModels; + } + + function resolveViewModelList(activeViewModelId: string = ''): { viewModelTabs: any[]; activeViewModel: FormViewModel } | undefined { + if (!formSchema?.module) { + return; + } + componentListInModalFrame = []; + const viewModelTabs: any[] = []; + + const viewModels = sortViewModels(); + viewModels.forEach(viewModel => { + if (viewModel.fakeDel) { + return; + } + const showName = viewModelNameBuilder.getViewModelName(viewModel.id, viewModel.name); + if (showName) { + const targetComponent = useFormSchema.getComponentByViewModelId(viewModel.id); + + viewModelTabs.push({ + id: viewModel.id, + name: showName, + componentId: targetComponent?.id, + isInModalFrame: componentListInModalFrame.includes(targetComponent?.id) + }); + } + }); + let activeViewModelIndex = 0; + if (activeViewModelId) { + const index = viewModels.findIndex(viewModel => viewModel.id === activeViewModelId); + if (index > 0) { + activeViewModelIndex = index; + } + } + return { viewModelTabs, activeViewModel: viewModels[activeViewModelIndex] }; + + } + + return { resolveViewModelList }; +} diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/composition/use-view-model-name.ts b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/composition/use-view-model-name.ts new file mode 100644 index 0000000000000000000000000000000000000000..a709728990521d5bea4e07c8a649edb50d7b815f --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/composition/use-view-model-name.ts @@ -0,0 +1,95 @@ +import { inject } from "vue"; +import { ComponentType, FormComponent, UseFormSchema } from "../../../../types"; + +export function useViewModelName() { + + const useFormSchema = inject('useFormSchema') as UseFormSchema; + const formSchema = useFormSchema.getFormSchema(); + + /** + * 在根组件以及弹窗组件中定位ComponentRef节点及其父节点 + * @param componentId 组件id + */ + function getComponentRefNode(componentId: string) { + const rootCmp = formSchema.module.components.find(component => component.componentType === 'frame'); + let componentRefResult = useFormSchema.selectNodeAndParentNode(rootCmp, (item) => item.component === componentId, rootCmp); + + if (componentRefResult) { + return componentRefResult; + } + + const modalFrames = formSchema.module.components.filter(c => c.componentType === ComponentType.modalFrame); + modalFrames && modalFrames.length && modalFrames.forEach((modalFrame: FormComponent) => { + componentRefResult = useFormSchema.selectNodeAndParentNode(modalFrame, (item) => item.component === componentId, modalFrame); + if (componentRefResult) { + return componentRefResult; + } + }); + } + + function getDataGridComponentName(component: any) { + const treeGrid = useFormSchema.selectNode(component, (item: any) => item.type === 'tree-grid'); + if (treeGrid) { + return '树表格组件'; + } + + const componentRefResult = getComponentRefNode(component.id); + if (!componentRefResult || !componentRefResult.parentNode) { + return; + } + const componentRefParentContainer = componentRefResult.parentNode; + + // 列表组件取父层容器的标题:容器可能为标签页或者section + if (componentRefParentContainer.type === 'tab-page' && componentRefParentContainer.title) { + return componentRefParentContainer.title + '组件'; + } + if (componentRefParentContainer.type === 'section' && componentRefParentContainer.mainTitle) { + return componentRefParentContainer.mainTitle + '组件'; + } + + return '表格组件'; + } + + function getViewModelName(viewModelId: string, componentName: string) { + const component = useFormSchema.getComponentByViewModelId(viewModelId); + if (!component || component.fakeDel) { + return; + } + switch (component.componentType) { + case ComponentType.Frame: { + return '根组件'; + } + case ComponentType.dataGrid: { + return getDataGridComponentName(component); + } + case ComponentType.uploader: { + return '附件组件'; + } + case ComponentType.listView: { + return '列表视图组件'; + } + case ComponentType.appointmentCalendar: { + return '预约日历组件'; + } + case ComponentType.modalFrame: { + return '弹窗页面组件'; + } + default: { + // 卡片组件取内部section的标题 + if (component.componentType.startsWith('form')) { + const section = component.contents.find(content => content.type === 'section'); + if (section && section.mainTitle) { + return section.mainTitle + '组件'; + } + + } + } + } + + return componentName + '组件'; + } + + return { + getViewModelName + }; +} diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/case.ts b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/case.ts new file mode 100644 index 0000000000000000000000000000000000000000..0c63bef08053a8ba61ded6950717e32f27ddff8a --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/case.ts @@ -0,0 +1,56 @@ +import { Extension } from './extension'; +import { ITreeNode } from './tree-node'; +import { OperationCollection } from './operation-collection'; + +export class Case implements ITreeNode { + + expanded?: boolean; + + id = ''; + + name = ''; + + condition = ''; + + handlers?: OperationCollection; + + belongedExt?: Extension; + + root?: ITreeNode; + + get children(): ITreeNode[] { + return this.handlers || []; + } + + get data(): { id: string; name: string } { + return { id: this.id, name: this.name }; + } + + constructor(caseJson?: any, extension?: Extension, parent?: ITreeNode) { + // 如果有参数就解析。必须是两个参数都存在。 + if (caseJson) { + this.parse(caseJson, extension); + } + } + + parse(caseJson: any, extension?: Extension) { + this.id = caseJson.id; + this.name = caseJson.name; + this.condition = caseJson.condition; + this.handlers = new OperationCollection(caseJson.handlers); + + if (extension) { + this.belongedExt = extension; + } + } + + toJson() { + const handlers = this.handlers ? this.handlers.map((handler) => handler.toJson()) : []; + return { + id: this.id, + name: this.name, + condition: this.condition, + handlers + }; + } +} diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/command.ts b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/command.ts new file mode 100644 index 0000000000000000000000000000000000000000..5ed682d126c3d0eb5e410a7f40b9167f39ea3ae6 --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/command.ts @@ -0,0 +1,317 @@ +import { IOperationNode } from './operation-node'; +import { SwitchNode } from './switch-node'; +import { ExecuteNode, OperationExtendLevel } from './execute-node'; +import { OperationCollection } from './operation-collection'; +import { ITreeNode } from './tree-node'; +import { ParamConfig } from './param'; +import { Extension } from './extension'; +import { Case } from './case'; +import { + BranchCollectionCommandItem, BranchCommandItem, CmdParameter, CmpMethodRefering, + CommandItemType, ICommandItem, WebCommand, WebCommandMetadata +} from './web-command'; + +export class Command implements ITreeNode { + public webCommand: WebCommand | undefined; + + expanded?: boolean; + + id = ''; + + code = ''; + + name = ''; + + params: ParamConfig[] = []; + + cmpId = ''; + + handlerName = ''; + + extensions: Extension[] = []; + + handlers?: OperationCollection; + + shortcut?: any; + + root?: ITreeNode; + + /** 是否为运行时定制添加的命令 */ + isRTCmd?: boolean; + + /** 命令的参数是否需要刷新--用于构件中删除命令参数的场景 */ + needRefreshParam = false; + + /** 命令是否已失效(被删除) */ + isInValid? = false; + + /** 命令描述信息 */ + description?: string; + + /** 命令所属控制器的名称 */ + controllerName?: string; + + /** 命令所属控制器的编号 */ + controllerCode?: string; + + isNewGenerated?: boolean; + + targetComponent?: string; + + /** 是否为内置控制器下的命令 */ + isFromPresetController?: boolean; + + /** 命令在构件中的名称 */ + handlerShowName?: string; + + get children(): ITreeNode[] { + return this.handlers || []; + } + + get data(): { id: string; name: string; code: string; description?: string; controllerCode?: string; controllerName?: string } { + return { + id: this.id, + name: this.name, + code: this.code, + description: this.description, + controllerCode: this.controllerCode, + controllerName: this.controllerName + }; + } + + /** + * 构造命令信息 + * @param webCommand 构件中的命令结构 + * @param commandJsonOrCmpId 表单中记录的命令结构或者构件id + */ + constructor(webCommand: WebCommand, commandJsonOrCmpId: any | string, webCmd?: WebCommandMetadata) { + if (!webCommand) { + console.warn('参数错误,webCommand不能为空! 无效的命令'); + return; + } + this.root = this; + this.webCommand = webCommand; + + this.handlerName = this.webCommand.Code; + this.handlerShowName = this.webCommand.Name; + if (this.webCommand.Description === '此处添加方法描述') { + this.webCommand.Description = ''; + } + if (typeof commandJsonOrCmpId === 'string') { + this.id = this.webCommand.Id; + this.code = this.webCommand.Code; + this.name = this.webCommand.Name; + this.cmpId = commandJsonOrCmpId; + this.description = this.webCommand.Description; + this.extensions = []; + this.addParamFromWebCommand(); + } else { + this.id = commandJsonOrCmpId.id; + this.code = commandJsonOrCmpId.code; + this.name = commandJsonOrCmpId.name; + this.description = this.webCommand.Description; + this.cmpId = commandJsonOrCmpId.cmpId; + this.isNewGenerated = commandJsonOrCmpId.isNewGenerated; + this.targetComponent = commandJsonOrCmpId.targetComponent; + this.extensions = []; + + // 添加快捷键配置 + this.shortcut = commandJsonOrCmpId.shortcut || {}; + + this.extensions = commandJsonOrCmpId.extensions ? commandJsonOrCmpId.extensions.map((extensionData) => { + const extension = new Extension(extensionData, commandJsonOrCmpId); + extension.root = this; + return extension; + }) : []; + + // 先加载表单记录的参数信息,再从构件中加载参数 + this.params = commandJsonOrCmpId.params && commandJsonOrCmpId.params.length ? + commandJsonOrCmpId.params.map((param) => new ParamConfig(param)) : []; + + this.addParamFromWebCommand(); + } + + if (webCmd) { + this.controllerCode = webCmd.Code; + this.controllerName = webCmd.Name; + + this.isFromPresetController = !webCmd.Code.includes('_frm_'); + } + + this.handlers = new OperationCollection(); + this.handlers.push(...this.loadHandlers(this.webCommand.Items, this.getExtensionMap(), this)); + + } + + toJson() { + const params = this.params.map((param) => param.toJson()); + + const extensions = this.extensions.map((extension) => extension.toJson()); + + const result: any = { + id: this.id, + code: this.code, + name: this.name, + params, + handlerName: this.handlerName, + cmpId: this.cmpId, + shortcut: this.shortcut ? JSON.parse(JSON.stringify(this.shortcut)) : {}, + extensions, + isRTCmd: this.isRTCmd, + isInvalid: this.isInValid + }; + if (this.isNewGenerated !== undefined) { + result.isNewGenerated = this.isNewGenerated; + } + if (this.targetComponent !== undefined) { + result.targetComponent = this.targetComponent; + } + + return result; + } + + /** + * 扩展信息放入map中. + * key是position最后一个guid,即被扩展节点的id. + * value是数组,一个节点可能有最多三种扩展:操作前,操作后,替换 + */ + private getExtensionMap() { + const map = new Map(); + this.extensions.reduce((result: Map, extension: Extension) => { + const position = typeof extension.position === 'string' ? + extension.position : (extension.position as string[])[(extension.position as string[]).length - 1]; + const extensionsInMap = result.has(position) ? result.get(position) as Extension[] : []; + extensionsInMap?.push(extension); + result.set(position, extensionsInMap); + return result; + }, map); + return map; + } + + private generateExecuteMethodNode(commandItem: ICommandItem, extensionMap: Map, parent: ITreeNode) { + const handler = new ExecuteNode(undefined, undefined, parent); + const methodItem = commandItem as CmpMethodRefering; + handler.id = methodItem.Id; + handler.code = methodItem.Code; + handler.name = methodItem.MethodName; + handler.method = methodItem.MethodCode; + handler.methodName = methodItem.MethodName; + handler.cmpCode = methodItem.ComponentCode; + handler.extendLevel = OperationExtendLevel.Comp; + handler.componentName = methodItem.ComponentName; + handler.componentCode = methodItem.ComponentCode; + + // 可扩展性 + handler.preExtendable = methodItem.IsBeforeExpansion; + handler.replaceable = methodItem.IsReplaced; + handler.postExtendable = methodItem.IsAfterExpansion; + + handler.root = this; + + // 处理扩展 + const extensions = extensionMap.get(handler.id); + const extensionPointMap = new Map<'InsertBefore' | 'Replace' | 'InsertAfter', Extension>(); + extensions?.reduce((result: Map<'InsertBefore' | 'Replace' | 'InsertAfter', Extension>, extension: Extension) => { + result.set(extension.type, extension); + return result; + }, extensionPointMap); + + if (extensionPointMap.has('InsertBefore') && methodItem.IsBeforeExpansion) { + handler.preExtension = extensionPointMap.get('InsertBefore'); + } + if (extensionPointMap.has('Replace') && methodItem.IsReplaced) { + handler.replaceExtension = extensionPointMap.get('Replace'); + handler.replaced = true; + } + if (extensionPointMap.has('InsertAfter') && methodItem.IsAfterExpansion) { + handler.postExtension = extensionPointMap.get('InsertAfter'); + } + return handler; + } + + private generateSwitchNode(commandItem: ICommandItem, extensionMap: Map, parent: ITreeNode) { + const handler = new SwitchNode(undefined, undefined, parent); + const branchItem = commandItem as BranchCollectionCommandItem; + handler.id = branchItem.Id; + handler.name = branchItem.Name; + handler.root = this; + handler.cases = branchItem.Items && branchItem.Items.length ? + branchItem.Items.filter((subItem: BranchCommandItem) => subItem.itemType === CommandItemType.Branch) + .map((branchItem: BranchCommandItem) => { + const casee = new Case(handler); + casee.id = branchItem.Id; + casee.name = branchItem.Name; + casee.condition = branchItem.Express; + casee.root = this; + casee.handlers = new OperationCollection(); + casee.handlers.push(...this.loadHandlers(branchItem.Items, extensionMap, handler)); + return casee; + }) : []; + return handler; + } + + private loadHandlers(items: ICommandItem[], extensionMap: Map, parent: ITreeNode) { + const commandHandlers = items.map((commandItem: ICommandItem) => { + if (commandItem.itemType === CommandItemType.MethodRefer) { + return this.generateExecuteMethodNode(commandItem, extensionMap, parent); + } + if (commandItem.itemType === CommandItemType.Branch || commandItem.itemType === CommandItemType.BranchCollection) { + return this.generateSwitchNode(commandItem, extensionMap, parent); + } + }); + return commandHandlers as Array; + } + + /** + * 标识已移除的参数 + * @param params 已有的参数 + * @param webCommand 构件中记录的参数 + */ + private processParams(params: any[], webCommand: any[]) { + const webCommandCode = webCommand.map(item => item.Code); + params.forEach(param => { + if (!webCommandCode.includes(param.name)) { + param.isDisused = true; + } + }); + } + + /** + * 追加命令的参数:表单viewModel中没有,但是构件中有的参数 + * 对比方式:表单viewModel.command.name===构件命令Code( 构件的命令编号不能随意更改) + */ + private addParamFromWebCommand() { + if (!this.params) { this.params = []; } + if (!this.webCommand || !this.webCommand.Parameters) { return; } + + // 标识已移除的参数 + this.processParams(this.params, this.webCommand.Parameters); + + this.webCommand.Parameters.reduce((result: ParamConfig[], parameter: CmdParameter) => { + const existingParam = this.params.find(item => item.name === parameter.Code); + // 存在的参数,更新类型、名称、说明 + if (existingParam) { + existingParam.type = parameter.ParameterType; + existingParam.shownName = parameter.Name; + existingParam.EditorType = parameter.EditorType; + existingParam.description = parameter.Description; + existingParam.controlSource = parameter.controlSource; + existingParam.defaultValue = parameter.defaultValue; + } + // 新增的参数 + else { + const param = new ParamConfig(); + param.name = parameter.Code; + param.shownName = parameter.Name; + param.type = parameter.ParameterType; + param.EditorType = parameter && parameter.EditorType ? parameter.EditorType : null; + param.value = ''; + param.description = parameter.Description; + param.controlSource = parameter.controlSource; + param.defaultValue = parameter.defaultValue; + result.push(param); + } + return result; + }, this.params); + } +} diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/execute-node.ts b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/execute-node.ts new file mode 100644 index 0000000000000000000000000000000000000000..f3c309b09389fa63b248a3bab629c9d3aadaab2a --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/execute-node.ts @@ -0,0 +1,145 @@ +import { Extension } from './extension'; +import { ITreeNode } from './tree-node'; +import { IOperationNode } from './operation-node'; +import { ParamConfig } from './param'; + +export enum OperationExtendLevel { + /** 构件 */ + 'Comp' = 1, + /** 表单 */ + 'Form' = 2 +} + +export class ExecuteNode implements ITreeNode, IOperationNode { + get data(): { id: string; name: string; code: string; componentCode: string; componentName: string } { + return { + id: this.id, + name: this.methodName, + code: this.code, + componentCode: this.componentCode, + componentName: this.componentName + }; + } + + get children(): ITreeNode[] { + const children = new Array(); + if (this.preExtension) { + children.push(this.preExtension); + } + if (this.replaceExtension) { + children.push(this.replaceExtension); + } else { + children.push({ data: { id: this.id + 1, name: this.name }, children: [], root: this.root }); + } + if (this.postExtension) { + children.push(this.postExtension); + } + + if (children.length === 1 && children[0] !== this.replaceExtension) { + // 没有扩展 + return []; + } + + return children; + } + + id = ''; + + code = ''; + + name = ''; + + // serviceRef: ServiceRef; // 记录任务引用的服务 + serviceRefId = ''; + + serviceName = ''; // 记录serviceRef的alias + + cmpCode = ''; + + method = ''; + + methodName = ''; + + params?: Array; + + extendLevel?: OperationExtendLevel; + + preExtendable?: boolean; + + replaceable?: boolean; + + postExtendable?: boolean; + + // 扩展节点属性 + belongedExt?: Extension; + + // 基础节点属性 + replaced?: boolean; + + preExtension?: Extension; + + replaceExtension?: Extension; + + postExtension?: Extension; + + // 扩展编辑标志 + isEditing?: boolean; + + root?: ITreeNode; + + /** 操作所属的构件编号 */ + componentCode = ''; + + /** 操作所属的构件名称 */ + componentName = ''; + + constructor(executeNodeJson?: any, extension?: Extension, parent?: ITreeNode) { + if (executeNodeJson) { + this.parse(executeNodeJson, extension); + } + + } + + parse(executeNodeJson: any, extension?: Extension) { + this.id = executeNodeJson.id; + this.code = executeNodeJson.code; + this.name = executeNodeJson.name; + this.serviceRefId = executeNodeJson.serviceRefId; + this.serviceName = executeNodeJson.serviceName; + this.cmpCode = executeNodeJson.cmpCode; + this.method = executeNodeJson.method; + this.methodName = executeNodeJson.methodName; + this.extendLevel = executeNodeJson.extendLevel || OperationExtendLevel.Form; + this.componentCode = executeNodeJson.componentCode; + this.componentName = executeNodeJson.componentName; + + if (extension) { + this.belongedExt = extension; + } + this.replaced = false; + + this.params = executeNodeJson.params && executeNodeJson.params.length ? + executeNodeJson.params.map((paramData) => new ParamConfig(paramData)) : []; + } + + toJson(): any { + if (!this.params) { + return; + } + + const params = this.params && this.params.length ? + this.params.map((paramConfig: ParamConfig) => paramConfig.toJson()) : []; + + return { + 'id': this.id, + 'type': 'executeNode', + 'code': this.code, + 'name': this.name, + 'serviceRefId': this.serviceRefId, + 'serviceName': this.serviceName, + 'cmpCode': this.cmpCode, + 'method': this.method, + 'params': params + }; + } +} diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/extension.ts b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/extension.ts new file mode 100644 index 0000000000000000000000000000000000000000..92fb93bd4741a7f781a0d3d45ec5d13b3bcf36ff --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/extension.ts @@ -0,0 +1,81 @@ +import { IOperationNode } from './operation-node'; +import { ITreeNode } from './tree-node'; +import { ExecuteNode } from './execute-node'; +import { SwitchNode } from './switch-node'; + +export class Extension implements ITreeNode { + get data(): { id: string; name: string } { + let name = ''; + switch (this.type) { + case 'InsertBefore': + name = '操作前扩展'; + break; + case 'Replace': + name = '操作替换'; + break; + case 'InsertAfter': + name = '操作后扩展'; + break; + } + return { id: this.id, name }; + } + + get children(): ITreeNode[] { + return this.tasks || []; + } + + isEditing = false; + + id = ''; + + position = ''; + + type: 'InsertBefore' | 'Replace' | 'InsertAfter' = 'InsertAfter'; // string; + + tasks?: Array; + + root?: ITreeNode; + + constructor(extensionJson?: any, parent?: ITreeNode) { + if (extensionJson) { + this.parse(extensionJson); + } + + } + + parse(extensionJson: any) { + const positionJson = extensionJson.position; + if (positionJson) { + if (positionJson instanceof Array) { + this.position = positionJson[positionJson.length - 1]; + } else if (typeof positionJson === 'string') { + this.position = positionJson; + } + } + this.type = extensionJson.type; + // extension 没有id 拼一个上去,否则树节点展示会有问题 + this.id = this.type + this.position; + + this.tasks = extensionJson.tasks && extensionJson.tasks.length ? + extensionJson.tasks + .filter((taskData) => !!taskData.type) + .map((taskData) => { + if (taskData.type === 'executeNode') { + return new ExecuteNode(taskData, this); + } + if (taskData.type === 'switchNode') { + return new SwitchNode(taskData.this); + } + }) + .filter((taskNode) => !!taskNode) : []; + } + + toJson() { + const tasks = this.tasks && this.tasks.length ? this.tasks.map((task) => task.toJson()) : []; + return { + position: this.position, + type: this.type, + tasks + };; + } +} diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/operation-collection.ts b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/operation-collection.ts new file mode 100644 index 0000000000000000000000000000000000000000..b51506b10830763c90868221471b08a0868b254e --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/operation-collection.ts @@ -0,0 +1,41 @@ +import { ITreeNode } from './tree-node'; +import { IOperationNode } from './operation-node'; +import { ExecuteNode } from './execute-node'; +import { SwitchNode } from './switch-node'; + +export class OperationCollection extends Array { + + constructor(handlersJson?: any) { + super(); + if (handlersJson && handlersJson.length) { + (handlersJson as any[]).filter((handlerData) => !!handlerData.type) + .forEach((handlerData) => { + if (handlerData.type === 'executeNode') { + this.push(new ExecuteNode(handlerData)); + } + if (handlerData.type === 'switchNode') { + this.push(new SwitchNode(handlerData)); + } + }); + } + } + + parse(handlersJson: any) { + if (handlersJson && handlersJson.length) { + (handlersJson as any[]).filter((handlerData) => !!handlerData.type) + .forEach((handlerData) => { + if (handlerData.type === 'executeNode') { + this.push(new ExecuteNode(handlerData)); + } + if (handlerData.type === 'switchNode') { + this.push(new SwitchNode(handlerData)); + } + }); + } + } + + toJson() { + const handlers = this.map((node: IOperationNode) => node.toJson()); + return handlers; + } +} diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/operation-node.ts b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/operation-node.ts new file mode 100644 index 0000000000000000000000000000000000000000..ee9f130ecf3074fa5c721e6052789a8686ddb3ec --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/operation-node.ts @@ -0,0 +1,7 @@ +export class IOperationNode { + id = ''; + + name = ''; + + toJson() { } +} diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/param.ts b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/param.ts new file mode 100644 index 0000000000000000000000000000000000000000..c6356df441a0153201029dcd1e9ab0a8ef311a32 --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/param.ts @@ -0,0 +1,53 @@ +export class ParamConfig { + name = '';; + + shownName = '';; + + type = '';; + + value = '';; // 表达式or值 + + description = '';; // 说明 + + /** 参数是否在构件中被移除 */ + isDisused = false; + + /** 参数的类型,用于参数编辑器 */ + controlSource: any; + + defaultValue: any; + + EditorType?: string | null; + + constructor(paramJson?: any) { + if (paramJson) { + this.parse(paramJson); + } + } + + parse(paramJson: any) { + this.name = paramJson.name; + this.shownName = paramJson.shownName; + this.value = paramJson.value; + this.description = paramJson.description; + this.controlSource = paramJson.controlSource; + this.defaultValue = paramJson.defaultValue; + + } + + /** + * 获取保存到DOM结构中的数据 + */ + toJson(): any { + const param: any = { + name: this.name, + shownName: this.shownName, + value: this.value + }; + if (this.defaultValue !== undefined) { + param.defaultValue = this.defaultValue; + } + + return param; + } +} diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/switch-node.ts b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/switch-node.ts new file mode 100644 index 0000000000000000000000000000000000000000..26a0a96411ec40ba2cd217706872b1a5a326210b --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/switch-node.ts @@ -0,0 +1,70 @@ +import { Extension } from './extension'; +import { ITreeNode } from './tree-node'; +import { IOperationNode } from './operation-node'; +import { Case } from './case'; + +export class SwitchNode implements ITreeNode, IOperationNode { + get data(): { id: string; name: string } { + return { id: this.id, name: this.name }; + } + + expanded?: boolean; + + get children(): ITreeNode[] { + return this.cases || []; + } + + id = '';; + + code = '';; + + name = '';; + + cases?: Array; + + belongedExt?: Extension; + + root?: ITreeNode; + + constructor(switchNodeJson?: any, extension?: Extension, parent?: ITreeNode) { + if (switchNodeJson) { + this.parse(switchNodeJson, extension); + } + } + + parse(switchNodeJson: any, extension?: Extension) { + this.id = switchNodeJson.id; + this.code = switchNodeJson.code; + this.name = switchNodeJson.name; + // this.cases = new SwitchCases(switchNodeJson.cases, serviceRefs); + this.cases = switchNodeJson.cases && switchNodeJson.cases.length ? + switchNodeJson.cases.map((caseData) => new Case(caseData, extension)) : []; + + if (extension) { + this.belongedExt = extension; + } + } + + // parseFromWebCmdMetadata(branchCollection: BranchCollectionCommandItem, serviceRefs: Map) { + // this.id = branchCollection.Id; + // this.name = branchCollection.Name; + // this.cases = new Array(); + // for (const branch of branchCollection.Items) { + // const casee = new Case(); + // casee.parseFromWebCmdMetadata(branch, serviceRefs); + // this.cases.push(casee); + // } + // } + + toJson(): any { + const cases = this.cases && this.cases.length ? this.cases.map((casee) => casee.toJson()) : []; + + return { + id: this.id, + type: 'switchNode', + code: this.code, + name: this.name, + cases + }; + } +} diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/tree-node.ts b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/tree-node.ts new file mode 100644 index 0000000000000000000000000000000000000000..1caec7d20b856e813d59d701263380454bfa966a --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/tree-node.ts @@ -0,0 +1,14 @@ +import { ParamConfig } from './param'; + +export interface ITreeNode { + data: { + id: string; + name: string; + code?: string; + }; + expanded?: boolean; + children: ITreeNode[]; + parent?: string; // 适配vue的treegrid + params?: ParamConfig[]; + root?: ITreeNode; +} diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/web-command.ts b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/web-command.ts new file mode 100644 index 0000000000000000000000000000000000000000..062fb0fad77d1132c98f675c8670cf3ea16a9316 --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/web-command.ts @@ -0,0 +1,166 @@ +/** 摘录于 @gsp-cmp/webcommand */ +export enum ConditionType { + IF = 0, + ELSEIF = 1, + ELSE = 2 +} + +export enum CommandItemType { + MethodRefer = 0, + Branch = 1, + BranchCollection = 2 +} + +export interface CmdParameter { + Id: string; + + Code: string; + + Name: string; + + Description: string; + + ParameterType: string; + + IsRetVal: boolean; + + EditorType?: string; + + controlSource?: string; + + defaultValue?: any; +} + +export interface ICommandItem { + + itemType: CommandItemType; + + itemCode: string; + + itemName: string; + + itemId: string; +} + +export interface WebCommand { + Id: string; + + Code: string; + + Name: string; + + Description: string; + + Parameters: Array; + + SourceCode: string; + + Items: Array; +} + +export interface ExtendProperty { + FormCode: string; + + IsCommon: boolean; +} + +export interface WebCommandMetadata { + Id: string; + + Code: string; + + Name: string; + + Description: string; + + Extends: ExtendProperty; + + Commands: Array; +} + +export interface CmpMethodParamConfig { + + ParamCode: string; + + ParamName: string; + + ParamExpress: string; +} + +export interface CmpMethodRefering { + Id: string; + + Code: string; + + Name: string; + + ComponentId: string; + + ComponentCode: string; + + ComponentName: string; + + ComponentPath: string; + + MethodId: string; + + MethodCode: string; + + MethodName: string; + + IsReplaced: boolean; + + IsBeforeExpansion: boolean; + + IsAfterExpansion: boolean; + + ParamConfigs: Array; + + itemType: CommandItemType; + + itemId: string; + + itemCode: string; + + itemName: string; +} + +export interface BranchCommandItem extends ICommandItem { + Id: string; + + Code: string; + + Name: string; + + ConditionType: ConditionType; + + Express: string; + + Items: Array; + + itemType: CommandItemType; + + itemId: string; + + itemCode: string; + + itemName: string; +} + +export interface BranchCollectionCommandItem extends ICommandItem { + Id: string; + + Code: string; + + Name: string; + + Items: Array; + + itemType: CommandItemType; + + itemId: string; + + itemCode: string; + + itemName: string; +} diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/webcmp-metadata.ts b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/webcmp-metadata.ts new file mode 100644 index 0000000000000000000000000000000000000000..37249e9ed884d3ad7e37dde1ad0df0eed54f1343 --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/entity/webcmp-metadata.ts @@ -0,0 +1,56 @@ + + +/** 构件操作参数 */ +export declare class Parameter { + Id: string; + + Code: string; + + Name: string; + + Description: string; + + ParameterType: string; + + IsRetVal: boolean; +} + +/** 构件操作 */ +export declare class Operation { + Id: string; + + Code: string; + + Name: string; + + Description: string; + + Parameters: Array; +} + +/** + * Web构件元数据 + */ +export declare class WebComponentMetadata { + Id: string; + + Code: string; + + Description: string; + + Source: string; + + Operations: Array; + + IsCommon: boolean; + + ClassName: string; + + FormCode: string; + + PackageName: string; + + PackageVersion: string; + + Version: number; +} diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/method-manager.component.tsx b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/method-manager.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..d04048c9dd9bcdcafa10b252b1cf65830fbf198a --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/method-manager.component.tsx @@ -0,0 +1,227 @@ +import { SetupContext, defineComponent, ref, computed, inject } from "vue"; +import { FNotifyService, FModal, FSplitter, FSplitterPane } from "@farris/ui-vue/components"; +import { FormViewModel, FormWebCmd, UseFormSchema } from "../../../types"; +import { MethodBuilder } from "./composition/build-method"; +import { useViewModelNavigation } from "./composition/use-view-model-list"; +import { methodManagerProps, MethodManagerProps } from "./method-manager.props"; +import { WebCommand, WebCommandMetadata } from "./entity/web-command"; +import FMethodEditor from '../../../components/view-model-designer/method-manager/components/method-editor/method-editor.component'; +import FMethodList from '../../../components/view-model-designer/method-manager/components/method-list/method-list.component'; +import FMethodSelector from '../../../components/view-model-designer/method-manager/components/method-selector/method-selector.component'; + +import './method-manager.scss'; + +export default defineComponent({ + name: 'FMethodManager', + props: methodManagerProps, + emits: [] as (string[] & ThisType) | undefined, + setup(props: MethodManagerProps, context: SetupContext) { + const LoadingService: any = inject('FLoadingService'); + const messageBoxService: any = inject('FMessageBoxService'); + const useFormSchema = inject('useFormSchema') as UseFormSchema; + const notifyService: any = new FNotifyService(); + notifyService.globalConfig = { position: 'top-center' }; + + const viewModelNavigationComposition = useViewModelNavigation(); + const methodBuilderComposition = new MethodBuilder(useFormSchema); + + const activeViewModel = ref(); + const viewModelNavgationData = ref(); + const commandsTreeData = ref(); + const methodListRef = ref(); + + /** 是否显示选择方法的弹窗 */ + const methodSelectorVisible = ref(false); + + /** 是否显示重命名方法的弹窗 */ + const methodEditorVisible = ref(false); + + const viewModelTabClass = computed(() => (viewModelTabId: string) => { + return { 'f-listview-active': activeViewModel.value && activeViewModel.value.id === viewModelTabId }; + }); + + /** + * 刷新方法列表 + */ + function refreshMethod() { + const loadingInstance = LoadingService?.show(); + methodBuilderComposition.build(activeViewModel.value?.commands || []).then(commands => { + commandsTreeData.value = commands || []; + methodListRef.value.refreshMethodList(commandsTreeData.value, activeViewModel.value); + loadingInstance.value.close(); + }); + } + + /** + * 切换组件模型 + */ + function onChangeViewModelTab(viewModel: FormViewModel) { + activeViewModel.value = useFormSchema.getViewModelById(viewModel.id); + methodListRef.value.selectedTreeNode = null; + refreshMethod(); + } + /** + * 渲染组件模型导航 + */ + function renderViewModelNavgation() { + const viewModelTabs = viewModelNavgationData.value || []; + return
    + { + viewModelTabs.map((viewModel: any) => { + return
    onChangeViewModelTab(viewModel)}> +
    +
    + +
    +
    +
    ; + }) + } +
; + } + + /** + * 刷新组件列表和方法列表 + */ + function refreshMethodManager() { + const activeViewModelId = activeViewModel.value?.id; + const viewModelInformation = viewModelNavigationComposition.resolveViewModelList(activeViewModelId); + activeViewModel.value = viewModelInformation?.activeViewModel; + viewModelNavgationData.value = viewModelInformation?.viewModelTabs; + + refreshMethod(); + } + + context.expose({ refreshMethodManager }); + + /** + * 新增方法后事件 + * @param newCommandInfo 新方法、新控制器的信息 + */ + function onMethodAdded(newCommandInfo: { selectedCommands: Array<{ command: WebCommand; controller: WebCommandMetadata; }>; newWebControllers: FormWebCmd[]; }) { + commandsTreeData.value = methodBuilderComposition.addCommand(newCommandInfo, activeViewModel.value); + methodListRef.value.refreshMethodList(commandsTreeData.value, activeViewModel.value); + methodSelectorVisible.value = false; + } + /** + * 删除方法 + */ + function onDeleteMethod() { + if (!methodListRef.value.selectedTreeNode || !methodListRef.value.isCommandNodeSelected) { + notifyService.warning({ message: '请先选择方法' }); + return; + } + messageBoxService.question('确定移除方法?', '', () => { + const { nextCommandId, commandsTreeData: newCommandsTreeData } = methodBuilderComposition.removeCommand(methodListRef.value.selectedTreeNode, activeViewModel.value); + commandsTreeData.value = newCommandsTreeData; + methodListRef.value.selectedTreeNode = null; + methodListRef.value.refreshMethodList(commandsTreeData.value, activeViewModel.value, nextCommandId); + + notifyService.success({ message: '方法已移除,请重新绑定控件交互事件!' }); + }, () => { }); + } + + /** + * 弹出编辑方法的窗口 + */ + function onClickEditMethod() { + if (!methodListRef.value.selectedTreeNode || !methodListRef.value.isCommandNodeSelected) { + notifyService.warning({ message: '请先选择方法' }); + return; + } + if (!methodListRef.value?.isValidCommandSelected) { + notifyService.warning({ message: '方法已失效,不支持重命名' }); + return; + } + methodEditorVisible.value = true; + } + /** + * 方法编号、名称修改后事件 + */ + function onMethodEdited(newCommandData: any) { + const { code: previousCommandCode } = methodListRef.value.selectedTreeNode; + const newCommandsTreeData = methodBuilderComposition.editCommand(methodListRef.value.selectedTreeNode, activeViewModel.value, newCommandData); + commandsTreeData.value = newCommandsTreeData; + methodListRef.value.refreshMethodList(commandsTreeData.value, activeViewModel.value); + if (previousCommandCode !== newCommandData.code) { + notifyService.success({ message: '修改方法编号后请重新绑定控件交互事件!' }); + } + + methodEditorVisible.value = false; + } + + const toolbarItemClass = computed(() => { + return { + 'toolbar-item': true, + 'disable': methodListRef.value?.isValidCommandSelected ? false : true + }; + }); + const toolbarItemCanRemoveClass = computed(() => { + return { + 'toolbar-item': true, + 'disable': methodListRef.value?.selectedTreeNode && methodListRef.value?.isCommandNodeSelected ? false : true + }; + }); + return () => { + return ( +
+ + +
+ {renderViewModelNavgation()} +
+
+ +
+
+
{ methodSelectorVisible.value = true; }}> +
+ 添加方法 +
+
+
+
+ 移除方法 +
+
+ +
+
+ 重命名方法 +
+
+ +
+
+
+ { + methodSelectorVisible.value ? + + { methodSelectorVisible.value = false; }}> + : '' + } + { + methodEditorVisible.value ? + + { methodEditorVisible.value = false; }}> + : '' + } +
+ ); + }; + } +}); diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/method-manager.props.ts b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/method-manager.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..2961d1267b6201d7613ce195435f36b9fb91c4d5 --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/method-manager.props.ts @@ -0,0 +1,7 @@ +import { ExtractPropTypes } from "vue"; + +export const methodManagerProps = { + schema: { type: Object, default: {} } +} as Record; + +export type MethodManagerProps = ExtractPropTypes; diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/method-manager.scss b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/method-manager.scss new file mode 100644 index 0000000000000000000000000000000000000000..8c2a431af5d15ce89ba3dc39e0caa8538e1778ef --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/method-manager.scss @@ -0,0 +1,113 @@ +.f-method-designer { + height: 100%; + display: flex; + flex-direction: column; + + .view-model-list { + overflow: auto; + height: 100%; + background: #fcfdff !important; + + ul { + padding: 0; + } + + .f-template-listnav-row .list-nav-link .nav-item-name { + opacity: 1; + } + } + + .view-model-toolbar { + display: flex; + align-items: center; + line-height: 18px; + color: #34495e; + padding-top: 14px; + padding-bottom: 16px; + + + .toolbar-item { + display: flex; + cursor: pointer; + } + + .toolbar-item .toolbar-item-icon { + position: relative; + height: 15px; + width: 15px; + border: 1px solid #5b89fe; + border-radius: 3px; + margin-right: 6px; + } + + .toolbar-item .toolbar-item-icon::after { + content: "T"; + position: absolute; + top: 0; + left: 2px; + font-size: 12px; + line-height: 12px; + color: #4e56c4; + } + + .toolbar-item .toolbar-item-icon::before { + font-family: FarrisIcons; + display: flex; + justify-content: center; + align-items: flex-end; + height: 10px; + width: 10px; + line-height: 8px; + color: #00cdba; + background-color: #fff; + position: absolute; + bottom: -2px; + right: -4px; + } + + .toolbar-item .toolbar-item-icon-add::before { + content: "\e11e"; + } + + .toolbar-item .toolbar-item-icon-delete::before { + content: "\e11b"; + color: #fa6c00; + } + + .toolbar-item .toolbar-item-icon-edit::before { + content: "\e10b"; + color: #5670d5; + } + + .toolbar-item:hover { + color: #5B89FE; + } + + .toolbar-item-spilter { + width: 1px; + height: 12px; + margin: 0 10px; + background-image: linear-gradient(180deg, rgba(40, 60, 93, 0) 0%, rgba(40, 60, 93, 0.1) 23%, rgba(40, 60, 93, 0.1) 52%, rgba(40, 60, 93, 0.1) 84%, rgba(40, 60, 93, 0) 100%); + border-radius: 0.5px; + } + + .toolbar-item.disable { + color: #8b8686; + cursor: auto; + + .toolbar-item-icon-edit::before, + .toolbar-item-icon-delete::before { + color: #8b8686; + } + + .toolbar-item-icon-edit::after, + .toolbar-item-icon-delete::after { + color: #8b8686; + } + + .toolbar-item-icon { + border-color: #8b8686; + } + } + } +} \ No newline at end of file diff --git a/packages/mobile-designer/src/components/components/view-model-designer/method-manager/service/id.service.ts b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/service/id.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..62f779141b7c5b1efad4d82acaade4d54bb13447 --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/method-manager/service/id.service.ts @@ -0,0 +1,33 @@ +export class IdService { + private static previous = 0; + + generate() { + return this.guid(); + } + + guid() { + + const _crypto = window.crypto ? crypto : window['msCrypto']; + if (_crypto) { + return (([1e7] as any) + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => + (c ^ (_crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16) + ); + } + return this.uuid(); + } + + uuid() { + const timestamp = Date.now().valueOf(); + let uuid = 0; + + if (timestamp > IdService.previous) { + IdService.previous = timestamp; + uuid = timestamp; + } else { + IdService.previous += 100; + uuid = IdService.previous; + } + + return uuid.toString(16); + } +} diff --git a/packages/mobile-designer/src/components/components/view-model-designer/view-model-designer.component.tsx b/packages/mobile-designer/src/components/components/view-model-designer/view-model-designer.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..1c66bd5e50d427e2b26e1376f8996564437edf2f --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/view-model-designer.component.tsx @@ -0,0 +1,61 @@ +import { SetupContext, defineComponent, ref, computed } from "vue"; +import { viewModelDesignerProps, ViewModelDesignerProps } from "./view-model-designer.props"; +import FMethodManager from '../../components/view-model-designer/method-manager/method-manager.component'; + +import './view-model-designer.scss'; +import { FNotifyService } from "@farris/ui-vue/components"; + +export default defineComponent({ + name: 'FViewModelDesigner', + props: viewModelDesignerProps, + emits: [], + setup(props: ViewModelDesignerProps, context) { + const methodMangerRef = ref(); + const selectedModelTab = ref('method'); + const modelTabClass = computed(() => (modelType: string) => { + return { active: selectedModelTab.value === modelType }; + }); + const showTabContent = computed(() => (modelType: string) => { + return selectedModelTab.value !== modelType; + }); + function onChangeModelTab(modelType: string) { + if (modelType === selectedModelTab.value) { + return; + } + if (modelType === 'variable') { + const notifyService: any = new FNotifyService(); + notifyService.globalConfig = { position: 'top-center' }; + notifyService.warning('暂不支持'); + return; + } + selectedModelTab.value = modelType; + } + /** 刷新模型页 */ + function refreshViewModelDesigner() { + methodMangerRef.value?.refreshMethodManager(); + } + context.expose({ refreshViewModelDesigner }); + + return () => { + return ( +
+
+
+
+ +
+
+ +
+
+ ); + }; + } +}); diff --git a/packages/mobile-designer/src/components/components/view-model-designer/view-model-designer.props.ts b/packages/mobile-designer/src/components/components/view-model-designer/view-model-designer.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..231556d6a793332d833e2ab20b0316bbb62ff3df --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/view-model-designer.props.ts @@ -0,0 +1,7 @@ +import { ExtractPropTypes } from "vue"; + +export const viewModelDesignerProps = { + schema: { type: Object, default: {} } +} as Record; + +export type ViewModelDesignerProps = ExtractPropTypes; diff --git a/packages/mobile-designer/src/components/components/view-model-designer/view-model-designer.scss b/packages/mobile-designer/src/components/components/view-model-designer/view-model-designer.scss new file mode 100644 index 0000000000000000000000000000000000000000..bab7863b7d9db7f0fb540a820e36112f0e1ffbc1 --- /dev/null +++ b/packages/mobile-designer/src/components/components/view-model-designer/view-model-designer.scss @@ -0,0 +1,44 @@ +.f-view-model-designer { + background-color: #fff; + height: 100%; + overflow: auto; + display: flex; + flex-direction: column; + + .view-model-navbar { + height: 44px; + min-height: 44px; + padding-top: 6px !important; + align-items: center; + display: flex; + margin: 0 4px 0 20px; + border-top: 1px solid #E6E9F0 !important; + + .nav { + flex-wrap: nowrap; + margin: 0 auto; + border-radius: 10px; + overflow-y: hidden !important; + overflow-x: auto !important; + border: 1px solid #E6E9F0 !important; + + li { + font-size: 14px; + white-space: nowrap; + align-items: center; + display: flex; + cursor: pointer; + font-weight: 500; + padding: 0px 66px; + line-height: 34px; + } + + li.active { + background: #eff4ff; + border-radius: 10px; + color: #5b89fe; + transition: all 0.1s ease-out 0s; + } + } + } +} \ No newline at end of file diff --git a/packages/mobile-designer/src/components/composition/command-builder.service.ts b/packages/mobile-designer/src/components/composition/command-builder.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..14bfc476fd283cb6f8ede9df92dc7e000645096e --- /dev/null +++ b/packages/mobile-designer/src/components/composition/command-builder.service.ts @@ -0,0 +1,219 @@ +import { ref } from 'vue'; +import { FNotifyService } from '@farris/ui-vue/components'; +import { WebCommand } from '../components/view-model-designer/method-manager/entity/web-command'; +import { MetadataDto, UseFormSchema } from '../types'; +import axios from 'axios'; +import { UseCommandBuilderService, WebComponentMetadata } from '../types/command'; +import { MetadataService } from './metadata.service'; + + +/** + * 新增构件、新增构件方法的服务 + */ +export function useCommandBuilderService(formSchemaService: UseFormSchema): UseCommandBuilderService { + const metadataService = new MetadataService(); + const notifyService: any = new FNotifyService(); + /** 构件元数据构造数据 */ + let buildInfo: any; + /** ts代码文件路径 */ + let tsFilePathName: string; + /** 设计器与代码视图的事件通讯 */ + const eventBetweenDesignerAndCodeView = ref<{ eventName: string, eventValue: any }>({ eventName: '', eventValue: null }); + + let hasWebCmp = false; + let hasWebCmd = false; + /** + * 校验当前表单是否已有web构件和命令构件 private + */ + function checkHasController(targetWebCmd?: { controllerCode: string, controllerName: string }): Promise { + const formInfo = formSchemaService.getFormMetadataBasicInfo(); + const suffix = '_frm_Controller'; + // 默认构件命令为'表单编号_frm_Controller' + buildInfo = { + code: formInfo.code + suffix, + name: formInfo.name + suffix, + namespace: formInfo.nameSpace, + bizObjId: formInfo.bizobjectID, + relativePath: formInfo.relativePath, + extendProperty: { IsCommon: false, FormCode: formInfo.code } + }; + if (targetWebCmd && targetWebCmd.controllerCode && targetWebCmd.controllerCode.includes(formInfo.code)) { + buildInfo.code = targetWebCmd.controllerCode; + buildInfo.name = targetWebCmd.controllerName; + } + + const webCmpFileName = buildInfo.code + '.webcmp'; + const webCmdFileName = buildInfo.code + '.webcmd'; + tsFilePathName = '/' + buildInfo.relativePath + '/' + buildInfo.code + '.ts'; + return metadataService.validateRepeatName(buildInfo.relativePath, webCmpFileName). + then((notExsited) => { + hasWebCmp = !notExsited; + return metadataService.validateRepeatName(buildInfo.relativePath, webCmdFileName).then((notExsited) => { + hasWebCmd = !notExsited; + if (hasWebCmd) { + // 查询命令构件信息---用于获取命令构件id + return metadataService.loadMetadata(webCmdFileName, buildInfo.relativePath); + } else { + return new Promise((resolve, reject) => { + // 模拟异步请求 + resolve(null); + }); + } + }).then((data) => { + if (hasWebCmd && data) { + buildInfo.webCmdId = data.id; + } + return new Promise((resolve, reject) => { + // 模拟异步请求 + resolve(hasWebCmp && hasWebCmd); + }); + }); + + }).catch(error => { + console.error('校验relativePath出现异常', error); + }); + } + + /** + * 创建命令构件 private + */ + function createWebCommand(callback: (param: any) => void, param: any) { + const fileName = buildInfo.code + '.webcmd'; + const metadatadto = { + id: '', + nameSpace: buildInfo.namespace, + code: buildInfo.code, + name: buildInfo.name, + fileName: fileName, + type: 'WebCommand', + bizobjectID: buildInfo.bizObjId, + relativePath: buildInfo.relativePath, + extendProperty: JSON.stringify(buildInfo.extendProperty), + content: '', + extendable: false, + nameLanguage: {} + } as MetadataDto; + + metadataService.initializeMetadataEntity(metadatadto).then((data => { + data.fileName = metadatadto.fileName; + buildInfo.webCmdId = data.id; + return metadataService.createMetadata(data); + }) + ).then(result => { + if (result['ok']) { + callback(param); + } else { + const msg = '命令构件创建失败'; + notifyService.error(msg); + } + }); + } + /** + * 创建构件:先创建web构件,再创建命令构件 private + */ + function createWebMetadata(callback: (param: any) => void, param: any) { + const fileName = buildInfo.code + '.webcmp'; + + const metadatadto = { + id: '', + nameSpace: buildInfo.namespace, + code: buildInfo.code, + name: buildInfo.name, + fileName: fileName, + type: 'WebComponent', + bizobjectID: buildInfo.bizObjId, + relativePath: buildInfo.relativePath, + extendProperty: JSON.stringify(buildInfo.extendProperty), + content: '', + extendable: false, + nameLanguage: {} + } as MetadataDto; + + // 已存在web构件, 只创建命令构件 + if (hasWebCmp) { + createWebCommand(callback, param); + return; + } + // 不存在web构件,先创建web构件 + metadataService.initializeMetadataEntity(metadatadto).then((data) => { + data.fileName = metadatadto.fileName; + const path = buildInfo.relativePath + '/'; + const tsFileName = buildInfo.code + '.ts'; + const sourcePath = path + tsFileName; + const webComponent = JSON.parse(data.content) as WebComponentMetadata; + webComponent.Source = sourcePath.toString(); + data.content = JSON.stringify(webComponent); + return metadataService.createMetadata(data); + }).then(result => { + if (result['ok']) { + const url = '/api/dev/main/v1.0/tsfile/create?path=' + tsFilePathName+'&formType=Vue'; + return axios.post(url, {}).then((res) => res.data); + } else { + const msg = 'Web构件创建失败'; + notifyService.error({ message: msg, position: 'top-center' }); + return new Promise((resolve, reject) => { + // 模拟异步请求 + reject(msg); + });; + } + }).then(data => { + // web构件创建成功,若没有命令构件,则创建命令构件,若已有命令构件,则直接触发打开代码视图 + if (!hasWebCmd) { + createWebCommand(callback, param); + } else { + callback(param); + } + }); + } + + + /** + * 添加自定义方法(ts方法) function + */ + function emitAddTsMethodEvent(param: { tsFilePathName: string, methodCode: string, methodName: string }) { + eventBetweenDesignerAndCodeView.value = { eventName: 'openCodeViewWithNewMethod', eventValue: param }; + } + /** + * 添加自定义方法(ts方法) + * @param methodCode 方法编号 + * @param methodName 方法名称 + */ + function addControllerMethod(methodCode: string, methodName: string) { + checkHasController().then((result) => { + // 若不存在构件,先创建构件 + if (!result) { + createWebMetadata(emitAddTsMethodEvent, { tsFilePathName: tsFilePathName, methodCode, methodName }); + } else { + emitAddTsMethodEvent({ tsFilePathName: tsFilePathName, methodCode, methodName }); + + } + }); + } + + /** + * 添加命令构件方法(webcmd)private + */ + function emitAddWebCommandMethod(param: { tsFilePathName: string, command: WebCommand }) { + eventBetweenDesignerAndCodeView.value = { eventName: 'addNewMethodToWebCmd', eventValue: param }; + } + /** + * 添加命令构件方法(webcmd) + * @param command 参照命令 + * @param targetWebCmd 目标控制器编号、名称 + */ + function addWebCommandMethod(command: WebCommand, targetWebCmd?: { controllerCode: string, controllerName: string }) { + checkHasController(targetWebCmd).then((result) => { + // 若不存在构件,先创建构件 + if (!result) { + createWebMetadata(emitAddWebCommandMethod, { tsFilePathName: tsFilePathName, command }); + } else { + emitAddWebCommandMethod({ tsFilePathName: tsFilePathName, command }); + } + }); + } + function getBuildInfo() { + return buildInfo; + } + + return { eventBetweenDesignerAndCodeView, addControllerMethod, addWebCommandMethod, getBuildInfo }; +} diff --git a/packages/mobile-designer/src/components/composition/command.service.ts b/packages/mobile-designer/src/components/composition/command.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..0a0e93de7f3df8d858b5a66188c6616cd70c816b --- /dev/null +++ b/packages/mobile-designer/src/components/composition/command.service.ts @@ -0,0 +1,1243 @@ +/* eslint-disable prefer-destructuring */ +/* eslint-disable complexity */ +/* eslint-disable no-use-before-define */ +import { cloneDeep } from "lodash-es"; +import axios, { AxiosResponse } from 'axios'; +import { FLoadingService,FMessageBoxService } from "@farris/ui-vue/components"; +import { MetadataService } from "./metadata.service"; +import { FormWebCmd, UseFormSchema, UseFormStateMachine } from "../types"; +import { CommandMetadataConvertor } from "./command/command-metadata"; +import { UseCommandBuilderService, UseFormCommandService } from "../types/command"; +import { IdService } from "../components/view-model-designer/method-manager/service/id.service"; +import { useParameterEditorData } from "./use-parameter-editor-data"; +import { useEventParameterData } from "./use-event-parameter-data"; +import { getSupportedControllerMethods } from "./command/supported-controller"; + +export function useFormCommandService(formSchemaService: UseFormSchema, useFormStateMachineComposition: UseFormStateMachine, loadingService: FLoadingService, webCmpBuilderService: UseCommandBuilderService): UseFormCommandService { + const metadataService = new MetadataService(); + const messageService: any = FMessageBoxService; + /** 命令列表下的参数 */ + let propertyItem: any; + /** 内置构件控制器 */ + let internalCommandList = [] as any; + /** 已绑定事件列表 */ + let boundEventsList: any; + /** dom中的webCmds节点 */ + let commands: any; + /** dom中的视图模型数据 */ + let viewModelData: any; + /** 单个内置构件控制器 */ + const internalCommandListItem = { + controllerName: { + label: '', + name: '', + id: '', + }, + controllerList: [ + ] as any + }; + /** 控制器下的命令列表 */ + const controllerListItem = { + label: '', + name: '', + id: '', + handlerName: '', + /** 当前命令需要选择目标组件 */ + showTargetComponent: false, + /** 当前命令选择的目标组件的id */ + cmpId: '', + componentLists: [] as any, + isNewGenerated: undefined, + isRTCmd: undefined, + isInvalid: false, + property: [] as any + }; + + let newControllerMethodBindingInfo: { + controlData: any, + componentId: string, + viewModelId: string, + eventCode: string, + methodCode: string, + methodName: string, + setPropertyRelates?: any + } | null; + + const { getEventParameterData } = useEventParameterData(formSchemaService, useFormStateMachineComposition); + const { assembleOutline, assembleSchemaFieldsByComponent, + assembleStateVariables, + } = useParameterEditorData(formSchemaService); + function getCommands() { + return commands; + } + /** 0.获取webcmd控制器(其参数为空)*/ + function checkCommands(): Promise { + // const loadingInstance = loadingService['show']({ message: '数据加载中,请稍候....' }); + return new Promise((resolve, reject) => { + loadWebcmd().then((webCmds) => { + commands = cloneDeep(webCmds); + generateInternalCommandList(); + checkViewModelCommands(webCmds); + syncActions(); + // loadingInstance.value.close(); + resolve([]); + }).catch((error) => { + messageService.warning(error); + // loadingInstance.value.close(); + reject(error); + }); + }); + } + /** + * 返回目前支持的控制器命令 + */ + function filterSupportedCommand(controllerContent: any) { + const { Id: controllerId, Commands: allCommands } = controllerContent; + return getSupportedControllerMethods(controllerId, allCommands); + } + + /** 1.生成webcmd控制器列表 + * loadWebcmd=>loadCommand + */ + function loadWebcmd(): Promise { + return new Promise((resolve, reject) => { + loadCommandsInCurrentPath().then(() => { + const commandsInfos = formSchemaService.getCommands(); + const metadataInfo = formSchemaService.getFormMetadataBasicInfo(); + if (!metadataInfo || !commandsInfos) { + resolve([]); + return; + } + const requestCommandsMetadata = commandsInfos.map((webcmdInfo: FormWebCmd) => { + return metadataService.GetRefMetadata(metadataInfo.relativePath || '', webcmdInfo.id).then((response) => { + webcmdInfo.code = webcmdInfo.code ? webcmdInfo.code : response.data.code; + webcmdInfo.nameSpace = webcmdInfo.nameSpace ? webcmdInfo.nameSpace : response.data.nameSpace; + return response.data; + }).catch(() => { + if (webcmdInfo.refedHandlers && webcmdInfo.refedHandlers.length) { + const msg = '获取元数据XXX失败,是否移除表单的引用?'.replace('XXX', webcmdInfo.name); + messageService.question(msg); + } + formSchemaService.setCommands(formSchemaService.getCommands().filter(webCmd => webCmd.id !== webcmdInfo.id)); + }); + }); + axios.all(requestCommandsMetadata).then(axios.spread((...metadataList) => { + // !!item进行转化 + const metadataContentList = metadataList.filter(item => item !== undefined && item !== null).map(item => { + const content = new CommandMetadataConvertor().InitFromJobject(JSON.parse(item['content'])); + const supportedCommands = item.nameSpace.includes('.Front') ? content.Commands : filterSupportedCommand(content); + content.Commands = supportedCommands; + return content; + }); + resolve(metadataContentList); + })).catch((error) => { + + reject(error); + + }); + }); + }); + } + /** 1-1.将当前表单相关的自定义构件追加到webCmds中 + * private + * loadWebCmdsInCurrentPath + */ + function loadCommandsInCurrentPath(): Promise { + const commandsInfos = formSchemaService.getCommands(); + const metadataInfo = formSchemaService.getFormMetadataBasicInfo(); + return new Promise((resolve, reject) => { + metadataService.GetMetadataList(metadataInfo.relativePath, '.webcmd').then((response: AxiosResponse) => { + if (!response.data) { + resolve(null); + return; + } + for (const item of response.data) { + let extendProperty: any; + try { + extendProperty = JSON.parse(item.extendProperty); + // eslint-disable-next-line no-empty + } catch (e) { + } + + // 比对表单编号,若不匹配说明是其他表单关联的自定义构件 + if (extendProperty && extendProperty.FormCode !== metadataInfo.code) { + continue; + } + + // 只要是属于此表单的都需要加载,除非是已经添加到表单中 + if (!commandsInfos.find(webcmdInfo => item.id === webcmdInfo.id)) { + // 画布渲染过程中,可能会在控件上补充属性,这种变更用户不感知,所以不需要通知IDE框架 + window['suspendChangesOnForm'] = true; + const webcmd: FormWebCmd = { + id: item.id, + path: item.relativePath, + name: item.fileName, + refedHandlers: [] + }; + commandsInfos.push(webcmd); + window['suspendChangesOnForm'] = false; + } + } + resolve(null); + }).catch((error) => { + reject(error); + }); + }); + } + + /** 2.生成内置构件中的控制器列表数据 */ + function generateInternalCommandList() { + commands = cloneDeep(getUniqueValue(commands, 'Id')); + internalCommandList = [] as any; + commands.forEach(controller => { + internalCommandListItem.controllerName = { + label: controller.Code, + name: controller.Name, + id: controller.Id, + }; + if (!controller.Commands) { + controller['Commands'] = []; + } + controller.Commands.forEach(command => { + controllerListItem.label = command.Code; + controllerListItem.name = command.Name; + controllerListItem.id = command.Id; + controllerListItem.handlerName = command.Code; + if (command.Parameters) { + command.Parameters.forEach(params => { + propertyItem = { + id: params.Id, + name: cloneDeep(params.Code), + value: '', + shownName: params.Name, + description: params.Description, + editorType: cloneDeep(params.EditorType), + isRetVal: params.IsRetVal, + parameterType: params.parameterType, + origin: cloneDeep(params), + context: { + // 通用编辑器数据 + generalData: { + assembleOutline, + assembleSchemaFieldsByComponent, + assembleStateVariables + }, + // 回调方法或状态机动作或目标组件数据列表 + data: getEventParameterData(params.controlSource?.context?.data?.value) || [], + } + }; + controllerListItem.property.push(cloneDeep(propertyItem)); + }); + } + else { + command['Parameters'] = []; + controllerListItem.property = []; + } + internalCommandListItem.controllerList.push(cloneDeep(controllerListItem)); + controllerListItem.property = []; + }); + internalCommandList.push(cloneDeep(internalCommandListItem)); + internalCommandListItem.controllerList = []; + }); + return internalCommandList; + + } + /** 2-1.去重 */ + function getUniqueValue(itemWithSameValue, identifier) { + const value = cloneDeep(itemWithSameValue); + for (let i = 0; i < value.length; i++) { + for (let j = i + 1; j < value.length; j++) { + if (value[i][identifier] === value[j][identifier]) { + value.splice(j, 1); + j--; + } + } + } + itemWithSameValue = cloneDeep(value); + return itemWithSameValue; + } + + /** 3.检查视图模型的命令是否符合存储规范 */ + function checkViewModelCommands(webCmds) { + + // 设计器自动补充的属性,不记录变更 + window['suspendChangesOnForm'] = true; + + formSchemaService.getViewModels().forEach(viewModel => { + if (!viewModel.commands) { + return; + } + viewModel.commands.map(curCmd => { + const webCmd = webCmds.find(item => item.Id === curCmd.cmpId); + if (!webCmd) { + curCmd.isInvalid = true; + return; + } + const commandInWebCmd = webCmd.Commands.find(c => c.Code === curCmd.handlerName); + + if (commandInWebCmd) { + curCmd.isInvalid = false; + + // 将表单中记录的参数名称更新为控制器中的参数名称 + if (curCmd.params && curCmd.params.length && commandInWebCmd.Parameters && commandInWebCmd.Parameters.length) { + curCmd.params.forEach((curParam) => { + const paramInWebCmd = commandInWebCmd.Parameters.find(param => param.Code === curParam.name); + if (paramInWebCmd) { + curParam.shownName = paramInWebCmd.Name; + delete curParam.description; + } + }); + } + } else { + curCmd.isInvalid = true; + } + }); + + }); + + window['suspendChangesOnForm'] = false; + } + + /** 4.渲染表单取出所有的已绑定事件,同步至actions节点 */ + function syncActions() { + if (commands) { + let components = cloneDeep(formSchemaService.getComponents()); + components = components.filter(c => !c.fakeDel); + const findEvents = []; + let allBoundEvents = findBoundEvent(components, findEvents, 'root-viewmodel'); + if (formSchemaService.getFormSchema().module.toolbar) { + allBoundEvents = findBoundEventInToolbar(formSchemaService.getFormSchema().module.toolbar, allBoundEvents); + } + getUniqueEvent(allBoundEvents); + const array = []; + const viewModel = cloneDeep(formSchemaService.getFormSchema().module.viewmodels); + if (allBoundEvents.length !== 0) { + allBoundEvents = setActions(getComponentId(matchWebcmd(matchVM(allBoundEvents, viewModel))), 0, array); + } + formSchemaService.getFormSchema().module.actions = cloneDeep(allBoundEvents); + } + } + /** 4-1-1.遍历components节点,找到所有事件 */ + function findBoundEvent(components, findEvents, viewModelId, excludedEvents?: string[]) { + // ----------------------ToDo-------------------------------- + // controlService = injector.get(DesignerHostSettingService).controlService; + components.forEach((componentsItem) => { + if (componentsItem['viewModel']) { viewModelId = componentsItem['viewModel']; } + if (componentsItem['contents']) { + findBoundEvent(componentsItem['contents'], findEvents, viewModelId); + } + if (componentsItem['items']) { + findBoundEvent(componentsItem['items'], findEvents, viewModelId); + } + if (componentsItem['children']) { + findBoundEvent(componentsItem['children'], findEvents, viewModelId); + } + if (componentsItem['fields']) { + findBoundEvent(componentsItem['fields'], findEvents, viewModelId); + } + if (componentsItem['editor']) { + const editor = [] as any; + editor.push(cloneDeep(componentsItem['editor'])); + findBoundEvent(editor, findEvents, viewModelId, ['linkedLabelClick']); + } + if (componentsItem['toolbar']) { + if (componentsItem['toolbar']['contents']) { + findBoundEvent(componentsItem['toolbar']['contents'], findEvents, viewModelId); + } + // 移动:导航工具栏 + if (componentsItem['toolbar']['items']) { + findBoundEvent(componentsItem['toolbar']['items'], findEvents, viewModelId); + } + } + // ListView + if (componentsItem['type'] === "ListView") { + if (componentsItem['contentTemplate']) { + const contentTemplateDom = componentsItem['contentTemplate']; + if (contentTemplateDom['toolbar']) { + if (contentTemplateDom['toolbar']['contents']) { + findBoundEvent(contentTemplateDom['toolbar']['contents'], findEvents, viewModelId); + } + } + } + // 移动:列表滑动 + if (componentsItem['swipeToolbar'] && componentsItem['swipeToolbar']['items']) { + findBoundEvent(componentsItem['swipeToolbar']['items'], findEvents, viewModelId); + } + + } + // table类型 + if (componentsItem['type'] === "Table" && componentsItem['rows']) { + const rows = componentsItem['rows']; + rows.forEach(rowsItem => { + if (rowsItem['columns']) { + const columns = rowsItem['columns']; + columns.forEach(columnsItem => { + if (columnsItem['editor']) { + findBoundEvent([columnsItem['editor']], findEvents, viewModelId); + } + }); + } + }); + } + // 筛选方案 + if (componentsItem['fieldConfigs']) { + const fieldConfigs = componentsItem['fieldConfigs']; + fieldConfigs.forEach(fieldConfigsItem => { + if (fieldConfigsItem['control']) { + findBoundEvent([fieldConfigsItem['control']], findEvents, viewModelId); + } + }); + } + // 筛选条 + if (componentsItem['filterList']) { + const fieldConfigs = componentsItem['filterList']; + fieldConfigs.forEach(fieldConfigsItem => { + if (fieldConfigsItem['control']) { + findBoundEvent([fieldConfigsItem['control']], findEvents, viewModelId); + } + }); + } + + // 侧边栏 + if (componentsItem['type'] === "Sidebar" && componentsItem['toolbar'] && componentsItem['toolbar']['items']) { + findBoundEvent(componentsItem['toolbar']['items'], findEvents, viewModelId); + } + + // 智能输入框的弹出表单模式 + if (componentsItem['modalConfig'] && componentsItem['modalConfig']['footerButtons'] && componentsItem['modalConfig']['footerButtons'].length) { + findBoundEvent(componentsItem['modalConfig']['footerButtons'], findEvents, viewModelId); + } + + // 列表右键菜单中的按钮 + if (componentsItem['type'] === "DataGrid" && componentsItem['contextMenuItems'] && componentsItem['contextMenuItems'].length) { + findBoundEvent(componentsItem['contextMenuItems'], findEvents, viewModelId); + } + + // 查询结果工具栏中的按钮 + if (componentsItem['type'] === "QdpFramework" && componentsItem['inputTemplate'] && componentsItem['inputTemplate'].length) { + findBoundEvent(componentsItem['inputTemplate'], findEvents, viewModelId); + } + // ----------------------ToDo-------------------------------- + // const controlEventPropertyIDList = controlService.getControlEventPropertyIDList(); + const controlEventPropertyIDList = []; + const eventKeys = Object.keys(controlEventPropertyIDList); + for (let i = 0; i < eventKeys.length; i++) { + if (excludedEvents && excludedEvents.length && excludedEvents.includes(eventKeys[i])) { + continue; + } + const exist = Object.prototype.hasOwnProperty.call(componentsItem, eventKeys[i]); + if (exist && componentsItem[eventKeys[i]]) { + // 判定三段式路径 + const paths = componentsItem[eventKeys[i]].includes('.') ? componentsItem[eventKeys[i]].split('.') : undefined; + const vmId = paths !== undefined ? paths[1] : viewModelId; + const cmdLabel = paths !== undefined ? paths[2] : componentsItem[eventKeys[i]]; + const findEventsItem = { + id: componentsItem['id'], + eventLabel: eventKeys[i], + eventName: controlEventPropertyIDList[eventKeys[i]], + commandLabel: cmdLabel, + viewModelId: vmId + }; + findEvents.push(cloneDeep(findEventsItem)); + } + } + }); + return findEvents; + } + /** 4-1-2.遍历查看是否存在toolbar节点,若有,则找到所有事件 */ + function findBoundEventInToolbar(toolbar, findEvents) { + if (toolbar['items']) { + const items = toolbar['items']; + const vmKeys = Object.keys(items); + for (let j = 0; j < vmKeys.length; j++) { + const vmValue = items[vmKeys[j]]; + vmValue.forEach(vmValueItem => { + // const controlEventPropertyIDList = controlService.getControlEventPropertyIDList(); + // ----------------------ToDo-------------------- + const controlEventPropertyIDList = []; + const eventKeys = Object.keys(controlEventPropertyIDList); + for (let i = 0; i < eventKeys.length; i++) { + const exist = Object.prototype.hasOwnProperty.call(vmValueItem, eventKeys[i]); + if (exist && vmValueItem[eventKeys[i]]) { + // 判定三段式路径 + const paths = vmValueItem[eventKeys[i]].includes('.') ? vmValueItem[eventKeys[i]].split('.') : undefined; + const vmId = paths !== undefined ? paths[1] : vmKeys[j]; + const cmdLabel = paths !== undefined ? paths[2] : vmValueItem[eventKeys[i]]; + const findEventsItem = { + id: vmValueItem['id'], + eventLabel: eventKeys[i], + eventName: controlEventPropertyIDList[eventKeys[i]], + commandLabel: cmdLabel, + viewModelId: vmId + }; + findEvents.push(cloneDeep(findEventsItem)); + } + + // 识别二级按钮 + if (vmValueItem.items && vmValueItem.items.length) { + vmValueItem.items.forEach(childItem => { + if (!childItem[eventKeys[i]]) { + return; + } + const paths = childItem[eventKeys[i]].includes('.') ? childItem[eventKeys[i]].split('.') : undefined; + const vmId = paths !== undefined ? paths[1] : vmKeys[j]; + const cmdLabel = paths !== undefined ? paths[2] : childItem[eventKeys[i]]; + const findEventsItem = { + id: childItem['id'], + eventLabel: eventKeys[i], + eventName: controlEventPropertyIDList[eventKeys[i]], + commandLabel: cmdLabel, + viewModelId: vmId + }; + findEvents.push(cloneDeep(findEventsItem)); + }); + + } + } + }); + } + } + return findEvents; + } + /** 4-2.去重-去除特殊情况下存储的相同事件及命令 */ + function getUniqueEvent(allBoundEvents) { + const value = cloneDeep(allBoundEvents); + for (let i = 0; i < value.length; i++) { + for (let j = i + 1; j < value.length; j++) { + if (value[i]['id'] === value[j]['id'] && value[i]['eventLabel'] === value[j]['eventLabel']) { + value.splice(j, 1); + j--; + } + } + } + allBoundEvents = cloneDeep(value); + return allBoundEvents; + } + /** 4-3.根据遍历components和toolbar得出的所有事件,结合viewmodel和webcmd,得到参数值 */ + function matchVM(allBoundEvents, viewModel) { + const updatedBoundEvents = [] as any; + allBoundEvents.forEach(boundEvenItem => { + viewModel.forEach(viewModelItem => { + if (viewModelItem.id === boundEvenItem.viewModelId) { + viewModelItem.commands.forEach(commandItem => { + if (commandItem.code === boundEvenItem.commandLabel) { + const event = { + id: boundEvenItem.id, + eventLabel: boundEvenItem.eventLabel, + eventName: boundEvenItem.eventName, + viewModelId: boundEvenItem.viewModelId, + commandId: commandItem.id, + commandLabel: boundEvenItem.commandLabel, + commandName: commandItem.name, + handlerName: commandItem.handlerName, + cmpId: commandItem.cmpId, + isNewGenerated: commandItem.isNewGenerated || false, + isRTCmd: commandItem['isRTCmd'], + isInvalid: commandItem.isInvalid || false, + params: cloneDeep(commandItem.params), + controllerId: '', + controllerLabel: '', + controllerName: '', + }; + if (commandItem['targetComponent']) { + event['targetComponent'] = commandItem.targetComponent; + } + updatedBoundEvents.push(cloneDeep(event)); + } + }); + } + }); + }); + return updatedBoundEvents; + } + /** 4-4.根据遍历components得出的所有事件,结合webcmd,得到控制器值 */ + function matchWebcmd(allBoundEvents) { + commands.forEach(commandItem => { + allBoundEvents.forEach(allBoundEventsItem => { + if (commandItem.Id === allBoundEventsItem.cmpId) { + commandItem.Commands.forEach(item => { + if (item.Code === allBoundEventsItem.handlerName) { + allBoundEventsItem.controllerId = commandItem.Id; + allBoundEventsItem.controllerLabel = commandItem.Code; + allBoundEventsItem.controllerName = commandItem.Name; + } + }); + } + }); + }); + allBoundEvents.forEach(function (allBoundEventsItem, index) { + // 失效命令 + if (allBoundEventsItem.controllerId === '' && allBoundEventsItem.controllerLabel === '' && allBoundEventsItem.controllerName === '') { + allBoundEvents.splice(index, 1); + } + }); + return allBoundEvents; + } + /** 4-5.根据遍历components得出的事件的viewmodelId,得到componentId值 */ + function getComponentId(allBoundEvents) { + const components = formSchemaService.getComponents(); + const viewModel = formSchemaService.getViewModels(); + for (let i = 0; i < components.length; i++) { + allBoundEvents.forEach(allBoundEventsItem => { + if (viewModel[i] && viewModel[i].id === allBoundEventsItem.viewModelId) { + allBoundEventsItem.componentId = components[i].id; + } + }); + } + return allBoundEvents; + } + /** 4-6.标准样式化actions */ + function setActions(allBoundEvents, num, array) { + const action = { + sourceComponent: { + id: '', + viewModelId: '', + map: [] as any + } + }; + if (!allBoundEvents[num]) { + return; + } + action.sourceComponent.id = allBoundEvents[num].id; + action.sourceComponent.viewModelId = allBoundEvents[num].viewModelId; + let i = num; + while (i < allBoundEvents.length) { + if (allBoundEvents[i].id === action.sourceComponent.id) { + const mapItem = { + event: { + label: allBoundEvents[i].eventLabel, + name: allBoundEvents[i].eventName + }, + targetComponent: { + id: allBoundEvents[i].componentId, + viewModelId: allBoundEvents[i].viewModelId + }, + command: { + id: allBoundEvents[i].commandId, + label: allBoundEvents[i].commandLabel, + name: allBoundEvents[i].commandName, + handlerName: allBoundEvents[i].handlerName, + params: cloneDeep(allBoundEvents[i].params), + cmpId: allBoundEvents[i].cmpId, + isNewGenerated: allBoundEvents[i].isNewGenerated || false, + isRTCmd: allBoundEvents[i]['isRTCmd'], + isInvalid: allBoundEvents[i].isInvalid || false, + }, + controller: { + id: allBoundEvents[i].controllerId, + label: allBoundEvents[i].controllerLabel, + name: allBoundEvents[i].controllerName + } + }; + if (allBoundEvents[i]['componentId']) { + mapItem.targetComponent.id = allBoundEvents[i].componentId; + } + action.sourceComponent.map.push(cloneDeep(mapItem)); + i++; + if (i === allBoundEvents.length) { + array.push(cloneDeep(action)); + } + } + else { + array.push(cloneDeep(action)); + setActions(allBoundEvents, i, array); + break; + } + } + return array; + } + + /** + * 更新事件编辑器获取到的commands + * webCmdsChanged=>commandsChanged + */ + function commandsChanged(newController) { + newController.forEach(newControllerItem => { + const item = new CommandMetadataConvertor().InitFromJobject(newControllerItem); + commands.push(cloneDeep(item)); + }); + checkViewModelCommands(commands); + } + + /** + * 事件面板调用-1 + * a. 合并视图模型带参数的命令&控制器中无参数的命令 + * b. 生成绑定事件列表 + * */ + function findParamtersPosition(propertyData: any, events: any, viewModelId: string, allComponentList: any) { + boundEventsList = []; + const viewModelData = cloneDeep(formSchemaService.getViewModels()); + // 1. 遍历当前container的组件dom结构的所有事件的值 + events.forEach(event => { + if (propertyData[event.label]) { + // 三段式path:root-viewmodel.items-component-viewmodel.itemsAddItem1 或 一段path:itemsAddItem1 + const paths = propertyData[event.label].includes('.') ? propertyData[event.label].split('.') : undefined; + const { recordCommand, recordController } = handleParams(viewModelData, paths, propertyData[event.label], viewModelId, allComponentList); + generateBoundEventsList(event, events, recordController, recordCommand); + } + }); + return boundEventsList; + } + /** 1-a.在视图模型中找到命令,并填充参数值*/ + function handleParams(viewModelData, paths, propCmdLabel, viewModelId, allComponentList) { + const vmId = paths !== undefined ? paths[1] : viewModelId; + const cmdLabel = paths !== undefined ? paths[2] : propCmdLabel; + let cmpId; + if (allComponentList.length && vmId !== undefined) { + const componentList = allComponentList.find(componentListsItem => componentListsItem.viewModelId === vmId); + cmpId = componentList === undefined ? undefined : componentList.componentId; + } + // 若命令不存在,则提示!,并允许用户绑定其他命令 + let recordCommand = { + id: 'abandoned', + code: cmdLabel, + label: cmdLabel, + name: cmdLabel, + params: [], + handlerName: cmdLabel, + cmpId: '', + shortcut: {}, + extensions: [], + isInvalid: false, + isNewGenerated: undefined, + showTargetComponent: false, + targetComponent: cmpId, + isRTCmd: undefined, + }; + let recordController = { + controllerName: { + label: '', + name: '', + id: '', + }, + controllerList: { + }, + boundEvents: { + } + }; + viewModelData.forEach(element => { + // 5. 寻找命令-确认itemsAddItem1的位置 + if (element.code.includes(vmId)) { + element.commands.forEach(viewModelcommand => { + // 6-1. 若命令存在,且参数不为空 + if (viewModelcommand.code === cmdLabel && viewModelcommand.params.length !== 0) { + // 判断是否为已失效命令 + if (!viewModelcommand['isInvalid']) { + // 7-1. 若存在参数,则合并该命令在VM与控制器中的参数值 + viewModelcommand.params.forEach(param => { + // 7-1-1.handlerName唯一,code为带前后缀的命令英文名,name为中文名,param是当前待合并的参数(有值) + const combinedParamtersResult = combinedParamters(param, viewModelcommand, recordController, recordCommand, cmpId); + recordController = combinedParamtersResult.recordController; + recordCommand = combinedParamtersResult.recordCommand; + }); + } + else { + // 命令已被删除 + recordCommand.id = 'deleted'; + } + } + // 6-2 若命令存在,且参数为空的处理 + else if (viewModelcommand.code === cmdLabel && viewModelcommand.params.length === 0) { + // 判断是否为已失效命令 + if (!viewModelcommand['isInvalid']) { + // 7-2. 不需要进行内置构件的处理,仅记录了命令所在的控制器及带前后缀的命令名称 + internalCommandList.forEach(controller => { + if (controller.controllerName.id === viewModelcommand.cmpId) { + controller.controllerList.forEach(command => { + if (command.handlerName === viewModelcommand.handlerName) { + recordController = cloneDeep(controller); + recordCommand = getRecordController(command, viewModelcommand, recordCommand, cmpId); + } + }); + } + }); + } else { + // 命令已被删除 + recordCommand.id = 'deleted'; + } + } + }); + + } + }); + return { + recordController, + recordCommand + }; + } + /** 1-a.合并视图模型带参数的命令&控制器中无参数的命令 */ + function combinedParamters(paramWithValue: any, viewModelcommand, recordController, recordCommand, cmpId) { + // 7-1-2. handlerName唯一,code为带前后缀的命令英文名,paramWithValue是当前待合并的参数(有值) + internalCommandList.forEach(controller => { + // 控制器相同 + if (controller.controllerName.id === viewModelcommand.cmpId) { + controller.controllerList.forEach(command => { + // 7-1-3. command.handlerName来自内置构件;handlerName来自视图模型 + if (command.handlerName === viewModelcommand.handlerName) { + command.property.forEach(paramWithoutValue => { + if (paramWithoutValue.name === paramWithValue.name) { + paramWithoutValue.value = cloneDeep(paramWithValue.value); + } + }); + recordController = cloneDeep(controller); + recordCommand = getRecordController(command, viewModelcommand, recordCommand, cmpId); + } + }); + } + }); + return { + recordController, + recordCommand + }; + } + /** 1-a.存储绑定事件对应的控制器参数值 */ + function getRecordController(command, viewModelcommand, recordCommand, cmpId) { + // 1-a-1. 由于vm未记录控制器,此处根据命令找到控制器,并将有值的参数对应的命令command记录 + recordCommand = cloneDeep(command); + // 1-a-2.记录带前后缀的英文名、中文名/参数 + recordCommand.label = viewModelcommand.code; + recordCommand.name = viewModelcommand.name; + recordCommand.id = viewModelcommand.id; + recordCommand.targetComponent = cmpId; + recordCommand['isRTCmd'] = viewModelcommand['isRTCmd']; + return recordCommand; + } + /** 1-b.生成已绑定的事件列表 */ + function generateBoundEventsList(event, events, recordController, recordCommand) { + if (recordController !== undefined) { + const boundEventsListItem = { + command: { + }, + controller: { + }, + boundEvents: { + } + }; + events.forEach(each => { + if (each.label === event.label) { boundEventsListItem.boundEvents = cloneDeep(each); } + }); + boundEventsListItem.controller = cloneDeep(recordController.controllerName); + boundEventsListItem.command = cloneDeep(recordCommand); + boundEventsList.push(cloneDeep(boundEventsListItem)); + } + } + + + /** 事件面板调用-2 + * 2-a.找到视图模型,在视图模型中增删改命令及参数 */ + function viewModelDomChanged(propertyData: any, events: any, viewModelId: string, domActions: any) { + const viewModelData = cloneDeep(formSchemaService.getViewModels()); + events.forEach(event => { + // 1. 遍历当前container的dom结构的所有事件的值 + if (propertyData[event.label]) { + // 三段式path:root-viewmodel.items-component-viewmodel.itemsAddItem1 或 一段path:itemsAddItem1 + const paths = propertyData[event.label].includes('.') ? propertyData[event.label].split('.') : undefined; + handleViewModel(viewModelData, paths, propertyData[event.label], viewModelId, domActions, propertyData); + } + }); + formSchemaService.setViewmodels(cloneDeep(viewModelData)); + } + /** 2-a.在视图模型中增删改命令及参数 */ + function handleViewModel(viewModelData, paths, propCmdLabel, viewModelId, domActions, propertyData) { + const newCommand = { + id: '', + code: '', + name: '', + params: [], + handlerName: '', + cmpId: '', + shortcut: {}, + extensions: [], + isInvalid: false, + isNewGenerated: undefined, + targetComponent: undefined, + isRTCmd: undefined, + }; + const vmId = paths !== undefined ? paths[1] : viewModelId; + const cmdLabel = paths !== undefined ? paths[2] : propCmdLabel; + // 4. 遍历找到存储命令的第二层path——path[1],viewModel的items-component-viewmodel + viewModelData.forEach(element => { + if (element.code === vmId) { + let commandExist = false; + // 5. 借助整体dom中的domActions节点,寻找命令-确认itemsAddItem1的位置 + domActions.forEach(action => { + // 6. 匹配domActions,取出所有需要的值,包括命令名/事件名/参数/id等等; + if (action.sourceComponent.id === propertyData.id) { + action.sourceComponent.map.forEach(mapItem => { + if (mapItem.command.label === cmdLabel) { + newCommand.id = cloneDeep(mapItem.command.id); + newCommand.code = mapItem.command.label; + newCommand.name = mapItem.command.name; + newCommand.params = serializeParameter(mapItem.command.params); + newCommand.handlerName = mapItem.command.handlerName; + newCommand.cmpId = cloneDeep(mapItem.controller.id); + newCommand.shortcut = mapItem.command.shortcut; + newCommand.isRTCmd = mapItem.command['isRTCmd']; + newCommand.isNewGenerated = mapItem.command.isNewGenerated || false; + newCommand.isInvalid = mapItem.command.isInvalid || false; + newCommand.extensions = mapItem.command.extensions; + if (mapItem.command.isInvalid) { + newCommand.isInvalid = mapItem.command.isInvalid; + } + newCommand.targetComponent = mapItem.targetComponent.id; + } + }); + } + }); + // 7-1. 匹配viewModel中存储的是否有该命令:itemsAddItem1,若存在该命令,则更新新的值 + element.commands.forEach(function (command, index) { + if (command.code === cmdLabel) { + commandExist = true; + element.commands.splice(index, 1, cloneDeep(newCommand)); + } + }); + // 7-2. 若没有该命令,则进行添加;并且不为已删除的命令,则添加 + if (!commandExist && newCommand.id !== 'abandoned') { + element.commands.push(cloneDeep(newCommand)); + } + } + // 8-1. 剪切掉其他同名称的命令 + else { + // 8-1. 匹配其他viewModel中是否有同名称的命令,若有,则删除; + element.commands.forEach(function (command, index) { + if (command.code === cmdLabel) { + element.commands.splice(index, 1); + } + }); + } + }); + } + + + /** 事件面板调用-3 + * 3-a.存储事件编辑器「视图模型」中所有的viewModel数据 */ + function viewModelDisplay() { + let savedViewModel = [] as any; + const savedViewModelItem = { + controllerName: { + label: '', + name: '', + id: '', + }, + controllerList: [ + ] + }; + /** 控制器下的命令列表 */ + const controllerListItem = { + label: '', + name: '', + id: '', + handlerName: '', + showTargetComponent: false, + isNewGenerated: undefined, + isRTCmd: undefined, + isInvaild: false, + cmpId: '', + componentLists: [], + targetComponent: undefined, + property: [ + + ] + }; + if (!formSchemaService.getModule().actions) { + return savedViewModel; + } + + formSchemaService.getModule().actions.forEach(actionItem => { + actionItem.sourceComponent.map.forEach(mapItem => { + savedViewModelItem.controllerName.id = mapItem.controller.id; + savedViewModelItem.controllerName.name = mapItem.controller.name; + savedViewModelItem.controllerName.label = mapItem.controller.label; + savedViewModel.push(cloneDeep(savedViewModelItem)); + savedViewModel = getUniqueController(savedViewModel); + }); + }); + + savedViewModel.forEach(savedViewModelItem => { + formSchemaService.getModule().actions.forEach(actionItem => { + actionItem.sourceComponent.map.forEach(mapItem => { + if (mapItem.controller.id === savedViewModelItem.controllerName.id) { + controllerListItem.label = mapItem.command.label; + controllerListItem.name = mapItem.command.name; + controllerListItem.id = mapItem.command.id; + controllerListItem.handlerName = mapItem.command.handlerName; + controllerListItem.property = cloneDeep(mapItem.command.params); + controllerListItem.cmpId = mapItem.controller.id; + controllerListItem.isNewGenerated = mapItem.isNewGenerated || false; + controllerListItem.isRTCmd = mapItem['isRTCmd']; + controllerListItem.isInvaild = mapItem.inInvalid || false; + if (mapItem.targetComponent.id) { + controllerListItem.targetComponent = mapItem.targetComponent.id; + } else { + controllerListItem.targetComponent = undefined; + } + savedViewModelItem.controllerList.push(cloneDeep(controllerListItem)); + } + }); + }); + }); + return savedViewModel; + } + + /** 去重 */ + function getUniqueController(itemWithSameValue) { + const value = cloneDeep(itemWithSameValue); + for (let i = 0; i < value.length; i++) { + for (let j = i + 1; j < value.length; j++) { + if (value[i]['controllerName']['id'] === value[j]['controllerName']['id']) { + value.splice(j, 1); + j--; + } + } + } + itemWithSameValue = cloneDeep(value); + return itemWithSameValue; + } + + /** 触发新增控制器方法 */ + function addControllerMethod(propertyData: any, viewModelId: string, parameters: any) { + const { methodCode, methodName } = resolveNewMethodForCodeEditor(propertyData, viewModelId, parameters); + webCmpBuilderService.addControllerMethod(methodCode, methodName); + } + /** + * private + * 序列化视图模型中的命令参数 + * @param parameters 参数 + * @returns + */ + function serializeParameter(parameters: any[]) { + const results = [] as any; + if (parameters && Array.isArray(parameters) && parameters.length > 0) { + parameters.forEach(parameter => { + const item: any = {}; + if (Object.prototype.hasOwnProperty.call(parameter, 'name')) { + item.name = parameter.name; + } + if (Object.prototype.hasOwnProperty.call(parameter, 'shownName')) { + item.shownName = parameter.shownName; + } + if (Object.prototype.hasOwnProperty.call(parameter, 'value')) { + item.value = parameter.value; + } + results.push(item); + }); + } + return results; + } + + /** + * 交互面板跳转到代码视图前,收集控件信息,用于自动绑定新增的方法 + * @param propertyData 控件schema值 + * @param viewModelId 控件所属视图模型id + * @param parameters 点击添加新方法后,交互面板返回的参数 + * @param controlTypeName 控件类型名称 + */ + function resolveNewMethodForCodeEditor(propertyData: any, viewModelId: string, parameters: any): { methodCode: string, methodName: string } { + const eventCode = parameters.newFuncEvents && parameters.newFuncEvents.label || ''; + const eventName = parameters.newFuncEvents && parameters.newFuncEvents.name || ''; + const upperEventCode = eventCode.length > 1 ? (eventCode.slice(0, 1).toUpperCase() + eventCode.slice(1)) : eventCode; + + let methodCode = 'method'; + let methodName = '方法'; + + // 方法编号:控件类型+事件编号;方法名称:控件名称+事件名称 + const { controlInfo } = parameters; + if (controlInfo) { + const controlType = controlInfo.type; + const controlName = propertyData.title || propertyData.text || propertyData.caption || controlInfo.name; + if (controlType && controlType.length > 1 && controlName) { + const lowerControlType = controlType.slice(0, 1).toLowerCase() + controlType.slice(1); + methodCode = `${lowerControlType}${upperEventCode}`.replace(/_/g, '').replace(/-/g, ''); + + const joinChar = ''; + methodName = `${controlName}${joinChar}${eventName}`.replace(/_/g, '').replace(/-/g, ''); + + } + } + + newControllerMethodBindingInfo = { + controlData: propertyData, + viewModelId, + componentId: formSchemaService.getComponentByViewModelId(viewModelId)?.id || '', + eventCode, + methodCode, + methodName, + setPropertyRelates: parameters.setPropertyRelates + }; + + + return { + methodCode, + methodName + }; + } + + /** + * 代码视图返回新增方法的编号、名称后,由设计器将方法添加到控件上 + * @param methodCode 新增方法的编号 + * @param methodName 新增方法的名称 + */ + function bindNewMethodToControl(methodCode: string, methodName: string) { + if (!newControllerMethodBindingInfo) { + return; + } + const commandBuildInfo = webCmpBuilderService.getBuildInfo(); + if (!commandBuildInfo || !commandBuildInfo.webCmdId) { + return; + } + const { eventCode, viewModelId } = newControllerMethodBindingInfo; + const viewModel = formSchemaService.getViewModelById(viewModelId); + + // 1、控件绑定命令 + newControllerMethodBindingInfo.controlData[eventCode] = methodCode; + + // 2、控件绑定命令后,可能会需要联动其他属性的变更 + if (newControllerMethodBindingInfo.setPropertyRelates) { + newControllerMethodBindingInfo.setPropertyRelates(newControllerMethodBindingInfo.controlData, null); + } + + // 3、视图模型添加命令 + let commandId = new IdService().generate(); + const viewModelCommand = viewModel?.commands.find(co => co.code === methodCode && co.handlerName === methodCode && co.cmpId === commandBuildInfo.webCmdId); + if (!viewModelCommand) { + viewModel?.commands.push( + { + id: commandId, + code: methodCode, + name: methodName, + params: [], + handlerName: methodCode, + cmpId: commandBuildInfo.webCmdId, + shortcut: {}, + extensions: [] + } + ); + } else { + commandId = viewModelCommand.id; + } + + // 4、webCmd添加构件 + if (formSchemaService.getCommands()) { + let customCmd = formSchemaService.getCommands().find(cmd => cmd.id === commandBuildInfo.webCmdId); + if (!customCmd) { + customCmd = { + id: commandBuildInfo.webCmdId, + path: commandBuildInfo.relativePath, + name: `${commandBuildInfo.code}.webcmd`, + refedHandlers: [] + }; + formSchemaService.getCommands().push(customCmd); + } + if (!customCmd?.refedHandlers?.find(handler => handler.host === commandId && handler.handler === methodCode)) { + customCmd?.refedHandlers?.push( + { + host: commandId, + handler: methodCode + } + ); + } + } + + newControllerMethodBindingInfo = null; + } + /** + * 根据参数获取新控制器元数据信息,然后过滤出支持的方法,返回新的控制器元数据 + */ + function getSupportedControllerMetadata(controller: any): Promise { + const metadataInfo = formSchemaService.getFormMetadataBasicInfo(); + return new Promise((resolve, reject) => { + metadataService.getPickMetadata(metadataInfo.relativePath, controller).then((response: any) => { + const { content, code, nameSpace } = response?.metadata || {}; + if (content) { + const newController = JSON.parse(content); + // 筛选支持的方法 + const supportedList = nameSpace.includes('.Front') ? newController.Commands : getSupportedControllerMethods(newController.Id, newController.Commands); + newController.Commands = supportedList; + resolve({ controller: newController, code, nameSpace }); + } else { + resolve(null); + } + }).catch((error) => { + reject(error); + }); + }); + } + /** + * 根据控制器元数据构造内置控制器 + * @param controller + * @param code + * @param nameSpace + * @returns + */ + function getInternalControllerFromControllerMetadata(controller: any, code, nameSpace = ''): any { + // 构造内置控制器 + const importData = { + /** 控制器名称 */ + controllerName: { + id: controller.Id, + /** 控制器编号 */ + label: controller.Code, + /** 控制器中文名 */ + name: controller.Name, + code: code, + nameSpace: nameSpace + }, + /** 当前控制器下的方法列表 */ + controllerList: [] as any + }; + if (controller.Commands) { + controller.Commands.forEach(commandsItem => { + const controllerListItem = { + label: commandsItem.Code, + name: commandsItem.Name, + id: commandsItem.Id, + handlerName: commandsItem.Code, + targetComponent: undefined, + hasPath: false, + cmpId: '', + componentLists: [], + shortcut: {}, + // true:表明为新增项,可以编辑 + isRTCmd: commandsItem['isRTCmd'], + isNewGenerated: commandsItem['isNewGenerated'] || false, + extensions: [], + isInvalid: false, + property: [] as any + }; + if (!commandsItem.Parameters) { + commandsItem['Parameters'] = []; + controllerListItem.property = [] as any; + } + commandsItem.Parameters.forEach(parameterItem => { + if (controllerListItem.property) { + controllerListItem.property.push({ + name: parameterItem.Code, + value: '', + shownName: parameterItem.Name, + description: parameterItem.Description, + id: '', + editorType: '', + isRetVal: false, + parameterType: '', + origin: cloneDeep(parameterItem), + context: { + // 通用编辑器数据 + generalData: { + assembleOutline, + assembleSchemaFieldsByComponent, + assembleStateVariables + }, + // 回调方法或状态机动作或目标组件数据列表 + data: getEventParameterData(parameterItem.controlSource?.context?.data?.value) || [], + } + }); + } + }); + importData.controllerList.push(controllerListItem); + }); + } + return importData; + } + + return { checkCommands, commandsChanged, generateInternalCommandList, viewModelDisplay, findParamtersPosition, addControllerMethod, viewModelDomChanged, getCommands, bindNewMethodToControl, getInternalControllerFromControllerMetadata, getSupportedControllerMetadata }; +} diff --git a/packages/mobile-designer/src/components/composition/command/branch-collection-command-item.ts b/packages/mobile-designer/src/components/composition/command/branch-collection-command-item.ts new file mode 100644 index 0000000000000000000000000000000000000000..b07004af66986c1a45e5747568933c5ca39bac00 --- /dev/null +++ b/packages/mobile-designer/src/components/composition/command/branch-collection-command-item.ts @@ -0,0 +1,56 @@ +import { ICommandItem } from "./icommand-item"; +import { CommandItemType } from "./command-item-type"; +import { BranchCommandItem, BranchCommandItemConvertor } from "./branch-command-item"; + +export class BranchCollectionCommandItem implements ICommandItem { + Id: string=''; + Code:string=''; + Name: string=''; + Items: Array=[]; + GetItemId(): string { + return this.Id; + } + GetItemCode(): string { + return this.Code; + } + GetItemName(): string { + return this.Name; + } + GetItemType(): CommandItemType { + return CommandItemType.BranchCollection; + } +} + +export class BranchCollectionCommandItemConvertor { + ConvertJObject(obj: BranchCollectionCommandItem): object { + const branchCollection = obj as BranchCollectionCommandItem; + const jobj = new Object(); + jobj["Id"] = branchCollection.Id; + jobj["Code"] = branchCollection.Code; + jobj["Name"] = branchCollection.Name; + if (branchCollection.Items != null) { + const itemArray = [] as any; + const itemConvertor = new BranchCommandItemConvertor(); + branchCollection.Items.forEach(element => { + itemArray.push(itemConvertor.ConvertJObject(element)); + }); + jobj["Items"]=itemArray; + } + return jobj; + } + + InitFromJobject(jsonObj: object): BranchCollectionCommandItem { + const branchCollectionItem = new BranchCollectionCommandItem(); + branchCollectionItem.Id = jsonObj["Id"]; + branchCollectionItem.Code = jsonObj["Code"]; + branchCollectionItem.Name = jsonObj["Name"]; + if (jsonObj["Items"] != null) { + branchCollectionItem.Items=new Array(); + const itemConvertor = new BranchCommandItemConvertor(); + jsonObj["Items"].forEach(element => { + branchCollectionItem.Items.push(itemConvertor.InitFromJobject(element)); + }); + } + return branchCollectionItem; + } +} diff --git a/packages/mobile-designer/src/components/composition/command/branch-command-item.ts b/packages/mobile-designer/src/components/composition/command/branch-command-item.ts new file mode 100644 index 0000000000000000000000000000000000000000..19f8679e221842cba9667a95e9891a65ce98eac5 --- /dev/null +++ b/packages/mobile-designer/src/components/composition/command/branch-command-item.ts @@ -0,0 +1,69 @@ +import { CommandItemType } from "./command-item-type"; +import { ICommandItem, CommandItemConvertor } from "./icommand-item"; +import { ConditionType } from "./condition-type"; + +export class BranchCommandItem implements ICommandItem { + Id: string = ''; + Code: string = ''; + Name: string = ''; + ConditionType: ConditionType = ConditionType.IF; + Express: string = ''; + Items: Array = []; + + GetItemId(): string { + return this.Id; + } + + GetItemCode(): string { + return this.Code; + } + + GetItemName(): string { + return this.Name; + } + + GetItemType(): CommandItemType { + return CommandItemType.Branch; + } +} + +export class BranchCommandItemConvertor { + ConvertJObject(obj: BranchCommandItem): object { + const branchItem = obj as BranchCommandItem; + const jobj = new Object(); + jobj["Id"] = branchItem.Id; + jobj["Code"] = branchItem.Code; + jobj["Name"] = branchItem.Name; + jobj["ConditionType"] = branchItem.ConditionType; + jobj["Express"] = branchItem.Express; + if (branchItem.Items != null) { + const itemArray = [] as any; + const itemConvertor = new CommandItemConvertor(); + branchItem.Items.forEach(element => { + itemArray.push(itemConvertor.ConvertJObject(element)); + }); + jobj["Items"] = itemArray; + } + return jobj; + } + + InitFromJobject(jsonObj: object): BranchCommandItem { + const branchItem = new BranchCommandItem(); + branchItem.Id = jsonObj["Id"]; + branchItem.Code = jsonObj["Code"]; + branchItem.Name = jsonObj["Name"]; + branchItem.ConditionType = jsonObj["ConditionType"]; + branchItem.Express = jsonObj["Express"]; + if (jsonObj["Items"] != null) { + branchItem.Items = new Array(); + const itemConvertor = new CommandItemConvertor(); + jsonObj["Items"].forEach(element => { + const initFormJobject=itemConvertor.InitFromJobject(element); + if(initFormJobject){ + branchItem.Items.push(initFormJobject); + } + }); + } + return branchItem; + } +} diff --git a/packages/mobile-designer/src/components/composition/command/command-item-type.ts b/packages/mobile-designer/src/components/composition/command/command-item-type.ts new file mode 100644 index 0000000000000000000000000000000000000000..24b6db35f68e87863da06db3729d208b7f6d6523 --- /dev/null +++ b/packages/mobile-designer/src/components/composition/command/command-item-type.ts @@ -0,0 +1,7 @@ + + export enum CommandItemType + { + MethodRefer=0, + Branch=1, + BranchCollection=2 + } diff --git a/packages/mobile-designer/src/components/composition/command/command-metadata.ts b/packages/mobile-designer/src/components/composition/command/command-metadata.ts new file mode 100644 index 0000000000000000000000000000000000000000..c92cc9a2b16c9249ca5848be5d29d425515ed46f --- /dev/null +++ b/packages/mobile-designer/src/components/composition/command/command-metadata.ts @@ -0,0 +1,53 @@ +import { FormCommand, CommandConvertor } from "./command"; +import { ExtendProperty, ExtendsConvert } from "./extend-property"; + +export class CommandMetadata { + Id: string=''; + Code: string=''; + Name: string=''; + Description: string=''; + Extends:ExtendProperty|null=null; + Commands: Array=[]; +} + +export class CommandMetadataConvertor { + ConvertJObject(obj: CommandMetadata): object { + const metadata: CommandMetadata = obj as CommandMetadata; + const jobj = new Object(); + jobj["Id"] = metadata.Id; + jobj["Code"] = metadata.Code; + jobj["Name"] = metadata.Name; + jobj["Description"] = metadata.Description; + if (metadata.Commands != null) { + const CommandsJArry = jobj["Commands"] || []; + const convertor = new CommandConvertor(); + metadata.Commands.forEach(command => { + CommandsJArry.push(convertor.ConvertJObject(command)); + }); + } + if(metadata.Extends!=null){ + const convertor = new ExtendsConvert(); + jobj["Extends"] =convertor.ConvertJObject(metadata.Extends); + } + return jobj; + } + + InitFromJobject(jsonObj: object): CommandMetadata { + const metadata = new CommandMetadata(); + metadata.Id = jsonObj["Id"]; + metadata.Code = jsonObj["Code"]; + metadata.Name = jsonObj["Name"]; + metadata.Description = jsonObj["Description"]; + const CommandsJArry = jsonObj["Commands"]; + if (CommandsJArry != null) { + metadata.Commands = new Array(); + CommandsJArry.forEach(element => { + const cmpOpSerializer = new CommandConvertor(); + metadata.Commands.push(cmpOpSerializer.InitFromJobject(element) as FormCommand); + }); + } + const convertor = new ExtendsConvert(); + metadata.Extends=convertor.InitFromJobject(jsonObj["Extends"]); + return metadata; + } +} diff --git a/packages/mobile-designer/src/components/composition/command/command-method-param-config.ts b/packages/mobile-designer/src/components/composition/command/command-method-param-config.ts new file mode 100644 index 0000000000000000000000000000000000000000..76b498c4f7e9a444382f4463222a41a6006910d4 --- /dev/null +++ b/packages/mobile-designer/src/components/composition/command/command-method-param-config.ts @@ -0,0 +1,7 @@ + +export class CmpMethodParamConfig{ + ParamCode:string=''; + ParamName:string=''; + ParamExpress:string=''; +} + diff --git a/packages/mobile-designer/src/components/composition/command/command-method-refering.ts b/packages/mobile-designer/src/components/composition/command/command-method-refering.ts new file mode 100644 index 0000000000000000000000000000000000000000..fea808752a86e999c3b3d74c4985c1825f36cf3b --- /dev/null +++ b/packages/mobile-designer/src/components/composition/command/command-method-refering.ts @@ -0,0 +1,34 @@ +import { CmpMethodParamConfig } from "./command-method-param-config"; +import { ICommandItem } from "./icommand-item"; +import { CommandItemType } from "./command-item-type"; + +export class CmpMethodRefering implements ICommandItem { + + Id:string=''; + Code:string=''; + Name:string=''; + ComponentId: string=''; + ComponentCode: string=''; + ComponentName: string=''; + ComponentPath: string=''; + MethodId: string=''; + MethodCode: string=''; + MethodName: string=''; + IsReplaced:boolean=false; + IsBeforeExpansion:boolean=false; + IsAfterExpansion:boolean=false; + ParamConfigs: Array=[]; + + GetItemType(): CommandItemType { + return CommandItemType.MethodRefer; + } + GetItemCode(): string { + return this.Code; + } + GetItemName(): string { + return this.Name; + } + GetItemId(): string { + return this.Id; + } +} diff --git a/packages/mobile-designer/src/components/composition/command/command-parameter.ts b/packages/mobile-designer/src/components/composition/command/command-parameter.ts new file mode 100644 index 0000000000000000000000000000000000000000..e18d25ebdcc231a4224804597d2d192008058d5e --- /dev/null +++ b/packages/mobile-designer/src/components/composition/command/command-parameter.ts @@ -0,0 +1,11 @@ + +export class CmdParameter{ + Id:string=''; + Code:string=''; + Name:string=''; + Description:string=''; + ParameterType:string=''; + IsRetVal:boolean=false; + EditorType: string=''; +} + diff --git a/packages/mobile-designer/src/components/composition/command/command.ts b/packages/mobile-designer/src/components/composition/command/command.ts new file mode 100644 index 0000000000000000000000000000000000000000..8a3713db21cd2e7851ba2ab6ca2eed5e017e041a --- /dev/null +++ b/packages/mobile-designer/src/components/composition/command/command.ts @@ -0,0 +1,59 @@ +import { ICommandItem, CommandItemConvertor } from "./icommand-item"; +import { CmdParameter } from "./command-parameter"; + +export class FormCommand{ + Id:string=''; + Code:string=''; + Name:string=''; + Description:string=''; + Parameters:Array=[]; + SourceCode:string=''; + Items: Array=[]; +} + +export class CommandConvertor +{ + ConvertJObject(obj : FormCommand): object { + + const cmpOp = obj as FormCommand; + const jobj=new Object(); + jobj["Id"]=cmpOp.Id; + jobj["Code"]=cmpOp.Code; + jobj["Name"]=cmpOp.Name; + jobj["Description"]=cmpOp.Description; + jobj["SourceCode"]=cmpOp.SourceCode; + jobj["Parameters"]=cmpOp.Parameters; + const items=[] as any; + if(cmpOp.Items!=null) + { + const itemConvertor = new CommandItemConvertor(); + cmpOp.Items.forEach(element => { + items.push(itemConvertor.ConvertJObject(element)); + }); + } + jobj["Items"]=items; + return jobj; + } + + InitFromJobject(jsonObj: object): FormCommand { + const cmpOp = new FormCommand(); + cmpOp.Id = jsonObj["Id"]; + cmpOp.Code = jsonObj["Code"]; + cmpOp.Name = jsonObj["Name"]; + cmpOp.Description = jsonObj["Description"]; + cmpOp.SourceCode = jsonObj["SourceCode"]; + cmpOp.Parameters=jsonObj["Parameters"]; + cmpOp.Items=new Array(); + if(jsonObj["Items"]!=null) + { + const itemConvertor = new CommandItemConvertor(); + jsonObj["Items"].forEach(element => { + const initFormJobject=itemConvertor.InitFromJobject(element); + if(initFormJobject){ + cmpOp.Items.push(); + } + }); + } + return cmpOp; + } +} diff --git a/packages/mobile-designer/src/components/composition/command/condition-type.ts b/packages/mobile-designer/src/components/composition/command/condition-type.ts new file mode 100644 index 0000000000000000000000000000000000000000..d387cf1550200d2309cbcbaef770bf864f6f4c2d --- /dev/null +++ b/packages/mobile-designer/src/components/composition/command/condition-type.ts @@ -0,0 +1,7 @@ + + export enum ConditionType + { + IF=0, + ELSEIF=1, + ELSE=2 + } diff --git a/packages/mobile-designer/src/components/composition/command/extend-property.ts b/packages/mobile-designer/src/components/composition/command/extend-property.ts new file mode 100644 index 0000000000000000000000000000000000000000..b4f20d204a7cc4262c17d68548aec44e7e5b1580 --- /dev/null +++ b/packages/mobile-designer/src/components/composition/command/extend-property.ts @@ -0,0 +1,24 @@ +export class ExtendProperty { + FormCode: string = ''; + IsCommon: boolean = false; +} + +export class ExtendsConvert { + InitFromJobject(jsonObj: object): ExtendProperty|null { + if (jsonObj) { + const extendProperty = new ExtendProperty(); + extendProperty.FormCode = jsonObj["FormCode"]; + extendProperty.IsCommon = jsonObj["IsCommon"]; + return extendProperty; + } + return null; + } + + ConvertJObject(obj: ExtendProperty): object { + const extendProperty: ExtendProperty = obj as ExtendProperty; + const jobj = new Object(); + jobj["FormCode"] = extendProperty.FormCode; + jobj["IsCommon"] = extendProperty.IsCommon; + return jobj; + } +} diff --git a/packages/mobile-designer/src/components/composition/command/icommand-item.ts b/packages/mobile-designer/src/components/composition/command/icommand-item.ts new file mode 100644 index 0000000000000000000000000000000000000000..40f8380f57490d87d152a28455348e9cda78cd77 --- /dev/null +++ b/packages/mobile-designer/src/components/composition/command/icommand-item.ts @@ -0,0 +1,53 @@ +import { CommandItemType } from "./command-item-type"; +import { CmpMethodRefering } from "./command-method-refering"; +import { BranchCommandItemConvertor, BranchCommandItem } from "./branch-command-item"; +import { BranchCollectionCommandItemConvertor, BranchCollectionCommandItem } from "./branch-collection-command-item"; + +export interface ICommandItem +{ + GetItemType():CommandItemType; + + GetItemCode():string; + + GetItemName():string; + + GetItemId():string; +} + +export class CommandItemConvertor { + ConvertJObject(obj: ICommandItem): object { + const commandItem = obj as ICommandItem; + const itemType = commandItem.GetItemType(); + const jobj = new Object(); + jobj["Type"] = itemType; + if (itemType === CommandItemType.MethodRefer) { + jobj["Content"] = commandItem; + } + else if (itemType === CommandItemType.Branch) { + const branchConvertor=new BranchCommandItemConvertor(); + jobj["Content"] = branchConvertor.ConvertJObject(commandItem as BranchCommandItem); + } + else if (itemType === CommandItemType.BranchCollection) { + const branchCollectionConvertor=new BranchCollectionCommandItemConvertor(); + jobj["Content"] = branchCollectionConvertor.ConvertJObject(commandItem as BranchCollectionCommandItem); + } + return jobj; + } + + InitFromJobject(jsonObj: object): ICommandItem|null { + const itemType=jsonObj["Type"] as CommandItemType; + const content:ICommandItem=jsonObj["Content"]; + if (itemType === CommandItemType.MethodRefer) { + return Object.assign(new CmpMethodRefering(),content as CmpMethodRefering);; + } + else if (itemType === CommandItemType.Branch) { + const branchConvertor=new BranchCommandItemConvertor(); + return branchConvertor.InitFromJobject(jsonObj["Content"]); + } + else if (itemType === CommandItemType.BranchCollection) { + const branchCollectionConvertor=new BranchCollectionCommandItemConvertor(); + return branchCollectionConvertor.InitFromJobject(jsonObj["Content"]); + } + return null; + } +} diff --git a/packages/mobile-designer/src/components/composition/command/supported-controller.ts b/packages/mobile-designer/src/components/composition/command/supported-controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..b04b48be2b66ddc8513332fccdcb21d3db83e121 --- /dev/null +++ b/packages/mobile-designer/src/components/composition/command/supported-controller.ts @@ -0,0 +1,151 @@ +const supportedControllers = { + "910661bd-963a-4287-aa32-441c95b8720f": [ + { + "id": "973bb999-b8dc-0ff5-0ba1-5cd7b816eba9", + "code": "Navigate" + }, + { + "id": "4dd30b6a-f0d7-0799-7c04-593e5b71fd7b", + "code": "NavigateForRtc" + }, + { + "id": "9dca239c-9153-70f9-e522-5ba2c384aa4f", + "code": "GoBack" + }, + { + "id": "632f46ae-620e-3bb7-a75e-c43473624c49", + "code": "GoBackAndCheck" + }, + { + "id": "34c9cb64-0ea0-f483-2d51-c36ff0ee6cb2", + "code": "GoBackForChildCard" + }, + { + "id": "9740b808-9900-f494-516c-08e89640f5af", + "code": "CloseWindow" + }, + { + "id": "66371216-60d9-f2c3-734e-6b56b6e71d27", + "code": "NavigateAndCheck" + }, + { + "id": "b0d557ac-1ee8-8afe-73ea-006c43bd10d1", + "code": "NavigateForChildCard" + } + ], + "cf5e568a-5243-4539-94ea-e195eb4d6736": [ + { + "id": "e875be9f-07b8-b8ac-e20b-53e6b3e7894d", + "code": "LoadPage" + }, + { + "id": "98b8d9a5-dc18-77e8-7bdf-7ea191c6bc8d", + "code": "LoadPageForList" + }, + { + "id": "dd80df23-0cd7-b11c-1fa5-df8a8847b81b", + "code": "LoadPageForCard" + }, + { + "id": "54f3153f-e646-e185-b403-5467b9984a78", + "code": "LoadPageForChildCard" + }, + { + "id": "6441c6c5-4f8d-e53e-2db0-639b4c81e418", + "code": "LoadListPage" + }, + { + "id": "53827e22-6f6f-e0f3-e4a2-9ca3e6b8f568", + "code": "LoadCardPage" + } + ], + + "0a68799b-48c6-4c9f-b0d7-140683c62b58": [ + { + "id": "06351c11-ec4b-f7b0-d9b4-e8bca9202b86", + "code": "LoadForList" + }, + { + "id": "cb7f4216-0eb4-26a0-80b5-a38448e393c1", + "code": "LoadForCard" + }, + { + "id": "67edc617-d63a-b4f5-cdc7-4adba1b6e48b", + "code": "LoadAndAddForCard" + }, + { + "id": "33e538a8-717d-00ad-4cb6-a575f4b151c7", + "code": "LoadAndEditForCard" + }, + { + "id": "d868341e-5eff-2a65-ba96-8b4fe5b243d7", + "code": "LoadAndViewForCard" + }, + { + "id": "afc70350-24fc-9879-9505-689f57575ec2", + "code": "LoadAndAddForChildCard" + }, + { + "id": "4a7b5ccb-f61a-ac4f-e308-c00f6b52860b", + "code": "LoadAndEditForChildCard" + }, + { + "id": "9272925f-38d0-d814-2161-605f75240169", + "code": "LoadAndViewForChildCard" + } + ], + "dab6b7f1-f56f-490a-879c-3d74232cd3ba": [ + { + "id": "eca45728-53c9-ca70-14ca-ec8eb468ee44", + "code": "RemoveById" + }, + { + "id": "6036c9c0-1ee6-ab06-e311-78f5becca6b4", + "code": "RemoveByIds" + }, + { + "id": "a35467a1-4ca7-5655-cd2a-18ce42a3097a", + "code": "RemoveByPathAndId" + } + ], + "f863c66a-bf93-4d1f-9f99-bcd76009609d": [ + { + "id": "129fb301-123d-6011-755d-c1aad5bf1dd3", + "code": "SaveForCard" + }, + { + "id": "2ade863f-4b38-7d2b-ca9f-87f1e18d8692", + "code": "SaveForChildCard" + }, + { + "id": "f7ebeab7-0481-041a-2cc4-d524840c6468", + "code": "SaveAndGoBackForChildCard" + }, + { + "id": "7eab8d99-4698-c0d4-4d2b-08bf724ed439", + "code": "Save" + }, + { + "id": "55eb3067-d220-56dd-41b3-2228db302ae0", + "code": "SaveAndValidateDataForCard" + } + ], + "05592163-fd45-474e-b0ab-61d7dc02e5c0": [ + { + "id": "d5b847bd-ceb3-1b27-ed7f-b6b1e38088cd", + "code": "Cancel" + } + ] +}; + +export function getSupportedControllerMethods(controllerId, commandList) { + if (!controllerId || !commandList) { + return []; + } + const supportedCommands = supportedControllers[controllerId] || []; + const supportedCommandIds = supportedCommands.map(command => command.id); + return commandList.filter(command => supportedCommandIds.includes(command.Id)); +} +export function getAllSupportedControllers() { + return supportedControllers; +} diff --git a/packages/mobile-designer/src/components/composition/component-schema.service.ts b/packages/mobile-designer/src/components/composition/component-schema.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..a8060396de52a5c98a6be3c23e06bf5a88f3d650 --- /dev/null +++ b/packages/mobile-designer/src/components/composition/component-schema.service.ts @@ -0,0 +1,57 @@ +import { SchemaService } from '@farris/ui-vue/components'; +import { FormMetadataConverter } from './form-metadata-converter'; + +export function useComponentSchemaService(): SchemaService { + + const componentSchemaMap = new Map>(); + const componentParentMap = new Map(); + const formMetaDataConverter = new FormMetadataConverter(); + + function closest(componentId: string, componentType: string): Record | null { + /** + * 通过load构造的数据,只有root-component下的,没有其他几个component, + * 此时输入控件对应的component的id就没有-ref + */ + const currentComponent = componentSchemaMap.get(componentId) || componentSchemaMap.get(componentId + '-ref'); + if (currentComponent) { + const parentId = componentParentMap.get(currentComponent.id) as string; + const parentComponent = componentSchemaMap.get(parentId); + if (parentComponent && parentComponent.type === componentType) { + return parentComponent; + } + return closest(parentId, componentType); + } + return null; + } + + function load(componentSchema: Record) { + if (componentSchema && componentSchema.id) { + componentSchemaMap.set(componentSchema.id, componentSchema); + } + if (componentSchema && componentSchema.contents && componentSchema.contents.length) { + (componentSchema.contents as Record[]).forEach((childComponentSchema: Record) => { + load(childComponentSchema); + componentParentMap.set(childComponentSchema.id, componentSchema.id); + }); + } + } + + function getSchemaById(string: any): Record { + return {}; + } + + function select(root: Record, predicate: (child: Record) => boolean): Record { + return {}; + } + /** + * 在获取属性值的时候能传递这个service,帮助判断类型 + * @param editorType + * @returns + */ + function getRealEditorType(editorType: string): string { + return formMetaDataConverter.getRealEditorType(editorType); + } + + return { closest, getSchemaById, load, select, getRealEditorType }; + +} diff --git a/packages/mobile-designer/src/components/composition/control-creator.service.ts b/packages/mobile-designer/src/components/composition/control-creator.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..b5aff582bf725c8357fecadfb11a253852257566 --- /dev/null +++ b/packages/mobile-designer/src/components/composition/control-creator.service.ts @@ -0,0 +1,242 @@ +import { getSchemaByType } from "@farris/mobile-ui-vue/components"; +import { FormBindingType, FormSchemaEntityField, FormSchemaEntityFieldTypeName, UseControlCreator } from "../types"; +import { FormMetadataConverter } from "./form-metadata-converter"; + +export function useControlCreator(): UseControlCreator { + /** + * 配置输入控件属性 + * @param field schema字段 + * @param editorType 编辑器类型 + * @param controlClass 输入控件样式 + * @returns + */ + function setFormFieldProperty(field: FormSchemaEntityField, editorType?: string, controlClass = 'col-12 col-md-6 col-xl-3 col-el-2'): any { + + const formGroupMetadata = getSchemaByType('form-item') || {}; + formGroupMetadata.id = field.id.length > 8 ? field.id.slice(0, 8) : field.id; + formGroupMetadata.id = field.bindingField + '_' + formGroupMetadata.id.replace(/-/g, '_') + '_' + Math.random().toString(36).substr(2, 4); + formGroupMetadata.label = field.name; + formGroupMetadata.appearance = { class: controlClass || '' }; + formGroupMetadata.binding = { + type: FormBindingType.Form, + path: field.bindingField, + field: field.id, + fullPath: field.path + }; + formGroupMetadata.path = field.bindingPath; + const metadataConverter = new FormMetadataConverter(); + const resolvedEditorType = editorType || metadataConverter.getRealEditorType(field?.editor?.$type || ''); + const formEditor = getSchemaByType(resolvedEditorType) || {}; + + formGroupMetadata.editor = formEditor; + if (field.require) { + formEditor.required = field.require; + } + + // 只读属性:若字段本身为只读,则取字段属性;若非只读,则设置为状态机 + formEditor.readonly = field.readonly ? true : "!viewModel.stateMachine['editable']"; + const fieldTypeInSchema = field.type && field.type.$type; + if (!fieldTypeInSchema) { + return; + } + // 枚举类型 或者是字符串但是指定了编辑器是枚举类的 + if (fieldTypeInSchema === 'EnumType' || fieldTypeInSchema === 'StringType' && ['radio-group', 'check-group', 'combo-list'].find(type => type === formEditor.type)) { + formEditor.data = field.type.enumValues || []; + formEditor.idField = 'value'; + formEditor.valueField = 'value'; + formEditor.textField = 'name'; + } + // 数字类型 + if (fieldTypeInSchema === 'NumericType') { + formEditor.precision = field.type.precision; + formEditor.nullable = true; + } + // 数字、字符串、备注 :设置最大长度 + if (['NumericType', 'StringType', 'TextType'].includes(fieldTypeInSchema)) { + formEditor.maxLength = field.type.length; + } + // 日期类型 + if (formEditor.type === 'date-picker') { + formEditor.fieldType = field.type.name; + + // 日期时间类型字段:启用时间选择属性 + if (fieldTypeInSchema === 'DateTimeType') { + formEditor.showTime = true; + formEditor.displayFormat = 'yyyy-MM-dd HH:mm:ss'; + formEditor.valueFormat = 'yyyy-MM-dd HH:mm:ss'; + + } + } + + return formGroupMetadata; + } + + /** + * 字段类型是文本,切换成其他控件类型 + * @param editorType + * @returns + */ + function getRealGridTypeByEditorType(editorType) { + switch (editorType) { + case 'combo-list': + case 'radio-group': + case 'check-group': + return 'enum'; + case 'date-picker': + return 'date'; + default: + return 'string'; + } + } + /** + * 将控件类型映射为表单表格列上的类型 + * param field + */ + function mapControlType2GridFieldType(field: FormSchemaEntityField): string { + if (!field.editor) { + return ''; + } + switch (field.type.name) { + case FormSchemaEntityFieldTypeName.Enum: return 'enum'; + case FormSchemaEntityFieldTypeName.String: + return getRealGridTypeByEditorType(field.editor.$type); + case FormSchemaEntityFieldTypeName.Text: return 'string'; + case FormSchemaEntityFieldTypeName.Number: return 'number'; + case FormSchemaEntityFieldTypeName.Date: return 'date'; + case FormSchemaEntityFieldTypeName.DateTime: return 'datetime'; + case FormSchemaEntityFieldTypeName.Boolean: return 'boolean'; + } + + return ''; + } + /** + * 设置列格式 + * @param gridFieldType 列类型 + * @param metadata 元数据 + * @param schemaField schemaField + */ + function setGridFieldFormatter(gridFieldType: string, metadata: any, schemaField: any) { + switch (gridFieldType) { + case 'number': { + metadata.formatter = { + type: 'number', + precision: schemaField.type.precision, + thousand: ',', + decimal: '.' + }; + break; + } + case 'date': { + metadata.formatter = { + type: 'date', + dateFormat: 'yyyy-MM-dd' + }; + break; + } + case 'datetime': { + metadata.formatter = { + type: 'date', + dateFormat: 'yyyy-MM-dd HH:mm:ss' + }; + break; + } + case 'boolean': { + metadata.formatter = { + type: 'boolean', + trueText: '是', + falseText: '否' + }; + break; + } + case 'enum': { + metadata.formatter = { + type: 'enum', + data: schemaField.type.enumValues || [] + }; + break; + } + } + } + /** + * 配置列属性 + * @param field schema字段 + * @param metadata 列元数据 + * @param neddInlineEditor 是否需要列编辑器 + */ + function setGridFieldProperty(gridType: string, field: FormSchemaEntityField, metadata: any, needInlineEditor = false): any { + const metadataConverter = new FormMetadataConverter(); + if (!metadata) { + metadata = getSchemaByType(gridType, {}); + } + if (!metadata || !field) { + return; + } + + metadata.id = field.id.length > 8 ? field.id.slice(0, 8) : field.id; + metadata.id = field.bindingField + '_' + metadata.id.replace(/-/g, '_') + '_' + Math.random().toString(36).substr(2, 4); + metadata.title = field.name; + + // 关联字段dataField绑定主表字段的label + '.' + 关联字段的label + metadata.field = field.bindingPath; + + metadata.binding = { + type: FormBindingType.Form, + path: field.bindingField, + field: field.id, + fullPath: field.path + }; + + // 设置列类型. 若是枚举类型再设置enumData;若是日期类型,设置默认格式;数字类型设置格式、精度 + metadata.dataType = mapControlType2GridFieldType(field); + + // 枚举类型 设置enumData + // if (metadata.dataType === 'enum' && field.type) { + // metadata.enumData = field.type.enumValues; + // metadata.idField = 'value'; + // metadata.valueField = 'value'; + // metadata.textField = 'name'; + // } + metadata.multiLanguage = field.multiLanguage; + + // 日期类型字段:增加数据国际化配置 + if (field.type.name === FormSchemaEntityFieldTypeName.Date || + field.type.name === FormSchemaEntityFieldTypeName.DateTime) { + metadata.localization = false; + metadata.localizationType = field.type.name; + } + + // 列格式 + setGridFieldFormatter(metadata.dataType, metadata, field); + + // 列编辑器 + if (needInlineEditor) { + const realEditor = metadataConverter.getRealEditorType(field?.editor?.$type || ''); + const fieldEditor = setFormFieldProperty(field, realEditor, ''); + metadata.editor = fieldEditor.editor; + } + + return metadata; + } + + /** + * 配置输入控件属性(控件无绑定信息) + * @param editorType 编辑器类型 + * @param controlClass 输入控件样式 + */ + function createFormGroupWithoutField(editorType = 'input-group', controlClass = 'col-12 col-md-6 col-xl-3 col-el-2') { + const formGroupMetadata = getSchemaByType('form-item') || {}; + formGroupMetadata.id = `${editorType}_${Math.random().toString(36).substr(2, 4)}`; + formGroupMetadata.appearance = { class: controlClass || '' }; + formGroupMetadata.binding = null; + + const formEditor = getSchemaByType(editorType) || {}; + + formGroupMetadata.editor = formEditor; + return formGroupMetadata; + } + return { + setFormFieldProperty, + setGridFieldProperty, + createFormGroupWithoutField + }; +} diff --git a/packages/mobile-designer/src/components/composition/control-property-changed.service.ts b/packages/mobile-designer/src/components/composition/control-property-changed.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..b7e6d6db53d42f48e0b829ad2cf9a664150351f3 --- /dev/null +++ b/packages/mobile-designer/src/components/composition/control-property-changed.service.ts @@ -0,0 +1,154 @@ +import { FormPropertyChangeObject, SchemaDOMMapping } from "@farris/ui-vue/components"; +import { get, set } from "lodash-es"; +import { FormBindingType, FormVariableCategory, UseDesignViewModel, UseFormSchema, UseSchemaService } from "../types"; +import { DesignViewModelField } from "../types/design-viewmodel"; + +export function afterPropeControlPropertyChangedService(useFormSchema: UseFormSchema, designViewModelUtils: UseDesignViewModel, schemaService: UseSchemaService) { + + /** + * 新版属性编辑器,在编辑过程中可能会新增变量,此处需要将新增的变量追加到ViewModel中 + */ + function addNewVariableToViewModel(changeObject: FormPropertyChangeObject, viewModelId: string) { + const newPropertyValue = changeObject.propertyValue; + if (newPropertyValue && newPropertyValue.isNewVariable && typeof newPropertyValue === 'object' && + newPropertyValue.type === 'Variable') { + // 如果有则加入新变量 + delete newPropertyValue.isNewVariable; + const newVar = { + id: newPropertyValue.field, + category: FormVariableCategory.locale, + code: newPropertyValue.path, + name: newPropertyValue.path, + type: newPropertyValue.newVariableType || 'String' + }; + delete newPropertyValue.newVariableType; + const viewModel = useFormSchema.getViewModelById(viewModelId); + if (viewModel && !viewModel.states.find(s => s.id === newVar.id)) { + viewModel.states.push(newVar); + } + } + } + + /** + * 收集关联属性的变更(用于dgViewModel的变更) + * @param changeObject 变更集 + */ + function relateChangeObjects(changeObject: FormPropertyChangeObject) { + const changes: any[] = [changeObject]; + if (changeObject.relateChangeProps && changeObject.relateChangeProps.length) { + changes.push(...changeObject.relateChangeProps); + } + + if (changeObject.categoryId && changeObject.categoryId.includes('gridFieldEditor')) { + changes.forEach(change => { + Object.assign(change, { + categoryId: changeObject.categoryId, + propertyPath: changeObject.propertyPath + }); + }); + } + + return changes; + } + + /** + * 更新DOM的修改至Schema实体 + * @param propertyData 属性值 + * @param changeObject 变更集 + */ + function getSchemaChangeByDomChange(propertyData, changeObject: FormPropertyChangeObject, dgVMField: DesignViewModelField) { + const schemaChange: any = {}; + + let mappingArray: any[] = []; + const changePath = changeObject.categoryId === 'editor' ? 'editor.' + changeObject.propertyID : changeObject.propertyID; + mappingArray = SchemaDOMMapping.mappingDomPropAndSchemaProp(propertyData); + // if (changeObject.categoryId === 'editor') { // 编辑器属性 + // } else if (!changeObject.propertyPath) { + // mappingArray = SchemaDOMMapping.mappingDomPropAndSchemaProp(propertyData); + // } + const mappingEntity = mappingArray.find(f => f.domField === changePath); + if (!mappingEntity) { + return {}; + } + // 只读、必填属性:只有在设置为布尔值时才更新到schema,设置为状态机、变量、表达式时不更新 + if (changeObject.propertyID === 'readonly' || changeObject.propertyID === 'require') { + if (typeof (changeObject.propertyValue) !== 'boolean') { + return schemaChange; + } + } + + const shemaFieldPath = mappingEntity.schemaField; + + // 若前后变更的数据是一样的,则不再记录变更 + const oldPropInVm = get(dgVMField, shemaFieldPath); + if (oldPropInVm && typeof (oldPropInVm) === 'object' && changeObject.propertyValue && JSON.stringify(oldPropInVm) === JSON.stringify(changeObject.propertyValue)) { + return schemaChange; + } + if (oldPropInVm && changeObject.propertyValue && oldPropInVm === changeObject.propertyValue) { + return schemaChange; + } + + set(schemaChange, shemaFieldPath, changeObject.propertyValue); + return schemaChange; + } + + /** + * 收集Schema字段的变更 + * @param propertyData 属性值 + * @param changeObjects 变更集 + * @param viewModelId VMID + */ + function changeDgViewModel(propertyData: any, changeObjects: FormPropertyChangeObject[], viewModelId: string) { + + const dgVM = designViewModelUtils.getDgViewModel(viewModelId); // 当前VM + if (!dgVM) { + return; + } + changeObjects.map(changeObject => { + switch (propertyData.type) { + case 'field-set': { + // 分组节点修改标题后需要同步ViewModel字段的分组 + if (changeObject.propertyID === 'title') { + dgVM.changeGroupName(propertyData.id, changeObject.propertyValue); + } + break; + } + default: { + // 控件节点 + let dgVMField; + if (propertyData.binding && propertyData.binding.type === FormBindingType.Form && propertyData.binding.field) { + dgVMField = dgVM.fields.find(f => f.id === propertyData.binding.field); + } + if (dgVMField) { + const dgVMChange = getSchemaChangeByDomChange(propertyData, changeObject, dgVMField); + dgVM.changeField(dgVMField.id, dgVMChange); + } + } + } + }); + } + + function afterPropertyChanged(event: any) { + const { changeObject, designerItem } = event; + if (!designerItem) { + return; + } + const componentId = designerItem.belongedComponentId; + const viewModelId = useFormSchema.getViewModelIdByComponentId(componentId); + + // 保存新增的变量 + addNewVariableToViewModel(changeObject, viewModelId); + + // 表达式相关属性:需要单独更新DOM结构 + // updateExpressionAfterPropChange(propertyData, changeObject, parameters); + + // 收集关联属性(用于dgViewModel的变更) + const changes = relateChangeObjects(changeObject); + + // 更新dgViewModel + changeDgViewModel(designerItem.schema, changes, viewModelId); + + } + + return { afterPropertyChanged }; +} diff --git a/packages/mobile-designer/src/components/composition/design-viewmodel.service.ts b/packages/mobile-designer/src/components/composition/design-viewmodel.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..f6a3ce968a242b00dfca9ccb4d990baa0789179b --- /dev/null +++ b/packages/mobile-designer/src/components/composition/design-viewmodel.service.ts @@ -0,0 +1,210 @@ +/* eslint-disable no-use-before-define */ +import { merge } from "lodash-es"; +import { FormBindingType, FormSchemaEntityField, UseDesignViewModel, UseFormSchema, UseSchemaService } from "../types"; +import { DesignViewModel, DesignViewModelField } from "../types/design-viewmodel"; +import { cloneDeep } from 'lodash-es'; + +/** + * 操作表单设计时ViewModel的工具类 + */ +export function useDesignViewModel(useFormSchema: UseFormSchema, schemaService: UseSchemaService): UseDesignViewModel { + let dgViewModels = [] as any; + const ROOT_VIEW_MODEL_ID = 'root-viewmodel'; + + + /** + * 根据viewModelId获取视图模型 + * @param viewModelId 视图模型标识 + */ + function getDgViewModel(viewModelId: string): DesignViewModel | null { + return dgViewModels.find(dgVM => dgVM.id === viewModelId) || null; + } + /** + * 获取所有的视图模型 + */ + function getDgViewModels(): DesignViewModel[] { + return dgViewModels; + } + /** + * 根据ID删除整个ViewModel:用于组件的删除 + * @param viewModelId viewModelId + */ + function deleteViewModelById(viewModelId: string) { + const index = dgViewModels.findIndex(vm => vm.id === viewModelId); + if (index > -1) { + dgViewModels.splice(index, 1); + useFormSchema.deleteViewModelById(viewModelId); + + } + } + /** + * 组装各VM下的字段完整信息:schema字段 + 视图模型记录的变更 + 视图模型的值变化等属性 => 树表数据 + */ + function assembleDesignViewModel() { + // 组装过程中可能有设计器补充的属性,用户并不感知这种变更,所以不需要通知IDE框架 + window['suspendChangesOnForm'] = true; + + const tempDesignViewModels = [] as any; + const viewModels = useFormSchema.getViewModels(); + viewModels.forEach(viewModel => { + const fields = [] as any; + if (viewModel.fields) { + viewModel.fields.forEach(field => { + if (field.type !== FormBindingType.Form) { + return; + } + const dgVMField = {}; + const schema = schemaService.getFieldByIDAndVMID(field.id, viewModel.id); + if (!schema || !schema.schemaField) { + // 字段已移除 + merge(dgVMField, field, field.fieldSchema || {}, + { + groupId: field.groupId, groupName: field.groupName, + valueChanging: field.valueChanging, valueChanged: field.valueChanged, + isSchemaRemoved: true + }); + + } else { + const { schemaField } = schema; + adaptOldViewModelField(field, schemaField); + + // 组装数据 + const displayTypeNamei18n = schemaField.type.displayName; + merge(dgVMField, schemaField, field.fieldSchema || {}, + { + groupId: field.groupId, + groupName: field.groupName, + valueChanging: field.valueChanging, + valueChanged: field.valueChanged, + updateOn: field.updateOn, + displayTypeNamei18n + }); + } + + fields.push(dgVMField); + }); + } + + adaptOldViewModel(viewModel); + + const dgViewModel = new DesignViewModel(viewModel.id, fields, useFormSchema); + + tempDesignViewModels.push(dgViewModel); + }); + dgViewModels = tempDesignViewModels; + window['suspendChangesOnForm'] = false; + } + /** + * 获取指定VM下所有的字段,并组装成树结构 + * @param viewModelId 视图模型标识 + */ + function getAllFields2TreeByVMId(viewModelId: string): any[] { + const schemaFields: FormSchemaEntityField[] = schemaService.getFieldsByViewModelId(viewModelId); + if (!schemaFields) { + return []; + } + const dgVM = dgViewModels.find(d => d.id === viewModelId); + + if (dgVM) { + return mergeFields2Tree(schemaFields, dgVM.fields); + } else { + return []; + } + } + /** + * 私有 + * @param schemaFields + * @param dgVMFields + * @param bindingPath + * @returns + */ + function mergeFields2Tree(schemaFields: FormSchemaEntityField[], dgVMFields: DesignViewModelField[], bindingPath = '') { + const treeData = [] as any; + schemaFields.forEach(element => { + // 补充bindingPath属性 + if (!element.bindingPath) { + element.bindingPath = (bindingPath ? bindingPath + '.' : '') + element.label; + } + // 关联表字段 / UDT字段 + let children = [] as any; + if (element.type && element.type.fields && element.type.fields.length > 0) { + children = mergeFields2Tree(element.type.fields, dgVMFields, element.bindingPath); + + } + + const dgField = dgVMFields.find(d => d.id === element.id); + const clonedField = dgField ? cloneDeep(dgField) : cloneDeep(element); + treeData.push({ + data: Object.assign({ rawData: clonedField, fieldType: clonedField.type.displayName }, clonedField), + children + }); + }); + return treeData; + } + + /** + * 适配旧表单VM属性 + * @param viewModel VM + */ + function adaptOldViewModel(viewModel: any) { + // 补充是否开启校验属性 + if (!Object.keys(viewModel).includes('enableValidation')) { + viewModel.enableValidation = false; + } + + // 补充复用会话属性 + if (viewModel.id === ROOT_VIEW_MODEL_ID && !Object.keys(viewModel).includes('enableUnifiedSession')) { + viewModel.enableUnifiedSession = false; + } + + // 旧表单ViewModel的名称为id值,改成对应表的表名 + if (viewModel.id === viewModel.name) { + const tableInfo = schemaService.getTableInfoByViewModelId(viewModel.id); + if (tableInfo) { + viewModel.name = tableInfo.name; + } + } + + // 补充列表分页条数 + if (viewModel.pagination && !viewModel.pagination.pageList && viewModel.pagination.pageSize) { + viewModel.pagination.pageList = '10,20,30,50,100'; + if (viewModel.pagination.pageSize && !viewModel.pagination.pageList.includes(viewModel.pagination.pageSize)) { + let pageList = [10, 20, 30, 50, 100, viewModel.pagination.pageSize]; + pageList = pageList.sort((A, B) => A - B); + viewModel.pagination.pageList = pageList.toString(); + } + + } + } + + + /** + * 适配旧表单VM字段属性 + * @param viewModel VM + */ + function adaptOldViewModelField(vmField: any, schemaField: any) { + + // 升级旧表单,补充更新时机属性。 + if (!vmField.updateOn) { + let updateOn = 'blur'; + const editorType = schemaField.editor && schemaField.editor.$type; + if (editorType === 'EnumField' || editorType === 'CheckBox') { + updateOn = 'change'; + } + vmField.updateOn = updateOn; + } + + if (vmField.fieldSchema) { + // ComboList 强制替换为EnumField + if (vmField.fieldSchema.editor && vmField.fieldSchema.editor.$type === 'ComboList') { + vmField.fieldSchema.editor.$type = 'EnumField'; + } + + // DatePicker 强制替换为DateBox + if (vmField.fieldSchema.editor && vmField.fieldSchema.editor.$type === 'DatePicker') { + vmField.fieldSchema.editor.$type = 'DateBox'; + } + } + } + return { assembleDesignViewModel, getAllFields2TreeByVMId, getDgViewModel, deleteViewModelById, getDgViewModels }; +} diff --git a/packages/mobile-designer/src/components/composition/events-editor-utils.ts b/packages/mobile-designer/src/components/composition/events-editor-utils.ts new file mode 100644 index 0000000000000000000000000000000000000000..7f199662bfdac1827f313149727a92c3fb7c3454 --- /dev/null +++ b/packages/mobile-designer/src/components/composition/events-editor-utils.ts @@ -0,0 +1,412 @@ +/* eslint-disable no-use-before-define */ +import { cloneDeep } from 'lodash-es'; +import { EventsEditorActions, EventsEditorMapItem, UseEventsEditor, UseEventsEditorUtils } from '../types/events-editor'; +import { UseFormCommandService } from '../types/command'; +import { UseFormSchema } from '../types'; + +export function useEventsEditorUtils(commandService: UseFormCommandService, formSchemaService: UseFormSchema, eventEditorService: UseEventsEditor): UseEventsEditorUtils { + + /** 初始传入值 */ + function formProperties(propertyData, viewModelId, eventList, switchEvents?: (propertyData, eventList) => object) { + const componentLists = getcomponentLists(viewModelId); + const commandList = commandService.generateInternalCommandList(); + const allComponentList = eventEditorService.getAllComponentList(); + const viewModelDisplay = commandService.viewModelDisplay(); + const formBasicService = formSchemaService.getFormMetadataBasicInfo(); + // DesignControlLocaleHandler.handleEventPropI18n(eventList, propertyData, commandService.localeService); + + const properties = + { + viewModelId: viewModelId, + propertyID: viewModelId, + propertyType: 'events', + /** 内置构件显示的命令列表 */ + internalCommandList: commandList, + /** (事件设定)可绑定事件默认列表; */ + events: eventList, + /** 已绑定的事件(拼接已有的参数值,拼接当前事件->待集成-从dom结构中取值,事件及对应的字符串) */ + boundEventsList: commandService.findParamtersPosition(propertyData, eventList, viewModelId, allComponentList), + /** 视图模型已有命令 */ + viewModel: viewModelDisplay, + /** 目标组件对应的所有可选的组件 */ + componentLists: componentLists, + /** 所有组件列表 */ + allComponentList: allComponentList, + /** 接收formBasicService.formMetaBasicInfo.relativePath */ + relativePath: formBasicService.relativePath, + /** 接收this.formBasicService.envType */ + envType: 'designer', + /** 初始为空,用于存储用户点击「导入新命令」的控制器值 */ + newController: [], + isAddControllerMethod: false, + /** 开关控制类按钮的回调函数 */ + getEventList: () => refreshEventsAndCommandList(propertyData, commandList, viewModelId, allComponentList, eventList, switchEvents), + /** 获取事件的路径 */ + getEventPath: () => eventEditorService.getEventPath(propertyData.id, viewModelId), + }; + return properties; + } + + /** 事件编辑器传出值处理 */ + function saveRelatedParameters(propertyData: any, viewModelId: string, eventList, parameters: any) { + if (parameters.isAddControllerMethod) { + + if (!parameters.controlInfo && propertyData.type) { + // parameters.controlInfo = { type: propertyData.type, name: DgControl[propertyData.type] && DgControl[propertyData.type].name }; + parameters.controlInfo = { type: propertyData.type, name: propertyData.type }; + } + + commandService.addControllerMethod(propertyData, viewModelId, parameters); + return; + } + + /** 根据返回值整合为actions结构 */ + const actions = formActionsStructure(eventEditorService, propertyData, parameters); + /** 增删改组件dom中事件绑定值 */ + eventsValueChanged(propertyData, actions, eventList); + /** 更新dom中的actions节点 */ + const domActions = cloneDeep(domActionsChanged(actions)); + /** 更新dom中viewModel的绑定值 */ + commandService.viewModelDomChanged(propertyData, eventList, viewModelId, domActions); + /** 删除viewModel中冗余的命令 */ + if (parameters['preCommand'] !== undefined) { + // 将preCommand中的命令与action节点的命令相比较,若action节点中不存在,则在视图模型中删除 + delViewModelCommand(parameters, domActions); + } + /** 更新dom中的webcmds节点 */ + domWebcmdChanged(parameters); + /** 更新函数中获取到的webcmds*/ + functionWebcmdsChanged(parameters); + /** 存在重复被使用的「已绑定命令」,则更新actions节点 */ + if (parameters['repititionCommand']) { + repititionCommandExist(parameters, propertyData); + } + } + + /** 目标组件规则判定 */ + function getcomponentLists(viewModelId) { + const components = formSchemaService.getComponents(); + const componentListsItem = { + componentId: '', + viewModelId: '' + }; + let componentLists = [] as any; + let curComponent = 0; + for (let i = 0; i < components.length; i++) { + const viewModel = formSchemaService.getViewModelById(components[i].viewModel); + const isFormComponentBindingMainEntity = components[i].componentType.includes('form') && viewModel?.bindTo === '/'; + + // 筛选出root-component及form类型的component,(form类型并且绑定子表的情况例外) + if (components[i].componentType.toLowerCase() !== 'frame' && !isFormComponentBindingMainEntity) { + componentListsItem.componentId = cloneDeep(components[i].id); + componentListsItem.viewModelId = cloneDeep(components[i].viewModel); + componentLists.push(cloneDeep(componentListsItem)); + if (viewModelId === componentListsItem.viewModelId) { + curComponent = i; + } + } + } + // 当前组件是否为root-component + if (components[curComponent].componentType.toLowerCase() !== 'frame') { + componentLists = []; + } + return componentLists; + } + + /** 根据返回值整合为actions结构 */ + function formActionsStructure(eventEditorService, data, parameters) { + const actions: EventsEditorActions = { + sourceComponent: { + id: data.id, + viewModelId: cloneDeep(parameters.viewModelId), + map: [] + } + }; + parameters.boundEventsList.forEach(boundEventItem => { + const mapItem: EventsEditorMapItem = { + event: { + label: boundEventItem.boundEvents.label, + name: boundEventItem.boundEvents.name, + }, + targetComponent: cloneDeep(eventEditorService.formTargetComponent(boundEventItem, parameters.viewModelId)), + command: { + id: boundEventItem.command.id, + label: boundEventItem.command.label, + name: boundEventItem.command.name, + handlerName: boundEventItem.command.handlerName, + params: cloneDeep(boundEventItem.command.property), + isNewGenerated: boundEventItem.command.isNewGenerated || false, + // isRTCmd: boundEventItem.command['isRTCmd'], + isInvalid: boundEventItem.command.isInvalid || false, + }, + controller: { + id: boundEventItem.controller.id, + label: boundEventItem.controller.label, + name: boundEventItem.controller.name, + } + }; + if (boundEventItem.command['targetComponent']) { + mapItem.targetComponent.id = boundEventItem.command.targetComponent; + } + if (mapItem.targetComponent.viewModelId !== undefined) { + actions.sourceComponent.map.push(cloneDeep(mapItem)); + } + }); + return actions; + } + /** 增删改组件dom中事件绑定值 */ + function eventsValueChanged(data, actions, eventList) { + // 增加或修改:data[事件id] = 'viewModelId.targetComponent-viewModelId.command'; + actions.sourceComponent.map.forEach(mapItem => { + // 判断是存储为三段path或一段path + if (mapItem.targetComponent.viewModelId && (actions.sourceComponent.viewModelId !== mapItem.targetComponent.viewModelId)) { + data[mapItem.event.label] = cloneDeep(`root-viewmodel.${mapItem.targetComponent.viewModelId}.${mapItem.command.label}`); + } else { + data[mapItem.event.label] = cloneDeep(`${mapItem.command.label}`); + } + }); + /** 删除 data[事件id] = null */ + eventList.forEach(event => { + const exist = actions.sourceComponent.map.find(mapItem => mapItem.event.label === event.label); + if (!exist) { + data[event.label] = null; + deleteActionItem(data.id, event.label); + } + }); + } + + /** 处理启用后隐藏的的事件的参数 */ + function handleParameterOfHiddenEvents(domActionsList, actionsListOnEventInterface) { + // 找出隐藏的事件 + const hiddenEventsObject = domActionsList.filter(domActionsListItem => + !actionsListOnEventInterface.some(actionsListOnEventInterfaceItem => + actionsListOnEventInterfaceItem.event.label === domActionsListItem.event.label)); + // 同步隐藏事件参数 + hiddenEventsObject.forEach(hiddenEventsObjectItem => { + // 隐藏事件是否绑定相同命令 + const matchingItem = actionsListOnEventInterface.find(actionsListOnEventInterfaceItem => + actionsListOnEventInterfaceItem.command.id === hiddenEventsObjectItem.command.id); + // 若有,则同步参数 + if (matchingItem) { + hiddenEventsObjectItem.command.params = matchingItem.command.params; + } + }); + // 同步到domAction + domActionsList.map(domActionsListItem => { + const matchingItem = hiddenEventsObject.find(hiddenEventsObjectItem => + hiddenEventsObjectItem.event.label === domActionsListItem.event.label); + return matchingItem ? matchingItem : domActionsListItem; + }); + return domActionsList; + } + + /** 更新dom中的acions节点 */ + function domActionsChanged(actionsOnEventInterface) { + if (actionsOnEventInterface.sourceComponent.map.length) { + if (formSchemaService.getModule().actions === undefined) { + formSchemaService.getModule().actions = [cloneDeep(actionsOnEventInterface)]; + } + else { + const domActions = formSchemaService.getModule().actions; + let actionExist = false; + domActions.forEach(domActionItem => { + if (actionsOnEventInterface.sourceComponent.id === domActionItem.sourceComponent.id) { + actionsOnEventInterface.sourceComponent.map.forEach(mapItem => { + // 若存在相同源组件,则判断是否存在同一个事件 + const eventIndex = domActionItem.sourceComponent.map.findIndex(domMapItem => mapItem.event.label === domMapItem.event.label); + if (eventIndex > -1) { + actionExist = true; + // 存储过该事件,覆盖 + domActionItem.sourceComponent.map[eventIndex] = cloneDeep(mapItem); + } else { + // 没有存储该事件,则增加 + domActionItem.sourceComponent.map.push(cloneDeep(mapItem)); + } + if (domActionItem.sourceComponent.map.length !== actionsOnEventInterface.sourceComponent.map) { + const domActionsList = handleParameterOfHiddenEvents(domActionItem.sourceComponent.map, actionsOnEventInterface.sourceComponent.map); + domActionItem.sourceComponent.map = cloneDeep(domActionsList); + } + }); + } + }); + if (!actionExist) { + domActions.push(cloneDeep(actionsOnEventInterface)); + } + formSchemaService.getModule().actions = cloneDeep(domActions); + } + } + const domActions = cloneDeep(formSchemaService.getModule().actions); + return domActions; + } + /** 删除viewModel中冗余的命令 */ + function delViewModelCommand(parameters, domActions) { + let preCommandExist = false; + let targetComponent; + domActions.forEach(domActionsItem => { + domActionsItem.sourceComponent.map.forEach(mapItem => { + if (mapItem.command.id === parameters.preCommand.id && mapItem.command.label === parameters.preCommand.label) { + preCommandExist = true; + targetComponent = mapItem.targetComponent.viewModelId; + } + }); + }); + // 该命令没有被任何事件绑定,且该命令是事件面板内置的命令,则删除 + if (!preCommandExist) { + const viewModelcommand = cloneDeep(formSchemaService.getViewModels()); + viewModelcommand.forEach(vmItem => { + vmItem.commands.forEach((vmCommandsItem, index) => { + if (parameters.preCommand.isNewGenerated && vmCommandsItem.id === parameters.preCommand.id && vmCommandsItem.code === parameters.preCommand.label) { + const isDeclared = formSchemaService.getModule()['declarations'] ? checkIfDelViewModelCommand(vmCommandsItem) : false; + if (!isDeclared) { vmItem.commands.splice(index, 1); } + } + }); + }); + formSchemaService.setViewmodels(cloneDeep(viewModelcommand)); + } + } + /** 检测是否在组件声明中声明过该命令,若有声明,则不删除 */ + function checkIfDelViewModelCommand(vmCommandsItem) { + // eslint-disable-next-line prefer-destructuring + const declarations = formSchemaService.getModule()['declarations']; + // root-viewmodel.data-grid-component-viewmodel.loadCard1; + let i = 0; + while (i < declarations.commands.length) { + const { command } = declarations.commands[i]; + i++; + if (vmCommandsItem.code === command) { + return true; + } + } + return false; + } + /** 更新dom中的webcmds节点 */ + function domWebcmdChanged(parameters) { + if (formSchemaService.getCommands() === undefined) { + formSchemaService.setCommands([]); + } + + const { relativePath } = parameters; + const webcmds = formSchemaService.getCommands(); + if (parameters.boundEventsList) { + parameters.boundEventsList.forEach(boundEventListItem => { + const command = { + host: boundEventListItem.command.id, + handler: boundEventListItem.command.handlerName, + }; + let exist = false; + webcmds.forEach(webcmdsItem => { + // 已经存储过该控制器 + if (webcmdsItem.id === boundEventListItem.controller.id) { + exist = true; + let commandExist = -1; + if (webcmdsItem.refedHandlers) { + commandExist = webcmdsItem.refedHandlers.findIndex(commandItem => + command.host === commandItem.host); + } else { + webcmdsItem['refedHandlers'] = []; + webcmdsItem.refedHandlers.push(cloneDeep(command)); + } + if (commandExist === -1) { + webcmdsItem.refedHandlers.push(cloneDeep(command)); + } + } + }); + // 没有存储过该控制器 + if (!exist && boundEventListItem.controller.label) { + if (boundEventListItem.controller.label !== '') { + const content = { + id: boundEventListItem.controller.id, + path: relativePath, + name: `${boundEventListItem.controller.label}.webcmd`, + refedHandlers: [] as any, + code: boundEventListItem.controller.code, + nameSpace: boundEventListItem.controller.nameSpace, + }; + content.refedHandlers.push(cloneDeep(command)); + webcmds.push(cloneDeep(content)); + } + } + }); + formSchemaService.setCommands(cloneDeep(webcmds)); + } + formSchemaService.setCommands(cloneDeep(webcmds)); + } + /** 更新函数中获取到的webcmds*/ + function functionWebcmdsChanged(parameters) { + if (parameters.newController) { + commandService.commandsChanged(parameters.newController); + } + } + /** 删除事件时同时移除actions对应节点 */ + function deleteActionItem(id, eventLabel) { + const domActions = formSchemaService.getModule().actions || []; + domActions.forEach(function (actionsItem, index) { + if (actionsItem.sourceComponent.id === id) { + actionsItem.sourceComponent.map.forEach(function (mapItem, index) { + if (mapItem.event.label === eventLabel) { + actionsItem.sourceComponent.map.splice(index, 1); + } + }); + } + if (actionsItem.sourceComponent.map.length === 0) { + domActions.splice(index, 1); + } + }); + formSchemaService.getModule().actions = cloneDeep(domActions); + } + /** 存在重复被使用的「已绑定命令」,则更新actions节点 */ + function repititionCommandExist(parameters, propertyData) { + if (parameters['repititionCommand'].length !== 0) { + const actions = cloneDeep(formSchemaService.getModule().actions); + const repititionCommand = cloneDeep(parameters.repititionCommand); + repititionCommand.forEach(repititionCommandItem => { + let copiedEventLabel; + // 提取使用了「已绑定命令」的 事件的相关值 + parameters.boundEventsList.forEach(boundEventsListItem => { + copiedEventLabel = (boundEventsListItem.command.id === repititionCommandItem.command.id) ? boundEventsListItem.boundEvents.label : undefined; + }); + if (copiedEventLabel !== undefined) { + let data; + actions.forEach(actionsItem => { + actionsItem.sourceComponent.map.forEach(mapItem => { + if (propertyData.id === actionsItem.sourceComponent.id && mapItem.controller.id === repititionCommandItem.controller.id && mapItem.command.id === repititionCommandItem.command.id && mapItem.event.label === copiedEventLabel) { + // 记录 使用了「已绑定命令」的 事件的相关值 + data = { + targetComponent: mapItem.targetComponent, + command: mapItem.command + }; + } + }); + }); + actions.forEach(actionsItem => { + actionsItem.sourceComponent.map.forEach(mapItem => { + // 更新「已绑定命令」原始数据 + if (mapItem.command.id === repititionCommandItem.command.id && mapItem.controller.id === repititionCommandItem.controller.id && mapItem.event.label === repititionCommandItem.event.label) { + mapItem.targetComponent = cloneDeep(data['targetComponent']); + mapItem.command = cloneDeep(data['command']); + } + }); + }); + formSchemaService.getModule().actions = cloneDeep(actions); + } + }); + } + } + + /** 开关控制类按钮的回调函数 */ + function refreshEventsAndCommandList(propertyData, commandList: any[], viewModelId, allComponentList, eventList, switchEvents?: (propertyData, eventList) => object) { + if (switchEvents) { + eventList = switchEvents(propertyData, eventList); + } + // DesignControlLocaleHandler.handleEventPropI18n(eventList, propertyData, commandService.localeService); + + commandList = commandService.generateInternalCommandList(); + const boundEventsList = commandService.findParamtersPosition(propertyData, eventList, viewModelId, allComponentList); + return { + internalCommandList: commandList, + events: eventList, + boundEventsList + }; + } + return { formProperties, saveRelatedParameters }; +} diff --git a/packages/mobile-designer/src/components/composition/form-metadata-converter.ts b/packages/mobile-designer/src/components/composition/form-metadata-converter.ts new file mode 100644 index 0000000000000000000000000000000000000000..45ae13c7c125ff89776f6e519c9afa799c5b43cd --- /dev/null +++ b/packages/mobile-designer/src/components/composition/form-metadata-converter.ts @@ -0,0 +1,116 @@ +/** + * 将现有表单元数据转换成vue设计器要求的结构 + */ +export class FormMetadataConverter { + + private componentTypeMapper: Record = { + Tab: 'tabs', + ToolBar: 'response-toolbar', + QueryScheme: 'query-solution', + Form: 'response-form', + Header: 'page-header', + GridField: 'data-grid-column', + TreeGridField: 'data-grid-column', + TabToolbarItem: 'tab-toolbar-item', + TabPage: 'tab-page', + ResponseToolbarItem: 'response-toolbar-item' + }; + + private formGroupMapper: Record = { + EnumField: 'combo-list', + LookupEdit: 'input-group', + TextBox: 'input-group', + NumericBox: 'number-spinner', + DateBox: 'date-picker', + SwitchField: 'switch', + RadioGroup: 'radio-group', + CheckBox: 'check-box', + Avatar: 'avatar', + CheckGroup: 'check-group', + MultiTextBox: 'textarea', + RichTextBox: 'textarea', + OrganizationSelector: 'input-group', + PersonnelSelector: 'input-group' + }; + /** 将表单schema字段中的editor类型转为vue控件类型 */ + public getRealEditorType(type: string) { + return this.formGroupMapper[type || 'TextBox'] || type; + } + public convertDesignerMetadata(formSchema: any) { + this.convertEntity(formSchema); + this.convertComponents(formSchema.module.components); + } + + /** + * 转换控件类型 + * @param component + * @returns + */ + private convertComponentType(component: any) { + const originalComponentType = component.type; + + // 输入类控件 + if (this.formGroupMapper[originalComponentType]) { + component.type = 'form-item'; + component.label = component.title; + component.editor = { + type: this.formGroupMapper[originalComponentType] + }; + + const properties = Object.keys(component); + + // 如果属性不是id等属性,则将其移到editor对象中 + for (const prop of properties) { + if (!["id", "type", "editor", "label", "appearance", "style", "binding", "visible", "path"].includes(prop)) { + component.editor[prop] = component[prop]; + // 删除原对象上的该属性 + delete component[prop]; + } + } + } + + // 类型转换 + if (this.componentTypeMapper[originalComponentType]) { + component.type = this.componentTypeMapper[component.type]; + return; + } + // 统一处理:将camel-case 转为kebab-case + component.type = component.type.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase(); + } + + /** + * 转换子组件的componentType值 + */ + private convertChildComponentType(component: any) { + if (component && component.type === 'component' && component.componentType) { + component.componentType = component.componentType.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase(); + } + } + + private convertComponents(components: any[]) { + components.forEach((component: any) => { + this.convertComponentType(component); + this.convertChildComponentType(component); + if (component.contents && component.contents.length) { + this.convertComponents(component.contents); + } + if (component.type === 'tab-page' && component.toolbar) { + this.convertComponentType(component.toolbar); + if (component.toolbar.contents && component.toolbar.contents.length) { + this.convertComponents(component.toolbar.contents); + } + } + + }); + } + + /** + * 转换实体节点 + */ + private convertEntity(domMetadata: any) { + if (domMetadata.module.schemas) { + domMetadata.module.entity = domMetadata.module.schemas; + } + } + +} diff --git a/packages/mobile-designer/src/components/composition/form-metadata.service.ts b/packages/mobile-designer/src/components/composition/form-metadata.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..a9508c60f72fc3fc9a28345ac427b013e2212311 --- /dev/null +++ b/packages/mobile-designer/src/components/composition/form-metadata.service.ts @@ -0,0 +1,195 @@ +import axios from 'axios'; +import { mergeWith, omit } from 'lodash-es'; +import { DesignerProps } from '../designer.props'; +import { FormMetadataConverter } from './form-metadata-converter'; +import { FormMetadaDataDom, MetadataDto, MetadataPathToken, UseFormSchema, UseFormMetadata, FormMetaDataModule } from '../types'; +import { inject } from 'vue'; +import { MetadataService } from './metadata.service'; +import { FNotifyService } from '@farris/ui-vue/components'; + +export function useFormMetadata(props: DesignerProps, useFormSchemaComposition: UseFormSchema): UseFormMetadata { + + function fetchLocalSchema(): Promise { + return new Promise((resolve, reject) => { + const currentPath = window.location.hash; + if (currentPath) { + const loacalSchemaUrl = `/${currentPath.slice(1)}.json`; + axios.get(loacalSchemaUrl).then((response) => { + const formSchema = response.data.Content.Contents; + const formMetadataBasicInfo = omit(response.data, 'content') as MetadataDto; + + useFormSchemaComposition.setFormMetadataBasicInfo(formMetadataBasicInfo); + useFormSchemaComposition.setFormSchema(formSchema); + + resolve(formSchema); + }); + } else { + resolve(props.schema); + } + }); + } + + /** 获取表单元数据 */ + function queryMetadata(): Promise { + const metadataPath: string = inject(MetadataPathToken, ''); + if (!metadataPath) { + return fetchLocalSchema(); + } + + // 获取url中的元数据路径,查询元数据。若url中没有路径,则采用外部传入的mock数据 + return new Promise((resolve, reject) => { + const url = '/api/dev/main/v1.0/metadatas/load?metadataFullPath=' + metadataPath; + + axios.get(url).then((response) => { + + const formSchema = JSON.parse(response.data.content).Contents; + + if (!response.data.properties || response.data.properties.framework !== 'Vue') { + new FormMetadataConverter().convertDesignerMetadata(formSchema); + } + const formMetadataBasicInfo = omit(response.data, 'content') as MetadataDto; + + useFormSchemaComposition.setFormMetadataBasicInfo(formMetadataBasicInfo); + useFormSchemaComposition.setFormSchema(formSchema); + + resolve(formSchema); + }); + }); + + } + function saveFormMetadata() { + const formMetadataBasicInfo = useFormSchemaComposition.getFormMetadataBasicInfo(); + const formSchema = useFormSchemaComposition.getFormSchema(); + const metadataContent = Object.assign({ + code: null, + name: null, + Id: formMetadataBasicInfo.id, + Contents: JSON.stringify(formSchema) + }); + const newDto = { + ID: formMetadataBasicInfo.id, + NameSpace: formMetadataBasicInfo.nameSpace, + Code: formMetadataBasicInfo.code, + Name: formMetadataBasicInfo.name, + FileName: formMetadataBasicInfo.fileName, + RelativePath: formMetadataBasicInfo.relativePath, + Content: formMetadataBasicInfo.content, + Type: formMetadataBasicInfo.type, + BizobjectID: formMetadataBasicInfo.bizobjectID, + ExtendProperty: formMetadataBasicInfo.extendProperty, + NameLanguage: formMetadataBasicInfo.nameLanguage ? formMetadataBasicInfo.nameLanguage : null, + Properties: formMetadataBasicInfo.properties, + content: JSON.stringify(metadataContent) + }; + + return new MetadataService().saveMetadata(newDto); + } + /** + * 获取拖拽控制规则:合并公共规则和模板的特定规则 + */ + function queryFormTemplateRule(formModule: FormMetaDataModule): Promise { + if (!formModule) { + return Promise.resolve(); + } + const { templateId, templateRule } = formModule; + const notifyService: any = new FNotifyService(); + notifyService.globalConfig = { position: 'top-center' }; + + return new Promise((resolve, reject) => { + const rulesRequests = [axios.get(`assets/template-rules/common.json`).then(response => response).catch(error => { + notifyService.error('获取表单公共控制规则失败。'); + return; + })]; + if (templateId && templateRule) { + rulesRequests.push(axios.get(`assets/template-rules/${templateId}.json`).then(response => response).catch(error => { + notifyService.error(`获取模板[${templateId}]的控制规则失败。`); + return; + })); + } + axios.all(rulesRequests).then(axios.spread((commonRuleResult, templateRuleResult) => { + if (commonRuleResult) { + if (templateRuleResult) { + function customizer(objValue, srcValue) { + if (Array.isArray(objValue) && Array.isArray(srcValue)) { + return objValue.concat(srcValue);; + } + } + mergeWith(commonRuleResult.data, templateRuleResult.data, customizer); + } + useFormSchemaComposition.setFormTemplateRule(commonRuleResult.data); + } + + + resolve(); + }), () => { + resolve(); + }); + }); + + + } + + /** + * @description 发布 + * @introduction post接口触发发布行为,ws负责接收发布状态 + */ + function publishFormMetadata(): Promise<{ result: boolean, error?: string }> { + return new Promise((resolve, reject) => { + let wsType = 'ws:'; + if (location && location.protocol === 'https:') { + wsType = 'wss:'; + } + const formMetadataBasicInfo = useFormSchemaComposition.getFormMetadataBasicInfo(); + const url = wsType + `//${location.host}/api/dev/main/v1.0/lcm-log/ws?token=${formMetadataBasicInfo.bizobjectID}`; + const publishStatusSocket = new WebSocket(url); + + publishStatusSocket.onopen = (() => { + const metadataPathList = formMetadataBasicInfo.relativePath.split('/').filter(pathItem => pathItem); + const boPath = metadataPathList[0] + '/' + metadataPathList[1] + '/' + metadataPathList[2]; + const api = `/api/dev/main/v1.0/repo-packages/publish?id=${formMetadataBasicInfo.bizobjectID}&path=${boPath}`; + const requestHeader = { + "content-type": "application/json" + }; + axios.post(api, null, { headers: requestHeader }).then((response) => { + }); + }); + publishStatusSocket.onerror = ((error: any) => { + let errMessage = '解析异常,请重试'; + if (typeof (error.error) === 'string') { + errMessage = error.error; + } + resolve({ result: false, error: errMessage }); + }); + publishStatusSocket.onmessage = ((event) => { + // console.log(event); + const progressInfoStr = event.data.match(/\{(.*)\}/)[0]; + const progressInfo = JSON.parse(progressInfoStr); + + if (progressInfo.process === 100) { + publishStatusSocket.close(); + resolve({ result: true }); + } else { + if (progressInfo.status === 1) { + publishStatusSocket.close(); + resolve({ result: false, error: progressInfo.errorMsg }); + } + } + }); + + }); + } + + function deployFrontFile(metadataId, path) { + const api = '/api/dev/main/v1.0/frontend-project/runvueform'; + const requestHeader = { + "content-type": "application/json" + }; + const sendData = { + metadataId, + path + }; + return axios.post(api, sendData, { headers: requestHeader }); + } + return { queryMetadata, saveFormMetadata, queryFormTemplateRule, publishFormMetadata, deployFrontFile }; + +} diff --git a/packages/mobile-designer/src/components/composition/metadata.service.ts b/packages/mobile-designer/src/components/composition/metadata.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..c87dcd0c2a421d3e04f2782280330f2e6bf02ca0 --- /dev/null +++ b/packages/mobile-designer/src/components/composition/metadata.service.ts @@ -0,0 +1,178 @@ +import axios from 'axios'; +import { useLocation } from './use-location'; + +export class MetadataService { + + private metadataBasePath = '/api/dev/main/v1.0/metadatas'; + + /** + * /api/dev/main/v1.0/mdservice + */ + private metadataServicePath = '/api/dev/main/v1.0/mdservice'; + + public getMetadataPath() { + const { getUrlParam } = useLocation(); + let metadataPath = getUrlParam('id') || ''; + // 增加此处会影响构件的Path属性 + if (metadataPath && metadataPath.startsWith('/')) { + metadataPath = metadataPath.slice(1, metadataPath.length); + } + if (metadataPath && metadataPath.endsWith('/')) { + metadataPath = metadataPath.slice(0, metadataPath.length - 1); + } + return metadataPath; + } + + /** + * 根据元数据Id查询元数据 + * @param relativePath 相对路径 + * @param metadataId 元数据id + * @returns + */ + public queryMetadataById(relativePath: string, metadataId: string): Promise { + const url = this.metadataBasePath + '/relied?metadataPath=' + relativePath + '&metadataID=' + metadataId; + return axios.get(url); + } + + /** + * 根据元数据类型查询元数据 + * @param relativePath + * @param metadataType + * @returns + */ + public GetMetadataListByType(relativePath: string, metadataType: string): Promise { + const url = this.metadataBasePath + '?path=' + relativePath + '&metadataTypeList=' + metadataType; + return axios.get(url); + } + + /** + * 获取当前工程下或者其他元数据包中依赖的元数据 + * @param {?} path + * @param {?} metadataId + * @param {?} sessionId + * @return {?} + */ + public GetRefMetadata(path, metadataId): Promise { + // gsp.cache.get('sessionId'); + const url = this.metadataBasePath + '/relied?metadataPath=' + path + '&metadataID=' + metadataId; + return axios.get(url); + } + + /** + * 获取当前工程下所有的元数据包 + * @param {?} spacePath + * @param {?} typeName + * @return {?} + */ + public GetMetadataList(spacePath, typeName) { + // var headers = new HttpHeaders().set('SessionId', this.sessionId); + const url = this.metadataServicePath + '?path=' + spacePath + '&metadataTypeList=' + typeName; + return axios.get(url); + }; + + public getMetadataListInSu(relativePath: string, metaddataType: string) { + const url = this.metadataServicePath + '/metadataListInSu?path=' + relativePath + '&metadataTypeList=' + metaddataType; + return axios.get(url); + } + + /** + * 获取最近使用的元数据 + * @param relativePath + * @param metaddataType + * @returns + */ + public getRecentMetadata(relativePath: string, metaddataType: string) { + const url = this.metadataServicePath + '/getmdrecentuse?path=' + relativePath + '&metadataTypeList=' + metaddataType; + return axios.get(url); + } + + /** + * 获取所有元数据 + * @param relativePath + * @param metaddataType + * @param pageSize + * @returns + */ + public getAllMetadataList(relativePath: string, metaddataType: string, pageSize = 1000) { + const url = this.metadataServicePath + '/unionmdlist?pageIndex=1&pageSize=1000' + + '&path=' + relativePath + '&metadataTypeList=' + metaddataType; + + return axios.get(url).then((res: any) => { + const totalNum = res.data['page']['total'] || 0; + if (totalNum > 1000) { + return this.getAllMetadataList(relativePath, metaddataType, totalNum); + } + return res; + }); + } + + public getPickMetadata(relativePath: string, data: any) { + const url = this.metadataServicePath + '/pickMetadata?currentPath=' + relativePath; + return axios.post(url, data).then((res: any) => { + return res.data; + }); + } + + public saveMetadata(metadataDto: any) { + return axios.put(this.metadataBasePath, metadataDto); + } + + public validateRepeatName(path: string, fileName: string) { + const url = this.metadataBasePath + '/validation?path=' + path + '&fileName=' + fileName; + return axios.get(url).then((res: any) => { + return res.data; + }); + } + // Load元数据(外部调用) + public loadMetadata(fullName: string, path: string) { + const metadataFullPath = path.replace(/\\/g, '/') + '/' + fullName; + const encMetadataFullPath = encodeURIComponent(metadataFullPath); + const url = this.metadataBasePath + '/load?metadataFullPath=' + encMetadataFullPath; + return axios.get(url).then((res: any) => { + return res.data; + }); + } + // 初始化元数据实体 + public initializeMetadataEntity(metadataDto:any) { + let name_chs = metadataDto.name; + let name_en = ""; + let name_cht = ""; + if (metadataDto.nameLanguage) { + // 默认处理 + name_chs = metadataDto.nameLanguage['zh-CHS'] ? metadataDto.nameLanguage['zh-CHS'] : name_chs; + name_en = metadataDto.nameLanguage['en'] ? metadataDto.nameLanguage['en'] : ""; + name_cht = metadataDto.nameLanguage['zh-CHT'] ? metadataDto.nameLanguage['zh-CHT'] : ""; + } + // tslint:disable-next-line:max-line-length + const url = this.metadataBasePath + '/initialized?nameSpace=' + metadataDto.nameSpace + '&code=' + metadataDto.code + '&name=' + name_chs + '&name_cht=' + name_cht + '&name_en=' + name_en + '&type=' + metadataDto.type + '&bizObjectID=' + metadataDto.bizobjectID + '&metadataPath=' + metadataDto.relativePath + '&extendProperty=' + metadataDto.extendProperty; + + return axios.get(url).then((res: any) => { + return res.data; + }); + } + // 新建元数据 + public createMetadata(metadataDto: any) { + const content = { + 'ID': metadataDto.id, + 'NameSpace': metadataDto.nameSpace, + 'Code': metadataDto.code, + 'Name': metadataDto.name, + 'FileName': metadataDto.fileName, + 'RelativePath': metadataDto.relativePath, + 'Content': metadataDto.content, + 'Type': metadataDto.type, + 'BizobjectID': metadataDto.bizobjectID, + 'ExtendProperty': metadataDto.extendProperty, + 'NameLanguage': !metadataDto.nameLanguage ? null : metadataDto.nameLanguage, + }; + const url = this.metadataBasePath; + + return axios.post(url, content, { + params: {}, // 可以指定请求的URL参数 + responseType: 'stream' + } + ).then((res: any) => { + return { ok: res.status === 204 }; + }); + } +} diff --git a/packages/mobile-designer/src/components/composition/schema-repository/controller/categories.ts b/packages/mobile-designer/src/components/composition/schema-repository/controller/categories.ts new file mode 100644 index 0000000000000000000000000000000000000000..31ba4f36c74d3aa21641cc80b6a4739c23473689 --- /dev/null +++ b/packages/mobile-designer/src/components/composition/schema-repository/controller/categories.ts @@ -0,0 +1,73 @@ +export default [ + { + id: "all", + code: "all", + name: "全部", + active: true, + contains: [] + }, + { + id: "data", + code: "data", + name: "数据", + active: false, + contains: ['AddCommands','RemoveCommands', 'EditCommands','UpdateCommands','ViewCommands', 'SaveCommands','LoadCommands','CancelCommands'] + }, + { + id: "navigate", + code: "navigate", + name: "路由", + active: false, + contains: ['NavigateCommands'] + }, + { + id: "flow", + code: "flow", + name: "流程", + active: false, + contains: ['ApproveService'] + }, + { + id: "file", + code: "file", + name: "附件", + active: false, + contains: ['MobileAttachmentCmd'] + }, + { + id: "stateMachine", + code: "stateMachine", + name: "状态机", + active: false, + contains: ['StateMachineCommands'] + }, + { + id: "discussion", + code: "discussion", + name: "评论区", + active: false, + contains: ['DiscussionGroupCommands'] + }, + { + id: "ui", + code: "ui", + name: "UI相关", + active: false, + contains: ['UICommands'] + }, + { + id: "loadPage", + code: "loadPage", + name: "页面加载", + active: false, + contains: ['LoadPageCommands'] + }, + { + id: "other", + code: "other", + name: "其他", + active: false, + contains: ['VoVariableService'] + } + +]; diff --git a/packages/mobile-designer/src/components/composition/schema-repository/controller/controller-selector.service.ts b/packages/mobile-designer/src/components/composition/schema-repository/controller/controller-selector.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..d54af5217d56b8b3b67100f303c5c1fe110746bf --- /dev/null +++ b/packages/mobile-designer/src/components/composition/schema-repository/controller/controller-selector.service.ts @@ -0,0 +1,57 @@ +import { MetadataService } from "../../metadata.service"; +import { SchemaItem, SchemaRepositoryPagination, SchemaCategory } from "@farris/ui-vue/components"; +import controllCategories from './categories'; +import { getAllSupportedControllers } from "../../command/supported-controller"; + +export class ControllerSelectorSchemaService { + private metadataType = '.webcmd'; + constructor(private metadataService: MetadataService) { + } + + public getNavigationData(searchingText: string, pagination: SchemaRepositoryPagination): SchemaCategory[] { + return controllCategories; + } + + public getRecentlyData(searchingText: string, pagination: SchemaRepositoryPagination): SchemaItem[] { + return []; + } + + public getRecommandData(searchingText: string, pagination: SchemaRepositoryPagination): SchemaItem[] { + return []; + } + + private metadata2SchemaItem(metadata: any[], category: string): SchemaItem[] { + const supportedControllers = getAllSupportedControllers(); + return metadata.filter((metadataItem) => { + // 移除移动控制器 + if (metadataItem.nameSpace.includes('Inspur.GS.Gsp.Mobile')) { + return false; + } + // 支持自定义构件 + if (metadataItem.nameSpace.includes('.Front')) { + return true; + } + // 移除暂不支持的内置控制器 + if (!supportedControllers[metadataItem.id]) { + return false; + } + return { + id: metadataItem.id, + name: metadataItem.name, + code: metadataItem.code, + nameSpace: metadataItem.nameSpace, + data: metadataItem, + category + }; + } + + ); + } + + public getSchemaData = async (searchingText: string, pagination: SchemaRepositoryPagination, editorParams): Promise => { + const { relativePath } = editorParams.formBasicInfo; + const allMetadataRes = await this.metadataService?.getAllMetadataList(relativePath, this.metadataType); + const items = allMetadataRes.data.metadataIndexItems ? allMetadataRes.data.metadataIndexItems : allMetadataRes.data; + return this.metadata2SchemaItem(items, 'all'); + }; +} diff --git a/packages/mobile-designer/src/components/composition/schema-repository/index.ts b/packages/mobile-designer/src/components/composition/schema-repository/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..4aeaed796f76219208bc1431d7b2bb5a7858ba79 --- /dev/null +++ b/packages/mobile-designer/src/components/composition/schema-repository/index.ts @@ -0,0 +1,2 @@ +export * from "./lookup/lookup-schema.service"; +export * from "./lookup/lookup-field-selector.service"; diff --git a/packages/mobile-designer/src/components/composition/schema-repository/lookup/lookup-field-selector.service.ts b/packages/mobile-designer/src/components/composition/schema-repository/lookup/lookup-field-selector.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..76ad877ff55066010372d9309fa8f7157e1ea2f8 --- /dev/null +++ b/packages/mobile-designer/src/components/composition/schema-repository/lookup/lookup-field-selector.service.ts @@ -0,0 +1,57 @@ +import { MetadataService } from "../../metadata.service"; + +export class LookupFieldSelectorService { + constructor(private metadataService: MetadataService) { + } + + /** + * schema字段集合组装成树 + * @param fields schema字段集合 + */ + private assembleFields2Tree(fields: any[]) { + const treeData: any = []; + fields.forEach(element => { + // 关联表字段 / UDT字段 + let children = []; + if (element.type && element.type.fields && element.type.fields.length > 0) { + children = this.assembleFields2Tree(element.type.fields); + + } + // 适配旧的帮助元数据没有bindingPath属性 + if (!element.bindingPath) { + element.bindingPath = element['parentPath'] ? element['parentPath'] + '.' + element.label : element.label; + } + treeData.push({ + data: element, + children, + expanded: true, + selectable: !children.length + }); + }); + return treeData; + } + + private buildTreeData(schema: any) { + if (!schema || !schema.entities || schema.entities.length === 0) { + return; + } + const mainTable = schema.entities[0]; + if (mainTable.type && mainTable.type.fields) { + return this.assembleFields2Tree(mainTable.type.fields); + } + + } + + getData(editorParams: any) { + const { propertyData, formBasicInfo } = editorParams; + const metadataPath = formBasicInfo?.relativePath; + if (!metadataPath) { + return; + } + return this.metadataService && this.metadataService.GetRefMetadata(metadataPath, propertyData?.helpId).then((res) => { + const metadata = JSON.parse(res.data.content); + return metadata && metadata.schema && metadata.schema.main && this.buildTreeData(metadata.schema.main); + }); + } + +} diff --git a/packages/mobile-designer/src/components/composition/schema-repository/lookup/lookup-schema.service.ts b/packages/mobile-designer/src/components/composition/schema-repository/lookup/lookup-schema.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..6ae7030dc6259e3df61c70ec89770d1a89bdd4b0 --- /dev/null +++ b/packages/mobile-designer/src/components/composition/schema-repository/lookup/lookup-schema.service.ts @@ -0,0 +1,51 @@ +import { SchemaItem, SchemaRepositoryPagination } from "@farris/ui-vue/components"; +import { MetadataService } from "../../metadata.service"; + +export class LookupSchemaService { + + private metadataType = '.hlp'; + + constructor(private metadataService: MetadataService) { + } + + private getLocalMetadata(metadataPath) { + return this.metadataService?.getMetadataListInSu(metadataPath, this.metadataType); + } + + private getRecentMetadata(metadataPath) { + return this.metadataService?.getRecentMetadata(metadataPath, this.metadataType); + } + + private metadata2SchemaItem(metadata: any[], category: string): SchemaItem[] { + return metadata.map((metadataItem) => { + return { + id: metadataItem.id, + name: metadataItem.name, + code: metadataItem.code, + nameSpace: metadataItem.nameSpace, + hide: false, + active: false, + data: metadataItem, + category + }; + }); + } + + getRecommandData = async (searchingText: string, pagination: SchemaRepositoryPagination, editorParams): Promise => { + const {relativePath} = editorParams.formBasicInfo; + const recentRequest = await this.getRecentMetadata(relativePath); + const recentData = this.metadata2SchemaItem(recentRequest.data, 'recent'); + + const suMetadataRequest = await this.getLocalMetadata(relativePath); + const localData = this.metadata2SchemaItem(suMetadataRequest.data, 'local'); + + return recentData.concat(localData); + }; + + getSchemaData = async (searchingText: string, pagination: SchemaRepositoryPagination, editorParams): Promise => { + const {relativePath} = editorParams.formBasicInfo; + const allMetadataRes = await this.metadataService?.getAllMetadataList(relativePath, this.metadataType); + const items = allMetadataRes.data.metadataIndexItems ? allMetadataRes.data.metadataIndexItems: allMetadataRes.data; + return this.metadata2SchemaItem(items, 'all'); + }; +} diff --git a/packages/mobile-designer/src/components/composition/schema.service.ts b/packages/mobile-designer/src/components/composition/schema.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..508bb84408d7ea3a1150026ce34f63ac1126572a --- /dev/null +++ b/packages/mobile-designer/src/components/composition/schema.service.ts @@ -0,0 +1,678 @@ +import axios from "axios"; +import { FormSchema, FormSchemaEntity, FormSchemaEntityField, FormSchemaEntityField$Type, FormSchemaEntityFieldType$Type, FormSchemaEntityFieldTypeName, UseFormMetadata, UseFormSchema, UseSchemaService } from "../types"; +import { MetadataService } from "./metadata.service"; +/** + * 操作表单DOM Schema的工具类 + */ +export function useSchemaService( + metadataService: MetadataService, + useFormSchema: UseFormSchema +): UseSchemaService { + + function getSchemaEntities(): FormSchemaEntity[] { + const schema = useFormSchema.getSchemas(); + return schema?.entities || []; + } + + /** + * 获取表字段列表 + * @param entities 实体对象集合 + * @param bindTo 实体绑定路径 + */ + function getTableFieldsByBindTo(entities: FormSchemaEntity[], bindTo: string) { + if (!entities || entities.length === 0) { + return []; + } + const splitIndex = bindTo.indexOf('/'); + if (splitIndex > -1) { + bindTo = bindTo.slice(splitIndex + 1, bindTo.length); + } + + for (const entity of entities) { + const entityType = entity.type; + if (!entityType) { + return []; + } + if (bindTo === '' || bindTo === entity.code || bindTo === entity.label) { + return entityType.fields; + } + if (entityType.entities && entityType.entities.length > 0) { + const fields = getTableFieldsByBindTo(entityType.entities, bindTo); + if (fields) { + return fields; + } + } + } + } + + /** + * 获取指定id的实体 + * @param entities 实体对象集合 + * @param id 实体id + */ + function getEntityNodeById(entities: FormSchemaEntity[], id: string) { + for (const entity of entities) { + if (id === entity.id) { + return entity; + } + const entityType = entity.type; + if (!entityType) { + return {}; + } + if (entityType.entities && entityType.entities.length > 0) { + const tagetEntity = getEntityNodeById(entityType.entities, id); + if (tagetEntity) { + return tagetEntity; + } + } + + } + + } + + function extractFieldsFromEntityType(entityType: { fields?: FormSchemaEntityField[] }) { + const fields: FormSchemaEntityField[] = []; + if (entityType && entityType.fields && entityType.fields.length) { + entityType.fields.forEach(field => { + if (field.$type === 'SimpleField') { + fields.push(field); + } else { + const extractedFields = extractFieldsFromEntityType(field.type); + if (extractedFields.length) { + extractedFields.forEach(extractedField => fields.push(extractedField)); + } + } + }); + } + return fields; + } + + /** + * 根据bindTo获取对应表信息 + * @param entities 实体 + * @param bindTo VM绑定 + */ + function _getTableBasicInfoByUri(entities: FormSchemaEntity[], bindTo: string, includeType?: boolean): any { + if (!entities || entities.length === 0) { + return; + } + const splitIndex = bindTo.indexOf('/'); + if (splitIndex > -1) { + bindTo = bindTo.slice(splitIndex + 1, bindTo.length); + } + + for (const entity of entities) { + if (bindTo === '' || bindTo === entity.code || bindTo === entity.label) { + const result = { + id: entity.id, + code: entity.code, + name: entity.name, + label: entity.label + + }; + if (includeType) { + result['type'] = entity.type; + } + return result; + + } + const entityType = entity.type; + + if (entityType && entityType.entities && entityType.entities.length > 0) { + const basicInfo = _getTableBasicInfoByUri(entityType.entities, bindTo, includeType); + if (basicInfo) { + return basicInfo; + } + } + } + + } + + /** + * 根据bindTo获取对应表名 + * @param entities 实体对象集合 + * @param bindTo 绑定路径 + */ + function _getTableCodeByUri(entities: FormSchemaEntity[], bindTo: string): string | undefined { + if (!entities || entities.length === 0) { + return ''; + } + const splitIndex = bindTo.indexOf('/'); + if (splitIndex > -1) { + bindTo = bindTo.slice(splitIndex + 1, bindTo.length); + } + + for (const entity of entities) { + if (bindTo === '' || bindTo === entity.code || bindTo === entity.label) { + return entity.code; + } + const entityType = entity.type; + + if (entityType && entityType.entities && entityType.entities.length > 0) { + const label = _getTableCodeByUri(entityType.entities, bindTo); + if (label) { + return label; + } + } + } + } + + /** + * 根据VM id获取对应表名 + * @param viewModelId 实体模型标识 + */ + function getTableCodeByViewModelID(viewModelId) { + const vm = useFormSchema.getViewModelById(viewModelId); + + const entities = getSchemaEntities(); + if (entities && entities.length > 0) { + return _getTableCodeByUri(entities, vm?.bindTo || ''); + } + return ''; + } + + /** entity.typ + * 根据bindTo获取对应表名 + * @param entities 实体对象集合 + * @param bindTo 绑定路径 + */ + function _getTableLabelByUri(entities: FormSchemaEntity[], bindTo: string): string | undefined { + if (!entities || entities.length === 0) { + return; + } + const splitIndex = bindTo.indexOf('/'); + if (splitIndex > -1) { + bindTo = bindTo.slice(splitIndex + 1, bindTo.length); + } + for (const entity of entities) { + if (bindTo === '' || bindTo === entity.code || bindTo === entity.label) { + return entity.label; + } + const entityType = entity.type; + + if (entityType && entityType.entities && entityType.entities.length > 0) { + const label = _getTableLabelByUri(entityType.entities, bindTo); + if (label) { + return label; + } + } + } + } + + /** + * 根据bindTo获取对应表基本信息 + * @param viewModelId 数据模型标识 + */ + function getTableInfoByViewModelId(viewModelId: string): { id: string, code: string, name: string, label: string, type } | undefined { + const vm = useFormSchema.getViewModelById(viewModelId); + const entities = getSchemaEntities(); + if (entities && entities.length > 0) { + return _getTableBasicInfoByUri(entities, vm?.bindTo || ''); + } + } + + /** + * 根据bindTo获取对应表信息 + * @param viewModelId 数据模型标识 + */ + function getTableByViewModelId(viewModelId: string): { id: string, code: string, name: string, label: string, type: any } | undefined { + const vm = useFormSchema.getViewModelById(viewModelId); + const entities = getSchemaEntities(); + if (entities && entities.length > 0) { + return _getTableBasicInfoByUri(entities, vm?.bindTo || '', true); + } + } + + /** + * 递归查询字段 + * @param fields 实体字段集合 + * @param refElementLabelPath 字段路径 + * @param id 字段标识 + */ + function getFieldInfoByID(fields: FormSchemaEntityField[], refElementLabelPath = '', id: string): { + schemaField: FormSchemaEntityField, isRefElement: boolean, refElementLabelPath: string + } { + let element; + let isRefElement = false; + const parentLabel = refElementLabelPath ? refElementLabelPath + '.' : ''; + for (const field of fields) { + if (field.id === id) { + element = field; + refElementLabelPath = parentLabel + field.label; + isRefElement = parentLabel ? true : false; + break; + } else { + // 关联字段/UDT字段 + if (field.type && field.type.fields && field.type.fields.length > 0) { + const childResult = getFieldInfoByID(field.type.fields, parentLabel + field.label, id); + if (childResult.schemaField) { + element = childResult.schemaField; + // eslint-disable-next-line prefer-destructuring + refElementLabelPath = childResult.refElementLabelPath; + // eslint-disable-next-line prefer-destructuring + isRefElement = childResult.isRefElement; + break; + } + } + } + } + return { schemaField: element, isRefElement, refElementLabelPath }; + } + + /** + * 根据字段ID获取schema字段信息--用户旧表单适配 + */ + function getFieldByID(fieldId: string) { + const entities = getSchemaEntities(); + if (!entities || entities.length === 0) { + return; + } + const viewModels = useFormSchema.getViewModels(); + for (const viewModel of viewModels) { + // if (viewModel.bindTo === '/' && !viewModel.parent) { + // continue; + // } + const fields = getTableFieldsByBindTo(entities, viewModel.bindTo); + if (!fields) { + continue; + } + const result = getFieldInfoByID(fields, '', fieldId); + if (result && result.schemaField) { + return result.schemaField; + } + } + } + + /** + * 递归查询字段 + * @param fields 实体字段集合 + * @param refElementLabelPath 字段路径 + * @param path 字段标识 + */ + function getFieldInfoByPath(fields: FormSchemaEntityField[], refElementLabelPath = '', path: string): { + schemaField: FormSchemaEntityField, isRefElement: boolean, refElementLabelPath: string + } { + let element; + let isRefElement = false; + const parentLabel = refElementLabelPath ? refElementLabelPath + '.' : ''; + for (const field of fields) { + if (field.path === path) { + element = field; + refElementLabelPath = parentLabel + field.label; + isRefElement = parentLabel ? true : false; + break; + } else { + // 关联字段/UDT字段 + if (field.type && field.type.fields && field.type.fields.length > 0) { + const childResult = getFieldInfoByID(field.type.fields, parentLabel + field.label, path); + if (childResult.schemaField) { + element = childResult.schemaField; + // eslint-disable-next-line prefer-destructuring + refElementLabelPath = childResult.refElementLabelPath; + // eslint-disable-next-line prefer-destructuring + isRefElement = childResult.isRefElement; + break; + } + } + } + } + return { schemaField: element, isRefElement, refElementLabelPath }; + } + + /** + * 根据字段ID和ViewModelId获取字段信息(包括关联表字段) + * 返回对象 {实体,是否关联字段,关联字段的dataField} + * @param id 字段标识 + * @param viewModelId 视图模型标识 + */ + function getFieldByIDAndVMID(id: string, viewModelId: string): { + schemaField: FormSchemaEntityField, isRefElement: boolean, refElementLabelPath: string + } | undefined { + const entities = getSchemaEntities(); + if (!entities || entities.length === 0) { + return; + } + const vm = useFormSchema.getViewModelById(viewModelId); + const fields = getTableFieldsByBindTo(entities, vm?.bindTo || ''); + if (!fields) { + return; + } + return getFieldInfoByID(fields, '', id); + } + + /** + * 根据字段path和ViewModelId获取字段信息(包括关联表字段) + * 返回对象 {实体,是否关联字段,关联字段的dataField} + * @param path 字段标识 + * @param viewModelId 视图模型标识 + */ + function getFieldByPathAndVMID(path: string, viewModelId: string): { + schemaField: FormSchemaEntityField, isRefElement: boolean, refElementLabelPath: string + } | undefined { + const entities = getSchemaEntities(); + if (!entities || entities.length === 0) { + return; + } + const vm = useFormSchema.getViewModelById(viewModelId); + const fields = getTableFieldsByBindTo(entities, vm?.bindTo || ''); + if (!fields) { + return; + } + return getFieldInfoByPath(fields, '', path); + } + + function getTableLabelByVMID(viewModelId: string) { + const entities = getSchemaEntities(); + if (!entities || entities.length === 0) { + return; + } + const vm = useFormSchema.getViewModelById(viewModelId); + return _getTableLabelByUri(entities, vm?.bindTo || ''); + } + + + /** + * 定位分级码字段(返回第一个类型为HierarchyType的字段) + * @param viewModelId 视图模型标识 + */ + function getTreeGridUdtField(viewModelId: string) { + const entities = getSchemaEntities(); + if (!entities || entities.length === 0) { + return; + } + const vm = useFormSchema.getViewModelById(viewModelId); + const fields = getTableFieldsByBindTo(entities, vm?.bindTo || ''); + if (!fields) { + return ''; + } + for (const element of fields) { + if (element.type && element.type.$type === 'HierarchyType') { + return element.label; + } + } + return ''; + } + + /** + * 获取分级码字段(返回所有类型为HierarchyType的字段) + * @param viewModelId VMID + */ + function getTreeGridUdtFields(viewModelId: string): any[] { + const entities = getSchemaEntities(); + if (!entities || entities.length === 0) { + return []; + } + const viewModelDetail = useFormSchema.getViewModelById(viewModelId); + const fields = getTableFieldsByBindTo(entities, viewModelDetail?.bindTo || ''); + const udtFields = [] as any; + if (!fields) { + return []; + } + for (const element of fields) { + if (element.type && element.type.$type === 'HierarchyType') { + udtFields.push({ key: element.label, value: element.name, field: element }); + } + } + return udtFields; + } + + /** + * schema字段集合组装成树 + * @param fields schema字段集合 + */ + function assembleFields2Tree(fields: FormSchemaEntityField[], expandRelateNode = true, displayedFieldsMap: Map | null = null, label = '') { + const treeData = [] as any; + fields.forEach(element => { + // 零代码:不展示id等属性 + // if (formBasicService && formBasicService.envType === DesignerEnvType.noCode && + // ['id', "version", "processInstance", "parentID"].includes(element.bindingField)) { + // return; + // } + // 补充bindingPath属性 + if (!element.bindingPath) { + element.bindingPath = (label ? label + '.' : '') + element.label; + } + + // 处理字段类型的国际化 + // element.type.displayName = EntityFieldTypeDisplayNamei18n[element.type.name] || element.type.displayName; + + // 关联表字段 / UDT字段 + let children = []; + if (element.type && element.type.fields && element.type.fields.length > 0) { + children = assembleFields2Tree(element.type.fields, true, displayedFieldsMap, element.bindingPath); + } + + treeData.push({ + data: element, + children, + expanded: expandRelateNode, + selectable: children.length > 0 ? false : true, + isUsed: displayedFieldsMap && displayedFieldsMap.has(element.id), + tips: element.name + '[' + element.id + ']' + }); + + }); + return treeData; + } + + /** + * 国际化:schema字段类型 + * @param fields 实体下的字段集合 + */ + function localizeFormSchema(schemaEntity: FormSchemaEntity) { + + const localizeSchemaFields = (fields: FormSchemaEntityField[]) => { + fields.forEach(element => { + + // 字段类型名称 + // eslint-disable-next-line no-self-assign + element.type.displayName = element.type.displayName; + + // 枚举类型名称 + if (element.type.name === FormSchemaEntityFieldTypeName.Enum && element.type.valueType && element.type.valueType.displayName) { + // eslint-disable-next-line no-self-assign + element.type.valueType.displayName = element.type.valueType.displayName; + } + // 关联表字段 / UDT字段 + if (element.type && element.type.fields && element.type.fields.length > 0) { + localizeSchemaFields(element.type.fields); + } + }); + }; + + if (schemaEntity.type && schemaEntity.type.fields && schemaEntity.type.fields.length > 0) { + localizeSchemaFields(schemaEntity.type.fields); + } + + // 子表 + if (schemaEntity.type.entities && schemaEntity.type.entities.length > 0) { + for (const childEntity of schemaEntity.type.entities) { + localizeFormSchema(childEntity); + } + + } + } + + /** + * VO 转化为表单schema + * @param viewObjectId 视图对象标识 + */ + function convertViewObjectToEntitySchema(viewObjectId: string, sessionId: string) { + // 1、schema.id 查询VO实体 + return metadataService.GetRefMetadata('', viewObjectId).then(result => { + if (result && result.data && result.data.content) { + const viewObjectMetadataContent = JSON.parse(result.data.content); + // 2、将VO实体转为schema + const schemaUrl = '/api/dev/main/v1.0/designschema/create'; + return axios.post(schemaUrl, viewObjectMetadataContent) + .then((response: any) => { + const schema = response.data as FormSchema; + // 字段类型国际化 + const mainSchemaEntity = schema.entities[0]; + localizeFormSchema(mainSchemaEntity); + return schema; + }); + } + }); + } + + /** + * 获取指定VM下的所有字段 + * @param viewModelId 视图模型标识 + */ + function getFieldsByViewModelId(viewModelId: string): FormSchemaEntityField[] { + const vm = useFormSchema.getViewModelById(viewModelId); + if (!vm) { + return []; + } + const entities = getSchemaEntities(); + if (!entities || entities.length === 0) { + return []; + } + return getTableFieldsByBindTo(entities, vm.bindTo); + } + + + /** + * 根据实体获取VM id,之前用于实体树的拖拽 + * @param entity 实体 + */ + function getViewModelIdByEntity(entity: FormSchemaEntity): string { + if (!entity) { + return ''; + } + const viewModels = useFormSchema.getViewModels(); + const entities = getSchemaEntities(); + const mappingViewModel = viewModels.find(viewModel => { + if (viewModel.id === 'root-viewmodel') { + return false; // root viewmodel 不对应任何SchemaEntity + } + const info = _getTableBasicInfoByUri(entities, viewModel.bindTo); + return info.id === entity.id; + }); + // 找到对应的viewmodel返回id,找不到返回undefined。 + return mappingViewModel && mappingViewModel.id || ''; + } + + /** + * 根据指定的字段key值,获取字段信息。例如获取key=bindingPath,值为xxx的字段 + * @param targetFieldKey 字段key + * @param targetFieldValue 字段key值 + */ + function getSchemaField(targetFieldKey: string, targetFieldValue: string): FormSchemaEntityField | null { + const entities = getSchemaEntities(); + let retField: FormSchemaEntityField | null = null; + const getTargetFiled = (predicate: (element: FormSchemaEntityField) => boolean, fieldsArray: FormSchemaEntityField[]) => { + fieldsArray.find((element: FormSchemaEntityField) => { + const predicateResult = predicate(element); + if (predicateResult) { + retField = element; + return true; + } else { + if (element.type.fields) { + getTargetFiled(predicate, element.type.fields); + } + } + return false; + }); + }; + entities.forEach((entitiesItem: FormSchemaEntity) => { + getTargetFiled((field: FormSchemaEntityField) => field[targetFieldKey] === targetFieldValue, entitiesItem.type.fields); + }); + + return retField; + } + + /** + * 字段名称映射更改 + */ + function fieldsDisplayNameUpdate(entity: FormSchemaEntityField[]) { + entity.forEach((item) => { + if (item.$type === FormSchemaEntityField$Type.SimpleField) { + switch (item.type.$type) { + case FormSchemaEntityFieldType$Type.NumericType: + if (item.type.precision === 0) { + item.type.displayName = '整数'; + } + if (item?.type?.precision && item?.type?.precision > 0) { + item.type.displayName = '浮点数字'; + } + break; + case FormSchemaEntityFieldType$Type.StringType: + item.type.displayName = '文本'; + break; + case FormSchemaEntityFieldType$Type.TextType: + item.type.displayName = '备注'; + break; + + default: + break; + } + + } + }); + } + + /** + * 删除schema实体 + * @param entityId 实体id + */ + function deleteSchemaEntityById(entityId: string) { + + const schemaEntities = getSchemaEntities(); + if (!schemaEntities || schemaEntities.length < 1 || !schemaEntities[0]) { + return; + } + const mainEntity = schemaEntities[0]; + const queue = [mainEntity]; + while (queue.length) { + const current = queue.shift(); + + if (current?.type.entities && current.type.entities.length) { + if (current.type.entities.some(entity => entity.id === entityId)) { + current.type.entities = current.type.entities.filter(entity => entity.id !== entityId); + return; + } + queue.push(...current.type.entities); + } + + } + + } + + /** + * 根据字段id获取所属schema实体和字段 + * @param fieldId 字段id + */ + function getFieldBelongedEntity(fieldId: string): { + entity: FormSchemaEntity, schemaField: FormSchemaEntityField, isRefElement: boolean + } | null { + const schemaEntities = getSchemaEntities(); + if (!schemaEntities || schemaEntities.length < 1 || !schemaEntities[0]) { + return null; + } + const mainEntity = schemaEntities[0]; + let queue = [mainEntity]; + while (queue.length) { + const current = queue.shift(); + if (current?.type.fields && current?.type.fields.length) { + + const fieldInfo = getFieldInfoByID(current.type.fields, '', fieldId); + if (fieldInfo) { + return { + entity: current, + schemaField: fieldInfo.schemaField, + isRefElement: fieldInfo.isRefElement + }; + } + } + if (current?.type.entities && current.type.entities.length) { + queue = queue.concat(current.type.entities); + } + } + return null; + } + + return { convertViewObjectToEntitySchema, getFieldByIDAndVMID, getFieldsByViewModelId, getTableInfoByViewModelId }; + +} diff --git a/packages/mobile-designer/src/components/composition/ui-provider/ui-provider.ts b/packages/mobile-designer/src/components/composition/ui-provider/ui-provider.ts new file mode 100644 index 0000000000000000000000000000000000000000..d6d41299ae447aeff0377608fe820f15b2c1f18a --- /dev/null +++ b/packages/mobile-designer/src/components/composition/ui-provider/ui-provider.ts @@ -0,0 +1,17 @@ +import { FEntityBindingSelector } from '@farris/ui-vue/components'; +import { FBindingSelectorContainer } from "@farris/ui-vue/components"; + +export function uiProviderService() { + const uiProvider = { + 'FEntityBindingSelector':FEntityBindingSelector, + 'FBindingSelectorContainer':FBindingSelectorContainer + } + + function getUiComponent(key:string) { + return uiProvider[key]; + } + + return { + getUiComponent + } +} \ No newline at end of file diff --git a/packages/mobile-designer/src/components/composition/use-event-parameter-data.ts b/packages/mobile-designer/src/components/composition/use-event-parameter-data.ts new file mode 100644 index 0000000000000000000000000000000000000000..0f711c1609bf1229f2f1a25ebfacda208e3e584c --- /dev/null +++ b/packages/mobile-designer/src/components/composition/use-event-parameter-data.ts @@ -0,0 +1,174 @@ +import { inject } from "vue"; +import { ComponentType, UseFormSchema, UseFormStateMachine } from "../types"; + +export function useEventParameterData( + useFormSchemaComposition: UseFormSchema, + useFormStateMachineComposition: UseFormStateMachine) { + /** + * 获取重组的actions + * @param actions + * @returns + */ + function getActionsChanged(actions: any) { + const result: any = []; + if (actions && Object.keys(actions).length > 0) { + Object.keys(actions).forEach((actionName: string) => { + const item = actions[actionName]; + result.push({ id: actionName, label: item.name }); + }); + } + return result; + } + + function getComponentRefNode(componentId: string) { + const components = useFormSchemaComposition.getComponents(); + const rootCmp = components.find(component => component.componentType === 'frame'); + let componentRefResult = useFormSchemaComposition.selectNodeAndParentNode(rootCmp, (item) => item.component === componentId, rootCmp); + + if (componentRefResult) { + return componentRefResult; + } + + const modalFrames = components.filter(c => c.componentType === ComponentType.modalFrame); + modalFrames && modalFrames.length && modalFrames.forEach((modalFrame: any) => { + componentRefResult = useFormSchemaComposition.selectNodeAndParentNode(modalFrame, (item) => item.component === componentId, modalFrame); + if (componentRefResult) { + return componentRefResult; + } + }); + } + function getDataGridComponentName(component: any) { + const treeGrid = useFormSchemaComposition.selectNode(component, (item: any) => item.type === 'tree-grid'); + if (treeGrid) { + return '树表格组件'; + } + + const componentRefResult = getComponentRefNode(component.id); + if (!componentRefResult || !componentRefResult.parentNode) { + return; + } + const componentRefParentContainer = componentRefResult.parentNode; + + // 列表组件取父层容器的标题:容器可能为标签页或者section + if (componentRefParentContainer.type === 'tab-page') { + return componentRefParentContainer.title + '组件'; + } + if (componentRefParentContainer.type === 'section' && componentRefParentContainer.mainTitle) { + return componentRefParentContainer.mainTitle + '组件'; + } + + return '表格组件'; + } + function getViewModelName(viewModelId: string, componentName: string) { + const component = useFormSchemaComposition.getComponentByViewModelId(viewModelId); + if (!component || component.fakeDel) { + return; + } + switch (component.componentType) { + case ComponentType.Frame: { + return '根组件'; + } + case ComponentType.dataGrid: { + return getDataGridComponentName(component); + } + case ComponentType.uploader: { + return '附件组件'; + } + case ComponentType.listView: { + return '列表视图组件'; + } + case ComponentType.appointmentCalendar: { + return '预约日历组件'; + } + case ComponentType.modalFrame: { + return '弹窗页面组件'; + } + default: { + // 卡片组件取内部section的标题 + if (component.componentType.startsWith('form')) { + const section = component.contents.find(content => content.type === 'section'); + if (section && section.mainTitle) { + return section.mainTitle + '组件'; + } + + } + } + } + + return componentName + '组件'; + } + // 构造actions data + function buildActions() { + const stateMachineMetadata = useFormStateMachineComposition.getStateMachineMetadata(); + if (!stateMachineMetadata) { + return []; + } + const actions = stateMachineMetadata.action || {}; + return getActionsChanged(actions); + } + + // 构造components data + function buildComponents() { + const componentsWithName: Array<{ id: string, name: string }> = []; + const components = useFormSchemaComposition.getComponents(); + components.filter(item => !item.fakeDel).forEach((component: any & { name: string }) => { + const viewModelId = component.viewModel; + let name: any = null; + const viewModel = useFormSchemaComposition.getViewModelById(viewModelId); + if (viewModel) { + name = getViewModelName(viewModelId, viewModel.name); + } + componentsWithName.push({ + id: component.id, + name: name || component.name + }); + }); + const commonComponents = componentsWithName && componentsWithName.map((item: { id: string, name: string }) => { + return { id: item.id, label: `${item.id} [${item.name}]` }; + }) || []; + const relativeComponents = componentsWithName && componentsWithName.map((item: { id: string, name: string }) => { + return { id: '#{' + item.id + '}', label: '#{' + `${item.id}` + `} [${item.name}]` }; + }) || []; + const result: any = relativeComponents.concat(commonComponents); + return result; + } + + function buildCommands() { + const viewModels = useFormSchemaComposition.getViewModels(); + const result: any = []; + viewModels.forEach((viewModel: any) => { + const { id = null, code = null, commands = [] } = viewModel; + if (id && code && commands && commands.length > 0 && !viewModel.fakeDel) { + const item = { + data: { id: code, label: code }, children: [] as any[], selectable: false, expanded: true + }; + if (commands && commands.length > 0) { + commands.forEach((command: any) => { + const { id = null, code = null, name = null } = command || {}; + if (id) { + item.children.push({ + data: { id: code, label: `${code} [${name}]` } + }); + } + }); + } + result.push(item); + } + }); + return result; + } + + function getEventParameterData(dataValue: string) { + let data = null; + if (dataValue === ':Actions') { + data = buildActions(); + } else if (dataValue === ':Components') { + data = buildComponents(); + } else if (dataValue === ':CommandsTree') { + data = buildCommands(); + } + return data; + } + + return { buildActions, buildCommands, buildComponents, getEventParameterData }; +} diff --git a/packages/mobile-designer/src/components/composition/use-events-editor.ts b/packages/mobile-designer/src/components/composition/use-events-editor.ts new file mode 100644 index 0000000000000000000000000000000000000000..7740e02d654e24c04371e555f860344a3a8e7c5a --- /dev/null +++ b/packages/mobile-designer/src/components/composition/use-events-editor.ts @@ -0,0 +1,401 @@ +import { cloneDeep } from "lodash-es"; +import { ControllerListItem, EventsEditorActions, EventsEditorMapItem, UseEventsEditor } from "../types/events-editor"; +import { inject } from "vue"; +import { UseFormSchema } from "../types"; +import { UseFormCommandService } from "../types/command"; + +export function useEventsEditor(commandService: UseFormCommandService, useFormSchema: UseFormSchema): UseEventsEditor { + + let savedViewModel = [] as any; + + /** + * 去重 + * @param itemWithSameValue + * @param comparedPart 需要去重的是控制器还是命令 + * @returns + */ + function getUniqueContent(itemWithSameValue: any, comparedPart: string) { + const value = cloneDeep(itemWithSameValue); + for (let i = 0; i < value.length; i++) { + for (let j = i + 1; j < value.length; j++) { + if (comparedPart === 'controller') { + if (value[i]['controllerName']['id'] === value[j]['controllerName']['id']) { + value.splice(j, 1); + j--; + } + } + else if (comparedPart === 'command') { + if (value[i]['label'] === value[j]['label']) { + value.splice(j, 1); + j--; + } + } + } + } + itemWithSameValue = cloneDeep(value); + return itemWithSameValue; + } + + + /** + * 根据cmpId获取控制器名称 + * @param controller + * @returns + */ + function getControllerName(controller: any) { + const savedViewModelItem = { + controllerName: { + label: '', + name: '', + id: '', + }, + controllerList: [] + }; + savedViewModelItem.controllerName = cloneDeep(controller); + savedViewModel.push(cloneDeep(savedViewModelItem)); + savedViewModel = getUniqueContent(savedViewModel, 'controller'); + return savedViewModel; + } + + /** + * 目标组件下所有可选的vm + * @param + * @returns + */ + function getAllComponentList() { + const components = useFormSchema.getComponents(); + const viewModels = useFormSchema.getViewModels(); + const componentListsItem = { + componentId: '', + viewModelId: '' + }; + const allComponentList = [] as any; + for (let i = 0; i < components.length; i++) { + // 筛选出root-component及form类型的component + componentListsItem.componentId = cloneDeep(components[i].id); + componentListsItem.viewModelId = cloneDeep(viewModels[i].id); + allComponentList.push(cloneDeep(componentListsItem)); + } + return allComponentList; + } + + /** 修正vmid为以-component为后缀的情况*/ + function verifyVmid(vmid, allComponentList) { + let verifiedVmid = vmid; + const splitString = vmid.split('-'); + if (splitString[splitString.length - 1] === 'component') { + const verifiedVm = allComponentList.find(componentListsItem => componentListsItem.componentId === vmid); + verifiedVmid = verifiedVm.viewModelId; + } + return verifiedVmid; + } + + /** + * 处理actions节点的目标组件值 + * @param boundEventItem 绑定事件 + * @param vmid viewModelId + * @returns + */ + function formTargetComponent(boundEventItem: any, vmid: string) { + const allComponentList = getAllComponentList(); + const targetComponent = { + id: boundEventItem.command?.targetComponent, + viewModelId: '', + }; + if (allComponentList.length && boundEventItem.command&&boundEventItem.command.targetComponent !== undefined) { + let viewModelId; + allComponentList.forEach(component => { + viewModelId = component.componentId === targetComponent.id ? component.viewModelId : viewModelId; + }); + targetComponent.viewModelId = viewModelId; + } + else if (allComponentList.length) { + vmid = verifyVmid(vmid, allComponentList); + // 若不存在目标组件,则自动存放至当前viewmodel + const componentList = allComponentList.find(componentListsItem => componentListsItem.viewModelId === vmid); + targetComponent.id = componentList === undefined ? undefined : componentList.componentId; + targetComponent.viewModelId = vmid as any; + } + return targetComponent; + } + + /** + * 获取actions节点和viewmodel节点的控制器,以便按照控制器分类所有命令 + * @param domJson + * @returns + */ + function getController(domJson: any) { + let savedViewModelFromActions = []; + let savedViewModelFromVM; + // 根据actions节点,获取控制器相关(savedViewModelFromActions) + domJson.module.actions.forEach(actionItem => { + actionItem.sourceComponent.map.forEach(mapItem => { + savedViewModelFromActions = cloneDeep(getControllerName(mapItem.controller)); + }); + }); + // 根据viewModel节点,匹配cmpId获取控制器(savedViewModelFromVM) + domJson.module.viewmodels.forEach(viewmodelItem => { + viewmodelItem.commands.forEach(commandItem => { + commandService.getCommands().forEach(webCmdItem => { + if (commandItem.cmpId === webCmdItem.Id) { + const controller = { + label: webCmdItem.Code, + name: webCmdItem.Name, + id: webCmdItem.Id, + }; + savedViewModelFromVM = cloneDeep(getControllerName(controller)); + } + }); + }); + }); + + // 合并savedViewModelFromActions及savedViewModelFromVM => savedViewModel + const savedViewModel = savedViewModelFromActions ? getUniqueContent(savedViewModelFromActions.concat(savedViewModelFromVM), 'controller') : getUniqueContent(savedViewModelFromVM, 'controller'); + return savedViewModel; + } + + /** + * 1. 获取已绑定命令的参数值(来自actions节点) + * 2. 获取暂未绑定的命令参数值(来自viewmodel节点) + * @param savedViewModelItem + * @param controllerListItem + * @param domJson + */ + function getCommandParameter(savedViewModelItem: any, controllerListItem: ControllerListItem) { + const { actions } = useFormSchema.getModule(); + actions.forEach(actionItem => { + actionItem.sourceComponent.map.forEach(mapItem => { + if (savedViewModelItem.controllerName.id === mapItem.controller.id) { + controllerListItem.label = mapItem.command.label; + controllerListItem.name = mapItem.command.name; + controllerListItem.id = mapItem.command.id; + controllerListItem.handlerName = mapItem.command.handlerName; + controllerListItem.property = cloneDeep(mapItem.command.params); + controllerListItem.cmpId = mapItem.controller.id; + controllerListItem.isNewGenerated = mapItem.controller.isNewGenerated || false; + controllerListItem.isInvalid = mapItem.command.isInvalid || false; + controllerListItem['isRTCmd'] = mapItem.command['isRTCmd']; + controllerListItem.targetComponent = mapItem.targetComponent['id'] ? mapItem.targetComponent['id'] : undefined; + savedViewModelItem.controllerList.push(cloneDeep(controllerListItem)); + } + }); + }); + + const viewmodels = useFormSchema.getViewModels(); + viewmodels.forEach(viewmodelItem => { + viewmodelItem.commands.forEach(commandsItem => { + if (savedViewModelItem.controllerName.id === commandsItem.cmpId) { + controllerListItem.label = commandsItem.code; + controllerListItem.name = commandsItem.name; + controllerListItem.id = commandsItem.id; + controllerListItem.handlerName = commandsItem.handlerName; + controllerListItem.property = cloneDeep(commandsItem.params); + controllerListItem.cmpId = commandsItem.id; + controllerListItem.isNewGenerated = commandsItem.isNewGenerated || false; + controllerListItem['isRTCmd'] = commandsItem.command['isRTCmd']; + controllerListItem.isInvalid = commandsItem.isInvalid || false; + controllerListItem.targetComponent = commandsItem['targetComponent'] ? commandsItem['targetComponent'] : undefined; + savedViewModelItem.controllerList.push(cloneDeep(controllerListItem)); + } + }); + }); + return savedViewModelItem; + } + + /** + * 获取已绑定命令的路径,并tag该命令 + * @param actionData action节点的数据 + * @param savedViewModelCopy viewModel节点的数据 + */ + function getPathAndTagBoundCommand(actionData: any, savedViewModelCopy: any) { + actionData.forEach(actionItem => { + const { id } = actionItem.sourceComponent; + // 获取已绑定命令的路径 + const path = useFormSchema.getControlBasicInfoMap().get(id) !== undefined ? useFormSchema.getControlBasicInfoMap().get(id)?.parentPathName : undefined; + actionItem['path'] = useFormSchema.getControlBasicInfoMap().get(id) !== undefined ? `${path} > ` : ''; + actionItem.sourceComponent.map.forEach(mapItem => { + savedViewModelCopy.forEach(savedViewModelItem => { + savedViewModelItem.controllerList.forEach(commandItem => { + // tag已绑定的命令 + if (commandItem.label === mapItem.command.label) { + commandItem['tag'] = 'notInternal'; + } + }); + }); + }); + }); + return actionData; + } + + /** + * 获取暂未绑定的命令 + * @param propertyDataId + * @param viewModelId + * @param savedViewModelCopy + * @returns + */ + function handlePathOfUnboundCommand(propertyDataId: string, viewModelId: string, savedViewModelCopy: any) { + const viewModelData: EventsEditorActions = { + sourceComponent: { + id: propertyDataId, + viewModelId: viewModelId, + map: [] + }, + path: '暂未绑定 ' + }; + savedViewModelCopy.forEach(savedViewModelCopyItem => { + const { controllerName } = savedViewModelCopyItem; + savedViewModelCopyItem.controllerList.forEach(commandItem => { + if (!commandItem['tag']) { + const mapItem: EventsEditorMapItem = { + event: { + label: undefined, + name: undefined, + }, + targetComponent: cloneDeep(formTargetComponent(savedViewModelCopyItem, commandItem.targetComponent)), + command: { + id: commandItem.id, + label: commandItem.label, + name: commandItem.name, + handlerName: commandItem.handlerName, + params: cloneDeep(commandItem.property), + isNewGenerated: commandItem.isNewGenerated || false, + isRTCmd: commandItem['isRTCmd'], + isInvalid: commandItem.isInvalid || false, + }, + controller: { + id: controllerName.id, + label: controllerName.label, + name: controllerName.name, + } + }; + viewModelData.sourceComponent.map.push(cloneDeep(mapItem)); + } + }); + }); + return viewModelData; + } + + /** + * 剔除非组件内的其他命令:root显示全部,其他子组件选自身的vm + * + * @param viewModelId + * @param actionWithPath actions节点及对应的路径 + * @param action + * @returns + */ + function selectedCommandRules(viewModelId: string, actionWithPath: any, action: any) { + if (viewModelId !== "root-viewmodel") { + actionWithPath.forEach(actionWithPathItem => { + const mapArray = [] as any; + let mapExist = false; + actionWithPathItem.sourceComponent.map.forEach(mapItem => { + if (mapItem.targetComponent.viewModelId === viewModelId) { + mapArray.push(cloneDeep(mapItem)); + mapExist = true; + } + }); + if (mapExist) { + const actionsItem = { + path: actionWithPathItem.path, + sourceComponent: { + id: actionWithPathItem.sourceComponent.id, + map: cloneDeep(mapArray), + viewModelId: actionWithPathItem.sourceComponent.viewModelId, + } + }; + action.push(cloneDeep(actionsItem)); + } + }); + } + else { + action = cloneDeep(actionWithPath); + } + return action; + } + + /** + * 事件编辑器-已有方法-命令路径处理 + * @param propertyDataId 组件id + * @param viewModelId 视图模型id + * @returns + */ + function getEventPath(propertyDataId: string, viewModelId: string) { + const domJson = useFormSchema.getFormSchema(); + const actionData = cloneDeep(domJson.module.actions); + + const controllerListItem: ControllerListItem = { + label: '', + name: '', + id: '', + handlerName: '', + showTargetComponent: false, + cmpId: '', + componentLists: [], + targetComponent: undefined, + isNewGenerated: undefined, + isRTCmd: undefined, + isInvalid: false, + property: [] + }; + + // 1. 获取已绑定命令的参数值(来自actions节点) + // 2. 获取暂未绑定的命令参数值(来自viewmodel节点) + const savedViewModel = getController(domJson); + savedViewModel.forEach(savedViewModelItem => { + const { actions } = domJson.module; + actions.forEach(actionItem => { + actionItem.sourceComponent.map.forEach(mapItem => { + if (savedViewModelItem.controllerName.id === mapItem.controller.id) { + controllerListItem.label = mapItem.command.label; + controllerListItem.name = mapItem.command.name; + controllerListItem.id = mapItem.command.id; + controllerListItem.handlerName = mapItem.command.handlerName; + controllerListItem.property = cloneDeep(mapItem.command.params); + controllerListItem.cmpId = mapItem.controller.id; + controllerListItem.isNewGenerated = mapItem.controller.isNewGenerated || false; + controllerListItem.isRTCmd = mapItem.command['isRTCmd']; + controllerListItem.isInvalid = mapItem.command.isInvalid || false; + controllerListItem.targetComponent = mapItem.targetComponent['id'] ? mapItem.targetComponent['id'] : undefined; + savedViewModelItem.controllerList.push(cloneDeep(controllerListItem)); + } + }); + }); + + const { viewmodels } = domJson.module; + viewmodels.forEach(viewmodelItem => { + viewmodelItem.commands.forEach(commandsItem => { + const targetComponent = viewmodelItem.code; + if (savedViewModelItem.controllerName.id === commandsItem.cmpId) { + controllerListItem.label = commandsItem.code; + controllerListItem.name = commandsItem.name; + controllerListItem.id = commandsItem.id; + controllerListItem.handlerName = commandsItem.handlerName; + controllerListItem.property = cloneDeep(commandsItem.params); + controllerListItem.cmpId = commandsItem.id; + controllerListItem.isNewGenerated = commandsItem.isNewGenerated || false; + controllerListItem.isRTCmd = commandsItem.isRTCmd; + controllerListItem.isInvalid = commandsItem.isInvalid || false; + controllerListItem.targetComponent = commandsItem['targetComponent'] || targetComponent ? commandsItem['targetComponent'] || targetComponent : undefined; + savedViewModelItem.controllerList.push(cloneDeep(controllerListItem)); + } + }); + }); + savedViewModelItem.controllerList = cloneDeep(getUniqueContent(savedViewModelItem.controllerList, 'command')); + }); + + const savedViewModelCopy = cloneDeep(savedViewModel); + const actionsData = cloneDeep(getPathAndTagBoundCommand(actionData, savedViewModelCopy)); + const viewModelsData = cloneDeep(handlePathOfUnboundCommand(propertyDataId, viewModelId, savedViewModelCopy)); + const actionWithPath = actionsData.concat(viewModelsData); + + let action = []; + action = cloneDeep(selectedCommandRules(viewModelId, actionWithPath, action)); + + return { + actionWithPath: action, + viewModelDisplay: savedViewModel + }; + } + return { getCommandParameter, getEventPath, getAllComponentList, formTargetComponent }; +} diff --git a/packages/mobile-designer/src/components/composition/use-form-schema.ts b/packages/mobile-designer/src/components/composition/use-form-schema.ts new file mode 100644 index 0000000000000000000000000000000000000000..b3dfd43dde8ca2c7100b922f7a58c6024e4bde34 --- /dev/null +++ b/packages/mobile-designer/src/components/composition/use-form-schema.ts @@ -0,0 +1,1307 @@ +import { cloneDeep, mergeWith } from "lodash-es"; +import { FormBindingType, FormComponent, FormMetaDataModule, FormMetadaDataDom, FormSchema, FormSchemaEntity, FormSchemaEntityField, FormVariable, FormVariableCategory, FormVariableTypes, FormViewModel, FormViewModelField, FormWebCmd, MetadataDto, UseFormSchema, FormExpression } from "../types"; +import { NodeType, Node } from "../types/events-editor"; +import { inject } from "vue"; +import { LookupSchemaRepositoryToken } from "@farris/ui-vue/components"; +import { LookupSchemaService } from "./schema-repository/lookup/lookup-schema.service"; + +export function useFormSchema(): UseFormSchema { + const lookupSchemaService = inject(LookupSchemaRepositoryToken); + + const ROOT_VIEW_MODEL_ID = 'root-viewmodel'; + /** 表单元数据外层信息 */ + let formMetaBasicInfo: MetadataDto; + /** 打开表单设计器时的DOM元数据结构,与be数据保持一致 */ + let previousFormSchema: FormMetadaDataDom; + /** 表单元数据 */ + let formSchema: FormMetadaDataDom; + /** 映射JSON结构映射:<控件id, 控件JSON> */ + const componentDomMap = new Map(); + const nodeTypeCollect: Map = new Map(); + /** 控件id与控件展示名称、控件路径的映射 <控件id, {showName:控件展示名称,parentPathName:控件路径} */ + const controlBasicInfoMap = new Map(); + /** 当前表单模板的拖拽控制规则 */ + let formTemplateRules: any; + + function getControlBasicInfoMap(): Map { + return controlBasicInfoMap; + } + + /** 获取表单元数据外层信息 */ + function getFormMetadataBasicInfo(): MetadataDto { + return formMetaBasicInfo; + } + function setFormMetadataBasicInfo(metadata: MetadataDto) { + formMetaBasicInfo = metadata; + } + + /** 获取表单元数据 */ + function getFormSchema(): FormMetadaDataDom { + return formSchema; + } + /** + * 设置DOM JSON 数据 + * @param newFormSchema DOM JSON结构 + * @param schemaChangedCallback DOM结构变化后的回调事件 + */ + function setFormSchema(newFormSchema: FormMetadaDataDom, schemaChangedCallback?: (path: string, newValue: any, previousValue: any) => void) { + if (!newFormSchema || !newFormSchema.module) { + return; + } + // 涉及 @farris/on-change的引入 ------------------ToDo后期调整 + // if (schemaChangedCallback) { + // // 设置代理,监听属性变化 + // formSchema = onChange(newFormSchema, (path, value, previousValue, applyData) => { + // // JSON变更后的回调 + // schemaChangedCallback(path, value, previousValue); + // }); + // } else { + // formSchema = newFormSchema; + // } + formSchema = newFormSchema; + } + /** + * 深层查找控件 + */ + function getComponetsByPredicate(predicate: (component) => boolean) { + const targetComponets = [] as any; + const predicateFun = predicate; + const findTarget = (contentComponents) => { + contentComponents.forEach(function (component) { + if (predicateFun(component)) { + targetComponets.push(component); + } + if (component.contents && component.contents.length) { + findTarget(component.contents); + } + }); + }; + + findTarget(formSchema.module.components); + return targetComponets; + } + + /** + * 根据组件ID获取components下相应的组件节点 + * @param targetComponentId 组件标识 + */ + function getComponentById(targetComponentId: string, deep: boolean = false): FormComponent | undefined { + if (!formSchema.module || !formSchema.module.components || formSchema.module.components.length === 0) { + return; + } + if (deep) { + const targetComponet = getComponetsByPredicate((item) => item.id === targetComponentId); + return targetComponet ? targetComponet[0] : undefined; + } else { + return formSchema.module.components.find(component => component.id === targetComponentId); + } + } + /** + * 根据VM ID获取相应组件 + * @param viewModelId VMID + */ + function getComponentByViewModelId(targetViewModelId: string): FormComponent | undefined { + if (!formSchema.module || !formSchema.module.components || formSchema.module.components.length === 0) { + return; + } + + return formSchema.module.components.find(component => component.viewModel === targetViewModelId); + } + /** + * 根据ComponentId查找对应得ViewModel的Id,用来处理组件属性时 + * @param targetComponentId + * @returns + */ + function getViewModelIdByComponentId(targetComponentId: string): string { + if (!formSchema.module || !formSchema.module.components || formSchema.module.components.length === 0) { + return ''; + } + + const targetComponent = formSchema.module.components.find(component => component.id === targetComponentId); + return targetComponent?.viewModel || ''; + } + /** + * 根据viewModelId获取模型节点 + * @param viewModelId 视图模型标识 + */ + function getViewModelById(targetViewModelId: string): FormViewModel | undefined { + if (!formSchema.module || !formSchema.module.viewmodels || formSchema.module.viewmodels.length === 0) { + return; + } + + return formSchema.module.viewmodels.find(viewModel => viewModel.id === targetViewModelId); + } + + /** + * 根据指定的条件遍历查找节点 + * @param rootNode 容器节点 + * @param predict 条件 + */ + function selectNode(rootNode: any, predict: (item: any) => boolean): any { + if (!rootNode) { + return null; + } + if (predict(rootNode)) { + return rootNode; + } + if (rootNode.contents) { + for (const item of rootNode.contents) { + const found = selectNode(item, predict); + if (found) { + return found; + } + } + } + return null; + } + /** + * 根据指定的条件遍历查找节点,返回节点及其父节点 + * @param rootNode 容器节点 + * @param predict 预设的判断逻辑 + * @param parentNode 父节点 + */ + function selectNodeAndParentNode( + rootNode: any, + predict: (item: any) => boolean, parentNode: any + ): { node: any; parentNode: any } | undefined { + if (!rootNode) { + return; + } + if (predict(rootNode)) { + return { + node: rootNode, + parentNode + }; + } + if (rootNode.contents) { + for (const item of rootNode.contents) { + const found = selectNodeAndParentNode(item, predict, rootNode); + if (found) { + return found; + } + } + } + } + function getViewModels() { + return formSchema?.module?.viewmodels || []; + } + function setViewmodels(value) { + formSchema.module.viewmodels = value; + } + function getComponents(): FormComponent[] { + return formSchema?.module?.components || []; + } + + function getModule(): FormMetaDataModule { + return formSchema.module; + } + + /* + * 获取表单引用的命令构件信息 + */ + function getCommands(): FormWebCmd[] { + return formSchema?.module?.webcmds || []; + } + function setCommands(value: Array) { + formSchema.module.webcmds = value || []; + } + + function getExpressions(): FormExpression[] { + return formSchema?.module.expressions || []; + } + + function setExpressions(value) { + formSchema.module.expressions = value; + } + + function getTemplateId() { + return formSchema.module.templateId || ''; + } + + /** + * 设置打开表单设计器时的DOM元数据结构,与be数据保持一致 + */ + function setPreviousFormSchema(formSchema) { + if (!formSchema || !formSchema.module) { + return; + } + previousFormSchema = formSchema; + } + /** + * 获取表单设计器时的DOM元数据结构,与be数据保持一致 + */ + function getpreviousFormSchema() { + return previousFormSchema; + } + + /** + * 更新控件JSON结构映射 updateDomDgMap + * @param componentInstanceList 控件实例列表 + */ + function updateComponentDomMap(componentInstanceList: any[]) { + componentDomMap.clear(); + for (const cmp of componentInstanceList) { + componentDomMap.set(cmp.id, cmp.component); + + // 记录组件内部的部分JSON结构 + if (cmp.updateDomDgMap) { + cmp.updateDomDgMap(); + } + } + } + /** + * 获取schemas节点下的uri (目前仅支持单一数据源) + */ + function getSchemas(): FormSchema | undefined { + const { entity } = formSchema.module; + if (!entity || entity.length === 0) { + return; + } + return entity[0]; + + } + + function setSchemas(schemaObject) { + if (!schemaObject) { + return; + } + formSchema.module.entity = [schemaObject]; + } + + function setSchemaEntity(schemEntities: FormSchemaEntity[]) { + const schema = getSchemas(); + if (schema) { + schema.entities = schemEntities; + } + + } + + function getQDPInfo() { + const { qdpInfo } = formSchema.module; + if (qdpInfo && qdpInfo.qoMetadata && qdpInfo.qoMetadata.length) { + return qdpInfo; + } else { + return null; + } + } + + function getUpdateVersion() { + return formSchema.module.updateVersion; + } + + function getExtraImports(): Array<{ name: string, path: string }> | null { + return formSchema ? formSchema.module.extraImports : null; + } + + function setExtraImports(value: Array<{ name: string, path: string }>) { + formSchema.module.extraImports = value; + } + + function getViewModelByFieldId(fieldId: string): FormViewModel { + let viewModel; + for (const vm of formSchema.module.viewmodels) { + const field = vm.fields.find(f => f.id === fieldId); + if (field) { + viewModel = vm; + break; + } + } + return viewModel; + } + /** + * 校验指定VM下是否重复绑定字段或变量 + * @param viewModelId 视图模型标识 + * @param newFieldId 字段标识 + */ + function checkViewModelDulplicated(viewModelId, newFieldId) { + if (!viewModelId || !newFieldId) { + return; + } + const viewModel = getViewModelById(viewModelId); + + // 判断重复绑定 + const exsitVM = viewModel?.fields.find(fieldItem => fieldItem.id === newFieldId); + if (exsitVM) { + return true; + } + return false; + } + + /** + * 控件新增绑定添加ViewModel Field + */ + function addViewModelField(viewModelId, filedObject: FormViewModelField) { + if (!viewModelId || !filedObject) { + return; + } + const viewModel = getViewModelById(viewModelId); + + if (!viewModel?.fields.find(fieldItem => fieldItem.id === filedObject.id)) { + viewModel?.fields.push(filedObject); + } + + } + + /** + * 修改ViewModel Field + * @param viewModelId VM ID + * @param fieldId 修改前binding.field取值 + * @param changeObject 变更集 + */ + function modifyViewModelFieldById(viewModelId, fieldId, changeObject, isMerge = true) { + if (!viewModelId || !changeObject) { + return; + } + const viewModel = getViewModelById(viewModelId); + let field; + if (fieldId) { + field = viewModel?.fields.find(fieldItem => fieldItem.id === fieldId); + } + function customizer(objValue, srcValue) { + if (!isMerge) { + return srcValue; + } else if (Array.isArray(objValue)) { + return srcValue; + } + } + if (field) { + // 数组类型不再合并,全量替换:用户枚举数据的更改 + mergeWith(field, changeObject, customizer); + } else { + changeObject.groupId = null; + changeObject.groupName = null; + addViewModelField(viewModelId, changeObject); + } + } + + /** + * 根据VMID修改ViewModel节点 + * @param vmId 视图模型标识 + * @param vmFields 字段集合 + */ + function setViewModelFieldsById(viewModelId, viewModelFields) { + if (!formSchema.module.viewmodels || formSchema.module.viewmodels.length === 0 || !viewModelId) { + return; + } + const oldVM = formSchema.module.viewmodels.find(viewModelItem => viewModelItem.id === viewModelId); + if (oldVM) { + oldVM.fields = viewModelFields; + } + } + + /** + * 修改VM字段的分组名称 + * @param viewModelId 视图模型标识 + * @param groupId 分组标识 + * @param groupName 分组名称 + */ + function modifyGroupNameById(viewModelId, groupId, groupName) { + const vm = getViewModelById(viewModelId); + vm?.fields.forEach(field => { + if (field.groupId !== groupId) { return; } + field.groupName = groupName; + }); + } + + /** + * 根据ID删除ViewModel中的field节点 + * @param viewModelId 视图模型标识 + * @param fieldId 字段标识 + */ + function deleteViewModelFieldById(viewModelId: string, fieldId: string) { + if (!viewModelId || !fieldId) { + return; + } + const viewModel = getViewModelById(viewModelId); + if (!viewModel) { + return; + } + viewModel.fields = viewModel.fields.filter(fieldItem => fieldItem.id !== fieldId); + } + + /** + * 清除视图模型中针对字段的修改 + * @param viewModelId 视图模型标识 + * @param fieldId 字段标识 + */ + function clearViewModelFieldSchema(viewModelId, fieldId) { + if (!viewModelId) { + return; + } + const viewModel = getViewModelById(viewModelId); + let field; + if (fieldId) { + field = viewModel?.fields.find(fieldItem => fieldItem.id === fieldId); + } + if (field) { + field.fieldSchema = {}; + } + } + /** + * 根据ID删除整个ViewModel + * @param viewModelId 视图模型标识 + */ + function deleteViewModelById(viewModelId) { + const index = formSchema.module.viewmodels.findIndex(viewModelItem => viewModelItem.id === viewModelId); + if (index < 0) { + return; + } + + // 删除webcmds中命令的引用信息 + const viewModel = formSchema.module.viewmodels[index]; + if (viewModel.commands && viewModel.commands.length && getCommands() && getCommands().length) { + viewModel.commands.forEach(command => { + const webComand = getCommands().find(commandItem => commandItem.id === command.cmpId); + if (webComand && webComand.refedHandlers && webComand.refedHandlers.length) { + webComand.refedHandlers = webComand.refedHandlers.filter(handler => handler.host !== command.id); + } + }); + } + + formSchema.module.viewmodels.splice(index, 1); + } + + /** + * 删除dom中components下的组件节点 + * @param componentId 组件ID + */ + function deleteComponent(componentId: string) { + if (!formSchema || !formSchema.module || !componentId || !formSchema.module.components) { + return []; + } + formSchema.module.components = formSchema.module.components.filter(componentItem => componentItem.id !== componentId); + } + + /** + * 获取表单ViewModel中的命令,构建treetable数据,用于事件的选择窗口 + * 树表中额外增加commandPath属性(命令所在viewModelId.commandCode),用于窗口展开时数据行的回显。 + */ + function getCommandsTreeTable(viewModelId: string, showEmptyViewModelNode = false) { + if (!formSchema.module.viewmodels || formSchema.module.viewmodels.length === 0) { + return; + } + const commandTree = [] as any; + const viewModeli18n = '视图模型'; + // 获取根ViewModel和其他所有ViewModel的命令 + if (!viewModelId || viewModelId === ROOT_VIEW_MODEL_ID) { + + for (let index = 0; index < formSchema.module.viewmodels.length; index++) { + const viewModel = formSchema.module.viewmodels[index]; + if (viewModel.fakeDel) { + continue; + } + const children = [] as any; + viewModel.commands.forEach(command => { + children.push({ data: { ...command, commandPath: viewModel.id + '.' + command.code }, children: [], selectable: true }); + }); + + if (showEmptyViewModelNode || children.length) { + commandTree.push({ + data: { id: viewModel.id, code: viewModel.code, name: viewModel.name + viewModeli18n, commandPath: viewModel.id }, + children, + selectable: false, expanded: true + }); + } + + } + let rootViewModel; + if (commandTree.length > 1) { + // 根节点 + rootViewModel = commandTree[0]; + const childVmList = commandTree.slice(1, commandTree.length); + rootViewModel.children.push(...childVmList); + return [rootViewModel]; + } + return commandTree; + } + + // 获取指定viewModel的命令 + const selectedViewModel = formSchema.module.viewmodels.find(vm => vm.id === viewModelId); + selectedViewModel?.commands.forEach(command => { + commandTree.push({ + data: { ...command, commandPath: selectedViewModel.id + '.' + command.code }, + children: [], selectable: true + }); + }); + if (commandTree.length) { + return [{ + data: { + id: selectedViewModel?.id, code: selectedViewModel?.code, name: selectedViewModel?.code + viewModeli18n, + commandPath: selectedViewModel?.id + }, + children: commandTree, + selectable: false, + expanded: true + }]; + } + return []; + + + } + + /** + * 获取所有的命令,平铺成数组 + */ + function getAllPlainCommands(): any[] { + if (!formSchema.module.viewmodels || formSchema.module.viewmodels.length === 0) { + return []; + } + const commands = [] as any; + // 获取根ViewModel和其他所有ViewModel的命令 + formSchema.module.viewmodels.forEach(viewModel => { + viewModel.commands.forEach(command => { + commands.push({ ...command, commandPath: viewModel.id + '.' + command.code }); + }); + }); + return commands; + } + + /** + * 获取ViewModel中组件上下文变量,构建treetable数据,用于变量绑定的选择窗口 + */ + function getLocaleVariablesByViewModelId(viewModelId: string) { + if (!formSchema.module.viewmodels || formSchema.module.viewmodels.length === 0) { + return []; + } + const viewModel = getViewModelById(viewModelId); + if (!viewModel || !viewModel.states || viewModel.states.length === 0) { + return []; + } + + const children = [] as any; + viewModel.states.forEach(variable => { + if (!variable.category || variable.category === FormVariableCategory.locale) { + // 增加类型名称,用于界面展示 + let displayTypeName = variable.type; + const vt = FormVariableTypes.find(v => v.value === variable.type); + if (vt) { + displayTypeName = vt.text; + } + + children.push({ data: { ...variable, displayTypeName, viewModelId }, children: [] }); + } + }); + + if (!children.length) { + return []; + } + const rootVm = { + data: { + id: viewModel.id, + name: viewModel.name + '组件' + }, + children, + selectable: false, + expanded: true, + nodeType: 'vmNode' + }; + + return [rootVm]; + } + + function getRootViewModelId(): string { + if (formSchema.module.viewmodels == null || formSchema.module.viewmodels.length === 0) { + return ROOT_VIEW_MODEL_ID; + } + + if (formSchema.module.viewmodels.find(viewmodel => viewmodel.id === ROOT_VIEW_MODEL_ID)) { + return ROOT_VIEW_MODEL_ID; + + } + + return formSchema.module.viewmodels[0].id; + } + /** + * 获取ViewModel中远程(VO)上下文变量,构建treetable数据,用于变量绑定的选择窗口 + */ + function getRemoteVariables() { + if (!formSchema.module.viewmodels || formSchema.module.viewmodels.length === 0) { + return []; + } + const viewModel = getViewModelById(getRootViewModelId()); + if (!viewModel || !viewModel.states || viewModel.states.length === 0) { + return []; + } + + const children = [] as any; + viewModel.states.forEach(variable => { + if (variable.category === FormVariableCategory.remote) { + // 增加中文类型名称,用于界面展示 + let displayTypeName = variable.type; + const vt = FormVariableTypes.find(v => v.value === variable.type); + if (vt) { + displayTypeName = vt.text; + } + + children.push({ data: { ...variable, displayTypeName }, children: [], selectable: true }); + } + }); + return children; + } + /** + * ----------------内部方法-------------------------- + * schema中的变量转换为VM上的变量 + * @param schemaVarList 变量列表 + */ + function changeSchemaVariable2VMVariable(schemaVarList: FormSchemaEntityField[]) { + if (!schemaVarList || schemaVarList.length === 0) { + return []; + } + const viewModelVarList: FormVariable[] = []; + schemaVarList.forEach(schemaVarItem => { + const formVariable: FormVariable = { + id: schemaVarItem.id, + code: schemaVarItem.label, + name: schemaVarItem.name, + type: schemaVarItem.type.name, + category: FormVariableCategory.remote + }; + if (schemaVarItem.$type !== 'SimpleField' && schemaVarItem.type.fields) { + formVariable.type = 'Object'; + formVariable.fields = changeSchemaVariable2VMVariable(schemaVarItem.type.fields); + } + + viewModelVarList.push(formVariable); + }); + return viewModelVarList; + } + /** + * 更新远程变量 + * @param varList 变量列表 + */ + function updateRemoteVariables(varList: FormSchemaEntityField[]) { + if (!formSchema.module.viewmodels || formSchema.module.viewmodels.length === 0) { + return; + } + const viewModel = getViewModelById(getRootViewModelId()); + const currentStates = viewModel?.states.filter(s => s.category === 'remote'); + const vmVarList = changeSchemaVariable2VMVariable(varList); + + const clonedCurrentState = cloneDeep(currentStates); + clonedCurrentState?.forEach(s => delete s.value); + + // 为了不引起DOM JSON的变更,增加判断 + if (currentStates && vmVarList && JSON.stringify(clonedCurrentState) !== JSON.stringify(vmVarList)) { + if (viewModel) { + viewModel.states = viewModel?.states.filter(s => !s.category || s.category === 'locale'); + } + vmVarList.forEach(newVar => { + const oldState = currentStates.find(s => s.id === newVar.id); + if (oldState && oldState.value && oldState.type === newVar.type) { + newVar.value = oldState.value; + } + + viewModel?.states.push(newVar); + }); + } + } + + + /** + * 保存变量(全量) + * @param states 变量列表 + * @param viewModelId 变量所属viewModel ID + */ + function saveVariables(states: FormVariable[], viewModelId: string) { + if (!formSchema.module.viewmodels || formSchema.module.viewmodels.length === 0) { + return; + } + const viewModel = getViewModelById(viewModelId); + if (viewModel) { + viewModel.states.length = 0; + viewModel.states.push(...states); + } + } + + /** + * 获取指定变量 + */ + function getVariableByIdAndVMID(varId: string, viewModelId: string) { + if (!formSchema.module.viewmodels || formSchema.module.viewmodels.length === 0) { + return; + } + const viewModel = getViewModelById(viewModelId); + const variable = viewModel?.states.find(stateItem => stateItem.id === varId); + return variable; + } + + /** + * 获取指定变量 + */ + function getVariableById(varId: string) { + if (!formSchema.module.viewmodels || formSchema.module.viewmodels.length === 0) { + return; + } + for (const viewModel of formSchema.module.viewmodels) { + const variable = viewModel.states.find(stateItem => stateItem.id === varId); + if (variable) { + return variable; + } + } + } + /** + * 获取所有VM下的变量,组装成树结构 + * 树表中额外增加statePath属性(命令所在viewModelId.variableCode),用于窗口展开时数据行的回显。 + */ + function getAllVariables() { + if (!formSchema.module.viewmodels || formSchema.module.viewmodels.length === 0) { + return []; + } + const vmTree = [] as any; + const viewModeli18n = '视图模型'; + formSchema.module.viewmodels.forEach(viewModel => { + if (!viewModel || !viewModel.states || viewModel.states.length === 0) { + return []; + } + + const children = [] as any; + viewModel.states.forEach(variable => { + children.push({ data: { ...variable, statePath: viewModel.id + '.' + variable.code }, children: [], selectable: true }); + }); + + const rootVm = { + data: { id: viewModel.id, code: viewModel.code, name: viewModel.name + viewModeli18n, statePath: viewModel.id }, + children, + selectable: false, expanded: true + }; + vmTree.push(rootVm); + + }); + return vmTree; + } + + /** + * 获取所有VM下的变量并平铺成数组 + * 额外增加statePath属性(命令所在viewModelId.variableCode),用于唯一标识 + */ + function getAllPlainVariables(): any[] { + if (!formSchema.module.viewmodels || formSchema.module.viewmodels.length === 0) { + return []; + } + const varArray = [] as any; + formSchema.module.viewmodels.forEach(viewModel => { + if (!viewModel || !viewModel.states || viewModel.states.length === 0) { + return []; + } + viewModel.states.forEach(variable => { + varArray.push({ ...variable, statePath: viewModel.id + '.' + variable.code }); + }); + }); + return varArray; + } + function getControlEditorsInTable(tableRows: any[], fieldId: string, devMode: string) { + let controls = [] as any; + if (tableRows && tableRows.length) { + tableRows.forEach(row => { + row.columns.forEach(column => { + if (column.tdType === 'editor' && column.editor && column.editor.binding) { + if (column.editor.binding.type && column.editor.binding.type === FormBindingType.Form && column.editor.binding.field === fieldId) { + controls.push(column.editor); + // 查找与当前单元格同组的文本类单元格TableTd,这种单元格不包含编辑器,但是需要与编辑器同步展示标题,所以放在关联控件里面。 + if (devMode === 'simple' && column.groupId) { + const sameGroupStaticColumns = row.columns.filter(col => col.groupId === column.groupId && col.id !== column.id && !col.invisible && col.tdType === 'staticText'); + if (sameGroupStaticColumns.length) { + controls = controls.concat(sameGroupStaticColumns); + } + } + } + + } + + + }); + }); + } + + return controls; + } + + /** + * 获取指定VM关联的组件中绑定指定字段的控件 + * @param contents DOM节点 + * @param fieldId 字段标识 + */ + function getControlsByBinding(contents: any[], fieldId: string) { + let controls = [] as any; + for (const element of contents) { + if ((element.type === 'data-grid') || (element.type === 'tree-grid')) { // 列表 + const childControls = getControlsByBinding(element.columns, fieldId); + controls = controls.concat(childControls); + } else if (element.type === 'table') { // Table + const tdControls = getControlEditorsInTable(element.rows, fieldId, element.devMode); + controls = controls.concat(tdControls); + } else if (element.contents) { // 容器组件 + const childControls = getControlsByBinding(element.contents, fieldId); + controls = controls.concat(childControls); + } else if (element.binding && element.binding.type === FormBindingType.Form && element.binding.field === fieldId) { + controls.push(element); + } + } + + return controls; + } + /** + * 获取指定VM关联的组件中绑定指定字段的控件(目前只有一个控件) + * @param viewModelId VM标识 + * @param fieldId 字段标识 + */ + function getControlsInCmpWidthBinding(viewModelId: string, fieldId: string) { + const foundComponent = formSchema.module.components.find(componentItem => componentItem.viewModel === viewModelId); + + return foundComponent ? getControlsByBinding(foundComponent.contents, fieldId) : []; + } + + + /** + * 获取节点下所有 components ID 列表 + * @param eleContents [] + * @returns string[] + */ + function getALLComponentsIDList(eleContents: { type: string, component: any, contents: [] }[]): string[] { + let deIDList = [] as any; + eleContents.forEach(element => { + if (element.type === 'ComponentRef') { + const targetComponents = formSchema.module.components.find((item) => { + return item.id === element.component; + }); + deIDList.push(targetComponents?.id || ''); + // 这段没有必要,因为没有嵌套的component + if (targetComponents && targetComponents.contents) { + if (targetComponents.contents && targetComponents.contents.length) { + deIDList = deIDList.concat(getALLComponentsIDList(targetComponents.contents)); + } + } + } + if (element.contents && element.contents.length) { + deIDList = deIDList.concat(getALLComponentsIDList(element.contents)); + } + }); + return deIDList; + } + + /** + * 添加component 方法 + */ + function addComponent(component: FormComponent): string { + formSchema.module.components.push(component); + return component.id; + } + + /** + * 添加 viewModel 方法 + * @param viewModel:FormViewModel + * @returns string viewModel id + */ + function addViewModel(viewModel: FormViewModel): string { + formSchema.module.viewmodels.push(viewModel); + return viewModel.id; + } + + /** + * 场景:在表单上删除tabPage/datagrid后,不能真正删除component和viewModel节点,不然会造成编译错误,故将component和viewmodel标记为fakeDel + */ + function remarkComponentFakeDel(removedComponentIdList: string[]): void { + removedComponentIdList.forEach(element => { + const targetComponent = getComponentById(element); + if (targetComponent) { + const targetViewModel = getViewModelById(targetComponent.viewModel); + if (targetViewModel) { + targetViewModel.fakeDel = true; + targetComponent.fakeDel = true; + } + } + }); + } + + /** + * ------------------------------内部方法------------------- + * 根据id遍历查找节点(id支持带有*号的通配符) + * @param rootNode 容器节点 + * @param predict 条件 + */ + function selectNodeByWildcardID(rootNode: any, id: string) { + if (!rootNode || !id) { + return null; + } + let flag = false; + if (id.includes('*')) { + const newId = id.replace('*', ''); + if (rootNode.id.includes(newId)) { + flag = true; + } + } else if (rootNode.id === id) { + flag = true; + } + + if (flag) { + return rootNode; + } + if (rootNode.contents) { + for (const item of rootNode.contents) { + const found = selectNodeByWildcardID(item, id); + if (found) { + return found; + } + } + } + return null; + } + /** + * 根据id路径定位节点 + * @param rootNode 根节点 + * @param idPath id路径 + */ + function getNodeByIdPath(rootNode: any, idPath: string) { + if (!rootNode || !idPath) { + return null; + } + const idPathArray = idPath.split('.'); + if (idPathArray.length === 0) { + return; + } + const currentId = idPathArray.shift(); + if (rootNode.contents) { + for (const item of rootNode.contents) { + if (currentId === '*') { + // 任意路径 + const nextItem = selectNodeByWildcardID(item, idPathArray[0]); + if (nextItem) { + idPathArray.shift(); + if (idPathArray.length === 0) { + return nextItem; + } + const found = getNodeByIdPath(nextItem, idPathArray.join('.')); + if (found) { + return found; + } + } + + } else if ((currentId?.includes('*') && item.id.startsWith(currentId.slice(0, currentId.length - 1))) + || item.id === currentId) { + + if (idPathArray.length === 0) { + return item; + } else { + const found = getNodeByIdPath(item, idPathArray.join('.')); + if (found) { + return found; + } + } + } + } + } + return null; + } + + /** + * 获取指定控件id的父节点 + * @param rootNode 根组件节点 + * @param id 指定控件的ID + */ + function getControlParentById(rootNode: any, controlId: string): any { + if (!rootNode) { + return null; + } + + if (rootNode.contents) { + for (const item of rootNode.contents) { + if (item.id === controlId) { + return rootNode; + } else { + const found = getControlParentById(item, controlId); + if (found) { + return found; + } + } + + } + } + return null; + } + /** + * 根据ID路径查找所有节点,找到所有符合idPath的最后一位的节点 + * @param rootNode 容器节点 + * @param idPath id路径 + */ + function getNodesByIdPath(rootNode: any, idPath: string) { + if (!rootNode || !idPath) { + return null; + } + const idPathArray = idPath.split('.'); + if (idPathArray.length === 0) { + return; + } + const currentId = idPathArray.shift(); + if (rootNode.contents) { + for (const item of rootNode.contents) { + if (currentId === '*') { + + if (idPathArray.length === 1 && item.contents && item.contents.length) { + return item.contents.filter(c => c.id.includes(idPathArray[0].replace('*', ''))); + } + + + // 任意路径 + const nextItem = selectNodeByWildcardID(item, idPathArray[0]); + if (nextItem) { + idPathArray.shift(); + if (idPathArray.length === 0) { + return [nextItem]; + } + const found = getNodeByIdPath(nextItem, idPathArray.join('.')); + if (found) { + return [found]; + } + } + + } else if ((currentId?.includes('*') && item.id.startsWith(currentId.slice(0, currentId.length - 1))) + || item.id === currentId) { + + if (idPathArray.length === 0) { + return [item]; + } else { + const found = getNodesByIdPath(item, idPathArray.join('.')); + if (found) { + return found; + } + } + } + } + } + return null; + } + + /** + * 根据控件所在组件的统一布局配置获取控件样式 + * @param componentId 组件Id + */ + function getControlClassByFormUnifiedLayout(controlClass: string, componentId: string, formNode: any): string { + if (!formNode) { + const componentNode = getComponentById(componentId); + if (!componentNode || !componentNode.componentType.startsWith('form')) { + return controlClass; + } + formNode = selectNode(componentNode, item => item.type === 'request-form'); + } + if (!formNode || !formNode.unifiedLayout) { + return controlClass; + } + + const controlClassArray = controlClass.split(' '); + + let colClass = controlClassArray.find(item => /^col-([1-9]|10|11|12)$/.test(item)); + let colMDClass = controlClassArray.find(item => /^col-md-([1-9]|10|11|12)$/.test(item)); + let colXLClass = controlClassArray.find(item => /^col-xl-([1-9]|10|11|12)$/.test(item)); + let colELClass = controlClassArray.find(item => /^col-el-([1-9]|10|11|12)$/.test(item)); + + + colClass = formNode.unifiedLayout.uniqueColClassInSM ? 'col-' + formNode.unifiedLayout.uniqueColClassInSM : colClass; + colMDClass = formNode.unifiedLayout.uniqueColClassInMD ? 'col-md-' + formNode.unifiedLayout.uniqueColClassInMD : colMDClass; + colXLClass = formNode.unifiedLayout.uniqueColClassInLG ? 'col-xl-' + formNode.unifiedLayout.uniqueColClassInLG : colXLClass; + colELClass = formNode.unifiedLayout.uniqueColClassInEL ? 'col-el-' + formNode.unifiedLayout.uniqueColClassInEL : colELClass; + + return colClass + ' ' + colMDClass + ' ' + colXLClass + ' ' + colELClass; + + } + /** + * ----------------内部方法-------------------------- + * 遍历节点下所有节点 + * @param root 根节点或contents + * @param parentId 父节点id + * @returns + */ + function collectMetadata(root: Node | Node[], parentId?: string | undefined) { + if (Array.isArray(root)) { + root.forEach((node: Node) => { + collectMetadata(node, parentId); + }); + } else { + const { id = null, type = null, contents = null } = root; + if (!id || !type) { + return; + } + root.__parentId__ = parentId; + const typeValue = nodeTypeCollect.get(type) || []; + typeValue.push(root); + nodeTypeCollect.set(type, typeValue); + // const idValue = nodeIdCollect.get(id) || []; + // idValue.push(root); + // nodeIdCollect.set(id, idValue); + if (contents && contents.length > 0) { + collectMetadata(root.contents as Node[], id); + } + } + } + + /** + * 获取所有隐藏帮助 + */ + function getHidenLookups() { + const result = [] as any; + nodeTypeCollect.clear(); + const nodes = cloneDeep(formSchema.module.components); + collectMetadata(nodes); + if (nodeTypeCollect && nodeTypeCollect.size > 0) { + // 找到所有的隐藏区域 + const hiddenContainers = nodeTypeCollect.get(NodeType.HiddenContainer); + if (hiddenContainers && hiddenContainers.length > 0) { + const containerIds = hiddenContainers.map(item => item['id']); + const lookupEdits = nodeTypeCollect.get(NodeType.LookupEdit); + if (lookupEdits && lookupEdits.length > 0) { + const hiddenHelps = lookupEdits.filter(node => containerIds.includes(node['__parentId__'] || '')); + result.push(...hiddenHelps); + } + } + } + return result; + } + /** + * 获取所有子表弹出编辑组件 + * @returns + */ + function getPageModalComponents() { + const result = [] as any; + nodeTypeCollect.clear(); + const nodes = cloneDeep(formSchema.module.components); + collectMetadata(nodes); + if (nodeTypeCollect && nodeTypeCollect.size > 0) { + // 找到所有的隐藏区域 + const components = nodeTypeCollect.get(NodeType.Component); + if (components && components.length > 0) { + const modals = components.filter(item => item.componentType === 'modalFrame'); + if (modals && modals.length > 0) { + result.push(...modals); + } + } + } + return result; + } + + /** + * 根据指定的类型数组获取组件 + * @param types + * @param deep + * @returns + */ + function getComponentsByType(types: any, deep = false) { + if (!formSchema.module.components || formSchema.module.components.length === 0) { + return; + } + if (deep) { + const targetComponet = [] as any; + const FindComponent = (components: any[]) => { + components.forEach((componentItem) => { + if (componentItem) { + if (types.includes(componentItem.type)) { + targetComponet.push(componentItem); + } else if (componentItem.contents && componentItem.contents.length) { + FindComponent(componentItem.contents); + } + } + }); + }; + FindComponent(formSchema.module.components); + return targetComponet; + } else { + return formSchema.module.components.filter(cmp => types.includes(cmp.type)); + } + } + + function getSchemaEntities(): FormSchemaEntity[] { + const schema = getSchemas(); + return schema?.entities || []; + } + + /** + * 获取表字段列表 + * @param entities 实体对象集合 + * @param bindTo 实体绑定路径 + */ + function getTableFieldsByBindTo(entities: FormSchemaEntity[], bindTo: string): FormSchemaEntityField[] | undefined { + if (!entities || entities.length === 0) { + return []; + } + const splitIndex = bindTo.indexOf('/'); + if (splitIndex > -1) { + bindTo = bindTo.slice(splitIndex + 1, bindTo.length); + } + + for (const entity of entities) { + const entityType = entity.type; + if (!entityType) { + return []; + } + if (bindTo === '' || bindTo === entity.code || bindTo === entity.label) { + return entityType.fields; + } + if (entityType.entities && entityType.entities.length > 0) { + const fields = getTableFieldsByBindTo(entityType.entities, bindTo); + if (fields) { + return fields; + } + } + } + } + + /** + * 获取指定VM下的所有字段 + * @param viewModelId 视图模型标识 + */ + function getFieldsByViewModelId(viewModelId: string): FormSchemaEntityField[] | undefined { + const vm = getViewModelById(viewModelId); + if (!vm) { + return []; + } + const entities = getSchemaEntities(); + if (!entities || entities.length === 0) { + return []; + } + return getTableFieldsByBindTo(entities, vm.bindTo); + } + + function setFormTemplateRule(rules: any) { + formTemplateRules = rules; + } + function getFormTemplateRule(): any { + return formTemplateRules; + } + + return { + getModule, + setViewmodels, + setCommands, + getCommands, + getComponents, + getViewModels, + getFormSchema, + setFormSchema, + getComponentById, + getUpdateVersion, + getViewModelIdByComponentId, + getComponentByViewModelId, + getViewModelById, + selectNode, + selectNodeAndParentNode, + getFormMetadataBasicInfo, + setFormMetadataBasicInfo, + getControlBasicInfoMap, + deleteViewModelById, + deleteViewModelFieldById, + addViewModelField, + getSchemas, + clearViewModelFieldSchema, + modifyViewModelFieldById, + getControlClassByFormUnifiedLayout, + setFormTemplateRule, + getFormTemplateRule, + getRemoteVariables, + getLocaleVariablesByViewModelId, + getFieldsByViewModelId, + getExpressions, + setExpressions, + deleteComponent, + getControlsInCmpWidthBinding, + getVariableById, + getComponetsByPredicate + }; +} diff --git a/packages/mobile-designer/src/components/composition/use-form-statemachine.ts b/packages/mobile-designer/src/components/composition/use-form-statemachine.ts new file mode 100644 index 0000000000000000000000000000000000000000..40058f1c52a19ed12849a21836456bbcfc7ed729 --- /dev/null +++ b/packages/mobile-designer/src/components/composition/use-form-statemachine.ts @@ -0,0 +1,60 @@ +import { UseFormSchema, UseFormStateMachine } from "../types"; +import { MetadataService } from "./metadata.service"; + +export default function (useFormSchemaComposition: UseFormSchema): UseFormStateMachine { + let stateMachineMetadata: any; + + let renderStateData: any = []; + + const metadataService = new MetadataService(); + + /** + * 获取状态机中的可视化状态数据 + */ + function getRenderStates() { + return renderStateData || []; + } + + /** + * 提取状态机中的可视化状态数据 + */ + function resolveRenderStateData(stateMachineCode: string) { + renderStateData = []; + Object.keys(stateMachineMetadata.renderState).forEach(item => { + const state = stateMachineMetadata.renderState[item]; + renderStateData.push({ + id: item, + name: state.name, + exist: '是', + stateMachineId: stateMachineCode + }); + }); + } + /** + * 获取状态机元数据 + */ + function queryStateMachineMetadata(): void { + const formSchema = useFormSchemaComposition.getFormSchema(); + const formBasicInfo = useFormSchemaComposition.getFormMetadataBasicInfo(); + if (!formSchema?.module || !formBasicInfo) { + return; + } + const { stateMachines } = formSchema.module; + if (stateMachines && stateMachines.length) { + const { uri: stateMachineID, id: stateMachineCode } = stateMachines[0]; + const { relativePath } = formBasicInfo; + metadataService.queryMetadataById(relativePath, stateMachineID).then(result => { + if (result?.data?.content) { + stateMachineMetadata = JSON.parse(result.data.content); + } + resolveRenderStateData(stateMachineCode); + }); + } + return; + } + function getStateMachineMetadata() { + return stateMachineMetadata; + } + + return { getStateMachineMetadata, queryStateMachineMetadata, getRenderStates }; +} diff --git a/packages/mobile-designer/src/components/composition/use-location.ts b/packages/mobile-designer/src/components/composition/use-location.ts new file mode 100644 index 0000000000000000000000000000000000000000..159c2b908982a0b0cfe0c0506f305f1de44f5019 --- /dev/null +++ b/packages/mobile-designer/src/components/composition/use-location.ts @@ -0,0 +1,10 @@ +export function useLocation() { + function getUrlParam(key: string) { + const URL = new URLSearchParams(location.search); + return decodeURI(URL.get(key)|| ''); + } + + return { + getUrlParam + }; +} diff --git a/packages/mobile-designer/src/components/composition/use-parameter-editor-data.ts b/packages/mobile-designer/src/components/composition/use-parameter-editor-data.ts new file mode 100644 index 0000000000000000000000000000000000000000..c368ebf4186c60eb35690f1b5dec0ffa1367d149 --- /dev/null +++ b/packages/mobile-designer/src/components/composition/use-parameter-editor-data.ts @@ -0,0 +1,204 @@ +import { inject, reactive, ref } from "vue"; +import { ComponentSchema } from "@farris/ui-vue/components"; +import { FormComponent, FormSchemaEntity, FormSchemaEntityField, UseFormSchema } from "../types"; + +export interface ComponentTreeNode { + data: Partial, + id: string; + code: string; + name: string; + layer: number; + parent: any; + parentId?: string | null; + hasChildren: boolean; +} + +export interface ViewModelTreeNode { + children: ViewModelTreeNode[]; + data: { id: string, code: string, name: string, statePath: string }; + id?: string; + code?: string; + selectable?: boolean; + expanded?: boolean; +} +export function useParameterEditorData(useFormSchemaComposition: UseFormSchema) { + // 参数编辑器左侧组件配置 + /** + * 将实体内的字段组装为树结构 + */ + function resolveFieldNodesInEntity(fields: FormSchemaEntityField[], layer: number, parentNode: any, treeViewData: any[] = []) { + fields.forEach(field => { + const fieldTreeData = { + data: field, + id: field.id, + name: field.name, + expanded: true, + nodeType:'field', + layer, + parent: parentNode && parentNode.id, + parentNode, + hasChildren: false + }; + treeViewData.push(fieldTreeData); + // 关联表字段 / UDT字段 + if (field.type && field.type.fields && field.type.fields.length > 0) { + fieldTreeData.hasChildren = true; + resolveFieldNodesInEntity(field.type.fields, layer + 1, fieldTreeData, treeViewData); + } + }); + } + + /** + * 组装实体树绑定数据 + */ + function resolveEntityTreeData(entity: FormSchemaEntity, layer: number, parentNode: any, treeViewData: any[] = []) { + const entityTreeData = { + data: entity, + id: entity.id, + name: entity.name, + expanded: true, + nodeType: 'entity', + layer, + parent: parentNode && parentNode.id, + parentNode, + hasChildren: true + }; + treeViewData.push(entityTreeData); + + if (entity.type && entity.type.fields && entity.type.fields.length > 0) { + resolveFieldNodesInEntity(entity.type.fields, layer + 1, entityTreeData, treeViewData); + } + + if (entity.type.entities && entity.type.entities.length > 0) { + const childentityTreeData = { + id: `childEntity_${entity.id}`, + name: '子表', + layer: layer + 1, + parent: entity.id, + hasChildren: true, + parentNode: entityTreeData + }; + treeViewData.push(childentityTreeData); + + entity.type.entities.forEach((childEntity: any) => { + resolveEntityTreeData(childEntity, layer + 2, childentityTreeData, treeViewData); + + }); + } + } + // const useFormSchemaComposition: any = inject('useFormSchema'); + function schemaFieldsToTree(treeData: any[], schemaFields: any[], + path: string, layer: number, parent: string | null, bindTo: string) { + if (!schemaFields || !schemaFields.length) { + return treeData; // 传入的参数为空或长度为0,直接返回空数组 + } + schemaFields.forEach(field => { + const isComplexField = field.$type === 'ComplexField' && field.type && field.type.fields && field.type.fields.length; + const treeItem = { + data: { ...field, path, bindTo }, id: field.id, code: field.code, + name: field.name, layer: layer + 1, parent, hasChildren: false + }; + // 列卡表单等场景中字段会在不同的组件中重复展示,id会重复,故将树节点id重置。 + treeItem.data.id = treeItem.data.id + '_' + path; + treeItem.id = treeItem.id + '_' + path; + if (isComplexField) { + treeItem.hasChildren = true; + schemaFieldsToTree(treeData, field.type.fields, + `${path}/${field.bindingPath}`, treeItem.layer, treeItem.id, bindTo); + } + treeData.push(treeItem); + }); + return treeData; + } + // 表单组件组装数据 + function assembleOutline() { + const formSchema = useFormSchemaComposition.getFormSchema(); + const allComponents = formSchema.module.components; + // 表单组件 + const rootComponentId = 'root-component'; + let rootComponent = allComponents.find(item => item.id === rootComponentId); + if (!rootComponent) { + rootComponent = allComponents[0]; + } + const data: ComponentTreeNode[] = []; + allComponents.forEach((cmp: FormComponent) => { + const cmpTreeData: ComponentTreeNode = { + data: cmp, + id: cmp?.id, + code: cmp?.code || cmp?.id, + name: cmp?.name || cmp?.id, + layer: 0, + parent: null, + hasChildren: true + }; + data.push(cmpTreeData); + }); + return data; + } + + function assembleSchemaFieldsByComponent() { + const formSchema = useFormSchemaComposition.getFormSchema(); + const entity = formSchema.module.entity[0]; + const data: Omit[] = []; + entity.entities.forEach(entity => { + resolveEntityTreeData(entity, 1, null, data); + }); + // allComponents.forEach(component => { + // const cmp = useFormSchemaComposition.getComponentById(component.id); + // const { bindTo } = useFormSchemaComposition.getViewModelById(cmp?.viewModel || '') || { bindTo: '' }; + // const cmpTreeNode: Omit = { + // data: { ...component, name: component.id, bindTo }, + // id: component.id, + // code: component.code || component.id, + // name: component.name || component.id, + // layer: 0, + // parent: null, + // parentId: null, + // hasChildren: true + // }; + // data.push(cmpTreeNode); + // const schemaFields = useFormSchemaComposition.getFieldsByViewModelId(component.viewModel) || []; + // // schemaFields. + // schemaFieldsToTree(data, + // schemaFields, component.id, 0, cmpTreeNode.id, bindTo); + // }); + return data; + } + + function assembleStateVariables() { + const formSchema = useFormSchemaComposition.getFormSchema(); + const { viewmodels } = formSchema.module; + if (!viewmodels || !viewmodels.length) { + return; + } + const data: ViewModelTreeNode[] = []; + viewmodels.forEach(viewModel => { + if (!viewModel || !viewModel.states || !viewModel.states.length) { + return; + } + const vmNode: ViewModelTreeNode = { + data: { id: viewModel.id, code: viewModel.code, name: viewModel.name + '视图模型', statePath: viewModel.id }, + id: viewModel.id, + code: viewModel.code || viewModel.id, + children: [] as ViewModelTreeNode[], + selectable: false, + expanded: true + }; + data.push(vmNode); + const componentId = useFormSchemaComposition.getComponentByViewModelId(viewModel.id)?.id; + viewModel.states.forEach(state => { + vmNode.children.push({ + data: { ...state, statePath: `/${componentId}/${state.code}` }, + selectable: true + } as any); + }); + }); + return data; + } + + return { + assembleOutline, + assembleSchemaFieldsByComponent, + assembleStateVariables, + }; +} diff --git a/packages/mobile-designer/src/components/designer.component.tsx b/packages/mobile-designer/src/components/designer.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..c1a1287be429801a3e1ddd8a31b1b6ff242567c0 --- /dev/null +++ b/packages/mobile-designer/src/components/designer.component.tsx @@ -0,0 +1,286 @@ +import { SetupContext, defineComponent, inject, ref, computed, provide, watch, onBeforeMount } from "vue"; +import { DesignerProps, designerProps } from "./designer.props"; +import { useFormSchema } from "./composition/use-form-schema"; +import { useFormMetadata } from "./composition/form-metadata.service"; +import { FormMetadaDataDom, MetadataPathToken } from "./types"; +import { FNotifyService, FLoadingService, FResponseToolbar } from '@farris/ui-vue/components'; +import FDesigner from '../components/components/form-designer/form-designer.component'; +import FViewModelDesigner from '../components/components/view-model-designer/view-model-designer.component'; + +import './designer.scss'; +import { useFormCommandService } from "./composition/command.service"; +import { useEventsEditor } from "./composition/use-events-editor"; +import { useEventsEditorUtils } from "./composition/events-editor-utils"; +import { useDesignViewModel } from "./composition/design-viewmodel.service"; +import { useSchemaService } from "./composition/schema.service"; +import { useControlCreator } from "./composition/control-creator.service"; +import { FormMetadataConverter } from "./composition/form-metadata-converter"; +import FCodeViewDesign from "./components/code-view/components/code-view.component"; +import { useCommandBuilderService } from "./composition/command-builder.service"; + +import useFormStateMachine from './composition/use-form-statemachine'; +import { MetadataService } from "./composition/metadata.service"; + +export default defineComponent({ + name: 'FDesigner', + props: designerProps, + components: { + + }, + emits: [], + setup(props: DesignerProps) { + const metadataLoaded = ref(false); + const schema = ref(props.schema); + const notifyService: any = new FNotifyService(); + notifyService.globalConfig = { position: 'top-center' }; + const activeShowDesignerType = ref('formDesigner'); + const viewModelDesignerRef = ref(); + const formDesignerRef = ref(); + const loadingService: any = inject('FLoadingService'); + const messageBoxService: any = inject('FMessageBoxService'); + const currentViewType = ref('designer'); + const codeViewComponent = ref(); + const metadataService = new MetadataService(); + // 注册 formSchema服务 + const useFormSchemaComposition = useFormSchema(); + provide('useFormSchema', useFormSchemaComposition); + const commandBuilderService = useCommandBuilderService(useFormSchemaComposition); + const useFormStateMachineComposition = useFormStateMachine(useFormSchemaComposition); + provide('useFormStateMachine', useFormStateMachineComposition); + // 注册 命令服务 + const formCommandService = useFormCommandService(useFormSchemaComposition, useFormStateMachineComposition, loadingService, commandBuilderService); + provide('useFormCommand', formCommandService); + // 注册事件编辑器服务 + const useEventsEditorService = useEventsEditor(formCommandService, useFormSchemaComposition); + provide('useEventsEditor', useEventsEditorService); + const eventsEditorUtils = useEventsEditorUtils(formCommandService, useFormSchemaComposition, useEventsEditorService); + provide('eventsEditorUtils', eventsEditorUtils); + // 操作表单DOM Schema的工具类 + const schemaService = useSchemaService(metadataService, useFormSchemaComposition); + provide('schemaService', schemaService); + // 操作表单设计时ViewModel的工具类 + const designViewModelService = useDesignViewModel(useFormSchemaComposition, schemaService); + provide('designViewModelUtils', designViewModelService); + // metadatFullPath + const metadataPath: string = inject(MetadataPathToken, ''); + // 控件创建服务 + const controlCreatorService = useControlCreator(); + provide('controlCreatorUtils', controlCreatorService); + provide('formMetadataConverter', new FormMetadataConverter()); + const { eventBetweenDesignerAndCodeView } = commandBuilderService; + const useFormMetadataComposition = useFormMetadata(props, useFormSchemaComposition); + onBeforeMount(() => { + useFormMetadataComposition.queryMetadata().then((formSchema: FormMetadaDataDom) => { + schema.value = formSchema; + useFormMetadataComposition.queryFormTemplateRule(formSchema?.module).then(() => { + metadataLoaded.value = true; + // 加载命令=》虽然是异步,但是此处不需要异步串联 + formCommandService.checkCommands(); + // 赋值处理 + designViewModelService.assembleDesignViewModel(); + // 加载状态机 + useFormStateMachineComposition.queryStateMachineMetadata(); + }); + }); + }); + + const showDesignerTypeItemClass = computed(() => (itemType: string) => { + return { + 'active': itemType === activeShowDesignerType.value + }; + }); + const showDesignerContent = computed(() => (itemType: string) => { + return itemType !== activeShowDesignerType.value; + }); + + function onChangeShowDesignerType(itemType: string) { + if (activeShowDesignerType.value === itemType) { + return; + } + // 从代码编辑器切换到可视化页面 + formDesignerRef.value?.onChangeDesignerView('formDesigner'); + + // 切换到模型时,触发模型页面的数据刷新 + if (itemType === 'viewModelDesigner') { + viewModelDesignerRef.value?.refreshViewModelDesigner(); + } + // 切换到页面时,触发属性面板的更新 + if (itemType === 'formDesigner' && formDesignerRef.value?.reloadPropertyPanel) { + formDesignerRef.value?.reloadPropertyPanel(); + } + activeShowDesignerType.value = itemType; + } + /** + * 运行表单 + */ + function runForm() { + const loadingInstance = loadingService?.show({ message: '解析中,请稍候...' }); + const metadataId = useFormSchemaComposition.getFormMetadataBasicInfo()?.id; + const relativePath = useFormSchemaComposition.getFormMetadataBasicInfo()?.relativePath; + useFormMetadataComposition.deployFrontFile(metadataId, relativePath).then(res => { + useFormMetadataComposition.publishFormMetadata().then((publishInfo) => { + if (publishInfo.result) { + loadingInstance.value.close(); + const previewUrl = `${window.location.origin}/platform/common/web/renderer/index.html#/preview?metadataPath=${metadataPath}&projectPath=${relativePath}&metadataId=${metadataId}`; + const windowProxy = window.open(previewUrl); + if (!windowProxy) { + notifyService.error({ message: '预览失败,请调整浏览器安全设置后重试!' }); + } + } else { + loadingInstance.value.close(); + notifyService.error({ message: publishInfo.error || '表单解析失败' }); + } + }); + }).catch((error: any) => { + loadingInstance.value.close(); + notifyService.error({ message: error?.response?.data?.Message || '构件部署失败' }); + }); + } + /** + * 保存表单 + */ + function saveFormMetadata(needRunForm: boolean = false) { + const loadingInstance = loadingService?.show({ message: '保存中,请稍候...' }); + useFormMetadataComposition.saveFormMetadata().then(() => { + notifyService.success({ message: '表单保存成功' }); + loadingInstance.value.close(); + if (needRunForm) { + runForm(); + } + }, () => { + notifyService.error({ message: '表单保存失败' }); + loadingInstance.value.close(); + }); + } + /** + * 工具栏配置 + */ + const designerToolbarItems = [ + { id: 'save', text: '保存', onClick: () => saveFormMetadata(false) }, + { id: 'run', text: '运行', onClick: () => saveFormMetadata(true), class: 'btn-primary' } + ]; + /** + * 切换设计器视图与代码视图 + */ + function onChangeDesignerView(viewType: string) { + return currentViewType.value = viewType; + } + /** + * 向自定义构件添加ts代码方法 + */ + function openCodeViewWithNewMethod(data: any) { + const { tsFilePathName: tsFilePath, methodCode, methodName } = data; + if (tsFilePath) { + + // 触发刷新代码视图的文件树 + codeViewComponent.value.refreshNavTree(tsFilePath); + + // 触发打开新创建的ts代码编辑器 + codeViewComponent.value.open(tsFilePath); + + // 触发新增方法 + codeViewComponent.value.sendNotification(tsFilePath, { eventName: 'AddNewMethod', eventPayload: { methodCode, methodName } }).subscribe(result => { + if (result && result.methodCode && result.methodName) { + formCommandService.bindNewMethodToControl(result.methodCode, result.methodName); + } + }); + // 切换到代码视图 + currentViewType.value = 'codeEditor'; + } + } + // 代码编辑器保存的时候触发 + function onCodeViewSaveAll(results) { + if (results) { + const successes = results.filter(item => item.success); + if (successes.length === results.length) { + notifyService.success({ message: '保存成功' }); + } else { + const failedResults = results.filter(item => !item.success); + let message = ''; + failedResults.forEach(failedInfo => { + message += `

${failedInfo.name} ${failedInfo.tip}

`; + }); + messageBoxService.error(message, ''); + } + } + formCommandService.checkCommands().then(() => { + formDesignerRef.value?.reloadPropertyPanel(); + }); + } + + /** + * 向自定义构件添加编排方法(webcmd) + */ + function addNewMethodToWebCmd(data: any) { + const { tsFilePathName: tsFilePath, command } = data; + if (tsFilePath) { + // 替换为web构件地址 + const webCmdFilePath = tsFilePath.replace('.ts', '.webcmd'); + + // 触发刷新代码视图的文件树 + codeViewComponent.value.refreshNavTree(webCmdFilePath); + + // 触发打开web构件设计器 + codeViewComponent.value.open(webCmdFilePath); + + // 触发新增方法 + codeViewComponent.value.sendNotification(webCmdFilePath, { eventName: 'AddNewCmdMethod', eventPayload: { command } }).subscribe(result => { + if (result && result.methodCode && result.methodName) { + + // 添加成功后,通知视图模型更新数据 + commandBuilderService.eventBetweenDesignerAndCodeView.value = { eventName: 'afterAddNewCmdMethod', eventValue: result }; + } + }); + + // 切换到代码视图 + currentViewType.value = 'codeEditor'; + } + } + + watch(eventBetweenDesignerAndCodeView, (newData) => { + if (!newData || !newData.eventName) { + return; + } + switch (newData.eventName) { + case 'openCodeViewWithNewMethod': { + openCodeViewWithNewMethod(newData.eventValue); + break; + } + case 'addNewMethodToWebCmd': { + addNewMethodToWebCmd(newData.eventValue); + break; + } + } + }); + return () => { + return ( + metadataLoaded.value ? +
+
+
+
+
设计器
+
onChangeDesignerView('codeEditor')}>
代码
+
+ +
+
onChangeShowDesignerType('formDesigner')}>
页面
+
onChangeShowDesignerType('viewModelDesigner')}>
模型
+ {/*
onChangeShowDesignerType('formSetting')}>
配置
*/} +
+ +
+ + {/* */} + + {/* */} +
+
+ onChangeDesignerView(type)} onSaveAll={(datas) => onCodeViewSaveAll(datas)}> +
+
+ : '' + ); + }; + } +}); diff --git a/packages/mobile-designer/src/components/designer.props.ts b/packages/mobile-designer/src/components/designer.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..1d39e6d2ac0d6e30711f3fb6ee04599a2f14dcdb --- /dev/null +++ b/packages/mobile-designer/src/components/designer.props.ts @@ -0,0 +1,7 @@ +import { ExtractPropTypes } from "vue"; + +export const designerProps = { + schema: { type: Object, default: {} } +} as Record; + +export type DesignerProps = ExtractPropTypes; diff --git a/packages/mobile-designer/src/components/designer.scss b/packages/mobile-designer/src/components/designer.scss new file mode 100644 index 0000000000000000000000000000000000000000..10f263da5c09462b802eb86b381f25a6d5b728da --- /dev/null +++ b/packages/mobile-designer/src/components/designer.scss @@ -0,0 +1,153 @@ +.f-designer-page { + top: 0; + bottom: 0; + position: absolute; + right: 0; + left: 0; + display: flex; + flex-direction: column; + overflow: hidden; + background: #F2F6FC; + user-select: none; + + .f-designer-header { + font-size: 13px; + background: #fff; + display: flex; + min-height: 40px; + align-items: center; + padding-right: 10px; + + .show-type-panel { + display: flex; + padding: 0px 20px; + height: 30px; + align-self: center; + font-size: 14px; + color: #000; + min-width: 210px; + border-left: 1px solid #E6E9F0 !important; + border-right: 1px solid #E6E9F0 !important; + + .show-type-item { + padding: 0 10px; + cursor: pointer; + + >div { + padding: 4px 4px 9px 4px; + } + + >div.active { + border-bottom: 2px solid #2A87FF; + color: #5B89FE; + } + } + } + + .view-type-panel { + padding: 2px; + background: #F0F3F9; + border-radius: 5px; + margin-right: 15px; + margin-top: 5px; + margin-bottom: 5px; + display: flex; + margin-left: 17px; + height: 28px; + min-width: 145px; + cursor: pointer; + color: #8DA3CE; + align-self: center; + + >div { + background: #F4F5F9; + display: flex; + text-align: center; + align-items: center; + padding: 0 8px; + border-radius: 4px; + + span { + width: 18px; + height: 15px; + margin-right: 4px; + } + } + + >div.active { + color: #5B89FE; + background: #fff; + box-shadow: 0 0 4px 0 rgb(161 179 255 / 37%); + } + } + } + + .f-designer-page-content { + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + overflow: hidden; + } + + .f-designer-page-content-nav { + display: flex; + flex-direction: column; + box-shadow: 0 0 8px 0 rgba(0, 28, 64, .08); + padding: .5rem 0; + position: relative; + z-index: 850; + + .f-designer-left-area { + background: #fff; + + .f-capsule-container .f-capsule-pane .f-capsule-item { + font-size: 14px; + padding-left: 24px; + padding-right: 24px; + } + } + } + + .f-designer-page-content-main { + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + overflow: hidden; + + .f-designer-view-tabs-item { + color: #6080AD; + height: 32px; + align-items: center; + border-radius: 8px; + cursor: pointer; + + &.active { + background-color: #eff5ff; + color: #5B89FE; + } + } + + .form-designer-view:not([hidden]) { + display: flex; + } + + textarea.designer-code-text { + border: 0; + background: #282828; + outline: none; + font-size: 18px; + color: #e9e9e9; + word-wrap: inherit; + resize: none; + } + + .property-panel { + z-index: 850; + } + } + + +} \ No newline at end of file diff --git a/packages/mobile-designer/src/components/index.ts b/packages/mobile-designer/src/components/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..7c90b022856a16ddd7ad0673759592fc86f510d0 --- /dev/null +++ b/packages/mobile-designer/src/components/index.ts @@ -0,0 +1,11 @@ + +import type { App } from 'vue'; +import Designer from './designer.component'; + +export * from './designer.props'; + +export default { + install(app: App): void { + app.component(Designer.name as string, Designer); + } +}; diff --git a/packages/mobile-designer/src/components/preview.component.tsx b/packages/mobile-designer/src/components/preview.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..484367fe521128426ba3e0803e9e161680111bfe --- /dev/null +++ b/packages/mobile-designer/src/components/preview.component.tsx @@ -0,0 +1,53 @@ +import { ref, provide, defineComponent } from 'vue'; +import { useFormSchema } from './composition/use-form-schema'; +import { FDesignerCanvas, FDynamicView } from '@farris/ui-vue/components'; + +import './preview.scss'; + +export default defineComponent({ + name: "FPreview", + props: {}, + emits: [], + setup() { + const schema = ref({}); + const componentJson = ref({}); + const dragulaCompostion = ref(); + const showDynamicView = ref(true); + const useFormSchemaComposition = useFormSchema(); + provide('useFormSchema', useFormSchemaComposition); + + function loadSchema() { + const loadSchema = window.localStorage.getItem('localSchema'); + if (loadSchema) { + const schemaObject = JSON.parse(loadSchema); + schema.value = schemaObject; + componentJson.value = schema.value.module ? schema.value.module.components[0] : schema.value; + useFormSchemaComposition.setFormSchema(schemaObject); + } + } + + loadSchema(); + + function onCanvasInitialized(dragula: any) { + dragulaCompostion.value = dragula; + } + + function onChangePreviewType() { + showDynamicView.value = !showDynamicView.value; + } + + return () => { + return ( +
+ + +
+ +
+
+ ); + }; + } +}); diff --git a/packages/mobile-designer/src/components/preview.scss b/packages/mobile-designer/src/components/preview.scss new file mode 100644 index 0000000000000000000000000000000000000000..0216b991dcddbd7752998ead341cbb1ab8263981 --- /dev/null +++ b/packages/mobile-designer/src/components/preview.scss @@ -0,0 +1,11 @@ +.show-type-settings-button { + position: absolute; + right: 4px; + bottom: 10px; + z-index: 900; +} +.show-type-settings-button .f-icon { + font-size: 18px; + margin: 0 auto; + line-height: 20px; +} \ No newline at end of file diff --git a/packages/mobile-designer/src/components/types/basic.ts b/packages/mobile-designer/src/components/types/basic.ts new file mode 100644 index 0000000000000000000000000000000000000000..5b8ea2f9307d176e95175075053135b44f3ebbc5 --- /dev/null +++ b/packages/mobile-designer/src/components/types/basic.ts @@ -0,0 +1,154 @@ +import { ComponentType, FormBindingType } from "./enums"; + +export interface FormStateMachine { + /** 标识 */ + id: string; + + /** 状态机元数据编号 */ + code: string; + + /** 状态机元数据名称 */ + name: string; + + /** 状态机元数据id */ + uri: string; + + /** 状态机元数据命名空间 */ + nameSpace?: string; +} + +/** + * 表达式配置 + */ +export interface FormExpressionConfig { + id: string; + + /** + * 表达式类型 + */ + type: string; + + /** + * 表达式配置值 + */ + value: string; + + /** + * 提示消息 + */ + message?: string; + + /** + * 提示消息类型 + */ + messageType?: string; + +} + +/** +* 表达式配置 +*/ +export interface FormExpression { + fieldId: string; + + /** 其实存的是componentId */ + viewModelId?: string; + + expression: Array; + + // 配置表达式的控件类型,字段类为'Field',按钮类为'Button' + sourceType?: string; +} + +/** + * Item类型数据 + */ +export interface ItemData { + value: string; + + name: string; +} + +/** + * 构件 + */ +export interface FormWebCmd { + id: string; + + code?: string; + + path: string; + + name: string; + + nameSpace?: string; + + /** 命令的引用: host:视图模型中命令的id;handler:构件中命令的编号 */ + refedHandlers?: Array<{ host: string; handler: string }>; + +} + +/** + * Component节点 + */ +export interface FormComponent { + id: string; + + type: string; + + /** + * 组件对应的ViewModel ID + */ + viewModel: string; + + /** + * 组件类型 + */ + componentType: ComponentType | any; + + /** + * 组件内容 + */ + contents: any[]; + + /** + * 初始化事件 + */ + onInit?: string; + + /** + * 视图加载后事件 + */ + afterViewInit?: string; + + /** + * 组件展示类型:弹出式(modal,目前用于子表弹出卡片式编辑的场景) + */ + showType?: string; + + /** 标记删除 */ + fakeDel?: boolean; + + /** 移动自定义样式 */ + customClass?: string; + + code?: string; + name?: string; +} + +/** + * DOM 控件binding实体 + */ +export interface FormBinding { + type: FormBindingType; + + path: string; + + field: string; + + fullPath: string; + + // 目前附件上传组件记录bindingPath + bindingPath?: string; +} + diff --git a/packages/mobile-designer/src/components/types/command.ts b/packages/mobile-designer/src/components/types/command.ts new file mode 100644 index 0000000000000000000000000000000000000000..28997a8d36bd8f5aefe66923b15b739220612e5a --- /dev/null +++ b/packages/mobile-designer/src/components/types/command.ts @@ -0,0 +1,55 @@ +import { WebCommand } from "../components/view-model-designer/method-manager/entity/web-command"; +import { Ref } from "vue"; +export interface UseFormCommandService { + checkCommands: () => Promise; + commandsChanged: (newController) => void; + generateInternalCommandList: () => any; + viewModelDisplay: () => Array; + findParamtersPosition: (propertyData: any, events: any, viewModelId: string, allComponentList: any) => Array; + addControllerMethod: (propertyData: any, viewModelId: string, parameters: any) => void; + viewModelDomChanged: (propertyData: any, events: any, viewModelId: string, domActions: any) => void; + getCommands: () => any; + bindNewMethodToControl: (methodCode: string, methodName: string) => void; + getInternalControllerFromControllerMetadata: (controller: any, code: string, nameSpace: string) => any; + getSupportedControllerMetadata: (controller: any) => Promise; +} +export interface UseCommandBuilderService { + addControllerMethod: (methodCode: string, methodName: string) => void; + addWebCommandMethod: (command: WebCommand, targetWebCmd?: { controllerCode: string, controllerName: string }) => void; + eventBetweenDesignerAndCodeView: Ref<{ eventName: string, eventValue: any }>; + getBuildInfo: () => any; +} + +/** 构件操作参数 */ +export declare class Parameter { + Id: string; + Code: string; + Name: string; + Description: string; + ParameterType: string; + IsRetVal: boolean; +} +/** 构件操作 */ +export declare class Operation { + Id: string; + Code: string; + Name: string; + Description: string; + Parameters: Array; +} +/** + * Web构件元数据 + */ +export declare class WebComponentMetadata { + Id: string; + Code: string; + Description: string; + Source: string; + Operations: Array; + IsCommon: boolean; + ClassName: string; + FormCode: string; + PackageName: string; + PackageVersion: string; + Version: number; +} diff --git a/packages/mobile-designer/src/components/types/const.ts b/packages/mobile-designer/src/components/types/const.ts new file mode 100644 index 0000000000000000000000000000000000000000..b93e2742fb3dfa4cbf021eb5f1fc1689ee3c24b1 --- /dev/null +++ b/packages/mobile-designer/src/components/types/const.ts @@ -0,0 +1,32 @@ +/** + * 支持的变量类型 + */ +export const FormVariableTypes = [ + { text: '字符串', value: 'String' }, + { text: '数字', value: 'Number' }, + { text: '布尔', value: 'Boolean' }, + { text: '日期', value: 'Date' }, + { text: '日期时间', value: 'DateTime' }, + { text: '文本', value: 'Text' }, + { text: '对象', value: 'Object' }, + { text: '数组', value: 'Array' } +]; + +export const MetadataServiceToken = 'Meatdata_Http_Service_Token'; +export const MetadataPathToken = 'Metadata_Path_Token'; + + +/** + * schema字段的类型名称(国际化) + */ +export const EntityFieldTypeDisplayNamei18n = { + String: '字符串', + Number: '数字', + BigNumber: '大数字', + Boolean: '布尔', + Date: '日期', + DateTime: '日期时间', + Text: '文本', + Enum: '枚举', + MultiLanguage: '多语言' +}; diff --git a/packages/mobile-designer/src/components/types/design-viewmodel.ts b/packages/mobile-designer/src/components/types/design-viewmodel.ts new file mode 100644 index 0000000000000000000000000000000000000000..401ddf74b8e38b26aae312fbf1f9d479845810fb --- /dev/null +++ b/packages/mobile-designer/src/components/types/design-viewmodel.ts @@ -0,0 +1,158 @@ +import { mergeWith } from "lodash-es"; +import { FormSchemaEntityField } from "./entity-schema"; +import { UseFormSchema } from "./metadata"; +import { FormBindingType } from "./enums"; + +export interface DesignViewModelField extends FormSchemaEntityField { + valueChanging: string; + valueChanged: string; + groupId: string; + groupName: string; + /** 标识字段在schema中是否已移除 */ + isSchemaRemoved?: boolean; + /** 字段更新时机 */ + updateOn?: string; + /** 字段的类型名称(国际化) */ + displayTypeNamei18n?: string; +} + +// 设计器内部使用 +// 在DesignViewModel中存储一份完整的字段信息。而DOM.viewModel只存储增量的部分(即viewmodel.fieldSchema) +// DesignViewModel中不会存储所有的schema字段,只存储已绑定控件的字段(字段与DOM.viewModel一一对应) +export class DesignViewModel { + public id: string; + public fields: DesignViewModelField[]; + + constructor(viewModelId: string, elements: DesignViewModelField[], private domService: UseFormSchema) { + this.id = viewModelId; + this.fields = elements; + } + + + public addField(element: DesignViewModelField) { + this.fields.push(element); + + // 指定updateOn属性,下拉列表和checkbox是change,其他blur + let updateOn = 'blur'; + const type = element.type.name; + if (type === 'Enum' || type === 'Boolean') { + updateOn = 'change'; + } + + // 为了添加字段之后立马能显示更新时机 + element.updateOn = updateOn; + + // 更改DOM ViewModel节点 + const vm = { + type: FormBindingType.Form, + id: element.id, + fieldName: element.bindingField, + groupId: element.groupId || '', + groupName: element.groupName || '', + valueChanging: element.valueChanging || '', + valueChanged: element.valueChanged || '', + updateOn, + fieldSchema: {} + }; + + this.domService.addViewModelField(this.id, vm); + } + public removeField(fieldIdList: string[]) { + if (!fieldIdList || fieldIdList.length === 0) { + return; + } + this.fields = this.fields.filter(f => !fieldIdList.includes(f.id)); + + // 更改DOM ViewModel节点 + fieldIdList.forEach(fieldId => { + this.domService.deleteViewModelFieldById(this.id, fieldId); + }); + } + + /** + * 更改字段属性 + * @param fieldId 字段ID + * @param changeObject 变更集 + * @param isMerge 是否将变更集合并到字段上,若配置为false,则直接替换对象对象 + */ + public changeField(fieldId: string, changeObject, isMerge = true) { + const field = this.fields.find(f => f.id === fieldId); + if (!field || !changeObject) { + return; + } + // 数组类型不再合并,全量替换:用户枚举数据的更改 + function customizer(objValue, srcValue) { + if (!isMerge) { + return srcValue; + } else if (Array.isArray(objValue)) { + return srcValue; + } + } + mergeWith(field, changeObject, customizer); + + // 更改DOM ViewModel节点 + const { valueChanging, valueChanged, groupId, groupName, updateOn, isSchemaRemoved, ...fieldChange } = changeObject; + const vmChangeSet = {}; + if (fieldChange && Object.keys(fieldChange).length > 0) { + vmChangeSet['fieldSchema'] = fieldChange; + } + if (Object.keys(changeObject).includes('valueChanging')) { + vmChangeSet['valueChanging'] = valueChanging; + } + if (Object.keys(changeObject).includes('valueChanged')) { + vmChangeSet['valueChanged'] = valueChanged; + } + if (Object.keys(changeObject).includes('groupId')) { + vmChangeSet['groupId'] = groupId; + } + if (Object.keys(changeObject).includes('groupName')) { + vmChangeSet['groupName'] = groupName; + } + if (Object.keys(changeObject).includes('updateOn')) { + vmChangeSet['updateOn'] = updateOn; + } + + this.domService.modifyViewModelFieldById(this.id, fieldId, vmChangeSet, isMerge); + } + + /** + * 修改分组 + * @param groupId + * @param groupName + */ + public changeGroupName(groupId: string, groupName: string) { + const fields = this.fields.filter(f => f.groupId === groupId); + fields.map(field => { + this.changeField(field.id, { groupName }); + }); + + } + + /** + * 由schema字段替换dgViewModel中的字段信息,并清空VM中的字段增量 + * (目前用于schema更新时字段类型发生变更的场景) + * @param schemaField + * @param dgField + */ + public clearFieldChange(schemaField: FormSchemaEntityField, dgField: DesignViewModelField) { + Object.assign(dgField, schemaField); + + this.domService.clearViewModelFieldSchema(this.id, dgField.id); + } +} +export interface DesignViewModelField extends FormSchemaEntityField { + valueChanging?: string; + valueChanged?: string; + + groupId?: string; + groupName?: string; + + /** 标识字段在schema中是否已移除 */ + isSchemaRemoved?: boolean; + + /** 字段更新时机 */ + updateOn?: string; + + /** 字段的类型名称(国际化) */ + displayTypeNamei18n?: string; +} diff --git a/packages/mobile-designer/src/components/types/entity-schema.ts b/packages/mobile-designer/src/components/types/entity-schema.ts new file mode 100644 index 0000000000000000000000000000000000000000..a89a70f7dccc4b7952d3851e214897b85ff3fbac --- /dev/null +++ b/packages/mobile-designer/src/components/types/entity-schema.ts @@ -0,0 +1,159 @@ +/* eslint-disable no-use-before-define */ + +import { + FormSchemaEntityField$Type, + FormSchemaEntityFieldElementType, + FormSchemaEntityFieldType$Type, + FormSchemaEntityFieldTypeName +} from "./enums"; + +/** + * 枚举类型 + */ +export interface EnumData { + value: string; + + name: string; +} + +/** + * 字段类型对象 + */ +export declare class FormSchemaEntityFieldType { + $type: FormSchemaEntityFieldType$Type; + + name: FormSchemaEntityFieldTypeName | any; + + length?: number; + + precision?: number; + + valueType?: FormSchemaEntityFieldType; + + enumValues?: EnumData[]; + + fields?: FormSchemaEntityField[]; + + displayName?: string; + + primary?: string; + + entities?: FormSchemaEntity[]; + + // 用于区分日期/日期事件和整型/浮点型数据 + elementType?: FormSchemaEntityFieldElementType; + + // 扩展属性: 运行时定制用 + extendProperty?: any; +} + +/** + * 字段编辑器对象 + */ +export interface FormSchemaEntityFieldEditor { + $type: string; + + [propName: string]: any; +} + +/** + * 字段 + */ +export interface FormSchemaEntityField { + $type: FormSchemaEntityField$Type; + + id: string; + + originalId: string; + + code: string; + + label: string; + + bindingField: string; + + name: string; + + defaultValue?: any; + + require?: boolean; + + readonly?: boolean; + + type: FormSchemaEntityFieldType; + + editor?: FormSchemaEntityFieldEditor; + + path?: string; + + bindingPath?: string; + + multiLanguage?: boolean; + + // 表达式 + expression?: any; +} + +/** + * 实体类型对象 + */ +export interface FormSchemaEntityType { + $type: string; + + name: string; + + primary: string; + + fields: FormSchemaEntityField[]; + + entities?: FormSchemaEntity[]; + + displayName?: string; +} + +/** + * 实体 + */ +export interface FormSchemaEntity { + id: string; + + code: string; + + name: string; + + label: string; + + type: FormSchemaEntityType; +} + +/** + * schema + */ +export interface FormSchema { + // public dataSource: string; + sourceUri: string; + + id: string; + + code: string; + + name: string; + + entities: FormSchemaEntity[]; + + variables: FormSchemaEntityField[]; + + eapiId: string; + + extendProperties: { enableStdTimeFormat: boolean }; + + eapiCode?: string; + + eapiName?: string; + + eapiNameSpace?: string; + + voPath?: string; + + voNameSpace?: string; +} diff --git a/packages/mobile-designer/src/components/types/enums.ts b/packages/mobile-designer/src/components/types/enums.ts new file mode 100644 index 0000000000000000000000000000000000000000..0cb59767d0ec00bf3f1da1f5a615f192473c25b2 --- /dev/null +++ b/packages/mobile-designer/src/components/types/enums.ts @@ -0,0 +1,231 @@ +/** + * 字段类型枚举 + */ +export enum FormSchemaEntityField$Type { + /** + * 简单类型字段 + */ + SimpleField = 'SimpleField', + /** + * 关联/UDT类型字段 + */ + ComplexField = 'ComplexField' +} + +/** + * 字段类型对象中的类型枚举 + */ +export enum FormSchemaEntityFieldType$Type { + + /** + * 字符串 + */ + StringType = 'StringType', + /** + * 备注 + */ + TextType = 'TextType', + /** + * 数字(整数、浮点数) + */ + NumericType = 'NumericType', + /** + * 布尔 + */ + BooleanType = 'BooleanType', + /** + * 日期 + */ + DateType = 'DateType', + + /** + * 日期时间 + */ + DateTimeType = 'DateTimeType', + + /** + * 枚举 + */ + EnumType = 'EnumType', + /** + * 实体类 + */ + EntityType = 'EntityType', + + /** + * 分级码 + */ + HierarchyType = 'HierarchyType', + + /** + * 对象 + */ + ObjectType = 'ObjectType', + + /** + * 数字(大数据) + */ + BigNumericType = 'BigNumericType' +} + +/** + * 字段类型中的名称 + */ +export enum FormSchemaEntityFieldTypeName { + /** + * 简单类型字段 + */ + String = 'String', + /** + * 日期时间 + */ + DateTime = 'DateTime', + /** + * 日期 + */ + Date = 'Date', + /** + * 枚举 + */ + Enum = 'Enum', + /** + * 布尔 + */ + Boolean = 'Boolean', + + /** + * 数字 + */ + Number = 'Number', + + /** + * 备注 + */ + Text = 'Text', + + /** + * 大数字 + */ + BigNumber = 'BigNumber' + /** + * 人员 + */ +} +/** + * 字段数据类型 + */ +export enum FormSchemaEntityFieldElementType { + /** + * 文本 + */ + String = "String", + /** + * 备注 + */ + Text = "Text", + /** + * 整数 + */ + Integer = "Integer", + /** + * 浮点数 + */ + Decimal = "Decimal", + /** + * 布尔型 + */ + Boolean = "Boolean", + /** + * 日期型 + */ + Date = "Date", + /** + * 日期时间型 + */ + DateTime = "DateTime", + /** + * 二进制 + */ + Binary = "Binary" +} + +/** + * 组件类型 + */ +export enum ComponentType { + /** + * 表单 + */ + Frame = 'frame', + + /** + * 列表/树表类 + */ + dataGrid = 'data-grid', + + /** + * 列表视图 + */ + listView = 'list-view', + + /** + * 卡片类(待优化,目前类型中带有控件列布局信息) + */ + form = 'form', + + /** + * 附件 + */ + uploader = 'uploader', + + /** + * 子表弹出编辑后创建的模态框组件---运行态是动态创建的 + */ + modalFrame = 'modal-frame', + + /** 表格类 */ + table = 'table', + + /** 预约日历 */ + appointmentCalendar = 'appointment-calendar' +} + +/** + * 变量类型 + */ +export enum FormVariableCategory { + locale = 'locale', + remote = 'remote' +} + +/** + * binding 类型 + */ +export enum FormBindingType { + Form = 'Form', + Variable = 'Variable' +} + +/** + * DOM GridField 中的数据类型 + */ +export enum GridFieldDataType { + string = 'string', + boolean = 'boolean', + date = 'date', + number = 'number', + enum = 'enum', + datetime = 'datetime' +} + +/** + * 配置表达式的控件类型,Field:字段类, Button:按钮类,容器类:Container + */ +export enum FormExpressionSourceType { + /** 输入控件类,包括卡片控件和列表 */ + Field = 'Field', + /** 按钮类,包括工具栏按钮、标签页按钮、分组面板按钮等 */ + Button = 'Button', + /** 容器类,包括普通容器、标签页、分组面板、附件等控件 */ + Container = 'Container' +} diff --git a/packages/mobile-designer/src/components/types/events-editor.ts b/packages/mobile-designer/src/components/types/events-editor.ts new file mode 100644 index 0000000000000000000000000000000000000000..029667c4aff4f65d5c850d22a04cf1219a74a404 --- /dev/null +++ b/packages/mobile-designer/src/components/types/events-editor.ts @@ -0,0 +1,105 @@ +export interface EventsEditorMapItem { + event: { + label: string | undefined, + name: string | undefined, + }, + command: { + id: string, + label: string, + name: string, + handlerName: string, + params?: any, + showTargetComponent?: boolean; + targetComponentId?: string; + isNewGenerated?: boolean, + isRTCmd?: boolean, + isInvalid: boolean + }, + controller: { + id: string, + label: string, + name: string, + }, + targetComponent: { + id: string, + viewModelId: string, + } +} + +export interface EventsEditorActions { + sourceComponent: { + id: string, + viewModelId: string, + map: EventsEditorMapItem[], + }, + path?: string +}; + +export interface ControllerListItem { + label: string, + name: string, + id: string, + handlerName: string, + /** 当前命令需要选择目标组件*/ + showTargetComponent: boolean, + cmpId: string, + componentLists: any, + targetComponent: any, + isNewGenerated: any, + isInvalid: boolean, + property: any, + isRTCmd?: boolean, +} + +export interface UseEventsEditorUtils { + formProperties: (eventEditorService, formBasicService, domService, webCmdService, propertyData, viewModelId, eventList, switchEvents?: (propertyData, eventList) => object) => void; + saveRelatedParameters: (eventEditorService, domService, webCmdService, propertyData: any, viewModelId: string, eventList, parameters: any) => void; +} + +export interface Node { + id: string; + type: string; + __parentId__?: string; + contents?: Node[]; + /** + * 组件类型 + */ + componentType?: string; + [prop: string]: any; +} +export enum NodeType { + /** + * 隐藏区域 + */ + HiddenContainer = 'HiddenContainer', + /** + * 帮助控件 + */ + LookupEdit = 'LookupEdit', + /** + * 组件 + */ + Component = 'Component' +} + +export interface UseEventsEditor { + /** + * 1. 获取已绑定命令的参数值(来自actions节点) + * 2. 获取暂未绑定的命令参数值(来自viewmodel节点) + * @param savedViewModelItem + * @param controllerListItem + * @param domJson + */ + getCommandParameter: (savedViewModelItem: any, controllerListItem: ControllerListItem, domJson: any) => any; + /** + * 事件编辑器-已有方法-命令路径处理 + * @param propertyDataId 组件id + * @param viewModelId 视图模型id + * @param webCmdService + * @returns + */ + getEventPath: (propertyDataId: string, viewModelId: string) => { actionWithPath: any, viewModelDisplay: any }; + getAllComponentList: () => Array; + formTargetComponent: (boundEventItem: any, vmid: string) => void; + +} diff --git a/packages/mobile-designer/src/components/types/form-property-config.json b/packages/mobile-designer/src/components/types/form-property-config.json new file mode 100644 index 0000000000000000000000000000000000000000..c84eac0932c50bf46034cb24cca1a154646c60b1 --- /dev/null +++ b/packages/mobile-designer/src/components/types/form-property-config.json @@ -0,0 +1,27 @@ +{ + "title": "module", + "description": "表单元数据属性配置", + "type": "object", + "categories": { + "basic": { + "title": "基本信息", + "properties": { + "id": { + "title": "表单元数据标识", + "type": "string", + "readonly": true + }, + "code": { + "title": "表单元数据编号", + "type": "string", + "readonly": true + }, + "name": { + "title": "表单元数据名称", + "type": "string", + "readonly": true + } + } + } + } +} \ No newline at end of file diff --git a/packages/mobile-designer/src/components/types/index.ts b/packages/mobile-designer/src/components/types/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..9cd2da88a1a3de6c9324240652ea6804857643cc --- /dev/null +++ b/packages/mobile-designer/src/components/types/index.ts @@ -0,0 +1,6 @@ +export * from './basic'; +export * from './const'; +export * from './entity-schema'; +export * from './enums'; +export * from './metadata'; +export * from './view-model'; diff --git a/packages/mobile-designer/src/components/types/metadata.ts b/packages/mobile-designer/src/components/types/metadata.ts new file mode 100644 index 0000000000000000000000000000000000000000..64e1dd5dcfde7b3565694683c376939dee2e422a --- /dev/null +++ b/packages/mobile-designer/src/components/types/metadata.ts @@ -0,0 +1,260 @@ +import { FormComponent, FormExpression, FormStateMachine, FormWebCmd } from "./basic"; +import { DesignViewModel } from "./design-viewmodel"; +import { FormSchema, FormSchemaEntityField } from "./entity-schema"; +import { FormVariable, FormViewModel, FormViewModelField } from "./view-model"; + +export interface FormOptions { + /** + * 启用静态文本 + */ + enableTextArea?: boolean; + + publishFormProcess?: boolean; + + /** + * 界面渲染模式:编译(生成代码并编译),动态渲染(动态解析,本地不生成代码,不编译) + */ + renderMode?: 'compile' | 'dynamic'; + + /** 变更集提交策略 */ + changeSetPolicy?: 'entire' | 'valid'; + + /** 启用服务器端变更检测:菜单或应用关闭前调用后端接口确认后端缓存中的数据是否已经保存并提示用户 */ + enableServerSideChangeDetection?: boolean; + + /** 生成表单代码时将之前的源码都删除 */ + enableDeleteSourceCode?: boolean; + + /** 表单是否可以被组合 */ + canBeComposed?: boolean; + + /** 表单是否启用业务流 */ + enableAif?: boolean; + + /** 表单是否启用数据类型转换 */ + paramTypeTransform?: boolean; +} + +export interface FormMetaDataModule { + id: string; + + code: string; + + name: string; + + caption: string; + + type: string; + + creator: string; + + creationDate: Date; + + updateVersion: string; + + // 实体 + entity: Array; + + // 状态机 + stateMachines: Array; + + // 视图模型 + viewmodels: Array; + + // 源组件-事件-命令-目标组件的映射关系 + actions: Array; + + // 组件 + components: Array; + + // 构件 + webcmds: Array; + + serviceRefs: Array; + + // 表单所属模板 + templateId: string; + + // 表单模板对应的拖拽控制规则 + templateRule?: string; + + // 是否组合表单 + isComposedFrm: boolean; + + // 表单所在的工程名 + projectName: string; + + // 自定义样式 + customClass: any; + + // 外部模块声明 + extraImports: Array<{ name: string; path: string }>; + + /** 表达式配置 */ + expressions: FormExpression[]; + + // 当前表单的展示形式:modal|page|sidebar + showType?: string; + + // 页面级按钮配置(目前用于Header和ModalFooter组件内部的工具栏按钮) + toolbar: { + items: { [viewModelId: string]: any }; + configs: { modal?: any; page?: any; sidebar?: any }; + }; + + qdpInfo: any; + + /** 表单元数据id */ + metadataId?: string; + +} + +export interface FormMetadaDataDom { + + module: FormMetaDataModule; + + options?: FormOptions; +} + +export interface MetadataDto { + id: string; + + nameSpace: string; + + code: string; + + name: string; + + fileName: string; + + type: string; + + bizobjectID: string; + + relativePath: string; + + extendProperty: string; + + content: string; + + extendable: boolean; + + properties: { framework: string, [propsName: string]: any } + + nameLanguage: any; +} +export interface UseFormMetadata { + /** 查询表单元数据 */ + queryMetadata: () => Promise; + /** 保存表单元数据 */ + saveFormMetadata: () => Promise; + /** 查询表单模板的拖拽控制规则 */ + queryFormTemplateRule: (module: any) => Promise; + /** 发布表单 */ + publishFormMetadata: () => Promise<{ result: boolean, error?: string }>; + /** 部署表单 */ + deployFrontFile: (metadataId: string, path: string) => Promise +} +export interface UseFormSchema { + + /** 表单元数据基础信息(外层结构) */ + getFormMetadataBasicInfo: () => MetadataDto; + + setFormMetadataBasicInfo: (newMetadata: MetadataDto) => void; + + /** 获取表单元数据 */ + getFormSchema: () => FormMetadaDataDom; + + getSchemas: () => FormSchema | undefined; + + setFormSchema: (newSchema: FormMetadaDataDom) => void; + + /** 根据Comonent id 获取组件节点*/ + getComponentById: (targetComponentId: string) => FormComponent | undefined; + + /** 根据viewmodel id 获取组件节点*/ + getComponentByViewModelId: (targetViewModelId: string) => FormComponent | undefined; + + /** 获取页面模型版本 */ + getUpdateVersion: () => string; + + /** 根据viewmodel id获取模型节点 */ + getViewModelById: (targetViewModelId: string) => FormViewModel | undefined; + + /** + * 根据指定条件获取元数据的节点 + * @param rootNode 根节点 + * @param predict 预设的判断逻辑 + */ + selectNode: (rootNode: any, predict: (item: any) => boolean) => any; + + /** + * 根据指定条件获取元数据的节点以及其父节点 + * @param rootNode 根节点 + * @param predict 预设的判断逻辑 + * @param parentNode 初始父节点 + */ + + selectNodeAndParentNode: (rootNode: any, predict: (item: any) => boolean, parentNode: any) => { node: any; parentNode: any } | undefined; + + getControlBasicInfoMap: () => Map; + /** + * 返回命令 + * @returns + */ + getCommands: () => FormWebCmd[]; + setCommands: (value: Array) => void; + getViewModels: () => FormViewModel[]; + getComponents: () => FormComponent[]; + setViewmodels: (value: any) => void; + getModule: () => FormMetaDataModule; + getViewModelIdByComponentId: (componentId: string) => string; + deleteViewModelById: (componentId: string) => void; + addViewModelField: (viewModelId, filedObject: FormViewModelField) => void; + deleteViewModelFieldById: (viewModelId: string, fieldId: string) => void; + clearViewModelFieldSchema: (viewModelId, fieldId) => void; + modifyViewModelFieldById: (viewModelId, fieldId, changeObject, isMerge: boolean) => void; + getControlClassByFormUnifiedLayout: (controlClass: string, componentId: string, formNode: any) => string; + setFormTemplateRule: (rules: any) => void; + getFormTemplateRule: () => any; + getLocaleVariablesByViewModelId: (viewModelId: string) => any; + getRemoteVariables: () => any; + getFieldsByViewModelId: (viewModelId: string) => FormSchemaEntityField[] | undefined; + getExpressions: () => FormExpression[]; + setExpressions: (value: FormExpression[]) => void; + deleteComponent: (componentId: string) => void; + getControlsInCmpWidthBinding: (viewModelId: string, fieldId: string) => any; + getVariableById: (variableId: string) => FormVariable | undefined; + + getComponetsByPredicate(predicate: (component) => boolean); +} + +export interface UseSchemaService { + convertViewObjectToEntitySchema: (viewObjectId: string, sessionId: string) => Promise; + getFieldByIDAndVMID: (id: string, viewModelId: string) => { + schemaField: FormSchemaEntityField, isRefElement: boolean, refElementLabelPath: string + } | undefined; + getTableInfoByViewModelId(viewModelId: string): { id: string, code: string, name: string, label: string, type } | undefined; + getFieldsByViewModelId: (viewModelId: string) => FormSchemaEntityField[]; +} +export interface UseDesignViewModel { + assembleDesignViewModel: () => void; + getAllFields2TreeByVMId: (viewModelId: string) => any[]; + getDgViewModel: (viewModelId: string) => DesignViewModel | null; + deleteViewModelById: (viewModelId: string) => void; + getDgViewModels: () => any[] +} +export interface UseControlCreator { + setFormFieldProperty: (field: FormSchemaEntityField, editorType: string, controlClass: string) => any; + setGridFieldProperty: (gridType: string, field: FormSchemaEntityField, metadata: any, needInlineEditor: false) => any; + createFormGroupWithoutField: (editorType: string, controlClass: string) => any; +} + +export interface UseFormStateMachine { + /** 请求获取状态机元数据 */ + queryStateMachineMetadata: () => void; + /** 获取状态机元数据 */ + getStateMachineMetadata: () => any; + /** 获取状态机元数据中的可视化状态 */ + getRenderStates: (value: any) => any[]; +} diff --git a/packages/mobile-designer/src/components/types/view-model.ts b/packages/mobile-designer/src/components/types/view-model.ts new file mode 100644 index 0000000000000000000000000000000000000000..ff51ab2dae8f30442228c13e350e0d4b1b86c4d5 --- /dev/null +++ b/packages/mobile-designer/src/components/types/view-model.ts @@ -0,0 +1,101 @@ +import { FormVariableCategory } from "./enums"; + +/** + * dom Json ViewModel 节点中fields实体 + */ +export interface FormViewModelField { + type: string; + + id: string; + + // 字段bindingField + fieldName: string; + + // 分组 + groupId: string; + + groupName: string; + + // 字段变更增量 + fieldSchema?: any; + + // 字段变化前后事件 + valueChanging?: string; + + valueChanged?: string; + + // 更新时机 + updateOn?: string; +} + +/** + * dom Json ViewModel 节点中states实体 + */ +export interface FormVariable { + id: string; + + code: string; + + name: string; + + value?: any; + + type: string; + + category: FormVariableCategory; + + fields?: any[]; +} + +/** + * vm 分页配置 + */ +export interface FormViewModelPagination { + enable: boolean; + + pageList?: string; + + pageSize?: number; +} + +/** + * dom Json ViewModel 节点实体 + */ +export interface FormViewModel { + id: string; + + code: string; + + name: string; + + fields: FormViewModelField[]; + + commands: any[]; + + states: FormVariable[]; + + serviceRefs: any[]; + + bindTo: string; + + parent?: string; + + enableUnifiedSession?: boolean; + + pagination?: FormViewModelPagination; + + stateMachine?: string; + + fakeDel?: boolean; + + /** 启用校验 */ + enableValidation?: boolean; + + /** 实体数据是否允许为空 */ + allowEmpty?: boolean; + + /** 针对子表弹出编辑器区域内的组件,记录所属的弹窗根组件 */ + parentModalViewModel?: string; + +} + diff --git a/packages/mobile-designer/src/main.ts b/packages/mobile-designer/src/main.ts new file mode 100644 index 0000000000000000000000000000000000000000..275ddbef0192c1864d9fc673df82f6dcd82b54d7 --- /dev/null +++ b/packages/mobile-designer/src/main.ts @@ -0,0 +1,7 @@ +import { createApp } from 'vue'; +import './style.css'; +import App from './app.vue'; +import Designer from './components/index'; + +import Providers from './app-providers'; +createApp(App).use(Designer).use(Providers).mount('#app'); diff --git a/packages/mobile-designer/src/style.css b/packages/mobile-designer/src/style.css new file mode 100644 index 0000000000000000000000000000000000000000..870aa5c283153eaef4deda25195eaacf23aad319 --- /dev/null +++ b/packages/mobile-designer/src/style.css @@ -0,0 +1,50 @@ +.plugin-frame{ + display: none; + height: 100%; +} +.plugin-frame.active { + display: block; +} + +.form-designer-view .editorDiv .editorPanel.PC { + min-width: 414px; + width: 414px; + margin: 20px auto; + height: calc(100% - 40px); + } + + .fm-page-container .drag-container { + display: inherit; + flex-direction: inherit; + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0%; + flex-wrap: inherit; + justify-content: inherit; + align-items: inherit; + width: 100%; + overflow: inherit; + } + + + .fm-form .farris-component.can-move { + padding: 0px !important; + } + + .fm-input-wrapper:not(:last-child) .fm-cell:not(.fm-no-hairline)::after, + .fm-form-item-wrapper:not(:last-child):not(.fm-no-hairline)::after, + .fm-form-designer-item-wrapper:not(:last-child) .fm-form-item-wrapper:not(.fm-no-hairline)::after { + transform: scaleY(.5); + } + + .z-index-9 { + z-index: 9; + } + .z-index-99 { + z-index: 99; + } + .z-index-999 { + z-index: 999; + } + + \ No newline at end of file diff --git a/packages/mobile-designer/src/vite-env.d.ts b/packages/mobile-designer/src/vite-env.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..e38e5224b9b4ebb6d55d79ea78a8aefe51460ad6 --- /dev/null +++ b/packages/mobile-designer/src/vite-env.d.ts @@ -0,0 +1 @@ +// diff --git a/packages/mobile-designer/tsconfig.json b/packages/mobile-designer/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..e85f151aa8716087b44f419676f84c3bc7aa2ee6 --- /dev/null +++ b/packages/mobile-designer/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "node", + "strict": true, + "jsx": "preserve", + "noImplicitAny": false, + "sourceMap": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ESNext", "DOM", "dom.iterable", "scripthost"], + "skipLibCheck": true, + "importHelpers": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "types": ["vitest/globals", "@types/jest"], + "baseUrl": "./", + "paths": {} + }, + "include": ["components/**/*", "src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue", "designer/**/*", "../mobile-ui-vue/components/designer-canvas/src/composition/function/drag-resolve.tsx"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/packages/mobile-designer/tsconfig.node.json b/packages/mobile-designer/tsconfig.node.json new file mode 100644 index 0000000000000000000000000000000000000000..2e16c8174ae2181e4ac162a7635a17b799e31a2f --- /dev/null +++ b/packages/mobile-designer/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + // "strict": true, + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["vite.config.dev.ts"] +} diff --git a/packages/mobile-designer/vite.config.build.ts b/packages/mobile-designer/vite.config.build.ts new file mode 100644 index 0000000000000000000000000000000000000000..87d9a18e9464efc586d37c10281f63536f04e1dc --- /dev/null +++ b/packages/mobile-designer/vite.config.build.ts @@ -0,0 +1,6 @@ +import { defineConfig } from 'vite'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [] +}); diff --git a/packages/mobile-designer/vite.config.dev.ts b/packages/mobile-designer/vite.config.dev.ts new file mode 100644 index 0000000000000000000000000000000000000000..b3d0238a22b70ca54335bd10907a3d09abd14e9a --- /dev/null +++ b/packages/mobile-designer/vite.config.dev.ts @@ -0,0 +1,29 @@ +import { defineConfig } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import vueJsx from '@vitejs/plugin-vue-jsx'; +import { resolve } from 'path'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue(), vueJsx()], + server: { + proxy: { + "/api": { + target: "http://localhost:5200", + changeOrigin: true, + secure: false + } + } + }, + resolve: { + alias: { + '@farris/ui-vue': resolve(__dirname, '../ui-vue'), + '@farris/mobile-ui-vue': resolve(__dirname, '../mobile-ui-vue'), + '@components': resolve(__dirname, '../mobile-ui-vue/components'), + '@/components': resolve(__dirname, '../mobile-ui-vue/components'), + '@': resolve(__dirname, '../') + + + } + } +}); diff --git a/packages/mobile-ui-vue/components/button/index.ts b/packages/mobile-ui-vue/components/button/index.ts index f211334c44a81f9e4d6973884cb92e493dc2e5e4..2c5790ae8607ce0106d3836d147cc3df225c6ac1 100644 --- a/packages/mobile-ui-vue/components/button/index.ts +++ b/packages/mobile-ui-vue/components/button/index.ts @@ -2,6 +2,7 @@ import { Plugin } from 'vue'; import { withInstall, } from '@components/common'; import ButtonInstallless from './src/button.component'; import { propsResolver } from './src/button.props'; +import ButtonDesign from './src/designer/button.design.component'; const BUTTON_REGISTERED_NAME = 'button'; @@ -14,5 +15,14 @@ Button.register = ( propsResolverMap[BUTTON_REGISTERED_NAME] = propsResolver; }; +Button.registerDesigner = ( + componentMap: Record, propsResolverMap: Record, + configResolverMap: Record, resolverMap: Record +) => { + componentMap[BUTTON_REGISTERED_NAME] = ButtonDesign; + propsResolverMap[BUTTON_REGISTERED_NAME] = propsResolver; +}; + + export { Button }; export default Button as typeof Button & Plugin; diff --git a/packages/mobile-ui-vue/components/button/src/designer/button.design.component.tsx b/packages/mobile-ui-vue/components/button/src/designer/button.design.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..2e886c10725d5ee2f465e40cfd909a6084a169b7 --- /dev/null +++ b/packages/mobile-ui-vue/components/button/src/designer/button.design.component.tsx @@ -0,0 +1,58 @@ +/* eslint-disable no-use-before-define */ +/** + * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { computed, defineComponent, inject, onMounted, ref, SetupContext } from 'vue'; +import { ButtonProps, buttonProps } from '../button.props'; +import Button from '../..'; +import { DesignerHostService, DesignerItemContext, useDesignerComponent } from '@/components/designer-canvas';; +import { useDesignerRules } from './use-designer-rules'; + +export default defineComponent({ + name: 'FmButtonDesign', + props: buttonProps, + emits: ['click'], + setup(props: ButtonProps, context: SetupContext) { + const elementRef = ref(); + const designerHostService = inject('designer-host-service'); + const designItemContext = inject('design-item-context') as DesignerItemContext; + const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); + const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); + + onMounted(() => { + elementRef.value.componentInstance = componentInstance; + }); + + context.expose(componentInstance.value); + + const{ schema } = componentInstance.value; + + const inputProps = computed(() => ({ + ...props, + })); + + return () => { + return ( + schema.text ? + + : + + ); + }; + } +}); diff --git a/packages/mobile-ui-vue/components/button/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/button/src/designer/use-designer-rules.ts new file mode 100644 index 0000000000000000000000000000000000000000..57b56ec4c0d3743423ed918b539b5e468d2a9911 --- /dev/null +++ b/packages/mobile-ui-vue/components/button/src/designer/use-designer-rules.ts @@ -0,0 +1,57 @@ +import { ref } from "vue"; +import { ButtonProperty } from "../property-config/button.property-config"; +import { DesignerHostService, DesignerItemContext, UseDesignerRules } from "@/components/designer-canvas"; +import { DraggingResolveContext } from "@/components/designer-canvas/src/composition/types"; + +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { + + const triggerBelongedComponentToMoveWhenMoved = ref(false); + + const triggerBelongedComponentToDeleteWhenDeleted = ref(false); + + function canAccepts(draggingContext: DraggingResolveContext): boolean { + + return false; + } + + + function checkCanMoveComponent() { + return true; + } + function checkCanDeleteComponent() { + return true; + } + + function hideNestedPaddingInDesginerView() { + return true; + } + + function getStyles(): string { + return ' '; + } + + function getDesignerClass(): string { + return ' '; + } + + /** + * 获取属性配置 + */ + function getPropsConfig(componentId: string) { + const componentProp = new ButtonProperty(componentId, designerHostService); + const { schema } = designItemContext; + return componentProp.getPropertyConfig(schema); + } + + return { + canAccepts, + triggerBelongedComponentToMoveWhenMoved, + triggerBelongedComponentToDeleteWhenDeleted, + checkCanMoveComponent, + checkCanDeleteComponent, + hideNestedPaddingInDesginerView, + getStyles, + getDesignerClass, + getPropsConfig + }; +} diff --git a/packages/mobile-ui-vue/components/button/src/property-config/button.property-config.ts b/packages/mobile-ui-vue/components/button/src/property-config/button.property-config.ts new file mode 100644 index 0000000000000000000000000000000000000000..cf3fd87a76992244b8fe22ad3ad255e02aa074da --- /dev/null +++ b/packages/mobile-ui-vue/components/button/src/property-config/button.property-config.ts @@ -0,0 +1,51 @@ +import { BaseControlProperty } from "@/components/property-panel"; + +export class ButtonProperty extends BaseControlProperty { + constructor(componentId: string, designerHostService: any) { + super(componentId, designerHostService); + } + public getPropertyConfig(propertyData: any) { + // 基本信息 + this.propertyConfig.categories['basic'] = this.getBasicPropConfig(propertyData); + // 外观 + this.propertyConfig.categories['appearance'] = this.getAppearanceConfig(propertyData); + // 行为 + this.propertyConfig.categories['behavior'] = this.getBehaviorConfig(propertyData); + + return this.propertyConfig; + } + + private getBehaviorConfig(propertyData) { + return { + description: "基本信息", + title: "行为", + properties: { + visible: { + title: "可见", + type: "boolean", + }, + disabled: { + title: "只读", + type: "boolean", + }, + displayType: { + title: "按钮类型", + type: "string", + }, + block: { + title: "是否占满整行", + type: "boolean", + }, + round: { + title: "启用圆角", + type: "boolean", + }, + text: { + title: "提示文本", + type: "string", + } + } + }; + } + +} diff --git a/packages/mobile-ui-vue/components/button/src/schema/button.schema.json b/packages/mobile-ui-vue/components/button/src/schema/button.schema.json index 3109eabb1fb713354ad7111334c7f29e1b569731..c97693e77582a494432a896b8be0f5c0ebd0fc47 100644 --- a/packages/mobile-ui-vue/components/button/src/schema/button.schema.json +++ b/packages/mobile-ui-vue/components/button/src/schema/button.schema.json @@ -17,7 +17,7 @@ "displayType": { "description": "显示类型", "type": "string", - "default": "default" + "default": "primary" }, "icon": { "description": "图标", @@ -30,6 +30,16 @@ "default": false, "isEvent": true }, + "text": { + "description": "", + "type": "string", + "default": "按钮" + }, + "block": { + "description": "", + "type": "boolean", + "default": true + }, "appearance": { "description": "外观", "type": "object", @@ -52,6 +62,11 @@ ], "required": [ "id", - "type" + "type", + "visible", + "round", + "disabled", + "text", + "icon" ] } \ No newline at end of file diff --git a/packages/mobile-ui-vue/components/common/index.ts b/packages/mobile-ui-vue/components/common/index.ts index 279f22b74ef2ddbeab6390077ce565fd0190566a..b3b9463aea127b573630469ed8e8d8c90844503d 100644 --- a/packages/mobile-ui-vue/components/common/index.ts +++ b/packages/mobile-ui-vue/components/common/index.ts @@ -20,6 +20,7 @@ export * from './utils/resolve-field'; export * from './utils/use-guid'; export * from './entity/entity-schema'; export * from './src/utils'; +export const FM_UI_PROVIDER_SERVICE_TOKEN = Symbol('UIProviderService'); export default { install(app: App): void { diff --git a/packages/mobile-ui-vue/components/common/src/entity/input-base-property.ts b/packages/mobile-ui-vue/components/common/src/entity/input-base-property.ts index fb43a637e9a21aa0f4856b8edaedc84fbbd3eae1..e705e141babd1ad73cd0770dc49bbd56c190039b 100644 --- a/packages/mobile-ui-vue/components/common/src/entity/input-base-property.ts +++ b/packages/mobile-ui-vue/components/common/src/entity/input-base-property.ts @@ -218,15 +218,18 @@ export class InputBaseProperty extends BaseControlProperty { type: "boolean", visible: false }, - // required: { - // description: "", - // title: "必填", - // type: "boolean" - // }, + required: { + description: "", + title: "必填", + type: "boolean", + visible: false + }, placeholder: { description: "空值时,输入控件内的占位文本", title: "提示文本", - type: "string" + type: "string", + visible: false + } }, properties); diff --git a/packages/mobile-ui-vue/components/component/index.ts b/packages/mobile-ui-vue/components/component/index.ts index cba22460cb652983c81a5cd6a264cd09990eef40..bed6e3bd70cd80554f28e8804df778429f009b33 100644 --- a/packages/mobile-ui-vue/components/component/index.ts +++ b/packages/mobile-ui-vue/components/component/index.ts @@ -18,6 +18,7 @@ import type { Plugin } from 'vue'; import { withInstall } from '@components/common'; import ComponentInstallless from './src/component.component'; import { propsResolver } from './src/component.props'; +import ComponentDesign from './src/designer/component.design.component'; const COMPONENT_REGISTERED_NAME = 'component'; @@ -30,6 +31,15 @@ Component.register = ( propsResolverMap[COMPONENT_REGISTERED_NAME] = propsResolver; }; +Component.registerDesigner = ( + componentMap: Record, propsResolverMap: Record, + configResolverMap: Record, resolverMap: Record +) => { + componentMap[COMPONENT_REGISTERED_NAME] = ComponentDesign; + propsResolverMap[COMPONENT_REGISTERED_NAME] = propsResolver; +}; + + export * from './src/component.props'; export { Component }; export default Component as typeof Component & Plugin; diff --git a/packages/mobile-ui-vue/components/component/src/designer/component.design.component.tsx b/packages/mobile-ui-vue/components/component/src/designer/component.design.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..06b97e5ff2afec556b8d17838eeb90da304e77e4 --- /dev/null +++ b/packages/mobile-ui-vue/components/component/src/designer/component.design.component.tsx @@ -0,0 +1,41 @@ +import { SetupContext, defineComponent, inject, ref, onMounted, computed } from 'vue'; +import { ComponentPropsType, componentProps } from '../component.props'; +import { useDesignerRules } from './use-designer-rules'; +import { DesignerHostService, DesignerItemContext, useDesignerComponent } from '@/components/designer-canvas'; + +export default defineComponent({ + name: 'FComponetDesign', + props: componentProps, + emits: [], + setup(props: ComponentPropsType, context) { + const elementRef = ref(); + const designerHostService = inject('designer-host-service'); + const designItemContext = inject('design-item-context') as DesignerItemContext; + const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); + const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); + + const componentClass = computed(() => { + const classObject = { + 'drag-container': true + } as Record; + return classObject; + }); + onMounted(() => { + elementRef.value.componentInstance = componentInstance; + + if (designItemContext.parent?.schema?.type === 'component-ref') { + componentInstance.value.parent = designItemContext.parent?.parent?.componentInstance; + } + }); + + context.expose(componentInstance.value); + + return () => { + return ( +
+ {context.slots.default && context.slots.default()} +
+ ); + }; + } +}); diff --git a/packages/mobile-ui-vue/components/component/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/component/src/designer/use-designer-rules.ts new file mode 100644 index 0000000000000000000000000000000000000000..4759823a140fdbf6489773888f45d0d2ea2095d2 --- /dev/null +++ b/packages/mobile-ui-vue/components/component/src/designer/use-designer-rules.ts @@ -0,0 +1,123 @@ +import { DesignerHostService, DesignerItemContext, UseDesignerRules } from "@/components/designer-canvas"; +import { ComponentProperty } from "../property-config/component.property-config"; + +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { + + /** + * 判断是否可以接收拖拽新增的子级控件 + */ + function canAccepts(): boolean { + return true; + } + + function checkCanDeleteComponent() { + return false; + } + + function checkCanMoveComponent() { + return true; + } + + + function hideNestedPaddingInDesginerView() { + return false; + } + + function getStyles(): string { + return ' '; + } + + /** + * 获取属性配置 + */ + function getPropsConfig(componentId: string) { + const componentProp = new ComponentProperty(componentId, designerHostService); + const { schema } = designItemContext; + return componentProp.getPropertyConfig(schema); + } + + /** + * 删除DataGrid/Form类组件时,将父级Section或者TabPage上的相关按钮一起删除 + */ + function removeAddDeleteBtnOnParentContainer() { + const schema = designItemContext?.schema; + const formSchemaUtils = designerHostService?.formSchemaUtils; + const viewModelId = formSchemaUtils.getViewModelIdByComponentId(schema.id); + + if (schema.componentType !== 'form') { + return; + } + if (!designItemContext.componentInstance?.value.parent) { + return; + } + const parentComponentSchema = designItemContext.componentInstance?.value.parent['schema']; + if (parentComponentSchema?.toolbar?.buttons && parentComponentSchema.toolbar.buttons.length) { + parentComponentSchema.toolbar.buttons.forEach(button => { + const clickEvent = button.onClick; + // 判断三段式结构 + const clickEventPath = clickEvent && clickEvent.split('.'); + if (!clickEventPath || clickEventPath.length < 3) { + return; + } + const targetViewModelId = clickEventPath[clickEventPath.length - 2]; + + // 按钮绑定的命令若是在当前viewModel下,则将按钮标记为待删除 + if (targetViewModelId === viewModelId) { + button.needRemove = true; + } + }); + parentComponentSchema.toolbar.buttons = parentComponentSchema.toolbar.buttons.filter(button => !button.needRemove); + + // 为解决标签页画布无法更新的问题,手动触发update方法 + const parentComponentInstance = designItemContext.componentInstance?.value.parent; + if (parentComponentInstance['parent'] && parentComponentInstance['parent']['updateToolbarItems']) { + parentComponentInstance['parent']['updateToolbarItems'](); + } + } + + } + /** + * 组件删除后事件:移除viewmodel和component + */ + function removeViewModelComponent() { + const designViewModelUtils = designerHostService?.designViewModelUtils; + const formSchemaUtils = designerHostService?.formSchemaUtils; + const schema = designItemContext?.schema; + + if (designViewModelUtils && formSchemaUtils) { + const viewModelId = formSchemaUtils.getViewModelIdByComponentId(schema.id); + designViewModelUtils.deleteViewModelById(viewModelId); + + formSchemaUtils.deleteComponent(schema.id); + } + } + /** + * 组件删除后事件:移除表达式、界面规则、受控规则等全局配置 + */ + function removeGlobalConfigs() { + const designViewModelUtils = designerHostService?.designViewModelUtils; + const formSchemaUtils = designerHostService?.formSchemaUtils; + const schema = designItemContext?.schema; + const viewModelId = formSchemaUtils.getViewModelIdByComponentId(schema.id); + + designViewModelUtils.getDgViewModel(viewModelId).fields.forEach(field => { + + // 若绑定字段配置了表达式,需要删除表达式 + if (formSchemaUtils.getExpressions() && formSchemaUtils.getExpressions().length) { + const expFieldIndex = formSchemaUtils.getExpressions().findIndex(e => e.fieldId === field.id); + if (expFieldIndex > -1) { + formSchemaUtils.getExpressions().splice(expFieldIndex, 1); + } + } + }); + } + /** + * 组件删除后事件 + */ + function onRemoveComponent() { + removeAddDeleteBtnOnParentContainer(); + removeGlobalConfigs(); + removeViewModelComponent(); + } + return { canAccepts, checkCanDeleteComponent, checkCanMoveComponent, hideNestedPaddingInDesginerView, getStyles, getPropsConfig, onRemoveComponent }; +} diff --git a/packages/mobile-ui-vue/components/component/src/property-config/component.property-config.ts b/packages/mobile-ui-vue/components/component/src/property-config/component.property-config.ts new file mode 100644 index 0000000000000000000000000000000000000000..cdf986d57bd6141e9ea9b08e61678688250f8f44 --- /dev/null +++ b/packages/mobile-ui-vue/components/component/src/property-config/component.property-config.ts @@ -0,0 +1,63 @@ +import { BaseControlProperty } from "@/components/property-panel"; + + +export class ComponentProperty extends BaseControlProperty { + constructor(componentId: string, designerHostService: any) { + super(componentId, designerHostService); + } + public getPropertyConfig(propertyData: any) { + // 基本信息 + this.propertyConfig.categories['basic'] = this.getBasicPropConfig(propertyData); + // 外观 + this.propertyConfig.categories['appearance'] = this.getAppearanceConfig(propertyData); + // 事件 + this.getEventPropConfig(propertyData); + return this.propertyConfig; + } + private getEventPropConfig(propertyData: any) { + const events = [ + { + label: "onBeforeInit", + name: "初始化前事件", + }, + { + label: "onInit", + name: "初始化事件", + }, + { + label: "onLoadData", + name: "加载数据事件", + }, + { + label: "goBack", + name: "原生返回事件", + }, + ]; + const self = this; + const initialData = self.eventsEditorUtils['formProperties'](propertyData, self.viewModelId, events); + const properties = {}; + properties[self.viewModelId] = { + type: 'events-editor', + editor: { + initialData + } + }; + this.propertyConfig.categories['eventsEditor'] = { + title: '事件', + hideTitle: true, + properties, + // 这个属性,标记当属性变更得时候触发重新更新属性 + refreshPanelAfterChanged: true, + tabId: 'commands', + tabName: '交互', + setPropertyRelates(changeObject: any, data: any) { + const parameters = changeObject.propertyValue; + delete propertyData[self.viewModelId]; + if (parameters) { + parameters.setPropertyRelates = this.setPropertyRelates; // 添加自定义方法后,调用此回调方法,用于处理联动属性 + self.eventsEditorUtils.saveRelatedParameters(propertyData, self.viewModelId, parameters['events'], parameters); + } + } + }; + } +} diff --git a/packages/mobile-ui-vue/components/content-container/index.ts b/packages/mobile-ui-vue/components/content-container/index.ts index c1fbc4d9104711f76f49a80159d57cf2ac85ec49..c14dc398ca2359ee48a295b77e68ae1c73e6065b 100644 --- a/packages/mobile-ui-vue/components/content-container/index.ts +++ b/packages/mobile-ui-vue/components/content-container/index.ts @@ -1,6 +1,7 @@ import { App, Plugin } from 'vue'; import FContentContainer from './src/content-container.component'; import { propsResolver } from './src/content-container.props'; +import ContentContainerDesign from './src/designer/content-container.design.component'; const CONTENT_CONTAINER_REGISTERED_NAME = 'content-container'; @@ -16,6 +17,15 @@ FContentContainer.register = ( propsResolverMap[CONTENT_CONTAINER_REGISTERED_NAME] = propsResolver; }; +FContentContainer.registerDesigner = ( + componentMap: Record, propsResolverMap: Record, + configResolverMap: Record, resolverMap: Record +) => { + componentMap[CONTENT_CONTAINER_REGISTERED_NAME] = ContentContainerDesign; + propsResolverMap[CONTENT_CONTAINER_REGISTERED_NAME] = propsResolver; +}; + + export * from './src/content-container.props'; export { FContentContainer }; export default FContentContainer as typeof FContentContainer & Plugin; diff --git a/packages/mobile-ui-vue/components/content-container/src/designer/content-container.design.component.tsx b/packages/mobile-ui-vue/components/content-container/src/designer/content-container.design.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..2ec2f1037db90475fdd7ce7e36a01ecb714e0975 --- /dev/null +++ b/packages/mobile-ui-vue/components/content-container/src/designer/content-container.design.component.tsx @@ -0,0 +1,38 @@ +import { SetupContext, computed, defineComponent, inject, onMounted, ref } from 'vue'; +import { ContentContainerPropsType, contentContainerProps } from '../content-container.props'; +import { useDesignerRulesForContentContainer } from './use-designer-rules'; +import { getCustomClass } from '@/components/common'; +import { DesignerHostService, DesignerItemContext, useDesignerComponent } from '@/components/designer-canvas';; + +export default defineComponent({ + name: 'FContentContainerDesign', + props: contentContainerProps, + emits: [], + setup(props: ContentContainerPropsType, context) { + const elementRef = ref(); + const designerHostService = inject('designer-host-service'); + const designItemContext = inject('design-item-context') as DesignerItemContext; + const designerRulesComposition = useDesignerRulesForContentContainer(designItemContext, designerHostService); + const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); + + const containerClass = computed(() => { + const classObject = { + 'drag-container': true + } as Record; + return getCustomClass(classObject, props?.customClass); + }); + onMounted(() => { + elementRef.value.componentInstance = componentInstance; + }); + + context.expose(componentInstance.value); + + return () => { + return ( +
+ {context.slots.default && context.slots.default()} +
+ ); + }; + } +}); diff --git a/packages/mobile-ui-vue/components/content-container/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/content-container/src/designer/use-designer-rules.ts new file mode 100644 index 0000000000000000000000000000000000000000..5164c6e8101c84f32bfba1c4ac62b4378fe77d98 --- /dev/null +++ b/packages/mobile-ui-vue/components/content-container/src/designer/use-designer-rules.ts @@ -0,0 +1,50 @@ +import { ComponentSchema, DesignerItemContext } from "@/components/designer-canvas"; +import { ContentContainerProperty } from "../property-config/content-container.property-config"; +import { DesignerHostService, DraggingResolveContext, UseDesignerRules } from "@/components/designer-canvas/src/composition/types"; + +export function useDesignerRulesForContentContainer(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { + const schema = designItemContext.schema as ComponentSchema; + + /** + * 判断是否可以接收拖拽新增的子级控件 + */ + function canAccepts(draggingContext: DraggingResolveContext): boolean { + return true; + } + + function getStyles() { + const component = schema; + if (component.componentType) { + return 'display:inherit;flex-direction:inherit;margin-bottom:10px'; + } + return ''; + } + + function checkCanMoveComponent() { + return true; + } + function checkCanDeleteComponent() { + return true; + } + + function hideNestedPaddingInDesginerView() { + return false; + } + /** + * 获取属性配置 + */ + function getPropsConfig(componentId: string) { + const componentProp = new ContentContainerProperty(componentId, designerHostService); + const { schema } = designItemContext; + return componentProp.getPropertyConfig(schema); + } + + return { + canAccepts, + getStyles, + checkCanMoveComponent, + checkCanDeleteComponent, + hideNestedPaddingInDesginerView, + getPropsConfig + }; +} diff --git a/packages/mobile-ui-vue/components/content-container/src/property-config/content-container.property-config.ts b/packages/mobile-ui-vue/components/content-container/src/property-config/content-container.property-config.ts new file mode 100644 index 0000000000000000000000000000000000000000..8db40b24dd1163136e3baedc8d8c5e4366c86642 --- /dev/null +++ b/packages/mobile-ui-vue/components/content-container/src/property-config/content-container.property-config.ts @@ -0,0 +1,15 @@ +import { BaseControlProperty } from "@/components/property-panel"; + +export class ContentContainerProperty extends BaseControlProperty { + constructor(componentId: string, designerHostService: any) { + super(componentId, designerHostService); + } + public getPropertyConfig(propertyData: any) { + // 基本信息 + this.propertyConfig.categories['basic'] = this.getBasicPropConfig(propertyData); + // 外观 + this.propertyConfig.categories['appearance'] = this.getAppearanceConfig(propertyData); + + return this.propertyConfig; + } +} diff --git a/packages/mobile-ui-vue/components/date-picker-input/index.ts b/packages/mobile-ui-vue/components/date-picker-input/index.ts index ded2df85a66d15faa415bc0c80dae17d86609a77..ec026ee8f753d676b82ceee4cb05592ff6fb9833 100644 --- a/packages/mobile-ui-vue/components/date-picker-input/index.ts +++ b/packages/mobile-ui-vue/components/date-picker-input/index.ts @@ -1,7 +1,21 @@ import { withInstall } from '@components/common'; import DatePickerInputInstallless from './src/date-picker-input.component'; +import DatePickerDesign from './src/designer/date-picker.design.component'; +import { propsResolver } from './src/date-picker-input.props'; + +const DATE_PICKER_REGISTERED_NAME = 'date-picker'; const DatePickerInput = withInstall(DatePickerInputInstallless); +DatePickerInput.register = (componentMap: Record, propsResolverMap: Record, configResolverMap: Record, resolverMap: Record) => { + componentMap[DATE_PICKER_REGISTERED_NAME] = DatePickerInput; + propsResolverMap[DATE_PICKER_REGISTERED_NAME] = propsResolver; +}; +DatePickerInput.registerDesigner = (componentMap: Record, propsResolverMap: Record, configResolverMap: Record) => { + componentMap[DATE_PICKER_REGISTERED_NAME] = DatePickerDesign; + propsResolverMap[DATE_PICKER_REGISTERED_NAME] = propsResolver; +}; + + export { DatePickerInput }; export default DatePickerInput; diff --git a/packages/mobile-ui-vue/components/date-picker-input/src/date-picker-input.props.ts b/packages/mobile-ui-vue/components/date-picker-input/src/date-picker-input.props.ts index 7871244aa9317963fdf4d5a618d96bc11fb4ea3c..cce31ab447171df480c93a301206ff4de61a1efd 100644 --- a/packages/mobile-ui-vue/components/date-picker-input/src/date-picker-input.props.ts +++ b/packages/mobile-ui-vue/components/date-picker-input/src/date-picker-input.props.ts @@ -1,6 +1,10 @@ import { ExtractPropTypes } from 'vue'; import { buttonEditProps } from '@/components/button-edit'; import { datePickerProps } from '@/components/date-picker'; +import { schemaMapper } from './schema/schema-mapper'; +import { schemaResolver } from './schema/schema-resolver'; +import inputSchema from './schema/schema.json'; +import { createPropsResolver } from '@/components/dynamic-resolver'; export const DATA_PICKER_INPUT_NAME = 'FmDatePickerInput'; @@ -9,6 +13,8 @@ export const datePickerInputProps = { ...datePickerProps, round: { type: Boolean, default: false } -}; +} as Record; export type DatePickerInputProps = ExtractPropTypes; + +export const propsResolver = createPropsResolver(datePickerInputProps, inputSchema, schemaMapper, schemaResolver); diff --git a/packages/mobile-ui-vue/components/date-picker-input/src/designer/date-picker.design.component.tsx b/packages/mobile-ui-vue/components/date-picker-input/src/designer/date-picker.design.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..a0aa71bb439e4030246bf6ea4df4137703a36a69 --- /dev/null +++ b/packages/mobile-ui-vue/components/date-picker-input/src/designer/date-picker.design.component.tsx @@ -0,0 +1,54 @@ +/* eslint-disable no-use-before-define */ +/** + * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { computed, defineComponent, inject, onMounted, readonly, ref, SetupContext } from 'vue'; + +import { DesignerHostService, DesignerItemContext, useDesignerComponent } from '@/components/designer-canvas';; +import { useDesignerRules } from './use-designer-rules'; +import { datePickerInputProps, DatePickerInputProps } from '../date-picker-input.props'; +import DatePickerInput from '../..'; + +export default defineComponent({ + name: 'FmDatePickerInputDesign', + props: datePickerInputProps, + emits: [], + setup(props: DatePickerInputProps, context: SetupContext) { + const elementRef = ref(); + const designItemContext = inject('design-item-context') as DesignerItemContext; + const designerHostService = inject('designer-host-service'); + const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); + const componentInstance = useDesignerComponent(elementRef, designItemContext,designerRulesComposition); + + onMounted(() => { + elementRef.value.componentInstance = componentInstance; + }); + + context.expose(componentInstance.value); + + const inputProps = computed(() => ({ + ...props, + editable: false, + readonly: true + + })); + + return () => { + return ( + + ); + }; + } +}); diff --git a/packages/mobile-ui-vue/components/date-picker-input/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/date-picker-input/src/designer/use-designer-rules.ts new file mode 100644 index 0000000000000000000000000000000000000000..27cf298004d6ad0cc9d78b2f3d6677c93aa7f456 --- /dev/null +++ b/packages/mobile-ui-vue/components/date-picker-input/src/designer/use-designer-rules.ts @@ -0,0 +1,15 @@ +import { ComponentSchema, DesignerComponentInstance, DesignerItemContext, UseDesignerRules } from "@/components/designer-canvas"; +import { DatePickerProperty } from "../property-config/date-picker.property-config"; +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService): UseDesignerRules { + + const schema = designItemContext.schema as ComponentSchema; + + // 构造属性配置方法 + function getPropsConfig(componentId: string, componentInstance: DesignerComponentInstance) { + const datePickerProps = new DatePickerProperty(componentId, designerHostService); + return datePickerProps.getPropertyConfig(schema, componentInstance); + } + + return { getPropsConfig } as UseDesignerRules; + +} \ No newline at end of file diff --git a/packages/mobile-ui-vue/components/date-picker-input/src/property-config/date-picker.property-config.ts b/packages/mobile-ui-vue/components/date-picker-input/src/property-config/date-picker.property-config.ts new file mode 100644 index 0000000000000000000000000000000000000000..4f7ea85b3a50a1e22cd36b6d445e66f6163146a3 --- /dev/null +++ b/packages/mobile-ui-vue/components/date-picker-input/src/property-config/date-picker.property-config.ts @@ -0,0 +1,63 @@ +import { InputBaseProperty } from "@/components/common/src/entity/input-base-property"; + +export class DatePickerProperty extends InputBaseProperty { + + constructor(componentId: string, designerHostService: any) { + super(componentId, designerHostService); + } + + + getEditorProperties(propertyData: any) { + const displayFormatOptions = this.getAllShowType(); + const valueFormatOptions = this.getAllFormat(); + return this.getComponentConfig(propertyData, { type: "year-month-day" }, { + placeholder: { + description: "空值时,输入控件内的占位文本", + title: "提示文本", + type: "string" + }, + showType: { + description: "", + title: "选择类型", + type: "enum", + editor: { + data: displayFormatOptions + } + }, + format: { + description: "", + title: "显示格式", + type: "enum", + editor: { + data: valueFormatOptions + } + } + }); + } + + private getAllShowType() { + return [ + { id: "year", name: "年月日" }, + { id: "datetime", name: "年月日时分" }, + { id: "datehour", name: "年月日时" }, + { id: "year-month", name: "年月" }, + { id: "month-day", name: "月日" } + ]; + } + + /** + * 存储格式枚举项 + */ + getAllFormat(): any[] { + return [ + { id: 'YYYY-MM-dd HH:mm', name: 'YYYY-MM-dd HH:mm' }, + { id: 'MM/dd/YYYY HH:mm', name: 'MM/dd/YYYY HH:mm' }, + { id: 'YYYY年MM月dd日 HH:mm', name: 'YYYY年MM月dd日 HH:mm' }, + { id: 'YYYY-MM-dd HH:mm:ss', name: 'YYYY-MM-dd HH:mm:ss' }, + { id: 'MM/dd/YYYY HH:mm:ss', name: 'MM/dd/YYYY HH:mm:ss' }, + { id: 'YYYY年MM月dd日 HH:mm:ss', name: 'YYYY年MM月dd日 HH:mm:ss' }, + ]; + } + + +} diff --git a/packages/mobile-ui-vue/components/date-picker-input/src/schema/schema-mapper.ts b/packages/mobile-ui-vue/components/date-picker-input/src/schema/schema-mapper.ts new file mode 100644 index 0000000000000000000000000000000000000000..abb57152ea8dfa6650169c7fe600d95ec65415f6 --- /dev/null +++ b/packages/mobile-ui-vue/components/date-picker-input/src/schema/schema-mapper.ts @@ -0,0 +1,5 @@ +import { MapperFunction, resolveAppearance } from '@/components/dynamic-resolver'; + +export const schemaMapper = new Map([ + ['appearance', resolveAppearance] +]); diff --git a/packages/mobile-ui-vue/components/date-picker-input/src/schema/schema-resolver.ts b/packages/mobile-ui-vue/components/date-picker-input/src/schema/schema-resolver.ts new file mode 100644 index 0000000000000000000000000000000000000000..660e1e609e11d876dc4227ce631026bfbee8312a --- /dev/null +++ b/packages/mobile-ui-vue/components/date-picker-input/src/schema/schema-resolver.ts @@ -0,0 +1,5 @@ +import { DynamicResolver } from "@/components/dynamic-resolver"; + +export function schemaResolver(resolver: DynamicResolver, schema: Record, context: Record): Record { + return schema; +} diff --git a/packages/mobile-ui-vue/components/date-picker-input/src/schema/schema.json b/packages/mobile-ui-vue/components/date-picker-input/src/schema/schema.json new file mode 100644 index 0000000000000000000000000000000000000000..a98542bf4eef951734448f934593b1e1a1c64437 --- /dev/null +++ b/packages/mobile-ui-vue/components/date-picker-input/src/schema/schema.json @@ -0,0 +1,72 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://farris-design.gitee.io/date-picker.schema.json", + "title": "date-picker", + "description": "A Farris Input Component", + "type": "object", + "properties": { + "id": { + "description": "The unique identifier for a Date Picker", + "type": "string" + }, + "type": { + "description": "The type string of Date Picker component", + "type": "string", + "default": "date-picker" + }, + "appearance": { + "description": "", + "type": "object", + "properties": { + "class": { + "type": "string" + }, + "style": { + "type": "string" + } + }, + "default": {} + }, + "binding": { + "description": "", + "type": "object", + "default": {} + }, + "disable": { + "type": "string", + "default": false + }, + "title": { + "description": "", + "type": "string", + "default": "" + }, + "label": { + "description": "", + "type": "string", + "default": "" + }, + "lableWidth": { + "description": "", + "type": "number" + }, + "placeholder": { + "description": "", + "type": "string", + "default": "" + }, + "visible": { + "description": "", + "type": "boolean", + "default": true + } + }, + "required": [ + "id", + "type", + "visible", + "label", + "placeholder", + "appearance" + ] +} \ No newline at end of file diff --git a/packages/mobile-ui-vue/components/designer-canvas/src/components/maps.ts b/packages/mobile-ui-vue/components/designer-canvas/src/components/maps.ts index 1a5e6de142db44e465594cfc74f9ddec633da0ea..474da277cb004fb7b11a4534cfe25a8e1a5d9aad 100644 --- a/packages/mobile-ui-vue/components/designer-canvas/src/components/maps.ts +++ b/packages/mobile-ui-vue/components/designer-canvas/src/components/maps.ts @@ -1,4 +1,15 @@ - +import { ContentContainer, DatePickerInput, FormItem, PageHeaderContainer, RadioGroup } from "@/components"; +import Button from "@/components/button"; +import Component from "@/components/component"; +import FloatContainer from "@/components/float-container"; +import Form from "@/components/form"; +import InputGroup from "@/components/input-group"; +import { ListView } from "@/components/list-view"; +import Navbar from "@/components/navbar"; +import PageBodyContainer from "@/components/page-body-container"; +import PageContainer from "@/components/page-container"; +import PageFooterContainer from "@/components/page-footer-container"; +import Textarea from "@/components/textarea"; const componentMap: Record = {}; const componentPropsConverter: Record = {}; @@ -12,21 +23,24 @@ let hasLoaded = false; function loadDesignerRegister() { if (!hasLoaded) { hasLoaded = true; - // FAvatar.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); - - } -} -/** - * 加载设计时组件 - */ -function loadDesignerRegisterByComponents(components:any[]) { - if (!hasLoaded) { - hasLoaded = true; - components.forEach(component => { - component.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); - }); - + Button.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); + PageContainer.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); + PageHeaderContainer.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); + PageBodyContainer.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); + PageFooterContainer.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); + Navbar.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); + Component.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); + ListView.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); + Form.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); + InputGroup.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); + FloatContainer.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); + ContentContainer.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); + FormItem.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); + DatePickerInput.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); + Textarea.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); + RadioGroup.registerDesigner(componentMap, componentPropsConverter, componentPropertyConfigConverter); + } } -export { componentMap, componentPropsConverter, componentPropertyConfigConverter, loadDesignerRegister, loadDesignerRegisterByComponents }; +export { componentMap, componentPropsConverter, componentPropertyConfigConverter, loadDesignerRegister }; diff --git a/packages/mobile-ui-vue/components/designer-canvas/src/composition/dg-control.ts b/packages/mobile-ui-vue/components/designer-canvas/src/composition/dg-control.ts index 3e00a135b847adf2641d413154b70331ba78a4ff..e3d215a7141dc102fcc7048c83a9505a0edebe42 100644 --- a/packages/mobile-ui-vue/components/designer-canvas/src/composition/dg-control.ts +++ b/packages/mobile-ui-vue/components/designer-canvas/src/composition/dg-control.ts @@ -1,12 +1,24 @@ -export const DgControl = { - 'button': { type: 'button', name: '按钮', icon: 'Button' }, - - 'response-toolbar': { type: 'response-toolbar', name: '工具栏', icon: 'ButtonGroup' }, +export const DgControl = { + 'module': { type: 'Module', name: '模块', icon: 'Module' }, - 'response-toolbar-item': { type: 'response-toolbar-item', name: '按钮', icon: 'Button' }, + 'component': { type: 'component', name: '组件', icon: 'Component' }, 'content-container': { type: 'content-container', name: '容器', icon: 'ContentContainer' }, + 'page-container': { type: 'page-container', name: '页面容器', icon: 'ContentContainer' }, + + 'page-header-container': { type: 'page-header-container', name: '页头容器', icon: 'ContentContainer' }, + + 'page-body-container': { type: 'page-body-container', name: '页面主体容器', icon: 'ContentContainer' }, + + 'page-footer-container': { type: 'page-footer-container', name: '页尾容器', icon: 'ContentContainer' }, + + 'float-container': { type: 'float-container', name: '浮动容器', icon: 'ContentContainer' }, + + 'list-view': { type: 'list-view', name: '列表', icon: 'ListView' }, + + 'button': { type: 'button', name: '按钮', icon: 'Button' }, + 'input-group': { type: 'input-group', name: '文本', icon: 'TextBox' }, 'textarea': { type: 'textarea', name: '多行文本', icon: 'MultiTextBox' }, @@ -27,53 +39,8 @@ export const DgControl = { 'combo-list': { type: 'combo-list', name: '下拉列表', icon: 'EnumField' }, - 'response-form': { type: 'response-form', name: '卡片面板', icon: 'Form' }, - - 'response-layout': { type: 'response-layout', name: '布局容器', icon: 'ResponseLayout3' }, - - 'response-layout-item': { type: 'response-layout-item', name: '布局', icon: 'ResponseLayout1' }, - - 'tree-grid': { type: 'tree-grid', name: '树表格', icon: 'TreeGrid' }, - - 'tree-grid-column': { type: 'tree-grid-column', name: '树表格列' }, - - 'data-grid': { type: 'data-grid', name: '表格', icon: 'DataGrid' }, - - 'data-grid-column': { type: 'data-grid-column', name: '表格列' }, - - 'module': { type: 'Module', name: '模块', icon: 'Module' }, - - 'component': { type: 'component', name: '组件', icon: 'Component' }, - - 'tabs': { type: 'tabs', name: '标签页', icon: 'Tab' }, - - 'tab-page': { type: 'tab-page', name: '标签页项', dependentParentControl: 'Tab' }, - - 'tab-toolbar-item': { type: 'tab-toolbar-item', name: '标签页工具栏按钮', icon: 'Button' }, - - 'time-picker': { type: 'time-picker', name: '时间选择', icon: 'TimePicker' }, - - 'section': { type: 'section', name: '分组面板', icon: 'Section' }, - - 'section-toolbar': { type: 'section-toolbar', name: '分组面板工具栏' }, - - 'section-toolbar-item': { type: 'section-toolbar-item', name: '分组面板按钮' }, - - 'splitter': { type: 'splitter', name: '分栏面板', icon: 'Splitter' }, - - 'splitter-pane': { type: 'splitter-pane', name: '分栏面板项', dependentParentControl: 'Splitter' }, - - 'component-ref': { type: 'component-ref', name: '组件引用节点' }, - - 'uploader': { type: 'uploader', name: '附件上传', icon: 'FileUpload' }, - - 'page-header': { type: 'page-header', name: '页头', icon: 'Header' }, - - 'page-footer': { type: 'page-footer', name: '页脚', icon: 'ModalFooter' }, - - 'tab-toolbar': { type: 'tab-toolbar', name: '标签页工具栏', icon: 'TabToolbar' }, + 'form': { type: 'form', name: '卡片面板', icon: 'Form' }, - 'fieldset': { type: 'fieldset', name: '分组', icon: 'fieldset' }, + 'navigation-bar': { type: 'navigation-bar', name: '导航栏', icon: 'NavBar' }, - 'query-solution': { type: 'query-solution', name: '筛选方案', icon: 'QueryScheme'} }; diff --git a/packages/mobile-ui-vue/components/designer-canvas/src/composition/function/drag-resolve.tsx b/packages/mobile-ui-vue/components/designer-canvas/src/composition/function/drag-resolve.tsx index 8bdd337b1233bbfdf2b85ed46af6ff7abeb41688..491c53d94b19f9bd19489c1c842c534e1ba32515 100644 --- a/packages/mobile-ui-vue/components/designer-canvas/src/composition/function/drag-resolve.tsx +++ b/packages/mobile-ui-vue/components/designer-canvas/src/composition/function/drag-resolve.tsx @@ -1,11 +1,9 @@ import { ModalFunctions } from "../../../../modal/src/composition/type"; import { ComponentBindingSourceContext, DesignerHostService, DesignerHTMLElement, DraggingResolveContext } from "../types"; -// import EntityBindingSelectorComponent from '../../../../entity-binding-selector/entity-binding-selector.component'; -// import { FBindingSelectorContainer as BindingSelectorComponent } from "@/components/binding-selector"; import { DesignViewModelField, FormVariable } from "../../../../common/entity/entity-schema"; import { merge } from "lodash-es"; -import { DesignerComponentInstance } from "../../types"; import { DgControl } from "../dg-control"; +import { DesignerComponentInstance } from "@/components"; export function dragResolveService(designerHostService: DesignerHostService) { /** 弹窗实例 */ @@ -64,7 +62,8 @@ export function dragResolveService(designerHostService: DesignerHostService) { */ function renderEntityComponent() { const { componentType } = componentResolveContext; - // return () => (<> ); + const FEntityBindingSelector = designerHostService.uiProviderService.getUiComponent('FEntityBindingSelector'); + return () => (<> ); } /** * 弹出实体绑定窗口 @@ -153,7 +152,10 @@ export function dragResolveService(designerHostService: DesignerHostService) { componentSchema: { editor: { type: componentResolveContext.componentType } } }; const bindingSettings = { enable: false }; - // return () => (<> ); + + const FBindingSelectorContainer = designerHostService.uiProviderService.getUiComponent('FBindingSelectorContainer'); + + return () => (<> ); } /** * 弹出绑定字段的窗口 diff --git a/packages/mobile-ui-vue/components/designer-canvas/src/composition/function/use-dragula.ts b/packages/mobile-ui-vue/components/designer-canvas/src/composition/function/use-dragula.ts index a7be4974f63bbac5770efe206425f907b48c7a88..1b8b01052bc27ae976cbb2ac0d1ab8ed2e1b9c21 100644 --- a/packages/mobile-ui-vue/components/designer-canvas/src/composition/function/use-dragula.ts +++ b/packages/mobile-ui-vue/components/designer-canvas/src/composition/function/use-dragula.ts @@ -349,6 +349,10 @@ export function useDragula(designerHostService: DesignerHostService): UseDragula } - return { attachComponents, attachToolbox, initializeDragula }; + function getDragulaInstance() { + return dragulaInstance; + } + + return { attachComponents, initializeDragula,getDragulaInstance }; } diff --git a/packages/mobile-ui-vue/components/designer-canvas/src/composition/types.ts b/packages/mobile-ui-vue/components/designer-canvas/src/composition/types.ts index e256c20caa353240c1a6a23af67119ad1c769135..a3dc5bbfad20596649c87001a8891b6d575a47e7 100644 --- a/packages/mobile-ui-vue/components/designer-canvas/src/composition/types.ts +++ b/packages/mobile-ui-vue/components/designer-canvas/src/composition/types.ts @@ -12,12 +12,13 @@ export interface DesignerHTMLElement extends HTMLElement { schema: ComponentSchema; } + export interface UseDragula { attachComponents: (element: HTMLElement, component: ComponentSchema) => void; - attachToolbox: () => void; - initializeDragula: (containerElement: DesignerHTMLElement) => void; + + getDragulaInstance: () => any; } export interface DesignerHostService { eventsEditorUtils: any; @@ -27,6 +28,7 @@ export interface DesignerHostService { controlCreatorUtils: any; metadataService?: any; formStateMachineUtils: any; + uiProviderService?: any; [key: string]: any; } /** diff --git a/packages/mobile-ui-vue/components/designer-canvas/src/designer-canvas.component.tsx b/packages/mobile-ui-vue/components/designer-canvas/src/designer-canvas.component.tsx index 569b057e42143304f274d613232c9828c73e1600..5ac3463fd7a11837af9688eee4a0284daccd37e3 100644 --- a/packages/mobile-ui-vue/components/designer-canvas/src/designer-canvas.component.tsx +++ b/packages/mobile-ui-vue/components/designer-canvas/src/designer-canvas.component.tsx @@ -8,8 +8,9 @@ import { DesignerHostService, UseDragula } from './composition/types'; import FDesignerItem from './components/designer-item.component'; import './composition/class/designer-canvas.css'; import './composition/class/control.css'; -import { loadDesignerRegister, loadDesignerRegisterByComponents } from './components/maps'; -import { F_MODAL_SERVICE_TOKEN } from '../../modal'; +import { loadDesignerRegister } from './components/maps'; +import { FM_MODAL_SERVICE_TOKEN } from '../../modal'; +import { FM_UI_PROVIDER_SERVICE_TOKEN } from '@/components'; export default defineComponent({ name: 'FDesignerCanvas', @@ -35,17 +36,15 @@ export default defineComponent({ metadataService: inject('Meatdata_Http_Service_Token'), schemaService: inject('schemaService'), useFormCommand: inject('useFormCommand'), - modalService: inject(F_MODAL_SERVICE_TOKEN), - formStateMachineUtils: inject('useFormStateMachine') + modalService: inject(FM_MODAL_SERVICE_TOKEN), + formStateMachineUtils: inject('useFormStateMachine'), + uiProviderService: inject(FM_UI_PROVIDER_SERVICE_TOKEN), + }; provide('designer-host-service', designerHostService); const useDragulaComposition = useDragula(designerHostService); - if(props.components){ - loadDesignerRegisterByComponents(props.components); - }else{ - loadDesignerRegister(); - } + loadDesignerRegister(); provide('canvas-dragula', useDragulaComposition); provide('design-item-context', { diff --git a/packages/mobile-ui-vue/components/designer-toolbox/index.ts b/packages/mobile-ui-vue/components/designer-toolbox/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..6616581e20bfa48ed03e175249a0639d29b3445c --- /dev/null +++ b/packages/mobile-ui-vue/components/designer-toolbox/index.ts @@ -0,0 +1,5 @@ +import FDesignerToolbox from './src/toolbox.component'; + +export * from './src/types'; + +export { FDesignerToolbox }; diff --git a/packages/mobile-ui-vue/components/designer-toolbox/src/toolbox.component.tsx b/packages/mobile-ui-vue/components/designer-toolbox/src/toolbox.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..b28fc46df04c79399c94d3ae8767d63ee4d793b8 --- /dev/null +++ b/packages/mobile-ui-vue/components/designer-toolbox/src/toolbox.component.tsx @@ -0,0 +1,153 @@ +import { defineComponent, ref, watch } from 'vue'; +import { ToolboxPropsType, toolboxProps } from './toolbox.props'; +import { ToolboxCategory, ToolboxItem } from './types'; + +import toolboxItems from './toolbox.json'; +import './toolbox.css'; + +export default defineComponent({ + name: 'FDesignerToolbox', + props: toolboxProps, + emits: [], + setup(props: ToolboxPropsType) { + const controlCategoryList = props.toolboxItems ? ref(props.toolboxItems as ToolboxCategory[]) : ref(toolboxItems); + const dragularCompostion = ref(props.dragula); + + function onClickCardHeader(payload: MouseEvent, category: any) { + category.isHide = !category.isHide; + } + + function getCardHeaderIconClass(category: any) { + const classObject = { + 'f-icon': true, + 'f-icon-arrow-60-down': !category.isHide, + 'f-icon-arrow-e': category.isHide + } as Record; + return classObject; + } + + function renderCategoryCardHeader(category: ToolboxCategory) { + return ( +
onClickCardHeader(payload, category)}> +
+
+
+
+ +
+
+ {category.name} +
+
+
+
+
+ ); + } + + function getControlTileClass(toolboxItem: ToolboxItem) { + const classObject = { + 'd-none': toolboxItem.dependentParent || toolboxItem.hideInControlBox, + controlPanel: true, + 'drag-copy': true, + 'no-drag': toolboxItem.disable, + 'updating': toolboxItem.updating + } as Record; + return classObject; + } + + function getToolboxItemClass(toolboxItem: ToolboxItem) { + const classObject = { + farrisControlIcon: true, + 'fd-i-Family': true + } as Record; + const toolboxItemTypicalClassName = `fd_pc-${toolboxItem.icon || toolboxItem.type}`; + classObject[toolboxItemTypicalClassName] = true; + return classObject; + } + + function renderControlTile(toolboxItem: ToolboxItem, category: ToolboxCategory) { + return ( + + ); + } + + function renderCategoryCardBody(category: ToolboxCategory) { + return ( +
+ {category.items.map((toolboxItem: any) => renderControlTile(toolboxItem, category))} +
+ ); + } + + function renderCategoryCard(category: ToolboxCategory) { + return ( + !category.hideInControlBox && ( +
+ {renderCategoryCardHeader(category)} + {renderCategoryCardBody(category)} +
+ ) + ); + } + + /** + * 将工具箱各容器添加到dragula的拖拽列表中 + */ + function attachToolboxToDragulaContainer(dragulaInstance: any) { + if (!dragulaInstance) { + return; + } + const controlPanels = document.getElementsByClassName('controlCategory'); + if (!controlPanels) { + return; + } + + dragulaInstance.containers = dragulaInstance.containers.filter( + (element: HTMLElement) => !element.className.includes('controlCategory') + ); + + Array.from(controlPanels).forEach((panelElement) => { + dragulaInstance.containers.push(panelElement); + }); + + } + + watch( + () => props.dragula, + (newValue: any) => { + dragularCompostion.value = newValue; + if (dragularCompostion.value?.getDragulaInstance) { + attachToolboxToDragulaContainer(dragularCompostion.value?.getDragulaInstance()); + } + } + ); + + return () => { + return ( +
+
+ {controlCategoryList.value.map((category: any) => { + return renderCategoryCard(category); + })} +
+
+ ); + }; + } +}); diff --git a/packages/mobile-ui-vue/components/designer-toolbox/src/toolbox.css b/packages/mobile-ui-vue/components/designer-toolbox/src/toolbox.css new file mode 100644 index 0000000000000000000000000000000000000000..bdc92e873071b54035094c2b119bce297452f7b2 --- /dev/null +++ b/packages/mobile-ui-vue/components/designer-toolbox/src/toolbox.css @@ -0,0 +1,75 @@ +.controlBox { + font-size: 13px !important; +} + +.controlBox .farris-panel { + border: none; +} + +.controlBox .farris-panel .card-header { + padding: 10px 0px !important; + background-color: #fcfdff !important; +} + +.controlBox .farris-panel .card-header .col-form-label { + font-size: 13px; + margin-bottom: 0px; + color: #3f4764; + opacity: 0.65; +} + +.controlBox .farris-panel .card-header .col-form-label .f-icon { + font-size: 10.8px; + color: #3f4764; +} + +.controlBox .farris-panel .card-body { + display: flex; + flex-wrap: wrap; + background: #fcfdff !important; +} + +.controlPanel:nth-child(-n + 3) { + margin-top: 0 !important; +} + +.controlPanel .farrisControlIcon { + font-size: 27px; +} + +.controlPanel { + font-size: 13px; + cursor: grab; + display: flex; + background: #fff; + align-items: center; + width: 33.333%; + background-color: #fcfdff; + border: 1px solid #edf1f5; + height: 76px !important; + text-align: center; + margin: -1px 0 0 -1px !important; + color: #6080ad; + /* overflow: hidden; */ + text-overflow: ellipsis; + word-break: keep-all; + -webkit-user-select: none; + user-select: none; +} + +.controlPanel.updating { + color: #707070; +} + +.controlPanel > div { + margin: auto; + overflow: hidden; +} + +.gu-mirror.undroppable.controlPanel { + cursor: no-drop; +} + +.controlBox .farris-panel .card-header .col-form-label .icon-panel .f-icon { + font-size: 16px; +} diff --git a/packages/mobile-ui-vue/components/designer-toolbox/src/toolbox.json b/packages/mobile-ui-vue/components/designer-toolbox/src/toolbox.json new file mode 100644 index 0000000000000000000000000000000000000000..3f3386d8a1d60ebfc6b472e0a66b89dc7f0719db --- /dev/null +++ b/packages/mobile-ui-vue/components/designer-toolbox/src/toolbox.json @@ -0,0 +1,110 @@ +[ + { + "type": "input", + "name": "输入类控件", + "items": [ + { + "id": "TextBox", + "type": "input-group", + "name": "文本", + "category": "input" + }, + { + "id": "MultiTextBox", + "type": "textarea", + "name": "多行文本", + "category": "input" + }, + { + "id": "DateBox", + "type": "date-picker", + "name": "日期", + "category": "input" + }, + { + "id": "EnumField", + "type": "combo-list", + "name": "下拉列表", + "category": "input" + }, + { + "id": "NumericBox", + "type": "number-spinner", + "name": "数值", + "category": "input" + }, + { + "id": "CheckBox", + "type": "check-box", + "name": "复选框", + "category": "input" + }, + { + "id": "CheckBoxGroup", + "type": "check-group", + "name": "复选框组", + "category": "input" + }, + { + "id": "RadioGroup", + "type": "radio-group", + "name": "单选组", + "category": "input" + }, + { + "id": "SwitchField", + "type": "switch", + "name": "开关", + "category": "input" + }, + { + "id": "LookupEdit", + "type": "lookup", + "name": "帮助", + "category": "input" + } + ] + }, + { + "type": "dataCollection", + "name": "数据集合类控件", + "items": [ + { + "id": "ResponseForm", + "type": "form", + "name": "卡片面板", + "category": "dataCollection" + }, + { + "id": "DataGrid", + "type": "data-grid", + "name": "表格", + "category": "dataCollection" + } + ] + }, + { + "type": "container", + "name": "容器类控件", + "items": [ + { + "id": "Tab", + "type": "tabs", + "name": "标签页区域", + "category": "container" + } + ] + }, + { + "type": "business", + "name": "业务类控件", + "items": [ + { + "id": "QuerySolution", + "type": "query-solution", + "name": "筛选方案", + "category": "container" + } + ] + } +] \ No newline at end of file diff --git a/packages/mobile-ui-vue/components/designer-toolbox/src/toolbox.props.ts b/packages/mobile-ui-vue/components/designer-toolbox/src/toolbox.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..ddf9559cc143543589252b546eeb68e7e25dd251 --- /dev/null +++ b/packages/mobile-ui-vue/components/designer-toolbox/src/toolbox.props.ts @@ -0,0 +1,10 @@ +import { ExtractPropTypes } from 'vue'; + +export const toolboxProps = { + id: { type: String, default: '' }, + dragula: { type: Object }, + toolboxItems: { type: Object } + +}; + +export type ToolboxPropsType = ExtractPropTypes; diff --git a/packages/mobile-ui-vue/components/designer-toolbox/src/types.ts b/packages/mobile-ui-vue/components/designer-toolbox/src/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..52436075af57540988492f1f7cca86ef4aaeb42b --- /dev/null +++ b/packages/mobile-ui-vue/components/designer-toolbox/src/types.ts @@ -0,0 +1,22 @@ +export interface ToolboxItem { + id: string; + type: string; + name: string; + category: string; + icon?: string; + feature?: any; + dependentParent?: boolean; + hideInControlBox?: boolean; + disable?: boolean; + fieldType?: string; + templateCategory?: string; + updating?: boolean; +} + +export interface ToolboxCategory { + type: string; + name: string; + items: ToolboxItem[]; + hideInControlBox?: boolean; + isHide?: boolean; +}; diff --git a/packages/mobile-ui-vue/components/designer.ts b/packages/mobile-ui-vue/components/designer.ts index 3aaf39102fc575eb62d1ffdfe39e9379886701b6..6118ec98be8d097fe4a94da73f69048413d0c67f 100644 --- a/packages/mobile-ui-vue/components/designer.ts +++ b/packages/mobile-ui-vue/components/designer.ts @@ -1,3 +1,5 @@ export * from './designer-canvas'; export * from './dynamic-resolver'; - +export { FDesignerToolbox } from './designer-toolbox'; +export { default as FModal, FModalService, FM_MODAL_SERVICE_TOKEN } from './modal'; +export { FM_UI_PROVIDER_SERVICE_TOKEN } from './common'; diff --git a/packages/mobile-ui-vue/components/float-container/index.ts b/packages/mobile-ui-vue/components/float-container/index.ts index 47454ca63a90c6fd34d3aceaaacff0d768e30d26..3b6178781c26d2707068a7a7d96858283f454cf2 100644 --- a/packages/mobile-ui-vue/components/float-container/index.ts +++ b/packages/mobile-ui-vue/components/float-container/index.ts @@ -2,6 +2,7 @@ import { Plugin } from 'vue'; import { withInstall } from '@components/common'; import { propsResolver } from './src/float-container.props'; import FloatContainerInstallless from './src/float-container.component'; +import FloatContainerDesign from './src/designer/float-container.design.component'; const FLOAT_CONTAINER_REGISTERED_NAME = 'float-container'; @@ -15,6 +16,15 @@ FloatContainer.register = ( propsResolverMap[FLOAT_CONTAINER_REGISTERED_NAME] = propsResolver; }; +FloatContainer.registerDesigner = ( + componentMap: Record, propsResolverMap: Record, + configResolverMap: Record, resolverMap: Record +) => { + componentMap[FLOAT_CONTAINER_REGISTERED_NAME] = FloatContainerDesign; + propsResolverMap[FLOAT_CONTAINER_REGISTERED_NAME] = propsResolver; +}; + + export * from './src/float-container.props'; export { FloatContainer }; export default FloatContainer as typeof FloatContainer & Plugin; diff --git a/packages/mobile-ui-vue/components/float-container/src/designer/float-container.design.component.tsx b/packages/mobile-ui-vue/components/float-container/src/designer/float-container.design.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..959f7cde474d1ce06d7ea676d7f4a8f490a1df77 --- /dev/null +++ b/packages/mobile-ui-vue/components/float-container/src/designer/float-container.design.component.tsx @@ -0,0 +1,31 @@ +import { SetupContext, defineComponent, inject, onMounted, ref } from 'vue'; +import { FloatContainerProps, floatContainerProps } from '../float-container.props'; +import { useDesignerRules } from './use-designer-rules'; +import { DesignerHostService, DesignerItemContext, useDesignerComponent } from '@/components/designer-canvas';; + +export default defineComponent({ + name: 'FmFloatContainerDesign', + props: floatContainerProps, + emits: [], + setup(props: FloatContainerProps, context: SetupContext) { + const elementRef = ref(); + const designItemContext = inject('design-item-context') as DesignerItemContext; + const designerHostService = inject('designer-host-service'); + const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); + const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); + + onMounted(() => { + elementRef.value.componentInstance = componentInstance; + }); + + context.expose(componentInstance.value); + + return () => { + return ( +
+ {context.slots.default?.()} +
+ ); + }; + } +}); diff --git a/packages/mobile-ui-vue/components/float-container/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/float-container/src/designer/use-designer-rules.ts new file mode 100644 index 0000000000000000000000000000000000000000..e036eeb86b93a27004d357ebeeff8302aa0887c2 --- /dev/null +++ b/packages/mobile-ui-vue/components/float-container/src/designer/use-designer-rules.ts @@ -0,0 +1,106 @@ +/* eslint-disable no-use-before-define */ +/** + * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { ref } from "vue"; +import { ComponentSchema, DesignerItemContext, UseDesignerRules } from "@/components/designer-canvas"; +import { DraggingResolveContext } from "@/components/designer-canvas/src/composition/types"; +import { FloatContainerProperty } from "../property-config/float-container.property-config"; + +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService): UseDesignerRules { + + const hideNestedPadding = true; + + const schema = ref(designItemContext.schema) + + function canAccepts(draggingContext: DraggingResolveContext): boolean { + const acceptableControlTypes = [ + 'navbar', + 'content-container', + 'html-template', + ]; + const uniqueControlTypes = [ + 'navbar', + ]; + const { sourceType, parentComponentInstance } = draggingContext; + if (!acceptableControlTypes.includes(sourceType)) { + return false; + } + const shouldBeUnique = uniqueControlTypes.includes(sourceType); + if (shouldBeUnique) { + const parentComponent = parentComponentInstance?.parent?.value; + const contents: any[] = parentComponent?.contents || []; + const hasSameTypeControl = !!contents.find((content) => content.type === sourceType); + if (hasSameTypeControl) { + return false; + } + } + return true; + } + + function checkCanMoveComponent() { + return false; + } + function checkCanDeleteComponent() { + return true; + } + + function hideNestedPaddingInDesginerView() { + return hideNestedPadding; + } + + function getDesignerClass(): string { + return ' position-absolute z-index-99 '; + } + + function getStyles(): string { + let style = '' + if (schema.value.position) { + style += Object.keys(schema.value.position).map(key => { + return `${key}: ${schema.value.position[key]}px;` + }).join('') + } + if (schema.value.padding) { + style += Object.keys(schema.value.padding).map(key => { + return `padding-${key}: ${schema.value.padding[key]}px;` + }).join('') + } + if (schema.value.margin) { + style += Object.keys(schema.value.margin).map(key => { + return `margin-${key}: ${schema.value.margin[key]}px;` + }).join('') + } + return style + } + + /** + * 获取属性配置 + */ + function getPropsConfig(componentId: string) { + const componentProp = new FloatContainerProperty(componentId, designerHostService); + const { schema } = designItemContext; + return componentProp.getPropertyConfig(schema); + } + + return { + canAccepts, + checkCanMoveComponent, + checkCanDeleteComponent, + hideNestedPaddingInDesginerView, + getDesignerClass, + getStyles, + getPropsConfig + }; +} diff --git a/packages/mobile-ui-vue/components/float-container/src/property-config/float-container.property-config.ts b/packages/mobile-ui-vue/components/float-container/src/property-config/float-container.property-config.ts new file mode 100644 index 0000000000000000000000000000000000000000..3ad2a788fe1dc092c4ed177813f09a7097237a1b --- /dev/null +++ b/packages/mobile-ui-vue/components/float-container/src/property-config/float-container.property-config.ts @@ -0,0 +1,15 @@ +import { BaseControlProperty } from "@/components/property-panel"; + +export class FloatContainerProperty extends BaseControlProperty { + constructor(componentId: string, designerHostService: any) { + super(componentId, designerHostService); + } + public getPropertyConfig(propertyData: any) { + // 基本信息 + this.propertyConfig.categories['basic'] = this.getBasicPropConfig(propertyData); + // 外观 + this.propertyConfig.categories['appearance'] = this.getAppearanceConfig(propertyData); + + return this.propertyConfig; + } +} diff --git a/packages/mobile-ui-vue/components/form-item/index.ts b/packages/mobile-ui-vue/components/form-item/index.ts index af7481fd11f63b8c284628dd2dc9e26b0f99a641..c52eef2821f0d524a6a5195e8818b36a4ab0eef5 100644 --- a/packages/mobile-ui-vue/components/form-item/index.ts +++ b/packages/mobile-ui-vue/components/form-item/index.ts @@ -1,6 +1,7 @@ import { withInstall } from '@components/common'; import { propsResolver } from './src/form-item.props'; import FormItemInstallless from './src/form-item.component'; +import FormItemDesign from './src/designer/form-item.design.component'; const FORM_REGISTERED_NAME = 'form-item'; @@ -14,6 +15,14 @@ FormItem.register = ( propsResolverMap[FORM_REGISTERED_NAME] = propsResolver; }; +FormItem.registerDesigner = ( + componentMap: Record, propsResolverMap: Record, + configResolverMap: Record, resolverMap: Record +) => { + componentMap[FORM_REGISTERED_NAME] = FormItemDesign; + propsResolverMap[FORM_REGISTERED_NAME] = propsResolver; +}; + export * from './src/form-item.props'; export { FormItem }; export default FormItem; diff --git a/packages/mobile-ui-vue/components/form-item/src/designer/form-item-use-designer-rules.ts b/packages/mobile-ui-vue/components/form-item/src/designer/form-item-use-designer-rules.ts new file mode 100644 index 0000000000000000000000000000000000000000..305fcbdbd8563a200b3cbd48f9f267f544724ee1 --- /dev/null +++ b/packages/mobile-ui-vue/components/form-item/src/designer/form-item-use-designer-rules.ts @@ -0,0 +1,85 @@ +import { DesignerItemContext, DesignerHostService, UseDesignerRules, DesignerComponentInstance, ComponentSchema } from "@/components/designer-canvas"; +import { FormGroupProperty } from "../property-config/form-group.property-config"; + +export function useDesignerRulesForFormItem(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { + const schema = designItemContext.schema as ComponentSchema; + + function checkCanMoveComponent() { + return true; + } + function checkCanDeleteComponent() { + return true; + } + + function canAccepts() { + return false; + } + + function hideNestedPaddingInDesginerView() { + return true; + } + /** + * 若控件有绑定信息,删除控件时需要同步移除viewmodel中的记录 + */ + function removeBindingFromViewModel(bindingFieldId: string) { + const designViewModelUtils = designerHostService?.designViewModelUtils; + const formSchemaUtils = designerHostService?.formSchemaUtils; + const belongedComponentId = designItemContext?.componentInstance.value?.belongedComponentId; + if (!belongedComponentId || !designViewModelUtils || !formSchemaUtils) { + return; + } + const belongedviewModelId = formSchemaUtils.getViewModelIdByComponentId(belongedComponentId); + const dgViewModel = designViewModelUtils.getDgViewModel(belongedviewModelId); + + if (dgViewModel) { + dgViewModel.removeField([bindingFieldId]); + } + } + /** + * 若控件配置了表达式,删除控件时需要同步移除表达式 + */ + function removeExpression(bindingFieldId: string) { + const formSchemaUtils = designerHostService?.formSchemaUtils; + + if (formSchemaUtils.getExpressions().length) { + const expFieldIndex = formSchemaUtils.getExpressions().findIndex(e => e.fieldId === bindingFieldId); + if (expFieldIndex > -1) { + formSchemaUtils.getExpressions().splice(expFieldIndex, 1); + } + + } + } + + function getDesignerClass(): string { + return ' fm-input-wrapper '; + } + + /** + * 控件删除后事件 + */ + function onRemoveComponent() { + const { schema } = designItemContext; + const bindingFieldId = schema.binding && schema.binding.field; + if (bindingFieldId) { + removeBindingFromViewModel(bindingFieldId); + removeExpression(bindingFieldId); + } + } + + // 构造属性配置方法 + function getPropsConfig(componentId: string, componentInstance: DesignerComponentInstance) { + const inputGroupProps = new FormGroupProperty(componentId, designerHostService); + return inputGroupProps.getPropertyConfig(schema, componentInstance); + } + + + return { + canAccepts, + checkCanDeleteComponent, + checkCanMoveComponent, + hideNestedPaddingInDesginerView, + onRemoveComponent, + getDesignerClass, + getPropsConfig + }; +} diff --git a/packages/mobile-ui-vue/components/form-item/src/designer/form-item.design.component.tsx b/packages/mobile-ui-vue/components/form-item/src/designer/form-item.design.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..251d704b9ead3d7587d9cd082dce87a1cd5e596e --- /dev/null +++ b/packages/mobile-ui-vue/components/form-item/src/designer/form-item.design.component.tsx @@ -0,0 +1,137 @@ +/** + * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { computed, defineComponent, inject, onMounted, ref, SetupContext, watch } from 'vue'; +import { useBem } from '@components/common'; +import FmCell from '@components/cell'; +import { FORM_ITEM_NAME, FormItemProps, formItemProps } from '../form-item.props'; +import { DesignerHostService, DesignerItemContext, useDesignerComponent } from '@/components/designer-canvas';; +import { propertyConfigSchemaMap } from '@/components/dynamic-resolver'; +import { useDesignerRulesForFormItem } from './form-item-use-designer-rules'; +import { useTypeResolverDesign } from '@/components/dynamic-form/src/composition/use-type-resolver-design'; + +export default defineComponent({ + name: 'FmFormItemDesign', + props: formItemProps, + + setup(props: FormItemProps, context: SetupContext) { + const { slots, expose } = context; + + const label = ref(props.label); + const labelAlign = ref(props.labelAlign); + const shouldShowRequired = ref(props.required); + const { bem } = useBem(FORM_ITEM_NAME); + const editor = ref(props.editor); + const { resolveEditorProps, resolveEditorType } = useTypeResolverDesign(); + + const elementRef = ref(); + const editorRef = ref(); + + const designItemContext = inject('design-item-context') as DesignerItemContext; + const designerHostService = inject('designer-host-service'); + const designerRulesComposition = useDesignerRulesForFormItem(designItemContext, designerHostService); + const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); + + + const renderLabel = () => { + if (slots.label) { + return [slots.label()]; + } + return ; + }; + + const contentClass = computed(() => { + let contentAlign = props.contentAlign || 'right'; + if (labelAlign.value === 'top') { + contentAlign = 'left'; + } + return { + [bem('content')]: true, + [bem('content', contentAlign)]: true + }; + }); + const renderContent = () => { + const renderConditionEditor = computed(() => { + const editorType = editor.value.type || 'input-group'; + const Component = resolveEditorType(editorType); + const editorProps = resolveEditorProps(editorType, editor.value); + return () => ; + }); + + + return
{renderConditionEditor.value()}
; + }; + + + const formItemClass = computed(() => { + const direction = labelAlign.value === 'top' ? 'vertical' : 'horizontal'; + return { + [bem()]: true, + [bem('', direction)]: true + }; + }); + + const labelClass = computed(() => { + const labelClasses = [bem('label'), bem('label', labelAlign.value)]; + if (shouldShowRequired.value === true) { + labelClasses.push(bem('label', 'required')); + } + return labelClasses.join(' '); + }); + + onMounted(() => { + elementRef.value.componentInstance = componentInstance; + + componentInstance.value.getPropConfig = (...args) => { + let propertyConfigSchema = propertyConfigSchemaMap[props.editor.type]; + if (propertyConfigSchema && Object.keys(propertyConfigSchema).length === 0 && editorRef && editorRef.value && editorRef.value?.getPropConfig) { + propertyConfigSchema = editorRef.value.getPropConfig(...args, componentInstance.value); + } + return propertyConfigSchema; + + }; + }); + + watch([ + () => props.label, + ], + ([newLabel])=>{ + label.value = newLabel; + } + + ) + + context.expose(componentInstance.value); + + return () => { + const innerSlots = { + title: renderLabel, + default: renderContent, + leftIcon: slots.leftIcon, + rightIcon: slots.rightIcon, + extra: slots.extra + }; + + return ( + + + ); + }; + + } +}); diff --git a/packages/mobile-ui-vue/components/form-item/src/designer/response-form-use-designer-rules.ts b/packages/mobile-ui-vue/components/form-item/src/designer/response-form-use-designer-rules.ts new file mode 100644 index 0000000000000000000000000000000000000000..66a89f6d3b0e75777905405a95670a2ede93eae3 --- /dev/null +++ b/packages/mobile-ui-vue/components/form-item/src/designer/response-form-use-designer-rules.ts @@ -0,0 +1,99 @@ +import { ComponentSchema, DesignerComponentInstance, DesignerHostService, DesignerItemContext, UseDesignerRules } from "@/components/designer-canvas"; +import { DraggingResolveContext } from "@/components/designer-canvas/src/composition/types"; +import { getSchemaByType } from "@/components/dynamic-resolver"; +import { ref } from "vue"; +import { ResponseFormProperty } from "../property-config/response-form.property-config"; + +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { + const schema = designItemContext.schema as ComponentSchema; + + const triggerBelongedComponentToMoveWhenMoved = ref(false); + + const triggerBelongedComponentToDeleteWhenDeleted = ref(false); + + const hideNestedPadding = true; + + const isInFixedContextRules = true; + + function canAccepts(draggingContext: DraggingResolveContext): boolean { + + return true; + } + + + function checkCanMoveComponent() { + return true + } + function checkCanDeleteComponent() { + return true; + } + + function hideNestedPaddingInDesginerView() { + return hideNestedPadding; + } + + /** + * 添加输入类控件后,将绑定信息同步到视图模型 + */ + function syncFieldToViewModel(resolveContext: DraggingResolveContext, editorType: string) { + const { bindingSourceContext, parentComponentInstance } = resolveContext; + if (bindingSourceContext?.entityFieldNode && parentComponentInstance) { + const designViewModelUtils = designerHostService?.designViewModelUtils; + const formSchemaUtils = designerHostService?.formSchemaUtils; + const viewModelId = formSchemaUtils.getViewModelIdByComponentId(parentComponentInstance.belongedComponentId); + + const dgViewModel = designViewModelUtils.getDgViewModel(viewModelId); + dgViewModel.removeField([bindingSourceContext.entityFieldNode.id]); + dgViewModel.addField(bindingSourceContext.designViewModelField); + if (editorType) { + dgViewModel.changeField(bindingSourceContext.entityFieldNode.id, { editor: { $type: editorType } }); + } + } + + } + + function onResolveNewComponentSchema(resolveContext: DraggingResolveContext, componentSchema: ComponentSchema): ComponentSchema { + const { label } = resolveContext; + let formGroupElementSchema; + // 控件若有绑定信息,则根据绑定信息创建控件 + if (resolveContext.bindingSourceContext?.entityFieldNode) { + const controlCreatorUtils = designerHostService?.controlCreatorUtils; + formGroupElementSchema = controlCreatorUtils.setFormFieldProperty(resolveContext.bindingSourceContext?.entityFieldNode, componentSchema.type); + } else { + formGroupElementSchema = getSchemaByType('form-item') as ComponentSchema; + formGroupElementSchema.editor = componentSchema; + formGroupElementSchema.label = label; + } + + syncFieldToViewModel(resolveContext, componentSchema.type); + + return formGroupElementSchema; + } + + function getStyles(): string { + return ' '; + } + + function getDesignerClass(): string { + return ' '; + } + + // 构造属性配置方法 + function getPropsConfig(componentId: string, componentInstance: DesignerComponentInstance) { + const inputGroupProps = new ResponseFormProperty(componentId, designerHostService); + return inputGroupProps.getPropertyConfig(schema, componentInstance); + } + + return { + canAccepts, + triggerBelongedComponentToMoveWhenMoved, + triggerBelongedComponentToDeleteWhenDeleted, + checkCanMoveComponent, + checkCanDeleteComponent, + hideNestedPaddingInDesginerView, + getStyles, + getDesignerClass, + onResolveNewComponentSchema, + getPropsConfig + }; +} diff --git a/packages/mobile-ui-vue/components/form-item/src/designer/response-form.design.component.tsx b/packages/mobile-ui-vue/components/form-item/src/designer/response-form.design.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..47b8f94a3998ff0e117264815dc91776bff02982 --- /dev/null +++ b/packages/mobile-ui-vue/components/form-item/src/designer/response-form.design.component.tsx @@ -0,0 +1,46 @@ +import { computed, defineComponent, inject, onMounted, ref } from 'vue'; +import { useDesignerRules } from './response-form-use-designer-rules'; +import { FormProps, formProps } from '../form.props'; +import { DesignerHostService, DesignerItemContext, useDesignerComponent } from '@/components/designer-canvas';; + +export default defineComponent({ + name: 'FResponseFormDesign', + props: formProps, + emits: [], + setup(props: FormProps, context) { + const elementRef = ref(); + const designItemContext = inject('design-item-context') as DesignerItemContext; + const designerHostService = inject('designer-host-service'); + const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); + const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); + + onMounted(() => { + elementRef.value.componentInstance = componentInstance; + }); + + context.expose(componentInstance.value); + + const responseFormClass = computed(() => { + const customClassArray = []; + const classObject = { + 'drag-container': true + } as Record; + customClassArray.reduce((result: Record, classString: string) => { + result[classString] = true; + return result; + }, classObject); + return classObject; + }); + + + return () => { + return ( + +
+ {context.slots.default && context.slots.default()} +
+ + ); + }; + } +}); diff --git a/packages/mobile-ui-vue/components/form-item/src/form-item.props.ts b/packages/mobile-ui-vue/components/form-item/src/form-item.props.ts index a50759b8f7ae1e1df91e59ba00f77d13812ee3fc..2952c339967d50a92dd1ea98c79058ce86aee3bc 100644 --- a/packages/mobile-ui-vue/components/form-item/src/form-item.props.ts +++ b/packages/mobile-ui-vue/components/form-item/src/form-item.props.ts @@ -35,7 +35,9 @@ export const formItemProps = { showErrorMessage: { type: Boolean, default: undefined }, /** 错误信息位置 */ - errorMessageAlign: { type: String as PropType, deafult: undefined } + errorMessageAlign: { type: String as PropType, deafult: undefined }, + + editor: { type: Object as PropType, default: {} }, }; diff --git a/packages/mobile-ui-vue/components/form-item/src/property-config/form-group.property-config.ts b/packages/mobile-ui-vue/components/form-item/src/property-config/form-group.property-config.ts new file mode 100644 index 0000000000000000000000000000000000000000..46c7790226cc47b929729384b0c75c52242b5d2c --- /dev/null +++ b/packages/mobile-ui-vue/components/form-item/src/property-config/form-group.property-config.ts @@ -0,0 +1,16 @@ +import { DesignerComponentInstance } from "@/components/designer-canvas"; +import { BaseControlProperty } from "@/components/property-panel"; + +export class FormGroupProperty extends BaseControlProperty { + constructor(componentId: string, designerHostService: any) { + super(componentId, designerHostService); + } + public getPropertyConfig(propertyData: any, componentInstance: DesignerComponentInstance) { + // 基本信息 + this.propertyConfig.categories['basic'] = this.getBasicPropConfig(propertyData); + // 外观 + this.propertyConfig.categories['appearance'] = this.getAppearanceConfig(propertyData); + + return this.propertyConfig; + } +} diff --git a/packages/mobile-ui-vue/components/form-item/src/property-config/response-form.property-config.ts b/packages/mobile-ui-vue/components/form-item/src/property-config/response-form.property-config.ts new file mode 100644 index 0000000000000000000000000000000000000000..d035881f762987cfe7844b1dd255dbc0e1f6e9cb --- /dev/null +++ b/packages/mobile-ui-vue/components/form-item/src/property-config/response-form.property-config.ts @@ -0,0 +1,16 @@ +import { DesignerComponentInstance } from "@/components/designer-canvas"; +import { BaseControlProperty } from "@/components/property-panel"; + +export class ResponseFormProperty extends BaseControlProperty { + constructor(componentId: string, designerHostService: any) { + super(componentId, designerHostService); + } + public getPropertyConfig(propertyData: any, componentInstance: DesignerComponentInstance) { + // 基本信息 + this.propertyConfig.categories['basic'] = this.getBasicPropConfig(propertyData); + // 外观 + this.propertyConfig.categories['appearance'] = this.getAppearanceConfig(propertyData); + + return this.propertyConfig; + } +} diff --git a/packages/mobile-ui-vue/components/form/index.ts b/packages/mobile-ui-vue/components/form/index.ts index c62036c15879eb0dde0ae82a2e597487bcd5bf72..f7cb3ad778c858201bedc13485a6cd933cfd6d3e 100644 --- a/packages/mobile-ui-vue/components/form/index.ts +++ b/packages/mobile-ui-vue/components/form/index.ts @@ -18,6 +18,7 @@ import { Plugin } from 'vue'; import { withInstall } from '@components/common'; import { propsResolver } from '@components/form-item/src/form.props'; import FormInstallless from '@components/form-item/src/form.component'; +import FormInstalllessDesign from '../form-item/src/designer/response-form.design.component'; const FORM_REGISTERED_NAME = 'form'; @@ -31,6 +32,14 @@ Form.register = ( propsResolverMap[FORM_REGISTERED_NAME] = propsResolver; }; +Form.registerDesigner = ( + componentMap: Record, propsResolverMap: Record, + configResolverMap: Record, resolverMap: Record +) => { + componentMap[FORM_REGISTERED_NAME] = FormInstalllessDesign; + propsResolverMap[FORM_REGISTERED_NAME] = propsResolver; +}; + export * from '@components/form-item/src/form.props'; export { Form }; export default Form as typeof Form & Plugin; diff --git a/packages/mobile-ui-vue/components/input-group/index.ts b/packages/mobile-ui-vue/components/input-group/index.ts index 6217bc10ace016128815be75ed3fdfce2d6f895c..30385677fe3df8f3ebe6ea0593bbe157e94b3ce8 100644 --- a/packages/mobile-ui-vue/components/input-group/index.ts +++ b/packages/mobile-ui-vue/components/input-group/index.ts @@ -1,6 +1,7 @@ import { withInstall } from '@components/common'; import { propsResolver } from './src/input-group.props'; import InputGroupInstallless from './src/input-group.component'; +import InputGroupDesign from './src/designer/input-group.design.component'; const INPUT_GROUP_REGISTERED_NAME = 'input-group'; @@ -13,6 +14,15 @@ InputGroup.register = ( componentMap[INPUT_GROUP_REGISTERED_NAME] = InputGroup; propsResolverMap[INPUT_GROUP_REGISTERED_NAME] = propsResolver; }; + +InputGroup.registerDesigner = ( + componentMap: Record, propsResolverMap: Record, + configResolverMap: Record, resolverMap: Record +) => { + componentMap[INPUT_GROUP_REGISTERED_NAME] = InputGroupDesign; + propsResolverMap[INPUT_GROUP_REGISTERED_NAME] = propsResolver; +}; + export * from './src/input-group.props'; export * from './src/types'; export { InputGroup }; diff --git a/packages/mobile-ui-vue/components/input-group/src/designer/input-group.design.component.tsx b/packages/mobile-ui-vue/components/input-group/src/designer/input-group.design.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..10ef1a9b3f769f8f246dd6b3316ae5f63997c429 --- /dev/null +++ b/packages/mobile-ui-vue/components/input-group/src/designer/input-group.design.component.tsx @@ -0,0 +1,50 @@ +/* eslint-disable no-use-before-define */ +/** + * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { computed, defineComponent, inject, onMounted, readonly, ref, SetupContext } from 'vue'; +import { InputGroup, InputProps, inputProps } from '../..'; +import { DesignerHostService, DesignerItemContext, useDesignerComponent } from '@/components/designer-canvas';; +import { useInputGroupDesignerRules } from './use-designer-rules'; + +export default defineComponent({ + name: 'FmInputGroupDesign', + props: inputProps, + emits: [] as (string[] & ThisType) | undefined, + setup(props: InputProps, context: SetupContext) { + const elementRef = ref(); + const designerHostService = inject('designer-host-service'); + const designItemContext = inject('design-item-context') as DesignerItemContext; + const designerRulesComposition = useInputGroupDesignerRules(designItemContext, designerHostService); + const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); + + onMounted(() => { + elementRef.value.componentInstance = componentInstance; + }); + + const inputGroupProps = computed(() => ({ + ...props, + editable: false + })); + + context.expose(componentInstance.value); + + return () => { + return ( + + ); + }; + } +}); diff --git a/packages/mobile-ui-vue/components/input-group/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/input-group/src/designer/use-designer-rules.ts new file mode 100644 index 0000000000000000000000000000000000000000..c6684e06dd71fdd2d955bd1ae60ae59d527e2728 --- /dev/null +++ b/packages/mobile-ui-vue/components/input-group/src/designer/use-designer-rules.ts @@ -0,0 +1,15 @@ +import { ComponentSchema, DesignerComponentInstance, DesignerItemContext, UseDesignerRules } from "@/components/designer-canvas"; +import { InputGroupProperty } from "../property-config/input-group.property-config"; +export function useInputGroupDesignerRules(designItemContext: DesignerItemContext, designerHostService): UseDesignerRules { + + const schema = designItemContext.schema as ComponentSchema; + + // 构造属性配置方法 + function getPropsConfig(componentId: string, componentInstance: DesignerComponentInstance) { + const inputGroupProps = new InputGroupProperty(componentId, designerHostService); + return inputGroupProps.getPropertyConfig(schema, componentInstance); + } + + return { getPropsConfig } as UseDesignerRules; + +} \ No newline at end of file diff --git a/packages/mobile-ui-vue/components/input-group/src/property-config/input-group.property-config.ts b/packages/mobile-ui-vue/components/input-group/src/property-config/input-group.property-config.ts new file mode 100644 index 0000000000000000000000000000000000000000..34037ac64d86a5db5c201f995969a8abb982bb08 --- /dev/null +++ b/packages/mobile-ui-vue/components/input-group/src/property-config/input-group.property-config.ts @@ -0,0 +1,34 @@ +import { InputBaseProperty } from "@/components/common/src/entity/input-base-property"; + +export class InputGroupProperty extends InputBaseProperty { + + constructor(componentId: string, designerHostService: any) { + super(componentId, designerHostService); + } + + + getEditorProperties(propertyData: any) { + const self = this; + const editorProperties = self.getComponentConfig(propertyData, { type: "radio-group" }, { + placeholder: { + description: "空值时,输入控件内的占位文本", + title: "提示文本", + type: "string" + } + }); + editorProperties['setPropertyRelates'] = function (changeObject) { + if (!changeObject) { + return; + } + switch (changeObject.propertyID) { + case 'data': { + + break; + } + } + }; + return editorProperties; + } + + +} diff --git a/packages/mobile-ui-vue/components/input-group/src/schema/input-group.schema.json b/packages/mobile-ui-vue/components/input-group/src/schema/input-group.schema.json index 4801efdefbc11d20a9c7512edb8a693f6a806ce0..03a53f1db637fbb2211dbbc8d1f983b57b88d86f 100644 --- a/packages/mobile-ui-vue/components/input-group/src/schema/input-group.schema.json +++ b/packages/mobile-ui-vue/components/input-group/src/schema/input-group.schema.json @@ -36,6 +36,38 @@ "description": "值变化事件", "type": "string", "default": "" + }, + "disable": { + "type": "string", + "default": false + }, + "readonly": { + "type": "string", + "default": false + }, + "title": { + "description": "", + "type": "string", + "default": "" + }, + "label": { + "description": "", + "type": "string", + "default": "" + }, + "lableWidth": { + "description": "", + "type": "number" + }, + "placeholder": { + "description": "", + "type": "string", + "default": "" + }, + "visible": { + "description": "", + "type": "boolean", + "default": true } }, "events": [ @@ -43,6 +75,8 @@ ], "required": [ "id", - "type" + "type", + "appearance", + "binding" ] } \ No newline at end of file diff --git a/packages/mobile-ui-vue/components/list-view/index.ts b/packages/mobile-ui-vue/components/list-view/index.ts index 5e571fa89826eb6b2a9f27e5b52ab69bd75bcd42..acf70aef1b26401cd1123f19c38ca3381f486c5c 100644 --- a/packages/mobile-ui-vue/components/list-view/index.ts +++ b/packages/mobile-ui-vue/components/list-view/index.ts @@ -1,23 +1,29 @@ import { withInstall } from '@components/common'; import ListViewInstallless from './src/list-view.component'; -import ListViewDesignInstallless from './src/designer/list-view.design.component'; +import ListViewDesign from './src/designer/list-view.design.component'; import { propsResolver } from './src/list-view.props'; const LIST_VIEW_REGISTER_NAME = 'list-view'; const ListView = withInstall(ListViewInstallless); -const ListViewDesign = withInstall(ListViewDesignInstallless); export * from './src/list-view.props'; -export { ListView, ListViewDesign }; +ListView.register = ( + componentMap: Record, propsResolverMap: Record, + configResolverMap: Record, resolverMap: Record +) => { + componentMap[LIST_VIEW_REGISTER_NAME] = ListView; + propsResolverMap[LIST_VIEW_REGISTER_NAME] = propsResolver; +} -export default { - register(componentMap: Record, propsResolverMap: Record, configResolverMap: Record): void { - componentMap[LIST_VIEW_REGISTER_NAME] = ListView; - propsResolverMap[LIST_VIEW_REGISTER_NAME] = propsResolver; - }, - registerDesigner(componentMap: Record, propsResolverMap: Record, configResolverMap: Record): void { - componentMap[LIST_VIEW_REGISTER_NAME] = ListViewDesign; - propsResolverMap[LIST_VIEW_REGISTER_NAME] = propsResolver; - } -}; +ListView.registerDesigner = ( + componentMap: Record, propsResolverMap: Record, + configResolverMap: Record, resolverMap: Record +) => { + componentMap[LIST_VIEW_REGISTER_NAME] = ListViewDesign; + propsResolverMap[LIST_VIEW_REGISTER_NAME] = propsResolver; +} + + +export { ListView }; +export default ListView ; diff --git a/packages/mobile-ui-vue/components/list-view/src/designer/list-view.design.component.tsx b/packages/mobile-ui-vue/components/list-view/src/designer/list-view.design.component.tsx index a8d0e4a15db763f9253993d8c1cdfe6a37a87dc0..613a425325fa7dfee2699a2aa362be2b99ca27f8 100644 --- a/packages/mobile-ui-vue/components/list-view/src/designer/list-view.design.component.tsx +++ b/packages/mobile-ui-vue/components/list-view/src/designer/list-view.design.component.tsx @@ -1,9 +1,9 @@ import { SetupContext, defineComponent, inject, onMounted, ref, computed } from 'vue'; -import { ListViewProps, listViewProps } from '../list-view.props'; +import { LIST_VIEW_NAME, ListViewProps, listViewProps } from '../list-view.props'; import { useDesignerRules } from './use-designer-rules'; -import { DesignerItemContext } from '../../../designer-canvas/src/types'; -import { useDesignerComponent } from '../../../designer-canvas/src/composition/function/use-designer-component'; -import ListView from '../list-view.component'; +import List from '@/components/list'; +import { useBem } from '@/components/common'; +import { DesignerHostService, DesignerItemContext, useDesignerComponent } from '@/components/designer-canvas'; export default defineComponent({ name: 'FmListViewDesign', @@ -11,8 +11,9 @@ export default defineComponent({ emits: [], setup(props: ListViewProps, context: SetupContext) { const elementRef = ref(); - const designItemContext = inject('design-item-context'); - const designerRulesComposition = useDesignerRules(designItemContext.schema, designItemContext.parent?.schema); + const designerHostService = inject('designer-host-service'); + const designItemContext = inject('design-item-context') as DesignerItemContext; + const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); onMounted(() => { @@ -26,10 +27,33 @@ export default defineComponent({ finished: true, })); + const { bem } = useBem(LIST_VIEW_NAME); + + const listViewClass = { + [bem()]: true, + [bem('', 'fill')]: true, + }; + + const listContentClass = { + [bem('content')]: true, + [bem('content', 'split')]: false, + }; + return () => ( -
- +
+
+ +
+
+
+ +
+
+ ); } }); diff --git a/packages/mobile-ui-vue/components/list-view/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/list-view/src/designer/use-designer-rules.ts index 2ea4e7382a8aafdcf4f3a789118d6b4203619dee..66f9e80cd93c0d7e1fe4f3420277aeb812b78501 100644 --- a/packages/mobile-ui-vue/components/list-view/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/list-view/src/designer/use-designer-rules.ts @@ -1,8 +1,9 @@ -import { nextTick, ref } from "vue"; -import { DesignerHTMLElement, DraggingResolveContext, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; -import { ComponentSchema } from "../../../designer-canvas/src/types"; +import { ref } from "vue"; +import { DesignerHostService, DraggingResolveContext, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; +import { ComponentProperty } from "../property-config/component.property-config"; +import { DesignerItemContext } from "@/components/designer-canvas"; -export function useDesignerRules(schema: ComponentSchema, parentSchema?: ComponentSchema): UseDesignerRules { +export function useDesignerRules(designItemContext: DesignerItemContext,designerHostService?: DesignerHostService): UseDesignerRules { const triggerBelongedComponentToMoveWhenMoved = ref(false); @@ -30,12 +31,20 @@ export function useDesignerRules(schema: ComponentSchema, parentSchema?: Compone } function getStyles(): string { - if (schema.fill) { - return 'flex: 1'; - } - return ''; + return 'flex: 1'; + + } + + /** + * 获取属性配置 + */ + function getPropsConfig(componentId: string) { + const componentProp = new ComponentProperty(componentId, designerHostService); + const { schema } = designItemContext; + return componentProp.getPropertyConfig(schema); } + return { canAccepts, triggerBelongedComponentToMoveWhenMoved, @@ -44,5 +53,6 @@ export function useDesignerRules(schema: ComponentSchema, parentSchema?: Compone checkCanDeleteComponent, hideNestedPaddingInDesginerView, getStyles, + getPropsConfig }; } diff --git a/packages/mobile-ui-vue/components/list-view/src/property-config/component.property-config.ts b/packages/mobile-ui-vue/components/list-view/src/property-config/component.property-config.ts new file mode 100644 index 0000000000000000000000000000000000000000..b1ea32df73850877997edd2d900d8ac770f8bc97 --- /dev/null +++ b/packages/mobile-ui-vue/components/list-view/src/property-config/component.property-config.ts @@ -0,0 +1,51 @@ +import { BaseControlProperty } from "@/components/property-panel"; + + +export class ComponentProperty extends BaseControlProperty { + constructor(componentId: string, designerHostService: any) { + super(componentId, designerHostService); + } + public getPropertyConfig(propertyData: any) { + // 基本信息 + this.propertyConfig.categories['basic'] = this.getBasicPropConfig(propertyData); + // 外观 + this.propertyConfig.categories['appearance'] = this.getAppearanceConfig(propertyData); + // 事件 + this.getEventPropConfig(propertyData); + return this.propertyConfig; + } + private getEventPropConfig(propertyData: any) { + const events = [ + { + label: "listClick", + name: "行点击事件", + } + ]; + const self = this; + const initialData = self.eventsEditorUtils['formProperties'](propertyData, self.viewModelId, events); + const properties = {}; + properties[self.viewModelId] = { + type: 'events-editor', + editor: { + initialData + } + }; + this.propertyConfig.categories['eventsEditor'] = { + title: '事件', + hideTitle: true, + properties, + // 这个属性,标记当属性变更得时候触发重新更新属性 + refreshPanelAfterChanged: true, + tabId: 'commands', + tabName: '交互', + setPropertyRelates(changeObject: any, data: any) { + const parameters = changeObject.propertyValue; + delete propertyData[self.viewModelId]; + if (parameters) { + parameters.setPropertyRelates = this.setPropertyRelates; // 添加自定义方法后,调用此回调方法,用于处理联动属性 + self.eventsEditorUtils.saveRelatedParameters(propertyData, self.viewModelId, parameters['events'], parameters); + } + } + }; + } +} diff --git a/packages/mobile-ui-vue/components/list-view/src/property-config/list-view.property-config.json b/packages/mobile-ui-vue/components/list-view/src/property-config/list-view.property-config.json index 49292d31b76722a0cc2cabce38fdec787db76a85..75c9494bb38f45b67ab5dd580d47377788251bc8 100644 --- a/packages/mobile-ui-vue/components/list-view/src/property-config/list-view.property-config.json +++ b/packages/mobile-ui-vue/components/list-view/src/property-config/list-view.property-config.json @@ -16,11 +16,7 @@ "type": { "description": "组件类型", "title": "控件类型", - "type": "select", - "editor": { - "type": "container", - "enum": [] - } + "type": "string" } } }, diff --git a/packages/mobile-ui-vue/components/modal/index.ts b/packages/mobile-ui-vue/components/modal/index.ts index cea142d232b19523b0d4a2dbd5b440257b5ef68c..ad48a036b87ac274deddb96ce85ae9ffe6236e95 100644 --- a/packages/mobile-ui-vue/components/modal/index.ts +++ b/packages/mobile-ui-vue/components/modal/index.ts @@ -19,12 +19,12 @@ import FModalService from './src/composition/modal.service'; export * from './src/modal.props'; -export const F_MODAL_SERVICE_TOKEN = Symbol('FModalService'); +export const FM_MODAL_SERVICE_TOKEN = Symbol('FModalService'); FModal.install = (app: App) => { app.component(FModal.name as string, FModal); const modalInstance = new FModalService(app); - app.provide(F_MODAL_SERVICE_TOKEN, modalInstance); + app.provide(FM_MODAL_SERVICE_TOKEN, modalInstance); app.provide('FModalService', modalInstance); }; diff --git a/packages/mobile-ui-vue/components/navbar/index.ts b/packages/mobile-ui-vue/components/navbar/index.ts index 2e20484d4c5792585824cfb00e36db78ee29c323..9860ea71a68be644e021eb6bd467e0af6cdc17e7 100644 --- a/packages/mobile-ui-vue/components/navbar/index.ts +++ b/packages/mobile-ui-vue/components/navbar/index.ts @@ -1,6 +1,7 @@ import { withInstall } from '@components/common'; import { propsResolver } from './src/navbar.props'; import NavbarInstallless from './src/navbar.component'; +import NavbarDesign from './src/designer/nav.design.component'; const NAVBAR_REGISTERED_NAME = 'navigation-bar'; @@ -10,5 +11,10 @@ Navbar.register = (componentMap: Record, propsResolverMap: Record, propsResolverMap: Record, configResolverMap: Record, resolverMap: Record) => { + componentMap[NAVBAR_REGISTERED_NAME] = NavbarDesign; + propsResolverMap[NAVBAR_REGISTERED_NAME] = propsResolver; +}; export { Navbar }; export default Navbar; diff --git a/packages/mobile-ui-vue/components/navbar/src/designer/nav.design.component.tsx b/packages/mobile-ui-vue/components/navbar/src/designer/nav.design.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..81d1d0cd355dc6c22f9af39b87a4481ccb4319a7 --- /dev/null +++ b/packages/mobile-ui-vue/components/navbar/src/designer/nav.design.component.tsx @@ -0,0 +1,51 @@ +/* eslint-disable no-use-before-define */ +/** + * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { computed, defineComponent, inject, onMounted, ref, SetupContext } from 'vue'; + +import Navbar from '../..'; +import { navbarProps, NavbarProps } from '../navbar.props'; +import { useDesignerRules } from './use-designer-rules'; +import { DesignerHostService, DesignerItemContext, useDesignerComponent } from '@/components/designer-canvas';; + +export default defineComponent({ + name: 'FNavDesign', + props: navbarProps, + emits: ['nav'] as (string[] & ThisType) | undefined, + setup(props: NavbarProps, context: SetupContext) { + const elementRef = ref(); + const designItemContext = inject('design-item-context') as DesignerItemContext; + const designerHostService = inject('designer-host-service'); + const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); + const componentInstance = useDesignerComponent(elementRef, designItemContext,designerRulesComposition); + + onMounted(() => { + elementRef.value.componentInstance = componentInstance; + }); + + context.expose(componentInstance.value); + + const navbarProps = computed(() => ({ + ...props, + })); + + return () => { + return ( + + ); + }; + } +}); diff --git a/packages/mobile-ui-vue/components/navbar/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/navbar/src/designer/use-designer-rules.ts new file mode 100644 index 0000000000000000000000000000000000000000..00566e382cc5582906676db94e046b186d445e18 --- /dev/null +++ b/packages/mobile-ui-vue/components/navbar/src/designer/use-designer-rules.ts @@ -0,0 +1,63 @@ +import { DesignerItemContext, UseDesignerRules } from "@/components/designer-canvas"; +import { DraggingResolveContext } from "@/components/designer-canvas/src/composition/types"; +import { nextTick, ref } from "vue"; +import { NavBarProperty } from "../property-config/navbar.property-config"; + +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService): UseDesignerRules { + + const triggerBelongedComponentToMoveWhenMoved = ref(false); + + const triggerBelongedComponentToDeleteWhenDeleted = ref(false); + + const hideNestedPadding = true; + + const isInFixedContextRules = true; + + function canAccepts(draggingContext: DraggingResolveContext): boolean { + + return false; + } + + + function checkCanMoveComponent() { + return true; + } + function checkCanDeleteComponent() { + return true; + } + + function hideNestedPaddingInDesginerView() { + return true; + } + + function getStyles(): string { + // return 'border-radius: 12px'; + return ' '; + } + + function getDesignerClass(): string { + return ' '; + } + + /** + * 获取属性配置 + */ + function getPropsConfig(componentId: string) { + const componentProp = new NavBarProperty(componentId, designerHostService); + const { schema } = designItemContext; + return componentProp.getPropertyConfig(schema); + } + + + return { + canAccepts, + triggerBelongedComponentToMoveWhenMoved, + triggerBelongedComponentToDeleteWhenDeleted, + checkCanMoveComponent, + checkCanDeleteComponent, + hideNestedPaddingInDesginerView, + getStyles, + getDesignerClass, + getPropsConfig + }; +} diff --git a/packages/mobile-ui-vue/components/navbar/src/property-config/navbar.property-config.ts b/packages/mobile-ui-vue/components/navbar/src/property-config/navbar.property-config.ts new file mode 100644 index 0000000000000000000000000000000000000000..e6a0c287c425c47b71cd83a70da622bae53c1000 --- /dev/null +++ b/packages/mobile-ui-vue/components/navbar/src/property-config/navbar.property-config.ts @@ -0,0 +1,31 @@ +import { BaseControlProperty } from "@/components/property-panel"; + +export class NavBarProperty extends BaseControlProperty { + constructor(componentId: string, designerHostService: any) { + super(componentId, designerHostService); + } + public getPropertyConfig(propertyData: any) { + // 基本信息 + this.propertyConfig.categories['basic'] = this.getBasicPropConfig(propertyData); + // 外观 + this.propertyConfig.categories['appearance'] = this.getAppearanceConfig(propertyData); + // 行为 + this.propertyConfig.categories['behavior'] = this.getBehaviorConfig(propertyData); + + return this.propertyConfig; + } + + private getBehaviorConfig(propertyData) { + return { + description: "基本信息", + title: "行为", + properties: { + title: { + title: "标题", + type: "string", + } + } + }; + } + +} diff --git a/packages/mobile-ui-vue/components/page-body-container/index.ts b/packages/mobile-ui-vue/components/page-body-container/index.ts index c6cfd478abb9b76031b6442618f97257633f1ecb..7d141367928f7dd9be645428318e1ec20ac536f4 100644 --- a/packages/mobile-ui-vue/components/page-body-container/index.ts +++ b/packages/mobile-ui-vue/components/page-body-container/index.ts @@ -16,7 +16,7 @@ */ import { withInstall } from '@components/common'; import PageBodyContainerInstallless from './src/page-body-container.component'; -import PageBodyContainerDesignInstallless from './src/designer/page-body-container.design.component'; +import PageBodyContainerDesign from './src/designer/page-body-container.design.component'; import { propsResolver } from './src/page-body-container.props'; const PAGE_BODY_CONTAINER_REGISTER_NAME = 'page-body-container'; @@ -27,13 +27,12 @@ PageBodyContainer.register = (componentMap: Record, propsResolverMa propsResolverMap[PAGE_BODY_CONTAINER_REGISTER_NAME] = propsResolver; }; -const PageBodyContainerDesign = withInstall(PageBodyContainerDesignInstallless); -PageBodyContainerDesign.registerDesigner = (componentMap: Record, propsResolverMap: Record, configResolverMap: Record): void => { +PageBodyContainer.registerDesigner = (componentMap: Record, propsResolverMap: Record, configResolverMap: Record): void => { componentMap[PAGE_BODY_CONTAINER_REGISTER_NAME] = PageBodyContainerDesign; propsResolverMap[PAGE_BODY_CONTAINER_REGISTER_NAME] = propsResolver; }; export * from './src/page-body-container.props'; -export { PageBodyContainer, PageBodyContainerDesign }; +export { PageBodyContainer }; export default PageBodyContainer; diff --git a/packages/mobile-ui-vue/components/page-body-container/src/designer/page-body-container.design.component.tsx b/packages/mobile-ui-vue/components/page-body-container/src/designer/page-body-container.design.component.tsx index a34c85bccae37c424e41a3e55ce698f8896b307b..8662cedfd43d3cc5621e5e9c568b0cff86a81b47 100644 --- a/packages/mobile-ui-vue/components/page-body-container/src/designer/page-body-container.design.component.tsx +++ b/packages/mobile-ui-vue/components/page-body-container/src/designer/page-body-container.design.component.tsx @@ -1,8 +1,7 @@ import { SetupContext, defineComponent, inject, onMounted, ref } from 'vue'; import { PageBodyContainerProps, pageBodyContainerProps } from '../page-body-container.props'; import { useDesignerRules } from './use-designer-rules'; -import { DesignerItemContext } from '../../../designer-canvas/src/types'; -import { useDesignerComponent } from '../../../designer-canvas/src/composition/function/use-designer-component'; +import { DesignerHostService, DesignerItemContext, useDesignerComponent } from '@/components/designer-canvas';; export default defineComponent({ name: 'FmPageBodyContainerDesign', @@ -10,8 +9,9 @@ export default defineComponent({ emits: [], setup(props: PageBodyContainerProps, context: SetupContext) { const elementRef = ref(); - const designItemContext = inject('design-item-context'); - const designerRulesComposition = useDesignerRules(designItemContext.schema, designItemContext.parent?.schema); + const designerHostService = inject('designer-host-service'); + const designItemContext = inject('design-item-context') as DesignerItemContext; + const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); onMounted(() => { diff --git a/packages/mobile-ui-vue/components/page-body-container/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/page-body-container/src/designer/use-designer-rules.ts index 8cfec6e7f9983a3992b45a68bbeb655203c6d952..f5fd184a2498b8e148e167fb74f8bb4c459eb941 100644 --- a/packages/mobile-ui-vue/components/page-body-container/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/page-body-container/src/designer/use-designer-rules.ts @@ -1,9 +1,10 @@ import { nextTick, ref } from "vue"; -import { DesignerHTMLElement, DraggingResolveContext, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; -import { ComponentSchema } from "../../../designer-canvas/src/types"; import { PAGE_BODY_CONTAINER_NAME } from '../page-body-container.props'; +import { DesignerHostService, DraggingResolveContext, UseDesignerRules } from "@/components/designer-canvas/src/composition/types"; +import { DesignerItemContext } from "@/components/designer-canvas"; +import { PageBodyContainerProperty } from "../property-config/page-body-container.property-config"; -export function useDesignerRules(schema: ComponentSchema, parentSchema?: ComponentSchema): UseDesignerRules { +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { const triggerBelongedComponentToMoveWhenMoved = ref(false); @@ -21,8 +22,8 @@ export function useDesignerRules(schema: ComponentSchema, parentSchema?: Compone 'float-container', 'navbar', ]; - const { controlType } = draggingContext; - if (unAcceptableControlTypes.includes(controlType)) { + const { componentType } = draggingContext; + if (unAcceptableControlTypes.includes(componentType)) { return false; } return true; @@ -30,10 +31,10 @@ export function useDesignerRules(schema: ComponentSchema, parentSchema?: Compone function checkCanMoveComponent() { - return !isInFixedContextRules; + return true; } function checkCanDeleteComponent() { - return !isInFixedContextRules; + return true; } function hideNestedPaddingInDesginerView() { @@ -44,6 +45,16 @@ export function useDesignerRules(schema: ComponentSchema, parentSchema?: Compone return PAGE_BODY_CONTAINER_NAME; } + /** + * 获取属性配置 + */ + function getPropsConfig(componentId: string) { + const componentProp = new PageBodyContainerProperty(componentId, designerHostService); + const { schema } = designItemContext; + return componentProp.getPropertyConfig(schema); + } + + return { canAccepts, triggerBelongedComponentToMoveWhenMoved, @@ -52,5 +63,6 @@ export function useDesignerRules(schema: ComponentSchema, parentSchema?: Compone checkCanDeleteComponent, hideNestedPaddingInDesginerView, getDesignerClass, + getPropsConfig }; } diff --git a/packages/mobile-ui-vue/components/page-body-container/src/page-body-container.props.ts b/packages/mobile-ui-vue/components/page-body-container/src/page-body-container.props.ts index bcca60bfc7b9caa787e10575351e5d0f613e53e6..4a4089bf75c9670616f7c447666b0f14751b8095 100644 --- a/packages/mobile-ui-vue/components/page-body-container/src/page-body-container.props.ts +++ b/packages/mobile-ui-vue/components/page-body-container/src/page-body-container.props.ts @@ -2,7 +2,6 @@ import { ExtractPropTypes } from 'vue'; import { createPropsResolver } from '../../dynamic-resolver'; import { schemaMapper } from './schema/schema-mapper'; import pageBodyContainerSchema from './schema/page-body-container.schema.json'; -import pageBodyContainerPropertyConfig from './property-config/page-body-container.property-config.json'; import { schemaResolver } from './schema/schema-resolver'; export const PAGE_BODY_CONTAINER_NAME = 'fm-page-body-container'; @@ -17,6 +16,5 @@ export const propsResolver = createPropsResolver( pageBodyContainerProps, pageBodyContainerSchema, schemaMapper, - schemaResolver, - pageBodyContainerPropertyConfig, + schemaResolver ); diff --git a/packages/mobile-ui-vue/components/page-body-container/src/property-config/page-body-container.property-config.json b/packages/mobile-ui-vue/components/page-body-container/src/property-config/page-body-container.property-config.json deleted file mode 100644 index e7b0c65f4e6464c830b5b97189c4d3c47e67cd00..0000000000000000000000000000000000000000 --- a/packages/mobile-ui-vue/components/page-body-container/src/property-config/page-body-container.property-config.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "title": "page-body-container", - "description": "A Farris Container Component", - "type": "object", - "categories": { - "basic": { - "description": "Basic Infomation", - "title": "基本信息", - "properties": { - "id": { - "description": "组件标识", - "title": "标识", - "type": "string", - "readonly": true - }, - "type": { - "description": "组件类型", - "title": "控件类型", - "type": "select", - "editor": { - "type": "container", - "enum": [] - } - } - } - }, - "behavior": { - "description": "", - "title": "行为", - "properties": { - "visible": { - "description": "运行时组件是否可见", - "type": "boolean", - "title": "是否可见", - "editor": { - "type": "combo-list", - "data": [ - { - "value": true, - "name": "是" - }, - { - "value": false, - "name": "否" - } - ] - } - } - } - } - } -} \ No newline at end of file diff --git a/packages/mobile-ui-vue/components/page-body-container/src/property-config/page-body-container.property-config.ts b/packages/mobile-ui-vue/components/page-body-container/src/property-config/page-body-container.property-config.ts new file mode 100644 index 0000000000000000000000000000000000000000..077bd5883ae86e04dbd548eb065661d440485675 --- /dev/null +++ b/packages/mobile-ui-vue/components/page-body-container/src/property-config/page-body-container.property-config.ts @@ -0,0 +1,15 @@ +import { BaseControlProperty } from "@/components/property-panel"; + +export class PageBodyContainerProperty extends BaseControlProperty { + constructor(componentId: string, designerHostService: any) { + super(componentId, designerHostService); + } + public getPropertyConfig(propertyData: any) { + // 基本信息 + this.propertyConfig.categories['basic'] = this.getBasicPropConfig(propertyData); + // 外观 + this.propertyConfig.categories['appearance'] = this.getAppearanceConfig(propertyData); + + return this.propertyConfig; + } +} diff --git a/packages/mobile-ui-vue/components/page-container/index.ts b/packages/mobile-ui-vue/components/page-container/index.ts index 00d8d010d3ff6288911c31b9c9cb754201a3ada1..4438af465e26fbc511fc2416655c2d2079cfc3e3 100644 --- a/packages/mobile-ui-vue/components/page-container/index.ts +++ b/packages/mobile-ui-vue/components/page-container/index.ts @@ -16,7 +16,7 @@ */ import { withInstall } from '@components/common'; import PageContainerInstallless from './src/page-container.component'; -import PageContainerDesignInstallless from './src/designer/page-container.design.component'; +import PageContainerDesign from './src/designer/page-container.design.component'; import { propsResolver } from './src/page-container.props'; const PAGE_CONTAINER_REGISTERED_NAME = 'page-container'; @@ -29,8 +29,7 @@ PageContainer.register = ( propsResolverMap[PAGE_CONTAINER_REGISTERED_NAME] = propsResolver; }; -const PageContainerDesign = withInstall(PageContainerDesignInstallless); -PageContainerDesign.registerDesigner = ( +PageContainer.registerDesigner = ( componentMap: Record, propsResolverMap: Record, configResolverMap: Record ): void => { componentMap[PAGE_CONTAINER_REGISTERED_NAME] = PageContainerDesign; @@ -38,5 +37,5 @@ PageContainerDesign.registerDesigner = ( }; export * from './src/page-container.props'; -export { PageContainer, PageContainerDesign }; +export { PageContainer }; export default PageContainer; diff --git a/packages/mobile-ui-vue/components/page-container/src/designer/page-container.design.component.tsx b/packages/mobile-ui-vue/components/page-container/src/designer/page-container.design.component.tsx index 5751301030d69b18d146006d2ea0c787d59155a9..f265911ef324b16b98bb6166fda208a354dfb087 100644 --- a/packages/mobile-ui-vue/components/page-container/src/designer/page-container.design.component.tsx +++ b/packages/mobile-ui-vue/components/page-container/src/designer/page-container.design.component.tsx @@ -1,8 +1,7 @@ import { SetupContext, defineComponent, inject, onMounted, ref } from 'vue'; import { PageContainerProps, pageContainerProps } from '../page-container.props'; import { useDesignerRules } from './use-designer-rules'; -import { DesignerItemContext } from '../../../designer-canvas/src/types'; -import { useDesignerComponent } from '../../../designer-canvas/src/composition/function/use-designer-component'; +import { DesignerHostService, DesignerItemContext, useDesignerComponent } from '@/components/designer-canvas';; export default defineComponent({ name: 'FmPageContainerDesign', @@ -10,8 +9,9 @@ export default defineComponent({ emits: [], setup(props: PageContainerProps, context: SetupContext) { const elementRef = ref(); - const designItemContext = inject('design-item-context'); - const designerRulesComposition = useDesignerRules(designItemContext.schema, designItemContext.parent?.schema); + const designerHostService = inject('designer-host-service'); + const designItemContext = inject('design-item-context') as DesignerItemContext; + const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); onMounted(() => { diff --git a/packages/mobile-ui-vue/components/page-container/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/page-container/src/designer/use-designer-rules.ts index 4b6ed1d438f239c9683b974c9dd045ccfb977037..dd317403bccd6f652be2665de7bc03c40596862b 100644 --- a/packages/mobile-ui-vue/components/page-container/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/page-container/src/designer/use-designer-rules.ts @@ -1,9 +1,10 @@ -import { nextTick, ref } from "vue"; -import { DesignerHTMLElement, DraggingResolveContext, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; -import { ComponentSchema } from "../../../designer-canvas/src/types"; +import { ref } from "vue"; import { PAGE_CONTAINER_NAME } from '../page-container.props'; +import { DesignerHostService, DesignerItemContext, UseDesignerRules } from "@/components/designer-canvas"; +import { DraggingResolveContext } from "@/components/designer-canvas/src/composition/types"; +import { PageContainerProperty } from "../property-config/page-container.property-config"; -export function useDesignerRules(schema: ComponentSchema, parentSchema?: ComponentSchema): UseDesignerRules { +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { const triggerBelongedComponentToMoveWhenMoved = ref(false); @@ -25,15 +26,15 @@ export function useDesignerRules(schema: ComponentSchema, parentSchema?: Compone 'page-footer-container', 'page-body-container', ]; - const { controlType, parentComponentInstance } = draggingContext; - if (!acceptableControlTypes.includes(controlType)) { + const { componentType, parentComponentInstance } = draggingContext; + if (!acceptableControlTypes.includes(componentType)) { return false; } - const shouldBeUnique = uniqueControlTypes.includes(controlType); + const shouldBeUnique = uniqueControlTypes.includes(componentType); if (shouldBeUnique) { - const parentComponent = parentComponentInstance?.value; + const parentComponent = parentComponentInstance; const contents: any[] = parentComponent?.contents || []; - const hasSameTypeControl = !!contents.find((content) => content.type === controlType); + const hasSameTypeControl = !!contents.find((content) => content.type === componentType); if (hasSameTypeControl) { return false; } @@ -43,7 +44,7 @@ export function useDesignerRules(schema: ComponentSchema, parentSchema?: Compone function checkCanMoveComponent() { - return !isInFixedContextRules; + return true; } function checkCanDeleteComponent() { return !isInFixedContextRules; @@ -54,13 +55,25 @@ export function useDesignerRules(schema: ComponentSchema, parentSchema?: Compone } function getStyles(): string { - return 'border-radius: 12px'; + // return 'border-radius: 12px'; + return ' '; } function getDesignerClass(): string { return PAGE_CONTAINER_NAME; } + + /** + * 获取属性配置 + */ + function getPropsConfig(componentId: string) { + const componentProp = new PageContainerProperty(componentId, designerHostService); + const { schema } = designItemContext; + return componentProp.getPropertyConfig(schema); + } + + return { canAccepts, triggerBelongedComponentToMoveWhenMoved, @@ -70,5 +83,6 @@ export function useDesignerRules(schema: ComponentSchema, parentSchema?: Compone hideNestedPaddingInDesginerView, getStyles, getDesignerClass, + getPropsConfig }; } diff --git a/packages/mobile-ui-vue/components/page-container/src/page-container.props.ts b/packages/mobile-ui-vue/components/page-container/src/page-container.props.ts index e981a24e0191205d2afe260a17f98b000321fca5..c7a084830ebdf8aac2c7e74799796862e25720ea 100644 --- a/packages/mobile-ui-vue/components/page-container/src/page-container.props.ts +++ b/packages/mobile-ui-vue/components/page-container/src/page-container.props.ts @@ -2,7 +2,6 @@ import { ExtractPropTypes } from 'vue'; import { createPropsResolver } from '../../dynamic-resolver'; import { schemaMapper } from './schema/schema-mapper'; import pageContainerSchema from './schema/page-container.schema.json'; -import pageContainerPropertyConfig from './property-config/page-container.property-config.json'; import { schemaResolver } from './schema/schema-resolver'; export const PAGE_CONTAINER_NAME = 'fm-page-container'; @@ -17,6 +16,5 @@ export const propsResolver = createPropsResolver( pageContainerProps, pageContainerSchema, schemaMapper, - schemaResolver, - pageContainerPropertyConfig, + schemaResolver ); diff --git a/packages/mobile-ui-vue/components/page-container/src/property-config/page-container.property-config.json b/packages/mobile-ui-vue/components/page-container/src/property-config/page-container.property-config.json deleted file mode 100644 index 7bc1352b99931c6bb7d2487f5dd0ed24147987c6..0000000000000000000000000000000000000000 --- a/packages/mobile-ui-vue/components/page-container/src/property-config/page-container.property-config.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "title": "page-container", - "description": "A Farris Container Component", - "type": "object", - "categories": { - "basic": { - "description": "Basic Infomation", - "title": "基本信息", - "properties": { - "id": { - "description": "组件标识", - "title": "标识", - "type": "string", - "readonly": true - }, - "type": { - "description": "组件类型", - "title": "控件类型", - "type": "select", - "editor": { - "type": "container", - "enum": [] - } - } - } - }, - "behavior": { - "description": "", - "title": "行为", - "properties": { - "visible": { - "description": "运行时组件是否可见", - "type": "boolean", - "title": "是否可见", - "editor": { - "type": "combo-list", - "data": [ - { - "value": true, - "name": "是" - }, - { - "value": false, - "name": "否" - } - ] - } - } - } - } - } -} \ No newline at end of file diff --git a/packages/mobile-ui-vue/components/page-container/src/property-config/page-container.property-config.ts b/packages/mobile-ui-vue/components/page-container/src/property-config/page-container.property-config.ts new file mode 100644 index 0000000000000000000000000000000000000000..9771ba1d932902554231b53f84448b05e84f9579 --- /dev/null +++ b/packages/mobile-ui-vue/components/page-container/src/property-config/page-container.property-config.ts @@ -0,0 +1,15 @@ +import { BaseControlProperty } from "@/components/property-panel"; + +export class PageContainerProperty extends BaseControlProperty { + constructor(componentId: string, designerHostService: any) { + super(componentId, designerHostService); + } + public getPropertyConfig(propertyData: any) { + // 基本信息 + this.propertyConfig.categories['basic'] = this.getBasicPropConfig(propertyData); + // 外观 + this.propertyConfig.categories['appearance'] = this.getAppearanceConfig(propertyData); + + return this.propertyConfig; + } +} diff --git a/packages/mobile-ui-vue/components/page-footer-container/index.ts b/packages/mobile-ui-vue/components/page-footer-container/index.ts index 1f3f9fcbbc28c59eee3e64c4620e27b22e57558c..e8cec7710aed0fbbf32342638ae21eb8a8d8dc72 100644 --- a/packages/mobile-ui-vue/components/page-footer-container/index.ts +++ b/packages/mobile-ui-vue/components/page-footer-container/index.ts @@ -16,7 +16,7 @@ */ import { withInstall } from '@components/common'; import PageFooterContainerInstallless from './src/page-footer-container.component'; -import PageFooterContainerDesignInstallless from './src/designer/page-footer-container.design.component'; +import PageFooterContainerDesign from './src/designer/page-footer-container.design.component'; import { propsResolver } from './src/page-footer-container.props'; const COMPONENT_TYPE = 'page-footer-container'; @@ -30,8 +30,7 @@ PageFooterContainer.register = ( propsResolverMap[COMPONENT_TYPE] = propsResolver; }; -const PageFooterContainerDesign = withInstall(PageFooterContainerDesignInstallless); -PageFooterContainerDesign.registerDesigner = ( +PageFooterContainer.registerDesigner = ( componentMap: Record, propsResolverMap: Record, configResolverMap: Record ): void => { @@ -40,5 +39,5 @@ PageFooterContainerDesign.registerDesigner = ( }; export * from './src/page-footer-container.props'; -export { PageFooterContainer, PageFooterContainerDesign }; +export { PageFooterContainer }; export default PageFooterContainer; diff --git a/packages/mobile-ui-vue/components/page-footer-container/src/designer/page-footer-container.design.component.tsx b/packages/mobile-ui-vue/components/page-footer-container/src/designer/page-footer-container.design.component.tsx index b91bd86138b6bf937d89094da802d4e0e119261b..8a2a197866585921e45999924c0bcb8bac67f7ac 100644 --- a/packages/mobile-ui-vue/components/page-footer-container/src/designer/page-footer-container.design.component.tsx +++ b/packages/mobile-ui-vue/components/page-footer-container/src/designer/page-footer-container.design.component.tsx @@ -1,8 +1,7 @@ import { SetupContext, defineComponent, inject, onMounted, ref } from 'vue'; import { PageFooterContainerProps, pageFooterContainerProps } from '../page-footer-container.props'; import { useDesignerRules } from './use-designer-rules'; -import { DesignerItemContext } from '../../../designer-canvas/src/types'; -import { useDesignerComponent } from '../../../designer-canvas/src/composition/function/use-designer-component'; +import { DesignerHostService, DesignerItemContext, useDesignerComponent } from '@/components/designer-canvas';; export default defineComponent({ name: 'FmPageFooterContainerDesign', @@ -10,8 +9,9 @@ export default defineComponent({ emits: [], setup(props: PageFooterContainerProps, context: SetupContext) { const elementRef = ref(); - const designItemContext = inject('design-item-context'); - const designerRulesComposition = useDesignerRules(designItemContext.schema, designItemContext.parent?.schema); + const designerHostService = inject('designer-host-service'); + const designItemContext = inject('design-item-context') as DesignerItemContext; + const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); onMounted(() => { diff --git a/packages/mobile-ui-vue/components/page-footer-container/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/page-footer-container/src/designer/use-designer-rules.ts index 646004bdb6dc73f9a0c0fcd2e1ee0ae2980e4123..d3d813ebed1d0b7679db289542a63ad0794d80e8 100644 --- a/packages/mobile-ui-vue/components/page-footer-container/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/page-footer-container/src/designer/use-designer-rules.ts @@ -1,9 +1,10 @@ import { ref } from "vue"; -import { DesignerHTMLElement, DraggingResolveContext, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; -import { ComponentSchema } from "../../../designer-canvas/src/types"; import { PAGE_FOOTER_CONTAINER_NAME } from '../page-footer-container.props'; +import { DesignerHostService, DesignerItemContext, UseDesignerRules } from "@/components/designer-canvas"; +import { DraggingResolveContext } from "@/components/designer-canvas/src/composition/types"; +import { PageFooterContainerProperty } from "../property-config/page-footer-container.property-config"; -export function useDesignerRules(schema: ComponentSchema, parentSchema?: ComponentSchema): UseDesignerRules { +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService?: DesignerHostService): UseDesignerRules { const triggerBelongedComponentToMoveWhenMoved = ref(false); @@ -18,8 +19,8 @@ export function useDesignerRules(schema: ComponentSchema, parentSchema?: Compone 'content-container', 'html-template', ]; - const { controlType } = draggingContext; - if (!acceptableControlTypes.includes(controlType)) { + const { componentType } = draggingContext; + if (!acceptableControlTypes.includes(componentType)) { return false; } return true; @@ -27,7 +28,7 @@ export function useDesignerRules(schema: ComponentSchema, parentSchema?: Compone function checkCanMoveComponent() { - return false; + return true; } function checkCanDeleteComponent() { return true; @@ -41,6 +42,16 @@ export function useDesignerRules(schema: ComponentSchema, parentSchema?: Compone return PAGE_FOOTER_CONTAINER_NAME; } + /** + * 获取属性配置 + */ + function getPropsConfig(componentId: string) { + const componentProp = new PageFooterContainerProperty(componentId, designerHostService); + const { schema } = designItemContext; + return componentProp.getPropertyConfig(schema); + } + + return { canAccepts, triggerBelongedComponentToMoveWhenMoved, @@ -49,5 +60,6 @@ export function useDesignerRules(schema: ComponentSchema, parentSchema?: Compone checkCanDeleteComponent, hideNestedPaddingInDesginerView, getDesignerClass, + getPropsConfig }; } diff --git a/packages/mobile-ui-vue/components/page-footer-container/src/page-footer-container.props.ts b/packages/mobile-ui-vue/components/page-footer-container/src/page-footer-container.props.ts index 6ed1c2031fc6a6456894b60c920e839ebc2f578f..79bc601420aaddff5d640050bc5f5d5e9e38e0be 100644 --- a/packages/mobile-ui-vue/components/page-footer-container/src/page-footer-container.props.ts +++ b/packages/mobile-ui-vue/components/page-footer-container/src/page-footer-container.props.ts @@ -2,7 +2,6 @@ import { ExtractPropTypes } from 'vue'; import { createPropsResolver } from '../../dynamic-resolver'; import { schemaMapper } from './schema/schema-mapper'; import pageFooterContainerSchema from './schema/page-footer-container.schema.json'; -import pageFooterContainerPropertyConfig from './property-config/page-footer-container.property-config.json'; import { schemaResolver } from './schema/schema-resolver'; export const PAGE_FOOTER_CONTAINER_NAME = 'fm-page-footer-container'; @@ -17,6 +16,5 @@ export const propsResolver = createPropsResolver( pageFooterContainerProps, pageFooterContainerSchema, schemaMapper, - schemaResolver, - pageFooterContainerPropertyConfig, + schemaResolver ); diff --git a/packages/mobile-ui-vue/components/page-footer-container/src/property-config/page-footer-container.property-config.json b/packages/mobile-ui-vue/components/page-footer-container/src/property-config/page-footer-container.property-config.json deleted file mode 100644 index a1a581a9ef8522da8113df7fbd529d4e6e2c32bf..0000000000000000000000000000000000000000 --- a/packages/mobile-ui-vue/components/page-footer-container/src/property-config/page-footer-container.property-config.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "title": "page-footer-container", - "description": "A Farris Container Component", - "type": "object", - "categories": { - "basic": { - "description": "Basic Infomation", - "title": "基本信息", - "properties": { - "id": { - "description": "组件标识", - "title": "标识", - "type": "string", - "readonly": true - }, - "type": { - "description": "组件类型", - "title": "控件类型", - "type": "select", - "editor": { - "type": "container", - "enum": [] - } - } - } - }, - "behavior": { - "description": "", - "title": "行为", - "properties": { - "visible": { - "description": "运行时组件是否可见", - "type": "boolean", - "title": "是否可见", - "editor": { - "type": "combo-list", - "data": [ - { - "value": true, - "name": "是" - }, - { - "value": false, - "name": "否" - } - ] - } - } - } - } - } -} \ No newline at end of file diff --git a/packages/mobile-ui-vue/components/page-footer-container/src/property-config/page-footer-container.property-config.ts b/packages/mobile-ui-vue/components/page-footer-container/src/property-config/page-footer-container.property-config.ts new file mode 100644 index 0000000000000000000000000000000000000000..066b9d66ca2472299e8a838d51892ec6685f7e76 --- /dev/null +++ b/packages/mobile-ui-vue/components/page-footer-container/src/property-config/page-footer-container.property-config.ts @@ -0,0 +1,15 @@ +import { BaseControlProperty } from "@/components/property-panel"; + +export class PageFooterContainerProperty extends BaseControlProperty { + constructor(componentId: string, designerHostService: any) { + super(componentId, designerHostService); + } + public getPropertyConfig(propertyData: any) { + // 基本信息 + this.propertyConfig.categories['basic'] = this.getBasicPropConfig(propertyData); + // 外观 + this.propertyConfig.categories['appearance'] = this.getAppearanceConfig(propertyData); + + return this.propertyConfig; + } +} diff --git a/packages/mobile-ui-vue/components/page-header-container/index.ts b/packages/mobile-ui-vue/components/page-header-container/index.ts index 92ddae7dab1d0f897a0a938d50378221782684bb..1a36319a7ec2e3110d255cb92a5f9ec6977215f4 100644 --- a/packages/mobile-ui-vue/components/page-header-container/index.ts +++ b/packages/mobile-ui-vue/components/page-header-container/index.ts @@ -16,7 +16,7 @@ */ import { withInstall } from '@components/common'; import PageHeaderContainerInstallless from './src/page-header-container.component'; -import PageHeaderContainerDesignInstallless from './src/designer/page-header-container.design.component'; +import PageHeaderContainerDesign from './src/designer/page-header-container.design.component'; import { propsResolver } from './src/page-header-container.props'; const PAGE_HEADER_CONTAINER_REGISTERED_NAME = 'page-header-container'; @@ -30,8 +30,7 @@ PageHeaderContainer.register = ( propsResolverMap[PAGE_HEADER_CONTAINER_REGISTERED_NAME] = propsResolver; }; -const PageHeaderContainerDesign = withInstall(PageHeaderContainerDesignInstallless); -PageHeaderContainerDesign.registerDesigner = ( +PageHeaderContainer.registerDesigner = ( componentMap: Record, propsResolverMap: Record, configResolverMap: Record ): void => { componentMap[PAGE_HEADER_CONTAINER_REGISTERED_NAME] = PageHeaderContainerDesign; @@ -39,5 +38,5 @@ PageHeaderContainerDesign.registerDesigner = ( }; export * from './src/page-header-container.props'; -export { PageHeaderContainer, PageHeaderContainerDesign }; +export { PageHeaderContainer }; export default PageHeaderContainer; diff --git a/packages/mobile-ui-vue/components/page-header-container/src/designer/page-header-container.design.component.tsx b/packages/mobile-ui-vue/components/page-header-container/src/designer/page-header-container.design.component.tsx index 9237dcb1f83b8dea580ffc48dc4c19e081906a2d..b43faef2fb8f4dbfbaa89a1a2d296edfdf04b3f3 100644 --- a/packages/mobile-ui-vue/components/page-header-container/src/designer/page-header-container.design.component.tsx +++ b/packages/mobile-ui-vue/components/page-header-container/src/designer/page-header-container.design.component.tsx @@ -1,8 +1,7 @@ import { SetupContext, defineComponent, inject, onMounted, ref } from 'vue'; import { PageHeaderContainerProps, pageHeaderContainerProps } from '../page-header-container.props'; import { useDesignerRules } from './use-designer-rules'; -import { DesignerItemContext } from '../../../designer-canvas/src/types'; -import { useDesignerComponent } from '../../../designer-canvas/src/composition/function/use-designer-component'; +import { DesignerHostService, DesignerItemContext, useDesignerComponent } from '@/components/designer-canvas';; export default defineComponent({ name: 'FmPageHeaderContainerDesign', @@ -10,8 +9,9 @@ export default defineComponent({ emits: [], setup(props: PageHeaderContainerProps, context: SetupContext) { const elementRef = ref(); - const designItemContext = inject('design-item-context'); - const designerRulesComposition = useDesignerRules(designItemContext.schema, designItemContext.parent?.schema); + const designItemContext = inject('design-item-context') as DesignerItemContext; + const designerHostService = inject('designer-host-service'); + const designerRulesComposition = useDesignerRules(designItemContext, designerHostService); const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); onMounted(() => { diff --git a/packages/mobile-ui-vue/components/page-header-container/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/page-header-container/src/designer/use-designer-rules.ts index 66ae67781958bb4175264566e73e53b89b7bb51d..9833f1936a97dcc6a8f82ab914f72311600699f4 100644 --- a/packages/mobile-ui-vue/components/page-header-container/src/designer/use-designer-rules.ts +++ b/packages/mobile-ui-vue/components/page-header-container/src/designer/use-designer-rules.ts @@ -1,9 +1,10 @@ import { ref } from "vue"; -import { DraggingResolveContext, UseDesignerRules } from "../../../designer-canvas/src/composition/types"; -import { ComponentSchema } from "../../../designer-canvas/src/types"; import { PAGE_HEADER_CONTAINER_NAME } from '../page-header-container.props'; +import { ComponentSchema, DesignerItemContext, UseDesignerRules } from "@/components/designer-canvas"; +import { DraggingResolveContext } from "@/components/designer-canvas/src/composition/types"; +import { PageHeaderContainerProperty } from "../property-config/page-header-container.property-config"; -export function useDesignerRules(schema: ComponentSchema, parentSchema?: ComponentSchema): UseDesignerRules { +export function useDesignerRules(designItemContext: DesignerItemContext, designerHostService): UseDesignerRules { const triggerBelongedComponentToMoveWhenMoved = ref(false); @@ -20,15 +21,15 @@ export function useDesignerRules(schema: ComponentSchema, parentSchema?: Compone const uniqueControlTypes = [ 'navbar', ]; - const { controlType, parentComponentInstance } = draggingContext; - if (!acceptableControlTypes.includes(controlType)) { + const { sourceType, parentComponentInstance } = draggingContext; + if (!acceptableControlTypes.includes(sourceType)) { return false; } - const shouldBeUnique = uniqueControlTypes.includes(controlType); + const shouldBeUnique = uniqueControlTypes.includes(sourceType); if (shouldBeUnique) { - const parentComponent = parentComponentInstance?.value; + const parentComponent = parentComponentInstance?.parent?.value; const contents: any[] = parentComponent?.contents || []; - const hasSameTypeControl = !!contents.find((content) => content.type === controlType); + const hasSameTypeControl = !!contents.find((content) => content.type === sourceType); if (hasSameTypeControl) { return false; } @@ -37,7 +38,7 @@ export function useDesignerRules(schema: ComponentSchema, parentSchema?: Compone } function checkCanMoveComponent() { - return false; + return true; } function checkCanDeleteComponent() { return true; @@ -50,6 +51,16 @@ export function useDesignerRules(schema: ComponentSchema, parentSchema?: Compone function getDesignerClass(): string { return PAGE_HEADER_CONTAINER_NAME; } + + /** + * 获取属性配置 + */ + function getPropsConfig(componentId: string) { + const componentProp = new PageHeaderContainerProperty(componentId, designerHostService); + const { schema } = designItemContext; + return componentProp.getPropertyConfig(schema); + } + return { canAccepts, @@ -59,5 +70,6 @@ export function useDesignerRules(schema: ComponentSchema, parentSchema?: Compone checkCanDeleteComponent, hideNestedPaddingInDesginerView, getDesignerClass, + getPropsConfig }; } diff --git a/packages/mobile-ui-vue/components/page-header-container/src/page-header-container.props.ts b/packages/mobile-ui-vue/components/page-header-container/src/page-header-container.props.ts index 1e8413a3f857baf71ce95bc591c6a45ef0da54c7..15901f23a8d81d15cb9711aa7fc7d72a76febbe5 100644 --- a/packages/mobile-ui-vue/components/page-header-container/src/page-header-container.props.ts +++ b/packages/mobile-ui-vue/components/page-header-container/src/page-header-container.props.ts @@ -2,7 +2,6 @@ import { ExtractPropTypes } from 'vue'; import { createPropsResolver } from '../../dynamic-resolver'; import { schemaMapper } from './schema/schema-mapper'; import pageHeaderContainerSchema from './schema/page-header-container.schema.json'; -import pageHeaderContainerPropertyConfig from './property-config/page-header-container.property-config.json'; import { schemaResolver } from './schema/schema-resolver'; export const PAGE_HEADER_CONTAINER_NAME = 'fm-page-header-container'; @@ -17,6 +16,5 @@ export const propsResolver = createPropsResolver( pageHeaderContainerProps, pageHeaderContainerSchema, schemaMapper, - schemaResolver, - pageHeaderContainerPropertyConfig, + schemaResolver ); diff --git a/packages/mobile-ui-vue/components/page-header-container/src/property-config/page-header-container.property-config.json b/packages/mobile-ui-vue/components/page-header-container/src/property-config/page-header-container.property-config.json deleted file mode 100644 index 9abbd5182e422b20f9b4deca436401874b6fd978..0000000000000000000000000000000000000000 --- a/packages/mobile-ui-vue/components/page-header-container/src/property-config/page-header-container.property-config.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "title": "page-header-container", - "description": "A Farris Container Component", - "type": "object", - "categories": { - "basic": { - "description": "Basic Infomation", - "title": "基本信息", - "properties": { - "id": { - "description": "组件标识", - "title": "标识", - "type": "string", - "readonly": true - }, - "type": { - "description": "组件类型", - "title": "控件类型", - "type": "select", - "editor": { - "type": "container", - "enum": [] - } - } - } - }, - "behavior": { - "description": "", - "title": "行为", - "properties": { - "visible": { - "description": "运行时组件是否可见", - "type": "boolean", - "title": "是否可见", - "editor": { - "type": "combo-list", - "data": [ - { - "value": true, - "name": "是" - }, - { - "value": false, - "name": "否" - } - ] - } - } - } - } - } -} \ No newline at end of file diff --git a/packages/mobile-ui-vue/components/page-header-container/src/property-config/page-header-container.property-config.ts b/packages/mobile-ui-vue/components/page-header-container/src/property-config/page-header-container.property-config.ts new file mode 100644 index 0000000000000000000000000000000000000000..9100e1f3740825514773ede9f50bc06c07f026c2 --- /dev/null +++ b/packages/mobile-ui-vue/components/page-header-container/src/property-config/page-header-container.property-config.ts @@ -0,0 +1,15 @@ +import { BaseControlProperty } from "@/components/property-panel"; + +export class PageHeaderContainerProperty extends BaseControlProperty { + constructor(componentId: string, designerHostService: any) { + super(componentId, designerHostService); + } + public getPropertyConfig(propertyData: any) { + // 基本信息 + this.propertyConfig.categories['basic'] = this.getBasicPropConfig(propertyData); + // 外观 + this.propertyConfig.categories['appearance'] = this.getAppearanceConfig(propertyData); + + return this.propertyConfig; + } +} diff --git a/packages/mobile-ui-vue/components/radio-group/index.ts b/packages/mobile-ui-vue/components/radio-group/index.ts index 70b9fbc50908ae65f02eb7e1a7f8de8fcdb2502e..4c196194195a36716fbcaa07eac604414aedcf17 100644 --- a/packages/mobile-ui-vue/components/radio-group/index.ts +++ b/packages/mobile-ui-vue/components/radio-group/index.ts @@ -1,9 +1,23 @@ import { withInstall } from '@components/common'; import RadioGroupInstallless from './src/radio-group.component'; +import { propsResolver } from './src/radio-group.props'; +import RadioGroupDesign from './src/designer/radio-group.design.component'; export * from './src/radio-group.props'; +const RADIO_GROUP_REGISTERED_NAME = 'radio-group'; + const RadioGroup = withInstall(RadioGroupInstallless); +RadioGroup.register = (componentMap: Record, propsResolverMap: Record, configResolverMap: Record, resolverMap: Record) => { + componentMap[RADIO_GROUP_REGISTERED_NAME] = RadioGroup; + propsResolverMap[RADIO_GROUP_REGISTERED_NAME] = propsResolver; +}; +RadioGroup.registerDesigner = (componentMap: Record, propsResolverMap: Record, configResolverMap: Record) => { + componentMap[RADIO_GROUP_REGISTERED_NAME] = RadioGroupDesign; + propsResolverMap[RADIO_GROUP_REGISTERED_NAME] = propsResolver; +}; + + export { RadioGroup }; export default RadioGroup; diff --git a/packages/mobile-ui-vue/components/radio-group/src/designer/radio-group.design.component.tsx b/packages/mobile-ui-vue/components/radio-group/src/designer/radio-group.design.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..ab423e6c7671297b130c77acbd13cb7743027f33 --- /dev/null +++ b/packages/mobile-ui-vue/components/radio-group/src/designer/radio-group.design.component.tsx @@ -0,0 +1,63 @@ +/* eslint-disable no-use-before-define */ +/** + * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { computed, defineComponent, inject, onMounted, readonly, ref, SetupContext } from 'vue'; +import RadioGroup, { RadioGroupProps, radioGroupProps } from '../..'; +import { DesignerHostService, DesignerItemContext, useDesignerComponent } from '@/components/designer-canvas'; +import { useRadioGroupDesignerRules } from './use-designer-rules'; +; + +export default defineComponent({ + name: 'FmRadioGroupDesign', + props: radioGroupProps, + emits: [] as (string[] & ThisType) | undefined, + setup(props: RadioGroupProps, context: SetupContext) { + const elementRef = ref(); + const designerHostService = inject('designer-host-service'); + const designItemContext = inject('design-item-context') as DesignerItemContext; + const designerRulesComposition = useRadioGroupDesignerRules(designItemContext, designerHostService); + const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); + + onMounted(() => { + elementRef.value.componentInstance = componentInstance; + }); + + const inputGroupProps = computed(() => ({ + ...props, + editable: false, + // options:[{ + // disabled: false, + // readonly: false, + // value: '1', + // text: '选项1' + // },{ + // disabled: false, + // readonly: false, + // value: '1', + // text: '选项1' + // }], + // direction:'horizontal' + })); + + context.expose(componentInstance.value); + + return () => { + return ( + + ); + }; + } +}); diff --git a/packages/mobile-ui-vue/components/radio-group/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/radio-group/src/designer/use-designer-rules.ts new file mode 100644 index 0000000000000000000000000000000000000000..e16b11842f6047473cc882af2011d3c717948987 --- /dev/null +++ b/packages/mobile-ui-vue/components/radio-group/src/designer/use-designer-rules.ts @@ -0,0 +1,15 @@ +import { ComponentSchema, DesignerComponentInstance, DesignerItemContext, UseDesignerRules } from "@/components/designer-canvas"; +import { RadioGroupProperty } from "../property-config/radio-group.property-config"; +export function useRadioGroupDesignerRules(designItemContext: DesignerItemContext, designerHostService): UseDesignerRules { + + const schema = designItemContext.schema as ComponentSchema; + + // 构造属性配置方法 + function getPropsConfig(componentId: string, componentInstance: DesignerComponentInstance) { + const radioGroupProps = new RadioGroupProperty(componentId, designerHostService); + return radioGroupProps.getPropertyConfig(schema, componentInstance); + } + + return { getPropsConfig } as UseDesignerRules; + +} \ No newline at end of file diff --git a/packages/mobile-ui-vue/components/radio-group/src/property-config/radio-group.property-config.ts b/packages/mobile-ui-vue/components/radio-group/src/property-config/radio-group.property-config.ts new file mode 100644 index 0000000000000000000000000000000000000000..d1b24caa3877e439a49ca1e06a46887762393397 --- /dev/null +++ b/packages/mobile-ui-vue/components/radio-group/src/property-config/radio-group.property-config.ts @@ -0,0 +1,53 @@ +import { InputBaseProperty } from "@/components/common/src/entity/input-base-property"; + +export class RadioGroupProperty extends InputBaseProperty { + + constructor(componentId: string, designerHostService: any) { + super(componentId, designerHostService); + } + + + getEditorProperties(propertyData: any) { + const self = this; + const editorProperties = self.getComponentConfig(propertyData, { type: "radio-group" }, { + placeholder: { + description: "空值时,输入控件内的占位文本", + title: "提示文本", + type: "string" + }, + direction: { + description: "", + title: "排列方向", + type: "enum", + editor: { + type: "combo-list", + textField: "value", + valueField: "key", + data: [{ "key": "horizontal", "value": "横向" }, { "key": "vertical", "value": "纵向" }] + } + }, + options: { + description: "", + title: "数据", + type: "array", + $converter: "/converter/enum-data.converter", + ...self.getItemCollectionEditor(propertyData, propertyData.editor.valueField, propertyData.editor.textField), + // 这个属性,标记当属性变更得时候触发重新更新属性 + refreshPanelAfterChanged: true, + } + }); + editorProperties['setPropertyRelates'] = function (changeObject) { + if (!changeObject) { + return; + } + switch (changeObject.propertyID) { + case 'data': { + + break; + } + } + }; + return editorProperties; + } + +} diff --git a/packages/mobile-ui-vue/components/radio-group/src/radio-group.props.ts b/packages/mobile-ui-vue/components/radio-group/src/radio-group.props.ts index 2e9da96c1980e3b20dd2d1b3d17422f0bc646f40..f246ce170f22f24a2a8d947a6702c7d9cba728f5 100644 --- a/packages/mobile-ui-vue/components/radio-group/src/radio-group.props.ts +++ b/packages/mobile-ui-vue/components/radio-group/src/radio-group.props.ts @@ -1,6 +1,10 @@ import { ExtractPropTypes, PropType } from 'vue'; import {CheckerShape, CheckerShapeMap } from '@components/checker'; import { CheckboxGroupContext, checkboxGroupProps } from '@components/checkbox-group'; +import { createPropsResolver } from '@/components/dynamic-resolver'; +import inputSchema from './schema/radio-group.schema.json'; +import { schemaMapper } from './schema/schema-mapper'; +import { schemaResolver } from './schema/schema-resolver'; export const RADIO_GROUP_NAME = 'fm-radio-group'; @@ -10,7 +14,7 @@ export const radioGroupProps = { shape: { type: String as PropType, default: CheckerShapeMap.Round }, modelValue: { type: [String, Number] , default: '' } -}; +} as Record; export type RadioGroupProps = ExtractPropTypes; @@ -19,3 +23,5 @@ type Merge = { }; export type RadioGroupContext = Merge void }>; + +export const propsResolver = createPropsResolver(radioGroupProps, inputSchema, schemaMapper, schemaResolver); diff --git a/packages/mobile-ui-vue/components/radio-group/src/schema/radio-group.schema.json b/packages/mobile-ui-vue/components/radio-group/src/schema/radio-group.schema.json new file mode 100644 index 0000000000000000000000000000000000000000..c24da46e4b0349294a5bcda1a984b712cecaf7ae --- /dev/null +++ b/packages/mobile-ui-vue/components/radio-group/src/schema/radio-group.schema.json @@ -0,0 +1,85 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://farris-design.gitee.io/radio-group.schema.json", + "title": "radio-group", + "description": "A Farris Input Component", + "type": "object", + "properties": { + "id": { + "description": "The unique identifier for a Input Group", + "type": "string" + }, + "type": { + "description": "The type string of Input Group component", + "type": "string", + "default": "radio-group" + }, + "appearance": { + "description": "", + "type": "object", + "properties": { + "class": { + "type": "string" + }, + "style": { + "type": "string" + } + }, + "default": {} + }, + "binding": { + "description": "", + "type": "object", + "default": {} + }, + "disable": { + "type": "string", + "default": false + }, + "readonly": { + "type": "string", + "default": false + }, + "title": { + "description": "", + "type": "string", + "default": "" + }, + "label": { + "description": "", + "type": "string", + "default": "" + }, + "lableWidth": { + "description": "", + "type": "number" + }, + "visible": { + "description": "", + "type": "boolean", + "default": true + }, + "options": { + "description": "", + "type": "array", + "default": [] + }, + "direction": { + "description": "", + "type": "string", + "default": "horizontal" + } + }, + "required": [ + "type", + "options", + "direction" + ], + "ignore": [ + "id", + "type", + "appearance", + "binding", + "visible" + ] +} \ No newline at end of file diff --git a/packages/mobile-ui-vue/components/radio-group/src/schema/schema-mapper.ts b/packages/mobile-ui-vue/components/radio-group/src/schema/schema-mapper.ts new file mode 100644 index 0000000000000000000000000000000000000000..abb57152ea8dfa6650169c7fe600d95ec65415f6 --- /dev/null +++ b/packages/mobile-ui-vue/components/radio-group/src/schema/schema-mapper.ts @@ -0,0 +1,5 @@ +import { MapperFunction, resolveAppearance } from '@/components/dynamic-resolver'; + +export const schemaMapper = new Map([ + ['appearance', resolveAppearance] +]); diff --git a/packages/mobile-ui-vue/components/radio-group/src/schema/schema-resolver.ts b/packages/mobile-ui-vue/components/radio-group/src/schema/schema-resolver.ts new file mode 100644 index 0000000000000000000000000000000000000000..660e1e609e11d876dc4227ce631026bfbee8312a --- /dev/null +++ b/packages/mobile-ui-vue/components/radio-group/src/schema/schema-resolver.ts @@ -0,0 +1,5 @@ +import { DynamicResolver } from "@/components/dynamic-resolver"; + +export function schemaResolver(resolver: DynamicResolver, schema: Record, context: Record): Record { + return schema; +} diff --git a/packages/mobile-ui-vue/components/textarea/index.ts b/packages/mobile-ui-vue/components/textarea/index.ts index 0926050f7e5875bb26802897b76f1b8a19c19473..b41ca39b337f65a5bb3ca781de054e03e14a6fcf 100644 --- a/packages/mobile-ui-vue/components/textarea/index.ts +++ b/packages/mobile-ui-vue/components/textarea/index.ts @@ -1,9 +1,23 @@ import { withInstall } from '@components/common'; import TextareaInstallless from './src/textarea.component'; +import TextareaDesign from './src/designer/textarea.design.component'; +import { propsResolver } from './src/textarea.props'; export * from './src/textarea.props'; +const TEXTAREA_REGISTERED_NAME = 'textarea'; + const Textarea = withInstall(TextareaInstallless); +Textarea.register = (componentMap: Record, propsResolverMap: Record, configResolverMap: Record, resolverMap: Record) => { + componentMap[TEXTAREA_REGISTERED_NAME] = Textarea; + propsResolverMap[TEXTAREA_REGISTERED_NAME] = propsResolver; +}; +Textarea.registerDesigner = (componentMap: Record, propsResolverMap: Record, configResolverMap: Record) => { + componentMap[TEXTAREA_REGISTERED_NAME] = TextareaDesign; + propsResolverMap[TEXTAREA_REGISTERED_NAME] = propsResolver; +}; + + export { Textarea }; export default Textarea; diff --git a/packages/mobile-ui-vue/components/textarea/src/designer/textarea.design.component.tsx b/packages/mobile-ui-vue/components/textarea/src/designer/textarea.design.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..9302b3507b30fba87188cd8b2cbe533e396437cb --- /dev/null +++ b/packages/mobile-ui-vue/components/textarea/src/designer/textarea.design.component.tsx @@ -0,0 +1,51 @@ +/* eslint-disable no-use-before-define */ +/** + * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { computed, defineComponent, inject, onMounted, readonly, ref, SetupContext } from 'vue'; +import { DesignerHostService, DesignerItemContext, useDesignerComponent } from '@/components/designer-canvas';import { TEXTAREA_NAME, textareaProps, TextareaProps } from '../textarea.props'; +import { useTextareaDesignerRules } from './use-designer-rules'; +import Textarea from '../..'; + + +export default defineComponent({ + name: 'FmTextareaDesign', + props: textareaProps, + emits: [] as (string[] & ThisType) | undefined, + setup(props: TextareaProps, context: SetupContext) { + const elementRef = ref(); + const designerHostService = inject('designer-host-service'); + const designItemContext = inject('design-item-context') as DesignerItemContext; + const designerRulesComposition = useTextareaDesignerRules(designItemContext, designerHostService); + const componentInstance = useDesignerComponent(elementRef, designItemContext, designerRulesComposition); + + onMounted(() => { + elementRef.value.componentInstance = componentInstance; + }); + + const inputGroupProps = computed(() => ({ + ...props, + editable: false + })); + + context.expose(componentInstance.value); + + return () => { + return ( + + ); + }; + } +}); diff --git a/packages/mobile-ui-vue/components/textarea/src/designer/use-designer-rules.ts b/packages/mobile-ui-vue/components/textarea/src/designer/use-designer-rules.ts new file mode 100644 index 0000000000000000000000000000000000000000..76cd82b5e68ba0cddc63ca31948c012fcce39b94 --- /dev/null +++ b/packages/mobile-ui-vue/components/textarea/src/designer/use-designer-rules.ts @@ -0,0 +1,20 @@ +import { ComponentSchema, DesignerComponentInstance, DesignerItemContext, UseDesignerRules } from "@/components/designer-canvas"; +import { TextareaProperty } from "../property-config/textarea.property-config"; +export function useTextareaDesignerRules(designItemContext: DesignerItemContext, designerHostService): UseDesignerRules { + + const schema = designItemContext.schema as ComponentSchema; + + /** + * 构造属性配置方法 + * @param componentId + * @param componentInstance + * @returns + */ + function getPropsConfig(componentId: string, componentInstance: DesignerComponentInstance) { + const inputGroupProps = new TextareaProperty(componentId, designerHostService); + return inputGroupProps.getPropertyConfig(schema, componentInstance); + } + + return { getPropsConfig } as UseDesignerRules; + +} \ No newline at end of file diff --git a/packages/mobile-ui-vue/components/textarea/src/property-config/textarea.property-config.ts b/packages/mobile-ui-vue/components/textarea/src/property-config/textarea.property-config.ts new file mode 100644 index 0000000000000000000000000000000000000000..7269a0228aaebac16d80055b55e06a2cdeeff708 --- /dev/null +++ b/packages/mobile-ui-vue/components/textarea/src/property-config/textarea.property-config.ts @@ -0,0 +1,34 @@ +import { InputBaseProperty } from "@/components/common/src/entity/input-base-property"; + +export class TextareaProperty extends InputBaseProperty { + + constructor(componentId: string, designerHostService: any) { + super(componentId, designerHostService); + } + + getEditorProperties(propertyData: any) { + return this.getComponentConfig(propertyData, { type: "textarea" }, { + placeholder: { + description: "空值时,输入控件内的占位文本", + title: "提示文本", + type: "string" + }, + rows: { + description: "", + title: "文本区域可见的行数", + type: "number", + editor: { + min: 0, + nullable:true + } + }, + showWordLimit: { + description: "", + title: "展示输入文本数量", + type: "boolean" + } + }); + } + + +} diff --git a/packages/mobile-ui-vue/components/textarea/src/schema/input.schema.json b/packages/mobile-ui-vue/components/textarea/src/schema/input.schema.json new file mode 100644 index 0000000000000000000000000000000000000000..1425b3ede9c419f7e9b86b6c90f9cb8bc5649d5a --- /dev/null +++ b/packages/mobile-ui-vue/components/textarea/src/schema/input.schema.json @@ -0,0 +1,75 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://farris-design.gitee.io/textarea.schema.json", + "title": "textarea", + "description": "A Farris Input Component", + "type": "object", + "properties": { + "id": { + "description": "The unique identifier for a Input Group", + "type": "string" + }, + "type": { + "description": "The type string of Input Group component", + "type": "string", + "default": "textarea" + }, + "appearance": { + "description": "", + "type": "object", + "properties": { + "class": { + "type": "string" + }, + "style": { + "type": "string" + } + }, + "default": {} + }, + "binding": { + "description": "", + "type": "object", + "default": {} + }, + "disable": { + "type": "string", + "default": false + }, + "readonly": { + "type": "string", + "default": false + }, + "title": { + "description": "", + "type": "string", + "default": "" + }, + "label": { + "description": "", + "type": "string", + "default": "" + }, + "lableWidth": { + "description": "", + "type": "number" + }, + "placeholder": { + "description": "", + "type": "string", + "default": "" + }, + "visible": { + "description": "", + "type": "boolean", + "default": true + } + }, + "required": [ + "id", + "type", + "appearance", + "binding", + "visible" + ] +} \ No newline at end of file diff --git a/packages/mobile-ui-vue/components/textarea/src/schema/schema-mapper.ts b/packages/mobile-ui-vue/components/textarea/src/schema/schema-mapper.ts new file mode 100644 index 0000000000000000000000000000000000000000..abb57152ea8dfa6650169c7fe600d95ec65415f6 --- /dev/null +++ b/packages/mobile-ui-vue/components/textarea/src/schema/schema-mapper.ts @@ -0,0 +1,5 @@ +import { MapperFunction, resolveAppearance } from '@/components/dynamic-resolver'; + +export const schemaMapper = new Map([ + ['appearance', resolveAppearance] +]); diff --git a/packages/mobile-ui-vue/components/textarea/src/schema/schema-resolver.ts b/packages/mobile-ui-vue/components/textarea/src/schema/schema-resolver.ts new file mode 100644 index 0000000000000000000000000000000000000000..660e1e609e11d876dc4227ce631026bfbee8312a --- /dev/null +++ b/packages/mobile-ui-vue/components/textarea/src/schema/schema-resolver.ts @@ -0,0 +1,5 @@ +import { DynamicResolver } from "@/components/dynamic-resolver"; + +export function schemaResolver(resolver: DynamicResolver, schema: Record, context: Record): Record { + return schema; +} diff --git a/packages/mobile-ui-vue/components/textarea/src/textarea.props.ts b/packages/mobile-ui-vue/components/textarea/src/textarea.props.ts index 7f06a76323c02c6b53abddabf0a4cc72951a5da5..9472bad540880286725158daa00fa5ae12bad792 100644 --- a/packages/mobile-ui-vue/components/textarea/src/textarea.props.ts +++ b/packages/mobile-ui-vue/components/textarea/src/textarea.props.ts @@ -1,5 +1,9 @@ import { ExtractPropTypes } from 'vue'; import { inputCommonProps } from '@/components/input-group'; +import { createPropsResolver } from '@/components/dynamic-resolver'; +import textareaSchema from './schema/input.schema.json'; +import { schemaMapper } from './schema/schema-mapper'; +import { schemaResolver } from './schema/schema-resolver'; export const TEXTAREA_NAME = 'FmTextarea'; @@ -15,6 +19,8 @@ export const textareaProps = { minHeight: { type: Number, default: undefined }, showWordLimit: { type: Boolean, default: undefined } -}; +} as Record; export type TextareaProps = ExtractPropTypes; + +export const propsResolver = createPropsResolver(textareaProps, textareaSchema, schemaMapper, schemaResolver); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8c0bd1486c2e2c1abc9cdcc46b488dcf3edec7b6..1042747773ac1eacb699255d9f6411ba3b4bfaca 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -293,7 +293,7 @@ importers: version: 5.1.0(vue@3.5.12(typescript@5.6.3)) vitepress: specifier: ^1.0.0-alpha.8 - version: 1.0.0-alpha.10(@types/node@18.19.57)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(terser@5.36.0)(typescript@5.6.3) + version: 1.0.0-alpha.10(@algolia/client-search@4.24.0)(@types/node@18.19.57)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@5.6.3) vitepress-theme-demoblock: specifier: 1.4.2 version: 1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(typescript@5.6.3) @@ -366,10 +366,10 @@ importers: version: 7.18.0(eslint@9.19.0(jiti@1.21.6))(typescript@4.9.5) '@vitejs/plugin-vue': specifier: ^4.0.0 - version: 4.6.2(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) + version: 4.6.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) '@vitejs/plugin-vue-jsx': specifier: ^3.0.0 - version: 3.1.0(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) + version: 3.1.0(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) '@vue/babel-plugin-jsx': specifier: ^1.1.1 version: 1.2.5(@babel/core@7.25.8) @@ -408,7 +408,7 @@ importers: version: 9.3.7 jest: specifier: ^29.0.0 - version: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3)) + version: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -444,19 +444,19 @@ importers: version: 4.9.5 vite: specifier: ^4.1.4 - version: 4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0) + version: 4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0) vite-plugin-dts: specifier: ^2.1.0 - version: 2.3.0(@types/node@20.5.1)(rollup@4.24.0)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)) + version: 2.3.0(@types/node@18.19.57)(rollup@4.24.0)(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)) vite-plugin-md: specifier: ^0.20.0 - version: 0.20.6(@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)) + version: 0.20.6(@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)) vite-svg-loader: specifier: ^4.0.0 version: 4.0.0 vitepress: specifier: 1.0.0-alpha.8 - version: 1.0.0-alpha.8(@algolia/client-search@4.24.0)(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) + version: 1.0.0-alpha.8(@algolia/client-search@4.24.0)(@types/node@18.19.57)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) vitepress-theme-demoblock: specifier: 1.4.2 version: 1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(typescript@4.9.5) @@ -480,10 +480,10 @@ importers: version: 9.0.7 '@vitejs/plugin-vue': specifier: ^4.0.0 - version: 4.6.2(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) + version: 4.6.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) '@vitejs/plugin-vue-jsx': specifier: ^3.0.0 - version: 3.1.0(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) + version: 3.1.0(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) commander: specifier: ^9.4.0 version: 9.5.0 @@ -504,13 +504,13 @@ importers: version: 4.9.5 vite: specifier: ^4.4.1 - version: 4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0) + version: 4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0) vite-plugin-css-injected-by-js: specifier: ^3.5.2 - version: 3.5.2(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)) + version: 3.5.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)) vite-plugin-dts: specifier: ^3.9.1 - version: 3.9.1(@types/node@20.5.1)(rollup@4.24.0)(typescript@4.9.5)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)) + version: 3.9.1(@types/node@18.19.57)(rollup@4.24.0)(typescript@4.9.5)(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)) devDependencies: rimraf: specifier: ^5.0.7 @@ -599,10 +599,10 @@ importers: version: 7.18.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.6.3) '@vitejs/plugin-vue': specifier: ^4.2.3 - version: 4.6.2(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)) + version: 4.6.2(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)) '@vitejs/plugin-vue-jsx': specifier: ^3.0.1 - version: 3.1.0(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)) + version: 3.1.0(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)) '@vue/babel-plugin-jsx': specifier: ^1.1.1 version: 1.2.5(@babel/core@7.25.8) @@ -638,7 +638,7 @@ importers: version: 9.3.7 jest: specifier: ^29.0.0 - version: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3)) + version: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) ora: specifier: ^6.1.2 version: 6.3.1 @@ -659,28 +659,28 @@ importers: version: 5.6.3 vite: specifier: ^5.3.3 - version: 5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) + version: 5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) vite-plugin-banner: specifier: ^0.8.0 version: 0.8.0 vite-plugin-dts: specifier: 3.9.1 - version: 3.9.1(@types/node@20.5.1)(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)) + version: 3.9.1(@types/node@18.19.57)(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)) vite-plugin-md: specifier: ^0.21.5 - version: 0.21.5(@vitejs/plugin-vue@4.6.2(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)) + version: 0.21.5(@vitejs/plugin-vue@4.6.2(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)) vite-svg-loader: specifier: ^5.1.0 version: 5.1.0(vue@3.5.12(typescript@5.6.3)) vitepress: specifier: ^1.0.0-alpha.8 - version: 1.0.0-alpha.10(@algolia/client-search@4.24.0)(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@5.6.3) + version: 1.0.0-alpha.10(@algolia/client-search@4.24.0)(@types/node@18.19.57)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@5.6.3) vitepress-theme-demoblock: specifier: 1.4.2 version: 1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(typescript@5.6.3) vitest: specifier: ^1.4.0 - version: 1.6.0(@types/node@20.5.1)(happy-dom@8.9.0)(jsdom@20.0.3)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) + version: 1.6.0(@types/node@18.19.57)(happy-dom@8.9.0)(jsdom@20.0.3)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) vue-tsc: specifier: ^2.0.0 version: 2.1.6(typescript@5.6.3) @@ -738,7 +738,7 @@ importers: version: 0.4.4(rollup@4.24.0) '@vitejs/plugin-vue': specifier: ^5.1.2 - version: 5.1.4(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)) + version: 5.1.4(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)) core-js: specifier: ^3.38.1 version: 3.39.0 @@ -762,10 +762,10 @@ importers: version: 5.6.3 vite: specifier: ^5.4.1 - version: 5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) + version: 5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) vite-plugin-dts: specifier: ^2.1.0 - version: 2.3.0(@types/node@20.5.1)(rollup@4.24.0)(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)) + version: 2.3.0(@types/node@18.19.57)(rollup@4.24.0)(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)) vue-tsc: specifier: ^2.0.29 version: 2.1.6(typescript@5.6.3) @@ -805,7 +805,7 @@ importers: version: 7.25.7 '@commitlint/cli': specifier: ^19.3.0 - version: 19.5.0(@types/node@20.5.1)(typescript@4.9.5) + version: 19.5.0(@types/node@18.19.57)(typescript@4.9.5) '@commitlint/config-conventional': specifier: ^19.2.0 version: 19.5.0 @@ -835,10 +835,10 @@ importers: version: 7.18.0(eslint@9.19.0(jiti@1.21.6))(typescript@4.9.5) '@vitejs/plugin-vue': specifier: ^4.2.3 - version: 4.6.2(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) + version: 4.6.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) '@vitejs/plugin-vue-jsx': specifier: ^3.0.1 - version: 3.1.0(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) + version: 3.1.0(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) '@vue/babel-plugin-jsx': specifier: ^1.1.1 version: 1.2.5(@babel/core@7.25.8) @@ -874,7 +874,7 @@ importers: version: 9.3.7 jest: specifier: ^29.0.0 - version: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3)) + version: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)) ora: specifier: ^6.1.2 version: 6.3.1 @@ -892,19 +892,19 @@ importers: version: 4.9.5 vite: specifier: ^4.4.1 - version: 4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0) + version: 4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0) vite-plugin-dts: specifier: ^2.1.0 - version: 2.3.0(@types/node@20.5.1)(rollup@4.24.0)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)) + version: 2.3.0(@types/node@18.19.57)(rollup@4.24.0)(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)) vite-plugin-md: specifier: ^0.20.0 - version: 0.20.6(@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)) + version: 0.20.6(@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)) vite-svg-loader: specifier: ^4.0.0 version: 4.0.0 vitepress: specifier: 1.0.0-alpha.8 - version: 1.0.0-alpha.8(@algolia/client-search@4.24.0)(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) + version: 1.0.0-alpha.8(@algolia/client-search@4.24.0)(@types/node@18.19.57)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) vitepress-theme-demoblock: specifier: 1.4.2 version: 1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(typescript@4.9.5) @@ -1022,7 +1022,7 @@ importers: version: 9.3.7 jest: specifier: ^29.0.0 - version: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)) + version: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -1109,17 +1109,17 @@ importers: version: 9.29.1(eslint@9.19.0(jiti@1.21.6)) vite-plugin-dts: specifier: ^2.1.0 - version: 2.3.0(@types/node@20.5.1)(rollup@4.24.0)(vite@3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)) + version: 2.3.0(@types/node@18.19.57)(rollup@4.24.0)(vite@3.2.11(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)) vue: specifier: ^3.2.37 version: 3.5.12(typescript@4.9.5) devDependencies: '@vitejs/plugin-vue': specifier: ^3.1.0 - version: 3.2.0(vite@3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) + version: 3.2.0(vite@3.2.11(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) '@vitejs/plugin-vue-jsx': specifier: ^2.0.1 - version: 2.1.1(vite@3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) + version: 2.1.1(vite@3.2.11(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) '@vue/babel-plugin-jsx': specifier: ^1.1.1 version: 1.2.5(@babel/core@7.25.8) @@ -1131,7 +1131,7 @@ importers: version: 4.9.5 vite: specifier: ^3.1.0 - version: 3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0) + version: 3.2.11(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0) vue-tsc: specifier: ^0.40.4 version: 0.40.13(typescript@4.9.5) @@ -1150,9 +1150,6 @@ importers: vue: specifier: ^3.2.37 version: 3.5.12(typescript@4.9.5) - vue-router: - specifier: '4' - version: 4.4.5(vue@3.5.12(typescript@4.9.5)) devDependencies: '@babel/parser': specifier: ^7.19.0 @@ -1192,10 +1189,10 @@ importers: version: 4.0.9 '@typescript-eslint/eslint-plugin': specifier: ^7.15.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5) + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.19.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.19.0(jiti@1.21.6))(typescript@4.9.5) '@typescript-eslint/parser': specifier: ^7.15.0 - version: 7.18.0(eslint@8.57.1)(typescript@4.9.5) + version: 7.18.0(eslint@9.19.0(jiti@1.21.6))(typescript@4.9.5) '@vitejs/plugin-vue': specifier: ^4.2.3 version: 4.6.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) @@ -1386,10 +1383,10 @@ importers: version: 7.18.0(eslint@9.19.0(jiti@1.21.6))(typescript@4.9.5) '@vitejs/plugin-vue': specifier: ^4.0.0 - version: 4.6.2(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) + version: 4.6.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) '@vitejs/plugin-vue-jsx': specifier: ^3.0.0 - version: 3.1.0(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) + version: 3.1.0(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) '@vue/babel-plugin-jsx': specifier: ^1.1.1 version: 1.2.5(@babel/core@7.25.8) @@ -1428,7 +1425,7 @@ importers: version: 9.3.7 jest: specifier: ^29.0.0 - version: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3)) + version: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -1452,19 +1449,19 @@ importers: version: 4.9.5 vite: specifier: ^4.1.4 - version: 4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0) + version: 4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0) vite-plugin-dts: specifier: ^2.1.0 - version: 2.3.0(@types/node@20.5.1)(rollup@4.24.0)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)) + version: 2.3.0(@types/node@18.19.57)(rollup@4.24.0)(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)) vite-plugin-md: specifier: ^0.20.0 - version: 0.20.6(@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)) + version: 0.20.6(@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)) vite-svg-loader: specifier: ^4.0.0 version: 4.0.0 vitepress: specifier: 1.0.0-alpha.8 - version: 1.0.0-alpha.8(@algolia/client-search@4.24.0)(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) + version: 1.0.0-alpha.8(@algolia/client-search@4.24.0)(@types/node@18.19.57)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) vitepress-theme-demoblock: specifier: 1.4.2 version: 1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(typescript@4.9.5) @@ -1475,8 +1472,150 @@ importers: specifier: ^1.2.0 version: 1.8.27(typescript@4.9.5) + packages/mobile-designer: + dependencies: + '@farris/mobile-ui-vue': + specifier: workspace:^ + version: link:../mobile-ui-vue + '@farris/ui-vue': + specifier: workspace:^ + version: link:../ui-vue + '@monaco-editor/loader': + specifier: ^1.4.0 + version: 1.4.0(monaco-editor@0.52.2) + monaco-editor: + specifier: ^0.52.2 + version: 0.52.2 + vue: + specifier: ^3.2.37 + version: 3.5.12(typescript@4.9.5) + devDependencies: + '@babel/parser': + specifier: ^7.19.0 + version: 7.25.8 + '@babel/preset-env': + specifier: ^7.19.0 + version: 7.25.8(@babel/core@7.25.8) + '@babel/preset-typescript': + specifier: ^7.18.0 + version: 7.25.7(@babel/core@7.25.8) + '@babel/traverse': + specifier: ^7.19.0 + version: 7.25.7 + '@commitlint/cli': + specifier: ^19.3.0 + version: 19.5.0(@types/node@18.19.57)(typescript@4.9.5) + '@commitlint/config-conventional': + specifier: ^19.2.0 + version: 19.5.0 + '@farris/cli': + specifier: workspace:^ + version: link:../cli + '@farris/designer-dragula': + specifier: 0.0.5 + version: 0.0.5 + '@testing-library/vue': + specifier: ^7.0.0 + version: 7.0.0(@vue/compiler-sfc@3.5.12)(vue@3.5.12(typescript@4.9.5)) + '@types/jest': + specifier: ^26.0.24 + version: 26.0.24 + '@types/jsonp': + specifier: ^0.2.3 + version: 0.2.3 + '@types/lodash.debounce': + specifier: ^4.0.7 + version: 4.0.9 + '@typescript-eslint/eslint-plugin': + specifier: ^7.15.0 + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.19.0(jiti@1.21.6))(typescript@4.9.5))(eslint@9.19.0(jiti@1.21.6))(typescript@4.9.5) + '@typescript-eslint/parser': + specifier: ^7.15.0 + version: 7.18.0(eslint@9.19.0(jiti@1.21.6))(typescript@4.9.5) + '@vitejs/plugin-vue': + specifier: ^4.2.3 + version: 4.6.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) + '@vitejs/plugin-vue-jsx': + specifier: ^3.0.1 + version: 3.1.0(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) + '@vue/babel-plugin-jsx': + specifier: ^1.1.1 + version: 1.2.5(@babel/core@7.25.8) + '@vue/compiler-sfc': + specifier: ^3.2.0 + version: 3.5.12 + '@vue/test-utils': + specifier: ^2.0.0 + version: 2.4.6 + '@vuedx/typecheck': + specifier: ^0.7.5 + version: 0.7.6 + '@vuedx/typescript-plugin-vue': + specifier: ^0.7.5 + version: 0.7.6 + babel-jest: + specifier: ^29.0.3 + version: 29.7.0(@babel/core@7.25.8) + chalk: + specifier: ^5.0.0 + version: 5.3.0 + commander: + specifier: ^9.4.0 + version: 9.5.0 + conventional-changelog-cli: + specifier: ^2.2.2 + version: 2.2.2 + happy-dom: + specifier: ^8.9.0 + version: 8.9.0 + inquirer: + specifier: ^9.1.1 + version: 9.3.7 + jest: + specifier: ^29.0.0 + version: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)) + ora: + specifier: ^6.1.2 + version: 6.3.1 + patch-vue-directive-ssr: + specifier: ^0.0.1 + version: 0.0.1 + sass: + specifier: ^1.32.2 + version: 1.80.3 + shelljs: + specifier: ^0.8.4 + version: 0.8.5 + typescript: + specifier: ^4.6.4 + version: 4.9.5 + vite: + specifier: ^4.4.1 + version: 4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0) + vite-plugin-dts: + specifier: ^2.1.0 + version: 2.3.0(@types/node@18.19.57)(rollup@4.24.0)(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)) + vite-plugin-md: + specifier: ^0.20.0 + version: 0.20.6(@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)) + vite-svg-loader: + specifier: ^4.0.0 + version: 4.0.0 + vitepress: + specifier: 1.0.0-alpha.8 + version: 1.0.0-alpha.8(@algolia/client-search@4.24.0)(@types/node@18.19.57)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) + vitepress-theme-demoblock: + specifier: 1.4.2 + version: 1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(typescript@4.9.5) + vue-tsc: + specifier: ^1.2.0 + version: 1.8.27(typescript@4.9.5) + packages/mobile-ui-vue: dependencies: + bignumber.js: + specifier: ^9.1.2 + version: 9.1.2 vue: specifier: ^3.2.37 version: 3.5.12(typescript@4.9.5) @@ -1531,7 +1670,7 @@ importers: version: 2.2.2 jest: specifier: ^29.0.0 - version: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3)) + version: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) patch-vue-directive-ssr: specifier: ^0.0.1 version: 0.0.1 @@ -1543,7 +1682,7 @@ importers: version: 4.9.5 vitepress: specifier: 1.0.0-alpha.10 - version: 1.0.0-alpha.10(@algolia/client-search@4.24.0)(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) + version: 1.0.0-alpha.10(@algolia/client-search@4.24.0)(@types/node@18.19.57)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) vitepress-theme-demoblock: specifier: 1.4.2 version: 1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(typescript@4.9.5) @@ -1640,10 +1779,10 @@ importers: version: 7.18.0(eslint@9.19.0(jiti@1.21.6))(typescript@4.9.5) '@vitejs/plugin-vue': specifier: ^4.0.0 - version: 4.6.2(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) + version: 4.6.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) '@vitejs/plugin-vue-jsx': specifier: ^3.0.0 - version: 3.1.0(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) + version: 3.1.0(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) '@vue/babel-plugin-jsx': specifier: ^1.1.1 version: 1.2.5(@babel/core@7.25.8) @@ -1679,7 +1818,7 @@ importers: version: 9.3.7 jest: specifier: ^29.0.0 - version: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3)) + version: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) ora: specifier: ^6.1.2 version: 6.3.1 @@ -1697,22 +1836,22 @@ importers: version: 4.9.5 vite: specifier: ^4.1.4 - version: 4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0) + version: 4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0) vite-plugin-banner: specifier: ^0.8.0 version: 0.8.0 vite-plugin-dts: specifier: ^2.1.0 - version: 2.3.0(@types/node@20.5.1)(rollup@4.24.0)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)) + version: 2.3.0(@types/node@18.19.57)(rollup@4.24.0)(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)) vite-plugin-md: specifier: ^0.20.0 - version: 0.20.6(@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)) + version: 0.20.6(@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)) vite-svg-loader: specifier: ^4.0.0 version: 4.0.0 vitepress: specifier: 1.0.0-alpha.8 - version: 1.0.0-alpha.8(@algolia/client-search@4.24.0)(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) + version: 1.0.0-alpha.8(@algolia/client-search@4.24.0)(@types/node@18.19.57)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) vitepress-theme-demoblock: specifier: 1.4.2 version: 1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(typescript@4.9.5) @@ -1773,7 +1912,7 @@ importers: version: 0.4.4(rollup@4.24.0) '@vitejs/plugin-vue': specifier: ^5.1.2 - version: 5.1.4(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)) + version: 5.1.4(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)) core-js: specifier: ^3.38.1 version: 3.39.0 @@ -1797,10 +1936,10 @@ importers: version: 5.6.3 vite: specifier: ^5.4.1 - version: 5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) + version: 5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) vite-plugin-dts: specifier: ^2.1.0 - version: 2.3.0(@types/node@20.5.1)(rollup@4.24.0)(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)) + version: 2.3.0(@types/node@18.19.57)(rollup@4.24.0)(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)) vue-tsc: specifier: ^2.0.29 version: 2.1.6(typescript@5.6.3) @@ -1845,7 +1984,7 @@ importers: version: 7.8.1 vite-plugin-dts: specifier: ^2.1.0 - version: 2.3.0(@types/node@20.5.1)(rollup@4.24.0)(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)) + version: 2.3.0(@types/node@18.19.57)(rollup@4.24.0)(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)) vue: specifier: ^3.2.37 version: 3.5.12(typescript@5.6.3) @@ -1894,10 +2033,10 @@ importers: version: 7.18.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.6.3) '@vitejs/plugin-vue': specifier: ^4.2.3 - version: 4.6.2(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)) + version: 4.6.2(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)) '@vitejs/plugin-vue-jsx': specifier: ^3.0.1 - version: 3.1.0(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)) + version: 3.1.0(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)) '@vue/babel-plugin-jsx': specifier: ^1.1.1 version: 1.2.5(@babel/core@7.25.8) @@ -1933,7 +2072,7 @@ importers: version: 9.3.7 jest: specifier: ^29.0.0 - version: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3)) + version: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) ora: specifier: ^6.1.2 version: 6.3.1 @@ -1951,25 +2090,25 @@ importers: version: 5.6.3 vite: specifier: ^5.3.3 - version: 5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) + version: 5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) vite-plugin-banner: specifier: ^0.8.0 version: 0.8.0 vite-plugin-md: specifier: ^0.21.5 - version: 0.21.5(@vitejs/plugin-vue@4.6.2(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)) + version: 0.21.5(@vitejs/plugin-vue@4.6.2(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)) vite-svg-loader: specifier: ^5.1.0 version: 5.1.0(vue@3.5.12(typescript@5.6.3)) vitepress: specifier: ^1.0.0-alpha.8 - version: 1.0.0-alpha.10(@algolia/client-search@4.24.0)(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@5.6.3) + version: 1.0.0-alpha.10(@algolia/client-search@4.24.0)(@types/node@18.19.57)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@5.6.3) vitepress-theme-demoblock: specifier: 1.4.2 version: 1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(typescript@5.6.3) vitest: specifier: ^1.4.0 - version: 1.6.0(@types/node@20.5.1)(happy-dom@8.9.0)(jsdom@20.0.3)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) + version: 1.6.0(@types/node@18.19.57)(happy-dom@8.9.0)(jsdom@20.0.3)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) vue-tsc: specifier: ^2.0.0 version: 2.1.6(typescript@5.6.3) @@ -12401,19 +12540,6 @@ snapshots: - '@types/node' - typescript - '@commitlint/cli@19.5.0(@types/node@20.5.1)(typescript@4.9.5)': - dependencies: - '@commitlint/format': 19.5.0 - '@commitlint/lint': 19.5.0 - '@commitlint/load': 19.5.0(@types/node@20.5.1)(typescript@4.9.5) - '@commitlint/read': 19.5.0 - '@commitlint/types': 19.5.0 - tinyexec: 0.3.1 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - typescript - '@commitlint/config-conventional@17.8.1': dependencies: conventional-changelog-conventionalcommits: 6.1.0 @@ -12497,13 +12623,13 @@ snapshots: '@commitlint/types': 17.8.1 '@types/node': 20.5.1 chalk: 4.1.2 - cosmiconfig: 8.3.6(typescript@5.6.3) + cosmiconfig: 8.3.6(typescript@4.9.5) cosmiconfig-typescript-loader: 4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.6.3))(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3))(typescript@5.6.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.6.3) + ts-node: 10.9.2(@types/node@18.19.57)(typescript@4.9.5) typescript: 5.6.3 transitivePeerDependencies: - '@swc/core' @@ -12541,22 +12667,6 @@ snapshots: - '@types/node' - typescript - '@commitlint/load@19.5.0(@types/node@20.5.1)(typescript@4.9.5)': - dependencies: - '@commitlint/config-validator': 19.5.0 - '@commitlint/execute-rule': 19.5.0 - '@commitlint/resolve-extends': 19.5.0 - '@commitlint/types': 19.5.0 - chalk: 5.3.0 - cosmiconfig: 9.0.0(typescript@4.9.5) - cosmiconfig-typescript-loader: 5.1.0(@types/node@20.5.1)(cosmiconfig@9.0.0(typescript@4.9.5))(typescript@4.9.5) - lodash.isplainobject: 4.0.6 - lodash.merge: 4.6.2 - lodash.uniq: 4.5.0 - transitivePeerDependencies: - - '@types/node' - - typescript - '@commitlint/message@17.8.1': {} '@commitlint/message@19.5.0': {} @@ -13137,42 +13247,6 @@ snapshots: - supports-color - ts-node -<<<<<<< HEAD - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5))': - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.19.57 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.9.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5)) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.8 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3))': dependencies: '@jest/console': 29.7.0 @@ -13208,8 +13282,6 @@ snapshots: - supports-color - ts-node -======= ->>>>>>> main '@jest/environment@29.7.0': dependencies: '@jest/fake-timers': 29.7.0 @@ -13366,7 +13438,7 @@ snapshots: '@jsdevtools/ez-spawn@3.0.4': dependencies: call-me-maybe: 1.0.2 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 string-argv: 0.3.2 type-detect: 4.1.0 @@ -13396,14 +13468,6 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor-model@7.28.13(@types/node@20.5.1)': - dependencies: - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@20.5.1) - transitivePeerDependencies: - - '@types/node' - '@microsoft/api-extractor-model@7.29.8(@types/node@18.19.57)': dependencies: '@microsoft/tsdoc': 0.15.0 @@ -13412,14 +13476,6 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor-model@7.29.8(@types/node@20.5.1)': - dependencies: - '@microsoft/tsdoc': 0.15.0 - '@microsoft/tsdoc-config': 0.17.0 - '@rushstack/node-core-library': 5.9.0(@types/node@20.5.1) - transitivePeerDependencies: - - '@types/node' - '@microsoft/api-extractor@7.43.0(@types/node@18.19.57)': dependencies: '@microsoft/api-extractor-model': 7.28.13(@types/node@18.19.57) @@ -13438,25 +13494,7 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.43.0(@types/node@20.5.1)': - dependencies: - '@microsoft/api-extractor-model': 7.28.13(@types/node@20.5.1) - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@20.5.1) - '@rushstack/rig-package': 0.5.2 - '@rushstack/terminal': 0.10.0(@types/node@20.5.1) - '@rushstack/ts-command-line': 4.19.1(@types/node@20.5.1) - lodash: 4.17.21 - minimatch: 3.0.8 - resolve: 1.22.8 - semver: 7.5.4 - source-map: 0.6.1 - typescript: 5.4.2 - transitivePeerDependencies: - - '@types/node' - - '@microsoft/api-extractor@7.47.11(@types/node@18.19.57)': + '@microsoft/api-extractor@7.47.11(@types/node@18.19.57)': dependencies: '@microsoft/api-extractor-model': 7.29.8(@types/node@18.19.57) '@microsoft/tsdoc': 0.15.0 @@ -13474,24 +13512,6 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.47.11(@types/node@20.5.1)': - dependencies: - '@microsoft/api-extractor-model': 7.29.8(@types/node@20.5.1) - '@microsoft/tsdoc': 0.15.0 - '@microsoft/tsdoc-config': 0.17.0 - '@rushstack/node-core-library': 5.9.0(@types/node@20.5.1) - '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.14.2(@types/node@20.5.1) - '@rushstack/ts-command-line': 4.23.0(@types/node@20.5.1) - lodash: 4.17.21 - minimatch: 3.0.8 - resolve: 1.22.8 - semver: 7.5.4 - source-map: 0.6.1 - typescript: 5.4.2 - transitivePeerDependencies: - - '@types/node' - '@microsoft/tsdoc-config@0.16.2': dependencies: '@microsoft/tsdoc': 0.14.2 @@ -13721,18 +13741,6 @@ snapshots: optionalDependencies: '@types/node': 18.19.57 - '@rushstack/node-core-library@3.66.1(@types/node@20.5.1)': - dependencies: - colors: 1.2.5 - fs-extra: 7.0.1 - import-lazy: 4.0.0 - jju: 1.4.0 - resolve: 1.22.8 - semver: 7.5.4 - z-schema: 5.0.5 - optionalDependencies: - '@types/node': 20.5.1 - '@rushstack/node-core-library@4.0.2(@types/node@18.19.57)': dependencies: fs-extra: 7.0.1 @@ -13744,17 +13752,6 @@ snapshots: optionalDependencies: '@types/node': 18.19.57 - '@rushstack/node-core-library@4.0.2(@types/node@20.5.1)': - dependencies: - fs-extra: 7.0.1 - import-lazy: 4.0.0 - jju: 1.4.0 - resolve: 1.22.8 - semver: 7.5.4 - z-schema: 5.0.5 - optionalDependencies: - '@types/node': 20.5.1 - '@rushstack/node-core-library@5.9.0(@types/node@18.19.57)': dependencies: ajv: 8.13.0 @@ -13768,19 +13765,6 @@ snapshots: optionalDependencies: '@types/node': 18.19.57 - '@rushstack/node-core-library@5.9.0(@types/node@20.5.1)': - dependencies: - ajv: 8.13.0 - ajv-draft-04: 1.0.0(ajv@8.13.0) - ajv-formats: 3.0.1(ajv@8.13.0) - fs-extra: 7.0.1 - import-lazy: 4.0.0 - jju: 1.4.0 - resolve: 1.22.8 - semver: 7.5.4 - optionalDependencies: - '@types/node': 20.5.1 - '@rushstack/rig-package@0.5.2': dependencies: resolve: 1.22.8 @@ -13798,13 +13782,6 @@ snapshots: optionalDependencies: '@types/node': 18.19.57 - '@rushstack/terminal@0.10.0(@types/node@20.5.1)': - dependencies: - '@rushstack/node-core-library': 4.0.2(@types/node@20.5.1) - supports-color: 8.1.1 - optionalDependencies: - '@types/node': 20.5.1 - '@rushstack/terminal@0.14.2(@types/node@18.19.57)': dependencies: '@rushstack/node-core-library': 5.9.0(@types/node@18.19.57) @@ -13812,13 +13789,6 @@ snapshots: optionalDependencies: '@types/node': 18.19.57 - '@rushstack/terminal@0.14.2(@types/node@20.5.1)': - dependencies: - '@rushstack/node-core-library': 5.9.0(@types/node@20.5.1) - supports-color: 8.1.1 - optionalDependencies: - '@types/node': 20.5.1 - '@rushstack/ts-command-line@4.19.1(@types/node@18.19.57)': dependencies: '@rushstack/terminal': 0.10.0(@types/node@18.19.57) @@ -13828,15 +13798,6 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@rushstack/ts-command-line@4.19.1(@types/node@20.5.1)': - dependencies: - '@rushstack/terminal': 0.10.0(@types/node@20.5.1) - '@types/argparse': 1.0.38 - argparse: 1.0.10 - string-argv: 0.3.2 - transitivePeerDependencies: - - '@types/node' - '@rushstack/ts-command-line@4.23.0(@types/node@18.19.57)': dependencies: '@rushstack/terminal': 0.14.2(@types/node@18.19.57) @@ -13846,15 +13807,6 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@rushstack/ts-command-line@4.23.0(@types/node@20.5.1)': - dependencies: - '@rushstack/terminal': 0.14.2(@types/node@20.5.1) - '@types/argparse': 1.0.38 - argparse: 1.0.10 - string-argv: 0.3.2 - transitivePeerDependencies: - - '@types/node' - '@sentry/core@5.30.0': dependencies: '@sentry/hub': 5.30.0 @@ -14181,7 +14133,7 @@ snapshots: '@typescript-eslint/eslint-plugin@8.18.0(@typescript-eslint/parser@8.18.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.19.0(jiti@1.21.6))(typescript@5.6.3)': dependencies: - '@eslint-community/regexpp': 4.11.1 + '@eslint-community/regexpp': 4.12.1 '@typescript-eslint/parser': 8.18.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.18.0 '@typescript-eslint/type-utils': 8.18.0(eslint@9.19.0(jiti@1.21.6))(typescript@5.6.3) @@ -14370,12 +14322,12 @@ snapshots: '@typescript-eslint/types': 8.18.0 eslint-visitor-keys: 4.2.0 - '@vitejs/plugin-vue-jsx@2.1.1(vite@3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5))': + '@vitejs/plugin-vue-jsx@2.1.1(vite@3.2.11(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5))': dependencies: '@babel/core': 7.25.8 '@babel/plugin-transform-typescript': 7.25.7(@babel/core@7.25.8) '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.25.8) - vite: 3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0) + vite: 3.2.11(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0) vue: 3.5.12(typescript@4.9.5) transitivePeerDependencies: - supports-color @@ -14390,22 +14342,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue-jsx@3.1.0(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5))': + '@vitejs/plugin-vue-jsx@3.1.0(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3))': dependencies: '@babel/core': 7.25.8 '@babel/plugin-transform-typescript': 7.25.7(@babel/core@7.25.8) '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.25.8) - vite: 4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0) - vue: 3.5.12(typescript@4.9.5) - transitivePeerDependencies: - - supports-color - - '@vitejs/plugin-vue-jsx@3.1.0(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3))': - dependencies: - '@babel/core': 7.25.8 - '@babel/plugin-transform-typescript': 7.25.7(@babel/core@7.25.8) - '@vue/babel-plugin-jsx': 1.2.5(@babel/core@7.25.8) - vite: 5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) + vite: 5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) vue: 3.5.12(typescript@5.6.3) transitivePeerDependencies: - supports-color @@ -14434,29 +14376,14 @@ snapshots: vite: 3.2.11(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0) vue: 3.5.12(typescript@5.6.3) - '@vitejs/plugin-vue@3.2.0(vite@3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5))': - dependencies: - vite: 3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0) - vue: 3.5.12(typescript@4.9.5) - - '@vitejs/plugin-vue@3.2.0(vite@3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3))': - dependencies: - vite: 3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0) - vue: 3.5.12(typescript@5.6.3) - '@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5))': dependencies: vite: 4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0) vue: 3.5.12(typescript@4.9.5) - '@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5))': + '@vitejs/plugin-vue@4.6.2(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3))': dependencies: - vite: 4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0) - vue: 3.5.12(typescript@4.9.5) - - '@vitejs/plugin-vue@4.6.2(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3))': - dependencies: - vite: 5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) + vite: 5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) vue: 3.5.12(typescript@5.6.3) '@vitejs/plugin-vue@5.1.4(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3))': @@ -14464,11 +14391,6 @@ snapshots: vite: 5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) vue: 3.5.12(typescript@5.6.3) - '@vitejs/plugin-vue@5.1.4(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3))': - dependencies: - vite: 5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) - vue: 3.5.12(typescript@5.6.3) - '@vitest/expect@0.29.8': dependencies: '@vitest/spy': 0.29.8 @@ -14872,14 +14794,14 @@ snapshots: - terser - vite - '@yankeeinlondon/builder-api@1.4.1(@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))': + '@yankeeinlondon/builder-api@1.4.1(@vitejs/plugin-vue@4.6.2(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))': dependencies: '@types/markdown-it': 12.2.3 '@yankeeinlondon/happy-wrapper': 2.10.1(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) fp-ts: 2.16.9 inferred-types: 0.37.6(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) markdown-it: 13.0.2 - vite-plugin-md: 0.22.5(@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)) + vite-plugin-md: 0.22.5(@vitejs/plugin-vue@4.6.2(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)) transitivePeerDependencies: - '@edge-runtime/vm' - '@vitejs/plugin-vue' @@ -14897,14 +14819,14 @@ snapshots: - terser - vite - '@yankeeinlondon/builder-api@1.4.1(@vitejs/plugin-vue@4.6.2(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))': + '@yankeeinlondon/builder-api@1.4.1(@vitejs/plugin-vue@5.1.4(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)))(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))': dependencies: '@types/markdown-it': 12.2.3 '@yankeeinlondon/happy-wrapper': 2.10.1(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) fp-ts: 2.16.9 - inferred-types: 0.37.6(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) + inferred-types: 0.37.6(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) markdown-it: 13.0.2 - vite-plugin-md: 0.22.5(@vitejs/plugin-vue@4.6.2(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)) + vite-plugin-md: 0.22.5(@vitejs/plugin-vue@5.1.4(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)))(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)) transitivePeerDependencies: - '@edge-runtime/vm' - '@vitejs/plugin-vue' @@ -14922,17 +14844,16 @@ snapshots: - terser - vite - '@yankeeinlondon/builder-api@1.4.1(@vitejs/plugin-vue@5.1.4(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)))(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))': + '@yankeeinlondon/builder-api@1.4.1(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)': dependencies: '@types/markdown-it': 12.2.3 '@yankeeinlondon/happy-wrapper': 2.10.1(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) fp-ts: 2.16.9 - inferred-types: 0.37.6(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) + inferred-types: 0.37.6(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) markdown-it: 13.0.2 - vite-plugin-md: 0.22.5(@vitejs/plugin-vue@5.1.4(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)))(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)) + vite-plugin-md: 0.22.5(@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)) transitivePeerDependencies: - '@edge-runtime/vm' - - '@vitejs/plugin-vue' - '@vitest/browser' - '@vitest/ui' - encoding @@ -14945,7 +14866,36 @@ snapshots: - sugarss - supports-color - terser - - vite + + '@yankeeinlondon/builder-api@1.4.1(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)': + dependencies: + '@types/markdown-it': 12.2.3 + '@yankeeinlondon/happy-wrapper': 2.10.1(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) + fp-ts: 2.16.9 + inferred-types: 0.37.6 + markdown-it: 13.0.2 + vite-plugin-md: 0.22.5(@vitejs/plugin-vue@5.1.4(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)))(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)) + transitivePeerDependencies: + - '@edge-runtime/vm' + - '@vitest/browser' + - '@vitest/ui' + - encoding + - jsdom + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + '@yankeeinlondon/gray-matter@6.2.1': + dependencies: + inferred-types: 0.37.6 + js-yaml: 4.1.0 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 '@yankeeinlondon/gray-matter@6.2.1(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)': dependencies: @@ -15024,13 +14974,9 @@ snapshots: acorn-globals@7.0.1: dependencies: - acorn: 8.13.0 + acorn: 8.14.0 acorn-walk: 8.3.4 - acorn-jsx@5.3.2(acorn@8.13.0): - dependencies: - acorn: 8.13.0 - acorn-jsx@5.3.2(acorn@8.14.0): dependencies: acorn: 8.14.0 @@ -15693,7 +15639,7 @@ snapshots: dependencies: bumpp: 8.2.1 callsites: 4.2.0 - inferred-types: 0.37.6(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) + inferred-types: 0.37.6 vitest: 0.25.8(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) transitivePeerDependencies: - '@edge-runtime/vm' @@ -16450,8 +16396,8 @@ snapshots: cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.6.3))(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3))(typescript@5.6.3): dependencies: '@types/node': 20.5.1 - cosmiconfig: 8.3.6(typescript@5.6.3) - ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.6.3) + cosmiconfig: 8.3.6(typescript@4.9.5) + ts-node: 10.9.2(@types/node@18.19.57)(typescript@4.9.5) typescript: 5.6.3 cosmiconfig-typescript-loader@5.1.0(@types/node@18.19.57)(cosmiconfig@9.0.0(typescript@4.9.5))(typescript@4.9.5): @@ -16468,21 +16414,14 @@ snapshots: jiti: 1.21.6 typescript: 5.6.3 - cosmiconfig-typescript-loader@5.1.0(@types/node@20.5.1)(cosmiconfig@9.0.0(typescript@4.9.5))(typescript@4.9.5): - dependencies: - '@types/node': 20.5.1 - cosmiconfig: 9.0.0(typescript@4.9.5) - jiti: 1.21.6 - typescript: 4.9.5 - - cosmiconfig@8.3.6(typescript@5.6.3): + cosmiconfig@8.3.6(typescript@4.9.5): dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 5.6.3 + typescript: 4.9.5 cosmiconfig@9.0.0(typescript@4.9.5): dependencies: @@ -16554,13 +16493,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3)): + create-jest@29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3)) + jest-config: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -17534,8 +17473,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.13.0 - acorn-jsx: 5.3.2(acorn@8.13.0) + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -18553,6 +18492,10 @@ snapshots: index-to-position@0.1.2: {} + inferred-types@0.37.6: + dependencies: + brilliant-errors: 0.7.3(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) + inferred-types@0.37.6(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0): dependencies: brilliant-errors: 0.7.3(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) @@ -19026,39 +18969,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3)): - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3)) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3)) - exit: 0.1.2 - import-local: 3.2.0 -<<<<<<< HEAD - jest-config: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5)) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - jest-cli@29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)): + jest-cli@29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)): dependencies: '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) + create-jest: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) -======= - jest-config: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3)) ->>>>>>> main + jest-config: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -19130,38 +19050,6 @@ snapshots: - babel-plugin-macros - supports-color -<<<<<<< HEAD - jest-config@29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5)): - dependencies: - '@babel/core': 7.25.8 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.8) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 18.19.57 - ts-node: 10.9.2(@types/node@20.5.1)(typescript@4.9.5) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - jest-config@29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)): dependencies: '@babel/core': 7.25.8 @@ -19188,41 +19076,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 18.19.57 - ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.6.3) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-config@29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5)): -======= - jest-config@29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3)): ->>>>>>> main - dependencies: - '@babel/core': 7.25.8 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.8) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 20.5.1 - ts-node: 10.9.2(@types/node@18.19.57)(typescript@5.6.3) + ts-node: 10.9.2(@types/node@18.19.57)(typescript@4.9.5) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -19490,28 +19344,12 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3)): - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3)) - '@jest/types': 29.6.3 - import-local: 3.2.0 -<<<<<<< HEAD - jest-cli: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5)) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - jest@29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)): + jest@29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)): dependencies: '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) -======= - jest-cli: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3)) ->>>>>>> main + jest-cli: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -19556,7 +19394,7 @@ snapshots: jsdom@20.0.3: dependencies: abab: 2.0.6 - acorn: 8.13.0 + acorn: 8.14.0 acorn-globals: 7.0.1 cssom: 0.5.0 cssstyle: 2.3.0 @@ -20200,7 +20038,7 @@ snapshots: mlly@1.7.2: dependencies: - acorn: 8.13.0 + acorn: 8.14.0 pathe: 1.1.2 pkg-types: 1.2.1 ufo: 1.5.4 @@ -22248,7 +22086,7 @@ snapshots: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 18.19.57 - acorn: 8.13.0 + acorn: 8.14.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 @@ -22257,7 +22095,6 @@ snapshots: typescript: 4.9.5 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - optional: true ts-node@10.9.2(@types/node@18.19.57)(typescript@5.6.3): dependencies: @@ -22277,24 +22114,6 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 20.5.1 - acorn: 8.13.0 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.6.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -22618,31 +22437,13 @@ snapshots: - supports-color - terser - vite-node@1.6.0(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0): - dependencies: - cac: 6.7.14 - debug: 4.3.7 - pathe: 1.1.2 - picocolors: 1.1.1 - vite: 5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - vite-plugin-banner@0.8.0: {} - vite-plugin-css-injected-by-js@3.5.2(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)): + vite-plugin-css-injected-by-js@3.5.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)): dependencies: - vite: 4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0) + vite: 4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0) - vite-plugin-dts@2.3.0(@types/node@18.19.57)(rollup@4.24.0)(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)): + vite-plugin-dts@2.3.0(@types/node@18.19.57)(rollup@4.24.0)(vite@3.2.11(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)): dependencies: '@babel/parser': 7.25.8 '@microsoft/api-extractor': 7.47.11(@types/node@18.19.57) @@ -22654,86 +22455,51 @@ snapshots: kolorist: 1.8.0 magic-string: 0.29.0 ts-morph: 18.0.0 - vite: 4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0) - transitivePeerDependencies: - - '@types/node' - - rollup - - supports-color - - vite-plugin-dts@2.3.0(@types/node@20.5.1)(rollup@4.24.0)(vite@3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)): - dependencies: - '@babel/parser': 7.25.8 - '@microsoft/api-extractor': 7.47.11(@types/node@20.5.1) - '@rollup/pluginutils': 5.1.2(rollup@4.24.0) - '@rushstack/node-core-library': 3.66.1(@types/node@20.5.1) - debug: 4.3.7 - fast-glob: 3.3.2 - fs-extra: 10.1.0 - kolorist: 1.8.0 - magic-string: 0.29.0 - ts-morph: 18.0.0 - vite: 3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0) + vite: 3.2.11(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-dts@2.3.0(@types/node@20.5.1)(rollup@4.24.0)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)): + vite-plugin-dts@2.3.0(@types/node@18.19.57)(rollup@4.24.0)(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)): dependencies: '@babel/parser': 7.25.8 - '@microsoft/api-extractor': 7.47.11(@types/node@20.5.1) + '@microsoft/api-extractor': 7.47.11(@types/node@18.19.57) '@rollup/pluginutils': 5.1.2(rollup@4.24.0) - '@rushstack/node-core-library': 3.66.1(@types/node@20.5.1) + '@rushstack/node-core-library': 3.66.1(@types/node@18.19.57) debug: 4.3.7 fast-glob: 3.3.2 fs-extra: 10.1.0 kolorist: 1.8.0 magic-string: 0.29.0 ts-morph: 18.0.0 - vite: 4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0) + vite: 4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-dts@2.3.0(@types/node@20.5.1)(rollup@4.24.0)(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)): + vite-plugin-dts@2.3.0(@types/node@18.19.57)(rollup@4.24.0)(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)): dependencies: '@babel/parser': 7.25.8 - '@microsoft/api-extractor': 7.47.11(@types/node@20.5.1) + '@microsoft/api-extractor': 7.47.11(@types/node@18.19.57) '@rollup/pluginutils': 5.1.2(rollup@4.24.0) - '@rushstack/node-core-library': 3.66.1(@types/node@20.5.1) + '@rushstack/node-core-library': 3.66.1(@types/node@18.19.57) debug: 4.3.7 fast-glob: 3.3.2 fs-extra: 10.1.0 kolorist: 1.8.0 magic-string: 0.29.0 ts-morph: 18.0.0 - vite: 5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) - transitivePeerDependencies: - - '@types/node' - - rollup - - supports-color - - vite-plugin-dts@3.9.1(@types/node@18.19.57)(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)): - dependencies: - '@microsoft/api-extractor': 7.43.0(@types/node@18.19.57) - '@rollup/pluginutils': 5.1.2(rollup@4.24.0) - '@vue/language-core': 1.8.27(typescript@5.6.3) - debug: 4.3.7 - kolorist: 1.8.0 - magic-string: 0.30.12 - typescript: 5.6.3 - vue-tsc: 1.8.27(typescript@5.6.3) - optionalDependencies: vite: 5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-dts@3.9.1(@types/node@20.5.1)(rollup@4.24.0)(typescript@4.9.5)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)): + vite-plugin-dts@3.9.1(@types/node@18.19.57)(rollup@4.24.0)(typescript@4.9.5)(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)): dependencies: - '@microsoft/api-extractor': 7.43.0(@types/node@20.5.1) + '@microsoft/api-extractor': 7.43.0(@types/node@18.19.57) '@rollup/pluginutils': 5.1.2(rollup@4.24.0) '@vue/language-core': 1.8.27(typescript@4.9.5) debug: 4.3.7 @@ -22742,15 +22508,15 @@ snapshots: typescript: 4.9.5 vue-tsc: 1.8.27(typescript@4.9.5) optionalDependencies: - vite: 4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0) + vite: 4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-dts@3.9.1(@types/node@20.5.1)(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)): + vite-plugin-dts@3.9.1(@types/node@18.19.57)(rollup@4.24.0)(typescript@5.6.3)(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)): dependencies: - '@microsoft/api-extractor': 7.43.0(@types/node@20.5.1) + '@microsoft/api-extractor': 7.43.0(@types/node@18.19.57) '@rollup/pluginutils': 5.1.2(rollup@4.24.0) '@vue/language-core': 1.8.27(typescript@5.6.3) debug: 4.3.7 @@ -22759,7 +22525,7 @@ snapshots: typescript: 5.6.3 vue-tsc: 1.8.27(typescript@5.6.3) optionalDependencies: - vite: 5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) + vite: 5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) transitivePeerDependencies: - '@types/node' - rollup @@ -22789,38 +22555,14 @@ snapshots: - terser - vite - vite-plugin-md@0.20.6(@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)): - dependencies: - '@yankeeinlondon/builder-api': 1.4.1(@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)) - '@yankeeinlondon/happy-wrapper': 2.10.1(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) - gray-matter: 4.0.3 - markdown-it: 13.0.2 - source-map-js: 1.2.1 - transitivePeerDependencies: - - '@edge-runtime/vm' - - '@vitejs/plugin-vue' - - '@vitest/browser' - - '@vitest/ui' - - encoding - - happy-dom - - jsdom - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - - vite - - vite-plugin-md@0.21.5(@vitejs/plugin-vue@4.6.2(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)): + vite-plugin-md@0.21.5(@vitejs/plugin-vue@4.6.2(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)): dependencies: - '@yankeeinlondon/builder-api': 1.4.1(@vitejs/plugin-vue@4.6.2(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)) + '@yankeeinlondon/builder-api': 1.4.1(@vitejs/plugin-vue@4.6.2(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)) '@yankeeinlondon/gray-matter': 6.2.1(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) '@yankeeinlondon/happy-wrapper': 2.10.1(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) markdown-it: 13.0.2 source-map-js: 1.2.1 - vite: 5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) + vite: 5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) transitivePeerDependencies: - '@edge-runtime/vm' - '@vitejs/plugin-vue' @@ -22864,7 +22606,7 @@ snapshots: vite-plugin-md@0.22.5(@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)): dependencies: '@vitejs/plugin-vue': 4.6.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) - '@yankeeinlondon/builder-api': 1.4.1(@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)) + '@yankeeinlondon/builder-api': 1.4.1(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) '@yankeeinlondon/gray-matter': 6.2.1(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) '@yankeeinlondon/happy-wrapper': 2.10.1(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) markdown-it: 13.0.2 @@ -22885,43 +22627,15 @@ snapshots: - supports-color - terser - vite-plugin-md@0.22.5(@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)): - dependencies: - '@vitejs/plugin-vue': 4.6.2(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) - '@yankeeinlondon/builder-api': 1.4.1(@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)) - '@yankeeinlondon/gray-matter': 6.2.1(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) - '@yankeeinlondon/happy-wrapper': 2.10.1(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) - markdown-it: 13.0.2 - source-map-js: 1.2.1 - vite: 4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0) - transitivePeerDependencies: - - '@edge-runtime/vm' - - '@vitest/browser' - - '@vitest/ui' - - encoding - - happy-dom - - jsdom - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - - vite-plugin-md@0.22.5(@vitejs/plugin-vue@4.6.2(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)): + vite-plugin-md@0.22.5(@vitejs/plugin-vue@4.6.2(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)): dependencies: - '@vitejs/plugin-vue': 4.6.2(vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)) -<<<<<<< HEAD - '@yankeeinlondon/builder-api': 1.4.1(@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0)) -======= - '@yankeeinlondon/builder-api': 1.4.1(@vitejs/plugin-vue@4.6.2(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)) ->>>>>>> main + '@vitejs/plugin-vue': 4.6.2(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)) + '@yankeeinlondon/builder-api': 1.4.1(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) '@yankeeinlondon/gray-matter': 6.2.1(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) '@yankeeinlondon/happy-wrapper': 2.10.1(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) markdown-it: 13.0.2 source-map-js: 1.2.1 - vite: 5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) + vite: 5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) transitivePeerDependencies: - '@edge-runtime/vm' - '@vitest/browser' @@ -22937,11 +22651,11 @@ snapshots: - supports-color - terser - vite-plugin-md@0.22.5(@vitejs/plugin-vue@5.1.4(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)))(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)): + vite-plugin-md@0.22.5(@vitejs/plugin-vue@5.1.4(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)))(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)): dependencies: '@vitejs/plugin-vue': 5.1.4(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)) - '@yankeeinlondon/builder-api': 1.4.1(@vitejs/plugin-vue@5.1.4(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)))(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)) - '@yankeeinlondon/gray-matter': 6.2.1(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) + '@yankeeinlondon/builder-api': 1.4.1(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) + '@yankeeinlondon/gray-matter': 6.2.1 '@yankeeinlondon/happy-wrapper': 2.10.1(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) markdown-it: 13.0.2 source-map-js: 1.2.1 @@ -22951,7 +22665,6 @@ snapshots: - '@vitest/browser' - '@vitest/ui' - encoding - - happy-dom - jsdom - less - lightningcss @@ -22993,18 +22706,6 @@ snapshots: sass: 1.80.3 terser: 5.36.0 - vite@3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0): - dependencies: - esbuild: 0.15.18 - postcss: 8.4.47 - resolve: 1.22.8 - rollup: 2.79.2 - optionalDependencies: - '@types/node': 20.5.1 - fsevents: 2.3.3 - sass: 1.80.3 - terser: 5.36.0 - vite@4.5.5(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0): dependencies: esbuild: 0.18.20 @@ -23016,17 +22717,6 @@ snapshots: sass: 1.80.3 terser: 5.36.0 - vite@4.5.5(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0): - dependencies: - esbuild: 0.18.20 - postcss: 8.4.47 - rollup: 3.29.5 - optionalDependencies: - '@types/node': 20.5.1 - fsevents: 2.3.3 - sass: 1.80.3 - terser: 5.36.0 - vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0): dependencies: esbuild: 0.21.5 @@ -23039,18 +22729,6 @@ snapshots: sass-embedded: 1.80.3 terser: 5.36.0 - vite@5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0): - dependencies: - esbuild: 0.21.5 - postcss: 8.4.47 - rollup: 4.24.0 - optionalDependencies: - '@types/node': 20.5.1 - fsevents: 2.3.3 - sass: 1.80.3 - sass-embedded: 1.80.3 - terser: 5.36.0 - vitepress-theme-demoblock@1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(typescript@4.9.5): dependencies: camelcase: 6.3.0 @@ -23165,16 +22843,16 @@ snapshots: - supports-color - typescript - vitepress@1.0.0-alpha.10(@algolia/client-search@4.24.0)(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5): + vitepress@1.0.0-alpha.10(@algolia/client-search@4.24.0)(@types/node@18.19.57)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5): dependencies: '@docsearch/css': 3.6.2 '@docsearch/js': 3.6.0(@algolia/client-search@4.24.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) - '@vitejs/plugin-vue': 3.2.0(vite@3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) + '@vitejs/plugin-vue': 3.2.0(vite@3.2.11(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) '@vue/devtools-api': 6.6.4 '@vueuse/core': 9.2.0(vue@3.5.12(typescript@4.9.5)) body-scroll-lock: 4.0.0-beta.0 shiki: 0.11.1 - vite: 3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0) + vite: 3.2.11(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0) vue: 3.5.12(typescript@4.9.5) transitivePeerDependencies: - '@algolia/client-search' @@ -23191,33 +22869,7 @@ snapshots: - terser - typescript - vitepress@1.0.0-alpha.10(@algolia/client-search@4.24.0)(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@5.6.3): - dependencies: - '@docsearch/css': 3.6.2 - '@docsearch/js': 3.6.0(@algolia/client-search@4.24.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) - '@vitejs/plugin-vue': 3.2.0(vite@3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)) - '@vue/devtools-api': 6.6.4 - '@vueuse/core': 9.2.0(vue@3.5.12(typescript@5.6.3)) - body-scroll-lock: 4.0.0-beta.0 - shiki: 0.11.1 - vite: 3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0) - vue: 3.5.12(typescript@5.6.3) - transitivePeerDependencies: - - '@algolia/client-search' - - '@types/node' - - '@types/react' - - '@vue/composition-api' - - less - - react - - react-dom - - sass - - search-insights - - stylus - - sugarss - - terser - - typescript - - vitepress@1.0.0-alpha.10(@types/node@18.19.57)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(terser@5.36.0)(typescript@5.6.3): + vitepress@1.0.0-alpha.10(@algolia/client-search@4.24.0)(@types/node@18.19.57)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@5.6.3): dependencies: '@docsearch/css': 3.6.2 '@docsearch/js': 3.6.0(@algolia/client-search@4.24.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) @@ -23269,38 +22921,12 @@ snapshots: - terser - typescript - vitepress@1.0.0-alpha.8(@algolia/client-search@4.24.0)(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5): - dependencies: - '@docsearch/css': 3.6.2 - '@docsearch/js': 3.6.2(@algolia/client-search@4.24.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) - '@vitejs/plugin-vue': 3.2.0(vite@3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) - '@vue/devtools-api': 6.6.4 - '@vueuse/core': 9.2.0(vue@3.5.12(typescript@4.9.5)) - body-scroll-lock: 4.0.0-beta.0 - shiki: 0.11.1 - vite: 3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0) - vue: 3.5.12(typescript@4.9.5) - transitivePeerDependencies: - - '@algolia/client-search' - - '@types/node' - - '@types/react' - - '@vue/composition-api' - - less - - react - - react-dom - - sass - - search-insights - - stylus - - sugarss - - terser - - typescript - vitest@0.25.8(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0): dependencies: '@types/chai': 4.3.20 '@types/chai-subset': 1.3.5 '@types/node': 18.19.57 - acorn: 8.13.0 + acorn: 8.14.0 acorn-walk: 8.3.4 chai: 4.5.0 debug: 4.3.7 @@ -23328,7 +22954,7 @@ snapshots: '@types/chai': 4.3.20 '@types/chai-subset': 1.3.5 '@types/node': 18.19.57 - acorn: 8.13.0 + acorn: 8.14.0 acorn-walk: 8.3.4 chai: 4.5.0 debug: 4.3.7 @@ -23463,7 +23089,7 @@ snapshots: - supports-color - terser - vitest@1.6.0(@types/node@20.5.1)(happy-dom@8.9.0)(jsdom@20.0.3)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0): + vitest@1.6.0(@types/node@18.19.57)(happy-dom@8.9.0)(jsdom@20.0.3)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0): dependencies: '@vitest/expect': 1.6.0 '@vitest/runner': 1.6.0 @@ -23482,11 +23108,11 @@ snapshots: strip-literal: 2.1.0 tinybench: 2.9.0 tinypool: 0.8.4 - vite: 5.4.9(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) - vite-node: 1.6.0(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) + vite: 5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) + vite-node: 1.6.0(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.5.1 + '@types/node': 18.19.57 happy-dom: 8.9.0 jsdom: 20.0.3 transitivePeerDependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 05d09d3eb0bb9bf8a4de949040eaabf3fafeb86a..60d8578af62fa28d2bd973ad22be96208afd5eb9 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -14,3 +14,4 @@ packages: - 'packages/ui-binding' - 'packages/farris-admin' - 'packages/code-editor' + - 'packages/mobile-designer'