centaline-data-driven 1.6.56 → 1.6.58

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -70,6 +70,7 @@ const paths = {
70
70
  "dynamicAppContainer": "./src/centaline/dynamicAppContainer/index.js", //
71
71
  "dynamicSteps": "./src/centaline/dynamicSteps/index.js", //步骤控件
72
72
  "dynamicLocation": "./src/centaline/dynamicLocation/index.js", //经纬度获取控件
73
+ "dynamicJsonViewer": "./src/centaline/dynamicJsonViewer/index.js", //json 数据查看控件
73
74
  },
74
75
  "plugs": {
75
76
  "api": "./src/centaline/api/index.js", //调用API插件
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "centaline-data-driven",
3
- "version": "1.6.56",
3
+ "version": "1.6.58",
4
4
  "description": "ccai",
5
5
  "author": "hjc <3226136347@qq.com>",
6
6
  "private": false,
@@ -25,6 +25,7 @@
25
25
  "vue": "2.5.17",
26
26
  "vue-baidu-map": "^0.21.22",
27
27
  "vue-cropper": "^0.5.8",
28
+ "vue-json-viewer": "^2.2.22",
28
29
  "vue-ueditor-wrap": "^2.5.6",
29
30
  "vuedraggable": "^2.24.3"
30
31
  },
package/release-log.md CHANGED
@@ -1,3 +1,31 @@
1
+ # v1.6.58
2
+ 2025-12-01
3
+
4
+ 新增
5
+
6
+ 表单页面添加bottomTip,显示在页面底部并且悬停,支持html
7
+
8
+ 添加 json 数据查看控件
9
+
10
+ 优化
11
+
12
+ 敏感信息查看控件调整,请求参数添加支持直接获取
13
+
14
+ 表单界面的下部的操作按钮统一固定于界面底部
15
+
16
+ 表单页面分组水平布局时,是否固定 分组tab(默认 false)
17
+
18
+ # v1.6.57
19
+ 2025-11-07
20
+
21
+ 优化
22
+
23
+ ActionType添加执行客户端函数ExcuteClientFunction
24
+
25
+ BUG
26
+
27
+ 列表关闭右侧会出现滚动条处理
28
+
1
29
  # v1.6.56
2
30
  2025-10-24
3
31
 
package/src/Form.vue CHANGED
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <div id="form-app" class="data-driven" style="width:100%;height:100%;overflow:auto">
3
3
  <!-- <ct-form :source="formdata.content" :apiParam="apiParam"></ct-form> -->
4
- <ct-form :api="'/api/third-dept-tran/transaction/edit'" :apiParam="apiParam" :topHeight="topHeight" :documentHeight="'600px'"></ct-form>
4
+ <ct-form :api="'/salemanage/ContractByPoint/readDetail'" :apiParam="apiParam" :topHeight="topHeight" :documentHeight="'600px'"></ct-form>
5
5
  <ct-dialog-list></ct-dialog-list>
6
6
  </div>
7
7
  </template>
