提交 08dece3a 编写于 作者: tony001's avatar tony001

2020.5.14 更新

上级 56bda869
## v7.0.0-alpha.2 [2020-5-7]
## v7.0.0-alpha.3 [2020-5-14]
### Bug修复
分页导航栏添加图标配置
分页导航栏传递srfparentdename和srfparentkey问题
提交流程、启动流程刷新表格数据问题
修复视图自定义导航参数大小写问题
修复批添加功能
修复树部件查询数据集合异常处理
修复图表排序问题
修复富文本国际化切换失效
修复代码表代码项图标和数据
修复数据多项选择视图UI逻辑不匹配
修复列表高度异常
工具栏按钮样式支持
修复树节点上下文
修复表格(视图)高度,滚动条问题
修复表单loaddraft服务仿真主键丢失修复
修复user显示名称逻辑
修复issue地址为正式环境地址
模态边距样式调整
### 功能新增及优化
#### 模板
表格文件上传信息显示
搜索面板布局优化
批添加、批删除
表格checkbox宽度优化
富文本信息模式
选择类视图不显示标题
更新默认值
补充树节点关系导航上下文,导航参数上下文
看板视图默认卡片模式,支持无缝模式
模态时视图样式调整
树导航样式调整
增加菜单权限
表格样式调整
增加快速分组搜索或快速搜索表单功能
拖拽样式修改
增加表格内置工具栏
代码表多选控件分割符从分号转化为逗号
#### 基础文件
看板视图默认卡片模式,支持无缝模式
登录页面调整
增加数据选择类插件表格呈现插件
## v7.0.0-alpha.2 [2020-5-7]
### Bug修复
分页导航栏添加图标配置
### 功能新增及优化
#### 模板
表格文件上传信息显示
用户名识别
批添加、批删除
实体工作流动态视图
实体工作流动态导航表格视图
富文本信息模式
工具栏按钮样式支持
更新默认值
#### 基础文件
表格文件上传信息显示
模态边距样式调整
实体工作流动态视图
实体工作流动态导航表格视图
## v7.0.0-alpha.1 [2020-4-29]
......
<?xml version="1.0" encoding="UTF-8"?>
<svg width="277px" height="60px" viewBox="0 0 277 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 55.2 (78181) - https://sketchapp.com -->
<title>logo</title>
<desc>Created with Sketch.</desc>
<g id="页面1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Apple-TV" transform="translate(-822.000000, -80.000000)" fill-rule="nonzero">
<g id="logo" transform="translate(822.000000, 80.000000)">
<path d="M84.7587939,33 C84.3400314,33 83.9422129,32.855404 83.5653265,32.5662099 C83.1884404,32.2770158 83,31.9117221 83,31.4703186 C83,30.8006061 83.3517553,30.0547979 84.0552764,29.2328759 C84.7587975,28.4109559 85.4874333,28 86.2412061,28 C86.7437211,28 87.1624774,28.1407903 87.4974874,28.422375 C87.8324974,28.7039598 88,29.1111079 88,29.6438359 C88,30.2983298 87.6566197,31.0213058 86.9698493,31.8127843 C86.2830787,32.6042648 85.5460676,33 84.7587939,33 Z M87,43.1071413 L87,44.8800002 C85.4032842,46.9038197 83.913587,48.4297553 82.5308641,49.4578566 C81.1481411,50.4859558 79.9711982,51 79,51 C77.6501989,51 76.6460938,50.3038162 75.9876542,48.9114271 C75.3292146,47.51904 75,45.9971505 75,44.345713 C75,43.7142826 75.0658429,43.1111916 75.1975308,42.5364271 C75.3292186,41.9616625 75.4855956,41.4880956 75.6666665,41.1157137 C75.8477374,40.7433317 76.1851825,40.1604794 76.6790122,39.3671417 C79.0164725,35.7890278 81.1563689,34 83.0987653,34 C84.1028856,34 84.6049382,34.3804718 84.6049382,35.1414285 C84.6049382,35.6595252 84.2798385,36.4690405 83.6296296,37.5699981 C82.9794205,38.6709579 82.3991795,39.4561863 81.8888887,39.9257136 C80.4567829,41.2857195 79.5226359,42.2328532 79.0864196,42.7671425 C78.6502035,43.3014297 78.4320986,43.9085667 78.4320986,44.5885708 C78.4320986,45.1714317 78.6543186,45.6571409 79.0987654,46.0457134 C79.543212,46.4342859 80.119338,46.62857 80.8271605,46.62857 C81.6008269,46.62857 82.4526703,46.3492873 83.382716,45.7907132 C84.3127617,45.2321392 85.5185111,44.3376253 87,43.1071413 Z M93,51 L93,13 L105.747082,13 C116.805447,13 119.856031,16.3948127 119.856031,23.2391931 C119.856031,27.1815562 118.494163,29.8645533 114.354086,31.0144092 L114.354086,31.2334294 C118.766537,32.3832853 121,35.2853026 121,40.0489914 C121,46.9481268 117.949416,51 106.891051,51 L93,51 Z M101,29 L103.670157,29 C108.853403,29 111,28.1818182 111,24.4727273 C111,20.5454545 108.905759,20 103.670157,20 L101,20 L101,29 Z M101,44 L105.038462,44 C111.211538,44 113,43.1306818 113,39.5 C113,36.1761364 111.269231,35 105.038462,35 L101,35 L101,44 Z M134.5,17 C130.888889,17 130,16.5263158 130,12.9473684 C130,9.36842105 130.888889,9 134.5,9 C138.166667,9 139,9.36842105 139,12.9473684 C139,16.5263158 138.166667,17 134.5,17 Z M130,51 L130,22 L138,22 L138,51 L130,51 Z M147,51 L147,44.3944444 L161.004377,28.5518519 L161.004377,28.2296296 L148.039387,28.2296296 L148.039387,22 L170.851204,22 L170.851204,28.2296296 L156.5186,44.287037 L156.5186,44.6092593 L172,44.6092593 L172,51 L147,51 Z M189.523364,43.7723343 L205,43.7723343 L205,51 L181,51 L181,13 L189.523364,13 L189.523364,43.7723343 Z M225.419162,21 C235.53493,21 239,24.273703 239,30.391771 L239,50.4633274 L231.734531,50.4633274 L230.952096,47.0822898 C229.666667,49.2289803 226.313373,51 221.339321,51 C214.576846,51 211,48.1556351 211,42.1449016 C211,35.4364937 215.303393,33.0214669 223.407186,33.0214669 L230.896208,33.0214669 L230.896208,32.2701252 C230.896208,28.8354204 229.778443,27.4937388 224.469062,27.4937388 C222.289421,27.4937388 220.10978,27.6547406 218.041916,28.0304114 L218.041916,21.4293381 C220.333333,21.1610018 223.239521,21 225.419162,21 Z M222.450704,46 C226.225352,46 228.929577,44.5555556 230,42.5 L230,39 L223.690141,39 C219.633803,39 218,39.6666667 218,42.7222222 C218,45.1111111 219.295775,46 222.450704,46 Z M265.078394,20.4545455 C274.782027,20.4545455 277,26.3454545 277,35.7272727 C277,44.1818182 274.782027,51 265.078394,51 C259.367113,51 257.038241,49.1454545 255.873805,46.3090909 L255.319312,50.4545455 L248,50.4545455 L248,9 L256.040153,9 L256.040153,24.5454545 C257.204589,22.3636364 259.810707,20.4545455 265.078394,20.4545455 Z M262.827731,46 C268.289916,46 269,41.9473684 269,37.0526316 C269,31.8421053 268.180672,28 262.827731,28 C257.420168,28 256,31.3157895 256,37.0526316 C256,42.5263158 257.420168,46 262.827731,46 Z" id="注册iBizLab账号" fill="#333333"></path>
<g id="编组" fill="#01B0FF">
<path d="M33,53.9848293 C39.3232242,53.9848293 45.6616122,53.9848293 52,54 C48.6488428,49.9646018 45.2673584,45.9747155 41.8555467,42 C38.9896249,46.0505689 36.0478851,50.0556258 33,53.9848293 L33,53.9848293 Z M45,37.2539103 C48.4335443,41.4270073 51.7721519,45.6757039 55,50 C54.9525316,40.3383733 55,30.6616267 54.9683544,21 C51.9303797,26.5641293 48.7025316,32.052659 45,37.2539103 L45,37.2539103 Z M21,21 C21.2871111,31.3772333 25.5786667,40.9994895 30.4897778,50 C33.0586667,45.7958142 35.5217778,41.5472179 38,37.2838182 C32.4542222,31.7325166 27.0142222,26.0627871 21,21 L21,21 Z M4.24776231,8 C3.99247773,23.2587549 3.8010143,38.5324254 4.37540459,53.7762646 C11.9062995,54.0894942 19.4531498,53.9701686 27,54 C16.9481699,39.9345006 7.4228642,24.8845655 4.24776231,8 L4.24776231,8 Z M13,5 C22.6175691,13.1440536 31.7201818,21.8107202 40.2472548,31 C44.669822,22.4349525 48.8652025,13.7682858 53,5.07258514 C39.6717152,5.04355109 26.3434305,5.1451703 13,5 L13,5 Z M0,0 L59.7331546,0 C60.0637531,19.995 60.123862,40.005 59.7031002,60 L0,60 L0,0 Z" id="Fill-1"></path>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
......@@ -69,6 +69,8 @@ import AppImagePreview from './components/app-image-preview/app-image-preview.vu
import AppFormatData from './components/app-format-data/app-format-data.vue'
import AppUploadFileInfo from './components/app-upload-file-info/app-upload-file-info.vue'
import ContextMenu from './components/context-menu/context-menu'
import AppColumnFormat from './components/app-column-format/app-column-format.vue'
import AppQuickGroup from './components/app-quick-group/app-quick-group.vue'
// 全局挂载UI实体服务注册中心
window['uiServiceRegister'] = uiServiceRegister;
......@@ -147,5 +149,7 @@ export const AppComponents = {
v.component('app-format-data', AppFormatData);
v.component('app-upload-file-info', AppUploadFileInfo);
v.component('context-menu',ContextMenu);
v.component('app-column-format',AppColumnFormat);
v.component('app-quick-group',AppQuickGroup);
},
};
\ No newline at end of file
......@@ -43,7 +43,7 @@ export default class AppCheckBox extends Vue {
* @type {string}
* @memberof AppCheckBox
*/
@Prop({default:';'}) public valueSeparator?: string;
@Prop({default:','}) public valueSeparator?: string;
/**
* 是否禁用
......@@ -97,28 +97,6 @@ export default class AppCheckBox extends Vue {
}
}
/**
* 分隔符
*
* @type {*}
* @memberof AppCheckBox
*/
@Prop() separator: any;
/**
* 获取分隔符
*
* @readonly
* @memberof AppCheckBox
*/
get currentseparator() {
if (this.separator) {
return this.separator;
} else {
return ';';
}
}
/**
* 选中值
*
......
.app-column-format{
display: inline-block;
}
\ No newline at end of file
<template>
<div class="app-column-format">
{{text}}
</div>
</template>
<script lang="ts">
import { Vue, Component, Prop, Model, Emit, Watch } from "vue-property-decorator";
/**
* 表格列格式化json数组,数据格式为"[{"srfkey":"001","srfmajortext":"TEST1"},{"srfkey":"002","srfmajortext":"TEST2"}......]"
*/
@Component({
})
export default class AppColumnFormat extends Vue {
/**
* 值
* @type {any}
* @memberof AppColumnFormat
*/
@Prop() public value?: any;
/**
* 显示文本
* @type {any}
* @memberof AppColumnFormat
*/
get text(){
if(this.value){
let returnStr:string = "";
let tempData:Array<any> =[];
if(typeof(this.value) === 'string'){
tempData= JSON.parse(this.value);
}else{
tempData = JSON.parse(JSON.stringify(this.value));
}
tempData.forEach((item:any,index:number) =>{
if(index >0){
returnStr +="、";
}
returnStr +=item.srfmajortext;
})
return returnStr;
}else{
return "";
}
}
}
</script>
<style lang='less'>
@import "./app-column-format.less";
</style>
\ No newline at end of file
......@@ -47,6 +47,14 @@ export default class AppFormDRUIPart extends Vue {
*/
@Prop({ default: '' }) public refreshitems!: string;
/**
* 禁止加载
*
* @type {string}
* @memberof AppFormDRUIPart
*/
@Prop({ default: false }) public isForbidLoad!: boolean;
/**
* 关系视图类型
*
......@@ -254,7 +262,9 @@ export default class AppFormDRUIPart extends Vue {
this.blockUIStop();
}
}
this.formDruipart.next({action:'load',data:{srfparentdename:this.parentName,srfparentkey:_paramitem}});
if(!this.isForbidLoad){
this.formDruipart.next({action:'load',data:{srfparentdename:this.parentName,srfparentkey:_paramitem}});
}
}
/**
......
......@@ -123,12 +123,12 @@ export default class AppMpicker extends Vue {
* @param newVal
* @param val
*/
@Watch('curvalue', { deep: true })
@Watch('curvalue', {immediate:true, deep: true })
oncurvalueChange(newVal: any, val: any) {
this.value = [];
this.selectItems = [];
if (newVal) {
this.selectItems = JSON.parse(newVal);
this.selectItems = this.parseValue(JSON.parse(newVal));
this.selectItems.forEach((item: any) => {
this.value.push(item[this.deKeyField]);
let index = this.items.findIndex((i) => Object.is(i[this.deKeyField], item[this.deKeyField]));
......@@ -187,7 +187,7 @@ export default class AppMpicker extends Vue {
let index = this.items.findIndex((item) => Object.is(item[this.deKeyField], select));
if (index >= 0) {
let item = this.items[index];
val.push({ [this.deKeyField]: item[this.deKeyField], [this.deMajorField]: item.text });
val.push({ [this.deKeyField]: item[this.deKeyField], [this.deMajorField]: item[this.deMajorField] });
} else {
index = this.selectItems.findIndex((item: any) => Object.is(item[this.deKeyField], select));
if (index >= 0) {
......@@ -196,7 +196,7 @@ export default class AppMpicker extends Vue {
}
}
});
let value = val.length > 0 ? JSON.stringify(val) : '';
let value = val.length > 0 ? JSON.stringify(this.formatValue(val)) : '';
this.$emit('formitemvaluechange', { name: this.name, value: value });
}
}
......@@ -211,7 +211,7 @@ export default class AppMpicker extends Vue {
let index = this.selectItems.findIndex((item: any) => Object.is(item[this.deKeyField], tag));
if (index >= 0) {
this.selectItems.splice(index, 1);
let value = this.selectItems.length > 0 ? JSON.stringify(this.selectItems) : '';
let value = this.selectItems.length > 0 ? JSON.stringify(this.formatValue(this.selectItems)) : '';
this.$emit('formitemvaluechange', { name: this.name, value: value });
}
}
......@@ -256,13 +256,50 @@ export default class AppMpicker extends Vue {
});
}
if (this.name && this.activeData) {
let value = selects.length > 0 ? JSON.stringify(selects) : '';
let value = selects.length > 0 ? JSON.stringify(this.formatValue(selects)) : '';
this.$emit('formitemvaluechange', { name: this.name, value: value });
}
})
}
}
/**
* 解析值,把srfkey和srfmajortext解析成实体属性名
*
* @param {any[]} value 需要转换的数组
* @memberof AppMpicker
*/
public parseValue(value: any[]){
let result = [];
if(this.deKeyField !== "srfkey" || this.deMajorField !== "srfmajortext"){
value.forEach((item: any) => {
result.push({[this.deMajorField]: item.srfmajortext, [this.deKeyField]: item.srfkey});
});
}else{
result = value;
}
return result;
}
/**
* 格式化值,把实体属性名格式化成srfkey和srfmajortext
*
* @param {any[]} value 需要转换的数组
* @memberof AppMpicker
*/
public formatValue(value: any[]){
let result = [];
if(this.deKeyField !== "srfkey" || this.deMajorField !== "srfmajortext"){
value.forEach((item: any) => {
result.push({srfmajortext : item[this.deMajorField], srfkey : item[this.deKeyField]});
});
}else{
result = value;
}
return result;
}
}
</script>
<style lang="less">
......
.app-quick-group{
padding: 4px;
background-color: #F1F1F1;
.app-quick-item{
margin-right: 8px;
padding: 8px;
cursor: pointer;
.app-quick-item-label{
margin-left:4px;
}
.app-seleted-item{
display: inline-block;
font-weight: 700;
color: #0c64eb !important;
padding: 4px;
border-bottom: 2px solid;
}
.app-seleted-item:focus {
outline: none;
}
.app-quick-item-counter{
border-radius: 12px;
padding-left: 4px;
font-size: 12px;
font-weight: 400;
vertical-align: middle;
display: inline-block;
width: 18px;
height: 18px;
margin-left: 4px;
background-color: #ddd;
}
}
.app-quick-item :hover{
color: #0c64eb !important;
}
}
\ No newline at end of file
<template>
<div class="app-quick-group">
<span class="app-quick-item" v-for="item in renderArray" :key="item.id" @click="handleClick(item)">
<span v-if="!item.children" :style="{color:item.color}" :class="{'app-seleted-item':isSelectedItem(item)}">
<i v-if=" item.iconcls && !Object.is(item.iconcls, '')" :class="item.iconcls"></i>
<img v-else-if="item.icon && !Object.is(item.icon, '')" :src="item.icon" />
<span class="app-quick-item-label">{{item.label}}</span>
<span v-show="isSelectedItem(item) && counterService && counterService.counterData && counterService.counterData[item.codename]" class="app-quick-item-counter">{{itemTag(item)}}</span>
</span>
<el-dropdown v-if="item.children" style="outline: none !important;" trigger="click" @command="handleCommand($event,item)">
<span :style="{color:item.color}" :class="{'app-seleted-item':isSelectedItem(item)}">
<i v-if=" item.iconcls && !Object.is(item.iconcls, '')" :class="item.iconcls"></i>
<img v-else-if="item.icon && !Object.is(item.icon, '')" :src="item.icon" />
<span class="app-quick-item-label">{{item.label}}</span>
<span v-show="isSelectedItem(item) && counterService && counterService.counterData && counterService.counterData[item.codename]" class="app-quick-item-counter">{{itemTag(item)}}</span>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item v-for="childitem in item.children" :command="childitem" :key="childitem.id">
<span :style="{color:childitem.color}">
<i v-if=" childitem.iconcls && !Object.is(childitem.iconcls, '')" :class="childitem.iconcls"></i>
<img v-else-if="childitem.icon && !Object.is(childitem.icon, '')" :src="childitem.icon" />
<span :style="{color:(childitem.label == item.label)?'#0c64eb':''}">{{childitem.label}}</span>
</span>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</span>
</div>
</template>
<script lang="ts">
import { Vue, Component, Prop, Model, Emit } from "vue-property-decorator";
@Component({})
export default class AppQuickGroup extends Vue {
/**
* 传入渲染项
*
* @type {Array<any>}
* @memberof AppQuickGroup
*/
@Prop() public items!:Array<any>;
/**
* 计数器服务名
*
* @type {string}
* @memberof AppQuickGroup
*/
@Prop() public counterService?:any;
/**
* UI选中项
*
* @type {*}
* @memberof AppQuickGroup
*/
public selectedUiItem:any;
/**
* 传入渲染项
*
* @type {Array<any>}
* @memberof AppQuickGroup
*/
get renderArray(){
if(this.items && this.items.length >0){
this.selectedUiItem = this.items[0];
this.handleClick(this.items[0]);
return this.handleDataSet(this.items)
}else{
return [];
}
}
public itemTag(item:any){
if(this.counterService && this.counterService.counterData && item.codename){
return this.counterService.counterData[item.codename];
}else{
return "";
}
}
/**
* 是否选中当前项
*
* @param item 传入当前项
* @memberof AppQuickGroup
*/
public isSelectedItem(item:any){
if(this.selectedUiItem && (this.selectedUiItem.id === item.id)){
return true;
}else{
return false;
}
}
/**
* 处理代码表返回数据(树状结构)
*
* @param result 返回数组
* @memberof AppQuickGroup
*/
public handleDataSet(result:Array<any>){
let list:Array<any> = [];
if(result.length === 0){
return list;
}
result.forEach((codeItem:any) =>{
if(!codeItem.pvalue){
let valueField:string = codeItem.value;
this.setChildCodeItems(valueField,result,codeItem);
list.push(codeItem);
}
})
return list;
}
/**
* 处理非根节点数据
*
* @param pValue 父值
* @param result 返回数组
* @param codeItem 代码项
* @memberof AppQuickGroup
*/
public setChildCodeItems(pValue:string,result:Array<any>,codeItem:any){
result.forEach((item:any) =>{
if(item.pvalue == pValue){
let valueField:string = item.value;
this.setChildCodeItems(valueField,result,item);
if(!codeItem.children){
codeItem.children = [];
}
codeItem.children.push(item);
}
})
}
/**
* 处理点击事件
*
* @param $event 值
* @param isswitch 是否切换UI选中项
* @memberof AppQuickGroup
*/
public handleClick($event:any,isswitch:boolean = true){
this.$emit('valuechange',$event);
if(isswitch){
this.selectedUiItem = $event;
}
this.$forceUpdate();
}
/**
* 处理子项点击事件
*
* @param $event 值
* @param item 父值
* @memberof AppQuickGroup
*/
public handleCommand($event:any,item:any){
item.label = $event.label;
item.codename = $event.codename;
this.handleClick($event,false);
}
}
</script>
<style lang='less'>
@import "./app-quick-group.less";
</style>
\ No newline at end of file
......@@ -26,94 +26,112 @@ const tinymceCode:any = tinymce;
@Component({})
export default class AppRichTextEditor extends Vue {
/**
* 传入值
*
* @type {*}
* @memberof AppRichTextEditor
*/
@Prop() value?: any;
/**
* 监听value值
*/
@Watch('value', { immediate: true, deep: true })
oncurrentContent(newval: any, val: any) {
if (newval) {
if(this.editor){
tinymceCode.remove('#' + this.id);
}
this.init(newval);
}
}
/**
* 输入name
*
* @type {string}
* @memberof AppRichTextEditor
*/
@Prop() name?: string;
/**
* 输入高度
*
* @type {*}
* @memberof AppRichTextEditor
*/
@Prop() height?: any;
/**
* 是否禁用
*
* @type {boolean}
* @memberof AppRichTextEditor
*/
@Prop() disabled?: any;
/**
* 当前语言,默认中文
*/
public langu: any = localStorage.getItem('local') ? localStorage.getItem('local') : 'zh_CN' ;
@Prop() disabled?: boolean;
/**
* 监听语言变化
*/
@Watch('$i18n.locale')
onLocaleChange(newval: any, val: any) {
console.log("语言变更"+newval)
this.langu = newval;
if(this.editor){
tinymceCode.remove('#' + this.id);
}
this.init('');
}
/**
* 语言映射文件
* 表单状态
*
* @type {Subject<any>}
* @memberof AppRichTextEditor
*/
public languMap:any = {
'zh-CN': 'zh_CN',
'en-US': 'en_US',
};
@Prop() public formState?: Subject<any>;
/**
* 上传文件路径
*
* @type {string}
* @memberof AppRichTextEditor
*/
public uploadUrl = Environment.BaseUrl + Environment.UploadFile;
/**
* 下载路径
*
* @type {string}
* @memberof AppRichTextEditor
*/
public downloadUrl = Environment.BaseUrl + Environment.ExportFile;
/**
* 当前富文本
*
* @type {*}
* @memberof AppRichTextEditor
*/
public editor: any = null;
/**
* 当前富文本id
*
* @type {string}
* @memberof AppRichTextEditor
*/
id: string = this.$util.createUUID();
public id: string = this.$util.createUUID();
/**
* 表单状态
*
* @type {Subject<any>}
* 当前语言,默认中文
*
* @type {*}
* @memberof AppRichTextEditor
*/
@Prop() public formState?: Subject<any>;
public langu: any = localStorage.getItem('local') ? localStorage.getItem('local') : 'zh_CN' ;
/**
* 语言映射文件
*
* @type {*}
* @memberof AppRichTextEditor
*/
public languMap:any = {
'zh-CN': 'zh_CN',
'en-US': 'en_US',
};
/**
* 是否处于激活状态
*
* @type {boolean}
* @memberof AppRichTextEditor
*/
public isActived:boolean = true;
/**
* 是否需要初始化
*
* @type {boolean}
* @memberof AppRichTextEditor
*/
public isNeedInit:boolean = false;
/**
* 生命周期
......@@ -125,40 +143,92 @@ export default class AppRichTextEditor extends Vue {
this.formState.subscribe(({ type, data }) => {
if (Object.is('load', type)) {
if (!this.value) {
if(this.editor){
tinymceCode.remove('#' + this.id);
}
this.init(this.value);
this.init();
}
}
});
}
}
/**
* 生命周期:激活
*
* @memberof AppRichTextEditor
*/
public activated(){
this.isActived = true;
if(this.isNeedInit){
this.init();
this.isNeedInit = false;
}
}
/**
* 初始化富文本
* 生命周期:缓存
*
* @memberof AppRichTextEditor
*/
public deactivated(){
this.isActived = false;
}
/**
* 生命周期:初始化富文本
*
* @memberof AppRichTextEditor
*/
public mounted() {
this.init('');
this.init();
}
/**
* 销毁富文本
* 生命周期:销毁富文本
*
* @memberof AppRichTextEditor
*/
public destoryed(){
tinymceCode.remove(this.editor);
if(this.editor){
tinymceCode.remove('#' + this.id);
}
}
/**
* 监听value值
*
* @memberof AppRichTextEditor
*/
@Watch('value', { immediate: true, deep: true })
oncurrentContent(newval: any, val: any) {
if (newval) {
this.init();
}
}
/**
* 监听语言变化
*/
@Watch('$i18n.locale')
onLocaleChange(newval: any, val: any) {
this.langu = newval;
if(this.isActived){
this.init();
}else{
this.isNeedInit = true;
}
}
/**
* 初始化富文本
* @param val
*
* @memberof AppRichTextEditor
*/
public init(val: any) {
public init() {
this.destoryed();
let richtexteditor = this;
tinymceCode.init({
selector: '#' + this.id,
selector: '#' + richtexteditor.id,
width: 'calc( 100% - 2px )',
height: this.height,
height: richtexteditor.height,
min_height: 400,
branding: false,
plugins: ['link', 'paste', 'table', 'image', 'codesample', 'code', 'fullscreen', 'preview'],
......@@ -177,13 +247,13 @@ export default class AppRichTextEditor extends Vue {
paste_data_images: true,
codesample_content_css: 'assets/tinymce/prism.css',
skin_url: './assets/tinymce/skins/lightgray',
language_url: './assets/tinymce/langs/' + this.languMap[this.langu] + '.js',
language:this.languMap[this.langu],
language_url: './assets/tinymce/langs/' + richtexteditor.languMap[richtexteditor.langu] + '.js',
language:richtexteditor.languMap[richtexteditor.langu],
setup: (editor: any) => {
this.editor = editor;
richtexteditor.editor = editor;
editor.on('blur', () => {
const content = editor.getContent();
this.$emit('change', content);
richtexteditor.$emit('change', content);
});
},
images_upload_handler: (bolbinfo: any, success: any, failure: any) => {
......@@ -202,13 +272,13 @@ export default class AppRichTextEditor extends Vue {
});
},
init_instance_callback: (editor: any) => {
this.editor = editor;
let value = (this.value && this.value.length > 0) ? this.value : '';
if (this.editor) {
this.editor.setContent(value);
richtexteditor.editor = editor;
let value = (richtexteditor.value && richtexteditor.value.length > 0) ? richtexteditor.value : '';
if (richtexteditor.editor) {
richtexteditor.editor.setContent(value);
}
if (this.disabled) {
this.editor.setMode('readonly');
if (richtexteditor.disabled) {
richtexteditor.editor.setMode('readonly');
}
}
});
......@@ -216,8 +286,10 @@ export default class AppRichTextEditor extends Vue {
/**
* 上传文件
* @param url
* @param formData
*
* @param url 路径
* @param formData 文件对象
* @memberof AppRichTextEditor
*/
public uploadFile(url: string, formData: any) {
let _this = this;
......
......@@ -55,14 +55,14 @@ export default class AppSpan extends Vue {
* @type {boolean}
* @memberof AppSpan
*/
@Prop({default:"、"}) public textSeparator?: string;
@Prop({default:'、'}) public textSeparator?: string;
/**
* 值分隔符
* @type {boolean}
* @memberof AppSpan
*/
@Prop({default:";"}) public valueSeparator?: string;
@Prop({default:','}) public valueSeparator?: string;
/**
* 监控表单属性 data 值
......@@ -108,6 +108,11 @@ export default class AppSpan extends Vue {
public load(){
if(!this.value || this.tag){
return; //代码表走codelist组件
}else if(this.editorType === "ADDRESSPICKUP"){
JSON.parse(this.value).forEach((item:any,index:number) => {
this.text += index === 0 ? item.srfmajortext : ","+item.srfmajortext;
});
}else{
this.text = this.value;
}
......
......@@ -64,6 +64,12 @@ export default class AppUser extends Vue {
_user.avatar = this.$store.getters.getAppData().context.srfusericonpath;
}
}
if(localStorage.getItem("user")){
let user:any = JSON.parse(localStorage.getItem("user") as string);
if(user && user.personname){
_user.name = user.personname;
}
}
Object.assign(this.user,_user,{
time: +new Date
});
......
......@@ -61,14 +61,14 @@ export default class CodeList extends Vue {
* @type {boolean}
* @memberof SelectPicker
*/
@Prop({default:"、"}) public textSeparator?: string;
@Prop({default:'、'}) public textSeparator?: string;
/**
* 值分隔符
* @type {boolean}
* @memberof SelectPicker
*/
@Prop({default:";"}) public valueSeparator?: string;
@Prop({default:','}) public valueSeparator?: string;
/**
* 是否为空
......
......@@ -60,7 +60,7 @@ export default class DropDownListMpicker extends Vue {
* @type {string}
* @memberof DropDownListMpicker
*/
@Prop({default:';'}) public valueSeparator?: string;
@Prop({default:','}) public valueSeparator?: string;
/**
* 是否禁用
......
.login{
width: 100vh;
height: 100vh;
// background-image: url('../assets/images/login_bg.jpg');
background-size: cover;
background-position: center;
position: relative;
> img{
width: 100vw;
height: 100vh;
}
.login-logo{
position: fixed;
left: 80px;
top: 80px;
}
.login-content{
position: fixed;
left: 10%;
top: 30%;
width: 60%;
>span{
color: #fff;
font-size: 84px;
}
}
&-con{
position: fixed;
right: 160px;
top: 50%;
transform: translateY(-60%);
width: 300px;
.ivu-card-head {
padding: 14px 6px;
>p{
line-height: 20px;
font-size: 14px;
color: #17233d;
font-weight: 700;
}
}
&-header{
font-size: 16px;
font-weight: 300;
......
<template>
<div class='login'>
<img src="/assets/img/login_bg.png"/>
<div class="login-logo">
<img src ="/assets/img/logo.svg"/>
</div>
<div class="login-content">
<span>{{appTitle}}</span>
</div>
<div class='login-con'>
<card :bordered="false">
<p slot='title'>
......@@ -55,7 +62,15 @@ export default class Login extends Vue {
* @type {*}
* @memberof Login
*/
public form: any = { loginname: null, password: null };
public form: any = { loginname: 'guest', password: 'guest' };
/**
* 应用标题
*
* @type {string}
* @memberof Login
*/
public appTitle:string = Environment.AppTitle;
/**
* 值规则
......@@ -118,8 +133,12 @@ export default class Login extends Vue {
post.then((response: any) => {
if (response && response.status === 200) {
const data = response.data;
localStorage.setItem('token', data.token);
localStorage.setItem('user', JSON.stringify(data.user));
if(data && data.token){
localStorage.setItem('token', data.token);
}
if(data && data.user){
localStorage.setItem('user', JSON.stringify(data.user));
}
const url: any = this.$route.query.redirect ? this.$route.query.redirect : '*';
this.$router.push({ path: url });
}
......
......@@ -192,6 +192,7 @@ export class AppHeaderMenus extends Vue {
* @memberof AppHeaderMenus
*/
protected renderMenuItem(item: any): any {
item.class = item.class ? item.class : "";
if (Object.is(this.mode, 'default')) {
if (item.caption && !Object.is(item.caption, '')) {
return <div class={"app-header-menu-item text"+item.class} disabled={item.disabled} on-click={() => this.menuClick(item)}>
......
......@@ -154,7 +154,7 @@ body {
.dashboard{
padding: 8px;
}
.portlet-container{
.portlet-card, .portlet-container{
background: #efefef;
}
.portlet-container::after{
......
......@@ -116,7 +116,7 @@ export class AppLayout extends Vue {
if (Object.is(this.layoutMode, 'VIEW') && Object.is(this.openMode, 'DEFAULT')) {
Object.assign(this.className, { 'crm-app-view': true, 'no-caption-bar': (!this.isShowCaptionBar && !this.isShowToolbar) });
return <div class={this.className}>
{(!this.isShowCaptionBar && !this.isShowToolbar) ? null : <div class="crm-app-view-header-wrapper">
{(!this.isShowCaptionBar && !this.isShowToolbar) ? null : <div class="crm-app-view-header-wrapper">
{this.isShowCaptionBar ? <div class="crm-app-view-header-left-wrapper">
{this.$slots.headerLeft}
</div> : null}
......
......@@ -117,6 +117,9 @@ export default class MDViewEngine extends ViewEngine {
if (Object.is(eventName, 'load')) {
this.onSearchFormLoad(args);
}
if (Object.is(eventName, 'search')) {
this.onSearchFormLoad(args);
}
}
/**
......@@ -157,6 +160,20 @@ export default class MDViewEngine extends ViewEngine {
this.isLoadDefault = true;
}
/**
* 搜索表单搜索
*
* @param {*} [args={}]
* @memberof MDViewEngine
*/
public onSearchFormSearch(args: any = {}): void {
if (this.getMDCtrl() && this.isLoadDefault) {
const tag = this.getMDCtrl().name;
this.setViewState2({ tag: tag, action: 'load', viewdata: this.view.viewparams });
}
this.isLoadDefault = true;
}
/**
* 处理实体界面行为
*
......@@ -372,6 +389,15 @@ export default class MDViewEngine extends ViewEngine {
if (this.view && !this.view.isExpandSearchForm) {
Object.assign(arg, { query: this.view.query });
}
// 快速分组和快速搜索栏
let otherQueryParam:any = {};
if(this.view && this.view.qucikGroupData){
Object.assign(otherQueryParam,this.view.qucikGroupData);
}
if(this.view && this.view.qucikFormData){
Object.assign(otherQueryParam,this.view.qucikFormData);
}
Object.assign(arg,{viewparams:otherQueryParam});
}
/**
......
......@@ -14,7 +14,7 @@ mock.onPost('v7/login').reply((config: any) => {
} catch (error) {
status = 400;
}
if (!Object.is(user.loginname, 'ibzadmin') || !Object.is(user.password, '123456')) {
if (!Object.is(user.loginname, 'guest') || !Object.is(user.password, 'guest')) {
status = 400;
}
if (status !== 200) {
......
......@@ -587,12 +587,12 @@ export default class EntityService {
* createBatch接口方法
*
* @param {*} [context={}]
* @param {*} [data={}]
* @param {*} [data]
* @param {boolean} [isloading]
* @returns {Promise<any>}
* @memberof EntityService
*/
public async createBatch(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
public async createBatch(context: any = {},data: any, isloading?: boolean): Promise<any> {
return Http.getInstance().post(`/${this.APPDENAME}/batch`,data,isloading);
}
......@@ -600,12 +600,12 @@ export default class EntityService {
* updateBatch接口方法
*
* @param {*} [context={}]
* @param {*} [data={}]
* @param {*} [data]
* @param {boolean} [isloading]
* @returns {Promise<any>}
* @memberof EntityService
*/
public async updateBatch(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
public async updateBatch(context: any = {},data: any, isloading?: boolean): Promise<any> {
return Http.getInstance().put(`/${this.APPDENAME}/batch`,data,isloading);
}
......@@ -613,12 +613,12 @@ export default class EntityService {
* removeBatch接口方法
*
* @param {*} [context={}]
* @param {*} [data={}]
* @param {*} [data]
* @param {boolean} [isloading]
* @returns {Promise<any>}
* @memberof EntityService
*/
public async removeBatch(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
public async removeBatch(context: any = {},data: any, isloading?: boolean): Promise<any> {
return Http.getInstance().delete(`/${this.APPDENAME}/batch`,isloading,data);
}
......
......@@ -7,6 +7,7 @@ import * as mutations from './mutations';
import * as getters from './getters';
import viewaction from './modules/view-action'
import unifiedresource from './modules/unified-resource'
const state = {
...rootstate
......@@ -20,7 +21,8 @@ const store = new Vuex.Store({
mutations,
getters,
modules: {
viewaction
viewaction,
unifiedresource
},
});
......
/**
* 提交统一资源数据
*
* @param param0
* @param data
*/
export const commitResourceData = ({ commit, state }: { commit: any, state: any }, { unires, enablepermissionvalid }: { unires: Array<any>, enablepermissionvalid: boolean }) => {
if(unires && unires.length > 0){
commit('setResourceData', unires);
}
if(enablepermissionvalid){
commit('setEnablePermissionValid', enablepermissionvalid);
}
}
\ No newline at end of file
/**
* 判断指定统一资源是否存在
*
* @param state
*/
export const getResourceData = (state: any) => (resourcetag: string) => {
let itemIndex: any = state.resourceData.findIndex((obj: any, objIndex: any, objs: any) => {
return Object.is(obj.unirescode, resourcetag);
})
return itemIndex === -1 ? false : true;
}
/**
* 获取是否开启权限认证
*
* @param state
*/
export const getEnablePermissionValid = (state: any) => {
return state.enablePermissionValid;
}
\ No newline at end of file
import { resourcestate } from './state';
import * as actions from './actions';
import * as mutations from './mutations';
import * as getters from './getters';
const state = {
...resourcestate
}
export default {
namespaced: true,
state,
getters,
actions,
mutations
}
\ No newline at end of file
/**
* 设置统一资源数据
*
* @param state
* @param resourceArray
*/
export const setResourceData = (state: any, resourceArray:Array<any>) => {
if(resourceArray && resourceArray.length === 0){
return;
}
state.resourceData = resourceArray;
}
/**
* 设置是否开启权限认证
*
* @param state
* @param resourceArray
*/
export const setEnablePermissionValid = (state: any, enablepermissionvalid:boolean) => {
state.enablePermissionValid = enablepermissionvalid;
}
/**
* 所有资源状态
*/
export const resourcestate: any = {
// 统一资源数据
resourceData: [],
// 是否开启权限认证
enablePermissionValid: false
}
\ No newline at end of file
......@@ -10,6 +10,9 @@
.ivu-modal-body {
padding: 0 10px;
height: calc(100% - 52px);
.view-container{
padding: 15px;
}
}
}
}
......
......@@ -53,9 +53,21 @@ export class AuthGuard {
const get: Promise<any> = Http.getInstance().get(url);
get.then((response: any) => {
if (response && response.status === 200) {
const { data }: { data: any } = response;
let { data }: { data: any } = response;
if (data) {
// token认证把用户信息放入应用级数据
if(localStorage.getItem('user')){
let user:any = JSON.parse(localStorage.getItem('user') as string);
let localAppData:any = {};
if(user.sessionParams){
localAppData = {context:user.sessionParams};
Object.assign(localAppData,data);
}
data = JSON.parse(JSON.stringify(localAppData));
}
router.app.$store.commit('addAppData', data);
// 提交统一资源数据
router.app.$store.dispatch('unifiedresource/commitResourceData', data);
}
}
resolve(true);
......
......@@ -78,7 +78,7 @@ export class Http {
axios({
method: 'post',
url: url,
data: { ...params },
data: params,
headers: { 'Content-Type': 'application/json;charset=UTF-8', 'Accept': 'application/json' },
// transformResponse: [(data: any) => {
// let _data: any = null;
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册