vxe-table 3.16.3 → 3.16.5

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 (178) hide show
  1. package/es/grid/src/grid.js +1 -1
  2. package/es/index.css +1 -1
  3. package/es/index.esm.js +1 -2
  4. package/es/index.min.css +1 -1
  5. package/es/locale/lang/ar-EG.js +20 -1
  6. package/es/locale/lang/de-DE.js +20 -1
  7. package/es/locale/lang/en-US.js +21 -2
  8. package/es/locale/lang/es-ES.js +20 -1
  9. package/es/locale/lang/fr-FR.js +20 -1
  10. package/es/locale/lang/hu-HU.js +20 -1
  11. package/es/locale/lang/hy-AM.js +19 -0
  12. package/es/locale/lang/id-ID.js +20 -1
  13. package/es/locale/lang/it-IT.js +20 -1
  14. package/es/locale/lang/ja-JP.js +20 -1
  15. package/es/locale/lang/ko-KR.js +20 -1
  16. package/es/locale/lang/ms-MY.js +20 -1
  17. package/es/locale/lang/nb-NO.js +20 -1
  18. package/es/locale/lang/pt-BR.js +20 -1
  19. package/es/locale/lang/ru-RU.js +20 -1
  20. package/es/locale/lang/th-TH.js +20 -1
  21. package/es/locale/lang/ug-CN.js +20 -1
  22. package/es/locale/lang/uk-UA.js +20 -1
  23. package/es/locale/lang/uz-UZ.js +20 -1
  24. package/es/locale/lang/vi-VN.js +20 -1
  25. package/es/locale/lang/zh-CHT.js +20 -1
  26. package/es/locale/lang/zh-CN.js +19 -0
  27. package/es/style.css +1 -1
  28. package/es/style.min.css +1 -1
  29. package/es/table/src/columnInfo.js +11 -2
  30. package/es/table/src/methods.js +15 -6
  31. package/es/table/style.css +1 -0
  32. package/es/table/style.min.css +1 -1
  33. package/es/ui/index.js +2 -2
  34. package/es/ui/src/log.js +1 -1
  35. package/es/vxe-table/style.css +1 -0
  36. package/es/vxe-table/style.min.css +1 -1
  37. package/lib/grid/src/grid.js +1 -1
  38. package/lib/grid/src/grid.min.js +1 -1
  39. package/lib/index.common.js +1 -2
  40. package/lib/index.css +1 -1
  41. package/lib/index.min.css +1 -1
  42. package/lib/index.umd.js +2310 -934
  43. package/lib/index.umd.min.js +1 -1
  44. package/lib/locale/lang/ar-EG.js +20 -1
  45. package/lib/locale/lang/ar-EG.min.js +1 -1
  46. package/lib/locale/lang/ar-EG.umd.js +20 -1
  47. package/lib/locale/lang/de-DE.js +20 -1
  48. package/lib/locale/lang/de-DE.min.js +1 -1
  49. package/lib/locale/lang/de-DE.umd.js +20 -1
  50. package/lib/locale/lang/en-US.js +21 -2
  51. package/lib/locale/lang/en-US.min.js +1 -1
  52. package/lib/locale/lang/en-US.umd.js +21 -2
  53. package/lib/locale/lang/es-ES.js +20 -1
  54. package/lib/locale/lang/es-ES.min.js +1 -1
  55. package/lib/locale/lang/es-ES.umd.js +20 -1
  56. package/lib/locale/lang/fr-FR.js +20 -1
  57. package/lib/locale/lang/fr-FR.min.js +1 -1
  58. package/lib/locale/lang/fr-FR.umd.js +20 -1
  59. package/lib/locale/lang/hu-HU.js +20 -1
  60. package/lib/locale/lang/hu-HU.min.js +1 -1
  61. package/lib/locale/lang/hu-HU.umd.js +20 -1
  62. package/lib/locale/lang/hy-AM.js +19 -0
  63. package/lib/locale/lang/hy-AM.min.js +1 -1
  64. package/lib/locale/lang/hy-AM.umd.js +19 -0
  65. package/lib/locale/lang/id-ID.js +20 -1
  66. package/lib/locale/lang/id-ID.min.js +1 -1
  67. package/lib/locale/lang/id-ID.umd.js +20 -1
  68. package/lib/locale/lang/it-IT.js +20 -1
  69. package/lib/locale/lang/it-IT.min.js +1 -1
  70. package/lib/locale/lang/it-IT.umd.js +20 -1
  71. package/lib/locale/lang/ja-JP.js +20 -1
  72. package/lib/locale/lang/ja-JP.min.js +1 -1
  73. package/lib/locale/lang/ja-JP.umd.js +20 -1
  74. package/lib/locale/lang/ko-KR.js +20 -1
  75. package/lib/locale/lang/ko-KR.min.js +1 -1
  76. package/lib/locale/lang/ko-KR.umd.js +20 -1
  77. package/lib/locale/lang/ms-MY.js +20 -1
  78. package/lib/locale/lang/ms-MY.min.js +1 -1
  79. package/lib/locale/lang/ms-MY.umd.js +20 -1
  80. package/lib/locale/lang/nb-NO.js +20 -1
  81. package/lib/locale/lang/nb-NO.min.js +1 -1
  82. package/lib/locale/lang/nb-NO.umd.js +20 -1
  83. package/lib/locale/lang/pt-BR.js +20 -1
  84. package/lib/locale/lang/pt-BR.min.js +1 -1
  85. package/lib/locale/lang/pt-BR.umd.js +20 -1
  86. package/lib/locale/lang/ru-RU.js +20 -1
  87. package/lib/locale/lang/ru-RU.min.js +1 -1
  88. package/lib/locale/lang/ru-RU.umd.js +20 -1
  89. package/lib/locale/lang/th-TH.js +20 -1
  90. package/lib/locale/lang/th-TH.min.js +1 -1
  91. package/lib/locale/lang/th-TH.umd.js +20 -1
  92. package/lib/locale/lang/ug-CN.js +20 -1
  93. package/lib/locale/lang/ug-CN.min.js +1 -1
  94. package/lib/locale/lang/ug-CN.umd.js +20 -1
  95. package/lib/locale/lang/uk-UA.js +20 -1
  96. package/lib/locale/lang/uk-UA.min.js +1 -1
  97. package/lib/locale/lang/uk-UA.umd.js +20 -1
  98. package/lib/locale/lang/uz-UZ.js +20 -1
  99. package/lib/locale/lang/uz-UZ.min.js +1 -1
  100. package/lib/locale/lang/uz-UZ.umd.js +20 -1
  101. package/lib/locale/lang/vi-VN.js +20 -1
  102. package/lib/locale/lang/vi-VN.min.js +1 -1
  103. package/lib/locale/lang/vi-VN.umd.js +20 -1
  104. package/lib/locale/lang/zh-CHT.js +20 -1
  105. package/lib/locale/lang/zh-CHT.min.js +1 -1
  106. package/lib/locale/lang/zh-CHT.umd.js +20 -1
  107. package/lib/locale/lang/zh-CN.js +19 -0
  108. package/lib/locale/lang/zh-CN.min.js +1 -1
  109. package/lib/locale/lang/zh-CN.umd.js +19 -0
  110. package/lib/style.css +1 -1
  111. package/lib/style.min.css +1 -1
  112. package/lib/table/src/columnInfo.js +14 -2
  113. package/lib/table/src/columnInfo.min.js +1 -1
  114. package/lib/table/src/methods.js +15 -5
  115. package/lib/table/src/methods.min.js +1 -1
  116. package/lib/table/style/style.css +1 -0
  117. package/lib/table/style/style.min.css +1 -1
  118. package/lib/ui/index.js +2 -2
  119. package/lib/ui/index.min.js +1 -1
  120. package/lib/ui/src/log.js +1 -1
  121. package/lib/ui/src/log.min.js +1 -1
  122. package/lib/v-x-e-table/index.js +1 -2
  123. package/lib/v-x-e-table/index.min.js +1 -1
  124. package/lib/vxe-colgroup/index.js +1 -2
  125. package/lib/vxe-colgroup/index.min.js +1 -1
  126. package/lib/vxe-column/index.js +1 -2
  127. package/lib/vxe-column/index.min.js +1 -1
  128. package/lib/vxe-grid/index.js +1 -2
  129. package/lib/vxe-grid/index.min.js +1 -1
  130. package/lib/vxe-table/index.js +1 -2
  131. package/lib/vxe-table/index.min.js +1 -1
  132. package/lib/vxe-table/style/style.css +1 -0
  133. package/lib/vxe-table/style/style.min.css +1 -1
  134. package/lib/vxe-toolbar/index.js +1 -2
  135. package/lib/vxe-toolbar/index.min.js +1 -1
  136. package/lib/vxe-ui/index.js +1 -2
  137. package/lib/vxe-ui/index.min.js +1 -1
  138. package/lib/vxe-v-x-e-table/index.js +1 -2
  139. package/lib/vxe-v-x-e-table/index.min.js +1 -1
  140. package/package.json +1 -1
  141. package/packages/grid/src/grid.ts +6 -6
  142. package/packages/locale/lang/ar-EG.ts +20 -1
  143. package/packages/locale/lang/de-DE.ts +20 -1
  144. package/packages/locale/lang/en-US.ts +21 -2
  145. package/packages/locale/lang/es-ES.ts +20 -1
  146. package/packages/locale/lang/fr-FR.ts +20 -1
  147. package/packages/locale/lang/hu-HU.ts +20 -1
  148. package/packages/locale/lang/hy-AM.ts +19 -0
  149. package/packages/locale/lang/id-ID.ts +20 -1
  150. package/packages/locale/lang/it-IT.ts +20 -1
  151. package/packages/locale/lang/ja-JP.ts +20 -1
  152. package/packages/locale/lang/ko-KR.ts +20 -1
  153. package/packages/locale/lang/ms-MY.ts +20 -1
  154. package/packages/locale/lang/nb-NO.ts +20 -1
  155. package/packages/locale/lang/pt-BR.ts +20 -1
  156. package/packages/locale/lang/ru-RU.ts +20 -1
  157. package/packages/locale/lang/th-TH.ts +20 -1
  158. package/packages/locale/lang/ug-CN.ts +20 -1
  159. package/packages/locale/lang/uk-UA.ts +20 -1
  160. package/packages/locale/lang/uz-UZ.ts +20 -1
  161. package/packages/locale/lang/vi-VN.ts +20 -1
  162. package/packages/locale/lang/zh-CHT.ts +20 -1
  163. package/packages/locale/lang/zh-CN.ts +19 -0
  164. package/packages/table/module/custom/panel.ts +11 -11
  165. package/packages/table/module/export/export-panel.ts +5 -6
  166. package/packages/table/module/export/import-panel.ts +3 -4
  167. package/packages/table/src/columnInfo.ts +13 -2
  168. package/packages/table/src/methods.ts +15 -7
  169. package/packages/table/src/table.ts +5 -5
  170. package/packages/toolbar/src/toolbar.ts +11 -11
  171. package/packages/ui/index.ts +1 -1
  172. package/styles/components/table.scss +1 -0
  173. /package/es/{iconfont.1752211596473.ttf → iconfont.1753174798434.ttf} +0 -0
  174. /package/es/{iconfont.1752211596473.woff → iconfont.1753174798434.woff} +0 -0
  175. /package/es/{iconfont.1752211596473.woff2 → iconfont.1753174798434.woff2} +0 -0
  176. /package/lib/{iconfont.1752211596473.ttf → iconfont.1753174798434.ttf} +0 -0
  177. /package/lib/{iconfont.1752211596473.woff → iconfont.1753174798434.woff} +0 -0
  178. /package/lib/{iconfont.1752211596473.woff2 → iconfont.1753174798434.woff2} +0 -0