@@ -12,7 +12,7 @@
12
12
  data() {
13
13
  return {
14
14
  apiParam:{
15
- "originalTraId":"1913105048579919873","actionType":3,"pageStyle":2,"pageTitle":"修改成交单","pageOnly":true
15
+ "commissionMode":1,"contractId":"251120105528E09634DE592A4DF8A326","propertyId":"250522090514A8BF158FF92A43479EA6","searchFields":{"fields":[{"fieldName1":"CompanyPath","groupName":"CompanyPath","operation":1,"searchDataType":1,"searchValue1":"001"},{"fieldName1":"EmpID","groupName":"EmpID","operation":1,"searchDataType":1,"searchValue1":"20201030134831BAA0AC5CDC9344B21E"},{"fieldName1":"DeptPath","groupName":"DeptPath","operation":1,"searchDataType":1,"searchValue1":"001.200.063.001"},{"fieldName1":"type","groupName":"type","operation":1,"searchDataType":1,"searchValue1":"left"},{"fieldName1":"EstateID","groupName":"EstateID","operation":2,"searchDataType":3,"searchValue1":"2411211358417B58943C6E954B35BB56"}]},"pageAttribute":{"pageIndex":1},"columnName":"contractDate","actionType":3
16
16
  },
17
17
  topHeight:10,
18
18
  }
@@ -21,6 +21,8 @@
21
21
 
22
22
  <!-- CCES -->
23
23
  <!-- <ct-searchlist :apiParam="para" :searchConditionApi="'/salemattersmanage/agentuserlist/getLayoutOfSearch'" :searchDataApi="'/salemattersmanage/agentuserlist/getList'"></ct-searchlist> -->
24
+ <!-- <ct-searchlist :apiParam="para" :searchConditionApi="'/buildinginfo/getLayoutOfSearch'" :searchDataApi="'/buildinginfo/getList'"></ct-searchlist> -->
25
+ <!-- <ct-searchlist :apiParam="para" :searchConditionApi="'/roomtypelist/getLayoutOfSearch'" :searchDataApi="'/roomtypelist/getList'"></ct-searchlist> -->
24
26
  <!-- <ct-searchlist :apiParam="para" :searchConditionApi="'/contractmanage/ContractList/getLayoutOfSearch'" :searchDataApi="'/contractmanage/ContractList/getList'"></ct-searchlist> -->
25
27
  <!-- <ct-searchlist :apiParam="para" :searchConditionApi="'/sunexpensemanage/sunexpenserecordlist/getLayoutOfSearch'" :searchDataApi="'/sunexpensemanage/sunexpenserecordlist/getList'"></ct-searchlist> -->
26
28
  <!-- <ct-searchlist :apiParam="para" :searchConditionApi="'/workwxmanage/WorkWXApplicationList/getLayoutOfSearch'" :searchDataApi="'/workwxmanage/WorkWXApplicationList/getList'"></ct-searchlist> -->
@@ -33,11 +35,11 @@
33
35
  <!-- <ct-searchlist :apiParam="para" :searchConditionApi="'/customerquery/publiccustcalltaskreferrallist/getLayoutOfSearch'" :searchDataApi="'/customerquery/publiccustcalltaskreferrallist/getList'"></ct-searchlist> -->
34
36
  <!-- <ct-searchlist :apiParam="para" :searchConditionApi="'/salemattersmanage/agentuserlist/getLayoutOfSearch'" :searchDataApi="'/salemattersmanage/agentuserlist/getList'"></ct-searchlist> -->
35
37
  <!-- <ct-searchlist :apiParam="para" :searchConditionApi="'/salemattersmanage/EntranceNoticeInfoList/getLayoutOfSearch'" :searchDataApi="'/salemattersmanage/EntranceNoticeInfoList/getList'"></ct-searchlist> -->
38
+ <!-- <ct-searchlist :apiParam="para" :searchConditionApi="'/salemattersmanage/squareuploadlist/getLayoutOfSearch'" :searchDataApi="'/salemattersmanage/squareuploadlist/getList'"></ct-searchlist> -->
36
39
  <!-- <ct-searchlist :apiParam="para" :searchConditionApi="'/commissionquery/properformanceszjjbreport/getLayoutOfSearch'" :searchDataApi="'/commissionquery/properformanceszjjbreport/getList'"></ct-searchlist> -->
37
40
  <!-- <ct-searchlist :apiParam="para" :searchConditionApi="'/employeelist/getLayoutOfSearch'" :searchDataApi="'/employeelist/getList'"></ct-searchlist> -->
38
41
  <!-- <ct-searchlist :apiParam="para" :searchConditionApi="'/estatemanage/estatlist/getLayoutOfSearch'" :searchDataApi="'/estatemanage/estatlist/getList'"></ct-searchlist> -->
39
42
  <!-- <ct-searchlist :apiParam="para" :searchConditionApi="'/system/AreaList/getLayoutOfSearch'" :searchDataApi="'/system/AreaList/getList'"></ct-searchlist> -->
40
- <!-- <ct-searchlist :apiParam="para" :searchConditionApi="'/roomtypelist/getLayoutOfSearch'" :searchDataApi="'/roomtypelist/getList'"></ct-searchlist> -->
41
43
  <!-- <ct-searchlist :apiParam="para" :searchConditionApi="'/salemattersmanage/priceuploadlist/getLayoutOfSearch'" :searchDataApi="'//salemattersmanage/priceuploadlist/getList'"></ct-searchlist> -->
42
44
  <!-- <ct-searchlist :apiParam="para" :searchConditionApi="'/app/workbenchdetails/getContractLayoutOfSearch'" :searchDataApi="'/app/workbenchdetails/getContractList'"></ct-searchlist> -->
43
45
  <!-- <ct-searchlist :apiParam="para" :searchConditionApi="'/selectionactivitymanage/EvaluationActWorksList/getLayoutOfSearch'" :searchDataApi="'/selectionactivitymanage/EvaluationActWorksList/getListOfSearchModel'"></ct-searchlist> -->
@@ -125,7 +127,8 @@
125
127
  <!-- <ct-searchlist :appRootUrl="appRootUrl" :searchConditionApi="'/TrainingAllowanceTotalList/getLayoutOfSearch'" :searchDataApi="'/TrainingAllowanceTotalList/getListOfSearchModel'"></ct-searchlist> -->
126
128
 
127
129
  <!-- ibs -->
128
- <ct-searchlist :appRootUrl="appRootUrl" :searchConditionApi="'/EmployeeWorkLogList/ind/getLayoutOfSearch'" :searchDataApi="'/EmployeeWorkLogList/ind/getListOfSearchModel'"></ct-searchlist>
130
+ <!-- <ct-searchlist :appRootUrl="appRootUrl" :searchConditionApi="'/EmployeeWorkLogList/ind/getLayoutOfSearch'" :searchDataApi="'/EmployeeWorkLogList/ind/getListOfSearchModel'"></ct-searchlist> -->
131
+ <ct-searchlist :appRootUrl="appRootUrl" :searchConditionApi="'/ApiAccessLogList/getLayoutOfSearch'" :searchDataApi="'/ApiAccessLogList/getListOfSearchModel'"></ct-searchlist>
129
132
  <ct-dialog-list></ct-dialog-list>
130
133
  </div>
131
134
  </template>
@@ -1,6 +1,6 @@
1
1
  <template>
2
- <div v-loading="loading" :style="{width:pageWidth?pageWidth+'px':'100%',margin:'auto','min-height': minHeight}">
3
- <div v-if="model !== null && !loading" class="ct-form" :class="{'domDisabled':model.pageDisabled}" :key="formKey">
2
+ <div ref="formRef" v-loading="loading" :style="{width:pageWidth?pageWidth+'px':'100%',margin:'auto','min-height': minHeight}">
3
+ <div ref="fieldsRef" v-if="model !== null && !loading" class="ct-form" :class="{'domDisabled':model.pageDisabled}" :key="formKey">
4
4
  <div v-if="model.tip" class="tip-absolute" :style="{width:(tipWidth-20)+'px'}">
5
5
  <span v-html="model.tip"></span>
6
6
  </div>
@@ -56,9 +56,12 @@
56
56
  </el-row>
57
57
 
58
58
  <!--tabs-->
59
- <el-tabs v-if="model.isHorizontalLayout" v-model="activeName" @tab-click="tabClickHandler">
60
- <el-tab-pane :label="item.label" :name="index.toString()" :lazy="item.lazyLoad"
61
- v-for="(item, index) in collapse" v-if="item.show !== false" :key="index">
59
+ <el-tabs ref="tabsRef" v-if="model.isHorizontalLayout" v-model="activeName" @tab-click="tabClickHandler">
60
+ <el-tab-pane :name="index.toString()" :lazy="item.lazyLoad"
61
+ v-for="(item, index) in collapse" v-if="item.show !== false" :key="index">
62
+ <template slot="label">
63
+ <span v-html="item.label"></span>
64
+ </template>
62
65
  <el-row>
63
66
  <template v-for="(col, index) in collapseFieldsRow[index + 1]">
64
67
  <template v-if="col.show !== false && col.lineFeed">
@@ -87,6 +90,41 @@
87
90
  </template>
88
91
  </el-row>
89
92
  </el-tab-pane>
93
+ <template v-if="model.flagFixedTabOnHorizontalLayout">
94
+ <!--尾部元素-->
95
+ <el-row ref="independentRef" v-if="independentItem.length > 0" style="margin-top: 20px;">
96
+ <template v-for="(col, index) in independentItem">
97
+ <template v-if="col.show !== false && col.lineFeed">
98
+ <div style="display: flex; flex: 0 0 100%;"></div>
99
+ <el-col :key="index" v-if="col.show !== false" :span="col.colspan" style="padding:5px">
100
+ <component ref="Fields" :is="col.is" :vmodel="col" :api="model.optionApi" :parentModel="model" v-bind="col.bindPara"
101
+ :fileData="getFileData(col)" :from="'form'" :documentHeight="documentHeight" :documentWidth="documentWidth"
102
+ @click="fieldClickHandler(col,$event)" @change="changeHandler(col,$event)" @enter="enterHandler(col,$event)"
103
+ @input="inputHandler(col,$event)" @importComplete="importComplete" @blur="blurHandler(col,$event)"
104
+ @popupSearchList="popupSearchListHandler" @flagNotificationParentAfterContentChanged="flagNotificationParentAfterContentChanged"
105
+ @popupLocation="popupLocationHandler"
106
+ @tableButtonClick="clickHandler"></component>
107
+ </el-col>
108
+ </template>
109
+ <template v-else>
110
+ <el-col :key="index" v-if="col.show !== false" :span="col.colspan" style="padding:5px">
111
+ <component ref="Fields" :is="col.is" :vmodel="col" :api="model.optionApi" :parentModel="model" v-bind="col.bindPara"
112
+ :fileData="getFileData(col)" :from="'form'" :documentHeight="documentHeight" :documentWidth="documentWidth"
113
+ @click="fieldClickHandler(col,$event)" @change="changeHandler(col,$event)" @enter="enterHandler(col,$event)"
114
+ @input="inputHandler(col,$event)" @importComplete="importComplete" @blur="blurHandler(col,$event)"
115
+ @popupSearchList="popupSearchListHandler" @flagNotificationParentAfterContentChanged="flagNotificationParentAfterContentChanged"
116
+ @popupLocation="popupLocationHandler"
117
+ @tableButtonClick="clickHandler"></component>
118
+ </el-col>
119
+ </template>
120
+ </template>
121
+ </el-row>
122
+ <el-row ref="linksRef" v-if="model.links.findIndex((v)=>{return v.show}) > -1" style="margin-top: 8px;">
123
+ <el-col :span="24" style="text-align:left">
124
+ <component v-for="(btn, index) in model.links" :key="index" :is="btn.is" :vmodel="btn" @click="clickHandler" v-if="btn.show"></component>
125
+ </el-col>
126
+ </el-row>
127
+ </template>
90
128
  </el-tabs>
91
129
 
92
130
  <!--分组-->
@@ -126,23 +164,13 @@
126
164
  </el-collapse-item>
127
165
  </el-collapse>
128
166
 
129
- <!--尾部元素-->
130
- <el-row v-if="independentItem.length > 0" style="margin-top: 20px;">
131
- <template v-for="(col, index) in independentItem">
132
- <template v-if="col.show !== false && col.lineFeed">
133
- <div style="display: flex; flex: 0 0 100%;"></div>
134
- <el-col :key="index" v-if="col.show !== false" :span="col.colspan" style="padding:5px">
135
- <component ref="Fields" :is="col.is" :vmodel="col" :api="model.optionApi" :parentModel="model" v-bind="col.bindPara"
136
- :fileData="getFileData(col)" :from="'form'" :documentHeight="documentHeight" :documentWidth="documentWidth"
137
- @click="fieldClickHandler(col,$event)" @change="changeHandler(col,$event)" @enter="enterHandler(col,$event)"
138
- @input="inputHandler(col,$event)" @importComplete="importComplete" @blur="blurHandler(col,$event)"
139
- @popupSearchList="popupSearchListHandler" @flagNotificationParentAfterContentChanged="flagNotificationParentAfterContentChanged"
140
- @popupLocation="popupLocationHandler"
141
- @tableButtonClick="clickHandler"></component>
142
- </el-col>
143
- </template>
144
- <template v-else>
145
- <el-col :key="index" v-if="col.show !== false" :span="col.colspan" style="padding:5px">
167
+ <template v-if="!model.flagFixedTabOnHorizontalLayout">
168
+ <!--尾部元素-->
169
+ <el-row ref="independentRef" v-if="independentItem.length > 0" style="margin-top: 20px;">
170
+ <template v-for="(col, index) in independentItem">
171
+ <template v-if="col.show !== false && col.lineFeed">
172
+ <div style="display: flex; flex: 0 0 100%;"></div>
173
+ <el-col :key="index" v-if="col.show !== false" :span="col.colspan" style="padding:5px">
146
174
  <component ref="Fields" :is="col.is" :vmodel="col" :api="model.optionApi" :parentModel="model" v-bind="col.bindPara"
147
175
  :fileData="getFileData(col)" :from="'form'" :documentHeight="documentHeight" :documentWidth="documentWidth"
148
176
  @click="fieldClickHandler(col,$event)" @change="changeHandler(col,$event)" @enter="enterHandler(col,$event)"
@@ -150,24 +178,42 @@
150
178
  @popupSearchList="popupSearchListHandler" @flagNotificationParentAfterContentChanged="flagNotificationParentAfterContentChanged"
151
179
  @popupLocation="popupLocationHandler"
152
180
  @tableButtonClick="clickHandler"></component>
153
- </el-col>
181
+ </el-col>
182
+ </template>
183
+ <template v-else>
184
+ <el-col :key="index" v-if="col.show !== false" :span="col.colspan" style="padding:5px">
185
+ <component ref="Fields" :is="col.is" :vmodel="col" :api="model.optionApi" :parentModel="model" v-bind="col.bindPara"
186
+ :fileData="getFileData(col)" :from="'form'" :documentHeight="documentHeight" :documentWidth="documentWidth"
187
+ @click="fieldClickHandler(col,$event)" @change="changeHandler(col,$event)" @enter="enterHandler(col,$event)"
188
+ @input="inputHandler(col,$event)" @importComplete="importComplete" @blur="blurHandler(col,$event)"
189
+ @popupSearchList="popupSearchListHandler" @flagNotificationParentAfterContentChanged="flagNotificationParentAfterContentChanged"
190
+ @popupLocation="popupLocationHandler"
191
+ @tableButtonClick="clickHandler"></component>
192
+ </el-col>
193
+ </template>
154
194
  </template>
155
- </template>
156
- </el-row>
157
- <el-row v-if="model.links.findIndex((v)=>{return v.show}) > -1" style="margin-top: 8px;">
158
- <el-col :span="24" style="text-align:left">
159
- <component v-for="(btn, index) in model.links" :key="index" :is="btn.is" :vmodel="btn" @click="clickHandler" v-if="btn.show"></component>
160
- </el-col>
161
- </el-row>
162
- <el-row v-if="model.buttons.findIndex((v)=>{return v.show}) > -1" :class="isScroll?'ccai button-absolute':'button-initial'"
163
- :style="{'max-width':pageWidth?(pageWidth-20)+'px':'100%'}">
164
- <el-col :span="24" style="display: flex;align-items: center;justify-content: center;height: 40px ;padding-bottom: 1px;padding-left: 5px;padding-right: 5px;" class="btnPadBom">
165
- <component v-for="(btn, index) in model.buttons" :key="index" :is="btn.is" :vmodel="btn" @click="clickHandler" v-if="btn.show"
166
- :style="{'float':btn.isCheckbox ? btn.alignCss:''}"></component>
167
- </el-col>
168
- </el-row>
169
- <div v-if="isScroll" style="height: 34px;"></div>
195
+ </el-row>
196
+ <el-row ref="linksRef" v-if="model.links.findIndex((v)=>{return v.show}) > -1" style="margin-top: 8px;">
197
+ <el-col :span="24" style="text-align:left">
198
+ <component v-for="(btn, index) in model.links" :key="index" :is="btn.is" :vmodel="btn" @click="clickHandler" v-if="btn.show"></component>
199
+ </el-col>
200
+ </el-row>
201
+ </template>
170
202
  </component>
203
+
204
+ <div v-if="isScroll" :style="{'height': (model.bottomTip ? 34:0) + (model.buttons.length>0 && model.buttons.findIndex((v)=>{return v.show}) > -1?34:0) + 'px'}"></div>
205
+ </div>
206
+ <div ref="bottomTipRef" v-if="model && !loading && model.bottomTip"
207
+ :class="isScroll? (model.buttons.length>0 && model.buttons.findIndex((v)=>{return v.show}) > -1?'tip-bottom-absolute40':'tip-bottom-absolute'):'tip-bottom'"
208
+ :style="{width:isScroll?'100%':(tipWidth-20)+'px','margin-left':isScroll?'0px':'10px'}">
209
+ <span v-html="model.bottomTip"></span>
210
+ </div>
211
+ <div ref="buttonsRef" v-if="model && !loading && model.buttons.length>0 && model.buttons.findIndex((v)=>{return v.show}) > -1"
212
+ :class="isScroll?'ccai button-absolute':'button-initial'" :style="{'max-width':pageWidth?(pageWidth-20)+'px':'100%'}">
213
+ <el-col :span="24" style="display: flex;align-items: center;justify-content: center;height: 40px ;padding-bottom: 1px;padding-left: 5px;padding-right: 5px;" class="btnPadBom">
214
+ <component v-for="(btn, index) in model.buttons" :key="index" :is="btn.is" :vmodel="btn" @click="clickHandler" v-if="btn.show"
215
+ :style="{'float':btn.isCheckbox ? btn.alignCss:''}"></component>
216
+ </el-col>
171
217
  </div>
172
218
  <div style="min-height:200px" v-if="loading"></div>
173
219
  <iframe :src="downloadUrl" style="height:0px;width:0px;border-width: 0px;display: none;"> </iframe>
@@ -289,6 +335,7 @@
289
335
  let parentDom=this.$el.parentElement;
290
336
  if (parentDom && parentDom.scrollHeight > parentDom.clientHeight
291
337
  && this.model && (!this.model.isHorizontalLayout || this.flagScroll)) {
338
+ this.$refs.fieldsRef.style.height = 'auto';
292
339
  this.isScroll = true;
293
340
  }
294
341
  }
