@sellmate/design-system-react 1.0.62 → 1.0.63

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/lib/SdTable.tsx DELETED
@@ -1,185 +0,0 @@
1
- 'use client';
2
-
3
- import React, { useEffect, useState } from 'react';
4
- import type { Row as SdTableRow, SdTableColumn } from '@sellmate/design-system';
5
- import { SdTable as SdTableElement, defineCustomElement as defineSdTable } from '@sellmate/design-system/dist/components/sd-table.js';
6
- import { createComponent, type EventName } from '@stencil/react-output-target/runtime';
7
-
8
- type TablePagination = {
9
- page: number;
10
- rowsPerPage: number;
11
- lastPage?: number;
12
- };
13
-
14
- type HeaderRenderContext = {
15
- column: SdTableColumn;
16
- };
17
-
18
- type CellRenderContext<RowType extends SdTableRow> = {
19
- column: SdTableColumn;
20
- row: RowType;
21
- rowIndex: number;
22
- value: any;
23
- };
24
-
25
- type HeaderRendererMap = Partial<Record<string, (context: HeaderRenderContext) => React.ReactNode>>;
26
- type CellRendererMap<RowType extends SdTableRow> = Partial<
27
- Record<string, (context: CellRenderContext<RowType>) => React.ReactNode>
28
- >;
29
-
30
- const SLOT_WRAPPER_STYLE: React.CSSProperties = {
31
- display: 'contents',
32
- };
33
-
34
- type SdTableBaseEvents = {
35
- onSdSelectChange: EventName<CustomEvent<SdTableRow[]>>;
36
- onSdPageChange: EventName<CustomEvent<number>>;
37
- onSdRowsPerPageChange: EventName<CustomEvent<number>>;
38
- };
39
-
40
- const SdTableBase = /* @__PURE__ */ createComponent<SdTableElement, SdTableBaseEvents>({
41
- tagName: 'sd-table',
42
- elementClass: SdTableElement,
43
- react: React,
44
- events: {
45
- onSdSelectChange: 'sdSelectChange',
46
- onSdPageChange: 'sdPageChange',
47
- onSdRowsPerPageChange: 'sdRowsPerPageChange',
48
- } as SdTableBaseEvents,
49
- defineCustomElement: defineSdTable,
50
- });
51
-
52
- const getCellValue = (column: SdTableColumn, row: SdTableRow) => {
53
- const { field, format, name } = column;
54
- const value = typeof field === 'function' ? field(row) : field ? row[field] : row[name];
55
- return format ? format(value, row) : value;
56
- };
57
-
58
- export type SdTableProps<RowType extends SdTableRow = SdTableRow> = Omit<
59
- React.ComponentProps<typeof SdTableBase>,
60
- 'columns' | 'rows' | 'selected' | 'children'
61
- > & {
62
- columns: SdTableColumn[];
63
- rows?: RowType[] | null;
64
- selected?: RowType[];
65
- pagination?: TablePagination;
66
- useInternalPagination?: boolean;
67
- headerRenderers?: HeaderRendererMap;
68
- cellRenderers?: CellRendererMap<RowType>;
69
- renderHeader?: (context: HeaderRenderContext) => React.ReactNode;
70
- renderCell?: (context: CellRenderContext<RowType>) => React.ReactNode;
71
- noDataContent?: React.ReactNode;
72
- };
73
-
74
- export function SdTable<RowType extends SdTableRow = SdTableRow>({
75
- columns,
76
- rows,
77
- selected,
78
- pagination,
79
- useInternalPagination = false,
80
- headerRenderers,
81
- cellRenderers,
82
- renderHeader,
83
- renderCell,
84
- noDataContent,
85
- onSdPageChange,
86
- onSdRowsPerPageChange,
87
- ...props
88
- }: SdTableProps<RowType>) {
89
- const normalizedRows = rows ?? [];
90
- const [currentPage, setCurrentPage] = useState(pagination?.page || 1);
91
- const [currentRowsPerPage, setCurrentRowsPerPage] = useState(
92
- pagination?.rowsPerPage || normalizedRows.length || 0,
93
- );
94
-
95
- useEffect(() => {
96
- setCurrentPage(pagination?.page || 1);
97
- setCurrentRowsPerPage(pagination?.rowsPerPage || normalizedRows.length || 0);
98
- }, [pagination?.page, pagination?.rowsPerPage, normalizedRows.length]);
99
-
100
- const renderedRows =
101
- useInternalPagination && currentRowsPerPage
102
- ? normalizedRows.slice(
103
- (currentPage - 1) * currentRowsPerPage,
104
- currentPage * currentRowsPerPage,
105
- )
106
- : normalizedRows;
107
-
108
- const slotChildren: React.ReactNode[] = [];
109
-
110
- if (noDataContent !== undefined) {
111
- slotChildren.push(
112
- <span key="no-data" slot="no-data" style={SLOT_WRAPPER_STYLE}>
113
- {noDataContent}
114
- </span>,
115
- );
116
- }
117
-
118
- columns.forEach(column => {
119
- const renderer = headerRenderers?.[column.name] || renderHeader;
120
- if (!renderer) return;
121
-
122
- const rendered = renderer({ column });
123
- if (rendered == null) return;
124
-
125
- slotChildren.push(
126
- <span
127
- key={`header-${column.name}`}
128
- slot={`header-cell-${column.name}`}
129
- style={SLOT_WRAPPER_STYLE}
130
- >
131
- {rendered}
132
- </span>,
133
- );
134
- });
135
-
136
- renderedRows.forEach((row, rowIndex) => {
137
- columns.forEach(column => {
138
- const renderer = cellRenderers?.[column.name] || renderCell;
139
- if (!renderer) return;
140
-
141
- const rendered = renderer({
142
- column,
143
- row,
144
- rowIndex,
145
- value: getCellValue(column, row),
146
- });
147
- if (rendered == null) return;
148
-
149
- slotChildren.push(
150
- <span
151
- key={`cell-${column.name}-${rowIndex}`}
152
- slot={`body-cell-${column.name}-${rowIndex}`}
153
- style={SLOT_WRAPPER_STYLE}
154
- >
155
- {rendered}
156
- </span>,
157
- );
158
- });
159
- });
160
-
161
- return (
162
- <SdTableBase
163
- {...props}
164
- columns={columns}
165
- rows={normalizedRows}
166
- selected={selected}
167
- pagination={pagination}
168
- useInternalPagination={useInternalPagination}
169
- onSdPageChange={event => {
170
- setCurrentPage(event.detail);
171
- onSdPageChange?.(event);
172
- }}
173
- onSdRowsPerPageChange={event => {
174
- setCurrentRowsPerPage(event.detail);
175
- const lastPage = Math.max(1, Math.ceil(normalizedRows.length / event.detail));
176
- setCurrentPage(previousPage => Math.min(previousPage, lastPage));
177
- onSdRowsPerPageChange?.(event);
178
- }}
179
- >
180
- {slotChildren}
181
- </SdTableBase>
182
- );
183
- }
184
-
185
- export default SdTable;