w-table-vue 1.0.0

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 (89) hide show
  1. package/.editorconfig +9 -0
  2. package/.eslintignore +3 -0
  3. package/.eslintrc.js +55 -0
  4. package/.jsdoc +25 -0
  5. package/LICENSE +21 -0
  6. package/README.md +109 -0
  7. package/SECURITY.md +5 -0
  8. package/babel.config.js +16 -0
  9. package/dist/w-table-vue.umd.js +7 -0
  10. package/dist/w-table-vue.umd.js.map +1 -0
  11. package/docs/examples/app.html +63 -0
  12. package/docs/examples/app.umd.js +7 -0
  13. package/docs/examples/app.umd.js.map +1 -0
  14. package/docs/examples/w-table-edit_default.html +525 -0
  15. package/docs/examples/w-table-edit_editable.html +528 -0
  16. package/docs/examples/w-table-edit_editable_checkId.html +529 -0
  17. package/docs/examples/w-table-edit_editable_checkId_opt.modifyDataWhenSave_save(call cmp. method).html +544 -0
  18. package/docs/examples/w-table-edit_editable_checkId_successMsgFromAddRow_errorMsgFromAddRow.html +539 -0
  19. package/docs/examples/w-table-edit_editable_inforPaddingStyle_menuBackgroundColor.html +534 -0
  20. package/docs/examples/w-table-edit_editable_language_checkId_tooltipAddRow.html +540 -0
  21. package/docs/examples/w-table-edit_editable_language_textLabelDataName_textPlaceholderDataName.html +535 -0
  22. package/docs/examples/w-table-edit_editable_no enableInfor.html +529 -0
  23. package/docs/examples/w-table-edit_editable_no enableMenu.html +529 -0
  24. package/docs/examples/w-table-edit_editable_opt.beforeAddRow.html +528 -0
  25. package/docs/examples/w-table-edit_editable_opt.kpConvertKeysWhenUploadData.html +528 -0
  26. package/docs/examples/w-table-edit_editable_opt.optForUploadData.html +528 -0
  27. package/docs/examples/w-table-edit_editable_slot btns-right.html +552 -0
  28. package/docs/examples/w-table-edit_fixIds (fix id).html +529 -0
  29. package/docs/examples/w-table-edit_hideIds (hide mappingId).html +529 -0
  30. package/docs/examples/w-table-edit_name_description.html +527 -0
  31. package/docs/examples/w-table-edit_no enableInfor.html +528 -0
  32. package/docs/examples/w-table-edit_no enableMenu.html +528 -0
  33. package/docs/examples/w-table-edit_opt.kpHead.html +527 -0
  34. package/docs/examples/w-table-edit_removeIdsWhenDownload (remove id, mappingId, order, isActive).html +530 -0
  35. package/docs/examples/w-table-edit_slot btns-left.html +551 -0
  36. package/docs/examples/w-table-edit_slot btns-right.html +551 -0
  37. package/docs/examples/w-table-edit_slot infor (name_description).html +544 -0
  38. package/docs/examples/w-table-edit_sortColIds (sort by order).html +528 -0
  39. package/docs/fonts/Montserrat/Montserrat-Bold.eot +0 -0
  40. package/docs/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
  41. package/docs/fonts/Montserrat/Montserrat-Bold.woff +0 -0
  42. package/docs/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
  43. package/docs/fonts/Montserrat/Montserrat-Regular.eot +0 -0
  44. package/docs/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
  45. package/docs/fonts/Montserrat/Montserrat-Regular.woff +0 -0
  46. package/docs/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
  47. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
  48. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +978 -0
  49. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
  50. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
  51. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
  52. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
  53. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1049 -0
  54. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
  55. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
  56. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
  57. package/docs/index.html +84 -0
  58. package/docs/module-WTableEdit.html +1486 -0
  59. package/docs/scripts/collapse.js +39 -0
  60. package/docs/scripts/commonNav.js +28 -0
  61. package/docs/scripts/linenumber.js +25 -0
  62. package/docs/scripts/nav.js +12 -0
  63. package/docs/scripts/polyfill.js +4 -0
  64. package/docs/scripts/prettify/Apache-License-2.0.txt +202 -0
  65. package/docs/scripts/prettify/lang-css.js +2 -0
  66. package/docs/scripts/prettify/prettify.js +28 -0
  67. package/docs/scripts/search.js +99 -0
  68. package/docs/styles/jsdoc.css +776 -0
  69. package/docs/styles/prettify.css +80 -0
  70. package/package.json +66 -0
  71. package/public/index.html +25 -0
  72. package/script.txt +24 -0
  73. package/src/App.vue +322 -0
  74. package/src/AppZoneWTableEdit.vue +740 -0
  75. package/src/components/WTableEdit.vue +1278 -0
  76. package/src/components/WTableVue.vue +12 -0
  77. package/src/components/demolink.vue +105 -0
  78. package/src/main.js +8 -0
  79. package/test/all.test.mjs +10 -0
  80. package/toolg/addVersion.mjs +4 -0
  81. package/toolg/cleanFolder.mjs +5 -0
  82. package/toolg/cvCasename.mjs +43 -0
  83. package/toolg/gDistApp.mjs +38 -0
  84. package/toolg/gDistRollupComps.mjs +23 -0
  85. package/toolg/gDocExams.mjs +47 -0
  86. package/toolg/gExtractHtml.mjs +268 -0
  87. package/toolg/gMergeComps.mjs +75 -0
  88. package/toolg/modifyReadme.mjs +4 -0
  89. package/vue.config.js +9 -0
