@vuu-ui/vuu-utils 2.0.0 → 2.1.0-alpha.10

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 (182) hide show
  1. package/cjs/node_modules/@dnd-kit/react/hooks.js +3 -3
  2. package/cjs/node_modules/@floating-ui/dom/dist/floating-ui.dom.js +492 -0
  3. package/cjs/node_modules/@floating-ui/dom/dist/floating-ui.dom.js.map +1 -0
  4. package/cjs/node_modules/@floating-ui/react/dist/floating-ui.react.js +987 -0
  5. package/cjs/node_modules/@floating-ui/react/dist/floating-ui.react.js.map +1 -0
  6. package/cjs/node_modules/@floating-ui/react/dist/floating-ui.react.utils.js +130 -0
  7. package/cjs/node_modules/@floating-ui/react/dist/floating-ui.react.utils.js.map +1 -0
  8. package/cjs/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js +183 -0
  9. package/cjs/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js.map +1 -0
  10. package/cjs/node_modules/@floating-ui/utils/dist/floating-ui.utils.js +39 -0
  11. package/cjs/node_modules/@floating-ui/utils/dist/floating-ui.utils.js.map +1 -0
  12. package/cjs/node_modules/@salt-ds/core/dist-es/aria-announcer/AriaAnnouncerContext.js +10 -0
  13. package/cjs/node_modules/@salt-ds/core/dist-es/aria-announcer/AriaAnnouncerContext.js.map +1 -0
  14. package/cjs/node_modules/@salt-ds/core/dist-es/aria-announcer/AriaAnnouncerProvider.js +76 -0
  15. package/cjs/node_modules/@salt-ds/core/dist-es/aria-announcer/AriaAnnouncerProvider.js.map +1 -0
  16. package/cjs/node_modules/@salt-ds/core/dist-es/aria-announcer/useAriaAnnouncer.js +52 -0
  17. package/cjs/node_modules/@salt-ds/core/dist-es/aria-announcer/useAriaAnnouncer.js.map +1 -0
  18. package/cjs/node_modules/@salt-ds/core/dist-es/breakpoints/BreakpointProvider.js +59 -0
  19. package/cjs/node_modules/@salt-ds/core/dist-es/breakpoints/BreakpointProvider.js.map +1 -0
  20. package/cjs/node_modules/@salt-ds/core/dist-es/breakpoints/Breakpoints.js +12 -0
  21. package/cjs/node_modules/@salt-ds/core/dist-es/breakpoints/Breakpoints.js.map +1 -0
  22. package/cjs/node_modules/@salt-ds/core/dist-es/button/Button.css.js +6 -0
  23. package/cjs/node_modules/@salt-ds/core/dist-es/button/Button.css.js.map +1 -0
  24. package/cjs/node_modules/@salt-ds/core/dist-es/button/Button.js +96 -0
  25. package/cjs/node_modules/@salt-ds/core/dist-es/button/Button.js.map +1 -0
  26. package/cjs/node_modules/@salt-ds/core/dist-es/button/useButton.js +65 -0
  27. package/cjs/node_modules/@salt-ds/core/dist-es/button/useButton.js.map +1 -0
  28. package/cjs/node_modules/@salt-ds/core/dist-es/salt-provider/ProviderContext.js +11 -0
  29. package/cjs/node_modules/@salt-ds/core/dist-es/salt-provider/ProviderContext.js.map +1 -0
  30. package/cjs/node_modules/@salt-ds/core/dist-es/salt-provider/SaltProvider.css.js +6 -0
  31. package/cjs/node_modules/@salt-ds/core/dist-es/salt-provider/SaltProvider.css.js.map +1 -0
  32. package/cjs/node_modules/@salt-ds/core/dist-es/salt-provider/SaltProvider.js +160 -0
  33. package/cjs/node_modules/@salt-ds/core/dist-es/salt-provider/SaltProvider.js.map +1 -0
  34. package/cjs/node_modules/@salt-ds/core/dist-es/salt-provider/ThemeApplicator.js +115 -0
  35. package/cjs/node_modules/@salt-ds/core/dist-es/salt-provider/ThemeApplicator.js.map +1 -0
  36. package/cjs/node_modules/@salt-ds/core/dist-es/spinner/Spinner.css.js +6 -0
  37. package/cjs/node_modules/@salt-ds/core/dist-es/spinner/Spinner.css.js.map +1 -0
  38. package/cjs/node_modules/@salt-ds/core/dist-es/spinner/Spinner.js +86 -0
  39. package/cjs/node_modules/@salt-ds/core/dist-es/spinner/Spinner.js.map +1 -0
  40. package/cjs/node_modules/@salt-ds/core/dist-es/spinner/svgSpinners/SpinnerSVG.js +93 -0
  41. package/cjs/node_modules/@salt-ds/core/dist-es/spinner/svgSpinners/SpinnerSVG.js.map +1 -0
  42. package/cjs/node_modules/@salt-ds/core/dist-es/utils/createChainedFunction.js +20 -0
  43. package/cjs/node_modules/@salt-ds/core/dist-es/utils/createChainedFunction.js.map +1 -0
  44. package/cjs/node_modules/@salt-ds/core/dist-es/utils/createContext.js +14 -0
  45. package/cjs/node_modules/@salt-ds/core/dist-es/utils/createContext.js.map +1 -0
  46. package/cjs/node_modules/@salt-ds/core/dist-es/utils/debounce.js +22 -0
  47. package/cjs/node_modules/@salt-ds/core/dist-es/utils/debounce.js.map +1 -0
  48. package/cjs/node_modules/@salt-ds/core/dist-es/utils/makePrefixer.js +6 -0
  49. package/cjs/node_modules/@salt-ds/core/dist-es/utils/makePrefixer.js.map +1 -0
  50. package/cjs/node_modules/@salt-ds/core/dist-es/utils/useFloatingUI/useFloatingUI.js +52 -0
  51. package/cjs/node_modules/@salt-ds/core/dist-es/utils/useFloatingUI/useFloatingUI.js.map +1 -0
  52. package/cjs/node_modules/@salt-ds/core/dist-es/utils/useId.js +45 -0
  53. package/cjs/node_modules/@salt-ds/core/dist-es/utils/useId.js.map +1 -0
  54. package/cjs/node_modules/@salt-ds/core/dist-es/utils/useIsomorphicLayoutEffect.js +8 -0
  55. package/cjs/node_modules/@salt-ds/core/dist-es/utils/useIsomorphicLayoutEffect.js.map +1 -0
  56. package/cjs/node_modules/@salt-ds/core/dist-es/utils/usePreventScroll.js +233 -0
  57. package/cjs/node_modules/@salt-ds/core/dist-es/utils/usePreventScroll.js.map +1 -0
  58. package/cjs/node_modules/@salt-ds/core/dist-es/viewport/ViewportProvider.js +35 -0
  59. package/cjs/node_modules/@salt-ds/core/dist-es/viewport/ViewportProvider.js.map +1 -0
  60. package/cjs/node_modules/@salt-ds/styles/dist-es/style-injection-provider/index.js +22 -0
  61. package/cjs/node_modules/@salt-ds/styles/dist-es/style-injection-provider/index.js.map +1 -0
  62. package/cjs/node_modules/@salt-ds/styles/dist-es/use-style-injection/InsertionPointProvider.js +16 -0
  63. package/cjs/node_modules/@salt-ds/styles/dist-es/use-style-injection/InsertionPointProvider.js.map +1 -0
  64. package/cjs/node_modules/@salt-ds/styles/dist-es/use-style-injection/useStyleInjection.js +75 -0
  65. package/cjs/node_modules/@salt-ds/styles/dist-es/use-style-injection/useStyleInjection.js.map +1 -0
  66. package/cjs/node_modules/@salt-ds/window/dist-es/WindowProvider.js +17 -0
  67. package/cjs/node_modules/@salt-ds/window/dist-es/WindowProvider.js.map +1 -0
  68. package/cjs/node_modules/tabbable/dist/index.esm.js +550 -0
  69. package/cjs/node_modules/tabbable/dist/index.esm.js.map +1 -0
  70. package/cjs/packages/vuu-utils/src/ThemeProvider.js +2 -2
  71. package/cjs/packages/vuu-utils/src/ThemeProvider.js.map +1 -1
  72. package/cjs/packages/vuu-utils/src/data-editing/DataEditingProvider.js +25 -0
  73. package/cjs/packages/vuu-utils/src/data-editing/DataEditingProvider.js.map +1 -0
  74. package/cjs/packages/vuu-utils/src/data-editing/EditButtons.js +31 -0
  75. package/cjs/packages/vuu-utils/src/data-editing/EditButtons.js.map +1 -0
  76. package/cjs/packages/vuu-utils/src/data-editing/EditTracker.js +157 -0
  77. package/cjs/packages/vuu-utils/src/data-editing/EditTracker.js.map +1 -0
  78. package/cjs/packages/vuu-utils/src/data-editing/useEditableTable.js +65 -0
  79. package/cjs/packages/vuu-utils/src/data-editing/useEditableTable.js.map +1 -0
  80. package/cjs/packages/vuu-utils/src/index.js +11 -0
  81. package/cjs/packages/vuu-utils/src/index.js.map +1 -1
  82. package/cjs/packages/vuu-utils/src/theme-utils.js +36 -0
  83. package/cjs/packages/vuu-utils/src/theme-utils.js.map +1 -0
  84. package/cjs/packages/vuu-utils/src/url-utils.js +2 -2
  85. package/cjs/packages/vuu-utils/src/url-utils.js.map +1 -1
  86. package/esm/node_modules/@floating-ui/dom/dist/floating-ui.dom.js +489 -0
  87. package/esm/node_modules/@floating-ui/dom/dist/floating-ui.dom.js.map +1 -0
  88. package/esm/node_modules/@floating-ui/react/dist/floating-ui.react.js +962 -0
  89. package/esm/node_modules/@floating-ui/react/dist/floating-ui.react.js.map +1 -0
  90. package/esm/node_modules/@floating-ui/react/dist/floating-ui.react.utils.js +114 -0
  91. package/esm/node_modules/@floating-ui/react/dist/floating-ui.react.utils.js.map +1 -0
  92. package/esm/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js +162 -0
  93. package/esm/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js.map +1 -0
  94. package/esm/node_modules/@floating-ui/utils/dist/floating-ui.utils.js +33 -0
  95. package/esm/node_modules/@floating-ui/utils/dist/floating-ui.utils.js.map +1 -0
  96. package/esm/node_modules/@salt-ds/core/dist-es/aria-announcer/AriaAnnouncerContext.js +8 -0
  97. package/esm/node_modules/@salt-ds/core/dist-es/aria-announcer/AriaAnnouncerContext.js.map +1 -0
  98. package/esm/node_modules/@salt-ds/core/dist-es/aria-announcer/AriaAnnouncerProvider.js +73 -0
  99. package/esm/node_modules/@salt-ds/core/dist-es/aria-announcer/AriaAnnouncerProvider.js.map +1 -0
  100. package/esm/node_modules/@salt-ds/core/dist-es/aria-announcer/useAriaAnnouncer.js +50 -0
  101. package/esm/node_modules/@salt-ds/core/dist-es/aria-announcer/useAriaAnnouncer.js.map +1 -0
  102. package/esm/node_modules/@salt-ds/core/dist-es/breakpoints/BreakpointProvider.js +56 -0
  103. package/esm/node_modules/@salt-ds/core/dist-es/breakpoints/BreakpointProvider.js.map +1 -0
  104. package/esm/node_modules/@salt-ds/core/dist-es/breakpoints/Breakpoints.js +10 -0
  105. package/esm/node_modules/@salt-ds/core/dist-es/breakpoints/Breakpoints.js.map +1 -0
  106. package/esm/node_modules/@salt-ds/core/dist-es/button/Button.css.js +4 -0
  107. package/esm/node_modules/@salt-ds/core/dist-es/button/Button.css.js.map +1 -0
  108. package/esm/node_modules/@salt-ds/core/dist-es/button/Button.js +94 -0
  109. package/esm/node_modules/@salt-ds/core/dist-es/button/Button.js.map +1 -0
  110. package/esm/node_modules/@salt-ds/core/dist-es/button/useButton.js +63 -0
  111. package/esm/node_modules/@salt-ds/core/dist-es/button/useButton.js.map +1 -0
  112. package/esm/node_modules/@salt-ds/core/dist-es/salt-provider/ProviderContext.js +9 -0
  113. package/esm/node_modules/@salt-ds/core/dist-es/salt-provider/ProviderContext.js.map +1 -0
  114. package/esm/node_modules/@salt-ds/core/dist-es/salt-provider/SaltProvider.css.js +4 -0
  115. package/esm/node_modules/@salt-ds/core/dist-es/salt-provider/SaltProvider.css.js.map +1 -0
  116. package/esm/node_modules/@salt-ds/core/dist-es/salt-provider/SaltProvider.js +151 -0
  117. package/esm/node_modules/@salt-ds/core/dist-es/salt-provider/SaltProvider.js.map +1 -0
  118. package/esm/node_modules/@salt-ds/core/dist-es/salt-provider/ThemeApplicator.js +113 -0
  119. package/esm/node_modules/@salt-ds/core/dist-es/salt-provider/ThemeApplicator.js.map +1 -0
  120. package/esm/node_modules/@salt-ds/core/dist-es/spinner/Spinner.css.js +4 -0
  121. package/esm/node_modules/@salt-ds/core/dist-es/spinner/Spinner.css.js.map +1 -0
  122. package/esm/node_modules/@salt-ds/core/dist-es/spinner/Spinner.js +84 -0
  123. package/esm/node_modules/@salt-ds/core/dist-es/spinner/Spinner.js.map +1 -0
  124. package/esm/node_modules/@salt-ds/core/dist-es/spinner/svgSpinners/SpinnerSVG.js +91 -0
  125. package/esm/node_modules/@salt-ds/core/dist-es/spinner/svgSpinners/SpinnerSVG.js.map +1 -0
  126. package/esm/node_modules/@salt-ds/core/dist-es/utils/createChainedFunction.js +18 -0
  127. package/esm/node_modules/@salt-ds/core/dist-es/utils/createChainedFunction.js.map +1 -0
  128. package/esm/node_modules/@salt-ds/core/dist-es/utils/createContext.js +12 -0
  129. package/esm/node_modules/@salt-ds/core/dist-es/utils/createContext.js.map +1 -0
  130. package/esm/node_modules/@salt-ds/core/dist-es/utils/debounce.js +20 -0
  131. package/esm/node_modules/@salt-ds/core/dist-es/utils/debounce.js.map +1 -0
  132. package/esm/node_modules/@salt-ds/core/dist-es/utils/makePrefixer.js +4 -0
  133. package/esm/node_modules/@salt-ds/core/dist-es/utils/makePrefixer.js.map +1 -0
  134. package/esm/node_modules/@salt-ds/core/dist-es/utils/useFloatingUI/useFloatingUI.js +50 -0
  135. package/esm/node_modules/@salt-ds/core/dist-es/utils/useFloatingUI/useFloatingUI.js.map +1 -0
  136. package/esm/node_modules/@salt-ds/core/dist-es/utils/useId.js +24 -0
  137. package/esm/node_modules/@salt-ds/core/dist-es/utils/useId.js.map +1 -0
  138. package/esm/node_modules/@salt-ds/core/dist-es/utils/useIsomorphicLayoutEffect.js +6 -0
  139. package/esm/node_modules/@salt-ds/core/dist-es/utils/useIsomorphicLayoutEffect.js.map +1 -0
  140. package/esm/node_modules/@salt-ds/core/dist-es/utils/usePreventScroll.js +231 -0
  141. package/esm/node_modules/@salt-ds/core/dist-es/utils/usePreventScroll.js.map +1 -0
  142. package/esm/node_modules/@salt-ds/core/dist-es/viewport/ViewportProvider.js +32 -0
  143. package/esm/node_modules/@salt-ds/core/dist-es/viewport/ViewportProvider.js.map +1 -0
  144. package/esm/node_modules/@salt-ds/styles/dist-es/style-injection-provider/index.js +19 -0
  145. package/esm/node_modules/@salt-ds/styles/dist-es/style-injection-provider/index.js.map +1 -0
  146. package/esm/node_modules/@salt-ds/styles/dist-es/use-style-injection/InsertionPointProvider.js +14 -0
  147. package/esm/node_modules/@salt-ds/styles/dist-es/use-style-injection/InsertionPointProvider.js.map +1 -0
  148. package/esm/node_modules/@salt-ds/styles/dist-es/use-style-injection/useStyleInjection.js +54 -0
  149. package/esm/node_modules/@salt-ds/styles/dist-es/use-style-injection/useStyleInjection.js.map +1 -0
  150. package/esm/node_modules/@salt-ds/window/dist-es/WindowProvider.js +15 -0
  151. package/esm/node_modules/@salt-ds/window/dist-es/WindowProvider.js.map +1 -0
  152. package/esm/node_modules/tabbable/dist/index.esm.js +546 -0
  153. package/esm/node_modules/tabbable/dist/index.esm.js.map +1 -0
  154. package/esm/packages/vuu-utils/src/ThemeProvider.js +2 -2
  155. package/esm/packages/vuu-utils/src/ThemeProvider.js.map +1 -1
  156. package/esm/packages/vuu-utils/src/context-definitions/WorkspaceContext.js +2 -2
  157. package/esm/packages/vuu-utils/src/context-definitions/WorkspaceContext.js.map +1 -1
  158. package/esm/packages/vuu-utils/src/data-editing/DataEditingProvider.js +22 -0
  159. package/esm/packages/vuu-utils/src/data-editing/DataEditingProvider.js.map +1 -0
  160. package/esm/packages/vuu-utils/src/data-editing/EditButtons.js +29 -0
  161. package/esm/packages/vuu-utils/src/data-editing/EditButtons.js.map +1 -0
  162. package/esm/packages/vuu-utils/src/data-editing/EditTracker.js +155 -0
  163. package/esm/packages/vuu-utils/src/data-editing/EditTracker.js.map +1 -0
  164. package/esm/packages/vuu-utils/src/data-editing/useEditableTable.js +63 -0
  165. package/esm/packages/vuu-utils/src/data-editing/useEditableTable.js.map +1 -0
  166. package/esm/packages/vuu-utils/src/feature-utils.js +2 -2
  167. package/esm/packages/vuu-utils/src/feature-utils.js.map +1 -1
  168. package/esm/packages/vuu-utils/src/index.js +5 -0
  169. package/esm/packages/vuu-utils/src/index.js.map +1 -1
  170. package/esm/packages/vuu-utils/src/theme-utils.js +34 -0
  171. package/esm/packages/vuu-utils/src/theme-utils.js.map +1 -0
  172. package/esm/packages/vuu-utils/src/url-utils.js +2 -2
  173. package/esm/packages/vuu-utils/src/url-utils.js.map +1 -1
  174. package/package.json +6 -6
  175. package/types/data-editing/DataEditingProvider.d.ts +7 -0
  176. package/types/data-editing/EditButtons.d.ts +7 -0
  177. package/types/data-editing/EditModeProvider.d.ts +13 -0
  178. package/types/data-editing/EditTracker.d.ts +24 -0
  179. package/types/data-editing/useEditableTable.d.ts +26 -0
  180. package/types/index.d.ts +6 -1
  181. package/types/theme-utils.d.ts +14 -0
  182. package/types/url-utils.d.ts +2 -1
