@kwiz/fluentui 1.0.57 → 1.0.59

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 (118) hide show
  1. package/.dependency-cruiser.js +399 -0
  2. package/dist/controls/ColorPickerDialog.js +1 -1
  3. package/dist/controls/ColorPickerDialog.js.map +1 -1
  4. package/dist/controls/button.js +1 -1
  5. package/dist/controls/button.js.map +1 -1
  6. package/dist/controls/canvas/DrawPad.js +1 -1
  7. package/dist/controls/canvas/DrawPad.js.map +1 -1
  8. package/dist/controls/date.js +2 -2
  9. package/dist/controls/date.js.map +1 -1
  10. package/dist/controls/diagram-picker.js +2 -2
  11. package/dist/controls/diagram-picker.js.map +1 -1
  12. package/dist/controls/dropdown.js +1 -1
  13. package/dist/controls/dropdown.js.map +1 -1
  14. package/dist/controls/file-upload.js +1 -2
  15. package/dist/controls/file-upload.js.map +1 -1
  16. package/dist/controls/index.d.ts +31 -0
  17. package/dist/controls/index.js +32 -0
  18. package/dist/controls/index.js.map +1 -0
  19. package/dist/controls/input.js +1 -1
  20. package/dist/controls/input.js.map +1 -1
  21. package/dist/controls/kwizoverflow.js +1 -1
  22. package/dist/controls/kwizoverflow.js.map +1 -1
  23. package/dist/controls/menu.js +2 -2
  24. package/dist/controls/menu.js.map +1 -1
  25. package/dist/controls/prompt.js +2 -2
  26. package/dist/controls/prompt.js.map +1 -1
  27. package/dist/controls/search.js +1 -1
  28. package/dist/controls/search.js.map +1 -1
  29. package/dist/controls/section.js +1 -1
  30. package/dist/controls/section.js.map +1 -1
  31. package/dist/controls/vertical-content.js +1 -1
  32. package/dist/controls/vertical-content.js.map +1 -1
  33. package/dist/helpers/block-nav.d.ts +11 -0
  34. package/dist/helpers/block-nav.js +79 -0
  35. package/dist/helpers/block-nav.js.map +1 -0
  36. package/dist/helpers/{context.d.ts → context-export.d.ts} +4 -3
  37. package/dist/helpers/context-export.js +23 -0
  38. package/dist/helpers/context-export.js.map +1 -0
  39. package/dist/helpers/context-internal.d.ts +4 -0
  40. package/dist/helpers/{context.js → context-internal.js} +1 -1
  41. package/dist/helpers/context-internal.js.map +1 -0
  42. package/dist/helpers/drag-drop/drag-drop-container.d.ts +1 -2
  43. package/dist/helpers/drag-drop/drag-drop-container.js.map +1 -1
  44. package/dist/helpers/drag-drop/drag-drop-context-internal.d.ts +4 -0
  45. package/dist/helpers/drag-drop/drag-drop-context-internal.js +9 -0
  46. package/dist/helpers/drag-drop/drag-drop-context-internal.js.map +1 -0
  47. package/dist/helpers/drag-drop/drag-drop-context.d.ts +1 -9
  48. package/dist/helpers/drag-drop/drag-drop-context.js +2 -9
  49. package/dist/helpers/drag-drop/drag-drop-context.js.map +1 -1
  50. package/dist/helpers/drag-drop/drag-drop.types.d.ts +19 -0
  51. package/dist/helpers/drag-drop/drag-drop.types.js +2 -0
  52. package/dist/helpers/drag-drop/drag-drop.types.js.map +1 -0
  53. package/dist/helpers/drag-drop/{exports.d.ts → index.d.ts} +2 -4
  54. package/dist/helpers/drag-drop/{exports.js → index.js} +1 -1
  55. package/dist/helpers/drag-drop/index.js.map +1 -0
  56. package/dist/helpers/drag-drop/use-draggable.d.ts +1 -8
  57. package/dist/helpers/drag-drop/use-draggable.js +1 -1
  58. package/dist/helpers/drag-drop/use-draggable.js.map +1 -1
  59. package/dist/helpers/drag-drop/use-droppable.d.ts +2 -9
  60. package/dist/helpers/drag-drop/use-droppable.js +1 -2
  61. package/dist/helpers/drag-drop/use-droppable.js.map +1 -1
  62. package/dist/helpers/hooks-events.d.ts +21 -0
  63. package/dist/helpers/hooks-events.js +146 -0
  64. package/dist/helpers/hooks-events.js.map +1 -0
  65. package/dist/helpers/hooks.d.ts +0 -69
  66. package/dist/helpers/hooks.js +1 -310
  67. package/dist/helpers/hooks.js.map +1 -1
  68. package/dist/helpers/index.d.ts +7 -0
  69. package/dist/helpers/index.js +8 -0
  70. package/dist/helpers/index.js.map +1 -0
  71. package/dist/helpers/use-alerts.d.ts +14 -0
  72. package/dist/helpers/use-alerts.js +65 -0
  73. package/dist/helpers/use-alerts.js.map +1 -0
  74. package/dist/helpers/use-toast.d.ts +18 -0
  75. package/dist/helpers/use-toast.js +17 -0
  76. package/dist/helpers/use-toast.js.map +1 -0
  77. package/dist/index.d.ts +3 -36
  78. package/dist/index.js +3 -35
  79. package/dist/index.js.map +1 -1
  80. package/dist/styles/index.d.ts +1 -0
  81. package/dist/styles/index.js +2 -0
  82. package/dist/styles/index.js.map +1 -0
  83. package/package.json +5 -3
  84. package/src/controls/ColorPickerDialog.tsx +1 -1
  85. package/src/controls/button.tsx +1 -1
  86. package/src/controls/canvas/DrawPad.tsx +1 -1
  87. package/src/controls/date.tsx +2 -2
  88. package/src/controls/diagram-picker.tsx +2 -2
  89. package/src/controls/dropdown.tsx +1 -1
  90. package/src/controls/file-upload.tsx +1 -3
  91. package/src/controls/index.ts +31 -0
  92. package/src/controls/input.tsx +1 -1
  93. package/src/controls/kwizoverflow.tsx +1 -1
  94. package/src/controls/menu.tsx +2 -2
  95. package/src/controls/prompt.tsx +2 -2
  96. package/src/controls/search.tsx +1 -1
  97. package/src/controls/section.tsx +1 -1
  98. package/src/controls/vertical-content.tsx +1 -1
  99. package/src/helpers/block-nav.tsx +89 -0
  100. package/src/helpers/context-export.ts +53 -0
  101. package/src/helpers/context-internal.ts +17 -0
  102. package/src/helpers/drag-drop/drag-drop-container.tsx +1 -2
  103. package/src/helpers/drag-drop/drag-drop-context-internal.tsx +10 -0
  104. package/src/helpers/drag-drop/drag-drop-context.tsx +5 -15
  105. package/src/helpers/drag-drop/drag-drop.types.ts +21 -0
  106. package/src/helpers/drag-drop/{exports.ts → index.ts} +2 -4
  107. package/src/helpers/drag-drop/use-draggable.ts +2 -10
  108. package/src/helpers/drag-drop/use-droppable.ts +3 -12
  109. package/src/helpers/hooks-events.ts +153 -0
  110. package/src/helpers/hooks.tsx +1 -360
  111. package/src/helpers/index.ts +8 -0
  112. package/src/helpers/use-alerts.tsx +75 -0
  113. package/src/helpers/use-toast.tsx +30 -0
  114. package/src/index.ts +3 -37
  115. package/src/styles/index.ts +1 -0
  116. package/dist/helpers/context.js.map +0 -1
  117. package/dist/helpers/drag-drop/exports.js.map +0 -1
  118. package/src/helpers/context.ts +0 -40
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/helpers/drag-drop/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1,12 +1,5 @@
1
1
  import { ConnectDragSource } from 'react-dnd';
