@public-ui/mcp 4.5.0-rc.4 → 4.5.0-rc.5
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/package.json +2 -2
- package/shared/sample-index.json +12 -12
- package/shared/template-index.json +79 -79
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@public-ui/mcp",
|
|
3
|
-
"version": "4.5.0-rc.
|
|
3
|
+
"version": "4.5.0-rc.5",
|
|
4
4
|
"license": "EUPL-1.2",
|
|
5
5
|
"homepage": "https://public-ui.github.io",
|
|
6
6
|
"repository": {
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"glob": "13.0.6",
|
|
49
49
|
"simple-git": "3.36.0",
|
|
50
50
|
"zod": "4.6.5",
|
|
51
|
-
"@public-ui/components": "4.5.0-rc.
|
|
51
|
+
"@public-ui/components": "4.5.0-rc.5"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
54
|
"@modelcontextprotocol/inspector": "2.9.0",
|
package/shared/sample-index.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"metadata": {
|
|
3
|
-
"generatedAt": "2026-10-
|
|
3
|
+
"generatedAt": "2026-10-06T13:52:06.167Z",
|
|
4
4
|
"buildMode": "ci",
|
|
5
5
|
"counts": {
|
|
6
6
|
"total": 341,
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"totalScenarios": 20
|
|
11
11
|
},
|
|
12
12
|
"repo": {
|
|
13
|
-
"commit": "
|
|
13
|
+
"commit": "c8c411be1b515cc1f67263845b66a987ce27b5d4",
|
|
14
14
|
"branch": "develop",
|
|
15
15
|
"repoUrl": "https://github.com/public-ui/kolibri"
|
|
16
16
|
}
|
|
@@ -1725,7 +1725,7 @@
|
|
|
1725
1725
|
"group": "table",
|
|
1726
1726
|
"name": "action-and-render",
|
|
1727
1727
|
"path": "packages/samples/react/src/components/table/action-render.tsx",
|
|
1728
|
-
"code": "import type { KoliBriTableCell, KoliBriTableHeaderCellWithLogic } from '@public-ui/components';\nimport { KolTableStateful } from '@public-ui/react-v19';\nimport type { FC } from 'react';\nimport React from 'react';\nimport { SampleDescription } from '../SampleDescription';\n\ntype ProjectTask = {\n\tid: string;\n\tproject: string;\n\towner: string;\n\treact: string;\n};\n\nconst HEADERS: { horizontal: KoliBriTableHeaderCellWithLogic[][] } = {\n\thorizontal: [\n\t\t[\n\t\t\t{ key: 'project', label: 'Project' },\n\t\t\t{ key: 'owner', label: 'Owner', width: 140 },\n\t\t\t{\n\t\t\t\tlabel: 'ID',\n\t\t\t\tkey: 'id',\n\t\t\t\twidth: 100,\n\n\t\t\t\trender: (_el, cell: KoliBriTableCell) => {\n\t\t\t\t\tconst { label } = cell as { label: string };\n\t\t\t\t\treturn `Index: ${label}`;\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'action',\n\t\t\t\tkey: 'actions',\n\t\t\t\tlabel: 'Actions',\n\t\t\t\twidth: 100,\n\t\t\t\tactions: (row) => {\n\t\t\t\t\tconst simpleRow = row as ProjectTask;\n\t\t\t\t\treturn [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t_label: 'Details',\n\t\t\t\t\t\t\t_icons: 'kolicon-eye',\n\t\t\t\t\t\t\t_hideLabel: true,\n\t\t\t\t\t\t\t_on: {\n\t\t\t\t\t\t\t\tonClick: () => alert(`Details: ${simpleRow.id} - ${simpleRow.project}`),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t],\n};\n\nconst DATA: ProjectTask[] = [\n\t{\n\t\tid: 'T-01',\n\t\tproject: 'Onboarding checklist',\n\t\towner: 'Alex Rivera',\n\t\treact: 'test',\n\t},\n\t{\n\t\tid: 'T-02',\n\t\tproject: 'Accessibility audit',\n\t\towner: 'Jamie Chen',\n\t\treact: 'test',\n\t},\n];\n\nexport const TableActionAndRenderColumns: FC = () => (\n\t<>\n\t\t<SampleDescription>\n\t\t\t<p>\n\t\t\t\tSimple example using the refactored action column: Actions are defined once in the column header definition using a factory function. Two rows with\n\t\t\t\tinline action buttons demonstrate clean separation between data and UI behavior.\n\t\t\t</p>\n\t\t</SampleDescription>\n\n\t\t<section className=\"w-full\">\n\t\t\t<KolTableStateful _label=\"Tasks with action buttons\" _headers={HEADERS} _data={DATA} className=\"block\" _hasSettingsMenu />\n\t\t</section>\n\t</>\n);\n",
|
|
1728
|
+
"code": "import type { KoliBriTableCell, KoliBriTableHeaderCellWithLogic } from '@public-ui/components';\nimport { KolTableStateful } from '@public-ui/react-v19';\nimport type { FC } from 'react';\nimport React from 'react';\nimport { SampleDescription } from '../SampleDescription';\n\ntype ProjectTask = {\n\tid: string;\n\tproject: string;\n\towner: string;\n\treact: string;\n};\n\nconst HEADERS: { horizontal: KoliBriTableHeaderCellWithLogic[][] } = {\n\thorizontal: [\n\t\t[\n\t\t\t{ key: 'project', label: 'Project', width: 200 },\n\t\t\t{ key: 'owner', label: 'Owner', width: 140 },\n\t\t\t{\n\t\t\t\tlabel: 'ID',\n\t\t\t\tkey: 'id',\n\t\t\t\twidth: 100,\n\n\t\t\t\trender: (_el, cell: KoliBriTableCell) => {\n\t\t\t\t\tconst { label } = cell as { label: string };\n\t\t\t\t\treturn `Index: ${label}`;\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'action',\n\t\t\t\tkey: 'actions',\n\t\t\t\tlabel: 'Actions',\n\t\t\t\twidth: 100,\n\t\t\t\tactions: (row) => {\n\t\t\t\t\tconst simpleRow = row as ProjectTask;\n\t\t\t\t\treturn [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t_label: 'Details',\n\t\t\t\t\t\t\t_icons: 'kolicon-eye',\n\t\t\t\t\t\t\t_hideLabel: true,\n\t\t\t\t\t\t\t_on: {\n\t\t\t\t\t\t\t\tonClick: () => alert(`Details: ${simpleRow.id} - ${simpleRow.project}`),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t],\n};\n\nconst DATA: ProjectTask[] = [\n\t{\n\t\tid: 'T-01',\n\t\tproject: 'Onboarding checklist',\n\t\towner: 'Alex Rivera',\n\t\treact: 'test',\n\t},\n\t{\n\t\tid: 'T-02',\n\t\tproject: 'Accessibility audit',\n\t\towner: 'Jamie Chen',\n\t\treact: 'test',\n\t},\n];\n\nexport const TableActionAndRenderColumns: FC = () => (\n\t<>\n\t\t<SampleDescription>\n\t\t\t<p>\n\t\t\t\tSimple example using the refactored action column: Actions are defined once in the column header definition using a factory function. Two rows with\n\t\t\t\tinline action buttons demonstrate clean separation between data and UI behavior.\n\t\t\t</p>\n\t\t</SampleDescription>\n\n\t\t<section className=\"w-full\">\n\t\t\t<KolTableStateful _label=\"Tasks with action buttons\" _headers={HEADERS} _data={DATA} className=\"block\" _hasSettingsMenu />\n\t\t</section>\n\t</>\n);\n",
|
|
1729
1729
|
"kind": "sample"
|
|
1730
1730
|
},
|
|
1731
1731
|
{
|
|
@@ -1733,7 +1733,7 @@
|
|
|
1733
1733
|
"group": "table",
|
|
1734
1734
|
"name": "action-columns",
|
|
1735
1735
|
"path": "packages/samples/react/src/components/table/action-columns.tsx",
|
|
1736
|
-
"code": "import type { KoliBriTableHeaderCellWithLogic } from '@public-ui/components';\nimport { KolTableStateful } from '@public-ui/react-v19';\nimport type { FC } from 'react';\nimport React from 'react';\nimport { SampleBlock } from '../SampleBlock';\nimport { SampleDescription } from '../SampleDescription';\n\ntype ProjectTask = {\n\tid: string;\n\tproject: string;\n\towner: string;\n};\n\nconst HEADERS: { horizontal: KoliBriTableHeaderCellWithLogic[][] } = {\n\thorizontal: [\n\t\t[\n\t\t\t{ key: 'id', label: 'ID', width: 80 },\n\t\t\t{ key: 'project', label: 'Project' },\n\t\t\t{ key: 'owner', label: 'Owner', width: 140 },\n\t\t\t{\n\t\t\t\ttype: 'action',\n\t\t\t\tkey: 'actions',\n\t\t\t\tlabel: 'Actions',\n\t\t\t\ttextAlign: 'left',\n\t\t\t\twidth: 250,\n\t\t\t\tactions: (row) => {\n\t\t\t\t\tconst simpleRow = row as ProjectTask;\n\t\t\t\t\treturn [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t_label: 'Details',\n\t\t\t\t\t\t\t_icons: 'kolicon-eye',\n\t\t\t\t\t\t\t_hideLabel: true,\n\t\t\t\t\t\t\t_on: {\n\t\t\t\t\t\t\t\tonClick: () => alert(`Details: ${simpleRow.id} - ${simpleRow.project}`),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t_label: 'Start',\n\t\t\t\t\t\t\t_icons: 'kolicon-chevron-right',\n\t\t\t\t\t\t\t_variant: 'secondary',\n\t\t\t\t\t\t\t_on: {\n\t\t\t\t\t\t\t\tonClick: () => alert(`Start task ${simpleRow.id}`),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'link',\n\t\t\t\t\t\t\t_label: 'View',\n\t\t\t\t\t\t\t_href: `#/back-page?taskId=${simpleRow.id}`,\n\t\t\t\t\t\t\t_target: '_blank',\n\t\t\t\t\t\t\t_icons: 'kolicon-external-link',\n\t\t\t\t\t\t\t_hideLabel: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'action',\n\t\t\t\tkey: 'externalActions',\n\t\t\t\tlabel: 'External Actions',\n\t\t\t\ttextAlign: 'right',\n\t\t\t\twidth: 280,\n\t\t\t\tactions: (row) => {\n\t\t\t\t\tconst simpleRow = row as ProjectTask;\n\t\t\t\t\treturn [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'link',\n\t\t\t\t\t\t\t_label: 'View on Dashboard',\n\t\t\t\t\t\t\t_href: `#/back-page?taskId=${simpleRow.id}`,\n\t\t\t\t\t\t\t_target: '_blank',\n\t\t\t\t\t\t\t_icons: 'kolicon-external-link',\n\t\t\t\t\t\t\t_hideLabel: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t],\n};\n\nconst DATA: ProjectTask[] = [\n\t{\n\t\tid: 'T-01',\n\t\tproject: 'Onboarding checklist',\n\t\towner: 'Alex Rivera',\n\t},\n\t{\n\t\tid: 'T-02',\n\t\tproject: 'Accessibility audit',\n\t\towner: 'Jamie Chen',\n\t},\n];\n\nexport const TableActionColumns: FC = () => (\n\t<>\n\t\t<SampleDescription>\n\t\t\t<p>\n\t\t\t\tSimple example using the refactored action column: Actions are defined once in the column header definition using a factory function. Two rows with\n\t\t\t\tinline action buttons demonstrate clean separation between data and UI behavior.\n\t\t\t</p>\n\t\t</SampleDescription>\n\n\t\t<SampleBlock id=\"action-columns\" className=\"w-full\">\n\t\t\t<KolTableStateful _label=\"Tasks with action buttons\" _headers={HEADERS} _data={DATA} className=\"block\" />\n\t\t</SampleBlock>\n\t</>\n);\n",
|
|
1736
|
+
"code": "import type { KoliBriTableHeaderCellWithLogic } from '@public-ui/components';\nimport { KolTableStateful } from '@public-ui/react-v19';\nimport type { FC } from 'react';\nimport React from 'react';\nimport { SampleBlock } from '../SampleBlock';\nimport { SampleDescription } from '../SampleDescription';\n\ntype ProjectTask = {\n\tid: string;\n\tproject: string;\n\towner: string;\n};\n\nconst HEADERS: { horizontal: KoliBriTableHeaderCellWithLogic[][] } = {\n\thorizontal: [\n\t\t[\n\t\t\t{ key: 'id', label: 'ID', width: 80 },\n\t\t\t{ key: 'project', label: 'Project', width: 200 },\n\t\t\t{ key: 'owner', label: 'Owner', width: 140 },\n\t\t\t{\n\t\t\t\ttype: 'action',\n\t\t\t\tkey: 'actions',\n\t\t\t\tlabel: 'Actions',\n\t\t\t\ttextAlign: 'left',\n\t\t\t\twidth: 250,\n\t\t\t\tactions: (row) => {\n\t\t\t\t\tconst simpleRow = row as ProjectTask;\n\t\t\t\t\treturn [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t_label: 'Details',\n\t\t\t\t\t\t\t_icons: 'kolicon-eye',\n\t\t\t\t\t\t\t_hideLabel: true,\n\t\t\t\t\t\t\t_on: {\n\t\t\t\t\t\t\t\tonClick: () => alert(`Details: ${simpleRow.id} - ${simpleRow.project}`),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t_label: 'Start',\n\t\t\t\t\t\t\t_icons: 'kolicon-chevron-right',\n\t\t\t\t\t\t\t_variant: 'secondary',\n\t\t\t\t\t\t\t_on: {\n\t\t\t\t\t\t\t\tonClick: () => alert(`Start task ${simpleRow.id}`),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'link',\n\t\t\t\t\t\t\t_label: 'View',\n\t\t\t\t\t\t\t_href: `#/back-page?taskId=${simpleRow.id}`,\n\t\t\t\t\t\t\t_target: '_blank',\n\t\t\t\t\t\t\t_icons: 'kolicon-external-link',\n\t\t\t\t\t\t\t_hideLabel: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'action',\n\t\t\t\tkey: 'externalActions',\n\t\t\t\tlabel: 'External Actions',\n\t\t\t\ttextAlign: 'right',\n\t\t\t\twidth: 280,\n\t\t\t\tactions: (row) => {\n\t\t\t\t\tconst simpleRow = row as ProjectTask;\n\t\t\t\t\treturn [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'link',\n\t\t\t\t\t\t\t_label: 'View on Dashboard',\n\t\t\t\t\t\t\t_href: `#/back-page?taskId=${simpleRow.id}`,\n\t\t\t\t\t\t\t_target: '_blank',\n\t\t\t\t\t\t\t_icons: 'kolicon-external-link',\n\t\t\t\t\t\t\t_hideLabel: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t],\n};\n\nconst DATA: ProjectTask[] = [\n\t{\n\t\tid: 'T-01',\n\t\tproject: 'Onboarding checklist',\n\t\towner: 'Alex Rivera',\n\t},\n\t{\n\t\tid: 'T-02',\n\t\tproject: 'Accessibility audit',\n\t\towner: 'Jamie Chen',\n\t},\n];\n\nexport const TableActionColumns: FC = () => (\n\t<>\n\t\t<SampleDescription>\n\t\t\t<p>\n\t\t\t\tSimple example using the refactored action column: Actions are defined once in the column header definition using a factory function. Two rows with\n\t\t\t\tinline action buttons demonstrate clean separation between data and UI behavior.\n\t\t\t</p>\n\t\t</SampleDescription>\n\n\t\t<SampleBlock id=\"action-columns\" className=\"w-full\">\n\t\t\t<KolTableStateful _label=\"Tasks with action buttons\" _headers={HEADERS} _data={DATA} className=\"block\" />\n\t\t</SampleBlock>\n\t</>\n);\n",
|
|
1737
1737
|
"kind": "sample"
|
|
1738
1738
|
},
|
|
1739
1739
|
{
|
|
@@ -1741,7 +1741,7 @@
|
|
|
1741
1741
|
"group": "table",
|
|
1742
1742
|
"name": "action-columns-performance",
|
|
1743
1743
|
"path": "packages/samples/react/src/components/table/action-columns-performance.tsx",
|
|
1744
|
-
"code": "import type { KoliBriTableDataType, KoliBriTableHeaderCellWithLogic } from '@public-ui/components';\nimport { KolTableStateful } from '@public-ui/react-v19';\nimport type { FC } from 'react';\nimport React from 'react';\nimport { SampleDescription } from '../SampleDescription';\n\nconst ROWS_COUNT = 50;\n\ntype DataRow = {\n\tid: number;\n\tname: string;\n\temail: string;\n\tstatus: string;\n};\n\nconst FIRST_NAMES = [\n\t'Max',\n\t'Erika',\n\t'John',\n\t'Jane',\n\t'Peter',\n\t'Anna',\n\t'Michael',\n\t'Sarah',\n\t'Thomas',\n\t'Lisa',\n\t'Daniel',\n\t'Maria',\n\t'Christian',\n\t'Laura',\n\t'Stefan',\n\t'Julia',\n\t'Andreas',\n\t'Sophie',\n\t'Markus',\n\t'Emma',\n];\nconst LAST_NAMES = [\n\t'Mustermann',\n\t'Musterfrau',\n\t'Doe',\n\t'Smith',\n\t'Schmidt',\n\t'Müller',\n\t'Weber',\n\t'Meyer',\n\t'Wagner',\n\t'Becker',\n\t'Fischer',\n\t'Schneider',\n\t'Hoffmann',\n\t'Koch',\n\t'Bauer',\n\t'Richter',\n\t'Klein',\n\t'Wolf',\n\t'Schröder',\n\t'Neumann',\n];\nconst STATUSES = ['active', 'inactive', 'pending'];\n\nconst generateData = (count: number): DataRow[] => {\n\treturn Array.from({ length: count }, (_, i) => {\n\t\tconst firstName = FIRST_NAMES[i % FIRST_NAMES.length];\n\t\tconst lastName = LAST_NAMES[Math.floor(i / FIRST_NAMES.length) % LAST_NAMES.length];\n\t\tconst status = STATUSES[i % STATUSES.length];\n\t\tconst id = i + 1;\n\n\t\treturn {\n\t\t\tid,\n\t\t\tname: `${firstName} ${lastName}`,\n\t\t\temail: `${firstName.toLowerCase()}.${lastName.toLowerCase()}${id > 20 ? id : ''}@example.com`,\n\t\t\tstatus,\n\t\t};\n\t});\n};\n\nconst DATA: DataRow[] = generateData(ROWS_COUNT);\n\nconst HEADERS: { horizontal: KoliBriTableHeaderCellWithLogic[][] } = {\n\thorizontal: [\n\t\t[\n\t\t\t{\n\t\t\t\tkey: 'id',\n\t\t\t\tlabel: 'ID',\n\t\t\t\ttextAlign: 'left',\n\t\t\t\twidth: 60,\n\t\t\t\tcompareFn: (data0: KoliBriTableDataType, data1: KoliBriTableDataType) => (data0 as unknown as DataRow).id - (data1 as unknown as DataRow).id,\n\t\t\t\tsortDirection: 'ASC',\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: 'name',\n\t\t\t\tlabel: 'Name',\n\t\t\t\ttextAlign: 'left',\n\t\t\t\tcompareFn: (data0: KoliBriTableDataType, data1: KoliBriTableDataType) =>\n\t\t\t\t\t(data0 as unknown as DataRow).name.localeCompare((data1 as unknown as DataRow).name, 'de'),\n\t\t\t\tsortDirection: 'ASC',\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: 'email',\n\t\t\t\tlabel: 'E-Mail',\n\t\t\t\ttextAlign: 'left',\n\t\t\t\tcompareFn: (data0: KoliBriTableDataType, data1: KoliBriTableDataType) =>\n\t\t\t\t\t(data0 as unknown as DataRow).email.localeCompare((data1 as unknown as DataRow).email, 'de'),\n\t\t\t\tsortDirection: 'ASC',\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: 'status',\n\t\t\t\tlabel: 'Status',\n\t\t\t\ttextAlign: 'center',\n\t\t\t\twidth: 100,\n\t\t\t\tcompareFn: (data0: KoliBriTableDataType, data1: KoliBriTableDataType) =>\n\t\t\t\t\t(data0 as unknown as DataRow).status.localeCompare((data1 as unknown as DataRow).status, 'de'),\n\t\t\t\tsortDirection: 'ASC',\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'action',\n\t\t\t\tkey: 'actions',\n\t\t\t\tlabel: 'Aktionen',\n\t\t\t\ttextAlign: 'center',\n\t\t\t\twidth: 180,\n\t\t\t\tactions: (row) => {\n\t\t\t\t\tconst dataRow = row as unknown as DataRow;\n\t\t\t\t\treturn [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t_label: 'Bearbeiten',\n\t\t\t\t\t\t\t_icons: 'kolicon-eye',\n\t\t\t\t\t\t\t_hideLabel: true,\n\t\t\t\t\t\t\t_tooltipAlign: 'top',\n\t\t\t\t\t\t\t_variant: 'secondary',\n\t\t\t\t\t\t\t_on: {\n\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\tconsole.log('Edit clicked for:', dataRow);\n\t\t\t\t\t\t\t\t\talert(`Bearbeiten: ${dataRow.name}`);\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t_label: 'Löschen',\n\t\t\t\t\t\t\t_icons: 'kolicon-alert-error',\n\t\t\t\t\t\t\t_hideLabel: true,\n\t\t\t\t\t\t\t_tooltipAlign: 'top',\n\t\t\t\t\t\t\t_variant: 'danger',\n\t\t\t\t\t\t\t_on: {\n\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\tconsole.log('Delete clicked for:', dataRow);\n\t\t\t\t\t\t\t\t\talert(`Löschen: ${dataRow.name}`);\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t_label: 'Details anzeigen',\n\t\t\t\t\t\t\t_icons: 'kolicon-alert-info',\n\t\t\t\t\t\t\t_hideLabel: true,\n\t\t\t\t\t\t\t_tooltipAlign: 'top',\n\t\t\t\t\t\t\t_variant: 'normal',\n\t\t\t\t\t\t\t_on: {\n\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\tconsole.log('Details clicked for:', dataRow);\n\t\t\t\t\t\t\t\t\talert(`Details: ${JSON.stringify(dataRow, null, 2)}`);\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t],\n};\n\nexport const TableActionColumnPerformance: FC = () => (\n\t<>\n\t\t<SampleDescription>\n\t\t\t<p>\n\t\t\t\tPerformance demo: {ROWS_COUNT} rows with action buttons defined once in the column header using the refactored approach. The factory function generates\n\t\t\t\tactions for each row on demand, eliminating redundant data and improving maintainability.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tActions stay type-safe with <code>ActionColumnPropType</code> (ButtonProps or LinkProps), and no custom render functions are needed.\n\t\t\t</p>\n\t\t</SampleDescription>\n\n\t\t<section className=\"w-full\">\n\t\t\t<KolTableStateful _label=\"Benutzerverwaltung mit Action-Spalte\" _headers={HEADERS} _data={DATA} className=\"block\" />\n\t\t</section>\n\t</>\n);\n",
|
|
1744
|
+
"code": "import type { KoliBriTableDataType, KoliBriTableHeaderCellWithLogic } from '@public-ui/components';\nimport { KolTableStateful } from '@public-ui/react-v19';\nimport type { FC } from 'react';\nimport React from 'react';\nimport { SampleDescription } from '../SampleDescription';\n\nconst ROWS_COUNT = 50;\n\ntype DataRow = {\n\tid: number;\n\tname: string;\n\temail: string;\n\tstatus: string;\n};\n\nconst FIRST_NAMES = [\n\t'Max',\n\t'Erika',\n\t'John',\n\t'Jane',\n\t'Peter',\n\t'Anna',\n\t'Michael',\n\t'Sarah',\n\t'Thomas',\n\t'Lisa',\n\t'Daniel',\n\t'Maria',\n\t'Christian',\n\t'Laura',\n\t'Stefan',\n\t'Julia',\n\t'Andreas',\n\t'Sophie',\n\t'Markus',\n\t'Emma',\n];\nconst LAST_NAMES = [\n\t'Mustermann',\n\t'Musterfrau',\n\t'Doe',\n\t'Smith',\n\t'Schmidt',\n\t'Müller',\n\t'Weber',\n\t'Meyer',\n\t'Wagner',\n\t'Becker',\n\t'Fischer',\n\t'Schneider',\n\t'Hoffmann',\n\t'Koch',\n\t'Bauer',\n\t'Richter',\n\t'Klein',\n\t'Wolf',\n\t'Schröder',\n\t'Neumann',\n];\nconst STATUSES = ['active', 'inactive', 'pending'];\n\nconst generateData = (count: number): DataRow[] => {\n\treturn Array.from({ length: count }, (_, i) => {\n\t\tconst firstName = FIRST_NAMES[i % FIRST_NAMES.length];\n\t\tconst lastName = LAST_NAMES[Math.floor(i / FIRST_NAMES.length) % LAST_NAMES.length];\n\t\tconst status = STATUSES[i % STATUSES.length];\n\t\tconst id = i + 1;\n\n\t\treturn {\n\t\t\tid,\n\t\t\tname: `${firstName} ${lastName}`,\n\t\t\temail: `${firstName.toLowerCase()}.${lastName.toLowerCase()}${id > 20 ? id : ''}@example.com`,\n\t\t\tstatus,\n\t\t};\n\t});\n};\n\nconst DATA: DataRow[] = generateData(ROWS_COUNT);\n\nconst HEADERS: { horizontal: KoliBriTableHeaderCellWithLogic[][] } = {\n\thorizontal: [\n\t\t[\n\t\t\t{\n\t\t\t\tkey: 'id',\n\t\t\t\tlabel: 'ID',\n\t\t\t\ttextAlign: 'left',\n\t\t\t\twidth: 60,\n\t\t\t\tcompareFn: (data0: KoliBriTableDataType, data1: KoliBriTableDataType) => (data0 as unknown as DataRow).id - (data1 as unknown as DataRow).id,\n\t\t\t\tsortDirection: 'ASC',\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: 'name',\n\t\t\t\tlabel: 'Name',\n\t\t\t\ttextAlign: 'left',\n\t\t\t\tcompareFn: (data0: KoliBriTableDataType, data1: KoliBriTableDataType) =>\n\t\t\t\t\t(data0 as unknown as DataRow).name.localeCompare((data1 as unknown as DataRow).name, 'de'),\n\t\t\t\tsortDirection: 'ASC',\n\t\t\t\twidth: 250,\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: 'email',\n\t\t\t\tlabel: 'E-Mail',\n\t\t\t\ttextAlign: 'left',\n\t\t\t\tcompareFn: (data0: KoliBriTableDataType, data1: KoliBriTableDataType) =>\n\t\t\t\t\t(data0 as unknown as DataRow).email.localeCompare((data1 as unknown as DataRow).email, 'de'),\n\t\t\t\tsortDirection: 'ASC',\n\t\t\t\twidth: 350,\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: 'status',\n\t\t\t\tlabel: 'Status',\n\t\t\t\ttextAlign: 'center',\n\t\t\t\twidth: 100,\n\t\t\t\tcompareFn: (data0: KoliBriTableDataType, data1: KoliBriTableDataType) =>\n\t\t\t\t\t(data0 as unknown as DataRow).status.localeCompare((data1 as unknown as DataRow).status, 'de'),\n\t\t\t\tsortDirection: 'ASC',\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'action',\n\t\t\t\tkey: 'actions',\n\t\t\t\tlabel: 'Aktionen',\n\t\t\t\ttextAlign: 'center',\n\t\t\t\twidth: 180,\n\t\t\t\tactions: (row) => {\n\t\t\t\t\tconst dataRow = row as unknown as DataRow;\n\t\t\t\t\treturn [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t_label: 'Bearbeiten',\n\t\t\t\t\t\t\t_icons: 'kolicon-eye',\n\t\t\t\t\t\t\t_hideLabel: true,\n\t\t\t\t\t\t\t_tooltipAlign: 'top',\n\t\t\t\t\t\t\t_variant: 'secondary',\n\t\t\t\t\t\t\t_on: {\n\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\tconsole.log('Edit clicked for:', dataRow);\n\t\t\t\t\t\t\t\t\talert(`Bearbeiten: ${dataRow.name}`);\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t_label: 'Löschen',\n\t\t\t\t\t\t\t_icons: 'kolicon-alert-error',\n\t\t\t\t\t\t\t_hideLabel: true,\n\t\t\t\t\t\t\t_tooltipAlign: 'top',\n\t\t\t\t\t\t\t_variant: 'danger',\n\t\t\t\t\t\t\t_on: {\n\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\tconsole.log('Delete clicked for:', dataRow);\n\t\t\t\t\t\t\t\t\talert(`Löschen: ${dataRow.name}`);\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'button',\n\t\t\t\t\t\t\t_label: 'Details anzeigen',\n\t\t\t\t\t\t\t_icons: 'kolicon-alert-info',\n\t\t\t\t\t\t\t_hideLabel: true,\n\t\t\t\t\t\t\t_tooltipAlign: 'top',\n\t\t\t\t\t\t\t_variant: 'normal',\n\t\t\t\t\t\t\t_on: {\n\t\t\t\t\t\t\t\tonClick: () => {\n\t\t\t\t\t\t\t\t\tconsole.log('Details clicked for:', dataRow);\n\t\t\t\t\t\t\t\t\talert(`Details: ${JSON.stringify(dataRow, null, 2)}`);\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t];\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t],\n};\n\nexport const TableActionColumnPerformance: FC = () => (\n\t<>\n\t\t<SampleDescription>\n\t\t\t<p>\n\t\t\t\tPerformance demo: {ROWS_COUNT} rows with action buttons defined once in the column header using the refactored approach. The factory function generates\n\t\t\t\tactions for each row on demand, eliminating redundant data and improving maintainability.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\tActions stay type-safe with <code>ActionColumnPropType</code> (ButtonProps or LinkProps), and no custom render functions are needed.\n\t\t\t</p>\n\t\t</SampleDescription>\n\n\t\t<section className=\"w-full\">\n\t\t\t<KolTableStateful _label=\"Benutzerverwaltung mit Action-Spalte\" _headers={HEADERS} _data={DATA} className=\"block\" />\n\t\t</section>\n\t</>\n);\n",
|
|
1745
1745
|
"kind": "sample"
|
|
1746
1746
|
},
|
|
1747
1747
|
{
|
|
@@ -1821,7 +1821,7 @@
|
|
|
1821
1821
|
"group": "table",
|
|
1822
1822
|
"name": "multi-sort",
|
|
1823
1823
|
"path": "packages/samples/react/src/components/table/multi-sort.tsx",
|
|
1824
|
-
"code": "import type { FC } from 'react';\nimport React, { useState } from 'react';\n\nimport type { KoliBriTableDataType, KoliBriTableHeaderCellWithLogic, KoliBriTableHeaders } from '@public-ui/components';\nimport { KolButtonLink, KolTableStateful } from '@public-ui/react-v19';\nimport { SampleBlock } from '../SampleBlock';\nimport { SampleDescription } from '../SampleDescription';\n\nconst DATE_FORMATTER = Intl.DateTimeFormat('de-DE', {\n\tday: '2-digit',\n\tmonth: '2-digit',\n\tyear: 'numeric',\n});\n\ntype BacklogEntry = {\n\tdate: Date;\n\tassignee: string;\n\tdepartment: string;\n\tpriority: 'High' | 'Medium' | 'Low';\n\tstatus: 'Blocked' | 'In progress' | 'Ready';\n\topenTickets: number;\n};\n\nconst ASSIGNEES = ['Devon Chen', 'Fatima Alvi', 'Leon Köhler', 'Mila Schmidt', 'Sven Lindholm'];\nconst DEPARTMENTS = ['Customer Service', 'Digital Services', 'Infrastructure', 'Municipal Office'];\nconst PRIORITY_SEQUENCE: BacklogEntry['priority'][] = ['High', 'Medium', 'Low'];\nconst STATUS_SEQUENCE: BacklogEntry['status'][] = ['Blocked', 'In progress', 'Ready'];\n\nconst PRIORITY_ORDER = PRIORITY_SEQUENCE.reduce<Record<BacklogEntry['priority'], number>>(\n\t(order, priority, index) => {\n\t\torder[priority] = index;\n\t\treturn order;\n\t},\n\t{} as Record<BacklogEntry['priority'], number>,\n);\n\nconst STATUS_ORDER = STATUS_SEQUENCE.reduce<Record<BacklogEntry['status'], number>>(\n\t(order, status, index) => {\n\t\torder[status] = index;\n\t\treturn order;\n\t},\n\t{} as Record<BacklogEntry['status'], number>,\n);\n\nconst BACKLOG_DATA: BacklogEntry[] = Array.from({ length: 15 }).map((_, index) => ({\n\tdate: new Date(Date.now() - index * 1000 * 60 * 60 * 24),\n\tassignee: ASSIGNEES[index % ASSIGNEES.length],\n\tdepartment: DEPARTMENTS[index % DEPARTMENTS.length],\n\tpriority: PRIORITY_SEQUENCE[index % PRIORITY_SEQUENCE.length],\n\tstatus: STATUS_SEQUENCE[index % STATUS_SEQUENCE.length],\n\topenTickets: (index * 3) % 11,\n}));\n\nconst TABLE_HEADER_CELLS: KoliBriTableHeaderCellWithLogic[] = [\n\t{\n\t\tlabel: 'Assignee',\n\t\tkey: 'assignee',\n\n\t\tcompareFn: (data0: KoliBriTableDataType, data1: KoliBriTableDataType) =>\n\t\t\t(data0 as BacklogEntry).assignee.localeCompare((data1 as BacklogEntry).assignee, 'de'),\n\t\tsortDirection: 'ASC',\n\t},\n\t{\n\t\tlabel: 'Department',\n\t\tkey: 'department',\n\n\t\tcompareFn: (data0: KoliBriTableDataType, data1: KoliBriTableDataType) =>\n\t\t\t(data0 as BacklogEntry).department.localeCompare((data1 as BacklogEntry).department, 'de'),\n\t},\n\t{\n\t\tlabel: 'Priority',\n\t\tkey: 'priority',\n\n\t\ttextAlign: 'center',\n\t\tcompareFn: (data0: KoliBriTableDataType, data1: KoliBriTableDataType) =>\n\t\t\tPRIORITY_ORDER[(data0 as BacklogEntry).priority] - PRIORITY_ORDER[(data1 as BacklogEntry).priority],\n\t\tsortDirection: 'DESC',\n\t},\n\t{\n\t\tlabel: 'Status',\n\t\tkey: 'status',\n\n\t\ttextAlign: 'center',\n\t\tcompareFn: (data0: KoliBriTableDataType, data1: KoliBriTableDataType) =>\n\t\t\tSTATUS_ORDER[(data0 as BacklogEntry).status] - STATUS_ORDER[(data1 as BacklogEntry).status],\n\t},\n\t{\n\t\tlabel: 'Open tickets',\n\t\tkey: 'openTickets',\n\n\t\ttextAlign: 'right',\n\t\tcompareFn: (data0: KoliBriTableDataType, data1: KoliBriTableDataType) => (data0 as BacklogEntry).openTickets - (data1 as BacklogEntry).openTickets,\n\t},\n\t{\n\t\tlabel: 'Last updated',\n\t\tkey: 'date',\n\n\t\ttextAlign: 'center',\n\t\trender: (_el, _cell, tuple) => DATE_FORMATTER.format((tuple as BacklogEntry).date),\n\t\tcompareFn: (data0: KoliBriTableDataType, data1: KoliBriTableDataType) => {\n\t\t\tif ((data0 as BacklogEntry).date < (data1 as BacklogEntry).date) return -1;\n\t\t\telse if ((data1 as BacklogEntry).date < (data0 as BacklogEntry).date) return 1;\n\t\t\telse return 0;\n\t\t},\n\t},\n];\n\nconst HEADERS_HORIZONTAL: KoliBriTableHeaders = {\n\thorizontal: [TABLE_HEADER_CELLS],\n};\n\nconst HEADERS_VERTICAL: KoliBriTableHeaders = {\n\tvertical: [TABLE_HEADER_CELLS],\n};\n\nexport const MultiSortTable: FC = () => {\n\tconst [verticallHeader, setVerticalHeader] = useState(HEADERS_VERTICAL);\n\tconst [horizontalHeader, setHorizontalHeader] = useState(HEADERS_HORIZONTAL);\n\treturn (\n\t\t<>\n\t\t\t<SampleDescription>\n\t\t\t\t<p>\n\t\t\t\t\tMulti-sort allows layering multiple column sorts at once. Compare the compact examples with the project backlog showcase to see how the sort order\n\t\t\t\t\tindicator helps track complex prioritisation.\n\t\t\t\t</p>\n\t\t\t</SampleDescription>\n\n\t\t\t<section className=\"w-full grid gap-6\">\n\t\t\t\t<SampleBlock id=\"vertical\" heading=\"Vertical\">\n\t\t\t\t\t<KolButtonLink _label=\"Reset Table\" _on={{ onClick: () => setVerticalHeader({ vertical: [[...TABLE_HEADER_CELLS]] }) }}></KolButtonLink>\n\t\t\t\t\t<KolTableStateful\n\t\t\t\t\t\t_label=\"Sort Table with Order and Date\"\n\t\t\t\t\t\t_data={BACKLOG_DATA.slice(0, 10)}\n\t\t\t\t\t\t_headers={verticallHeader}\n\t\t\t\t\t\tclassName=\"block\"\n\t\t\t\t\t\t_allowMultiSort={true}\n\t\t\t\t\t/>\n\t\t\t\t</SampleBlock>\n\t\t\t\t<SampleBlock id=\"horizontal\" heading=\"Horizontal\">\n\t\t\t\t\t<KolButtonLink _label=\"Reset Table\" _on={{ onClick: () => setHorizontalHeader({ horizontal: [[...TABLE_HEADER_CELLS]] }) }}></KolButtonLink>\n\t\t\t\t\t<KolTableStateful _label=\"Sort Table with Order and Date\" _data={BACKLOG_DATA} _headers={horizontalHeader} className=\"block\" _allowMultiSort={true} />\n\t\t\t\t</SampleBlock>\n\t\t\t</section>\n\t\t</>\n\t);\n};\n",
|
|
1824
|
+
"code": "import type { FC } from 'react';\nimport React, { useState } from 'react';\n\nimport type { KoliBriTableDataType, KoliBriTableHeaderCellWithLogic, KoliBriTableHeaders } from '@public-ui/components';\nimport { KolButtonLink, KolTableStateful } from '@public-ui/react-v19';\nimport { SampleBlock } from '../SampleBlock';\nimport { SampleDescription } from '../SampleDescription';\n\nconst DATE_FORMATTER = Intl.DateTimeFormat('de-DE', {\n\tday: '2-digit',\n\tmonth: '2-digit',\n\tyear: 'numeric',\n});\n\ntype BacklogEntry = {\n\tdate: Date;\n\tassignee: string;\n\tdepartment: string;\n\tpriority: 'High' | 'Medium' | 'Low';\n\tstatus: 'Blocked' | 'In progress' | 'Ready';\n\topenTickets: number;\n};\n\nconst ASSIGNEES = ['Devon Chen', 'Fatima Alvi', 'Leon Köhler', 'Mila Schmidt', 'Sven Lindholm'];\nconst DEPARTMENTS = ['Customer Service', 'Digital Services', 'Infrastructure', 'Municipal Office'];\nconst PRIORITY_SEQUENCE: BacklogEntry['priority'][] = ['High', 'Medium', 'Low'];\nconst STATUS_SEQUENCE: BacklogEntry['status'][] = ['Blocked', 'In progress', 'Ready'];\n\nconst PRIORITY_ORDER = PRIORITY_SEQUENCE.reduce<Record<BacklogEntry['priority'], number>>(\n\t(order, priority, index) => {\n\t\torder[priority] = index;\n\t\treturn order;\n\t},\n\t{} as Record<BacklogEntry['priority'], number>,\n);\n\nconst STATUS_ORDER = STATUS_SEQUENCE.reduce<Record<BacklogEntry['status'], number>>(\n\t(order, status, index) => {\n\t\torder[status] = index;\n\t\treturn order;\n\t},\n\t{} as Record<BacklogEntry['status'], number>,\n);\n\nconst BACKLOG_DATA: BacklogEntry[] = Array.from({ length: 15 }).map((_, index) => ({\n\tdate: new Date(Date.now() - index * 1000 * 60 * 60 * 24),\n\tassignee: ASSIGNEES[index % ASSIGNEES.length],\n\tdepartment: DEPARTMENTS[index % DEPARTMENTS.length],\n\tpriority: PRIORITY_SEQUENCE[index % PRIORITY_SEQUENCE.length],\n\tstatus: STATUS_SEQUENCE[index % STATUS_SEQUENCE.length],\n\topenTickets: (index * 3) % 11,\n}));\n\nconst TABLE_HEADER_CELLS: KoliBriTableHeaderCellWithLogic[] = [\n\t{\n\t\tlabel: 'Assignee',\n\t\tkey: 'assignee',\n\n\t\tcompareFn: (data0: KoliBriTableDataType, data1: KoliBriTableDataType) =>\n\t\t\t(data0 as BacklogEntry).assignee.localeCompare((data1 as BacklogEntry).assignee, 'de'),\n\t\tsortDirection: 'ASC',\n\t\twidth: 200,\n\t},\n\t{\n\t\tlabel: 'Department',\n\t\tkey: 'department',\n\n\t\tcompareFn: (data0: KoliBriTableDataType, data1: KoliBriTableDataType) =>\n\t\t\t(data0 as BacklogEntry).department.localeCompare((data1 as BacklogEntry).department, 'de'),\n\t\twidth: 200,\n\t},\n\t{\n\t\tlabel: 'Priority',\n\t\tkey: 'priority',\n\n\t\ttextAlign: 'center',\n\t\tcompareFn: (data0: KoliBriTableDataType, data1: KoliBriTableDataType) =>\n\t\t\tPRIORITY_ORDER[(data0 as BacklogEntry).priority] - PRIORITY_ORDER[(data1 as BacklogEntry).priority],\n\t\tsortDirection: 'DESC',\n\t\twidth: 150,\n\t},\n\t{\n\t\tlabel: 'Status',\n\t\tkey: 'status',\n\n\t\ttextAlign: 'center',\n\t\tcompareFn: (data0: KoliBriTableDataType, data1: KoliBriTableDataType) =>\n\t\t\tSTATUS_ORDER[(data0 as BacklogEntry).status] - STATUS_ORDER[(data1 as BacklogEntry).status],\n\t\twidth: 150,\n\t},\n\t{\n\t\tlabel: 'Open tickets',\n\t\tkey: 'openTickets',\n\n\t\ttextAlign: 'right',\n\t\tcompareFn: (data0: KoliBriTableDataType, data1: KoliBriTableDataType) => (data0 as BacklogEntry).openTickets - (data1 as BacklogEntry).openTickets,\n\t\twidth: 100,\n\t},\n\t{\n\t\tlabel: 'Last updated',\n\t\tkey: 'date',\n\n\t\ttextAlign: 'center',\n\t\trender: (_el, _cell, tuple) => DATE_FORMATTER.format((tuple as BacklogEntry).date),\n\t\tcompareFn: (data0: KoliBriTableDataType, data1: KoliBriTableDataType) => {\n\t\t\tif ((data0 as BacklogEntry).date < (data1 as BacklogEntry).date) return -1;\n\t\t\telse if ((data1 as BacklogEntry).date < (data0 as BacklogEntry).date) return 1;\n\t\t\telse return 0;\n\t\t},\n\t\twidth: 150,\n\t},\n];\n\nconst HEADERS_HORIZONTAL: KoliBriTableHeaders = {\n\thorizontal: [TABLE_HEADER_CELLS],\n};\n\nconst HEADERS_VERTICAL: KoliBriTableHeaders = {\n\tvertical: [TABLE_HEADER_CELLS],\n};\n\nexport const MultiSortTable: FC = () => {\n\tconst [verticallHeader, setVerticalHeader] = useState(HEADERS_VERTICAL);\n\tconst [horizontalHeader, setHorizontalHeader] = useState(HEADERS_HORIZONTAL);\n\treturn (\n\t\t<>\n\t\t\t<SampleDescription>\n\t\t\t\t<p>\n\t\t\t\t\tMulti-sort allows layering multiple column sorts at once. Compare the compact examples with the project backlog showcase to see how the sort order\n\t\t\t\t\tindicator helps track complex prioritisation.\n\t\t\t\t</p>\n\t\t\t</SampleDescription>\n\n\t\t\t<section className=\"w-full grid gap-6\">\n\t\t\t\t<SampleBlock id=\"vertical\" heading=\"Vertical\">\n\t\t\t\t\t<KolButtonLink _label=\"Reset Table\" _on={{ onClick: () => setVerticalHeader({ vertical: [[...TABLE_HEADER_CELLS]] }) }}></KolButtonLink>\n\t\t\t\t\t<KolTableStateful\n\t\t\t\t\t\t_label=\"Sort Table with Order and Date\"\n\t\t\t\t\t\t_data={BACKLOG_DATA.slice(0, 10)}\n\t\t\t\t\t\t_headers={verticallHeader}\n\t\t\t\t\t\tclassName=\"block\"\n\t\t\t\t\t\t_allowMultiSort={true}\n\t\t\t\t\t/>\n\t\t\t\t</SampleBlock>\n\t\t\t\t<SampleBlock id=\"horizontal\" heading=\"Horizontal\">\n\t\t\t\t\t<KolButtonLink _label=\"Reset Table\" _on={{ onClick: () => setHorizontalHeader({ horizontal: [[...TABLE_HEADER_CELLS]] }) }}></KolButtonLink>\n\t\t\t\t\t<KolTableStateful _label=\"Sort Table with Order and Date\" _data={BACKLOG_DATA} _headers={horizontalHeader} className=\"block\" _allowMultiSort={true} />\n\t\t\t\t</SampleBlock>\n\t\t\t</section>\n\t\t</>\n\t);\n};\n",
|
|
1825
1825
|
"kind": "sample"
|
|
1826
1826
|
},
|
|
1827
1827
|
{
|
|
@@ -1845,7 +1845,7 @@
|
|
|
1845
1845
|
"group": "table",
|
|
1846
1846
|
"name": "predefined-settings",
|
|
1847
1847
|
"path": "packages/samples/react/src/components/table/predefined-settings.tsx",
|
|
1848
|
-
"code": "import { KolTableStateful } from '@public-ui/react-v19';\nimport type { FC } from 'react';\nimport React from 'react';\nimport { SampleDescription } from '../SampleDescription';\n\nconst DATA = [{ columnA: 'Column A', columnB: 'Column B', columnC: 'Column C' }];\n\nexport const PredefinedSettings: FC = () => {\n\treturn (\n\t\t<>\n\t\t\t<SampleDescription>\n\t\t\t\t<p>This example shows the table with predefined settings.</p>\n\t\t\t</SampleDescription>\n\n\t\t\t<KolTableStateful\n\t\t\t\t_label=\"Table for demonstration purposes with predefined settings\"\n\t\t\t\t_hasSettingsMenu\n\t\t\t\t_headers={{\n\t\t\t\t\thorizontal: [\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t{ key: 'columnC', visible: true, label: 'Column C', width: 450 },\n\t\t\t\t\t\t\t{ key: 'columnB', visible: true, label: 'Column B', width: 200 },\n\t\t\t\t\t\t\t{ key: 'columnA', visible: false, label: 'Column A', width: 160 },\n\t\t\t\t\t\t],\n\t\t\t\t\t],\n\t\t\t\t}}\n\t\t\t\t_data={DATA}\n\t\t\t\tclassName=\"block\"\n\t\t\t
|
|
1848
|
+
"code": "import { KolTableStateful } from '@public-ui/react-v19';\nimport type { FC } from 'react';\nimport React from 'react';\nimport { SampleDescription } from '../SampleDescription';\n\nconst DATA = [{ columnA: 'Column A', columnB: 'Column B', columnC: 'Column C' }];\n\nexport const PredefinedSettings: FC = () => {\n\treturn (\n\t\t<>\n\t\t\t<SampleDescription>\n\t\t\t\t<p>This example shows the table with predefined settings.</p>\n\t\t\t</SampleDescription>\n\n\t\t\t<KolTableStateful\n\t\t\t\t_label=\"Table for demonstration purposes with predefined settings\"\n\t\t\t\t_hasSettingsMenu\n\t\t\t\t_headers={{\n\t\t\t\t\thorizontal: [\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t{ key: 'columnC', visible: true, label: 'Column C', width: 450 },\n\t\t\t\t\t\t\t{ key: 'columnB', visible: true, label: 'Column B', width: 200 },\n\t\t\t\t\t\t\t{ key: 'columnA', visible: false, label: 'Column A', width: 160 },\n\t\t\t\t\t\t],\n\t\t\t\t\t],\n\t\t\t\t}}\n\t\t\t\t_data={DATA}\n\t\t\t\tclassName=\"block\"\n\t\t\t/>\n\t\t</>\n\t);\n};\n",
|
|
1849
1849
|
"kind": "sample"
|
|
1850
1850
|
},
|
|
1851
1851
|
{
|
|
@@ -1853,7 +1853,7 @@
|
|
|
1853
1853
|
"group": "table",
|
|
1854
1854
|
"name": "render-cell",
|
|
1855
1855
|
"path": "packages/samples/react/src/components/table/render-cell.tsx",
|
|
1856
|
-
"code": "import type { FC } from 'react';\nimport React from 'react';\n\nimport { createReactRenderElement, KolButton, KolInputText, KolTableStateful } from '@public-ui/react-v19';\n\nimport { getRoot } from '../../shares/react-roots';\nimport { SampleDescription } from '../SampleDescription';\nimport { DATE_FORMATTER } from './formatter';\n\nimport type { IconsPropType, KoliBriTableCell, KoliBriTableHeaders } from '@public-ui/components';\nimport { useAlert } from '../../hooks/useAlert';\n\ntype Data = {\n\torder: number;\n\tdate: Date;\n\tshipped: boolean;\n};\n\n/**\n * Generates n data entries with random dates and shipping status\n * @param n - Number of data entries to generate\n * @returns Array of Data objects\n */\nfunction generateDataEntries(n: number): Data[] {\n\tconst entries: Data[] = [];\n\tconst startDate = new Date('1970-01-01').getTime();\n\tconst endDate = new Date('2025-12-31').getTime();\n\n\tfor (let i = 0; i < n; i++) {\n\t\tconst randomTimestamp = startDate + Math.random() * (endDate - startDate);\n\t\tentries.push({\n\t\t\torder: i,\n\t\t\tshipped: Math.random() > 0.5,\n\t\t\tdate: new Date(randomTimestamp),\n\t\t});\n\t}\n\n\treturn entries;\n}\n\nconst DATA: Data[] = generateDataEntries(100);\n\nfunction KolButtonWrapper({ label, icons }: { label: string; icons: IconsPropType }) {\n\tconst { dummyClickEventHandler } = useAlert();\n\n\tconst dummyEventHandler = {\n\t\tonClick: dummyClickEventHandler,\n\t};\n\n\treturn <KolButton _label={label} _icons={icons} _on={dummyEventHandler} />;\n}\n\nconst HEADERS: KoliBriTableHeaders = {\n\thorizontal: [\n\t\t[\n\t\t\t{\n\t\t\t\tlabel: '#',\n\t\t\t\tkey: 'order',\n\t\t\t\ttextAlign: 'center',\n\t\t\t\twidth: 100,\n\n\t\t\t\t/* Example 1: Use render return value to format data */\n\t\t\t\trender: (_el, cell: KoliBriTableCell) => {\n\t\t\t\t\tconst { label } = cell as { label: string };\n\t\t\t\t\treturn `Index: ${label}`;\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: 'Status',\n\t\t\t\tkey: 'shipped',\n\t\t\t\ttextAlign: 'center',\n\t\t\t\twidth: 100,\n\n\t\t\t\t/* Example 2: Simple render function using textContent */\n\t\t\t\trender: (el, cell: KoliBriTableCell) => {\n\t\t\t\t\tconst { label } = cell as { label: string };\n\t\t\t\t\tconst element = el as HTMLElement;\n\t\t\t\t\tif (label) {\n\t\t\t\t\t\telement.textContent = `Order has been dispatched 🚚`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\telement.textContent = `Order pending 📦`;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: 'Date (string)',\n\t\t\t\tkey: 'date',\n\t\t\t\twidth:
|
|
1856
|
+
"code": "import type { FC } from 'react';\nimport React from 'react';\n\nimport { createReactRenderElement, KolButton, KolInputText, KolTableStateful } from '@public-ui/react-v19';\n\nimport { getRoot } from '../../shares/react-roots';\nimport { SampleDescription } from '../SampleDescription';\nimport { DATE_FORMATTER } from './formatter';\n\nimport type { IconsPropType, KoliBriTableCell, KoliBriTableHeaders } from '@public-ui/components';\nimport { useAlert } from '../../hooks/useAlert';\n\ntype Data = {\n\torder: number;\n\tdate: Date;\n\tshipped: boolean;\n};\n\n/**\n * Generates n data entries with random dates and shipping status\n * @param n - Number of data entries to generate\n * @returns Array of Data objects\n */\nfunction generateDataEntries(n: number): Data[] {\n\tconst entries: Data[] = [];\n\tconst startDate = new Date('1970-01-01').getTime();\n\tconst endDate = new Date('2025-12-31').getTime();\n\n\tfor (let i = 0; i < n; i++) {\n\t\tconst randomTimestamp = startDate + Math.random() * (endDate - startDate);\n\t\tentries.push({\n\t\t\torder: i,\n\t\t\tshipped: Math.random() > 0.5,\n\t\t\tdate: new Date(randomTimestamp),\n\t\t});\n\t}\n\n\treturn entries;\n}\n\nconst DATA: Data[] = generateDataEntries(100);\n\nfunction KolButtonWrapper({ label, icons }: { label: string; icons: IconsPropType }) {\n\tconst { dummyClickEventHandler } = useAlert();\n\n\tconst dummyEventHandler = {\n\t\tonClick: dummyClickEventHandler,\n\t};\n\n\treturn <KolButton _label={label} _icons={icons} _on={dummyEventHandler} />;\n}\n\nconst HEADERS: KoliBriTableHeaders = {\n\thorizontal: [\n\t\t[\n\t\t\t{\n\t\t\t\tlabel: '#',\n\t\t\t\tkey: 'order',\n\t\t\t\ttextAlign: 'center',\n\t\t\t\twidth: 100,\n\n\t\t\t\t/* Example 1: Use render return value to format data */\n\t\t\t\trender: (_el, cell: KoliBriTableCell) => {\n\t\t\t\t\tconst { label } = cell as { label: string };\n\t\t\t\t\treturn `Index: ${label}`;\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: 'Status',\n\t\t\t\tkey: 'shipped',\n\t\t\t\ttextAlign: 'center',\n\t\t\t\twidth: 100,\n\n\t\t\t\t/* Example 2: Simple render function using textContent */\n\t\t\t\trender: (el, cell: KoliBriTableCell) => {\n\t\t\t\t\tconst { label } = cell as { label: string };\n\t\t\t\t\tconst element = el as HTMLElement;\n\t\t\t\t\tif (label) {\n\t\t\t\t\t\telement.textContent = `Order has been dispatched 🚚`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\telement.textContent = `Order pending 📦`;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: 'Date (string)',\n\t\t\t\tkey: 'date',\n\t\t\t\twidth: 150,\n\t\t\t\ttextAlign: 'center',\n\n\t\t\t\t/* Example 3: Render function using innerHTML. ⚠️Make sure to sanitize data to avoid XSS. */\n\t\t\t\trender: (el, cell: KoliBriTableCell) => {\n\t\t\t\t\tconst { label } = cell as { label: string };\n\t\t\t\t\t(el as HTMLElement).innerHTML = `<strong>${DATE_FORMATTER.format(label as unknown as Date)}</strong>`;\n\t\t\t\t},\n\t\t\t\tcompareFn: (data0, data1) => (data0 as Data).date.getTime() - (data1 as Data).date.getTime(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: 'Action (react)',\n\t\t\t\tkey: 'action',\n\t\t\t\twidth: 250,\n\n\t\t\t\t/* Example 4: Render function using React */\n\t\t\t\trender: (el) => {\n\t\t\t\t\tgetRoot(createReactRenderElement(el)).render(\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tdisplay: `grid`,\n\t\t\t\t\t\t\t\tgridAutoFlow: `column`,\n\t\t\t\t\t\t\t\talignItems: `end`,\n\t\t\t\t\t\t\t\tgap: `4px`,\n\t\t\t\t\t\t\t\twidth: `190px`,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<KolInputText _label=\"Input\" />\n\t\t\t\t\t\t\t<KolButtonWrapper label=\"Save\" icons={{ left: 'kolicon-check' }} />\n\t\t\t\t\t\t</div>,\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t],\n};\n\nexport const TableRenderCell: FC = () => (\n\t<>\n\t\t<SampleDescription>\n\t\t\t<p>This sample shows KolTableStateful using React render functions for the cell contents.</p>\n\t\t</SampleDescription>\n\n\t\t<KolTableStateful _label=\"Sort by date column\" _data={DATA} _headers={HEADERS} className=\"w-full\" _hasSettingsMenu />\n\t</>\n);\n",
|
|
1857
1857
|
"kind": "sample"
|
|
1858
1858
|
},
|
|
1859
1859
|
{
|
|
@@ -1909,7 +1909,7 @@
|
|
|
1909
1909
|
"group": "table",
|
|
1910
1910
|
"name": "stateful-settings-persistence",
|
|
1911
1911
|
"path": "packages/samples/react/src/components/table/stateful-settings-persistence.tsx",
|
|
1912
|
-
"code": "import type { KoliBriTableDataType, KoliBriTableHeaders } from '@public-ui/components';\nimport { KolButton, KolTableStateful } from '@public-ui/react-v19';\nimport type { FC } from 'react';\nimport React, { useState } from 'react';\nimport { SampleDescription } from '../SampleDescription';\n\ntype UserRow = {\n\tid: string;\n\tname: string;\n\tteam: string;\n\temail: string;\n\tstatus: string;\n};\n\nconst DATA: UserRow[] = [\n\t{ id: 'U-001', name: 'Andrea Schmidt', team: 'Design', email: 'andrea@example.org', status: 'Active' },\n\t{ id: 'U-002', name: 'Boris Klein', team: 'Engineering', email: 'boris@example.org', status: 'Active' },\n\t{ id: 'U-003', name: 'Chiara Russo', team: 'Support', email: 'chiara@example.org', status: 'On leave' },\n\t{ id: 'U-004', name: 'Dmitri Volkov', team: 'Engineering', email: 'dmitri@example.org', status: 'Active' },\n\t{ id: 'U-005', name: 'Elena Costa', team: 'Design', email: 'elena@example.org', status: 'On leave' },\n\t{ id: 'U-006', name: 'Farid Haddad', team: 'Support', email: 'farid@example.org', status: 'Active' },\n];\n\nconst compareByKey =\n\t(key: keyof UserRow) =>\n\t(data0: KoliBriTableDataType, data1: KoliBriTableDataType, direction = 'ASC') => {\n\t\tconst result = String((data0 as UserRow)[key]).localeCompare(String((data1 as UserRow)[key]));\n\t\treturn direction === 'DESC' ? -result : result;\n\t};\n\n// Intentionally created inline on every render so the `_headers` prop receives a fresh object\n// reference each time. This mirrors the common React pattern of non-memoized headers and verifies\n// that applied settings survive parent re-renders as long as the column keys stay the same (#10344).\nconst buildHeaders = (): KoliBriTableHeaders => ({\n\thorizontal: [\n\t\t[\n\t\t\t{ key: 'id', label: 'ID', visible: true, width: 120 },\n\t\t\t{ key: 'name', label: 'Name', visible: true, width: 240, compareFn: compareByKey('name') },\n\t\t\t{ key: 'team', label: 'Team', visible: true, width: 200, compareFn: compareByKey('team') },\n\t\t\t{ key: 'email', label: 'E-Mail', visible: true, width: 280 },\n\t\t\t{ key: 'status', label: 'Status', visible: true, width: 160, compareFn: compareByKey('status') },\n\t\t],\n\t],\n});\n\nexport const TableStatefulSettingsPersistence: FC = () => {\n\tconst [renderCount, setRenderCount] = useState(0);\n\n\treturn (\n\t\t<>\n\t\t\t<SampleDescription>\n\t\t\t\t<p>\n\t\t\t\t\tThis example demonstrates that column settings applied via the settings menu are remembered. Open the settings menu and change a column's width,\n\t\t\t\t\tvisibility or order and apply. Then sort a column, switch the pagination page, select a row, or use the "Force parent re-render" button\n\t\t\t\t\t– the customized columns must stay as you configured them and must no longer reset to their defaults (issue #10344).\n\t\t\t\t</p>\n\t\t\t</SampleDescription>\n\n\t\t\t<KolButton _label={`Force parent re-render (${renderCount})`} _on={{ onClick: () => setRenderCount((count) => count + 1) }} className=\"block\" />\n\n\t\t\t<KolTableStateful\n\t\t\t\t_label=\"Table that remembers settings across sorting, pagination and selection\"\n\t\t\t\t_hasSettingsMenu\n\t\t\t\t_pagination={{ _page: 1, _pageSize: 3 }}\n\t\t\t\t_selection={{\n\t\t\t\t\tlabel: (row) => `Select ${(row as UserRow).name}`,\n\t\t\t\t\tkeyPropertyName: 'id',\n\t\t\t\t\tselectedKeys: [],\n\t\t\t\t}}\n\t\t\t\t_headers={buildHeaders()}\n\t\t\t\t_data={DATA}\n\t\t\t\tclassName=\"block\"\n\t\t\t
|
|
1912
|
+
"code": "import type { KoliBriTableDataType, KoliBriTableHeaders } from '@public-ui/components';\nimport { KolButton, KolTableStateful } from '@public-ui/react-v19';\nimport type { FC } from 'react';\nimport React, { useState } from 'react';\nimport { SampleDescription } from '../SampleDescription';\n\ntype UserRow = {\n\tid: string;\n\tname: string;\n\tteam: string;\n\temail: string;\n\tstatus: string;\n};\n\nconst DATA: UserRow[] = [\n\t{ id: 'U-001', name: 'Andrea Schmidt', team: 'Design', email: 'andrea@example.org', status: 'Active' },\n\t{ id: 'U-002', name: 'Boris Klein', team: 'Engineering', email: 'boris@example.org', status: 'Active' },\n\t{ id: 'U-003', name: 'Chiara Russo', team: 'Support', email: 'chiara@example.org', status: 'On leave' },\n\t{ id: 'U-004', name: 'Dmitri Volkov', team: 'Engineering', email: 'dmitri@example.org', status: 'Active' },\n\t{ id: 'U-005', name: 'Elena Costa', team: 'Design', email: 'elena@example.org', status: 'On leave' },\n\t{ id: 'U-006', name: 'Farid Haddad', team: 'Support', email: 'farid@example.org', status: 'Active' },\n];\n\nconst compareByKey =\n\t(key: keyof UserRow) =>\n\t(data0: KoliBriTableDataType, data1: KoliBriTableDataType, direction = 'ASC') => {\n\t\tconst result = String((data0 as UserRow)[key]).localeCompare(String((data1 as UserRow)[key]));\n\t\treturn direction === 'DESC' ? -result : result;\n\t};\n\n// Intentionally created inline on every render so the `_headers` prop receives a fresh object\n// reference each time. This mirrors the common React pattern of non-memoized headers and verifies\n// that applied settings survive parent re-renders as long as the column keys stay the same (#10344).\nconst buildHeaders = (): KoliBriTableHeaders => ({\n\thorizontal: [\n\t\t[\n\t\t\t{ key: 'id', label: 'ID', visible: true, width: 120 },\n\t\t\t{ key: 'name', label: 'Name', visible: true, width: 240, compareFn: compareByKey('name') },\n\t\t\t{ key: 'team', label: 'Team', visible: true, width: 200, compareFn: compareByKey('team') },\n\t\t\t{ key: 'email', label: 'E-Mail', visible: true, width: 280 },\n\t\t\t{ key: 'status', label: 'Status', visible: true, width: 160, compareFn: compareByKey('status') },\n\t\t],\n\t],\n});\n\nexport const TableStatefulSettingsPersistence: FC = () => {\n\tconst [renderCount, setRenderCount] = useState(0);\n\n\treturn (\n\t\t<>\n\t\t\t<SampleDescription>\n\t\t\t\t<p>\n\t\t\t\t\tThis example demonstrates that column settings applied via the settings menu are remembered. Open the settings menu and change a column's width,\n\t\t\t\t\tvisibility or order and apply. Then sort a column, switch the pagination page, select a row, or use the "Force parent re-render" button\n\t\t\t\t\t– the customized columns must stay as you configured them and must no longer reset to their defaults (issue #10344).\n\t\t\t\t</p>\n\t\t\t</SampleDescription>\n\n\t\t\t<KolButton _label={`Force parent re-render (${renderCount})`} _on={{ onClick: () => setRenderCount((count) => count + 1) }} className=\"block\" />\n\n\t\t\t<KolTableStateful\n\t\t\t\t_label=\"Table that remembers settings across sorting, pagination and selection\"\n\t\t\t\t_hasSettingsMenu\n\t\t\t\t_pagination={{ _page: 1, _pageSize: 3 }}\n\t\t\t\t_selection={{\n\t\t\t\t\tlabel: (row) => `Select ${(row as UserRow).name}`,\n\t\t\t\t\tkeyPropertyName: 'id',\n\t\t\t\t\tselectedKeys: [],\n\t\t\t\t}}\n\t\t\t\t_headers={buildHeaders()}\n\t\t\t\t_data={DATA}\n\t\t\t\tclassName=\"block\"\n\t\t\t/>\n\t\t</>\n\t);\n};\n",
|
|
1913
1913
|
"kind": "sample"
|
|
1914
1914
|
},
|
|
1915
1915
|
{
|
|
@@ -1933,7 +1933,7 @@
|
|
|
1933
1933
|
"group": "table",
|
|
1934
1934
|
"name": "stateless",
|
|
1935
1935
|
"path": "packages/samples/react/src/components/table/stateless.tsx",
|
|
1936
|
-
"code": "import { KolTableStateless } from '@public-ui/react-v19';\nimport type { FC } from 'react';\nimport React from 'react';\nimport { SampleBlock } from '../SampleBlock';\nimport { SampleDescription } from '../SampleDescription';\n\nconst DATA = [{ left: 'Left Example', center: 'Center Example', right: 'Right Example' }, {}, {}, {}];\n\nexport const TableStateless: FC = () => (\n\t<>\n\t\t<SampleDescription>\n\t\t\t<p>This sample shows how KolTableStateless can be used directly, with the KolTableStateful wrapper.</p>\n\t\t</SampleDescription>\n\n\t\t<SampleBlock id=\"stateless\" className=\"w-full\" fitContent>\n\t\t\t<KolTableStateless\n\t\t\t\t_label=\"Table for demonstration purposes\"\n\t\t\t\t_headers={{\n\t\t\t\t\thorizontal: [\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t{ key: 'left', label: 'left', textAlign: 'left', sortDirection: 'ASC' },\n\t\t\t\t\t\t\t{ key: 'center', label: 'center', textAlign: 'center', sortDirection: 'DESC' },\n\t\t\t\t\t\t\t{ key: 'right', label: 'right', textAlign: 'right', sortDirection: 'NOS' },\n\t\t\t\t\t\t\t{ key: 'nosort', label: 'no sort option' },\n\t\t\t\t\t\t],\n\t\t\t\t\t],\n\t\t\t\t\tvertical: [\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t{ key: 'vertical-left', label: 'left', textAlign: 'left', sortDirection: 'ASC' },\n\t\t\t\t\t\t\t{ key: 'vertical-center', label: 'center', textAlign: 'center', sortDirection: 'DESC' },\n\t\t\t\t\t\t\t{ key: 'vertical-right', label: 'right', textAlign: 'right', sortDirection: 'NOS' },\n\t\t\t\t\t\t\t{ key: 'vertical-nosort', label: 'no sort option' },\n\t\t\t\t\t\t],\n\t\t\t\t\t],\n\t\t\t\t}}\n\t\t\t\t_data={DATA}\n\t\t\t\tclassName=\"block\"\n\t\t\t\tstyle={{ maxWidth: '600px' }}\n\t\t\t\t_on={{\n\t\t\t\t\tonSort: (_event, payload) => {\n\t\t\t\t\t\tconsole.log(payload);\n\t\t\t\t\t},\n\t\t\t\t}}\n\t\t\t/>\n\t\t</SampleBlock>\n\t</>\n);\n",
|
|
1936
|
+
"code": "import { KolTableStateless } from '@public-ui/react-v19';\nimport type { FC } from 'react';\nimport React from 'react';\nimport { SampleBlock } from '../SampleBlock';\nimport { SampleDescription } from '../SampleDescription';\n\nconst DATA = [{ left: 'Left Example', center: 'Center Example', right: 'Right Example' }, {}, {}, {}];\n\nexport const TableStateless: FC = () => (\n\t<>\n\t\t<SampleDescription>\n\t\t\t<p>This sample shows how KolTableStateless can be used directly, with the KolTableStateful wrapper.</p>\n\t\t</SampleDescription>\n\n\t\t<SampleBlock id=\"stateless\" className=\"w-full\" fitContent>\n\t\t\t<KolTableStateless\n\t\t\t\t_label=\"Table for demonstration purposes\"\n\t\t\t\t_headers={{\n\t\t\t\t\thorizontal: [\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t{ key: 'left', label: 'left', textAlign: 'left', sortDirection: 'ASC', width: 100 },\n\t\t\t\t\t\t\t{ key: 'center', label: 'center', textAlign: 'center', sortDirection: 'DESC', width: 100 },\n\t\t\t\t\t\t\t{ key: 'right', label: 'right', textAlign: 'right', sortDirection: 'NOS', width: 100 },\n\t\t\t\t\t\t\t{ key: 'nosort', label: 'no sort option', width: 150 },\n\t\t\t\t\t\t],\n\t\t\t\t\t],\n\t\t\t\t\tvertical: [\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t{ key: 'vertical-left', label: 'left', textAlign: 'left', sortDirection: 'ASC' },\n\t\t\t\t\t\t\t{ key: 'vertical-center', label: 'center', textAlign: 'center', sortDirection: 'DESC' },\n\t\t\t\t\t\t\t{ key: 'vertical-right', label: 'right', textAlign: 'right', sortDirection: 'NOS' },\n\t\t\t\t\t\t\t{ key: 'vertical-nosort', label: 'no sort option' },\n\t\t\t\t\t\t],\n\t\t\t\t\t],\n\t\t\t\t}}\n\t\t\t\t_data={DATA}\n\t\t\t\tclassName=\"block\"\n\t\t\t\tstyle={{ maxWidth: '600px' }}\n\t\t\t\t_on={{\n\t\t\t\t\tonSort: (_event, payload) => {\n\t\t\t\t\t\tconsole.log(payload);\n\t\t\t\t\t},\n\t\t\t\t}}\n\t\t\t/>\n\t\t</SampleBlock>\n\t</>\n);\n",
|
|
1937
1937
|
"kind": "sample"
|
|
1938
1938
|
},
|
|
1939
1939
|
{
|
|
@@ -1949,7 +1949,7 @@
|
|
|
1949
1949
|
"group": "table",
|
|
1950
1950
|
"name": "stateless-with-selection",
|
|
1951
1951
|
"path": "packages/samples/react/src/components/table/stateless-with-selection.tsx",
|
|
1952
|
-
"code": "import type { KoliBriTableCell, KoliBriTableSelection, KoliBriTableSelectionKeys } from '@public-ui/components';\nimport { createReactRenderElement, KolButton, KolTableStateless } from '@public-ui/react-v19';\nimport type { FC } from 'react';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useAlert } from '../../hooks/useAlert';\nimport { getRoot } from '../../shares/react-roots';\nimport { SampleBlock } from '../SampleBlock';\nimport { SampleDescription } from '../SampleDescription';\n\ntype SelectionValue = string | number;\ntype KolTableStatelessElement = {\n\taddEventListener: (type: string, listener: (event: CustomEvent<SelectionValue[]>) => void) => void;\n\tremoveEventListener: (type: string, listener: (event: CustomEvent<SelectionValue[]>) => void) => void;\n};\n\nconst DATA = [\n\t{ id: '1001', name: 'Foo Bar', internalIdentifier: `AAA1001` },\n\t{ id: '1002', name: 'Foo Baz', internalIdentifier: `AAA1002` },\n\t{ id: '1003', name: 'This row is always unchecked', internalIdentifier: `AAA1003` },\n\t{ id: '1004', name: 'This row is always checked', internalIdentifier: `AAA1004` },\n];\ntype Data = (typeof DATA)[0];\n\nfunction KolButtonWrapper({ label }: { label: string }) {\n\tconst { dummyClickEventHandler } = useAlert();\n\n\tconst dummyEventHandler = {\n\t\tonClick: dummyClickEventHandler,\n\t};\n\n\treturn <KolButton _label={label} _on={dummyEventHandler} />;\n}\n\nexport const TableStatelessWithSelection: FC = () => {\n\tconst [selectedKeys, setSelectedKeys] = useState<KoliBriTableSelectionKeys>(['AAA1002', 'AAA1004']);\n\n\tconst selection: KoliBriTableSelection = {\n\t\tlabel: (row) => `Selection for ${(row as Data).name}`,\n\t\tselectedKeys,\n\t\tkeyPropertyName: 'internalIdentifier',\n\t\tdisabledKeys: ['AAA1003', 'AAA1004'],\n\t};\n\n\tconst kolTableStatelessRef = useRef<HTMLKolTableStatelessElement>(null);\n\n\tconst handleSelectionChangeEvent = ({ detail: selection }: CustomEvent<SelectionValue[]>) => {\n\t\tconsole.log('Selection change via event', selection);\n\t};\n\tconst handleSelectionChangeCallback = (_event: Event, selection: SelectionValue[]) => {\n\t\tconsole.log('Selection change via callback', selection);\n\t\tsetSelectedKeys(selection);\n\t};\n\n\tuseEffect(() => {\n\t\tconst tableElement = kolTableStatelessRef.current as unknown as KolTableStatelessElement | null;\n\t\tconst selectionChangeEvent = 'kolSelectionChange';\n\t\ttableElement?.addEventListener(selectionChangeEvent, handleSelectionChangeEvent);\n\n\t\treturn () => {\n\t\t\ttableElement?.removeEventListener(selectionChangeEvent, handleSelectionChangeEvent);\n\t\t};\n\t}, [kolTableStatelessRef]);\n\n\tconst renderButton = (element: HTMLElement, cell: KoliBriTableCell) => {\n\t\tconst data = (cell as { data?: Data }).data;\n\t\tconst id = data?.id;\n\t\tgetRoot(createReactRenderElement(element)).render(<KolButtonWrapper label={`Click ${id}`} />);\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<SampleDescription>\n\t\t\t\t<p>This sample shows KolTableStateless with checkboxes for selection enabled.</p>\n\t\t\t</SampleDescription>\n\n\t\t\t<SampleBlock id=\"selection\" className=\"w-full\">\n\t\t\t\t<KolTableStateless\n\t\t\t\t\t_label=\"Table with selection checkboxes\"\n\t\t\t\t\t_headers={{\n\t\t\t\t\t\thorizontal: [\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t{ key: 'id', label: '#ID', textAlign: 'left' },\n\t\t\t\t\t\t\t\t{ key: 'name', label: 'Name', textAlign: 'left' },\n\t\t\t\t\t\t\t\t{ key: 'action', label: 'Action', textAlign: 'left', render: renderButton },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t],\n\t\t\t\t\t}}\n\t\t\t\t\t_data={DATA}\n\t\t\t\t\t_selection={selection}\n\t\t\t\t\t_on={{ onSelectionChange: handleSelectionChangeCallback }}\n\t\t\t\t\tclassName=\"block\"\n\t\t\t\t\
|
|
1952
|
+
"code": "import type { KoliBriTableCell, KoliBriTableSelection, KoliBriTableSelectionKeys } from '@public-ui/components';\nimport { createReactRenderElement, KolButton, KolTableStateless } from '@public-ui/react-v19';\nimport type { FC } from 'react';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useAlert } from '../../hooks/useAlert';\nimport { getRoot } from '../../shares/react-roots';\nimport { SampleBlock } from '../SampleBlock';\nimport { SampleDescription } from '../SampleDescription';\n\ntype SelectionValue = string | number;\ntype KolTableStatelessElement = {\n\taddEventListener: (type: string, listener: (event: CustomEvent<SelectionValue[]>) => void) => void;\n\tremoveEventListener: (type: string, listener: (event: CustomEvent<SelectionValue[]>) => void) => void;\n};\n\nconst DATA = [\n\t{ id: '1001', name: 'Foo Bar', internalIdentifier: `AAA1001` },\n\t{ id: '1002', name: 'Foo Baz', internalIdentifier: `AAA1002` },\n\t{ id: '1003', name: 'This row is always unchecked', internalIdentifier: `AAA1003` },\n\t{ id: '1004', name: 'This row is always checked', internalIdentifier: `AAA1004` },\n];\ntype Data = (typeof DATA)[0];\n\nfunction KolButtonWrapper({ label }: { label: string }) {\n\tconst { dummyClickEventHandler } = useAlert();\n\n\tconst dummyEventHandler = {\n\t\tonClick: dummyClickEventHandler,\n\t};\n\n\treturn <KolButton _label={label} _on={dummyEventHandler} />;\n}\n\nexport const TableStatelessWithSelection: FC = () => {\n\tconst [selectedKeys, setSelectedKeys] = useState<KoliBriTableSelectionKeys>(['AAA1002', 'AAA1004']);\n\n\tconst selection: KoliBriTableSelection = {\n\t\tlabel: (row) => `Selection for ${(row as Data).name}`,\n\t\tselectedKeys,\n\t\tkeyPropertyName: 'internalIdentifier',\n\t\tdisabledKeys: ['AAA1003', 'AAA1004'],\n\t};\n\n\tconst kolTableStatelessRef = useRef<HTMLKolTableStatelessElement>(null);\n\n\tconst handleSelectionChangeEvent = ({ detail: selection }: CustomEvent<SelectionValue[]>) => {\n\t\tconsole.log('Selection change via event', selection);\n\t};\n\tconst handleSelectionChangeCallback = (_event: Event, selection: SelectionValue[]) => {\n\t\tconsole.log('Selection change via callback', selection);\n\t\tsetSelectedKeys(selection);\n\t};\n\n\tuseEffect(() => {\n\t\tconst tableElement = kolTableStatelessRef.current as unknown as KolTableStatelessElement | null;\n\t\tconst selectionChangeEvent = 'kolSelectionChange';\n\t\ttableElement?.addEventListener(selectionChangeEvent, handleSelectionChangeEvent);\n\n\t\treturn () => {\n\t\t\ttableElement?.removeEventListener(selectionChangeEvent, handleSelectionChangeEvent);\n\t\t};\n\t}, [kolTableStatelessRef]);\n\n\tconst renderButton = (element: HTMLElement, cell: KoliBriTableCell) => {\n\t\tconst data = (cell as { data?: Data }).data;\n\t\tconst id = data?.id;\n\t\tgetRoot(createReactRenderElement(element)).render(<KolButtonWrapper label={`Click ${id}`} />);\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<SampleDescription>\n\t\t\t\t<p>This sample shows KolTableStateless with checkboxes for selection enabled.</p>\n\t\t\t</SampleDescription>\n\n\t\t\t<SampleBlock id=\"selection\" className=\"w-full\">\n\t\t\t\t<KolTableStateless\n\t\t\t\t\t_label=\"Table with selection checkboxes\"\n\t\t\t\t\t_headers={{\n\t\t\t\t\t\thorizontal: [\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t{ key: 'id', label: '#ID', textAlign: 'left', width: 70 },\n\t\t\t\t\t\t\t\t{ key: 'name', label: 'Name', textAlign: 'left', width: 200 },\n\t\t\t\t\t\t\t\t{ key: 'action', label: 'Action', textAlign: 'left', render: renderButton, width: 100 },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t],\n\t\t\t\t\t}}\n\t\t\t\t\t_data={DATA}\n\t\t\t\t\t_selection={selection}\n\t\t\t\t\t_on={{ onSelectionChange: handleSelectionChangeCallback }}\n\t\t\t\t\tclassName=\"block\"\n\t\t\t\t\tref={kolTableStatelessRef}\n\t\t\t\t/>\n\t\t\t</SampleBlock>\n\t\t</>\n\t);\n};\n",
|
|
1953
1953
|
"kind": "sample"
|
|
1954
1954
|
},
|
|
1955
1955
|
{
|
|
@@ -1965,7 +1965,7 @@
|
|
|
1965
1965
|
"group": "table",
|
|
1966
1966
|
"name": "stateless-with-single-selection",
|
|
1967
1967
|
"path": "packages/samples/react/src/components/table/stateless-with-single-selection.tsx",
|
|
1968
|
-
"code": "import type { KoliBriTableCell, KoliBriTableSelection, KoliBriTableSelectionKeys } from '@public-ui/components';\nimport { createReactRenderElement, KolButton, KolTableStateless } from '@public-ui/react-v19';\nimport type { FC } from 'react';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { useAlert } from '../../hooks/useAlert';\nimport { getRoot } from '../../shares/react-roots';\nimport { SampleBlock } from '../SampleBlock';\nimport { SampleDescription } from '../SampleDescription';\n\ntype SelectionValue = string | number;\ntype KolTableStatelessElement = {\n\taddEventListener: (type: string, listener: (event: CustomEvent<SelectionValue[]>) => void) => void;\n\tremoveEventListener: (type: string, listener: (event: CustomEvent<SelectionValue[]>) => void) => void;\n};\n\nconst DATA = [\n\t{ id: '1001', name: 'Foo Bar', internalIdentifier: `AAA1001` },\n\t{ id: '1002', name: 'Foo Baz', internalIdentifier: `AAA1002` },\n\t{ id: '1003', name: 'Foo Disabled', internalIdentifier: `AAA1003` },\n];\ntype Data = (typeof DATA)[0];\n\nfunction KolButtonWrapper({ label }: { label: string }) {\n\tconst { dummyClickEventHandler } = useAlert();\n\n\tconst dummyEventHandler = {\n\t\tonClick: dummyClickEventHandler,\n\t};\n\n\treturn <KolButton _label={label} _on={dummyEventHandler} />;\n}\n\nexport const TableStatelessWithSingleSelection: FC = () => {\n\tconst [selectedKeys, setSelectedKeys] = useState<KoliBriTableSelectionKeys>(['1002']);\n\n\tconst selection: KoliBriTableSelection = {\n\t\tlabel: (row) => `Selection for ${(row as Data).name}`,\n\t\tmultiple: false,\n\t\tselectedKeys,\n\t\tdisabledKeys: ['AAA1003'],\n\t\tkeyPropertyName: 'internalIdentifier',\n\t};\n\n\tconst kolTableStatelessRef = useRef<HTMLKolTableStatelessElement>(null);\n\n\tconst handleSelectionChangeEvent = useCallback(({ detail: selection }: CustomEvent<SelectionValue[]>) => {\n\t\tconsole.log('Selection change via event', selection);\n\t}, []);\n\tconst handleSelectionChangeCallback = useCallback((_event: Event, selection: SelectionValue[]) => {\n\t\tconsole.log('Selection change via callback', selection);\n\t\tsetSelectedKeys(selection);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tconst tableElement = kolTableStatelessRef.current as unknown as KolTableStatelessElement | null;\n\t\tconst selectionChangeEvent = 'kolSelectionChange';\n\t\ttableElement?.addEventListener(selectionChangeEvent, handleSelectionChangeEvent);\n\n\t\treturn () => {\n\t\t\ttableElement?.removeEventListener(selectionChangeEvent, handleSelectionChangeEvent);\n\t\t};\n\t}, [kolTableStatelessRef, handleSelectionChangeEvent]);\n\n\tconst renderButton = useCallback((element: HTMLElement, cell: KoliBriTableCell) => {\n\t\tconst data = (cell as { data?: Data }).data;\n\t\tconst id = data?.id;\n\t\tgetRoot(createReactRenderElement(element)).render(<KolButtonWrapper label={`Click ${id}`} />);\n\t}, []);\n\n\treturn (\n\t\t<>\n\t\t\t<SampleDescription>\n\t\t\t\t<p>This sample shows KolTableStateless with checkboxes for selection enabled.</p>\n\t\t\t</SampleDescription>\n\n\t\t\t<SampleBlock id=\"single-selection\" className=\"w-full\" fitContent>\n\t\t\t\t<KolTableStateless\n\t\t\t\t\t_label=\"Table with selection checkboxes\"\n\t\t\t\t\t_headers={{\n\t\t\t\t\t\thorizontal: [\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t{ key: 'id', label: '#ID', textAlign: 'left' },\n\t\t\t\t\t\t\t\t{ key: 'name', label: 'Name', textAlign: 'left' },\n\t\t\t\t\t\t\t\t{ key: 'action', label: 'Action', textAlign: 'left', render: renderButton },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t],\n\t\t\t\t\t}}\n\t\t\t\t\t_data={DATA}\n\t\t\t\t\t_selection={selection}\n\t\t\t\t\t_on={{ onSelectionChange: handleSelectionChangeCallback }}\n\t\t\t\t\tclassName=\"block\"\n\t\t\t\t\
|
|
1968
|
+
"code": "import type { KoliBriTableCell, KoliBriTableSelection, KoliBriTableSelectionKeys } from '@public-ui/components';\nimport { createReactRenderElement, KolButton, KolTableStateless } from '@public-ui/react-v19';\nimport type { FC } from 'react';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { useAlert } from '../../hooks/useAlert';\nimport { getRoot } from '../../shares/react-roots';\nimport { SampleBlock } from '../SampleBlock';\nimport { SampleDescription } from '../SampleDescription';\n\ntype SelectionValue = string | number;\ntype KolTableStatelessElement = {\n\taddEventListener: (type: string, listener: (event: CustomEvent<SelectionValue[]>) => void) => void;\n\tremoveEventListener: (type: string, listener: (event: CustomEvent<SelectionValue[]>) => void) => void;\n};\n\nconst DATA = [\n\t{ id: '1001', name: 'Foo Bar', internalIdentifier: `AAA1001` },\n\t{ id: '1002', name: 'Foo Baz', internalIdentifier: `AAA1002` },\n\t{ id: '1003', name: 'Foo Disabled', internalIdentifier: `AAA1003` },\n];\ntype Data = (typeof DATA)[0];\n\nfunction KolButtonWrapper({ label }: { label: string }) {\n\tconst { dummyClickEventHandler } = useAlert();\n\n\tconst dummyEventHandler = {\n\t\tonClick: dummyClickEventHandler,\n\t};\n\n\treturn <KolButton _label={label} _on={dummyEventHandler} />;\n}\n\nexport const TableStatelessWithSingleSelection: FC = () => {\n\tconst [selectedKeys, setSelectedKeys] = useState<KoliBriTableSelectionKeys>(['1002']);\n\n\tconst selection: KoliBriTableSelection = {\n\t\tlabel: (row) => `Selection for ${(row as Data).name}`,\n\t\tmultiple: false,\n\t\tselectedKeys,\n\t\tdisabledKeys: ['AAA1003'],\n\t\tkeyPropertyName: 'internalIdentifier',\n\t};\n\n\tconst kolTableStatelessRef = useRef<HTMLKolTableStatelessElement>(null);\n\n\tconst handleSelectionChangeEvent = useCallback(({ detail: selection }: CustomEvent<SelectionValue[]>) => {\n\t\tconsole.log('Selection change via event', selection);\n\t}, []);\n\tconst handleSelectionChangeCallback = useCallback((_event: Event, selection: SelectionValue[]) => {\n\t\tconsole.log('Selection change via callback', selection);\n\t\tsetSelectedKeys(selection);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tconst tableElement = kolTableStatelessRef.current as unknown as KolTableStatelessElement | null;\n\t\tconst selectionChangeEvent = 'kolSelectionChange';\n\t\ttableElement?.addEventListener(selectionChangeEvent, handleSelectionChangeEvent);\n\n\t\treturn () => {\n\t\t\ttableElement?.removeEventListener(selectionChangeEvent, handleSelectionChangeEvent);\n\t\t};\n\t}, [kolTableStatelessRef, handleSelectionChangeEvent]);\n\n\tconst renderButton = useCallback((element: HTMLElement, cell: KoliBriTableCell) => {\n\t\tconst data = (cell as { data?: Data }).data;\n\t\tconst id = data?.id;\n\t\tgetRoot(createReactRenderElement(element)).render(<KolButtonWrapper label={`Click ${id}`} />);\n\t}, []);\n\n\treturn (\n\t\t<>\n\t\t\t<SampleDescription>\n\t\t\t\t<p>This sample shows KolTableStateless with checkboxes for selection enabled.</p>\n\t\t\t</SampleDescription>\n\n\t\t\t<SampleBlock id=\"single-selection\" className=\"w-full\" fitContent>\n\t\t\t\t<KolTableStateless\n\t\t\t\t\t_label=\"Table with selection checkboxes\"\n\t\t\t\t\t_headers={{\n\t\t\t\t\t\thorizontal: [\n\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t{ key: 'id', label: '#ID', textAlign: 'left', width: 100 },\n\t\t\t\t\t\t\t\t{ key: 'name', label: 'Name', textAlign: 'left', width: 200 },\n\t\t\t\t\t\t\t\t{ key: 'action', label: 'Action', textAlign: 'left', render: renderButton, width: 200 },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t],\n\t\t\t\t\t}}\n\t\t\t\t\t_data={DATA}\n\t\t\t\t\t_selection={selection}\n\t\t\t\t\t_on={{ onSelectionChange: handleSelectionChangeCallback }}\n\t\t\t\t\tclassName=\"block\"\n\t\t\t\t\tref={kolTableStatelessRef}\n\t\t\t\t/>\n\t\t\t</SampleBlock>\n\t\t</>\n\t);\n};\n",
|
|
1969
1969
|
"kind": "sample"
|
|
1970
1970
|
},
|
|
1971
1971
|
{
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"stats": {
|
|
19
19
|
"size": 9600,
|
|
20
20
|
"lines": 246,
|
|
21
|
-
"lastModified": "2026-10-
|
|
21
|
+
"lastModified": "2026-10-06T13:52:07.662Z"
|
|
22
22
|
}
|
|
23
23
|
},
|
|
24
24
|
{
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"stats": {
|
|
41
41
|
"size": 3486,
|
|
42
42
|
"lines": 75,
|
|
43
|
-
"lastModified": "2026-10-
|
|
43
|
+
"lastModified": "2026-10-06T13:52:07.662Z"
|
|
44
44
|
}
|
|
45
45
|
},
|
|
46
46
|
{
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
"stats": {
|
|
63
63
|
"size": 2425,
|
|
64
64
|
"lines": 98,
|
|
65
|
-
"lastModified": "2026-10-
|
|
65
|
+
"lastModified": "2026-10-06T13:52:07.701Z"
|
|
66
66
|
}
|
|
67
67
|
},
|
|
68
68
|
{
|
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
"stats": {
|
|
85
85
|
"size": 50,
|
|
86
86
|
"lines": 4,
|
|
87
|
-
"lastModified": "2026-10-
|
|
87
|
+
"lastModified": "2026-10-06T13:52:07.701Z"
|
|
88
88
|
}
|
|
89
89
|
},
|
|
90
90
|
{
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
"stats": {
|
|
107
107
|
"size": 1549,
|
|
108
108
|
"lines": 35,
|
|
109
|
-
"lastModified": "2026-10-
|
|
109
|
+
"lastModified": "2026-10-06T13:52:07.700Z"
|
|
110
110
|
}
|
|
111
111
|
},
|
|
112
112
|
{
|
|
@@ -128,7 +128,7 @@
|
|
|
128
128
|
"stats": {
|
|
129
129
|
"size": 182,
|
|
130
130
|
"lines": 8,
|
|
131
|
-
"lastModified": "2026-10-
|
|
131
|
+
"lastModified": "2026-10-06T13:52:07.697Z"
|
|
132
132
|
}
|
|
133
133
|
},
|
|
134
134
|
{
|
|
@@ -150,7 +150,7 @@
|
|
|
150
150
|
"stats": {
|
|
151
151
|
"size": 4276,
|
|
152
152
|
"lines": 75,
|
|
153
|
-
"lastModified": "2026-10-
|
|
153
|
+
"lastModified": "2026-10-06T13:52:07.688Z"
|
|
154
154
|
}
|
|
155
155
|
},
|
|
156
156
|
{
|
|
@@ -172,7 +172,7 @@
|
|
|
172
172
|
"stats": {
|
|
173
173
|
"size": 2812,
|
|
174
174
|
"lines": 74,
|
|
175
|
-
"lastModified": "2026-10-
|
|
175
|
+
"lastModified": "2026-10-06T13:52:07.678Z"
|
|
176
176
|
}
|
|
177
177
|
},
|
|
178
178
|
{
|
|
@@ -194,7 +194,7 @@
|
|
|
194
194
|
"stats": {
|
|
195
195
|
"size": 587,
|
|
196
196
|
"lines": 56,
|
|
197
|
-
"lastModified": "2026-10-
|
|
197
|
+
"lastModified": "2026-10-06T13:52:07.675Z"
|
|
198
198
|
}
|
|
199
199
|
},
|
|
200
200
|
{
|
|
@@ -216,7 +216,7 @@
|
|
|
216
216
|
"stats": {
|
|
217
217
|
"size": 566,
|
|
218
218
|
"lines": 50,
|
|
219
|
-
"lastModified": "2026-10-
|
|
219
|
+
"lastModified": "2026-10-06T13:52:07.673Z"
|
|
220
220
|
}
|
|
221
221
|
},
|
|
222
222
|
{
|
|
@@ -238,7 +238,7 @@
|
|
|
238
238
|
"stats": {
|
|
239
239
|
"size": 568,
|
|
240
240
|
"lines": 50,
|
|
241
|
-
"lastModified": "2026-10-
|
|
241
|
+
"lastModified": "2026-10-06T13:52:07.672Z"
|
|
242
242
|
}
|
|
243
243
|
},
|
|
244
244
|
{
|
|
@@ -260,7 +260,7 @@
|
|
|
260
260
|
"stats": {
|
|
261
261
|
"size": 601,
|
|
262
262
|
"lines": 45,
|
|
263
|
-
"lastModified": "2026-10-
|
|
263
|
+
"lastModified": "2026-10-06T13:52:07.666Z"
|
|
264
264
|
}
|
|
265
265
|
},
|
|
266
266
|
{
|
|
@@ -282,7 +282,7 @@
|
|
|
282
282
|
"stats": {
|
|
283
283
|
"size": 587,
|
|
284
284
|
"lines": 56,
|
|
285
|
-
"lastModified": "2026-10-
|
|
285
|
+
"lastModified": "2026-10-06T13:52:07.667Z"
|
|
286
286
|
}
|
|
287
287
|
},
|
|
288
288
|
{
|
|
@@ -304,7 +304,7 @@
|
|
|
304
304
|
"stats": {
|
|
305
305
|
"size": 566,
|
|
306
306
|
"lines": 50,
|
|
307
|
-
"lastModified": "2026-10-
|
|
307
|
+
"lastModified": "2026-10-06T13:52:07.664Z"
|
|
308
308
|
}
|
|
309
309
|
},
|
|
310
310
|
{
|
|
@@ -326,7 +326,7 @@
|
|
|
326
326
|
"stats": {
|
|
327
327
|
"size": 615,
|
|
328
328
|
"lines": 50,
|
|
329
|
-
"lastModified": "2026-10-
|
|
329
|
+
"lastModified": "2026-10-06T13:52:07.663Z"
|
|
330
330
|
}
|
|
331
331
|
},
|
|
332
332
|
{
|
|
@@ -348,7 +348,7 @@
|
|
|
348
348
|
"stats": {
|
|
349
349
|
"size": 31,
|
|
350
350
|
"lines": 2,
|
|
351
|
-
"lastModified": "2026-10-
|
|
351
|
+
"lastModified": "2026-10-06T13:52:07.685Z"
|
|
352
352
|
}
|
|
353
353
|
},
|
|
354
354
|
{
|
|
@@ -370,7 +370,7 @@
|
|
|
370
370
|
"stats": {
|
|
371
371
|
"size": 31,
|
|
372
372
|
"lines": 2,
|
|
373
|
-
"lastModified": "2026-10-
|
|
373
|
+
"lastModified": "2026-10-06T13:52:07.684Z"
|
|
374
374
|
}
|
|
375
375
|
},
|
|
376
376
|
{
|
|
@@ -392,7 +392,7 @@
|
|
|
392
392
|
"stats": {
|
|
393
393
|
"size": 25,
|
|
394
394
|
"lines": 2,
|
|
395
|
-
"lastModified": "2026-10-
|
|
395
|
+
"lastModified": "2026-10-06T13:52:07.680Z"
|
|
396
396
|
}
|
|
397
397
|
},
|
|
398
398
|
{
|
|
@@ -414,7 +414,7 @@
|
|
|
414
414
|
"stats": {
|
|
415
415
|
"size": 327,
|
|
416
416
|
"lines": 19,
|
|
417
|
-
"lastModified": "2026-10-
|
|
417
|
+
"lastModified": "2026-10-06T13:52:07.678Z"
|
|
418
418
|
}
|
|
419
419
|
},
|
|
420
420
|
{
|
|
@@ -436,7 +436,7 @@
|
|
|
436
436
|
"stats": {
|
|
437
437
|
"size": 416,
|
|
438
438
|
"lines": 2,
|
|
439
|
-
"lastModified": "2026-10-
|
|
439
|
+
"lastModified": "2026-10-06T13:52:07.673Z"
|
|
440
440
|
}
|
|
441
441
|
},
|
|
442
442
|
{
|
|
@@ -458,7 +458,7 @@
|
|
|
458
458
|
"stats": {
|
|
459
459
|
"size": 416,
|
|
460
460
|
"lines": 2,
|
|
461
|
-
"lastModified": "2026-10-
|
|
461
|
+
"lastModified": "2026-10-06T13:52:07.665Z"
|
|
462
462
|
}
|
|
463
463
|
},
|
|
464
464
|
{
|
|
@@ -481,7 +481,7 @@
|
|
|
481
481
|
"stats": {
|
|
482
482
|
"size": 88,
|
|
483
483
|
"lines": 6,
|
|
484
|
-
"lastModified": "2026-10-
|
|
484
|
+
"lastModified": "2026-10-06T13:52:07.697Z"
|
|
485
485
|
}
|
|
486
486
|
},
|
|
487
487
|
{
|
|
@@ -503,7 +503,7 @@
|
|
|
503
503
|
"stats": {
|
|
504
504
|
"size": 0,
|
|
505
505
|
"lines": 1,
|
|
506
|
-
"lastModified": "2026-10-
|
|
506
|
+
"lastModified": "2026-10-06T13:52:07.682Z"
|
|
507
507
|
}
|
|
508
508
|
},
|
|
509
509
|
{
|
|
@@ -525,7 +525,7 @@
|
|
|
525
525
|
"stats": {
|
|
526
526
|
"size": 0,
|
|
527
527
|
"lines": 1,
|
|
528
|
-
"lastModified": "2026-10-
|
|
528
|
+
"lastModified": "2026-10-06T13:52:07.682Z"
|
|
529
529
|
}
|
|
530
530
|
},
|
|
531
531
|
{
|
|
@@ -547,7 +547,7 @@
|
|
|
547
547
|
"stats": {
|
|
548
548
|
"size": 21,
|
|
549
549
|
"lines": 2,
|
|
550
|
-
"lastModified": "2026-10-
|
|
550
|
+
"lastModified": "2026-10-06T13:52:07.682Z"
|
|
551
551
|
}
|
|
552
552
|
},
|
|
553
553
|
{
|
|
@@ -569,7 +569,7 @@
|
|
|
569
569
|
"stats": {
|
|
570
570
|
"size": 23,
|
|
571
571
|
"lines": 2,
|
|
572
|
-
"lastModified": "2026-10-
|
|
572
|
+
"lastModified": "2026-10-06T13:52:07.681Z"
|
|
573
573
|
}
|
|
574
574
|
},
|
|
575
575
|
{
|
|
@@ -591,7 +591,7 @@
|
|
|
591
591
|
"stats": {
|
|
592
592
|
"size": 25,
|
|
593
593
|
"lines": 2,
|
|
594
|
-
"lastModified": "2026-10-
|
|
594
|
+
"lastModified": "2026-10-06T13:52:07.681Z"
|
|
595
595
|
}
|
|
596
596
|
},
|
|
597
597
|
{
|
|
@@ -613,7 +613,7 @@
|
|
|
613
613
|
"stats": {
|
|
614
614
|
"size": 220,
|
|
615
615
|
"lines": 20,
|
|
616
|
-
"lastModified": "2026-10-
|
|
616
|
+
"lastModified": "2026-10-06T13:52:07.683Z"
|
|
617
617
|
}
|
|
618
618
|
},
|
|
619
619
|
{
|
|
@@ -635,7 +635,7 @@
|
|
|
635
635
|
"stats": {
|
|
636
636
|
"size": 587,
|
|
637
637
|
"lines": 56,
|
|
638
|
-
"lastModified": "2026-10-
|
|
638
|
+
"lastModified": "2026-10-06T13:52:08.506Z"
|
|
639
639
|
}
|
|
640
640
|
},
|
|
641
641
|
{
|
|
@@ -658,7 +658,7 @@
|
|
|
658
658
|
"stats": {
|
|
659
659
|
"size": 472,
|
|
660
660
|
"lines": 14,
|
|
661
|
-
"lastModified": "2026-10-
|
|
661
|
+
"lastModified": "2026-10-06T13:52:08.512Z"
|
|
662
662
|
}
|
|
663
663
|
},
|
|
664
664
|
{
|
|
@@ -681,7 +681,7 @@
|
|
|
681
681
|
"stats": {
|
|
682
682
|
"size": 35,
|
|
683
683
|
"lines": 4,
|
|
684
|
-
"lastModified": "2026-10-
|
|
684
|
+
"lastModified": "2026-10-06T13:52:08.512Z"
|
|
685
685
|
}
|
|
686
686
|
},
|
|
687
687
|
{
|
|
@@ -704,7 +704,7 @@
|
|
|
704
704
|
"stats": {
|
|
705
705
|
"size": 43,
|
|
706
706
|
"lines": 2,
|
|
707
|
-
"lastModified": "2026-10-
|
|
707
|
+
"lastModified": "2026-10-06T13:52:08.512Z"
|
|
708
708
|
}
|
|
709
709
|
},
|
|
710
710
|
{
|
|
@@ -727,7 +727,7 @@
|
|
|
727
727
|
"stats": {
|
|
728
728
|
"size": 916,
|
|
729
729
|
"lines": 39,
|
|
730
|
-
"lastModified": "2026-10-
|
|
730
|
+
"lastModified": "2026-10-06T13:52:08.512Z"
|
|
731
731
|
}
|
|
732
732
|
},
|
|
733
733
|
{
|
|
@@ -750,7 +750,7 @@
|
|
|
750
750
|
"stats": {
|
|
751
751
|
"size": 368,
|
|
752
752
|
"lines": 13,
|
|
753
|
-
"lastModified": "2026-10-
|
|
753
|
+
"lastModified": "2026-10-06T13:52:08.512Z"
|
|
754
754
|
}
|
|
755
755
|
},
|
|
756
756
|
{
|
|
@@ -773,7 +773,7 @@
|
|
|
773
773
|
"stats": {
|
|
774
774
|
"size": 97,
|
|
775
775
|
"lines": 5,
|
|
776
|
-
"lastModified": "2026-10-
|
|
776
|
+
"lastModified": "2026-10-06T13:52:08.512Z"
|
|
777
777
|
}
|
|
778
778
|
},
|
|
779
779
|
{
|
|
@@ -796,7 +796,7 @@
|
|
|
796
796
|
"stats": {
|
|
797
797
|
"size": 2358,
|
|
798
798
|
"lines": 44,
|
|
799
|
-
"lastModified": "2026-10-
|
|
799
|
+
"lastModified": "2026-10-06T13:52:08.512Z"
|
|
800
800
|
}
|
|
801
801
|
},
|
|
802
802
|
{
|
|
@@ -819,7 +819,7 @@
|
|
|
819
819
|
"stats": {
|
|
820
820
|
"size": 9997,
|
|
821
821
|
"lines": 367,
|
|
822
|
-
"lastModified": "2026-10-
|
|
822
|
+
"lastModified": "2026-10-06T13:52:08.510Z"
|
|
823
823
|
}
|
|
824
824
|
},
|
|
825
825
|
{
|
|
@@ -842,7 +842,7 @@
|
|
|
842
842
|
"stats": {
|
|
843
843
|
"size": 1199,
|
|
844
844
|
"lines": 34,
|
|
845
|
-
"lastModified": "2026-10-
|
|
845
|
+
"lastModified": "2026-10-06T13:52:08.510Z"
|
|
846
846
|
}
|
|
847
847
|
},
|
|
848
848
|
{
|
|
@@ -865,7 +865,7 @@
|
|
|
865
865
|
"stats": {
|
|
866
866
|
"size": 10353,
|
|
867
867
|
"lines": 555,
|
|
868
|
-
"lastModified": "2026-10-
|
|
868
|
+
"lastModified": "2026-10-06T13:52:08.509Z"
|
|
869
869
|
}
|
|
870
870
|
},
|
|
871
871
|
{
|
|
@@ -888,7 +888,7 @@
|
|
|
888
888
|
"stats": {
|
|
889
889
|
"size": 646,
|
|
890
890
|
"lines": 21,
|
|
891
|
-
"lastModified": "2026-10-
|
|
891
|
+
"lastModified": "2026-10-06T13:52:08.512Z"
|
|
892
892
|
}
|
|
893
893
|
},
|
|
894
894
|
{
|
|
@@ -911,7 +911,7 @@
|
|
|
911
911
|
"stats": {
|
|
912
912
|
"size": 519,
|
|
913
913
|
"lines": 19,
|
|
914
|
-
"lastModified": "2026-10-
|
|
914
|
+
"lastModified": "2026-10-06T13:52:08.512Z"
|
|
915
915
|
}
|
|
916
916
|
},
|
|
917
917
|
{
|
|
@@ -934,7 +934,7 @@
|
|
|
934
934
|
"stats": {
|
|
935
935
|
"size": 670,
|
|
936
936
|
"lines": 22,
|
|
937
|
-
"lastModified": "2026-10-
|
|
937
|
+
"lastModified": "2026-10-06T13:52:08.511Z"
|
|
938
938
|
}
|
|
939
939
|
},
|
|
940
940
|
{
|
|
@@ -957,7 +957,7 @@
|
|
|
957
957
|
"stats": {
|
|
958
958
|
"size": 3451,
|
|
959
959
|
"lines": 9,
|
|
960
|
-
"lastModified": "2026-10-
|
|
960
|
+
"lastModified": "2026-10-06T13:52:08.511Z"
|
|
961
961
|
}
|
|
962
962
|
},
|
|
963
963
|
{
|
|
@@ -980,7 +980,7 @@
|
|
|
980
980
|
"stats": {
|
|
981
981
|
"size": 10313,
|
|
982
982
|
"lines": 46,
|
|
983
|
-
"lastModified": "2026-10-
|
|
983
|
+
"lastModified": "2026-10-06T13:52:08.510Z"
|
|
984
984
|
}
|
|
985
985
|
},
|
|
986
986
|
{
|
|
@@ -1003,7 +1003,7 @@
|
|
|
1003
1003
|
"stats": {
|
|
1004
1004
|
"size": 107635,
|
|
1005
1005
|
"lines": 364,
|
|
1006
|
-
"lastModified": "2026-10-
|
|
1006
|
+
"lastModified": "2026-10-06T13:52:08.510Z"
|
|
1007
1007
|
}
|
|
1008
1008
|
},
|
|
1009
1009
|
{
|
|
@@ -1026,7 +1026,7 @@
|
|
|
1026
1026
|
"stats": {
|
|
1027
1027
|
"size": 64024,
|
|
1028
1028
|
"lines": 323,
|
|
1029
|
-
"lastModified": "2026-10-
|
|
1029
|
+
"lastModified": "2026-10-06T13:52:08.510Z"
|
|
1030
1030
|
}
|
|
1031
1031
|
},
|
|
1032
1032
|
{
|
|
@@ -1049,7 +1049,7 @@
|
|
|
1049
1049
|
"stats": {
|
|
1050
1050
|
"size": 23737,
|
|
1051
1051
|
"lines": 110,
|
|
1052
|
-
"lastModified": "2026-10-
|
|
1052
|
+
"lastModified": "2026-10-06T13:52:08.510Z"
|
|
1053
1053
|
}
|
|
1054
1054
|
},
|
|
1055
1055
|
{
|
|
@@ -1072,7 +1072,7 @@
|
|
|
1072
1072
|
"stats": {
|
|
1073
1073
|
"size": 18200,
|
|
1074
1074
|
"lines": 75,
|
|
1075
|
-
"lastModified": "2026-10-
|
|
1075
|
+
"lastModified": "2026-10-06T13:52:08.510Z"
|
|
1076
1076
|
}
|
|
1077
1077
|
},
|
|
1078
1078
|
{
|
|
@@ -1095,7 +1095,7 @@
|
|
|
1095
1095
|
"stats": {
|
|
1096
1096
|
"size": 12909,
|
|
1097
1097
|
"lines": 87,
|
|
1098
|
-
"lastModified": "2026-10-
|
|
1098
|
+
"lastModified": "2026-10-06T13:52:08.510Z"
|
|
1099
1099
|
}
|
|
1100
1100
|
},
|
|
1101
1101
|
{
|
|
@@ -1118,7 +1118,7 @@
|
|
|
1118
1118
|
"stats": {
|
|
1119
1119
|
"size": 19632,
|
|
1120
1120
|
"lines": 75,
|
|
1121
|
-
"lastModified": "2026-10-
|
|
1121
|
+
"lastModified": "2026-10-06T13:52:08.510Z"
|
|
1122
1122
|
}
|
|
1123
1123
|
},
|
|
1124
1124
|
{
|
|
@@ -1141,7 +1141,7 @@
|
|
|
1141
1141
|
"stats": {
|
|
1142
1142
|
"size": 8806,
|
|
1143
1143
|
"lines": 38,
|
|
1144
|
-
"lastModified": "2026-10-
|
|
1144
|
+
"lastModified": "2026-10-06T13:52:08.510Z"
|
|
1145
1145
|
}
|
|
1146
1146
|
},
|
|
1147
1147
|
{
|
|
@@ -1164,7 +1164,7 @@
|
|
|
1164
1164
|
"stats": {
|
|
1165
1165
|
"size": 103382,
|
|
1166
1166
|
"lines": 377,
|
|
1167
|
-
"lastModified": "2026-10-
|
|
1167
|
+
"lastModified": "2026-10-06T13:52:08.510Z"
|
|
1168
1168
|
}
|
|
1169
1169
|
},
|
|
1170
1170
|
{
|
|
@@ -1187,7 +1187,7 @@
|
|
|
1187
1187
|
"stats": {
|
|
1188
1188
|
"size": 3703,
|
|
1189
1189
|
"lines": 21,
|
|
1190
|
-
"lastModified": "2026-10-
|
|
1190
|
+
"lastModified": "2026-10-06T13:52:08.510Z"
|
|
1191
1191
|
}
|
|
1192
1192
|
},
|
|
1193
1193
|
{
|
|
@@ -1210,7 +1210,7 @@
|
|
|
1210
1210
|
"stats": {
|
|
1211
1211
|
"size": 35770,
|
|
1212
1212
|
"lines": 74,
|
|
1213
|
-
"lastModified": "2026-10-
|
|
1213
|
+
"lastModified": "2026-10-06T13:52:08.510Z"
|
|
1214
1214
|
}
|
|
1215
1215
|
},
|
|
1216
1216
|
{
|
|
@@ -1233,7 +1233,7 @@
|
|
|
1233
1233
|
"stats": {
|
|
1234
1234
|
"size": 2763,
|
|
1235
1235
|
"lines": 89,
|
|
1236
|
-
"lastModified": "2026-10-
|
|
1236
|
+
"lastModified": "2026-10-06T13:52:08.512Z"
|
|
1237
1237
|
}
|
|
1238
1238
|
},
|
|
1239
1239
|
{
|
|
@@ -1256,7 +1256,7 @@
|
|
|
1256
1256
|
"stats": {
|
|
1257
1257
|
"size": 1234,
|
|
1258
1258
|
"lines": 48,
|
|
1259
|
-
"lastModified": "2026-10-
|
|
1259
|
+
"lastModified": "2026-10-06T13:52:08.512Z"
|
|
1260
1260
|
}
|
|
1261
1261
|
},
|
|
1262
1262
|
{
|
|
@@ -1279,7 +1279,7 @@
|
|
|
1279
1279
|
"stats": {
|
|
1280
1280
|
"size": 897,
|
|
1281
1281
|
"lines": 36,
|
|
1282
|
-
"lastModified": "2026-10-
|
|
1282
|
+
"lastModified": "2026-10-06T13:52:08.512Z"
|
|
1283
1283
|
}
|
|
1284
1284
|
},
|
|
1285
1285
|
{
|
|
@@ -1302,7 +1302,7 @@
|
|
|
1302
1302
|
"stats": {
|
|
1303
1303
|
"size": 881,
|
|
1304
1304
|
"lines": 34,
|
|
1305
|
-
"lastModified": "2026-10-
|
|
1305
|
+
"lastModified": "2026-10-06T13:52:08.512Z"
|
|
1306
1306
|
}
|
|
1307
1307
|
},
|
|
1308
1308
|
{
|
|
@@ -1325,7 +1325,7 @@
|
|
|
1325
1325
|
"stats": {
|
|
1326
1326
|
"size": 1587,
|
|
1327
1327
|
"lines": 56,
|
|
1328
|
-
"lastModified": "2026-10-
|
|
1328
|
+
"lastModified": "2026-10-06T13:52:08.512Z"
|
|
1329
1329
|
}
|
|
1330
1330
|
},
|
|
1331
1331
|
{
|
|
@@ -1348,7 +1348,7 @@
|
|
|
1348
1348
|
"stats": {
|
|
1349
1349
|
"size": 1226,
|
|
1350
1350
|
"lines": 49,
|
|
1351
|
-
"lastModified": "2026-10-
|
|
1351
|
+
"lastModified": "2026-10-06T13:52:08.512Z"
|
|
1352
1352
|
}
|
|
1353
1353
|
},
|
|
1354
1354
|
{
|
|
@@ -1371,7 +1371,7 @@
|
|
|
1371
1371
|
"stats": {
|
|
1372
1372
|
"size": 1446,
|
|
1373
1373
|
"lines": 57,
|
|
1374
|
-
"lastModified": "2026-10-
|
|
1374
|
+
"lastModified": "2026-10-06T13:52:08.512Z"
|
|
1375
1375
|
}
|
|
1376
1376
|
},
|
|
1377
1377
|
{
|
|
@@ -1394,7 +1394,7 @@
|
|
|
1394
1394
|
"stats": {
|
|
1395
1395
|
"size": 293,
|
|
1396
1396
|
"lines": 13,
|
|
1397
|
-
"lastModified": "2026-10-
|
|
1397
|
+
"lastModified": "2026-10-06T13:52:08.512Z"
|
|
1398
1398
|
}
|
|
1399
1399
|
},
|
|
1400
1400
|
{
|
|
@@ -1417,7 +1417,7 @@
|
|
|
1417
1417
|
"stats": {
|
|
1418
1418
|
"size": 453,
|
|
1419
1419
|
"lines": 21,
|
|
1420
|
-
"lastModified": "2026-10-
|
|
1420
|
+
"lastModified": "2026-10-06T13:52:08.512Z"
|
|
1421
1421
|
}
|
|
1422
1422
|
},
|
|
1423
1423
|
{
|
|
@@ -1440,7 +1440,7 @@
|
|
|
1440
1440
|
"stats": {
|
|
1441
1441
|
"size": 149,
|
|
1442
1442
|
"lines": 7,
|
|
1443
|
-
"lastModified": "2026-10-
|
|
1443
|
+
"lastModified": "2026-10-06T13:52:08.512Z"
|
|
1444
1444
|
}
|
|
1445
1445
|
},
|
|
1446
1446
|
{
|
|
@@ -1463,7 +1463,7 @@
|
|
|
1463
1463
|
"stats": {
|
|
1464
1464
|
"size": 3978,
|
|
1465
1465
|
"lines": 140,
|
|
1466
|
-
"lastModified": "2026-10-
|
|
1466
|
+
"lastModified": "2026-10-06T13:52:09.838Z"
|
|
1467
1467
|
}
|
|
1468
1468
|
},
|
|
1469
1469
|
{
|
|
@@ -1486,7 +1486,7 @@
|
|
|
1486
1486
|
"stats": {
|
|
1487
1487
|
"size": 4209,
|
|
1488
1488
|
"lines": 140,
|
|
1489
|
-
"lastModified": "2026-10-
|
|
1489
|
+
"lastModified": "2026-10-06T13:52:09.838Z"
|
|
1490
1490
|
}
|
|
1491
1491
|
},
|
|
1492
1492
|
{
|
|
@@ -1509,7 +1509,7 @@
|
|
|
1509
1509
|
"stats": {
|
|
1510
1510
|
"size": 9615,
|
|
1511
1511
|
"lines": 318,
|
|
1512
|
-
"lastModified": "2026-10-
|
|
1512
|
+
"lastModified": "2026-10-06T13:52:09.838Z"
|
|
1513
1513
|
}
|
|
1514
1514
|
},
|
|
1515
1515
|
{
|
|
@@ -1532,7 +1532,7 @@
|
|
|
1532
1532
|
"stats": {
|
|
1533
1533
|
"size": 14891,
|
|
1534
1534
|
"lines": 466,
|
|
1535
|
-
"lastModified": "2026-10-
|
|
1535
|
+
"lastModified": "2026-10-06T13:52:09.838Z"
|
|
1536
1536
|
}
|
|
1537
1537
|
},
|
|
1538
1538
|
{
|
|
@@ -1556,7 +1556,7 @@
|
|
|
1556
1556
|
"stats": {
|
|
1557
1557
|
"size": 350,
|
|
1558
1558
|
"lines": 12,
|
|
1559
|
-
"lastModified": "2026-10-
|
|
1559
|
+
"lastModified": "2026-10-06T13:52:09.867Z"
|
|
1560
1560
|
}
|
|
1561
1561
|
},
|
|
1562
1562
|
{
|
|
@@ -1580,7 +1580,7 @@
|
|
|
1580
1580
|
"stats": {
|
|
1581
1581
|
"size": 77,
|
|
1582
1582
|
"lines": 5,
|
|
1583
|
-
"lastModified": "2026-10-
|
|
1583
|
+
"lastModified": "2026-10-06T13:52:09.867Z"
|
|
1584
1584
|
}
|
|
1585
1585
|
},
|
|
1586
1586
|
{
|
|
@@ -1604,7 +1604,7 @@
|
|
|
1604
1604
|
"stats": {
|
|
1605
1605
|
"size": 720,
|
|
1606
1606
|
"lines": 44,
|
|
1607
|
-
"lastModified": "2026-10-
|
|
1607
|
+
"lastModified": "2026-10-06T13:52:09.867Z"
|
|
1608
1608
|
}
|
|
1609
1609
|
},
|
|
1610
1610
|
{
|
|
@@ -1628,7 +1628,7 @@
|
|
|
1628
1628
|
"stats": {
|
|
1629
1629
|
"size": 7031,
|
|
1630
1630
|
"lines": 276,
|
|
1631
|
-
"lastModified": "2026-10-
|
|
1631
|
+
"lastModified": "2026-10-06T13:52:09.867Z"
|
|
1632
1632
|
}
|
|
1633
1633
|
},
|
|
1634
1634
|
{
|
|
@@ -1652,7 +1652,7 @@
|
|
|
1652
1652
|
"stats": {
|
|
1653
1653
|
"size": 313,
|
|
1654
1654
|
"lines": 18,
|
|
1655
|
-
"lastModified": "2026-10-
|
|
1655
|
+
"lastModified": "2026-10-06T13:52:09.867Z"
|
|
1656
1656
|
}
|
|
1657
1657
|
},
|
|
1658
1658
|
{
|
|
@@ -1676,7 +1676,7 @@
|
|
|
1676
1676
|
"stats": {
|
|
1677
1677
|
"size": 92,
|
|
1678
1678
|
"lines": 6,
|
|
1679
|
-
"lastModified": "2026-10-
|
|
1679
|
+
"lastModified": "2026-10-06T13:52:09.867Z"
|
|
1680
1680
|
}
|
|
1681
1681
|
},
|
|
1682
1682
|
{
|
|
@@ -1700,7 +1700,7 @@
|
|
|
1700
1700
|
"stats": {
|
|
1701
1701
|
"size": 94,
|
|
1702
1702
|
"lines": 6,
|
|
1703
|
-
"lastModified": "2026-10-
|
|
1703
|
+
"lastModified": "2026-10-06T13:52:09.867Z"
|
|
1704
1704
|
}
|
|
1705
1705
|
},
|
|
1706
1706
|
{
|
|
@@ -1724,7 +1724,7 @@
|
|
|
1724
1724
|
"stats": {
|
|
1725
1725
|
"size": 120,
|
|
1726
1726
|
"lines": 8,
|
|
1727
|
-
"lastModified": "2026-10-
|
|
1727
|
+
"lastModified": "2026-10-06T13:52:09.838Z"
|
|
1728
1728
|
}
|
|
1729
1729
|
},
|
|
1730
1730
|
{
|
|
@@ -1747,7 +1747,7 @@
|
|
|
1747
1747
|
"stats": {
|
|
1748
1748
|
"size": 818,
|
|
1749
1749
|
"lines": 32,
|
|
1750
|
-
"lastModified": "2026-10-
|
|
1750
|
+
"lastModified": "2026-10-06T13:52:09.868Z"
|
|
1751
1751
|
}
|
|
1752
1752
|
},
|
|
1753
1753
|
{
|
|
@@ -1770,7 +1770,7 @@
|
|
|
1770
1770
|
"stats": {
|
|
1771
1771
|
"size": 3041,
|
|
1772
1772
|
"lines": 90,
|
|
1773
|
-
"lastModified": "2026-10-
|
|
1773
|
+
"lastModified": "2026-10-06T13:52:09.840Z"
|
|
1774
1774
|
}
|
|
1775
1775
|
},
|
|
1776
1776
|
{
|
|
@@ -1793,7 +1793,7 @@
|
|
|
1793
1793
|
"stats": {
|
|
1794
1794
|
"size": 667863,
|
|
1795
1795
|
"lines": 18947,
|
|
1796
|
-
"lastModified": "2026-10-
|
|
1796
|
+
"lastModified": "2026-10-06T13:52:09.840Z"
|
|
1797
1797
|
}
|
|
1798
1798
|
}
|
|
1799
1799
|
]
|