@navikt/ds-react 8.2.2 → 8.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/cjs/data/stories/DataTableProfiler.d.ts +6 -0
  2. package/cjs/data/stories/DataTableProfiler.js +124 -0
  3. package/cjs/data/stories/DataTableProfiler.js.map +1 -0
  4. package/cjs/data/stories/dummy-data.d.ts +2 -3
  5. package/cjs/data/stories/dummy-data.js +30 -9
  6. package/cjs/data/stories/dummy-data.js.map +1 -1
  7. package/cjs/data/table/index.d.ts +2 -2
  8. package/cjs/data/table/index.js +2 -1
  9. package/cjs/data/table/index.js.map +1 -1
  10. package/cjs/data/table/root/DataTableRoot.d.ts +15 -2
  11. package/cjs/data/table/root/DataTableRoot.js +4 -1
  12. package/cjs/data/table/root/DataTableRoot.js.map +1 -1
  13. package/cjs/data/table/tfoot/DataTableTfoot.d.ts +5 -0
  14. package/cjs/data/table/tfoot/DataTableTfoot.js +55 -0
  15. package/cjs/data/table/tfoot/DataTableTfoot.js.map +1 -0
  16. package/cjs/data/table/th/DataTableTh.d.ts +20 -4
  17. package/cjs/data/table/th/DataTableTh.js +24 -6
  18. package/cjs/data/table/th/DataTableTh.js.map +1 -1
  19. package/cjs/data/table/th/DataTableThActions.d.ts +5 -0
  20. package/cjs/data/table/th/DataTableThActions.js +23 -0
  21. package/cjs/data/table/th/DataTableThActions.js.map +1 -0
  22. package/cjs/data/table/th/DataTableThSortHandle.d.ts +6 -0
  23. package/cjs/data/table/th/DataTableThSortHandle.js +82 -0
  24. package/cjs/data/table/th/DataTableThSortHandle.js.map +1 -0
  25. package/cjs/tooltip/Tooltip.d.ts +1 -1
  26. package/cjs/tooltip/Tooltip.js +35 -2
  27. package/cjs/tooltip/Tooltip.js.map +1 -1
  28. package/cjs/utils/i18n/locales/en.d.ts +3 -0
  29. package/cjs/utils/i18n/locales/en.js +3 -0
  30. package/cjs/utils/i18n/locales/en.js.map +1 -1
  31. package/cjs/utils/i18n/locales/nb.d.ts +4 -0
  32. package/cjs/utils/i18n/locales/nb.js +4 -0
  33. package/cjs/utils/i18n/locales/nb.js.map +1 -1
  34. package/cjs/utils/i18n/locales/nn.d.ts +3 -0
  35. package/cjs/utils/i18n/locales/nn.js +3 -0
  36. package/cjs/utils/i18n/locales/nn.js.map +1 -1
  37. package/esm/data/stories/DataTableProfiler.d.ts +6 -0
  38. package/esm/data/stories/DataTableProfiler.js +89 -0
  39. package/esm/data/stories/DataTableProfiler.js.map +1 -0
  40. package/esm/data/stories/dummy-data.d.ts +2 -3
  41. package/esm/data/stories/dummy-data.js +30 -9
  42. package/esm/data/stories/dummy-data.js.map +1 -1
  43. package/esm/data/table/index.d.ts +2 -2
  44. package/esm/data/table/index.js +1 -1
  45. package/esm/data/table/index.js.map +1 -1
  46. package/esm/data/table/root/DataTableRoot.d.ts +15 -2
  47. package/esm/data/table/root/DataTableRoot.js +3 -1
  48. package/esm/data/table/root/DataTableRoot.js.map +1 -1
  49. package/esm/data/table/tfoot/DataTableTfoot.d.ts +5 -0
  50. package/esm/data/table/tfoot/DataTableTfoot.js +19 -0
  51. package/esm/data/table/tfoot/DataTableTfoot.js.map +1 -0
  52. package/esm/data/table/th/DataTableTh.d.ts +20 -4
  53. package/esm/data/table/th/DataTableTh.js +25 -7
  54. package/esm/data/table/th/DataTableTh.js.map +1 -1
  55. package/esm/data/table/th/DataTableThActions.d.ts +5 -0
  56. package/esm/data/table/th/DataTableThActions.js +18 -0
  57. package/esm/data/table/th/DataTableThActions.js.map +1 -0
  58. package/esm/data/table/th/DataTableThSortHandle.d.ts +6 -0
  59. package/esm/data/table/th/DataTableThSortHandle.js +47 -0
  60. package/esm/data/table/th/DataTableThSortHandle.js.map +1 -0
  61. package/esm/tooltip/Tooltip.d.ts +1 -1
  62. package/esm/tooltip/Tooltip.js +35 -2
  63. package/esm/tooltip/Tooltip.js.map +1 -1
  64. package/esm/utils/i18n/locales/en.d.ts +3 -0
  65. package/esm/utils/i18n/locales/en.js +3 -0
  66. package/esm/utils/i18n/locales/en.js.map +1 -1
  67. package/esm/utils/i18n/locales/nb.d.ts +4 -0
  68. package/esm/utils/i18n/locales/nb.js +4 -0
  69. package/esm/utils/i18n/locales/nb.js.map +1 -1
  70. package/esm/utils/i18n/locales/nn.d.ts +3 -0
  71. package/esm/utils/i18n/locales/nn.js +3 -0
  72. package/esm/utils/i18n/locales/nn.js.map +1 -1
  73. package/package.json +3 -3
  74. package/src/data/stories/DataTableProfiler.tsx +215 -0
  75. package/src/data/stories/dummy-data.tsx +39 -17
  76. package/src/data/table/index.tsx +2 -0
  77. package/src/data/table/root/DataTableRoot.tsx +19 -0
  78. package/src/data/table/tfoot/DataTableTfoot.tsx +21 -0
  79. package/src/data/table/th/DataTableTh.tsx +68 -31
  80. package/src/data/table/th/DataTableThActions.tsx +32 -0
  81. package/src/data/table/th/DataTableThSortHandle.tsx +67 -0
  82. package/src/tooltip/Tooltip.tsx +66 -11
  83. package/src/utils/i18n/locales/en.ts +3 -0
  84. package/src/utils/i18n/locales/nb.ts +3 -0
  85. package/src/utils/i18n/locales/nn.ts +3 -0
