@conduction/nextcloud-vue 0.1.0-beta.1 → 0.1.0-beta.11

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 (208) hide show
  1. package/README.md +226 -0
  2. package/css/index.css +5 -0
  3. package/dist/nextcloud-vue.cjs.js +79416 -7715
  4. package/dist/nextcloud-vue.cjs.js.map +1 -1
  5. package/dist/nextcloud-vue.css +3583 -504
  6. package/dist/nextcloud-vue.esm.js +79343 -7692
  7. package/dist/nextcloud-vue.esm.js.map +1 -1
  8. package/l10n/en.json +164 -0
  9. package/l10n/nl.json +164 -0
  10. package/package.json +104 -63
  11. package/src/components/CnActionsBar/CnActionsBar.vue +254 -0
  12. package/src/components/CnActionsBar/index.js +1 -0
  13. package/src/components/CnAdvancedFormDialog/CnAdvancedFormDialog.vue +570 -0
  14. package/src/components/CnAdvancedFormDialog/CnDataTab.vue +217 -0
  15. package/src/components/CnAdvancedFormDialog/CnMetadataTab.vue +121 -0
  16. package/src/components/CnAdvancedFormDialog/CnPropertiesTab.vue +422 -0
  17. package/src/components/CnAdvancedFormDialog/CnPropertyValueCell.vue +247 -0
  18. package/src/components/CnAdvancedFormDialog/index.js +1 -0
  19. package/src/components/CnCard/CnCard.vue +415 -0
  20. package/src/components/CnCard/index.js +1 -0
  21. package/src/components/CnCardGrid/CnCardGrid.vue +156 -152
  22. package/src/components/CnCardGrid/index.js +1 -1
  23. package/src/components/CnCellRenderer/CnCellRenderer.vue +132 -132
  24. package/src/components/CnCellRenderer/index.js +1 -1
  25. package/src/components/CnChartWidget/CnChartWidget.vue +346 -0
  26. package/src/components/CnChartWidget/index.js +1 -0
  27. package/src/components/CnConfigurationCard/CnConfigurationCard.vue +77 -77
  28. package/src/components/CnConfigurationCard/index.js +1 -1
  29. package/src/components/CnContextMenu/CnContextMenu.vue +142 -0
  30. package/src/components/CnContextMenu/index.js +1 -0
  31. package/src/components/CnCopyDialog/CnCopyDialog.vue +266 -0
  32. package/src/components/CnCopyDialog/index.js +1 -0
  33. package/src/components/CnDashboardGrid/CnDashboardGrid.vue +229 -0
  34. package/src/components/CnDashboardGrid/index.js +1 -0
  35. package/src/components/CnDashboardPage/CnDashboardPage.vue +397 -0
  36. package/src/components/CnDashboardPage/index.js +1 -0
  37. package/src/components/CnDataTable/CnDataTable.vue +362 -354
  38. package/src/components/CnDataTable/index.js +1 -1
  39. package/src/components/CnDeleteDialog/CnDeleteDialog.vue +177 -0
  40. package/src/components/CnDeleteDialog/index.js +1 -0
  41. package/src/components/CnDetailCard/CnDetailCard.vue +225 -0
  42. package/src/components/CnDetailCard/index.js +1 -0
  43. package/src/components/CnDetailGrid/CnDetailGrid.vue +256 -0
  44. package/src/components/CnDetailGrid/index.js +1 -0
  45. package/src/components/CnDetailPage/CnDetailPage.vue +432 -0
  46. package/src/components/CnDetailPage/index.js +1 -0
  47. package/src/components/CnFacetSidebar/CnFacetSidebar.vue +234 -223
  48. package/src/components/CnFacetSidebar/index.js +1 -1
  49. package/src/components/CnFilterBar/CnFilterBar.vue +153 -152
  50. package/src/components/CnFilterBar/index.js +1 -1
  51. package/src/components/CnFormDialog/CnFormDialog.vue +1047 -0
  52. package/src/components/CnFormDialog/index.js +1 -0
  53. package/src/components/CnIcon/CnIcon.vue +89 -0
  54. package/src/components/CnIcon/index.js +1 -0
  55. package/src/components/CnIndexPage/CnIndexPage.vue +980 -682
  56. package/src/components/CnIndexPage/index.js +1 -1
  57. package/src/components/CnIndexSidebar/CnIndexSidebar.vue +536 -0
  58. package/src/components/CnIndexSidebar/index.js +1 -0
  59. package/src/components/CnInfoWidget/CnInfoWidget.vue +219 -0
  60. package/src/components/CnInfoWidget/index.js +1 -0
  61. package/src/components/CnItemCard/CnItemCard.vue +134 -0
  62. package/src/components/CnItemCard/index.js +1 -0
  63. package/src/components/CnJsonViewer/CnJsonViewer.vue +312 -0
  64. package/src/components/CnJsonViewer/index.js +1 -0
  65. package/src/components/CnKpiGrid/CnKpiGrid.vue +93 -89
  66. package/src/components/CnKpiGrid/index.js +1 -1
  67. package/src/components/CnMassActionBar/CnMassActionBar.vue +161 -160
  68. package/src/components/CnMassActionBar/index.js +1 -1
  69. package/src/components/CnMassCopyDialog/CnMassCopyDialog.vue +327 -320
  70. package/src/components/CnMassCopyDialog/index.js +1 -1
  71. package/src/components/CnMassDeleteDialog/CnMassDeleteDialog.vue +245 -238
  72. package/src/components/CnMassDeleteDialog/index.js +1 -1
  73. package/src/components/CnMassExportDialog/CnMassExportDialog.vue +191 -190
  74. package/src/components/CnMassExportDialog/index.js +1 -1
  75. package/src/components/CnMassImportDialog/CnMassImportDialog.vue +494 -491
  76. package/src/components/CnMassImportDialog/index.js +1 -1
  77. package/src/components/CnNoteCard/CnNoteCard.vue +149 -0
  78. package/src/components/CnNoteCard/index.js +1 -0
  79. package/src/components/CnNotesCard/CnNotesCard.vue +416 -0
  80. package/src/components/CnNotesCard/index.js +1 -0
  81. package/src/components/CnObjectCard/CnObjectCard.vue +294 -292
  82. package/src/components/CnObjectCard/index.js +1 -1
  83. package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +854 -0
  84. package/src/components/CnObjectDataWidget/index.js +1 -0
  85. package/src/components/CnObjectMetadataWidget/CnObjectMetadataWidget.vue +289 -0
  86. package/src/components/CnObjectMetadataWidget/index.js +1 -0
  87. package/src/components/CnObjectSidebar/CnAuditTrailTab.vue +369 -0
  88. package/src/components/CnObjectSidebar/CnFilesTab.vue +287 -0
  89. package/src/components/CnObjectSidebar/CnNotesTab.vue +250 -0
  90. package/src/components/CnObjectSidebar/CnObjectSidebar.vue +255 -0
  91. package/src/components/CnObjectSidebar/CnTagsTab.vue +259 -0
  92. package/src/components/CnObjectSidebar/CnTasksTab.vue +483 -0
  93. package/src/components/CnObjectSidebar/index.js +6 -0
  94. package/src/components/CnPageHeader/CnPageHeader.vue +61 -0
  95. package/src/components/CnPageHeader/index.js +1 -0
  96. package/src/components/CnPagination/CnPagination.vue +253 -252
  97. package/src/components/CnPagination/index.js +1 -1
  98. package/src/components/CnProgressBar/CnProgressBar.vue +262 -0
  99. package/src/components/CnProgressBar/index.js +1 -0
  100. package/src/components/CnRegisterMapping/CnRegisterMapping.vue +793 -0
  101. package/src/components/CnRegisterMapping/index.js +1 -0
  102. package/src/components/CnRowActions/CnRowActions.vue +95 -73
  103. package/src/components/CnRowActions/index.js +1 -1
  104. package/src/components/CnSchemaFormDialog/CnSchemaConfigurationTab.vue +226 -0
  105. package/src/components/CnSchemaFormDialog/CnSchemaFormDialog.vue +788 -0
  106. package/src/components/CnSchemaFormDialog/CnSchemaPropertiesTab.vue +305 -0
  107. package/src/components/CnSchemaFormDialog/CnSchemaPropertyActions.vue +1398 -0
  108. package/src/components/CnSchemaFormDialog/CnSchemaSecurityTab.vue +236 -0
  109. package/src/components/CnSchemaFormDialog/index.js +1 -0
  110. package/src/components/CnSettingsCard/CnSettingsCard.vue +92 -92
  111. package/src/components/CnSettingsCard/index.js +1 -1
  112. package/src/components/CnSettingsSection/CnSettingsSection.vue +267 -266
  113. package/src/components/CnSettingsSection/index.js +1 -1
  114. package/src/components/CnStatsBlock/CnStatsBlock.vue +437 -366
  115. package/src/components/CnStatsBlock/index.js +1 -1
  116. package/src/components/CnStatsPanel/CnStatsPanel.vue +321 -0
  117. package/src/components/CnStatsPanel/index.js +1 -0
  118. package/src/components/CnStatusBadge/CnStatusBadge.vue +90 -77
  119. package/src/components/CnStatusBadge/index.js +1 -1
  120. package/src/components/CnTabbedFormDialog/CnTabbedFormDialog.vue +545 -0
  121. package/src/components/CnTabbedFormDialog/index.js +1 -0
  122. package/src/components/CnTableWidget/CnTableWidget.vue +333 -0
  123. package/src/components/CnTableWidget/index.js +1 -0
  124. package/src/components/CnTasksCard/CnTasksCard.vue +374 -0
  125. package/src/components/CnTasksCard/index.js +1 -0
  126. package/src/components/CnTileWidget/CnTileWidget.vue +159 -0
  127. package/src/components/CnTileWidget/index.js +1 -0
  128. package/src/components/CnTimelineStages/CnTimelineStages.vue +294 -0
  129. package/src/components/CnTimelineStages/index.js +1 -0
  130. package/src/components/CnUserActionMenu/CnUserActionMenu.vue +436 -0
  131. package/src/components/CnUserActionMenu/index.js +1 -0
  132. package/src/components/CnVersionInfoCard/CnVersionInfoCard.vue +313 -312
  133. package/src/components/CnVersionInfoCard/index.js +1 -1
  134. package/src/components/CnWidgetRenderer/CnWidgetRenderer.vue +180 -0
  135. package/src/components/CnWidgetRenderer/index.js +1 -0
  136. package/src/components/CnWidgetWrapper/CnWidgetWrapper.vue +248 -0
  137. package/src/components/CnWidgetWrapper/index.js +1 -0
  138. package/src/components/index.js +57 -25
  139. package/src/composables/index.js +5 -3
  140. package/src/composables/useContextMenu.js +126 -0
  141. package/src/composables/useDashboardView.js +286 -0
  142. package/src/composables/useDetailView.js +290 -132
  143. package/src/composables/useListView.js +364 -153
  144. package/src/composables/useSubResource.js +142 -142
  145. package/src/constants/metadata.js +30 -0
  146. package/src/css/CnSchemaFormDialog.css +546 -0
  147. package/src/css/__sample_nextcloud_tokens.css +110 -0
  148. package/src/css/actions-bar.css +54 -0
  149. package/src/css/badge.css +83 -51
  150. package/src/css/card.css +129 -128
  151. package/src/css/context-menu.css +20 -0
  152. package/src/css/dashboard.css +70 -0
  153. package/src/css/detail-page.css +235 -0
  154. package/src/css/detail.css +68 -68
  155. package/src/css/index-page.css +44 -0
  156. package/src/css/index-sidebar.css +193 -0
  157. package/src/css/index.css +17 -8
  158. package/src/css/layout.css +90 -90
  159. package/src/css/page-header.css +35 -0
  160. package/src/css/pagination.css +72 -72
  161. package/src/css/table.css +142 -143
  162. package/src/css/timeline-stages.css +220 -0
  163. package/src/css/utilities.css +46 -46
  164. package/src/index.js +95 -50
  165. package/src/l10n/index.js +12 -0
  166. package/src/mixins/gridLayout.js +118 -0
  167. package/src/store/createCrudStore.d.ts +350 -0
  168. package/src/store/createCrudStore.js +413 -0
  169. package/src/store/createSubResourcePlugin.js +125 -135
  170. package/src/store/index.js +4 -3
  171. package/src/store/pluginMerge.js +55 -0
  172. package/src/store/plugins/auditTrails.js +357 -17
  173. package/src/store/plugins/files.js +250 -186
  174. package/src/store/plugins/index.js +8 -4
  175. package/src/store/plugins/lifecycle.js +180 -180
  176. package/src/store/plugins/logs.d.ts +22 -0
  177. package/src/store/plugins/logs.js +172 -0
  178. package/src/store/plugins/registerMapping.js +195 -0
  179. package/src/store/plugins/relations.js +68 -68
  180. package/src/store/plugins/search.js +385 -0
  181. package/src/store/plugins/selection.js +104 -0
  182. package/src/store/useObjectStore.js +793 -625
  183. package/src/types/auditTrail.d.ts +32 -32
  184. package/src/types/file.d.ts +23 -23
  185. package/src/types/index.d.ts +67 -35
  186. package/src/types/notification.d.ts +36 -36
  187. package/src/types/object.d.ts +40 -40
  188. package/src/types/organisation.d.ts +41 -41
  189. package/src/types/register.d.ts +25 -25
  190. package/src/types/schema.d.ts +39 -39
  191. package/src/types/shared.d.ts +79 -79
  192. package/src/types/source.d.ts +14 -14
  193. package/src/types/task.d.ts +31 -31
  194. package/src/utils/errors.js +96 -96
  195. package/src/utils/getTheme.js +9 -0
  196. package/src/utils/headers.js +80 -44
  197. package/src/utils/id.js +13 -0
  198. package/src/utils/index.js +4 -3
  199. package/src/utils/schema.js +423 -287
  200. package/src/utils/widgetVisibility.js +162 -0
  201. package/src/components/CnDetailViewLayout/CnDetailViewLayout.vue +0 -88
  202. package/src/components/CnDetailViewLayout/index.js +0 -1
  203. package/src/components/CnEmptyState/CnEmptyState.vue +0 -78
  204. package/src/components/CnEmptyState/index.js +0 -1
  205. package/src/components/CnListViewLayout/CnListViewLayout.vue +0 -80
  206. package/src/components/CnListViewLayout/index.js +0 -1
  207. package/src/components/CnViewModeToggle/CnViewModeToggle.vue +0 -77
  208. package/src/components/CnViewModeToggle/index.js +0 -1
