tianheng-ui 0.1.39 → 0.1.41

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.
Files changed (28) hide show
  1. package/lib/theme-chalk/styles/feature.scss +2 -4
  2. package/lib/theme-chalk/styles/variable.scss +2 -0
  3. package/lib/tianheng-ui.js +13 -13
  4. package/package.json +1 -1
  5. package/packages/Dialog/index.vue +1 -4
  6. package/packages/FormMaking/GenerateForm.vue +1 -1
  7. package/packages/FormMaking/GenerateFormItem.vue +4 -5
  8. package/packages/FormMaking/GenerateFormItemH5.vue +2 -2
  9. package/packages/FormMaking/WidgetConfig.vue +83 -81
  10. package/packages/FormMaking/WidgetForm.vue +1 -0
  11. package/packages/FormMaking/WidgetFormItem.vue +8 -16
  12. package/packages/FormMaking/WidgetTools.vue +2 -3
  13. package/packages/FormMaking/custom/config.js +34 -5
  14. package/packages/FormMaking/custom/index.js +1 -1
  15. package/packages/FormMaking/custom/items/list_dev.vue +122 -0
  16. package/packages/FormMaking/custom/items/list_pro.vue +18 -0
  17. package/packages/FormMaking/custom/items/tableH5_pro.vue +4 -5
  18. package/packages/FormMaking/custom/items/upload.vue +1 -1
  19. package/packages/FormMaking/index.vue +6 -2
  20. package/packages/FormMaking/styles/index.scss +18 -18
  21. package/packages/TableMaking/WidgetTools.vue +3 -3
  22. package/packages/TableMaking/custom/items/search/index-h5.vue +13 -2
  23. package/packages/TableMaking/custom/items/search/index-pc.vue +12 -1
  24. package/packages/TableMaking/custom/items/table/index-pc.vue +23 -7
  25. package/packages/TableMaking/generateTable.vue +3 -3
  26. package/packages/TableMaking/widgetConfig.vue +181 -151
  27. package/packages/TableMaking/widgetTable.vue +20 -4
  28. package/packages/FormMaking/FormConfig.vue +0 -190
@@ -3,49 +3,45 @@
3
3
  <div class="tabs ">
4
4
  <div
5
5
  v-for="(item, index) in tabsMenus"
6
- :key="index"
7
6
  class="tabs-item"
8
7
  :class="{ 'tabs-item__active': activeTab.value === item.value }"
8
+ :key="index"
9
9
  @click="activeTab = item"
10
10
  >
11
11
  {{ item.title }}
12
12
  </div>
13
13
  </div>
14
14
  <div v-if="activeTab.value === 'field'" class="configItem fieldsView">
15
- <el-collapse v-model="collapseValue">
16
- <el-collapse-item title="查询字段" name="group-fields_search">
17
- <el-checkbox
18
- v-model="searchField.isCheckAll"
19
- :indeterminate="searchField.isIndeterminate"
20
- @change="val => handleCheckAllChange(val, 'searchField')"
21
- >全选</el-checkbox
22
- >
23
- <el-checkbox
24
- v-for="item in fields"
25
- :label="item.prop"
26
- :key="`searchField-${item.prop}-${item.isSearch}`"
27
- :checked="item.isSearch"
28
- @change="val => handleCheckboxChange(val, 'searchField', item)"
29
- >{{ item.label }}</el-checkbox
30
- >
31
- </el-collapse-item>
32
- <el-collapse-item title="列表字段" name="group-fields_list">
33
- <el-checkbox
34
- v-model="tableField.isCheckAll"
35
- :indeterminate="tableField.isIndeterminate"
36
- @change="val => handleCheckAllChange(val, 'tableField')"
37
- >全选</el-checkbox
38
- >
39
- <el-checkbox
40
- v-for="item in fields"
41
- :label="item.prop"
42
- :key="`tableField-${item.prop}-${item.isTable}`"
43
- :checked="item.isTable"
44
- @change="val => handleCheckboxChange(val, 'tableField', item)"
45
- >{{ item.label }}</el-checkbox
46
- >
47
- </el-collapse-item>
48
- </el-collapse>
15
+ <template v-if="fieldsTree.search.length || fieldsTree.table.length">
16
+ <el-collapse v-model="collapseValue">
17
+ <el-collapse-item title="查询字段" name="group-fields_search">
18
+ <el-tree
19
+ :data="fieldsTree.search"
20
+ :default-checked-keys="searchActiveFields"
21
+ show-checkbox
22
+ node-key="key"
23
+ :props="{ label: 'label', value: 'prop' }"
24
+ ref="fieldsTreeRef"
25
+ @check-change="handleTreeCheckChange('search')"
26
+ >
27
+ </el-tree>
28
+ </el-collapse-item>
29
+ <el-collapse-item title="列表字段" name="group-fields_table">
30
+ <el-tree
31
+ :data="fieldsTree.table"
32
+ :default-checked-keys="tableActiveFields"
33
+ show-checkbox
34
+ node-key="key"
35
+ :check-strictly="true"
36
+ :props="{ label: 'label', value: 'prop' }"
37
+ ref="fieldsTreeRef"
38
+ @check-change="handleTreeCheckChange('table')"
39
+ >
40
+ </el-tree>
41
+ </el-collapse-item>
42
+ </el-collapse>
43
+ </template>
44
+ <th-empty v-else description="请选择列表接口"></th-empty>
49
45
  </div>
