@netang/quasar 0.2.32 → 0.2.33

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 (289) hide show
  1. package/.editorconfig +12 -12
  2. package/_docs/docs/components/field-table.md +58 -58
  3. package/_docs/docs/components/field-tree.md +21 -21
  4. package/_docs/docs/components/table.md +24 -24
  5. package/_docs/docs/utils/table.md +196 -196
  6. package/components/column-title/index.vue +38 -38
  7. package/components/data/index.vue +20 -20
  8. package/components/dialog/img-viewer/index.vue +697 -697
  9. package/components/dialog/index.vue +387 -387
  10. package/components/dragger/index.vue +203 -203
  11. package/components/drawer/index.vue +303 -303
  12. package/components/editor-code/index.vue +328 -328
  13. package/components/empty/index.vue +82 -82
  14. package/components/field-date/index.vue +860 -860
  15. package/components/field-date/methods.js +100 -100
  16. package/components/field-table/index.vue +1483 -1483
  17. package/components/field-text/index.vue +166 -166
  18. package/components/field-tree/index.vue +755 -755
  19. package/components/img/index.vue +279 -279
  20. package/components/input-number/index.vue +560 -560
  21. package/components/list-menu/index.vue +149 -149
  22. package/components/list-menu-item/index.vue +79 -79
  23. package/components/mixed-table/index.vue +532 -532
  24. package/components/mixed-table-splitter/index.vue +377 -377
  25. package/components/power-page/index.vue +96 -96
  26. package/components/price/index.vue +188 -188
  27. package/components/private/components/index.js +11 -11
  28. package/components/private/components/move-to-tree/index.vue +154 -154
  29. package/components/private/edit-power-data/index.vue +846 -846
  30. package/components/private/table-visible-columns-button/index.vue +114 -114
  31. package/components/render/index.vue +123 -123
  32. package/components/search/index.vue +231 -231
  33. package/components/search-item/index.vue +210 -210
  34. package/components/select/index.vue +177 -177
  35. package/components/splitter/index.vue +422 -422
  36. package/components/table/index.vue +513 -513
  37. package/components/table-column-fixed/index.vue +110 -110
  38. package/components/table-pagination/index.vue +192 -192
  39. package/components/table-summary/index.vue +107 -107
  40. package/components/thumbnail/index.vue +72 -72
  41. package/components/toolbar/index.vue +150 -150
  42. package/components/tree/index.vue +1728 -1728
  43. package/components/tree/virtual-scroll.vue +41 -41
  44. package/components/uploader/index.vue +196 -196
  45. package/components/uploader-query/index.vue +945 -945
  46. package/components/value-format/index.vue +274 -274
  47. package/components/virtual-scroll/index.vue +136 -136
  48. package/configs/area3.js +1 -1
  49. package/docs/404.html +33 -33
  50. package/docs/assets/404.html-60b35caa.js +1 -1
  51. package/docs/assets/404.html-d1e63d77.js +1 -1
  52. package/docs/assets/alert.html-b2a2a72f.js +5 -5
  53. package/docs/assets/alert.html-ba46d137.js +1 -1
  54. package/docs/assets/app-9f30aa4b.js +6 -6
  55. package/docs/assets/area.html-01b9b58d.js +42 -42
  56. package/docs/assets/area.html-9a4fce6a.js +1 -1
  57. package/docs/assets/arr.html-145d27e7.js +1 -1
  58. package/docs/assets/arr.html-674e65ab.js +11 -11
  59. package/docs/assets/auth.html-579fa830.js +1 -1
  60. package/docs/assets/auth.html-8544ed95.js +8 -8
  61. package/docs/assets/bus.html-c71254aa.js +1 -1
  62. package/docs/assets/bus.html-dc7d3d19.js +6 -6
  63. package/docs/assets/column-title.html-c735cb5a.js +3 -3
  64. package/docs/assets/column-title.html-e9316762.js +1 -1
  65. package/docs/assets/confirm.html-ddfdc27f.js +10 -10
  66. package/docs/assets/confirm.html-ef3e2bef.js +1 -1
  67. package/docs/assets/copy.html-d20345b6.js +1 -1
  68. package/docs/assets/copy.html-ef8c8571.js +13 -13
  69. package/docs/assets/data.html-6432175d.js +30 -30
  70. package/docs/assets/data.html-a3b05d5b.js +1 -1
  71. package/docs/assets/dialog.html-1f698e5a.js +1 -1
  72. package/docs/assets/dialog.html-62902b83.js +68 -68
  73. package/docs/assets/dialog.html-baea77c9.js +1 -1
  74. package/docs/assets/dialog.html-bb082fc4.js +1 -1
  75. package/docs/assets/dict.html-1311da3d.js +23 -23
  76. package/docs/assets/dict.html-b96fbf0c.js +1 -1
  77. package/docs/assets/dictOptions.html-7c4f40a5.js +1 -1
  78. package/docs/assets/dictOptions.html-fb99d175.js +5 -5
  79. package/docs/assets/dragger.html-668d3efa.js +1 -1
  80. package/docs/assets/dragger.html-749d585a.js +1 -1
  81. package/docs/assets/editor-code.html-6ab26ea9.js +1 -1
  82. package/docs/assets/editor-code.html-d196205d.js +1 -1
  83. package/docs/assets/empty.html-1c139131.js +1 -1
  84. package/docs/assets/empty.html-1e9c441d.js +1 -1
  85. package/docs/assets/field-date.html-069fdb13.js +1 -1
  86. package/docs/assets/field-date.html-ad204aa9.js +1 -1
  87. package/docs/assets/field-table.html-ce480f03.js +1 -1
  88. package/docs/assets/field-table.html-d9236160.js +1 -1
  89. package/docs/assets/field-text.html-7277c62f.js +1 -1
  90. package/docs/assets/field-text.html-ccb4cecf.js +1 -1
  91. package/docs/assets/field-tree.html-519bfb45.js +1 -1
  92. package/docs/assets/field-tree.html-fdc748d6.js +1 -1
  93. package/docs/assets/form.html-2b562c37.js +2 -2
  94. package/docs/assets/form.html-75104cd5.js +1 -1
  95. package/docs/assets/framework-204010b2.js +5 -5
  96. package/docs/assets/getData.html-990e3787.js +1 -1
  97. package/docs/assets/getData.html-bb72025f.js +34 -34
  98. package/docs/assets/getFile.html-42368004.js +1 -1
  99. package/docs/assets/getFile.html-99abd054.js +3 -3
  100. package/docs/assets/getImage.html-3429c5a1.js +1 -1
  101. package/docs/assets/getImage.html-4d886d83.js +3 -3
  102. package/docs/assets/getTime.html-7435f922.js +1 -1
  103. package/docs/assets/getTime.html-b37f49eb.js +20 -20
  104. package/docs/assets/img.html-7d1da657.js +1 -1
  105. package/docs/assets/img.html-fbea1105.js +1 -1
  106. package/docs/assets/index.html-1695dd7c.js +1 -1
  107. package/docs/assets/index.html-65a4aa67.js +1 -1
  108. package/docs/assets/index.html-7b98d5bd.js +1 -1
  109. package/docs/assets/index.html-c01f2648.js +1 -1
  110. package/docs/assets/input-number.html-0b250d2a.js +1 -1
  111. package/docs/assets/input-number.html-a8eb0378.js +1 -1
  112. package/docs/assets/list-menu-item.html-7f1b4611.js +1 -1
  113. package/docs/assets/list-menu-item.html-84ed5ab8.js +1 -1
  114. package/docs/assets/list-menu.html-28b4163f.js +1 -1
  115. package/docs/assets/list-menu.html-cb6ba95b.js +1 -1
  116. package/docs/assets/loading.html-dae9e39d.js +6 -6
  117. package/docs/assets/loading.html-dc74c9e6.js +1 -1
  118. package/docs/assets/notify.html-e6c4c514.js +1 -1
  119. package/docs/assets/notify.html-f2c4d914.js +8 -8
  120. package/docs/assets/power-page.html-32e02f82.js +1 -1
  121. package/docs/assets/power-page.html-485e77da.js +1 -1
  122. package/docs/assets/power.html-d258cc19.js +93 -93
  123. package/docs/assets/power.html-e490bd32.js +1 -1
  124. package/docs/assets/previewImage.html-6a6b4245.js +1 -1
  125. package/docs/assets/previewImage.html-c5b7e945.js +2 -2
  126. package/docs/assets/price.html-1882c548.js +19 -19
  127. package/docs/assets/price.html-94d3f5be.js +1 -1
  128. package/docs/assets/price.html-d213df0f.js +1 -1
  129. package/docs/assets/price.html-deaf880f.js +1 -1
  130. package/docs/assets/render.html-8efcbdd4.js +1 -1
  131. package/docs/assets/render.html-df228e38.js +1 -1
  132. package/docs/assets/rule.html-2cd57fc2.js +13 -13
  133. package/docs/assets/rule.html-61662001.js +1 -1
  134. package/docs/assets/ruleValid.html-04fe2552.js +1 -1
  135. package/docs/assets/ruleValid.html-e0a776af.js +14 -14
  136. package/docs/assets/search-0782d0d1.svg +1 -1
  137. package/docs/assets/search-item.html-3f75394c.js +1 -1
  138. package/docs/assets/search-item.html-4e942ecd.js +1 -1
  139. package/docs/assets/search.html-2807043e.js +1 -1
  140. package/docs/assets/search.html-c24f8806.js +1 -1
  141. package/docs/assets/select.html-00d0607c.js +1 -1
  142. package/docs/assets/select.html-de7731f5.js +1 -1
  143. package/docs/assets/splitter.html-56f51a70.js +1 -1
  144. package/docs/assets/splitter.html-f5c836d7.js +1 -1
  145. package/docs/assets/style-161e43ab.css +1 -1
  146. package/docs/assets/symbols.html-a6aea4bf.js +1 -1
  147. package/docs/assets/symbols.html-b1f65bad.js +21 -21
  148. package/docs/assets/table-column-fixed.html-3a69e7b2.js +1 -1
  149. package/docs/assets/table-column-fixed.html-e763c38b.js +1 -1
  150. package/docs/assets/table-pagination.html-236934d3.js +1 -1
  151. package/docs/assets/table-pagination.html-c37ee2ac.js +1 -1
  152. package/docs/assets/table-splitter.html-07eab15c.js +1 -1
  153. package/docs/assets/table-splitter.html-7670ee65.js +1 -1
  154. package/docs/assets/table-summary.html-04db434f.js +1 -1
  155. package/docs/assets/table-summary.html-943c65a0.js +1 -1
  156. package/docs/assets/table.html-36253ad7.js +1 -1
  157. package/docs/assets/table.html-7f9c5d1b.js +38 -38
  158. package/docs/assets/table.html-93d53dc8.js +1 -1
  159. package/docs/assets/table.html-ac99b9cb.js +1 -1
  160. package/docs/assets/thumbnail.html-bab1976b.js +1 -1
  161. package/docs/assets/thumbnail.html-eb64e5e8.js +1 -1
  162. package/docs/assets/timestamp.html-4e54f79b.js +13 -13
  163. package/docs/assets/timestamp.html-d0e1b88a.js +1 -1
  164. package/docs/assets/toast.html-58ecbe21.js +1 -1
  165. package/docs/assets/toast.html-c9b9d36b.js +6 -6
  166. package/docs/assets/toolbar.html-83d9f97c.js +1 -1
  167. package/docs/assets/toolbar.html-ff7b8c92.js +1 -1
  168. package/docs/assets/tree.html-d07cbe79.js +23 -23
  169. package/docs/assets/tree.html-ea04193e.js +1 -1
  170. package/docs/assets/uploader-query.html-05590718.js +1 -1
  171. package/docs/assets/uploader-query.html-3175bac5.js +1 -1
  172. package/docs/assets/uploader.html-36da4394.js +2 -2
  173. package/docs/assets/uploader.html-6b5f3079.js +1 -1
  174. package/docs/assets/uploader.html-b9340b57.js +1 -1
  175. package/docs/assets/uploader.html-bc1c22e3.js +1 -1
  176. package/docs/assets/value-format.html-8ae3d47d.js +1 -1
  177. package/docs/assets/value-format.html-afa99b3d.js +1 -1
  178. package/docs/components/column-title.html +35 -35
  179. package/docs/components/data.html +62 -62
  180. package/docs/components/dialog.html +33 -33
  181. package/docs/components/dragger.html +33 -33
  182. package/docs/components/editor-code.html +33 -33
  183. package/docs/components/empty.html +33 -33
  184. package/docs/components/field-date.html +33 -33
  185. package/docs/components/field-table.html +33 -33
  186. package/docs/components/field-text.html +33 -33
  187. package/docs/components/field-tree.html +33 -33
  188. package/docs/components/img.html +33 -33
  189. package/docs/components/input-number.html +33 -33
  190. package/docs/components/list-menu-item.html +33 -33
  191. package/docs/components/list-menu.html +33 -33
  192. package/docs/components/power-page.html +33 -33
  193. package/docs/components/price.html +33 -33
  194. package/docs/components/render.html +33 -33
  195. package/docs/components/search-item.html +33 -33
  196. package/docs/components/search.html +33 -33
  197. package/docs/components/select.html +33 -33
  198. package/docs/components/splitter.html +33 -33
  199. package/docs/components/table-column-fixed.html +33 -33
  200. package/docs/components/table-pagination.html +33 -33
  201. package/docs/components/table-splitter.html +33 -33
  202. package/docs/components/table-summary.html +33 -33
  203. package/docs/components/table.html +33 -33
  204. package/docs/components/thumbnail.html +33 -33
  205. package/docs/components/toolbar.html +33 -33
  206. package/docs/components/uploader-query.html +33 -33
  207. package/docs/components/uploader.html +33 -33
  208. package/docs/components/value-format.html +33 -33
  209. package/docs/css/index.css +3 -3
  210. package/docs/index.html +33 -33
  211. package/docs/utils/alert.html +37 -37
  212. package/docs/utils/area.html +74 -74
  213. package/docs/utils/arr.html +43 -43
  214. package/docs/utils/auth.html +40 -40
  215. package/docs/utils/bus.html +38 -38
  216. package/docs/utils/confirm.html +42 -42
  217. package/docs/utils/copy.html +45 -45
  218. package/docs/utils/dialog.html +100 -100
  219. package/docs/utils/dict.html +55 -55
  220. package/docs/utils/dictOptions.html +37 -37
  221. package/docs/utils/form.html +34 -34
  222. package/docs/utils/getData.html +66 -66
  223. package/docs/utils/getFile.html +35 -35
  224. package/docs/utils/getImage.html +35 -35
  225. package/docs/utils/getTime.html +52 -52
  226. package/docs/utils/index.html +33 -33
  227. package/docs/utils/loading.html +38 -38
  228. package/docs/utils/notify.html +40 -40
  229. package/docs/utils/power.html +125 -125
  230. package/docs/utils/previewImage.html +34 -34
  231. package/docs/utils/price.html +51 -51
  232. package/docs/utils/rule.html +45 -45
  233. package/docs/utils/ruleValid.html +46 -46
  234. package/docs/utils/symbols.html +53 -53
  235. package/docs/utils/table.html +70 -70
  236. package/docs/utils/timestamp.html +45 -45
  237. package/docs/utils/toast.html +38 -38
  238. package/docs/utils/tree.html +55 -55
  239. package/docs/utils/uploader.html +34 -34
  240. package/package.json +25 -25
  241. package/sass/common.scss +184 -184
  242. package/sass/index.scss +12 -12
  243. package/sass/line.scss +39 -39
  244. package/sass/quasar/btn.scss +46 -46
  245. package/sass/quasar/common.scss +3 -3
  246. package/sass/quasar/drawer.scss +6 -6
  247. package/sass/quasar/field.scss +259 -259
  248. package/sass/quasar/loading.scss +6 -6
  249. package/sass/quasar/table.scss +168 -168
  250. package/sass/quasar/toolbar.scss +22 -22
  251. package/sass/variables.scss +140 -140
  252. package/store/index.js +29 -29
  253. package/utils/$auth.js +128 -128
  254. package/utils/$form.js +72 -72
  255. package/utils/$power.js +1494 -1494
  256. package/utils/$render.js +75 -75
  257. package/utils/$rule.js +13 -13
  258. package/utils/$ruleValid.js +10 -10
  259. package/utils/$search.js +416 -416
  260. package/utils/$table.js +1351 -1348
  261. package/utils/$tree.js +682 -682
  262. package/utils/alert.js +12 -12
  263. package/utils/area.js +400 -400
  264. package/utils/arr.js +51 -51
  265. package/utils/bus.js +6 -6
  266. package/utils/config.js +66 -66
  267. package/utils/confirm.js +11 -11
  268. package/utils/copy.js +30 -30
  269. package/utils/dialog.js +36 -36
  270. package/utils/dict.js +21 -21
  271. package/utils/dictOptions.js +28 -28
  272. package/utils/getData.js +88 -88
  273. package/utils/getFile.js +67 -67
  274. package/utils/getImage.js +276 -276
  275. package/utils/getTime.js +113 -113
  276. package/utils/index.js +67 -67
  277. package/utils/loading.js +15 -15
  278. package/utils/notify.js +13 -13
  279. package/utils/play.js +40 -40
  280. package/utils/previewImage.js +14 -14
  281. package/utils/price.js +18 -18
  282. package/utils/symbols.js +18 -18
  283. package/utils/timestamp.js +18 -18
  284. package/utils/toast.js +13 -13
  285. package/utils/uploader.js +2114 -2114
  286. package/utils/useAuth.js +30 -30
  287. package/utils/useFileUrl.js +26 -26
  288. package/utils/useRouter.js +47 -47
  289. package/utils/useSearch.js +587 -562