@@ -17,6 +17,7 @@ export default {
17
17
  groupTag: 'ส่วนหัวคอลัมน์การจัดกลุ่มควรใช้ "{0}" แทน "{1}" ซึ่งอาจทำให้เกิดข้อผิดพลาด',
18
18
  scrollErrProp: 'พารามิเตอร์นี้ "{0}" นี้ไม่ได้รับการสนับสนุนหลังจากเปิดใช้งานการเลื่อนเสมือนจริง',
19
19
  errConflicts: 'พารามิเตอร์ "{0}" ขัดแย้งกับ "{1}"',
20
+ modelConflicts: '绑定的字段值 "{0}" 与 "{1}" 存在冲突,将会出现错误',
20
21
  notSupportProp: '"{1}" ไม่ได้รับการสนับสนุนเมื่อเปิดใช้งานพารามิเตอร์ "{0}" มันควรจะเป็น "{2}" มิฉะนั้นจะเกิดข้อผิดพลาดเกิดขึ้น',
21
22
  notConflictProp: 'เมื่อใช้ "{0}", "{1}" ควรตั้งค่ามิฉะนั้นอาจมีความขัดแย้งในการทำงาน',
22
23
  unableInsert: 'ไม่สามารถแทรกลงในตำแหน่งที่ระบุได้โปรดตรวจสอบว่าพารามิเตอร์ถูกต้องหรือไม่',
@@ -96,9 +97,27 @@ export default {
96
97
  operError: 'เกิดข้อผิดพลาดและการดำเนินการล้มเหลว!'
97
98
  },
98
99
  select: {
100
+ clear: '清除',
101
+ allChecked: '全选',
102
+ total: '{0} / {1}',
99
103
  search: 'ค้นหา',
100
104
  loadingText: 'การโหลด',
101
- emptyText: 'ยังไม่มีข้อมูล'
105
+ emptyText: 'ยังไม่มีข้อมูล',
106
+ maxOpt: '最大可选择的数量不能超过 {0} 个',
107
+ overSizeErr: '已超出最大可选数量 {0} 个,超出部分将被忽略!',
108
+ searchEmpty: '未匹配到数据!'
109
+ },
110
+ tree: {
111
+ searchEmpty: '未匹配到数据!'
112
+ },
113
+ treeSelect: {
114
+ clearChecked: '清除',
115
+ allChecked: '全选',
116
+ allExpand: '全部展开',
117
+ clearExpand: '全部收起',
118
+ total: '已选 {0}',
119
+ search: '搜索',
120
+ emptyText: '暂无数据'
102
121
  },
103
122
  pager: {
104
123
  goto: 'ไป',
@@ -17,6 +17,7 @@ export default {
17
17
  groupTag: 'گۇرۇپپا قۇر بىشىغا چوقۇم "{0}" نى ئىشلىتىشىڭىز كىرەك،ھەرگىزمۇ "{1}"نى ئەمەس ،بولمىسا بۇ بەلكىم خاتالىق كەلتۈرۈپ چىقىرىشى مومكىن',
18
18
  scrollErrProp: 'مەۋھۇم يۇمىلاتما ئىقىدارىنى قوزغاتقاندىن كىيىن بۇ سېپىرنى تەكشەشكە بولمايدۇ "{0}"',
19
19
  errConflicts: 'سان سىپىر "{0}" بىلەن "{1}" دە ماسلاشماسلىق ئەھۋالى مەۋجۇت',
20
+ modelConflicts: '绑定的字段值 "{0}" 与 "{1}" 存在冲突,将会出现错误',
20
21
  notSupportProp: '当启用参数 "{0}" 时不支持 "{1}",应该为 "{2}",否则将会出现错误',
21
22
  notConflictProp: '当使用 "{0}" 时,应该设置 "{1}",否则可能会存在功能冲突',
22
23
  unableInsert: 'بىكىتىلگەن ئورۇنغا قىستۇرۇشقا بولمايدۇ، پارامېتىرىڭىزنىڭ توغرا-خاتالىقىنى تەكشۈرۈڭ ',
@@ -96,9 +97,27 @@ export default {
96
97
  operError: 'خاتالىق كۆرۈلدى،مەشخۇلات مەغلۇپ بولدى'
97
98
  },
98
99
  select: {
100
+ clear: '清除',
101
+ allChecked: '全选',
102
+ total: '{0} / {1}',
99
103
  search: 'ئىزدەش',
100
104
  loadingText: 'يۈكلىنىۋاتىدۇ',
101
- emptyText: 'ھازىرچە ئۇچۇر يوق'
105
+ emptyText: 'ھازىرچە ئۇچۇر يوق',
106
+ maxOpt: '最大可选择的数量不能超过 {0} 个',
107
+ overSizeErr: '已超出最大可选数量 {0} 个,超出部分将被忽略!',
108
+ searchEmpty: '未匹配到数据!'
109
+ },
110
+ tree: {
111
+ searchEmpty: '未匹配到数据!'
112
+ },
113
+ treeSelect: {
114
+ clearChecked: '清除',
115
+ allChecked: '全选',
116
+ allExpand: '全部展开',
117
+ clearExpand: '全部收起',
118
+ total: '已选 {0}',
119
+ search: '搜索',
120
+ emptyText: '暂无数据'
102
121
  },
103
122
  pager: {
104
123
  goto: 'ئالغا',
@@ -17,6 +17,7 @@ export default {
17
17
  groupTag: 'Заголовок стовпців групування повинно використовувати "{0}" замість "{1}", що може спричинити помилки',
18
18
  scrollErrProp: 'Цей параметр "{0}" не підтримується після включення віртуальної прокрутки',
19
19
  errConflicts: 'Параметр "{0}" Конфлікти з "{1}"',
20
+ modelConflicts: '绑定的字段值 "{0}" 与 "{1}" 存在冲突,将会出现错误',
20
21
  notSupportProp: '"{1}" не підтримується, коли параметр "{0}" ввімкнено, він повинен бути "{2}", інакше помилка станеться',
21
22
  notConflictProp: 'При використанні "{0}", "{1}" слід встановити, інакше можуть бути функціональні конфлікти',
22
23
  unableInsert: 'Неможливо вставити у вказане місце, будь ласка, перевірте, чи правильні параметри',
@@ -96,9 +97,27 @@ export default {
96
97
  operError: 'Сталася помилка, і операція не вдалася!'
97
98
  },
98
99
  select: {
100
+ clear: '清除',
101
+ allChecked: '全选',
102
+ total: '{0} / {1}',
99
103
  search: 'обшук',
100
104
  loadingText: 'навантаження',
101
- emptyText: 'Ще немає даних'
105
+ emptyText: 'Ще немає даних',
106
+ maxOpt: '最大可选择的数量不能超过 {0} 个',
107
+ overSizeErr: '已超出最大可选数量 {0} 个,超出部分将被忽略!',
108
+ searchEmpty: '未匹配到数据!'
109
+ },
110
+ tree: {
111
+ searchEmpty: '未匹配到数据!'
112
+ },
113
+ treeSelect: {
114
+ clearChecked: '清除',
115
+ allChecked: '全选',
116
+ allExpand: '全部展开',
117
+ clearExpand: '全部收起',
118
+ total: '已选 {0}',
119
+ search: '搜索',
120
+ emptyText: '暂无数据'
102
121
  },
103
122
  pager: {
104
123
  goto: 'Йти',
@@ -17,6 +17,7 @@ export default {
17
17
  groupTag: "\"Lim li}\" o'rniga guruh sarlavhalarida \"{1}\" o'rniga \"{0}\" o'rniga \"{0}\" dan foydalanish kerak",
18
18
  scrollErrProp: "Virtual aylantirish yoqilgandan so'ng \"{0}\" ushbu parametr qo'llab-quvvatlanmaydi",
19
19
  errConflicts: '"{0}" parametr "{1}" bilan ziddiyatlar',
20
+ modelConflicts: '绑定的字段值 "{0}" 与 "{1}" 存在冲突,将会出现错误',
20
21
  notSupportProp: '"{1}" parametri yoqilganda, u "{2}" parametrlari yoqilgan, aks holda xatolik yuz beradi',
21
22
  notConflictProp: "\"{0}\", \"{1}\" dan foydalanish kerak bo'lganda, aks holda funktsional to'qnashuvlar bo'lishi mumkin",
22
23
  unableInsert: "Belgilangan joyda kiritilishi mumkin emas, parametrlar to'g'ri yoki yo'qligini tekshiring",
@@ -96,9 +97,27 @@ export default {
96
97
  operError: "Xato yuz berdi va operatsiya muvaffaqiyatsiz bo'ldi!"
97
98
  },
98
99
  select: {
100
+ clear: '清除',
101
+ allChecked: '全选',
102
+ total: '{0} / {1}',
99
103
  search: 'qidirish',
100
104
  loadingText: 'yuklamoq',
101
- emptyText: "Hali ma'lumot yo'q"
105
+ emptyText: "Hali ma'lumot yo'q",
106
+ maxOpt: '最大可选择的数量不能超过 {0} 个',
107
+ overSizeErr: '已超出最大可选数量 {0} 个,超出部分将被忽略!',
108
+ searchEmpty: '未匹配到数据!'
109
+ },
110
+ tree: {
111
+ searchEmpty: '未匹配到数据!'
112
+ },
113
+ treeSelect: {
114
+ clearChecked: '清除',
115
+ allChecked: '全选',
116
+ allExpand: '全部展开',
117
+ clearExpand: '全部收起',
118
+ total: '{0} / {1}',
119
+ search: '搜索',
120
+ emptyText: '暂无数据'
102
121
  },
103
122
  pager: {
104
123
  goto: 'Bormoq',
@@ -17,6 +17,7 @@ export default {
17
17
  groupTag: 'Nhóm tiêu đề nhóm nên sử dụng "{0}" thay vì "{1}", có thể gây ra lỗi',
18
18
  scrollErrProp: 'Tham số này "{0}" không được hỗ trợ sau khi cuộn ảo được bật',
19
19
  errConflicts: 'Tham số "{0}" Xung đột với "{1}"',
20
+ modelConflicts: '绑定的字段值 "{0}" 与 "{1}" 存在冲突,将会出现错误',
20
21
  notSupportProp: '"{1}" không được hỗ trợ khi tham số "{0}" được bật, nó phải là "{2}", nếu không sẽ xảy ra lỗi',
21
22
  notConflictProp: 'Khi sử dụng "{0}", "{1}" nên được đặt, nếu không có thể có xung đột chức năng',
22
23
  unableInsert: 'Không thể được chèn vào vị trí đã chỉ định, vui lòng kiểm tra xem các tham số có đúng không',
@@ -96,9 +97,27 @@ export default {
96
97
  operError: 'Một lỗi đã xảy ra và hoạt động không thành công!'
97
98
  },
98
99
  select: {
100
+ clear: '清除',
101
+ allChecked: '全选',
102
+ total: '{0} / {1}',
99
103
  search: 'tìm kiếm',
100
104
  loadingText: 'đang tải',
101
- emptyText: 'Chưa có dữ liệu'
105
+ emptyText: 'Chưa có dữ liệu',
106
+ maxOpt: '最大可选择的数量不能超过 {0} 个',
107
+ overSizeErr: '已超出最大可选数量 {0} 个,超出部分将被忽略!',
108
+ searchEmpty: '未匹配到数据!'
109
+ },
110
+ tree: {
111
+ searchEmpty: '未匹配到数据!'
112
+ },
113
+ treeSelect: {
114
+ clearChecked: '清除',
115
+ allChecked: '全选',
116
+ allExpand: '全部展开',
117
+ clearExpand: '全部收起',
118
+ total: '已选 {0}',
119
+ search: '搜索',
120
+ emptyText: '暂无数据'
102
121
  },
103
122
  pager: {
104
123
  goto: 'Đi',
@@ -17,6 +17,7 @@ export default {
17
17
  groupTag: '分組列頭應該使用 "{0}" 而不是 "{1}",這可能會出現錯誤',
18
18
  scrollErrProp: '啟用虛擬滾動後不支持該參數 "{0}"',
19
19
  errConflicts: '參數 "{0}" 與 "{1}" 有衝突',
20
+ modelConflicts: '绑定的字段值 "{0}" 与 "{1}" 存在冲突,将会出现错误',
20
21
  notSupportProp: '當啟用參數 "{0}" 時不支持 "{1}",應該為 "{2}",否則將會出現錯誤',
21
22
  notConflictProp: '當使用 "{0}" 時,應該設置 "{1}",否則可能會存在功能衝突',
22
23
  unableInsert: '無法插入到指定位置,請檢查參數是否正確',
@@ -96,9 +97,27 @@ export default {
96
97
  operError: '發生錯誤,操作失敗!'
97
98
  },
98
99
  select: {
100
+ clear: '清除',
101
+ allChecked: '全选',
102
+ total: '{0} / {1}',
99
103
  search: '搜尋',
100
104
  loadingText: '載入中',
101
- emptyText: '暫無數據'
105
+ emptyText: '暫無數據',
106
+ maxOpt: '最大可选择的数量不能超过 {0} 个',
107
+ overSizeErr: '已超出最大可选数量 {0} 个,超出部分将被忽略!',
108
+ searchEmpty: '未匹配到数据!'
109
+ },
110
+ tree: {
111
+ searchEmpty: '未匹配到数据!'
112
+ },
113
+ treeSelect: {
114
+ clearChecked: '清除',
115
+ allChecked: '全选',
116
+ allExpand: '全部展开',
117
+ clearExpand: '全部收起',
118
+ total: '已选 {0}',
119
+ search: '搜索',
120
+ emptyText: '暂无数据'
102
121
  },
103
122
  pager: {
104
123
  goto: '前往',
@@ -17,6 +17,7 @@ export default {
17
17
  groupTag: '分组列头应该使用 "{0}" 而不是 "{1}",这可能会出现错误',
18
18
  scrollErrProp: '启用虚拟滚动后不支持该参数 "{0}"',
19
19
  errConflicts: '参数 "{0}" 与 "{1}" 有冲突',
20
+ modelConflicts: '绑定的字段值 "{0}" 与 "{1}" 存在冲突,将会出现错误',
20
21
  notSupportProp: '当启用参数 "{0}" 时不支持 "{1}",应该为 "{2}",否则将会出现错误',
21
22
  notConflictProp: '当使用 "{0}" 时,应该设置 "{1}",否则可能会存在功能冲突',
22
23
  unableInsert: '无法插入到指定位置,请检查参数是否正确',
@@ -96,8 +97,26 @@ export default {
96
97
  operError: '发生错误,操作失败!'
97
98
  },
98
99
  select: {
100
+ clear: '清除',
101
+ allChecked: '全选',
102
+ total: '{0} / {1}',
99
103
  search: '搜索',
100
104
  loadingText: '加载中',
105
+ emptyText: '暂无数据',
106
+ maxSize: '最大可选择的数量不能超过 {0} 个',
107
+ overSizeErr: '已超出最大可选数量 {0} 个,超出部分将被忽略!',
108
+ searchEmpty: '未匹配到数据!'
109
+ },
110
+ tree: {
111
+ searchEmpty: '未匹配到数据!'
112
+ },
113
+ treeSelect: {
114
+ clearChecked: '清除',
115
+ allChecked: '全选',
116
+ allExpand: '全部展开',
117
+ clearExpand: '全部收起',
118
+ total: '已选 {0}',
119
+ search: '搜索',
101
120
  emptyText: '暂无数据'
102
121
  },
103
122
  pager: {
@@ -6,7 +6,7 @@ import { errLog } from '../../../ui/src/log'
6
6
  import XEUtils from 'xe-utils'
7
7
 
8
8
  import type { VxeTableDefines, VxeTableConstructor, VxeTablePrivateMethods, TableReactData, TableInternalData, VxeColumnPropTypes, VxeTableCustomPanelConstructor, TableCustomPanelReactData, TableCustomPanelInternalData } from '../../../../types'
9
- import type { VxeModalComponent, VxeDrawerComponent, VxeButtonComponent, VxeRadioGroupComponent, VxeInputComponent, VxeButtonDefines, VxeRadioGroupDefines } from 'vxe-pc-ui'
9
+ import type { VxeButtonDefines, VxeRadioGroupDefines } from 'vxe-pc-ui'
10
10
 
11
11
  const { getI18n, getIcon, renderEmptyElement } = VxeUI
12
12
 
@@ -113,7 +113,7 @@ const renderDragTip = (h: CreateElement, $xeTableCustomPanel: VxeTableCustomPane
113
113
  }
114
114
 
115
115
  const renderSimplePanel = (h: CreateElement, _vm: any) => {
116
- const VxeUIButtonComponent = VxeUI.getComponent<VxeButtonComponent>('VxeButton')
116
+ const VxeUIButtonComponent = VxeUI.getComponent('VxeButton')
117
117
 
118
118
  const props = _vm
119
119
 
@@ -435,10 +435,10 @@ const renderSimplePanel = (h: CreateElement, _vm: any) => {
435
435
  }
436
436
 
437
437
  const renderPopupPanel = (h: CreateElement, $xeTableCustomPanel: VxeTableCustomPanelConstructor) => {
438
- const VxeUIModalComponent = VxeUI.getComponent<VxeModalComponent>('VxeModal')
439
- const VxeUIDrawerComponent = VxeUI.getComponent<VxeDrawerComponent>('VxeDrawer')
440
- const VxeUIButtonComponent = VxeUI.getComponent<VxeButtonComponent>('VxeButton')
441
- const VxeUINumberInputComponent = VxeUI.getComponent<VxeInputComponent>('VxeInput')
438
+ const VxeUIModalComponent = VxeUI.getComponent('VxeModal')
439
+ const VxeUIDrawerComponent = VxeUI.getComponent('VxeDrawer')
440
+ const VxeUIButtonComponent = VxeUI.getComponent('VxeButton')
441
+ const VxeUINumberInputComponent = VxeUI.getComponent('VxeInput')
442
442
 
443
443
  const _vm = $xeTableCustomPanel as any
444
444
  const props = $xeTableCustomPanel
@@ -913,11 +913,11 @@ export default {
913
913
  created () {
914
914
  const $xeTableCustomPanel = this as any
915
915
 
916
- const VxeUIModalComponent = VxeUI.getComponent<VxeModalComponent>('VxeModal')
917
- const VxeUIDrawerComponent = VxeUI.getComponent<VxeDrawerComponent>('VxeDrawer')
918
- const VxeUIButtonComponent = VxeUI.getComponent<VxeButtonComponent>('VxeButton')
919
- const VxeUINumberInputComponent = VxeUI.getComponent<VxeInputComponent>('VxeNumberInput')
920
- const VxeUIRadioGroupComponent = VxeUI.getComponent<VxeRadioGroupComponent>('VxeRadioGroup')
916
+ const VxeUIModalComponent = VxeUI.getComponent('VxeModal')
917
+ const VxeUIDrawerComponent = VxeUI.getComponent('VxeDrawer')
918
+ const VxeUIButtonComponent = VxeUI.getComponent('VxeButton')
919
+ const VxeUINumberInputComponent = VxeUI.getComponent('VxeNumberInput')
920
+ const VxeUIRadioGroupComponent = VxeUI.getComponent('VxeRadioGroup')
921
921
 
922
922
  $xeTableCustomPanel.$nextTick(() => {
923
923
  const $xeTable = $xeTableCustomPanel.$xeTable as VxeTableConstructor & VxeTablePrivateMethods
@@ -4,7 +4,6 @@ import XEUtils from 'xe-utils'
4
4
  import { formatText } from '../../../ui/src/utils'
5
5
  import { errLog } from '../../../ui/src/log'
6
6
 
7
- import type { VxeModalComponent, VxeInputComponent, VxeCheckboxComponent, VxeSelectComponent, VxeButtonComponent } from 'vxe-pc-ui'
8
7
  import type { VxeTableConstructor, VxeTablePrivateMethods } from '../../../../types'
9
8
 
10
9
  const { getI18n, getIcon, globalMixins, renderEmptyElement } = VxeUI
@@ -60,11 +59,11 @@ export default {
60
59
  created (this: any) {
61
60
  const $xeTableExportPanel = this
62
61
 
63
- const VxeUIModalComponent = VxeUI.getComponent<VxeModalComponent>('VxeModal')
64
- const VxeUIButtonComponent = VxeUI.getComponent<VxeButtonComponent>('VxeButton')
65
- const VxeUISelectComponent = VxeUI.getComponent<VxeSelectComponent>('VxeSelect')
66
- const VxeUIInputComponent = VxeUI.getComponent<VxeInputComponent>('VxeInput')
67
- const VxeUICheckboxComponent = VxeUI.getComponent<VxeCheckboxComponent>('VxeCheckbox')
62
+ const VxeUIModalComponent = VxeUI.getComponent('VxeModal')
63
+ const VxeUIButtonComponent = VxeUI.getComponent('VxeButton')
64
+ const VxeUISelectComponent = VxeUI.getComponent('VxeSelect')
65
+ const VxeUIInputComponent = VxeUI.getComponent('VxeInput')
66
+ const VxeUICheckboxComponent = VxeUI.getComponent('VxeCheckbox')
68
67
 
69
68
  $xeTableExportPanel.$nextTick(() => {
70
69
  if (!VxeUIModalComponent) {
@@ -4,7 +4,6 @@ import XEUtils from 'xe-utils'
4
4
  import { parseFile } from '../../../ui/src/utils'
5
5
  import { errLog } from '../../../ui/src/log'
6
6
 
7
- import type { VxeModalComponent, VxeSelectComponent, VxeButtonComponent } from 'vxe-pc-ui'
8
7
  import type { VxeTableConstructor, VxeTablePrivateMethods } from '../../../../types'
9
8
 
10
9
  const { getI18n, getIcon, globalMixins, renderEmptyElement } = VxeUI
@@ -52,9 +51,9 @@ export default {
52
51
  created (this: any) {
53
52
  const $xeTableImportPanel = this
54
53
 
55
- const VxeUIModalComponent = VxeUI.getComponent<VxeModalComponent>('VxeModal')
56
- const VxeUIButtonComponent = VxeUI.getComponent<VxeButtonComponent>('VxeButton')
57
- const VxeUISelectComponent = VxeUI.getComponent<VxeSelectComponent>('VxeSelect')
54
+ const VxeUIModalComponent = VxeUI.getComponent('VxeModal')
55
+ const VxeUIButtonComponent = VxeUI.getComponent('VxeButton')
56
+ const VxeUISelectComponent = VxeUI.getComponent('VxeSelect')
58
57
 
59
58
  $xeTableImportPanel.$nextTick(() => {
60
59
  if (!VxeUIModalComponent) {
@@ -14,6 +14,8 @@ export class ColumnInfo {
14
14
  const tableProps = $xeTable
15
15
  const $xeGrid = $xeTable.$xeGrid as VxeGridConstructor & GridPrivateMethods
16
16
 
17
+ const { field, editRender } = _vm
18
+
17
19
  const proxyOpts = $xeGrid ? $xeGrid.computeProxyOpts : null
18
20
  const formatter = _vm.formatter
19
21
  const visible = XEUtils.isBoolean(_vm.visible) ? _vm.visible : true
@@ -59,11 +61,20 @@ export class ColumnInfo {
59
61
  }
60
62
  }
61
63
 
64
+ if (field && editRender) {
65
+ if (editRender.startField && `${editRender.startField}`.indexOf(field) >= 0) {
66
+ errLog('vxe.error.modelConflicts', [`field=${field}`, `edit-render.startField=${editRender.startField}`])
67
+ }
68
+ if (editRender.endField && `${editRender.endField}`.indexOf(field) >= 0) {
69
+ errLog('vxe.error.modelConflicts', [`field=${field}`, `edit-render.endField=${editRender.endField}`])
70
+ }
71
+ }
72
+
62
73
  Object.assign(this, {
63
74
  // 基本属性
64
75
  type: _vm.type,
65
76
  property: _vm.field,
66
- field: _vm.field,
77
+ field: field,
67
78
  title: _vm.title,
68
79
  width: _vm.width,
69
80
  minWidth: _vm.minWidth,
@@ -100,7 +111,7 @@ export class ColumnInfo {
100
111
  rowResize: _vm.rowResize,
101
112
  cellType: _vm.cellType,
102
113
  cellRender: _vm.cellRender,
103
- editRender: _vm.editRender,
114
+ editRender: editRender,
104
115
  contentRender: _vm.contentRender,
105
116
  headerExportMethod: _vm.headerExportMethod,
106
117
  exportMethod: _vm.exportMethod,
@@ -3868,7 +3868,7 @@ const Methods = {
3868
3868
  setTimeout(() => handleLazyRecalculate($xeTable, false, true, true), 50)
3869
3869
  })
3870
3870
  },
3871
- handleTableData (force: any) {
3871
+ handleTableData (force?: boolean) {
3872
3872
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
3873
3873
  const reactData = $xeTable as unknown as TableReactData
3874
3874
  const internalData = $xeTable as unknown as TableInternalData
@@ -7048,7 +7048,7 @@ const Methods = {
7048
7048
  const treeOpts = $xeTable.computeTreeOpts
7049
7049
  const childrenField = treeOpts.children || treeOpts.childrenField
7050
7050
  const checkboxOpts = $xeTable.computeCheckboxOpts
7051
- const { checkField, checkStrictly, checkMethod } = checkboxOpts
7051
+ const { checkField, indeterminateField, checkStrictly, checkMethod } = checkboxOpts
7052
7052
  if (checkStrictly) {
7053
7053
  return
7054
7054
  }
@@ -7079,6 +7079,10 @@ const Methods = {
7079
7079
  if (childList && childList.length && !childRowMaps[rowid]) {
7080
7080
  childRowMaps[rowid] = 1
7081
7081
  childRowList.unshift([row, rowid, childList])
7082
+ } else {
7083
+ if (indeterminateField) {
7084
+ XEUtils.set(row, indeterminateField, false)
7085
+ }
7082
7086
  }
7083
7087
  }, { children: transform ? mapChildrenField : childrenField })
7084
7088
  }
@@ -7090,7 +7094,7 @@ const Methods = {
7090
7094
  let sLen = 0 // 已选
7091
7095
  let hLen = 0 // 半选
7092
7096
  let vLen = 0 // 有效子行
7093
- const cLen = childList.length // 有效子行
7097
+ const cLen = childList.length // 子行
7094
7098
  childList.forEach(
7095
7099
  checkMethod
7096
7100
  ? (item) => {
@@ -7146,6 +7150,9 @@ const Methods = {
7146
7150
  if (checkField) {
7147
7151
  XEUtils.set(row, checkField, isSelected)
7148
7152
  }
7153
+ if (indeterminateField) {
7154
+ XEUtils.set(row, indeterminateField, halfSelect)
7155
+ }
7149
7156
  if (isSelected) {
7150
7157
  if (!checkField) {
7151
7158
  selectCheckboxMaps[rowid] = row
@@ -8939,8 +8946,7 @@ const Methods = {
8939
8946
  setSort (sortConfs: VxeTableDefines.SortConfs | VxeTableDefines.SortConfs[], isUpdate?: boolean) {
8940
8947
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
8941
8948
 
8942
- // 已废弃,即将去掉事件触发 new Event('click') -> null
8943
- return handleSortEvent($xeTable, new Event('click'), sortConfs, isUpdate)
8949
+ return handleSortEvent($xeTable, null, sortConfs, isUpdate)
8944
8950
  },
8945
8951
  setSortByEvent (evnt: Event, sortConfs: VxeTableDefines.SortConfs | VxeTableDefines.SortConfs[], isUpdate?: boolean) {
8946
8952
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
@@ -9334,15 +9340,17 @@ const Methods = {
9334
9340
  const reactData = $xeTable as unknown as TableReactData
9335
9341
  const internalData = $xeTable as unknown as TableInternalData
9336
9342
 
9337
- const { tableFullData } = internalData
9343
+ const { tableFullData, scrollYStore } = internalData
9338
9344
  const expandOpts = $xeTable.computeExpandOpts
9339
9345
  const { reserve } = expandOpts
9340
9346
  const expList = $xeTable.getRowExpandRecords()
9341
9347
  internalData.rowExpandedMaps = {}
9342
- reactData.rowExpandedFlag++
9343
9348
  if (reserve) {
9344
9349
  tableFullData.forEach((row) => handleRowExpandReserve($xeTable, row, false))
9345
9350
  }
9351
+ reactData.rowExpandedFlag++
9352
+ scrollYStore.startIndex = 0
9353
+ scrollYStore.endIndex = 1
9346
9354
  return $xeTable.$nextTick().then(() => {
9347
9355
  if (expList.length) {
9348
9356
  return handleLazyRecalculate($xeTable, true, true, true)
@@ -25,7 +25,7 @@ import keyboardMixin from '../module/keyboard/mixin'
25
25
  import validatorMixin from '../module/validator/mixin'
26
26
  import customMixin from '../module/custom/mixin'
27
27
 
28
- import type { VxeLoadingComponent, VxeTooltipComponent, VxeTabsConstructor, VxeTabsPrivateMethods } from 'vxe-pc-ui'
28
+ import type { VxeTabsConstructor, VxeTabsPrivateMethods } from 'vxe-pc-ui'
29
29
  import type { VxeTableConstructor, VxeTablePrivateMethods, TableInternalData, TableReactData, VxeTableDefines } from '../../../types'
30
30
 
31
31
  const { getConfig, getIcon, getI18n, renderer, globalResize, globalEvents, globalMixins, renderEmptyElement } = VxeUI
@@ -1878,8 +1878,8 @@ export default {
1878
1878
  }
1879
1879
 
1880
1880
  // 使用已安装的组件,如果未安装则不渲染
1881
- const VxeUILoadingComponent = VxeUI.getComponent<VxeLoadingComponent>('VxeLoading')
1882
- const VxeUITooltipComponent = VxeUI.getComponent<VxeTooltipComponent>('VxeTooltip')
1881
+ const VxeUILoadingComponent = VxeUI.getComponent('VxeLoading')
1882
+ const VxeUITooltipComponent = VxeUI.getComponent('VxeTooltip')
1883
1883
 
1884
1884
  $xeTable.$nextTick(() => {
1885
1885
  if (props.loading) {
@@ -1977,8 +1977,8 @@ export default {
1977
1977
  },
1978
1978
  render (h: CreateElement) {
1979
1979
  // 使用已安装的组件,如果未安装则不渲染
1980
- const VxeUILoadingComponent = VxeUI.getComponent<VxeLoadingComponent>('VxeLoading')
1981
- const VxeUITooltipComponent = VxeUI.getComponent<VxeTooltipComponent>('VxeTooltip')
1980
+ const VxeUILoadingComponent = VxeUI.getComponent('VxeLoading')
1981
+ const VxeUITooltipComponent = VxeUI.getComponent('VxeTooltip')
1982
1982
 
1983
1983
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
1984
1984
  const $xeGrid = $xeTable.$xeGrid
@@ -5,7 +5,7 @@ import { VxeUI } from '../../ui'
5
5
  import { getSlotVNs } from '../../ui/src/vn'
6
6
  import { warnLog, errLog } from '../../ui/src/log'
7
7
 
8
- import type { ValueOf, VxeButtonComponent, VxeComponentSizeType, VxeComponentSlotType, VxeButtonDefines } from 'vxe-pc-ui'
8
+ import type { ValueOf, VxeComponentSizeType, VxeComponentSlotType, VxeButtonDefines } from 'vxe-pc-ui'
9
9
  import type { VxeGridConstructor, GridPrivateMethods, ToolbarInternalData, VxeTableDefines, VxeToolbarEmits, VxeToolbarPropTypes, VxeTablePropTypes, ToolbarReactData, VxeTableConstructor, VxeTablePrivateMethods } from '../../../types'
10
10
 
11
11
  const { getConfig, getIcon, getI18n, renderer, commands, createEvent, globalMixins, renderEmptyElement } = VxeUI
@@ -412,7 +412,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
412
412
  //
413
413
  renderDropdowns (h: CreateElement, item: VxeToolbarPropTypes.ButtonConfig, isBtn: boolean) {
414
414
  // 使用已安装的组件,如果未安装则不渲染
415
- const VxeUIButtonComponent = VxeUI.getComponent<VxeButtonComponent>('VxeButton')
415
+ const VxeUIButtonComponent = VxeUI.getComponent('VxeButton')
416
416
 
417
417
  const $xeToolbar = this
418
418
 
@@ -456,7 +456,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
456
456
  */
457
457
  renderLeftBtns (h: CreateElement): VxeComponentSlotType[] {
458
458
  // 使用已安装的组件,如果未安装则不渲染
459
- const VxeUIButtonComponent = VxeUI.getComponent<VxeButtonComponent>('VxeButton')
459
+ const VxeUIButtonComponent = VxeUI.getComponent('VxeButton')
460
460
 
461
461
  const $xeToolbar = this
462
462
  const props = $xeToolbar
@@ -534,7 +534,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
534
534
  */
535
535
  renderRightTools (h: CreateElement) {
536
536
  // 使用已安装的组件,如果未安装则不渲染
537
- const VxeUIButtonComponent = VxeUI.getComponent<VxeButtonComponent>('VxeButton')
537
+ const VxeUIButtonComponent = VxeUI.getComponent('VxeButton')
538
538
 
539
539
  const $xeToolbar = this
540
540
  const props = $xeToolbar
@@ -612,7 +612,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
612
612
  },
613
613
  renderToolImport (h: CreateElement) {
614
614
  // 使用已安装的组件,如果未安装则不渲染
615
- const VxeUIButtonComponent = VxeUI.getComponent<VxeButtonComponent>('VxeButton')
615
+ const VxeUIButtonComponent = VxeUI.getComponent('VxeButton')
616
616
 
617
617
  const $xeToolbar = this
618
618
 
@@ -633,7 +633,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
633
633
  },
634
634
  renderToolExport (h: CreateElement) {
635
635
  // 使用已安装的组件,如果未安装则不渲染
636
- const VxeUIButtonComponent = VxeUI.getComponent<VxeButtonComponent>('VxeButton')
636
+ const VxeUIButtonComponent = VxeUI.getComponent('VxeButton')
637
637
 
638
638
  const $xeToolbar = this
639
639
 
@@ -654,7 +654,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
654
654
  },
655
655
  renderToolPrint (h: CreateElement) {
656
656
  // 使用已安装的组件,如果未安装则不渲染
657
- const VxeUIButtonComponent = VxeUI.getComponent<VxeButtonComponent>('VxeButton')
657
+ const VxeUIButtonComponent = VxeUI.getComponent('VxeButton')
658
658
 
659
659
  const $xeToolbar = this
660
660
 
@@ -675,7 +675,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
675
675
  },
676
676
  renderToolRefresh (h: CreateElement) {
677
677
  // 使用已安装的组件,如果未安装则不渲染
678
- const VxeUIButtonComponent = VxeUI.getComponent<VxeButtonComponent>('VxeButton')
678
+ const VxeUIButtonComponent = VxeUI.getComponent('VxeButton')
679
679
 
680
680
  const $xeToolbar = this
681
681
  const reactData = $xeToolbar.reactData
@@ -697,7 +697,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
697
697
  },
698
698
  renderToolZoom (h: CreateElement) {
699
699
  // 使用已安装的组件,如果未安装则不渲染
700
- const VxeUIButtonComponent = VxeUI.getComponent<VxeButtonComponent>('VxeButton')
700
+ const VxeUIButtonComponent = VxeUI.getComponent('VxeButton')
701
701
 
702
702
  const $xeToolbar = this
703
703
  const $xeGrid = $xeToolbar.$xeGrid
@@ -719,7 +719,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
719
719
  },
720
720
  renderToolCustom (h: CreateElement) {
721
721
  // 使用已安装的组件,如果未安装则不渲染
722
- const VxeUIButtonComponent = VxeUI.getComponent<VxeButtonComponent>('VxeButton')
722
+ const VxeUIButtonComponent = VxeUI.getComponent('VxeButton')
723
723
 
724
724
  const $xeToolbar = this
725
725
 
@@ -844,7 +844,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
844
844
  })
845
845
 
846
846
  // 使用已安装的组件,如果未安装则不渲染
847
- const VxeUIButtonComponent = VxeUI.getComponent<VxeButtonComponent>('VxeButton')
847
+ const VxeUIButtonComponent = VxeUI.getComponent('VxeButton')
848
848
 
849
849
  if (props.refresh || props.import || props.export || props.print || props.zoom) {
850
850
  if (!VxeUIButtonComponent) {
@@ -260,7 +260,7 @@ VxeUI.setConfig({
260
260
  autoLoad: true,
261
261
  showLoading: true,
262
262
  showResponseMsg: true,
263
- showActiveMsg: true,
263
+ showActionMsg: true,
264
264
  response: {
265
265
  list: null,
266
266
  result: 'result',
@@ -2155,6 +2155,7 @@ $btnThemeList: (
2155
2155
  text-align: left;
2156
2156
  z-index: 4;
2157
2157
  padding: 0 var(--vxe-ui-table-cell-padding-default);
2158
+ pointer-events: none;
2158
2159
  }
2159
2160
  .vxe-cell--valid-error-wrapper {
2160
2161
  display: inline-block;