@@ -0,0 +1,1278 @@
1
+ <template>
2
+ <div
3
+ :changeParamsForInfor="changeParamsForInfor"
4
+ :changeParamsForTable="changeParamsForTable"
5
+ >
6
+ <template v-if="hasEffUseOpt">
7
+
8
+ <div
9
+ ref="menu"
10
+ v-domresize
11
+ @domresize="domresize"
12
+ >
13
+
14
+ <!-- 編輯模式 -->
15
+ <template v-if="editable">
16
+
17
+ <div
18
+ :style="`${useInforPadding}`"
19
+ v-if="enableInfor"
20
+ >
21
+ <table style="width:100%;">
22
+ <tbody>
23
+ <tr>
24
+ <td :style="`${hasEffLabelNameAndDesp?'padding-right:5px;':''} vertical-align:middle; opacity:0.8; font-size:0.8rem; white-space:nowrap;`">{{textLabelDataName}}</td>
25
+ <td style="width:100%; vertical-align:middle;">
26
+ <WText
27
+ style="width:100%;"
28
+ :placeholder="textPlaceholderDataName"
29
+ v-model="nameTrans"
30
+ ></WText>
31
+ </td>
32
+ </tr>
33
+ <tr>
34
+ <td :style="`${hasEffLabelNameAndDesp?'padding-right:5px;':''} vertical-align:middle; opacity:0.8; font-size:0.8rem; white-space:nowrap;`">{{textLabelDataDescription}}</td>
35
+ <td style="width:100%; vertical-align:middle;">
36
+ <WText
37
+ style="width:100%;"
38
+ :placeholder="textPlaceholderDataDescription"
39
+ v-model="descriptionTrans"
40
+ ></WText>
41
+ </td>
42
+ </tr>
43
+ </tbody>
44
+ </table>
45
+ </div>
46
+
47
+ <div
48
+ :style="`${useMenuPaddingStyle} background:${useMenuBackgroundColor};`"
49
+ v-if="enableMenu"
50
+ >
51
+ <div style="display:flex; align-items:center;">
52
+
53
+ <slot
54
+ name="btns-left"
55
+ :editable="editable"
56
+ ></slot>
57
+
58
+ <WButtonCircle
59
+ style="margin:5px;"
60
+ :icon="mdiTextBoxPlusOutline"
61
+ :backgroundColor="'white'"
62
+ :backgroundColorHover="'white'"
63
+ :tooltip="tooltipAddRow"
64
+ @click="addRow"
65
+ ></WButtonCircle>
66
+
67
+ <WButtonCircle
68
+ style="margin:5px;"
69
+ :icon="mdiDeleteForever"
70
+ :iconColor="'#f26'"
71
+ :backgroundColor="'white'"
72
+ :backgroundColorHover="'white'"
73
+ :tooltip="tooltipDeleteSelectedRows"
74
+ @click="removeRows"
75
+ v-if="rowsSelect.length>0"
76
+ ></WButtonCircle>
77
+
78
+ <WButtonCircle
79
+ style="margin:5px;"
80
+ :icon="mdiDownload"
81
+ :backgroundColor="'white'"
82
+ :backgroundColorHover="'white'"
83
+ :tooltip="tooltipDownloadExcelFile"
84
+ @click="downloadData('raw')"
85
+ v-if="hasEffRows"
86
+ ></WButtonCircle>
87
+
88
+ <WButtonCircle
89
+ style="margin:5px;"
90
+ :icon="mdiMonitorArrowDown"
91
+ :backgroundColor="'white'"
92
+ :backgroundColorHover="'white'"
93
+ :tooltip="tooltipDownloadExcelFileForDisplay"
94
+ @click="downloadData('display')"
95
+ v-if="isFilter && hasEffRows"
96
+ ></WButtonCircle>
97
+
98
+ <WPopup
99
+ v-model="showPickUploadMode"
100
+ :labelContent="labelContentForUpload"
101
+ :cmpZIndex="cmpZIndex"
102
+ >
103
+
104
+ <template v-slot:trigger>
105
+ <WButtonCircle
106
+ style="margin:5px;"
107
+ :icon="mdiUpload"
108
+ :backgroundColor="'white'"
109
+ :backgroundColorHover="'white'"
110
+ :tooltip="tooltipUploadExcelFile"
111
+ @click="showPickUploadMode=true"
112
+ ></WButtonCircle>
113
+ </template>
114
+
115
+ <template v-slot:content>
116
+
117
+ <div style="padding:10px; font-size:0.8rem; color:#666; background:#eee;">
118
+ {{uploadModeTitle}}
119
+ </div>
120
+
121
+ <div style="padding:15px;">
122
+
123
+ <WButtonChip
124
+ style="margin-right:15px;"
125
+ :text="kpUploadModeItems['replace']"
126
+ :backgroundColor="'white'"
127
+ :backgroundColorHover="'#f6f6f6'"
128
+ @click="showPickUploadMode=false;uploadData('replace')"
129
+ ></WButtonChip>
130
+
131
+ <WButtonChip
132
+ _style="margin:5px;"
133
+ :text="kpUploadModeItems['append']"
134
+ :backgroundColor="'white'"
135
+ :backgroundColorHover="'#f6f6f6'"
136
+ @click="showPickUploadMode=false;uploadData('append')"
137
+ ></WButtonChip>
138
+
139
+ </div>
140
+
141
+ </template>
142
+
143
+ </WPopup>
144
+
145
+ <slot
146
+ name="btns-right"
147
+ :editable="editable"
148
+ ></slot>
149
+
150
+ </div>
151
+ </div>
152
+
153
+ </template>
154
+
155
+ <!-- 顯示模式 -->
156
+ <template v-else>
157
+
158
+ <div :style="`display:flex; align-items:center;`">
159
+
160
+ <div
161
+ :style="`${useMenuPaddingStyle} background:${useMenuBackgroundColor};`"
162
+ v-if="enableMenu"
163
+ >
164
+ <div style="display:flex; align-items:center;">
165
+
166
+ <slot
167
+ name="btns-left"
168
+ :editable="editable"
169
+ ></slot>
170
+
171
+ <WButtonCircle
172
+ style="margin:5px;"
173
+ :icon="mdiDownload"
174
+ :tooltip="tooltipDownloadExcelFile"
175
+ :backgroundColor="'white'"
176
+ :backgroundColorHover="'white'"
177
+ @click="downloadData('raw')"
178
+ v-if="hasEffRows"
179
+ ></WButtonCircle>
180
+
181
+ <WButtonCircle
182
+ style="margin:5px;"
183
+ :icon="mdiMonitorArrowDown"
184
+ :tooltip="tooltipDownloadExcelFileForDisplay"
185
+ :backgroundColor="'white'"
186
+ :backgroundColorHover="'white'"
187
+ @click="downloadData('display')"
188
+ v-if="isFilter && hasEffRows"
189
+ ></WButtonCircle>
190
+
191
+ <slot
192
+ name="btns-right"
193
+ :editable="editable"
194
+ ></slot>
195
+
196
+ </div>
197
+ </div>
198
+
199
+ <div
200
+ :style="`${useInforPadding}`"
201
+ v-if="enableInfor"
202
+ >
203
+ <slot
204
+ name="infor"
205
+ :infor="{name:nameTrans,description:descriptionTrans}"
206
+ >
207
+
208
+ <div :style="`display:inline-block; ${hasEffNameAndDesp?'margin-left:5px;':''}`">
209
+ <div style="font-size:1.0rem;">
210
+ {{nameTrans}}
211
+ </div>
212
+ <div style="font-size:0.8rem; opacity:0.8;">
213
+ {{descriptionTrans}}
214
+ </div>
215
+ </div>
216
+
217
+ </slot>
218
+ </div>
219
+
220
+ </div>
221
+
222
+ </template>
223
+
224
+ </div>
225
+
226
+ <WAggridVue
227
+ ref="cmp"
228
+ :height="tableHeight"
229
+ :opt="useOpt"
230
+ ></WAggridVue>
231
+
232
+ </template>
233
+ </div>
234
+ </template>
235
+
236
+ <script>
237
+ import { mdiDownload, mdiMonitorArrowDown, mdiUpload, mdiDeleteForever, mdiTextBoxPlusOutline } from '@mdi/js/mdi.js'
238
+ import get from 'lodash-es/get.js'
239
+ import map from 'lodash-es/map.js'
240
+ import each from 'lodash-es/each.js'
241
+ import keys from 'lodash-es/keys.js'
242
+ import sortBy from 'lodash-es/sortBy.js'
243
+ import pull from 'lodash-es/pull.js'
244
+ import size from 'lodash-es/size.js'
245
+ import every from 'lodash-es/every.js'
246
+ import trim from 'lodash-es/trim.js'
247
+ import isEqual from 'lodash-es/isEqual.js'
248
+ import cloneDeep from 'lodash-es/cloneDeep.js'
249
+ import isarr from 'wsemi/src/isarr.mjs'
250
+ import isfun from 'wsemi/src/isfun.mjs'
251
+ import isestr from 'wsemi/src/isestr.mjs'
252
+ import isearr from 'wsemi/src/isearr.mjs'
253
+ import isbol from 'wsemi/src/isbol.mjs'
254
+ import isobj from 'wsemi/src/isobj.mjs'
255
+ import iseobj from 'wsemi/src/iseobj.mjs'
256
+ import arr2dt from 'wsemi/src/arr2dt.mjs'
257
+ import arrPullAt from 'wsemi/src/arrPullAt.mjs'
258
+ import ltdtmapping from 'wsemi/src/ltdtmapping.mjs'
259
+ import genID from 'wsemi/src/genID.mjs'
260
+ import WButtonCircle from 'w-component-vue/src/components/WButtonCircle.vue'
261
+ import WPopup from 'w-component-vue/src/components/WPopup.vue'
262
+ import WText from 'w-component-vue/src/components/WText.vue'
263
+ import WButtonChip from 'w-component-vue/src/components/WButtonChip.vue'
264
+ import domResize from 'w-component-vue/src/js/domResize.mjs'
265
+ import parseSpace from 'w-component-vue/src/js/parseSpace.mjs'
266
+ import convertColor from 'w-component-vue/src/js/convertColor.mjs'
267
+ import WAggridVue from 'w-aggrid-vue/src/components/WAggridVue.vue'
268
+
269
+
270
+ /**
271
+ * @vue-prop {String} [language='en'] 輸入指定語系字串,可選'en'、'zh-tw'、'zh-cn',可被opt.language複寫,預設為'en'
272
+ * @vue-prop {Boolean} [enableInfor=true] 輸入是否使用資訊區(資料名稱name與資料描述description)布林值,預設為true
273
+ * @vue-prop {String} [name=''] 輸入資料名稱字串,預設''
274
+ * @vue-prop {String} [description=''] 輸入資料描述字串,預設''
275
+ * @vue-prop {Object} [inforPaddingStyle={v:0,h:0}] 輸入資訊區(資料名稱name與資料描述description)內寬距離物件,可用鍵值為v、h、left、right、top、bottom,v代表同時設定top與bottom,h代表設定left與right,若有重複設定時後面鍵值會覆蓋前面,各鍵值為寬度數字,單位為px,預設{v:0,h:0}
276
+ * @vue-prop {Boolean} [enableMenu=true] 輸入是否使用選單按鈕區布林值,預設為true
277
+ * @vue-prop {Object} [menuPaddingStyle={v:3,h:3}] 輸入選單按鈕區內寬距離物件,可用鍵值為v、h、left、right、top、bottom,v代表同時設定top與bottom,h代表設定left與right,若有重複設定時後面鍵值會覆蓋前面,各鍵值為寬度數字,單位為px,預設{v:3,h:3}
278
+ * @vue-prop {String} [menuBackgroundColor='transparent'] 輸入選單按鈕區背景顏色字串,預設'transparent'
279
+ * @vue-prop {String|Array} [sortColIds=''] 輸入初始化時自動排序數據的欄位,為字串或陣列,若輸入陣列時則依照順序排序,故最末者代表最終排序。預設''
280
+ * @vue-prop {String|Array} [hideIds=''] 輸入欲隱藏欄位字串或陣列,可被opt.kpHeadHide複寫,預設''
281
+ * @vue-prop {String|Array} [fixIds=''] 輸入欲固定於左側欄位字串或陣列,可被opt.kpHeadFixLeft複寫,預設''
282
+ * @vue-prop {String} [checkId=''] 輸入欲使用核選方塊欄位字串,可被opt.kpHeadCheckBox複寫,預設''
283
+ * @vue-prop {String|Array} [removeIdsWhenDownload=''] 輸入下載Excel檔案時欲移除的欄位字串或陣列,預設''
284
+ * @vue-prop {Boolean} [funGetLtdtHookWhenDownload=null] 輸入下載Excel檔案時針對ltdt數據階段的攔截處理函數,預設為null
285
+ * @vue-prop {Boolean} [funGetMatHookWhenDownload=null] 輸入下載Excel檔案時針對mat數據階段的攔截處理函數,預設為null
286
+ * @vue-prop {Boolean} [enableHeadWhenDownload=false] 輸入下載Excel檔案時是否將欄位鍵值轉換成head布林值,此需提供opt.kpHead物件,預設為false
287
+ * @vue-prop {String} [fileNameWhenDownload='data.xlsx'] 輸入下載Excel檔案時儲存檔名稱字串,預設'data.xlsx'
288
+ * @vue-prop {String} [sheetNameWhenDownload='data'] 輸入下載Excel檔案時sheet名稱字串,預設'data'
289
+ * @vue-prop {Boolean} [editable=false] 輸入是否可編輯布林值,可被opt.defCellEditable複寫,預設為false
290
+ * @vue-prop {String} [textLabelDataName='Data name] 輸入數據名稱字串,預設'Data name'
291
+ * @vue-prop {String} [textPlaceholderDataName='Please enter data name'] 輸入數據名稱placeholder字串,預設'Please enter data name'
292
+ * @vue-prop {String} [textLabelDataDescription='Data description'] 輸入數據說明字串,預設'Data description'
293
+ * @vue-prop {String} [textPlaceholderDataDescription='Please enter data description'] 輸入數據說明placeholder字串,預設'Please enter data description'
294
+ * @vue-prop {String} [tooltipAddRow='add new row'] 輸入新增數據按鈕tooltip字串,預設'add new row'
295
+ * @vue-prop {String} [tooltipDeleteSelectedRows='delete selected rows'] 輸入刪除選擇數據按鈕tooltip字串,預設'delete selected rows'
296
+ * @vue-prop {String} [tooltipDownloadExcelFile='download data to Excel file'] 輸入下載數據成為Excel檔案按鈕tooltip字串,預設'download data to Excel file'
297
+ * @vue-prop {String} [tooltipDownloadExcelFileForDisplay='download filtered data to Excel file'] 輸入下載過濾後數據成為Excel檔案按鈕tooltip字串,預設'download filtered data to Excel file'
298
+ * @vue-prop {String} [tooltipUploadExcelFile='upload data to Excel file'] 輸入上傳Excel數據檔案按鈕tooltip字串,預設'upload data to Excel file'
299
+ * @vue-prop {String} [successMsgFromAddRow='add row successfully'] 輸入新增數據成功事件訊息字串,預設'add row successfully'
300
+ * @vue-prop {String} [errorMsgFromAddRow='can not add row'] 輸入無法新增數據事件訊息字串,預設'can not add row'
301
+ * @vue-prop {String} [errorMsgFromRemoveRow='can not remove selected rows'] 輸入移除數據失敗事件訊息字串,預設'can not remove selected rows'
302
+ * @vue-prop {String} [successMsgFromUploadData='upload data successfully'] 輸入上傳數據成功事件訊息字串,預設'upload data successfully'
303
+ * @vue-prop {String} [errorMsgFromUploadData='can not upload data'] 輸入無法上傳數據事件訊息字串,預設'can not upload data'
304
+ * @vue-prop {String} [errorMsgFromUploadEmptyData='no effective data'] 輸入上傳檔案中無有效數據事件訊息字串,預設'no effective data'
305
+ * @vue-prop {String} [successMsgFromDownloadData='download data successfully'] 輸入下載檔案成功事件訊息字串,預設'download data successfully'
306
+ * @vue-prop {String} [errorMsgFromDownloadData='can not download data'] 輸入無法下載檔案事件訊息字串,預設'can not download data'
307
+ * @vue-prop {String} [errorMsgFromNoName='no data name'] 輸入未輸入數據名稱事件訊息字串,預設'no data name'
308
+ * @vue-prop {String} [errorMsgFromNoData='no data'] 輸入未給予有效數據事件訊息字串,預設'no data'
309
+ * @vue-prop {String} [uploadModeTitle='Choose mode of upload:'] 輸入選擇上傳模式彈窗標題字串,預設'Choose mode of upload:'
310
+ * @vue-prop {String} [uploadModeTextForReplace='Replace'] 輸入取代上傳模式文字字串,預設'Replace'
311
+ * @vue-prop {String} [uploadModeTextForAppend='Append'] 輸入插入於最後上傳模式文字字串,預設'Append'
312
+ * @vue-prop {String} [labelContentForUpload=null] 輸入針對上傳模式之popup彈窗teleport至body內之內容div所給予之wtlp屬性值字串,供查找使用,預設null
313
+ * @vue-event {Array} save 指調用組件的method,無輸入,會回傳當前的name、description、rows所構成的物件
314
+ * @vue-event {String} success 當新增數據、上傳數據、下載數據成功時觸發,回傳對應成功訊息字串
315
+ * @vue-event {String} error 當新增數據、移除數據、上傳數據、下載數據失敗時觸發,回傳對應錯誤訊息字串
316
+ * @vue-slot {Object} infor 顯示模式下資訊區之渲染slot,slot props為{ infor },infor為{ name, description }
317
+ * @vue-slot {Object} btns-left 選單按鈕區最左側之插入slot,slot props為{ editable }
318
+ * @vue-slot {Object} btns-right 選單按鈕區最右側之插入slot,slot props為{ editable }
319
+ * @vue-prop {Object} [opt={}] 輸入w-aggrid-vue設定物件,預設{}
320
+ * @vue-prop {Array} opt.keys 輸入資料各欄位keys
321
+ * @vue-prop {Array} opt.rows 輸入資料列,各列為物件,內含各欄位keys之值,例[{},{},...,{}]
322
+ * @vue-prop {Object} [opt.kpHead={}] 輸入key對應head物件,預設各key值為本身key值
323
+ * @vue-prop {Object} [opt.kpHeadTooltip={}] 輸入key對應需tooltip的html字串物件,於各head處滑鼠移入時觸發,預設各key值為undefined
324
+ * @vue-prop {String} [opt.defHeadAlignH='center'] 輸入head預設之左右對齊字串,預設為'center'
325
+ * @vue-prop {Object} [opt.kpHeadAlignH={}] 輸入key對應head之左右對齊字串物件,預設各key值為defHeadAlignH
326
+ * @vue-prop {Boolean} [opt.defHeadSort=true] 輸入head預設之是否允許排序布林值,預設為true
327
+ * @vue-prop {Object} [opt.kpHeadSort={}] 輸入key對應head之是否允許排序物件,預設各key值為defHeadSort
328
+ * @vue-prop {Function|String} [opt.defHeadSortMethod=null] 輸入head預設之排序方式函數或字串,若需自行定義則給予函數,若需使用內建的自動轉型判斷方式則給予'auto'字串,預設為null
329
+ * @vue-prop {Object} [opt.kpHeadSortMethod={}] 輸入key對應head之排序方式函數或字串,若需自行定義則給予函數,若需使用內建的自動轉型判斷方式則給予'auto'字串,預設各key值為defHeadSortMethod
330
+ * @vue-prop {Object} [opt.kpHeadFixLeft={}] 輸入key對應head之是否固定於左側物件,預設各key值為false
331
+ * @vue-prop {Boolean} [opt.defHeadFilter=true] 輸入head預設之是否允許過濾布林值,預設為true
332
+ * @vue-prop {Object} [opt.kpHeadFilter={}] 輸入key對應head之是否允許過濾物件,預設各key值為defHeadFilter
333
+ * @vue-prop {String} [opt.defHeadFilterType='num'] 輸入head預設過濾器字串,可選'num'、'text'、'time'、'set',預設為'num'
334
+ * @vue-prop {Object} [opt.kpHeadFilterType={}] 輸入key對應head之過濾器物件,可使用'num'、'text'、'time'、'set',預設各key值為'num'
335
+ * @vue-prop {Object} [opt.kpHeadRender={}] 輸入key對應head之渲染函數物件,預設各key值為undefined
336
+ * @vue-prop {Boolean} [opt.defHeadDrag=true] 輸入head預設之是否允許拖曳布林值,預設為true
337
+ * @vue-prop {Object} [opt.kpHeadDrag={}] 輸入key對應head之是否允許拖曳物件,預設各key值為defHeadDrag
338
+ * @vue-prop {Object} [opt.kpHeadCheckBox={}] 輸入key對應head與key的各列是否使用核選方塊物件,預設各key值為false
339
+ * @vue-prop {Object} [opt.kpHeadFocusHighlight={}] 輸入key對應key的各列於獲得焦點時是否高亮顯示物件,預設各key值為true
340
+ * @vue-prop {Object} [opt.kpHeadHide={}] 輸入key對應head是否隱藏物件,預設各key值為false
341
+ * @vue-prop {Object} [opt.kpRowStyle={}] 輸入key對應row style之物件,可設定各key欄之函數,函數給予cell值需回傳之row style,預設各key值為undefined
342
+ * @vue-prop {Object} [opt.kpRowDrag={}] 輸入key對應col之是否能拖曳排序物件,預設各key值為false
343
+ * @vue-prop {Function} [opt.genRowsPinnTop=null] 輸入產生置頂rows函數,輸入為表內全部數據,預設為null
344
+ * @vue-prop {Function} [opt.genRowsPinnBottom=null] 輸入產生置底rows函數,輸入為表內全部數據,預設為null
345
+ * @vue-prop {Object} [opt.kpColStyle={}] 輸入key對應col style之物件,可設定各key欄之col style,預設各key值為undefined
346
+ * @vue-prop {Object} [opt.kpColSpan={}] 輸入key對應col span之物件,可設定各key欄之col span,預設各key值為undefined
347
+ * @vue-prop {Number} [opt.defHeadMinWidth=null] 輸入cell預設最小寬度數字,預設為null
348
+ * @vue-prop {Number} [opt.defHeadMaxWidth=null] 輸入cell預設最大寬度數字,預設為null
349
+ * @vue-prop {Object} [opt.kpHeadWidth={}] 輸入key對應cell之寬度物件,預設各key值為undefined
350
+ * @vue-prop {Object} [opt.kpCellRender={}] 輸入key對應cell之渲染函數物件,預設各key值為undefined
351
+ * @vue-prop {Object} [opt.kpCellTooltip={}] 輸入key對應cell之tooltip的html字串物件,於各cell處滑鼠移入時觸發,預設各key值為undefined
352
+ * @vue-prop {String} [opt.defCellAlignH='center'] 輸入cell預設之左右對齊字串,預設為'center'
353
+ * @vue-prop {Object} [opt.kpCellAlignH={}] 輸入key對應cell之左右對齊字串物件,預設各key值為defCellAlignH
354
+ * @vue-prop {Boolean} [opt.defCellEditable=false] 輸入cell預設之是否可編輯布林值,由組件editable複寫,預設為false
355
+ * @vue-prop {Object} [opt.kpCellEditable={}] 輸入key對應cell之是否可編輯物件,預設各key值為defCellEditable
356
+ * @vue-prop {Object} [opt.kpConvertKeysWhenUploadData={}] 輸入上傳Excel檔案時,當key轉會成對應新key值物件,預設{}
357
+ * @vue-prop {Function} [opt.rowsChange=function(){}] 輸入rows change之觸發事件,預設為function(){}
358
+ * @vue-prop {Function} [opt.rowClick=function(){}] 輸入row click之觸發事件,預設為function(){}
359
+ * @vue-prop {Function} [opt.rowDbClick=function(){}] 輸入row double click之觸發事件,預設為function(){}
360
+ * @vue-prop {Function} [opt.rowChange=function(){}] 輸入row change之觸發事件,預設為function(){}
361
+ * @vue-prop {Function} [opt.rowChecked=function(){}] 輸入row checked之觸發事件,需使用kpHeadCheckBox開啟指定key的head與對應rows使用checkbox,預設為function(){}
362
+ * @vue-prop {Function} [opt.rowMouseEnter=function(){}] 輸入row mouseenter之觸發事件,預設為function(){}
363
+ * @vue-prop {Function} [opt.rowMouseLeave=function(){}] 輸入row mouseleave之觸發事件,預設為function(){}
364
+ * @vue-prop {Function} [opt.cellClick=function(){}] 輸入cell click之觸發事件,預設為function(){}
365
+ * @vue-prop {Function} [opt.cellDbClick=function(){}] 輸入cell double click之觸發事件,預設為function(){}
366
+ * @vue-prop {Function} [opt.cellChange=function(){}] 輸入cell change之觸發事件,預設為function(){}
367
+ * @vue-prop {Function} [opt.cellMouseEnter=function(){}] 輸入cell mouseenter之觸發事件,預設為function(){}
368
+ * @vue-prop {Function} [opt.cellMouseLeave=function(){}] 輸入cell mouseleave之觸發事件,預設為function(){}
369
+ * @vue-prop {Function} [opt.filterChange=function(){}] 輸入filter change之觸發事件,預設為function(){}
370
+ * @vue-prop {Boolean} [opt.autoFitColumn=false] 輸入當表格尺寸變更時自動調整欄寬布林值,預設false
371
+ * @vue-prop {String} [opt.language='en'] 輸入指定語系字串,可選'en'、'zh-tw'、'zh-cn',預設同組件language
372
+ * @vue-prop {Function} [opt.beforeAddRow=undefined] 輸入編輯模式新增數據前之修改新列事件,輸入newRow,輸出newRow,預設為undefined
373
+ * @vue-prop {Object} [opt.optForUploadData={}] 輸入呼叫組件uploadData上傳檔案時用的設定物件,內部調用wsemi的getDataFromExcelFileU8Arr讀取Excel檔案,物件可給予鍵值:uploadMode代表上傳模式字串(可選'replace'、'append',預設由彈窗選擇),beforeUpload代表上傳前的處理數據函數,parseSheetInd代表提取Excel檔案的第幾個sheet整數(預設為0),optForUploadData預設{}
374
+ * @vue-prop {Function} [opt.modifyDataWhenSave=undefined] 輸入當儲存時修改儲存數據事件,輸入rows,輸出rows,預設為undefined
375
+ * @vue-prop {Boolean} [opt.checkNoDataWhenSave=false] 輸入當儲存時是否檢核無數據布林值,預設false
376
+ * @vue-prop {Number} [cmpZIndex=3000] 輸入彈窗使用z-index數字,供嵌於高z-index彈窗內時提高層級,預設3000
377
+ */
378
+ export default {
379
+ directives: {
380
+ domresize: domResize(),
381
+ },
382
+ components: {
383
+ WButtonCircle,
384
+ WPopup,
385
+ WText,
386
+ WButtonChip,
387
+ WAggridVue,
388
+ },
389
+ props: {
390
+ language: {
391
+ type: String,
392
+ default: 'en',
393
+ },
394
+ enableInfor: {
395
+ type: Boolean,
396
+ default: true,
397
+ },
398
+ name: {
399
+ type: String,
400
+ default: '',
401
+ },
402
+ description: {
403
+ type: String,
404
+ default: '',
405
+ },
406
+ inforPaddingStyle: {
407
+ type: Object,
408
+ default: () => {
409
+ return {
410
+ v: 0,
411
+ h: 0,
412
+ }
413
+ },
414
+ },
415
+ enableMenu: {
416
+ type: Boolean,
417
+ default: true,
418
+ },
419
+ menuPaddingStyle: {
420
+ type: Object,
421
+ default: () => {
422
+ return {
423
+ v: 3,
424
+ h: 3,
425
+ }
426
+ },
427
+ },
428
+ menuBackgroundColor: {
429
+ type: String,
430
+ default: 'transparent',
431
+ },
432
+ sortColIds: {
433
+ type: [String, Array],
434
+ default: '',
435
+ // default: 'order',
436
+ },
437
+ hideIds: {
438
+ type: [String, Array],
439
+ default: '',
440
+ // default: () => [
441
+ // 'id',
442
+ // 'mappingId',
443
+ // 'order',
444
+ // 'isActive',
445
+ // ],
446
+ },
447
+ fixIds: {
448
+ type: [String, Array],
449
+ default: '',
450
+ },
451
+ checkId: {
452
+ type: String,
453
+ default: '',
454
+ },
455
+ removeIdsWhenDownload: {
456
+ type: [String, Array],
457
+ default: '',
458
+ // default: () => [
459
+ // 'id',
460
+ // 'mappingId',
461
+ // 'order',
462
+ // 'isActive',
463
+ // ],
464
+ },
465
+ funGetLtdtHookWhenDownload: {
466
+ type: Function,
467
+ default: null,
468
+ },
469
+ funGetMatHookWhenDownload: {
470
+ type: Function,
471
+ default: null,
472
+ },
473
+ enableHeadWhenDownload: {
474
+ type: Boolean,
475
+ default: false,
476
+ },
477
+ fileNameWhenDownload: {
478
+ type: String,
479
+ default: 'data.xlsx',
480
+ },
481
+ sheetNameWhenDownload: {
482
+ type: String,
483
+ default: 'data',
484
+ },
485
+ editable: {
486
+ type: Boolean,
487
+ default: false,
488
+ },
489
+ textLabelDataName: {
490
+ type: String,
491
+ default: 'Data name:', //數據名稱
492
+ },
493
+ textPlaceholderDataName: {
494
+ type: String,
495
+ default: 'Please enter data name', //請輸入數據名稱
496
+ },
497
+ textLabelDataDescription: {
498
+ type: String,
499
+ default: 'Data description:', //數據說明
500
+ },
501
+ textPlaceholderDataDescription: {
502
+ type: String,
503
+ default: 'Please enter data description', //請輸入數據說明
504
+ },
505
+ tooltipAddRow: {
506
+ type: String,
507
+ default: 'add new row', //新增數據
508
+ },
509
+ tooltipDeleteSelectedRows: {
510
+ type: String,
511
+ default: 'delete selected rows', //刪除選擇數據
512
+ },
513
+ tooltipDownloadExcelFile: {
514
+ type: String,
515
+ default: 'download data to Excel file', //下載數據成為Excel檔案
516
+ },
517
+ tooltipDownloadExcelFileForDisplay: {
518
+ type: String,
519
+ default: 'download filtered data to Excel file', //下載過濾後數據成為Excel檔案
520
+ },
521
+ tooltipUploadExcelFile: {
522
+ type: String,
523
+ default: 'upload data to Excel file', //上傳數據 Excel 檔案
524
+ },
525
+ successMsgFromAddRow: {
526
+ type: String,
527
+ default: 'add row successfully', //新增數據成功
528
+ },
529
+ errorMsgFromAddRow: {
530
+ type: String,
531
+ default: 'can not add row', //無法新增數據
532
+ },
533
+ errorMsgFromRemoveRow: {
534
+ type: String,
535
+ default: 'can not remove selected rows', //移除數據失敗
536
+ },
537
+ successMsgFromUploadData: {
538
+ type: String,
539
+ default: 'upload data successfully', //上傳數據成功
540
+ },
541
+ errorMsgFromUploadData: {
542
+ type: String,
543
+ default: 'can not upload data', //無法上傳數據
544
+ },
545
+ errorMsgFromUploadEmptyData: {
546
+ type: String,
547
+ default: 'no effective data', //上傳檔案中無有效數據
548
+ },
549
+ successMsgFromDownloadData: {
550
+ type: String,
551
+ default: 'download data successfully', //下載檔案成功
552
+ },
553
+ errorMsgFromDownloadData: {
554
+ type: String,
555
+ default: 'can not download data', //無法下載檔案
556
+ },
557
+ errorMsgFromNoName: {
558
+ type: String,
559
+ default: 'no data name', //未輸入數據名稱
560
+ },
561
+ errorMsgFromNoData: {
562
+ type: String,
563
+ default: 'no data', //未給予有效數據
564
+ },
565
+ uploadModeTitle: {
566
+ type: String,
567
+ default: 'Choose mode of upload:',
568
+ },
569
+ uploadModeTextForReplace: {
570
+ type: String,
571
+ default: 'Replace',
572
+ },
573
+ uploadModeTextForAppend: {
574
+ type: String,
575
+ default: 'Append',
576
+ },
577
+ labelContentForUpload: {
578
+ type: String,
579
+ default: null,
580
+ },
581
+ cmpZIndex: {
582
+ type: Number,
583
+ default: 3000,
584
+ },
585
+ opt: {
586
+ type: Object,
587
+ default: null,
588
+ },
589
+ },
590
+ data: function() {
591
+ return {
592
+ mdiDownload,
593
+ mdiMonitorArrowDown,
594
+ mdiUpload,
595
+ mdiDeleteForever,
596
+ mdiTextBoxPlusOutline,
597
+
598
+ tableHeight: 1, //ag-grid需先給予最小高度供顯示, resize才會驅動
599
+
600
+ showPickUploadMode: false,
601
+
602
+ paramsTemp: null,
603
+
604
+ nameTrans: '',
605
+ descriptionTrans: '',
606
+ rowsSelect: [],
607
+ useOpt: null,
608
+
609
+ nameTemp: '',
610
+ descriptionTemp: '',
611
+ rowsTemp: [],
612
+
613
+ isFilter: false,
614
+
615
+ }
616
+ },
617
+ computed: {
618
+
619
+ changeParamsForInfor: function() {
620
+ // console.log('computed changeParamsForInfor')
621
+
622
+ let vo = this
623
+
624
+ //for trigger
625
+ let name = vo.name
626
+ let description = vo.description
627
+
628
+ //save
629
+ vo.nameTrans = trim(vo.name)
630
+ vo.descriptionTrans = trim(vo.description)
631
+
632
+ //backup, 不能使用vo.nameTrans與vo.descriptionTemp備份, 會導致computed掛勾記憶體無法觸發事件變更
633
+ vo.nameTemp = trim(vo.name)
634
+ vo.descriptionTemp = trim(vo.description)
635
+
636
+ vo.___changeParamsForInfor___ = { name, description }
637
+ return ''
638
+ },
639
+
640
+ changeParamsForTable: function() {
641
+ //console.log('computed changeParamsForTable')
642
+
643
+ let vo = this
644
+
645
+ //for trigger, rows通常是undefined變更為有效數據, 此時會驅動
646
+ let rows = get(vo, 'opt.rows')
647
+ let hideIds = vo.hideIds
648
+ let fixIds = vo.fixIds
649
+ let checkId = vo.checkId
650
+ let editable = vo.editable
651
+
652
+ //paramsTemp
653
+ let paramsTemp = {
654
+ rows, hideIds, fixIds, checkId, editable
655
+ }
656
+
657
+ //check, changeParamsForTable掛在dom上, 可能因為dom變更而被觸發, 或因數據為物件(例如rows)可能被修改, 於dom變更時被視為有變而觸發, 故需添加偵測外部數據是否有變才呼叫genOpt
658
+ if (!isEqual(vo.paramsTemp, paramsTemp)) {
659
+
660
+ //genOpt
661
+ vo.genOpt()
662
+
663
+ //save
664
+ vo.paramsTemp = cloneDeep(paramsTemp)
665
+
666
+ }
667
+
668
+ return ''
669
+ },
670
+
671
+ kpUploadModeItems: function() {
672
+ //console.log('computed kpUploadModeItems')
673
+
674
+ let vo = this
675
+
676
+ //kp
677
+ let kp = {
678
+ replace: vo.uploadModeTextForReplace,
679
+ append: vo.uploadModeTextForAppend,
680
+ }
681
+
682
+ return kp
683
+ },
684
+
685
+ useKeys: function() {
686
+ //console.log('computed useKeys')
687
+
688
+ let vo = this
689
+
690
+ //ks
691
+ let ks = []
692
+ if (isearr(get(vo, 'opt.keys'))) {
693
+ ks = get(vo, 'opt.keys')
694
+ }
695
+ else if (isearr(get(vo, 'opt.rows'))) {
696
+ ks = keys(get(vo, 'rows.0', {}))
697
+ }
698
+
699
+ return ks
700
+ },
701
+
702
+ useKpHead: function() {
703
+ //console.log('computed useKpHead')
704
+
705
+ let vo = this
706
+
707
+ //kpHeads
708
+ let kpHeads
709
+ if (iseobj(get(vo, 'opt.kpHead'))) {
710
+ kpHeads = get(vo, 'opt.kpHead')
711
+ }
712
+ else {
713
+ kpHeads = {}
714
+ each(vo.useKeys, (k) => {
715
+ kpHeads[k] = k
716
+ })
717
+ }
718
+
719
+ return kpHeads
720
+ },
721
+
722
+ hasEffRows: function() {
723
+ //console.log('computed hasEffRows')
724
+
725
+ let vo = this
726
+
727
+ return size(get(vo, 'useOpt.rows', [])) > 0
728
+ },
729
+
730
+ hasEffUseOpt: function() {
731
+ //console.log('computed hasEffUseOpt')
732
+
733
+ let vo = this
734
+
735
+ return vo.useOpt !== null
736
+ },
737
+
738
+ hasEffNameAndDesp: function() {
739
+ //console.log('computed hasEffNameAndDesp')
740
+
741
+ let vo = this
742
+
743
+ return vo.nameTrans !== '' || vo.descriptionTrans !== ''
744
+ },
745
+
746
+ hasEffLabelNameAndDesp: function() {
747
+ //console.log('computed hasEffLabelNameAndDesp')
748
+
749
+ let vo = this
750
+
751
+ return vo.textLabelDataName !== '' || vo.textLabelDataDescription !== ''
752
+ },
753
+
754
+ useInforPadding: function() {
755
+ //console.log('computed useInforPadding')
756
+
757
+ let vo = this
758
+
759
+ //parseSpace
760
+ let cs = parseSpace(vo.inforPaddingStyle)
761
+
762
+ //padding
763
+ let padding = `padding:${cs};`
764
+
765
+ return padding
766
+ },
767
+
768
+ useMenuPaddingStyle: function() {
769
+ //console.log('computed useMenuPaddingStyle')
770
+
771
+ let vo = this
772
+
773
+ //parseSpace
774
+ let cs = parseSpace(vo.menuPaddingStyle)
775
+
776
+ //padding
777
+ let padding = `padding:${cs};`
778
+
779
+ return padding
780
+ },
781
+
782
+ useMenuBackgroundColor: function() {
783
+ //console.log('computed useMenuBackgroundColor')
784
+
785
+ let vo = this
786
+
787
+ return convertColor(vo.menuBackgroundColor)
788
+ },
789
+
790
+ },
791
+ methods: {
792
+
793
+ domresize: function(msg) {
794
+ // console.log('methods domresize', msg)
795
+
796
+ let vo = this
797
+
798
+ //tableHeight
799
+ let minHeight = 200
800
+ let tableHeight = 0
801
+ let panelHeight = get(vo, '$el.offsetHeight', 0)
802
+ let menuHeight = get(vo, '$refs.menu.offsetHeight')
803
+ if (panelHeight > 0 && menuHeight > 0) {
804
+ tableHeight = panelHeight - menuHeight
805
+ }
806
+ tableHeight = Math.max(tableHeight, minHeight)
807
+ vo.tableHeight = tableHeight
808
+
809
+ },
810
+
811
+ default: function() {
812
+ // console.log('methods default')
813
+
814
+ let vo = this
815
+
816
+ vo.tableHeight = 200
817
+ vo.rowsSelect = []
818
+ vo.useOpt = null
819
+ vo.rowsTemp = []
820
+ //不能清空nameTrans與descriptionTrans, 因default可能會被genOpt觸發, 而若是name與description變更在前, opt.rows變更在後, nameTrans與descriptionTrans被清空就無法顯示, 故得獨立出來分開處理
821
+ // vo.nameTrans = ''
822
+ // vo.descriptionTrans = ''
823
+ // vo.nameTemp = ''
824
+ // vo.descriptionTemp = ''
825
+
826
+ },
827
+
828
+ genOpt: function() {
829
+ // console.log('methods genOpt')
830
+
831
+ let vo = this
832
+
833
+ //check
834
+ if (size(vo.useKeys) === 0) {
835
+ vo.default()
836
+ return
837
+ }
838
+
839
+ //rows
840
+ let rows = null
841
+ if (isarr(get(vo, 'opt.rows'))) { //若有rows則使用
842
+
843
+ //rows
844
+ //w-aggrid-vue組件內採取會自動更新外部opt.rows
845
+ //但這邊組件用於專案, 需用cloneDeep斷開與外面記憶體共用問題, 於組件內改變數據才不會影響外面, 另computed有偵測rows故外面改變內部可自動更新
846
+ rows = cloneDeep(get(vo, 'opt.rows'))
847
+
848
+ }
849
+ else {
850
+ //若沒有rows則使用useKeys產生空數據
851
+
852
+ //rows
853
+ rows = [arr2dt(vo.useKeys)]
854
+
855
+ }
856
+
857
+ //sortColIds
858
+ if (isestr(vo.sortColIds)) {
859
+ try {
860
+ rows = sortBy(rows, vo.sortColIds)
861
+ }
862
+ catch (err) {
863
+ console.log(err)
864
+ }
865
+ }
866
+ else if (isearr(vo.sortColIds)) {
867
+ each(vo.sortColIds, (id) => {
868
+ try {
869
+ rows = sortBy(rows, id)
870
+ }
871
+ catch (err) {
872
+ console.log(err)
873
+ }
874
+ })
875
+ }
876
+
877
+ //backup
878
+ vo.rowsTemp = cloneDeep(rows)
879
+
880
+ //useOpt
881
+ let useOpt = {
882
+
883
+ defCellAlignH: 'center',
884
+
885
+ ...vo.opt,
886
+
887
+ //由此組件複寫
888
+ language: vo.language,
889
+ rows,
890
+ keys: vo.useKeys,
891
+ defCellEditable: vo.editable,
892
+ kpHead: vo.useKpHead,
893
+ rowChecked: function(rs) {
894
+ // console.log('rowChecked rs', rs)
895
+
896
+ //save
897
+ vo.rowsSelect = rs
898
+
899
+ //call
900
+ if (isfun(get(vo.opt, 'rowChecked'))) {
901
+ vo.opt.rowChecked(rs)
902
+ }
903
+
904
+ },
905
+ filterChange: function(msg) {
906
+ // console.log('filterChange msg', msg)
907
+
908
+ //save
909
+ let isFilter = get(msg, 'isFilter', false)
910
+ vo.isFilter = isFilter
911
+
912
+ //call
913
+ if (isfun(get(vo.opt, 'filterChange'))) {
914
+ vo.opt.filterChange(msg)
915
+ }
916
+
917
+ },
918
+ // rowsChange: function(rs) { //暫時不需要額外處理rowsChange
919
+ // // console.log('rowsChange', rs)
920
+
921
+ // //call
922
+ // if (isfun(get(vo.opt, 'filterChange'))) {
923
+ // vo.opt.rowsChange(rs)
924
+ // }
925
+
926
+ // },
927
+ }
928
+
929
+ //hideIds
930
+ if (isestr(vo.hideIds)) {
931
+ useOpt.kpHeadHide = arr2dt([vo.hideIds], true)
932
+ }
933
+ else if (isearr(vo.hideIds)) {
934
+ useOpt.kpHeadHide = arr2dt(vo.hideIds, true)
935
+ }
936
+
937
+ //fixIds
938
+ if (isestr(vo.fixIds)) {
939
+ useOpt.kpHeadFixLeft = arr2dt([vo.fixIds], true)
940
+ }
941
+ else if (isearr(vo.fixIds)) {
942
+ useOpt.kpHeadFixLeft = arr2dt(vo.fixIds, true)
943
+ }
944
+
945
+ //checkId
946
+ if (vo.editable) {
947
+ if (isestr(vo.checkId)) {
948
+ useOpt.kpHeadCheckBox = arr2dt([vo.checkId], true)
949
+ }
950
+ }
951
+
952
+ //modify by opt
953
+ if (iseobj(vo.opt)) {
954
+ let optTemp = cloneDeep(vo.opt)
955
+ each(optTemp, (v, k) => {
956
+ if (k !== 'keys' && k !== 'rows' && k !== 'kpHead' && k !== 'editable') { //已於前面使用過就不複寫, 例如rows會被重排序一定不能被複寫回原數據
957
+ useOpt[k] = v
958
+ }
959
+ })
960
+ }
961
+
962
+ //save
963
+ vo.useOpt = useOpt
964
+
965
+ },
966
+
967
+ addRow: function() {
968
+ //console.log('methods addRow')
969
+
970
+ let vo = this
971
+
972
+ //check
973
+ if (size(vo.useKeys) === 0) {
974
+ vo.default()
975
+ vo.$emit('error', vo.errorMsgFromAddRow)
976
+ return
977
+ }
978
+
979
+ //newRow
980
+ let newRow = arr2dt(vo.useKeys)
981
+ // console.log('newRow(ori)', newRow)
982
+
983
+ //id
984
+ newRow.id = genID()
985
+ // console.log('newRow(add id)', newRow)
986
+
987
+ //beforeAddRow
988
+ if (isfun(get(vo, 'opt.beforeAddRow'))) {
989
+ newRow = vo.opt.beforeAddRow(newRow)
990
+ // console.log('newRow(beforeAddRow)', newRow)
991
+ }
992
+
993
+ try {
994
+
995
+ //cloneDeep, 記憶體須脫勾
996
+ let rows = cloneDeep(vo.useOpt.rows)
997
+
998
+ //push
999
+ rows.push(newRow)
1000
+
1001
+ //save
1002
+ vo.useOpt.rows = rows //儲存新rows才有辦法觸發ag-grid展示變更
1003
+
1004
+ //nextTick, 變更數據後頁面會先渲染, nextTick後才能調捲軸, 否則太快執行會被頁面渲染蓋掉
1005
+ vo.$nextTick(() => {
1006
+
1007
+ //getApi
1008
+ let getApi = get(vo, `$refs.cmp.getApi`)
1009
+
1010
+ //check
1011
+ if (isfun(getApi)) {
1012
+
1013
+ //ensureIndexVisible, scrollTo(index)
1014
+ let api = getApi()
1015
+ api.ensureIndexVisible(vo.useOpt.rows.length - 1, 'bottom') //捲到最下
1016
+
1017
+ }
1018
+
1019
+ })
1020
+
1021
+ vo.$emit('success', vo.successMsgFromAddRow)
1022
+ }
1023
+ catch (err) {
1024
+ console.log(err)
1025
+ vo.$emit('error', vo.errorMsgFromAddRow)
1026
+ }
1027
+
1028
+ },
1029
+
1030
+ removeRows: function() {
1031
+ // console.log('methods removeRows')
1032
+
1033
+ let vo = this
1034
+
1035
+ //rows
1036
+ let rows = get(vo, 'useOpt.rows', [])
1037
+ rows = cloneDeep(rows)
1038
+
1039
+ //check
1040
+ if (size(rows) === 0) {
1041
+ return
1042
+ }
1043
+
1044
+ //inds
1045
+ let inds = map(vo.rowsSelect, 'rowInd')
1046
+
1047
+ //check
1048
+ if (size(inds) === 0) {
1049
+ return
1050
+ }
1051
+
1052
+ //arrPullAt, 內部記憶體已脫勾
1053
+ rows = arrPullAt(rows, inds)
1054
+
1055
+ //save
1056
+ try {
1057
+ vo.useOpt.rows = rows
1058
+ }
1059
+ catch (err) {
1060
+ vo.$emit('error', vo.errorMsgFromRemoveRow)
1061
+ }
1062
+
1063
+ //reset rowsSelect
1064
+ vo.rowsSelect = []
1065
+
1066
+ },
1067
+
1068
+ downloadData: function(mode = 'raw') {
1069
+ //console.log('methods downloadData', mode)
1070
+
1071
+ let vo = this
1072
+
1073
+ try {
1074
+
1075
+ //keyFun
1076
+ let keyFun = ''
1077
+ if (mode === 'raw') {
1078
+ keyFun = 'downloadData'
1079
+ }
1080
+ else if (mode === 'display') {
1081
+ keyFun = 'downloadDisplayData'
1082
+ }
1083
+ else {
1084
+ throw new Error(`invlaid mode[${mode}]`)
1085
+ }
1086
+
1087
+ //fun
1088
+ let fun = get(vo, `$refs.cmp.${keyFun}`)
1089
+
1090
+ //check
1091
+ if (!isfun(fun)) {
1092
+ return
1093
+ }
1094
+
1095
+ //downloadData
1096
+ fun({
1097
+ funGetKeysHook: (keys) => {
1098
+ // console.log('funGetKeysHook', keys)
1099
+ if (isestr(vo.removeIdsWhenDownload)) {
1100
+ pull(keys, vo.removeIdsWhenDownload)
1101
+ }
1102
+ else if (isearr(vo.removeIdsWhenDownload)) {
1103
+ pull(keys, ...vo.removeIdsWhenDownload)
1104
+ }
1105
+ return keys
1106
+ },
1107
+ // funGetLtdtHook: function(ltdt) {
1108
+ // // console.log('funGetLtdtHook', ltdt)
1109
+ // return ltdt
1110
+ // },
1111
+ funGetLtdtHook: vo.funGetLtdtHookWhenDownload,
1112
+ // funGetMatHook: function(mat) {
1113
+ // // console.log('funGetMatHook', mat)
1114
+ // return mat
1115
+ // },
1116
+ funGetMatHook: vo.funGetMatHookWhenDownload,
1117
+ useHead: vo.enableHeadWhenDownload, //default: false
1118
+ fileName: vo.fileNameWhenDownload, //default: 'data.xlsx'
1119
+ sheetName: vo.sheetNameWhenDownload, //default: data
1120
+ })
1121
+
1122
+ vo.$emit('success', vo.successMsgFromDownloadData)
1123
+ }
1124
+ catch (err) {
1125
+ vo.$emit('error', vo.errorMsgFromDownloadData)
1126
+ }
1127
+
1128
+ },
1129
+
1130
+ uploadData: function(uploadModeSelect) {
1131
+ //console.log('methods uploadData', uploadModeSelect)
1132
+
1133
+ let vo = this
1134
+
1135
+ //fun
1136
+ let fun = get(vo, `$refs.cmp.uploadData`)
1137
+
1138
+ //check
1139
+ if (!isfun(fun)) {
1140
+ return
1141
+ }
1142
+
1143
+ //optForUploadData
1144
+ let optForUploadData = get(vo, 'opt.optForUploadData')
1145
+ if (!isobj(optForUploadData)) {
1146
+ optForUploadData = {}
1147
+ }
1148
+
1149
+ //uploadMode, 選擇上傳模式
1150
+ let uploadMode = get(optForUploadData, 'uploadMode')
1151
+ if (!isestr(uploadMode)) {
1152
+ optForUploadData.uploadMode = uploadModeSelect
1153
+ }
1154
+
1155
+ //beforeUpload, 自動去除無效數據
1156
+ let beforeUpload = get(optForUploadData, 'beforeUpload')
1157
+ if (!isfun(beforeUpload)) {
1158
+ optForUploadData.beforeUpload = (rows) => {
1159
+ // console.log('beforeUpload', rows)
1160
+
1161
+ //calc eff rows
1162
+ let rs = []
1163
+ each(rows, (row) => {
1164
+ let b = every(row, (v) => {
1165
+ return v === ''
1166
+ })
1167
+ if (!b) {
1168
+ rs.push(row)
1169
+ }
1170
+ })
1171
+ // console.log('rs', rs)
1172
+
1173
+ return rs
1174
+ }
1175
+ }
1176
+ // console.log('optForUploadData', optForUploadData)
1177
+
1178
+ //upload
1179
+ fun(optForUploadData)
1180
+ .then((rows) => {
1181
+ // console.log('upload then', rows)
1182
+
1183
+ //check
1184
+ if (size(rows) === 0) {
1185
+ vo.$emit('error', vo.errorMsgFromUploadEmptyData)
1186
+ }
1187
+ else {
1188
+ vo.$emit('success', vo.successMsgFromUploadData)
1189
+ }
1190
+
1191
+ //reset rowsSelect
1192
+ vo.rowsSelect = []
1193
+
1194
+ })
1195
+ .catch((err) => {
1196
+ console.log('catch', err)
1197
+ vo.$emit('error', vo.errorMsgFromUploadData)
1198
+ })
1199
+
1200
+ },
1201
+
1202
+ save: function() {
1203
+ //console.log('methods save')
1204
+
1205
+ let vo = this
1206
+
1207
+ function core() {
1208
+
1209
+ //save
1210
+ let name = trim(vo.nameTrans)
1211
+ let description = trim(vo.descriptionTrans)
1212
+
1213
+ //check
1214
+ if (!isestr(name)) {
1215
+ return { err: vo.errorMsgFromNoName }
1216
+ }
1217
+
1218
+ //rows
1219
+ let rows = get(vo, 'useOpt.rows', [])
1220
+
1221
+ //ltdtmapping
1222
+ rows = ltdtmapping(rows, vo.useKeys)
1223
+
1224
+ //update fields
1225
+ if (isfun(get(vo, 'opt.modifyDataWhenSave'))) {
1226
+ rows = vo.opt.modifyDataWhenSave(rows)
1227
+ // rows = map(rows, (v, k) => {
1228
+ // if (!isestr(v.id)) {
1229
+ // v.id = genID()
1230
+ // }
1231
+ // v.mappingId = vo.mappingId
1232
+ // v.order = k
1233
+ // v.isActive = 'y'
1234
+ // return v
1235
+ // })
1236
+ }
1237
+
1238
+ //check
1239
+ let checkNoDataWhenSave = get(vo, 'opt.checkNoDataWhenSave')
1240
+ if (!isbol(checkNoDataWhenSave)) {
1241
+ checkNoDataWhenSave = false
1242
+ }
1243
+ if (checkNoDataWhenSave && rows.length === 0) {
1244
+ return { err: vo.errorMsgFromNoData }
1245
+ }
1246
+
1247
+ //res
1248
+ let res = {
1249
+ name,
1250
+ nameTemp: vo.nameTrans,
1251
+ description,
1252
+ descriptionTemp: vo.descriptionTemp,
1253
+ rows: cloneDeep(rows),
1254
+ rowsTemp: cloneDeep(vo.rowsTemp),
1255
+ }
1256
+ // console.log('res', res)
1257
+
1258
+ return res
1259
+ }
1260
+
1261
+ //res
1262
+ let res
1263
+ try {
1264
+ res = core()
1265
+ }
1266
+ catch (err) {
1267
+ res = { err }
1268
+ }
1269
+
1270
+ return res
1271
+ },
1272
+
1273
+ }
1274
+ }
1275
+ </script>
1276
+
1277
+ <style scoped>
1278
+ </style>