@lambo-design/schema-paging-table 1.0.0-beta.7 → 1.0.0-beta.70

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 (2) hide show
  1. package/package.json +14 -6
  2. package/src/index.vue +743 -376
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambo-design/schema-paging-table",
3
- "version": "1.0.0-beta.7",
3
+ "version": "1.0.0-beta.70",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "author": "lambo",
@@ -10,10 +10,18 @@
10
10
  "registry": "https://registry.npmjs.org/"
11
11
  },
12
12
  "devDependencies": {
13
- "@lambo-design/core": "^4.7.1-beta.103",
14
- "@lambo-design/schema-form": "^1.0.0-beta.25",
15
- "@lambo-design/shared": "^1.0.0-beta.93",
16
- "@lambo-design/paging-table": "^1.0.0-beta.69"
13
+ "standard-version": "^9.5.0",
14
+ "@lambo-design/shared": "^1.0.0-beta.264",
15
+ "@lambo-design/schema-form": "^1.0.0-beta.88",
16
+ "@lambo-design/core": "^4.7.1-beta.162",
17
+ "@lambo-design/paging-table": "^1.0.0-beta.93"
17
18
  },
18
- "scripts": {}
19
+ "scripts": {
20
+ "release": "pnpm release-beta && git push --follow-tags && pnpm re-publish",
21
+ "release-major": "standard-version --release-as major",
22
+ "release-minor": "standard-version --release-as minor",
23
+ "release-patch": "standard-version --release-as patch",
24
+ "release-beta": "standard-version --prerelease beta",
25
+ "re-publish": "pnpm publish --access public --no-git-checks"
26
+ }
19
27
  }