@@ -332,6 +379,7 @@
332
379
  this.model.scripts.formData.fieldsDic = this.model.fieldsDic;
333
380
  }
334
381
  this.loadFields();
382
+ this.loadTabs();
335
383
 
336
384
  if (this.model.onload) {
337
385
  let onloads = this.model.onload.split(';');
@@ -417,6 +465,33 @@
417
465
  }
418
466
  });
419
467
  },
468
+ loadTabs(){
469
+ this.$nextTick(function () {
470
+ if(this.model.flagFixedTabOnHorizontalLayout && this.model.isHorizontalLayout && this.collapse.length > 0){
471
+ let h1 = this.$refs.formRef.parentElement.offsetHeight - 10 | 0;
472
+ let h2 = this.$refs.tabsRef.$el.children[1].offsetTop + 15 | 0;
473
+ let h3 = this.$refs.independentRef ? this.$refs.independentRef.$el.offsetHeight + 20 : 0;
474
+ let h4 = this.$refs.linksRef ? this.$refs.linksRef.$el.offsetHeight : 0;
475
+ let h5 = this.$refs.buttonsRef ? this.$refs.buttonsRef.children[0].offsetHeight : 0;
476
+ let h6 = this.$refs.bottomTipRef ? this.$refs.bottomTipRef.offsetHeight : 0;
477
+ if(h5===0 && h6===0){
478
+ h1=h1-5;
479
+ }
480
+ let tabHeight = h1 - h2 - h5 - h6;
481
+ this.$refs.tabsRef.$el.children[1].style.height = tabHeight + 'px';
482
+ this.$refs.tabsRef.$el.children[1].style.overflow = 'auto';
483
+ }
484
+ else{
485
+ if(!this.model.isHorizontalLayout || this.flagScroll){
486
+ let h1 = this.$refs.formRef.parentElement.offsetHeight - 20;
487
+ let h5 = this.$refs.buttonsRef ? this.$refs.buttonsRef.children[0].offsetHeight : 0;
488
+ let h6 = this.$refs.bottomTipRef ? this.$refs.bottomTipRef.offsetHeight : 0;
489
+ let fieldsHeight = h1 - h5 - h6;
490
+ this.$refs.fieldsRef.style.height = fieldsHeight + 'px';
491
+ }
492
+ }
493
+ })
494
+ },
420
495
  fieldClickHandler(field) {
421
496
  let submitData = null;
422
497
  var router = this.model.buttons.find((v) => {
@@ -1580,10 +1655,11 @@
1580
1655
 
1581
1656
  .el-collapse-saveLine .ct-collapse-item-title:last-child .el-collapse-item__wrap {
1582
1657
  border-bottom: none;
1583
- }
1584
-
1658
+ }
1659
+
1585
1660
  .button-initial {
1586
- margin-top: 8px;
1661
+ line-height: 34px;
1662
+ /* margin-top: 8px; */
1587
1663
  }
1588
1664
 
1589
1665
  .button-absolute {
@@ -1613,4 +1689,39 @@
1613
1689
  padding: 8px;
1614
1690
  font-size: 12px;
1615
1691
  }
1692
+
1693
+ .tip-bottom {
1694
+ line-height: 24px;
1695
+ background-color:#ffe7cc;
1696
+ color:#EC3D3D;
1697
+ border-radius: 5px;
1698
+ padding: 8px;
1699
+ font-size: 12px;
1700
+ }
1701
+ .tip-bottom-absolute {
1702
+ z-index: 100;
1703
+ bottom: 0;
1704
+ left: 0;
1705
+ right: 0;
1706
+ position: absolute;
1707
+ line-height: 24px;
1708
+ background-color:#ffe7cc;
1709
+ color:#EC3D3D;
1710
+ border-radius: 5px;
1711
+ padding: 8px;
1712
+ font-size: 12px;
1713
+ }
1714
+ .tip-bottom-absolute40 {
1715
+ z-index: 100;
1716
+ bottom: 40px;
1717
+ left: 0;
1718
+ right: 0;
1719
+ position: absolute;
1720
+ line-height: 24px;
1721
+ background-color:#ffe7cc;
1722
+ color:#EC3D3D;
1723
+ border-radius: 5px;
1724
+ padding: 8px;
1725
+ font-size: 12px;
1726
+ }
1616
1727
  </style>
@@ -0,0 +1,11 @@
1
+ import dynamicJsonViewer from './src/dynamicJsonViewer'
2
+
3
+ dynamicJsonViewer.install = function (Vue, options) {
4
+ Vue.component(dynamicJsonViewer.name, dynamicJsonViewer);
5
+ }
6
+
7
+ if (typeof window !== 'undefined' && window.Vue) {
8
+ window.Vue.use(dynamicJsonViewer);
9
+ }
10
+
11
+ export default dynamicJsonViewer;
@@ -0,0 +1,144 @@
1
+ <template>
2
+ <div class="field-top">
3
+ <div v-if="model !== null" class="ct-JsonViewer">
4
+ <div :class="[model.showLabel?'el-input-group el-input-group--prepend':'',!valid?'inputError':'']" style="display: inline-block;">
5
+ <div v-if="model.showLabel && model.label" :class="[model.labelClass]" style="text-align: left;padding-bottom: 5px;color: #303133;">
6
+ <h5>{{model.label}}</h5>
7
+ </div>
8
+ <div class="josnViewerBox" tabindex="-1" v-if="isRefresh" :style="{ height: model.height || 'auto','max-height':(listHeight?listHeight-130+'px':'calc(100vh - 130px)') }">
9
+ <JsonViewer :value="model.jsonData" copyable show-array-index show-double-quotes theme="light" :expanded="true"
10
+ :expand-depth="2" @onKeyClick="keyClick">
11
+ <template slot="copy">
12
+ <div class="btn-iocn">
13
+ <i class="el-icon-refresh" title="复原到初始状态" @click.stop="resetJSON">
14
+ </i>
15
+ <i class="el-icon-copy-document" title="复制JSON内容">
16
+ </i>
17
+ </div>
18
+ </template>
19
+ </JsonViewer>
20
+ </div>
21
+ </div>
22
+ <transition name="el-fade-in">
23
+ <span v-show="!valid" class="errorMessage">
24
+ {{validMessage}}
25
+ </span>
26
+ </transition>
27
+ </div>
28
+ </div>
29
+ </template>
30
+ <script>
31
+ import dynamicElement from '../../mixins/dynamicElement';
32
+ import JsonViewer from 'vue-json-viewer'
33
+ import 'vue-json-viewer/style.css'
34
+ export default {
35
+ name: 'ct-JsonViewer',
36
+ mixins: [dynamicElement],
37
+ components: {
38
+ 'JsonViewer': JsonViewer
39
+ },
40
+ props: {
41
+ vmodel: Object,
42
+ api: String,
43
+ listHeight: {
44
+ type: Number,
45
+ default: null
46
+ },
47
+ },
48
+ data() {
49
+ return {
50
+ isRefresh:true,
51
+ };
52
+ },
53
+ mounted() {
54
+ var self = this;
55
+ this.$nextTick(function () {
56
+ if (self.vmodel) {
57
+ self.load(self.vmodel);
58
+ }
59
+ else if (typeof self.source !== 'undefined') {
60
+ self.loaderObj.JsonViewer(self.source, (data) => {
61
+ self.load(data);
62
+ });
63
+ }
64
+ });
65
+ },
66
+ destroyed (){
67
+ this.model=null;
68
+ this.$el=null;
69
+ },
70
+ methods: {
71
+ load(data) {
72
+ this.model = data;
73
+ },
74
+ resetJSON() {
75
+ this.isRefresh = false;
76
+ this.$nextTick(function () {
77
+ this.isRefresh = true;
78
+ });
79
+ },
80
+ keyClick(keyName) {
81
+ console.log(keyName, "it was click")
82
+ }
83
+ }
84
+ }
85
+ </script>
86
+ <style>
87
+ .josnViewerBox {
88
+ overflow: auto;
89
+ width: 100%;
90
+ border: 1px solid #eee;
91
+ border-radius: 4px;
92
+ padding: 2px;
93
+ box-sizing: border-box;
94
+ background-color: #ffffff;
95
+ line-height: normal;
96
+
97
+ .jv-container .jv-code{
98
+ padding: 0px !important;
99
+ }
100
+ .jv-container.light {
101
+ background: #fff;
102
+ white-space: nowrap;
103
+ color: #525252;
104
+ font-size: 14px;
105
+ font-family: Consolas, Menlo, Courier, monospace;
106
+ }
107
+ .jv-container.light .jv-button, .jv-container.jv-dark .jv-button {
108
+ color: #49b3ff;
109
+ }
110
+ .jv-container.light .jv-key {
111
+ color: #111;
112
+ margin-right: 4px;
113
+ }
114
+ .jv-container.light .jv-item.jv-string {
115
+ color: #42b983;
116
+ word-break: break-word;
117
+ white-space: normal;
118
+ }
119
+ .jv-container.light .jv-item.jv-number {
120
+ color: #fc1e70;
121
+ }
122
+ .jv-container.light .jv-item.jv-boolean {
123
+ color: #fc1e70;
124
+ }
125
+ .jv-tooltip {
126
+ position: sticky !important;
127
+ top: 0 !important;
128
+ right: 0 !important;
129
+ /* 新增:靠右定位 */
130
+ z-index: 10;
131
+ margin-left: auto;
132
+ /* 辅助:确保靠右 */
133
+ float: right;
134
+ }
135
+ .btn-iocn {
136
+ display: flex;
137
+ gap: 10px;
138
+ }
139
+
140
+ }
141
+ .josnViewerBox:focus {
142
+ border: 1px solid #3D5ECC;
143
+ }
144
+ </style>
@@ -143,7 +143,7 @@
143
143
  var dropdown = self.$refs["pop"];
144
144
  this.unwatch1=self.$watch('model.options', function (newVal, oldVal) {
145
145
  self.$nextTick(() => {
146
- if (typeof dropdown.popperJS !== 'undefined' && dropdown.popperJS) {
146
+ if (dropdown && typeof dropdown.popperJS !== 'undefined' && dropdown.popperJS) {
147
147
  dropdown.popperJS.destroy();
148
148
  dropdown.popperJS = null;
149
149
  dropdown.updatePopper();
@@ -25,6 +25,7 @@
25
25
  :style="{'height': pageHeight? pageHeight:'100%','width':sideBarWidth+'px',right:sideBarRight+'px'}"
26
26
  class="sidebar">
27
27
  <ct-Detail ref="detail" :api="sideBarApi" :apiParam="sideBarApiParam" :pageType="sideBarPageType"
28
+ :style="{'display': sideBarWidth && sideBarWidth>0 ?'block':'none'}"
28
29
  :searchConditionApi="sideBarSearchConditionApi" :searchStatsApi="sideBarSearchStatsApi" :searchDataApi="sideBarSearchDataApi" :listHeight="listHeight"
29
30
  :selectIndex="selectIndex" :rowCount="rowCount" :key="detailKey" :drowerClose="drowerClose"
30
31
  @clickNextHandler="clickNextHandler" @clickPrevHandler="clickPrevHandler" @simpleRouterclickHandler="simpleRouterclickHandler"
@@ -1541,7 +1541,7 @@ export default {
1541
1541
  }
1542
1542
  }
1543
1543
  }
1544
- else if (field.isFormPageInSideBar || field.isSearchPageInSideBar) {
1544
+ else if (field.isFormPageInSideBar || field.isSearchPageInSideBar) {
1545
1545
  self.model.flagSideBar = true;
1546
1546
  self.model.flagDefaultDisplaySideBar = true;
1547
1547
  field.actionSource = field.isFormPageInSideBar ? 'Form':'SearchList';
@@ -144,7 +144,7 @@
144
144
  var dropdown = self.$refs["pop"];
145
145
  this.unwatch=self.$watch('model.options', function (newVal, oldVal) {
146
146
  self.$nextTick(() => {
147
- if (typeof dropdown.popperJS !== 'undefined' && dropdown.popperJS) {
147
+ if (dropdown && typeof dropdown.popperJS !== 'undefined' && dropdown.popperJS) {
148
148
  dropdown.popperJS.destroy();
149
149
  dropdown.popperJS = null;
150
150
  dropdown.updatePopper();
@@ -6,7 +6,7 @@
6
6
  :screenPara="screenPara"
7
7
  @search="search"
8
8
  @clickHandler="rolRouterClickHandler"
9
- @loaded="screenload"
9
+ @loaded="screenload" style="padding-left: 11px;"
10
10
  ></ct-searchtreescreen>
11
11
  <ct-tree
12
12
  ref="tree"
@@ -28,6 +28,18 @@ const Form = function (source, callBack, apiParam, failCallBack, isFormList) {
28
28
  get tip() {
29
29
  return source.tip;
30
30
  },
31
+ set tip(v) {
32
+ source.tip = v;
33
+ },
34
+ get bottomTip() {
35
+ return source.bottomTip;
36
+ },
37
+ set bottomTip(v) {
38
+ source.bottomTip = v;
39
+ },
40
+ get flagFixedTabOnHorizontalLayout() {
41
+ return source.flagFixedTabOnHorizontalLayout;
42
+ },
31
43
  get flagShowTitle() {
32
44
  let v=false;
33
45
  if(source.flagShowTitle)v=source.flagShowTitle;
@@ -0,0 +1,25 @@
1
+ import base from '../../index';
2
+ import Base from './Base';
3
+
4
+ const JsonViewer = function (source) {
5
+ var init = function (data) {
6
+ var rtn = {
7
+ get jsonData() {
8
+ if (data.code1 && typeof data.code1 === 'string') {
9
+ return JSON.parse(data.code1);
10
+ }
11
+ else {
12
+ return data.code1;
13
+ }
14
+ },
15
+ get height() {
16
+ return data.rows ? data.rows * 20 + 'px' : 'auto';
17
+ }
18
+ };
19
+ rtn = base.copy(Base(data), rtn);
20
+ return rtn;
21
+ }
22
+
23
+ return init(source);
24
+ }
25
+ export default JsonViewer;
@@ -102,7 +102,7 @@ const Router = function (source) {
102
102
  return source.pageStyle === Enum.PageStyle.BrowserNewTab;
103
103
  },
104
104
  get isClientFuntion() {
105
- return source.pageStyle === Enum.PageStyle.ClientFunction;
105
+ return source.pageStyle === Enum.PageStyle.ClientFunction || source.actionType === Enum.ActionType.ExcuteClientFunction;
106
106
  },
107
107
  get isSearchPageWithList() {
108
108
  return source.pageStyle === Enum.PageStyle.SearchPageWithList;