@@ -1 +1 @@
1
- {"version":3,"file":"nb.js","sourceRoot":"","sources":["../../../../src/utils/i18n/locales/nb.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nb.js","sourceRoot":"","sources":["../../../../src/utils/i18n/locales/nb.ts"],"names":[],"mappings":"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"}
@@ -128,5 +128,8 @@ declare const _default: {
128
128
  reset: string;
129
129
  };
130
130
  };
131
+ Tooltip: {
132
+ shortcutSeparator: string;
133
+ };
131
134
  };
132
135
  export default _default;
@@ -129,5 +129,8 @@ export default {
129
129
  reset: "Tilbakestill tidsperspektiv",
130
130
  },
131
131
  },
132
+ Tooltip: {
133
+ shortcutSeparator: "eller",
134
+ },
132
135
  };
133
136
  //# sourceMappingURL=nn.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"nn.js","sourceRoot":"","sources":["../../../../src/utils/i18n/locales/nn.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nn.js","sourceRoot":"","sources":["../../../../src/utils/i18n/locales/nn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAGrC,eAAe;IACb,MAAM,EAAE;QACN,UAAU,EAAE,EAAE;QACd,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE,YAAY;QACtB,QAAQ,EAAE,gBAAgB;QAC1B,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,UAAU;QACnB,YAAY,EAAE,aAAa;KAC5B;IACD,KAAK,EAAE;QACL,SAAS,EAAE;YACT,WAAW,EAAE,OAAO;SACrB;KACF;IACD,QAAQ,EAAE;QACR,SAAS,EAAE,UAAU;QACrB,SAAS,EAAE,iBAAiB;QAC5B,OAAO,EAAE,QAAQ;QACjB,WAAW,EAAE,qCAAqC;KACnD;IACD,UAAU,EAAE;QACV,KAAK,EAAE,QAAQ;QACf,UAAU,EAAE,UAAU;KACvB;IACD,UAAU,EAAE;QACV,UAAU,EAAE,UAAU;QACtB,WAAW,EAAE,YAAY;QACzB,eAAe,EAAE,yBAAyB;QAC1C,WAAW,EAAE,WAAW;QACxB,IAAI,EAAE,MAAM;QACZ,UAAU,EAAE,aAAa;QACzB,gBAAgB,EAAE,iBAAiB;QACnC,KAAK,EAAE,OAAO;QACd,aAAa,EAAE,oBAAoB;QACnC,iBAAiB,EAAE,oBAAoB;QACvC,IAAI,EAAE,IAAI;QACV,YAAY,EAAE,iBAAiB;QAC/B,gBAAgB,EAAE,iBAAiB;QACnC,cAAc,EAAE,iBAAiB;QACjC,eAAe,EAAE,mBAAmB;QACpC,eAAe,EAAE,iBAAiB;QAClC,gBAAgB,EAAE,mBAAmB;KACtC;IACD,YAAY,EAAE;QACZ,OAAO,EAAE,gDAAgD;KAC1D;IACD,UAAU,EAAE;QACV,QAAQ,EAAE;YACR,MAAM,EAAE,SAAS;YACjB,cAAc,EAAE,WAAW;YAC3B,WAAW,EAAE,uBAAuB;YACpC,mBAAmB,EAAE,wBAAwB;YAC7C,IAAI,EAAE,OAAO;YACb,EAAE,EAAE,OAAO;YACX,QAAQ,EAAE,6BAA6B;YACvC,iBAAiB,EAAE,qCAAqC;SACzD;QACD,IAAI,EAAE;YACJ,gBAAgB,EAAE,+BAA+B;YACjD,iBAAiB,EAAE,YAAY;YAC/B,SAAS,EAAE,aAAa;YACxB,WAAW,EAAE,aAAa;SAC3B;KACF;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,mCAAmC;QACzC,YAAY,EAAE,eAAe;QAC7B,YAAY,EAAE,iBAAiB;KAChC;IACD,WAAW,EAAE;QACX,UAAU,EAAE,YAAY;KACzB;IACD,UAAU,EAAE;QACV,iBAAiB,EAAE,2BAA2B;KAC/C;IACD,QAAQ,EAAE;QACR,KAAK,EAAE,kBAAkB;KAC1B;IACD,MAAM,EAAE;QACN,KAAK,EAAE,SAAS;KACjB;IACD,UAAU,EAAE;QACV,QAAQ,EAAE,OAAO;QACjB,IAAI,EAAE,OAAO;KACd;IACD,OAAO,EAAE;QACP,MAAM,EAAE,OAAO;KAChB;IACD,WAAW,EAAE;QACX,QAAQ,EAAE,oBAAoB;QAC9B,eAAe,EACb,gEAAgE;KACnE;IACD,MAAM,EAAE;QACN,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,KAAK;KACd;IACD,QAAQ,EAAE;QACR,SAAS,EAAE,8CAA8C;QACzD,YAAY,EAAE,yBAAyB;QACvC,SAAS,EAAE,qBAAqB;KACjC;IACD,QAAQ,EAAE;QACR,UAAU,EAAE,YAAY;QACxB,SAAS,EAAE,OAAO;QAClB,WAAW,EAAE,QAAQ;QACrB,UAAU,EAAE,MAAM;QAClB,GAAG,EAAE;YACH,SAAS,EAAE,gBAAgB;YAC3B,MAAM,EAAE,mBAAmB;SAC5B;QACD,MAAM,EAAE;YACN,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,UAAU;YACnB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,gCAAgC;SACzC;QACD,GAAG,EAAE;YACH,GAAG,EAAE,aAAa;SACnB;QACD,IAAI,EAAE;YACJ,IAAI,EAAE,iCAAiC;YACvC,KAAK,EAAE,6BAA6B;SACrC;KACF;IACD,OAAO,EAAE;QACP,iBAAiB,EAAE,OAAO;KAC3B;CACqB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@navikt/ds-react",
