@nova-design-system/nova-react 3.20.0 → 3.21.1-beta.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 (78) hide show
  1. package/dist/cjs/generated/components.server.js +106 -2
  2. package/dist/cjs/grow.animation-24ad5cf8-LUp_ITEx.js +111 -0
  3. package/dist/cjs/{index-BObVnP12.js → index-CEKdYnmK.js} +1794 -463
  4. package/dist/cjs/index.js +12 -1
  5. package/dist/cjs/{nv-accordion-item.entry-BBAGkmLI.js → nv-accordion-item.entry-zvp8yDql.js} +1 -1
  6. package/dist/cjs/{nv-accordion.entry-CvvtdLIz.js → nv-accordion.entry-D6gckOF4.js} +1 -1
  7. package/dist/cjs/{nv-alert.entry-w5XeFsrC.js → nv-alert.entry-Df8-nQ-R.js} +1 -1
  8. package/dist/cjs/{nv-avatar.entry-BxUZg-8h.js → nv-avatar.entry-ZOnVWP9L.js} +1 -1
  9. package/dist/cjs/{nv-badge_2.entry-DdSIFlJf.js → nv-badge_2.entry-DgiVv_Yf.js} +2 -2
  10. package/dist/cjs/{nv-breadcrumb.entry-CmbqGw3C.js → nv-breadcrumb.entry-IqtE1JL0.js} +1 -1
  11. package/dist/cjs/{nv-breadcrumbs.entry-DFHxtPKv.js → nv-breadcrumbs.entry-Be6dz7zI.js} +1 -1
  12. package/dist/cjs/nv-button.entry-CmswF3Si.js +164 -0
  13. package/dist/cjs/{nv-buttongroup.entry-wn9zFd_M.js → nv-buttongroup.entry-Cfe6rFSs.js} +1 -1
  14. package/dist/cjs/{nv-calendar.entry-Dldsa6dz.js → nv-calendar.entry-q83sS_dN.js} +1 -1
  15. package/dist/cjs/{nv-col.entry-DnG79KM1.js → nv-col.entry-Cu-Qi1bi.js} +1 -1
  16. package/dist/cjs/{nv-datagrid.entry-C2ML-e47.js → nv-datagrid.entry-Cx7SvD5S.js} +3 -3
  17. package/dist/cjs/{nv-datagridcolumn.entry-DcMPUtQS.js → nv-datagridcolumn.entry-B_uXKFLg.js} +1 -1
  18. package/dist/cjs/{nv-dialog.entry-C0Vx7dQc.js → nv-dialog.entry-J6Xwi6z1.js} +54 -20
  19. package/dist/cjs/{nv-dialogfooter_2.entry-BGq8Jiib.js → nv-dialogfooter_2.entry-DOlhqDTh.js} +3 -3
  20. package/dist/cjs/{nv-fieldcheckbox.entry-CAPwYnSU.js → nv-fieldcheckbox.entry-C23dGGX7.js} +5 -5
  21. package/dist/cjs/{nv-fielddate.entry-Byt5cmQi.js → nv-fielddate.entry-xWi3GpLl.js} +15 -18
  22. package/dist/cjs/{nv-fielddaterange.entry-CCFeFP2q.js → nv-fielddaterange.entry-BwFtpw9X.js} +8 -10
  23. package/dist/cjs/{nv-fielddropdown.entry-BFp_2vBC.js → nv-fielddropdown.entry-mnl7mSaK.js} +15 -6
  24. package/dist/cjs/{nv-fielddropdownitem.entry-D_4KdBY1.js → nv-fielddropdownitem.entry-DjyFlVXw.js} +3 -3
  25. package/dist/cjs/{nv-fieldmultiselect.entry-BaUD7Dcr.js → nv-fieldmultiselect.entry-BtLTG7nM.js} +2 -2
  26. package/dist/cjs/{nv-fieldnumber.entry-DOmhBrDv.js → nv-fieldnumber.entry-C00Hg70B.js} +4 -4
  27. package/dist/cjs/{nv-fieldpassword.entry-hogiPC5z.js → nv-fieldpassword.entry-BLg8tCN0.js} +4 -4
  28. package/dist/cjs/{nv-fieldradio.entry-CKbyWpIK.js → nv-fieldradio.entry-2hb1Ur40.js} +4 -4
  29. package/dist/cjs/{nv-fieldselect.entry-tpURNUEP.js → nv-fieldselect.entry-D-eYQpAv.js} +6 -6
  30. package/dist/cjs/{nv-fieldslider.entry-v0d92XEY.js → nv-fieldslider.entry-BGle1RZR.js} +4 -4
  31. package/dist/cjs/{nv-fieldtext.entry-DNYrOAhj.js → nv-fieldtext.entry-Djg8cqOa.js} +4 -4
  32. package/dist/cjs/{nv-fieldtextarea.entry-cRsjPwwR.js → nv-fieldtextarea.entry-Z32-s901.js} +4 -4
  33. package/dist/cjs/{nv-fieldtime.entry-BpGBUfKr.js → nv-fieldtime.entry-CDFGdfFL.js} +4 -4
  34. package/dist/cjs/nv-icon.entry-BDq7DKRt.js +80 -0
  35. package/dist/cjs/{nv-iconbutton_2.entry-DOv1RrkS.js → nv-iconbutton_2.entry-DdgEkFLK.js} +8 -3
  36. package/dist/cjs/{nv-menu.entry-C2L8F-nG.js → nv-menu.entry-iob0Kve8.js} +2 -2
  37. package/dist/cjs/{nv-menuitem.entry-DuDZTlJ1.js → nv-menuitem.entry-C989Ui60.js} +2 -2
  38. package/dist/cjs/nv-notification-bullet.entry-J8OkAZtU.js +77 -0
  39. package/dist/cjs/{nv-notification.entry-DxAj-mc7.js → nv-notification.entry-BxvJMKxH.js} +2 -2
  40. package/dist/cjs/{nv-notificationcontainer.entry-CUnTicXF.js → nv-notificationcontainer.entry-CxGCIb96.js} +2 -2
  41. package/dist/cjs/{nv-popover.entry-DVwa4DvW.js → nv-popover.entry-1KsO_KQm.js} +14 -98
  42. package/dist/cjs/{nv-row.entry-iLk2UglX.js → nv-row.entry-PBLq_BzJ.js} +2 -2
  43. package/dist/cjs/nv-sidebar.entry-CjLbvLqw.js +177 -0
  44. package/dist/cjs/nv-sidebarcontent.entry-Cv76IH4W.js +22 -0
  45. package/dist/cjs/nv-sidebardivider.entry-DYPJ_k73.js +22 -0
  46. package/dist/cjs/nv-sidebarfooter.entry-mGcMBRmv.js +22 -0
  47. package/dist/cjs/nv-sidebargroup.entry-DtwFliHZ.js +23 -0
  48. package/dist/cjs/nv-sidebarheader.entry-BdOYIXCA.js +22 -0
  49. package/dist/cjs/nv-sidebarlogo.entry-Da0kGsfw.js +32 -0
  50. package/dist/cjs/nv-sidebarnavitem.entry-D5xLfpwn.js +297 -0
  51. package/dist/cjs/nv-sidebarnavsubitem.entry-CkeJfHH4.js +35 -0
  52. package/dist/cjs/{nv-split.entry-BrMHK6TS.js → nv-split.entry-y66NBf88.js} +2 -2
  53. package/dist/cjs/{nv-stack.entry-C8jLJ5Ki.js → nv-stack.entry-CXjpkpbW.js} +2 -2
  54. package/dist/cjs/{nv-table.entry-D6o4g9Vo.js → nv-table.entry-quaVnLru.js} +2 -2
  55. package/dist/cjs/nv-tableheader.entry-DTBE2XQO.js +75 -0
  56. package/dist/cjs/{nv-toggle.entry-9iwmu7qi.js → nv-toggle.entry-CxUwF0pb.js} +3 -3
  57. package/dist/cjs/nv-togglebutton.entry-w-WEAmE6.js +56 -0
  58. package/dist/cjs/{nv-togglebuttongroup.entry-DWCytOhV.js → nv-togglebuttongroup.entry-UbrE8y7a.js} +2 -2
  59. package/dist/cjs/{nv-tooltip.entry-BMxnZVYA.js → nv-tooltip.entry-Dq2bkV33.js} +2 -2
  60. package/dist/components/{NvDatatable.js → NvDatatable/NvDatatable.js} +88 -46
  61. package/dist/components/NvDatatable/index.js +3 -0
  62. package/dist/components/NvDatatable/types.js +1 -0
  63. package/dist/components/NvDatatable/utils.js +5 -0
  64. package/dist/generated/components.js +88 -0
  65. package/dist/generated/components.server.js +95 -2
  66. package/dist/providers/NotificationProvider.js +27 -0
  67. package/dist/types/components/NvDatatable/NvDatatable.d.ts +7 -0
  68. package/dist/types/components/NvDatatable/index.d.ts +3 -0
  69. package/dist/types/components/{NvDatatable.d.ts → NvDatatable/types.d.ts} +18 -8
  70. package/dist/types/components/NvDatatable/utils.d.ts +2 -0
  71. package/dist/types/generated/components.d.ts +37 -0
  72. package/dist/types/generated/components.server.d.ts +37 -0
  73. package/dist/types/providers/NotificationProvider.d.ts +1 -0
  74. package/package.json +1 -1
  75. package/dist/cjs/events.utils-fe1d907f-01N__3wY.js +0 -23
  76. package/dist/cjs/nv-button.entry-Dyks6_mF.js +0 -159
  77. package/dist/cjs/nv-icon.entry-BfmyacWA.js +0 -80
  78. package/dist/cjs/nv-togglebutton.entry-N7_CSvzS.js +0 -56