50
46
  <div v-if="activeTab.value === 'table' && config.table" class="configItem">
51
47
  <el-form
@@ -112,7 +108,7 @@
112
108
  <el-switch v-model="config.search.show"> </el-switch>
113
109
  </el-form-item>
114
110
  </el-collapse-item>
115
- <el-collapse-item title="排序配置" name="group-sort">
111
+ <el-collapse-item title="排序配置" name="group-table_sort">
116
112
  <el-form-item label="排序类型">
117
113
  <el-radio-group v-model="config.table.sort.type">
118
114
  <el-radio-button label="1">降序</el-radio-button>
@@ -126,7 +122,7 @@
126
122
  clearable
127
123
  >
128
124
  <el-option
129
- v-for="item in fields"
125
+ v-for="item in config.table.options"
130
126
  :key="item.prop"
131
127
  :label="item.label"
132
128
  :value="item.alias"
@@ -135,7 +131,7 @@
135
131
  </el-select>
136
132
  </el-form-item>
137
133
  </el-collapse-item>
138
- <el-collapse-item title="分页配置" name="group-pageInfo">
134
+ <el-collapse-item title="分页配置" name="group-table_pageInfo">
139
135
  <el-form-item label="开启分页">
140
136
  <el-switch v-model="config.table.pageInfo.show"> </el-switch>
141
137
  </el-form-item>
@@ -207,7 +203,7 @@
207
203
  </el-form-item>
208
204
  </template>
209
205
  </el-collapse-item>
210
- <el-collapse-item title="提示语配置" name="group-hint">
206
+ <el-collapse-item title="提示语配置" name="group-table_hint">
211
207
  <el-form-item label="空数据">
212
208
  <el-input
213
209
  v-model="config.table.empty.text"
@@ -221,9 +217,9 @@
221
217
  ></el-input>
222
218
  </el-form-item>
223
219
  </el-collapse-item>
224
- <!-- <el-collapse-item title="数据接口配置" name="group-network">
220
+ <!-- <el-collapse-item title="数据接口配置" name="group-table_network">
225
221
  </el-collapse-item> -->
226
- <el-collapse-item name="group-button">
222
+ <el-collapse-item name="group-table_button">
227
223
  <template slot="title">
228
224
  <div class="collapse-title">
229
225
  <div>按钮配置</div>
@@ -475,17 +471,39 @@
475
471
  :modal-append-to-body="false"
476
472
  :showFooter="false"
477
473
  >