3
- "version": "8.2.2",
3
+ "version": "8.3.0",
4
4
  "description": "React components from the Norwegian Labour and Welfare Administration.",
5
5
  "author": "Aksel, a team part of the Norwegian Labour and Welfare Administration.",
6
6
  "license": "MIT",
@@ -705,8 +705,8 @@
705
705
  "dependencies": {
706
706
  "@floating-ui/react": "0.27.8",
707
707
  "@floating-ui/react-dom": "^2.1.6",
708
- "@navikt/aksel-icons": "^8.2.2",
709
- "@navikt/ds-tokens": "^8.2.2",
708
+ "@navikt/aksel-icons": "^8.3.0",
709
+ "@navikt/ds-tokens": "^8.3.0",
710
710
  "date-fns": "^4.0.0",
711
711
  "react-day-picker": "9.7.0"
712
712
  },
@@ -0,0 +1,215 @@
1
+ import React, { useEffect, useRef, useState } from "react";
2
+ import { Button } from "../../button";
3
+ import { Box } from "../../layout/box";
4
+ import { VStack } from "../../layout/stack";
5
+ import { Heading } from "../../typography";
6
+
7
+ type DataTableProfilerProps = {
8
+ children: React.ReactNode;
9
+ };
10
+
11
+ type ProfilerEntry = {
12
+ duration: string;
13
+ timestamp: number;
14
+ };
15
+
16
+ type ProfilerState = {
17
+ actualDuration: ProfilerEntry[];
18
+ };
19
+
20
+ function DataTableProfiler({ children }: DataTableProfilerProps) {
21
+ const lastProfilerStateRef = useRef<Record<string, ProfilerState>>({});
22
+
23
+ return (
24
+ <div>
25
+ <ProfilerDisplay getLatestData={() => lastProfilerStateRef.current} />
26
+ <React.Profiler
27
+ id="DataTable"
28
+ onRender={(_, phase, actualDuration) => {
29
+ lastProfilerStateRef.current = {
30
+ ...lastProfilerStateRef.current,
31
+ [phase]: {
32
+ actualDuration: rollingLatestValues(
33
+ lastProfilerStateRef.current[phase]?.actualDuration || [],
34
+ { duration: actualDuration.toFixed(2), timestamp: Date.now() },
35
+ 10,
36
+ ),
37
+ },
38
+ };
39
+ }}
40
+ >
41
+ <div id="dataTable-profiler-content">{children}</div>
42
+ </React.Profiler>
43
+ </div>
44
+ );
45
+ }
46
+
47
+ function rollingLatestValues(
48
+ arr: ProfilerEntry[],
49
+ newValue: ProfilerEntry,
50
+ maxLength: number,
51
+ ): ProfilerEntry[] {
52
+ let newArr = [newValue, ...arr];
53
+ if (newArr.length > maxLength) {
54
+ newArr = newArr.slice(0, -1);
55
+ }
56
+ return newArr;
57
+ }
58
+
59
+ function ProfilerDisplay({
60
+ getLatestData,
61
+ }: {
62
+ getLatestData: () => Record<string, ProfilerState>;
63
+ }) {
64
+ const [open, setOpen] = useState(false);
65
+ const [domStats, setDomStats] = useState<{
66
+ elements: number;
67
+ nodes: number;
68
+ } | null>(null);
69
+ const [, setTick] = useState(0);
70
+
71
+ const lastProfilerState = getLatestData();
72
+
73
+ useEffect(() => {
74
+ if (!open) return;
75
+ const interval = setInterval(() => {
76
+ const dataTableElement = document.getElementById(
77
+ "dataTable-profiler-content",
78
+ );
79
+ if (dataTableElement) {
80
+ const walker = document.createTreeWalker(
81
+ dataTableElement,
82
+ NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT,
83
+ null,
84
+ );
85
+ let elements = 0;
86
+ let nodes = 0;
87
+ while (walker.nextNode()) {
88
+ nodes++;
89
+ if (walker.currentNode.nodeType === Node.ELEMENT_NODE) {
90
+ elements++;
91
+ }
92
+ }
93
+ setDomStats({ elements, nodes });
94
+ }
95
+ setTick((t) => t + 1);
96
+ }, 500);
97
+ return () => clearInterval(interval);
98
+ }, [open]);
99
+
100
+ const getOpacity = (timestamp: number) => {
101
+ const age = Date.now() - timestamp;
102
+ const maxAge = 10000;
103
+ return Math.max(0.4, 1 - age / maxAge);
104
+ };
105
+
106
+ return (
107
+ <VStack asChild>
108
+ <Box
109
+ position="fixed"
110
+ top="space-4"
111
+ right="space-4"
112
+ padding="space-6"
113
+ background="raised"
114
+ borderRadius="8"
115
+ borderWidth="1"
116
+ borderColor="neutral-subtleA"
117
+ style={{ zIndex: 1000 }}
118
+ >
119
+ <Button
120
+ data-color="neutral"
121
+ variant="tertiary"
122
+ size="small"
123
+ onClick={() => setOpen(!open)}
124
+ >
125
+ {open ? "Hide Profiler" : "Show Profiler"}
126
+ </Button>
127
+ {open && (
128
+ <>
129
+ {!domStats && <div>Loading stats...</div>}
130
+ {domStats && (
131
+ <div>
132
+ <Heading level="2" size="xsmall">
133
+ DOM Stats:
134
+ </Heading>
135
+ <ul style={{ margin: 0, paddingLeft: "1rem" }}>
136
+ <li
137
+ style={{ listStyle: "none" }}
138
+ >{`${domStats.elements} elements`}</li>
139
+ <li
140
+ style={{ listStyle: "none" }}
141
+ >{`${domStats.nodes} nodes`}</li>
142
+ </ul>
143
+ </div>
144
+ )}
145
+ {lastProfilerState.mount && (
146
+ <div>
147
+ <Heading level="2" size="xsmall">
148
+ Mount:
149
+ </Heading>
150
+ <ul style={{ margin: 0, paddingLeft: "1rem" }}>
151
+ {lastProfilerState.mount.actualDuration.map(
152
+ (entry, index) => (
153
+ <li
154
+ style={{
155
+ listStyle: "none",
156
+ opacity: getOpacity(entry.timestamp),
157
+ transition: "opacity 0.5s",
158
+ }}
159
+ key={index}
160
+ >{`${entry.duration} ms`}</li>
161
+ ),
162
+ )}
163
+ </ul>
164
+ </div>
165
+ )}
166
+ {lastProfilerState.update && (
167
+ <div>
168
+ <Heading level="2" size="xsmall">
169
+ Update:
170
+ </Heading>
171
+ <ul style={{ margin: 0, paddingLeft: "1rem" }}>
172
+ {lastProfilerState.update.actualDuration.map(
173
+ (entry, index) => (
174
+ <li
175
+ style={{
176
+ listStyle: "none",
177
+ opacity: getOpacity(entry.timestamp),
178
+ transition: "opacity 0.5s",
179
+ }}
180
+ key={index}
181
+ >{`${entry.duration} ms`}</li>
182
+ ),
183
+ )}
184
+ </ul>
185
+ </div>
186
+ )}
187
+ {lastProfilerState["nested-update"] && (
188
+ <div>
189
+ <Heading level="2" size="xsmall">
190
+ Nested-update
191
+ </Heading>
192
+ <ul style={{ margin: 0, paddingLeft: "1rem" }}>
193
+ {lastProfilerState["nested-update"].actualDuration.map(
194
+ (entry, index) => (
195
+ <li
196
+ style={{
197
+ listStyle: "none",
198
+ opacity: getOpacity(entry.timestamp),
199
+ transition: "opacity 0.5s",
200
+ }}
201
+ key={index}
202
+ >{`${entry.duration} ms`}</li>
203
+ ),
204
+ )}
205
+ </ul>
206
+ </div>
207
+ )}
208
+ </>
209
+ )}
210
+ </Box>
211
+ </VStack>
212
+ );
213
+ }
214
+
215
+ export { DataTableProfiler };
@@ -1,6 +1,5 @@
1
1
  import { createColumnHelper } from "@tanstack/react-table";
