提交 ac043064 编写于 作者: ibizdev's avatar ibizdev

4月11号提交

上级 d93b26ab
{
"name": "app",
"version": "0.1.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"adler-32": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz",
"integrity": "sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=",
"requires": {
"exit-on-epipe": "~1.0.1",
"printj": "~1.1.0"
}
},
"cfb": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/cfb/-/cfb-1.1.4.tgz",
"integrity": "sha512-rwFkl3aFO3f+ljR27YINwC0x8vPjyiEVbYbrTCKzspEf7Q++3THdfHVgJYNUbxNcupJECrLX+L40Mjm9hm/Bgw==",
"requires": {
"adler-32": "~1.2.0",
"commander": "^2.16.0",
"crc-32": "~1.2.0",
"printj": "~1.1.2"
}
},
"codepage": {
"version": "1.14.0",
"resolved": "https://registry.npmjs.org/codepage/-/codepage-1.14.0.tgz",
"integrity": "sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k=",
"requires": {
"commander": "~2.14.1",
"exit-on-epipe": "~1.0.1"
},
"dependencies": {
"commander": {
"version": "2.14.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz",
"integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw=="
}
}
},
"commander": {
"version": "2.17.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
"integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="
},
"crc-32": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz",
"integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==",
"requires": {
"exit-on-epipe": "~1.0.1",
"printj": "~1.1.0"
}
},
"exit-on-epipe": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
"integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw=="
},
"file-saver": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.2.tgz",
"integrity": "sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw=="
},
"frac": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz",
"integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA=="
},
"printj": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz",
"integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ=="
},
"raw-loader": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz",
"integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=",
"dev": true
},
"script-loader": {
"version": "0.7.2",
"resolved": "https://registry.npmjs.org/script-loader/-/script-loader-0.7.2.tgz",
"integrity": "sha512-UMNLEvgOAQuzK8ji8qIscM3GIrRCWN6MmMXGD4SD5l6cSycgGsCo0tX5xRnfQcoghqct0tjHjcykgI1PyBE2aA==",
"dev": true,
"requires": {
"raw-loader": "~0.5.1"
}
},
"ssf": {
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/ssf/-/ssf-0.10.3.tgz",
"integrity": "sha512-pRuUdW0WwyB2doSqqjWyzwCD6PkfxpHAHdZp39K3dp/Hq7f+xfMwNAWIi16DyrRg4gg9c/RvLYkJTSawTPTm1w==",
"requires": {
"frac": "~1.1.2"
}
},
"wmf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz",
"integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw=="
},
"xlsx": {
"version": "0.15.6",
"resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.15.6.tgz",
"integrity": "sha512-7vD9eutyLs65iDjNFimVN+gk/oDkfkCgpQUjdE82QgzJCrBHC4bGPH7fzKVyy0UPp3gyFVQTQEFJaWaAvZCShQ==",
"requires": {
"adler-32": "~1.2.0",
"cfb": "^1.1.4",
"codepage": "~1.14.0",
"commander": "~2.17.1",
"crc-32": "~1.2.0",
"exit-on-epipe": "~1.0.1",
"ssf": "~0.10.3",
"wmf": "~1.0.1"
}
}
}
}
......@@ -3,7 +3,7 @@
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "node --max_old_space_size=8102 ./node_modules/@vue/cli-service/bin/vue-cli-service serve --mode production",
"serve": "node --max_old_space_size=8102 ./node_modules/@vue/cli-service/bin/vue-cli-service serve --mode test",
"dev-serve": "node --max_old_space_size=8102 ./node_modules/@vue/cli-service/bin/vue-cli-service serve --mode development",
"build": "node --max_old_space_size=8102 ./node_modules/@vue/cli-service/bin/vue-cli-service build",
"dev-build": "node --max_old_space_size=8102 ./node_modules/@vue/cli-service/bin/vue-cli-service build --mode development",
......@@ -12,10 +12,19 @@
"lint": "vue-cli-service lint"
},
"dependencies": {
"@fullcalendar/core": "^4.4.0",
"@fullcalendar/daygrid": "^4.4.0",
"@fullcalendar/interaction": "^4.4.0",
"@fullcalendar/list": "^4.4.0",
"@fullcalendar/timegrid": "^4.4.0",
"@fullcalendar/vue": "^4.4.0",
"axios": "^0.19.1",
"core-js": "^3.4.4",
"echarts": "^4.6.0",
"element-ui": "^2.13.0",
"file-saver": "^2.0.2",
"font-awesome": "^4.7.0",
"interactjs": "^1.9.4",
"path-to-regexp": "^6.1.0",
"qs": "^6.9.1",
"rxjs": "^6.5.4",
......@@ -23,12 +32,15 @@
"view-design": "^4.1.0",
"vue": "^2.6.10",
"vue-class-component": "^7.0.2",
"vue-grid-layout": "^2.3.7",
"vue-i18n": "^8.15.3",
"vue-property-decorator": "^8.3.0",
"vue-router": "^3.1.3",
"vuex": "^3.1.2"
"vuex": "^3.1.2",
"xlsx": "^0.15.6"
},
"devDependencies": {
"@types/echarts": "^4.4.3",
"@types/jest": "^24.0.19",
"@types/mockjs": "^1.0.2",
"@types/qs": "^6.9.0",
......@@ -44,6 +56,7 @@
"less": "^3.0.4",
"less-loader": "^5.0.0",
"mockjs": "^1.1.0",
"script-loader": "^0.7.2",
"typescript": "~3.5.3",
"vue-template-compiler": "^2.6.10"
}
......
.loader {
position: relative;
width: 12.5em;
height: 12.5em;
transform: rotate(165deg);
}
.loader:before, .loader:after {
content: '';
position: absolute;
top: 50%;
left: 50%;
display: block;
width: 2.5em;
height: 2.5em;
border-radius: 1.25em;
transform: translate(-50%, -50%);
}
.loader:before {
animation: before 2s infinite;
}
.loader:after {
animation: after 2s infinite;
}
@keyframes before {
0% {
width: 2.5em;
box-shadow: 5em -2.5em rgba(88, 163, 243, 0.75), -5em 2.5em rgba(153, 202, 255, 0.75);
}
35% {
width: 12.5em;
box-shadow: 0 -2.5em rgba(88, 163, 243, 0.75), 0 2.5em rgba(153, 202, 255, 0.75);
}
70% {
width: 2.5em;
box-shadow: -5em -2.5em rgba(88, 163, 243, 0.75), 5em 2.5em rgba(153, 202, 255, 0.75);
}
100% {
box-shadow: 5em -2.5em rgba(88, 163, 243, 0.75), -5em 2.5em rgba(153, 202, 255, 0.75);
}
}
@keyframes after {
0% {
height: 2.5em;
box-shadow: 2.5em 5em rgba(224, 224, 224, 0.75), -2.5em -5em rgba(198, 200, 210, 0.75);
}
35% {
height: 12.5em;
box-shadow: 2.5em 0 rgba(224, 224, 224, 0.75), -2.5em 0 rgba(198, 200, 210, 0.75);
}
70% {
height: 2.5em;
box-shadow: 2.5em -5em rgba(224, 224, 224, 0.75), -2.5em 5em rgba(198, 200, 210, 0.75);
}
100% {
box-shadow: 2.5em 5em rgba(224, 224, 224, 0.75), -2.5em -5em rgba(198, 200, 210, 0.75);
}
}
/** * Attempt to center the whole thing! */
html, body {
height: 100%;
}
.loader {
position: absolute;
top: calc(50% - 6.25em);
left: calc(50% - 6.25em);
}
<template>
<div id='app'>
<router-view/>
<app-debug-actions />
<router-view v-if="isRouterAlive"/>
</div>
</template>
+<script lang='ts'>
import { Vue, Component, Provide } from 'vue-property-decorator';
import store from '@/store';
import { LoadAppData } from '@/utils';
@Component({
})
export default class App extends Vue {
/**
* 控制视图是否显示
*/
public isRouterAlive:boolean = false;
/**
* 向后代注入加载行为
*/
@Provide()
public reload = this.viewreload;
/**
* vue生命周期
*/
public created(){
this.loadAppData();
}
/**
* 视图重新加载
*/
public viewreload () {
this.isRouterAlive = false;
this.$nextTick(function () {
this.isRouterAlive = true;
})
}
/**
* 视图加载代码表
*/
public async loadAppData(){
const _store:any = store;
if(_store.state && _store.state.codelists && _store.state.codelists.length >0){
this.isRouterAlive = true;
return;
}else{
await LoadAppData.getInstance().load(store);
this.isRouterAlive = true;
}
}
}
</script>
<style lang='less'>
@import './styles/default.less';
</style>
......@@ -3,9 +3,14 @@ import { UIActionTool } from './utils/uiaction-tool/uiaction-tool';
import { Verify } from './utils/verify/verify';
import { Util } from './utils/util/util';
import { Http } from './utils/http/http';
import { exportExcel } from './utils/export/export';
import { AppPopover } from './utils/app-popover/app-popover';
import { AppModal } from './utils/app-modal/app-modal';
import { AppDrawer } from './utils/app-drawer/app-drawer';
import { uiServiceRegister } from '@/uiservice/ui-service-register';
import { utilServiceRegister } from '@/utilservice/util-service-register';
import { entityServiceRegister } from '@/service/entity-service-register';
import { counterServiceRegister } from '@/counter/counter-service-register';
import InputBox from './components/input-box/input-box.vue'
import AppKeepAlive from './components/app-keep-alive/app-keep-alive.vue'
......@@ -45,15 +50,35 @@ import AppSpan from './components/app-span/app-span.vue'
import AppAddressSelection from './components/app-address-selection/app-address-selection.vue'
import DropdownListMpicker from './components/dropdown-list-mpicker/dropdown-list-mpicker.vue'
import AppRate from './components/app-rate/app-rate.vue'
import appInputNumber from './components/app-input-number/app-input-number.vue'
import AppSwitch from './components/app-switch/app-switch.vue'
import AppFileUploadDrag from './components/app-file-upload-drag/app-file-upload-drag.vue'
import AppSlider from './components/app-slider/app-slider.vue'
import AppStepper from './components/app-stepper/app-stepper.vue'
import AppPortalDesign from './components/app-portal-design/app-portal-design.vue'
import DatePickerRange from './components/date-picker-range/date-picker-range.vue'
import AppRangeDate from './components/app-range-date/app-range-date.vue'
import AppActionBar from './components/app-actionbar/app-actionbar.vue'
import AppOrgSector from './components/app-orgsector/app-orgsector.vue'
import AppBuild from './components/app-build/app-build.vue'
import AppStudioAction from './components/app-studioaction/app-studioaction.vue'
import AppDebugActions from './components/app-debug-actions/app-debug-actions.vue'
import AppHeaderMenus from './components/app-header-menus/app-header-menus.vue'
// 全局挂载UI实体服务注册中心
window['uiServiceRegister'] = uiServiceRegister;
// 全局挂载功能服务注册中心
window['utilServiceRegister'] = utilServiceRegister;
// 全局挂载数据服务注册中心
window['entityServiceRegister'] = entityServiceRegister;
// 全局挂载计数器服务注册中心
window['counterServiceRegister'] = counterServiceRegister;
export const AppComponents = {
install(v: any, opt: any) {
v.prototype.$appdrawer = AppDrawer.getInstance();
v.prototype.$appmodal = AppModal.getInstance();
v.prototype.$apppopover = AppPopover.getInstance();
v.prototype.$http = Http.getInstance();
v.prototype.$export = exportExcel.getInstance();
v.prototype.$util = Util;
v.prototype.$verify = Verify;
v.prototype.$viewTool = ViewTool;
......@@ -96,8 +121,17 @@ export const AppComponents = {
v.component('app-address-selection', AppAddressSelection);
v.component('dropdown-list-mpicker', DropdownListMpicker);
v.component('app-rate', AppRate);
v.component('app-input-number', appInputNumber);
v.component('app-switch', AppSwitch);
v.component('app-file-upload-drag', AppFileUploadDrag);
v.component('app-slider', AppSlider);
v.component('app-stepper', AppStepper);
v.component('app-portal-design',AppPortalDesign);
v.component('date-picker-range',DatePickerRange);
v.component('app-range-date', AppRangeDate);
v.component('app-actionbar', AppActionBar);
v.component('app-orgsector', AppOrgSector);
v.component('app-build', AppBuild);
v.component('app-studioaction', AppStudioAction);
v.component('app-debug-actions', AppDebugActions);
v.component('app-header-menus', AppHeaderMenus);
},
};
\ No newline at end of file
src/assets/img/logo.png

6.7 KB | W: | H:

src/assets/img/logo.png

2.0 KB | W: | H:

src/assets/img/logo.png
src/assets/img/logo.png
src/assets/img/logo.png
src/assets/img/logo.png
  • 2-up
  • Swipe
  • Onion skin
.app-actionbar {
padding: 12px;
display: flex;
justify-content: flex-start;
align-items: center;
flex-wrap: wrap;
.app-actionbar-item{
margin-right:10px;
margin-bottom: 10px;
}
}
\ No newline at end of file
<template>
<div class="app-actionbar">
<div class="app-actionbar-item" v-for="(item,index) in items" :key="index">
<Badge v-if="item.counterService&&item.counterService.counterData" :count="item.counterService.counterData[item.counterId]" type="primary">
<i-button @click="handleClick(item.viewlogicname)">{{item.actionName}}</i-button>
</Badge>
<i-button v-else @click="handleClick(item.viewlogicname)">{{item.actionName}}</i-button>
</div>
</div>
</template>
<script lang="ts">
import { Vue, Component, Prop, Model, Emit } from "vue-property-decorator";
import { Subject } from "rxjs";
@Component({})
export default class AppActionBar extends Vue {
/**
* 传入操作栏模型数据
*
* @type {any}
* @memberof AppActionBar
*/
@Prop() public items!:any;
/**
* 触发界面行为
*
* @memberof AppActionBar
*/
public handleClick($event:any){
this.$emit('itemClick',$event);
}
}
</script>
<style lang='less'>
@import "./app-actionbar.less";
</style>
\ No newline at end of file
.show-type {
text-align: right;
position: absolute;
z-index: 99;
right: 0;
top: 2px;
.ivu-btn-group {
.collapse-btn {
padding: 0;
}
}
}
\ No newline at end of file
<template>
<div class='show-type'>
<button-group v-show="!showTypeDir">
<i-button class="collapse-btn" type="primary" @click="clickCollapse('left')">
<icon type="ios-arrow-back"/>
</i-button>
</button-group>
<button-group v-show="showTypeDir">
<el-tooltip content="定制">
<i-button icon="md-build" type="primary" @click="handleClick"></i-button>
</el-tooltip>
<i-button class="collapse-btn" type="primary" @click="clickCollapse('right')">
<icon type="ios-arrow-forward"/>
</i-button>
</button-group>
</div>
</template>
<script lang="ts">
import {Vue, Component, Prop, Watch} from 'vue-property-decorator';
@Component({
components: {
}
})
export default class AppBuild extends Vue {
/**
* 工具栏伸缩
*
* @protected
* @type {boolean}
* @memberof AppBuild
*/
public showTypeDir: boolean = false;
/**
* 点击伸缩
*
* @param {*} type
* @memberof AppBuild
*/
public clickCollapse(type: string) {
this.showTypeDir = Object.is(type, 'left') ? true : false;
}
/**
* 工具点击
*
*@memberof AppBuild
*/
public handleClick(){
this.$emit("handleClick")
}
}
</script>
<style lang="less">
@import './app-build.less';
</style>
\ No newline at end of file
<template>
<checkbox-group class="app-checkbox-list" v-model="selectArray">
<checkbox v-for="(item,index) in items" :key="index" :label="item.value" :disabled="isDisabled || item.disabled">
<span>{{item.text}}</span>
<span>{{Object.is(codelistType,'STATIC') ? $t('codelist.'+tag+'.'+item.value) : item.text}}</span>
</checkbox>
</checkbox-group >
</template>
......
import { Http } from './../../utils/http/http';
import UtilService from '@/utilservice/util-service';
export default class AppDashboardDesignService {
/**
* 工具服务对象
*
* @protected
* @type {UtilService}
* @memberof AppDashboardDesignService
*/
protected utilService: UtilService = new UtilService();
/**
* 加载数据模型
*
* @param {string} serviceName
* @param {*} context
* @param {*} viewparams
* @memberof AppDashboardDesignService
*/
public loadModel(serviceName: string, context: any, viewparams: any) {
return new Promise((resolve: any, reject: any) => {
this.utilService.getService(serviceName).then((service: any) => {
service.loadModelData(JSON.stringify(context), viewparams).then((response: any) => {
resolve(response);
}).catch((response: any) => {
reject(response);
});
}).catch((response: any) => {
reject(response);
});
});
}
/**
* 保存模型
*
* @param {string} serviceName
* @param {*} context
* @param {*} viewparams
* @returns
* @memberof AppDashboardDesignService
*/
public saveModel(serviceName: string, context: any, viewparams: any) {
return new Promise((resolve: any, reject: any) => {
this.utilService.getService(serviceName).then((service: any) => {
service.saveModelData(JSON.stringify(context), '', viewparams).then((response: any) => {
resolve(response);
}).catch((response: any) => {
reject(response);
});
}).catch((response: any) => {
reject(response);
});
});
}
/**
* 加载门户部件集合
*
* @memberof AppDashboardDesignService
*/
public loadPortletList(context: any, viewparams: any): Promise<any> {
return new Promise((resolve: any, reject: any) => {
Http.getInstance().get('./assets/json/portlet-data.json').then((response: any) => {
if (response && response.status === 200 && response.data && Array.isArray(response.data)) {
const datas: any[] = this.filterData(response.data, viewparams.appdeName);
const list = this.prepareList(datas);
const groups = this.prepareGroup(datas);
resolve({data: datas, result: list.reverse(), groups: groups});
}
}).catch((response: any) => {
console.log(response.status);
});
});
}
/**
* 过滤数据
*
* @param {any[]} datas
* @memberof AppDashboardDesignService
*/
public filterData(datas: any[] = [], dataType: string): any[] {
let items: any[] = [];
datas.forEach((data: any) => {
if(Object.is(data.type, 'app')) {
items.push(data);
}
if(Object.is(data.appCodeName, dataType)) {
items.push(data);
}
});
return items;
}
/**
* 分组集合
*
* @param {any[]} [datas=[]]
* @returns {any[]}
* @memberof AppDashboardDesignService
*/
public prepareGroup(datas: any[] = []): any[] {
let items: any[] = [];
datas.forEach((data: any) => {
let item = items.find((item: any) => Object.is(item.value, data.groupCodeName));
if(item) {
let _item = item.children.find((a: any) => Object.is(a.portletCodeName, data.portletCodeName));
if(!_item) {
item.children.push(data);
}
} else {
items.push({name: data.groupName, value: data.groupCodeName, children: [data]});
}
});
return items;
}
/**
* 准备list集合
*
* @memberof AppDashboardDesignService
*/
public prepareList(datas: any[] = []): any[] {
let list: any[] = [];
datas.forEach((data: any) => {
let item = list.find((item: any) => Object.is(data.type, item.type));
if(!item) {
item = {};
Object.assign(item, {
type: data.type,
name: Object.is(data.type, 'app') ? "全局" : data.appName,
children: []
});
list.push(item);
}
this.prepareList2(item.children, data);
})
return list
}
/**
* 准备list项集合
*
* @param {any[]} [children=[]]
* @param {*} [data={}]
* @memberof AppDashboardDesignService
*/
public prepareList2(children: any[] = [], data: any = {}) {
let item = children.find((item: any) => Object.is(data.groupCodeName, item.type));
if(!item) {
item = {};
Object.assign(item, {
type: data.groupCodeName,
name: data.groupName,
children: []
});
children.push(item);
}
let _item = item.children.find((a: any) => Object.is(a.portletCodeName, data.portletCodeName));
if(!_item) {
item.children.push(data);
}
}
}
\ No newline at end of file
.app-dashboard-design {
width: 100%;
height: 100%;
border: 1px solid #ccc;
display: flex;
.design-tree {
width: 300px;
height: 100%;
padding: 5px;
overflow: auto;
.design-filter {
width: 100%;
}
.design-tree-content {
height: calc(100% - 40px);
overflow: auto;
.el-menu {
width: 100%;
border-right: 0;
.drag-div-item {
height: 40px;
line-height: 40px;
background-color: #f7fafc;
margin-bottom: 5px;
border: 1px dashed transparent;
cursor: move;
}
.drag-div-item:hover {
border-color: #107fff;
}
.el-menu-item.is-active {
color: initial;
}
.is-disable {
background-color: #e8eaef;
color: #c9ccd8;
cursor: no-drop !important;
}
}
}
.drag-tree-item {
opacity: .7;
z-index: 1;
position: fixed;
}
}
.design-panel {
flex-grow: 1;
height: 100%;
overflow: auto;
background: #efefef;
.app-grid-layout {
.app-grid-layout-mask {
height: calc(100% + 180px);
top: 0;
left: 0;
bottom: 0;
right: 0;
position: absolute;
background: -webkit-linear-gradient(top, #ddd 10px, transparent 10px),-webkit-linear-gradient(left, #ddd 10px, transparent 10px);
}
.app-grid-layout-item {
height: 100%;
.el-icon-close {
font-size: 16px;
float: right;
margin-top: 4px;
cursor: pointer;
}
}
}
.layout-draging {
.vue-grid-placeholder {
display: initial !important;
}
}
}
}
\ No newline at end of file
<template>
<div ref="designContainer" class="app-dashboard-design">
<div class="design-tree">
<el-select v-model="filterVal" clearable class="design-filter">
<template v-for="item of groups">
<el-option :key="item.value" :value="item.value" :label="item.name"></el-option>
</template>
</el-select>
<div class="design-tree-content">
<el-menu v-show="!filterVal" :unique-opened="true">
<template v-for="(item, index) of list">
<el-submenu :key="item.type + index" :index="item.type + index">
<div slot="title">{{item.name}}</div>
<template v-for="(item2, index2) of item.children">
<el-submenu :key="item2.type + index2" :index="item2.type + index2">
<div slot="title">{{item2.name}}</div>
<el-menu-item ref="dragDivItem" :class="{'drag-div-item': true, 'is-disable': isDisabled(item3)}" v-for="(item3, index3) of item2.children" :key="item3.type + index3" :index="item3.type + index3" :tag="item3.portletCodeName">
{{item3.portletName}}
</el-menu-item>
</el-submenu>
</template>
</el-submenu>
</template>
</el-menu>
<el-menu v-show="filterVal" :unique-opened="true" :default-openeds="[filterVal]">
<template v-for="item of groups">
<el-submenu v-show="filterVal == item.value" :key="item.value" :index="item.value">
<div slot="title">{{item.name}}</div>
<template v-for="item2 of item.children">
<el-menu-item ref="dragDivItem" :class="{'drag-div-item': true, 'is-disable': isDisabled(item2)}" :key="item2.portletCodeName" :index="item.portletCodeName" :tag="item2.portletCodeName">
{{item2.portletName}}
</el-menu-item>
</template>
</el-submenu>
</template>
</el-menu>
</div>
<div ref="dragDiv" v-if="dragItem" class="drag-tree-item">{{dragItem.caption}}</div>
</div>
<div class="design-panel" ref="gridLayoutPanel">
<grid-layout
ref="gridLayout"
:class="['app-grid-layout', isDragEnter ? 'layout-draging': '']"
:layout.sync="layoutModel"
:col-num="layoutColNum"
:row-height="layoutRowH"
:is-draggable="true"
:is-resizable="true"
:is-mirrored="false"
:vertical-compact="true"
:margin="[10, 10]"
:use-css-transforms="true"
:style="{minHeight: `${10 * (layoutRowH + 10) + 10}px`}"
>
<div
class="app-grid-layout-mask"
:style="{backgroundSize: `calc((100% - 10px) / ${layoutColNum}) ${layoutRowH + 10}px`}"
></div>
<grid-item
v-for="item in layoutModel"
class="item"
:x="item.x"
:y="item.y"
:w="item.w"
:h="item.h"
:i="item.i"
:key="item.i"
v-show="!dragItem || dragItem.portletCodeName != item.portletCodeName"
>
<el-card class="app-grid-layout-item">
<div slot="header">
<span>{{item.portletName}}</span>
<i class="el-icon-close" @click="removeItem(item.i)"></i>
</div>
<component :is="item.componentName" :viewDefaultUsage="false" :context="JSON.parse(JSON.stringify(context))"></component>
</el-card>
</grid-item>
</grid-layout>
</div>
</div>
</template>
<script lang="ts">
import { Vue, Component, Prop } from "vue-property-decorator";
import VueGridLayout from "vue-grid-layout";
import interact from "interactjs";
import AppDashboardDesignService from './app-dashboard-design-service';
import { Http } from '../../utils/http/http';
import { Subject, Subscription } from 'rxjs';
@Component({
components: {
GridLayout: VueGridLayout.GridLayout,
GridItem: VueGridLayout.GridItem
}
})
export default class AppDashboardDesign extends Vue {
/**
* 设计服务对象
*
* @protected
* @type {AppDashboardDesignService}
* @memberof AppDashboardDesign
*/
protected designService: AppDashboardDesignService = new AppDashboardDesignService();
/**
* 应用上下文
*
* @type {*}
* @memberof AppDashboardDesign
*/
@Prop({default:{}}) context?: any;
/**
* 视图参数
*
* @type {*}
* @memberof AppDashboardDesign
*/
@Prop({default:{}}) viewparams?: any;
/**
* 视图参数
*
* @type {*}
* @memberof AppDashboardDesign
*/
@Prop() utilServiceName?: any;
/**
* 视图通讯对象
*
* @type {Subject<ViewState>}
* @memberof AppDashboardDesign
*/
@Prop() protected viewState!: Subject<ViewState>;
/**
* 模型对象
*
* @protected
* @type {*}
* @memberof AppDashboardDesign
*/
protected layoutModel: any[] = [];
/**
* 布局列数
*
* @type {number}
* @memberof AppDashboardDesign
*/
public layoutColNum: number = 12;
/**
* 布局行高
*
* @type {number}
* @memberof AppDashboardDesign
*/
public layoutRowH: number = 80;
/**
* 拖拽对象
*
* @type {(any | null)}
* @memberof AppDashboardDesign
*/
public dragItem: any | null = null;
/**
* 是否拖拽中
*
* @type {boolean}
* @memberof AppDashboardDesign
*/
public isDragEnter: boolean = false;
/**
* 门户项列表
*
* @type {any[]}
* @memberof AppDashboardDesign
*/
public list: any[] = [];
/**
* 门户项列表
*
* @type {any[]}
* @memberof AppDashboardDesign
*/
public portlets: any[] = [];
/**
* 视图状态事件
*
* @protected
* @type {(Subscription | undefined)}
* @memberof AppDashboardDesign
*/
protected viewStateEvent: Subscription | undefined;
/**
* 分组集合
*
* @type {any[]}
* @memberof AppDashboardDesign
*/
public groups: any[] = [];
/**
* 分组过滤值
*
* @type {string}
* @memberof AppDashboardDesign
*/
public filterVal: string = '';
/**
* 生命周期
*
* @memberof AppDashboardDesign
*/
public created() {
this.loadList();
this.load();
if (this.viewState) {
this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => {
if (Object.is('save', action)) {
this.save();
}
});
}
}
/**
* 执行destroyed后的逻辑
*
* @memberof AppDashboardDesign
*/
protected afterDestroy() {
if (this.viewStateEvent) {
this.viewStateEvent.unsubscribe();
}
}
/**
* 加载门户列表
*
* @memberof AppDashboardDesign
*/
public loadList() {
let post = this.designService.loadPortletList(this.context, this.viewparams);
post.then((result: any) => {
this.portlets = result.data;
this.list = result.result;
this.groups = result.groups;
this.$nextTick(() => {
this.addEventListener();
})
}).catch((response: any) => {
console.log(response);
});
}
/**
* 加载
*
* @memberof AppDashboardDesign
*/
public load() {
let post = this.designService.loadModel(this.utilServiceName, this.context, this.viewparams);
post.then((response: any) => {
if(response.status == 200) {
this.layoutModel = response.data;
}
}).catch((response: any) => {
console.log(response);
});
}
/**
* 保存
*
* @memberof AppDashboardDesign
*/
public save() {
let param: any = {};
Object.assign(param, {
model: this.layoutModel,
...this.viewparams
});
let post = this.designService.saveModel(this.utilServiceName, this.context, param);
post.then((response: any) => {
this.$emit("save", response.data);
}).catch((response: any) => {
console.log(response);
});
}
/**
* 是否禁止拖动
*
* @param {*} item
* @returns
* @memberof AppDashboardDesign
*/
public isDisabled(item: any) {
const index: any = this.layoutModel.findIndex((a: any) =>
Object.is(a.i, item.portletCodeName)
);
if (index >= 0) {
return true;
}
return false;
}
/**
* 删除项
*
* @param {string} id
* @memberof AppDashboardDesign
*/
public removeItem(id: string) {
const index: any = this.layoutModel.findIndex((item: any) =>
Object.is(item.i, id)
);
if (index !== -1) {
this.layoutModel.splice(index, 1);
}
let item = this.portlets.find((item: any) => Object.is(item.portletCodeName, id));
if (item) {
item.moved = false;
}
}
/**
* 添加事件
*
* @memberof AppDashboardDesign
*/
public addEventListener() {
if (this.$refs.dragDivItem) {
let dragDivItems: any = this.$refs.dragDivItem;
dragDivItems.forEach((dragDivItem: any) => {
let interactObj = interact(dragDivItem.$el);
interactObj.draggable({});
interactObj.on("dragstart dragmove dragend", event => {
this.handleDrag(event);
});
});
}
}
/**
* 拖动
*
* @param {*} event
* @returns
* @memberof AppDashboardDesign
*/
public handleDrag(event: any) {
let tag = event.currentTarget.getAttribute("tag");
let item = this.portlets.find((item: any) => Object.is(item.portletCodeName, tag));
if (item.moved) {
return;
}
switch (event.type) {
case "dragstart": {
if (item) {
this.dragItem = item;
let dragDiv: any = this.$refs.dragDiv;
}
break;
}
case "dragmove": {
if (!this.dragItem) {
return;
}
let dragDiv: any = this.$refs.dragDiv;
let mouseX = Math.round(event.client.x);
let mouseY = Math.round(event.client.y);
if (dragDiv) {
dragDiv.style.left = mouseX + "px";
dragDiv.style.top = mouseY + "px";
}
let index = this.layoutModel.findIndex(item =>
Object.is(item.portletCodeName, this.dragItem.portletCodeName)
);
let gridLayoutPanel: any = this.$refs.gridLayoutPanel;
let gridLayout: any = this.$refs.gridLayout;
let ctainRect = gridLayoutPanel.getBoundingClientRect();
if (
mouseX > ctainRect.x &&
mouseX < ctainRect.x + ctainRect.width &&
mouseY > ctainRect.y &&
mouseY < ctainRect.y + ctainRect.height
) {
if (index === -1) {
let addItem: any = { x: 0, y: 0, w: 4, h: 3, i: this.dragItem.portletCodeName };
Object.assign(addItem, this.dragItem);
delete addItem.moved;
this.layoutModel.push(addItem);
}
let x = Math.round(
(mouseX - ctainRect.x) /
((ctainRect.width - 10) / this.layoutColNum)
);
if (x >= 1) {
x -= 1;
} else {
0;
}
let y = Math.round((mouseY - ctainRect.y) / (this.layoutRowH + 10));
if (y >= 2) {
y -= 2;
} else {
y = 0;
}
gridLayout.dragEvent(event.type, this.dragItem.portletCodeName, x, y, 3, 4);
this.isDragEnter = true;
} else {
if (index !== -1) {
gridLayout.dragEvent("dragleave", this.dragItem.portletCodeName, 0, 0, 0, 0);
this.layoutModel.splice(index, 1);
}
this.isDragEnter = false;
}
break;
}
case "dragend": {
let item = this.layoutModel.find(item =>
Object.is(item.portletCodeName, this.dragItem.portletCodeName)
);
let gridLayout: any = this.$refs.gridLayout;
if (item) {
this.dragItem.moved = true;
gridLayout.dragEvent(
event.type,
this.dragItem.portletCodeName,
item.x,
item.y,
item.h,
item.w
);
}
this.dragItem = null;
this.isDragEnter = false;
break;
}
}
}
}
</script>
<style lang="less">
@import "./app-dashboard-design.less";
</style>
\ No newline at end of file
.app-debug-actions {
position: absolute;
top: 0px;
left: 50%;
z-index: 10000;
text-align: center;
transition: all 0.3s;
margin-top: -32px;
>.actions {
.ivu-btn {
width: 100%;
}
}
>.show-buttons {
width: 100%;
height: 18px;
border-width: 0px 1px 1px 1px;
border-style: solid;
border-color: #8893a7;
text-align: center;
color: #8893a7;
cursor: pointer;
>.button {
margin-top: -5px;
}
}
}
.app-debug-actions:hover {
margin-top: 0px;
}
\ No newline at end of file
<template>
<div class="app-debug-actions">
<div class="actions">
<button-group vertical>
<i-button title="开启配置模式" :type="sdc.isShowTool ? 'warning' : 'info'" ghost @click="() => sdc.showToolChange()" :icon="sdc.isShowTool ? 'ios-bug' : 'ios-bug-outline'" ></i-button>
</button-group>
</div>
<div class="show-buttons">
<div class="button"><i class="ivu-icon ivu-icon-ios-arrow-down" /></div>
</div>
</div>
</template>
<script lang = 'ts'>
import { Vue, Component } from 'vue-property-decorator';
import { StudioActionUtil } from '@/utils';
import { Environment } from '@/environments/environment';
/**
* 开发模式控制行为组
*
* @export
* @class AppDebugActions
* @extends {Vue}
*/
@Component({})
export default class AppDebugActions extends Vue {
/**
* 配置平台操作控制器
*
* @type {StudioActionController}
* @memberof AppDebugActions
*/
public sdc: StudioActionUtil = StudioActionUtil.getInstance();
}
</script>
<style lang = "less">
@import "./app-debug-actions.less";
</style>
\ No newline at end of file
......@@ -2,17 +2,17 @@
<dropdown v-if="itemLevel === 0" :transfer="true" trigger='click'>
<i-button :disabled="item.disabled">
<i class='fa fa-file-excel-o'></i>
<span class='caption'>{{item.caption}}</span>
<span class='caption'>{{caption}}</span>
</i-button>
<dropdown-menu slot='list'>
<dropdown-item>
<p @click="exportExcel($event, 'maxRowCount')">
{{item.caption}}全部(最大{{item.caption}}{{item.MaxRowCount}})
{{caption}}{{$t('info.total')}}({{$t('info.max')}}{{caption}}{{item.MaxRowCount}}{{$t('info.row')}})
</p>
</dropdown-item>
<dropdown-item>
<p @click="exportExcel($event, 'activatedPage')">
{{this.item.caption}}当前页
{{caption}}{{$t('info.currentPage')}}
</p>
</dropdown-item>
</dropdown-menu>
......@@ -29,7 +29,28 @@ import { Vue, Component, Prop, Watch } from 'vue-property-decorator';
* @class AppExportExcel
* @extends {Vue}
*/
@Component({})
@Component({
i18n: {
messages: {
'zh-CN': {
info: {
total: '全部',
max: '最大',
row: '行',
currentPage: '当前页',
}
},
'en-US': {
info: {
total: 'All',
max: 'At Most',
row: 'Lines',
currentPage: 'Current Page',
}
}
}
}
})
export default class AppExportExcel extends Vue {
/**
......@@ -40,6 +61,173 @@ export default class AppExportExcel extends Vue {
*/
@Prop() public item?: any;
/**
* 工具栏项
*
* @type {*}
* @memberof AppExportExcel
*/
@Prop() public caption?: any;
/**
* 工具栏项层级
*
* @type {number}
* @memberof AppExportExcel
*/
@Prop({ default: 0 }) public itemLevel!: number;
/**
* 起始页
*
* @type {(string | null)}
* @memberof AppExportExcel
*/
public startPage: string | null = null;
/**
* 结束页
*
* @type {(string | null)}
* @memberof AppExportExcel
*/
public endPage: string | null = null;
/**
* 是否显示下拉菜单
*
* @type {boolean}
* @memberof AppExportExcel
*/
public visible: boolean = false;
/**
* 点击触发相似
*
* @memberof AppExportExcel
*/
public clickVisible(): void {
this.visible = !this.visible
}
/**
* 导出数据
*
* @param {*} $event
* @param {string} type
* @returns {void}
* @memberof AppExportExcel
*/
public exportExcel($event: any, type: string): void {
const exportparms: any = { type: type };
if (Object.is(type, 'maxRowCount')) {
Object.assign(exportparms, { maxRowCount: this.item.MaxRowCount })
this.visible = false;
} else if (Object.is(type, 'activatedPage')) {
this.visible = false;
} else if (Object.is(type, 'custom')) {
if (!this.startPage || !this.endPage) {
this.$Notice.warning({ title: '警告', desc: '请输入起始页' });
return;
}
const startPage: any = Number.parseInt(this.startPage, 10);
const endPage: any = Number.parseInt(this.endPage, 10);
if (Number.isNaN(startPage) || Number.isNaN(endPage)) {
this.$Notice.warning({ title: '警告', desc: '请输入有效的起始页' });
return;
}
if (startPage < 1 || endPage < 1 || startPage > endPage) {
this.$Notice.warning({ title: '警告', desc: '请输入有效的起始页' });
return;
}
this.startPage = null;
this.endPage = null;
Object.assign(exportparms, { startPage: startPage, endPage: endPage });
this.visible = false;
}
if (!this.visible) {
Object.assign($event, { exportparms: exportparms });
this.$emit('exportexcel', $event);
}
}
}
</script>
<style lang='less'>
@import './app-export-excel.less';
</style><template>
<dropdown v-if="itemLevel === 0" :transfer="true" trigger='click'>
<i-button :disabled="item.disabled">
<i class='fa fa-file-excel-o'></i>
<span class='caption'>{{caption}}</span>
</i-button>
<dropdown-menu slot='list'>
<dropdown-item>
<p @click="exportExcel($event, 'maxRowCount')">
{{caption}}{{$t('info.total')}}({{$t('info.max')}}{{caption}}{{item.MaxRowCount}}{{$t('info.row')}})
</p>
</dropdown-item>
<dropdown-item>
<p @click="exportExcel($event, 'activatedPage')">
{{caption}}{{$t('info.currentPage')}}
</p>
</dropdown-item>
</dropdown-menu>
</dropdown>
</template>
<script lang="ts">
import { Vue, Component, Prop, Watch } from 'vue-property-decorator';
/**
* 数据导出组件
*
* @export
* @class AppExportExcel
* @extends {Vue}
*/
@Component({
i18n: {
messages: {
'zh-CN': {
info: {
total: '全部',
max: '最大',
row: '行',
currentPage: '当前页',
}
},
'en-US': {
info: {
total: 'All',
max: 'At Most',
row: 'Lines',
currentPage: 'Current Page',
}
}
}
}
})
export default class AppExportExcel extends Vue {
/**
* 工具栏项
*
* @type {*}
* @memberof AppExportExcel
*/
@Prop() public item?: any;
/**
* 工具栏项
*
* @type {*}
* @memberof AppExportExcel
*/
@Prop() public caption?: any;
/**
* 工具栏项层级
*
......
.app-file-upload{
.upload-col{
text-align: center;
.button-preview{
padding: 8px 15px 8.5px 15px;
.ivu-badge{
margin-left: 2px;
.ivu-badge-count{
height: auto;
min-width: auto;
line-height: unset;
padding: 0 4px;
}
}
}
}
}
.upload-preview-modal{
.ivu-modal{
height: 86%;
.ivu-modal-content{
height: 100%;
overflow-y: scroll;
.preview-file-list-item{
margin: 0 8px 8px 0;
display: inline-block;
position: relative;
}
.preview-file-list-img{
display: inline-block;
position: relative;
}
.file-name{
text-align: center;
}
.preview-file-list-actions{
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
font-size: 20px;
text-align: center;
color: #fff;
opacity: 0;
transition: opacity .3s;
}
.preview-file-list-actions:hover{
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
font-size: 20px;
text-align: center;
color: #fff;
opacity: 1;
background-color: rgba(0,0,0,.5);
}
.preview-file-list-actions::after{
display: inline-block;
content: "";
height: 100%;
vertical-align: middle;
}
.action-delete{
margin-left:15px;
}
}
}
}
\ No newline at end of file
<template>
<el-upload
:disabled="disabled"
:file-list="files"
:action="uploadUrl"
:headers="{}"
:before-upload="beforeUpload"
:before-remove="onRemove"
:on-success="onSuccess"
:on-error="onError"
:on-preview="onDownload">
<el-button size='small' icon='el-icon-upload' :disabled="disabled">{{this.$t('app.fileUpload.caption')}}</el-button>
</el-upload>
<div class="app-file-upload">
<el-row>
<el-col v-if="rowPreview && files.length > 0" :span="12" class="upload-col">
<el-button size='small' class="button-preview" icon='el-icon-view' :disabled="disabled" @click="()=>{this.dialogVisible = true;}">查看<Badge :count="files.length" type="info"></Badge></el-button>
</el-col>
<el-col :span="(rowPreview && files.length > 0) ? 12 : 24" class="upload-col">
<el-upload
:disabled="disabled"
:file-list="files"
:action="uploadUrl"
:headers="{}"
:before-upload="beforeUpload"
:before-remove="onRemove"
:on-success="onSuccess"
:on-error="onError"
:on-preview="onDownload"
:drag="isdrag"
:show-file-list="!rowPreview"
>
<el-button v-if="!isdrag" size='small' icon='el-icon-upload' :disabled="disabled">{{this.$t('app.fileUpload.caption')}}</el-button>
<i v-if="isdrag" class="el-icon-upload"></i>
<div v-if="isdrag" class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
</el-upload>
</el-col>
</el-row>
<modal width="80%" v-model="dialogVisible" footer-hide class-name='upload-preview-modal'>
<ul class="">
<li v-for="(file,index) in files" :key="index" class="preview-file-list-item">
<div class='preview-file-list-img'>
<el-image :src="file.url" class='' style=''>
<div slot='error' class='image-slot'>
<img src="/assets/img/picture.png" style='width:100%;height:100%;'>
</div>
</el-image>
<div class='preview-file-list-actions' @mouseenter="()=>{showActions = true;}" @mouseleave="()=>{showActions = false;}">
<span v-show="showActions" class='action-download'>
<i class='el-icon-download' @click="onDownload(file)"></i>
</span>
<span v-show="showActions" :style="{ 'display': disabled? 'none' : 'inline-block' }" class='action-delete'>
<i class='el-icon-delete' @click="onRemove(file, files)"></i>
</span>
</div>
</div>
<div class="file-name">{{file.name}}</div>
</li>
</ul>
</modal>
</div>
</template>
<script lang="ts">
......@@ -38,6 +74,14 @@ export default class AppFileUpload extends Vue {
*/
@Prop() public ignorefieldvaluechange?: boolean;
/**
* 是否支持拖拽
*
* @type {boolean}
* @memberof AppFileUpload
*/
@Prop() public isdrag?: boolean;
/**
* 表单状态事件
*
......@@ -75,12 +119,8 @@ export default class AppFileUpload extends Vue {
if (this.ignorefieldvaluechange) {
return;
}
if (newval) {
this.files = JSON.parse(newval);
this.dataProcess();
} else {
this.files = [];
}
this.setFiles(newval)
this.dataProcess();
}
/**
......@@ -176,6 +216,21 @@ export default class AppFileUpload extends Vue {
*/
public appData: any;
/**
* 设置files
*
* @private
* @memberof AppFileUpload
*/
private setFiles(value:any): void {
let _files = JSON.parse(value);
if (value && Object.prototype.toString.call(_files)=='[object Array]') {
this.files = _files;
} else {
this.files = [];
}
}
/**
* 数据处理
*
......@@ -218,9 +273,7 @@ export default class AppFileUpload extends Vue {
this.formStateEvent = this.formState.subscribe(($event: any) => {
// 表单加载完成
if (Object.is($event.type, 'load')) {
if (this.value) {
this.files = JSON.parse(this.value);
}
this.setFiles(this.value);
this.dataProcess();
}
});
......@@ -239,15 +292,17 @@ export default class AppFileUpload extends Vue {
let uploadparams: string = '';
let exportparams: string = '';
let upload_keys: Array<string> = [];
let export_keys: Array<string> = [];
let custom_arr: Array<string> = [];
if (this.uploadparams && !Object.is(this.uploadparams, '')) {
uploadparams = this.uploadparams;
upload_keys = uploadparams.split(';');
}
if (this.exportparams && !Object.is(this.exportparams, '')) {
exportparams = this.exportparams;
export_keys = exportparams.split(';');
}
let upload_keys: Array<string> = uploadparams.split(';');
let export_keys: Array<string> = exportparams.split(';');
let custom_arr: Array<string> = [];
if (this.customparams && !Object.is(this.customparams, '')) {
Object.keys(this.customparams).forEach((name: string) => {
custom_arr.push(`${name}=${this.customparams[name]}`);
......@@ -257,9 +312,7 @@ export default class AppFileUpload extends Vue {
this.export_keys = export_keys;
this.custom_arr = custom_arr;
if (this.value) {
this.files = JSON.parse(this.value);
}
this.setFiles(this.value);
this.dataProcess();
}
......@@ -281,7 +334,14 @@ export default class AppFileUpload extends Vue {
* @memberof AppFileUpload
*/
public beforeUpload(file: any) {
// console.log('上传之前');
if(this.imageOnly){
const imageTypes = ["image/jpeg" , "image/gif" , "image/png" , "image/bmp"];
const isImage = imageTypes.some((type: any)=> Object.is(type, file.type));
if (!isImage) {
this.$Notice.error({ title: '文件类型错误' ,desc: '请选择图片类型的文件,如JPEG,GIF,PNG,BMP'});
}
return isImage;
}
}
/**
......@@ -296,7 +356,7 @@ export default class AppFileUpload extends Vue {
if (!response) {
return;
}
const data = { name: response.name, id: response.id };
const data = { name: response.filename, id: response.fileid };
let arr: Array<any> = [];
this.files.forEach((_file:any) => {
arr.push({name: _file.name, id: _file.id})
......@@ -334,6 +394,9 @@ export default class AppFileUpload extends Vue {
}
});
let value: any = arr.length > 0 ? JSON.stringify(arr) : null;
if(arr.length == 0){
this.dialogVisible = false;
}
this.$emit('formitemvaluechange', { name: this.name, value: value });
}
......@@ -347,6 +410,38 @@ export default class AppFileUpload extends Vue {
window.open(file.url);
}
/**
* 是否只支持图片上传
*
* @type {boolean}
* @memberof AppFileUpload
*/
@Prop({default: false}) public imageOnly!: boolean;
/**
* 是否开启行内预览
*
* @type {boolean}
* @memberof AppFileUpload
*/
@Prop({default: false}) public rowPreview!: boolean;
/**
* 是否开启行内预览
*
* @type {boolean}
* @memberof AppFileUpload
*/
public dialogVisible: boolean = false;
/**
* 是否开启行内预览
*
* @type {boolean}
* @memberof AppFileUpload
*/
public showActions: boolean = false;
}
</script>
......
......@@ -3,9 +3,10 @@
<component
:is="viewname"
class="viewcontainer2"
:viewdata ="JSON.stringify(this.viewdata)"
:viewdata ="viewdata"
:viewDefaultUsage="false"
:formDruipart="formDruipart"
:formDruipart="formDruipart"
:isformDruipart="true"
@mditemsload="mditemsload"
@drdatasaved="drdatasaved"
@drdatachange="drdatachange"
......@@ -93,13 +94,21 @@ export default class AppFormDRUIPart extends Vue {
*/
@Prop() public parameters!: any[];
/**
* 视图上下文
*
* @type {*}
* @memberof AppFormDRUIPart
*/
@Prop() public context!: any;
/**
* 视图参数
*
* @type {*}
* @memberof AppFormDRUIPart
*/
@Prop() public viewParam!: any;
@Prop() public viewparams!: any;
/**
* 应用实体参数名称
......@@ -109,6 +118,14 @@ export default class AppFormDRUIPart extends Vue {
*/
@Prop() public parameterName!: string;
/**
* 应用实体参数名称(区分大小写)
*
* @type {string}
* @memberof AppFormDRUIPart
*/
@Prop() public parentName!: string;
/**
* 关系界面向视图下发指令对象
*
......@@ -200,6 +217,14 @@ export default class AppFormDRUIPart extends Vue {
*/
public viewdata: any = {};
/**
* 父视图参数
*
* @type {*}
* @memberof AppFormDRUIPart
*/
public viewparam: any = {};
/**
* 刷新关系页面
*
......@@ -212,24 +237,22 @@ export default class AppFormDRUIPart extends Vue {
if (Object.is(this.parentdata.SRFPARENTTYPE, 'CUSTOM')) {
this.isRelationalData = false;
}
const formData: any = data?data:JSON.parse(this.data);
const _paramitem = formData[this.paramItem];
this.viewdata = {};
Object.assign(this.viewdata, this.parentdata);
Object.assign(this.viewdata, this.$viewTool.getIndexViewParam());
let viewdata = {srfparentdename:this.parentName,srfparentkey:_paramitem};
Object.assign(viewdata, this.$viewTool.getIndexViewParam());
const _parameters: any[] = [...this.$viewTool.getIndexParameters(), ...this.parameters];
_parameters.forEach((parameter: any) => {
const { pathName, parameterName }: { pathName: string, parameterName: string } = parameter;
if (this.viewParam[parameterName] && !Object.is(this.viewParam[parameterName], '')) {
Object.assign(this.viewdata, { [parameterName]: this.viewParam[parameterName] });
if (formData[parameterName] && !Object.is(formData[parameterName], '')) {
Object.assign(viewdata, { [parameterName]: formData[parameterName] });
}
});
Object.assign(this.viewdata, { [this.paramItem]: _paramitem });
Object.assign(viewdata, { [this.paramItem]: _paramitem });
//设置顶层视图唯一标识
Object.assign(this.viewdata,{srfsessionid:this.viewParam.srfsessionid});
Object.assign(viewdata,this.context);
this.viewdata = JSON.stringify(viewdata);
this.viewparam = JSON.stringify(this.viewparams);
if (this.isRelationalData) {
if (!_paramitem || _paramitem == null || Object.is(_paramitem, '')) {
this.blockUIStart();
......@@ -238,8 +261,7 @@ export default class AppFormDRUIPart extends Vue {
this.blockUIStop();
}
}
this.formDruipart.next({action:'load',data:[]});
// this.$forceUpdate();
this.formDruipart.next({action:'load',data:{srfparentdename:this.parentName,srfparentkey:_paramitem}});
}
/**
......
......@@ -22,7 +22,7 @@
> .el-tabs {
height: 100%;
> .el-tabs__content {
height: calc(100% - 51px);
height: calc(100% - 62px);
> .el-tab-pane {
height: 100%;
overflow: auto;
......
.app-header-menus {
display: flex;
align-items: center;
height: 100%;
line-height: 20px;
>.app-header-menu-item{
height: 24px;
display: flex;
align-items: center;
margin-right: 16px;
color: #8893a7;
border: 1px solid rgba(0, 0, 0, 0);
cursor: pointer;
}
>.app-header-menu-item.icon {
>.app-header-menu-item-icon {
font-size: 20px;
}
>.app-header-menu-item-img {
height: 20px;
width: 20px;
>img {
height: 100%;
width: 100%;
}
}
}
>.app-header-menu-item.icon:hover{
color: #68758e;
text-decoration: none;
}
>.app-header-menu-item.text {
border-radius: 4px;
border: 1px solid #8893a7;
text-align: center;
font-size: 12px;
padding: 2px 4px;
>.app-header-menu-item-icon {
width: 20px;
height: 20px;
overflow: hidden;
font-size: 16px;
margin-right: 3px;
margin-top: -3px;
}
>.app-header-menu-item-img {
height: 16px;
width: 16px;
margin-right: 3px;
>img {
height: 100%;
width: 100%;
}
}
}
>.app-header-menu-item.text:hover {
color: #107fff;
border: 1px solid #107fff;
}
}
.app-header-menus:hover {
background: none !important;
}
\ No newline at end of file
<template>
<div class="app-header-menus">
<div v-for="menu in menus" class="app-header-menu-item text" @click="openWindow(menu)">
<div class="app-header-menu-item-icon">
<i :class="menu.iconcls" :aria-hidden="true" />
</div>
<div class="app-header-menu-item-text">{{$t(menu.title)}}</div>
</div>
</div>
</template>
<script lang="ts">
import { Vue, Component, Prop, Model, Emit } from "vue-property-decorator";
import { Subject } from "rxjs";
import { Environment } from '@/environments/environment';
@Component({
i18n: {
messages: {
'zh-CN': {
menus: {
ibizlab:{
title: 'iBiz开放平台',
},
publishProject:{
title: '项目文件',
},
ibizstudio:{
title: '模型设计工具',
},
ibizbbs:{
title: 'iBiz论坛',
},
}
},
'en-US': {
menus: {
ibizlab:{
title: 'iBizLab',
},
publishProject:{
title: 'Publish Project',
},
ibizstudio:{
title: 'Model Design Tools',
},
ibizbbs:{
title: 'iBizBBS',
},
}
}
}
}
})
export default class AppHeaderMenus extends Vue {
/**
* 菜单数据
*
* @type {any}
* @memberof AppHeaderMenus
*/
public menus:any = [
{
name: "ibizlab",
title: "menus.ibizlab.title",
url: Environment.ibizlabtUrl,
iconcls: 'fa fa-home',
},
{
name: "publishProject",
title: "menus.publishProject.title",
url: Environment.PublishProjectUrl,
iconcls: 'fa fa-folder-open-o',
},
{
name: "ibizstudio",
title: "menus.ibizstudio.title",
url: `${Environment.StudioUrl}?#/common_slnindex/srfkeys=${Environment.DCId}/sysdesign_psdevslnsysmodeltreeexpview`,
iconcls: 'fa fa-wrench',
},
{
name: "ibizbbs",
title: "menus.ibizbbs.title",
url: Environment.ibizbbstUrl,
iconcls: 'fa fa-comments-o',
},
];
/**
* 触发界面行为
*
* @memberof AppHeaderMenus
*/
public openWindow(menu:any){
window.open(menu.url, '_blank');
}
}
</script>
<style lang='less'>
@import "./app-header-menus.less";
</style>
\ No newline at end of file
......@@ -3,7 +3,7 @@
<ul class='el-upload-list el-upload-list--picture-card'>
<!-- 绘制缩略图 Start -->
<li v-for="(file,index) in files" :key="index" class='el-upload-list__item is-success'>
<el-image src={file.url} class='el-upload-list__item-thumbnail' style='min-height:100px;min-width:100px;'>
<el-image :src="file.url" class='el-upload-list__item-thumbnail' style='min-height:100px;min-width:100px;'>
<div slot='error' class='image-slot'>
<i class='el-icon-picture-outline'></i>
</div>
......@@ -119,12 +119,8 @@ export default class AppImageUpload extends Vue {
if (this.ignorefieldvaluechange) {
return;
}
if (newval) {
this.files = JSON.parse(newval);
this.dataProcess();
} else {
this.files = [];
}
this.setFiles(newval)
this.dataProcess();
}
/**
......@@ -220,6 +216,21 @@ export default class AppImageUpload extends Vue {
*/
public appData: any="";
/**
* 设置files
*
* @private
* @memberof AppImageUpload
*/
private setFiles(value:any): void {
let _files = JSON.parse(value);
if (value && Object.prototype.toString.call(_files)=='[object Array]') {
this.files = _files;
} else {
this.files = [];
}
}
/**
* 数据处理
*
......@@ -262,10 +273,7 @@ export default class AppImageUpload extends Vue {
this.formStateEvent = this.formState.subscribe(($event: any) => {
// 表单加载完成
if (Object.is($event.type, 'load')) {
if (this.value) {
// console.log(this.value);
this.files = JSON.parse(this.value);
}
this.setFiles(this.value);
this.dataProcess();
}
});
......@@ -283,15 +291,17 @@ export default class AppImageUpload extends Vue {
let uploadparams: string = '';
let exportparams: string = '';
let upload_keys: Array<string> = [];
let export_keys: Array<string> = [];
let custom_arr: Array<string> = [];
if (this.uploadparams && !Object.is(this.uploadparams, '')) {
uploadparams = this.uploadparams;
upload_keys = uploadparams.split(';');
}
if (this.exportparams && !Object.is(this.exportparams, '')) {
exportparams = this.exportparams;
export_keys = exportparams.split(';');
}
let upload_keys: Array<string> = uploadparams.split(';');
let export_keys: Array<string> = exportparams.split(';');
let custom_arr: Array<string> = [];
if (this.customparams && !Object.is(this.customparams, '')) {
Object.keys(this.customparams).forEach((name: string) => {
custom_arr.push(`${name}=${this.customparams[name]}`);
......@@ -301,9 +311,7 @@ export default class AppImageUpload extends Vue {
this.export_keys = export_keys;
this.custom_arr = custom_arr;
if (this.value) {
this.files = JSON.parse(this.value);
}
this.setFiles(this.value);
this.dataProcess();
}
......@@ -341,7 +349,7 @@ export default class AppImageUpload extends Vue {
if (!response) {
return;
}
const data = { name: response.name, id: response.id };
const data = { name: response.filename, id: response.fileid };
let arr: Array<any> = [];
this.files.forEach((_file: any) => {
arr.push({ name: _file.name, id: _file.id })
......
<template>
<dropdown trigger='click' on-click="selectLang">
<dropdown trigger='click' @on-click="selectLang">
<span>
{{title}}
<icon size='18' type='md-arrow-dropdown'></icon>
......
......@@ -47,6 +47,14 @@ export default class AppMpicker extends Vue {
* 表单项名称
*/
@Prop() name: any;
/**
* 视图上下文
*
* @type {*}
* @memberof AppFormDRUIPart
*/
@Prop() public context!: any;
/**
* 视图参数
......@@ -54,7 +62,7 @@ export default class AppMpicker extends Vue {
* @type {*}
* @memberof AppFormDRUIPart
*/
@Prop() public viewParam!: any;
@Prop() public viewparams!: any;
/**
* AC参数
......@@ -216,10 +224,18 @@ export default class AppMpicker extends Vue {
if (this.pickupView && Object.keys(this.pickupView).length > 0) {
// 参数处理
const view = { ...this.pickupView };
let _viewParam = this.viewParam;
let data = { srfparentdata: { srfparentkey: this.activeData[this.deKeyField] }, selectedData: [...this.selectItems], };
let _viewparams = JSON.parse(JSON.stringify(this.viewparams));
let _context = JSON.parse(JSON.stringify(this.context));
let _selectItems = JSON.parse(JSON.stringify(this.selectItems));
if(!Object.is(this.deKeyField,"srfkey")){
_selectItems.forEach((item:any, index:number)=>{
_selectItems[index].srfkey = item[this.deKeyField];
});
}
_context = Object.assign(_context, { srfparentdata: { srfparentkey: this.activeData[this.deKeyField] }, });
_viewparams = Object.assign(_viewparams,{ selectedData: [..._selectItems]});
let formdata = this.activeData;
const modal: Subject<any> = this.$appmodal.openModal(view, _viewParam, data)
const modal: Subject<any> = this.$appmodal.openModal(view, _context, _viewparams)
modal.subscribe((result: any) => {
if (!result || !Object.is(result.ret, 'OK')) {
return;
......
.app-org-sector {
.orgsector{
font-size: 15px;
cursor: pointer;
margin-right: 10px;
padding: 0 5px;
}
}
\ No newline at end of file
<template>
<div class="app-org-sector">
<dropdown @on-click="orgSelect" :transfer="true">
<div class="orgsector">
<span>{{selectedOrgName}}</span>
<icon size="18" type="md-arrow-dropdown" v-if="selectedOrgArray.length > 0"></icon>
</div>
<dropdown-menu
class="menu"
slot="list"
style="font-size: 15px !important;"
v-if="selectedOrgArray.length > 0"
>
<dropdown-item
:name="item.srforgsectorid"
style="font-size: 15px !important;"
v-for="(item, index) in selectedOrgArray"
:key="index"
>{{item.srforgsectorname}}</dropdown-item>
</dropdown-menu>
</dropdown>
</div>
</template>
<script lang = 'ts'>
import { Vue, Component, Inject } from "vue-property-decorator";
@Component({})
export default class AppOrgSector extends Vue {
/**
* 注入加载行为
*
* @memberof AppOrgSector
*/
@Inject("reload")
reload!: any;
/**
* 选中组织部门id
*
* @type {string}
* @memberof AppOrgSector
*/
public selectedOrgId: string = "";
/**
* 选中组织部门名称
*
* @type {string}
* @memberof AppOrgSector
*/
public selectedOrgName: string = "";
/**
* 组织部门名称数组
*
* @type {Array<any>}
* @memberof AppOrgSector
*/
public selectedOrgArray: Array<any> = [];
/**
* 组件初始化数据,vue生命周期
*
* @memberof AppOrgSector
*/
public mounted() {
if (this.$store.getters.getAppData()) {
if (this.$store.getters.getAppData().context && this.$store.getters.getAppData().context.srforgsectorid && this.$store.getters.getAppData().context.srforgsectorname) {
this.selectedOrgId = this.$store.getters.getAppData().context.srforgsectorid;
this.selectedOrgName = this.$store.getters.getAppData().context.srforgsectorname;
}
if (this.$store.getters.getAppData().srforgsections) {
this.selectedOrgArray = this.$store.getters.getAppData().srforgsections;
}
}
}
/**
* 选择组织部门回调
*
* @memberof AppOrgSector
*/
public orgSelect(data: string) {
if(Object.is(data,this.selectedOrgId)){
return;
}
let item: any = this.selectedOrgArray.find((_item: any) => {
return _item.srforgsectorid === data;
});
if (item.srforgsectorid && item.srforgsectorname) {
this.selectedOrgId = item.srforgsectorid;
this.selectedOrgName = item.srforgsectorname;
this.reload();
}
this.updateStoreOrgData(item);
}
/**
* 更新仓库Org信息
*
* @memberof AppOrgSector
*/
public updateStoreOrgData(data: any) {
let _appdata: any = this.$store.getters.getAppData();
let _context: any = _appdata.context;
Object.assign(_context,data);
Object.assign(_appdata, {context:_context});
this.$store.commit("updateAppData", _appdata);
}
}
</script>
<style lang="less">
@import "./app-orgsector.less";
</style>
\ No newline at end of file
......@@ -26,6 +26,8 @@
overflow:inherit;
}
}
}
}
.select-no-dropdown.el-select-dropdown{
display: none;
}
\ No newline at end of file
<template>
<div class="app-picker-select-view">
<Dropdown :visible="visible" trigger="custom" style="left:0px;width: 100%" @on-clickoutside="() => {triggerMenu(false);}" >
<Input v-model="inputValue" class="tree-input" type="text" :placeholder="placeholder" :disabled="disabled" @on-change="OnInputChange" @on-focus="()=>{triggerMenu(true);}" >
<Input v-if="isSingleSelect" v-model="queryValue" class="tree-input" type="text" :placeholder="placeholder" :disabled="disabled" @on-change="OnInputChange" @on-focus="()=>{triggerMenu(true);}" >
<template v-slot:suffix>
<i v-if="inputValue && !disabled" class='el-icon-circle-close' @click="onClear"></i>
<i v-if="queryValue && !disabled" class='el-icon-circle-close' @click="onClear"></i>
<Icon :type="visible ? 'ios-arrow-up' : 'ios-arrow-down'" class="icon-arrow" @click="() => {triggerMenu();}"></Icon>
<icon v-if="linkview" type="ios-open-outline" @click="openLinkView"/>
</template>
</Input>
<el-select v-if="!isSingleSelect" popper-class="select-no-dropdown" :value="keySet" multiple filterable remote :remote-method="($event) => {this.queryValue = $event;}" size="small" style="width:100%;" @change="onSelectChange" @focus="() => {triggerMenu(true);}" :disabled="disabled">
<el-option v-for="(item, index) in items" :key="index" :label="item.srfmajortext" :value="item[deKeyField]"></el-option>
</el-select>
<DropdownMenu slot="list">
<component
:is="pickupView.viewname"
:viewdata="viewdata"
:viewparam="viewparam"
:ifShowButtons="false"
:isShowButton="false"
:viewDefaultUsage="false"
@viewdataschange="setValue"
@viewdataschange="onViewdatasChange"
style="height:100%;">
</component>
</DropdownMenu>
......@@ -45,6 +49,38 @@ export default class AppPickerSelectView extends Vue {
* @memberof AppFormDRUIPart
*/
@Prop() public viewparams!: any;
/**
* 是否单选
*
* @type {*}
* @memberof AppFormDRUIPart
*/
@Prop({default: 'true'}) public isSingleSelect!: any;
/**
* 当前多选框选中值的key集合
*
* @type {string}
* @memberof AppTreePicker
*/
public keySet: any = [];
/**
* 当前多选框选中项对象集合
*
* @type {string}
* @memberof AppTreePicker
*/
public selectItems: Array<any> = [];
/**
* 所有操作过的下拉选项对象集合
*
* @type {string}
* @memberof AppTreePicker
*/
public items: Array<any> = [];
/**
* 视图参数
......@@ -52,7 +88,7 @@ export default class AppPickerSelectView extends Vue {
* @type {string}
* @memberof AppTreePicker
*/
public viewparam: any = JSON.stringify(this.viewparams);;
public viewparam: any = JSON.stringify(this.viewparams);
/**
* 视图上下文
......@@ -103,12 +139,12 @@ export default class AppPickerSelectView extends Vue {
@Prop({default: 'srfkey'}) public deKeyField!: string;
/**
* 输入框值
* 输入框值(搜索值)
*
* @type {string}
* @memberof AppTreePicker
*/
public inputValue: any = '';
public queryValue: any = '';
/**
* 值项名称
......@@ -116,7 +152,7 @@ export default class AppPickerSelectView extends Vue {
* @type {string}
* @memberof AppPicker
*/
@Prop() public valueitem?: string;
@Prop() public valueitem!: string;
/**
* 关联视图名称
......@@ -126,6 +162,14 @@ export default class AppPickerSelectView extends Vue {
*/
@Prop() public pickupView?: any;
/**
* 数据链接视图参数
*
* @type {*}
* @memberof AppPicker
*/
@Prop() public linkview?: any;
/**
* 提示信息
*
......@@ -173,7 +217,7 @@ export default class AppPickerSelectView extends Vue {
* @memberof AppTreePicker
*/
public OnInputChange($event: any){
let _viewdata = Object.assign({ query: this.inputValue }, JSON.parse(this.viewdata)) ;
let _viewdata = Object.assign({ query: this.queryValue }, JSON.parse(this.viewdata)) ;
this.viewdata = JSON.stringify(_viewdata);
}
......@@ -195,33 +239,37 @@ export default class AppPickerSelectView extends Vue {
}
/**
* 设置视图参数
* 公共参数处理
*
* @memberof AppTreePicker
* @param {*} arg
* @returns
* @memberof AppPicker
*/
public setViewParam(formData: any) {
if (!this.itemParam || !formData) {
return;
public handlePublicParams(arg: any): boolean {
if (!this.itemParam) {
return true;
}
let arg: any = {};
// 合并视图上下文参数和视图参数
let param: any = JSON.parse(JSON.stringify(this.viewparams));
let context: any = JSON.parse(JSON.stringify(this.context));
if (!this.data) {
this.$Notice.error({ title: '错误', desc: '表单数据异常' });
return false;
}
// 合并表单参数
arg.param = JSON.parse(JSON.stringify(this.viewparams));
arg.context = JSON.parse(JSON.stringify(this.context));
// 附加参数处理
if (this.itemParam.context) {
let _context = this.$util.formatData(formData,this.itemParam.context);
Object.assign(context,_context);
let _context = this.$util.formatData(this.data,this.itemParam.context);
Object.assign(arg.context,_context);
}
if (this.itemParam.param) {
let _param = this.$util.formatData(formData,this.itemParam.param);
Object.assign(param,_param);
let _param = this.$util.formatData(this.data,this.itemParam.param);
Object.assign(arg.param,_param);
}
if (this.itemParam.parentdata) {
let _parentdata = this.$util.formatData(formData,this.itemParam.parentdata);
Object.assign(param,_parentdata);
let _parentdata = this.$util.formatData(this.data,this.itemParam.parentdata);
Object.assign(arg.param,_parentdata);
}
this.viewdata = JSON.stringify(context);
this.viewparam = JSON.stringify(param);
return true;
}
/**
......@@ -233,9 +281,15 @@ export default class AppPickerSelectView extends Vue {
*/
@Watch('data',{deep:true})
onActivedataChange(newVal: any, oldVal: any) {
const newFormData: any = JSON.parse(newVal);
const oldFormData: any = JSON.parse(oldVal);
this.setViewParam(newFormData);
// 公共参数处理
let data: any = {};
const bcancel: boolean = this.handlePublicParams(data);
if (!bcancel) {
return;
}
// 参数处理
this.viewdata = JSON.stringify(data.context);
this.viewparam = JSON.stringify(data.param);
}
/**
......@@ -245,9 +299,35 @@ export default class AppPickerSelectView extends Vue {
* @param {*} oldVal
* @memberof AppPicker
*/
@Watch('value')
@Watch('value', { deep: true })
public onValueChange(newVal: any, oldVal: any) {
this.inputValue = newVal;
if(this.isSingleSelect){
this.queryValue = newVal;
if (!this.data || !this.valueitem || !this.data[this.valueitem]) {
this.$Notice.error({ title: '错误', desc: "编辑器"+this.name+'值项异常' });
}else{
let _viewparam = JSON.parse(this.viewparam);
_viewparam.selectedData = [{srfkey: this.data[this.valueitem], srfmajortext: this.value }];
this.viewparam = JSON.stringify(_viewparam);
}
}else{
this.keySet = [];
this.selectItems = [];
if (newVal) {
this.selectItems = JSON.parse(newVal);
this.selectItems.forEach((item: any) => {
this.keySet.push(item.srfkey);
let index = this.items.findIndex((i) => Object.is(i.srfkey, item.srfkey));
if (index < 0) {
this.items.push({ srfmajortext : item.srfmajortext, srfkey: item.srfkey });
}
});
let _viewparam = JSON.parse(this.viewparam);
_viewparam.selectedData = this.selectItems;
this.viewparam = JSON.stringify(_viewparam);
}
}
this.$forceUpdate();
}
/**
......@@ -256,7 +336,15 @@ export default class AppPickerSelectView extends Vue {
* @memberof AppTreePicker
*/
public created() {
this.setViewParam(this.data);
// 公共参数处理
let data: any = {};
const bcancel: boolean = this.handlePublicParams(data);
if (!bcancel) {
return;
}
// 参数处理
this.viewdata = JSON.stringify(data.context);
this.viewparam = JSON.stringify(data.param);
}
/**
......@@ -274,15 +362,36 @@ export default class AppPickerSelectView extends Vue {
* @param {*} item
* @memberof AppTreePicker
*/
public setValue(item: any) {
this.visible = false;
if (this.valueitem) {
let tempvalue = item[0][this.deMajorField] ? item[0][this.deKeyField] : item[0].srfkey;
this.$emit('formitemvaluechange', { name: this.valueitem, value: item[0][this.deKeyField] });
public onViewdatasChange($event: any) {
if($event.length == 0){
this.onClear(null);
return;
}
if (this.name) {
let tempvalue = item[0][this.deMajorField] ? item[0][this.deMajorField] : item[0].srfmajortext;
this.$emit('formitemvaluechange', { name: this.name, value: tempvalue });
if(this.isSingleSelect){
this.visible = false;
if (this.valueitem) {
let tempvalue = $event[0][this.deKeyField] ? $event[0][this.deKeyField] : $event[0].srfkey;
this.$emit('formitemvaluechange', { name: this.valueitem, value: tempvalue });
}
if (this.name) {
let tempvalue = $event[0][this.deMajorField] ? $event[0][this.deMajorField] : $event[0].srfmajortext;
this.$emit('formitemvaluechange', { name: this.name, value: tempvalue });
}
}else{
let selects: Array<any> = [];
if ($event && Array.isArray($event)) {
$event.forEach((select: any) => {
selects.push({ srfkey: select.srfkey, srfmajortext: select.srfmajortext });
let index = this.items.findIndex((item) => Object.is(item.srfkey, select.srfkey));
if (index < 0) {
this.items.push({ srfmajortext : select.srfmajortext, srfkey: select.srfkey });
}
});
}
if (this.name) {
let value = selects.length > 0 ? JSON.stringify(selects) : '';
this.$emit('formitemvaluechange', { name: this.name, value: value });
}
}
}
......@@ -299,6 +408,153 @@ export default class AppPickerSelectView extends Vue {
this.$forceUpdate();
}
/**
* 打开链接视图
*
* @memberof AppPicker
*/
public openLinkView($event: any): void {
if (!this.data || !this.valueitem || !this.data[this.valueitem]) {
console.error({ title: '错误', desc: '值项异常!' });
return;
}
// 公共参数处理
let data: any = {};
const bcancel: boolean = this.handlePublicParams(data);
if (!bcancel) {
return;
}
// 参数处理
let _context = data.context;
let _param = data.param;
Object.assign(_context, { [this.deKeyField]: this.data[this.valueitem] });
const view = JSON.parse(JSON.stringify(this.linkview));
const viewname2: string = this.$util.srfFilePath2(view.viewname);
view.viewname = viewname2;
if (Object.is(view.placement, 'INDEXVIEWTAB') || Object.is(view.placement, '')) {
this.openIndexViewTab(view, _context, _param);
} else if (Object.is(view.placement, 'POPOVER')) {
this.openPopOver($event, view, _context, _param);
} else if (Object.is(view.placement, 'POPUPMODAL')) {
this.openPopupModal(view, _context, _param);
} else if (view.placement.startsWith('DRAWER')) {
this.openDrawer(view, _context, _param);
}
}
/**
* 路由模式打开视图
*
* @private
* @param {string} viewpath
* @param {*} data
* @memberof AppPicker
*/
private openIndexViewTab(view: any, context: any, param: any): void {
const routePath = this.$viewTool.buildUpRoutePath(this.$route, this.context, view.deResParameters, view.parameters, [context] , param);
this.$router.push(routePath);
}
/**
* 气泡卡片模式打开
*
* @private
* @param {*} $event
* @param {*} view
* @param {*} data
* @memberof AppPicker
*/
private openPopOver($event: any, view: any, context: any, param: any): void {
let container: Subject<any> = this.$apppopover.openPop($event, view, context, param);
container.subscribe((result: any) => {
if (!result || !Object.is(result.ret, 'OK')) {
return;
}
this.openViewClose(result);
});
}
/**
* 模态模式打开视图
*
* @private
* @param {*} view
* @param {*} data
* @memberof AppPicker
*/
private openPopupModal(view: any, context: any, param: any): void {
let container: Subject<any> = this.$appmodal.openModal(view, context, param);
container.subscribe((result: any) => {
if (!result || !Object.is(result.ret, 'OK')) {
return;
}
this.openViewClose(result);
});
}
/**
* 抽屉模式打开视图
*
* @private
* @param {*} view
* @param {*} data
* @memberof AppPicker
*/
private openDrawer(view: any, context: any, param: any): void {
let container: Subject<any> = this.$appdrawer.openDrawer(view, context, param);
container.subscribe((result: any) => {
if (!result || !Object.is(result.ret, 'OK')) {
return;
}
this.openViewClose(result);
});
}
/**
* 打开页面关闭
*
* @param {*} result
* @memberof AppPicker
*/
public openViewClose(result: any) {
let item: any = {};
if (result.datas && Array.isArray(result.datas)) {
Object.assign(item, result.datas[0]);
}
if (this.data) {
if (this.valueitem) {
this.$emit('formitemvaluechange', { name: this.valueitem, value: item[this.deKeyField]?item[this.deKeyField]:item["srfkey"] });
}
if (this.name) {
this.$emit('formitemvaluechange', { name: this.name, value: item[this.deMajorField]?item[this.deMajorField]:item["srfmajortext"] });
}
}
}
/**
* 下拉选中回调
*
* @param {*} selects 当前选中的key值集合
* @memberof AppMpicker
*/
public onSelectChange(selects: any) {
let val: Array<any> = [];
if (selects.length > 0) {
selects.forEach((select: any) => {
let index = this.items.findIndex((item) => Object.is(item[this.deKeyField], select));
if (index >= 0) {
val.push(this.items[index]);
}
});
}
let value = val.length > 0 ? JSON.stringify(val) : '';
this.$emit('formitemvaluechange', { name: this.name, value: value });
}
}
</script>
......
......@@ -165,7 +165,7 @@ export default class AppPicker extends Vue {
* @type {string}
* @memberof AppPicker
*/
@Prop() public valueitem?: string;
@Prop() public valueitem!: string;
/**
* 值
......@@ -256,7 +256,9 @@ export default class AppPicker extends Vue {
* @memberof AppPicker
*/
public created() {
this.onSearch("", null, true);
if(Object.is(this.editortype, 'dropdown')){
this.onSearch("", null, true);
}
}
/**
......@@ -399,6 +401,7 @@ export default class AppPicker extends Vue {
const view = { ...this.pickupView };
let _context = data.context;
let _param = data.param;
_param.selectedData = [{srfkey: this.data[this.valueitem], srfmajortext: this.curvalue }];
// 判断打开方式
if (view.placement && !Object.is(view.placement, '')) {
if (Object.is(view.placement, 'POPOVER')) {
......@@ -420,9 +423,8 @@ export default class AppPicker extends Vue {
* @param {*} data
* @memberof AppPicker
*/
private openIndexViewTab(view: any, data: any): void {
let args = [Object.assign({}, this.data, data)];
const routePath = this.$viewTool.buildUpRoutePath(this.$route, this.context, view.deResParameters, view.parameters, args, data);
private openIndexViewTab(view: any, context: any, param: any): void {
const routePath = this.$viewTool.buildUpRoutePath(this.$route, this.context, view.deResParameters, view.parameters, [context] , param);
this.$router.push(routePath);
}
......@@ -523,7 +525,7 @@ export default class AppPicker extends Vue {
Object.assign(data, data.srfparentdata);
delete data.srfparentdata;
}
this.openIndexViewTab(view, data);
this.openIndexViewTab(view, null, data);
} else if (Object.is(result.openmode, 'POPUPMODAL')) {
const viewname = this.$util.srfFilePath2(result.viewname);
const view: any = {
......@@ -562,8 +564,6 @@ export default class AppPicker extends Vue {
if (response.status === 401) {
return;
}
const { data: _data } = response;
this.$Notice.error({ title: _data.title, desc: _data.message });
});
}
......@@ -573,29 +573,34 @@ export default class AppPicker extends Vue {
* @memberof AppPicker
*/
public openLinkView($event: any): void {
let srfkey: string;
if (!this.data || !this.valueitem || !this.data[this.valueitem]) {
this.$Notice.error({ title: '错误', desc: '值项异常!' });
console.error({ title: '错误', desc: '值项异常!' });
return;
}
srfkey = this.data[this.valueitem];
let data = { [this.deKeyField]: srfkey };
// 公共参数处理
let data: any = {};
const bcancel: boolean = this.handlePublicParams(data);
if (!bcancel) {
return;
}
// 参数处理
let _context = data.context;
let _param = data.param;
Object.assign(_context, { [this.deKeyField]: this.data[this.valueitem] });
const view = JSON.parse(JSON.stringify(this.linkview));
const viewname2: string = this.$util.srfFilePath2(view.viewname);
view.viewname = viewname2;
if (view.isRedirectView) {
this.openRedirectView($event, view, data);
} else if (Object.is(view.placement, 'INDEXVIEWTAB') || Object.is(view.placement, '')) {
this.openIndexViewTab(view, data);
this.openIndexViewTab(view, _context, _param);
} else if (Object.is(view.placement, 'POPOVER')) {
view.viewname = viewname2;
this.openPopOver($event, view, null, data);
this.openPopOver($event, view, _context, _param);
} else if (Object.is(view.placement, 'POPUPMODAL')) {
view.viewname = viewname2;
this.openPopupModal(view, null, data);
this.openPopupModal(view, _context, _param);
} else if (view.placement.startsWith('DRAWER')) {
view.viewname = viewname2;
this.openDrawer(view, null, data);
this.openDrawer(view, _context, _param);
}
}
......
.app-portal-design{
width:100%;
height: 100%;
.design-toolbar {
margin-top: -5px;
}
.ivu-card-body {
height: calc(100% - 51px);
.design-container {
height: 100%;
}
}
}
\ No newline at end of file
<template>
<card class="app-portal-design" :dis-hover="true" :padding="0" :bordered="false">
<p slot="title">
自定义门户
</p>
<div class="design-toolbar" slot="extra">
<i-button @click="click">保存</i-button>
</div>
<div class="design-container">
<app-dashboard-design :viewState="viewState" :context="context" :viewparams="viewparams" :utilServiceName="utilServiceName" @save="onSaved"></app-dashboard-design>
</div>
</card>
</template>
<script lang="ts">
import { Vue, Component, Prop, Model, Emit,Watch } from "vue-property-decorator";
import { Subject } from "rxjs";
import AppDashboardDesign from '@components/app-dashboard-design/app-dashboard-design.vue';
@Component({
components: {
AppDashboardDesign
}
})
export default class AppPortalDesign extends Vue {
/**
* 传入视图上下文
*
* @type {string}
* @memberof AppPortalDesign
*/
@Prop() protected viewdata!: string;
/**
* 传入视图参数
*
* @type {string}
* @memberof AppPortalDesign
*/
@Prop() protected viewparam!: string;
/**
* 视图默认使用
*
* @type {boolean}
* @memberof AppPortalDesign
*/
@Prop({ default: true }) protected viewDefaultUsage!: boolean;
/**
* 应用上下文
*
* @type {*}
* @memberof AppPortalDesign
*/
protected context:any = {};
/**
* 视图参数
*
* @type {*}
* @memberof AppPortalDesign
*/
protected viewparams:any = {};
/**
* modelId
*
* @type {*}
* @memberof AppPortalDesign
*/
protected modelId:string = "";
/**
* 功能服务名称
*
* @type {*}
* @memberof AppPortalDesign
*/
protected utilServiceName:string = "";
/**
* 视图状态订阅对象
*
* @private
* @type {Subject<{action: string, data: any}>}
* @memberof AppPortalDesign
*/
protected viewState: Subject<ViewState> = new Subject();
/**
* 视图参数变化
*
* @param {*} newVal
* @param {*} oldVal
* @memberof AppPortalDesign
*/
@Watch('viewparam',{immediate: true, deep: true})
onParamData(newVal: any, oldVal: any) {
this.prepareViewparam();
}
/**
* 处理应用上下文变化
*
* @param {*} newVal
* @param {*} oldVal
* @memberof AppPortalDesign
*/
@Watch('viewdata')
onViewData(newVal: any, oldVal: any) {
this.prepareContext();
}
/**
* 生命周期
*
* @memberof AppPortalDesign
*/
public created() {
this.prepareViewparam();
this.prepareContext();
}
/**
* 准备视图参数
*
* @memberof AppPortalDesign
*/
public prepareViewparam() {
if(this.viewparam){
Object.assign(this.viewparams, JSON.parse(this.viewparam));
if(this.viewparams && this.viewparams.modelid){
this.modelId = this.viewparams.modelid;
}
if(this.viewparams && this.viewparams.utilServiceName){
this.utilServiceName = this.viewparams.utilServiceName;
}
}
}
/**
* 准备视图上下文参数
*
* @memberof AppPortalDesign
*/
public prepareContext() {
if (!this.viewDefaultUsage && this.viewdata && !Object.is(this.viewdata, '')) {
Object.assign(this.context, JSON.parse(this.viewdata));
return;
}
}
/**
* 点击保存
*
* @memberof AppPortalDesign
*/
public click() {
this.viewState.next({ tag: "", action: "save", data: {} })
}
/**
* 保存完成
*
* @memberof AppPortalDesign
*/
public onSaved($event: any) {
this.$emit("close", $event);
}
}
</script>
<style lang='less'>
@import "./app-portal-design.less";
</style>
\ No newline at end of file
<template>
<radio-group class="app-radio-group" v-model="value" >
<radio v-for="(_item,index) in items" :key = "index" :label="_item.value" :disabled="isDisabled || _item.disabled">
<span>{{_item.text}}</span>
<span>{{Object.is(codelistType,'STATIC') ? $t('codelist.'+tag+'.'+_item.value) : _item.text}}</span>
</radio>
</radio-group>
</template>
......
<template>
<div>
<el-rate
:value ="CurrentVal"
:value ="currentVal"
:disabled="disabled"
:max="max"
@change="change"
>
</el-rate>
......@@ -28,13 +29,19 @@ export default class AppRate extends Vue {
*/
@Prop() public disabled?: boolean;
/**
* 最大值
* @type {number}
* @memberof AppRate
*/
@Prop({default:5}) public max!: number;
/**
* 当前值
*
* @memberof AppRate
*/
get CurrentVal() {
get currentVal() {
return this.value;
}
......
<template>
<div>
<el-slider
v-model ="currentVal"
:disabled="disabled"
:step="step"
:min="min"
:max="max"
@change="change">
</el-slider >
</div>
</template>
<script lang='ts'>
import { Component, Vue, Prop, Model, Watch } from "vue-property-decorator";
@Component({})
export default class AppSlider extends Vue {
/**
* 传入值
* @type {any}
* @memberof AppSlider
*/
@Prop() public value?:any;
/**
* 是否禁用
* @type {boolean}
* @memberof AppSlider
*/
@Prop() public disabled?: boolean;
/**
* 属性项名称
*
* @type {string}
* @memberof AppPicker
*/
@Prop() public name!: string;
/**
* 步长
* @type {number}
* @memberof AppSlider
*/
@Prop({default:1}) public step!: number;
/**
* 最小值
* @type {number}
* @memberof AppSlider
*/
@Prop({default:0}) public min!: number;
/**
* 最大值
* @type {number}
* @memberof AppSlider
*/
@Prop({default:100}) public max!: number;
/**
* 当前值
*
* @memberof AppSlider
*/
currentVal: number = 0;
/**
* 值变化
*
* @param {*} newVal
* @param {*} oldVal
* @memberof AppPicker
*/
@Watch('value')
public onValueChange(newVal: any, oldVal: any) {
this.currentVal = parseInt(newVal);
}
/**
* change事件
*
* @param {*} val
* @memberof AppPicker
*/
public change(val: any) {
this.$emit('change', { name: this.name, value: val });
}
}
</script>
<style lang='less'>
@import "./app-slider.less";
</style>
\ No newline at end of file
<template>
<span>{{text}}</span>
<span>{{isUseLangres ? $t(text) : text}}</span>
</template>
<script lang="ts">
......@@ -24,6 +24,7 @@ export default class DropDownList extends Vue {
*/
@Prop() public data?: any;
/**
* 监控表单属性 data 值
*
......@@ -32,7 +33,7 @@ export default class DropDownList extends Vue {
@Watch('data')
onDataChange(newVal: any, oldVal: any) {
if(newVal !== oldVal){
this.setText();
this.load();
}
}
......@@ -43,6 +44,14 @@ export default class DropDownList extends Vue {
*/
public text:any = '';
/**
* 编辑器类型
*
* @type {string}
* @memberof AppSpan
*/
@Prop() public editorType?: string;
/**
* 代码表标识
*
......@@ -73,21 +82,49 @@ export default class DropDownList extends Vue {
* @memberof AppSpan
*/
public created() {
if(this.tag && Object.is(this.codelistType,"STATIC")){
const codelist = this.$store.getters.getCodeList(this.tag);
if (codelist) {
this.items = [...JSON.parse(JSON.stringify(codelist.items))];
} else {
console.log(`----${this.tag}----代码表不存在`);
}
}else if(this.tag && Object.is(this.codelistType,"DYNAMIC")){
this.codeListService.getItems(this.tag).then((res:any) => {
this.items = res;
}).catch((error:any) => {
console.log(`----${this.tag}----代码表不存在`);
});
}
this.setText();
this.load();
}
/**
* 是否使用多语言资源
* @type {boolean}
* @memberof AppSpan
*/
public isUseLangres:boolean = false;
/**
* 加载代码表
*
* @memberof AppSpan
*/
public load(){
if(Object.is(this.editorType,'PICTURE') || Object.is(this.editorType,'PICTURE_ONE') ||Object.is(this.editorType,'FILEUPLOADER')){
let files: any[] = JSON.parse(this.data);
let names: any[] = [];
files.forEach((item:any) => {
names.push(item.name);
});
this.text = names.join(',');
}else{
if(this.tag && Object.is(this.codelistType,"STATIC")){
const codelist = this.$store.getters.getCodeList(this.tag);
if (codelist) {
this.items = [...JSON.parse(JSON.stringify(codelist.items))];
this.setText();
} else {
console.log(`----${this.tag}----代码表不存在`);
}
}else if(this.tag && Object.is(this.codelistType,"DYNAMIC")){
this.codeListService.getItems(this.tag).then((res:any) => {
this.items = res;
this.setText();
}).catch((error:any) => {
console.log(`----${this.tag}----代码表不存在`);
});
}else{
this.setText();
}
}
}
/**
......@@ -95,13 +132,24 @@ export default class DropDownList extends Vue {
* @memberof AppSpan
*/
public setText(){
this.isUseLangres = false;
if(this.items.length>0){
let currentItem:any = this.items.find((item:any)=>{
return item.value == this.data;
});
this.text = currentItem ;
if(currentItem){
if(Object.is(this.codelistType,'STATIC')){
this.isUseLangres = true;
this.text = 'codelist.'+this.tag+'.'+this.data;
}else{
this.text = currentItem.label;
}
}else{
this.isUseLangres = true;
this.text = 'codelist.'+this.tag+'.empty';
}
}else{
this.text = this.data;
this.text = this.data;
}
}
......
<template>
<div class="app-stepper">
<el-input-number :value="currentVal" :disabled="disabled" @change="onChange" :min="min" :max="max" :step="step" label="描述文字"></el-input-number>
</div>
</template>
<script lang='ts'>
import { Component, Vue, Prop, Model, Watch } from "vue-property-decorator";
@Component({})
export default class AppStepper extends Vue {
/**
* 传入值
* @type {any}
* @memberof AppStepper
*/
@Prop() public value?:any;
/**
* 属性项名称
*
* @type {string}
* @memberof AppPicker
*/
@Prop() public name!: string;
/**
* 是否禁用
* @type {boolean}
* @memberof AppStepper
*/
@Prop() public disabled?: boolean;
/**
* 步长
* @type {number}
* @memberof AppStepper
*/
@Prop({default:1}) public step!: number;
/**
* 最小值
* @type {number}
* @memberof AppStepper
*/
@Prop({default:0}) public min!: number;
/**
* 最大值
* @type {number}
* @memberof AppStepper
*/
@Prop({default:100}) public max!: number;
/**
* 当前值
*
* @memberof AppStepper
*/
get currentVal() {
return this.value ? this.value : 0;
}
/**
* change
*/
public onChange(val: any) {
this.$emit('change', { name: this.name, value: val });
}
}
</script>
<style lang='less'>
@import "./app-stepper.less";
</style>
\ No newline at end of file
.app-studioaction {
.studio-config-container {
position: absolute;
top: 10px;
right: 30px;
z-index: 1;
background: rgba(22, 22, 22, 0.6);
border-radius: 5px;
display: flex;
>.title {
color: white;
border-right: 1px solid #333;
padding: 5px;
text-align: center;
}
>.actions {
display: flex;
}
}
}
\ No newline at end of file
<template>
<div class="app-studioaction" v-if="isDevMode">
<div v-show="sdc.isShowTool" class="studio-config-container">
<div class="title">
{{viewTitle}}
</div>
<div class="actions">
<div class="action-item" title="进入当前视图配置界面">
<i-button type="text" ghost @click="configView()">配置</i-button>
</div>
<div class="action-item" title="建立当前界面的issues">
<i-button type="text" ghost @click="createIssues()">新建issues</i-button>
</div>
</div>
</div>
</div>
</template>
<script lang = 'ts'>
import { Vue, Component, Inject, Prop } from "vue-property-decorator";
import { Environment } from '@/environments/environment';
import { StudioActionUtil } from '@/utils';
@Component({})
export default class AppStudioAction extends Vue {
/**
* 视图标题
*
* @type {string}
* @memberof AppStudioAction
*/
@Prop() public viewTitle!:string;
/**
* 视图名称
*
* @type {string}
* @memberof AppStudioAction
*/
@Prop() public viewName!:string;
/**
* 是否开发为环境
*
* @type {boolean}
* @memberof AppStudioAction
*/
public isDevMode:boolean = Environment.devMode;
/**
* 配置平台操作控制器
*
* @type {StudioActionController}
* @memberof AppStudioAction
*/
public sdc: StudioActionUtil = StudioActionUtil.getInstance();
/**
* 触发配置
*
* @protected
* @memberof AppStudioAction
*/
protected configView(): void {
this.sdc.openStudioConfigView(this.viewName);
}
/**
* 新建issues
*
* @protected
* @memberof AppStudioAction
*/
protected createIssues(): void {
this.sdc.createdIssues(this.viewName);
}
}
</script>
<style lang="less">
@import "./app-studioaction.less";
</style>
\ No newline at end of file
......@@ -21,7 +21,7 @@ export default class AppSwitch extends Vue {
}
set curValue(value:any){
let emitValue = value == true ? '1':'0';
let emitValue = value == true ? 1:0;
this.$emit('change',emitValue);
}
......
......@@ -13,7 +13,7 @@
:is="refviewname"
:viewdata="viewdata"
:viewparam="viewparam"
:ifShowButtons="false"
:isShowButton="false"
:viewDefaultUsage="false"
@viewdataschange="setValue"
style="height:100%;">
......
......@@ -2,7 +2,7 @@
<div class='app-header-user'>
<dropdown @on-click="userSelect" :transfer="true">
<div class='user'>
<span>{{$t('user.name')}}</span>
<span>{{user.name ? user.name : $t('user.name')}}</span>
&nbsp;&nbsp;<avatar :src="user.avatar" />
</div>
<dropdown-menu class='menu' slot='list' style='font-size: 15px !important;'>
......@@ -22,14 +22,14 @@ import { Vue, Component } from 'vue-property-decorator';
messages: {
'zh-CN': {
user: {
name: '匿名访问',
name: '系统管理员',
logout: '退出登陆',
surelogout: '确认要退出登陆?',
}
},
'en-US': {
user: {
name: 'Anonymous access',
name: 'System',
logout: 'Logout',
surelogout: 'Are you sure logout?',
}
......@@ -45,7 +45,7 @@ export default class AppUser extends Vue {
* @memberof AppUser
*/
public user = {
name: 'user.name',
name: '',
avatar: './assets/img/avatar.png',
}
......@@ -73,13 +73,18 @@ export default class AppUser extends Vue {
* @memberof AppUser
*/
public mounted() {
if (window.localStorage.getItem('user')) {
const _user: any = window.localStorage.getItem('user') ? window.localStorage.getItem('user') : '';
const user = JSON.parse(_user);
Object.assign(this.user, user, {
time: +new Date
});
let _user:any = {};
if(this.$store.getters.getAppData()){
if(this.$store.getters.getAppData().context && this.$store.getters.getAppData().context.srfusername){
_user.name = this.$store.getters.getAppData().context.srfusername;
}
if(this.$store.getters.getAppData().context && this.$store.getters.getAppData().context.srfusericonpath){
_user.avatar = this.$store.getters.getAppData().context.srfusericonpath;
}
}
Object.assign(this.user,_user,{
time: +new Date
});
}
/**
......
<template>
<div class="codelist">
<span v-if="ifEmpty">{{emtpytext}}</span>
<span v-if="ifEmpty">{{$t('codelist.'+srfkey+'.empty')}}</span>
<template v-if="!ifEmpty">
<template v-if="renderMode == 'string'">
<template v-for="(val, index) in items">
......@@ -8,7 +8,7 @@
<template v-for="(item, index) in val">
{{ index != 0 ? "、" : ''}}
<i v-if="item.iconCls" :class="item.iconCls"></i>
<span :class="item.textCls" :style="{color:item.color}">{{item.text}}</span>
<span :class="item.textCls" :style="{color:item.color}">{{isUseLangres ? $t(item.text) : item.text}}</span>
</template>
</template>
</template>
......@@ -16,7 +16,7 @@
<template v-for="(item, index) in items">
{{ index != 0 ? textSeparator : ''}}
<i v-if="item.iconCls" :class="item.iconCls"></i>
<span :class="item.textCls" :style="{color:item.color}">{{item.text}}</span>
<span :class="item.textCls" :style="{color:item.color}">{{isUseLangres ? $t(item.text) : item.text}}</span>
</template>
</template>
</template>
......@@ -66,7 +66,7 @@ export default class CodeList extends Vue {
* @type {boolean}
* @memberof SelectPicker
*/
@Prop() public emtpytext?: string;
@Prop() public emptytext?: string;
/**
* 绘制模式
......@@ -113,6 +113,13 @@ export default class CodeList extends Vue {
this.dataHandle();
}
/**
* 是否使用多语言资源
* @type {boolean}
* @memberof CodeList
*/
public isUseLangres:boolean = false;
/**
* 数据值变化
*
......@@ -133,6 +140,7 @@ export default class CodeList extends Vue {
* @memberof CodeList
*/
private dataHandle(){
this.isUseLangres = false;
let _this = this;
// 空值判断
if(Object.is(this.$util.typeOf(this.value), 'undefined') || Object.is(this.$util.typeOf(this.value), 'null')){
......@@ -150,6 +158,7 @@ export default class CodeList extends Vue {
});
// 静态处理
} else if(Object.is(this.codelistType, "STATIC")){
this.isUseLangres = true;
let items = this.$store.getters.getCodeListItems(this.srfkey);
_this.setItems(items, _this);
}
......@@ -168,6 +177,7 @@ export default class CodeList extends Vue {
if (items) {
let result:any = [];
if(Object.is(this.renderMode,"number")){
this.isUseLangres = false;
items.map((_item: any, index: number)=>{
const nValue = parseInt((_this.value as any), 10);
const codevalue = _item.value;
......@@ -198,9 +208,10 @@ export default class CodeList extends Vue {
}
// 设置items
if(result.length != 0){
_this.items = result;
_this.items = result;
}else{
_this.items = [{text:"不匹配"}];
this.isUseLangres = true;
_this.items = [{text:'codelist.'+this.srfkey+'.empty'}];
}
}
}
......@@ -216,15 +227,23 @@ export default class CodeList extends Vue {
*/
private getItem(items: any[], value: any): any {
let result: any = {};
const arr: Array<any> = items.filter(item => Object.is(item.value, value));
const arr: Array<any> = items.filter(item => {return item.value == value});
if (arr.length !== 1) {
return undefined;
}
result = { ...arr[0] };
return result;
if(Object.is(this.codelistType,'STATIC')){
let value = JSON.parse(JSON.stringify(result));
value.text = 'codelist.'+this.srfkey+'.'+value.value;
return value;
}else{
return result;
}
}
}
</script>
......
......@@ -11,7 +11,7 @@
:placeholder="placeholder ? this.placeholder : '请选择'">
<i-option v-for="(item, index) in items" :key="index" :value="item.value" :label="item.text">
<Checkbox :value = "(currentVal.indexOf(item.value))==-1?false:true">
{{item.text}}
{{Object.is(codelistType,'STATIC') ? $t('codelist.'+tag+'.'+item.value) : item.text}}
</Checkbox>
</i-option>
</i-select>
......@@ -83,7 +83,8 @@ export default class DropDownList extends Vue {
set currentVal(val: any) {
const type: string = this.$util.typeOf(val);
val = Object.is(type, 'null') || Object.is(type, 'undefined') ? [] : val;
this.$emit('change', val);
let value = val.length > 0 ? val.join(',') : '';
this.$emit('change', value);
}
/**
......@@ -92,7 +93,7 @@ export default class DropDownList extends Vue {
* @memberof DropDownListMpicker
*/
get currentVal() {
return this.itemValue?this.itemValue:[];
return this.itemValue? this.itemValue.split(','):[];
}
/**
......@@ -109,7 +110,6 @@ export default class DropDownList extends Vue {
* @memberof DropDownListMpicker
*/
public created() {
this.currentVal = [];
if(this.tag && Object.is(this.codelistType,"STATIC")){
const codelist = this.$store.getters.getCodeList(this.tag);
if (codelist) {
......
......@@ -8,7 +8,7 @@
:filterable="filterable === true ? true : false"
@on-open-change="onClick"
:placeholder="placeholder ? this.placeholder : '请选择'">
<i-option v-for="(item, index) in items" :key="index" :value="item.value">{{item.text}}</i-option>
<i-option v-for="(item, index) in items" :key="index" :value="item.value">{{Object.is(codelistType,'STATIC') ? $t('codelist.'+tag+'.'+item.value) : item.text}}</i-option>
</i-select>
</template>
......
......@@ -3,6 +3,7 @@
<i-input
:placeholder="placeholder"
:size="size"
:type="type"
v-model="CurrentVal"
:disabled="disabled ? true : false"
@on-enter="enter"
......
......@@ -4,7 +4,6 @@
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator';
import { VNode } from 'vue';
@Component({})
export default class ViewShell extends Vue {
......
import { Store } from 'vuex';
/**
* 计数器服务基类
*
* @export
* @class CounterService
*/
export default class CounterService {
/**
* Vue 状态管理器
*
* @private
* @type {(any | null)}
* @memberof CounterService
*/
private $store: Store<any> | null = null;
/**
* Creates an instance of CounterService.
*
* @param {*} [opts={}]
* @memberof CounterService
*/
constructor(opts: any = {}) {
this.$store = opts.$store;
}
/**
* 获取状态管理器
*
* @returns {(any | null)}
* @memberof CounterService
*/
public getStore(): Store<any> | null {
return this.$store;
}
/**
* 获取计数器服务
*
* @protected
* @param {string} name 实体名称
* @returns {Promise<any>}
* @memberof CounterService
*/
public getService(name: string): Promise<any> {
return (window as any)['counterServiceRegister'].getService(name);
}
}
\ No newline at end of file
import ViewEngine from './view-engine';
/**
* 日历导航视图界面引擎
*
* @export
* @class CalendarExpViewEngine
* @extends {ViewEngine}
*/
export default class CalendarExpViewEngine extends ViewEngine {
/**
* 日历导航栏部件
*
* @type {*}
* @memberof CalendarExpViewEngine
*/
public calendarExpBar: any = null;
/**
* Creates an instance of CalendarExpViewEngine.
*
* @memberof CalendarExpViewEngine
*/
constructor() {
super();
}
/**
* 初始化引擎
*
* @param {*} options
* @memberof CalendarExpViewEngine
*/
public init(options: any): void {
this.calendarExpBar = options.calendarexpbar;
super.init(options);
}
/**
* 引擎加载
*
* @memberof CalendarExpViewEngine
*/
public load(): void {
super.load();
if (this.getCalendarExpBar() && this.isLoadDefault) {
const tag = this.getCalendarExpBar().name;
this.setViewState2({ tag: tag, action: 'load', viewdata: this.view.viewparams });
} else {
this.isLoadDefault = true;
}
}
/**
* 部件事件机制
*
* @param {string} ctrlName
* @param {string} eventName
* @param {*} args
* @memberof CalendarExpViewEngine
*/
public onCtrlEvent(ctrlName: string, eventName: string, args: any): void {
super.onCtrlEvent(ctrlName, eventName, args);
if (Object.is(ctrlName, 'calendarexpbar')) {
this.calendarExpBarEvent(eventName, args);
}
}
/**
* 日历导航事件
*
* @param {string} eventName
* @param {*} args
* @memberof CalendarExpViewEngine
*/
public calendarExpBarEvent(eventName: string, args: any): void {
if (Object.is(eventName, 'load')) {
this.view.$emit('viewload', args);
}
if (Object.is(eventName, 'selectionchange')) {
this.view.$emit('viewdataschange', args);
}
if (Object.is(eventName, 'activated')) {
this.view.$emit('viewdatasactivated', args);
}
}
/**
* 获取部件对象
*
* @returns {*}
* @memberof CalendarExpViewEngine
*/
public getCalendarExpBar(): any {
return this.calendarExpBar;
}
}
\ No newline at end of file
......@@ -37,11 +37,6 @@ export default class ChartViewEngine extends SearchViewEngine {
*/
public load(opts: any = {}): void {
super.load(opts);
if (!this.getSearchForm() && this.isLoadDefault) {
const tag = this.getChart().name;
this.setViewState2({ tag: tag, action: 'load', viewdata: this.view.context });
}
this.isLoadDefault = true;
}
/**
......
......@@ -10,4 +10,21 @@ import ChartViewEngine from './chart-view-engine';
*/
export default class ChartView9Engine extends ChartViewEngine {
/**
* 引擎加载
*
* @param {*} [opts={}]
* @memberof ChartView9Engine
*/
public load(opts: any = {},isnotify:boolean=false): void {
if(!this.view.isformDruipart){
super.load(opts);
}else{
if(isnotify){
super.load(opts);
}
}
}
}
\ No newline at end of file
import ViewEngine from './view-engine';
/**
* 卡片视图导航视图界面引擎
*
* @export
* @class DataViewExpViewEngine
* @extends {ViewEngine}
*/
export default class DataViewExpViewEngine extends ViewEngine {
/**
* 卡片导航栏部件
*
* @type {*}
* @memberof DataViewExpViewEngine
*/
public dataviewExpBar: any = null;
/**
* Creates an instance of DataViewExpViewEngine.
*
* @memberof DataViewExpViewEngine
*/
constructor() {
super();
}
/**
* 初始化引擎
*
* @param {*} options
* @memberof DataViewExpViewEngine
*/
public init(options: any): void {
this.dataviewExpBar = options.dataviewexpbar;
super.init(options);
}
/**
* 引擎加载
*
* @memberof DataViewExpViewEngine
*/
public load(): void {
super.load();
if (this.getDataviewExpBar() && this.isLoadDefault) {
const tag = this.getDataviewExpBar().name;
this.setViewState2({ tag: tag, action: 'load', viewdata: this.view.viewparams });
} else {
this.isLoadDefault = true;
}
}
/**
* 部件事件机制
*
* @param {string} ctrlName
* @param {string} eventName
* @param {*} args
* @memberof DataViewExpViewEngine
*/
public onCtrlEvent(ctrlName: string, eventName: string, args: any): void {
super.onCtrlEvent(ctrlName, eventName, args);
if (Object.is(ctrlName, 'dataviewexpbar')) {
this.dataviewExpBarEvent(eventName, args);
}
}
/**
* 卡片导航事件
*
* @param {string} eventName
* @param {*} args
* @memberof DataViewExpViewEngine
*/
public dataviewExpBarEvent(eventName: string, args: any): void {
if (Object.is(eventName, 'load')) {
this.view.$emit('viewload', args);
}
if (Object.is(eventName, 'selectionchange')) {
this.view.$emit('viewdataschange', args);
}
if (Object.is(eventName, 'activated')) {
this.view.$emit('viewdatasactivated', args);
}
}
/**
* 获取部件对象
*
* @returns {*}
* @memberof DataViewExpViewEngine
*/
public getDataviewExpBar(): any {
return this.dataviewExpBar;
}
}
\ No newline at end of file
import DataViewEngine from './data-view-engine';
/**
*
*
* @export
* @class EditView9Engine
* @extends {EditViewEngine}
*/
export default class DataView9Engine extends DataViewEngine {
/**
* 引擎加载
*
* @param {*} [opts={}]
* @memberof DataView9Engine
*/
public load(opts: any = {},isnotify:boolean=false): void {
if(!this.view.isformDruipart){
super.load(opts);
}else{
if(isnotify){
super.load(opts);
}
}
}
}
......@@ -38,19 +38,6 @@ export default class EditView2Engine extends EditViewEngine {
super.init(options);
}
/**
* 部件加载
*
* @param {*} [opts={}]
* @memberof EditView2Engine
*/
public load(opts: any = {}): void {
if (this.getDRBar()) {
const tag = this.getDRBar().name;
this.setViewState2({ tag: tag, action: 'load', viewdata: this.view.viewparams });
}
}
/**
* 部件事件机制
*
......@@ -77,19 +64,6 @@ export default class EditView2Engine extends EditViewEngine {
if (Object.is(eventName, 'selectionchange')) {
this.drBarSelectionChange(args);
}
if (Object.is(eventName, 'load')) {
this.drBarLoad(args);
}
}
/**
* 关系部件加载完成
*
* @param {any[]} args
* @memberof EditView2Engine
*/
public drBarLoad(args: any[]): void {
super.load();
}
/**
......
import EditViewEngine from './edit-view-engine';
/**
* 实体编辑视图(上下关系)界面引擎
*
* @export
* @class EditView4Engine
* @extends {EditViewEngine}
*/
export default class EditView4Engine extends EditViewEngine {
/**
* 数据关系栏
*
* @protected
* @type {*}
* @memberof EditView4Engine
*/
protected drTab: any;
/**
* Creates an instance of EditView4Engine.
*
* @memberof EditView4Engine
*/
constructor() {
super();
}
/**
* 初始化引擎
*
* @param {*} [options={}]
* @memberof EditView4Engine
*/
public init(options: any = {}): void {
this.drTab = options.drtab;
super.init(options);
}
/**
* 部件事件机制
*
* @param {string} ctrlName
* @param {string} eventName
* @param {*} args
* @memberof EditView4Engine
*/
public onCtrlEvent(ctrlName: string, eventName: string, args: any): void {
super.onCtrlEvent(ctrlName, eventName, args);
if (Object.is(ctrlName, 'drtab')) {
this.drTabEvent(eventName, args);
}
}
/**
* 数据关系栏事件
*
* @param {string} eventName
* @param {any[]} args
* @memberof EditView4Engine
*/
public drTabEvent(eventName: string, args: any[]): void {
if (Object.is(eventName, 'selectionchange')) {
this.drTabSelectionChange(args);
}
}
/**
* 数据关系栏选中
*
* @param {any[]} args
* @memberof EditView4Engine
*/
public drTabSelectionChange(args: any[]): void {
const item = args[0];
if (!item || Object.keys(item).length === 0) {
return;
}
this.view.selection = {};
Object.assign(this.view.selection, JSON.parse(JSON.stringify(item)));
}
/**
* 表单加载完成
*
* @param {*} [arg={}]
* @memberof EditView4Engine
*/
public onFormLoad(arg: any = {}): void {
super.onFormLoad(arg);
if (this.getDrTab()) {
const tag = this.getDrTab().name;
this.setViewState2({ tag: tag, action: 'state', viewdata: this.view.viewparams });
}
}
/**
* 表单保存完成
*
* @param {*} [arg={}]
* @memberof EditView4Engine
*/
public onFormSave(arg: any = {}): void {
super.onFormSave(arg);
if (this.getDrTab()) {
const tag = this.getDrTab().name;
this.setViewState2({ tag: tag, action: 'state', viewdata: this.view.viewparams });
}
}
/**
* 获取关系
*
* @returns {*}
* @memberof EditView4Engine
*/
public getDrTab(): any {
return this.drTab;
}
}
\ No newline at end of file
import ViewEngine from './view-engine';
/**
* 表格导航视图界面引擎
*
* @export
* @class GridExpViewEngine
* @extends {ViewEngine}
*/
export default class GridExpViewEngine extends ViewEngine {
/**
* 表格导航栏部件
*
* @type {*}
* @memberof GridExpViewEngine
*/
public gridExpBar: any = null;
/**
* Creates an instance of GridExpViewEngine.
*
* @memberof GridExpViewEngine
*/
constructor() {
super();
}
/**
* 初始化引擎
*
* @param {*} options
* @memberof GridExpViewEngine
*/
public init(options: any): void {
this.gridExpBar = options.gridexpbar;
super.init(options);
}
/**
* 引擎加载
*
* @memberof GridExpViewEngine
*/
public load(): void {
super.load();
if (this.getGridExpBar() && this.isLoadDefault) {
const tag = this.getGridExpBar().name;
this.setViewState2({ tag: tag, action: 'load', viewdata: this.view.viewparams });
} else {
this.isLoadDefault = true;
}
}
/**
* 部件事件机制
*
* @param {string} ctrlName
* @param {string} eventName
* @param {*} args
* @memberof GridExpViewEngine
*/
public onCtrlEvent(ctrlName: string, eventName: string, args: any): void {
super.onCtrlEvent(ctrlName, eventName, args);
if (Object.is(ctrlName, 'gridexpbar')) {
this.gridExpBarEvent(eventName, args);
}
}
/**
* 表格导航事件
*
* @param {string} eventName
* @param {*} args
* @memberof GridExpViewEngine
*/
public gridExpBarEvent(eventName: string, args: any): void {
if (Object.is(eventName, 'load')) {
this.view.$emit('viewload', args);
}
if (Object.is(eventName, 'selectionchange')) {
this.view.$emit('viewdataschange', args);
}
if (Object.is(eventName, 'activated')) {
this.view.$emit('viewdatasactivated', args);
}
}
/**
* 获取部件对象
*
* @returns {*}
* @memberof GridExpViewEngine
*/
public getGridExpBar(): any {
return this.gridExpBar;
}
}
\ No newline at end of file
......@@ -37,6 +37,22 @@ export default class GridViewEngine extends MDViewEngine {
super.init(options);
}
/**
* 引擎加载
*
* @param {*} [opts={}]
* @memberof GridViewEngine
*/
public load(opts: any = {},isnotify:boolean=false): void {
if(!this.view.isformDruipart){
super.load(opts);
}else{
if(isnotify){
super.load(opts);
}
}
}
/**
* 部件事件
*
......
import ViewEngine from './view-engine';
/**
* 列表导航视图界面引擎
*
* @export
* @class ListExpViewEngine
* @extends {ViewEngine}
*/
export default class ListExpViewEngine extends ViewEngine {
/**
* 列表导航栏部件
*
* @type {*}
* @memberof ListExpViewEngine
*/
public listExpBar: any = null;
/**
* Creates an instance of ListExpViewEngine.
*
* @memberof ListExpViewEngine
*/
constructor() {
super();
}
/**
* 初始化引擎
*
* @param {*} options
* @memberof ListExpViewEngine
*/
public init(options: any): void {
this.listExpBar = options.listexpbar;
super.init(options);
}
/**
* 引擎加载
*
* @memberof ListExpViewEngine
*/
public load(): void {
super.load();
if (this.getListExpBar() && this.isLoadDefault) {
const tag = this.getListExpBar().name;
this.setViewState2({ tag: tag, action: 'load', viewdata: this.view.viewparams });
} else {
this.isLoadDefault = true;
}
}
/**
* 部件事件机制
*
* @param {string} ctrlName
* @param {string} eventName
* @param {*} args
* @memberof ListExpViewEngine
*/
public onCtrlEvent(ctrlName: string, eventName: string, args: any): void {
super.onCtrlEvent(ctrlName, eventName, args);
if (Object.is(ctrlName, 'listexpbar')) {
this.listExpBarEvent(eventName, args);
}
}
/**
* 列表导航事件
*
* @param {string} eventName
* @param {*} args
* @memberof ListExpViewEngine
*/
public listExpBarEvent(eventName: string, args: any): void {
if (Object.is(eventName, 'load')) {
this.view.$emit('viewload', args);
}
if (Object.is(eventName, 'selectionchange')) {
this.view.$emit('viewdataschange', args);
}
if (Object.is(eventName, 'activated')) {
this.view.$emit('viewdatasactivated', args);
}
}
/**
* 获取部件对象
*
* @returns {*}
* @memberof ListExpViewEngine
*/
public getListExpBar(): any {
return this.listExpBar;
}
}
\ No newline at end of file
import ListViewEngine from './list-view-engine';
/**
*
*
* @export
* @class EditView9Engine
* @extends {EditViewEngine}
*/
export default class ListView9Engine extends ListViewEngine {
/**
* 引擎加载
*
* @param {*} [opts={}]
* @memberof ListView9Engine
*/
public load(opts: any = {},isnotify:boolean=false): void {
if(!this.view.isformDruipart){
super.load(opts);
}else{
if(isnotify){
super.load(opts);
}
}
}
}
......@@ -40,7 +40,7 @@ export default class MDViewEngine extends ViewEngine {
* @protected
* @memberof MDViewEngine
*/
protected openData?: (args: any[], params?: any, $event?: any, xData?: any) => void;
protected openData?: (args: any[], fullargs?: any[], params?: any, $event?: any, xData?: any) => void;
/**
* 新建数据
......@@ -48,7 +48,7 @@ export default class MDViewEngine extends ViewEngine {
* @protected
* @memberof GridViewEngine
*/
protected newData?: (args: any[], params?: any, $event?: any, xData?: any) => void;
protected newData?: (args: any[], fullargs?: any[], params?: any, $event?: any, xData?: any) => void;
/**
* Creates an instance of GridViewEngine.
......@@ -85,7 +85,7 @@ export default class MDViewEngine extends ViewEngine {
this.setViewState2({ tag: tag, action: 'loaddraft', viewdata: this.view.viewparams });
} else if (this.getMDCtrl() && this.isLoadDefault) {
const tag = this.getMDCtrl().name;
this.setViewState2({ tag: tag, action: 'load', viewdata: this.view.viewparams });
this.setViewState2({ tag: tag, action: 'load', viewdata: Object.assign(this.view.viewparams,opts) });
} else {
this.isLoadDefault = true;
}
......@@ -269,7 +269,7 @@ export default class MDViewEngine extends ViewEngine {
}
if (this.openData && this.isFunc(this.openData)) {
this.openData([loadParam], null, null, this.getMDCtrl());
this.openData([loadParam],[data], null, null, this.getMDCtrl());
}
}
......@@ -319,7 +319,7 @@ export default class MDViewEngine extends ViewEngine {
public openDataView(view: any = {}): boolean {
if (this.newData && this.isFunc(this.newData)) {
this.newData([], null, null, this.getMDCtrl());
this.newData([],[],null, null, this.getMDCtrl());
}
return true;
......
......@@ -51,7 +51,7 @@ export default class MPickupViewEngine extends ViewEngine {
super.load();
if (this.getPickupViewPanel()) {
const tag = this.getPickupViewPanel().name;
this.setViewState2({ tag: tag, action: 'load', viewdata: this.view.context });
this.setViewState2({ tag: tag, action: 'load', viewdata: this.view.viewparams });
}
}
......@@ -95,6 +95,9 @@ export default class MPickupViewEngine extends ViewEngine {
});
const _disbaled: boolean = this.view.containerModel[`view_${ctrlName}`].selections.length > 0 ? true : false;
this.view.containerModel.view_rightbtn = _disbaled;
if(!this.view.isShowButton){
this.view.$emit('viewdataschange', [...args]);
}
}
/**
......
......@@ -48,7 +48,7 @@ export default class PickupViewEngine extends ViewEngine {
super.load();
if (this.getPickupViewPanel()) {
const tag = this.getPickupViewPanel().name;
this.setViewState2({ tag: tag, action: 'load', viewdata: this.view.context });
this.setViewState2({ tag: tag, action: 'load', viewdata: this.view.viewparams });
}
}
......@@ -82,7 +82,7 @@ export default class PickupViewEngine extends ViewEngine {
this.view.viewSelections = [...args]
const _disabled: boolean = this.view.viewSelections.length > 0 ? false : true;
this.view.containerModel.view_okbtn.disabled = _disabled;
if(!this.view.ifShowButtons){
if(!this.view.isShowButton){
this.view.$emit('viewdataschange', [...args]);
}
}
......
import ViewEngine from './view-engine';
/**
* 实体数据看板视图界面引擎
*
* @export
* @class PortalViewEngine
* @extends {ViewEngine}
*/
export default class PortalViewEngine extends ViewEngine {
/**
* 数据面板部件
*
* @type {*}
* @memberof PortalViewEngine
*/
public dashboard: any = null;
/**
* Creates an instance of PortalViewEngine.
*
* @memberof PortalViewEngine
*/
constructor() {
super();
}
/**
* 初始化引擎
*
* @param {*} options
* @memberof PortalViewEngine
*/
public init(options: any): void {
this.dashboard = options.dashboard;
super.init(options);
}
/**
* 引擎加载
*
* @memberof PortalViewEngine
*/
public load(): void {
super.load();
if (this.getDashboard() && this.isLoadDefault) {
const tag = this.getDashboard().name;
this.setViewState2({ tag: tag, action: 'load', viewdata: this.view.viewparams });
} else {
this.isLoadDefault = true;
}
}
/**
* 部件事件机制
*
* @param {string} ctrlName
* @param {string} eventName
* @param {*} args
* @memberof PortalViewEngine
*/
public onCtrlEvent(ctrlName: string, eventName: string, args: any): void {
super.onCtrlEvent(ctrlName, eventName, args);
if (Object.is(ctrlName, 'dashboard')) {
this.DashboardEvent(eventName, args);
}
}
/**
* 实体数据看板事件
*
* @param {string} eventName
* @param {*} args
* @memberof PortalViewEngine
*/
public DashboardEvent(eventName: string, args: any): void {
if (Object.is(eventName, 'load')) {
this.view.$emit('viewload', args);
}
}
/**
* 获取部件对象
*
* @returns {*}
* @memberof PortalViewEngine
*/
public getDashboard(): any {
return this.dashboard;
}
}
\ No newline at end of file
import PortalViewEngine from './portal-view-engine';
/**
* 实体数据看板视图(部件视图)界面引擎
*
* @export
* @class PortalViewEngine
* @extends {PortalViewEngine}
*/
export default class PortalView9Engine extends PortalViewEngine {
/**
* 引擎加载
*
* @memberof PortalView9Engine
*/
public load(opts: any = {},isnotify:boolean=false): void {
if(!this.view.isformDruipart){
super.load();
}else{
if(isnotify){
super.load();
}
}
}
}
\ No newline at end of file
......@@ -40,7 +40,7 @@ export class SearchViewEngine extends ViewEngine {
super.load(opts);
if (this.getSearchForm()) {
const tag = this.getSearchForm().name;
this.setViewState2({ tag: tag, action: 'loaddraft', viewdata: this.view.context });
this.setViewState2({ tag: tag, action: 'loaddraft', viewdata: this.view.viewparams });
}
}
......@@ -88,8 +88,8 @@ export class SearchViewEngine extends ViewEngine {
* @memberof SearchViewEngine
*/
public dataCtrlBeforeLoad(arg: any = {}): void {
if (this.view.context && Object.keys(this.view.context).length > 0) {
Object.assign(arg, this.view.context);
if (this.view.viewparams && Object.keys(this.view.viewparams).length > 0) {
Object.assign(arg, this.view.viewparams);
}
if (this.getSearchForm()) {
Object.assign(arg, this.getSearchForm().getData());
......
......@@ -46,7 +46,7 @@ export default class TreeViewEngine extends ViewEngine {
super.load();
if (this.getTreeView() && this.isLoadDefault) {
const tag = this.getTreeView().name;
this.setViewState2({ tag: tag, action: 'load', viewdata: this.view.context });
this.setViewState2({ tag: tag, action: 'load', viewdata: this.view.viewparams });
} else {
this.isLoadDefault = true;
}
......
......@@ -9,4 +9,19 @@ import TreeViewEngine from './tree-view-engine';
*/
export default class TreeView9Engine extends TreeViewEngine {
/**
* 引擎加载
*
* @memberof TreeView9Engine
*/
public load(opts: any = {},isnotify:boolean=false): void {
if(!this.view.isformDruipart){
super.load();
}else{
if(isnotify){
super.load();
}
}
}
}
\ No newline at end of file
import { UIServiceRegister } from '@/uiservice/ui-service-register';
import { UtilServiceRegister } from '@/utilservice/util-service-register';
import { EntityServiceRegister } from '@/service/entity-service-register';
import { CounterServiceRegister } from '@/counter/counter-service-register';
declare global {
interface Window {
uiServiceRegister: UIServiceRegister,
utilServiceRegister:UtilServiceRegister,
entityServiceRegister:EntityServiceRegister,
counterServiceRegister:CounterServiceRegister
}
}
\ No newline at end of file
// 用户自定义语言资源 英文
export default {
};
\ No newline at end of file
// 用户自定义语言资源 中文
export default {
};
\ No newline at end of file
import { MockAdapter } from '../mock-adapter';
const mock = MockAdapter.getInstance();
import Mock from 'mockjs'
const Random = Mock.Random;
import Mock from 'mockjs';
// 获取应用数据
mock.onGet('v7/appdata').reply((config: any) => {
mock.onGet('/appdata').reply((config: any) => {
let status = MockAdapter.mockStatus(config);
return [status, {
remotetag: Random.string('upper', 128),
localdata: {
pk1: Random.guid(),
pk2: Random.guid(),
pk3: Random.guid(),
}
}];
return [status,{
context:{
// 用户标识
srfuserid:'5ffafc68-eccd-a5be-0bce-40215334cee3',
// 用户名称
srfusername:'xignzi006',
// 用户图像路径
srfusericonpath:null,
// 当前的用户模式
srfusermode:'default',
// 登录名称
srfloginname:'xignzi006',
// 本地化(Spring变量)
srflocale:'zh',
// 当前用户时区标识
srftimezone:'Asia/Shanghai',
// 当前用户组织标识
srforgid:"a1494aa93f1d1226f7aae63db6f15aa5",
//当前用户组织名称
srforgname:"上海公司",
// 当前用户组织部门标识
srforgsectorid:"5bd1ecf4d3c31e31cb66373df56b852f",
// 当前用户组织部门名称
srforgsectorname:"项目一部",
// 当前用户条线代码
srfsectorbc:""
},
//当前用户所有组织部门标识
srforgsections:[{"srforgsectorid":"5bd1ecf4d3c31e31cb66373df56b852f","srforgsectorname":"项目一部"},{"srforgsectorid":"2ad1ecf4d3c31e31cb66373df56b852f","srforgsectorname":"项目二部"}]
}];
});
......@@ -27,7 +27,7 @@ export class MockAdapter {
*/
public static getInstance(): mockAdapter1 {
if (!MockAdapter.mockAdapter) {
MockAdapter.mockAdapter = new mockAdapter1(axios);
MockAdapter.mockAdapter = new mockAdapter1(axios,{delayResponse:500});
}
return this.mockAdapter;
}
......@@ -43,7 +43,7 @@ export class MockAdapter {
public static mockStatus(config: any): number {
let status = 200;
const { headers: _headers } = config;
status = _headers.Authorization && !Object.is(_headers.Authorization, '') ? 200 : 401;
// status = _headers.Authorization && !Object.is(_headers.Authorization, '') ? 200 : 401;
return status;
}
......
......@@ -6,7 +6,7 @@ Mock.mock(RegExp(new RegExp(/^\.\.\/ibizutil\/upload.*$/)),"post",(ops:any) => {
console.log(ops) // 先看一下这个ops是什么
console.log(ops.body)
return {
"name": "xxx.png",
"id": Random.string(128)
"filename": "xxx.png",
"fileid": Random.string("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",32)
};
});
\ No newline at end of file
import { ChartSeries } from './chart-series';
/**
* 柱状图序列模型
*
* @export
* @class ChartBarSeries
*/
export class ChartBarSeries extends ChartSeries{
/**
* 分类属性
*
* @type {string}
* @memberof ChartBarSeries
*/
public categorField: string = '';
/**
* 值属性
*
* @type {string}
* @memberof ChartBarSeries
*/
public valueField: string = '';
/**
* 分类代码表
*
* @type {string}
* @memberof ChartBarSeries
*/
public categorCodeList: any = null;
/**
* 维度定义
*
* @type {string}
* @memberof ChartBarSeries
*/
public dimensions:Array<string> = [];
/**
* 维度编码
*
* @type {*}
* @memberof ChartBarSeries
*/
public encode:any = null;
/**
* 序列模板
*
* @type {*}
* @memberof ChartBarSeries
*/
public seriesTemp:any = null;
/**
* Creates an instance of ChartBarSeries.
* ChartBarSeries 实例
*
* @param {*} [opts={}]
* @memberof ChartBarSeries
*/
constructor(opts: any = {}) {
super(opts);
this.categorField = !Object.is(opts.categorField, '') ? opts.categorField : '';
this.categorCodeList = opts.categorCodeList ? opts.categorCodeList : null;
this.valueField = !Object.is(opts.valueField, '') ? opts.valueField : '';
this.dimensions = opts.dimensions ? opts.dimensions :'';
this.encode = opts.encode ? opts.encode : null;
this.seriesTemp = opts.seriesTemp ? opts.seriesTemp:null;
}
/**
* 设置分类属性
*
* @param {string} state
* @memberof ChartBarSeries
*/
public setCategorField(state: string): void {
this.categorField = state;
}
/**
* 设置序列名称
*
* @param {string} state
* @memberof ChartBarSeries
*/
public setValueField(state: string): void {
this.valueField = state;
}
/**
* 分类代码表
*
* @param {*} state
* @memberof ChartBarSeries
*/
public setCategorCodeList(state: any): void {
this.categorCodeList = state;
}
/**
* 维度定义
*
* @param {*} state
* @memberof ChartBarSeries
*/
public setDimensions(state: any): void {
this.dimensions = state;
}
/**
* 设置编码
*
* @param {*} state
* @memberof ChartBarSeries
*/
public setEncode(state: any): void {
this.encode = state;
}
/**
* 设置序列模板
*
* @param {*} state
* @memberof ChartBarSeries
*/
public setSeriesTemp(state: any): void {
this.seriesTemp = state;
}
}
\ No newline at end of file
/**
* 图表数据集属性模型
*
* @export
* @class ChartDataSetField
*/
export class ChartDataSetField {
/**
* 图表属性名称
*
* @type {string}
* @memberof ChartDataSetField
*/
public name: string = '';
/**
* 图表属性代码表
*
* @type {*}
* @memberof ChartDataSetField
*/
public codelist: any = null;
/**
* 是否分组属性
*
* @type {boolean}
* @memberof ChartDataSetField
*/
public isGroupField: boolean = false;
/**
* 分组模式
*
* @type {string}
* @memberof ChartDataSetField
*/
public groupMode:string ="";
/**
* Creates an instance of ChartDataSetField.
* ChartDataSetField 实例
*
* @param {*} [opts={}]
* @memberof ChartDataSetField
*/
constructor(opts: any = {}) {
this.name = !Object.is(opts.name, '') ? opts.name : '';
this.codelist = opts.codelist?opts.codelist:null;
this.isGroupField = opts.isGroupField?opts.isGroupField:false;
this.groupMode = !Object.is(opts.groupMode, '') ? opts.groupMode : '';
}
/**
* 设置图表属性名称
*
* @param {string} state
* @memberof ChartDataSetField
*/
public setName(state: string): void {
this.name = state;
}
/**
* 设置图表属性代码表
*
* @param {*} state
* @memberof ChartDataSetField
*/
public setCodeList(state: any): void {
this.codelist = state;
}
/**
* 设置分组属性
*
* @param {boolean} state
* @memberof ChartDataSetField
*/
public setisGroupField(state: boolean): void {
this.isGroupField = state;
}
/**
* 设置属性分组模式
*
* @param {string} state
* @memberof ChartDataSetField
*/
public setGroupMode(state: string): void {
this.groupMode = state;
}
}
\ No newline at end of file
import { ChartSeries } from './chart-series';
/**
* 漏斗图序列模型
*
* @export
* @class ChartFunnelSeries
*/
export class ChartFunnelSeries extends ChartSeries{
/**
* 分类属性
*
* @type {string}
* @memberof ChartFunnelSeries
*/
public categorField: string = '';
/**
* 值属性
*
* @type {string}
* @memberof ChartFunnelSeries
*/
public valueField: string = '';
/**
* 分类代码表
*
* @type {string}
* @memberof ChartFunnelSeries
*/
public categorCodeList: any = null;
/**
* 维度定义
*
* @type {string}
* @memberof ChartFunnelSeries
*/
public dimensions:Array<string> = [];
/**
* 维度编码
*
* @type {*}
* @memberof ChartFunnelSeries
*/
public encode:any = null;
/**
* Creates an instance of ChartFunnelSeries.
* ChartFunnelSeries 实例
*
* @param {*} [opts={}]
* @memberof ChartFunnelSeries
*/
constructor(opts: any = {}) {
super(opts);
this.categorField = !Object.is(opts.categorField, '') ? opts.categorField : '';
this.categorCodeList = opts.categorCodeList ? opts.categorCodeList : null;
this.valueField = !Object.is(opts.valueField, '') ? opts.valueField : '';
this.dimensions = opts.dimensions ? opts.dimensions :'';
this.encode = opts.encode ? opts.encode : null;
}
/**
* 设置分类属性
*
* @param {string} state
* @memberof ChartFunnelSeries
*/
public setCategorField(state: string): void {
this.categorField = state;
}
/**
* 设置序列名称
*
* @param {string} state
* @memberof ChartFunnelSeries
*/
public setValueField(state: string): void {
this.valueField = state;
}
/**
* 分类代码表
*
* @param {*} state
* @memberof ChartFunnelSeries
*/
public setCategorCodeList(state: any): void {
this.categorCodeList = state;
}
/**
* 维度定义
*
* @param {*} state
* @memberof ChartFunnelSeries
*/
public setDimensions(state: any): void {
this.dimensions = state;
}
/**
* 设置编码
*
* @param {*} state
* @memberof ChartFunnelSeries
*/
public setEncode(state: any): void {
this.encode = state;
}
}
\ No newline at end of file
import { ChartSeries } from './chart-series';
/**
* 折线图序列模型
*
* @export
* @class ChartLineSeries
*/
export class ChartLineSeries extends ChartSeries{
/**
* 分类属性
*
* @type {string}
* @memberof ChartLineSeries
*/
public categorField: string = '';
/**
* 值属性
*
* @type {string}
* @memberof ChartLineSeries
*/
public valueField: string = '';
/**
* 分类代码表
*
* @type {string}
* @memberof ChartLineSeries
*/
public categorCodeList: any = null;
/**
* 维度定义
*
* @type {string}
* @memberof ChartLineSeries
*/
public dimensions:Array<string> = [];
/**
* 维度编码
*
* @type {*}
* @memberof ChartLineSeries
*/
public encode:any = null;
/**
* 序列模板
*
* @type {*}
* @memberof ChartLineSeries
*/
public seriesTemp:any = null;
/**
* Creates an instance of ChartLineSeries.
* ChartLineSeries 实例
*
* @param {*} [opts={}]
* @memberof ChartLineSeries
*/
constructor(opts: any = {}) {
super(opts);
this.categorField = !Object.is(opts.categorField, '') ? opts.categorField : '';
this.categorCodeList = opts.categorCodeList ? opts.categorCodeList : null;
this.valueField = !Object.is(opts.valueField, '') ? opts.valueField : '';
this.dimensions = opts.dimensions ? opts.dimensions :'';
this.encode = opts.encode ? opts.encode : null;
this.seriesTemp = opts.seriesTemp ? opts.seriesTemp:null;
}
/**
* 设置分类属性
*
* @param {string} state
* @memberof ChartLineSeries
*/
public setCategorField(state: string): void {
this.categorField = state;
}
/**
* 设置序列名称
*
* @param {string} state
* @memberof ChartLineSeries
*/
public setValueField(state: string): void {
this.valueField = state;
}
/**
* 分类代码表
*
* @param {*} state
* @memberof ChartLineSeries
*/
public setCategorCodeList(state: any): void {
this.categorCodeList = state;
}
/**
* 维度定义
*
* @param {*} state
* @memberof ChartLineSeries
*/
public setDimensions(state: any): void {
this.dimensions = state;
}
/**
* 设置编码
*
* @param {*} state
* @memberof ChartLineSeries
*/
public setEncode(state: any): void {
this.encode = state;
}
/**
* 设置序列模板
*
* @param {*} state
* @memberof ChartLineSeries
*/
public setSeriesTemp(state: any): void {
this.seriesTemp = state;
}
}
\ No newline at end of file
import { ChartSeries } from './chart-series';
/**
* 饼图序列模型
*
* @export
* @class ChartPieSeries
*/
export class ChartPieSeries extends ChartSeries{
/**
* 分类属性
*
* @type {string}
* @memberof ChartPieSeries
*/
public categorField: string = '';
/**
* 值属性
*
* @type {string}
* @memberof ChartPieSeries
*/
public valueField: string = '';
/**
* 分类代码表
*
* @type {string}
* @memberof ChartPieSeries
*/
public categorCodeList: any = null;
/**
* 维度定义
*
* @type {string}
* @memberof ChartPieSeries
*/
public dimensions:Array<string> = [];
/**
* 维度编码
*
* @type {*}
* @memberof ChartPieSeries
*/
public encode:any = null;
/**
* Creates an instance of ChartPieSeries.
* ChartPieSeries 实例
*
* @param {*} [opts={}]
* @memberof ChartPieSeries
*/
constructor(opts: any = {}) {
super(opts);
this.categorField = !Object.is(opts.categorField, '') ? opts.categorField : '';
this.categorCodeList = opts.categorCodeList ? opts.categorCodeList : null;
this.valueField = !Object.is(opts.valueField, '') ? opts.valueField : '';
this.dimensions = opts.dimensions ? opts.dimensions :'';
this.encode = opts.encode ? opts.encode : null;
}
/**
* 设置分类属性
*
* @param {string} state
* @memberof ChartPieSeries
*/
public setCategorField(state: string): void {
this.categorField = state;
}
/**
* 设置序列名称
*
* @param {string} state
* @memberof ChartPieSeries
*/
public setValueField(state: string): void {
this.valueField = state;
}
/**
* 分类代码表
*
* @param {*} state
* @memberof ChartPieSeries
*/
public setCategorCodeList(state: any): void {
this.categorCodeList = state;
}
/**
* 维度定义
*
* @param {*} state
* @memberof ChartPieSeries
*/
public setDimensions(state: any): void {
this.dimensions = state;
}
/**
* 设置编码
*
* @param {*} state
* @memberof ChartPieSeries
*/
public setEncode(state: any): void {
this.encode = state;
}
}
\ No newline at end of file
import { ChartDataSetField } from './chart-dataset-field';
/**
* 图表序列模型
*
* @export
* @class ChartSeries
*/
export class ChartSeries {
/**
* 序列类型
*
* @type {string}
* @memberof ChartSeries
*/
public type: string = '';
/**
* 图表对象
*
* @type {*}
* @memberof ChartSeries
*/
public chart: any = null;
/**
* 序列名称
*
* @type {string}
* @memberof ChartSeries
*/
public name: string = '';
/**
* 序列标题
*
* @type {string}
* @memberof ChartSeries
*/
public caption: string = '';
/**
* 序列标识属性
*
* @type {string}
* @memberof ChartSeries
*/
public seriesIdField: string = '';
/**
* 序列名称属性
*
* @type {string}
* @memberof ChartSeries
*/
public seriesNameField: string = '';
/**
* 序列标识名称键值对
*
* @type {any}
* @memberof ChartSeries
*/
public seriesMap:any = null;
/**
* 对象索引
*
* @type {number}
* @memberof ChartSeries
*/
public index: number = 0;
/**
* 序列映射数据
*
* @type {*}
* @memberof ChartSeries
*/
public dataSet: any = [];
/**
* 预置配置
*
* @type {number}
* @memberof ChartSeries
*/
public ecxObject:any;
/**
* 用户自定义配置
*
* @type {number}
* @memberof ChartSeries
*/
public ecObject:any;
/**
* 序列索引
*
* @type {number}
* @memberof ChartSeries
*/
public seriesIndex:number = 0;
/**
* 数据集属性集合
*
* @type {Array<ChartDataSetField>}
* @memberof ChartSeries
*/
public dataSetFields:Array<ChartDataSetField> = [];
/**
* 取值方式
* 'column':默认,dataset 的列对应于系列,从而 dataset 中每一列是一个维度(dimension)
* 'row':dataset 的行对应于系列,从而 dataset 中每一行是一个维度(dimension
*
* @type {string}
* @memberof ChartSeries
*/
public seriesLayoutBy:string = "column";
/**
* Creates an instance of ChartSeries.
* ChartSeries 实例
*
* @param {*} [opts={}]
* @memberof ChartSeries
*/
constructor(opts: any = {}) {
this.type = !Object.is(opts.type, '') ? opts.type : '';
this.name = !Object.is(opts.name, '') ? opts.name : '';
this.caption = !Object.is(opts.caption, '') ? opts.caption : '';
this.seriesIdField = !Object.is(opts.seriesIdField, '') ? opts.seriesIdField : '';
this.seriesNameField = !Object.is(opts.seriesNameField, '') ? opts.seriesNameField : '';
this.index = this.index ? this.index : 0;
this.chart = opts.chart ? opts.chart : null;
this.dataSet = opts.dataSet ? opts.dataSet : [];
this.ecxObject = opts.ecxObject ? opts.ecxObject : null;
this.ecObject = opts.ecObject ? opts.ecObject : null;
this.seriesLayoutBy = opts.seriesLayoutBy ? opts.seriesLayoutBy:"column";
this.dataSetFields = opts.dataSetFields ? opts.dataSetFields:[];
this.seriesMap = opts.seriesMap ? opts.seriesMap:null;
this.seriesIndex = opts.seriesIndex? opts.seriesIndex:0;
}
/**
* 设置序列类型
*
* @param {string} state
* @memberof ChartSeries
*/
public setType(state: string): void {
this.type = state;
}
/**
* 设置序列名称
*
* @param {string} state
* @memberof ChartSeries
*/
public setCaption(state: string): void {
this.caption = state;
}
/**
* 设置序列标题
*
* @param {string} state
* @memberof ChartSeries
*/
public setName(state: string): void {
this.name = state;
}
/**
* 设置数据集
*
* @param {*} state
* @memberof ChartSeries
*/
public setDataSet(state: any): void {
this.dataSet = state;
}
/**
* 设置序列标识名称键值对
*
* @param {*} state
* @memberof ChartSeries
*/
public setSeriesMap(state: any): void {
this.seriesMap = state;
}
/**
* 设置序列映射的图表
*
* @param {*} state
* @memberof ChartSeries
*/
public setChart(state: any): void {
this.chart = state;
}
/**
* 设置序列标识属性
*
* @param {*} state
* @memberof ChartSeries
*/
public setSeriesIdField(state: any): void {
this.seriesIdField = state;
}
/**
* 设置序列名称属性
*
* @param {*} state
* @memberof ChartSeries
*/
public setSeriesNameField(state: any): void {
this.seriesNameField = state;
}
/**
* 设置对象索引
*
* @param {number} state
* @memberof ChartSeries
*/
public setIndex(state: number): void {
this.index = state;
}
/**
* 设置预置配置
*
* @param {*} state
* @memberof ChartSeries
*/
public setECXObject(state: any): void {
this.ecxObject = state;
}
/**
* 设置用户自定义参数
*
* @param {*} state
* @memberof ChartSeries
*/
public setECObject(state: any): void {
this.ecObject = state;
}
/**
* 设置取值方式
*
* @param {string} state
* @memberof ChartSeries
*/
public setSeriesLayoutBy(state: string): void {
this.seriesLayoutBy = state;
}
/**
* 设置数据集属性集合
*
* @param {Array<ChartDataSetField>} state
* @memberof ChartSeries
*/
public setDataSetFields(state: Array<ChartDataSetField>): void {
this.dataSetFields = state;
}
/**
* 设置序列索引
*
* @param {number} state
* @memberof ChartSeries
*/
public setSeriesIndex(state: number): void {
this.seriesIndex = state;
}
}
\ No newline at end of file
export { ChartDataSetField } from './chart-dataset-field';
export { ChartLineSeries } from './chart-line-series';
export { ChartFunnelSeries } from './chart-funnel-series';
export { ChartPieSeries } from './chart-pie-series';
export { ChartBarSeries } from './chart-bar-series';
\ No newline at end of file
......@@ -18,6 +18,18 @@ export default class EntityService {
*/
private $store: Store<any> | null = null;
/**
* 获取实体数据服务
*
* @protected
* @param {string} name 实体名称
* @returns {Promise<any>}
* @memberof EntityService
*/
public getService(name: string): Promise<any> {
return (window as any)['entityServiceRegister'].getService(name);
}
/**
* 零时储存,localStorage指向
*
......@@ -28,7 +40,7 @@ export default class EntityService {
protected tempStorage:any;
/**
* 当前标识
* 当前DE标识
*
* @protected
* @type {(string)}
......@@ -36,6 +48,15 @@ export default class EntityService {
*/
protected APPDEKEY:string= '';
/**
* 当前APPDE标识
*
* @protected
* @type {(string)}
* @memberof EntityService
*/
protected APPLYDEKEY:string= '';
/**
* 当前NAME
*
......@@ -542,8 +563,6 @@ export default class EntityService {
*/
public async WFStart(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
const requestData:any = {};
Object.assign(requestData,{bsdata:data.viewparams});
delete data.viewparams;
Object.assign(requestData,{wfdata:data});
return Http.getInstance().post(`/${this.APPDENAME}/${data[this.APPDEKEY]}/wfstart`,requestData,isloading);
}
......@@ -639,9 +658,68 @@ export default class EntityService {
*/
public async WFSubmit(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
const requestData:any = {};
if(data.srfwfmemo){
requestData.srfwfmemo = JSON.parse(JSON.stringify(data)).srfwfmemo;
delete data.srfwfmemo;
}
if(data.viewparams){
delete data.viewparams;
}
Object.assign(requestData,{wfdata:data});
Object.assign(requestData,{worklistid:null});
Object.assign(requestData,{opdata:{srfwfiatag:context.srfwfiatag,srfwfstep:context.srfwfstep}});
return Http.getInstance().post(`/${this.APPDENAME}/${data[this.APPDEKEY]}/wfsubmit`,requestData,isloading);
}
/**
* WFGetProxyData接口方法
*
* @param {*} [context={}]
* @param {*} [data={}]
* @param {boolean} [isloading]
* @returns {Promise<any>}
* @memberof EntityService
*/
public async WFGetProxyData(context: any = {},data: any = {}, isloading?: boolean): Promise<any>{
return Http.getInstance().get(`/${this.APPDENAME}/${context[this.APPLYDEKEY]}/wfgetproxydata`,data,isloading);
}
/**
* 测试数据是否在工作流中
*
* @param context
* @param data
* @param isloading
*/
public async testDataInWF(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
if(!context.stateField || !context.stateValue) return false;
if(context.stateValue == data[context.stateField]){
return true;
}
return false;
}
/**
* 测试当前用户是否提交过工作流
*
* @param context
* @param data
* @param isloading
*/
public async testUserWFSubmit(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
return true;
}
/**
* 测试当前用户是否存在待办列表
*
* @param context
* @param data
* @param isloading
*/
public async testUserExistWorklist(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
const requestData:any = {};
Object.assign(requestData,{wfdata:data});
return Http.getInstance().post(`/${this.APPDENAME}/${data[this.APPDEKEY]}/testuserexistworklist`,requestData,isloading);
}
}
\ No newline at end of file
......@@ -2,3 +2,10 @@ declare module '*.vue' {
import Vue from 'vue';
export default Vue;
}
declare module '@fullcalendar/vue';
declare module '@fullcalendar/timegrid';
declare module '@fullcalendar/list';
declare module '@fullcalendar/interaction';
declare module 'vue-grid-layout';
declare module 'vue-print-nb';
\ No newline at end of file
......@@ -24,21 +24,21 @@ export const getCodeListItems = (state: any) => (srfkey: string) => {
}
/**
* 获取应用数据
* 获取本地应用数据
*
* @param state
*/
export const getAppData = (state: any) => () => {
return state.appdata;
export const getLocalData = (state: any) => () => {
return state.localdata;
}
/**
* 获取本地应用数据
* 获取应用数据
*
* @param state
*/
export const getLocalData = (state: any) => () => {
return state.localdata;
export const getAppData = (state: any) => () => {
return state.appdata;
}
/**
......@@ -66,4 +66,13 @@ export const getPage = (state: any) => (arg: any) => {
*/
export const getZIndex = (state: any) => () => {
return state.zIndex;
}
/**
* 获取视图split
*
* @param state
*/
export const getViewSplit = (state: any) => (viewUID: string) => {
return state.viewSplit[viewUID];
}
\ No newline at end of file
import { Environment } from './../environments/environment';
import { Environment } from '@/environments/environment';
/**
* 添加代码表
......@@ -11,6 +11,17 @@ export const addCodeLists = (state: any, codelists: any) => {
state.codelists = [...codelists];
}
/**
* 添加本地应用数据
*
* @param state
* @param localdata
*/
export const addLocalData = (state: any, localdata: any = {}) => {
state.localdata = {};
Object.assign(state.localdata, localdata);
}
/**
* 添加应用数据
*
......@@ -22,14 +33,13 @@ export const addAppData = (state: any, appdata: string) => {
}
/**
* 添加本地应用数据
* 修改应用数据
*
* @param state
* @param localdata
*/
export const addLocalData = (state: any, localdata: any = {}) => {
state.localdata = {};
Object.assign(state.localdata, localdata);
export const updateAppData = (state: any, appdata: string) => {
state.appdata = appdata;
}
/**
......@@ -233,4 +243,14 @@ export const removeOtherPage = (state: any) => {
*/
export const updateZIndex = (state: any, zIndex: number) => {
state.zIndex = zIndex;
}
/**
* 设置视图split
*
* @param state
* @param {viewSplit: number, viewUID: string}
*/
export const setViewSplit = (state: any, args: {viewSplit: number,viewUID:string}) => {
state.viewSplit[args.viewUID] = args.viewSplit;
}
\ No newline at end of file
......@@ -12,4 +12,5 @@ export const rootstate: any = {
appdata: '',
localdata: {},
zIndex: 300,
viewSplit: {},
}
\ No newline at end of file
......@@ -4,6 +4,65 @@
@import '../theme/default.theme.less';
@import './var.css';
.ibiz-page-tag .tags-body .tags-container .ivu-tag.tag-is-active .ivu-tag-text {
color: #1890ff;
}
.ibiz-page-tag .tags-body .tags-container .ivu-tag .ivu-icon-ios-close {
display: none;
}
.ibiz-page-tag .tags-body .tags-container .ivu-tag.tag-is-active .ivu-icon-ios-close,
.ibiz-page-tag .tags-body .tags-container .ivu-tag:hover .ivu-icon-ios-close {
display: inline-block;
}
.ivu-card-head p {
font-size: 14px;
color: #333;
font-weight: 400;
}
.app-app-menu .app-menus .ivu-card .ivu-card-body{
line-height: 22px;
margin-left: 10px;
font-weight: 400;
}
.app-app-menu .app-menus .ivu-card:hover{
box-shadow: none;
}
.ivu-card-body .grid>.el-table .el-table__header-wrapper thead>tr th {
background: rgb(245,245,245);
border-right: 1px solid rgb(250,250,250);
text-align: center;
}
.el-table td, .el-table th.is-leaf {
border-bottom: 1px solid #ebeef5;
}
.el-table th {
padding: 5px 0;
}
.grid .el-table__body-wrapper .el-table__row td{
border-left: 1px solid rgb(245,245,245);
border-top: 1px solid rgb(245,245,245);
text-align: center;
}
.el-table--enable-row-hover .el-table__body tr:hover>td {
background-color: #badfffba !important;
}
.grid .el-table__body-wrapper .grid-selected-row{
background-color: #badfffba !important;
}
.el-table th .sort-caret.ascending{
border-bottom-color: #f0f2f5;
}
.el-table th.ascending .sort-caret.ascending {
border-bottom-color: #909399;
}
.el-table th .sort-caret.descending{
border-top-color: #f0f2f5;
}
.el-table th.descending .sort-caret.descending {
border-top-color: #909399;
}
.view-container {
height: calc(100% - 38px);
......@@ -15,11 +74,26 @@
height: 100%;
// display: flex;
// flex-direction: column;
> .ivu-card-head{
height: 50px;
border-color: rgb(221, 221, 221);
border-style: solid;
border-width: 0px 0px 1px;
margin: 0px 0px 11px;
padding: 6px 0px;
> p{
height: 50px;
> .caption-info{
line-height: 50px;
font-size: 18px;
color: #1890ff;
}
}
}
> .ivu-card-body {
// height: 50%;
// flex-grow: 1;
height: calc(100% - 51px);
overflow: auto;
height: calc(100% - 62px);
padding: 0px;
> .content-container {
height: 100%;
......@@ -28,11 +102,8 @@
flex-direction: column;
}
}
>.ivu-card-head{
border:0;
}
}
> .view-card.view-no-caption {
> .view-card.view-no-caption.view-no-toolbar {
> .ivu-card-body {
height: 100%;
}
......
......@@ -12,6 +12,8 @@
<strong>We're sorry but app doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- <link rel="stylesheet" href="<%= BASE_URL %>assets/styles/loader.css">
<div class="loader" id="app-loader"></div> -->
<!-- built files will be auto injected -->
</body>
</html>
/*** BRGIN:默认蓝色主题 ***/
.app_theme_blue {
> header {
background-color: #2d5f8b;
color: #6ba1d1;
.app-theme-icon {
color: #6ba1d1;
}
.page-logo {
color: #ffffff;
}
.header-right {
.app-header-user {
background: #28547c;
}
> div:hover {
background: #3774aa;
}
}
.el-menu.el-menu--horizontal {
> .el-menu-item, > .el-submenu > .el-submenu__title {
background: #2d5f8b;
color: #6ba1d1;
i {
color: #6ba1d1;
}
}
> .el-menu-item.is-active, > .el-submenu.is-active > .el-submenu__title {
background-color: #4276a4;
color: #f1f1f1;
i {
color: #f1f1f1;
}
}
> .el-menu-item:hover, > .el-submenu:hover > .el-submenu__title {
background-color: #3c6c95;
color: #f1f1f1 !important;
i {
color: #f1f1f1;
}
}
}
}
> .ivu-layout {
> .ivu-layout-sider {
background-color: #4276a4;
.sider-top {
.ivu-icon {
background: #2d5f8b;
color: #6ba1d1;
}
}
.app-menu {
> .el-menu-item.is-active, > .el-submenu.is-active > .el-submenu__title {
border-left: 4px solid #d64635;
}
}
}
}
> .el-menu , > .ivu-layout > .ivu-layout-sider .app-app-menu > .app-menu {
background: #4276a4;
.el-menu-item:hover, .el-menu-item.is-active {
background: #3c6c95 !important;
color: #f1f1f1 !important;
i {
color: #f1f1f1;
}
}
.el-submenu.is-opened, .el-submenu:hover, .el-submenu.is-active {
> .el-submenu__title {
background: #3c6c95 !important;
color: #f1f1f1 !important;
i {
color: #f1f1f1;
}
}
}
.el-submenu__title, .el-menu-item {
color: #c9dff5;
i {
color: #c9dff5;
}
}
.el-menu-item {
border-top: 1px solid #4276a4;
background: #4276a4;
}
.el-submenu {
border-top: 1px solid #4276a4;
background: #4276a4;
> .el-menu {
border-top: 1px solid #4276a4;
background: #4276a4;
}
}
}
.ivu-menu-light{
background: #4276a4;
}
.ivu-menu-submenu-title{
color: #f5f5f5;
}
> header {
background-color: #2d5f8b;
color: #6ba1d1;
.app-theme-icon {
color: #6ba1d1;
}
.page-logo {
color: #fff;
}
.header-right {
> div:hover {
background: #3774aa;
}
}
.el-menu.el-menu--horizontal {
> .el-menu-item, > .el-submenu > .el-submenu__title {
background: #2d5f8b;
color: #6ba1d1;
i {
color: #6ba1d1;
}
}
> .el-menu-item.is-active, > .el-submenu.is-active > .el-submenu__title {
background-color: #4276a4;
color: #f1f1f1;
i {
color: #f1f1f1;
}
}
> .el-menu-item:hover, > .el-submenu:hover > .el-submenu__title {
background-color: #3c6c95;
color: #f1f1f1 !important;
i {
color: #f1f1f1;
}
}
}
}
> .ivu-layout {
> .ivu-layout-sider {
background-color: #4276a4;
.sider-top {
.ivu-icon {
background: #2d5f8b;
color: #6ba1d1;
}
}
.app-menu {
> .el-menu-item.is-active, > .el-submenu.is-active > .el-submenu__title {
border-left: 4px solid #d64635;
}
}
}
}
> .el-menu , > .ivu-layout > .ivu-layout-sider .app-app-menu > .app-menu {
background: #4276a4;
.el-menu-item:hover, .el-menu-item.is-active {
background: #3c6c95 !important;
color: #f1f1f1 !important;
i {
color: #f1f1f1;
}
}
.el-submenu.is-opened, .el-submenu:hover, .el-submenu.is-active {
> .el-submenu__title {
background: #3c6c95 !important;
color: #f1f1f1 !important;
i {
color: #f1f1f1;
}
}
}
.el-submenu__title, .el-menu-item {
color: #c9dff5;
i {
color: #c9dff5;
}
}
.el-menu-item {
border-top: 1px solid #4276a4;
background: #4276a4;
}
.el-submenu {
border-top: 1px solid #4276a4;
background: #4276a4;
> .el-menu {
border-top: 1px solid #4276a4;
background: #4276a4;
}
}
}
.ivu-menu-light{
background: #4276a4;
}
.ivu-menu-submenu-title{
color: #f5f5f5;
}
}
/*** END:默认蓝色主题 ***/
\ No newline at end of file
/*** BRGIN:默认Dark Blue主题 ***/
.app_theme_darkblue {
> header {
background-color: #2b3643;
color: #606d80;
.app-theme-icon {
color: #606d80;
}
.page-logo {
color: #ffffff;
}
.header-right {
.app-header-user {
background: #232c37;
}
> div:hover {
background: #3b4a5c;
}
}
.el-menu.el-menu--horizontal {
> .el-menu-item, > .el-submenu > .el-submenu__title {
background: #2b3643;
color: #606d80;
i {
color: #606d80;
}
}
> .el-menu-item.is-active, > .el-submenu.is-active > .el-submenu__title {
background-color: #364150;
color: #f1f1f1;
i {
color: #f1f1f1;
}
}
> .el-menu-item:hover, > .el-submenu:hover > .el-submenu__title {
background-color: #3e4b5c;
color: #f1f1f1 !important;
i {
color: #f1f1f1;
}
}
}
}
> .ivu-layout {
> .ivu-layout-sider {
background-color: #364150;
.sider-top {
.ivu-icon {
background: #2b3643;
color: #606d80;
}
}
.app-menu {
> .el-menu-item.is-active, > .el-submenu.is-active > .el-submenu__title {
border-left: 4px solid #1caf9a;
}
}
}
}
> .el-menu , > .ivu-layout > .ivu-layout-sider .app-app-menu > .app-menu {
background: #364150;
.el-menu-item:hover, .el-menu-item.is-active {
background: #3e4b5c !important;
color: #f1f1f1 !important;
i {
color: #f1f1f1;
}
}
.el-submenu.is-opened, .el-submenu:hover, .el-submenu.is-active {
> .el-submenu__title {
background: #3e4b5c !important;
color: #f1f1f1 !important;
i {
color: #f1f1f1;
}
}
}
.el-submenu__title, .el-menu-item {
color: #b4bcc8;
i {
color: #b4bcc8;
}
}
.el-menu-item {
border-top: 1px solid #364150;
background: #364150;
}
.el-submenu {
border-top: 1px solid #364150;
background: #364150;
> .el-menu {
border-top: 1px solid #364150;
background: #364150;
}
}
}
.ivu-menu-light{
background: #364150;
}
.ivu-menu-submenu-title{
color: #fff;
}
> header {
background-color: #2b3643;
color: #606d80;
.app-theme-icon {
color: #606d80;
}
.page-logo {
color: #fff;
}
.header-right {
> div:hover {
background: #3b4a5c;
}
}
.el-menu.el-menu--horizontal {
> .el-menu-item, > .el-submenu > .el-submenu__title {
background: #2b3643;
color: #606d80;
i {
color: #606d80;
}
}
> .el-menu-item.is-active, > .el-submenu.is-active > .el-submenu__title {
background-color: #364150;
color: #f1f1f1;
i {
color: #f1f1f1;
}
}
> .el-menu-item:hover, > .el-submenu:hover > .el-submenu__title {
background-color: #3e4b5c;
color: #f1f1f1 !important;
i {
color: #f1f1f1;
}
}
}
}
> .ivu-layout {
> .ivu-layout-sider {
background-color: #364150;
.sider-top {
.ivu-icon {
background: #2b3643;
color: #606d80;
}
}
.app-menu {
> .el-menu-item.is-active, > .el-submenu.is-active > .el-submenu__title {
border-left: 4px solid #1caf9a;
}
}
}
}
> .el-menu , > .ivu-layout > .ivu-layout-sider .app-app-menu > .app-menu {
background: #364150;
.el-menu-item:hover, .el-menu-item.is-active {
background: #3e4b5c !important;
color: #f1f1f1 !important;
i {
color: #f1f1f1;
}
}
.el-submenu.is-opened, .el-submenu:hover, .el-submenu.is-active {
> .el-submenu__title {
background: #3e4b5c !important;
color: #f1f1f1 !important;
i {
color: #f1f1f1;
}
}
}
.el-submenu__title, .el-menu-item {
color: #b4bcc8;
i {
color: #b4bcc8;
}
}
.el-menu-item {
border-top: 1px solid #364150;
background: #364150;
}
.el-submenu {
border-top: 1px solid #364150;
background: #364150;
> .el-menu {
border-top: 1px solid #364150;
background: #364150;
}
}
}
.ivu-menu-light{
background: #364150;
}
.ivu-menu-submenu-title{
color: #fff;
}
}
/*** END:默认Dark Blue主题 ***/
\ No newline at end of file
/*** BRGIN:默认亮色主题 ***/
.app-default-theme {
> header {
background-color: #e1e1e1;
color: #aaaaaa;
.app-theme-icon {
color: #aaaaaa;
}
.page-logo {
color: #535c70;
}
.header-right {
.app-header-user {
background: #d9d9d9;
}
> div:hover {
background: #d4d4d4;
}
}
.el-menu.el-menu--horizontal {
> .el-menu-item, > .el-submenu > .el-submenu__title {
background: #e1e1e1;
color: #aaaaaa;
i {
color: #aaaaaa;
}
}
> .el-menu-item.is-active, > .el-submenu.is-active > .el-submenu__title {
background-color: #f6f6f6;
color: #666666;
i {
color: #666666;
}
}
> .el-menu-item:hover, > .el-submenu:hover > .el-submenu__title {
background-color: #e9e9e9;
color: #666666 !important;
i {
color: #666666;
}
}
}
}
> .ivu-layout {
> .ivu-layout-sider {
background-color: #f6f6f6;
.sider-top {
.ivu-icon {
background: #ccd3dd;
color: #fff;
}
}
.app-menu {
> .el-menu-item.is-active, > .el-submenu.is-active > .el-submenu__title {
border-left: 4px solid #3fd5c0;
}
}
}
}
> .el-menu , > .ivu-layout > .ivu-layout-sider .app-app-menu > .app-menu {
background: #f6f6f6;
.el-menu-item:hover, .el-menu-item.is-active {
background: #e9e9e9 !important;
color: #666666 !important;
i {
color: #666666;
}
}
.el-submenu.is-opened, .el-submenu:hover, .el-submenu.is-active {
> .el-submenu__title {
background: #e9e9e9 !important;
color: #666666 !important;
i {
color: #666666;
}
}
}
.el-submenu__title, .el-menu-item {
color: #666666;
i {
color: #666666;
}
}
.el-menu-item {
border-top: 1px solid #f6f6f6;
background: #f6f6f6;
}
.el-submenu {
border-top: 1px solid #f6f6f6;
background: #f6f6f6;
> .el-menu {
border-top: 1px solid #f6f6f6;
background: #f6f6f6;
}
}
}
.ivu-menu-light{
background: #f6f6f6;
}
.ivu-menu-submenu-title{
color: #000;
}
> header {
background-color: #e8eaec;
color: #aaaaaa;
.app-theme-icon {
color: #aaaaaa;
}
.page-logo {
color: #535c70;
}
.header-right {
> div:hover {
background: #d4d4d4;
}
}
.el-menu.el-menu--horizontal {
> .el-menu-item, > .el-submenu > .el-submenu__title {
background: #e1e1e1;
color: #aaaaaa;
i {
color: #aaaaaa;
}
}
> .el-menu-item.is-active, > .el-submenu.is-active > .el-submenu__title {
background-color: #f6f6f6;
color: #666666;
i {
color: #666666;
}
}
> .el-menu-item:hover, > .el-submenu:hover > .el-submenu__title {
background-color: #e9e9e9;
color: #666666 !important;
i {
color: #666666;
}
}
}
}
> .ivu-layout {
> .ivu-layout-sider {
background-color: #f6f6f6;
.sider-top {
.ivu-icon {
background: #f6f6f6;
color: #aaaaaa;
}
}
.app-menu {
> .el-menu-item.is-active, > .el-submenu.is-active > .el-submenu__title {
border-left: 4px solid #1890ff;
}
}
}
}
> .el-menu , > .ivu-layout > .ivu-layout-sider .app-app-menu > .app-menu {
background: #f6f6f6;
.el-menu-item:hover, .el-menu-item.is-active {
background: #fff !important;
color: #1890ff !important;
i {
color: #1890ff;
}
}
.el-submenu.is-opened, .el-submenu:hover, .el-submenu.is-active {
> .el-submenu__title {
background: #fff !important;
color: #1890ff !important;
i {
color: #1890ff;
}
}
}
.el-submenu__title, .el-menu-item {
color: #666666;
i {
color: #666666;
}
}
.el-menu-item {
border-top: 1px solid #f6f6f6;
background: #f6f6f6;
}
.el-submenu {
border-top: 1px solid #f6f6f6;
background: #f6f6f6;
> .el-menu {
border-top: 1px solid #f6f6f6;
background: #f6f6f6;
}
}
}
.ivu-menu-light{
background: #f6f6f6;
}
.ivu-menu-submenu-title{
color: #000;
}
}
/*** END:默认亮色主题 ***/
\ No newline at end of file
......@@ -37,5 +37,17 @@ export default class UIService {
return this.$store;
}
/**
* 获取UI实体服务
*
* @protected
* @param {string} name 实体名称
* @returns {Promise<any>}
* @memberof UIService
*/
public getService(name: string): Promise<any> {
return (window as any)['uiServiceRegister'].getService(name);
}
}
\ No newline at end of file
import DatePickerRange from './components/date-picker-range/date-picker-range.vue'
import AppRangeDate from './components/app-range-date/app-range-date.vue'
export const UserComponent = {
install(v: any, opt: any) {
v.component('date-picker-range',DatePickerRange);
v.component('app-range-date', AppRangeDate);
}
};
\ No newline at end of file
......@@ -194,7 +194,7 @@ export default class AppDrawerCompponent extends Vue {
* @memberof AppDrawerCompponent
*/
public close(result: any) {
if (result && Array.isArray(result) && result.length > 0) {
if (result && Array.isArray(result)) {
Object.assign(this.tempResult, { ret: 'OK' }, { datas: JSON.parse(JSON.stringify(result)) });
}
this.isShow = false;
......
.el-popover {
overflow-y: auto;
//z-index: 99 !important;
background: var(--app-bg-sider-content);
border: 1px solid var(--app-color-font-content);
padding: 0px;
z-index: 2000;
color: var(--app-color-font-content);
line-height: 1.4;
text-align: justify;
font-size: 14px;
-webkit-box-shadow: none;
box-shadow: none;
overflow-y: hidden;
.el-card__header {
padding: 5px 10px;
border-bottom: 1px solid var(--app-color-split-trigger);
color: var(--app-color-font-content);
}
.el-card{
min-width: 150px;
border: none;
background-color: var(--app-bg-content);
color: var(--app-color-font-content);
}
.el-card__body {
padding: 0px;
overflow-x:hidden;
overflow-y: auto;
.viewcontainer2{
.content-container{
margin: 0;
}
}
}
overflow-y: auto;
//z-index: 99 !important;
background: #ffffff;
border: 1px solid #dee0e4;
padding: 0px;
z-index: 2000;
color: var(--app-color-font-content);
line-height: 1.4;
text-align: justify;
font-size: 14px;
overflow-y: hidden;
overflow-x: hidden;
.el-card__header {
padding: 5px 10px;
border-bottom: 1px solid #dee0e4;
color: var(--app-color-font-content);
}
.el-card{
min-width: 150px;
border: none;
background-color: #ffffff;
color: var(--app-color-font-content);
}
.el-card__body {
padding: 0px;
overflow-x:hidden;
overflow-y: auto;
.viewcontainer2{
.content-container{
margin: 0;
}
}
}
}
.clearfix{
position: relative;
.cancel{
position: absolute;
right: 5px;
top: 5px;
}
position: relative;
.cancel{
position: absolute;
right: 5px;
top: 5px;
}
}
\ No newline at end of file
......@@ -54,46 +54,16 @@ export class AuthGuard {
get.then((response: any) => {
if (response && response.status === 200) {
const { data }: { data: any } = response;
const { remotetag, localdata }: { remotetag: string, localdata: {} } = data;
if (remotetag) {
router.app.$store.commit('addAppData', remotetag);
}
if (localdata) {
router.app.$store.commit('addLocalData', localdata);
if (data) {
router.app.$store.commit('addAppData', data);
}
}
this.getAllCodeList(resolve, reject, router);
resolve(true);
}).catch((error: any) => {
this.getAllCodeList(resolve, reject, router);
resolve(true);
console.error("获取应用数据出现异常");
});
});
}
/**
* 获取所有代码表
*
* @private
* @param {*} resolve
* @param {*} reject
* @param {*} router
* @memberof AuthGuard
*/
private getAllCodeList(resolve: any, reject: any, router: any): void {
const url = `./assets/json/data-dictionary.json`;
const get: Promise<any> = Http.getInstance().get(url);
get.then((response: any) => {
if (response && response.status === 200 && response.data && Array.isArray(response.data)) {
const datas: any[] = [...response.data];
datas.forEach((item: any) => {
if (!item.items) {
item.items = [];
}
});
router.app.$store.commit('addCodeLists', datas);
}
resolve(true);
}).catch((error: any) => {
reject(true);
});
}
}
/**
* exportExcel 对象
* 调用 getInstance() 获取实例
*
* @class exportExcel
*/
export class exportExcel {
/**
* 获取 exportExcel 单例对象
*
* @static
* @returns {exportExcel}
* @memberof exportExcel
*/
public static getInstance(): exportExcel {
if (!exportExcel.exportExcel) {
exportExcel.exportExcel = new exportExcel();
}
return this.exportExcel;
}
/**
* 单例变量声明
*
* @private
* @static
* @type {exportExcel}
* @memberof exportExcel
*/
private static exportExcel: exportExcel;
/**
* 获取导出excel核心包
*
* @memberof exportExcel
*/
public async exportExcel(){
let excel:any = await import("@/utils/export2Excel/Export2Excel");
return excel;
}
}
\ No newline at end of file
/* eslint-disable */
import { saveAs } from 'file-saver'
import XLSX from 'xlsx'
function generateArray(table) {
var out = [];
var rows = table.querySelectorAll('tr');
var ranges = [];
for (var R = 0; R < rows.length; ++R) {
var outRow = [];
var row = rows[R];
var columns = row.querySelectorAll('td');
for (var C = 0; C < columns.length; ++C) {
var cell = columns[C];
var colspan = cell.getAttribute('colspan');
var rowspan = cell.getAttribute('rowspan');
var cellValue = cell.innerText;
if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue;
//Skip ranges
ranges.forEach(function (range) {
if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {
for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);
}
});
//Handle Row Span
if (rowspan || colspan) {
rowspan = rowspan || 1;
colspan = colspan || 1;
ranges.push({
s: {
r: R,
c: outRow.length
},
e: {
r: R + rowspan - 1,
c: outRow.length + colspan - 1
}
});
};
//Handle Value
outRow.push(cellValue !== "" ? cellValue : null);
//Handle Colspan
if (colspan)
for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
}
out.push(outRow);
}
return [out, ranges];
};
function datenum(v, date1904) {
if (date1904) v += 1462;
var epoch = Date.parse(v);
return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
}
function sheet_from_array_of_arrays(data, opts) {
var ws = {};
var range = {
s: {
c: 10000000,
r: 10000000
},
e: {
c: 0,
r: 0
}
};
for (var R = 0; R != data.length; ++R) {
for (var C = 0; C != data[R].length; ++C) {
if (range.s.r > R) range.s.r = R;
if (range.s.c > C) range.s.c = C;
if (range.e.r < R) range.e.r = R;
if (range.e.c < C) range.e.c = C;
var cell = {
v: data[R][C]
};
if (cell.v == null) continue;
var cell_ref = XLSX.utils.encode_cell({
c: C,
r: R
});
if (typeof cell.v === 'number') cell.t = 'n';
else if (typeof cell.v === 'boolean') cell.t = 'b';
else if (cell.v instanceof Date) {
cell.t = 'n';
cell.z = XLSX.SSF._table[14];
cell.v = datenum(cell.v);
} else cell.t = 's';
ws[cell_ref] = cell;
}
}
if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
return ws;
}
function Workbook() {
if (!(this instanceof Workbook)) return new Workbook();
this.SheetNames = [];
this.Sheets = {};
}
function s2ab(s) {
var buf = new ArrayBuffer(s.length);
var view = new Uint8Array(buf);
for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
return buf;
}
export function export_table_to_excel(id) {
var theTable = document.getElementById(id);
var oo = generateArray(theTable);
var ranges = oo[1];
/* original data */
var data = oo[0];
var ws_name = "SheetJS";
var wb = new Workbook(),
ws = sheet_from_array_of_arrays(data);
/* add ranges to worksheet */
// ws['!cols'] = ['apple', 'banan'];
ws['!merges'] = ranges;
/* add worksheet to workbook */
wb.SheetNames.push(ws_name);
wb.Sheets[ws_name] = ws;
var wbout = XLSX.write(wb, {
bookType: 'xlsx',
bookSST: false,
type: 'binary'
});
saveAs(new Blob([s2ab(wbout)], {
type: "application/octet-stream"
}), "test.xlsx")
}
export function export_json_to_excel({
multiHeader = [],
header,
data,
filename,
merges = [],
autoWidth = true,
bookType = 'xlsx'
} = {}) {
/* original data */
filename = filename || 'excel-list'
data = [...data]
data.unshift(header);
for (let i = multiHeader.length - 1; i > -1; i--) {
data.unshift(multiHeader[i])
}
var ws_name = "SheetJS";
var wb = new Workbook(),
ws = sheet_from_array_of_arrays(data);
if (merges.length > 0) {
if (!ws['!merges']) ws['!merges'] = [];
merges.forEach(item => {
ws['!merges'].push(XLSX.utils.decode_range(item))
})
}
if (autoWidth) {
/*设置worksheet每列的最大宽度*/
const colWidth = data.map(row => row.map(val => {
/*先判断是否为null/undefined*/
if (val == null) {
return {
'wch': 10
};
}
/*再判断是否为中文*/
else if (val.toString().charCodeAt(0) > 255) {
return {
'wch': val.toString().length * 2
};
} else {
return {
'wch': val.toString().length
};
}
}))
/*以第一行为初始值*/
let result = colWidth[0];
for (let i = 1; i < colWidth.length; i++) {
for (let j = 0; j < colWidth[i].length; j++) {
if (result[j]['wch'] < colWidth[i][j]['wch']) {
result[j]['wch'] = colWidth[i][j]['wch'];
}
}
}
ws['!cols'] = result;
}
/* add worksheet to workbook */
wb.SheetNames.push(ws_name);
wb.Sheets[ws_name] = ws;
var wbout = XLSX.write(wb, {
bookType: bookType,
bookSST: false,
type: 'binary'
});
saveAs(new Blob([s2ab(wbout)], {
type: "application/octet-stream"
}), `${filename}.${bookType}`);
}
/* eslint-disable */
import { saveAs } from 'file-saver'
import JSZip from 'jszip'
export function export_txt_to_zip(th, jsonData, txtName, zipName) {
const zip = new JSZip()
const txt_name = txtName || 'file'
const zip_name = zipName || 'file'
const data = jsonData
let txtData = `${th}\r\n`
data.forEach((row) => {
let tempStr = ''
tempStr = row.toString()
txtData += `${tempStr}\r\n`
})
zip.file(`${txt_name}.txt`, txtData)
zip.generateAsync({
type: "blob"
}).then((blob) => {
saveAs(blob, `${zip_name}.zip`)
}, (err) => {
alert('导出失败')
})
}
......@@ -6,7 +6,9 @@ export { Http } from './http/http';
export { Util } from './util/util';
export { Verify } from './verify/verify';
export { ViewTool } from './view-tool/view-tool';
export { UICounter } from './ui-conunter/ui-counter';
export { XMLWriter } from './xml-writer/xml-writer';
export { Errorlog } from './decorators/errorlog';
export { UIActionTool } from './uiaction-tool/uiaction-tool';
export { LoadAppData } from './load-app-data/load-app-data';
export { Interceptors } from './interceptor/interceptor';
export { StudioActionUtil } from './studio-action/StudioActionUtil';
import { Store } from 'vuex';
import axios from 'axios';
import { Environment } from '@/environments/environment';
import Router from 'vue-router';
/**
......@@ -14,10 +15,58 @@ export class Interceptors {
* 路由对象
*
* @private
* @type {*}
* @type {(Router | any)}
* @memberof Interceptors
*/
private router: any
private router: Router | any;
/**
* 缓存对象
*
* @private
* @type {(Store<any> | any)}
* @memberof Interceptors
*/
private store: Store<any> | any;
/**
* 单列对象
*
* @private
* @static
* @type {LoadAppData}
* @memberof Interceptors
*/
private static readonly instance: Interceptors = new Interceptors();
/**
* Creates an instance of Interceptors.
* 私有构造,拒绝通过 new 创建对象
*
* @memberof Interceptors
*/
private constructor() {
if (Interceptors.instance) {
return Interceptors.instance;
} else {
this.intercept();
}
}
/**
* 获取 LoadAppData 单例对象
*
* @static
* @param {Router} route
* @param {Store<any>} store
* @returns {Interceptors}
* @memberof Interceptors
*/
public static getInstance(route: Router, store: Store<any>): Interceptors {
this.instance.router = route;
this.instance.store = store;
return this.instance;
}
/**
* 拦截器实现接口
......@@ -27,10 +76,13 @@ export class Interceptors {
*/
private intercept(): void {
axios.interceptors.request.use((config: any) => {
const rootapp: any = this.router.app;
const appdata: string = rootapp.$store.getters.getAppData();
if (!Object.is(appdata, '')) {
config.headers.srfappdata = appdata;
let appdata: any ;
if (this.router) {
appdata = this.store.getters.getAppData();
}
if (appdata && appdata.context) {
config.headers.srforgsectorid = appdata.context.srforgsectorid;
//config.headers.srforgsectorname = appdata.context.srforgsectorname;
}
if (window.localStorage.getItem('token')) {
const token = window.localStorage.getItem('token');
......@@ -48,7 +100,6 @@ export class Interceptors {
return response;
}, (error: any) => {
error = error ? error : { response: {} };
// tslint:disable-next-line:prefer-const
let { response: res } = error;
let { data: _data } = res;
......@@ -94,39 +145,4 @@ export class Interceptors {
}
}
/**
* 构建对象
*
* @memberof Interceptors
*/
private constructor(router: any) {
this.router = router;
this.intercept();
}
/**
* 初始化变量
*
* @private
* @static
* @type {Interceptors}
* @memberof Interceptors
*/
private static interceptors: Interceptors;
/**
* 获取单例对象
*
* @static
* @returns {Interceptors}
* @memberof Interceptors
*/
public static getInstance(router: any): Interceptors {
if (!Interceptors.interceptors) {
Interceptors.interceptors = new Interceptors(router);
}
return this.interceptors;
}
}
}
\ No newline at end of file
import { Http } from '../http/http';
import { Store } from 'vuex';
/**
* LoadAppData 对象
* 调用 getInstance() 获取实例
*
* @class LoadAppData
*/
export class LoadAppData {
/**
* 唯一实例
*
* @private
* @static
* @type {LoadAppData}
* @memberof LoadAppData
*/
private static readonly instance: LoadAppData = new LoadAppData();
/**
* Creates an instance of LoadAppData.
* 私有构造,拒绝通过 new 创建对象
* @memberof LoadAppData
*/
private constructor() {
if (LoadAppData.instance) {
return LoadAppData.instance;
}
}
/**
* 获取 LoadAppData 单例对象
*
* @static
* @returns {LoadAppData}
* @memberof LoadAppData
*/
public static getInstance(): LoadAppData {
return this.instance;
}
/**
* 数据加载
*
* @returns {Promise<any>}
* @memberof LoadAppData
*/
public async load(store: Store<any>): Promise<any> {
const url = `./assets/json/data-dictionary.json`;
let response: any = await Http.getInstance().get(url)
if (response && response.status === 200 && response.data && Array.isArray(response.data)) {
const datas: any[] = [...response.data];
datas.forEach((item: any) => {
if (!item.items) {
item.items = [];
}
});
store.commit('addCodeLists', datas);
}
return response;
}
}
\ No newline at end of file
import Print from './packages/print.js';
import vPrint from './packages/vPrint.js'
Print.install = function(Vue) {
Vue.prototype.$print = function(obj){
Print(obj)
}
};
vPrint.install= function(Vue) {
Vue.directive('print', vPrint);
};
export {Print,vPrint} ;
import Print from './printarea.js';
/**
* @file 打印
* 不传参数打印全局
* 传入参数'#id', 参数为需要打印局部的盒子标识.
*/
let closeBtn = true;
let localPrint = (obj) => {
if (closeBtn) {
closeBtn = false;
new Print({
ids: obj.id, // * 局部打印必传入id
standard: '', // 文档类型,默认是html5,可选 html5,loose,strict
//extraHead: binding.value.extraHead, // 附加在head标签上的额外标签,使用逗号分隔
//extraCss: binding.value.extraCss, // 额外的css连接,多个逗号分开
popTitle: obj.popTitle, // title的标题
endCallback() { // 调用打印之后的回调事件
closeBtn = true;
}
});
}
};
let print = (obj)=>{
if(obj && obj.id){
//局部打印
localPrint(obj);
}else{
//全局打印
window.print();
}
}
export default print;
\ No newline at end of file
export default class {
constructor(option) {
this.standards = {
strict: 'strict',
loose: 'loose',
html5: 'html5'
};
this.selectArray = []; // 存储select的
this.counter = 0;
this.settings = {
standard: this.standards.html5,
extraHead: '', // 附加在head标签上的额外元素,使用逗号分隔
extraCss: '', // 额外的css逗号分隔
popTitle: '', // 标题
endCallback: null, // 成功打开后的回调函数
ids: '' // 局部打印的id
};
Object.assign(this.settings, option);
this.init();
}
init() {
this.counter++;
this.settings.id = `printArea_${this.counter}`;
let PrintAreaWindow = this.getPrintWindow(); // 创建iframe
this.write(PrintAreaWindow.doc); // 写入内容
this.print(PrintAreaWindow);
this.settings.endCallback();
}
print(PAWindow) {
let paWindow = PAWindow.win;
const _loaded = () => {
paWindow.focus();
paWindow.print();
try {
let box = document.getElementById(this.settings.id);
let canvasList = this.elsdom.querySelectorAll('.canvasImg')
// console.log(this.elsdom)
for (let i = 0; i < canvasList.length; i++) {
let _parent = canvasList[i].parentNode
_parent.removeChild(canvasList[i])
}
box.parentNode.removeChild(box);
} catch (e) {
console.log(e);
}
};
if (window.ActiveXObject) {
paWindow.onload = _loaded();
return false;
}
paWindow.onload = () => {
_loaded();
};
}
write(PADocument, $ele) {
PADocument.open();
PADocument.write(`${this.docType()}<html>${this.getHead()}${this.getBody()}</html>`);
PADocument.close();
}
docType() {
if (this.settings.standard === this.standards.html5) {
return '<!DOCTYPE html>';
}
var transitional = this.settings.standard === this.standards.loose ? ' Transitional' : '';
var dtd = this.settings.standard === this.standards.loose ? 'loose' : 'strict';
return `<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01${transitional}//EN" "http://www.w3.org/TR/html4/${dtd}.dtd">`;
}
getHead() {
let extraHead = '';
let links = '';
let style = '';
if (this.settings.extraHead) {
this.settings.extraHead.replace(/([^,]+)/g, (m) => {
extraHead += m;
});
}
// 复制所有link标签
[].forEach.call(document.querySelectorAll('link'), function (item, i) {
if (item.href.indexOf('.css') >= 0) {
links += `<link type="text/css" rel="stylesheet" href="${item.href}" >`;
}
});
// const _links = document.querySelectorAll('link');
// if (typeof _links === 'object' || _links.length > 0) {
// // 复制所有link标签
// for (let i = 0; i < _links.length; i++) {
// let item = _links[i];
// if (item.href.indexOf('.css') >= 0) {
// links += `<link type="text/css" rel="stylesheet" href="${item.href}" >`;
// }
// }
// }
// 循环获取style标签的样式
let domStyle = document.styleSheets;
if (domStyle && domStyle.length > 0) {
for (let i = 0; i < domStyle.length; i++) {
try {
if (domStyle[i].cssRules || domStyle[i].rules) {
let rules = domStyle[i].cssRules || domStyle[i].rules;
for (let b = 0; b < rules.length; b++) {
style += rules[b].cssText;
}
}
} catch (e) {
console.log(domStyle[i].href + e);
}
}
}
if (this.settings.extraCss) {
this.settings.extraCss.replace(/([^,\s]+)/g, (m) => {
links += `<link type="text/css" rel="stylesheet" href="${m}">`;
});
}
return `<head><title>${this.settings.popTitle}</title>${extraHead}${links}<style type="text/css">${style}</style><style>html,body,div{height: auto!important;}</style></head>`;
}
getBody() {
let ids = this.settings.ids;
ids = ids.replace(new RegExp("#", "g"), '');
this.elsdom = this.beforeHanler(document.getElementById(ids));
let ele = this.getFormData(this.elsdom);
let htm = ele.outerHTML;
return '<body>' + htm + '</body>';
}
// 克隆节点之前做的操作
beforeHanler(elsdom) {
let canvasList = elsdom.querySelectorAll('canvas');
// canvas转换png图片
for (let i = 0; i < canvasList.length; i++) {
if (!canvasList[i].style.display) {
let _parent = canvasList[i].parentNode
let _canvasUrl = canvasList[i].toDataURL('image/png')
let _img = new Image()
_img.className = 'canvasImg'
_img.style.display = 'none'
_img.src = _canvasUrl
// _parent.replaceChild(_img, canvasList[i])
_parent.appendChild(_img)
}
}
return elsdom
}
// 根据type去处理form表单
getFormData(ele) {
let copy = ele.cloneNode(true);
let copiedInputs = copy.querySelectorAll('input,select,textarea');
let canvasImgList = copy.querySelectorAll('.canvasImg,canvas');
let selectCount = -1;
// 处理所有canvas
for (let i = 0; i < canvasImgList.length; i++) {
let _parent = canvasImgList[i].parentNode
let item = canvasImgList[i]
// 删除克隆后的canvas节点
if (item.tagName.toLowerCase() === 'canvas') {
_parent.removeChild(item)
} else {
item.style.display = 'block'
}
}
// 处理所有输入框
for (let i = 0; i < copiedInputs.length; i++) {
let item = copiedInputs[i];
let typeInput = item.getAttribute('type');
let copiedInput = copiedInputs[i];
// 获取select标签
if (!typeInput) {
typeInput = item.tagName === 'SELECT' ? 'select' : item.tagName === 'TEXTAREA' ? 'textarea' : '';
}
// 处理input框
if (item.tagName === 'INPUT') {
// 除了单选框 多选框比较特别
if (typeInput === 'radio' || typeInput === 'checkbox') {
copiedInput.setAttribute('checked', item.checked);
//
} else {
copiedInput.value = item.value;
copiedInput.setAttribute('value', item.value);
}
// 处理select
} else if (typeInput === 'select') {
selectCount++;
for (let b = 0; b < ele.querySelectorAll('select').length; b++) {
let select = ele.querySelectorAll('select')[b]; // 获取原始层每一个select
!select.getAttribute('newbs') && select.setAttribute('newbs', b) // 添加标识
if (select.getAttribute('newbs') == selectCount) {
let opSelectedIndex = ele.querySelectorAll('select')[selectCount].selectedIndex;
item.options[opSelectedIndex].setAttribute('selected', true);
}
}
// 处理textarea
} else {
copiedInput.innerHTML = item.value;
copiedInput.setAttribute('html', item.value);
}
}
return copy;
}
getPrintWindow() {
var f = this.Iframe();
return {
f: f,
win: f.contentWindow || f,
doc: f.doc
};
}
Iframe() {
let frameId = this.settings.id;
let iframe;
let that = this
try {
iframe = document.createElement('iframe');
document.body.appendChild(iframe);
iframe.style.border = '0px';
iframe.style.position = 'absolute';
iframe.style.width = '0px';
iframe.style.height = '0px';
iframe.style.right = '0px';
iframe.style.top = '0px';
iframe.setAttribute('id', frameId);
// iframe.setAttribute('src', new Date().getTime());
iframe.doc = null;
iframe.doc = iframe.contentDocument ? iframe.contentDocument : (iframe.contentWindow ? iframe.contentWindow.document : iframe.document);
iframe.onload = function () {
var win = iframe.contentWindow || iframe;
that.print(win);
}
} catch (e) {
throw new Error(e + '. iframes may not be supported in this browser.');
}
if (iframe.doc == null) {
throw new Error('Cannot find document.');
}
return iframe;
}
}
\ No newline at end of file
import Print from './printarea.js';
/**
* @file 打印
* 指令`v-print`,默认打印整个窗口
* 传入参数`v-print="'#id'"` , 参数为需要打印局部的盒子标识.
*/
export default {
directiveName: 'print',
bind(el, binding, vnode) {
let vue = vnode.context;
let closeBtn = true;
let id = '';
el.addEventListener('click', () => {
vue.$nextTick(() => {
if (typeof binding.value === 'string') {
id = binding.value;
} else if (typeof binding.value === 'object' && !!binding.value.id) {
id = binding.value.id;
let ids = id.replace(new RegExp("#", "g"), '');
let elsdom = document.getElementById(ids);
if (!elsdom) console.log("id in Error"), id = '';
}
// 局部打印
if (id) {
localPrint();
} else {
// 直接全局打印
window.print();
}
});
});
const localPrint = () => {
if (closeBtn) {
closeBtn = false;
new Print({
ids: id, // * 局部打印必传入id
standard: '', // 文档类型,默认是html5,可选 html5,loose,strict
extraHead: binding.value.extraHead, // 附加在head标签上的额外标签,使用逗号分隔
extraCss: binding.value.extraCss, // 额外的css连接,多个逗号分开
popTitle: binding.value.popTitle, // title的标题
endCallback() { // 调用打印之后的回调事件
closeBtn = true;
}
});
}
};
}
};
\ No newline at end of file
import Vue from 'vue';
import { Http } from '@/utils';
import { Environment } from '@/environments/environment';
import { on } from '@/utils/dom/dom';
/**
* Studio Debug工具类
*
* @export
* @class StudioActionUtil
*/
export class StudioActionUtil {
/**
* 唯一实例
*
* @private
* @static
* @type {StudioActionUtil}
* @memberof StudioActionUtil
*/
private static readonly instance: StudioActionUtil = new StudioActionUtil();
/**
* 是否启用
*
* @protected
* @type {boolean}
* @memberof StudioActionUtil
*/
protected isEnable: boolean = Environment.devMode;
/**
* 请求对象
*
* @protected
* @type {Http}
* @memberof StudioActionUtil
*/
protected http: Http = Http.getInstance();
/**
* 配置信息
*
* @protected
* @type {*}
* @memberof StudioActionUtil
*/
protected config: any = null;
/**
* 配置平台界面
*
* @protected
* @type {Window}
* @memberof StudioActionUtil
*/
protected studioWin: Window | null = null;
/**
* 是否显示开发配置工具栏
*
* @type {boolean}
* @memberof StudioActionUtil
*/
public isShowTool: boolean = false;
/**
* Creates an instance of StudioActionUtil.
* @memberof StudioActionUtil
*/
constructor() {
if (StudioActionUtil.instance) {
return StudioActionUtil.instance;
}
if (Environment.devMode) {
on(window, 'keydown', (e: KeyboardEvent) => {
if ((e.ctrlKey || e.metaKey) && e.keyCode === 123) {
this.showToolChange();
}
});
}
}
/**
* 为当前视图建立issues
*
* @param {string} viewName
* @returns {Promise<void>}
* @memberof StudioActionUtil
*/
public async createdIssues(viewName: string): Promise<void> {
const config: any = await this.getConfig(viewName);
if (config) {
const context: string = `视图模块:${config.viewmodule}\n视图标识:${config.viewname}\n视图类型:${config.viewtype}\n`;
window.open(`${Environment.ProjectUrl}/issues/new?issue[title]=${encodeURIComponent('问题')}&issue[description]=${encodeURIComponent(context)}`, '_blank');
}
}
/**
* 打开Studio配置界面
*
* @param {string} viewName
* @returns {Promise<void>}
* @memberof StudioActionUtil
*/
public async openStudioConfigView(viewName: string): Promise<void> {
const config: any = await this.getConfig(viewName);
if (config) {
const params: any = {
"appType": "APPSTUDIO",
"appKey": Environment.AppId,
"dataType": "AppDesign_PSAppViewDesignRedirectView",
"srfkey": config.viewtag
};
if (this.studioWin && this.studioWin.closed === false) {
this.studioWin.postMessage({
type: 'OpenView',
params
}, '*');
Vue.prototype.$message.warning('请在已打开的配置平台查看!');
} else {
console.log(`${Environment.StudioUrl}?ov=${JSON.stringify(params)}#/common_slnindex/srfkeys=${Environment.DCId}/sysdesign_psdevslnsysmodeltreeexpview/srfkey=${Environment.SysId}`);
this.studioWin = window.open(`${Environment.StudioUrl}?ov=${encodeURIComponent(JSON.stringify(params))}#/common_slnindex/srfkeys=${Environment.DCId}/sysdesign_psdevslnsysmodeltreeexpview/srfkey=${Environment.SysId}`, '_blank');
}
}
}
/**
* 获取视图配置参数
*
* @protected
* @param {string} viewName
* @returns {Promise<any>}
* @memberof StudioActionUtil
*/
protected async getConfig(viewName: string): Promise<any> {
if (!this.config) {
await this.loadConfig();
}
return this.config[viewName];
}
/**
* 加载配置信息
*
* @protected
* @returns {Promise<void>}
* @memberof StudioActionUtil
*/
protected async loadConfig(): Promise<void> {
const response: any = await this.http.get('./assets/json/view-config.json');
if (response && response.status === 200 && response.data) {
this.config = response.data
} else {
console.warn('Studio操作控制器,视图参数信息加载失败!');
}
}
/**
* 展示配置工具栏状态变更
*
* @memberof StudioActionController
*/
public showToolChange(): void {
this.isShowTool = !this.isShowTool;
}
/**
* 获取实例
*
* @static
* @returns {StudioActionUtil}
* @memberof StudioActionUtil
*/
public static getInstance(): StudioActionUtil {
return this.instance;
}
}
\ No newline at end of file
import Vue, { VNode, CreateElement } from "vue";
export declare interface exportExcel {
exportExcel(): Promise<any>;
}
declare module "vue/types/vue" {
interface Vue {
/**
* exportExcel 对象
*
* @type {exportExcel}
* @memberof Vue
*/
$export: exportExcel;
}
}
\ No newline at end of file
declare module "@/utils/export2Excel/Export2Excel";
declare module "@/utils/print"
\ No newline at end of file
......@@ -127,6 +127,17 @@ export declare interface Util {
* @memberof Util
*/
formatData(arg: any, params: any): any
/**
* 日期格式化
*
* @static
* @param {string} fmt 格式化字符串
* @param {any} date 日期对象
* @returns {string}
* @memberof Util
*/
dateFormat(date: any,fmt?: string):string
}
declare module "vue/types/vue" {
......
......@@ -60,7 +60,7 @@ export declare interface ViewTool {
* @returns {*}
* @memberof ViewTool
*/
formatRouteParams(params: any,context:any,viewparams:any): any;
formatRouteParams(params: any,route:any,context:any,viewparams:any): any;
/**
* 设置首页路由结构参数
*
......
......@@ -316,5 +316,50 @@ export class Util {
return _data;
}
/**
* 日期格式化
*
* @static
* @param {string} fmt 格式化字符串
* @param {any} date 日期对象
* @returns {string}
* @memberof Util
*/
public static dateFormat(date: any,fmt: string = "YYYY-mm-dd HH:MM:SS"):string {
let ret;
const opt: any = {
"Y+": date.getFullYear().toString(), // 年
"m+": (date.getMonth() + 1).toString(), // 月
"d+": date.getDate().toString(), // 日
"H+": date.getHours().toString(), // 时
"M+": date.getMinutes().toString(), // 分
"S+": date.getSeconds().toString() // 秒
// 有其他格式化字符需求可以继续添加,必须转化成字符串
};
for (let k in opt) {
ret = new RegExp("(" + k + ")").exec(fmt);
if (ret) {
fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
};
};
return fmt;
}
/**
* 深度合并对象
*
* @param FirstOBJ 目标对象
* @param SecondOBJ 原对象
* @returns {Object}
* @memberof Util
*/
public static deepObjectMerge(FirstOBJ:any, SecondOBJ:any) {
for (var key in SecondOBJ) {
FirstOBJ[key] = FirstOBJ[key] && FirstOBJ[key].toString() === "[object Object]" ?
this.deepObjectMerge(FirstOBJ[key], SecondOBJ[key]) : FirstOBJ[key] = SecondOBJ[key];
}
return FirstOBJ;
}
}
\ No newline at end of file
......@@ -152,27 +152,28 @@ export class ViewTool {
* @returns {*}
* @memberof ViewTool
*/
public static formatRouteParams(params: any,context:any,viewparams:any): void {
let _data: any = {};
public static formatRouteParams(params: any,route:any,context:any,viewparams:any): void {
Object.keys(params).forEach((key: string,index:number) => {
const param: string | null | undefined = params[key];
if (!param || Object.is(param, '') || Object.is(param, 'null')) {
return;
}
if(index === (Object.keys(params).length - 1)){
if (param.indexOf('=') > 0) {
const _param = qs.parse(param, { delimiter: ';' });
Object.assign(viewparams, _param);
}
}else{
if (param.indexOf('=') > 0) {
const _param = qs.parse(param, { delimiter: ';' });
Object.assign(context, _param);
} else {
Object.assign(context, { [key]: param });
}
if (param.indexOf('=') > 0) {
const _param = qs.parse(param, { delimiter: ';' });
Object.assign(context, _param);
} else {
Object.assign(context, { [key]: param });
}
});
if(route && route.fullPath && route.fullPath.indexOf("?") > -1){
const _viewparams:any = route.fullPath.slice(route.fullPath.indexOf("?")+1);
const _viewparamArray:Array<string> = decodeURIComponent(_viewparams).split(";")
if(_viewparamArray.length > 0){
_viewparamArray.forEach((item:any) =>{
Object.assign(viewparams, qs.parse(item));
})
}
}
}
/**
......
import { Store } from 'vuex';
/**
* 功能服务基类
*
* @export
* @class UtilService
*/
export default class UtilService {
/**
* Vue 状态管理器
*
* @private
* @type {(any | null)}
* @memberof UtilService
*/
private $store: Store<any> | null = null;
/**
* 模型标识属性
*
* @memberof UtilService
*/
protected modelIdField: string = "";
/**
* 模型存储属性
*
* @memberof UtilService
*/
protected modelField: string = "";
/**
* 应用标识属性
*
* @memberof UtilService
*/
protected appIdField: string = "";
/**
* 用户标识属性
*
* @memberof UtilService
*/
protected userIdField: string = "";
/**
* 存储实体Name
*
* @memberof UtilService
*/
protected stoageEntityName:string ="";
/**
* 存储实体Id
*
* @memberof UtilService
*/
protected stoageEntityKey:string ="";
/**
* Creates an instance of UtilService.
*
* @param {*} [opts={}]
* @memberof UtilService
*/
constructor(opts: any = {}) {
this.$store = opts.$store;
this.initBasicParam();
}
/**
* 获取状态管理器
*
* @returns {(any | null)}
* @memberof UtilService
*/
public getStore(): Store<any> | null {
return this.$store;
}
/**
* 初始化基础参数
*
* @returns {(any | null)}
* @memberof UtilService
*/
public initBasicParam(){
console.log("UtilService初始化参数未实现");
}
/**
* 获取功能服务
*
* @protected
* @param {string} name 功能实体名称
* @returns {Promise<any>}
* @memberof UtilService
*/
public getService(name: string): Promise<any> {
return (window as any)['utilServiceRegister'].getService(name);
}
/**
* 处理请求参数
*
* @param context 应用上下文
* @param data 传入模型数据
* @param isloading 是否加载
* @memberof UtilService
*/
protected handlePreParam(context:any,data:any ={}){
let tempContext:Object = {};
let tempData:Object = {};
if(context.modelid){
Object.defineProperty(tempContext,this.modelIdField,{
value: context.modelid,
writable: true,
enumerable: true,
configurable: true
});
Object.defineProperty(tempContext,this.stoageEntityName,{
value: context.modelid,
writable: true,
enumerable: true,
configurable: true
});
Object.defineProperty(tempData,this.modelIdField,{
value: context.modelid,
writable: true,
enumerable: true,
configurable: true
});
Object.defineProperty(tempData,this.stoageEntityKey,{
value: context.modelid,
writable: true,
enumerable: true,
configurable: true
});
}
Object.defineProperty(tempData,this.modelField,{
value: data,
writable: true,
enumerable: true,
configurable: true
});
return {context:tempContext,data:tempData};
}
/**
* 获取模型数据
*
* @param context 应用上下文
* @param data 传入模型数据
* @param isloading 是否加载
* @memberof UtilService
*/
protected loadModelData(context: any = {},data: any = {}, isloading?: boolean):Promise<any>{
return Promise.resolve(null);
}
/**
* 保存模型数据
*
* @param context 应用上下文
* @param data 传入模型数据
* @param isloading 是否加载
* @memberof UtilService
*/
protected saveModelData(context: any = {},data: any = {}, isloading?: boolean):Promise<any>{
return Promise.resolve(null);
}
}
\ No newline at end of file
import { Store } from 'vuex';
import { Util } from '@/utils/util/util';
/**
* 部件服务基类
......@@ -81,7 +82,7 @@ export default class ControlService {
* @param data 数据
* @memberof ControlService
*/
public handleRequestData(action: string,context:any ={},data: any = {}){
public handleRequestData(action: string,context:any ={},data: any = {},isMerge:boolean = false){
let model: any = this.getMode();
if (!model && model.getDataItems instanceof Function) {
return data;
......@@ -99,6 +100,9 @@ export default class ControlService {
}
}
});
if(isMerge && (data && data.viewparams)){
Object.assign(requestData,data.viewparams);
}
let tempContext:any = JSON.parse(JSON.stringify(context));
if(tempContext && tempContext.srfsessionid){
tempContext.srfsessionkey = tempContext.srfsessionid;
......@@ -127,18 +131,15 @@ export default class ControlService {
result = this.handleResponseData(action, response.data, isCreate);
}
// response状态,头文件
if(response.status){
Object.assign(result,{status:response.status});
}
if(response.headers){
if(response.headers['x-page']){
Object.assign(result,{page:Number(response.headers['x-page'])});
Object.assign(response,{page:Number(response.headers['x-page'])});
}
if(response.headers['x-per-page']){
Object.assign(result,{size:Number(response.headers['x-per-page'])});
Object.assign(response,{size:Number(response.headers['x-per-page'])});
}
if(response.headers['x-total']){
Object.assign(result,{total:Number(response.headers['x-total'])});
Object.assign(response,{total:Number(response.headers['x-total'])});
}
}
response.data = result;
......@@ -166,6 +167,9 @@ export default class ControlService {
if((isCreate === undefined || isCreate === null ) && Object.is(dataitem.dataType, 'GUID') && Object.is(dataitem.name, 'srfkey') && (val && !Object.is(val, ''))){
isCreate = true;
}
// if((Object.is(dataitem.dataType,'DATE') || Object.is(dataitem.dataType,'DATETIME')) && !Object.is(Date.parse(val),NaN)){
// val = Util.dateFormat(new Date(val));
// }
item[dataitem.name] = val;
});
if (isCreate) {
......@@ -185,11 +189,11 @@ export default class ControlService {
}
/**
* 处理数据
* 处理工作流数据
*
* @param data 传入数据
*/
public handleDataWithKey(data:any){
public handleWFData(data:any, isMerge:boolean = false){
let model: any = this.getMode();
if (!model && model.getDataItems instanceof Function) {
return data;
......@@ -201,8 +205,8 @@ export default class ControlService {
requestData[item.prop] = data[item.name];
}
});
if(data.viewparams){
requestData.viewparams = data.viewparams;
if(isMerge && (data.viewparams && Object.keys(data.viewparams).length > 0)){
Object.assign(requestData,data.viewparams);
}
return requestData;
}
......
......@@ -794,6 +794,41 @@
debug "^3.1.0"
lodash.once "^4.1.1"
"@fullcalendar/core@^4.4.0", "@fullcalendar/core@~4.4.0":
version "4.4.0"
resolved "https://registry.yarnpkg.com/@fullcalendar/core/-/core-4.4.0.tgz#79dbc0cca836ce628a07e739a456da11ff141373"
integrity sha512-PC4mmXHJHAlXmUEmZVnePyA8yYCOBdxBNq8yjJqedEtT1X0x36yTFz/Y0Ux6bniICZDqYtk0xoxe6jaxi++e0g==
"@fullcalendar/daygrid@^4.4.0", "@fullcalendar/daygrid@~4.4.0":
version "4.4.0"
resolved "https://registry.yarnpkg.com/@fullcalendar/daygrid/-/daygrid-4.4.0.tgz#25fcae7226b62688b4e086a611582e72253b5229"
integrity sha512-pDfvL0XZxKHTZ4VFOmwaYe3LmuABEIZsEopeqQ8y5O6BDen9KCbJqgHeCI8FpASSBd6bNlUx7il7EHdSoHhgIw==
"@fullcalendar/interaction@^4.4.0":
version "4.4.0"
resolved "https://registry.yarnpkg.com/@fullcalendar/interaction/-/interaction-4.4.0.tgz#fc8f8baaf5cb3533d6ce0a684d6f9952a4430685"
integrity sha512-nGu0ZzYYlNpIhqfyv3JupteWKFETs3W1MzbRJcEZkuPncn4BooEi4A2blgHfacHAmmpaNkT84tAmhzi734MFBA==
"@fullcalendar/list@^4.4.0":
version "4.4.0"
resolved "https://registry.yarnpkg.com/@fullcalendar/list/-/list-4.4.0.tgz#8edab49d06903b7de0ca68eefc1d44d0a58860a9"
integrity sha512-uUDSPS71czNTK5Z3x3HzeE3KIvqkCfvhY+mGFdaAL6+7VpCwEIfB6s3GIJOjzu9TONmczMk4jdq0b1WUFLY5PQ==
"@fullcalendar/timegrid@^4.4.0":
version "4.4.0"
resolved "https://registry.yarnpkg.com/@fullcalendar/timegrid/-/timegrid-4.4.0.tgz#c5837cfd676afff0d95535ac4cc054ed65965976"
integrity sha512-QwJ9oM87/ZTbXaE8PMIVp20GPtVCFmroaeR1GydJ6BKYtbxG/nsaSv7RhqvDa2jLjHaTWC2NjHo9hRfjQjtCZA==
dependencies:
"@fullcalendar/daygrid" "~4.4.0"
"@fullcalendar/vue@^4.4.0":
version "4.4.0"
resolved "https://registry.yarnpkg.com/@fullcalendar/vue/-/vue-4.4.0.tgz#d7c7025217d09407939d6bad687629d217501b27"
integrity sha512-9lvlUhQRvqBMstLqfsnwZ8EBHV0PMETgWnlCvpMZfA9zBfB9tb0f6mSFRScKbYDiT4wPpigBjJXMFaoRlqHleA==
dependencies:
"@fullcalendar/core" "~4.4.0"
fast-deep-equal "^2.0.1"
"@hapi/address@2.x.x":
version "2.1.4"
resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5"
......@@ -826,6 +861,178 @@
dependencies:
"@hapi/hoek" "^8.3.0"
"@interactjs/actions@1.9.7":
version "1.9.7"
resolved "https://registry.yarnpkg.com/@interactjs/actions/-/actions-1.9.7.tgz#b015931f406e090e48d3244343cf7b2cc53c90f1"
integrity sha512-j5+2Cj1Ra3/0BgfCqL7hKGw7kOZyOBg3HXi+EJ9AT0sJzetjwsRt5YlvCm9URH8XcY7sNlFi8gD5mPFjD8DZaw==
optionalDependencies:
"@interactjs/interact" "1.9.7"
"@interactjs/arrange@1.9.7":
version "1.9.7"
resolved "https://registry.yarnpkg.com/@interactjs/arrange/-/arrange-1.9.7.tgz#42323ce4b1af905d6e4ab76fc066cd1573bd41ee"
integrity sha512-gXcj4Gti3WsRmJ4Ohr5toUl7AjsBOY6Ik5SX69X3AZKrQpDJfkNBcOZJ/AlAPLXIwjBV8rRQiddYgB+SXCJcBg==
"@interactjs/auto-scroll@1.9.7":
version "1.9.7"
resolved "https://registry.yarnpkg.com/@interactjs/auto-scroll/-/auto-scroll-1.9.7.tgz#e6c2e67b6ed43dd0dd6a84e96b5d1389a20a647a"
integrity sha512-/753R5h8z1VQ/aS5VsqI6C0V6fwb3934tP7s+htHL27aPVxyz20kfZVd74t5BmPSUAxAyDqwNVZ1vgjGLCSyAQ==
optionalDependencies:
"@interactjs/interact" "1.9.7"
"@interactjs/auto-start@1.9.7":
version "1.9.7"
resolved "https://registry.yarnpkg.com/@interactjs/auto-start/-/auto-start-1.9.7.tgz#4afa53c7c869170cb3a01a0019aa30791b3c5d18"
integrity sha512-fKn7Yrl6idw7gxbAC0zvcQLSTsUE9WGs71+Y9WVj+ICQMkTO19ci9Y1lCBdo1AP/njLaQp8yPbHoUe5pI7eW6w==
optionalDependencies:
"@interactjs/interact" "1.9.7"
"@interactjs/clone@1.9.7":
version "1.9.7"
resolved "https://registry.yarnpkg.com/@interactjs/clone/-/clone-1.9.7.tgz#fdde8307835cecadd9e29f597ecff890d03167fc"
integrity sha512-GNlGh5sKVFYcpOn7Z3HNOLItBdzG3f6t38soUowCmNv4Rd19nmnXkvKKVhfodjfBk26fsdXFI6EZ3iduzYsmAg==
"@interactjs/components@1.9.7":
version "1.9.7"
resolved "https://registry.yarnpkg.com/@interactjs/components/-/components-1.9.7.tgz#40ec9889fd1e94d07c67001b36dd39d113b3e762"
integrity sha512-TdNlJVbKKLy2ZmNtpjhxQkQls1SqXXFSyY4JfAGRG23UOOMrjoG4+56RAe4tlOpHSIIfEER5skvgBSv6UFajHw==
"@interactjs/core@1.9.7":
version "1.9.7"
resolved "https://registry.yarnpkg.com/@interactjs/core/-/core-1.9.7.tgz#1fdf924c369df23ffe1300af9c945f2651538043"
integrity sha512-fN7OfPNU9jgS+hEqe0+OJvJjp/XgNE9lkuCnH57/xtT4nfDca/43BkE57bNoEXhM9Ym5js2Ium+MbUTUVyZ+3A==
"@interactjs/dev-tools@1.9.7":
version "1.9.7"
resolved "https://registry.yarnpkg.com/@interactjs/dev-tools/-/dev-tools-1.9.7.tgz#91eab3f10806b84b95c313ef5f06408c2d3251cf"
integrity sha512-LhLeLZw2joG13j3hUAuhmC9HTsVCnUEggcScgCcpY/SQRA51JCCM9lEcXnwTxTxd02v6A/tueoyUdONm2lniCA==
dependencies:
"@interactjs/utils" "1.9.7"
optionalDependencies:
"@interactjs/interact" "1.9.7"
"@interactjs/feedback@1.9.7":
version "1.9.7"
resolved "https://registry.yarnpkg.com/@interactjs/feedback/-/feedback-1.9.7.tgz#0e3ea3c8e863fdf89d8afee0a1ae5838e9f13d09"
integrity sha512-CcgTv2mhCWpH0w6Fq12K6kiV1BSozt8Rdy02yXg927ruKChr7pIQvvZP7TpxfZoBFCN9JJxN3KvQpcfsUQsafQ==
"@interactjs/inertia@1.9.7":
version "1.9.7"
resolved "https://registry.yarnpkg.com/@interactjs/inertia/-/inertia-1.9.7.tgz#e8c8ed702bd23d0182a1a0ddbca4be7419826511"
integrity sha512-WeVKgztqODjE+fbYuIayJv4cdqwBz4wJ45RC2qYhYWhzsHL0LUbJhEs6sCnV3q+2wZEVMdB8oURh8tnqECBIGg==
dependencies:
"@interactjs/offset" "1.9.7"
optionalDependencies:
"@interactjs/interact" "1.9.7"
"@interactjs/interact@1.9.7":
version "1.9.7"
resolved "https://registry.yarnpkg.com/@interactjs/interact/-/interact-1.9.7.tgz#be988cfb15b13f2cfc0aa68ce826761d49f46e8a"
integrity sha512-BocTUB8TfZ3USuN1s7xP+3Uhvb7dnZFNTfr3Ux6Nv2BxKLMz/bIU2fZhYAHw7xApIMKfYyRuUNxSyGM5iyCaEA==
dependencies:
"@interactjs/core" "1.9.7"
"@interactjs/types" "1.9.7"
"@interactjs/utils" "1.9.7"
"@interactjs/interactjs@1.9.7":
version "1.9.7"
resolved "https://registry.yarnpkg.com/@interactjs/interactjs/-/interactjs-1.9.7.tgz#995b6d9b4abd03a84b02c887315768ab2421b35c"
integrity sha512-D3wdlwUQRS8t8r7TopYlkjKsONxazrZu8R4DBL+czUrm26Il/0427+uoV92iMgDUZpw5fYLt1dzqzozUL/y6Dw==
dependencies:
"@interactjs/actions" "1.9.7"
"@interactjs/arrange" "1.9.7"
"@interactjs/auto-scroll" "1.9.7"
"@interactjs/auto-start" "1.9.7"
"@interactjs/clone" "1.9.7"
"@interactjs/components" "1.9.7"
"@interactjs/core" "1.9.7"
"@interactjs/dev-tools" "1.9.7"
"@interactjs/feedback" "1.9.7"
"@interactjs/inertia" "1.9.7"
"@interactjs/interact" "1.9.7"
"@interactjs/modifiers" "1.9.7"
"@interactjs/multi-target" "1.9.7"
"@interactjs/offset" "1.9.7"
"@interactjs/pointer-events" "1.9.7"
"@interactjs/reflow" "1.9.7"
"@interactjs/types" "1.9.7"
"@interactjs/utils" "1.9.7"
"@interactjs/vue" "1.9.7"
"@interactjs/modifiers@1.9.7":
version "1.9.7"
resolved "https://registry.yarnpkg.com/@interactjs/modifiers/-/modifiers-1.9.7.tgz#dcb37e3782c91d7f8b28008d68ec5ebc26101e7a"
integrity sha512-1trdJ6E85DiUn2u0zvqLYt77aoug0VYDg8c1GyzcLm64t8CYw+PggTQKqhy+kJiKb30QsgUuhsR5aQdlotguew==
dependencies:
"@interactjs/snappers" "1.9.7"
optionalDependencies:
"@interactjs/interact" "1.9.7"
"@interactjs/multi-target@1.9.7":
version "1.9.7"
resolved "https://registry.yarnpkg.com/@interactjs/multi-target/-/multi-target-1.9.7.tgz#bb4de8612f6a649e18d40b93ed5461cde72f79ee"
integrity sha512-hqw4sCKYxUZV00u0ikEM66t6zrCP8t3TDgDPrph274LmEUIdfGrCsv7xWLIEdke63h0pt3lO1V5H8N/rMoGs0A==
"@interactjs/offset@1.9.7":
version "1.9.7"
resolved "https://registry.yarnpkg.com/@interactjs/offset/-/offset-1.9.7.tgz#5a2aec0f25781bd1728c71fe8c16a55edc3f5b8e"
integrity sha512-IMCizwVDk2hj8yNNTfLnqdK9GuSlFSS8GxK2ZGUGNSQSPh3b6vrkkIrxwA/qHjDGUUuDP+ZWvlAF4D0/OAc74g==
optionalDependencies:
"@interactjs/interact" "1.9.7"
"@interactjs/pointer-events@1.9.7":
version "1.9.7"
resolved "https://registry.yarnpkg.com/@interactjs/pointer-events/-/pointer-events-1.9.7.tgz#5a0e0daff1c322c6cbff8cbb8052c531d66d1aad"
integrity sha512-Vl/+GTVnZlw8DQ7YN7D1oIIZLiqPL/KgdfRrGHSidsLmo/WJNM2TsJJsJcRMY/IiEQrtTvp/fSKG6rNWyzIr5w==
optionalDependencies:
"@interactjs/interact" "1.9.7"
"@interactjs/reflow@1.9.7":
version "1.9.7"
resolved "https://registry.yarnpkg.com/@interactjs/reflow/-/reflow-1.9.7.tgz#77494d83e1a13236ca841adba997faaaf6eb633c"
integrity sha512-npuIadX3YBoFFqJbM+LQZgPyw/IYq3HwYM2WNi8Bc/feCy1Ia12uF4Lwi5Rj+8jcA5FyInHzZXBUJCcHO1zaFQ==
optionalDependencies:
"@interactjs/interact" "1.9.7"
"@interactjs/snappers@1.9.7":
version "1.9.7"
resolved "https://registry.yarnpkg.com/@interactjs/snappers/-/snappers-1.9.7.tgz#b2f3752ab25c886cd5ae1f4c0478964b9b8b652e"
integrity sha512-EfKsgTi8yCtNWRHSU2INfMob5eMUBY8Wrh53tszgh94JstyKwlmzG2mH6eGwdN7pU3//h0AM4ThuqOmbIYUPCw==
"@interactjs/symbol-tree@1.9.7":
version "1.9.7"
resolved "https://registry.yarnpkg.com/@interactjs/symbol-tree/-/symbol-tree-1.9.7.tgz#2aec371ded47be71cfa359305da959b382de66ff"
integrity sha512-zLRpXVtzq/TxG6MwT1FhkBNoFGZlYxNd52RZ6Wy5XyPAsxaZoXqNzDUT6See/xe2X80gzvT78dkT5uKSUE3I2w==
"@interactjs/types@1.9.7":
version "1.9.7"
resolved "https://registry.yarnpkg.com/@interactjs/types/-/types-1.9.7.tgz#6e7a8bc26d99bd5f324312950b948b936f6d42e0"
integrity sha512-Z6fPHp2JjCYg4SJ/DhaIqelY1WA6Oppw87PscOM+28jPc2q5pTUMlFzAY0QQlF43t4PFiCAZVhmBGZzgMfyF0A==
dependencies:
"@interactjs/actions" "1.9.7"
"@interactjs/arrange" "1.9.7"
"@interactjs/auto-scroll" "1.9.7"
"@interactjs/auto-start" "1.9.7"
"@interactjs/core" "1.9.7"
"@interactjs/dev-tools" "1.9.7"
"@interactjs/inertia" "1.9.7"
"@interactjs/modifiers" "1.9.7"
"@interactjs/pointer-events" "1.9.7"
"@interactjs/reflow" "1.9.7"
"@interactjs/snappers" "1.9.7"
"@interactjs/symbol-tree" "1.9.7"
"@interactjs/utils" "1.9.7"
"@interactjs/utils@1.9.7":
version "1.9.7"
resolved "https://registry.yarnpkg.com/@interactjs/utils/-/utils-1.9.7.tgz#390f574c5b8adbf9cc527affb686d9233d241eec"
integrity sha512-7/j0UmeuBHi20FHlqKN9KbndulLEuTiPIPID5nEw+1F/jMKucn3uPIXfruSkbcGswltqTCR0QHhICMLXhFRVhw==
"@interactjs/vue@1.9.7":
version "1.9.7"
resolved "https://registry.yarnpkg.com/@interactjs/vue/-/vue-1.9.7.tgz#9942407a144b4cd9d1f264ccaaf43d75f5a00a60"
integrity sha512-Y1mjCB5tGxsaUkfYP/i1dIoBRnxkDpvZtmfKp38u1SRt3QCfNznKf4252QC7RBTSgIL/Cohi8c/oAq++ZpkTSQ==
"@intervolga/optimize-cssnano-plugin@^1.0.5":
version "1.0.6"
resolved "https://registry.yarnpkg.com/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz#be7c7846128b88f6a9b1d1261a0ad06eb5c0fdf8"
......@@ -1043,6 +1250,13 @@
resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
"@types/echarts@^4.4.3":
version "4.4.3"
resolved "https://registry.yarnpkg.com/@types/echarts/-/echarts-4.4.3.tgz#9a04003c3a70cc6feb38de5220cc1d079f19f2cb"
integrity sha512-HmDmg9hDJQC5KOpNOeVgcaBM+emDiduNyCCHVInDrVVfLDVPuK4fSSISy39kn1HqPa1hYDQ96FIGEhjRNGHhPA==
dependencies:
"@types/zrender" "*"
"@types/events@*":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7"
......@@ -1151,6 +1365,11 @@
dependencies:
"@types/yargs-parser" "*"
"@types/zrender@*":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@types/zrender/-/zrender-4.0.0.tgz#a6806f12ec4eccaaebd9b0d816f049aca6188fbd"
integrity sha512-s89GOIeKFiod2KSqHkfd2rzx+T2DVu7ihZCBEBnhFrzvQPUmzvDSBot9Fi1DfMQm9Odg+rTqoMGC38RvrwJK2w==
"@vue/babel-helper-vue-jsx-merge-props@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.0.0.tgz#048fe579958da408fb7a8b2a3ec050b50a661040"
......@@ -1626,6 +1845,14 @@ address@^1.1.2:
resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6"
integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==
adler-32@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/adler-32/-/adler-32-1.2.0.tgz#6a3e6bf0a63900ba15652808cb15c6813d1a5f25"
integrity sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=
dependencies:
exit-on-epipe "~1.0.1"
printj "~1.1.0"
aggregate-error@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0"
......@@ -2540,6 +2767,16 @@ caseless@~0.12.0:
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
cfb@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/cfb/-/cfb-1.1.4.tgz#81fd35ede4c919d8f0962a94582e1dfaf7051e2a"
integrity sha512-rwFkl3aFO3f+ljR27YINwC0x8vPjyiEVbYbrTCKzspEf7Q++3THdfHVgJYNUbxNcupJECrLX+L40Mjm9hm/Bgw==
dependencies:
adler-32 "~1.2.0"
commander "^2.16.0"
crc-32 "~1.2.0"
printj "~1.1.2"
chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
......@@ -2757,6 +2994,14 @@ code-point-at@^1.0.0:
resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
codepage@~1.14.0:
version "1.14.0"
resolved "https://registry.yarnpkg.com/codepage/-/codepage-1.14.0.tgz#8cbe25481323559d7d307571b0fff91e7a1d2f99"
integrity sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k=
dependencies:
commander "~2.14.1"
exit-on-epipe "~1.0.1"
collection-visit@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
......@@ -2822,16 +3067,21 @@ commander@2.15.1:
resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==
commander@2.17.x:
commander@2.17.x, commander@~2.17.1:
version "2.17.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==
commander@^2.12.1, commander@^2.18.0, commander@^2.19.0, commander@^2.20.0, commander@~2.20.3:
commander@^2.12.1, commander@^2.16.0, commander@^2.18.0, commander@^2.19.0, commander@^2.20.0, commander@~2.20.3:
version "2.20.3"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
commander@~2.14.1:
version "2.14.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa"
integrity sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==
commander@~2.19.0:
version "2.19.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
......@@ -3023,6 +3273,14 @@ cosmiconfig@^5.0.0:
js-yaml "^3.13.1"
parse-json "^4.0.0"
crc-32@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208"
integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==
dependencies:
exit-on-epipe "~1.0.1"
printj "~1.1.0"
create-ecdh@^4.0.0:
version "4.0.3"
resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
......@@ -3696,6 +3954,13 @@ ecc-jsbn@~0.1.1:
jsbn "~0.1.0"
safer-buffer "^2.1.0"
echarts@^4.6.0:
version "4.7.0"
resolved "https://registry.yarnpkg.com/echarts/-/echarts-4.7.0.tgz#5b3875a4c2f91e3929425fabab9eace7e4098b3f"
integrity sha512-NlOTdUcAsIyCCG+N4uh0ZEvXtrPW2jvcuqf03RyqYeCKzyPbiOQ4I3MdKXMhxG3lBdqQNdNXVT71SB4KTQjN0A==
dependencies:
zrender "4.3.0"
editorconfig@^0.15.3:
version "0.15.3"
resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5"
......@@ -3726,6 +3991,13 @@ elegant-spinner@^1.0.1:
resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e"
integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=
element-resize-detector@^1.1.15:
version "1.2.1"
resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.2.1.tgz#b0305194447a4863155e58f13323a0aef30851d1"
integrity sha512-BdFsPepnQr9fznNPF9nF4vQ457U/ZJXQDSNF1zBe7yaga8v9AdZf3/NElYxFdUh7SitSGt040QygiTo6dtatIw==
dependencies:
batch-processor "1.0.0"
element-resize-detector@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.2.0.tgz#63344fd6f4e5ecff6f018d027e17b281fd4fa338"
......@@ -4027,6 +4299,11 @@ exit-hook@^1.0.0:
resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=
exit-on-epipe@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692"
integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==
exit@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
......@@ -4237,6 +4514,11 @@ file-loader@^4.2.0:
loader-utils "^1.2.3"
schema-utils "^2.5.0"
file-saver@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.2.tgz#06d6e728a9ea2df2cce2f8d9e84dfcdc338ec17a"
integrity sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw==
file-uri-to-path@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
......@@ -4383,6 +4665,11 @@ forwarded@~0.1.2:
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
frac@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/frac/-/frac-1.1.2.tgz#3d74f7f6478c88a1b5020306d747dc6313c74d0b"
integrity sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==
fragment-cache@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
......@@ -5046,6 +5333,14 @@ ini@^1.3.4:
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
interactjs@^1.6.3, interactjs@^1.9.4:
version "1.9.7"
resolved "https://registry.yarnpkg.com/interactjs/-/interactjs-1.9.7.tgz#ebcbc3cab9c63f4cd66aa650a5918bcc2aaeeead"
integrity sha512-X8Y4iSeFdy8bnFkbrDJ5C/HwGKCgLUHhOdfvxLsx/f1YlYZ23qBA4aYoB74Qw0CG/mMenYiOFLxbDIaly8hhzQ==
dependencies:
"@interactjs/interactjs" "1.9.7"
"@interactjs/types" "1.9.7"
internal-ip@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907"
......@@ -7879,6 +8174,11 @@ pretty@2.0.0:
extend-shallow "^2.0.1"
js-beautify "^1.6.12"
printj@~1.1.0, printj@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222"
integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==
private@^0.1.6:
version "0.1.8"
resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
......@@ -8072,6 +8372,11 @@ raw-body@2.4.0:
iconv-lite "0.4.24"
unpipe "1.0.0"
raw-loader@~0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa"
integrity sha1-DD0L6u2KAclm2Xh793goElKpeao=
react-is@^16.8.4:
version "16.12.0"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c"
......@@ -8495,6 +8800,13 @@ schema-utils@^2.0.0, schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6
ajv "^6.10.2"
ajv-keywords "^3.4.1"
script-loader@^0.7.2:
version "0.7.2"
resolved "https://registry.yarnpkg.com/script-loader/-/script-loader-0.7.2.tgz#2016db6f86f25f5cf56da38915d83378bb166ba7"
integrity sha512-UMNLEvgOAQuzK8ji8qIscM3GIrRCWN6MmMXGD4SD5l6cSycgGsCo0tX5xRnfQcoghqct0tjHjcykgI1PyBE2aA==
dependencies:
raw-loader "~0.5.1"
select-hose@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
......@@ -8840,6 +9152,13 @@ sprintf-js@~1.0.2:
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
ssf@~0.10.3:
version "0.10.3"
resolved "https://registry.yarnpkg.com/ssf/-/ssf-0.10.3.tgz#8eae1fc29c90a552e7921208f81892d6f77acb2b"
integrity sha512-pRuUdW0WwyB2doSqqjWyzwCD6PkfxpHAHdZp39K3dp/Hq7f+xfMwNAWIi16DyrRg4gg9c/RvLYkJTSawTPTm1w==
dependencies:
frac "~1.1.2"
sshpk@^1.7.0:
version "1.16.1"
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
......@@ -9751,6 +10070,14 @@ vue-class-component@^7.0.2, vue-class-component@^7.1.0:
resolved "https://registry.yarnpkg.com/vue-class-component/-/vue-class-component-7.2.2.tgz#aecc6d28801f64c61eb04407cf3a5476da26b0c0"
integrity sha512-QjVfjRffux0rUBNtxr1hvUxDrfifDvk9q/OSdB/sKIlfxAudDF2E1YTeiEC+qOYIOOBGWkgSKQSnast6H+S38w==
vue-grid-layout@^2.3.7:
version "2.3.7"
resolved "https://registry.yarnpkg.com/vue-grid-layout/-/vue-grid-layout-2.3.7.tgz#d148f013ef2ca9dc1cb5d5298e7966aa50f54431"
integrity sha512-q3FMiuog0hPsK/IUKtlg2A/lwPo86YlLaX9+wEiCTjUU++GabM2o9hDhRVruDJZLUah55iTg8LRttBxrxPv0WQ==
dependencies:
element-resize-detector "^1.1.15"
interactjs "^1.6.3"
vue-hot-reload-api@^2.3.0:
version "2.3.4"
resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2"
......@@ -10074,6 +10401,11 @@ which@^2.0.1:
dependencies:
isexe "^2.0.0"
wmf@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wmf/-/wmf-1.0.2.tgz#7d19d621071a08c2bdc6b7e688a9c435298cc2da"
integrity sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==
word-wrap@~1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
......@@ -10157,6 +10489,20 @@ ws@^7.0.0:
resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.1.tgz#03ed52423cd744084b2cf42ed197c8b65a936b8e"
integrity sha512-sucePNSafamSKoOqoNfBd8V0StlkzJKL2ZAhGQinCfNQ+oacw+Pk7lcdAElecBF2VkLNZRiIb5Oi1Q5lVUVt2A==
xlsx@^0.15.6:
version "0.15.6"
resolved "https://registry.yarnpkg.com/xlsx/-/xlsx-0.15.6.tgz#461f841d6d9ea1a8375e2cd246bf23aece08a1d5"
integrity sha512-7vD9eutyLs65iDjNFimVN+gk/oDkfkCgpQUjdE82QgzJCrBHC4bGPH7fzKVyy0UPp3gyFVQTQEFJaWaAvZCShQ==
dependencies:
adler-32 "~1.2.0"
cfb "^1.1.4"
codepage "~1.14.0"
commander "~2.17.1"
crc-32 "~1.2.0"
exit-on-epipe "~1.0.1"
ssf "~0.10.3"
wmf "~1.0.1"
xml-name-validator@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
......@@ -10298,3 +10644,8 @@ yorkie@^2.0.0:
is-ci "^1.0.10"
normalize-path "^1.0.0"
strip-indent "^2.0.0"
zrender@4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/zrender/-/zrender-4.3.0.tgz#9f056121b20bbae44414d287bf6a119ff7042661"
integrity sha512-Dii6j2bDsPkxQayuVf2DXJeruIB/mKVxxcGRZQ9GExiBd4c3w7+oBuvo1O/JGHeFeA1nCmSDVDs/S7yKZG1nrA==
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册