478
- <div class="toolsSeting th-flex_box">
479
- <el-card class="th-flex_aside" style="width:200px;margin-right:10px;">
480
- <el-tree
481
- :data="Object.values(config.tools || [])"
482
- :props="{ label: 'name' }"
483
- node-key="name"
484
- @node-click="handleActionConfig"
485
- ></el-tree>
486
- </el-card>
487
- <el-card v-if="dialog.data" class="th-fiex_content">
474
+ <div class="eventsSetting th-flex_box th-is_border">
475
+ <div class="list th-flex_aside">
476
+ <div class="events-header th-sticky_top">
477
+ <div>按钮库</div>
478
+ <!-- <el-button type="text" icon="el-icon-plus" size="mini" disabled
479
+ >添加</el-button
480
+ > -->
481
+ </div>
482
+ <div
483
+ v-for="(item, index) in Object.values(config.tools || [])"
484
+ class="list-item th-is_hover"
485
+ :class="{
486
+ 'th-is_active': dialog.data && dialog.data.name === item.name
487
+ }"
488
+ :key="item.key"
489
+ @click="dialog.data = item"
490
+ >
491
+ <div class="list-item-value">{{ item.name }}</div>
492
+ <!-- <el-popconfirm
493
+ :title="`是否确定删除方法 ${item.name}`"
494
+ confirm-button-text="删除"
495
+ confirm-button-type="danger"
496
+ @confirm="handleEventDialogDelete(item, index)"
497
+ >
498
+ <i class="el-icon-delete" slot="reference"></i>
499
+ </el-popconfirm> -->
500
+ </div>
501
+ </div>
502
+ <div class="detail th-fiex_content">
503
+ <div class="events-header th-sticky_top">按钮详情</div>
488
504
  <el-form
505
+ v-if="dialog.data"
506
+ class="detail-form"
489
507
  ref="form"
490
508
  :model="dialog.data"
491
509
  label-width="80px"
@@ -587,7 +605,7 @@
587
605
  </el-select>
588
606
  </el-form-item>
589
607
  </el-form>
590
- </el-card>
608
+ </div>
591
609
  </div>
592
610
  </th-dialog>
593
611
  </div>
@@ -616,7 +634,6 @@ export default {
616
634
  { title: "样式设置", value: "css" }
617
635
  ],
618
636
  activeTab: { title: "列表属性", value: "table" },
619
- fields: [],
620
637
  searchField: {
621
638
  isCheckAll: false,
622
639
  isIndeterminate: false
@@ -626,12 +643,14 @@ export default {
626
643
  isIndeterminate: false
627
644
  },
628
645
  collapseValue: [
646
+ "group-fields_search",
647
+ "group-fields_table",
629
648
  "group-table",
630
- "group-pageInfo",
631
- "group-sort",
632
- "group-hint",
633
- "group-network",
634
- "group-button"
649
+ "group-table_pageInfo",
650
+ "group-table_sort",
651
+ "group-table_hint",
652
+ "group-table_network",
653
+ "group-table_button"
635
654
  ],
636
655
  pageInfoLayout: [
637
656
  { label: "总条数", value: "total" },
@@ -660,16 +679,16 @@ export default {
660
679
  { required: true, message: "请选择列表接口", trigger: "change" }
661
680
  ]
662
681
  },
682
+ fieldsTree: {
683
+ search: [],
684
+ table: []
685
+ },
663
686
  dialog: { show: false, data: null }
664
687
  };
665
688
  },