@@ -0,0 +1,56 @@
1
+ 'use strict';
2
+
3
+ var index = require('./index-CEKdYnmK.js');
4
+ require('react');
5
+ require('react-dom');
6
+
7
+ const nvTogglebuttonCss = "nv-togglebutton{display:inline-flex;justify-content:center;align-items:center}nv-togglebutton:focus-visible,nv-togglebutton:has(:focus-visible){z-index:1}nv-togglebutton[size=xs]{padding:var(--button-xs-padding-y) var(--button-xs-padding-x);gap:var(--button-xs-gap);border-radius:var(--button-xs-border-radius);line-height:var(--button-xs-line-height);height:var(--button-xs-height);font-size:var(--button-xs-font-size);padding-top:calc(var(--togglegroup-xs-button-padding-y) - 1px);padding-bottom:calc(var(--togglegroup-xs-button-padding-y) - 1px);border-radius:calc(var(--togglegroup-xs-button-radius));border-width:0}nv-togglebutton[size=xs] nv-icon>svg{width:var(--spacing-3);height:var(--spacing-3);stroke-width:1.2px}nv-togglebutton[size=sm]{padding:var(--button-sm-padding-y) var(--button-sm-padding-x);gap:var(--button-sm-gap);border-radius:var(--button-sm-border-radius);line-height:var(--button-sm-line-height);height:var(--button-sm-height);font-size:var(--button-sm-font-size);padding-top:calc(var(--togglegroup-sm-button-padding-y) - 1px);padding-bottom:calc(var(--togglegroup-sm-button-padding-y) - 1px);border-radius:calc(var(--togglegroup-sm-button-radius));border-width:0}nv-togglebutton[size=sm] nv-icon>svg{width:var(--spacing-4);height:var(--spacing-4);stroke-width:1.5px}nv-togglebutton[size=md]{padding:var(--button-md-padding-y) var(--button-md-padding-x);gap:var(--button-md-gap);border-radius:var(--button-md-border-radius);line-height:var(--button-md-line-height);height:var(--button-md-height);font-size:var(--button-md-font-size);padding-top:calc(var(--togglegroup-md-button-padding-y) - 1px);padding-bottom:calc(var(--togglegroup-md-button-padding-y) - 1px);border-radius:calc(var(--togglegroup-md-button-radius));border-width:0}nv-togglebutton[size=md] nv-icon>svg{width:var(--spacing-5);height:var(--spacing-5);stroke-width:1.6px}nv-togglebutton[size=lg]{padding:var(--button-lg-padding-y) var(--button-lg-padding-x);gap:var(--button-lg-gap);border-radius:var(--button-lg-border-radius);line-height:var(--button-lg-line-height);height:var(--button-lg-height);font-size:var(--button-lg-font-size);padding-top:calc(var(--togglegroup-lg-button-padding-y) - 1px);padding-bottom:calc(var(--togglegroup-lg-button-padding-y) - 1px);border-radius:calc(var(--togglegroup-lg-button-radius));border-width:0}nv-togglebutton[size=lg] nv-icon>svg{width:var(--spacing-6);height:var(--spacing-6);stroke-width:1.8px}nv-togglebutton[emphasis=high]{background:var(--components-button-low-background);border:1px solid var(--components-button-low-border);color:var(--components-button-low-text)}nv-togglebutton[emphasis=high]:hover{background:var(--components-button-low-background-hover);border:1px solid var(--components-button-low-border);color:var(--components-button-low-text-hover)}nv-togglebutton[emphasis=high]:active{background:var(--components-button-low-background-active);border:1px solid var(--components-button-low-border-active);color:var(--components-button-low-text-active)}nv-togglebutton[emphasis=high]:focus,nv-togglebutton[emphasis=high]:focus-within{outline:none}nv-togglebutton[emphasis=high]:focus-visible,nv-togglebutton[emphasis=high]:has(:focus-visible){outline:calc(var(--focus-outline-stroke) * 1) solid var(--color-focus-brand);outline-offset:calc(var(--focus-outline-offset) * 1)}nv-togglebutton[emphasis=high]:disabled:not([disabled=false]){opacity:0.5;cursor:not-allowed;box-shadow:none}nv-togglebutton[emphasis=high][active]:not([active=false]){background:var(--components-button-low-background-active);border:1px solid var(--components-button-low-border-active);color:var(--components-button-low-text-active)}nv-togglebutton[emphasis=low]{background:var(--components-button-lower-background);border:1px solid var(--components-button-lower-border);color:var(--components-button-lower-text)}nv-togglebutton[emphasis=low]:hover{background:var(--components-button-lower-background-hover);border:1px solid var(--components-button-lower-border);color:var(--components-button-lower-text-hover)}nv-togglebutton[emphasis=low]:active{background:var(--components-button-lower-background-active);border:1px solid var(--components-button-lower-border-active);color:var(--components-button-lower-text-active)}nv-togglebutton[emphasis=low]:focus,nv-togglebutton[emphasis=low]:focus-within{outline:none}nv-togglebutton[emphasis=low]:focus-visible,nv-togglebutton[emphasis=low]:has(:focus-visible){outline:calc(var(--focus-outline-stroke) * 1) solid var(--color-focus-brand);outline-offset:calc(var(--focus-outline-offset) * 1)}nv-togglebutton[emphasis=low]:disabled:not([disabled=false]){opacity:0.5;cursor:not-allowed;box-shadow:none}nv-togglebutton[emphasis=low][active]:not([active=false]),nv-togglebutton[emphasis=low]:active{background:var(--components-button-lower-background-hover);border:1px solid var(--components-button-lower-border);color:var(--components-button-lower-text-hover)}";
8
+ const NvTogglebuttonStyle0 = nvTogglebuttonCss;
9
+
10
+ const NvTogglebutton = class {
11
+ constructor(hostRef) {
12
+ index.registerInstance(this, hostRef);
13
+ this.toggled = index.createEvent(this, "toggled");
14
+ /****************************************************************************/
15
+ //#region PROPERTIES
16
+ /**
17
+ * Determines how large or small the togglebutton appears, allowing for
18
+ * customization of the togglebutton's dimensions to fit different design
19
+ * specifications and user needs.
20
+ */
21
+ this.size = 'md';
22
+ /**
23
+ * Prevents all interaction, rendering the toggle in a non-interactive state.
24
+ */
25
+ this.disabled = false;
26
+ /**
27
+ * Whether the button is active or not. Will not toggle automatically but
28
+ * needs to be controlled externally.
29
+ */
30
+ this.active = false;
31
+ /**
32
+ * Make it more or less visually prominent to users.
33
+ */
34
+ this.emphasis = 'high';
35
+ //#endregion PROPERTIES
36
+ /****************************************************************************/
37
+ //#region METHODS
38
+ this.handleClick = () => {
39
+ if (this.disabled)
40
+ return;
41
+ this.toggled.emit({
42
+ value: this.value,
43
+ active: this.active,
44
+ });
45
+ };
46
+ }
47
+ //#endregion EVENTS
48
+ /****************************************************************************/
49
+ //#region RENDER
50
+ render() {
51
+ return (index.h(index.Host, { key: '35199476bd724fe4a6b4dde51b7822bed5c374ff', role: "button", tabindex: "0", "aria-pressed": String(this.active), onClick: this.handleClick }, index.h("slot", { key: '864cf0f2550b66b0b34c4f779086d4b4847732e6' })));
52
+ }
53
+ };
54
+ NvTogglebutton.style = NvTogglebuttonStyle0;
55
+
56
+ exports.nv_togglebutton = NvTogglebutton;
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-BObVnP12.js');
3
+ var index = require('./index-CEKdYnmK.js');
4
4
  require('react');
