@tongfun/tf-widget 0.1.5 → 0.1.9

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 (85) hide show
  1. package/.browserslistrc +3 -3
  2. package/.editorconfig +5 -5
  3. package/.eslintrc.js +17 -17
  4. package/README.md +39 -24
  5. package/dist/css/chunk-9c7a8e06.920744ef.css +1 -0
  6. package/dist/css/chunk-vendors.de967301.css +1 -0
  7. package/dist/css/index.9f1afeaf.css +1 -0
  8. package/dist/fonts/element-icons.535877f5.woff +0 -0
  9. package/dist/fonts/element-icons.732389de.ttf +0 -0
  10. package/dist/js/chunk-9c7a8e06.ffff58b5.js +1 -0
  11. package/dist/js/chunk-vendors.45086d09.js +39 -0
  12. package/dist/js/index.a3b16e45.js +1 -0
  13. package/lib/tf-widget.common.js +1294 -240
  14. package/lib/tf-widget.css +1 -1
  15. package/lib/tf-widget.umd.js +1294 -240
  16. package/lib/tf-widget.umd.min.js +3 -3
  17. package/package/t-data-list/index.js +6 -0
  18. package/package/t-data-list/main.vue +192 -0
  19. package/package/t-data-list/src/condition-input/basic.vue +31 -0
  20. package/package/t-data-list/src/condition-input/date.vue +106 -0
  21. package/package/t-data-list/src/condition-input/index.vue +100 -0
  22. package/package/t-data-list/src/condition-input/input.vue +31 -0
  23. package/package/t-data-list/src/condition-input/number.vue +115 -0
  24. package/package/t-data-list/src/condition-input/select.vue +86 -0
  25. package/package/t-data-list/src/js/fieldTypeEnum.js +10 -0
  26. package/package/t-data-list/src/js/operatorEnum.js +109 -0
  27. package/package/t-data-list/src/js/qureyParamsEnum.js +4 -0
  28. package/package/t-data-list/src/js/util.js +34 -0
  29. package/package/t-data-list/src/mixins/button-controll-mixin.js +77 -0
  30. package/package/t-data-list/src/pushdown/push-down.vue +158 -0
  31. package/package/t-data-list/src/t-list-search.vue +32 -0
  32. package/package/t-data-list/src/t-plan/condition-always-item.vue +143 -0
  33. package/package/t-data-list/src/t-plan/condition-mult-item.vue +222 -0
  34. package/package/t-data-list/src/t-plan/index.vue +190 -0
  35. package/package/t-data-list/src/t-plan/plan-content.vue +396 -0
  36. package/package/t-data-list/src/t-table/index.vue +120 -0
  37. package/package/t-data-list/src/t-table/table-group-item-edit.vue +238 -0
  38. package/package/t-data-list/src/t-table/table-group-item.vue +87 -0
  39. package/package/t-data-list/src/t-table/table-group.vue +179 -0
  40. package/package/t-data-list/src/t-table/table-records-header-popover.vue +250 -0
  41. package/package/t-data-list/src/t-table/table-records-selected.vue +159 -0
  42. package/package/t-data-list/src/t-table/table-records.vue +324 -0
  43. package/package/t-input/children/address.vue +101 -0
  44. package/package/t-input/children/basic-display.vue +41 -0
  45. package/package/t-input/children/basic.vue +251 -0
  46. package/package/t-input/children/date.vue +89 -0
  47. package/package/t-input/children/group-components/group-dialog.vue +350 -0
  48. package/package/t-input/children/group.vue +126 -0
  49. package/package/t-input/children/input.vue +72 -0
  50. package/package/t-input/children/number.vue +74 -0
  51. package/package/t-input/children/select.vue +89 -0
  52. package/package/t-input/children/tfile/fiile-enclosure.vue +233 -0
  53. package/package/t-input/children/tfile/file-img/comp.png +0 -0
  54. package/package/t-input/children/tfile/file-img/excel.png +0 -0
  55. package/package/t-input/children/tfile/file-img/img.png +0 -0
  56. package/package/t-input/children/tfile/file-img/pdf.png +0 -0
  57. package/package/t-input/children/tfile/file-img/word.png +0 -0
  58. package/package/t-input/index.js +7 -0
  59. package/package/t-input/index.vue +337 -0
  60. package/package/t-input/tInputCache.js +24 -0
  61. package/package/tf-layout/README.md +69 -0
  62. package/package/tf-layout/index.js +8 -0
  63. package/package/tf-layout/src/components/tf-labelbar.vue +376 -0
  64. package/package/tf-layout/src/components/tf-menu.vue +180 -0
  65. package/package/tf-layout/src/components/tf-right-menu.vue +89 -0
  66. package/package/tf-layout/src/components/tf-rotate-box.vue +50 -0
  67. package/package/tf-layout/src/tf-layout.vue +115 -0
  68. package/package/tf-widget/src/assets/common-input.less +11 -0
  69. package/package/tf-widget/src/children/basic-data/basic-data.vue +2 -1
  70. package/package/tf-widget/src/children/date-time.vue +1 -1
  71. package/package/tf-widget/src/children/date.vue +1 -0
  72. package/package/tf-widget/src/children/decimal.vue +20 -1
  73. package/package/tf-widget/src/children/integer.vue +31 -12
  74. package/package/tf-widget/src/children/single-line-text.vue +15 -7
  75. package/package/tf-widget/src/children/small-pictures.vue +5 -1
  76. package/package/tf-widget/src/children/text-area.vue +5 -4
  77. package/package/tf-widget/src/children/tf-select.vue +16 -7
  78. package/package.json +4 -2
  79. package/postinstall.js +10 -10
  80. package/src/api/file-enclosure.js +26 -0
  81. package/src/api/push-down.js +19 -0
  82. package/src/api/tableV3.js +186 -0
  83. package/src/index.js +11 -3
  84. package/src/mixins/t-data-query-mixin.js +289 -0
  85. package/src/utils/request.js +4 -1