2
- export interface iDraggedItemType<DragType extends string> {
3
- type: DragType;
4
- }
5
- export interface iDraggableProps<ItemType extends iDraggedItemType<string>> {
6
- item: ItemType;
7
- onBeginDrag?: () => void;
8
- onEndDrag?: (dropResult: any) => void;
9
- }
2
+ import { iDraggableProps, iDraggedItemType } from './drag-drop.types';
10
3
  export declare function useDraggable<ItemType extends iDraggedItemType<string>>(props?: iDraggableProps<ItemType>): {
11
4
  isDragging: boolean;
12
5
  dragRef: ConnectDragSource;
@@ -1,6 +1,6 @@
1
1
  import { useEffect } from 'react';
2
2
  import { useDrag } from 'react-dnd';
3
- import { useDragDropContextInternal } from './drag-drop-context';
3
+ import { useDragDropContextInternal } from './drag-drop-context-internal';
4
4
  export function useDraggable(props) {
5
5
  const { item, onBeginDrag, onEndDrag, } = props || {
6
6
  item: {
@@ -1 +1 @@
1
- {"version":3,"file":"use-draggable.js","sourceRoot":"","sources":["../../../src/helpers/drag-drop/use-draggable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAwC,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAWjE,MAAM,UAAU,YAAY,CAA4C,KAAiC;IAIrG,MAAM,EACF,IAAI,EACJ,WAAW,EACX,SAAS,GACZ,GAAG,KAAK,IAAI;QACT,IAAI,EAAE;YACF,IAAI,EAAE,WAAW;SACpB;KACJ,CAAC;IAEF,MAAM,eAAe,GAAG,0BAA0B,EAAE,CAAC;IAErD,MAAM,CAAC,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,GAAG,OAAO,CACrC,GAAG,EAAE,CAAC,CAAC;QACH,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI;QACJ,OAAO,EAAE,CAAC,OAA0B,EAAE,EAAE,CAAC,CAAC;YACtC,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE;SACnC,CAAC;QACF,GAAG,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;YACnB,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAClC,SAAS,IAAI,SAAS,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;QACpD,CAAC;KACJ,CAAC,EACF,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CACpB,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,UAAU,EAAE,CAAC;YACb,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAClC,WAAW,IAAI,WAAW,EAAE,CAAC;QACjC,CAAC;IACL,CAAC,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAA;IAE7B,OAAO;QACH,UAAU;QACV,OAAO;KACV,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"use-draggable.js","sourceRoot":"","sources":["../../../src/helpers/drag-drop/use-draggable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAwC,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAG1E,MAAM,UAAU,YAAY,CAA4C,KAAiC;IAIrG,MAAM,EACF,IAAI,EACJ,WAAW,EACX,SAAS,GACZ,GAAG,KAAK,IAAI;QACT,IAAI,EAAE;YACF,IAAI,EAAE,WAAW;SACpB;KACJ,CAAC;IAEF,MAAM,eAAe,GAAG,0BAA0B,EAAE,CAAC;IAErD,MAAM,CAAC,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,GAAG,OAAO,CACrC,GAAG,EAAE,CAAC,CAAC;QACH,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI;QACJ,OAAO,EAAE,CAAC,OAA0B,EAAE,EAAE,CAAC,CAAC;YACtC,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE;SACnC,CAAC;QACF,GAAG,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;YACnB,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAClC,SAAS,IAAI,SAAS,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;QACpD,CAAC;KACJ,CAAC,EACF,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CACpB,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,UAAU,EAAE,CAAC;YACb,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAClC,WAAW,IAAI,WAAW,EAAE,CAAC;QACjC,CAAC;IACL,CAAC,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAA;IAE7B,OAAO;QACH,UAAU;QACV,OAAO;KACV,CAAC;AACN,CAAC"}
@@ -1,14 +1,7 @@
1
1
  import { ConnectDropTarget } from 'react-dnd';
2
- import { iDraggedItemType } from './use-draggable';
3
- export interface iDroppableProps<DropTypes extends string, ItemTypes extends iDraggedItemType<DropTypes>> {
4
- acceptTypes: DropTypes[];
5
- onItemDrop: (item: ItemTypes) => void;
6
- onHover?: (item: ItemTypes) => void;
7
- onDrop?: () => void;
8
- }
9
- declare function useDroppable<DropType extends string, ItemType extends iDraggedItemType<DropType>>(props?: iDroppableProps<DropType, ItemType>): {
2
+ import { iDraggedItemType, iDroppableProps } from './drag-drop.types';
3
+ export declare function useDroppable<DropType extends string, ItemType extends iDraggedItemType<DropType>>(props?: iDroppableProps<DropType, ItemType>): {
10
4
  canDrop: boolean;
11
5
  isOver: boolean;
12
6
  dropRef: ConnectDropTarget;
13
7
  };
14
- export default useDroppable;
@@ -1,5 +1,5 @@
1
1
  import { useDrop } from 'react-dnd';
2
- function useDroppable(props) {
2
+ export function useDroppable(props) {
3
3
  const { acceptTypes, onItemDrop, onHover, onDrop, } = props || {
4
4
  acceptTypes: [],
5
5
  onItemDrop: () => { }
@@ -24,5 +24,4 @@ function useDroppable(props) {
24
24
  dropRef,
25
25
  };
26
26
  }
27
- export default useDroppable;
28
27
  //# sourceMappingURL=use-droppable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-droppable.js","sourceRoot":"","sources":["../../../src/helpers/drag-drop/use-droppable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,OAAO,EAAE,MAAM,WAAW,CAAC;AAU1E,SAAS,YAAY,CAAuE,KAA2C;IAKnI,MAAM,EACF,WAAW,EACX,UAAU,EACV,OAAO,EACP,MAAM,GACT,GAAG,KAAK,IAAI;QACT,WAAW,EAAE,EAAE;QACf,UAAU,EAAE,GAAG,EAAE,GAAG,CAAC;KACxB,CAAC;IAEF,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;QAC3C,MAAM,EAAE,WAAW;QACnB,IAAI,EAAE,CAAC,IAAc,EAAE,EAAE;YACrB,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,MAAM,aAAN,MAAM,uBAAN,MAAM,EAAI,CAAC;QACf,CAAC;QACD,KAAK,EAAE,CAAC,IAAc,EAAE,EAAE;YACtB,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAG,IAAI,CAAC,CAAC;QACpB,CAAC;QACD,OAAO,EAAE,CAAC,OAA0B,EAAE,EAAE,CAAC,CAAC;YACtC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE;YAC1B,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;SAC3B,CAAC;KACL,CAAC,CAAC;IAEH,OAAO;QACH,OAAO;QACP,MAAM;QACN,OAAO;KACV,CAAC;AACN,CAAC;AAED,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"use-droppable.js","sourceRoot":"","sources":["../../../src/helpers/drag-drop/use-droppable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,OAAO,EAAE,MAAM,WAAW,CAAC;AAG1E,MAAM,UAAU,YAAY,CAAuE,KAA2C;IAK1I,MAAM,EACF,WAAW,EACX,UAAU,EACV,OAAO,EACP,MAAM,GACT,GAAG,KAAK,IAAI;QACT,WAAW,EAAE,EAAE;QACf,UAAU,EAAE,GAAG,EAAE,GAAG,CAAC;KACxB,CAAC;IAEF,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;QAC3C,MAAM,EAAE,WAAW;QACnB,IAAI,EAAE,CAAC,IAAc,EAAE,EAAE;YACrB,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,MAAM,aAAN,MAAM,uBAAN,MAAM,EAAI,CAAC;QACf,CAAC;QACD,KAAK,EAAE,CAAC,IAAc,EAAE,EAAE;YACtB,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAG,IAAI,CAAC,CAAC;QACpB,CAAC;QACD,OAAO,EAAE,CAAC,OAA0B,EAAE,EAAE,CAAC,CAAC;YACtC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE;YAC1B,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;SAC3B,CAAC;KACL,CAAC,CAAC;IAEH,OAAO;QACH,OAAO;QACP,MAAM;QACN,OAAO;KACV,CAAC;AACN,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { MutableRefObject } from "react";
2
+ export declare function useTrackFocus(props: {
3
+ onFocus: () => void;
4
+ onLoseFocus: () => void;
5
+ ref?: MutableRefObject<HTMLElement>;
6
+ }): MutableRefObject<HTMLElement>;
7
+ export declare function useWindowSize(): {
8
+ width: number;
9
+ height: number;
10
+ };
11
+ export declare function useElementSize(elm: HTMLElement): {
12
+ width: number;
13
+ height: number;
14
+ };
15
+ export declare function useIsInPrint(): boolean;
16
+ export declare function useKeyDown(options: {
17
+ elm?: HTMLElement | Document;
18
+ onEnter?: (e: KeyboardEvent) => void;
19
+ onEscape?: (e: KeyboardEvent) => void;
20
+ onKeyDown?: (e: KeyboardEvent) => void;
21
+ }): void;
@@ -0,0 +1,146 @@
1
+ import { isDebug, isFunction } from "@kwiz/common";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { KnownClassNames } from "../styles/styles";
4
+ import { useEffectOnlyOnMount } from "./hooks";
5
+ export function useTrackFocus(props) {
6
+ const wrapperDiv = props.ref || useRef(null);
7
+ useEffect(() => {
8
+ function focusIn(e) {
9
+ let elm = e.target; //document.activeElement;
10
+ if (wrapperDiv.current) {
11
+ while (elm && elm !== wrapperDiv.current) {
12
+ elm = elm.parentElement;
13
+ }
14
+ }
15
+ else
16
+ elm = null;
17
+ if (wrapperDiv.current && elm === wrapperDiv.current)
18
+ props.onFocus();
19
+ else
20
+ props.onLoseFocus();
21
+ }
22
+ if (wrapperDiv.current) {
23
+ if (wrapperDiv.current)
24
+ wrapperDiv.current.tabIndex = 1;
25
+ window.addEventListener("focusin", focusIn);
26
+ // Remove event listener on cleanup
27
+ return () => window.removeEventListener("focusin", focusIn);
28
+ }
29
+ }, [wrapperDiv.current]);
30
+ return wrapperDiv;
31
+ }
32
+ export function useWindowSize() {
33
+ // Initialize state with undefined width/height so server and client renders match
34
+ // Learn more here: https://joshwcomeau.com/react/the-perils-of-rehydration/
35
+ const [windowSize, setWindowSize] = useState({
36
+ width: undefined,
37
+ height: undefined
38
+ });
39
+ useEffect(() => {
40
+ // Handler to call on window resize
41
+ function handleResize() {
42
+ // Set window width/height to state
43
+ setWindowSize({
44
+ width: window.innerWidth,
45
+ height: window.innerHeight
46
+ });
47
+ }
48
+ // Add event listener
49
+ window.addEventListener("resize", handleResize);
50
+ // Call handler right away so state gets updated with initial window size
51
+ handleResize();
52
+ // Remove event listener on cleanup
53
+ return () => window.removeEventListener("resize", handleResize);
54
+ }, useEffectOnlyOnMount);
55
+ return windowSize;
56
+ }
57
+ export function useElementSize(elm) {
58
+ // Initialize state with undefined width/height so server and client renders match
59
+ // Learn more here: https://joshwcomeau.com/react/the-perils-of-rehydration/
60
+ const [elmSize, setELmSize] = useState({
61
+ width: undefined,
62
+ height: undefined
63
+ });
64
+ useEffect(() => {
65
+ if (elm) {
66
+ // Handler to call on elm resize
67
+ function handleResize() {
68
+ // Set elm width/height to state
69
+ setELmSize({
70
+ width: (elm instanceof Window) ? elm.innerWidth : elm.clientWidth,
71
+ height: (elm instanceof Window) ? elm.innerHeight : elm.clientHeight,
72
+ });
73
+ }
74
+ // Add event listener
75
+ const observer = new ResizeObserver(handleResize);
76
+ observer.observe(elm);
77
+ // Call handler right away so state gets updated with initial elm size
78
+ handleResize();
79
+ // Remove event listener on cleanup
80
+ return () => observer.disconnect();
81
+ }
82
+ }, [elm]);
83
+ return elmSize;
84
+ }
85
+ export function useIsInPrint() {
86
+ // Initialize state with false
87
+ const [printMode, setPrintMode] = useState(false);
88
+ useEffect(() => {
89
+ function forcePrint(e) {
90
+ if (e.ctrlKey && e.shiftKey && e.altKey) {
91
+ if (e.key.toLocaleLowerCase() === "q") {
92
+ document.body.classList.remove(KnownClassNames.print);
93
+ handlePrint(e, false);
94
+ }
95
+ else {
96
+ console.warn('forced print mode - to exit refresh to ctrl+shift+alt+q');
97
+ document.body.classList.add(KnownClassNames.print);
98
+ handlePrint(e, true);
99
+ }
100
+ }
101
+ }
102
+ // Handler to call on printing
103
+ function handlePrint(e, force) {
104
+ if (force === true)
105
+ setPrintMode(true);
106
+ else if (window.matchMedia) {
107
+ var mediaQueryList = window.matchMedia('print');
108
+ if (mediaQueryList.matches) {
109
+ setPrintMode(true);
110
+ }
111
+ else {
112
+ setPrintMode(false);
113
+ }
114
+ }
115
+ }
116
+ // Add event listener
117
+ window.addEventListener("print", handlePrint);
118
+ if (isDebug())
119
+ window.addEventListener("keydown", forcePrint);
120
+ // Call handler right away so state gets updated with initial printing state
121
+ handlePrint();
122
+ // Remove event listener on cleanup
123
+ return () => {
124
+ window.removeEventListener("print", handlePrint);
125
+ if (isDebug())
126
+ window.removeEventListener("keydown", forcePrint);
127
+ };
128
+ }, useEffectOnlyOnMount);
129
+ return printMode;
130
+ }
131
+ export function useKeyDown(options) {
132
+ let elm = options.elm || document;
133
+ useEffect(() => {
134
+ let handler = (e) => {
135
+ if (e.key === "Enter" && isFunction(options.onEnter))
136
+ options.onEnter(e);
137
+ else if (e.key === "Escape" && isFunction(options.onEscape))
138
+ options.onEscape(e);
139
+ if (isFunction(options.onKeyDown))
140
+ options.onKeyDown(e);
141
+ };
142
+ elm.addEventListener("keydown", handler);
143
+ return () => elm.removeEventListener("keydown", handler);
144
+ }, [elm, options.onEnter, options.onEscape, options.onKeyDown]);
145
+ }
146
+ //# sourceMappingURL=hooks-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-events.js","sourceRoot":"","sources":["../../src/helpers/hooks-events.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,4 @@
1
- import { ToastIntent } from "@fluentui/react-components";
2
1
  import { MutableRefObject, SetStateAction } from "react";
3
- import { IPrompterProps } from "../controls/prompt";
4
- import { iKWIZFluentContext } from "./context";
5
2
  /** Empty array ensures that effect is only run on mount */
6
3
  export declare const useEffectOnlyOnMount: any[];
7
4
  /** set state on steroids. provide promise callback after render, onChange transformer and automatic skip-set when value not changed */
@@ -14,69 +11,3 @@ export declare function useStateEX<ValueType>(initialValue: ValueType, options?:
14
11
  (newValue: SetStateAction<ValueType>) => Promise<ValueType>,
15
12
  MutableRefObject<ValueType>
16
13
  ];
17
- export declare function useTrackFocus(props: {
18
- onFocus: () => void;
19
- onLoseFocus: () => void;
20
- ref?: MutableRefObject<HTMLElement>;
21
- }): MutableRefObject<HTMLElement>;
22
- export declare function useWindowSize(): {
23
- width: number;
24
- height: number;
25
- };
26
- export declare function useElementSize(elm: HTMLElement): {
27
- width: number;
28
- height: number;
29
- };
30
- export declare function useIsInPrint(): boolean;
31
- export interface iBlockNav {
32
- setMessage: (id: string, message?: string) => void;
33
- onNav: (nav: () => void) => void;
34
- navPrompt?: JSX.Element;
35
- }
36
- /** set block message if you want to block nav.
37
- * - call setMessage to add a blocker message
38
- * - call onNav when you have internal navigation (open / close popups)
39
- * - render the navPrompt control to your page
40
- * FYI for page unload, most modern browsers won't show your message but a generic one instead. */
41
- export declare function useBlockNav(): iBlockNav;
42
- export declare function useKeyDown(options: {
43
- elm?: HTMLElement | Document;
44
- onEnter?: (e: KeyboardEvent) => void;
45
- onEscape?: (e: KeyboardEvent) => void;
46
- onKeyDown?: (e: KeyboardEvent) => void;
47
- }): void;
48
- export declare function useToast(): {
49
- control: import("react/jsx-runtime").JSX.Element;
50
- dispatch: (info: {
51
- title?: string;
52
- body?: string;
53
- subtitle?: string;
54
- titleAction?: {
55
- text: string;
56
- onClick: () => void;
57
- };
58
- footerActions?: {
59
- text: string;
60
- onClick: () => void;
61
- }[];
62
- intent?: ToastIntent;
63
- }) => void;
64
- };
65
- export declare const useContextStyles: () => Record<"root", string>;
66
- export declare function useKWIZFluentContextProvider(options: {
67
- root?: React.MutableRefObject<HTMLDivElement>;
68
- ctx?: iKWIZFluentContext;
69
- }): iKWIZFluentContext;
70
- export interface iAlerts {
71
- promptEX: (info: IPrompterProps) => void;
72
- confirmEX: (message: string | JSX.Element, onOK?: () => void, onCancel?: () => void) => Promise<boolean>;
73
- alertEX: (message: string | JSX.Element, onOK?: () => void) => Promise<void>;
74
- alertPrompt?: JSX.Element;
75
- close: () => void;
76
- }
77
- /** set block message if you want to block nav.
78
- * - call setMessage to add a blocker message
79
- * - call onNav when you have internal navigation (open / close popups)
80
- * - render the navPrompt control to your page
81
- * FYI for page unload, most modern browsers won't show your message but a generic one instead. */
82
- export declare function useAlerts(): iAlerts;
@@ -1,11 +1,6 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Label, Link, makeStyles, Toast, ToastBody, Toaster, ToastFooter, ToastTitle, useId, useToastController } from "@fluentui/react-components";
3
- import { isDebug, isFunction, isNotEmptyArray, isNullOrEmptyString, isPrimitiveValue, isString, jsonClone, jsonStringify, LoggerLevel, objectsEqual, wrapFunction } from "@kwiz/common";
1
+ import { isFunction, isNotEmptyArray, isNullOrEmptyString, isPrimitiveValue, jsonClone, jsonStringify, LoggerLevel, objectsEqual, wrapFunction } from "@kwiz/common";
4
2
  import { useCallback, useEffect, useRef, useState } from "react";
5
3
  import { GetLogger } from "../_modules/config";
6
- import { Prompter } from "../controls/prompt";
7
- import { KnownClassNames } from "../styles/styles";
8
- import { useKWIZFluentContext } from "./context";
9
4
  const logger = GetLogger("helpers/hooks");
10
5
  /** Empty array ensures that effect is only run on mount */
11
6
  export const useEffectOnlyOnMount = [];
@@ -82,308 +77,4 @@ export function useStateEX(initialValue, options) {
82
77
  }), []);
83
78
  return [value, setValue, currentValue];
84
79
  }
85
- export function useTrackFocus(props) {
86
- const wrapperDiv = props.ref || useRef(null);
87
- useEffect(() => {
88
- function focusIn(e) {
89
- let elm = e.target; //document.activeElement;
90
- if (wrapperDiv.current) {
91
- while (elm && elm !== wrapperDiv.current) {
92
- elm = elm.parentElement;
93
- }
94
- }
95
- else
96
- elm = null;
97
- if (wrapperDiv.current && elm === wrapperDiv.current)
98
- props.onFocus();
99
- else
100
- props.onLoseFocus();
101
- }
102
- if (wrapperDiv.current) {
103
- if (wrapperDiv.current)
104
- wrapperDiv.current.tabIndex = 1;
105
- window.addEventListener("focusin", focusIn);
106
- // Remove event listener on cleanup
107
- return () => window.removeEventListener("focusin", focusIn);
108
- }
109
- }, [wrapperDiv.current]);
110
- return wrapperDiv;
111
- }
112
- export function useWindowSize() {
113
- // Initialize state with undefined width/height so server and client renders match
114
- // Learn more here: https://joshwcomeau.com/react/the-perils-of-rehydration/
115
- const [windowSize, setWindowSize] = useState({
116
- width: undefined,
117
- height: undefined
118
- });
119
- useEffect(() => {
120
- // Handler to call on window resize
121
- function handleResize() {
122
- // Set window width/height to state
123
- setWindowSize({
124
- width: window.innerWidth,
125
- height: window.innerHeight
126
- });
127
- }
128
- // Add event listener
129
- window.addEventListener("resize", handleResize);
130
- // Call handler right away so state gets updated with initial window size
131
- handleResize();
132
- // Remove event listener on cleanup
133
- return () => window.removeEventListener("resize", handleResize);
134
- }, useEffectOnlyOnMount);
135
- return windowSize;
136
- }
137
- export function useElementSize(elm) {
138
- // Initialize state with undefined width/height so server and client renders match
139
- // Learn more here: https://joshwcomeau.com/react/the-perils-of-rehydration/
140
- const [elmSize, setELmSize] = useState({
141
- width: undefined,
142
- height: undefined
143
- });
144
- useEffect(() => {
145
- if (elm) {
146
- // Handler to call on elm resize
147
- function handleResize() {
148
- // Set elm width/height to state
149
- setELmSize({
150
- width: (elm instanceof Window) ? elm.innerWidth : elm.clientWidth,
151
- height: (elm instanceof Window) ? elm.innerHeight : elm.clientHeight,
152
- });
153
- }
154
- // Add event listener
155
- const observer = new ResizeObserver(handleResize);
156
- observer.observe(elm);
157
- // Call handler right away so state gets updated with initial elm size
158
- handleResize();
159
- // Remove event listener on cleanup
160
- return () => observer.disconnect();
161
- }
162
- }, [elm]);
163
- return elmSize;
164
- }
165
- export function useIsInPrint() {
166
- // Initialize state with false
167
- const [printMode, setPrintMode] = useState(false);
168
- useEffect(() => {
169
- function forcePrint(e) {
170
- if (e.ctrlKey && e.shiftKey && e.altKey) {
171
- if (e.key.toLocaleLowerCase() === "q") {
172
- document.body.classList.remove(KnownClassNames.print);
173
- handlePrint(e, false);
174
- }
175
- else {
176
- console.warn('forced print mode - to exit refresh to ctrl+shift+alt+q');
177
- document.body.classList.add(KnownClassNames.print);
178
- handlePrint(e, true);
179
- }
180
- }
181
- }
182
- // Handler to call on printing
183
- function handlePrint(e, force) {
184
- if (force === true)
185
- setPrintMode(true);
186
- else if (window.matchMedia) {
187
- var mediaQueryList = window.matchMedia('print');
188
- if (mediaQueryList.matches) {
189
- setPrintMode(true);
190
- }
191
- else {
192
- setPrintMode(false);
193
- }
194
- }
195
- }
196
- // Add event listener
197
- window.addEventListener("print", handlePrint);
198
- if (isDebug())
199
- window.addEventListener("keydown", forcePrint);
200
- // Call handler right away so state gets updated with initial printing state
201
- handlePrint();
202
- // Remove event listener on cleanup
203
- return () => {
204
- window.removeEventListener("print", handlePrint);
205
- if (isDebug())
206
- window.removeEventListener("keydown", forcePrint);
207
- };
208
- }, useEffectOnlyOnMount);
209
- return printMode;
210
- }
211
- /** set block message if you want to block nav.
212
- * - call setMessage to add a blocker message
213
- * - call onNav when you have internal navigation (open / close popups)
214
- * - render the navPrompt control to your page
215
- * FYI for page unload, most modern browsers won't show your message but a generic one instead. */
216
- export function useBlockNav() {
217
- const [, setBlockNavMessages, blockNavMessagesRef] = useStateEX({});
218
- const [_prompt, setPrompt] = useStateEX(null);
219
- const getMessagesArr = useCallback(() => {
220
- return Object.keys(blockNavMessagesRef.current).map(id => blockNavMessagesRef.current[id]);
221
- }, useEffectOnlyOnMount);
222
- const getMessages = useCallback(() => {
223
- return getMessagesArr().join();
224
- }, useEffectOnlyOnMount);
225
- const onNav = useCallback((nav) => {
226
- let messages = getMessagesArr();
227
- if (isNotEmptyArray(messages)) {
228
- //need to release react to re-render the prompt
229
- window.setTimeout(() => {
230
- //prompt, if ok - clear messages and nav.
231
- setPrompt({
232
- okButtonText: "Leave",
233
- cancelButtonText: "Cancel",
234
- title: "Leave page?",
235
- children: messages.length > 1
236
- ? _jsx("ul", { children: messages.map((m, i) => _jsx("li", { children: m }, `m${i}`)) })
237
- : _jsx("p", { children: messages[0] }),
238
- onCancel: () => setPrompt(null),
239
- onOK: () => {
240
- setPrompt(null);
241
- setBlockNavMessages({}); //clear messages
242
- nav();
243
- }
244
- });
245
- }, 1);
246
- }
247
- else
248
- nav();
249
- }, useEffectOnlyOnMount);
250
- useEffect(() => {
251
- function handleBeforeUnload(e) {
252
- //todo: use blockMessageRef.current so that we don't have to re-register every time message changes.
253
- //otherwise we would have to add blockMessage as a dependency for this useEffect
254
- const message = getMessages();
255
- if (!isNullOrEmptyString(message)) {
256
- e.preventDefault();
257
- e.returnValue = message;
258
- }
259
- }
260
- // Add event listener
261
- window.addEventListener("beforeunload", handleBeforeUnload);
262
- // Remove event listener on cleanup
263
- return () => window.removeEventListener("beforeunload", handleBeforeUnload);
264
- }, useEffectOnlyOnMount);
265
- return {
266
- setMessage: (id, message) => {
267
- let current = jsonClone(blockNavMessagesRef.current);
268
- if (isNullOrEmptyString(message))
269
- delete current[id];
270
- else
271
- current[id] = message;
272
- if (!objectsEqual(current, blockNavMessagesRef.current))
273
- setBlockNavMessages(current);
274
- },
275
- // clearMessages: () => {
276
- // setBlockNavMessages({});
277
- // },
278
- // getMessages,
279
- // getMessagesArr,
280
- onNav,
281
- navPrompt: _prompt ? _jsx(Prompter, Object.assign({}, _prompt)) : undefined
282
- };
283
- }
284
- export function useKeyDown(options) {
285
- let elm = options.elm || document;
286
- useEffect(() => {
287
- let handler = (e) => {
288
- if (e.key === "Enter" && isFunction(options.onEnter))
289
- options.onEnter(e);
290
- else if (e.key === "Escape" && isFunction(options.onEscape))
291
- options.onEscape(e);
292
- if (isFunction(options.onKeyDown))
293
- options.onKeyDown(e);
294
- };
295
- elm.addEventListener("keydown", handler);
296
- return () => elm.removeEventListener("keydown", handler);
297
- }, [elm, options.onEnter, options.onEscape, options.onKeyDown]);
298
- }
299
- export function useToast() {
300
- const ctx = useKWIZFluentContext();
301
- const toasterId = useId("toaster");
302
- const { dispatchToast } = useToastController(toasterId);
303
- return {
304
- control: _jsx(Toaster, { mountNode: ctx.mountNode, toasterId: toasterId }),
305
- dispatch: (info) => {
306
- dispatchToast(_jsxs(Toast, { children: [info.title && _jsx(ToastTitle, { action: info.titleAction ? _jsx(Link, { onClick: info.titleAction.onClick, children: info.titleAction.text }) : undefined, children: info.title }), info.body && _jsx(ToastBody, { subtitle: info.subtitle, children: info.body }), isNotEmptyArray(info.footerActions) &&
307
- _jsx(ToastFooter, { children: info.footerActions.map((a, i) => _jsx(Link, { onClick: a.onClick, children: a.text }, `l${i}`)) })] }), { intent: info.intent || "info" });
308
- }
309
- };
310
- }
311
- export const useContextStyles = makeStyles({
312
- root: {
313
- "& *": {
314
- scrollbarWidth: "thin"
315
- }
316
- },
317
- });
318
- export function useKWIZFluentContextProvider(options) {
319
- const classes = useContextStyles();
320
- let v = options && options.ctx || {};
321
- const [kwizFluentContext, setKwizFluentContext] = useState(v);
322
- useEffect(() => {
323
- var _a, _b;
324
- (_b = (_a = options.root) === null || _a === void 0 ? void 0 : _a.current) === null || _b === void 0 ? void 0 : _b.classList.add(...classes.root.split(' '));
325
- // ref only updates in useEffect, not in useMemo or anything else.
326
- // we need to set it into state so it will trigger a ui update
327
- setKwizFluentContext(Object.assign(Object.assign({}, v), { mountNode: options.root.current }));
328
- }, [options.root]);
329
- return kwizFluentContext;
330
- }
331
- /** set block message if you want to block nav.
332
- * - call setMessage to add a blocker message
333
- * - call onNav when you have internal navigation (open / close popups)
334
- * - render the navPrompt control to your page
335
- * FYI for page unload, most modern browsers won't show your message but a generic one instead. */
336
- export function useAlerts() {
337
- const [_prompt, _setPrompt] = useStateEX(null);
338
- const promptEX = useCallback((info) => {
339
- //need to release react to re-render the prompt
340
- window.setTimeout(() => {
341
- //prompt, if ok - clear messages and nav.
342
- _setPrompt(Object.assign(Object.assign({}, info), { onCancel: () => {
343
- _setPrompt(null);
344
- if (isFunction(info.onCancel))
345
- info.onCancel();
346
- }, onOK: () => {
347
- _setPrompt(null);
348
- if (isFunction(info.onOK))
349
- info.onOK();
350
- } }));
351
- }, 1);
352
- }, useEffectOnlyOnMount);
353
- const confirmEX = useCallback((message, onOK, onCancel) => {
354
- return new Promise(resolve => {
355
- promptEX({
356
- children: isString(message) ? _jsx(Label, { children: message }) : message,
357
- onCancel: () => {
358
- if (isFunction(onCancel))
359
- onCancel();
360
- resolve(false);
361
- },
362
- onOK: () => {
363
- if (isFunction(onOK))
364
- onOK();
365
- resolve(true);
366
- }
367
- });
368
- });
369
- }, useEffectOnlyOnMount);
370
- const alertEX = useCallback((message, onOK) => {
371
- return new Promise(resolve => {
372
- promptEX({
373
- children: isString(message) ? _jsx(Label, { children: message }) : message,
374
- hideCancel: true,
375
- onOK: () => {
376
- if (isFunction(onOK))
377
- onOK();
378
- resolve();
379
- }
380
- });
381
- });
382
- }, useEffectOnlyOnMount);
383
- return {
384
- promptEX, confirmEX, alertEX,
385
- alertPrompt: _prompt ? _jsx(Prompter, Object.assign({}, _prompt)) : undefined,
386
- close: () => _setPrompt(null)
387
- };
388
- }
389
80
  //# sourceMappingURL=hooks.js.map