5
5
  require('react-dom');
6
6
 
@@ -156,7 +156,7 @@ const NvTogglebuttongroup = class {
156
156
  /****************************************************************************/
157
157
  //#region RENDER
158
158
  render() {
159
- return (index.h(index.Host, { key: 'ab91ff1817e3388508ed1da7a9ed57a79cf8c4bc' }, index.h("slot", { key: '4a3280db78c1f0cd120a0cb32d95eabaf69995a6' })));
159
+ return (index.h(index.Host, { key: 'b7c5cb46244f10a93330dc601d0347e3cb53c276' }, index.h("slot", { key: '0808ec94f479f52f60b50ac14ce1a4eb989e5778' })));
160
160
  }
161
161
  get el() { return index.getElement(this); }
162
162
  static get watchers() { return {
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-BObVnP12.js');
3
+ var index = require('./index-CEKdYnmK.js');
4
4
  require('react');
5
5
  require('react-dom');
6
6
 
@@ -46,7 +46,7 @@ const NvTooltip = class {
46
46
  /****************************************************************************/
47
47
  //#region RENDER
48
48
  render() {
49
- return (index.h(index.Host, { key: 'c2fdcd47be909554e31a3a7d77cd94dcb07c0d6e' }, index.h("slot", { key: '2305f6b7175d0ba84819351f60f2a4d76d117df9' }), index.h("nv-popover", { key: 'e388730b5858671d08981c6bbf72588a5084edbf', triggerMode: "hover", hasArrow: true, placement: this.placement, strategy: this.strategy, triggerElement: this.triggerElement, groupName: 'tooltip', enterDelay: this.enterDelay }, index.h("p", { key: '73f548a1c822f7c6d5a97bb4ef8da0d335cf049e', slot: "content" }, this.message), index.h("slot", { key: 'abb7a2dfa6a327122732802a867c5d4057fd1616', name: "content" }))));
49
+ return (index.h(index.Host, { key: 'ff1ca24735ec78d279cdc2f98cb54c0d6a7b4103' }, index.h("slot", { key: '3e0676a49b957ecb6eb3e0e6bfc1d8d8f0d2e02a' }), index.h("nv-popover", { key: '063fb414e47a1a6b722ee8b61f3dd68a61c5b7df', triggerMode: "hover", hasArrow: true, placement: this.placement, strategy: this.strategy, triggerElement: this.triggerElement, groupName: 'tooltip', enterDelay: this.enterDelay }, index.h("p", { key: 'a8714211a3a5c723d187acdcb23484610bd91a36', slot: "content" }, this.message), index.h("slot", { key: 'edae83eb3c0f5c57b9b7263ccc139463b044f68e', name: "content" }))));
50
50
  }
51
51
  get el() { return index.getElement(this); }
52
52
  };
@@ -1,49 +1,88 @@
1
- import React, { useMemo, useState, useEffect, useRef, } from 'react';
2
- import { flexRender, getCoreRowModel, getPaginationRowModel, useReactTable, } from '@tanstack/react-table';
3
- import { NvTable } from '../generated/components';
4
- function NvDatatable({ columns, rows, pagination, renderPagination, stickyHeader, ...htmlProps }) {
1
+ import React, { useMemo, useState, useEffect, useRef } from 'react';
2
+ import { flexRender, getCoreRowModel, getPaginationRowModel, getSortedRowModel, useReactTable, } from '@tanstack/react-table';
3
+ import { NvTable, NvTableheader } from '../../generated/components';
4
+ function NvDatatable({ columns, rows, pagination, sorting, renderPagination, stickyHeader, ...htmlProps }) {
5
5
  const [paginationState, setPaginationState] = useState({
6
6
  pageIndex: 0,
7
7
  pageSize: pagination?.initialPageSize || 10,
8
8
  });
9
+ const [sortingState, setSortingState] = useState(sorting?.sortState || []);
9
10
  const lastRowRef = useRef(null);
10
11
  const tableColumns = useMemo(() => columns
11
12
  .filter((col) => !col.hidden)
12
- .map((col) => ({
13
- accessorKey: col.field,
14
- accessorFn: col.valueFormatter
15
- ? (row) => {
16
- const rawValue = row[col.field];
17
- return col.valueFormatter({
18
- value: rawValue,
19
- row,
20
- field: col.field,
21
- });
22
- }
23
- : undefined,
24
- header: col.headerName || String(col.field),
25
- size: col.width,
26
- enableResizing: col.resizable ?? true,
27
- cell: (context) => {
28
- const value = context.getValue();
29
- const row = context.row.original;
30
- const rowIndex = context.row.index;
31
- if (col.renderCell) {
32
- return col.renderCell({
33
- value,
34
- row,
35
- field: col.field,
36
- rowIndex,
37
- });
38
- }
39
- return value;
40
- },
41
- })), [columns]);
13
+ .map((col) => {
14
+ const columnDef = {
15
+ accessorKey: col.field,
16
+ accessorFn: col.valueFormatter
17
+ ? (row) => {
18
+ const rawValue = row[col.field];
19
+ return col.valueFormatter({
20
+ value: rawValue,
21
+ row,
22
+ field: col.field,
23
+ });
24
+ }
25
+ : undefined,
26
+ header: col.headerName || String(col.field),
27
+ size: col.width,
28
+ enableResizing: col.resizable ?? true,
29
+ enableSorting: sorting ? col.sortable ?? true : false,
30
+ cell: (context) => {
31
+ const value = context.getValue();
32
+ const row = context.row.original;
33
+ const rowIndex = context.row.index;
34
+ if (col.renderCell) {
35
+ return col.renderCell({
36
+ value,
37
+ row,
38
+ field: col.field,
39
+ rowIndex,
40
+ });
41
+ }
42
+ return value;
43
+ },
44
+ };
45
+ if (col.sortingFn !== undefined) {
46
+ columnDef.sortingFn = col.sortingFn;
47
+ }
48
+ if (col.sortDescFirst !== undefined) {
49
+ columnDef.sortDescFirst = col.sortDescFirst;
50
+ }
51
+ if (col.invertSorting !== undefined) {
52
+ columnDef.invertSorting = col.invertSorting;
53
+ }
54
+ if (col.sortUndefined !== undefined) {
55
+ columnDef.sortUndefined = col.sortUndefined;
56
+ }
57
+ return columnDef;
58
+ }), [columns, sorting]);
42
59
  const tableConfig = useMemo(() => {
43
60
  const baseConfig = {
44
61
  data: rows,
45
62
  columns: tableColumns,
46
63
  getCoreRowModel: getCoreRowModel(),
64
+ ...(sorting && {
65
+ state: {
66
+ sorting: sorting.sortState || sortingState,
67
+ },
68
+ onSortingChange: sorting.mode === 'server'
69
+ ? (updater) => {
70
+ const newSort = typeof updater === 'function'
71
+ ? updater(sortingState)
72
+ : updater;
73
+ setSortingState(newSort);
74
+ sorting.onSortingChange?.(newSort);
75
+ }
76
+ : setSortingState,
77
+ manualSorting: sorting.mode === 'server',
78
+ enableSorting: true,
79
+ enableMultiSort: sorting.enableMultiSort ?? false,
80
+ enableSortingRemoval: sorting.enableSortingRemoval ?? true,
81
+ maxMultiSortColCount: sorting.maxMultiSortColCount,
82
+ sortDescFirst: sorting.sortDescFirst ?? false,
83
+ isMultiSortEvent: sorting.enableMultiSort ? () => true : undefined,
84
+ getSortedRowModel: sorting.mode === 'client' ? getSortedRowModel() : undefined,
85
+ }),
47
86
  };
48
87
  if (!pagination) {
49
88
  return baseConfig;
@@ -74,13 +113,14 @@ function NvDatatable({ columns, rows, pagination, renderPagination, stickyHeader
74
113
  manualPagination: true,
75
114
  pageCount,
76
115
  state: {
116
+ ...baseConfig.state,
77
117
  pagination: paginationState,
78
118
  },
79
119
  onPaginationChange: setPaginationState,
80
120
  };
81
121
  }
82
122
  return baseConfig;
83
- }, [rows, tableColumns, pagination, paginationState]);
123
+ }, [rows, tableColumns, pagination, paginationState, sorting, sortingState]);
84
124
  const table = useReactTable(tableConfig);
85
125
  useEffect(() => {
86
126
  if (pagination?.mode === 'server' && pagination.onPaginationChange) {
@@ -143,21 +183,23 @@ function NvDatatable({ columns, rows, pagination, renderPagination, stickyHeader
143
183
  return (React.createElement(React.Fragment, null,
144
184
  React.createElement(NvTable, { ...htmlProps },
145
185
  React.createElement("table", null,
146
- React.createElement("thead", { "data-sticky-top": stickyHeader ? 'true' : undefined }, table.getHeaderGroups().map((headerGroup) => (React.createElement("tr", { key: headerGroup.id }, headerGroup.headers.map((header) => (React.createElement("th", { key: header.id, "data-testid": `datatable-header-${header.id}`, style: {
147
- width: header.column.columnDef.size + 'px',
148
- }, "data-no-resize": header.column.columnDef.enableResizing ? null : true }, header.isPlaceholder
149
- ? null
150
- : flexRender(header.column.columnDef.header, header.getContext())))))))),
186
+ React.createElement("thead", { "data-sticky-top": stickyHeader ? 'true' : undefined }, table.getHeaderGroups().map((headerGroup) => (React.createElement("tr", { key: headerGroup.id }, headerGroup.headers.map((header) => {
187
+ const canSort = header.column.getCanSort();
188
+ const sortDirection = header.column.getIsSorted();
189
+ return (React.createElement("th", { key: header.id, "data-testid": `datatable-header-${header.id}`, style: {
190
+ width: header.column.columnDef.size + 'px',
191
+ }, "data-no-resize": header.column.columnDef.enableResizing ? null : true },
192
+ React.createElement(NvTableheader, { sortable: canSort ? true : undefined, sortDirection: sortDirection || (canSort ? 'none' : undefined), onSortDirectionChanged: canSort
193
+ ? header.column.getToggleSortingHandler()
194
+ : undefined }, header.isPlaceholder
195
+ ? null
196
+ : flexRender(header.column.columnDef.header, header.getContext()))));
197
+ }))))),
151
198
  React.createElement("tbody", null, tableRows.map((row, index) => {
152
199
  const isLastRow = isInfiniteScroll && index === tableRows.length - 1;
153
- return (React.createElement("tr", { key: row.id, "data-testid": `datatable-row-${row.id}`, ref: isLastRow ? lastRowRef : undefined }, row.getVisibleCells().map((cell) => (React.createElement("td", { key: cell.id, "data-testid": `datatable-cell-${cell.id}` }, flexRender(cell.column.columnDef.cell, cell.getContext()))))));
200
+ return (React.createElement("tr", { key: row.id, "data-testid": `datatable-row-${index}`, ref: isLastRow ? lastRowRef : undefined }, row.getVisibleCells().map((cell) => (React.createElement("td", { key: cell.id, "data-testid": `datatable-cell-${cell.column.id}` }, flexRender(cell.column.columnDef.cell, cell.getContext()))))));
154
201
  })))),
155
202
  paginationAPI && renderPagination && renderPagination(paginationAPI)));
156
203
  }
157
204
  NvDatatable.displayName = 'NvDatatable';
158
205
  export { NvDatatable };
159
- export function makeColumn() {
160
- return function define(col) {
161
- return col;
162
- };
163
- }
@@ -0,0 +1,3 @@
1
+ export * from './NvDatatable';
2
+ export * from './types';
3
+ export * from './utils';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,5 @@
1
+ export function makeColumn() {
2
+ return function define(col) {
3
+ return col;
4
+ };
5
+ }
@@ -35,13 +35,24 @@ import { NvIconbutton as NvIconbuttonElement, defineCustomElement as defineNvIco
35
35
  import { NvLoader as NvLoaderElement, defineCustomElement as defineNvLoader } from "@nova-design-system/nova-webcomponents/dist/components/nv-loader.js";
36
36
  import { NvMenu as NvMenuElement, defineCustomElement as defineNvMenu } from "@nova-design-system/nova-webcomponents/dist/components/nv-menu.js";
37
37
  import { NvMenuitem as NvMenuitemElement, defineCustomElement as defineNvMenuitem } from "@nova-design-system/nova-webcomponents/dist/components/nv-menuitem.js";
38
+ import { NvNotificationBullet as NvNotificationBulletElement, defineCustomElement as defineNvNotificationBullet } from "@nova-design-system/nova-webcomponents/dist/components/nv-notification-bullet.js";
38
39
  import { NvNotification as NvNotificationElement, defineCustomElement as defineNvNotification } from "@nova-design-system/nova-webcomponents/dist/components/nv-notification.js";
39
40
  import { NvNotificationcontainer as NvNotificationcontainerElement, defineCustomElement as defineNvNotificationcontainer } from "@nova-design-system/nova-webcomponents/dist/components/nv-notificationcontainer.js";
40
41
  import { NvPopover as NvPopoverElement, defineCustomElement as defineNvPopover } from "@nova-design-system/nova-webcomponents/dist/components/nv-popover.js";
41
42
  import { NvRow as NvRowElement, defineCustomElement as defineNvRow } from "@nova-design-system/nova-webcomponents/dist/components/nv-row.js";
43
+ import { NvSidebar as NvSidebarElement, defineCustomElement as defineNvSidebar } from "@nova-design-system/nova-webcomponents/dist/components/nv-sidebar.js";
44
+ import { NvSidebarcontent as NvSidebarcontentElement, defineCustomElement as defineNvSidebarcontent } from "@nova-design-system/nova-webcomponents/dist/components/nv-sidebarcontent.js";
45
+ import { NvSidebardivider as NvSidebardividerElement, defineCustomElement as defineNvSidebardivider } from "@nova-design-system/nova-webcomponents/dist/components/nv-sidebardivider.js";
46
+ import { NvSidebarfooter as NvSidebarfooterElement, defineCustomElement as defineNvSidebarfooter } from "@nova-design-system/nova-webcomponents/dist/components/nv-sidebarfooter.js";
47
+ import { NvSidebargroup as NvSidebargroupElement, defineCustomElement as defineNvSidebargroup } from "@nova-design-system/nova-webcomponents/dist/components/nv-sidebargroup.js";
48
+ import { NvSidebarheader as NvSidebarheaderElement, defineCustomElement as defineNvSidebarheader } from "@nova-design-system/nova-webcomponents/dist/components/nv-sidebarheader.js";
49
+ import { NvSidebarlogo as NvSidebarlogoElement, defineCustomElement as defineNvSidebarlogo } from "@nova-design-system/nova-webcomponents/dist/components/nv-sidebarlogo.js";
50
+ import { NvSidebarnavitem as NvSidebarnavitemElement, defineCustomElement as defineNvSidebarnavitem } from "@nova-design-system/nova-webcomponents/dist/components/nv-sidebarnavitem.js";
51
+ import { NvSidebarnavsubitem as NvSidebarnavsubitemElement, defineCustomElement as defineNvSidebarnavsubitem } from "@nova-design-system/nova-webcomponents/dist/components/nv-sidebarnavsubitem.js";
42
52
  import { NvSplit as NvSplitElement, defineCustomElement as defineNvSplit } from "@nova-design-system/nova-webcomponents/dist/components/nv-split.js";
43
53
  import { NvStack as NvStackElement, defineCustomElement as defineNvStack } from "@nova-design-system/nova-webcomponents/dist/components/nv-stack.js";
44
54
  import { NvTable as NvTableElement, defineCustomElement as defineNvTable } from "@nova-design-system/nova-webcomponents/dist/components/nv-table.js";
55
+ import { NvTableheader as NvTableheaderElement, defineCustomElement as defineNvTableheader } from "@nova-design-system/nova-webcomponents/dist/components/nv-tableheader.js";
45
56
  import { NvToggle as NvToggleElement, defineCustomElement as defineNvToggle } from "@nova-design-system/nova-webcomponents/dist/components/nv-toggle.js";
46
57
  import { NvTogglebutton as NvTogglebuttonElement, defineCustomElement as defineNvTogglebutton } from "@nova-design-system/nova-webcomponents/dist/components/nv-togglebutton.js";
47
58
  import { NvTogglebuttongroup as NvTogglebuttongroupElement, defineCustomElement as defineNvTogglebuttongroup } from "@nova-design-system/nova-webcomponents/dist/components/nv-togglebuttongroup.js";
@@ -337,6 +348,13 @@ export const NvNotification = createComponent({
337
348
  events: { onHiddenChanged: 'hiddenChanged' },
338
349
  defineCustomElement: defineNvNotification
339
350
  });
351
+ export const NvNotificationBullet = createComponent({
352
+ tagName: 'nv-notification-bullet',
353
+ elementClass: NvNotificationBulletElement,
354
+ react: React,
355
+ events: {},
356
+ defineCustomElement: defineNvNotificationBullet
357
+ });
340
358
  export const NvNotificationcontainer = createComponent({
341
359
  tagName: 'nv-notificationcontainer',
342
360
  elementClass: NvNotificationcontainerElement,
@@ -358,6 +376,69 @@ export const NvRow = createComponent({
358
376
  events: {},
359
377
  defineCustomElement: defineNvRow
360
378
  });
379
+ export const NvSidebar = createComponent({
380
+ tagName: 'nv-sidebar',
381
+ elementClass: NvSidebarElement,
382
+ react: React,
383
+ events: { onOpenChanged: 'openChanged' },
384
+ defineCustomElement: defineNvSidebar
385
+ });
386
+ export const NvSidebarcontent = createComponent({
387
+ tagName: 'nv-sidebarcontent',
388
+ elementClass: NvSidebarcontentElement,
389
+ react: React,
390
+ events: {},
391
+ defineCustomElement: defineNvSidebarcontent
392
+ });
393
+ export const NvSidebardivider = createComponent({
394
+ tagName: 'nv-sidebardivider',
395
+ elementClass: NvSidebardividerElement,
396
+ react: React,
397
+ events: {},
398
+ defineCustomElement: defineNvSidebardivider
399
+ });
400
+ export const NvSidebarfooter = createComponent({
401
+ tagName: 'nv-sidebarfooter',
402
+ elementClass: NvSidebarfooterElement,
403
+ react: React,
404
+ events: {},
405
+ defineCustomElement: defineNvSidebarfooter
406
+ });
407
+ export const NvSidebargroup = createComponent({
408
+ tagName: 'nv-sidebargroup',
409
+ elementClass: NvSidebargroupElement,
410
+ react: React,
411
+ events: {},
412
+ defineCustomElement: defineNvSidebargroup
413
+ });
414
+ export const NvSidebarheader = createComponent({
415
+ tagName: 'nv-sidebarheader',
416
+ elementClass: NvSidebarheaderElement,
417
+ react: React,
418
+ events: {},
419
+ defineCustomElement: defineNvSidebarheader
420
+ });
421
+ export const NvSidebarlogo = createComponent({
422
+ tagName: 'nv-sidebarlogo',
423
+ elementClass: NvSidebarlogoElement,
424
+ react: React,
425
+ events: {},
426
+ defineCustomElement: defineNvSidebarlogo
427
+ });
428
+ export const NvSidebarnavitem = createComponent({
429
+ tagName: 'nv-sidebarnavitem',
430
+ elementClass: NvSidebarnavitemElement,
431
+ react: React,
432
+ events: {},
433
+ defineCustomElement: defineNvSidebarnavitem
434
+ });
435
+ export const NvSidebarnavsubitem = createComponent({
436
+ tagName: 'nv-sidebarnavsubitem',
437
+ elementClass: NvSidebarnavsubitemElement,
438
+ react: React,
439
+ events: {},
440
+ defineCustomElement: defineNvSidebarnavsubitem
441
+ });
361
442
  export const NvSplit = createComponent({
362
443
  tagName: 'nv-split',
363
444
  elementClass: NvSplitElement,
@@ -379,6 +460,13 @@ export const NvTable = createComponent({
379
460
  events: {},
380
461
  defineCustomElement: defineNvTable
381
462
  });
463
+ export const NvTableheader = createComponent({
464
+ tagName: 'nv-tableheader',
465
+ elementClass: NvTableheaderElement,
466
+ react: React,
467
+ events: { onSortDirectionChanged: 'sortDirectionChanged' },
468
+ defineCustomElement: defineNvTableheader
469
+ });
382
470
  export const NvToggle = createComponent({
383
471
  tagName: 'nv-toggle',
384
472
  elementClass: NvToggleElement,
@@ -98,7 +98,8 @@ export const NvButton = createComponent({
98
98
  disabled: 'disabled',
99
99
  fluid: 'fluid',
100
100
  type: 'type',
101
- form: 'form'
101
+ form: 'form',
102
+ disableTabindex: 'disable-tabindex'
102
103
  },
103
104
  hydrateModule: import('@nova-design-system/nova-webcomponents/hydrate'),
104
105
  serializeShadowRoot
@@ -612,7 +613,8 @@ export const NvIconbutton = createComponent({
612
613
  active: 'active',
613
614
  name: 'name',
614
615
  type: 'type',
615
- shape: 'shape'
616
+ shape: 'shape',
617
+ disableTabindex: 'disable-tabindex'
616
618
  },
617
619
  hydrateModule: import('@nova-design-system/nova-webcomponents/hydrate'),
618
620
  serializeShadowRoot
@@ -666,6 +668,18 @@ export const NvNotification = createComponent({
666
668
  hydrateModule: import('@nova-design-system/nova-webcomponents/hydrate'),
667
669
  serializeShadowRoot
668
670
  });
671
+ export const NvNotificationBullet = createComponent({
672
+ tagName: 'nv-notification-bullet',
673
+ properties: {
674
+ count: 'count',
675
+ intention: 'intention',
676
+ emphasis: 'emphasis',
677
+ size: 'size',
678
+ contrastingBorder: 'contrasting-border'
679
+ },
680
+ hydrateModule: import('@nova-design-system/nova-webcomponents/hydrate'),
681
+ serializeShadowRoot
682
+ });
669
683
  export const NvNotificationcontainer = createComponent({
670
684
  tagName: 'nv-notificationcontainer',
671
685
  properties: { position: 'position' },
@@ -696,6 +710,76 @@ export const NvRow = createComponent({
696
710
  hydrateModule: import('@nova-design-system/nova-webcomponents/hydrate'),
697
711
  serializeShadowRoot
698
712
  });
713
+ export const NvSidebar = createComponent({
714
+ tagName: 'nv-sidebar',
715
+ properties: {
716
+ type: 'type',
717
+ open: 'open',
718
+ activePath: 'active-path',
719
+ notificationIntention: 'notification-intention',
720
+ notificationEmphasis: 'notification-emphasis'
721
+ },
722
+ hydrateModule: import('@nova-design-system/nova-webcomponents/hydrate'),
723
+ serializeShadowRoot
724
+ });
725
+ export const NvSidebarcontent = createComponent({
726
+ tagName: 'nv-sidebarcontent',
727
+ properties: {},
728
+ hydrateModule: import('@nova-design-system/nova-webcomponents/hydrate'),
729
+ serializeShadowRoot
730
+ });
731
+ export const NvSidebardivider = createComponent({
732
+ tagName: 'nv-sidebardivider',
733
+ properties: {},
734
+ hydrateModule: import('@nova-design-system/nova-webcomponents/hydrate'),
735
+ serializeShadowRoot
736
+ });
737
+ export const NvSidebarfooter = createComponent({
738
+ tagName: 'nv-sidebarfooter',
739
+ properties: {},
740
+ hydrateModule: import('@nova-design-system/nova-webcomponents/hydrate'),
741
+ serializeShadowRoot
742
+ });
743
+ export const NvSidebargroup = createComponent({
744
+ tagName: 'nv-sidebargroup',
745
+ properties: { label: 'label' },
746
+ hydrateModule: import('@nova-design-system/nova-webcomponents/hydrate'),
747
+ serializeShadowRoot
748
+ });
749
+ export const NvSidebarheader = createComponent({
750
+ tagName: 'nv-sidebarheader',
751
+ properties: {},
752
+ hydrateModule: import('@nova-design-system/nova-webcomponents/hydrate'),
753
+ serializeShadowRoot
754
+ });
755
+ export const NvSidebarlogo = createComponent({
756
+ tagName: 'nv-sidebarlogo',
757
+ properties: {
758
+ label: 'label',
759
+ logo: 'logo',
760
+ collapsedLogo: 'collapsed-logo'
761
+ },
762
+ hydrateModule: import('@nova-design-system/nova-webcomponents/hydrate'),
763
+ serializeShadowRoot
764
+ });
765
+ export const NvSidebarnavitem = createComponent({
766
+ tagName: 'nv-sidebarnavitem',
767
+ properties: {
768
+ icon: 'icon',
769
+ active: 'active',
770
+ collapsible: 'collapsible',
771
+ open: 'open',
772
+ notificationCount: 'notification-count'
773
+ },
774
+ hydrateModule: import('@nova-design-system/nova-webcomponents/hydrate'),
775
+ serializeShadowRoot
776
+ });
777
+ export const NvSidebarnavsubitem = createComponent({
778
+ tagName: 'nv-sidebarnavsubitem',
779
+ properties: { active: 'active' },
780
+ hydrateModule: import('@nova-design-system/nova-webcomponents/hydrate'),
781
+ serializeShadowRoot
782
+ });
699
783
  export const NvSplit = createComponent({
700
784
  tagName: 'nv-split',
701
785
  properties: {
@@ -723,6 +807,15 @@ export const NvTable = createComponent({
723
807
  hydrateModule: import('@nova-design-system/nova-webcomponents/hydrate'),
724
808
  serializeShadowRoot
725
809
  });
810
+ export const NvTableheader = createComponent({
811
+ tagName: 'nv-tableheader',
812
+ properties: {
813
+ sortable: 'sortable',
814
+ sortDirection: 'sort-direction'
815
+ },
816
+ hydrateModule: import('@nova-design-system/nova-webcomponents/hydrate'),
817
+ serializeShadowRoot
818
+ });
726
819
  export const NvToggle = createComponent({
727
820
  tagName: 'nv-toggle',
728
821
  properties: {
@@ -12,9 +12,16 @@ const generateId = () => {
12
12
  export const NotificationProvider = ({ children, position = DEFAULT_POSITION, maxNotifications = DEFAULT_MAX_NOTIFICATIONS, className, }) => {
13
13
  const [notifications, setNotifications] = useState([]);
14
14
  const notificationsRef = useRef([]);
15
+ const timersRef = useRef(new Map());
15
16
  useEffect(() => {
16
17
  notificationsRef.current = notifications;
17
18
  }, [notifications]);
19
+ useEffect(() => {
20
+ return () => {
21
+ timersRef.current.forEach((timer) => clearTimeout(timer));
22
+ timersRef.current.clear();
23
+ };
24
+ }, []);
18
25
  const show = useCallback((options) => {
19
26
  const id = options.id || generateId();
20
27
  const ref = createRef();
@@ -28,6 +35,7 @@ export const NotificationProvider = ({ children, position = DEFAULT_POSITION, ma
28
35
  icon: options.icon,
29
36
  actions: options.actions ?? [],
30
37
  actionSlot: options.actionSlot,
38
+ duration: options.duration ?? 0,
31
39
  createdAt: Date.now(),
32
40
  ref,
33
41
  };
@@ -40,17 +48,36 @@ export const NotificationProvider = ({ children, position = DEFAULT_POSITION, ma
40
48
  });
41
49
  setTimeout(() => {
42
50
  notification.ref.current?.show();
51
+ if (notification.duration && notification.duration > 0) {
52
+ const timer = setTimeout(() => {
53
+ const n = notificationsRef.current.find((item) => item.id === id);
54
+ n?.ref.current?.dismiss();
55
+ }, notification.duration);
56
+ timersRef.current.set(id, timer);
57
+ }
43
58
  }, 0);
44
59
  return id;
45
60
  }, [maxNotifications]);
46
61
  const dismiss = useCallback((id) => {
62
+ const timer = timersRef.current.get(id);
63
+ if (timer) {
64
+ clearTimeout(timer);
65
+ timersRef.current.delete(id);
66
+ }
47
67
  const n = notificationsRef.current.find((item) => item.id === id);
48
68
  n?.ref.current?.dismiss();
49
69
  }, []);
50
70
  const remove = useCallback((id) => {
71
+ const timer = timersRef.current.get(id);
72
+ if (timer) {
73
+ clearTimeout(timer);
74
+ timersRef.current.delete(id);
75
+ }
51
76
  setNotifications((prev) => prev.filter((notification) => notification.id !== id));
52
77
  }, []);
53
78
  const removeAll = useCallback(() => {
79
+ timersRef.current.forEach((timer) => clearTimeout(timer));
80
+ timersRef.current.clear();
54
81
  setNotifications([]);
55
82
  }, []);
56
83
  const handleNotificationClose = useCallback((id) => {
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import { NvDatatableProps } from './types';
3
+ declare function NvDatatable<T>({ columns, rows, pagination, sorting, renderPagination, stickyHeader, ...htmlProps }: NvDatatableProps<T>): React.JSX.Element;
4
+ declare namespace NvDatatable {
5
+ var displayName: string;
6
+ }
7
+ export { NvDatatable };
@@ -0,0 +1,3 @@
1
+ export * from './NvDatatable';
2
+ export * from './types';
3
+ export * from './utils';