2
2
  import React from "react";
3
- import { HStack } from "../../layout/stack";
4
3
  import { Tag } from "../../tag";
5
4
 
6
5
  // Helper function to get random integer between min and max (inclusive)
@@ -18,7 +17,7 @@ const getRandomItems = <T,>(arr: T[], min = 1, max = 5): T[] => {
18
17
  return shuffled.slice(0, count);
19
18
  };
20
19
 
21
- interface PersonInfo {
20
+ export interface PersonInfo {
22
21
  // id: number;
23
22
  name: string;
24
23
  nationalId: string;
@@ -66,26 +65,49 @@ export const columns = [
66
65
  {
67
66
  header: "Age",
68
67
  accessorKey: "age",
68
+ footer: ({ table }) => {
69
+ const ages: number[] = [];
70
+ table.getFilteredRowModel().rows.forEach((row) => {
71
+ const value = row.getValue("age");
72
+ value && ages.push(value);
73
+ });
74
+ return `Avg: ${(ages.reduce((a, b) => a + b, 0) / ages.length).toFixed(2)}`;
75
+ },
69
76
  },
70
- {
71
- header: "Force sensitive",
72
- accessorKey: "forceSensitive",
73
- },
77
+
78
+ columnHelper.accessor("forceSensitive", {
79
+ cell: (info) => {
80
+ const value = info.getValue();
81
+ return (
82
+ <Tag
83
+ size="small"
84
+ variant="moderate"
85
+ data-color={value ? "accent" : "warning"}
86
+ >{`${value ? "Yes" : "No"}`}</Tag>
87
+ );
88
+ },
89
+ footer: ({ table }) => {
90
+ const totals = new Map();
91
+ totals.set("Yes", 0);
92
+ totals.set("No", 0);
93
+ table.getFilteredRowModel().rows.forEach((row) => {
94
+ const value = row.getValue("forceSensitive");
95
+ totals.set(
96
+ value ? "Yes" : "No",
97
+ (totals.get(value ? "Yes" : "No") ?? 0) + 1,
98
+ );
99
+ });
100
+ return `Yes: ${totals.get("Yes")}, No: ${totals.get("No")}`;
101
+ },
102
+ }),
74
103
  {
75
104
  header: "Home system",
76
105
  accessorKey: "homeSystem",
77
106
  },
78
- columnHelper.accessor("skills", {
79
- cell: (info) => (
80
- <HStack gap="space-8">
81
- {info.getValue().map((skill) => (
82
- <Tag key={skill} size="small">
83
- {skill}
84
- </Tag>
85
- ))}
86
- </HStack>
87
- ),
88
- }),
107
+ {
108
+ header: "Skills",
109
+ accessorKey: "skills",
110
+ },
89
111
  ];
90
112
 
91
113
  export const homeSystemOptions = [
@@ -7,6 +7,7 @@ export {
7
7
  DataTableTr,
8
8
  DataTableTh,
9
9
  DataTableTd,
10
+ DataTableTfoot,
10
11
  } from "./root/DataTableRoot";
11
12
  export type {
12
13
  DataTableProps,
@@ -16,4 +17,5 @@ export type {
16
17
  DataTableTrProps,
17
18
  DataTableThProps,
18
19
  DataTableTdProps,
20
+ DataTableTfootProps,
19
21
  } from "./root/DataTableRoot";
@@ -9,6 +9,10 @@ import {
9
9
  type DataTableTbodyProps,
10
10
  } from "../tbody/DataTableTbody";
11
11
  import { DataTableTd, type DataTableTdProps } from "../td/DataTableTd";
12
+ import {
13
+ DataTableTfoot,
14
+ type DataTableTfootProps,
15
+ } from "../tfoot/DataTableTfoot";
12
16
  import { DataTableTh, type DataTableThProps } from "../th/DataTableTh";
13
17
  import {
14
18
  DataTableThead,
@@ -101,6 +105,18 @@ interface DataTableRootComponent extends React.ForwardRefExoticComponent<
101
105
  * ```
102
106
  */
103
107
  Td: typeof DataTableTd;
108
+ /**
109
+ * @see 🏷️ {@link DataTableTfootProps}
110
+ * @example
111
+ * ```jsx
112
+ * <DataTable>
113
+ * <DataTable.Tfoot>
114
+ * ...
115
+ * </DataTable.Tfoot>
116
+ * </DataTable>
117
+ * ```
118
+ */
119
+ Tfoot: typeof DataTableTfoot;
104
120
  }
105
121
 
106
122
  const DataTable = forwardRef<HTMLTableElement, DataTableProps>(
@@ -123,6 +139,7 @@ DataTable.Tbody = DataTableTbody;
123
139
  DataTable.Th = DataTableTh;
124
140
  DataTable.Tr = DataTableTr;
125
141
  DataTable.Td = DataTableTd;
142
+ DataTable.Tfoot = DataTableTfoot;
126
143
 
127
144
  export {
128
145
  DataTable,
@@ -132,6 +149,7 @@ export {
132
149
  DataTableTh,
133
150
  DataTableThead,
134
151
  DataTableTr,
152
+ DataTableTfoot,
135
153
  };
136
154
  export default DataTable;
137
155
  export type {
@@ -142,4 +160,5 @@ export type {
142
160
  DataTableThProps,
143
161
  DataTableTheadProps,
144
162
  DataTableTrProps,
163
+ DataTableTfootProps,
145
164
  };
@@ -0,0 +1,21 @@
1
+ import React, { forwardRef } from "react";
2
+ import { cl } from "../../../utils/helpers";
3
+
4
+ type DataTableTfootProps = React.HTMLAttributes<HTMLTableSectionElement>;
5
+
6
+ const DataTableTfoot = forwardRef<HTMLTableSectionElement, DataTableTfootProps>(
7
+ ({ className, children, ...rest }, forwardedRef) => {
8
+ return (
9
+ <tfoot
10
+ {...rest}
11
+ ref={forwardedRef}
12
+ className={cl("aksel-data-table__tfoot", className)}
13
+ >
14
+ {children}
15
+ </tfoot>
16
+ );
17
+ },
18
+ );
19
+
20
+ export { DataTableTfoot };
21
+ export type { DataTableTfootProps };
@@ -1,64 +1,101 @@
1
1
  import React, { forwardRef } from "react";
2
- import {
3
- CaretLeftRightIcon,
4
- PushPinFillIcon,
5
- PushPinIcon,
6
- } from "@navikt/aksel-icons";
7
- import { Button } from "../../../button";
2
+ import { FunnelIcon, SortDownIcon, SortUpIcon } from "@navikt/aksel-icons";
3
+ import { HStack, Spacer } from "../../../layout/stack";
4
+ import { ActionMenu } from "../../../overlays/action-menu";
8
5
  import { cl } from "../../../utils/helpers";
6
+ import { DataTableThActions } from "./DataTableThActions";
7
+ import { DataTableThSortHandle } from "./DataTableThSortHandle";
9
8
 
10
9
  type DataTableThProps = React.HTMLAttributes<HTMLTableCellElement> & {
11
10
  resizeHandler?: React.MouseEventHandler<HTMLButtonElement>;
12
- isPinned?: boolean;
13
- pinningHandler?: React.MouseEventHandler<HTMLButtonElement>;
14
11
  size?: number;
12
+ sortDirection?: "asc" | "desc" | "none" | false;
13
+ onSortChange?: (direction: "asc" | "desc" | "none", event: Event) => void;
14
+ render?: {
15
+ filterMenu?: {
16
+ title: string;
17
+ content: React.ReactNode;
18
+ };
19
+ };
15
20
  };
16
21
 
22
+ /**
23
+ * TODO:
24
+ * - Plan for pinning: Move it into "settings" dialog like here: https://cloudscape.design/examples/react/table.html
25
+ */
17
26
  const DataTableTh = forwardRef<HTMLTableCellElement, DataTableThProps>(
18
27
  (
19
28
  {
20
29
  className,
21
30
  children,
22
31
  resizeHandler,
23
- isPinned = false,
24
- pinningHandler,
25
32
  size,
33
+ sortDirection,
34
+ onSortChange,
35
+ style,
36
+ render,
26
37
  ...rest
27
38
  },
28
39
  forwardedRef,
29
40
  ) => {
41
+ const { filterMenu } = render || {};
42
+
30
43
  return (
31
44
  <th
32
45
  {...rest}
33
46
  ref={forwardedRef}
34
47
  className={cl("aksel-data-table__th", className)}
35
- style={{ width: size }}
48
+ style={{ width: size, ...style }}
36
49
  >
37
- {children}
38
- {pinningHandler && (
39
- <Button
40
- onClick={pinningHandler}
41
- size="small"
42
- variant="secondary"
43
- icon={
44
- isPinned ? (
45
- <PushPinFillIcon aria-hidden title="Fest kolonne" />
46
- ) : (
47
- <PushPinIcon aria-hidden title="Løstne kolonne" />
48
- )
49
- }
50
+ <HStack align="center" gap="space-8" wrap={false}>
51
+ <div className="aksel-data-table__th-content">{children}</div>
52
+ <DataTableThSortHandle
53
+ sortDirection={sortDirection}
54
+ onSortChange={onSortChange}
50
55
  />
51
- )}
56
+ <Spacer />
57
+
58
+ <DataTableThActions>
59
+ {/* TODO: onSortChange just rotates between the three states now */}
60
+ {/* TODO: Sorting texts do not handle different data-types now */}
61
+ {sortDirection && (
62
+ <ActionMenu.Group label="Sortering">
63
+ <ActionMenu.Item
64
+ onSelect={(event) => onSortChange?.("desc", event)}
65
+ icon={<SortUpIcon aria-hidden />}
66
+ >
67
+ {sortDirection === "desc" ? "Fjern sortering" : "A-Z"}
68
+ </ActionMenu.Item>
69
+ <ActionMenu.Item
70
+ onSelect={(event) => onSortChange?.("asc", event)}
71
+ icon={<SortDownIcon aria-hidden />}
72
+ >
73
+ {sortDirection === "asc" ? "Fjern sortering" : "Z-A"}
74
+ </ActionMenu.Item>
75
+ </ActionMenu.Group>
76
+ )}
77
+ {filterMenu && (
78
+ <ActionMenu.Group label="Filter">
79
+ <ActionMenu.Sub>
80
+ <ActionMenu.SubTrigger icon={<FunnelIcon aria-hidden />}>
81
+ {filterMenu.title}
82
+ </ActionMenu.SubTrigger>
83
+ <ActionMenu.SubContent>
84
+ {/* TODO: ActionMenu stops tab from working, so user cant tab "into" filter now even when wrapper has focus */}
85
+ {filterMenu.content}
86
+ </ActionMenu.SubContent>
87
+ </ActionMenu.Sub>
88
+ </ActionMenu.Group>
89
+ )}
90
+ </DataTableThActions>
91
+ </HStack>
92
+
52
93
  {resizeHandler && (
53
- <Button
94
+ <button
54
95
  onMouseDown={resizeHandler}
55
96
  onMouseUp={resizeHandler}
56
97
  className={cl("aksel-data-table__th-resize-handle")}
57
- size="small"
58
- variant="secondary"
59
- icon={
60
- <CaretLeftRightIcon aria-hidden title="Endre kolonnestørrelse" />
61
- }
98
+ data-color="neutral"
62
99
  />
63
100
  )}
64
101
  </th>
@@ -0,0 +1,32 @@
1
+ import React from "react";
2
+ import { MenuElipsisVerticalIcon } from "@navikt/aksel-icons";
3
+ import { Button } from "../../../button";
4
+ import { ActionMenu } from "../../../overlays/action-menu";
5
+
6
+ function DataTableThActions({ children }: { children?: React.ReactNode }) {
7
+ const [open, setOpen] = React.useState(false);
8
+ /* TODO: Fix this */
9
+ // @ts-expect-error Temp hack to hide when no children present
10
+ if (!children || !children.filter(Boolean).length) {
11
+ return null;
12
+ }
13
+
14
+ return (
15
+ <ActionMenu open={open} onOpenChange={setOpen}>
16
+ <ActionMenu.Trigger>
17
+ <Button
18
+ data-color="neutral"
19
+ variant="tertiary"
20
+ size="small"
21
+ icon={<MenuElipsisVerticalIcon title="Åpne kolonnemeny" />}
22
+ onClick={() => setOpen(!open)}
23
+ data-expanded={open}
24
+ className="aksel-data-table__th-action-button"
25
+ />
26
+ </ActionMenu.Trigger>
27
+ <ActionMenu.Content>{children}</ActionMenu.Content>
28
+ </ActionMenu>
29
+ );
30
+ }
31
+
32
+ export { DataTableThActions };