@@ -2,7 +2,7 @@
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  var React = require('react');
5
- var cx = require('clsx');
5
+ var clsx = require('clsx');
6
6
 
7
7
  const DEFAULT_DENSITY = "medium";
8
8
  const DEFAULT_THEME = "salt-theme";
@@ -37,7 +37,7 @@ const useThemeAttributes = (themeAttributes) => {
37
37
  const createThemedChildren = (children, theme, themeMode, density) => {
38
38
  if (React.isValidElement(children)) {
39
39
  return React.cloneElement(children, {
40
- className: cx(
40
+ className: clsx(
41
41
  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
42
42
  children.props?.className,
43
43
  `${theme}-theme`,
@@ -1 +1 @@
1
- {"version":3,"file":"ThemeProvider.js","sources":["../../../../../../packages/vuu-utils/src/ThemeProvider.tsx"],"sourcesContent":["import React, {\n createContext,\n HTMLAttributes,\n ReactNode,\n isValidElement,\n cloneElement,\n useContext,\n} from \"react\";\nimport cx from \"clsx\";\n\nexport const DEFAULT_DENSITY: Density = \"medium\";\nexport const DEFAULT_THEME = \"salt-theme\";\nexport const DEFAULT_THEME_MODE: ThemeMode = \"light\";\n\nexport type Density = \"high\" | \"medium\" | \"low\" | \"touch\";\nexport type ThemeMode = \"light\" | \"dark\";\nexport type TargetElement = \"root\" | \"scope\" | \"child\";\n\nexport interface ThemeContextProps {\n density: Density;\n theme: string;\n themeMode: ThemeMode;\n}\n\nexport const ThemeContext = createContext<ThemeContextProps>({\n density: \"high\",\n theme: \"vuu\",\n themeMode: \"light\",\n});\n\nexport type ThemeClasses = [string, string, ThemeMode];\n\nconst DEFAULT_THEME_ATTRIBUTES: ThemeClasses = [\n \"vuu\",\n \"salt-density-high\",\n \"light\" as ThemeMode,\n];\n\nexport type ThemeAttributes = {\n themeClass: string;\n densityClass: string;\n dataMode: ThemeMode;\n};\n\nexport const useThemeAttributes = (\n themeAttributes?: ThemeAttributes\n): [string, string, ThemeMode] => {\n const context = useContext(ThemeContext);\n if (themeAttributes) {\n return [\n themeAttributes.themeClass,\n themeAttributes.densityClass,\n themeAttributes.dataMode,\n ];\n } else if (context) {\n return [\n `${context.theme}-theme`,\n `salt-density-${context.density}`,\n context.themeMode,\n ];\n }\n return DEFAULT_THEME_ATTRIBUTES;\n};\n\nconst createThemedChildren = (\n children: ReactNode,\n theme: string,\n themeMode: ThemeMode,\n density: Density\n) => {\n if (isValidElement<HTMLAttributes<HTMLElement>>(children)) {\n return cloneElement(children, {\n className: cx(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n children.props?.className,\n `${theme}-theme`,\n `salt-density-${density}`\n ),\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n \"data-mode\": themeMode,\n });\n } else {\n console.warn(\n `\\nThemeProvider can only apply CSS classes for theming to a single nested child element of the ThemeProvider.\n Wrap elements with a single container`\n );\n return children;\n }\n};\n\ninterface ThemeProviderProps {\n applyThemeClasses?: boolean;\n children: ReactNode;\n density?: Density;\n theme?: string;\n themeMode?: ThemeMode;\n}\n\nexport const ThemeProvider = ({\n applyThemeClasses = false,\n children,\n theme: themeProp,\n themeMode: themeModeProp,\n density: densityProp,\n}: ThemeProviderProps) => {\n const {\n density: inheritedDensity,\n themeMode: inheritedThemeMode,\n theme: inheritedTheme,\n } = useContext(ThemeContext);\n const density = densityProp ?? inheritedDensity ?? DEFAULT_DENSITY;\n const themeMode = themeModeProp ?? inheritedThemeMode ?? DEFAULT_THEME_MODE;\n const theme = themeProp ?? inheritedTheme ?? DEFAULT_THEME;\n const themedChildren = applyThemeClasses\n ? createThemedChildren(children, theme, themeMode, density)\n : children;\n\n return (\n <ThemeContext.Provider value={{ themeMode, density, theme }}>\n {themedChildren}\n </ThemeContext.Provider>\n );\n};\n\nThemeProvider.displayName = \"ThemeProvider\";\n"],"names":["createContext","useContext","isValidElement","cloneElement","jsx"],"mappings":";;;;;;AAUO,MAAM,eAA2B,GAAA;AACjC,MAAM,aAAgB,GAAA;AACtB,MAAM,kBAAgC,GAAA;AAYtC,MAAM,eAAeA,mBAAiC,CAAA;AAAA,EAC3D,OAAS,EAAA,MAAA;AAAA,EACT,KAAO,EAAA,KAAA;AAAA,EACP,SAAW,EAAA;AACb,CAAC;AAID,MAAM,wBAAyC,GAAA;AAAA,EAC7C,KAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF,CAAA;AAQa,MAAA,kBAAA,GAAqB,CAChC,eACgC,KAAA;AAChC,EAAM,MAAA,OAAA,GAAUC,iBAAW,YAAY,CAAA;AACvC,EAAA,IAAI,eAAiB,EAAA;AACnB,IAAO,OAAA;AAAA,MACL,eAAgB,CAAA,UAAA;AAAA,MAChB,eAAgB,CAAA,YAAA;AAAA,MAChB,eAAgB,CAAA;AAAA,KAClB;AAAA,aACS,OAAS,EAAA;AAClB,IAAO,OAAA;AAAA,MACL,CAAA,EAAG,QAAQ,KAAK,CAAA,MAAA,CAAA;AAAA,MAChB,CAAA,aAAA,EAAgB,QAAQ,OAAO,CAAA,CAAA;AAAA,MAC/B,OAAQ,CAAA;AAAA,KACV;AAAA;AAEF,EAAO,OAAA,wBAAA;AACT;AAEA,MAAM,oBAAuB,GAAA,CAC3B,QACA,EAAA,KAAA,EACA,WACA,OACG,KAAA;AACH,EAAI,IAAAC,oBAAA,CAA4C,QAAQ,CAAG,EAAA;AACzD,IAAA,OAAOC,mBAAa,QAAU,EAAA;AAAA,MAC5B,SAAW,EAAA,EAAA;AAAA;AAAA,QAET,SAAS,KAAO,EAAA,SAAA;AAAA,QAChB,GAAG,KAAK,CAAA,MAAA,CAAA;AAAA,QACR,gBAAgB,OAAO,CAAA;AAAA,OACzB;AAAA;AAAA;AAAA,MAGA,WAAa,EAAA;AAAA,KACd,CAAA;AAAA,GACI,MAAA;AACL,IAAQ,OAAA,CAAA,IAAA;AAAA,MACN;AAAA;AAAA,iDAAA;AAAA,KAEF;AACA,IAAO,OAAA,QAAA;AAAA;AAEX,CAAA;AAUO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,iBAAoB,GAAA,KAAA;AAAA,EACpB,QAAA;AAAA,EACA,KAAO,EAAA,SAAA;AAAA,EACP,SAAW,EAAA,aAAA;AAAA,EACX,OAAS,EAAA;AACX,CAA0B,KAAA;AACxB,EAAM,MAAA;AAAA,IACJ,OAAS,EAAA,gBAAA;AAAA,IACT,SAAW,EAAA,kBAAA;AAAA,IACX,KAAO,EAAA;AAAA,GACT,GAAIF,iBAAW,YAAY,CAAA;AAC3B,EAAM,MAAA,OAAA,GAAU,eAAe,gBAAoB,IAAA,eAAA;AACnD,EAAM,MAAA,SAAA,GAAY,iBAAiB,kBAAsB,IAAA,kBAAA;AACzD,EAAM,MAAA,KAAA,GAAQ,aAAa,cAAkB,IAAA,aAAA;AAC7C,EAAA,MAAM,iBAAiB,iBACnB,GAAA,oBAAA,CAAqB,UAAU,KAAO,EAAA,SAAA,EAAW,OAAO,CACxD,GAAA,QAAA;AAEJ,EACE,uBAAAG,cAAA,CAAC,YAAa,CAAA,QAAA,EAAb,EAAsB,KAAA,EAAO,EAAE,SAAW,EAAA,OAAA,EAAS,KAAM,EAAA,EACvD,QACH,EAAA,cAAA,EAAA,CAAA;AAEJ;AAEA,aAAA,CAAc,WAAc,GAAA,eAAA;;;;;;;;;"}
1
+ {"version":3,"file":"ThemeProvider.js","sources":["../../../../../../packages/vuu-utils/src/ThemeProvider.tsx"],"sourcesContent":["import React, {\n createContext,\n HTMLAttributes,\n ReactNode,\n isValidElement,\n cloneElement,\n useContext,\n} from \"react\";\nimport cx from \"clsx\";\n\nexport const DEFAULT_DENSITY: Density = \"medium\";\nexport const DEFAULT_THEME = \"salt-theme\";\nexport const DEFAULT_THEME_MODE: ThemeMode = \"light\";\n\nexport type Density = \"high\" | \"medium\" | \"low\" | \"touch\";\nexport type ThemeMode = \"light\" | \"dark\";\nexport type TargetElement = \"root\" | \"scope\" | \"child\";\n\nexport interface ThemeContextProps {\n density: Density;\n theme: string;\n themeMode: ThemeMode;\n}\n\nexport const ThemeContext = createContext<ThemeContextProps>({\n density: \"high\",\n theme: \"vuu\",\n themeMode: \"light\",\n});\n\nexport type ThemeClasses = [string, string, ThemeMode];\n\nconst DEFAULT_THEME_ATTRIBUTES: ThemeClasses = [\n \"vuu\",\n \"salt-density-high\",\n \"light\" as ThemeMode,\n];\n\nexport type ThemeAttributes = {\n themeClass: string;\n densityClass: string;\n dataMode: ThemeMode;\n};\n\nexport const useThemeAttributes = (\n themeAttributes?: ThemeAttributes\n): [string, string, ThemeMode] => {\n const context = useContext(ThemeContext);\n if (themeAttributes) {\n return [\n themeAttributes.themeClass,\n themeAttributes.densityClass,\n themeAttributes.dataMode,\n ];\n } else if (context) {\n return [\n `${context.theme}-theme`,\n `salt-density-${context.density}`,\n context.themeMode,\n ];\n }\n return DEFAULT_THEME_ATTRIBUTES;\n};\n\nconst createThemedChildren = (\n children: ReactNode,\n theme: string,\n themeMode: ThemeMode,\n density: Density\n) => {\n if (isValidElement<HTMLAttributes<HTMLElement>>(children)) {\n return cloneElement(children, {\n className: cx(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n children.props?.className,\n `${theme}-theme`,\n `salt-density-${density}`\n ),\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n \"data-mode\": themeMode,\n });\n } else {\n console.warn(\n `\\nThemeProvider can only apply CSS classes for theming to a single nested child element of the ThemeProvider.\n Wrap elements with a single container`\n );\n return children;\n }\n};\n\ninterface ThemeProviderProps {\n applyThemeClasses?: boolean;\n children: ReactNode;\n density?: Density;\n theme?: string;\n themeMode?: ThemeMode;\n}\n\nexport const ThemeProvider = ({\n applyThemeClasses = false,\n children,\n theme: themeProp,\n themeMode: themeModeProp,\n density: densityProp,\n}: ThemeProviderProps) => {\n const {\n density: inheritedDensity,\n themeMode: inheritedThemeMode,\n theme: inheritedTheme,\n } = useContext(ThemeContext);\n const density = densityProp ?? inheritedDensity ?? DEFAULT_DENSITY;\n const themeMode = themeModeProp ?? inheritedThemeMode ?? DEFAULT_THEME_MODE;\n const theme = themeProp ?? inheritedTheme ?? DEFAULT_THEME;\n const themedChildren = applyThemeClasses\n ? createThemedChildren(children, theme, themeMode, density)\n : children;\n\n return (\n <ThemeContext.Provider value={{ themeMode, density, theme }}>\n {themedChildren}\n </ThemeContext.Provider>\n );\n};\n\nThemeProvider.displayName = \"ThemeProvider\";\n"],"names":["createContext","useContext","isValidElement","cloneElement","cx","jsx"],"mappings":";;;;;;AAUO,MAAM,eAA2B,GAAA;AACjC,MAAM,aAAgB,GAAA;AACtB,MAAM,kBAAgC,GAAA;AAYtC,MAAM,eAAeA,mBAAiC,CAAA;AAAA,EAC3D,OAAS,EAAA,MAAA;AAAA,EACT,KAAO,EAAA,KAAA;AAAA,EACP,SAAW,EAAA;AACb,CAAC;AAID,MAAM,wBAAyC,GAAA;AAAA,EAC7C,KAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF,CAAA;AAQa,MAAA,kBAAA,GAAqB,CAChC,eACgC,KAAA;AAChC,EAAM,MAAA,OAAA,GAAUC,iBAAW,YAAY,CAAA;AACvC,EAAA,IAAI,eAAiB,EAAA;AACnB,IAAO,OAAA;AAAA,MACL,eAAgB,CAAA,UAAA;AAAA,MAChB,eAAgB,CAAA,YAAA;AAAA,MAChB,eAAgB,CAAA;AAAA,KAClB;AAAA,aACS,OAAS,EAAA;AAClB,IAAO,OAAA;AAAA,MACL,CAAA,EAAG,QAAQ,KAAK,CAAA,MAAA,CAAA;AAAA,MAChB,CAAA,aAAA,EAAgB,QAAQ,OAAO,CAAA,CAAA;AAAA,MAC/B,OAAQ,CAAA;AAAA,KACV;AAAA;AAEF,EAAO,OAAA,wBAAA;AACT;AAEA,MAAM,oBAAuB,GAAA,CAC3B,QACA,EAAA,KAAA,EACA,WACA,OACG,KAAA;AACH,EAAI,IAAAC,oBAAA,CAA4C,QAAQ,CAAG,EAAA;AACzD,IAAA,OAAOC,mBAAa,QAAU,EAAA;AAAA,MAC5B,SAAW,EAAAC,IAAA;AAAA;AAAA,QAET,SAAS,KAAO,EAAA,SAAA;AAAA,QAChB,GAAG,KAAK,CAAA,MAAA,CAAA;AAAA,QACR,gBAAgB,OAAO,CAAA;AAAA,OACzB;AAAA;AAAA;AAAA,MAGA,WAAa,EAAA;AAAA,KACd,CAAA;AAAA,GACI,MAAA;AACL,IAAQ,OAAA,CAAA,IAAA;AAAA,MACN;AAAA;AAAA,iDAAA;AAAA,KAEF;AACA,IAAO,OAAA,QAAA;AAAA;AAEX,CAAA;AAUO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,iBAAoB,GAAA,KAAA;AAAA,EACpB,QAAA;AAAA,EACA,KAAO,EAAA,SAAA;AAAA,EACP,SAAW,EAAA,aAAA;AAAA,EACX,OAAS,EAAA;AACX,CAA0B,KAAA;AACxB,EAAM,MAAA;AAAA,IACJ,OAAS,EAAA,gBAAA;AAAA,IACT,SAAW,EAAA,kBAAA;AAAA,IACX,KAAO,EAAA;AAAA,GACT,GAAIH,iBAAW,YAAY,CAAA;AAC3B,EAAM,MAAA,OAAA,GAAU,eAAe,gBAAoB,IAAA,eAAA;AACnD,EAAM,MAAA,SAAA,GAAY,iBAAiB,kBAAsB,IAAA,kBAAA;AACzD,EAAM,MAAA,KAAA,GAAQ,aAAa,cAAkB,IAAA,aAAA;AAC7C,EAAA,MAAM,iBAAiB,iBACnB,GAAA,oBAAA,CAAqB,UAAU,KAAO,EAAA,SAAA,EAAW,OAAO,CACxD,GAAA,QAAA;AAEJ,EACE,uBAAAI,cAAA,CAAC,YAAa,CAAA,QAAA,EAAb,EAAsB,KAAA,EAAO,EAAE,SAAW,EAAA,OAAA,EAAS,KAAM,EAAA,EACvD,QACH,EAAA,cAAA,EAAA,CAAA;AAEJ;AAEA,aAAA,CAAc,WAAc,GAAA,eAAA;;;;;;;;;"}
@@ -0,0 +1,25 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+
6
+ const DataEditingContext = React.createContext(void 0);
7
+ const DataEditingProvider = ({
8
+ children,
9
+ editTracker
10
+ }) => {
11
+ return /* @__PURE__ */ jsxRuntime.jsx(DataEditingContext.Provider, { value: editTracker, children });
12
+ };
13
+ const useEditTracker = () => {
14
+ const editTracker = React.useContext(DataEditingContext);
15
+ if (editTracker === void 0) {
16
+ console.warn(
17
+ "[useEditTracker] no DataEditingContext in scope. You need to enclose editable component(s) with DataEditingProvider"
18
+ );
19
+ }
20
+ return editTracker;
21
+ };
22
+
23
+ exports.DataEditingProvider = DataEditingProvider;
24
+ exports.useEditTracker = useEditTracker;
25
+ //# sourceMappingURL=DataEditingProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataEditingProvider.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/DataEditingProvider.tsx"],"sourcesContent":["import { createContext, ReactNode, useContext } from \"react\";\nimport { EditTracker } from \"./EditTracker\";\n\nconst DataEditingContext = createContext<EditTracker | undefined>(undefined);\n\nexport const DataEditingProvider = ({\n children,\n editTracker,\n}: {\n children: ReactNode;\n editTracker: EditTracker;\n}) => {\n return (\n <DataEditingContext.Provider value={editTracker}>\n {children}\n </DataEditingContext.Provider>\n );\n};\n\nexport const useEditTracker = () => {\n const editTracker = useContext(DataEditingContext);\n if (editTracker === undefined) {\n console.warn(\n \"[useEditTracker] no DataEditingContext in scope. You need to enclose editable component(s) with DataEditingProvider\",\n );\n }\n return editTracker;\n};\n"],"names":["createContext","useContext"],"mappings":";;;;;AAGA,MAAM,kBAAA,GAAqBA,oBAAuC,KAAS,CAAA,CAAA;AAEpE,MAAM,sBAAsB,CAAC;AAAA,EAClC,QAAA;AAAA,EACA;AACF,CAGM,KAAA;AACJ,EAAA,sCACG,kBAAmB,CAAA,QAAA,EAAnB,EAA4B,KAAA,EAAO,aACjC,QACH,EAAA,CAAA;AAEJ;AAEO,MAAM,iBAAiB,MAAM;AAClC,EAAM,MAAA,WAAA,GAAcC,iBAAW,kBAAkB,CAAA;AACjD,EAAA,IAAI,gBAAgB,KAAW,CAAA,EAAA;AAC7B,IAAQ,OAAA,CAAA,IAAA;AAAA,MACN;AAAA,KACF;AAAA;AAEF,EAAO,OAAA,WAAA;AACT;;;;;"}
@@ -0,0 +1,31 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var Button = require('../../../../node_modules/@salt-ds/core/dist-es/button/Button.js');
6
+
7
+ const EditButtons = ({
8
+ editTracker,
9
+ onCancel,
10
+ onSave
11
+ }) => {
12
+ const [editState, setEditState] = React.useState("clean");
13
+ React.useMemo(() => {
14
+ editTracker?.on("editState", setEditState);
15
+ }, [editTracker]);
16
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
17
+ /* @__PURE__ */ jsxRuntime.jsx(
18
+ Button.Button,
19
+ {
20
+ disabled: editState === "clean",
21
+ onClick: onSave,
22
+ sentiment: "accented",
23
+ children: "Save"
24
+ }
25
+ ),
26
+ /* @__PURE__ */ jsxRuntime.jsx(Button.Button, { onClick: onCancel, children: "Cancel" })
27
+ ] });
28
+ };
29
+
30
+ exports.EditButtons = EditButtons;
31
+ //# sourceMappingURL=EditButtons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditButtons.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/EditButtons.tsx"],"sourcesContent":["import { Button } from \"@salt-ds/core\";\nimport { EditState, EditTracker } from \"./EditTracker\";\nimport { useMemo, useState } from \"react\";\n\nexport interface EditButtonProps {\n editTracker?: EditTracker;\n onCancel: () => void;\n onSave: () => void;\n}\n\nexport const EditButtons = ({\n editTracker,\n onCancel,\n onSave,\n}: EditButtonProps) => {\n const [editState, setEditState] = useState<EditState>(\"clean\");\n\n useMemo(() => {\n editTracker?.on(\"editState\", setEditState);\n }, [editTracker]);\n\n return (\n <>\n <Button\n disabled={editState === \"clean\"}\n onClick={onSave}\n sentiment=\"accented\"\n >\n Save\n </Button>\n <Button onClick={onCancel}>Cancel</Button>\n </>\n );\n};\n"],"names":["useState","useMemo","jsxs","Fragment","jsx","Button"],"mappings":";;;;;;AAUO,MAAM,cAAc,CAAC;AAAA,EAC1B,WAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAuB,KAAA;AACrB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAoB,OAAO,CAAA;AAE7D,EAAAC,aAAA,CAAQ,MAAM;AACZ,IAAa,WAAA,EAAA,EAAA,CAAG,aAAa,YAAY,CAAA;AAAA,GAC3C,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,uBAEIC,eAAA,CAAAC,mBAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAAC,cAAA;AAAA,MAACC,aAAA;AAAA,MAAA;AAAA,QACC,UAAU,SAAc,KAAA,OAAA;AAAA,QACxB,OAAS,EAAA,MAAA;AAAA,QACT,SAAU,EAAA,UAAA;AAAA,QACX,QAAA,EAAA;AAAA;AAAA,KAED;AAAA,oBACCD,cAAA,CAAAC,aAAA,EAAA,EAAO,OAAS,EAAA,QAAA,EAAU,QAAM,EAAA,QAAA,EAAA;AAAA,GACnC,EAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,157 @@
1
+ 'use strict';
2
+
3
+ var eventEmitter = require('../event-emitter.js');
4
+ var protocolMessageUtils = require('../protocol-message-utils.js');
5
+
6
+ var __typeError = (msg) => {
7
+ throw TypeError(msg);
8
+ };
9
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
10
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
11
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
12
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
13
+ var _active, _rowEdits, _editCount, _dataSource, _inEditMode;
14
+ class EditTracker extends eventEmitter.EventEmitter {
15
+ constructor() {
16
+ super(...arguments);
17
+ __privateAdd(this, _active, false);
18
+ /**
19
+ * Row key => row edits
20
+ */
21
+ __privateAdd(this, _rowEdits, /* @__PURE__ */ new Map());
22
+ __privateAdd(this, _editCount, 0);
23
+ __privateAdd(this, _dataSource);
24
+ __privateAdd(this, _inEditMode, false);
25
+ }
26
+ get active() {
27
+ return __privateGet(this, _active);
28
+ }
29
+ set active(isActive) {
30
+ __privateSet(this, _active, isActive);
31
+ }
32
+ get editCount() {
33
+ return __privateGet(this, _editCount);
34
+ }
35
+ set editCount(val) {
36
+ if (val !== __privateGet(this, _editCount)) {
37
+ const oldCount = __privateGet(this, _editCount);
38
+ __privateSet(this, _editCount, val);
39
+ if (val === 0) {
40
+ this.emit("editState", "clean");
41
+ } else if (oldCount === 0) {
42
+ this.emit("editState", "dirty");
43
+ }
44
+ }
45
+ }
46
+ set dataSource(ds) {
47
+ __privateSet(this, _dataSource, ds);
48
+ }
49
+ clear() {
50
+ __privateGet(this, _rowEdits).clear();
51
+ __privateSet(this, _editCount, 0);
52
+ }
53
+ async enterEditMode() {
54
+ __privateSet(this, _inEditMode, true);
55
+ const rpcResponse = await __privateGet(this, _dataSource)?.rpcRequest?.({
56
+ type: "RPC_REQUEST",
57
+ rpcName: "ENTER_EDIT_MODE",
58
+ params: {}
59
+ });
60
+ if (protocolMessageUtils.isRpcSuccess(rpcResponse)) {
61
+ const { table: sessionTable } = rpcResponse.data;
62
+ return sessionTable;
63
+ } else {
64
+ console.log("fail");
65
+ }
66
+ }
67
+ get inEditMode() {
68
+ return __privateGet(this, _inEditMode);
69
+ }
70
+ get editState() {
71
+ return this.editCount === 0 ? "clean" : "dirty";
72
+ }
73
+ async cancelChanges() {
74
+ const rpcResponse = await __privateGet(this, _dataSource)?.rpcRequest?.({
75
+ type: "RPC_REQUEST",
76
+ rpcName: "EXIT_EDIT_MODE",
77
+ params: {}
78
+ });
79
+ this.clear();
80
+ return rpcResponse;
81
+ }
82
+ async saveChanges() {
83
+ const rpcResponse = await __privateGet(this, _dataSource)?.rpcRequest?.({
84
+ type: "RPC_REQUEST",
85
+ rpcName: "EXIT_EDIT_MODE",
86
+ params: { save: true }
87
+ });
88
+ this.clear();
89
+ return rpcResponse;
90
+ }
91
+ // TODO how do we deal with the '_edited' pattern
92
+ edit(key, columnName, originalValue, newValue) {
93
+ const rowEditDetails = __privateGet(this, _rowEdits).get(key);
94
+ if (rowEditDetails) {
95
+ const { cellEdits } = rowEditDetails;
96
+ const cellEdit = cellEdits.get(columnName);
97
+ if (cellEdit) {
98
+ if (newValue === cellEdit.originalValue) {
99
+ if (cellEdits.size === 1) {
100
+ __privateGet(this, _rowEdits).delete(key);
101
+ } else {
102
+ cellEdits.delete(columnName);
103
+ }
104
+ this.editCount = __privateGet(this, _editCount) - 1;
105
+ } else {
106
+ cellEdit.editedValue = newValue;
107
+ }
108
+ } else {
109
+ cellEdits.set(columnName, {
110
+ originalValue,
111
+ editedValue: newValue
112
+ });
113
+ this.editCount = __privateGet(this, _editCount) + 1;
114
+ }
115
+ } else {
116
+ __privateGet(this, _rowEdits).set(key, {
117
+ cellEdits: /* @__PURE__ */ new Map([
118
+ [columnName, { originalValue, editedValue: newValue }]
119
+ ])
120
+ });
121
+ this.editCount = __privateGet(this, _editCount) + 1;
122
+ }
123
+ }
124
+ //TODO alow a shortcut commit that allows a value, bypassing need
125
+ // for edit. Thids caters for boolean values, dropdown list etc
126
+ // that have no intermediate edit phase
127
+ async commit(key, columnName) {
128
+ const rowEditDetails = __privateGet(this, _rowEdits).get(key);
129
+ if (rowEditDetails) {
130
+ const { cellEdits } = rowEditDetails;
131
+ const cellEditValues = cellEdits.get(columnName);
132
+ if (cellEditValues) {
133
+ const { editedValue } = cellEditValues;
134
+ const rpcResponse = await __privateGet(this, _dataSource)?.rpcRequest?.({
135
+ type: "RPC_REQUEST",
136
+ rpcName: "editCell",
137
+ params: {
138
+ column: columnName,
139
+ data: editedValue,
140
+ key
141
+ }
142
+ });
143
+ return rpcResponse;
144
+ }
145
+ } else {
146
+ throw Error(`[EditTracker] commit, key ${key} not found `);
147
+ }
148
+ }
149
+ }
150
+ _active = new WeakMap();
151
+ _rowEdits = new WeakMap();
152
+ _editCount = new WeakMap();
153
+ _dataSource = new WeakMap();
154
+ _inEditMode = new WeakMap();
155
+
156
+ exports.EditTracker = EditTracker;
157
+ //# sourceMappingURL=EditTracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditTracker.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/EditTracker.tsx"],"sourcesContent":["import { DataSource } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuRowDataItemType, VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { EventEmitter } from \"../event-emitter\";\nimport { isRpcSuccess } from \"../protocol-message-utils\";\n\nexport type EditState = \"clean\" | \"dirty\";\n\ntype CellEdit = {\n originalValue: VuuRowDataItemType;\n editedValue: VuuRowDataItemType;\n};\n\ntype RowEditDetails = {\n /**\n * Column name => cell edit details\n */\n cellEdits: Map<string, CellEdit>;\n};\n\ntype EditTrackerEvents = {\n editState: (editState: EditState) => void;\n};\n\nexport class EditTracker extends EventEmitter<EditTrackerEvents> {\n #active = false;\n /**\n * Row key => row edits\n */\n #rowEdits = new Map<string, RowEditDetails>();\n #editCount = 0;\n #dataSource?: DataSource;\n #inEditMode = false;\n\n get active() {\n return this.#active;\n }\n set active(isActive: boolean) {\n this.#active = isActive;\n }\n get editCount() {\n return this.#editCount;\n }\n\n set editCount(val: number) {\n if (val !== this.#editCount) {\n const oldCount = this.#editCount;\n this.#editCount = val;\n if (val === 0) {\n this.emit(\"editState\", \"clean\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"dirty\");\n }\n }\n }\n\n set dataSource(ds: DataSource) {\n this.#dataSource = ds;\n }\n\n clear() {\n this.#rowEdits.clear();\n this.#editCount = 0;\n }\n\n async enterEditMode() {\n this.#inEditMode = true;\n\n const rpcResponse = await this.#dataSource?.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"ENTER_EDIT_MODE\",\n params: {},\n });\n\n if (isRpcSuccess(rpcResponse)) {\n const { table: sessionTable } = rpcResponse.data as { table: VuuTable };\n return sessionTable;\n } else {\n console.log(\"fail\");\n }\n }\n\n get inEditMode() {\n return this.#inEditMode;\n }\n\n get editState(): EditState {\n return this.editCount === 0 ? \"clean\" : \"dirty\";\n }\n\n async cancelChanges() {\n const rpcResponse = await this.#dataSource?.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"EXIT_EDIT_MODE\",\n params: {},\n });\n this.clear();\n return rpcResponse;\n }\n\n async saveChanges() {\n const rpcResponse = await this.#dataSource?.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"EXIT_EDIT_MODE\",\n params: { save: true },\n });\n this.clear();\n return rpcResponse;\n }\n\n // TODO how do we deal with the '_edited' pattern\n edit(\n key: string,\n columnName: string,\n originalValue: VuuRowDataItemType,\n newValue: VuuRowDataItemType,\n ) {\n const rowEditDetails = this.#rowEdits.get(key);\n if (rowEditDetails) {\n const { cellEdits } = rowEditDetails;\n const cellEdit = cellEdits.get(columnName);\n if (cellEdit) {\n if (newValue === cellEdit.originalValue) {\n if (cellEdits.size === 1) {\n this.#rowEdits.delete(key);\n } else {\n // re-editing a cell had removed the edit\n cellEdits.delete(columnName);\n }\n this.editCount = this.#editCount - 1;\n } else {\n cellEdit.editedValue = newValue;\n }\n } else {\n // row has already been edited, but this column has not\n cellEdits.set(columnName, {\n originalValue,\n editedValue: newValue,\n });\n this.editCount = this.#editCount + 1;\n }\n } else {\n this.#rowEdits.set(key, {\n cellEdits: new Map([\n [columnName, { originalValue, editedValue: newValue }],\n ]),\n });\n this.editCount = this.#editCount + 1;\n }\n }\n\n //TODO alow a shortcut commit that allows a value, bypassing need\n // for edit. Thids caters for boolean values, dropdown list etc\n // that have no intermediate edit phase\n async commit(key: string, columnName: string) {\n const rowEditDetails = this.#rowEdits.get(key);\n if (rowEditDetails) {\n const { cellEdits } = rowEditDetails;\n const cellEditValues = cellEdits.get(columnName);\n if (cellEditValues) {\n const { editedValue } = cellEditValues;\n const rpcResponse = await this.#dataSource?.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"editCell\",\n params: {\n column: columnName,\n data: editedValue,\n key,\n },\n });\n\n return rpcResponse;\n }\n } else {\n throw Error(`[EditTracker] commit, key ${key} not found `);\n }\n }\n}\n"],"names":["EventEmitter","isRpcSuccess"],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var EditTracker = require('./EditTracker.js');
5
+ var DataProvider = require('../context-definitions/DataProvider.js');
6
+ var protocolMessageUtils = require('../protocol-message-utils.js');
7
+
8
+ const useEditableTable = ({
9
+ columns,
10
+ dataSource: dataSourceProp,
11
+ isEditMode,
12
+ onCancel,
13
+ onSave,
14
+ table
15
+ }) => {
16
+ const { VuuDataSource } = DataProvider.useData();
17
+ const [sessionDataSource, setSessionDataSource] = React.useState(void 0);
18
+ const dataSource = React.useMemo(() => {
19
+ return dataSourceProp ?? new VuuDataSource({ columns, table });
20
+ }, [VuuDataSource, columns, dataSourceProp, table]);
21
+ const editTracker = React.useMemo(() => new EditTracker.EditTracker(), []);
22
+ React.useMemo(() => {
23
+ if (dataSource) {
24
+ editTracker.dataSource = dataSource;
25
+ }
26
+ }, [dataSource, editTracker]);
27
+ const handleCancel = React.useCallback(() => {
28
+ editTracker.cancelChanges();
29
+ onCancel();
30
+ setSessionDataSource(void 0);
31
+ dataSource.resume?.();
32
+ }, [dataSource, editTracker, onCancel]);
33
+ const handleSave = React.useCallback(async () => {
34
+ const response = await editTracker.saveChanges();
35
+ if (protocolMessageUtils.isRpcSuccess(response)) {
36
+ onSave();
37
+ setSessionDataSource(void 0);
38
+ dataSource.resume?.();
39
+ }
40
+ }, [dataSource, editTracker, onSave]);
41
+ React.useMemo(async () => {
42
+ if (isEditMode) {
43
+ const sessionTable = await editTracker.enterEditMode();
44
+ if (sessionTable && dataSource.tableSchema) {
45
+ dataSource.suspend?.(false);
46
+ const sessionDataSource2 = new VuuDataSource({
47
+ columns: dataSource.columns,
48
+ table: sessionTable,
49
+ viewport: sessionTable.table
50
+ });
51
+ setSessionDataSource(sessionDataSource2);
52
+ editTracker.dataSource = sessionDataSource2;
53
+ }
54
+ }
55
+ }, [VuuDataSource, dataSource, editTracker, isEditMode]);
56
+ return {
57
+ dataSource: sessionDataSource ?? dataSource,
58
+ editTracker,
59
+ onCancel: handleCancel,
60
+ onSave: handleSave
61
+ };
62
+ };
63
+
64
+ exports.useEditableTable = useEditableTable;
65
+ //# sourceMappingURL=useEditableTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEditableTable.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/useEditableTable.ts"],"sourcesContent":["import { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { EditTracker } from \"./EditTracker\";\nimport { useData } from \"../context-definitions/DataProvider\";\nimport { DataSource } from \"@vuu-ui/vuu-data-types\";\nimport { isRpcSuccess } from \"../protocol-message-utils\";\n\nexport type EditMode = \"edit\" | \"view\";\n\nexport interface EditableTableHookProps {\n /**\n * columns to be included in subscription. If not provided,\n * default will be '*'. Ignored if dataSource prop present.\n */\n columns?: string[];\n dataSource?: DataSource;\n isEditMode: boolean;\n onCancel: () => void;\n onSave: () => void;\n /**\n * If dataSource nor provided, new DataSource\n * will be created using table and columns\n */\n table: VuuTable;\n}\n\nexport const useEditableTable = ({\n columns,\n dataSource: dataSourceProp,\n isEditMode,\n onCancel,\n onSave,\n table,\n}: EditableTableHookProps) => {\n const { VuuDataSource } = useData();\n const [sessionDataSource, setSessionDataSource] = useState<\n DataSource | undefined\n >(undefined);\n\n const dataSource = useMemo(() => {\n return dataSourceProp ?? new VuuDataSource({ columns, table });\n }, [VuuDataSource, columns, dataSourceProp, table]);\n\n const editTracker = useMemo(() => new EditTracker(), []);\n\n useMemo(() => {\n if (dataSource) {\n editTracker.dataSource = dataSource;\n }\n }, [dataSource, editTracker]);\n\n const handleCancel = useCallback(() => {\n // editTracker.dataSource = dataSource;\n editTracker.cancelChanges();\n onCancel();\n setSessionDataSource(undefined);\n dataSource.resume?.();\n }, [dataSource, editTracker, onCancel]);\n\n const handleSave = useCallback(async () => {\n // editTracker.dataSource = dataSource;\n const response = await editTracker.saveChanges();\n if (isRpcSuccess(response)) {\n onSave();\n setSessionDataSource(undefined);\n dataSource.resume?.();\n }\n }, [dataSource, editTracker, onSave]);\n\n useMemo(async () => {\n if (isEditMode) {\n const sessionTable = await editTracker.enterEditMode();\n if (sessionTable && dataSource.tableSchema) {\n dataSource.suspend?.(false);\n const sessionDataSource = new VuuDataSource({\n columns: dataSource.columns,\n table: sessionTable,\n viewport: sessionTable.table,\n });\n setSessionDataSource(sessionDataSource);\n editTracker.dataSource = sessionDataSource;\n }\n }\n }, [VuuDataSource, dataSource, editTracker, isEditMode]);\n\n return {\n dataSource: sessionDataSource ?? dataSource,\n editTracker,\n onCancel: handleCancel,\n onSave: handleSave,\n };\n};\n"],"names":["useData","useState","useMemo","EditTracker","useCallback","isRpcSuccess","sessionDataSource"],"mappings":";;;;;;;AA0BO,MAAM,mBAAmB,CAAC;AAAA,EAC/B,OAAA;AAAA,EACA,UAAY,EAAA,cAAA;AAAA,EACZ,UAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAA8B,KAAA;AAC5B,EAAM,MAAA,EAAE,aAAc,EAAA,GAAIA,oBAAQ,EAAA;AAClC,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIC,eAEhD,KAAS,CAAA,CAAA;AAEX,EAAM,MAAA,UAAA,GAAaC,cAAQ,MAAM;AAC/B,IAAA,OAAO,kBAAkB,IAAI,aAAA,CAAc,EAAE,OAAA,EAAS,OAAO,CAAA;AAAA,KAC5D,CAAC,aAAA,EAAe,OAAS,EAAA,cAAA,EAAgB,KAAK,CAAC,CAAA;AAElD,EAAA,MAAM,cAAcA,aAAQ,CAAA,MAAM,IAAIC,uBAAY,EAAA,EAAG,EAAE,CAAA;AAEvD,EAAAD,aAAA,CAAQ,MAAM;AACZ,IAAA,IAAI,UAAY,EAAA;AACd,MAAA,WAAA,CAAY,UAAa,GAAA,UAAA;AAAA;AAC3B,GACC,EAAA,CAAC,UAAY,EAAA,WAAW,CAAC,CAAA;AAE5B,EAAM,MAAA,YAAA,GAAeE,kBAAY,MAAM;AAErC,IAAA,WAAA,CAAY,aAAc,EAAA;AAC1B,IAAS,QAAA,EAAA;AACT,IAAA,oBAAA,CAAqB,KAAS,CAAA,CAAA;AAC9B,IAAA,UAAA,CAAW,MAAS,IAAA;AAAA,GACnB,EAAA,CAAC,UAAY,EAAA,WAAA,EAAa,QAAQ,CAAC,CAAA;AAEtC,EAAM,MAAA,UAAA,GAAaA,kBAAY,YAAY;AAEzC,IAAM,MAAA,QAAA,GAAW,MAAM,WAAA,CAAY,WAAY,EAAA;AAC/C,IAAI,IAAAC,iCAAA,CAAa,QAAQ,CAAG,EAAA;AAC1B,MAAO,MAAA,EAAA;AACP,MAAA,oBAAA,CAAqB,KAAS,CAAA,CAAA;AAC9B,MAAA,UAAA,CAAW,MAAS,IAAA;AAAA;AACtB,GACC,EAAA,CAAC,UAAY,EAAA,WAAA,EAAa,MAAM,CAAC,CAAA;AAEpC,EAAAH,aAAA,CAAQ,YAAY;AAClB,IAAA,IAAI,UAAY,EAAA;AACd,MAAM,MAAA,YAAA,GAAe,MAAM,WAAA,CAAY,aAAc,EAAA;AACrD,MAAI,IAAA,YAAA,IAAgB,WAAW,WAAa,EAAA;AAC1C,QAAA,UAAA,CAAW,UAAU,KAAK,CAAA;AAC1B,QAAMI,MAAAA,kBAAAA,GAAoB,IAAI,aAAc,CAAA;AAAA,UAC1C,SAAS,UAAW,CAAA,OAAA;AAAA,UACpB,KAAO,EAAA,YAAA;AAAA,UACP,UAAU,YAAa,CAAA;AAAA,SACxB,CAAA;AACD,QAAA,oBAAA,CAAqBA,kBAAiB,CAAA;AACtC,QAAA,WAAA,CAAY,UAAaA,GAAAA,kBAAAA;AAAA;AAC3B;AACF,KACC,CAAC,aAAA,EAAe,UAAY,EAAA,WAAA,EAAa,UAAU,CAAC,CAAA;AAEvD,EAAO,OAAA;AAAA,IACL,YAAY,iBAAqB,IAAA,UAAA;AAAA,IACjC,WAAA;AAAA,IACA,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AACF;;;;"}
@@ -12,6 +12,10 @@ var commonTypes = require('./common-types.js');
12
12
  var componentRegistry = require('./component-registry.js');
13
13
  var cookieUtils = require('./cookie-utils.js');
14
14
  var cssUtils = require('./css-utils.js');
15
+ var EditButtons = require('./data-editing/EditButtons.js');
16
+ var DataEditingProvider = require('./data-editing/DataEditingProvider.js');
17
+ var EditTracker = require('./data-editing/EditTracker.js');
18
+ var useEditableTable = require('./data-editing/useEditableTable.js');
15
19
  var dataUtils = require('./data-utils.js');
16
20
  var BaseDataSource = require('./datasource/BaseDataSource.js');
17
21
  var datasourceActionUtils = require('./datasource/datasource-action-utils.js');
@@ -70,6 +74,7 @@ var DataSourceProvider = require('./context-definitions/DataSourceProvider.js');
70
74
  var WorkspaceContext = require('./context-definitions/WorkspaceContext.js');
71
75
  var PageVisibilityObserver = require('./PageVisibilityObserver.js');
72
76
  var ShellContext = require('./ShellContext.js');
77
+ var themeUtils = require('./theme-utils.js');
73
78
 
74
79
 
75
80
 
@@ -198,6 +203,11 @@ exports.registerConfigurationEditor = componentRegistry.registerConfigurationEdi
198
203
  exports.getCookieValue = cookieUtils.getCookieValue;
199
204
  exports.setCookieValue = cookieUtils.setCookieValue;
200
205
  exports.importCSS = cssUtils.importCSS;
206
+ exports.EditButtons = EditButtons.EditButtons;
207
+ exports.DataEditingProvider = DataEditingProvider.DataEditingProvider;
208
+ exports.useEditTracker = DataEditingProvider.useEditTracker;
209
+ exports.EditTracker = EditTracker.EditTracker;
210
+ exports.useEditableTable = useEditableTable.useEditableTable;
201
211
  exports.DOWN1 = dataUtils.DOWN1;
202
212
  exports.DOWN2 = dataUtils.DOWN2;
203
213
  exports.UP1 = dataUtils.UP1;
@@ -449,4 +459,5 @@ exports.usePlaceholderJSON = WorkspaceContext.usePlaceholderJSON;
449
459
  exports.PageVisibilityObserver = PageVisibilityObserver.PageVisibilityObserver;
450
460
  exports.ShellContext = ShellContext.ShellContext;
451
461
  exports.useShellContext = ShellContext.useShellContext;
462
+ exports.ThemeLoadChecker = themeUtils.ThemeLoadChecker;
452
463
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+
5
+ const checkCssToken = (tokenName) => new Promise((resolve) => {
6
+ requestAnimationFrame(() => {
7
+ const saltSpacing100 = getComputedStyle(
8
+ document.documentElement
9
+ ).getPropertyValue(tokenName);
10
+ resolve(saltSpacing100 !== "");
11
+ });
12
+ });
13
+ const ThemeLoadChecker = ({
14
+ children,
15
+ cssToken = "--salt-spacing-100",
16
+ theme
17
+ }) => {
18
+ const [ready, setReady] = React.useState(false);
19
+ React.useMemo(async () => {
20
+ let ready2 = await checkCssToken(cssToken);
21
+ while (!ready2) {
22
+ ready2 = await checkCssToken(cssToken);
23
+ }
24
+ setReady(true);
25
+ }, [cssToken]);
26
+ if (theme === "no-theme") {
27
+ return children;
28
+ }
29
+ if (ready === false) {
30
+ return null;
31
+ }
32
+ return children;
33
+ };
34
+
35
+ exports.ThemeLoadChecker = ThemeLoadChecker;
36
+ //# sourceMappingURL=theme-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-utils.js","sources":["../../../../../../packages/vuu-utils/src/theme-utils.ts"],"sourcesContent":["import { ReactNode, useMemo, useState } from \"react\";\n\nconst checkCssToken = (tokenName: string): Promise<boolean> =>\n new Promise((resolve) => {\n requestAnimationFrame(() => {\n const saltSpacing100 = getComputedStyle(\n document.documentElement,\n ).getPropertyValue(tokenName);\n resolve(saltSpacing100 !== \"\");\n });\n });\n\n/**\n * Checks that a theme is loaded by making sure a known css variable\n * returns a value. Not normally needed except for cases where a theme\n * is loaded dynamically on startup and there may be components that\n * may fail if theme is not in place (eg component that rely on taking dom\n * measurements).\n * Used by Showcase.\n */\nexport const ThemeLoadChecker = ({\n children,\n cssToken = \"--salt-spacing-100\",\n theme,\n}: {\n children: ReactNode;\n cssToken?: string;\n theme: string;\n}) => {\n const [ready, setReady] = useState(false);\n\n useMemo(async () => {\n let ready = await checkCssToken(cssToken);\n while (!ready) {\n ready = await checkCssToken(cssToken);\n }\n setReady(true);\n }, [cssToken]);\n\n if (theme === \"no-theme\") {\n return children;\n }\n\n if (ready === false) {\n return null;\n }\n\n return children;\n};\n"],"names":["useState","useMemo","ready"],"mappings":";;;;AAEA,MAAM,gBAAgB,CAAC,SAAA,KACrB,IAAI,OAAA,CAAQ,CAAC,OAAY,KAAA;AACvB,EAAA,qBAAA,CAAsB,MAAM;AAC1B,IAAA,MAAM,cAAiB,GAAA,gBAAA;AAAA,MACrB,QAAS,CAAA;AAAA,KACX,CAAE,iBAAiB,SAAS,CAAA;AAC5B,IAAA,OAAA,CAAQ,mBAAmB,EAAE,CAAA;AAAA,GAC9B,CAAA;AACH,CAAC,CAAA;AAUI,MAAM,mBAAmB,CAAC;AAAA,EAC/B,QAAA;AAAA,EACA,QAAW,GAAA,oBAAA;AAAA,EACX;AACF,CAIM,KAAA;AACJ,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAS,KAAK,CAAA;AAExC,EAAAC,aAAA,CAAQ,YAAY;AAClB,IAAIC,IAAAA,MAAAA,GAAQ,MAAM,aAAA,CAAc,QAAQ,CAAA;AACxC,IAAA,OAAO,CAACA,MAAO,EAAA;AACb,MAAAA,MAAAA,GAAQ,MAAM,aAAA,CAAc,QAAQ,CAAA;AAAA;AAEtC,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,GACf,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,IAAI,UAAU,UAAY,EAAA;AACxB,IAAO,OAAA,QAAA;AAAA;AAGT,EAAA,IAAI,UAAU,KAAO,EAAA;AACnB,IAAO,OAAA,IAAA;AAAA;AAGT,EAAO,OAAA,QAAA;AACT;;;;"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- const getUrlParameter = (paramName, defaultValue) => {
3
+ function getUrlParameter(paramName, defaultValue) {
4
4
  const url = new URL(document.location.href);
5
5
  const parameter = url.searchParams.get(paramName);
6
6
  if (parameter) {
@@ -13,7 +13,7 @@ const getUrlParameter = (paramName, defaultValue) => {
13
13
  return result[1];
14
14
  }
15
15
  return defaultValue;
16
- };
16
+ }
17
17
  const hasUrlParameter = (paramName) => new URL(document.location.href).searchParams.has(paramName);
18
18
 
19
19
  exports.getUrlParameter = getUrlParameter;
@@ -1 +1 @@
1
- {"version":3,"file":"url-utils.js","sources":["../../../../../../packages/vuu-utils/src/url-utils.ts"],"sourcesContent":["export const getUrlParameter = (paramName: string, defaultValue?: string) => {\n const url = new URL(document.location.href);\n const parameter = url.searchParams.get(paramName);\n if (parameter) {\n return parameter;\n }\n const hashParams = url.hash;\n const regex = new RegExp(`${paramName}=([a-zA-Z]*)`);\n const result = regex.exec(hashParams);\n if (result) {\n return result[1];\n }\n return defaultValue;\n};\n\nexport const hasUrlParameter = (paramName: string) =>\n new URL(document.location.href).searchParams.has(paramName);\n"],"names":[],"mappings":";;AAAa,MAAA,eAAA,GAAkB,CAAC,SAAA,EAAmB,YAA0B,KAAA;AAC3E,EAAA,MAAM,GAAM,GAAA,IAAI,GAAI,CAAA,QAAA,CAAS,SAAS,IAAI,CAAA;AAC1C,EAAA,MAAM,SAAY,GAAA,GAAA,CAAI,YAAa,CAAA,GAAA,CAAI,SAAS,CAAA;AAChD,EAAA,IAAI,SAAW,EAAA;AACb,IAAO,OAAA,SAAA;AAAA;AAET,EAAA,MAAM,aAAa,GAAI,CAAA,IAAA;AACvB,EAAA,MAAM,KAAQ,GAAA,IAAI,MAAO,CAAA,CAAA,EAAG,SAAS,CAAc,YAAA,CAAA,CAAA;AACnD,EAAM,MAAA,MAAA,GAAS,KAAM,CAAA,IAAA,CAAK,UAAU,CAAA;AACpC,EAAA,IAAI,MAAQ,EAAA;AACV,IAAA,OAAO,OAAO,CAAC,CAAA;AAAA;AAEjB,EAAO,OAAA,YAAA;AACT;AAEa,MAAA,eAAA,GAAkB,CAAC,SAAA,KAC9B,IAAI,GAAA,CAAI,QAAS,CAAA,QAAA,CAAS,IAAI,CAAA,CAAE,YAAa,CAAA,GAAA,CAAI,SAAS;;;;;"}
1
+ {"version":3,"file":"url-utils.js","sources":["../../../../../../packages/vuu-utils/src/url-utils.ts"],"sourcesContent":["export function getUrlParameter(paramName: string): string | undefined;\nexport function getUrlParameter(\n paramName: string,\n defaultValue: string,\n): string;\nexport function getUrlParameter(paramName: string, defaultValue?: string) {\n const url = new URL(document.location.href);\n const parameter = url.searchParams.get(paramName);\n if (parameter) {\n return parameter;\n }\n const hashParams = url.hash;\n const regex = new RegExp(`${paramName}=([a-zA-Z]*)`);\n const result = regex.exec(hashParams);\n if (result) {\n return result[1];\n }\n return defaultValue;\n}\n\nexport const hasUrlParameter = (paramName: string) =>\n new URL(document.location.href).searchParams.has(paramName);\n"],"names":[],"mappings":";;AAKgB,SAAA,eAAA,CAAgB,WAAmB,YAAuB,EAAA;AACxE,EAAA,MAAM,GAAM,GAAA,IAAI,GAAI,CAAA,QAAA,CAAS,SAAS,IAAI,CAAA;AAC1C,EAAA,MAAM,SAAY,GAAA,GAAA,CAAI,YAAa,CAAA,GAAA,CAAI,SAAS,CAAA;AAChD,EAAA,IAAI,SAAW,EAAA;AACb,IAAO,OAAA,SAAA;AAAA;AAET,EAAA,MAAM,aAAa,GAAI,CAAA,IAAA;AACvB,EAAA,MAAM,KAAQ,GAAA,IAAI,MAAO,CAAA,CAAA,EAAG,SAAS,CAAc,YAAA,CAAA,CAAA;AACnD,EAAM,MAAA,MAAA,GAAS,KAAM,CAAA,IAAA,CAAK,UAAU,CAAA;AACpC,EAAA,IAAI,MAAQ,EAAA;AACV,IAAA,OAAO,OAAO,CAAC,CAAA;AAAA;AAEjB,EAAO,OAAA,YAAA;AACT;AAEa,MAAA,eAAA,GAAkB,CAAC,SAAA,KAC9B,IAAI,GAAA,CAAI,QAAS,CAAA,QAAA,CAAS,IAAI,CAAA,CAAE,YAAa,CAAA,GAAA,CAAI,SAAS;;;;;"}