@@ -0,0 +1,324 @@
1
+ <template>
2
+ <div ref="tableRecords" class="table-records">
3
+ <div class="table-wrapper">
4
+ <ux-grid
5
+ ref="dataRecordsRef"
6
+ v-loading="syncData.tableLoading"
7
+ :data="data.records"
8
+ size="mini"
9
+ column-key
10
+ beautify-table
11
+ :show-summary="showSummary && !disableSum"
12
+ :summary-method="summaryMethod"
13
+ :width-resize="true"
14
+ :highlight-current-row="false"
15
+ show-overflow="tooltip"
16
+ @row-click="handleRowClick"
17
+ @select="handleSelect"
18
+ @row-dblclick="handelRowDblClick"
19
+ @select-all="selectAll"
20
+ >
21
+ <ux-table-column :width="50" type="checkbox" fixed="left" />
22
+ <template v-for="(item,index) in layout">
23
+ <ux-table-column
24
+ v-if="item.visible"
25
+ :key="item.field"
26
+ :width="layout.length<8?'': '150'"
27
+ align="center"
28
+ resizable
29
+ :title="item.title"
30
+ :field="item.field"
31
+ >
32
+ <template v-slot:header="{ column }">
33
+ <div class="filter-slot">
34
+ <span class="title">{{ column.title }}</span>
35
+ <TableRecordsHeaderPopover
36
+ :class="{'my-popover':true,'is-show-filter-icon': !!item.isShowIcon || item.isShowFilter }"
37
+ :item="item"
38
+ :upload-data-map="uploadDataMap"
39
+ :table-filter-data="tableFilterData"
40
+ @condition-change="$emit('condition-change', $event)"
41
+ @filter-click="filterClick($event,index)"
42
+ />
43
+ </div>
44
+ </template>
45
+ </ux-table-column>
46
+ </template>
47
+ </ux-grid>
48
+ <TableRecordsSelected
49
+ v-if="isSelector"
50
+ :select-data="selectedRows"
51
+ :show-field="syncData.displayField"
52
+ @del="handleDel"
53
+ @clear="handleClearSelected"
54
+ />
55
+ </div>
56
+
57
+ <!-- 分页 -->
58
+ <div class="page-wrapper">
59
+ <el-pagination
60
+ :current-page="currentPage"
61
+ :page-sizes="[200, 500, 1000, 5000]"
62
+ :page-size="pageSize"
63
+ layout="total, sizes, prev, pager, next, jumper"
64
+ :total="data.total"
65
+ @size-change="$emit('size-change', $event)"
66
+ @current-change="$emit('current-change', $event)"
67
+ />
68
+ </div>
69
+
70
+ </div>
71
+ </template>
72
+ <script>
73
+ import TableRecordsSelected from './table-records-selected'
74
+ export default {
75
+ components: {
76
+ TableRecordsHeaderPopover: () => import('./table-records-header-popover.vue'),
77
+ TableRecordsSelected
78
+ },
79
+ props: {
80
+ data: {
81
+ type: Object,
82
+ default: null
83
+ },
84
+ isSelector: {
85
+ type: Boolean,
86
+ default: false
87
+ },
88
+ layout: {
89
+ type: Array,
90
+ default: () => {
91
+ return []
92
+ }
93
+ },
94
+ sum: {
95
+ type: Array,
96
+ default: () => []
97
+ },
98
+ pageSize: {
99
+ type: Number,
100
+ default: 100
101
+ },
102
+ currentPage: {
103
+ type: Number,
104
+ default: 1
105
+ },
106
+ updateInDialog: {
107
+ type: Boolean,
108
+ default: false
109
+ },
110
+ disableSum: {
111
+ type: Boolean,
112
+ default: false
113
+ }
114
+ },
115
+ inject: ['selectedRows', 'ids', 'syncData', 'getDbRow', 'showSummary', 'queryType'],
116
+ data () {
117
+ return {
118
+ tableFilterData: {}, // 表头过滤条件的数据的存储集合
119
+ uploadDataMap: {}, // 真实向上发送的数据集合
120
+ idField: null,
121
+ filterSelectedId: '',
122
+ isSingleFilter: true,
123
+ displayField: ''
124
+ }
125
+ },
126
+ computed: {
127
+
128
+ },
129
+ watch: {
130
+ layout: {
131
+ handler (newVal) {
132
+ // 初始化绑定tableFilterData
133
+ // 如果tableFilterData有内容则抛出
134
+ if (Object.keys(this.tableFilterData).length !== 0) {
135
+ return
136
+ }
137
+ // 初始化tableFilterData的数据
138
+ newVal.length > 0 && newVal.forEach(e => {
139
+ if (e.isId) this.idField = e.field
140
+ this.$set(this.tableFilterData, e.field, { field: e.field, operator: '', value: '', fieldType: e.componentType })
141
+ })
142
+ },
143
+ immediate: true
144
+ },
145
+ 'data.records': {
146
+ handler (newValue) {
147
+ /**
148
+ * 在列表的情况下,只有提交审核等几个有限的操作,数据刷新不清空已选
149
+ */
150
+ if (this.queryType === 'LIST' && this.syncData.tableSelectionClear) {
151
+ return this.clearSelectedRows()
152
+ }
153
+ this.syncData.tableSelectionClear = true
154
+
155
+ /**
156
+ * 在弹窗的所有情况和列表特殊情况(提交/审核后重新获取数据)
157
+ * 数据刷新后,重新勾选之前已经选择的数据
158
+ */
159
+ const xidList = this.selectedRows.map(item => item.Sid)
160
+ if (!xidList[0]) {
161
+ return
162
+ }
163
+ const currentSelectRows = newValue.filter(item => {
164
+ if (xidList.indexOf(item.Sid) > -1) {
165
+ this.selectedRows[xidList.indexOf(item.Sid)] = item
166
+ return true
167
+ }
168
+ return false
169
+ })
170
+ const params = currentSelectRows.map(x => {
171
+ return { row: x, selected: true }
172
+ })
173
+ this.$refs.dataRecordsRef.toggleRowSelection(params)
174
+ }
175
+ }
176
+ },
177
+ methods: {
178
+ handleClearSelected () {
179
+ this.$refs.dataRecordsRef.clearSelection()
180
+ this.clearSelectedRows()
181
+ },
182
+ filterClick (value, index) {
183
+ if (!this.isSingleFilter) {
184
+ return
185
+ }
186
+ // 重置其他页面的表头过滤显示状态
187
+ if (!value && this.filterSelectedId) {
188
+ this.layout[this.filterSelectedId].isShowFilter = false
189
+ }
190
+ this.filterSelectedId = index
191
+ },
192
+ // 清空已选
193
+ clearSelectedRows () {
194
+ this.selectedRows.splice(0, this.selectedRows.length)
195
+ this.ids.splice(0, this.ids.length)
196
+ },
197
+ // 列表合计
198
+ summaryMethod () {
199
+ return [this.sum]
200
+ },
201
+ handleDel (item) {
202
+ this.selectedRows.splice(this.selectedRows.indexOf(item), 1)
203
+ this.ids.splice(this.ids.indexOf(item.id), 1)
204
+ this.$refs.dataRecordsRef.toggleRowSelection([{ row: item, selected: false }])
205
+ },
206
+ handleRowClick (row) {
207
+ this.$refs.dataRecordsRef.toggleRowSelection([{ row }])
208
+ if (!this.ids.includes(row[this.idField])) {
209
+ this.selectedRows.push(row)
210
+ this.ids.push(row[this.idField])
211
+ } else {
212
+ this.selectedRows.splice(this.selectedRows.indexOf(row), 1)
213
+ this.ids.splice(this.ids.indexOf(row[this.idField]), 1)
214
+ }
215
+ },
216
+ handelRowDblClick (row) {
217
+ // todo:这里判断条件太多,并且条件之间有优先级,将来条件可能冲突
218
+ if (this.isSelector) {
219
+ return this.$emit('fastConfirm', row)
220
+ }
221
+ if (this.updateInDialog) {
222
+ return this.$emit('dbClick', row[this.idField])
223
+ }
224
+ if (this.getDbRow) {
225
+ return this.$emit('dbRowClick', row)
226
+ }
227
+
228
+ const randomStr = Math.random().toString(36).slice(8)
229
+ this.$router.replace(`${this.$route.path}/update/${randomStr}/${row[this.idField]}`)
230
+ },
231
+ selectAll (selection) {
232
+ if (selection.length > 1) {
233
+ // 是全选的处理方式
234
+ const needAddData = this.data.records.filter(e => !this.selectedRows.includes(e))
235
+ needAddData.forEach(e => {
236
+ this.selectedRows.push(e)
237
+ this.ids.push(e[this.idField])
238
+ })
239
+ } else {
240
+ // 非全选的处理方式
241
+ const selectedRowsCache = this.selectedRows.filter(e => !this.data.records.includes(e))
242
+ this.selectedRows.splice(0, this.selectedRows.length)
243
+ this.ids.splice(0, this.ids.length)
244
+ this.selectedRows.push(...selectedRowsCache)
245
+ this.ids.push(...selectedRowsCache.map(v => v[this.idField]))
246
+ }
247
+ },
248
+
249
+ /**
250
+ * 复选框被勾选
251
+ */
252
+ handleSelect (selection, row) {
253
+ if (!this.ids.includes(row[this.idField])) {
254
+ if (selection.includes(row)) {
255
+ this.selectedRows.push(row)
256
+ row[this.idField] && this.ids.push(row[this.idField])
257
+ }
258
+ } else {
259
+ if (!selection.includes(row)) {
260
+ this.selectedRows.splice(this.selectedRows.indexOf(row), 1)
261
+ row[this.idField] && this.ids.splice(this.ids.indexOf(row[this.idField]), 1)
262
+ }
263
+ }
264
+ }
265
+
266
+ }
267
+ }
268
+ </script>
269
+
270
+ <style scoped lang='less'>
271
+ .table-records {
272
+ height:90vh;
273
+ .table-wrapper {
274
+ overflow: hidden;
275
+ display: flex;
276
+ ::v-deep .plTableBox{
277
+ .elx-table--body-wrapper{
278
+ height: calc(90vh - 230px );//修改以适应合计行的添加,
279
+ // margin-bottom: 10px;
280
+ }
281
+ .elx-table--footer-wrapper{
282
+ margin-top: 0px!important;
283
+ }
284
+ .elx-header--column{
285
+ color: #085497;
286
+ transition: opacity 0.5s ease-in;
287
+ .filter-slot{
288
+ display: flex;
289
+ align-items: center;
290
+ justify-content: center;
291
+ }
292
+ .my-popover{
293
+ opacity: 0;
294
+ width: 0;
295
+ cursor: pointer;
296
+ transition: all 0.5s ease-out;
297
+ }
298
+ :hover .my-popover{
299
+ width:15px;
300
+ opacity: 1;
301
+ transition: opacity 0.5s ease-in;
302
+ }
303
+ .is-show-filter-icon{
304
+ width:15px;
305
+ opacity: 1;
306
+ }
307
+
308
+ }
309
+ }
310
+ }
311
+ .page-wrapper {
312
+ margin-top:5px;
313
+ position:relative;
314
+ .el-pagination {
315
+ position:absolute;
316
+ right:0;
317
+ }
318
+ }
319
+ }
320
+ ::v-deep .elx-table:not(.is--empty).show--foot.scroll--x .elx-table--body-wrapper{
321
+ overflow-x: hidden !important;
322
+ }
323
+
324
+ </style>
@@ -0,0 +1,101 @@
1
+ <template>
2
+ <div>
3
+ <!-- 分组输入框 -->
4
+ <div class="address">
5
+ <el-cascader
6
+ :value="value"
7
+ :options="options"
8
+ placeholder="选择地址"
9
+ popper-class="t-input-cascader-box"
10
+ separator=""
11
+ :props="{
12
+ value:'name',
13
+ label:'name',
14
+ children:'districts',
15
+ leaf:'leaf',
16
+ lazy:'true',
17
+ lazyLoad:lazyLoad,
18
+ checkStrictly: true
19
+ }"
20
+ filterable
21
+ @input="handleInput"
22
+ />
23
+ </div>
24
+ </div>
25
+ </template>
26
+
27
+ <script>
28
+
29
+ import axios from 'axios'
30
+ import TInputCache from '../tInputCache'
31
+
32
+ export default {
33
+ name: 'Address',
34
+ props: {
35
+ value: {
36
+ type: [String, Object],
37
+ default: null
38
+ }
39
+ },
40
+ data () {
41
+ return {
42
+ options: []
43
+ }
44
+ },
45
+ mounted () {
46
+ this.getAddress()
47
+ },
48
+ methods: {
49
+ lazyLoad (node, resolve) {
50
+ const { data } = node
51
+ resolve(data)
52
+ },
53
+ async getAddress () {
54
+ const tInputDataCache = new TInputCache()
55
+ console.log(tInputDataCache.getCacheData('address'))
56
+ if (tInputDataCache.getCacheData('address')) {
57
+ this.options = tInputDataCache.getCacheData('address')
58
+ return
59
+ }
60
+ // 这边的接口用的自己的key,后期可能会换
61
+ const res = await axios.get('https://restapi.amap.com/v3/config/district?subdistrict=3&key=7f3a1929b7016033782ef2aace13c449')
62
+ if (!res.data) {
63
+ this.$message.error('未查询到数据')
64
+ return
65
+ }
66
+ const optionData = this.setLeaf(res.data.districts[0].districts)
67
+ this.options = optionData
68
+ tInputDataCache.setCacheData('address', optionData)
69
+ },
70
+ setLeaf (data) {
71
+ if (!data || data.length === 0) {
72
+ return
73
+ }
74
+ console.log(data)
75
+ data.forEach(e => {
76
+ e.leaf = true
77
+ if (e.districts.length > 0) {
78
+ e.leaf = false
79
+ this.setLeaf(e.districts)
80
+ }
81
+ })
82
+ return data
83
+ },
84
+ handleInput (value) {
85
+ console.log(value.join(''))
86
+ }
87
+ }
88
+ }
89
+ </script>
90
+ <style lang="less">
91
+ // 更改地址组组件的样式
92
+ .t-input-cascader-box{
93
+ .el-cascader-panel{
94
+ height: 400px;
95
+ ul{
96
+ height: 400px;
97
+ }
98
+ }
99
+ }
100
+
101
+ </style>
@@ -0,0 +1,41 @@
1
+ <template>
2
+ <el-input disabled :value="displayName" suffix-icon="el-icon-search" />
3
+ </template>
4
+ <script>
5
+ export default {
6
+ components: {
7
+ },
8
+ props: {
9
+ value: {
10
+ type: Object,
11
+ default: function () {
12
+ return { name: null, id: null }
13
+ }
14
+ }
15
+ },
16
+ data () {
17
+ return {
18
+
19
+ }
20
+ },
21
+ computed: {
22
+ displayName () {
23
+ return this.value.name
24
+ }
25
+ },
26
+ created () {
27
+ if (!this.value) {
28
+ this.hanleInput({ name: null, id: null })
29
+ }
30
+ },
31
+ methods: {
32
+ hanleInput (value) {
33
+ this.$emit('input', value)
34
+ }
35
+ }
36
+ }
37
+ </script>
38
+
39
+ <style scoped>
40
+
41
+ </style>
@@ -0,0 +1,251 @@
1
+ <template>
2
+ <div class="basic-input">
3
+ <!-- 输入控件 -->
4
+ <el-autocomplete
5
+ ref="basic"
6
+ v-model="displayValue"
7
+ placeholder=""
8
+ :fetch-suggestions="getAdvice"
9
+ :disabled="disabled"
10
+ popper-class="basic-suggest-poper"
11
+ :trigger-on-focus="false"
12
+ @select="handleSelect"
13
+ @keydown.delete.native="handleDeleteKeyDown"
14
+ >
15
+ <i slot="suffix" class="el-icon-search" style="cursor: pointer" @click="showDialog" />
16
+ <template slot-scope="{item}">
17
+ <div>{{ suggestDisplay(item) }}</div>
18
+ </template>
19
+ </el-autocomplete>
20
+
21
+ <!-- 弹窗数据选择器 -->
22
+ <el-dialog
23
+ :visible.sync="dialogVisible"
24
+ width="80%"
25
+ :append-to-body="appendToBody"
26
+ :close-on-click-modal="false"
27
+ :close-on-press-escape="false"
28
+ :modal-append-to-body="modalAppendToBody"
29
+ @open="getTableData"
30
+ >
31
+ <div class="dataDialog">
32
+ <Ttable
33
+ class="t-table"
34
+ is-selector
35
+ :layout="tableLayout"
36
+ :sum="tableSum"
37
+ :data="tableData"
38
+ enable-group
39
+ :page-size="query.pageSize"
40
+ :current-page="query.pageNum"
41
+ update-in-dialog
42
+ @condition-change="handleHeadChange"
43
+ @groupChange="handleGroupChange"
44
+ @size-change="handleSizeChange"
45
+ @current-change="handleCurrentChange"
46
+ @fastConfirm="handleFastSelect"
47
+ />
48
+ </div>
49
+ <template v-slot:title>
50
+ <div class="common-title">
51
+ <TListSearch class="common-table-buttons-search" @search="handleSuggestMultiCondition($event,true)" />
52
+ </div>
53
+ </template>
54
+ <span slot="footer" class="dialog-footer basic-selector-footer">
55
+ <el-button class="common-header-button close" size="mini" type="primary" @click="dialogVisible = false">取 消</el-button>
56
+ <el-button class="common-header-button" size="mini" type="primary" @click="handleDialogConfirm">确 定</el-button>
57
+ </span>
58
+ </el-dialog>
59
+ </div>
60
+ </template>
61
+ <script>
62
+ import TListSearch from '../../t-data-list/src/t-list-search.vue'
63
+ import Ttable from '../../t-data-list/src/t-table/index'
64
+ import dataQuery from '@/mixins/t-data-query-mixin.js'
65
+ export default {
66
+ components: {
67
+ TListSearch,
68
+ Ttable
69
+ },
70
+ mixins: [dataQuery],
71
+ props: {
72
+ value: {
73
+ type: Object,
74
+ default: () => {
75
+ return { name: '', id: null }
76
+ }
77
+ },
78
+ limitation: {
79
+ type: Object,
80
+ default: () => {}
81
+ },
82
+ disabled: {
83
+ type: Boolean,
84
+ default: false
85
+ },
86
+ appendToBody: {
87
+ type: Boolean,
88
+ default: true
89
+ },
90
+ modalAppendToBody: {
91
+ type: Boolean,
92
+ default: false
93
+ }
94
+ },
95
+ inject: ['target', 'entity'],
96
+ data () {
97
+ return {
98
+ dialogVisible: false,
99
+ // 选中一个基础资料之后,基础资料控件显示的名称
100
+ displayField: null,
101
+ queryType: 'SELECTOR'
102
+ }
103
+ },
104
+ computed: {
105
+ displayValue: {
106
+ set (value) {
107
+ if (this.value.id) {
108
+ return
109
+ }
110
+ this.value.name = value
111
+ },
112
+ get () {
113
+ if (!this.value) {
114
+ return
115
+ }
116
+ return this.value.name
117
+ }
118
+ }
119
+ },
120
+ created () {
121
+ if (this.entity) {
122
+ this.$nextTick(() => {
123
+ this.$refs.basic.focus()
124
+ })
125
+ }
126
+ this.getTableLayout()
127
+ },
128
+ methods: {
129
+ /**
130
+ * 弹窗和数据选择
131
+ */
132
+ // 展开弹窗
133
+ showDialog () {
134
+ if (this.disabled) {
135
+ return
136
+ }
137
+ this.dialogVisible = true
138
+ },
139
+ // 点击弹窗确定按钮
140
+ handleDialogConfirm () {
141
+ if (!this.ids.length) {
142
+ this.dialogVisible = false
143
+ return
144
+ }
145
+
146
+ if (!this.entity && this.ids.length > 1) {
147
+ return this.$message.error('单据头中只能选择一条数据')
148
+ }
149
+
150
+ if (!this.entity) {
151
+ const name = this.selectedRows[0][this.displayField]
152
+ const id = this.ids[0]
153
+ this.$emit('input', { name, id })
154
+ this.$emit('selected', this.selectedRows)
155
+ } else {
156
+ this.$emit('selected', this.selectedRows)
157
+ }
158
+ this.dialogVisible = false
159
+ },
160
+ // 双击选择数据
161
+ handleFastSelect (row) {
162
+ this.$emit('input', { name: row[this.displayField], id: row[this.idField] })
163
+ this.$emit('selected', [row])
164
+ this.dialogVisible = false
165
+ },
166
+ /**
167
+ * 输入框相关逻辑
168
+ */
169
+ // 删除按键处理函数
170
+ handleDeleteKeyDown () {
171
+ if (this.value.id) {
172
+ this.$emit('input', { name: '', id: null })
173
+ this.$emit('delete')
174
+ }
175
+ },
176
+ // 获取搜索建议
177
+ // 此时的搜索建议也需要对限定范围条件进行拼接
178
+ async getAdvice (queryString, callback) {
179
+ let record = []
180
+ if (!/^\s*$/g.test(queryString)) {
181
+ this.handleSuggestMultiCondition(queryString, false)
182
+ record = await this.getTableData(true, false)
183
+ }
184
+ callback(record)
185
+ },
186
+ // 搜索建议的显示格式
187
+ suggestDisplay (item) {
188
+ const valueList = []
189
+ for (const fieldObj of this.suggestFieldList) {
190
+ valueList.push(item[fieldObj.field])
191
+ }
192
+ return valueList.join('/')
193
+ },
194
+ // 搜索建议被选择
195
+ handleSelect (item) {
196
+ const name = item[this.displayField]
197
+ const id = item[this.idField]
198
+ this.$emit('input', { name, id })
199
+ this.$emit('selected', [item])
200
+ }
201
+ }
202
+ }
203
+ </script>
204
+
205
+ <style>
206
+ .basic-suggest-poper {
207
+ width:unset !important;
208
+ }
209
+ </style>
210
+ <style lang="less" scoped>
211
+ .el-autocomplete {
212
+ ::v-deep .el-input__suffix {
213
+ display:flex;
214
+ align-items:center;
215
+ }
216
+ }
217
+
218
+ /deep/.t-table{
219
+ height: 59vh;
220
+ .table-records{
221
+ height: 100%;
222
+ position: relative;
223
+ .plTableBox .elx-table--body-wrapper{
224
+ height: calc(59vh - 80px);
225
+ }
226
+ .el-pagination{
227
+ right: 0;
228
+ }
229
+ }
230
+ }
231
+ /deep/.el-dialog__body{
232
+ padding-top: 0;
233
+ }
234
+
235
+ .basic-selector-footer {
236
+ .el-button {
237
+ background-color: #0A5194;
238
+ border:none;
239
+ }
240
+ }
241
+
242
+ .common-title{
243
+ // background-color: pink;
244
+ display:flex;
245
+ justify-content: right;
246
+ .common-table-buttons-search{
247
+ margin-right:50px;
248
+ }
249
+ }
250
+
251
+ </style>