@@ -1,532 +1,532 @@
1
- <template>
2
- <q-layout
3
- class="absolute-full"
4
- :class="{
5
- 'n-table--grid': tableGrid,
6
- }"
7
- view="lHr LpR lff"
8
- container
9
- >
10
- <!-- 头部 -->
11
- <n-toolbar
12
- :dense="dense"
13
- :show="showToolbar"
14
- header
15
- >
16
- <!-- 插槽 -->
17
- <template
18
- v-for="slotName in slotNames.toolbar"
19
- v-slot:[slotName]
20
- >
21
- <slot :name="`toolbar-${slotName}`"/>
22
- </template>
23
- </n-toolbar>
24
-
25
- <!-- 左侧分类 -->
26
- <slot name="left-drawer" v-if="slotNames.leftDrawer" />
27
- <n-drawer
28
- :model-value="! hideLeftDrawer"
29
- :side="treeSide"
30
- :width="200"
31
- :min-width="150"
32
- bordered
33
- drag
34
- cache
35
- v-bind="leftDrawerProps"
36
- v-else-if="treeNodes.length"
37
- >
38
- <q-scroll-area class="absolute-full">
39
-
40
- <!-- 树筛选 -->
41
- <div class="q-pa-sm q-gutter-sm" v-if="treeFilter">
42
- <q-input
43
- v-model="treeFilterValue"
44
- placeholder="搜索"
45
- dense
46
- outlined
47
- clearable
48
- />
49
- </div>
50
-
51
- <!-- 分类树 -->
52
- <n-tree
53
- color="grey-5"
54
- ref="treeRef"
55
- :nodes="treeNodes"
56
- :filter="treeFilterValue"
57
- :node-key="treeNodeKey"
58
- :label-key="treeLabelKey"
59
- v-model:selected="treeSelected"
60
- no-selection-unset
61
- default-expand-all
62
- v-bind="treeProps"
63
- >
64
- <!-- 插槽 -->
65
- <template
66
- v-for="slotName in slotNames.search"
67
- v-slot:[slotName]="props"
68
- >
69
- <slot
70
- :name="`tree-${slotName}`"
71
- v-bind="props"
72
- />
73
- </template>
74
- </n-tree>
75
-
76
- </q-scroll-area>
77
- </n-drawer>
78
-
79
- <!-- 列表 -->
80
- <q-page-container>
81
- <q-page>
82
- <n-table
83
- ref="tableRef"
84
- class="n-table absolute-full"
85
- :class="{
86
- 'n-table--last-fixed': showTableFixed,
87
- }"
88
- v-model:pagination="tablePagination"
89
- v-model:selected="tableSelected"
90
- :row-key="tableRowKey"
91
- :rows="tableRows"
92
- :columns="tableColumns"
93
- :visible-columns="tableVisibleColumns"
94
- :selection="tableSelection"
95
- :separator="tableSeparator"
96
- :loading="tableLoading"
97
- :rows-per-page-options="tableRowsPerPageOptions"
98
- :grid="tableGrid"
99
- @row-click="tableRowClick"
100
- @row-dblclick="currentTableRowDblclick"
101
- @request="tableRequest"
102
- flat
103
- virtual-scroll
104
- :virtual-scroll-slice-ratio-before="20"
105
- :virtual-scroll-slice-size="50"
106
- :virtual-scroll-slice-ratio-after="20"
107
- :dense="dense"
108
- v-bind="$attrs"
109
- >
110
- <!-- 图片 -->
111
- <template
112
- v-for="imgItem in tableImgs"
113
- v-slot:[`body-cell-${imgItem.name}`]="props"
114
- >
115
- <n-data
116
- :data="formatImg(props.row[imgItem.name], imgItem)"
117
- v-slot="{ data }"
118
- >
119
- <!-- 缩略图 -->
120
- <n-thumbnail
121
- v-for="(item, index) in data"
122
- :key="`thumbnail-item-${item}`"
123
- class="n-table__thumbnail"
124
- :src="item"
125
- preview
126
- :preview-props="{
127
- startPosition: index,
128
- images: data,
129
- }"
130
- />
131
- </n-data>
132
- </template>
133
-
134
- <!-- 插槽 -->
135
- <template
136
- v-for="slotName in slotNames.table"
137
- v-slot:[slotName]="props"
138
- >
139
- <slot
140
- :name="slotName"
141
- v-bind="props"
142
- />
143
- </template>
144
-
145
- <!-- 操作 -->
146
- <template v-slot:body-cell-settings="props">
147
- <n-table-column-fixed
148
- :props="props"
149
- />
150
- </template>
151
-
152
- <!-- 合计 -->
153
- <template v-slot:bottom-row="props" v-if="tableSummary">
154
- <n-table-summary
155
- :props="props"
156
- />
157
- </template>
158
-
159
- <!-- 翻页 -->
160
- <template v-slot:pagination="props">
161
- <n-table-pagination
162
- :props="props"
163
- />
164
- </template>
165
- </n-table>
166
- </q-page>
167
- </q-page-container>
168
-
169
- <!-- 右侧搜索 -->
170
- <slot name="right-drawer" v-if="slotNames.rightDrawer" />
171
- <n-drawer
172
- :model-value="! hideRightDrawer"
173
- :side="searchSide"
174
- :min-width="320"
175
- bordered
176
- drag
177
- cache
178
- v-bind="rightDrawerProps"
179
- v-else-if="! noSearch && tableSearchValue.length"
180
- >
181
- <!-- 搜索 -->
182
- <n-search
183
- v-model="tableSearchValue"
184
- :options="tableSearchOptions"
185
- :on-search="tableReload"
186
- :on-reset="tableSearchReset"
187
- v-if="showSearch"
188
- >
189
- <!-- 插槽 -->
190
- <template
191
- v-for="slotName in slotNames.search"
192
- v-slot:[slotName]
193
- >
194
- <slot :name="`search-${slotName}`"/>
195
- </template>
196
- </n-search>
197
- </n-drawer>
198
-
199
- </q-layout>
200
- </template>
201
-
202
- <script>
203
- import { ref, watch, computed, inject, onMounted } from 'vue'
204
-
205
- import $n_isFunction from 'lodash/isFunction'
206
- import $n_isNil from 'lodash/isNil'
207
-
208
- import $n_split from '@netang/utils/split'
209
- import $n_isValidObject from '@netang/utils/isValidObject'
210
- import $n_isValidArray from '@netang/utils/isValidArray'
211
- import $n_isValidValue from '@netang/utils/isValidValue'
212
- import $n_collection from '@netang/utils/collection'
213
-
214
- import { NDialogKey, NTableKey } from '../../utils/symbols'
215
-
216
- import NToolbar from '../toolbar'
217
- import NDrawer from '../drawer'
218
- import NThumbnail from '../thumbnail'
219
- import NTableColumnFixed from '../table-column-fixed'
220
- import NTableSummary from '../table-summary'
221
- import NTablePagination from '../table-pagination'
222
- import NSearch from '../search'
223
-
224
- import $n_getImage from '../../utils/getImage'
225
-
226
- export default {
227
-
228
- /**
229
- * 标识
230
- */
231
- name: 'NMixedTable',
232
-
233
- /**
234
- * 关闭组件 attribute 透传行为
235
- */
236
- inheritAttrs: false,
237
-
238
- /**
239
- * 组件
240
- */
241
- components: {
242
- NToolbar,
243
- NDrawer,
244
- NThumbnail,
245
- NTableColumnFixed,
246
- NTableSummary,
247
- NTablePagination,
248
- NSearch,
249
- },
250
-
251
- /**
252
- * 声明属性
253
- */
254
- props: {
255
- // 树声明属性
256
- treeProps: Object,
257
- // 树节点唯一键值
258
- treeNodeKey: {
259
- type: String,
260
- default: 'id',
261
- },
262
- // 树标签键值
263
- treeLabelKey: {
264
- type: String,
265
- default: 'title',
266
- },
267
- // 树节点列表
268
- treeNodes: {
269
- type: Array,
270
- default: ()=>[],
271
- },
272
- // 默认树已选节点 v-model:tree-selected
273
- treeSelected: [ String, Number ],
274
- // 树节点点击
275
- treeNodeClick: Function,
276
- // 是否选中第一个树节点
277
- treeSelectFirstNode: {
278
- type: Boolean,
279
- default: true,
280
- },
281
- // 显示树筛选
282
- treeFilter: Boolean,
283
- // 树位置, 可选值: left / right
284
- treeSide: {
285
- type: String,
286
- default: 'left',
287
- },
288
- // 不显示搜索
289
- noSearch: Boolean,
290
- // 搜索位置
291
- searchSide: {
292
- type: String,
293
- default: 'right',
294
- },
295
- // 紧凑模式
296
- dense: {
297
- type: Boolean,
298
- default: true,
299
- },
300
- // 隐藏左边侧滑菜单
301
- hideLeftDrawer: Boolean,
302
- // 左边侧滑菜单声明属性
303
- leftDrawerProps: Object,
304
- // 隐藏右边侧滑菜单
305
- hideRightDrawer: Boolean,
306
- // 右边侧滑菜单声明属性
307
- rightDrawerProps: Object,
308
- // 是否强制显示工具栏
309
- showToolbar: Boolean,
310
- },
311
-
312
- /**
313
- * 组合式
314
- */
315
- setup(props, { slots, emit }) {
316
-
317
- // ==========【数据】============================================================================================
318
-
319
- // 获取表格注入
320
- const $table = inject(NTableKey)
321
-
322
- // 获取对话框注入
323
- const $dialog = inject(NDialogKey)
324
- const inDialog = !! $dialog
325
-
326
- // 当前双击表格行
327
- let currentTableRowDblclick
328
-
329
- // 如果在对话框内部
330
- if (inDialog) {
331
- // 提交表格已选数据给对话框
332
- $dialog.submit(() => $table.tableSelected.value)
333
-
334
- // 对话框中的表格双击表格行
335
- currentTableRowDblclick = function (e, row) {
336
- // 如果不是多选
337
- if ($table.tableSelection.value !== 'multiple') {
338
- $table.tableSelected.value = [ row ]
339
- $dialog.confirm()
340
- }
341
- }
342
-
343
- } else {
344
- // 表格实例中的双击表格行
345
- currentTableRowDblclick = $table.tableRowDblclick
346
- }
347
-
348
- // 表格节点
349
- const tableRef = ref(null)
350
-
351
- // 树节点
352
- const treeRef = ref(null)
353
-
354
- // 树筛选值
355
- const treeFilterValue = ref('')
356
-
357
- // 树选择数据
358
- const treeSelected = ref(props.treeSelected)
359
-
360
- // 是否显示搜索
361
- const showSearch = ref(false)
362
-
363
- // ==========【计算属性】==========================================================================================
364
-
365
- /**
366
- * 插槽标识
367
- */
368
- const slotNames = computed(function() {
369
-
370
- const toolbar = []
371
- const search = []
372
- const table = []
373
- let leftDrawer = false
374
- let rightDrawer = false
375
-
376
- // 如果有插槽
377
- if ($n_isValidObject(slots)) {
378
- for (const key in slots) {
379
- if (key.startsWith('toolbar-')) {
380
- toolbar.push(key.replace('toolbar-', ''))
381
- } else if (key.startsWith('tree-')) {
382
- search.push(key.replace('tree-', ''))
383
- } else if (key.startsWith('search-')) {
384
- search.push(key.replace('search-', ''))
385
- } else if (key === 'left-drawer') {
386
- leftDrawer = true
387
- } else if (key === 'right-drawer') {
388
- rightDrawer = true
389
- } else {
390
- table.push(key)
391
- }
392
- }
393
- }
394
-
395
- return {
396
- toolbar,
397
- search,
398
- table,
399
- leftDrawer,
400
- rightDrawer,
401
- }
402
- })
403
-
404
- // ==========【监听数据】=========================================================================================
405
-
406
- // 如果有树节点点击方法
407
- if ($n_isFunction(props.treeNodeClick)) {
408
-
409
- /**
410
- * 树节点 all
411
- */
412
- const treeNodesAll = computed(function () {
413
- return $n_collection(props.treeNodes)
414
- .keyBy(props.treeNodeKey)
415
- .toObject()
416
- })
417
-
418
- /**
419
- * 监听树选择数据
420
- */
421
- watch(treeSelected, function(nodeKey) {
422
-
423
- // 触发更新已选树节点
424
- emit('update:treeSelected', nodeKey)
425
-
426
- // 如果节点值不是有效值
427
- if (! $n_isValidValue(nodeKey)) {
428
- // 则无任何操作
429
- return
430
- }
431
-
432
- // 树节点点击
433
- const res = props.treeNodeClick(nodeKey, treeNodesAll.value[nodeKey])
434
-
435
- if ($n_isValidObject(res)) {
436
-
437
- // 设置表格传参
438
- $table.setQuery(res)
439
-
440
- // 表格重新加载
441
- $table.tableReload()
442
- }
443
- })
444
-
445
- /**
446
- * 监听树节点数据
447
- */
448
- watch(() => props.treeNodes, function (val) {
449
-
450
- if (
451
- // 如果关闭选中第一个树节点
452
- ! props.treeSelectFirstNode
453
- || ! $n_isValidArray(val)
454
- || ! $n_isNil(treeSelected.value)
455
- ) {
456
- // 则无任何操作
457
- return
458
- }
459
-
460
- // 选中第一个节点的值
461
- treeSelected.value = val[0][props.treeNodeKey]
462
- }, {
463
- // 立即执行
464
- immediate: true,
465
- })
466
- }
467
-
468
- /**
469
- * 格式化图片
470
- */
471
- function formatImg(img, { count }) {
472
-
473
- // 图片数组
474
- const imgs = []
475
-
476
- // 转为图片数组
477
- const arr = $n_split(img, ',')
478
- for (const item of arr) {
479
- const src = $n_getImage(item)
480
- if (src) {
481
- imgs.push(item)
482
- if (
483
- count > 0
484
- && imgs.length === count
485
- ) {
486
- break
487
- }
488
- }
489
- }
490
-
491
- return imgs
492
- }
493
-
494
- // ==========【生命周期】=========================================================================================
495
-
496
- /**
497
- * 实例被挂载后调用
498
- */
499
- onMounted( async function() {
500
-
501
- // 显示搜索
502
- showSearch.value = true
503
- })
504
-
505
- // ==========【返回】=============================================================================================
506
-
507
- return {
508
- // 解构表格实例
509
- ...$table,
510
-
511
- // 表格节点
512
- tableRef,
513
- // 树节点
514
- treeRef,
515
- // 树筛选值
516
- treeFilterValue,
517
- // 树选择数据
518
- treeSelected,
519
- // 是否显示搜索
520
- showSearch,
521
-
522
- // 插槽 body 单元格标识
523
- slotNames,
524
-
525
- // 当前双击表格行
526
- currentTableRowDblclick,
527
- // 格式化图片
528
- formatImg,
529
- }
530
- },
531
- }
532
- </script>
1
+ <template>
2
+ <q-layout
3
+ class="absolute-full"
4
+ :class="{
5
+ 'n-table--grid': tableGrid,
6
+ }"
7
+ view="lHr LpR lff"
8
+ container
9
+ >
10
+ <!-- 头部 -->
11
+ <n-toolbar
12
+ :dense="dense"
13
+ :show="showToolbar"
14
+ header
15
+ >
16
+ <!-- 插槽 -->
17
+ <template
18
+ v-for="slotName in slotNames.toolbar"
19
+ v-slot:[slotName]
20
+ >
21
+ <slot :name="`toolbar-${slotName}`"/>
22
+ </template>
23
+ </n-toolbar>
24
+
25
+ <!-- 左侧分类 -->
26
+ <slot name="left-drawer" v-if="slotNames.leftDrawer" />
27
+ <n-drawer
28
+ :model-value="! hideLeftDrawer"
29
+ :side="treeSide"
30
+ :width="200"
31
+ :min-width="150"
32
+ bordered
33
+ drag
34
+ cache
35
+ v-bind="leftDrawerProps"
36
+ v-else-if="treeNodes.length"
37
+ >
38
+ <q-scroll-area class="absolute-full">
39
+
40
+ <!-- 树筛选 -->
41
+ <div class="q-pa-sm q-gutter-sm" v-if="treeFilter">
42
+ <q-input
43
+ v-model="treeFilterValue"
44
+ placeholder="搜索"
45
+ dense
46
+ outlined
47
+ clearable
48
+ />
49
+ </div>
50
+
51
+ <!-- 分类树 -->
52
+ <n-tree
53
+ color="grey-5"
54
+ ref="treeRef"
55
+ :nodes="treeNodes"
56
+ :filter="treeFilterValue"
57
+ :node-key="treeNodeKey"
58
+ :label-key="treeLabelKey"
59
+ v-model:selected="treeSelected"
60
+ no-selection-unset
61
+ default-expand-all
62
+ v-bind="treeProps"
63
+ >
64
+ <!-- 插槽 -->
65
+ <template
66
+ v-for="slotName in slotNames.search"
67
+ v-slot:[slotName]="props"
68
+ >
69
+ <slot
70
+ :name="`tree-${slotName}`"
71
+ v-bind="props"
72
+ />
73
+ </template>
74
+ </n-tree>
75
+
76
+ </q-scroll-area>
77
+ </n-drawer>
78
+
79
+ <!-- 列表 -->
80
+ <q-page-container>
81
+ <q-page>
82
+ <n-table
83
+ ref="tableRef"
84
+ class="n-table absolute-full"
85
+ :class="{
86
+ 'n-table--last-fixed': showTableFixed,
87
+ }"
88
+ v-model:pagination="tablePagination"
89
+ v-model:selected="tableSelected"
90
+ :row-key="tableRowKey"
91
+ :rows="tableRows"
92
+ :columns="tableColumns"
93
+ :visible-columns="tableVisibleColumns"
94
+ :selection="tableSelection"
95
+ :separator="tableSeparator"
96
+ :loading="tableLoading"
97
+ :rows-per-page-options="tableRowsPerPageOptions"
98
+ :grid="tableGrid"
99
+ @row-click="tableRowClick"
100
+ @row-dblclick="currentTableRowDblclick"
101
+ @request="tableRequest"
102
+ flat
103
+ virtual-scroll
104
+ :virtual-scroll-slice-ratio-before="20"
105
+ :virtual-scroll-slice-size="50"
106
+ :virtual-scroll-slice-ratio-after="20"
107
+ :dense="dense"
108
+ v-bind="$attrs"
109
+ >
110
+ <!-- 图片 -->
111
+ <template
112
+ v-for="imgItem in tableImgs"
113
+ v-slot:[`body-cell-${imgItem.name}`]="props"
114
+ >
115
+ <n-data
116
+ :data="formatImg(props.row[imgItem.name], imgItem)"
117
+ v-slot="{ data }"
118
+ >
119
+ <!-- 缩略图 -->
120
+ <n-thumbnail
121
+ v-for="(item, index) in data"
122
+ :key="`thumbnail-item-${item}`"
123
+ class="n-table__thumbnail"
124
+ :src="item"
125
+ preview
126
+ :preview-props="{
127
+ startPosition: index,
128
+ images: data,
129
+ }"
130
+ />
131
+ </n-data>
132
+ </template>
133
+
134
+ <!-- 插槽 -->
135
+ <template
136
+ v-for="slotName in slotNames.table"
137
+ v-slot:[slotName]="props"
138
+ >
139
+ <slot
140
+ :name="slotName"
141
+ v-bind="props"
142
+ />
143
+ </template>
144
+
145
+ <!-- 操作 -->
146
+ <template v-slot:body-cell-settings="props">
147
+ <n-table-column-fixed
148
+ :props="props"
149
+ />
150
+ </template>
151
+
152
+ <!-- 合计 -->
153
+ <template v-slot:bottom-row="props" v-if="tableSummary">
154
+ <n-table-summary
155
+ :props="props"
156
+ />
157
+ </template>
158
+
159
+ <!-- 翻页 -->
160
+ <template v-slot:pagination="props">
161
+ <n-table-pagination
162
+ :props="props"
163
+ />
164
+ </template>
165
+ </n-table>
166
+ </q-page>
167
+ </q-page-container>
168
+
169
+ <!-- 右侧搜索 -->
170
+ <slot name="right-drawer" v-if="slotNames.rightDrawer" />
171
+ <n-drawer
172
+ :model-value="! hideRightDrawer"
173
+ :side="searchSide"
174
+ :min-width="320"
175
+ bordered
176
+ drag
177
+ cache
178
+ v-bind="rightDrawerProps"
179
+ v-else-if="! noSearch && tableSearchValue.length"
180
+ >
181
+ <!-- 搜索 -->
182
+ <n-search
183
+ v-model="tableSearchValue"
184
+ :options="tableSearchOptions"
185
+ :on-search="tableReload"
186
+ :on-reset="tableSearchReset"
187
+ v-if="showSearch"
188
+ >
189
+ <!-- 插槽 -->
190
+ <template
191
+ v-for="slotName in slotNames.search"
192
+ v-slot:[slotName]
193
+ >
194
+ <slot :name="`search-${slotName}`"/>
195
+ </template>
196
+ </n-search>
197
+ </n-drawer>
198
+
199
+ </q-layout>
200
+ </template>
201
+
202
+ <script>
203
+ import { ref, watch, computed, inject, onMounted } from 'vue'
204
+
205
+ import $n_isFunction from 'lodash/isFunction'
206
+ import $n_isNil from 'lodash/isNil'
207
+
208
+ import $n_split from '@netang/utils/split'
209
+ import $n_isValidObject from '@netang/utils/isValidObject'
210
+ import $n_isValidArray from '@netang/utils/isValidArray'
211
+ import $n_isValidValue from '@netang/utils/isValidValue'
212
+ import $n_collection from '@netang/utils/collection'
213
+
214
+ import { NDialogKey, NTableKey } from '../../utils/symbols'
215
+
216
+ import NToolbar from '../toolbar'
217
+ import NDrawer from '../drawer'
218
+ import NThumbnail from '../thumbnail'
219
+ import NTableColumnFixed from '../table-column-fixed'
220
+ import NTableSummary from '../table-summary'
221
+ import NTablePagination from '../table-pagination'
222
+ import NSearch from '../search'
223
+
224
+ import $n_getImage from '../../utils/getImage'
225
+
226
+ export default {
227
+
228
+ /**
229
+ * 标识
230
+ */
231
+ name: 'NMixedTable',
232
+
233
+ /**
234
+ * 关闭组件 attribute 透传行为
235
+ */
236
+ inheritAttrs: false,
237
+
238
+ /**
239
+ * 组件
240
+ */
241
+ components: {
242
+ NToolbar,
243
+ NDrawer,
244
+ NThumbnail,
245
+ NTableColumnFixed,
246
+ NTableSummary,
247
+ NTablePagination,
248
+ NSearch,
249
+ },
250
+
251
+ /**
252
+ * 声明属性
253
+ */
254
+ props: {
255
+ // 树声明属性
256
+ treeProps: Object,
257
+ // 树节点唯一键值
258
+ treeNodeKey: {
259
+ type: String,
260
+ default: 'id',
261
+ },
262
+ // 树标签键值
263
+ treeLabelKey: {
264
+ type: String,
265
+ default: 'title',
266
+ },
267
+ // 树节点列表
268
+ treeNodes: {
269
+ type: Array,
270
+ default: ()=>[],
271
+ },
272
+ // 默认树已选节点 v-model:tree-selected
273
+ treeSelected: [ String, Number ],
274
+ // 树节点点击
275
+ treeNodeClick: Function,
276
+ // 是否选中第一个树节点
277
+ treeSelectFirstNode: {
278
+ type: Boolean,
279
+ default: true,
280
+ },
281
+ // 显示树筛选
282
+ treeFilter: Boolean,
283
+ // 树位置, 可选值: left / right
284
+ treeSide: {
285
+ type: String,
286
+ default: 'left',
287
+ },
288
+ // 不显示搜索
289
+ noSearch: Boolean,
290
+ // 搜索位置
291
+ searchSide: {
292
+ type: String,
293
+ default: 'right',
294
+ },
295
+ // 紧凑模式
296
+ dense: {
297
+ type: Boolean,
298
+ default: true,
299
+ },
300
+ // 隐藏左边侧滑菜单
301
+ hideLeftDrawer: Boolean,
302
+ // 左边侧滑菜单声明属性
303
+ leftDrawerProps: Object,
304
+ // 隐藏右边侧滑菜单
305
+ hideRightDrawer: Boolean,
306
+ // 右边侧滑菜单声明属性
307
+ rightDrawerProps: Object,
308
+ // 是否强制显示工具栏
309
+ showToolbar: Boolean,
310
+ },
311
+
312
+ /**
313
+ * 组合式
314
+ */
315
+ setup(props, { slots, emit }) {
316
+
317
+ // ==========【数据】============================================================================================
318
+
319
+ // 获取表格注入
320
+ const $table = inject(NTableKey)
321
+
322
+ // 获取对话框注入
323
+ const $dialog = inject(NDialogKey)
324
+ const inDialog = !! $dialog
325
+
326
+ // 当前双击表格行
327
+ let currentTableRowDblclick
328
+
329
+ // 如果在对话框内部
330
+ if (inDialog) {
331
+ // 提交表格已选数据给对话框
332
+ $dialog.submit(() => $table.tableSelected.value)
333
+
334
+ // 对话框中的表格双击表格行
335
+ currentTableRowDblclick = function (e, row) {
336
+ // 如果不是多选
337
+ if ($table.tableSelection.value !== 'multiple') {
338
+ $table.tableSelected.value = [ row ]
339
+ $dialog.confirm()
340
+ }
341
+ }
342
+
343
+ } else {
344
+ // 表格实例中的双击表格行
345
+ currentTableRowDblclick = $table.tableRowDblclick
346
+ }
347
+
348
+ // 表格节点
349
+ const tableRef = ref(null)
350
+
351
+ // 树节点
352
+ const treeRef = ref(null)
353
+
354
+ // 树筛选值
355
+ const treeFilterValue = ref('')
356
+
357
+ // 树选择数据
358
+ const treeSelected = ref(props.treeSelected)
359
+
360
+ // 是否显示搜索
361
+ const showSearch = ref(false)
362
+
363
+ // ==========【计算属性】==========================================================================================
364
+
365
+ /**
366
+ * 插槽标识
367
+ */
368
+ const slotNames = computed(function() {
369
+
370
+ const toolbar = []
371
+ const search = []
372
+ const table = []
373
+ let leftDrawer = false
374
+ let rightDrawer = false
375
+
376
+ // 如果有插槽
377
+ if ($n_isValidObject(slots)) {
378
+ for (const key in slots) {
379
+ if (key.startsWith('toolbar-')) {
380
+ toolbar.push(key.replace('toolbar-', ''))
381
+ } else if (key.startsWith('tree-')) {
382
+ search.push(key.replace('tree-', ''))
383
+ } else if (key.startsWith('search-')) {
384
+ search.push(key.replace('search-', ''))
385
+ } else if (key === 'left-drawer') {
386
+ leftDrawer = true
387
+ } else if (key === 'right-drawer') {
388
+ rightDrawer = true
389
+ } else {
390
+ table.push(key)
391
+ }
392
+ }
393
+ }
394
+
395
+ return {
396
+ toolbar,
397
+ search,
398
+ table,
399
+ leftDrawer,
400
+ rightDrawer,
401
+ }
402
+ })
403
+
404
+ // ==========【监听数据】=========================================================================================
405
+
406
+ // 如果有树节点点击方法
407
+ if ($n_isFunction(props.treeNodeClick)) {
408
+
409
+ /**
410
+ * 树节点 all
411
+ */
412
+ const treeNodesAll = computed(function () {
413
+ return $n_collection(props.treeNodes)
414
+ .keyBy(props.treeNodeKey)
415
+ .toObject()
416
+ })
417
+
418
+ /**
419
+ * 监听树选择数据
420
+ */
421
+ watch(treeSelected, function(nodeKey) {
422
+
423
+ // 触发更新已选树节点
424
+ emit('update:treeSelected', nodeKey)
425
+
426
+ // 如果节点值不是有效值
427
+ if (! $n_isValidValue(nodeKey)) {
428
+ // 则无任何操作
429
+ return
430
+ }
431
+
432
+ // 树节点点击
433
+ const res = props.treeNodeClick(nodeKey, treeNodesAll.value[nodeKey])
434
+
435
+ if ($n_isValidObject(res)) {
436
+
437
+ // 设置表格传参
438
+ $table.setQuery(res)
439
+
440
+ // 表格重新加载
441
+ $table.tableReload()
442
+ }
443
+ })
444
+
445
+ /**
446
+ * 监听树节点数据
447
+ */
448
+ watch(() => props.treeNodes, function (val) {
449
+
450
+ if (
451
+ // 如果关闭选中第一个树节点
452
+ ! props.treeSelectFirstNode
453
+ || ! $n_isValidArray(val)
454
+ || ! $n_isNil(treeSelected.value)
455
+ ) {
456
+ // 则无任何操作
457
+ return
458
+ }
459
+
460
+ // 选中第一个节点的值
461
+ treeSelected.value = val[0][props.treeNodeKey]
462
+ }, {
463
+ // 立即执行
464
+ immediate: true,
465
+ })
466
+ }
467
+
468
+ /**
469
+ * 格式化图片
470
+ */
471
+ function formatImg(img, { count }) {
472
+
473
+ // 图片数组
474
+ const imgs = []
475
+
476
+ // 转为图片数组
477
+ const arr = $n_split(img, ',')
478
+ for (const item of arr) {
479
+ const src = $n_getImage(item)
480
+ if (src) {
481
+ imgs.push(item)
482
+ if (
483
+ count > 0
484
+ && imgs.length === count
485
+ ) {
486
+ break
487
+ }
488
+ }
489
+ }
490
+
491
+ return imgs
492
+ }
493
+
494
+ // ==========【生命周期】=========================================================================================
495
+
496
+ /**
497
+ * 实例被挂载后调用
498
+ */
499
+ onMounted( async function() {
500
+
501
+ // 显示搜索
502
+ showSearch.value = true
503
+ })
504
+
505
+ // ==========【返回】=============================================================================================
506
+
507
+ return {
508
+ // 解构表格实例
509
+ ...$table,
510
+
511
+ // 表格节点
512
+ tableRef,
513
+ // 树节点
514
+ treeRef,
515
+ // 树筛选值
516
+ treeFilterValue,
517
+ // 树选择数据
518
+ treeSelected,
519
+ // 是否显示搜索
520
+ showSearch,
521
+
522
+ // 插槽 body 单元格标识
523
+ slotNames,
524
+
525
+ // 当前双击表格行
526
+ currentTableRowDblclick,
527
+ // 格式化图片
528
+ formatImg,
529
+ }
530
+ },
531
+ }
532
+ </script>