decap-cms-core 3.10.0 → 3.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/decap-cms-core.js +20 -20
- package/dist/decap-cms-core.js.map +1 -1
- package/dist/esm/actions/deploys.js +3 -2
- package/dist/esm/backend.js +5 -1
- package/dist/esm/bootstrap.js +2 -2
- package/dist/esm/components/App/StatusBar.js +1 -1
- package/dist/esm/components/Collection/CollectionControls.js +3 -2
- package/dist/esm/components/Collection/ViewStyleControl.js +6 -3
- package/dist/esm/components/Editor/EditorControlPane/EditorControl.js +8 -5
- package/dist/esm/components/Editor/EditorNotesPane/AddNoteForm.js +5 -5
- package/dist/esm/components/Editor/EditorNotesPane/EditorNotesPane.js +75 -15
- package/dist/esm/components/Editor/EditorNotesPane/NoteItem.js +21 -24
- package/dist/esm/components/Editor/EditorNotesPane/NotesList.js +4 -4
- package/dist/esm/components/Editor/EditorToolbar.js +52 -34
- package/dist/esm/components/MediaLibrary/MediaLibraryHeader.js +5 -3
- package/dist/esm/components/MediaLibrary/MediaLibraryTop.js +5 -4
- package/dist/esm/components/UI/ErrorBoundary.js +9 -8
- package/dist/esm/components/UI/SettingsDropdown.js +9 -7
- package/dist/esm/constants/configSchema.js +9 -0
- package/dist/esm/reducers/deploys.js +8 -3
- package/index.d.ts +5 -0
- package/package.json +2 -2
- package/src/actions/deploys.ts +4 -3
- package/src/backend.ts +8 -1
- package/src/components/Collection/CollectionControls.js +1 -1
- package/src/components/Collection/ViewStyleControl.js +3 -1
- package/src/components/Editor/EditorControlPane/EditorControl.js +1 -0
- package/src/components/Editor/EditorToolbar.js +40 -3
- package/src/components/Editor/__tests__/EditorToolbar.spec.js +46 -0
- package/src/components/MediaLibrary/MediaLibraryHeader.js +2 -2
- package/src/components/MediaLibrary/MediaLibraryTop.js +1 -0
- package/src/components/UI/ErrorBoundary.js +4 -3
- package/src/components/UI/SettingsDropdown.js +1 -1
- package/src/constants/configSchema.js +6 -0
- package/src/reducers/__tests__/deploys.spec.ts +111 -0
- package/src/reducers/deploys.ts +5 -3
- package/src/types/redux.ts +5 -0
- package/dist/esm/components/Collection/Entries/Pagination.js +0 -132
- package/dist/esm/lib/entryCache.js +0 -145
- package/dist/esm/lib/entryHelpers.js +0 -102
- package/dist/esm/lib/immutableHelpers.js +0 -21
- package/dist/esm/lib/pagination.js +0 -68
|
@@ -28,16 +28,18 @@ const ViewControlsButton = styled.button`
|
|
|
28
28
|
}
|
|
29
29
|
`;
|
|
30
30
|
|
|
31
|
-
function ViewStyleControl({ viewStyle, onChangeViewStyle }) {
|
|
31
|
+
function ViewStyleControl({ viewStyle, onChangeViewStyle, t }) {
|
|
32
32
|
return (
|
|
33
33
|
<ViewControlsSection>
|
|
34
34
|
<ViewControlsButton
|
|
35
|
+
aria-label={t('collection.collectionTop.viewAsList')}
|
|
35
36
|
isActive={viewStyle === VIEW_STYLE_LIST}
|
|
36
37
|
onClick={() => onChangeViewStyle(VIEW_STYLE_LIST)}
|
|
37
38
|
>
|
|
38
39
|
<Icon type="list" />
|
|
39
40
|
</ViewControlsButton>
|
|
40
41
|
<ViewControlsButton
|
|
42
|
+
aria-label={t('collection.collectionTop.viewAsGrid')}
|
|
41
43
|
isActive={viewStyle === VIEW_STYLE_GRID}
|
|
42
44
|
onClick={() => onChangeViewStyle(VIEW_STYLE_GRID)}
|
|
43
45
|
>
|
|
@@ -245,6 +245,7 @@ class EditorControl extends React.Component {
|
|
|
245
245
|
{({ css, cx }) => (
|
|
246
246
|
<ControlContainer
|
|
247
247
|
className={className}
|
|
248
|
+
aria-label={t('editor.editorControl.field.widgetLabel', { widgetLabel: widgetName })}
|
|
248
249
|
css={css`
|
|
249
250
|
${isHidden && styleStrings.hidden};
|
|
250
251
|
`}
|
|
@@ -230,6 +230,24 @@ const RefreshPreviewButton = styled.button`
|
|
|
230
230
|
span {
|
|
231
231
|
margin-right: 6px;
|
|
232
232
|
}
|
|
233
|
+
|
|
234
|
+
&:disabled {
|
|
235
|
+
cursor: default;
|
|
236
|
+
opacity: 0.6;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
${Icon} {
|
|
240
|
+
${props => props.$spinning && `animation: spin 1s linear infinite;`}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
@keyframes spin {
|
|
244
|
+
from {
|
|
245
|
+
transform: rotate(0deg);
|
|
246
|
+
}
|
|
247
|
+
to {
|
|
248
|
+
transform: rotate(360deg);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
233
251
|
`;
|
|
234
252
|
|
|
235
253
|
const PreviewLink = RefreshPreviewButton.withComponent('a');
|
|
@@ -285,17 +303,32 @@ export class EditorToolbar extends React.Component {
|
|
|
285
303
|
|
|
286
304
|
const { isNewEntry, loadDeployPreview } = this.props;
|
|
287
305
|
if (!isNewEntry) {
|
|
288
|
-
|
|
306
|
+
// 24 attempts × 5s interval = ~2 min polling window.
|
|
307
|
+
// With editorial workflow, saving remounts the component (navigates to
|
|
308
|
+
// the unpublished entry view), so componentDidMount is the primary
|
|
309
|
+
// polling trigger — not componentDidUpdate.
|
|
310
|
+
this._pollController = new AbortController();
|
|
311
|
+
loadDeployPreview({ maxAttempts: 24, signal: this._pollController.signal });
|
|
289
312
|
}
|
|
290
313
|
}
|
|
291
314
|
|
|
292
315
|
componentDidUpdate(prevProps) {
|
|
293
316
|
const { isNewEntry, isPersisting, loadDeployPreview } = this.props;
|
|
294
317
|
if (!isNewEntry && prevProps.isPersisting && !isPersisting) {
|
|
295
|
-
|
|
318
|
+
// Abort any in-flight poll before starting a new one.
|
|
319
|
+
this._pollController?.abort();
|
|
320
|
+
this._pollController = new AbortController();
|
|
321
|
+
// Fires on subsequent saves when the component survives (no remount).
|
|
322
|
+
// In editorial workflow the first save remounts, so this mainly
|
|
323
|
+
// covers the second-save-and-beyond case.
|
|
324
|
+
loadDeployPreview({ maxAttempts: 3, signal: this._pollController.signal });
|
|
296
325
|
}
|
|
297
326
|
}
|
|
298
327
|
|
|
328
|
+
componentWillUnmount() {
|
|
329
|
+
this._pollController?.abort();
|
|
330
|
+
}
|
|
331
|
+
|
|
299
332
|
renderSimpleControls = () => {
|
|
300
333
|
const { collection, hasChanged, isNewEntry, showDelete, onDelete, t } = this.props;
|
|
301
334
|
const canCreate = collection.get('create');
|
|
@@ -331,7 +364,11 @@ export class EditorToolbar extends React.Component {
|
|
|
331
364
|
<Icon type="new-tab" size="xsmall" />
|
|
332
365
|
</PreviewLink>
|
|
333
366
|
) : (
|
|
334
|
-
<RefreshPreviewButton
|
|
367
|
+
<RefreshPreviewButton
|
|
368
|
+
onClick={loadDeployPreview}
|
|
369
|
+
disabled={isFetching}
|
|
370
|
+
$spinning={isFetching}
|
|
371
|
+
>
|
|
335
372
|
<span>{t('editor.editorToolbar.deployPreviewPendingButtonLabel')}</span>
|
|
336
373
|
<Icon type="refresh" size="xsmall" />
|
|
337
374
|
</RefreshPreviewButton>
|
|
@@ -117,4 +117,50 @@ describe('EditorToolbar', () => {
|
|
|
117
117
|
expect(asFragment()).toMatchSnapshot();
|
|
118
118
|
});
|
|
119
119
|
});
|
|
120
|
+
|
|
121
|
+
describe('deploy preview polling', () => {
|
|
122
|
+
it('should poll with maxAttempts: 24 and an AbortSignal on mount for existing entries', () => {
|
|
123
|
+
render(<EditorToolbar {...props} isNewEntry={false} />);
|
|
124
|
+
expect(props.loadDeployPreview).toHaveBeenCalledTimes(1);
|
|
125
|
+
const opts = props.loadDeployPreview.mock.calls[0][0];
|
|
126
|
+
expect(opts.maxAttempts).toBe(24);
|
|
127
|
+
expect(opts.signal).toBeInstanceOf(AbortSignal);
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('should not poll on mount for new entries', () => {
|
|
131
|
+
render(<EditorToolbar {...props} isNewEntry={true} />);
|
|
132
|
+
expect(props.loadDeployPreview).not.toHaveBeenCalled();
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
it('should poll with maxAttempts: 3 after a save completes', () => {
|
|
136
|
+
const { rerender } = render(<EditorToolbar {...props} isPersisting={true} />);
|
|
137
|
+
props.loadDeployPreview.mockClear();
|
|
138
|
+
rerender(<EditorToolbar {...props} isPersisting={false} />);
|
|
139
|
+
expect(props.loadDeployPreview).toHaveBeenCalledTimes(1);
|
|
140
|
+
const opts = props.loadDeployPreview.mock.calls[0][0];
|
|
141
|
+
expect(opts.maxAttempts).toBe(3);
|
|
142
|
+
expect(opts.signal).toBeInstanceOf(AbortSignal);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it('should abort polling on unmount', () => {
|
|
146
|
+
const { unmount } = render(<EditorToolbar {...props} isNewEntry={false} />);
|
|
147
|
+
const signal = props.loadDeployPreview.mock.calls[0][0].signal;
|
|
148
|
+
expect(signal.aborted).toBe(false);
|
|
149
|
+
unmount();
|
|
150
|
+
expect(signal.aborted).toBe(true);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it('should abort previous poll when a new save triggers a new poll', () => {
|
|
154
|
+
const { rerender } = render(<EditorToolbar {...props} isPersisting={false} />);
|
|
155
|
+
const firstSignal = props.loadDeployPreview.mock.calls[0][0].signal;
|
|
156
|
+
|
|
157
|
+
// Simulate save completing
|
|
158
|
+
rerender(<EditorToolbar {...props} isPersisting={true} />);
|
|
159
|
+
rerender(<EditorToolbar {...props} isPersisting={false} />);
|
|
160
|
+
|
|
161
|
+
expect(firstSignal.aborted).toBe(true);
|
|
162
|
+
const secondSignal = props.loadDeployPreview.mock.calls[1][0].signal;
|
|
163
|
+
expect(secondSignal.aborted).toBe(false);
|
|
164
|
+
});
|
|
165
|
+
});
|
|
120
166
|
});
|
|
@@ -28,10 +28,10 @@ const LibraryTitle = styled.h1`
|
|
|
28
28
|
color: ${props => props.isPrivate && colors.textFieldBorder};
|
|
29
29
|
`;
|
|
30
30
|
|
|
31
|
-
function MediaLibraryHeader({ onClose, title, isPrivate }) {
|
|
31
|
+
function MediaLibraryHeader({ onClose, title, isPrivate, t }) {
|
|
32
32
|
return (
|
|
33
33
|
<div>
|
|
34
|
-
<CloseButton onClick={onClose}>
|
|
34
|
+
<CloseButton aria-label={t('mediaLibrary.mediaLibraryModal.close')} onClick={onClose}>
|
|
35
35
|
<Icon type="close" />
|
|
36
36
|
</CloseButton>
|
|
37
37
|
<LibraryTitle isPrivate={isPrivate}>{title}</LibraryTitle>
|
|
@@ -8,7 +8,7 @@ import copyToClipboard from 'copy-text-to-clipboard';
|
|
|
8
8
|
import { localForage } from 'decap-cms-lib-util';
|
|
9
9
|
import { buttons, colors } from 'decap-cms-ui-default';
|
|
10
10
|
|
|
11
|
-
const ISSUE_URL = 'https://github.com/decaporg/decap-cms/issues/new
|
|
11
|
+
const ISSUE_URL = 'https://github.com/decaporg/decap-cms/issues/new';
|
|
12
12
|
|
|
13
13
|
function getIssueTemplate({ version, provider, browser, config }) {
|
|
14
14
|
return `
|
|
@@ -52,6 +52,7 @@ function buildIssueTemplate({ config }) {
|
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
function buildIssueUrl({ title, config }) {
|
|
55
|
+
const issueUrl = config?.issue_reports?.url ?? ISSUE_URL;
|
|
55
56
|
try {
|
|
56
57
|
const body = buildIssueTemplate({ config });
|
|
57
58
|
|
|
@@ -60,10 +61,10 @@ function buildIssueUrl({ title, config }) {
|
|
|
60
61
|
params.append('body', truncate(body, { length: 4000, omission: '\n...' }));
|
|
61
62
|
params.append('labels', 'type: bug');
|
|
62
63
|
|
|
63
|
-
return `${
|
|
64
|
+
return `${issueUrl}?${params.toString()}`;
|
|
64
65
|
} catch (e) {
|
|
65
66
|
console.log(e);
|
|
66
|
-
return `${
|
|
67
|
+
return `${issueUrl}?template=bug_report.md`;
|
|
67
68
|
}
|
|
68
69
|
}
|
|
69
70
|
|
|
@@ -81,7 +81,7 @@ function SettingsDropdown({ displayUrl, isTestRepo, imageUrl, onLogoutClick, t }
|
|
|
81
81
|
dropdownWidth="100px"
|
|
82
82
|
dropdownPosition="right"
|
|
83
83
|
renderButton={() => (
|
|
84
|
-
<AvatarDropdownButton>
|
|
84
|
+
<AvatarDropdownButton aria-label={t('ui.settingsDropdown.account')}>
|
|
85
85
|
<Avatar imageUrl={imageUrl} />
|
|
86
86
|
</AvatarDropdownButton>
|
|
87
87
|
)}
|
|
@@ -193,6 +193,12 @@ function getConfigSchema() {
|
|
|
193
193
|
clean_accents: { type: 'boolean' },
|
|
194
194
|
},
|
|
195
195
|
},
|
|
196
|
+
issue_reports: {
|
|
197
|
+
type: 'object',
|
|
198
|
+
properties: {
|
|
199
|
+
url: { type: 'string', examples: ['https://example.com/report-issue'] },
|
|
200
|
+
},
|
|
201
|
+
},
|
|
196
202
|
collections: {
|
|
197
203
|
type: 'array',
|
|
198
204
|
minItems: 1,
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import deploys, { selectDeployPreview } from '../deploys';
|
|
2
|
+
import {
|
|
3
|
+
DEPLOY_PREVIEW_REQUEST,
|
|
4
|
+
DEPLOY_PREVIEW_SUCCESS,
|
|
5
|
+
DEPLOY_PREVIEW_FAILURE,
|
|
6
|
+
} from '../../actions/deploys';
|
|
7
|
+
|
|
8
|
+
describe('deploys reducer', () => {
|
|
9
|
+
it('should return the default state', () => {
|
|
10
|
+
const result = deploys(undefined, { type: 'UNKNOWN' });
|
|
11
|
+
expect(result).toEqual({});
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
describe('DEPLOY_PREVIEW_REQUEST', () => {
|
|
15
|
+
it('should set isFetching to true and status to PENDING', () => {
|
|
16
|
+
const result = deploys(undefined, {
|
|
17
|
+
type: DEPLOY_PREVIEW_REQUEST,
|
|
18
|
+
payload: { collection: 'posts', slug: 'my-post' },
|
|
19
|
+
});
|
|
20
|
+
expect(result['posts.my-post']).toEqual({ isFetching: true, status: 'PENDING' });
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('should clear stale url and replace status with PENDING', () => {
|
|
24
|
+
const staleState = {
|
|
25
|
+
'posts.my-post': {
|
|
26
|
+
isFetching: false,
|
|
27
|
+
url: 'https://production.example.com/posts/my-post',
|
|
28
|
+
status: 'SUCCESS',
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
const result = deploys(staleState, {
|
|
32
|
+
type: DEPLOY_PREVIEW_REQUEST,
|
|
33
|
+
payload: { collection: 'posts', slug: 'my-post' },
|
|
34
|
+
});
|
|
35
|
+
expect(result['posts.my-post']).toEqual({ isFetching: true, status: 'PENDING' });
|
|
36
|
+
expect(result['posts.my-post'].url).toBeUndefined();
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
describe('DEPLOY_PREVIEW_SUCCESS', () => {
|
|
41
|
+
it('should store the deploy preview url and status', () => {
|
|
42
|
+
const initialState = {
|
|
43
|
+
'posts.my-post': { isFetching: true },
|
|
44
|
+
};
|
|
45
|
+
const result = deploys(initialState, {
|
|
46
|
+
type: DEPLOY_PREVIEW_SUCCESS,
|
|
47
|
+
payload: {
|
|
48
|
+
collection: 'posts',
|
|
49
|
+
slug: 'my-post',
|
|
50
|
+
url: 'https://preview.example.com/posts/my-post',
|
|
51
|
+
status: 'SUCCESS',
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
expect(result['posts.my-post']).toEqual({
|
|
55
|
+
isFetching: false,
|
|
56
|
+
url: 'https://preview.example.com/posts/my-post',
|
|
57
|
+
status: 'SUCCESS',
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
describe('DEPLOY_PREVIEW_FAILURE', () => {
|
|
63
|
+
it('should set isFetching to false and status to PENDING', () => {
|
|
64
|
+
const initialState = {
|
|
65
|
+
'posts.my-post': { isFetching: true, status: 'PENDING' },
|
|
66
|
+
};
|
|
67
|
+
const result = deploys(initialState, {
|
|
68
|
+
type: DEPLOY_PREVIEW_FAILURE,
|
|
69
|
+
payload: { collection: 'posts', slug: 'my-post' },
|
|
70
|
+
});
|
|
71
|
+
expect(result['posts.my-post'].isFetching).toBe(false);
|
|
72
|
+
expect(result['posts.my-post'].status).toBe('PENDING');
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('should clear url and replace status with PENDING to prevent stale data', () => {
|
|
76
|
+
const initialState = {
|
|
77
|
+
'posts.my-post': {
|
|
78
|
+
isFetching: true,
|
|
79
|
+
url: 'https://production.example.com/posts/my-post',
|
|
80
|
+
status: 'SUCCESS',
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
const result = deploys(initialState, {
|
|
84
|
+
type: DEPLOY_PREVIEW_FAILURE,
|
|
85
|
+
payload: { collection: 'posts', slug: 'my-post' },
|
|
86
|
+
});
|
|
87
|
+
expect(result['posts.my-post']).toEqual({
|
|
88
|
+
isFetching: false,
|
|
89
|
+
url: undefined,
|
|
90
|
+
status: 'PENDING',
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
describe('selectDeployPreview', () => {
|
|
96
|
+
it('should return the deploy preview for a given collection and slug', () => {
|
|
97
|
+
const state = {
|
|
98
|
+
'posts.my-post': {
|
|
99
|
+
isFetching: false,
|
|
100
|
+
url: 'https://preview.example.com/posts/my-post',
|
|
101
|
+
status: 'SUCCESS',
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
expect(selectDeployPreview(state, 'posts', 'my-post')).toBe(state['posts.my-post']);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it('should return undefined for unknown collection/slug', () => {
|
|
108
|
+
expect(selectDeployPreview({}, 'posts', 'unknown')).toBeUndefined();
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
});
|
package/src/reducers/deploys.ts
CHANGED
|
@@ -23,8 +23,7 @@ const deploys = produce((state: Deploys, action: DeploysAction) => {
|
|
|
23
23
|
case DEPLOY_PREVIEW_REQUEST: {
|
|
24
24
|
const { collection, slug } = action.payload;
|
|
25
25
|
const key = `${collection}.${slug}`;
|
|
26
|
-
state[key] =
|
|
27
|
-
state[key].isFetching = true;
|
|
26
|
+
state[key] = { isFetching: true, status: 'PENDING' };
|
|
28
27
|
break;
|
|
29
28
|
}
|
|
30
29
|
|
|
@@ -39,7 +38,10 @@ const deploys = produce((state: Deploys, action: DeploysAction) => {
|
|
|
39
38
|
|
|
40
39
|
case DEPLOY_PREVIEW_FAILURE: {
|
|
41
40
|
const { collection, slug } = action.payload;
|
|
42
|
-
|
|
41
|
+
const key = `${collection}.${slug}`;
|
|
42
|
+
state[key].isFetching = false;
|
|
43
|
+
state[key].url = undefined;
|
|
44
|
+
state[key].status = 'PENDING';
|
|
43
45
|
break;
|
|
44
46
|
}
|
|
45
47
|
}
|
package/src/types/redux.ts
CHANGED
|
@@ -399,6 +399,10 @@ export interface CmsLocalBackend {
|
|
|
399
399
|
allowed_hosts?: string[];
|
|
400
400
|
}
|
|
401
401
|
|
|
402
|
+
export interface CmsIssueReports {
|
|
403
|
+
url?: string;
|
|
404
|
+
}
|
|
405
|
+
|
|
402
406
|
export interface CmsConfig {
|
|
403
407
|
backend: CmsBackend;
|
|
404
408
|
collections: CmsCollection[];
|
|
@@ -427,6 +431,7 @@ export interface CmsConfig {
|
|
|
427
431
|
}[];
|
|
428
432
|
slug?: CmsSlug;
|
|
429
433
|
i18n?: CmsI18nConfig;
|
|
434
|
+
issue_reports?: CmsIssueReports;
|
|
430
435
|
local_backend?: boolean | CmsLocalBackend;
|
|
431
436
|
editor?: {
|
|
432
437
|
preview?: boolean;
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import _styled from "@emotion/styled/base";
|
|
2
|
-
function _EMOTION_STRINGIFIED_CSS_ERROR__() { return "You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."; }
|
|
3
|
-
import React from 'react';
|
|
4
|
-
import PropTypes from 'prop-types';
|
|
5
|
-
import { translate } from 'react-polyglot';
|
|
6
|
-
import { Icon, colors } from 'decap-cms-ui-default';
|
|
7
|
-
import { jsx as ___EmotionJSX } from "@emotion/react";
|
|
8
|
-
const PaginationControls = /*#__PURE__*/_styled("div", {
|
|
9
|
-
target: "e1h9cohn2",
|
|
10
|
-
label: "PaginationControls"
|
|
11
|
-
})(process.env.NODE_ENV === "production" ? {
|
|
12
|
-
name: "dwn323",
|
|
13
|
-
styles: "display:flex;align-items:center;justify-content:center;gap:0.5rem;margin:2rem"
|
|
14
|
-
} : {
|
|
15
|
-
name: "dwn323",
|
|
16
|
-
styles: "display:flex;align-items:center;justify-content:center;gap:0.5rem;margin:2rem/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL0NvbGxlY3Rpb24vRW50cmllcy9QYWdpbmF0aW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1xQyIsImZpbGUiOiIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9Db2xsZWN0aW9uL0VudHJpZXMvUGFnaW5hdGlvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdAZW1vdGlvbi9zdHlsZWQnO1xuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSAncmVhY3QtcG9seWdsb3QnO1xuaW1wb3J0IHsgSWNvbiwgY29sb3JzIH0gZnJvbSAnZGVjYXAtY21zLXVpLWRlZmF1bHQnO1xuXG5jb25zdCBQYWdpbmF0aW9uQ29udHJvbHMgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgZ2FwOiAwLjVyZW07XG4gIG1hcmdpbjogMnJlbTtcbmA7XG5cbmNvbnN0IFBhZ2luYXRpb25JbmZvID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMTJweDtcbmA7XG5cbmNvbnN0IFBhZ2luYXRpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uYFxuICBwYWRkaW5nOiA2cHggNnB4IDRweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcnMuYnV0dG9ufTtcbiAgY29sb3I6ICR7Y29sb3JzLmJ1dHRvblRleHR9O1xuICBib3JkZXI6IG5vbmU7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgY3Vyc29yOiAke3Byb3BzID0+IChwcm9wcy5kaXNhYmxlZCA/ICdub3QtYWxsb3dlZCcgOiAncG9pbnRlcicpfTtcbiAgZm9udC1zaXplOiAxMnB4O1xuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XG5cbiAgJjpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzU1NWE2NTtcbiAgfVxuXG4gICY6ZGlzYWJsZWQge1xuICAgIG9wYWNpdHk6IDAuNTtcbiAgfVxuYDtcblxuLyoqXG4gKiBQYWdpbmF0aW9uIGNvbXBvbmVudCBmb3IgZW50cnkgY29sbGVjdGlvbnMuXG4gKlxuICogUHJvdmlkZXMgYWNjZXNzaWJsZSBuYXZpZ2F0aW9uIGNvbnRyb2xzIGZvciBwYWdpbmF0ZWQgZW50cnkgbGlzdHMuXG4gKiBVc2VzIGh5YnJpZCBwYWdpbmF0aW9uIGFwcHJvYWNoIC0gc2VydmVyLXNpZGUgYnkgZGVmYXVsdCwgY2xpZW50LXNpZGVcbiAqIHdoZW4gc29ydGluZy9maWx0ZXJpbmcvZ3JvdXBpbmcgaXMgYWN0aXZlLlxuICpcbiAqIEFjY2Vzc2liaWxpdHkgZmVhdHVyZXM6XG4gKiAtIEFSSUEgbGFiZWxzIGFuZCByb2xlcyBmb3Igc2NyZWVuIHJlYWRlciBzdXBwb3J0XG4gKiAtIEtleWJvYXJkIG5hdmlnYXRpb24gc3VwcG9ydFxuICogLSBMaXZlIHJlZ2lvbiBhbm5vdW5jZW1lbnRzIGZvciBwYWdlIGNoYW5nZXNcbiAqIC0gUHJvcGVyIGRpc2FibGVkIHN0YXRlIGhhbmRsaW5nXG4gKi9cbmZ1bmN0aW9uIFBhZ2luYXRpb24oeyBjdXJyZW50UGFnZSwgcGFnZUNvdW50LCBwYWdlU2l6ZSwgdG90YWxDb3VudCwgb25QYWdlQ2hhbmdlLCB0IH0pIHtcbiAgY29uc3QgaGFzUHJldlBhZ2UgPSBjdXJyZW50UGFnZSA+IDE7XG4gIGNvbnN0IGhhc05leHRQYWdlID0gY3VycmVudFBhZ2UgPCBwYWdlQ291bnQ7XG5cbiAgY29uc3Qgc3RhcnRFbnRyeSA9IHRvdGFsQ291bnQgPT09IDAgPyAwIDogKGN1cnJlbnRQYWdlIC0gMSkgKiBwYWdlU2l6ZSArIDE7XG4gIGNvbnN0IGVuZEVudHJ5ID0gdG90YWxDb3VudCA9PT0gMCA/IDAgOiBNYXRoLm1pbihjdXJyZW50UGFnZSAqIHBhZ2VTaXplLCB0b3RhbENvdW50KTtcblxuICByZXR1cm4gKFxuICAgIDxuYXYgcm9sZT1cIm5hdmlnYXRpb25cIiBhcmlhLWxhYmVsPXt0KCdjb2xsZWN0aW9uLnBhZ2luYXRpb24ubmF2aWdhdGlvbicpfT5cbiAgICAgIDxQYWdpbmF0aW9uQ29udHJvbHM+XG4gICAgICAgIDxQYWdpbmF0aW9uQnV0dG9uXG4gICAgICAgICAgZGlzYWJsZWQ9eyFoYXNQcmV2UGFnZX1cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvblBhZ2VDaGFuZ2UoMSl9XG4gICAgICAgICAgYXJpYS1sYWJlbD17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLmZpcnN0Jyl9XG4gICAgICAgICAgdGl0bGU9e3QoJ2NvbGxlY3Rpb24ucGFnaW5hdGlvbi5maXJzdCcpfVxuICAgICAgICAgIGFyaWEtZGlzYWJsZWQ9eyFoYXNQcmV2UGFnZX1cbiAgICAgICAgPlxuICAgICAgICAgIDxJY29uIHR5cGU9XCJjaGV2cm9uLWRvdWJsZVwiIHNpemU9XCJzbWFsbFwiIGRpcmVjdGlvbj1cImxlZnRcIiAvPlxuICAgICAgICA8L1BhZ2luYXRpb25CdXR0b24+XG4gICAgICAgIDxQYWdpbmF0aW9uQnV0dG9uXG4gICAgICAgICAgZGlzYWJsZWQ9eyFoYXNQcmV2UGFnZX1cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvblBhZ2VDaGFuZ2UoY3VycmVudFBhZ2UgLSAxKX1cbiAgICAgICAgICBhcmlhLWxhYmVsPXt0KCdjb2xsZWN0aW9uLnBhZ2luYXRpb24ucHJldmlvdXMnKX1cbiAgICAgICAgICB0aXRsZT17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLnByZXZpb3VzJyl9XG4gICAgICAgICAgYXJpYS1kaXNhYmxlZD17IWhhc1ByZXZQYWdlfVxuICAgICAgICA+XG4gICAgICAgICAgPEljb24gdHlwZT1cImNoZXZyb25cIiBzaXplPVwic21hbGxcIiBkaXJlY3Rpb249XCJsZWZ0XCIgLz5cbiAgICAgICAgPC9QYWdpbmF0aW9uQnV0dG9uPlxuXG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgc3R5bGU9e3sgY29sb3I6IGNvbG9ycy50ZXh0LCBmb250U2l6ZTogJzE0cHgnLCBwYWRkaW5nOiAnMCA4cHgnIH19XG4gICAgICAgICAgYXJpYS1jdXJyZW50PVwicGFnZVwiXG4gICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt0KCdjb2xsZWN0aW9uLnBhZ2luYXRpb24ucGFnZScsIHsgY3VycmVudDogY3VycmVudFBhZ2UsIHRvdGFsOiBwYWdlQ291bnQgfSl9XG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8UGFnaW5hdGlvbkJ1dHRvblxuICAgICAgICAgIGRpc2FibGVkPXshaGFzTmV4dFBhZ2V9XG4gICAgICAgICAgb25DbGljaz17KCkgPT4gb25QYWdlQ2hhbmdlKGN1cnJlbnRQYWdlICsgMSl9XG4gICAgICAgICAgYXJpYS1sYWJlbD17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLm5leHQnKX1cbiAgICAgICAgICB0aXRsZT17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLm5leHQnKX1cbiAgICAgICAgICBhcmlhLWRpc2FibGVkPXshaGFzTmV4dFBhZ2V9XG4gICAgICAgID5cbiAgICAgICAgICA8SWNvbiB0eXBlPVwiY2hldnJvblwiIHNpemU9XCJzbWFsbFwiIGRpcmVjdGlvbj1cInJpZ2h0XCIgLz5cbiAgICAgICAgPC9QYWdpbmF0aW9uQnV0dG9uPlxuICAgICAgICA8UGFnaW5hdGlvbkJ1dHRvblxuICAgICAgICAgIGRpc2FibGVkPXshaGFzTmV4dFBhZ2V9XG4gICAgICAgICAgb25DbGljaz17KCkgPT4gb25QYWdlQ2hhbmdlKHBhZ2VDb3VudCl9XG4gICAgICAgICAgYXJpYS1sYWJlbD17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLmxhc3QnKX1cbiAgICAgICAgICB0aXRsZT17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLmxhc3QnKX1cbiAgICAgICAgICBhcmlhLWRpc2FibGVkPXshaGFzTmV4dFBhZ2V9XG4gICAgICAgID5cbiAgICAgICAgICA8SWNvbiB0eXBlPVwiY2hldnJvbi1kb3VibGVcIiBzaXplPVwic21hbGxcIiBkaXJlY3Rpb249XCJyaWdodFwiIC8+XG4gICAgICAgIDwvUGFnaW5hdGlvbkJ1dHRvbj5cbiAgICAgIDwvUGFnaW5hdGlvbkNvbnRyb2xzPlxuXG4gICAgICA8UGFnaW5hdGlvbkluZm8gcm9sZT1cInN0YXR1c1wiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIGFyaWEtYXRvbWljPVwidHJ1ZVwiPlxuICAgICAgICA8c3Bhbj5cbiAgICAgICAgICB7dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLnNob3dpbmcnLCB7XG4gICAgICAgICAgICBzdGFydDogc3RhcnRFbnRyeSxcbiAgICAgICAgICAgIGVuZDogZW5kRW50cnksXG4gICAgICAgICAgICB0b3RhbDogdG90YWxDb3VudCxcbiAgICAgICAgICB9KX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9QYWdpbmF0aW9uSW5mbz5cbiAgICA8L25hdj5cbiAgKTtcbn1cblxuUGFnaW5hdGlvbi5wcm9wVHlwZXMgPSB7XG4gIGN1cnJlbnRQYWdlOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIHBhZ2VDb3VudDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBwYWdlU2l6ZTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICB0b3RhbENvdW50OiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIG9uUGFnZUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgdDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHRyYW5zbGF0ZSgpKFBhZ2luYXRpb24pO1xuIl19 */",
|
|
17
|
-
toString: _EMOTION_STRINGIFIED_CSS_ERROR__
|
|
18
|
-
});
|
|
19
|
-
const PaginationInfo = /*#__PURE__*/_styled("div", {
|
|
20
|
-
target: "e1h9cohn1",
|
|
21
|
-
label: "PaginationInfo"
|
|
22
|
-
})(process.env.NODE_ENV === "production" ? {
|
|
23
|
-
name: "1crwq3a",
|
|
24
|
-
styles: "display:flex;justify-content:center;align-items:center;gap:12px"
|
|
25
|
-
} : {
|
|
26
|
-
name: "1crwq3a",
|
|
27
|
-
styles: "display:flex;justify-content:center;align-items:center;gap:12px/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL0NvbGxlY3Rpb24vRW50cmllcy9QYWdpbmF0aW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWNpQyIsImZpbGUiOiIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9Db2xsZWN0aW9uL0VudHJpZXMvUGFnaW5hdGlvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdAZW1vdGlvbi9zdHlsZWQnO1xuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSAncmVhY3QtcG9seWdsb3QnO1xuaW1wb3J0IHsgSWNvbiwgY29sb3JzIH0gZnJvbSAnZGVjYXAtY21zLXVpLWRlZmF1bHQnO1xuXG5jb25zdCBQYWdpbmF0aW9uQ29udHJvbHMgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgZ2FwOiAwLjVyZW07XG4gIG1hcmdpbjogMnJlbTtcbmA7XG5cbmNvbnN0IFBhZ2luYXRpb25JbmZvID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMTJweDtcbmA7XG5cbmNvbnN0IFBhZ2luYXRpb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uYFxuICBwYWRkaW5nOiA2cHggNnB4IDRweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcnMuYnV0dG9ufTtcbiAgY29sb3I6ICR7Y29sb3JzLmJ1dHRvblRleHR9O1xuICBib3JkZXI6IG5vbmU7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgY3Vyc29yOiAke3Byb3BzID0+IChwcm9wcy5kaXNhYmxlZCA/ICdub3QtYWxsb3dlZCcgOiAncG9pbnRlcicpfTtcbiAgZm9udC1zaXplOiAxMnB4O1xuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMnM7XG5cbiAgJjpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzU1NWE2NTtcbiAgfVxuXG4gICY6ZGlzYWJsZWQge1xuICAgIG9wYWNpdHk6IDAuNTtcbiAgfVxuYDtcblxuLyoqXG4gKiBQYWdpbmF0aW9uIGNvbXBvbmVudCBmb3IgZW50cnkgY29sbGVjdGlvbnMuXG4gKlxuICogUHJvdmlkZXMgYWNjZXNzaWJsZSBuYXZpZ2F0aW9uIGNvbnRyb2xzIGZvciBwYWdpbmF0ZWQgZW50cnkgbGlzdHMuXG4gKiBVc2VzIGh5YnJpZCBwYWdpbmF0aW9uIGFwcHJvYWNoIC0gc2VydmVyLXNpZGUgYnkgZGVmYXVsdCwgY2xpZW50LXNpZGVcbiAqIHdoZW4gc29ydGluZy9maWx0ZXJpbmcvZ3JvdXBpbmcgaXMgYWN0aXZlLlxuICpcbiAqIEFjY2Vzc2liaWxpdHkgZmVhdHVyZXM6XG4gKiAtIEFSSUEgbGFiZWxzIGFuZCByb2xlcyBmb3Igc2NyZWVuIHJlYWRlciBzdXBwb3J0XG4gKiAtIEtleWJvYXJkIG5hdmlnYXRpb24gc3VwcG9ydFxuICogLSBMaXZlIHJlZ2lvbiBhbm5vdW5jZW1lbnRzIGZvciBwYWdlIGNoYW5nZXNcbiAqIC0gUHJvcGVyIGRpc2FibGVkIHN0YXRlIGhhbmRsaW5nXG4gKi9cbmZ1bmN0aW9uIFBhZ2luYXRpb24oeyBjdXJyZW50UGFnZSwgcGFnZUNvdW50LCBwYWdlU2l6ZSwgdG90YWxDb3VudCwgb25QYWdlQ2hhbmdlLCB0IH0pIHtcbiAgY29uc3QgaGFzUHJldlBhZ2UgPSBjdXJyZW50UGFnZSA+IDE7XG4gIGNvbnN0IGhhc05leHRQYWdlID0gY3VycmVudFBhZ2UgPCBwYWdlQ291bnQ7XG5cbiAgY29uc3Qgc3RhcnRFbnRyeSA9IHRvdGFsQ291bnQgPT09IDAgPyAwIDogKGN1cnJlbnRQYWdlIC0gMSkgKiBwYWdlU2l6ZSArIDE7XG4gIGNvbnN0IGVuZEVudHJ5ID0gdG90YWxDb3VudCA9PT0gMCA/IDAgOiBNYXRoLm1pbihjdXJyZW50UGFnZSAqIHBhZ2VTaXplLCB0b3RhbENvdW50KTtcblxuICByZXR1cm4gKFxuICAgIDxuYXYgcm9sZT1cIm5hdmlnYXRpb25cIiBhcmlhLWxhYmVsPXt0KCdjb2xsZWN0aW9uLnBhZ2luYXRpb24ubmF2aWdhdGlvbicpfT5cbiAgICAgIDxQYWdpbmF0aW9uQ29udHJvbHM+XG4gICAgICAgIDxQYWdpbmF0aW9uQnV0dG9uXG4gICAgICAgICAgZGlzYWJsZWQ9eyFoYXNQcmV2UGFnZX1cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvblBhZ2VDaGFuZ2UoMSl9XG4gICAgICAgICAgYXJpYS1sYWJlbD17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLmZpcnN0Jyl9XG4gICAgICAgICAgdGl0bGU9e3QoJ2NvbGxlY3Rpb24ucGFnaW5hdGlvbi5maXJzdCcpfVxuICAgICAgICAgIGFyaWEtZGlzYWJsZWQ9eyFoYXNQcmV2UGFnZX1cbiAgICAgICAgPlxuICAgICAgICAgIDxJY29uIHR5cGU9XCJjaGV2cm9uLWRvdWJsZVwiIHNpemU9XCJzbWFsbFwiIGRpcmVjdGlvbj1cImxlZnRcIiAvPlxuICAgICAgICA8L1BhZ2luYXRpb25CdXR0b24+XG4gICAgICAgIDxQYWdpbmF0aW9uQnV0dG9uXG4gICAgICAgICAgZGlzYWJsZWQ9eyFoYXNQcmV2UGFnZX1cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvblBhZ2VDaGFuZ2UoY3VycmVudFBhZ2UgLSAxKX1cbiAgICAgICAgICBhcmlhLWxhYmVsPXt0KCdjb2xsZWN0aW9uLnBhZ2luYXRpb24ucHJldmlvdXMnKX1cbiAgICAgICAgICB0aXRsZT17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLnByZXZpb3VzJyl9XG4gICAgICAgICAgYXJpYS1kaXNhYmxlZD17IWhhc1ByZXZQYWdlfVxuICAgICAgICA+XG4gICAgICAgICAgPEljb24gdHlwZT1cImNoZXZyb25cIiBzaXplPVwic21hbGxcIiBkaXJlY3Rpb249XCJsZWZ0XCIgLz5cbiAgICAgICAgPC9QYWdpbmF0aW9uQnV0dG9uPlxuXG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgc3R5bGU9e3sgY29sb3I6IGNvbG9ycy50ZXh0LCBmb250U2l6ZTogJzE0cHgnLCBwYWRkaW5nOiAnMCA4cHgnIH19XG4gICAgICAgICAgYXJpYS1jdXJyZW50PVwicGFnZVwiXG4gICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt0KCdjb2xsZWN0aW9uLnBhZ2luYXRpb24ucGFnZScsIHsgY3VycmVudDogY3VycmVudFBhZ2UsIHRvdGFsOiBwYWdlQ291bnQgfSl9XG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8UGFnaW5hdGlvbkJ1dHRvblxuICAgICAgICAgIGRpc2FibGVkPXshaGFzTmV4dFBhZ2V9XG4gICAgICAgICAgb25DbGljaz17KCkgPT4gb25QYWdlQ2hhbmdlKGN1cnJlbnRQYWdlICsgMSl9XG4gICAgICAgICAgYXJpYS1sYWJlbD17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLm5leHQnKX1cbiAgICAgICAgICB0aXRsZT17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLm5leHQnKX1cbiAgICAgICAgICBhcmlhLWRpc2FibGVkPXshaGFzTmV4dFBhZ2V9XG4gICAgICAgID5cbiAgICAgICAgICA8SWNvbiB0eXBlPVwiY2hldnJvblwiIHNpemU9XCJzbWFsbFwiIGRpcmVjdGlvbj1cInJpZ2h0XCIgLz5cbiAgICAgICAgPC9QYWdpbmF0aW9uQnV0dG9uPlxuICAgICAgICA8UGFnaW5hdGlvbkJ1dHRvblxuICAgICAgICAgIGRpc2FibGVkPXshaGFzTmV4dFBhZ2V9XG4gICAgICAgICAgb25DbGljaz17KCkgPT4gb25QYWdlQ2hhbmdlKHBhZ2VDb3VudCl9XG4gICAgICAgICAgYXJpYS1sYWJlbD17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLmxhc3QnKX1cbiAgICAgICAgICB0aXRsZT17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLmxhc3QnKX1cbiAgICAgICAgICBhcmlhLWRpc2FibGVkPXshaGFzTmV4dFBhZ2V9XG4gICAgICAgID5cbiAgICAgICAgICA8SWNvbiB0eXBlPVwiY2hldnJvbi1kb3VibGVcIiBzaXplPVwic21hbGxcIiBkaXJlY3Rpb249XCJyaWdodFwiIC8+XG4gICAgICAgIDwvUGFnaW5hdGlvbkJ1dHRvbj5cbiAgICAgIDwvUGFnaW5hdGlvbkNvbnRyb2xzPlxuXG4gICAgICA8UGFnaW5hdGlvbkluZm8gcm9sZT1cInN0YXR1c1wiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIGFyaWEtYXRvbWljPVwidHJ1ZVwiPlxuICAgICAgICA8c3Bhbj5cbiAgICAgICAgICB7dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLnNob3dpbmcnLCB7XG4gICAgICAgICAgICBzdGFydDogc3RhcnRFbnRyeSxcbiAgICAgICAgICAgIGVuZDogZW5kRW50cnksXG4gICAgICAgICAgICB0b3RhbDogdG90YWxDb3VudCxcbiAgICAgICAgICB9KX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9QYWdpbmF0aW9uSW5mbz5cbiAgICA8L25hdj5cbiAgKTtcbn1cblxuUGFnaW5hdGlvbi5wcm9wVHlwZXMgPSB7XG4gIGN1cnJlbnRQYWdlOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIHBhZ2VDb3VudDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBwYWdlU2l6ZTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICB0b3RhbENvdW50OiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIG9uUGFnZUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgdDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHRyYW5zbGF0ZSgpKFBhZ2luYXRpb24pO1xuIl19 */",
|
|
28
|
-
toString: _EMOTION_STRINGIFIED_CSS_ERROR__
|
|
29
|
-
});
|
|
30
|
-
const PaginationButton = /*#__PURE__*/_styled("button", {
|
|
31
|
-
target: "e1h9cohn0",
|
|
32
|
-
label: "PaginationButton"
|
|
33
|
-
})("padding:6px 6px 4px;background-color:", colors.button, ";color:", colors.buttonText, ";border:none;border-radius:4px;cursor:", props => props.disabled ? 'not-allowed' : 'pointer', ";font-size:12px;transition:background-color 0.2s;&:hover:not(:disabled){background-color:#555a65;}&:disabled{opacity:0.5;}" + (process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL0NvbGxlY3Rpb24vRW50cmllcy9QYWdpbmF0aW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXFCc0MiLCJmaWxlIjoiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvQ29sbGVjdGlvbi9FbnRyaWVzL1BhZ2luYXRpb24uanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gJ3JlYWN0LXBvbHlnbG90JztcbmltcG9ydCB7IEljb24sIGNvbG9ycyB9IGZyb20gJ2RlY2FwLWNtcy11aS1kZWZhdWx0JztcblxuY29uc3QgUGFnaW5hdGlvbkNvbnRyb2xzID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGdhcDogMC41cmVtO1xuICBtYXJnaW46IDJyZW07XG5gO1xuXG5jb25zdCBQYWdpbmF0aW9uSW5mbyA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDEycHg7XG5gO1xuXG5jb25zdCBQYWdpbmF0aW9uQnV0dG9uID0gc3R5bGVkLmJ1dHRvbmBcbiAgcGFkZGluZzogNnB4IDZweCA0cHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICR7Y29sb3JzLmJ1dHRvbn07XG4gIGNvbG9yOiAke2NvbG9ycy5idXR0b25UZXh0fTtcbiAgYm9yZGVyOiBub25lO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGN1cnNvcjogJHtwcm9wcyA9PiAocHJvcHMuZGlzYWJsZWQgPyAnbm90LWFsbG93ZWQnIDogJ3BvaW50ZXInKX07XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjJzO1xuXG4gICY6aG92ZXI6bm90KDpkaXNhYmxlZCkge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICM1NTVhNjU7XG4gIH1cblxuICAmOmRpc2FibGVkIHtcbiAgICBvcGFjaXR5OiAwLjU7XG4gIH1cbmA7XG5cbi8qKlxuICogUGFnaW5hdGlvbiBjb21wb25lbnQgZm9yIGVudHJ5IGNvbGxlY3Rpb25zLlxuICpcbiAqIFByb3ZpZGVzIGFjY2Vzc2libGUgbmF2aWdhdGlvbiBjb250cm9scyBmb3IgcGFnaW5hdGVkIGVudHJ5IGxpc3RzLlxuICogVXNlcyBoeWJyaWQgcGFnaW5hdGlvbiBhcHByb2FjaCAtIHNlcnZlci1zaWRlIGJ5IGRlZmF1bHQsIGNsaWVudC1zaWRlXG4gKiB3aGVuIHNvcnRpbmcvZmlsdGVyaW5nL2dyb3VwaW5nIGlzIGFjdGl2ZS5cbiAqXG4gKiBBY2Nlc3NpYmlsaXR5IGZlYXR1cmVzOlxuICogLSBBUklBIGxhYmVscyBhbmQgcm9sZXMgZm9yIHNjcmVlbiByZWFkZXIgc3VwcG9ydFxuICogLSBLZXlib2FyZCBuYXZpZ2F0aW9uIHN1cHBvcnRcbiAqIC0gTGl2ZSByZWdpb24gYW5ub3VuY2VtZW50cyBmb3IgcGFnZSBjaGFuZ2VzXG4gKiAtIFByb3BlciBkaXNhYmxlZCBzdGF0ZSBoYW5kbGluZ1xuICovXG5mdW5jdGlvbiBQYWdpbmF0aW9uKHsgY3VycmVudFBhZ2UsIHBhZ2VDb3VudCwgcGFnZVNpemUsIHRvdGFsQ291bnQsIG9uUGFnZUNoYW5nZSwgdCB9KSB7XG4gIGNvbnN0IGhhc1ByZXZQYWdlID0gY3VycmVudFBhZ2UgPiAxO1xuICBjb25zdCBoYXNOZXh0UGFnZSA9IGN1cnJlbnRQYWdlIDwgcGFnZUNvdW50O1xuXG4gIGNvbnN0IHN0YXJ0RW50cnkgPSB0b3RhbENvdW50ID09PSAwID8gMCA6IChjdXJyZW50UGFnZSAtIDEpICogcGFnZVNpemUgKyAxO1xuICBjb25zdCBlbmRFbnRyeSA9IHRvdGFsQ291bnQgPT09IDAgPyAwIDogTWF0aC5taW4oY3VycmVudFBhZ2UgKiBwYWdlU2l6ZSwgdG90YWxDb3VudCk7XG5cbiAgcmV0dXJuIChcbiAgICA8bmF2IHJvbGU9XCJuYXZpZ2F0aW9uXCIgYXJpYS1sYWJlbD17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLm5hdmlnYXRpb24nKX0+XG4gICAgICA8UGFnaW5hdGlvbkNvbnRyb2xzPlxuICAgICAgICA8UGFnaW5hdGlvbkJ1dHRvblxuICAgICAgICAgIGRpc2FibGVkPXshaGFzUHJldlBhZ2V9XG4gICAgICAgICAgb25DbGljaz17KCkgPT4gb25QYWdlQ2hhbmdlKDEpfVxuICAgICAgICAgIGFyaWEtbGFiZWw9e3QoJ2NvbGxlY3Rpb24ucGFnaW5hdGlvbi5maXJzdCcpfVxuICAgICAgICAgIHRpdGxlPXt0KCdjb2xsZWN0aW9uLnBhZ2luYXRpb24uZmlyc3QnKX1cbiAgICAgICAgICBhcmlhLWRpc2FibGVkPXshaGFzUHJldlBhZ2V9XG4gICAgICAgID5cbiAgICAgICAgICA8SWNvbiB0eXBlPVwiY2hldnJvbi1kb3VibGVcIiBzaXplPVwic21hbGxcIiBkaXJlY3Rpb249XCJsZWZ0XCIgLz5cbiAgICAgICAgPC9QYWdpbmF0aW9uQnV0dG9uPlxuICAgICAgICA8UGFnaW5hdGlvbkJ1dHRvblxuICAgICAgICAgIGRpc2FibGVkPXshaGFzUHJldlBhZ2V9XG4gICAgICAgICAgb25DbGljaz17KCkgPT4gb25QYWdlQ2hhbmdlKGN1cnJlbnRQYWdlIC0gMSl9XG4gICAgICAgICAgYXJpYS1sYWJlbD17dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLnByZXZpb3VzJyl9XG4gICAgICAgICAgdGl0bGU9e3QoJ2NvbGxlY3Rpb24ucGFnaW5hdGlvbi5wcmV2aW91cycpfVxuICAgICAgICAgIGFyaWEtZGlzYWJsZWQ9eyFoYXNQcmV2UGFnZX1cbiAgICAgICAgPlxuICAgICAgICAgIDxJY29uIHR5cGU9XCJjaGV2cm9uXCIgc2l6ZT1cInNtYWxsXCIgZGlyZWN0aW9uPVwibGVmdFwiIC8+XG4gICAgICAgIDwvUGFnaW5hdGlvbkJ1dHRvbj5cblxuICAgICAgICA8c3BhblxuICAgICAgICAgIHN0eWxlPXt7IGNvbG9yOiBjb2xvcnMudGV4dCwgZm9udFNpemU6ICcxNHB4JywgcGFkZGluZzogJzAgOHB4JyB9fVxuICAgICAgICAgIGFyaWEtY3VycmVudD1cInBhZ2VcIlxuICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgID5cbiAgICAgICAgICB7dCgnY29sbGVjdGlvbi5wYWdpbmF0aW9uLnBhZ2UnLCB7IGN1cnJlbnQ6IGN1cnJlbnRQYWdlLCB0b3RhbDogcGFnZUNvdW50IH0pfVxuICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgPFBhZ2luYXRpb25CdXR0b25cbiAgICAgICAgICBkaXNhYmxlZD17IWhhc05leHRQYWdlfVxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG9uUGFnZUNoYW5nZShjdXJyZW50UGFnZSArIDEpfVxuICAgICAgICAgIGFyaWEtbGFiZWw9e3QoJ2NvbGxlY3Rpb24ucGFnaW5hdGlvbi5uZXh0Jyl9XG4gICAgICAgICAgdGl0bGU9e3QoJ2NvbGxlY3Rpb24ucGFnaW5hdGlvbi5uZXh0Jyl9XG4gICAgICAgICAgYXJpYS1kaXNhYmxlZD17IWhhc05leHRQYWdlfVxuICAgICAgICA+XG4gICAgICAgICAgPEljb24gdHlwZT1cImNoZXZyb25cIiBzaXplPVwic21hbGxcIiBkaXJlY3Rpb249XCJyaWdodFwiIC8+XG4gICAgICAgIDwvUGFnaW5hdGlvbkJ1dHRvbj5cbiAgICAgICAgPFBhZ2luYXRpb25CdXR0b25cbiAgICAgICAgICBkaXNhYmxlZD17IWhhc05leHRQYWdlfVxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG9uUGFnZUNoYW5nZShwYWdlQ291bnQpfVxuICAgICAgICAgIGFyaWEtbGFiZWw9e3QoJ2NvbGxlY3Rpb24ucGFnaW5hdGlvbi5sYXN0Jyl9XG4gICAgICAgICAgdGl0bGU9e3QoJ2NvbGxlY3Rpb24ucGFnaW5hdGlvbi5sYXN0Jyl9XG4gICAgICAgICAgYXJpYS1kaXNhYmxlZD17IWhhc05leHRQYWdlfVxuICAgICAgICA+XG4gICAgICAgICAgPEljb24gdHlwZT1cImNoZXZyb24tZG91YmxlXCIgc2l6ZT1cInNtYWxsXCIgZGlyZWN0aW9uPVwicmlnaHRcIiAvPlxuICAgICAgICA8L1BhZ2luYXRpb25CdXR0b24+XG4gICAgICA8L1BhZ2luYXRpb25Db250cm9scz5cblxuICAgICAgPFBhZ2luYXRpb25JbmZvIHJvbGU9XCJzdGF0dXNcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIiBhcmlhLWF0b21pYz1cInRydWVcIj5cbiAgICAgICAgPHNwYW4+XG4gICAgICAgICAge3QoJ2NvbGxlY3Rpb24ucGFnaW5hdGlvbi5zaG93aW5nJywge1xuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0RW50cnksXG4gICAgICAgICAgICBlbmQ6IGVuZEVudHJ5LFxuICAgICAgICAgICAgdG90YWw6IHRvdGFsQ291bnQsXG4gICAgICAgICAgfSl9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvUGFnaW5hdGlvbkluZm8+XG4gICAgPC9uYXY+XG4gICk7XG59XG5cblBhZ2luYXRpb24ucHJvcFR5cGVzID0ge1xuICBjdXJyZW50UGFnZTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBwYWdlQ291bnQ6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgcGFnZVNpemU6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgdG90YWxDb3VudDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBvblBhZ2VDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG59O1xuXG5leHBvcnQgZGVmYXVsdCB0cmFuc2xhdGUoKShQYWdpbmF0aW9uKTtcbiJdfQ== */"));
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Pagination component for entry collections.
|
|
37
|
-
*
|
|
38
|
-
* Provides accessible navigation controls for paginated entry lists.
|
|
39
|
-
* Uses hybrid pagination approach - server-side by default, client-side
|
|
40
|
-
* when sorting/filtering/grouping is active.
|
|
41
|
-
*
|
|
42
|
-
* Accessibility features:
|
|
43
|
-
* - ARIA labels and roles for screen reader support
|
|
44
|
-
* - Keyboard navigation support
|
|
45
|
-
* - Live region announcements for page changes
|
|
46
|
-
* - Proper disabled state handling
|
|
47
|
-
*/
|
|
48
|
-
function Pagination({
|
|
49
|
-
currentPage,
|
|
50
|
-
pageCount,
|
|
51
|
-
pageSize,
|
|
52
|
-
totalCount,
|
|
53
|
-
onPageChange,
|
|
54
|
-
t
|
|
55
|
-
}) {
|
|
56
|
-
const hasPrevPage = currentPage > 1;
|
|
57
|
-
const hasNextPage = currentPage < pageCount;
|
|
58
|
-
const startEntry = totalCount === 0 ? 0 : (currentPage - 1) * pageSize + 1;
|
|
59
|
-
const endEntry = totalCount === 0 ? 0 : Math.min(currentPage * pageSize, totalCount);
|
|
60
|
-
return ___EmotionJSX("nav", {
|
|
61
|
-
role: "navigation",
|
|
62
|
-
"aria-label": t('collection.pagination.navigation')
|
|
63
|
-
}, ___EmotionJSX(PaginationControls, null, ___EmotionJSX(PaginationButton, {
|
|
64
|
-
disabled: !hasPrevPage,
|
|
65
|
-
onClick: () => onPageChange(1),
|
|
66
|
-
"aria-label": t('collection.pagination.first'),
|
|
67
|
-
title: t('collection.pagination.first'),
|
|
68
|
-
"aria-disabled": !hasPrevPage
|
|
69
|
-
}, ___EmotionJSX(Icon, {
|
|
70
|
-
type: "chevron-double",
|
|
71
|
-
size: "small",
|
|
72
|
-
direction: "left"
|
|
73
|
-
})), ___EmotionJSX(PaginationButton, {
|
|
74
|
-
disabled: !hasPrevPage,
|
|
75
|
-
onClick: () => onPageChange(currentPage - 1),
|
|
76
|
-
"aria-label": t('collection.pagination.previous'),
|
|
77
|
-
title: t('collection.pagination.previous'),
|
|
78
|
-
"aria-disabled": !hasPrevPage
|
|
79
|
-
}, ___EmotionJSX(Icon, {
|
|
80
|
-
type: "chevron",
|
|
81
|
-
size: "small",
|
|
82
|
-
direction: "left"
|
|
83
|
-
})), ___EmotionJSX("span", {
|
|
84
|
-
style: {
|
|
85
|
-
color: colors.text,
|
|
86
|
-
fontSize: '14px',
|
|
87
|
-
padding: '0 8px'
|
|
88
|
-
},
|
|
89
|
-
"aria-current": "page",
|
|
90
|
-
"aria-live": "polite"
|
|
91
|
-
}, t('collection.pagination.page', {
|
|
92
|
-
current: currentPage,
|
|
93
|
-
total: pageCount
|
|
94
|
-
})), ___EmotionJSX(PaginationButton, {
|
|
95
|
-
disabled: !hasNextPage,
|
|
96
|
-
onClick: () => onPageChange(currentPage + 1),
|
|
97
|
-
"aria-label": t('collection.pagination.next'),
|
|
98
|
-
title: t('collection.pagination.next'),
|
|
99
|
-
"aria-disabled": !hasNextPage
|
|
100
|
-
}, ___EmotionJSX(Icon, {
|
|
101
|
-
type: "chevron",
|
|
102
|
-
size: "small",
|
|
103
|
-
direction: "right"
|
|
104
|
-
})), ___EmotionJSX(PaginationButton, {
|
|
105
|
-
disabled: !hasNextPage,
|
|
106
|
-
onClick: () => onPageChange(pageCount),
|
|
107
|
-
"aria-label": t('collection.pagination.last'),
|
|
108
|
-
title: t('collection.pagination.last'),
|
|
109
|
-
"aria-disabled": !hasNextPage
|
|
110
|
-
}, ___EmotionJSX(Icon, {
|
|
111
|
-
type: "chevron-double",
|
|
112
|
-
size: "small",
|
|
113
|
-
direction: "right"
|
|
114
|
-
}))), ___EmotionJSX(PaginationInfo, {
|
|
115
|
-
role: "status",
|
|
116
|
-
"aria-live": "polite",
|
|
117
|
-
"aria-atomic": "true"
|
|
118
|
-
}, ___EmotionJSX("span", null, t('collection.pagination.showing', {
|
|
119
|
-
start: startEntry,
|
|
120
|
-
end: endEntry,
|
|
121
|
-
total: totalCount
|
|
122
|
-
}))));
|
|
123
|
-
}
|
|
124
|
-
Pagination.propTypes = {
|
|
125
|
-
currentPage: PropTypes.number.isRequired,
|
|
126
|
-
pageCount: PropTypes.number.isRequired,
|
|
127
|
-
pageSize: PropTypes.number.isRequired,
|
|
128
|
-
totalCount: PropTypes.number.isRequired,
|
|
129
|
-
onPageChange: PropTypes.func.isRequired,
|
|
130
|
-
t: PropTypes.func.isRequired
|
|
131
|
-
};
|
|
132
|
-
export default translate()(Pagination);
|