@jmruthers/pace-core 0.6.6 → 0.6.7
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/{scripts/audit/audit-dependencies.cjs → audit-tool/00-dependencies.cjs} +12 -13
- package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
- package/audit-tool/audits/02-project-structure.cjs +255 -0
- package/audit-tool/audits/03-architecture.cjs +196 -0
- package/audit-tool/audits/04-code-quality.cjs +149 -0
- package/audit-tool/audits/05-styling.cjs +224 -0
- package/audit-tool/audits/06-security-rbac.cjs +544 -0
- package/audit-tool/audits/07-api-tech-stack.cjs +301 -0
- package/audit-tool/audits/08-testing-documentation.cjs +202 -0
- package/audit-tool/audits/09-operations.cjs +208 -0
- package/audit-tool/index.cjs +291 -0
- package/audit-tool/utils/code-utils.cjs +218 -0
- package/audit-tool/utils/file-utils.cjs +230 -0
- package/audit-tool/utils/report-utils.cjs +241 -0
- package/cursor-rules/00-standards-overview.mdc +156 -0
- package/cursor-rules/{00-pace-core-compliance.mdc → 01-pace-core-compliance.mdc} +187 -34
- package/cursor-rules/02-project-structure.mdc +37 -5
- package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +125 -11
- package/cursor-rules/04-code-quality.mdc +419 -0
- package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +55 -10
- package/cursor-rules/{09-rbac-compliance.mdc → 06-security-rbac.mdc} +62 -6
- package/cursor-rules/07-api-tech-stack.mdc +377 -0
- package/cursor-rules/08-testing-documentation.mdc +324 -0
- package/cursor-rules/09-operations.mdc +365 -0
- package/dist/DataTable-7PMH7XN7.js +15 -0
- package/dist/{DataTable-2N_tqbfq.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
- package/dist/{PublicPageProvider-BBH6Vqg7.d.ts → PublicPageProvider-DlsCaR5v.d.ts} +26 -16
- package/dist/{chunk-FENMYN2U.js → chunk-5X4QLXRG.js} +1 -3
- package/dist/{chunk-4T7OBVTU.js → chunk-6F3IILHI.js} +1 -1
- package/dist/{chunk-SD6WQY43.js → chunk-7ILTDCL2.js} +9 -1
- package/dist/{chunk-3QC3KRHK.js → chunk-A3W6LW53.js} +16 -1
- package/dist/{chunk-7TYHROIV.js → chunk-BM4CQ5P3.js} +50 -8
- package/dist/{chunk-2HGJFNAH.js → chunk-FEJLJNWA.js} +1 -15
- package/dist/{chunk-OHIK3MIO.js → chunk-GHYHJTYV.js} +2 -2
- package/dist/{chunk-UIYSCEV7.js → chunk-IUBRCBSY.js} +1 -1
- package/dist/{chunk-LAZMKTTF.js → chunk-JGWDVX64.js} +281 -347
- package/dist/{chunk-MAGBIDNS.js → chunk-L4XMVJKY.js} +2 -2
- package/dist/{chunk-A55DK444.js → chunk-OJ4SKRSV.js} +1 -7
- package/dist/{chunk-ZS5VO5JB.js → chunk-Q7Q7V5NV.js} +406 -451
- package/dist/{chunk-3O3WHILE.js → chunk-VBCS3DUA.js} +236 -60
- package/dist/{chunk-BVP2BCJF.js → chunk-ZKAWKYT4.js} +8 -8
- package/dist/components.d.ts +5 -4
- package/dist/components.js +27 -32
- package/dist/eslint-rules/index.cjs +22 -9
- package/{src/eslint-rules/rules/compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +184 -23
- package/dist/eslint-rules/rules/04-code-quality.cjs +290 -0
- package/dist/eslint-rules/rules/05-styling.cjs +61 -0
- package/dist/eslint-rules/rules/{rbac.cjs → 06-security-rbac.cjs} +26 -10
- package/dist/eslint-rules/rules/07-api-tech-stack.cjs +263 -0
- package/dist/eslint-rules/rules/08-testing.cjs +94 -0
- package/dist/hooks.d.ts +5 -5
- package/dist/hooks.js +6 -6
- package/dist/index.d.ts +6 -6
- package/dist/index.js +18 -17
- package/dist/rbac/index.js +6 -6
- package/dist/theming/runtime.d.ts +14 -1
- package/dist/theming/runtime.js +1 -1
- package/dist/{types-B-K_5VnO.d.ts → types-DXstZpNI.d.ts} +0 -17
- package/dist/{usePublicRouteParams-COZ28Mvq.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +19 -19
- package/dist/utils.d.ts +2 -2
- package/dist/utils.js +8 -8
- package/docs/README.md +1 -1
- package/docs/api/modules.md +47 -31
- package/docs/api-reference/components.md +18 -20
- package/docs/api-reference/hooks.md +80 -80
- package/docs/api-reference/types.md +1 -1
- package/docs/api-reference/utilities.md +1 -1
- package/docs/architecture/README.md +1 -1
- package/docs/core-concepts/events.md +3 -3
- package/docs/core-concepts/organisations.md +6 -6
- package/docs/core-concepts/permissions.md +6 -6
- package/docs/documentation-index.md +12 -18
- package/docs/getting-started/documentation-index.md +1 -1
- package/docs/getting-started/examples/README.md +4 -4
- package/docs/getting-started/examples/full-featured-app.md +1 -1
- package/docs/getting-started/faq.md +2 -2
- package/docs/getting-started/quick-reference.md +4 -4
- package/docs/implementation-guides/authentication.md +15 -15
- package/docs/implementation-guides/component-styling.md +1 -1
- package/docs/implementation-guides/data-tables.md +126 -33
- package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
- package/docs/implementation-guides/dynamic-colors.md +3 -3
- package/docs/implementation-guides/file-upload-storage.md +2 -2
- package/docs/implementation-guides/hierarchical-datatable.md +40 -60
- package/docs/implementation-guides/inactivity-tracking.md +3 -3
- package/docs/implementation-guides/large-datasets.md +3 -2
- package/docs/implementation-guides/organisation-security.md +2 -2
- package/docs/implementation-guides/performance.md +2 -2
- package/docs/implementation-guides/permission-enforcement.md +1 -1
- package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
- package/docs/migration/V0.4.0_rbac-migration.md +6 -6
- package/docs/rbac/README.md +5 -5
- package/docs/rbac/advanced-patterns.md +6 -6
- package/docs/rbac/api-reference.md +20 -20
- package/docs/rbac/event-based-apps.md +3 -3
- package/docs/rbac/examples.md +41 -41
- package/docs/rbac/getting-started.md +37 -37
- package/docs/rbac/performance.md +1 -1
- package/docs/rbac/quick-start.md +52 -52
- package/docs/rbac/secure-client-protection.md +1 -1
- package/docs/rbac/troubleshooting.md +1 -1
- package/docs/security/README.md +5 -5
- package/docs/standards/0-standards-overview.md +220 -0
- package/docs/standards/{00-pace-core-compliance.md → 1-pace-core-compliance-standards.md} +204 -185
- package/docs/standards/{02-project-structure.md → 2-project-structure-standards.md} +11 -47
- package/docs/standards/3-architecture-standards.md +606 -0
- package/docs/standards/4-code-quality-standards.md +728 -0
- package/docs/standards/{08-markup-quality.md → 5-styling-standards.md} +12 -9
- package/docs/standards/{09-rbac-compliance.md → 6-security-rbac-standards.md} +126 -18
- package/docs/standards/7-api-tech-stack-standards.md +662 -0
- package/docs/standards/8-testing-documentation-standards.md +401 -0
- package/docs/standards/9-operations-standards.md +1102 -0
- package/docs/standards/README.md +203 -104
- package/docs/troubleshooting/README.md +4 -4
- package/docs/troubleshooting/common-issues.md +2 -2
- package/docs/troubleshooting/debugging.md +9 -9
- package/docs/troubleshooting/migration.md +4 -4
- package/eslint-config-pace-core.cjs +21 -10
- package/package.json +6 -5
- package/scripts/install-cursor-rules.cjs +11 -243
- package/scripts/install-eslint-config.cjs +284 -0
- package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +2 -2
- package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
- package/src/__tests__/helpers/__tests__/test-utils.test.tsx +10 -10
- package/src/__tests__/integration/UserProfile.test.tsx +14 -14
- package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
- package/src/__tests__/templates/accessibility.test.template.tsx +9 -9
- package/src/__tests__/templates/component.test.template.tsx +18 -15
- package/src/components/Calendar/Calendar.tsx +201 -47
- package/src/components/ContextSelector/ContextSelector.tsx +137 -153
- package/src/components/DataTable/AUDIT_REPORT.md +293 -0
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +10 -2
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +10 -4
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
- package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
- package/src/components/DataTable/components/DataTableLayout.tsx +5 -16
- package/src/components/DataTable/components/EditableRow.tsx +5 -7
- package/src/components/DataTable/components/EmptyState.tsx +10 -9
- package/src/components/DataTable/components/FilterRow.tsx +2 -4
- package/src/components/DataTable/components/ImportModal.tsx +124 -126
- package/src/components/DataTable/components/LoadingState.tsx +5 -6
- package/src/components/DataTable/components/SortIndicator.tsx +50 -0
- package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
- package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
- package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
- package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
- package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
- package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +41 -27
- package/src/components/DataTable/components/index.ts +2 -1
- package/src/components/DataTable/types.ts +0 -18
- package/src/components/DataTable/utils/a11yUtils.ts +17 -0
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +2 -1
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
- package/src/components/DateTimeField/DateTimeField.tsx +7 -8
- package/src/components/Dialog/Dialog.test.tsx +1 -0
- package/src/components/Dialog/Dialog.tsx +25 -8
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
- package/src/components/FileUpload/FileUpload.test.tsx +52 -14
- package/src/components/FileUpload/FileUpload.tsx +112 -130
- package/src/components/Progress/Progress.tsx +2 -4
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
- package/src/components/Select/Select.tsx +86 -77
- package/src/components/Select/types.ts +3 -0
- package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
- package/src/hooks/__tests__/hooks.integration.test.tsx +49 -49
- package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +97 -97
- package/src/hooks/public/usePublicEvent.ts +5 -5
- package/src/hooks/public/usePublicEventLogo.ts +5 -5
- package/src/hooks/public/usePublicFileDisplay.ts +2 -2
- package/src/hooks/public/usePublicRouteParams.ts +5 -5
- package/src/hooks/useAppConfig.ts +2 -2
- package/src/hooks/useEventTheme.test.ts +7 -7
- package/src/hooks/useEventTheme.ts +1 -4
- package/src/hooks/useFileDisplay.ts +2 -2
- package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
- package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
- package/src/providers/__tests__/EventProvider.test.tsx +61 -61
- package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
- package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
- package/src/providers/__tests__/ProviderLifecycle.test.tsx +37 -37
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +10 -10
- package/src/styles/core.css +7 -0
- package/src/theming/__tests__/parseEventColours.test.ts +9 -3
- package/src/theming/parseEventColours.ts +22 -10
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
- package/src/utils/storage/README.md +1 -1
- package/cursor-rules/01-standards-compliance.mdc +0 -285
- package/cursor-rules/04-testing-standards.mdc +0 -270
- package/cursor-rules/05-bug-reports-and-features.mdc +0 -248
- package/cursor-rules/06-code-quality.mdc +0 -311
- package/cursor-rules/07-tech-stack-compliance.mdc +0 -216
- package/cursor-rules/10-error-handling-patterns.mdc +0 -179
- package/cursor-rules/11-performance-optimization.mdc +0 -169
- package/cursor-rules/12-ci-cd-integration.mdc +0 -150
- package/dist/DataTable-LRJL4IRV.js +0 -15
- package/dist/eslint-rules/rules/compliance.cjs +0 -348
- package/dist/eslint-rules/rules/components.cjs +0 -113
- package/dist/eslint-rules/rules/imports.cjs +0 -102
- package/docs/best-practices/README.md +0 -472
- package/docs/best-practices/accessibility.md +0 -604
- package/docs/best-practices/common-patterns.md +0 -516
- package/docs/best-practices/deployment.md +0 -1103
- package/docs/best-practices/performance.md +0 -1328
- package/docs/best-practices/security.md +0 -940
- package/docs/best-practices/testing.md +0 -1034
- package/docs/rbac/compliance/compliance-guide.md +0 -544
- package/docs/standards/01-standards-compliance.md +0 -188
- package/docs/standards/03-solid-principles.md +0 -39
- package/docs/standards/04-testing-standards.md +0 -36
- package/docs/standards/05-bug-reports-and-features.md +0 -27
- package/docs/standards/06-code-quality.md +0 -34
- package/docs/standards/07-tech-stack-compliance.md +0 -30
- package/docs/standards/10-error-handling-patterns.md +0 -401
- package/docs/standards/11-performance-optimization.md +0 -348
- package/docs/standards/12-ci-cd-integration.md +0 -370
- package/docs/standards/ALIGNMENT_REVIEW_SUMMARY.md +0 -192
- package/scripts/audit/audit-compliance.cjs +0 -1295
- package/scripts/audit/audit-components.cjs +0 -260
- package/scripts/audit/audit-rbac.cjs +0 -954
- package/scripts/audit/audit-standards.cjs +0 -1268
- package/scripts/audit/index.cjs +0 -1927
- package/src/components/DataTable/components/DataTableBody.tsx +0 -478
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
- package/src/components/DataTable/components/ExpandButton.tsx +0 -113
- package/src/components/DataTable/components/GroupHeader.tsx +0 -54
- package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
- package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
- package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
- package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
- package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
- package/src/components/DataTable/core/DataTableContext.tsx +0 -216
- package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
- package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
- package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
- package/src/components/DataTable/utils/debugTools.ts +0 -514
- package/src/eslint-rules/index.cjs +0 -22
- package/src/eslint-rules/rules/components.cjs +0 -113
- package/src/eslint-rules/rules/imports.cjs +0 -102
- package/src/eslint-rules/rules/rbac.cjs +0 -790
- package/src/eslint-rules/utils/helpers.cjs +0 -42
- package/src/eslint-rules/utils/manifest-loader.cjs +0 -75
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file Expand/Collapse Button Component for Hierarchical DataTable
|
|
3
|
-
* @package @jmruthers/pace-core
|
|
4
|
-
* @module Components/DataTable/Components/ExpandButton
|
|
5
|
-
* @since 0.4.35
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import React from 'react';
|
|
9
|
-
import { ChevronRightIcon, ChevronDownIcon } from 'lucide-react';
|
|
10
|
-
import type { ExpandButtonProps } from '../types';
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Default expand/collapse button component for hierarchical rows
|
|
14
|
-
*
|
|
15
|
-
* Provides a clean, accessible expand/collapse button with proper ARIA attributes
|
|
16
|
-
* and keyboard navigation support.
|
|
17
|
-
*/
|
|
18
|
-
export function ExpandButton({
|
|
19
|
-
rowId,
|
|
20
|
-
isExpanded,
|
|
21
|
-
hasChildren,
|
|
22
|
-
onClick,
|
|
23
|
-
className = '',
|
|
24
|
-
}: ExpandButtonProps) {
|
|
25
|
-
if (!hasChildren) {
|
|
26
|
-
return null;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const handleClick = (e: React.MouseEvent) => {
|
|
30
|
-
e.stopPropagation();
|
|
31
|
-
onClick();
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
const handleKeyDown = (e: React.KeyboardEvent) => {
|
|
35
|
-
if (e.key === 'Enter' || e.key === ' ') {
|
|
36
|
-
e.preventDefault();
|
|
37
|
-
e.stopPropagation();
|
|
38
|
-
onClick();
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
return (
|
|
43
|
-
<button
|
|
44
|
-
type="button"
|
|
45
|
-
onClick={handleClick}
|
|
46
|
-
onKeyDown={handleKeyDown}
|
|
47
|
-
className={`
|
|
48
|
-
inline-flex items-center justify-center w-6 h-6 rounded-sm
|
|
49
|
-
hover:bg-main-100 focus:bg-main-100 focus:outline-none focus:ring-2
|
|
50
|
-
focus:ring-main-500 focus:ring-offset-1 transition-colors duration-150
|
|
51
|
-
${className}
|
|
52
|
-
`}
|
|
53
|
-
aria-label={isExpanded ? 'Collapse row' : 'Expand row'}
|
|
54
|
-
aria-expanded={isExpanded}
|
|
55
|
-
data-testid={`expand-button-${rowId}`}
|
|
56
|
-
>
|
|
57
|
-
{isExpanded ? (
|
|
58
|
-
<ChevronDownIcon className="w-4 h-4 text-main-600" />
|
|
59
|
-
) : (
|
|
60
|
-
<ChevronRightIcon className="w-4 h-4 text-main-600" />
|
|
61
|
-
)}
|
|
62
|
-
</button>
|
|
63
|
-
);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Alternative expand button with different styling
|
|
68
|
-
*/
|
|
69
|
-
export function ExpandButtonMinimal({
|
|
70
|
-
rowId,
|
|
71
|
-
isExpanded,
|
|
72
|
-
hasChildren,
|
|
73
|
-
onClick,
|
|
74
|
-
className = '',
|
|
75
|
-
}: ExpandButtonProps) {
|
|
76
|
-
if (!hasChildren) {
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const handleClick = (e: React.MouseEvent) => {
|
|
81
|
-
e.stopPropagation();
|
|
82
|
-
onClick();
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
const handleKeyDown = (e: React.KeyboardEvent) => {
|
|
86
|
-
if (e.key === 'Enter' || e.key === ' ') {
|
|
87
|
-
e.preventDefault();
|
|
88
|
-
e.stopPropagation();
|
|
89
|
-
onClick();
|
|
90
|
-
}
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
return (
|
|
94
|
-
<button
|
|
95
|
-
type="button"
|
|
96
|
-
onClick={handleClick}
|
|
97
|
-
onKeyDown={handleKeyDown}
|
|
98
|
-
className={`
|
|
99
|
-
inline-flex items-center justify-center w-5 h-5 rounded
|
|
100
|
-
hover:bg-main-50 focus:bg-main-50 focus:outline-none
|
|
101
|
-
transition-colors duration-150 text-main-500
|
|
102
|
-
${className}
|
|
103
|
-
`}
|
|
104
|
-
aria-label={isExpanded ? 'Collapse row' : 'Expand row'}
|
|
105
|
-
aria-expanded={isExpanded}
|
|
106
|
-
data-testid={`expand-button-minimal-${rowId}`}
|
|
107
|
-
>
|
|
108
|
-
<span className="text-sm font-medium">
|
|
109
|
-
{isExpanded ? '−' : '+'}
|
|
110
|
-
</span>
|
|
111
|
-
</button>
|
|
112
|
-
);
|
|
113
|
-
}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { Row } from '@tanstack/react-table';
|
|
3
|
-
import { Button } from '../../Button/Button';
|
|
4
|
-
import { ChevronDown, ChevronRight } from 'lucide-react';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Props for the GroupHeader component.
|
|
8
|
-
* @template TData - The type of data records in the table
|
|
9
|
-
*/
|
|
10
|
-
interface GroupHeaderProps<TData> {
|
|
11
|
-
row: Row<TData>;
|
|
12
|
-
groupByColumn: string;
|
|
13
|
-
isExpanded: boolean;
|
|
14
|
-
onToggle: () => void;
|
|
15
|
-
subRowsCount: number;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Group header component for DataTable.
|
|
20
|
-
* Displays the group label and toggle button for expanding/collapsing grouped rows.
|
|
21
|
-
*
|
|
22
|
-
* @template TData - The type of data records in the table
|
|
23
|
-
* @param props - Group header configuration
|
|
24
|
-
* @returns The rendered group header
|
|
25
|
-
*/
|
|
26
|
-
export function GroupHeader<TData>({
|
|
27
|
-
row,
|
|
28
|
-
groupByColumn,
|
|
29
|
-
isExpanded,
|
|
30
|
-
onToggle,
|
|
31
|
-
subRowsCount
|
|
32
|
-
}: GroupHeaderProps<TData>) {
|
|
33
|
-
const groupValue = row.getValue(groupByColumn);
|
|
34
|
-
|
|
35
|
-
return (
|
|
36
|
-
<div className="flex items-center py-2 px-4 bg-muted/50 border-b font-medium">
|
|
37
|
-
<Button
|
|
38
|
-
variant="ghost"
|
|
39
|
-
size="sm"
|
|
40
|
-
onClick={onToggle}
|
|
41
|
-
className="p-0 h-auto mr-2"
|
|
42
|
-
>
|
|
43
|
-
{isExpanded ? (
|
|
44
|
-
<ChevronDown className="size-4" />
|
|
45
|
-
) : (
|
|
46
|
-
<ChevronRight className="size-4" />
|
|
47
|
-
)}
|
|
48
|
-
</Button>
|
|
49
|
-
<span className="text-sm">
|
|
50
|
-
{String(groupValue)} ({subRowsCount} items)
|
|
51
|
-
</span>
|
|
52
|
-
</div>
|
|
53
|
-
);
|
|
54
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file View Row Modal Component
|
|
3
|
-
* @package @jmruthers/pace-core
|
|
4
|
-
* @module Components/DataTable/Components
|
|
5
|
-
* @since 0.2.0
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import React from 'react';
|
|
9
|
-
import { Dialog, DialogContent, DialogHeader } from '../../Dialog/Dialog';
|
|
10
|
-
import { Button } from '../../Button/Button';
|
|
11
|
-
import { X } from 'lucide-react';
|
|
12
|
-
|
|
13
|
-
interface ViewRowModalProps<TData extends Record<string, any>> {
|
|
14
|
-
isOpen: boolean;
|
|
15
|
-
onClose: () => void;
|
|
16
|
-
data: TData | null;
|
|
17
|
-
title?: string;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export function ViewRowModal<TData extends Record<string, any>>({
|
|
21
|
-
isOpen,
|
|
22
|
-
onClose,
|
|
23
|
-
data,
|
|
24
|
-
title = "Row Details"
|
|
25
|
-
}: ViewRowModalProps<TData>) {
|
|
26
|
-
if (!data) return null;
|
|
27
|
-
|
|
28
|
-
return (
|
|
29
|
-
<Dialog open={isOpen} onOpenChange={onClose}>
|
|
30
|
-
<DialogContent className="max-w-2xl max-h-[80vh] overflow-y-auto" title={title}>
|
|
31
|
-
<DialogHeader>
|
|
32
|
-
<h2 className="flex items-center justify-between">
|
|
33
|
-
{title}
|
|
34
|
-
<Button
|
|
35
|
-
variant="ghost"
|
|
36
|
-
size="sm"
|
|
37
|
-
onClick={onClose}
|
|
38
|
-
className="size-6 p-0"
|
|
39
|
-
>
|
|
40
|
-
<X className="size-4" />
|
|
41
|
-
</Button>
|
|
42
|
-
</h2>
|
|
43
|
-
</DialogHeader>
|
|
44
|
-
|
|
45
|
-
<div className="mt-4">
|
|
46
|
-
<div className="grid gap-4">
|
|
47
|
-
{Object.entries(data).map(([key, value]) => (
|
|
48
|
-
<div key={key} className="grid grid-cols-1 md:grid-cols-3 gap-2">
|
|
49
|
-
<div className="font-medium text-sm text-app-sec-600 capitalize">
|
|
50
|
-
{key.replace(/([A-Z])/g, ' $1').trim()}:
|
|
51
|
-
</div>
|
|
52
|
-
<div className="md:col-span-2 text-sm">
|
|
53
|
-
{value instanceof Date ? value.toLocaleDateString() :
|
|
54
|
-
typeof value === 'object' && value !== null ? JSON.stringify(value, null, 2) :
|
|
55
|
-
String(value ?? '')}
|
|
56
|
-
</div>
|
|
57
|
-
</div>
|
|
58
|
-
))}
|
|
59
|
-
</div>
|
|
60
|
-
</div>
|
|
61
|
-
|
|
62
|
-
<div className="flex justify-end mt-6">
|
|
63
|
-
<Button onClick={onClose}>Close</Button>
|
|
64
|
-
</div>
|
|
65
|
-
</DialogContent>
|
|
66
|
-
</Dialog>
|
|
67
|
-
);
|
|
68
|
-
}
|