package/src/index.vue CHANGED
@@ -1,376 +1,743 @@
1
- <template>
2
- <LamboPagingTable
3
- ref="schemaPagingTable"
4
- :dataUrl="dataUrl"
5
- :columns="tableColumn"
6
- :searchParams="tableSearchParams"
7
- :transformResponse="transformResponse"
8
- @on-row-click="onRowClick"
9
- @on-selection-change="onSelectionChange"
10
- @on-select="onSelect"
11
- @on-select-cancel="onSelectCancel"
12
- @on-select-all="onSelectAll"
13
- @on-select-all-cancel="onSelectAllCancel">
14
- <div slot="search">
15
- <LamboSchemaForm
16
- ref="lamboSchemaForm"
17
- v-model="queryForm"
18
- :form-type="'search'"
19
- :fieldList="formFields"
20
- :labelWidth="100"
21
- :customComponents="customComponents"
22
- :customValidates="customValidates"
23
- @doSearch="doSearch" @reset="onReset"/>
24
- <div v-if="rowName" class="tags">
25
- <Tag v-for="item in selectTags" :key="item.key" :name="item.key" closable @on-close="tagClose">
26
- {{ item.value }}
27
- </Tag>
28
- </div>
29
- </div>
30
- <div slot="buttons">
31
- <Button
32
- v-if="spreadButton.length > 0"
33
- v-for="(item,index) in spreadButton"
34
- type="primary"
35
- :ghost="true"
36
- :icon="item.icon"
37
- v-permission="item.permission"
38
- :key="index"
39
- @click="doClick(item)"
40
- style="margin-right: 5px">
41
- {{ item.name }}
42
- </Button>
43
- <Dropdown v-if="dropDownButton.length > 0">
44
- <Button type="primary" :ghost="true" icon="md-more">
45
- 更多操作
46
- <Icon type="ios-arrow-down"></Icon>
47
- </Button>
48
- <DropdownMenu slot="list">
49
- <DropdownItem
50
- v-for="(item,index) in dropDownButton"
51
- v-permission="item.permission"
52
- :key="index"
53
- >
54
- <Icon :type="item.icon" style="margin-right: 5px"></Icon>
55
- <span @click="doClick(item)">{{ item.name }}</span>
56
- </DropdownItem>
57
- </DropdownMenu>
58
- </Dropdown>
59
- </div>
60
- </LamboPagingTable>
61
- </template>
62
- <script>
63
- import ajax from '@lambo-design/shared/utils/ajax'
64
- import { operateBtn, operateHref } from '@lambo-design/shared/utils/assist'
65
- import LamboPagingTable from '@lambo-design/paging-table'
66
- // import LamboSchemaForm from '@lambo-design/schema-form'
67
- // const LamboSchemaForm = ()=> import('@lambo-design/schema-form')
68
- export default {
69
- name:"schema-paging-table",
70
- components: {
71
- LamboSchemaForm: () => import('@lambo-design/schema-form'),
72
- LamboPagingTable,
73
- },
74
- data() {
75
- return {
76
- queryForm: {},
77
- tableSearchParams: {},
78
- selection: [],
79
- selectStore: [],
80
- selectTags: [],
81
- selectRows: [],
82
- selectedKeys: [],
83
- }
84
- },
85
- props:{
86
- dataUrl:{
87
- type: String,
88
- required: true,
89
- default: ''
90
- },
91
- columnList:{
92
- type: Array,
93
- required: true,
94
- default(){
95
- return []
96
- }
97
- },
98
- rowKey: {
99
- type: String,
100
- require: false,
101
- default: ""
102
- },
103
- rowName: {
104
- type: String,
105
- require: false,
106
- default: ""
107
- },
108
- form:{
109
- type: Object,
110
- required: true,
111
- default(){
112
- return {}
113
- }
114
- },
115
- formFields:{
116
- type: Array,
117
- required: true,
118
- default(){
119
- return []
120
- }
121
- },
122
- buttonList:{
123
- type: Array,
124
- required: true,
125
- default(){
126
- return []
127
- }
128
- },
129
- customComponents: Object,
130
- customValidates: Object
131
- },
132
- computed: {
133
- tableColumn: function () {
134
- let columns = []
135
- let self = this
136
- self.columnList.forEach((item,index)=>{
137
- let obj = item
138
- if(obj.hasOwnProperty("enums") && obj.hasOwnProperty("translate") && obj.translate === 'enums'){
139
- obj.render = function (h, param) {
140
- let state = param.row[obj.key]
141
- return h('span', obj.enums[state])
142
- }
143
- }else if(obj.hasOwnProperty("type") && obj.type === "operate"){
144
- obj.render = (h, param) => {
145
- return h('div',
146
- obj.button.map((item,index)=>{
147
- let doms = operateHref(self, h, param.row, item.name || param.row[obj.key], (vm, currentRow) => {
148
- if(item.clickEvent?.type==="route"){
149
- // self.$Message.info(item.clickEvent.name)
150
- let query = item.clickEvent?.route?.keys?.reduce((acc,sourceItem)=>{
151
- return Object.assign(acc,{[sourceItem]:currentRow[sourceItem]})
152
- },{})
153
- this.$router.push({
154
- path: item.clickEvent?.route?.path,
155
- query
156
- })
157
- }else if(item.clickEvent?.type==="request"){
158
- // self.$Message.info(item.clickEvent.name)
159
- let data = item.clickEvent?.request?.keys?.reduce((acc,sourceItem)=>{
160
- return Object.assign(acc,{[sourceItem]:currentRow[sourceItem]})
161
- },{})
162
- let request = {
163
- url:item.clickEvent.request.url,
164
- method:item.clickEvent.request.method,
165
- param:data,
166
- }
167
- let response = item.clickEvent.response
168
- self.fetch(request,response)
169
- }else if(item.clickEvent?.type==="method"){
170
- let args = item.clickEvent?.method?.keys?.reduce((total,current)=>{
171
- return Object.assign(total,{[current]:currentRow[current]})
172
- },{})
173
- self.$emit(item.clickEvent?.method?.name,args)
174
- }else if(item.clickEvent?.type==="modal"){
175
- self.$Message.info(item.clickEvent.name)
176
- }
177
- },item.permission)
178
-
179
- if(item && typeof item.condition == "function"){
180
- if(item.condition(param)){
181
- return doms
182
- }
183
- }else{
184
- return doms
185
- }
186
- })
187
- )
188
- }
189
- }
190
- columns.push(item)
191
- })
192
- return columns
193
- },
194
- spreadButton: function () {
195
- return this.buttonList.slice(0,3)
196
- },
197
- dropDownButton: function () {
198
- return this.buttonList.slice(3 - this.buttonList.length)
199
- },
200
- },
201
- watch:{
202
- form: function(val) {
203
- this.queryForm = val
204
- }
205
- },
206
- created() {
207
- },
208
- methods: {
209
- doClick(item){
210
- let self = this;
211
- if(item.clickEvent?.type==="route"){
212
- // self.$Message.info(item.clickEvent.name)
213
- let query = item.clickEvent?.route?.keys?.reduce((acc,sourceItem)=>{
214
- return Object.assign(acc,{[sourceItem]:param.row[sourceItem]})
215
- },{})
216
- this.$router.push({
217
- path: item.clickEvent?.route?.path,
218
- query
219
- })
220
- }else if(item.clickEvent?.type==="method"){
221
- // self.$Message.info(item.clickEvent.name)
222
- let param = item.clickEvent?.method?.keys?.reduce((acc,sourceItem)=>{
223
- return Object.assign(acc,{[sourceItem]:self.selection[sourceItem]})
224
- },{})
225
- self.$emit(item.clickEvent?.method?.name,param)
226
- }else if(item.clickEvent?.type==="modal"){
227
- self.$Message.info(item.clickEvent.name)
228
- }
229
- },
230
- doSearch: function () {
231
- this.tableSearchParams = Object.assign({}, this.queryForm)
232
- },
233
- onReset() {
234
- this.doSearch()
235
- },
236
- fetch: function (request,response) {
237
- let self = this
238
- let options = {
239
- url: request.url,
240
- method: request.method,
241
- [request.method==='GET'?"params":"data"]:request.param
242
- }
243
- ajax.request(options).then(function (resp) {
244
- // todo 判断返回码
245
- self.$Message.success(response.successMsg)
246
- self.doSearch()
247
- }).catch(function (err) {
248
- console.error(err)
249
- self.$Message.error(response.errorMsg)
250
- })
251
- },
252
- /**
253
- *
254
- * @param row
255
- * @param index
256
- */
257
- onRowClick: function (row, index) {
258
- this.selectOnChange(row, index);
259
- },
260
- //单选
261
- selectOnChange: function (row, index) {
262
- this.selection = Array(index).fill(false);
263
- this.selection.splice(index, 1, true);
264
- this.selectStore = [row];
265
- },
266
- //多选
267
- onSelectionChange: function (rows) {
268
- if (!this.rowKey) {
269
- this.selectStore = rows;
270
- } else {
271
- this.selectStore = rows;
272
- if (rows && rows.length > 0) {
273
- for (let i = 0; i < rows.length; i++) {
274
- let row = rows[i];
275
- if (!this.selectTags.some(item => item.key === row[this.rowKey])) {
276
- let tagItem = {"key": row[this.rowKey], "value": row[this.rowName]}
277
- this.selectTags.push(tagItem);
278
- }
279
- }
280
- }
281
- }
282
- },
283
- onSelect: function (selection, row) {
284
- if (this.rowKey) {
285
- this.selectRows[row[this.rowKey]] = row;
286
- }
287
- },
288
- onSelectCancel: function (selection, row) {
289
- if (this.rowKey) {
290
- delete this.selectRows[row[this.rowKey]];
291
- const selectIndex = (this.selectTags || []).findIndex((selectItem) => selectItem.key === row[this.rowKey])
292
- if (selectIndex > -1) {
293
- this.selectTags.splice(selectIndex, 1);
294
- }
295
- }
296
- },
297
- onSelectAll: function (selection) {
298
- if (this.rowKey) {
299
- for (let item of selection) {
300
- this.selectRows[item[this.rowKey]] = item;
301
- }
302
- }
303
- },
304
- onSelectAllCancel: function () {
305
- if (this.rowKey) {
306
- let currentTableData = this.$refs.schemaPagingTable.$data.tableData;
307
- for (let i = 0; i < currentTableData.length; i++) {
308
- let tempData = currentTableData[i][this.rowKey];
309
- delete this.selectRows[tempData];
310
- const selectIndex = (this.selectTags || []).findIndex((selectItem) => selectItem.key === tempData)
311
- if (selectIndex > -1) {
312
- this.selectTags.splice(selectIndex, 1);
313
- }
314
- }
315
- }
316
- },
317
- transformResponse: function (resp) {
318
- if (this.rowKey) {
319
- let self = this;
320
- if (resp.code === 1 || resp.code === "000") {
321
- let tableData = resp.data.rows;
322
- for (let i = 0; i < tableData.length; i++) {
323
- if (self.selectRows[tableData[i][self.rowKey]]) {
324
- tableData[i]._checked = true;
325
- }
326
- }
327
- resp.data.rows = tableData;
328
- }
329
- }
330
- return resp;
331
- },
332
- clearSelectData: function () {
333
- this.selection = [];//清空已选项
334
- this.selectStore = [];//清空已选数据
335
- this.selectRows = [];//清空已选数据
336
- this.selectTags = [];//清空所选标签
337
- this.selectedKeys = [];//清空默认选择
338
- },
339
- tagClose: function (event, name) {
340
- const selectIndex = (this.selectTags || []).findIndex((selectItem) => selectItem.key === name)
341
- const dataIndex = (this.$refs.schemaPagingTable.$data.tableData || []).findIndex((selectItem) => selectItem[this.rowKey] === name)
342
- if (selectIndex > -1) {
343
- this.selectTags.splice(selectIndex, 1);
344
- this.selectStore.splice(selectIndex, 1);
345
- }
346
- delete this.selectRows[name];
347
- if (dataIndex > -1) {
348
- this.$refs.schemaPagingTable.$refs.tableRef.toggleSelect(dataIndex);
349
- }
350
- },
351
- getSelection(){
352
- if (this.selectRows.length > 0 && this.rowKey) {
353
- let selectStore = [];
354
- for (let item in this.selectRows) {
355
- selectStore.push(this.selectRows[item]);
356
- }
357
- this.selectStore = selectStore;
358
- }
359
- return this.selectStore
360
- }
361
- }
362
- }
363
- </script>
364
- <style lang="less" scoped>
365
- .lambo-grid-table {
366
- /deep/.ivu-form {
367
- .ivu-form-item {
368
- display: block !important;
369
- }
370
- }
371
- }
372
- .tags {
373
- margin: 10px auto;
374
- }
375
- </style>
376
-
1
+ <template>
2
+ <LamboPagingTable
3
+ ref="schemaPagingTable"
4
+ :dataUrl="dataUrl"
5
+ :data="data"
6
+ :columns="tableColumn"
7
+ :autoSearch="autoSearch"
8
+ :searchParams="tableSearchParams"
9
+ :transformResponse="transformResponse"
10
+ :showTableOption="showTableOption"
11
+ :buttonFlex="buttonFlex"
12
+ :pageDisable="pageDisable"
13
+ :radioSelectIndex="radioSelectIndex"
14
+ :height="height"
15
+ :pageSize="pageSize"
16
+ :pageSizeOpts="pageSizeOpts"
17
+ @on-row-click="onRowClick"
18
+ @on-selection-change="onSelectionChange"
19
+ @on-select="onSelect"
20
+ @on-select-cancel="onSelectCancel"
21
+ @on-select-all="onSelectAll"
22
+ @on-select-all-cancel="onSelectAllCancel"
23
+ v-on="$listeners">
24
+ <div slot="search">
25
+ <LamboSchemaForm
26
+ ref="lamboSchemaForm"
27
+ v-model="queryForm"
28
+ :form-type="'search'"
29
+ :fieldList="formFields"
30
+ :labelWidth="labelWidth"
31
+ :labelPosition="labelPosition"
32
+ :default-rows="2"
33
+ :grid-columns="gridColumns"
34
+ :customComponents="customComponents"
35
+ :customValidates="customValidates"
36
+ @doSearch="doSearch" @reset="onReset"/>
37
+ <div v-if="rowName && selectTags.length > 0">
38
+ <Tag v-for="item in selectTags" :key="item.key" :name="item.key" closable @on-close="tagClose">
39
+ {{ item.value }}
40
+ </Tag>
41
+ </div>
42
+ <div v-else-if="rowName && selectTags.length === 0" style="height: 26px">
43
+ 无选中数据
44
+ </div>
45
+ </div>
46
+ <Row slot="buttons" type="flex" justify="space-between" :wrap="false">
47
+ <Col flex="auto" ref="container" :class="totalButtons.length > buttonsInFirstRow ? collapsed ? 'buttons-hidden' : '' : ''">
48
+ <Row type="flex" :justify="buttonFlex">
49
+ <Button
50
+ ref="buttons"
51
+ v-if="dropDownButton.length > 0"
52
+ v-for="(item,index) in dropDownButton"
53
+ type="primary"
54
+ :ghost="true"
55
+ :icon="item.icon"
56
+ v-permission="item.permission"
57
+ :key="index"
58
+ :loading="loading[index]"
59
+ @click="doClick(item, index)"
60
+ :class="buttonShowClass">
61
+ <span v-if="!loading[index]">{{ item.name }}</span>
62
+ <span v-else>{{ loadingMsg[index] }}</span>
63
+ </Button>
64
+ </Row>
65
+ </Col>
66
+ <Col flex="0 1 77px" v-if="totalButtons.length > buttonsInFirstRow">
67
+ <Button type="text" class="more-btn" @click=setCollapse>
68
+ {{collapsed ?'展开':'收起'}}
69
+ <Icon :type="collapsed ? 'ios-arrow-down' : 'ios-arrow-up'"></Icon>
70
+ </Button>
71
+ </Col>
72
+ </Row>
73
+ </LamboPagingTable>
74
+ </template>
75
+ <script>
76
+ import ajax from '@lambo-design/shared/utils/ajax'
77
+ import {operateBtn, operateHref, operateMore} from '@lambo-design/shared/utils/assist'
78
+ import LamboPagingTable from '@lambo-design/paging-table'
79
+ // import LamboSchemaForm from '@lambo-design/schema-form'
80
+ // const LamboSchemaForm = ()=> import('@lambo-design/schema-form')
81
+ export default {
82
+ name:"schema-paging-table",
83
+ components: {
84
+ LamboSchemaForm: () => import('@lambo-design/schema-form'),
85
+ LamboPagingTable,
86
+ },
87
+ data() {
88
+ return {
89
+ buttonsInFirstRow:0,
90
+ totalButtons:0,
91
+ collapsed:true,
92
+ queryForm: {},
93
+ tableSearchParams: {},
94
+ selection: [],
95
+ selectTags: [],
96
+ selectRows: [],
97
+ selectedKeys: [],
98
+ radioSelectIndex: -1,
99
+ selectCondition:'',
100
+ loading: {},
101
+ loadingMsg: {}
102
+ }
103
+ },
104
+ props:{
105
+ dataUrl:{
106
+ type: String,
107
+ required: true,
108
+ default: ''
109
+ },
110
+ data: {
111
+ type: Array,
112
+ default() {
113
+ return [];
114
+ }
115
+ },
116
+ autoSearch: {
117
+ type: Boolean,
118
+ required: false,
119
+ default: false
120
+ },
121
+ columnList: {
122
+ type: Array,
123
+ required: true,
124
+ default(){
125
+ return []
126
+ }
127
+ },
128
+ showTableOption: {
129
+ type: Boolean,
130
+ default: true
131
+ },
132
+ buttonFlex: {
133
+ type: String,
134
+ default () {
135
+ return 'start';
136
+ },
137
+ validator(value) {
138
+ return ['start', 'end'].indexOf(value) > -1;
139
+ }
140
+ },
141
+ //是否禁用分页
142
+ pageDisable: {
143
+ type: Boolean,
144
+ default: false
145
+ },
146
+ height: {
147
+ type: [Number, String]
148
+ },
149
+ pageSizeOpts: {
150
+ type: Array,
151
+ default: function () {
152
+ return [10, 20, 50, 100, 200];
153
+ }
154
+ },
155
+ pageSize: {
156
+ type: Number,
157
+ default: 10
158
+ },
159
+ rowKey: {
160
+ type: String,
161
+ require: false,
162
+ default: ""
163
+ },
164
+ rowName: {
165
+ type: String,
166
+ require: false,
167
+ default: ""
168
+ },
169
+ labelWidth: {
170
+ type: Number,
171
+ require: false,
172
+ default: 100
173
+ },
174
+ labelPosition: {
175
+ type: String,
176
+ require: false,
177
+ default: "right"
178
+ },
179
+ operColumnDropdownNum: {
180
+ type: Number,
181
+ require: false,
182
+ default: 2
183
+ },
184
+ form:{
185
+ type: Object,
186
+ required: true,
187
+ default(){
188
+ return {}
189
+ }
190
+ },
191
+ formFields:{
192
+ type: Array,
193
+ required: true,
194
+ default(){
195
+ return []
196
+ }
197
+ },
198
+ buttonList:{
199
+ type: Array,
200
+ required: true,
201
+ default(){
202
+ return []
203
+ }
204
+ },
205
+ gridColumns:{
206
+ type: Number,
207
+ default: 4
208
+ },
209
+ customComponents: Object,
210
+ customValidates: Object,
211
+ //父组件回填已选中的值
212
+ selectedKey: {
213
+ type: Array,
214
+ require: false,
215
+ default: () => {return []}
216
+ }
217
+ },
218
+ computed: {
219
+ tableColumn: function () {
220
+ let columns = []
221
+ let self = this
222
+ self.columnList.forEach((item,index)=>{
223
+ let obj = item
224
+ if(obj.hasOwnProperty("enums") && obj.hasOwnProperty("translate") && obj.translate === 'enums'){
225
+ obj.render = function (h, param) {
226
+ let state = param.row[obj.key]
227
+ return h('span', obj.enums[state])
228
+ }
229
+ } else if (obj.hasOwnProperty("type") && obj.type === "status" && obj.statusList){
230
+ obj.render = function (h, param) {
231
+ let label = "";
232
+ let tagColor = "";
233
+ obj.statusList.forEach(item => {
234
+ if(item.statusKey === param.row[obj.key]){
235
+ label = item.statusValue;
236
+ tagColor = item.color ? item.color : item.customColor;
237
+ }
238
+ })
239
+ if(label){
240
+ return h('Tag', {
241
+ props: {
242
+ color: tagColor
243
+ }
244
+ }, label);
245
+ }
246
+ }
247
+ } else if(obj.hasOwnProperty("type") && obj.type === "operate"){
248
+ obj.render = (h, param) => {
249
+ let visibleDomsd = [];
250
+ let dropdownDomsd = [];
251
+ obj.button.map((item, index) => {
252
+ const conditionMet = item && typeof item.condition === "function" ? item.condition(param) : true;
253
+ const execConditionMet = item && typeof item.execCondition === "function" ? item.execCondition(param) : true;
254
+ if(conditionMet){
255
+ let dom
256
+ if (!execConditionMet) {
257
+ dom = () => { return item.name ? item.name : param.row[obj.key]}
258
+ } else {
259
+ dom = (disable) => {if(disable) { return operateHref(self, h, param.row, item.name || param.row[obj.key], (vm, currentRow) => {}, '', item.permission)}
260
+ else {return operateHref(self, h, param.row, item.name || param.row[obj.key], (vm, currentRow) => {self.handleClickEvent(item, currentRow)
261
+ }, '', item.permission)}}
262
+ }
263
+ let directives = item.permission ? [{ name: "permission", value: item.permission }] : null;
264
+ // 权限原因 导致按钮不可见 会影响更多按钮数量
265
+ if (visibleDomsd.length <= self.operColumnDropdownNum) {
266
+ visibleDomsd.push(dom(false));
267
+ if (visibleDomsd.length >= self.operColumnDropdownNum) {
268
+ dropdownDomsd.push(h('DropdownItem', {
269
+ nativeOn: {
270
+ 'click': () => {
271
+ if (execConditionMet) {
272
+ self.handleClickEvent(item, param.row)
273
+ }
274
+ }
275
+ },
276
+ directives
277
+ }, [dom(true)]))
278
+ }
279
+ } else {
280
+ dropdownDomsd.push(h('DropdownItem', {
281
+ nativeOn: {
282
+ 'click': () => {
283
+ if (execConditionMet) {
284
+ self.handleClickEvent(item, param.row)
285
+ }
286
+ }
287
+ },
288
+ directives
289
+ }, [dom(true)]))
290
+ }
291
+ }
292
+ })
293
+ if (visibleDomsd.length > self.operColumnDropdownNum) {
294
+ visibleDomsd.splice(self.operColumnDropdownNum - 1, 2)
295
+ }
296
+ return h('div', {}, [
297
+ ...visibleDomsd,
298
+ dropdownDomsd.length > 1 ? operateMore(self,h,dropdownDomsd) : null
299
+ ]);
300
+ }
301
+ } else if (obj.hasOwnProperty('type') && (obj.type === 'selection'||obj.type === 'single-selection')) {
302
+ this.selectCondition = item.selectCondition ? item.selectCondition : ''
303
+ } else if (item.isFlotTip) {
304
+ obj.render = (h, param) => {
305
+ return h('span', {
306
+ style: {
307
+ display: 'inline-block',
308
+ width: '100%',
309
+ overflow: 'hidden',
310
+ textOverflow: 'ellipsis',
311
+ whiteSpace: 'nowrap'
312
+ },
313
+ domProps: { title: item.name ? item.name : param.row[obj.key] }
314
+ }, item.name ? item.name : param.row[obj.key])
315
+ }
316
+ }
317
+ columns.push(item)
318
+ })
319
+ return columns
320
+ },
321
+ dropDownButton: function () {
322
+ return this.buttonList
323
+ },
324
+ multiSelect: function() {
325
+ return this.columnList.some((item)=>{
326
+ return item.type === "selection"
327
+ })
328
+ },
329
+ buttonShowClass(){
330
+ return 'buttons-show-'+this.buttonFlex
331
+ }
332
+ },
333
+ watch: {
334
+ form: {
335
+ handler: function (val) {
336
+ this.tableSearchParams = val
337
+ this.queryForm = val
338
+ },
339
+ deep: true,
340
+ immediate: true
341
+ },
342
+ selectedKey: {
343
+ handler: function () {
344
+ if (this.rowKey) {
345
+ this.selectTags = []
346
+ this.selectRows = []
347
+ if (this.selectedKey.length === 0) return
348
+ this.selectedKeys = this.selectedKey
349
+ for (let item of this.selectedKeys) {
350
+ this.selectRows[item[this.rowKey]] = item;
351
+ let tagItem = {"key": item[this.rowKey], "value": item[this.rowName]}
352
+ this.selectTags.push(tagItem);
353
+ }
354
+ }
355
+ },
356
+ immediate: true
357
+ }
358
+ },
359
+ created() {
360
+ let self = this
361
+ setTimeout(()=>{
362
+ self.calculateButtonsInFirstRow();
363
+ },1000)
364
+ window.addEventListener('resize', this.calculateButtonsInFirstRow);
365
+ },
366
+ beforeDestroy() {
367
+ window.removeEventListener('resize', this.calculateButtonsInFirstRow);
368
+ },
369
+ methods: {
370
+ handleClickEvent(item, currentRow) {
371
+ let self = this
372
+ if (item.clickEvent?.type === "route") {
373
+ // self.$Message.info(item.clickEvent.name)
374
+ let query = item.clickEvent?.route?.keys?.reduce((acc, sourceItem) => {
375
+ return Object.assign(acc, {[sourceItem]: currentRow[sourceItem]})
376
+ }, {})
377
+ self.$router.push({
378
+ path: item.clickEvent?.route?.path,
379
+ query
380
+ })
381
+ } else if (item.clickEvent?.type === "request") {
382
+ // self.$Message.info(item.clickEvent.name)
383
+ let data = item.clickEvent?.request?.keys?.reduce((acc, sourceItem) => {
384
+ return Object.assign(acc, {[sourceItem]: currentRow[sourceItem]})
385
+ }, {})
386
+ let request = {
387
+ url: item.clickEvent.request.url,
388
+ method: item.clickEvent.request.method,
389
+ param: data || currentRow,
390
+ }
391
+ let response = item.clickEvent.response
392
+ if (item.clickEvent.tips) {
393
+ let tips = item.clickEvent.tips
394
+ this.$Modal.confirm({
395
+ title: tips.title,
396
+ content: '<p>' + tips.content + '</p>',
397
+ onOk: () => {
398
+ self.fetch(request, response,"",item)
399
+ }
400
+ });
401
+ } else {
402
+ self.fetch(request, response,"",item)
403
+ }
404
+ } else if (item.clickEvent?.type === "method") {
405
+ if(!item.clickEvent?.method?.keys || item.clickEvent.method.keys.length === 0) {
406
+ self.$emit(item.clickEvent?.method?.name, currentRow._index,currentRow);
407
+ return ;
408
+ }
409
+ let args = item.clickEvent?.method?.keys?.reduce((total, current) => {
410
+ return Object.assign(total, {[current]: currentRow[current]})
411
+ }, {})
412
+ self.$emit(item.clickEvent?.method?.name, args)
413
+ } else if (item.clickEvent?.type === "modal") {
414
+ self.$Message.info(item.clickEvent.name)
415
+ }
416
+ },
417
+ //计算第一行有多少个button,根据父div宽度和每个button的宽度计算
418
+ calculateButtonsInFirstRow() {
419
+ let container = this.$refs.container
420
+ if (!container){return}
421
+ let containerWidth = container.$el.offsetWidth
422
+ if (containerWidth <= 0) return;
423
+ const buttons = this.$refs.buttons;
424
+ let totalWidth = 0;
425
+ let buttonsInFirstRow = 0;
426
+ for (let i = 0; buttons && i < buttons.length; i++) {
427
+ totalWidth += buttons[i].$el.offsetWidth + 5
428
+ if (totalWidth <= containerWidth) {
429
+ buttonsInFirstRow++;
430
+ } else {
431
+ break;
432
+ }
433
+ }
434
+ this.totalButtons = this.dropDownButton
435
+ this.buttonsInFirstRow = buttonsInFirstRow;
436
+ },
437
+ setCollapse: function() {
438
+ this.collapsed = !this.collapsed
439
+ },
440
+ doClick(item, index){
441
+ let self = this;
442
+ if (item.clickEvent?.type === "route") {
443
+ const routeInfo = item.clickEvent.route;
444
+ const keysExist = routeInfo.keys && routeInfo.keys.length !== 0;
445
+ const selection = keysExist ? self.getSelection() : null;
446
+ if (keysExist && selection.length === 0) {
447
+ self.$Message.info('请选择一条记录!');
448
+ return;
449
+ }
450
+ if (keysExist && self.multiSelect) {
451
+ const query = selection.map((select, index) => {
452
+ if (item.clickEvent?.route?.keys) {
453
+ let obj = item.clickEvent?.route?.keys?.reduce((acc, sourceItem) => {
454
+ return Object.assign(acc, {[sourceItem]: select[sourceItem]})
455
+ }, {})
456
+ return obj
457
+ } else {
458
+ return item
459
+ }
460
+ })
461
+ self.$router.push({ path: routeInfo.path, query })
462
+ } else {
463
+ const query = keysExist
464
+ ? routeInfo.keys.reduce((acc, key) => ({ ...acc, [key]: selection[0][key] }), {})
465
+ : null;
466
+ self.$router.push({ path: routeInfo.path, query })
467
+ }
468
+ } else if (item.clickEvent?.type === "method") {
469
+ const methodInfo = item.clickEvent.method;
470
+ const keysExist = methodInfo.keys && methodInfo.keys.length !== 0;
471
+ let selection = self.getSelection()
472
+ if (keysExist && selection.length === 0) {
473
+ self.$Message.info('请选择一条记录!')
474
+ return
475
+ }
476
+ if (self.multiSelect) {
477
+ let param = selection.map((select, index) => {
478
+ if (item.clickEvent?.method?.keys) {
479
+ let obj = item.clickEvent?.method?.keys?.reduce((acc, sourceItem) => {
480
+ return Object.assign(acc, {[sourceItem]: select[sourceItem]})
481
+ }, {})
482
+ return obj
483
+ } else {
484
+ return item
485
+ }
486
+ })
487
+ self.$emit(item.clickEvent?.method?.name, param)
488
+ } else {
489
+ if (item.clickEvent?.method?.keys) {
490
+ let param = item.clickEvent?.method?.keys?.reduce((acc, sourceItem) => {
491
+ return Object.assign(acc, {[sourceItem]: selection[0][sourceItem]})
492
+ }, {})
493
+ self.$emit(item.clickEvent?.method?.name, param)
494
+ } else {
495
+ let param = selection[0]
496
+ self.$emit(item.clickEvent?.method?.name, param)
497
+ }
498
+ }
499
+ } else if (item.clickEvent?.type === "request") {
500
+ const requestInfo = item.clickEvent.request;
501
+ const keysExist = requestInfo.keys && requestInfo.keys.length !== 0;
502
+ let selection = self.getSelection()
503
+ if (keysExist && selection.length === 0) {
504
+ self.$Message.info('请选择一条记录!')
505
+ return
506
+ }
507
+ const response = item.clickEvent.response
508
+ let data;
509
+ if (self.multiSelect) {
510
+ data = selection.map((select, index) => {
511
+ if (item.clickEvent?.request?.keys) {
512
+ let obj = item.clickEvent?.request?.keys?.reduce((acc, sourceItem) => {
513
+ return Object.assign(acc, {[sourceItem]: select[sourceItem]})
514
+ }, {})
515
+ return obj
516
+ } else {
517
+ return item
518
+ }
519
+ })
520
+ } else {
521
+ if (item.clickEvent?.request?.keys) {
522
+ data = item.clickEvent?.request?.keys?.reduce((acc, sourceItem) => {
523
+ return Object.assign(acc, {[sourceItem]: selection[0][sourceItem]})
524
+ }, {})
525
+ }
526
+ }
527
+ const request = {
528
+ url: item.clickEvent.request.url,
529
+ method: item.clickEvent.request.method,
530
+ param: data,
531
+ }
532
+ if (item.clickEvent.tips.title) {
533
+ let tips = item.clickEvent.tips
534
+ this.$Modal.confirm({
535
+ title: tips.title,
536
+ content: '<p>' + tips.content + '</p>',
537
+ onOk: () => {
538
+ self.fetch(request, response, index)
539
+ }
540
+ });
541
+ } else {
542
+ self.fetch(request, response, index)
543
+ }
544
+ }
545
+ },
546
+ doSearch: function () {
547
+ this.tableSearchParams = Object.assign({}, this.queryForm)
548
+ this.$emit('onClickSearch', this.tableSearchParams)
549
+ // 帮助框查询不清空已选择项
550
+ if (!this.rowName) {
551
+ this.clearSelectData();
552
+ }
553
+ },
554
+ boxShowSearch: function () {
555
+ this.tableSearchParams = Object.assign({}, this.queryForm)
556
+ },
557
+ onReset() {
558
+ // Object.assign(this.queryForm, this.$options.propsData.form)
559
+ this.queryForm = this.$options.propsData.form;
560
+ this.doSearch()
561
+ },
562
+ fetch: function (request,response,index,item) {
563
+ let self = this
564
+ let options = {
565
+ url: request.url,
566
+ method: request.method,
567
+ [request.method==='GET'?"params":"data"]:request.param
568
+ }
569
+ if (index) {
570
+ self.$set(self.loading, index, true)
571
+ self.$set(self.loadingMsg, index, response.loadingMsg || '执行中...')
572
+ }
573
+ ajax.request(options).then(function (resp) {
574
+ if (resp.data && resp.data.code === 1) {
575
+ self.$Message.success(response.successMsg)
576
+ if (index) {
577
+ self.$set(self.loading, index, false)
578
+ }
579
+ if(item.name === "保存"){
580
+ self.$emit('editTableSaveRow', "")
581
+ }
582
+ self.$refs.schemaPagingTable.tableRefresh()
583
+ } else {
584
+ self.$Message.error(response.errorMsg)
585
+ if (index) {
586
+ self.$set(self.loading, index, false)
587
+ }
588
+ }
589
+ }).catch(function (err) {
590
+ console.error(err)
591
+ self.$Message.error(response.errorMsg)
592
+ if (index) {
593
+ self.$set(self.loading, index, false)
594
+ }
595
+ })
596
+ },
597
+ /**
598
+ *
599
+ * @param row
600
+ * @param index
601
+ */
602
+ onRowClick: function (row, index) {
603
+ // 单选触发
604
+ if (this.$refs.schemaPagingTable.isSingleSelectModel) {
605
+ this.selectOnChange(row, index);
606
+ }
607
+ },
608
+ //单选
609
+ selectOnChange: function (row, index) {
610
+ this.radioSelectIndex = -1
611
+ this.selection = Array(index).fill(false);
612
+ this.selection.splice(index, 1, true);
613
+ this.selectRows = []
614
+ this.selectRows[row[this.rowKey]] = row
615
+ this.selectTags = [{"key": row[this.rowKey], "value": row[this.rowName]}]
616
+ this.$emit( "onSelect", row, index)
617
+
618
+ },
619
+ //多选
620
+ onSelectionChange: function (rows) {
621
+ if (this.rowKey) {
622
+ if (rows && rows.length > 0) {
623
+ for (let i = 0; i < rows.length; i++) {
624
+ let row = rows[i];
625
+ if (!this.selectTags.some(item => item.key === row[this.rowKey])) {
626
+ let tagItem = {"key": row[this.rowKey], "value": row[this.rowName]}
627
+ this.selectTags.push(tagItem);
628
+ }
629
+ }
630
+ }
631
+ }
632
+ this.$emit( "onMultiSelect", rows)
633
+
634
+ },
635
+ onSelect: function (selection, row) {
636
+ if (this.rowKey) {
637
+ this.selectRows[row[this.rowKey]] = row;
638
+ }
639
+ },
640
+ onSelectCancel: function (selection, row) {
641
+ if (this.rowKey) {
642
+ delete this.selectRows[row[this.rowKey]];
643
+ const selectIndex = (this.selectTags || []).findIndex((selectItem) => selectItem.key === row[this.rowKey])
644
+ if (selectIndex > -1) {
645
+ this.selectTags.splice(selectIndex, 1);
646
+ }
647
+ }
648
+ },
649
+ onSelectAll: function (selection) {
650
+ if (this.rowKey) {
651
+ for (let item of selection) {
652
+ this.selectRows[item[this.rowKey]] = item;
653
+ }
654
+ }
655
+ },
656
+ onSelectAllCancel: function () {
657
+ if (this.rowKey) {
658
+ let currentTableData = this.$refs.schemaPagingTable.$data.tableData;
659
+ for (let i = 0; i < currentTableData.length; i++) {
660
+ let tempData = currentTableData[i][this.rowKey];
661
+ delete this.selectRows[tempData];
662
+ const selectIndex = (this.selectTags || []).findIndex((selectItem) => selectItem.key === tempData)
663
+ if (selectIndex > -1) {
664
+ this.selectTags.splice(selectIndex, 1);
665
+ }
666
+ }
667
+ }
668
+ },
669
+ transformResponse: function (resp) {
670
+ if (this.rowKey) {
671
+ let self = this;
672
+ self.radioSelectIndex = -1
673
+ if (resp.code === 1 || resp.code === "000") {
674
+ let tableData = resp.data.rows;
675
+ for (let i = 0; i < tableData.length; i++) {
676
+ if (self.selectCondition && typeof self.selectCondition === "function") {
677
+ tableData[i]._disabled = !self.selectCondition({row:tableData[i]})
678
+ }
679
+ if (self.selectRows[tableData[i][self.rowKey]]) {
680
+ self.radioSelectIndex = i
681
+ tableData[i]._checked = true;
682
+ }
683
+ }
684
+ resp.data.rows = tableData;
685
+ }
686
+ }
687
+ return resp;
688
+ },
689
+ clearSelectData: function () {
690
+ this.selection = [];//清空已选项
691
+ this.selectRows = [];//清空已选数据
692
+ this.selectTags = [];//清空所选标签
693
+ this.selectedKeys = [];//清空默认选择
694
+ this.radioSelectIndex = -1
695
+ },
696
+ tagClose: function (event, name) {
697
+ this.radioSelectIndex = -1
698
+ const selectIndex = (this.selectTags || []).findIndex((selectItem) => selectItem.key === name)
699
+ const dataIndex = (this.$refs.schemaPagingTable.$data.tableData || []).findIndex((selectItem) => selectItem[this.rowKey] === name)
700
+ if (selectIndex > -1) {
701
+ this.selectTags.splice(selectIndex, 1);
702
+ }
703
+ delete this.selectRows[name];
704
+ if (dataIndex > -1) {
705
+ this.$refs.schemaPagingTable.$refs.tableRef.toggleSelect(dataIndex);
706
+ }
707
+ },
708
+ getSelection() {
709
+ let selectStore = [];
710
+ if (Object.keys(this.selectRows).length > 0 && this.rowKey) {
711
+ for (let item in this.selectRows) {
712
+ selectStore.push(this.selectRows[item]);
713
+ }
714
+ }
715
+ return selectStore
716
+ },
717
+ getDatas() { return this.$refs.schemaPagingTable.$data.tableData }
718
+
719
+ }
720
+ }
721
+ </script>
722
+ <style lang="less" scoped>
723
+ .lambo-grid-table {
724
+ /deep/.ivu-form {
725
+ .ivu-form-item {
726
+ display: block;
727
+ }
728
+ }
729
+ }
730
+
731
+ .buttons-hidden{
732
+ height:33px;
733
+ overflow: hidden;
734
+ }
735
+
736
+ .buttons-show-start:not(:last-child){
737
+ margin:0 5px 5px 0
738
+ }
739
+ .buttons-show-end:not(:first-child){
740
+ margin:0 0 5px 5px
741
+ }
742
+ </style>
743
+