@@ -1,252 +1,253 @@
1
- <template>
2
- <div v-if="totalPages > 1 || totalItems > minItemsToShow" class="cn-pagination">
3
- <!-- Page info -->
4
- <div class="cn-pagination__info">
5
- <span class="cn-pagination__page-info">
6
- {{ pageInfoText }}
7
- </span>
8
- </div>
9
-
10
- <!-- Page navigation -->
11
- <div v-if="totalPages > 1" class="cn-pagination__nav">
12
- <NcButton
13
- :disabled="currentPage === 1"
14
- @click="changePage(1)">
15
- {{ firstLabel }}
16
- </NcButton>
17
-
18
- <NcButton
19
- :disabled="currentPage === 1"
20
- @click="changePage(currentPage - 1)">
21
- {{ previousLabel }}
22
- </NcButton>
23
-
24
- <div class="cn-pagination__numbers">
25
- <template v-for="page in visiblePages">
26
- <span v-if="page === '...'" :key="'ellipsis-' + page" class="cn-pagination__ellipsis">...</span>
27
- <NcButton
28
- v-else
29
- :key="page"
30
- :type="page === currentPage ? 'primary' : 'secondary'"
31
- :disabled="page === currentPage"
32
- @click="changePage(page)">
33
- {{ page }}
34
- </NcButton>
35
- </template>
36
- </div>
37
-
38
- <NcButton
39
- :disabled="currentPage === totalPages"
40
- @click="changePage(currentPage + 1)">
41
- {{ nextLabel }}
42
- </NcButton>
43
-
44
- <NcButton
45
- :disabled="currentPage === totalPages"
46
- @click="changePage(totalPages)">
47
- {{ lastLabel }}
48
- </NcButton>
49
- </div>
50
-
51
- <!-- Page size selector -->
52
- <div class="cn-pagination__page-size">
53
- <label :for="pageSizeId">{{ itemsPerPageLabel }}</label>
54
- <NcSelect
55
- :input-id="pageSizeId"
56
- class="cn-pagination__page-size-select"
57
- :value="currentPageSizeOption"
58
- :options="pageSizeOptions"
59
- :clearable="false"
60
- :input-label="itemsPerPageLabel"
61
- @option:selected="changePageSize" />
62
- </div>
63
- </div>
64
- </template>
65
-
66
- <script>
67
- import { NcButton, NcSelect } from '@nextcloud/vue'
68
-
69
- /**
70
- * CnPagination — Full pagination with page numbers, navigation, and page size selector.
71
- *
72
- * Extracted from OpenRegister's PaginationComponent. Zero store dependencies.
73
- * Supports First/Previous/Next/Last buttons, smart page number display with
74
- * ellipsis, and configurable page size.
75
- *
76
- * NL Design tokens used:
77
- * - Inherits from cn-pagination CSS class (see css/pagination.css)
78
- *
79
- * @example
80
- * <CnPagination
81
- * :current-page="page"
82
- * :total-pages="totalPages"
83
- * :total-items="totalItems"
84
- * :current-page-size="limit"
85
- * @page-changed="onPageChange"
86
- * @page-size-changed="onPageSizeChange" />
87
- */
88
- export default {
89
- name: 'CnPagination',
90
-
91
- components: {
92
- NcButton,
93
- NcSelect,
94
- },
95
-
96
- props: {
97
- /** Current page number (1-based) */
98
- currentPage: {
99
- type: Number,
100
- default: 1,
101
- },
102
- /** Total number of pages */
103
- totalPages: {
104
- type: Number,
105
- default: 1,
106
- },
107
- /** Total number of items across all pages */
108
- totalItems: {
109
- type: Number,
110
- default: 0,
111
- },
112
- /** Current items per page */
113
- currentPageSize: {
114
- type: Number,
115
- default: 20,
116
- },
117
- /** Available page size options */
118
- pageSizeOptions: {
119
- type: Array,
120
- default: () => [
121
- { value: 10, label: '10' },
122
- { value: 20, label: '20' },
123
- { value: 50, label: '50' },
124
- { value: 100, label: '100' },
125
- { value: 250, label: '250' },
126
- { value: 500, label: '500' },
127
- { value: 1000, label: '1000' },
128
- ],
129
- },
130
- /** Minimum items before pagination is shown */
131
- minItemsToShow: {
132
- type: Number,
133
- default: 10,
134
- },
135
- /** Label for "First" button */
136
- firstLabel: {
137
- type: String,
138
- default: 'First',
139
- },
140
- /** Label for "Previous" button */
141
- previousLabel: {
142
- type: String,
143
- default: 'Previous',
144
- },
145
- /** Label for "Next" button */
146
- nextLabel: {
147
- type: String,
148
- default: 'Next',
149
- },
150
- /** Label for "Last" button */
151
- lastLabel: {
152
- type: String,
153
- default: 'Last',
154
- },
155
- /** Label for "Items per page:" */
156
- itemsPerPageLabel: {
157
- type: String,
158
- default: 'Items per page:',
159
- },
160
- /**
161
- * Page info format string. Use {current} and {total} as placeholders.
162
- * @example "Page {current} of {total}"
163
- */
164
- pageInfoFormat: {
165
- type: String,
166
- default: 'Page {current} of {total}',
167
- },
168
- },
169
-
170
- computed: {
171
- pageSizeId() {
172
- return 'cn-page-size-' + this._uid
173
- },
174
-
175
- currentPageSizeOption() {
176
- return this.pageSizeOptions.find(
177
- (option) => option.value === this.currentPageSize,
178
- ) || this.pageSizeOptions[1]
179
- },
180
-
181
- pageInfoText() {
182
- return this.pageInfoFormat
183
- .replace('{current}', this.currentPage)
184
- .replace('{total}', this.totalPages)
185
- },
186
-
187
- /**
188
- * Calculate visible page numbers with ellipsis for large page counts.
189
- * Shows up to 7 page numbers at a time.
190
- */
191
- visiblePages() {
192
- const current = this.currentPage
193
- const total = this.totalPages
194
- const pages = []
195
-
196
- if (total <= 7) {
197
- for (let i = 1; i <= total; i++) {
198
- pages.push(i)
199
- }
200
- } else {
201
- pages.push(1)
202
-
203
- if (current <= 4) {
204
- for (let i = 2; i <= 5; i++) {
205
- pages.push(i)
206
- }
207
- pages.push('...')
208
- pages.push(total)
209
- } else if (current >= total - 3) {
210
- pages.push('...')
211
- for (let i = total - 4; i <= total; i++) {
212
- pages.push(i)
213
- }
214
- } else {
215
- pages.push('...')
216
- for (let i = current - 1; i <= current + 1; i++) {
217
- pages.push(i)
218
- }
219
- pages.push('...')
220
- pages.push(total)
221
- }
222
- }
223
-
224
- return pages
225
- },
226
- },
227
-
228
- methods: {
229
- /**
230
- * Navigate to a specific page.
231
- * @param {number} page Target page number
232
- */
233
- changePage(page) {
234
- if (page !== this.currentPage && page >= 1 && page <= this.totalPages) {
235
- /** @event page-changed Emitted when page changes. Payload: new page number. */
236
- this.$emit('page-changed', page)
237
- }
238
- },
239
-
240
- /**
241
- * Change the page size.
242
- * @param {object} option Selected page size option { value, label }
243
- */
244
- changePageSize(option) {
245
- if (option.value !== this.currentPageSize) {
246
- /** @event page-size-changed Emitted when page size changes. Payload: new page size. */
247
- this.$emit('page-size-changed', option.value)
248
- }
249
- },
250
- },
251
- }
252
- </script>
1
+ <template>
2
+ <div v-if="totalPages > 1 || totalItems > minItemsToShow" class="cn-pagination">
3
+ <!-- Page info -->
4
+ <div class="cn-pagination__info">
5
+ <span class="cn-pagination__page-info">
6
+ {{ pageInfoText }}
7
+ </span>
8
+ </div>
9
+
10
+ <!-- Page navigation -->
11
+ <div v-if="totalPages > 1" class="cn-pagination__nav">
12
+ <NcButton
13
+ :disabled="currentPage === 1"
14
+ @click="changePage(1)">
15
+ {{ firstLabel }}
16
+ </NcButton>
17
+
18
+ <NcButton
19
+ :disabled="currentPage === 1"
20
+ @click="changePage(currentPage - 1)">
21
+ {{ previousLabel }}
22
+ </NcButton>
23
+
24
+ <div class="cn-pagination__numbers">
25
+ <template v-for="page in visiblePages">
26
+ <span v-if="page === '...'" :key="'ellipsis-' + page" class="cn-pagination__ellipsis">...</span>
27
+ <NcButton
28
+ v-else
29
+ :key="page"
30
+ :type="page === currentPage ? 'primary' : 'secondary'"
31
+ :disabled="page === currentPage"
32
+ @click="changePage(page)">
33
+ {{ page }}
34
+ </NcButton>
35
+ </template>
36
+ </div>
37
+
38
+ <NcButton
39
+ :disabled="currentPage === totalPages"
40
+ @click="changePage(currentPage + 1)">
41
+ {{ nextLabel }}
42
+ </NcButton>
43
+
44
+ <NcButton
45
+ :disabled="currentPage === totalPages"
46
+ @click="changePage(totalPages)">
47
+ {{ lastLabel }}
48
+ </NcButton>
49
+ </div>
50
+
51
+ <!-- Page size selector -->
52
+ <div class="cn-pagination__page-size">
53
+ <label :for="pageSizeId">{{ itemsPerPageLabel }}</label>
54
+ <NcSelect
55
+ :input-id="pageSizeId"
56
+ class="cn-pagination__page-size-select"
57
+ :value="currentPageSizeOption"
58
+ :options="pageSizeOptions"
59
+ :clearable="false"
60
+ :input-label="itemsPerPageLabel"
61
+ @option:selected="changePageSize" />
62
+ </div>
63
+ </div>
64
+ </template>
65
+
66
+ <script>
67
+ import { translate as t } from '@nextcloud/l10n'
68
+ import { NcButton, NcSelect } from '@nextcloud/vue'
69
+
70
+ /**
71
+ * CnPagination — Full pagination with page numbers, navigation, and page size selector.
72
+ *
73
+ * Extracted from OpenRegister's PaginationComponent. Zero store dependencies.
74
+ * Supports First/Previous/Next/Last buttons, smart page number display with
75
+ * ellipsis, and configurable page size.
76
+ *
77
+ * NL Design tokens used:
78
+ * - Inherits from cn-pagination CSS class (see css/pagination.css)
79
+ *
80
+ * @example
81
+ * <CnPagination
82
+ * :current-page="page"
83
+ * :total-pages="totalPages"
84
+ * :total-items="totalItems"
85
+ * :current-page-size="limit"
86
+ * @page-changed="onPageChange"
87
+ * @page-size-changed="onPageSizeChange" />
88
+ */
89
+ export default {
90
+ name: 'CnPagination',
91
+
92
+ components: {
93
+ NcButton,
94
+ NcSelect,
95
+ },
96
+
97
+ props: {
98
+ /** Current page number (1-based) */
99
+ currentPage: {
100
+ type: Number,
101
+ default: 1,
102
+ },
103
+ /** Total number of pages */
104
+ totalPages: {
105
+ type: Number,
106
+ default: 1,
107
+ },
108
+ /** Total number of items across all pages */
109
+ totalItems: {
110
+ type: Number,
111
+ default: 0,
112
+ },
113
+ /** Current items per page */
114
+ currentPageSize: {
115
+ type: Number,
116
+ default: 20,
117
+ },
118
+ /** Available page size options */
119
+ pageSizeOptions: {
120
+ type: Array,
121
+ default: () => [
122
+ { value: 10, label: '10' },
123
+ { value: 20, label: '20' },
124
+ { value: 50, label: '50' },
125
+ { value: 100, label: '100' },
126
+ { value: 250, label: '250' },
127
+ { value: 500, label: '500' },
128
+ { value: 1000, label: '1000' },
129
+ ],
130
+ },
131
+ /** Minimum items before pagination is shown */
132
+ minItemsToShow: {
133
+ type: Number,
134
+ default: 10,
135
+ },
136
+ /** Label for "First" button */
137
+ firstLabel: {
138
+ type: String,
139
+ default: () => t('nextcloud-vue', 'First'),
140
+ },
141
+ /** Label for "Previous" button */
142
+ previousLabel: {
143
+ type: String,
144
+ default: () => t('nextcloud-vue', 'Previous'),
145
+ },
146
+ /** Label for "Next" button */
147
+ nextLabel: {
148
+ type: String,
149
+ default: () => t('nextcloud-vue', 'Next'),
150
+ },
151
+ /** Label for "Last" button */
152
+ lastLabel: {
153
+ type: String,
154
+ default: () => t('nextcloud-vue', 'Last'),
155
+ },
156
+ /** Label for "Items per page:" */
157
+ itemsPerPageLabel: {
158
+ type: String,
159
+ default: () => t('nextcloud-vue', 'Items per page:'),
160
+ },
161
+ /**
162
+ * Page info format string. Use {current} and {total} as placeholders.
163
+ * @example "Page {current} of {total}"
164
+ */
165
+ pageInfoFormat: {
166
+ type: String,
167
+ default: () => t('nextcloud-vue', 'Page {current} of {total}'),
168
+ },
169
+ },
170
+
171
+ computed: {
172
+ pageSizeId() {
173
+ return 'cn-page-size-' + this._uid
174
+ },
175
+
176
+ currentPageSizeOption() {
177
+ return this.pageSizeOptions.find(
178
+ (option) => option.value === this.currentPageSize,
179
+ ) || this.pageSizeOptions[1]
180
+ },
181
+
182
+ pageInfoText() {
183
+ return this.pageInfoFormat
184
+ .replace('{current}', this.currentPage)
185
+ .replace('{total}', this.totalPages)
186
+ },
187
+
188
+ /**
189
+ * Calculate visible page numbers with ellipsis for large page counts.
190
+ * Shows up to 7 page numbers at a time.
191
+ */
192
+ visiblePages() {
193
+ const current = this.currentPage
194
+ const total = this.totalPages
195
+ const pages = []
196
+
197
+ if (total <= 7) {
198
+ for (let i = 1; i <= total; i++) {
199
+ pages.push(i)
200
+ }
201
+ } else {
202
+ pages.push(1)
203
+
204
+ if (current <= 4) {
205
+ for (let i = 2; i <= 5; i++) {
206
+ pages.push(i)
207
+ }
208
+ pages.push('...')
209
+ pages.push(total)
210
+ } else if (current >= total - 3) {
211
+ pages.push('...')
212
+ for (let i = total - 4; i <= total; i++) {
213
+ pages.push(i)
214
+ }
215
+ } else {
216
+ pages.push('...')
217
+ for (let i = current - 1; i <= current + 1; i++) {
218
+ pages.push(i)
219
+ }
220
+ pages.push('...')
221
+ pages.push(total)
222
+ }
223
+ }
224
+
225
+ return pages
226
+ },
227
+ },
228
+
229
+ methods: {
230
+ /**
231
+ * Navigate to a specific page.
232
+ * @param {number} page Target page number
233
+ */
234
+ changePage(page) {
235
+ if (page !== this.currentPage && page >= 1 && page <= this.totalPages) {
236
+ /** @event page-changed Emitted when page changes. Payload: new page number. */
237
+ this.$emit('page-changed', page)
238
+ }
239
+ },
240
+
241
+ /**
242
+ * Change the page size.
243
+ * @param {object} option Selected page size option { value, label }
244
+ */
245
+ changePageSize(option) {
246
+ if (option.value !== this.currentPageSize) {
247
+ /** @event page-size-changed Emitted when page size changes. Payload: new page size. */
248
+ this.$emit('page-size-changed', option.value)
249
+ }
250
+ },
251
+ },
252
+ }
253
+ </script>
@@ -1 +1 @@
1
- export { default as CnPagination } from './CnPagination.vue'
1
+ export { default as CnPagination } from './CnPagination.vue'