centaline-data-driven 1.2.0 → 1.2.12

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "centaline-data-driven",
3
- "version": "1.2.00",
3
+ "version": "1.2.12",
4
4
  "description": "ccai",
5
5
  "author": "hjc <3226136347@qq.com>",
6
6
  "private": false,
package/src/Detail.vue CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  <script>
9
9
  export default {
10
- name: 'App',
10
+ name: 'DataDrivendetail',
11
11
  data() {
12
12
  return {
13
13
  apiParam: {actionType: 1,chanceID: "2"} ,
package/src/Form.vue CHANGED
@@ -8,7 +8,7 @@
8
8
  <!--<ct-form :api="'api/Form/formdata'"></ct-form>-->
9
9
  <!-- <ct-form :api="'/forminfo/readDetail'" :apiParam="apiParam"></ct-form> -->
10
10
  <!-- <ct-form :api="'PropertyKey/getLayoutOfNew'" :apiParam="apiParam"></ct-form> -->
11
- <ct-form :api="'Worklist/getLayoutOfMyApply'" :apiParam="apiParam"></ct-form>
11
+ <ct-form :api="'PropertyRealLook/getLayoutOfNew'" :apiParam="para"></ct-form>
12
12
  <!-- <ct-form :api="'/api/distribution/transaction/add'" :apiParam="apiParam"></ct-form> -->
13
13
  <ct-dialog-list></ct-dialog-list>
14
14
  </div>
@@ -25,7 +25,7 @@
25
25
  // apiParam: {actionType: 3,formId: "2c12649f-09c5-4aa9-8011-b6d1c7b56a41"} ,
26
26
  // apiParam: {chanceID: "1", actionType: 2} ,
27
27
  // apiParam: {worklistID: "1494206747714392064", actionType: 2}
28
- apiParam: {instanceID: "1495923412655280128", actionType: 3}
28
+ para: {chanceID: "1", actionType: 2}
29
29
  // apiParam: {
30
30
  // actionType: 2,
31
31
  // agentId: "1450283160825425922",
@@ -294,6 +294,9 @@ const common = {
294
294
  else if (parent.$options.name === 'DataDrivenForm') {
295
295
  return parent;
296
296
  }
297
+ else if (parent.$options.name === 'DataDrivendetail') {
298
+ return parent;
299
+ }
297
300
  else {
298
301
  return this.getParentPane(parent);
299
302
  }
@@ -583,7 +583,7 @@ html {
583
583
  .ct-lable {
584
584
  height: 26px;
585
585
  line-height: 26px;
586
- padding-left: 15px;
586
+ padding-left: 5px;
587
587
  }
588
588
 
589
589
  /* 滚动条的宽度 */
@@ -720,6 +720,12 @@ html {
720
720
  .ct-right-10{
721
721
  right: 10px !important;
722
722
  }
723
+ .unitName-0{
724
+ margin-right: 0px !important;
725
+ }
726
+ .unitName-20{
727
+ margin-right: 23px !important;
728
+ }
723
729
  .ct-table-content{
724
730
  padding: 0;
725
731
  }
@@ -185,7 +185,7 @@
185
185
  :index="index.toString()" :name="index.toString()" :label="col.appName"></el-tab-pane>
186
186
  </el-tabs>
187
187
  <ct-searchlist v-if="model.searchConditionApiTags1" :key="model.searchlistKey"
188
- :apiParam="model.paramDataTags1"
188
+ :apiParam="model.paramDataTags1" :flagFocus="false"
189
189
  :searchConditionApi="model.searchConditionApiTags1"
190
190
  :searchDataApi="model.searchDataApiTags1"></ct-searchlist>
191
191
  </div>
@@ -257,89 +257,16 @@
257
257
  </el-tab-pane>
258
258
  </el-tabs>
259
259
  </div>
260
- <!-- <div class="operation-list p0">
261
- <button data-v-6fe32525="" type="button" class="el-button list-item base-box el-button--default">编辑房源</button>
262
- <button data-v-6fe32525="" type="button" class="el-button list-item base-box el-button--default">转潜盘</button>
263
- <button data-v-6fe32525="" type="button" class="el-button list-item base-box el-button--default">激活房源</button>
264
- </div> -->
265
- <div class="operation-table base-box">
266
- <div class="table-box">
267
- <div class="t-item">
268
- <span class="i">住建委卖委托</span>
269
- </div>
270
- <div class="t-item"><span class="i">无委托</span></div>
271
- <div class="t-item"><button type="button" class="el-button t-but el-button--info max-info"><span>新增委托</span></button></div>
272
- </div>
273
- <div class="table-box">
274
- <div class="t-item">
275
- <span class="i">独家委托</span>
276
- </div>
277
- <div class="t-item"><span class="i">无委托</span></div>
278
- <div class="t-item"><button type="button" class="el-button t-but el-button--info max-info"><span>新增委托</span></button></div>
279
- </div>
280
- <div class="table-box">
281
- <div class="t-item">
282
- <span class="i">普通委托</span>
283
- </div>
284
- <div class="t-item"><span class="i">无委托</span></div>
285
- <div class="t-item"><button type="button" class="el-button t-but el-button--info max-info"><span>新增委托</span></button></div>
286
- </div>
287
- <div class="table-box">
288
- <div class="t-item">
289
- <span class="i">踩盘</span>
290
- </div>
291
- <div class="t-item"><span class="i">无委托</span></div>
292
- <div class="t-item"><button type="button" class="el-button t-but el-button--info max-info"><span>踩盘</span></button></div>
293
- </div>
294
- <div class="table-box">
295
- <div class="t-item">
296
- <span class="i">普通实勘</span>
297
- </div>
298
- <div class="t-item"><span class="i">无委托</span></div>
299
- <div class="t-item"><button type="button" class="el-button t-but el-button--info max-info"><span>新增实勘</span></button></div>
300
- </div>
301
- <div class="table-box">
302
- <div class="t-item">
303
- <span class="i">VR实勘</span>
304
- </div>
305
- <div class="t-item"><span class="i">无委托</span></div>
306
- <div class="t-item"><button type="button" class="el-button t-but el-button--info max-info"><span>VR预约</span></button></div>
307
- </div>
308
- <div class="table-box">
309
- <div class="t-item">
310
- <span class="i">钥匙</span>
311
- </div>
312
- <div class="t-item"><span class="i">无委托</span></div>
313
- <div class="t-item"><button type="button" class="el-button t-but el-button--info max-info"><span>新增钥匙</span></button></div>
314
- </div>
315
- <div class="table-box">
316
- <div class="t-item">
317
- <span class="i">发布房源</span>
318
- </div>
319
- <div class="t-item"><span class="i">无委托</span></div>
320
- <div class="t-item"><button type="button" class="el-button t-but el-button--info max-info"><span>发布</span></button></div>
260
+ <div v-if="model.operationList!==null" :key="model.operationKey" class="operation-table base-box">
261
+ <div v-for="(col, index) in model.operationList" :key="index" class="table-box">
262
+ <div class="t-item">
263
+ <span class="i">{{col.operationName}}</span>
321
264
  </div>
322
- <div class="table-box">
323
- <div class="t-item">
324
- <span class="i">经理推荐</span>
325
- </div>
326
- <div class="t-item"><span class="i">无委托</span></div>
327
- <div class="t-item"><button type="button" class="el-button t-but el-button--info max-info"><span>推荐</span></button></div>
328
- </div>
329
- <div class="table-box">
330
- <div class="t-item">
331
- <span class="i">总房源</span>
332
- </div>
333
- <div class="t-item"><span class="i">无委托</span></div>
334
- <div class="t-item"><button type="button" class="el-button t-but el-button--info max-info"><span>推荐</span></button></div>
335
- </div>
336
- <div class="table-box">
337
- <div class="t-item">
338
- <span class="i">推广资料</span>
339
- </div>
340
- <div class="t-item"><span class="i">无委托</span></div>
341
- <div class="t-item"><button type="button" class="el-button t-but el-button--info max-info"><span>新增</span></button></div>
265
+ <div class="t-item"><span class="i">{{col.desc}}</span></div>
266
+ <div class="t-item" style="height: 50px;">
267
+ <component class="el-button t-but el-button--info max-info" v-if="col.router && col.router.show" :is="col.router.is" :vmodel="col.router" :api="model.optionApi" @click="fieldClickHandler(col.router,$event)"></component>
342
268
  </div>
269
+ </div>
343
270
  </div>
344
271
  <div class="customer">
345
272
  <div class="customer-title">
@@ -523,6 +450,7 @@
523
450
  if(this.model.tags2 && this.model.tags2[0]){
524
451
  this.model.getTags2List(0);
525
452
  }
453
+ this.loadOperation();
526
454
  this.setDetailHeight();
527
455
  this.$nextTick(() => {
528
456
  window.addEventListener("resize", (ev) => {
@@ -571,6 +499,12 @@
571
499
  }
572
500
  });
573
501
  },
502
+ loadOperation() {
503
+ this.model._operationList=null;
504
+ this.model._operationRouters=[];
505
+ this.model.operationKey=this.model.operationKey+1;
506
+ this.model.getOperationList();
507
+ },
574
508
  lookOwner() {
575
509
  this.codeOwner = true
576
510
  },
@@ -586,10 +520,9 @@
586
520
  setDetailHeight() {
587
521
  this.$nextTick(() => {
588
522
  if (this.$refs.detail && this.$refs.main) {
589
- var h1 = document.documentElement.clientHeight | 0;
590
- var h2 = this.$refs.main.parentElement.offsetTop | 0;
591
- var h3 = this.$refs.detail.offsetTop | 0;
592
- let detailHeight = h1 - h3 - 65;
523
+ var h1 = this.$common.getParentPane(this).$el.offsetHeight | 0;
524
+ var h2 = this.$refs.detail.offsetTop | 0;
525
+ let detailHeight = h1 - h2;
593
526
  this.model.detailHeight = detailHeight < 40 ? 350 : detailHeight;
594
527
  }
595
528
  });
@@ -606,6 +539,7 @@
606
539
  },
607
540
  fieldClickHandler(field) {
608
541
  var self = this;
542
+ var callBack=null;
609
543
  let submitData={};
610
544
  var router = this.model.actionRouters.find((v) => {
611
545
  return v.id === field.id;
@@ -616,9 +550,15 @@
616
550
  });
617
551
  }
618
552
  if(router==undefined){
619
- router = this.model.otherTradeActionRouter.find((v) => {
620
- return v.id === field.id;
621
- });
553
+ if(field.id===this.model.otherTradeActionRouter.id){
554
+ router = this.model.otherTradeActionRouter
555
+ }
556
+ }
557
+ if(router==undefined){
558
+ router = this.model.operationRouters.find((v) => {
559
+ return v.id === field.id;
560
+ });
561
+ callBack="loadOperation";
622
562
  }
623
563
 
624
564
  if(router){
@@ -634,9 +574,14 @@
634
574
  }
635
575
  }
636
576
 
637
- this.routerClickHandler(router,submitData);
577
+ if(callBack && callBack=='loadOperation'){
578
+ this.routerClickHandler(router,submitData,self.loadOperation);
579
+ }
580
+ else{
581
+ this.routerClickHandler(router,submitData);
582
+ }
638
583
  },
639
- routerClickHandler(field, submitData) {
584
+ routerClickHandler(field, submitData,callBack) {
640
585
  var self = this;
641
586
  // this.model.scripts.$fd = field.id;
642
587
  // this.model.scripts.$result = [];
@@ -664,6 +609,9 @@
664
609
  on: {
665
610
  submit(ev) {
666
611
  self.model.doAction(ev,field);
612
+ if(callBack){
613
+ callBack();
614
+ }
667
615
  self.$common.closeDialog(dialogOption.dialog);
668
616
  }
669
617
  }
@@ -707,6 +655,9 @@
707
655
  let query = self.$common.objectToQueryStr(submitData);
708
656
  window.open(field.action + query, "_blank");
709
657
  }
658
+ else{
659
+
660
+ }
710
661
  }
711
662
  //执行客户端脚本
712
663
  else {
@@ -20,7 +20,7 @@
20
20
  </span>
21
21
  </span>
22
22
 
23
- <span v-if="model.unitName" class="ct-unitname el-input__suffix el-input__suffix-inner">{{model.unitName}}</span>
23
+ <span v-if="model.unitName" class="ct-unitname el-input__suffix el-input__suffix-inner" :class="showClear?'unitName-20':'unitName-0'">{{model.unitName}}</span>
24
24
  </div>
25
25
  <span v-if="model.sufLabel" class="spanMessage ct-flex-div-span">{{model.sufLabel}}</span>
26
26
  <transition name="el-fade-in ct-flex-div-span">
@@ -18,7 +18,7 @@
18
18
  </div>
19
19
  <div class="ct-tableParent" ref="tableParent" v-bind="model.attrs" v-if="!isLoading"
20
20
  :style="{'height':model.tableHeight+'px'}"
21
- @scroll="scrollHandle($event)" v-focus="true"
21
+ @scroll="scrollHandle($event)" :v-focus="model.flagFocus"
22
22
  @keydown.up="rowKeyDownHandle($event,0)" @keydown.down="rowKeyDownHandle($event,1)"
23
23
  tabindex="-1">
24
24
  <div class="ct-table-content">
@@ -157,7 +157,11 @@
157
157
  props: {
158
158
  vmodel: Object,
159
159
  api: String,
160
- searchStatsApi: String
160
+ searchStatsApi: String,
161
+ flagFocus:{
162
+ Boolean,
163
+ default:true
164
+ }
161
165
  },
162
166
  computed: {
163
167
  headAllCheckClass() {
@@ -211,13 +215,10 @@
211
215
  },
212
216
  methods: {
213
217
  rowCheckClass(row) {
214
-
215
- if(row.$select)
216
- {
218
+ if(row.$select){
217
219
  return 'is-checked';
218
220
  }
219
-
220
- },
221
+ },
221
222
  load(data) {
222
223
  var self = this;
223
224
  self.model = data;
@@ -9,7 +9,7 @@
9
9
  class="ct-flex-div-input max-input" :class="[model.showLabel?'showLabel':'',!valid?'inputError':'']" :disabled="model.lock" :rows="model.rows"
10
10
  :readonly="model.readonly" :show-password="model.isPassword" autocomplete="on" :maxlength="model.max" :show-word-limit="model.showWordLimit"
11
11
  @keyup.enter.native="search()">
12
- <span slot="suffix" v-if="model.unitName" class="ct-unitname">{{model.unitName}}</span>
12
+ <span slot="suffix" v-if="model.unitName" class="ct-unitname" :class="showClear?'unitName-20':'unitName-0'">{{model.unitName}}</span>
13
13
 
14
14
  <span slot="suffix" class="el-input__suffix el-input--mini" v-if="!model.isPassword&&showClear" :class="model.unitName?'ct-right-10':'ct-right-0'">
15
15
  <span class="el-input__suffix-inner ct-close">
@@ -4,10 +4,21 @@
4
4
  <el-aside :width="leftWidth?leftWidth+'px':'15%'" style="background-color:white">
5
5
  <ct-searchtree :flagsearch="true" :searchConditionApi="searchConditionApi" :searchDataApi="searchDataApi" @loaded="loaded"></ct-searchtree>
6
6
  </el-aside>
7
- <el-main v-if="isShowSearchlist">
8
- <div style="height: calc(100vh - 100px);">
9
- <ct-searchlist :searchConditionApi="searchTableConditionApi" :searchDataApi="searchTableDataApi" :api-param="apiParam"></ct-searchlist>
10
- </div>
7
+ <el-main v-if="isShowMain">
8
+
9
+ <template v-if="pageType=='form'">
10
+ <div style="height: calc(100vh - 120px);">
11
+ <div style="border:1px solid red" :style="{'width':(width?width+'px':'auto'),'height':(height?height+'px':'auto')}">
12
+ <ct-form :api="formApi" :api-param="apiParam" :width="width" :height="height"></ct-form>
13
+ </div>
14
+ </div>
15
+ </template>
16
+ <template v-else>
17
+ <div style="height: calc(100vh - 100px);">
18
+ <ct-searchlist :searchConditionApi="searchTableConditionApi" :searchDataApi="searchTableDataApi" :api-param="apiParam"></ct-searchlist>
19
+ </div>
20
+ </template>
21
+
11
22
  </el-main>
12
23
  </el-container>
13
24
  </div>
@@ -17,12 +28,13 @@
17
28
  import dynamicElement from '../../mixins/dynamicElement'
18
29
  import dynamicSearchTree from './dynamicSearchTree.vue';
19
30
  import dynamicSearchList from '../../dynamicSearchList/src/dynamicSearchList.vue';
31
+ import dynamicForm from '../../dynamicForm/src/dynamicForm';
20
32
  export default {
21
33
  name: 'ct-treelist',
22
34
  mixins: [dynamicElement],
23
35
  components: {
24
36
  'ct-searchtree': dynamicSearchTree,
25
- 'ct-searchlist': dynamicSearchList
37
+ 'ct-form': dynamicForm,
26
38
  },
27
39
  props: {
28
40
  vmodel: Object,
@@ -34,25 +46,40 @@
34
46
  return {
35
47
  searchTableConditionApi: "",
36
48
  searchTableDataApi: "",
37
- isShowSearchlist: false,
49
+ formApi: "",
50
+ width: 0,
51
+ height: 0,
52
+ isShowMain: false,
53
+ pageType: 'list',
38
54
  apiParam: {}
39
55
  };
40
56
  },
41
57
  methods: {
42
58
  loaded(data) {
43
59
  var self = this;
44
- self.isShowSearchlist = false;
45
- if (data && data.rowRouter) {
60
+ self.isShowMain = false;
61
+ self.pageType = "list";
62
+ if (data && data.rowRouter && (JSON.stringify(data.rowRouter) != "{}")) {
63
+ self.formApi = data.rowRouter.getLayout;
64
+ self.pageType = data.rowRouter.pageType != undefined ? data.rowRouter.pageType : "list";
65
+ self.width = parseFloat(data.rowRouter.width != undefined ? data.rowRouter.width : "0");
66
+ self.height = parseFloat(data.rowRouter.height != undefined ? data.rowRouter.height : "0");
46
67
  self.searchTableConditionApi = data.rowRouter.getLayoutOfSearch;
47
68
  self.searchTableDataApi = data.rowRouter.getList;
48
69
  var defaultPara = self.$common.deepClone(data);
49
70
  delete defaultPara.rowRouter;
50
71
  delete defaultPara.getLayoutOfSearch;
51
72
  delete defaultPara.getList;
73
+ delete defaultPara.getLayout;
74
+ delete defaultPara.width;
75
+ delete defaultPara.height;
52
76
 
53
77
  self.apiParam = defaultPara;
54
78
  self.$nextTick(() => {
55
- self.isShowSearchlist = true;
79
+ if (self.searchTableConditionApi || self.searchTableDataApi || self.formApi) {
80
+ self.isShowMain = true;
81
+ }
82
+
56
83
  });
57
84
  }
58
85
  },
@@ -18,10 +18,14 @@ const Detail = function (source,para ,callBack) {
18
18
  activeIndex1:'0',
19
19
  activeIndex2:'0',
20
20
  searchlistKey:0,
21
- tags2Key:0,
21
+ tags2Key:0,
22
+ operationKey:0,
22
23
  _searchConditionApiTags1:null,
23
24
  _searchDataApiTags1:null,
24
- _paramDataTags1:null,
25
+ _paramDataTags1:null,
26
+ _operationApiRouter:null,
27
+ _operationList:null,
28
+ _operationRouters:[],
25
29
  get fields1() {
26
30
  return data.fields1;
27
31
  },
@@ -244,22 +248,44 @@ const Detail = function (source,para ,callBack) {
244
248
  return rtn._operationApiRouter;
245
249
  }
246
250
  },
247
- getOperationList(i){
248
- if(rtn.operationApiRouter){
249
- let action =rtn.operationApiRouter.action;
250
- let para={};
251
- rtn.operationApiRouter.submitFormField.forEach((v) => {
252
- para[v] = rtn.fields1Dic[v].value;
253
- });
254
- Vue.prototype.$api.postHandler(common.globalUri(), { action: action,para:para}).then(
255
- function (response) {
256
- if (response.rtnCode === Enum.ReturnCode.Successful) {
257
- rtn.tags2[i].list=response.content;
258
- rtn.tags2Key= rtn.tags2Key+1;
259
- }
251
+ get operationList() {
252
+ return rtn._operationList;
253
+ },
254
+ get operationRouters() {
255
+ return rtn._operationRouters;
256
+ },
257
+ getOperationList(){
258
+ if (rtn._operationList !==null){
259
+ return rtn._operationList;
260
+ }
261
+ else if(rtn.operationApiRouter){
262
+ let action =rtn.operationApiRouter.action;
263
+ let para={};
264
+ rtn.operationApiRouter.submitFormField.forEach((v) => {
265
+ para[v] = rtn.fields1Dic[v].value;
266
+ });
267
+ Vue.prototype.$api.postHandler(common.globalUri(), { action: action,para:para}).then(
268
+ function (response) {
269
+ if (response.rtnCode === Enum.ReturnCode.Successful) {
270
+ rtn._operationList=response.content;
271
+ if(rtn._operationList && rtn._operationList.length>0){
272
+ rtn._operationList.forEach((v,i) => {
273
+ if (v.modelRouter) {
274
+ var router = Router(v.modelRouter);
275
+ router.is = "ct-btn";
276
+ router.attrs = { size: "mini" }
277
+ if(router.rightField){
278
+ router.show=v[router.rightField];
279
+ }
280
+ rtn._operationList[i].router=router;
281
+ rtn._operationRouters.push(router)
282
+ }
283
+ });
284
+ }
260
285
  }
261
- );
262
- }
286
+ }
287
+ );
288
+ }
263
289
  },
264
290
  doAction(response,field) {
265
291
  if (response.responseData) {
@@ -269,9 +295,14 @@ const Detail = function (source,para ,callBack) {
269
295
  || field.id=='Trust'
270
296
  || field.id=='RealLook'
271
297
  || field.id=='StatusAdjust'
298
+ || field.id=='OperationKey'
272
299
  || field.id=='Key'){
300
+ let id=field.id;
301
+ if(field.id=='OperationKey'){
302
+ id='Key';
303
+ }
273
304
  var advIndex = rtn.tags1.findIndex((v) => {
274
- return v.appID === field.id;
305
+ return v.appID === id;
275
306
  });
276
307
  rtn.$vue.handleSelect({index:advIndex.toString()});
277
308
  }
@@ -3,34 +3,32 @@ import Base from './Base';
3
3
  const T = function (source) {
4
4
  var rtn = {
5
5
  get labelValue() {
6
- var rtn = "";
7
- var rtn1 = "";
8
- var rtn2 = "";
9
- if (source.name1) {
10
- rtn1 = source.name1;
11
- }
12
- else {
13
- if (source.code1) {
14
- rtn1 = source.code1;
15
- }
6
+ var val = "";
7
+ var lst = [];
8
+ var joinChar = source.joinChar == undefined ? '' : source.joinChar;
9
+ for (var i = 1; i <= 5; i++) {
10
+ getFileNameVal(i);
16
11
  }
12
+ val = lst.join(joinChar);
17
13
 
18
- if (source.name2) {
19
- rtn2 = source.name2;
20
- }
21
- else {
22
- if (source.code2) {
23
- rtn2 = source.code2;
14
+ return val;
15
+
16
+ function getFileNameVal(fieldNameIndex) {
17
+ var fieldVal = "";
18
+ if (source['fieldName' + fieldNameIndex]) {
19
+ if (source['name' + fieldNameIndex]) {
20
+ fieldVal = source['name' + fieldNameIndex];
21
+ }
22
+ else {
23
+ if (source['code' + fieldNameIndex]) {
24
+ fieldVal = source['code' + fieldNameIndex];
25
+ }
26
+ }
27
+ lst.push(fieldVal);
24
28
  }
25
29
  }
26
30
 
27
- if (rtn2.trim()) {
28
- rtn = rtn1 + " ~ " + rtn2;
29
- }
30
- else {
31
- rtn = rtn1;
32
- }
33
- return rtn;
31
+
34
32
  }
35
33
  };
36
34
  rtn = base.copy(Base(source), rtn);
@@ -3,10 +3,6 @@ import Base from './Base';
3
3
  import valid from '../../../validate/index';
4
4
  const T = function (source, inputType, readonly, isPassword) {
5
5
  var rtn = {
6
-
7
- // attrs: {
8
- // clearable: true,
9
- // },
10
6
  get clearable() {
11
7
  if (typeof source.clear === 'undefined'&&!readonly&&!source.locked) {
12
8
  return true;