@svgrid/grid 2.2.25 → 2.2.27
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.
- package/README.md +199 -145
- package/dist/FlexRender.svelte +96 -96
- package/dist/GridFooter.svelte +179 -179
- package/dist/GridMenus.svelte +734 -728
- package/dist/SvAutoComplete.svelte +165 -165
- package/dist/SvCalendar.svelte +503 -503
- package/dist/SvCarousel.svelte +141 -141
- package/dist/SvCheckBox.svelte +101 -101
- package/dist/SvColorInput.svelte +181 -181
- package/dist/SvComboBox.svelte +275 -275
- package/dist/SvContextMenu.svelte +116 -116
- package/dist/SvCountryInput.svelte +160 -160
- package/dist/SvDrawer.svelte +250 -250
- package/dist/SvDropDownList.svelte +374 -374
- package/dist/SvDurationInput.svelte +126 -126
- package/dist/SvField.svelte +293 -293
- package/dist/SvForm.svelte +437 -437
- package/dist/SvGrid.css +2723 -2719
- package/dist/SvGrid.svelte +3333 -3333
- package/dist/SvGridChart.svelte +1724 -1724
- package/dist/SvGridChartPanel.svelte +485 -485
- package/dist/SvGridChartView.svelte +70 -70
- package/dist/SvGridDropdown.svelte +696 -696
- package/dist/SvGridSelect.svelte +259 -259
- package/dist/SvGroupCell.svelte +109 -109
- package/dist/SvListBox.svelte +287 -287
- package/dist/SvMaskedInput.svelte +122 -122
- package/dist/SvMenu.svelte +124 -124
- package/dist/SvMenuList.svelte +146 -146
- package/dist/SvMultiSelect.svelte +281 -281
- package/dist/SvNumberInput.svelte +168 -168
- package/dist/SvOtpInput.svelte +158 -158
- package/dist/SvPasswordInput.svelte +151 -151
- package/dist/SvPhoneInput.svelte +131 -131
- package/dist/SvPopover.svelte +197 -197
- package/dist/SvRadioGroup.svelte +107 -107
- package/dist/SvRowGroupPanel.svelte +170 -170
- package/dist/SvScrollArea.svelte +61 -61
- package/dist/SvSlider.svelte +200 -200
- package/dist/SvSwitchButton.svelte +107 -107
- package/dist/SvTagsInput.svelte +112 -112
- package/dist/SvTextInput.svelte +147 -147
- package/dist/SvTimePicker.svelte +245 -245
- package/dist/SvToaster.svelte +159 -159
- package/dist/SvToggleButton.svelte +85 -85
- package/dist/SvTooltip.svelte +161 -161
- package/dist/SvTour.svelte +204 -204
- package/dist/SvTree.svelte +437 -437
- package/dist/SvTreeSelect.svelte +233 -233
- package/dist/a11y/dismissable.d.ts +11 -0
- package/dist/a11y/dismissable.js +21 -0
- package/dist/ai.js +3 -3
- package/dist/cdn/GridMenus-BzxEYNtW.js +421 -0
- package/dist/cdn/GridMenus-Dr-nGEXn.js +417 -0
- package/dist/cdn/{SvDateTimePicker-CYC7gRER.js → SvDateTimePicker-B1sDc9Pz.js} +451 -444
- package/dist/cdn/{SvDateTimePicker-DtQKd4Ns.js → SvDateTimePicker-Bh0FTs1E.js} +114 -107
- package/dist/cdn/{SvGridChart-BhnFdLd0.js → SvGridChart-BKQsO5fZ.js} +1 -1
- package/dist/cdn/{SvGridChart-BcLCYvw9.js → SvGridChart-Bgk4hDs8.js} +1 -1
- package/dist/cdn/{SvGridChartPanel-DvjwxLvK.js → SvGridChartPanel-DSkHIQDd.js} +1 -1
- package/dist/cdn/{SvGridChartPanel-Cmx9DHAS.js → SvGridChartPanel-DkCc2Z7b.js} +1 -1
- package/dist/cdn/{SvGridChartView-B40DTJSX.js → SvGridChartView-BrbVaELm.js} +1 -1
- package/dist/cdn/{SvGridChartView-PwqI4s02.js → SvGridChartView-i9rWvSKg.js} +1 -1
- package/dist/cdn/{SvGridDropdown-hpnHvOGt.js → SvGridDropdown-CGxxopQ4.js} +1 -1
- package/dist/cdn/{SvGridDropdown-DjALc_4f.js → SvGridDropdown-D08sVmAy.js} +1 -1
- package/dist/cdn/{src-DysW9qbk.js → src-Cw8d9U8j.js} +5753 -5753
- package/dist/cdn/{src-bYfr_7aR.js → src-cgs1wcUS.js} +8102 -8102
- package/dist/cdn/svgrid.js +9 -9
- package/dist/cdn/svgrid.svelte-external.js +9 -9
- package/dist/chart-export.js +8 -8
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/package.json +30 -13
- package/src/FlexRender.svelte +96 -96
- package/src/GridFooter.svelte +179 -179
- package/src/GridMenus.svelte +734 -728
- package/src/SvAutoComplete.svelte +165 -165
- package/src/SvCalendar.svelte +503 -503
- package/src/SvCalendar.test.ts +226 -226
- package/src/SvCarousel.svelte +141 -141
- package/src/SvCheckBox.svelte +101 -101
- package/src/SvColorInput.svelte +181 -181
- package/src/SvComboBox.svelte +275 -275
- package/src/SvContextMenu.svelte +116 -116
- package/src/SvCountryInput.svelte +160 -160
- package/src/SvDrawer.svelte +250 -250
- package/src/SvDropDownList.svelte +374 -374
- package/src/SvDurationInput.svelte +126 -126
- package/src/SvField.svelte +293 -293
- package/src/SvForm.svelte +437 -437
- package/src/SvForm.test.ts +411 -411
- package/src/SvGrid.controller.svelte.ts +3239 -3239
- package/src/SvGrid.css +2723 -2719
- package/src/SvGrid.svelte +3333 -3333
- package/src/SvGrid.types.ts +1613 -1613
- package/src/SvGridChart.svelte +1724 -1724
- package/src/SvGridChartPanel.svelte +485 -485
- package/src/SvGridChartView.svelte +70 -70
- package/src/SvGridDropdown.svelte +696 -696
- package/src/SvGridSelect.svelte +259 -259
- package/src/SvGroupCell.svelte +109 -109
- package/src/SvListBox.svelte +287 -287
- package/src/SvMaskedInput.svelte +122 -122
- package/src/SvMenu.svelte +124 -124
- package/src/SvMenu.test.ts +97 -97
- package/src/SvMenuList.svelte +146 -146
- package/src/SvMultiSelect.svelte +281 -281
- package/src/SvNumberInput.svelte +168 -168
- package/src/SvOtpInput.svelte +158 -158
- package/src/SvPasswordInput.svelte +151 -151
- package/src/SvPhoneInput.svelte +131 -131
- package/src/SvPopover.svelte +197 -197
- package/src/SvRadioGroup.svelte +107 -107
- package/src/SvRowGroupPanel.svelte +170 -170
- package/src/SvScrollArea.svelte +61 -61
- package/src/SvSlider.svelte +200 -200
- package/src/SvSwitchButton.svelte +107 -107
- package/src/SvTagsInput.svelte +112 -112
- package/src/SvTextInput.svelte +147 -147
- package/src/SvTimePicker.svelte +245 -245
- package/src/SvToaster.svelte +159 -159
- package/src/SvToaster.test.ts +95 -95
- package/src/SvToggleButton.svelte +85 -85
- package/src/SvTooltip.svelte +161 -161
- package/src/SvTour.svelte +204 -204
- package/src/SvTree.svelte +437 -437
- package/src/SvTreeSelect.svelte +233 -233
- package/src/a11y/dismissable.test.ts +119 -95
- package/src/a11y/dismissable.ts +114 -94
- package/src/a11y.contract.test.ts +49 -49
- package/src/a11y.test.ts +59 -59
- package/src/a11y.ts +61 -61
- package/src/ai.test.ts +502 -502
- package/src/ai.ts +1391 -1391
- package/src/build-api.coverage.test.ts +633 -633
- package/src/build-api.ts +895 -895
- package/src/builtin-editors.grid.test.ts +85 -85
- package/src/cell-formatting.ts +169 -169
- package/src/cell-render.ts +469 -469
- package/src/chart-export.ts +201 -201
- package/src/chart-view.svelte.ts +36 -36
- package/src/chart.ts +2296 -2296
- package/src/collaboration.test.ts +104 -104
- package/src/collaboration.ts +167 -167
- package/src/core.performance.test.ts +30 -30
- package/src/core.ts +1111 -1111
- package/src/createAutocomplete.svelte.ts +132 -132
- package/src/createCombobox.svelte.ts +191 -191
- package/src/createCountryInput.svelte.ts +157 -157
- package/src/createDropdownList.svelte.ts +168 -168
- package/src/createForm.svelte.ts +386 -386
- package/src/createGrid.svelte.ts +42 -42
- package/src/createGrid.test.ts +10 -10
- package/src/createGridState.svelte.ts +17 -17
- package/src/createMenu.svelte.ts +225 -225
- package/src/createPopoverSelect.svelte.ts +213 -213
- package/src/createSlider.svelte.ts +191 -191
- package/src/createTooltip.svelte.ts +144 -144
- package/src/createTree.svelte.ts +319 -319
- package/src/editing.test.ts +859 -859
- package/src/editing.ts +675 -675
- package/src/editor-contract.ts +157 -157
- package/src/export-data-api.test.ts +126 -126
- package/src/export-format.test.ts +107 -107
- package/src/export-format.ts +598 -598
- package/src/filter-operators.ts +157 -157
- package/src/flex-render.ts +3 -3
- package/src/form-field.ts +127 -127
- package/src/index.ts +713 -712
- package/src/js-scroller.svelte.ts +173 -173
- package/src/keyboard.test.ts +59 -59
- package/src/keyboard.ts +97 -97
- package/src/list-nav.test.ts +49 -49
- package/src/list-nav.ts +29 -29
- package/src/list-option.test.ts +56 -56
- package/src/list-option.ts +172 -172
- package/src/menus.test.ts +700 -700
- package/src/menus.ts +652 -652
- package/src/merge-objects.ts +48 -48
- package/src/overlays.test.ts +90 -90
- package/src/render-component.ts +28 -28
- package/src/scheduler-model.test.ts +562 -562
- package/src/scheduler-model.ts +872 -872
- package/src/selection.test.ts +754 -754
- package/src/selection.ts +600 -600
- package/src/server-data-source.test.ts +289 -289
- package/src/server-data-source.ts +413 -413
- package/src/sparkline.test.ts +68 -68
- package/src/sparkline.ts +169 -169
- package/src/spreadsheet.test.ts +489 -489
- package/src/spreadsheet.ts +312 -312
- package/src/static-functions.ts +11 -11
- package/src/subscribe.ts +38 -38
- package/src/svgrid-wrapper.types.ts +524 -524
- package/src/svgrid.behavior.test.ts +706 -706
- package/src/svgrid.charting.test.ts +534 -534
- package/src/svgrid.features.test.ts +157 -157
- package/src/svgrid.filter-menu-scroll.test.ts +102 -0
- package/src/svgrid.new-features.wrapper.test.ts +251 -251
- package/src/svgrid.wrapper.test.ts +40 -40
- package/src/test-setup.ts +62 -62
- package/src/themes/index.ts +215 -215
- package/src/toast-store.svelte.ts +246 -246
- package/src/toast-store.test.ts +147 -147
- package/src/ui-buttons.test.ts +144 -144
- package/src/ui-inputs.test.ts +118 -118
- package/src/ui-range.test.ts +70 -70
- package/src/ui-selection.test.ts +155 -155
- package/src/ui-tier1.test.ts +142 -142
- package/src/virtual.test.ts +88 -88
- package/src/virtualization/column-virtualizer.test.ts +27 -27
- package/src/virtualization/column-virtualizer.ts +30 -30
- package/src/virtualization/svelte-virtualizer.svelte.ts +26 -26
- package/src/virtualization/types.ts +30 -30
- package/src/virtualization/virtualizer.test.ts +47 -47
- package/src/virtualization/virtualizer.ts +296 -296
- package/themes/ember.css +71 -71
- package/dist/cdn/GridMenus-GfCAHgkZ.js +0 -420
- package/dist/cdn/GridMenus-GiVNSeDU.js +0 -416
package/dist/GridFooter.svelte
CHANGED
|
@@ -1,179 +1,179 @@
|
|
|
1
|
-
<script lang="ts" generics="TFeatures extends TableFeatures = TableFeatures, TData extends RowData = RowData">
|
|
2
|
-
import {
|
|
3
|
-
getGridCellA11yProps,
|
|
4
|
-
getGridCellDomId,
|
|
5
|
-
getGridHeaderA11yProps,
|
|
6
|
-
getGridRootA11yProps,
|
|
7
|
-
getGridRowA11yProps,
|
|
8
|
-
type EditorContext,
|
|
9
|
-
type CellEditorOption,
|
|
10
|
-
type Column,
|
|
11
|
-
type Row,
|
|
12
|
-
type RowData,
|
|
13
|
-
type TableFeatures,
|
|
14
|
-
} from "./index";
|
|
15
|
-
import "./sv-grid-scrollbar";
|
|
16
|
-
import type { Snippet } from "svelte";
|
|
17
|
-
import {
|
|
18
|
-
RenderSnippetConfig,
|
|
19
|
-
RenderComponentConfig,
|
|
20
|
-
} from "./render-component";
|
|
21
|
-
import {
|
|
22
|
-
buildSparkline,
|
|
23
|
-
toSparklineValues,
|
|
24
|
-
} from "./sparkline";
|
|
25
|
-
import SvGridDropdown from "./SvGridDropdown.svelte";
|
|
26
|
-
import type {
|
|
27
|
-
Props,
|
|
28
|
-
SelectionPoint,
|
|
29
|
-
SelectionRange,
|
|
30
|
-
CellEditState,
|
|
31
|
-
FilterOperator,
|
|
32
|
-
FilterOption,
|
|
33
|
-
MenuPosition,
|
|
34
|
-
} from "./SvGrid.types";
|
|
35
|
-
import {
|
|
36
|
-
cfTextStyle,
|
|
37
|
-
fmtStat,
|
|
38
|
-
getEditableInputValue,
|
|
39
|
-
getEditorInputType,
|
|
40
|
-
toValueArray,
|
|
41
|
-
getOptionLabel,
|
|
42
|
-
getOptionColor,
|
|
43
|
-
colorfulChipStyle,
|
|
44
|
-
getEditorClass,
|
|
45
|
-
} from "./SvGrid.helpers";
|
|
46
|
-
import {
|
|
47
|
-
} from "./SvGrid.controller.svelte";
|
|
48
|
-
import type { SvGridController } from "./SvGrid.controller.svelte";
|
|
49
|
-
|
|
50
|
-
let {
|
|
51
|
-
ctrl,
|
|
52
|
-
pager = true,
|
|
53
|
-
showStatus = true,
|
|
54
|
-
top = false,
|
|
55
|
-
pageSizeOptions,
|
|
56
|
-
}: {
|
|
57
|
-
ctrl: SvGridController<TFeatures, TData>;
|
|
58
|
-
/** Render the pagination controls in this instance. */
|
|
59
|
-
pager?: boolean;
|
|
60
|
-
/** Render the status bar in this instance. */
|
|
61
|
-
showStatus?: boolean;
|
|
62
|
-
/** This is a top-positioned footer (styling only). */
|
|
63
|
-
top?: boolean;
|
|
64
|
-
/** Page-size choices for the selector. Defaults to `[10, 25, 50, 100]`. */
|
|
65
|
-
pageSizeOptions?: number[];
|
|
66
|
-
} = $props();
|
|
67
|
-
|
|
68
|
-
// View facade: re-bind the controller's reactive members so the markup
|
|
69
|
-
// (moved verbatim from SvGrid.svelte) stays identical.
|
|
70
|
-
const paginationEnabled = $derived(ctrl.paginationEnabled);
|
|
71
|
-
const grid = $derived(ctrl.grid);
|
|
72
|
-
const paginationState = $derived(ctrl.paginationState);
|
|
73
|
-
const allRowsBeforePagination = $derived(ctrl.allRowsBeforePagination);
|
|
74
|
-
const statusBarEnabled = $derived(ctrl.statusBarEnabled);
|
|
75
|
-
const statusBarAggregates = $derived(ctrl.statusBarAggregates);
|
|
76
|
-
const statusBarStats = $derived(ctrl.statusBarStats);
|
|
77
|
-
const changePage = $derived(ctrl.changePage);
|
|
78
|
-
const goToPage = $derived(ctrl.goToPage);
|
|
79
|
-
const setPageSize = $derived(ctrl.setPageSize);
|
|
80
|
-
const messages = $derived(ctrl.messages);
|
|
81
|
-
</script>
|
|
82
|
-
|
|
83
|
-
{#if showStatus && statusBarEnabled && statusBarStats}
|
|
84
|
-
{@const s = statusBarStats}
|
|
85
|
-
<div class="sv-grid-status-bar" role="status" aria-live="polite">
|
|
86
|
-
{#each statusBarAggregates as agg (agg)}
|
|
87
|
-
{#if agg === "count"}
|
|
88
|
-
<span class="sv-grid-status-item"
|
|
89
|
-
><span class="sv-grid-status-label">{messages.statCount}</span>{fmtStat(s.count)}</span
|
|
90
|
-
>
|
|
91
|
-
{:else if agg === "numericCount"}
|
|
92
|
-
<span class="sv-grid-status-item"
|
|
93
|
-
><span class="sv-grid-status-label">Numeric</span>{fmtStat(s.numericCount)}</span
|
|
94
|
-
>
|
|
95
|
-
{:else if s.numericCount > 0 && agg === "sum"}
|
|
96
|
-
<span class="sv-grid-status-item"
|
|
97
|
-
><span class="sv-grid-status-label">{messages.statSum}</span>{fmtStat(s.sum)}</span
|
|
98
|
-
>
|
|
99
|
-
{:else if s.numericCount > 0 && agg === "avg"}
|
|
100
|
-
<span class="sv-grid-status-item"
|
|
101
|
-
><span class="sv-grid-status-label">{messages.statAvg}</span>{fmtStat(s.avg)}</span
|
|
102
|
-
>
|
|
103
|
-
{:else if s.numericCount > 0 && agg === "min"}
|
|
104
|
-
<span class="sv-grid-status-item"
|
|
105
|
-
><span class="sv-grid-status-label">{messages.statMin}</span>{fmtStat(s.min)}</span
|
|
106
|
-
>
|
|
107
|
-
{:else if s.numericCount > 0 && agg === "max"}
|
|
108
|
-
<span class="sv-grid-status-item"
|
|
109
|
-
><span class="sv-grid-status-label">{messages.statMax}</span>{fmtStat(s.max)}</span
|
|
110
|
-
>
|
|
111
|
-
{/if}
|
|
112
|
-
{/each}
|
|
113
|
-
</div>
|
|
114
|
-
{/if}
|
|
115
|
-
|
|
116
|
-
{#if pager && paginationEnabled}
|
|
117
|
-
{@const totalRows = ctrl.paginationTotalRows}
|
|
118
|
-
{@const pageSize = ctrl.paginationPageSize}
|
|
119
|
-
{@const pageCount = Math.max(1, Math.ceil(totalRows / pageSize))}
|
|
120
|
-
{@const currentPage = Math.min(ctrl.paginationPageIndex + 1, pageCount)}
|
|
121
|
-
{@const rangeStart =
|
|
122
|
-
totalRows === 0 ? 0 : (currentPage - 1) * pageSize + 1}
|
|
123
|
-
{@const rangeEnd = Math.min(totalRows, currentPage * pageSize)}
|
|
124
|
-
{@const onFirst = currentPage <= 1}
|
|
125
|
-
{@const onLast = currentPage >= pageCount}
|
|
126
|
-
{@const sizes = pageSizeOptions && pageSizeOptions.length ? pageSizeOptions : [10, 25, 50, 100]}
|
|
127
|
-
<div class="sv-grid-pagination" class:sv-grid-pagination-top={top} role="navigation" aria-label="Pagination">
|
|
128
|
-
<div class="sv-grid-pagination-pagesize">
|
|
129
|
-
<span>{messages.pageSize}</span>
|
|
130
|
-
<div class="sv-grid-pagination-pagesize-dd">
|
|
131
|
-
<SvGridDropdown
|
|
132
|
-
options={sizes.map((n) => ({ value: n, label: String(n) }))}
|
|
133
|
-
value={pageSize}
|
|
134
|
-
autoOpen={false}
|
|
135
|
-
onChange={(v) => setPageSize(Number(v))}
|
|
136
|
-
/>
|
|
137
|
-
</div>
|
|
138
|
-
</div>
|
|
139
|
-
<span class="sv-grid-pagination-range">
|
|
140
|
-
<strong>{rangeStart.toLocaleString()}</strong> to
|
|
141
|
-
<strong>{rangeEnd.toLocaleString()}</strong> of
|
|
142
|
-
<strong>{totalRows.toLocaleString()}</strong>
|
|
143
|
-
</span>
|
|
144
|
-
<div class="sv-grid-pagination-nav">
|
|
145
|
-
<button
|
|
146
|
-
type="button"
|
|
147
|
-
class="sv-grid-pagination-btn"
|
|
148
|
-
disabled={onFirst}
|
|
149
|
-
onclick={() => goToPage(0)}
|
|
150
|
-
aria-label={messages.firstPage}>⇤</button
|
|
151
|
-
>
|
|
152
|
-
<button
|
|
153
|
-
type="button"
|
|
154
|
-
class="sv-grid-pagination-btn"
|
|
155
|
-
disabled={onFirst}
|
|
156
|
-
onclick={() => changePage(-1)}
|
|
157
|
-
aria-label={messages.prevPage}>‹</button
|
|
158
|
-
>
|
|
159
|
-
<span class="sv-grid-pagination-label">
|
|
160
|
-
{messages.page} <strong>{currentPage.toLocaleString()}</strong> {messages.of}
|
|
161
|
-
<strong>{pageCount.toLocaleString()}</strong>
|
|
162
|
-
</span>
|
|
163
|
-
<button
|
|
164
|
-
type="button"
|
|
165
|
-
class="sv-grid-pagination-btn"
|
|
166
|
-
disabled={onLast}
|
|
167
|
-
onclick={() => changePage(1)}
|
|
168
|
-
aria-label={messages.nextPage}>›</button
|
|
169
|
-
>
|
|
170
|
-
<button
|
|
171
|
-
type="button"
|
|
172
|
-
class="sv-grid-pagination-btn"
|
|
173
|
-
disabled={onLast}
|
|
174
|
-
onclick={() => goToPage(pageCount - 1)}
|
|
175
|
-
aria-label={messages.lastPage}>⇥</button
|
|
176
|
-
>
|
|
177
|
-
</div>
|
|
178
|
-
</div>
|
|
179
|
-
{/if}
|
|
1
|
+
<script lang="ts" generics="TFeatures extends TableFeatures = TableFeatures, TData extends RowData = RowData">
|
|
2
|
+
import {
|
|
3
|
+
getGridCellA11yProps,
|
|
4
|
+
getGridCellDomId,
|
|
5
|
+
getGridHeaderA11yProps,
|
|
6
|
+
getGridRootA11yProps,
|
|
7
|
+
getGridRowA11yProps,
|
|
8
|
+
type EditorContext,
|
|
9
|
+
type CellEditorOption,
|
|
10
|
+
type Column,
|
|
11
|
+
type Row,
|
|
12
|
+
type RowData,
|
|
13
|
+
type TableFeatures,
|
|
14
|
+
} from "./index";
|
|
15
|
+
import "./sv-grid-scrollbar";
|
|
16
|
+
import type { Snippet } from "svelte";
|
|
17
|
+
import {
|
|
18
|
+
RenderSnippetConfig,
|
|
19
|
+
RenderComponentConfig,
|
|
20
|
+
} from "./render-component";
|
|
21
|
+
import {
|
|
22
|
+
buildSparkline,
|
|
23
|
+
toSparklineValues,
|
|
24
|
+
} from "./sparkline";
|
|
25
|
+
import SvGridDropdown from "./SvGridDropdown.svelte";
|
|
26
|
+
import type {
|
|
27
|
+
Props,
|
|
28
|
+
SelectionPoint,
|
|
29
|
+
SelectionRange,
|
|
30
|
+
CellEditState,
|
|
31
|
+
FilterOperator,
|
|
32
|
+
FilterOption,
|
|
33
|
+
MenuPosition,
|
|
34
|
+
} from "./SvGrid.types";
|
|
35
|
+
import {
|
|
36
|
+
cfTextStyle,
|
|
37
|
+
fmtStat,
|
|
38
|
+
getEditableInputValue,
|
|
39
|
+
getEditorInputType,
|
|
40
|
+
toValueArray,
|
|
41
|
+
getOptionLabel,
|
|
42
|
+
getOptionColor,
|
|
43
|
+
colorfulChipStyle,
|
|
44
|
+
getEditorClass,
|
|
45
|
+
} from "./SvGrid.helpers";
|
|
46
|
+
import {
|
|
47
|
+
} from "./SvGrid.controller.svelte";
|
|
48
|
+
import type { SvGridController } from "./SvGrid.controller.svelte";
|
|
49
|
+
|
|
50
|
+
let {
|
|
51
|
+
ctrl,
|
|
52
|
+
pager = true,
|
|
53
|
+
showStatus = true,
|
|
54
|
+
top = false,
|
|
55
|
+
pageSizeOptions,
|
|
56
|
+
}: {
|
|
57
|
+
ctrl: SvGridController<TFeatures, TData>;
|
|
58
|
+
/** Render the pagination controls in this instance. */
|
|
59
|
+
pager?: boolean;
|
|
60
|
+
/** Render the status bar in this instance. */
|
|
61
|
+
showStatus?: boolean;
|
|
62
|
+
/** This is a top-positioned footer (styling only). */
|
|
63
|
+
top?: boolean;
|
|
64
|
+
/** Page-size choices for the selector. Defaults to `[10, 25, 50, 100]`. */
|
|
65
|
+
pageSizeOptions?: number[];
|
|
66
|
+
} = $props();
|
|
67
|
+
|
|
68
|
+
// View facade: re-bind the controller's reactive members so the markup
|
|
69
|
+
// (moved verbatim from SvGrid.svelte) stays identical.
|
|
70
|
+
const paginationEnabled = $derived(ctrl.paginationEnabled);
|
|
71
|
+
const grid = $derived(ctrl.grid);
|
|
72
|
+
const paginationState = $derived(ctrl.paginationState);
|
|
73
|
+
const allRowsBeforePagination = $derived(ctrl.allRowsBeforePagination);
|
|
74
|
+
const statusBarEnabled = $derived(ctrl.statusBarEnabled);
|
|
75
|
+
const statusBarAggregates = $derived(ctrl.statusBarAggregates);
|
|
76
|
+
const statusBarStats = $derived(ctrl.statusBarStats);
|
|
77
|
+
const changePage = $derived(ctrl.changePage);
|
|
78
|
+
const goToPage = $derived(ctrl.goToPage);
|
|
79
|
+
const setPageSize = $derived(ctrl.setPageSize);
|
|
80
|
+
const messages = $derived(ctrl.messages);
|
|
81
|
+
</script>
|
|
82
|
+
|
|
83
|
+
{#if showStatus && statusBarEnabled && statusBarStats}
|
|
84
|
+
{@const s = statusBarStats}
|
|
85
|
+
<div class="sv-grid-status-bar" role="status" aria-live="polite">
|
|
86
|
+
{#each statusBarAggregates as agg (agg)}
|
|
87
|
+
{#if agg === "count"}
|
|
88
|
+
<span class="sv-grid-status-item"
|
|
89
|
+
><span class="sv-grid-status-label">{messages.statCount}</span>{fmtStat(s.count)}</span
|
|
90
|
+
>
|
|
91
|
+
{:else if agg === "numericCount"}
|
|
92
|
+
<span class="sv-grid-status-item"
|
|
93
|
+
><span class="sv-grid-status-label">Numeric</span>{fmtStat(s.numericCount)}</span
|
|
94
|
+
>
|
|
95
|
+
{:else if s.numericCount > 0 && agg === "sum"}
|
|
96
|
+
<span class="sv-grid-status-item"
|
|
97
|
+
><span class="sv-grid-status-label">{messages.statSum}</span>{fmtStat(s.sum)}</span
|
|
98
|
+
>
|
|
99
|
+
{:else if s.numericCount > 0 && agg === "avg"}
|
|
100
|
+
<span class="sv-grid-status-item"
|
|
101
|
+
><span class="sv-grid-status-label">{messages.statAvg}</span>{fmtStat(s.avg)}</span
|
|
102
|
+
>
|
|
103
|
+
{:else if s.numericCount > 0 && agg === "min"}
|
|
104
|
+
<span class="sv-grid-status-item"
|
|
105
|
+
><span class="sv-grid-status-label">{messages.statMin}</span>{fmtStat(s.min)}</span
|
|
106
|
+
>
|
|
107
|
+
{:else if s.numericCount > 0 && agg === "max"}
|
|
108
|
+
<span class="sv-grid-status-item"
|
|
109
|
+
><span class="sv-grid-status-label">{messages.statMax}</span>{fmtStat(s.max)}</span
|
|
110
|
+
>
|
|
111
|
+
{/if}
|
|
112
|
+
{/each}
|
|
113
|
+
</div>
|
|
114
|
+
{/if}
|
|
115
|
+
|
|
116
|
+
{#if pager && paginationEnabled}
|
|
117
|
+
{@const totalRows = ctrl.paginationTotalRows}
|
|
118
|
+
{@const pageSize = ctrl.paginationPageSize}
|
|
119
|
+
{@const pageCount = Math.max(1, Math.ceil(totalRows / pageSize))}
|
|
120
|
+
{@const currentPage = Math.min(ctrl.paginationPageIndex + 1, pageCount)}
|
|
121
|
+
{@const rangeStart =
|
|
122
|
+
totalRows === 0 ? 0 : (currentPage - 1) * pageSize + 1}
|
|
123
|
+
{@const rangeEnd = Math.min(totalRows, currentPage * pageSize)}
|
|
124
|
+
{@const onFirst = currentPage <= 1}
|
|
125
|
+
{@const onLast = currentPage >= pageCount}
|
|
126
|
+
{@const sizes = pageSizeOptions && pageSizeOptions.length ? pageSizeOptions : [10, 25, 50, 100]}
|
|
127
|
+
<div class="sv-grid-pagination" class:sv-grid-pagination-top={top} role="navigation" aria-label="Pagination">
|
|
128
|
+
<div class="sv-grid-pagination-pagesize">
|
|
129
|
+
<span>{messages.pageSize}</span>
|
|
130
|
+
<div class="sv-grid-pagination-pagesize-dd">
|
|
131
|
+
<SvGridDropdown
|
|
132
|
+
options={sizes.map((n) => ({ value: n, label: String(n) }))}
|
|
133
|
+
value={pageSize}
|
|
134
|
+
autoOpen={false}
|
|
135
|
+
onChange={(v) => setPageSize(Number(v))}
|
|
136
|
+
/>
|
|
137
|
+
</div>
|
|
138
|
+
</div>
|
|
139
|
+
<span class="sv-grid-pagination-range">
|
|
140
|
+
<strong>{rangeStart.toLocaleString()}</strong> to
|
|
141
|
+
<strong>{rangeEnd.toLocaleString()}</strong> of
|
|
142
|
+
<strong>{totalRows.toLocaleString()}</strong>
|
|
143
|
+
</span>
|
|
144
|
+
<div class="sv-grid-pagination-nav">
|
|
145
|
+
<button
|
|
146
|
+
type="button"
|
|
147
|
+
class="sv-grid-pagination-btn"
|
|
148
|
+
disabled={onFirst}
|
|
149
|
+
onclick={() => goToPage(0)}
|
|
150
|
+
aria-label={messages.firstPage}>⇤</button
|
|
151
|
+
>
|
|
152
|
+
<button
|
|
153
|
+
type="button"
|
|
154
|
+
class="sv-grid-pagination-btn"
|
|
155
|
+
disabled={onFirst}
|
|
156
|
+
onclick={() => changePage(-1)}
|
|
157
|
+
aria-label={messages.prevPage}>‹</button
|
|
158
|
+
>
|
|
159
|
+
<span class="sv-grid-pagination-label">
|
|
160
|
+
{messages.page} <strong>{currentPage.toLocaleString()}</strong> {messages.of}
|
|
161
|
+
<strong>{pageCount.toLocaleString()}</strong>
|
|
162
|
+
</span>
|
|
163
|
+
<button
|
|
164
|
+
type="button"
|
|
165
|
+
class="sv-grid-pagination-btn"
|
|
166
|
+
disabled={onLast}
|
|
167
|
+
onclick={() => changePage(1)}
|
|
168
|
+
aria-label={messages.nextPage}>›</button
|
|
169
|
+
>
|
|
170
|
+
<button
|
|
171
|
+
type="button"
|
|
172
|
+
class="sv-grid-pagination-btn"
|
|
173
|
+
disabled={onLast}
|
|
174
|
+
onclick={() => goToPage(pageCount - 1)}
|
|
175
|
+
aria-label={messages.lastPage}>⇥</button
|
|
176
|
+
>
|
|
177
|
+
</div>
|
|
178
|
+
</div>
|
|
179
|
+
{/if}
|