666
689
  watch: {
667
690
  config(val) {
668
691
  this.handleFieldsApiChange(val.table.mounted.api);
669
- this.handleFields();
670
- },
671
- fields(val) {
672
- this.handleFields();
673
692
  },
674
693
  apiOptions() {
675
694
  this.handleFieldsApiChange(this.config.table.mounted.api);
@@ -678,113 +697,76 @@ export default {
678
697
  computed: {
679
698
  searchActiveFields() {
680
699
  const data = this.config.search.options.map(item => {
681
- return item.prop;
700
+ return item.key;
682
701
  });
683
702
  return data;
684
703
  },
685
704
  tableActiveFields() {
686
705
  const data = this.config.table.options.map(item => {
687
- return item.prop;
706
+ return item.key;
688
707
  });
689
708
  return data;
690
709
  }
691
710
  },
692
711
  mounted() {},
693
712
  methods: {
694
- handleFields() {
695
- this.fields.forEach(item => {
696
- item.isSearch = this.searchActiveFields.includes(item.prop);
697
- item.isTable = this.tableActiveFields.includes(item.prop);
698
- });
699
- this.searchField = {
700
- isCheckAll: this.searchActiveFields.length === this.fields.length,
701
- isIndeterminate:
702
- this.searchActiveFields.length !== 0 &&
703
- this.searchActiveFields.length !== this.fields.length
704
- };
705
- this.tableField = {
706
- isCheckAll: this.tableActiveFields.length === this.fields.length,
707
- isIndeterminate:
708
- this.tableActiveFields.length !== 0 &&
709
- this.tableActiveFields.length !== this.fields.length
710
- };
711
- },
712
- handleCheckAllChange(bool, action) {
713
- if (action === "searchField") {
714
- this.fields.forEach(item => {
715
- item.isSearch = bool;
716
- });
717
- const data = deepClone(this.fields);
718
- this.config.search.options = bool ? data : [];
719
- this.searchField = { isCheckAll: bool, isIndeterminate: false };
720
- return;
721
- }
722
- if (action === "tableField") {
723
- this.fields.forEach(item => {
724
- item.isTable = bool;
725
- });
726
- const data = deepClone(this.fields);
727
- this.config.table.options = bool ? data : [];
728
- this.tableField = { isCheckAll: bool, isIndeterminate: false };
729
- return;
730
- }
731
- },
732
- handleCheckboxChange(bool, action, data) {
733
- if (action === "searchField") {
734
- data.isSearch = bool;
735
- bool
736
- ? this.config.search.options.push(deepClone(data))
737
- : (this.config.search.options = this.config.search.options.filter(
738
- item => {
739
- return item.prop !== data.prop;
740
- }
741
- ));
742
- this.searchField = {
743
- isCheckAll: this.config.search.options.length === this.fields.length,
744
- isIndeterminate:
745
- this.config.search.options.length !== 0 &&
746
- this.config.search.options.length !== this.fields.length
747
- };
748
- return;
749
- }
750
- if (action === "tableField") {
751
- data.isTable = bool;
752
- bool
753
- ? this.config.table.options.push(deepClone(data))
754
- : (this.config.table.options = this.config.table.options.filter(
755
- item => {
756
- return item.prop !== data.prop;
757
- }
758
- ));
759
- this.tableField = {
760
- isCheckAll: this.config.table.options.length === this.fields.length,
761
- isIndeterminate:
762
- this.config.table.options.length !== 0 &&
763
- this.config.table.options.length !== this.fields.length
764
- };
765
- return;
766
- }
767
- },
768
713
  handleActionConfig(data) {
769
714
  this.dialog = { show: true, data };
770
715
  },
771
716
  handleFieldsApiChange(val) {
772
- const dataArr = this.apiOptions.filter(item => {
717
+ const api = this.apiOptions.filter(item => {
773
718
  return item.id === val;
774
- });
775
- if (dataArr.length && dataArr[0].paramsOut) {
776
- const fields = dataArr[0].paramsOut.map(item => {
777
- return {
778
- label: item.note || item.name,
779
- alias: item.name,
780
- prop: item.name,
781
- elType: "input",
782
- align: "left"
783
- };
719
+ })[0];
720
+ if (!api) return (this.fieldsTree = { search: [], table: [] });
721
+
722
+ const initParams = (paramsList, pProp) => {
723
+ paramsList.forEach(item => {
724
+ item.elType = "input";
725
+ item.align = "left";
726
+ item.pProp = pProp ? `${pProp}.${item.prop}` : item.prop;
727
+ if (item.children && item.children.length) {
728
+ initParams(item.children, item.pProp);
729
+ }
730
+ });
731
+ };
732
+ this.fieldsTree.search = deepClone(api.interfaceParameterInputList) || [];
733
+ initParams(this.fieldsTree.search);
734
+ this.fieldsTree.table = deepClone(api.interfaceParameterOutPutList) || [];
735
+ initParams(this.fieldsTree.table);
736
+ },
737
+ handleTreeCheckChange(action) {
738
+ let nodes = deepClone(this.$refs.fieldsTreeRef.getCheckedNodes());
739
+ if (action === "search") {
740
+ const keys = this.config.search.options.map(item => {
741
+ return item.key;
742
+ });
743
+ nodes.map(item => {
744
+ const index = keys.indexOf(item.key);
745
+ if (index > -1) {
746
+ return this.config.search.options[index];
747
+ } else {
748
+ return item;
749
+ }
750
+ });
751
+ this.config.search.options = nodes;
752
+ } else {
753
+ const keys = this.config.table.options.map(item => {
754
+ return item.key;
755
+ });
756
+
757
+ nodes = nodes.map(item => {
758
+ const index = keys.indexOf(item.key);
759
+ if (index > -1) {
760
+ return this.config.table.options[index];
761
+ } else {
762
+ return item;
763
+ }
784
764
  });
785
- this.fields = fields;
786
- } else this.fields = [];
765
+ this.config.table.options = nodes;
766
+ }
767
+ console.log("handleTreeCheckChange =>", nodes);
787
768
  },
769
+ // 对外暴露表单校验
788
770
  formValidate() {
789
771
  return new Promise((resolve, reject) => {
790
772
  if (this.$refs.formRef) {
@@ -865,6 +847,54 @@ export default {
865
847
  }
866
848
  }
867
849
  }
850
+
851
+ .eventsSetting {
852
+ height: 100%;
853
+
854
+ .events-header {
855
+ display: flex;
856
+ align-items: center;
857
+ justify-content: space-between;
858
+ padding: 0 10px;
859
+ height: 40px;
860
+ background-color: #f2f6fc;
861
+ z-index: 10;
862
+ }
863
+
864
+ .list {
865
+ width: 200px;
866
+ min-height: 430px;
867
+ overflow-y: overlay;
868
+ border-right: 1px solid #eee;
869
+
870
+ .list-item {
871
+ display: flex;
872
+ // align-items: center;
873
+ margin: 5px;
874
+ padding: 10px;
875
+ border-radius: 3px;
876
+ border: 1px solid #dcdfe6;
877
+ transition: 0.25s;
878
+
879
+ .list-item-title {
880
+ color: var(--th-green);
881
+ }
882
+ .list-item-value {
883
+ flex: 1;
884
+ padding: 0 5px;
885
+ }
886
+ i {
887
+ cursor: pointer;
888
+ }
889
+ }
890
+ }
891
+
892
+ .detail {
893
+ .detail-form {
894
+ padding: 10px;
895
+ }
896
+ }
897
+ }
868
898
  }
869
899
  </style>
870
900
 
@@ -11,7 +11,13 @@
11
11
  <div class="table-item table-header">
12
12
  <div class="table-item-custom">拖动</div>
13
13
  <div>列名</div>
14
- <!-- <div>字段</div> -->
14
+ <el-tooltip
15
+ content="对应列内容的字段名,支持eval函数,非必要不修改!"
16
+ placement="top-start"
17
+ effect="light"
18
+ >
19
+ <div><el-button type="text">字段</el-button></div>
20
+ </el-tooltip>
15
21
  <div>类型</div>
16
22
  <div>默认值</div>
17
23
  <!-- <div>数据来源</div> -->
@@ -38,6 +44,7 @@
38
44
  <i class="iconfont icon-drag drag-widget"></i>
39
45
  </div>
40
46
  <el-input v-model="item.label" size="mini"></el-input>
47
+ <el-input v-model="item.pProp" size="mini"></el-input>
41
48
  <div>
42
49
  <el-select
43
50
  v-model="item.elType"
@@ -79,11 +86,17 @@
79
86
  <div v-else class="search-content"></div>
80
87
  </div>
81
88
  <div class="table-title">列表字段</div>
82
- <div class="tableList" style="height: calc(100% - 340px);">
89
+ <div class="tableList" style="height: calc(100% - 350px);">
83
90
  <div class="table-item table-header">
84
91
  <div class="table-item-custom">拖动</div>
85
92
  <div>列名</div>
86
- <!-- <div>字段</div> -->
93
+ <el-tooltip
94
+ content="对应列内容的字段名,支持eval函数,非必要不修改!"
95
+ placement="top-start"
96
+ effect="light"
97
+ >
98
+ <div><el-button type="text">字段</el-button></div>
99
+ </el-tooltip>
87
100
  <div>对齐</div>
88
101
  <div>宽度</div>
89
102
  <div class="table-item-custom">排序</div>
@@ -109,6 +122,7 @@
109
122
  <i class="iconfont icon-drag drag-widget"></i>
110
123
  </div>
111
124
  <el-input v-model="item.label" size="mini"></el-input>
125
+ <el-input v-model="item.pProp" size="mini"></el-input>
112
126
  <div>
113
127
  <el-select v-model="item.align" placeholder="请选择" size="mini">
114
128
  <el-option
@@ -219,9 +233,11 @@ export default {
219
233
 
220
234
  <style lang="scss" scoped>
221
235
  .widgetTable {
222
- height: 100%;
236
+ height: calc(100% - 45px);
223
237
  padding: 10px;
224
238
  background-color: white;
239
+ overflow-y: overlay;
240
+
225
241
  .table-title {
226
242
  height: 25px;
227
243
  line-height: 25px;