@servicetitan/form 41.1.0 → 41.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/dist/color-picker/color-picker.d.ts +1 -1
  2. package/dist/color-picker/color-picker.d.ts.map +1 -1
  3. package/dist/color-picker/color-picker.js.map +1 -1
  4. package/dist/date-range-picker/date-range-picker.d.ts +4 -3
  5. package/dist/date-range-picker/date-range-picker.d.ts.map +1 -1
  6. package/dist/date-range-picker/date-range-picker.js.map +1 -1
  7. package/dist/demo/color-picker.d.ts +1 -1
  8. package/dist/demo/color-picker.d.ts.map +1 -1
  9. package/dist/demo/color-picker.js.map +1 -1
  10. package/dist/demo/date-range-picker.d.ts +1 -1
  11. package/dist/demo/date-range-picker.d.ts.map +1 -1
  12. package/dist/demo/date-range-picker.js.map +1 -1
  13. package/dist/demo/file-uploader.d.ts +1 -1
  14. package/dist/demo/file-uploader.d.ts.map +1 -1
  15. package/dist/demo/file-uploader.js.map +1 -1
  16. package/dist/demo/input-date-mask.d.ts +1 -1
  17. package/dist/demo/input-date-mask.d.ts.map +1 -1
  18. package/dist/demo/input-date-mask.js.map +1 -1
  19. package/dist/demo/number-input.d.ts +1 -1
  20. package/dist/demo/number-input.d.ts.map +1 -1
  21. package/dist/demo/number-input.js.map +1 -1
  22. package/dist/demo/original-number-input.d.ts +1 -1
  23. package/dist/demo/original-number-input.d.ts.map +1 -1
  24. package/dist/demo/original-number-input.js.map +1 -1
  25. package/dist/demo/phone-number-input-a2.d.ts +1 -1
  26. package/dist/demo/phone-number-input-a2.d.ts.map +1 -1
  27. package/dist/demo/phone-number-input-a2.js.map +1 -1
  28. package/dist/demo/phone-number-input.d.ts +1 -1
  29. package/dist/demo/phone-number-input.d.ts.map +1 -1
  30. package/dist/demo/phone-number-input.js.map +1 -1
  31. package/dist/file-uploader/config.d.ts +1 -1
  32. package/dist/file-uploader/config.d.ts.map +1 -1
  33. package/dist/file-uploader/config.js.map +1 -1
  34. package/dist/file-uploader/file-uploader.d.ts.map +1 -1
  35. package/dist/file-uploader/file-uploader.js.map +1 -1
  36. package/dist/form-state-error-banner/form-state-error-banner.d.ts +1 -1
  37. package/dist/form-state-error-banner/form-state-error-banner.d.ts.map +1 -1
  38. package/dist/form-state-error-banner/form-state-error-banner.js.map +1 -1
  39. package/dist/input-date-mask/input-date-mask.d.ts +2 -2
  40. package/dist/input-date-mask/input-date-mask.d.ts.map +1 -1
  41. package/dist/input-date-mask/input-date-mask.js.map +1 -1
  42. package/dist/label/label.d.ts +1 -1
  43. package/dist/label/label.d.ts.map +1 -1
  44. package/dist/label/label.js.map +1 -1
  45. package/dist/masked-input.d.ts +3 -3
  46. package/dist/masked-input.d.ts.map +1 -1
  47. package/dist/masked-input.js.map +1 -1
  48. package/dist/number-input/get-formatted-string.d.ts +1 -1
  49. package/dist/number-input/get-formatted-string.d.ts.map +1 -1
  50. package/dist/number-input/get-formatted-string.js.map +1 -1
  51. package/dist/number-input/number-input.d.ts +3 -3
  52. package/dist/number-input/number-input.d.ts.map +1 -1
  53. package/dist/number-input/number-input.js.map +1 -1
  54. package/dist/number-input/process-value.d.ts +2 -2
  55. package/dist/number-input/process-value.d.ts.map +1 -1
  56. package/dist/number-input/process-value.js.map +1 -1
  57. package/dist/original-number-input/ordinal-number-input.d.ts +1 -1
  58. package/dist/original-number-input/ordinal-number-input.d.ts.map +1 -1
  59. package/dist/original-number-input/ordinal-number-input.js.map +1 -1
  60. package/dist/phone-number-input/phone-number-input-a2.d.ts +3 -3
  61. package/dist/phone-number-input/phone-number-input-a2.d.ts.map +1 -1
  62. package/dist/phone-number-input/phone-number-input-a2.js.map +1 -1
  63. package/dist/phone-number-input/phone-number-input.d.ts +1 -1
  64. package/dist/phone-number-input/phone-number-input.d.ts.map +1 -1
  65. package/dist/phone-number-input/phone-number-input.js.map +1 -1
  66. package/package.json +10 -10
  67. package/src/color-picker/color-picker.tsx +2 -1
  68. package/src/date-range-picker/date-range-picker.tsx +5 -4
  69. package/src/demo/color-picker.tsx +4 -2
  70. package/src/demo/date-range-picker.tsx +3 -2
  71. package/src/demo/file-uploader.tsx +4 -2
  72. package/src/demo/input-date-mask.tsx +2 -1
  73. package/src/demo/number-input.tsx +2 -1
  74. package/src/demo/original-number-input.tsx +2 -1
  75. package/src/demo/phone-number-input-a2.tsx +3 -2
  76. package/src/demo/phone-number-input.tsx +1 -1
  77. package/src/file-uploader/__tests__/uploader.test.ts +1 -1
  78. package/src/file-uploader/config.tsx +1 -1
  79. package/src/file-uploader/file-uploader.tsx +2 -1
  80. package/src/form-state-error-banner/form-state-error-banner.tsx +1 -1
  81. package/src/input-date-mask/input-date-mask.tsx +4 -2
  82. package/src/label/label.tsx +1 -1
  83. package/src/masked-input.tsx +5 -3
  84. package/src/number-input/__tests__/get-formatted-string.test.ts +1 -1
  85. package/src/number-input/__tests__/process-value.test.ts +1 -1
  86. package/src/number-input/get-formatted-string.ts +1 -1
  87. package/src/number-input/number-input.tsx +7 -12
  88. package/src/number-input/process-value.ts +2 -2
  89. package/src/original-number-input/ordinal-number-input.tsx +4 -2
  90. package/src/phone-number-input/__tests__/phone-number-input-a2.test.tsx +1 -1
  91. package/src/phone-number-input/phone-number-input-a2.tsx +6 -3
  92. package/src/phone-number-input/phone-number-input.tsx +2 -1
@@ -1,4 +1,4 @@
1
- import { FC, ComponentType } from 'react';
1
+ import type { FC, ComponentType } from 'react';
2
2
  export interface ColorPickerPreviewProps {
3
3
  color?: string;
4
4
  }
@@ -1 +1 @@
1
- {"version":3,"file":"color-picker.d.ts","sourceRoot":"","sources":["../../src/color-picker/color-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4C,EAAE,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAapF,MAAM,WAAW,uBAAuB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,aAAa,CAAC,uBAAuB,CAAC,CAAC;IACjD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;CAC7C;AAED,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CA0D5C,CAAC"}
1
+ {"version":3,"file":"color-picker.d.ts","sourceRoot":"","sources":["../../src/color-picker/color-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAc/C,MAAM,WAAW,uBAAuB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,aAAa,CAAC,uBAAuB,CAAC,CAAC;IACjD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;CAC7C;AAED,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CA0D5C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/color-picker/color-picker.tsx"],"sourcesContent":["import { useRef, useState, useCallback, useEffect, FC, ComponentType } from 'react';\r\n\r\nimport {\r\n Popover,\r\n BodyText,\r\n Card,\r\n ColorPicker as AnvilColorPicker,\r\n} from '@servicetitan/design-system';\r\n\r\nimport { colorPalette } from './color-palette';\r\n\r\nimport * as Styles from './color-picker.module.css';\r\n\r\nexport interface ColorPickerPreviewProps {\r\n color?: string;\r\n}\r\n\r\nexport interface ColorPickerProps {\r\n label?: string;\r\n colors?: string[];\r\n value: string | undefined;\r\n preview?: ComponentType<ColorPickerPreviewProps>;\r\n onChange(value: string | undefined): void;\r\n}\r\n\r\nexport const ColorPicker: FC<ColorPickerProps> = ({\r\n label,\r\n colors = colorPalette,\r\n value,\r\n preview: Preview,\r\n onChange,\r\n}) => {\r\n const ref = useRef<HTMLDivElement>(null);\r\n\r\n const [isOpen, setIsOpen] = useState(false);\r\n\r\n const handleClickOutside = useCallback((event: Event) => {\r\n if (ref.current && !ref.current.contains(event.target as Node)) {\r\n setIsOpen(false);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n\r\n return () => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n };\r\n }, [handleClickOutside]);\r\n\r\n const handleTriggerClick = () => {\r\n setIsOpen(isOpen => !isOpen);\r\n };\r\n\r\n return (\r\n <div ref={ref} className=\"d-f\">\r\n <Popover\r\n trigger={\r\n <div\r\n style={{ background: value }}\r\n onClick={handleTriggerClick}\r\n className={Styles.colorPicker}\r\n />\r\n }\r\n open={isOpen}\r\n direction=\"rb\"\r\n popoverContentClassName=\"p-3\"\r\n className={Styles.colorPickerPopover}\r\n >\r\n <BodyText size=\"medium\" className=\"m-b-1\">\r\n {label}\r\n </BodyText>\r\n <Card padding=\"thin\">\r\n <AnvilColorPicker\r\n colors={colors}\r\n value={value?.toLowerCase()}\r\n onChange={onChange}\r\n />\r\n </Card>\r\n {Preview && <Preview color={value} />}\r\n </Popover>\r\n </div>\r\n );\r\n};\r\n"],"names":["useRef","useState","useCallback","useEffect","Popover","BodyText","Card","ColorPicker","AnvilColorPicker","colorPalette","Styles","label","colors","value","preview","Preview","onChange","ref","isOpen","setIsOpen","handleClickOutside","event","current","contains","target","document","addEventListener","removeEventListener","handleTriggerClick","div","className","trigger","style","background","onClick","colorPicker","open","direction","popoverContentClassName","colorPickerPopover","size","padding","toLowerCase","color"],"mappings":";AAAA,SAASA,MAAM,EAAEC,QAAQ,EAAEC,WAAW,EAAEC,SAAS,QAA2B,QAAQ;AAEpF,SACIC,OAAO,EACPC,QAAQ,EACRC,IAAI,EACJC,eAAeC,gBAAgB,QAC5B,8BAA8B;AAErC,SAASC,YAAY,QAAQ,kBAAkB;AAE/C,YAAYC,YAAY,4BAA4B;AAcpD,OAAO,MAAMH,cAAoC,CAAC,EAC9CI,KAAK,EACLC,SAASH,YAAY,EACrBI,KAAK,EACLC,SAASC,OAAO,EAChBC,QAAQ,EACX;IACG,MAAMC,MAAMjB,OAAuB;IAEnC,MAAM,CAACkB,QAAQC,UAAU,GAAGlB,SAAS;IAErC,MAAMmB,qBAAqBlB,YAAY,CAACmB;QACpC,IAAIJ,IAAIK,OAAO,IAAI,CAACL,IAAIK,OAAO,CAACC,QAAQ,CAACF,MAAMG,MAAM,GAAW;YAC5DL,UAAU;QACd;IACJ,GAAG,EAAE;IAELhB,UAAU;QACNsB,SAASC,gBAAgB,CAAC,aAAaN;QAEvC,OAAO;YACHK,SAASE,mBAAmB,CAAC,aAAaP;QAC9C;IACJ,GAAG;QAACA;KAAmB;IAEvB,MAAMQ,qBAAqB;QACvBT,UAAUD,CAAAA,SAAU,CAACA;IACzB;IAEA,qBACI,KAACW;QAAIZ,KAAKA;QAAKa,WAAU;kBACrB,cAAA,MAAC1B;YACG2B,uBACI,KAACF;gBACGG,OAAO;oBAAEC,YAAYpB;gBAAM;gBAC3BqB,SAASN;gBACTE,WAAWpB,OAAOyB,WAAW;;YAGrCC,MAAMlB;YACNmB,WAAU;YACVC,yBAAwB;YACxBR,WAAWpB,OAAO6B,kBAAkB;;8BAEpC,KAAClC;oBAASmC,MAAK;oBAASV,WAAU;8BAC7BnB;;8BAEL,KAACL;oBAAKmC,SAAQ;8BACV,cAAA,KAACjC;wBACGI,QAAQA;wBACRC,KAAK,EAAEA,kBAAAA,4BAAAA,MAAO6B,WAAW;wBACzB1B,UAAUA;;;gBAGjBD,yBAAW,KAACA;oBAAQ4B,OAAO9B;;;;;AAI5C,EAAE"}
1
+ {"version":3,"sources":["../../src/color-picker/color-picker.tsx"],"sourcesContent":["import type { FC, ComponentType } from 'react';\r\nimport { useRef, useState, useCallback, useEffect } from 'react';\r\n\r\nimport {\r\n Popover,\r\n BodyText,\r\n Card,\r\n ColorPicker as AnvilColorPicker,\r\n} from '@servicetitan/design-system';\r\n\r\nimport { colorPalette } from './color-palette';\r\n\r\nimport * as Styles from './color-picker.module.css';\r\n\r\nexport interface ColorPickerPreviewProps {\r\n color?: string;\r\n}\r\n\r\nexport interface ColorPickerProps {\r\n label?: string;\r\n colors?: string[];\r\n value: string | undefined;\r\n preview?: ComponentType<ColorPickerPreviewProps>;\r\n onChange(value: string | undefined): void;\r\n}\r\n\r\nexport const ColorPicker: FC<ColorPickerProps> = ({\r\n label,\r\n colors = colorPalette,\r\n value,\r\n preview: Preview,\r\n onChange,\r\n}) => {\r\n const ref = useRef<HTMLDivElement>(null);\r\n\r\n const [isOpen, setIsOpen] = useState(false);\r\n\r\n const handleClickOutside = useCallback((event: Event) => {\r\n if (ref.current && !ref.current.contains(event.target as Node)) {\r\n setIsOpen(false);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n\r\n return () => {\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n };\r\n }, [handleClickOutside]);\r\n\r\n const handleTriggerClick = () => {\r\n setIsOpen(isOpen => !isOpen);\r\n };\r\n\r\n return (\r\n <div ref={ref} className=\"d-f\">\r\n <Popover\r\n trigger={\r\n <div\r\n style={{ background: value }}\r\n onClick={handleTriggerClick}\r\n className={Styles.colorPicker}\r\n />\r\n }\r\n open={isOpen}\r\n direction=\"rb\"\r\n popoverContentClassName=\"p-3\"\r\n className={Styles.colorPickerPopover}\r\n >\r\n <BodyText size=\"medium\" className=\"m-b-1\">\r\n {label}\r\n </BodyText>\r\n <Card padding=\"thin\">\r\n <AnvilColorPicker\r\n colors={colors}\r\n value={value?.toLowerCase()}\r\n onChange={onChange}\r\n />\r\n </Card>\r\n {Preview && <Preview color={value} />}\r\n </Popover>\r\n </div>\r\n );\r\n};\r\n"],"names":["useRef","useState","useCallback","useEffect","Popover","BodyText","Card","ColorPicker","AnvilColorPicker","colorPalette","Styles","label","colors","value","preview","Preview","onChange","ref","isOpen","setIsOpen","handleClickOutside","event","current","contains","target","document","addEventListener","removeEventListener","handleTriggerClick","div","className","trigger","style","background","onClick","colorPicker","open","direction","popoverContentClassName","colorPickerPopover","size","padding","toLowerCase","color"],"mappings":";AACA,SAASA,MAAM,EAAEC,QAAQ,EAAEC,WAAW,EAAEC,SAAS,QAAQ,QAAQ;AAEjE,SACIC,OAAO,EACPC,QAAQ,EACRC,IAAI,EACJC,eAAeC,gBAAgB,QAC5B,8BAA8B;AAErC,SAASC,YAAY,QAAQ,kBAAkB;AAE/C,YAAYC,YAAY,4BAA4B;AAcpD,OAAO,MAAMH,cAAoC,CAAC,EAC9CI,KAAK,EACLC,SAASH,YAAY,EACrBI,KAAK,EACLC,SAASC,OAAO,EAChBC,QAAQ,EACX;IACG,MAAMC,MAAMjB,OAAuB;IAEnC,MAAM,CAACkB,QAAQC,UAAU,GAAGlB,SAAS;IAErC,MAAMmB,qBAAqBlB,YAAY,CAACmB;QACpC,IAAIJ,IAAIK,OAAO,IAAI,CAACL,IAAIK,OAAO,CAACC,QAAQ,CAACF,MAAMG,MAAM,GAAW;YAC5DL,UAAU;QACd;IACJ,GAAG,EAAE;IAELhB,UAAU;QACNsB,SAASC,gBAAgB,CAAC,aAAaN;QAEvC,OAAO;YACHK,SAASE,mBAAmB,CAAC,aAAaP;QAC9C;IACJ,GAAG;QAACA;KAAmB;IAEvB,MAAMQ,qBAAqB;QACvBT,UAAUD,CAAAA,SAAU,CAACA;IACzB;IAEA,qBACI,KAACW;QAAIZ,KAAKA;QAAKa,WAAU;kBACrB,cAAA,MAAC1B;YACG2B,uBACI,KAACF;gBACGG,OAAO;oBAAEC,YAAYpB;gBAAM;gBAC3BqB,SAASN;gBACTE,WAAWpB,OAAOyB,WAAW;;YAGrCC,MAAMlB;YACNmB,WAAU;YACVC,yBAAwB;YACxBR,WAAWpB,OAAO6B,kBAAkB;;8BAEpC,KAAClC;oBAASmC,MAAK;oBAASV,WAAU;8BAC7BnB;;8BAEL,KAACL;oBAAKmC,SAAQ;8BACV,cAAA,KAACjC;wBACGI,QAAQA;wBACRC,KAAK,EAAEA,kBAAAA,4BAAAA,MAAO6B,WAAW;wBACzB1B,UAAUA;;;gBAGjBD,yBAAW,KAACA;oBAAQ4B,OAAO9B;;;;;AAI5C,EAAE"}
@@ -1,6 +1,7 @@
1
- import { ComponentType, Component, SyntheticEvent } from 'react';
2
- import { DateRangePickerChangeEvent, CalendarHeaderTitleProps, MultiViewCalendarProps, CalendarCellProps, ActiveView } from '@progress/kendo-react-dateinputs';
3
- import { DateRange } from '@servicetitan/form-state';
1
+ import type { ComponentType, SyntheticEvent } from 'react';
2
+ import { Component } from 'react';
3
+ import type { DateRangePickerChangeEvent, CalendarHeaderTitleProps, MultiViewCalendarProps, CalendarCellProps, ActiveView } from '@progress/kendo-react-dateinputs';
4
+ import type { DateRange } from '@servicetitan/form-state';
4
5
  import { FieldState } from 'formstate';
5
6
  export interface DateRangePickerProps {
6
7
  field: FieldState<DateRange | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"date-range-picker.d.ts","sourceRoot":"","sources":["../../src/date-range-picker/date-range-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAEH,0BAA0B,EAC1B,wBAAwB,EACxB,sBAAsB,EACtB,iBAAiB,EACjB,UAAU,EACb,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAMrD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,MAAM,WAAW,oBAAoB;IACjC,KAAK,EAAE,UAAU,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IACzC,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,eAAe,CAAC,EAAE,IAAI,CAAC;IACvB,eAAe,CAAC,EAAE,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,aAAa,CAAC,sBAAsB,CAAC,CAAC;IAC1D,oBAAoB,CAAC,EAAE,aAAa,CAAC,wBAAwB,CAAC,CAAC;IAC/D,aAAa,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC9C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBACa,eAAgB,SAAQ,SAAS,CAAC,oBAAoB,CAAC;IAEpD,QAAQ,CAAC,EAAE,GAAG,CAAC;IAC3B,SAAS,UAAS;IACN,cAAc,UAAS;IACnC,aAAa,UAAS;IACtB,wBAAwB,UAAS;gBAErB,KAAK,EAAE,oBAAoB;IAMvC,SAAS,GAAI,UAAU,cAAc,UAEnC;IAGF,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO;IAIzB,iBAAiB,GAAI,KAAK,KAAK,UAqB7B;IAEF,0BAA0B,aAExB;IAEF,eAAe,aAUb;IAEF,iBAAiB;IAIjB,oBAAoB;IAIpB,YAAY,GAAI,OAAO,0BAA0B,UAQ/C;IAEF,gBAAgB,GAAI,OAAO,IAAI,UAQ7B;IAEF,cAAc,GAAI,KAAK,IAAI,UAQzB;IAEF,MAAM;IAiIN,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,SAAM;IAIzC,uBAAuB,GAAI,IAAI,cAAc,CAAC,gBAAgB,CAAC,UAG7D;IAEF,IAAI,WAAW,qBAad;IAED,IAAI,SAAS,qBAYZ;CACJ"}
1
+ {"version":3,"file":"date-range-picker.d.ts","sourceRoot":"","sources":["../../src/date-range-picker/date-range-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,KAAK,EACR,0BAA0B,EAC1B,wBAAwB,EACxB,sBAAsB,EACtB,iBAAiB,EACjB,UAAU,EACb,MAAM,kCAAkC,CAAC;AAG1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAM1D,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,MAAM,WAAW,oBAAoB;IACjC,KAAK,EAAE,UAAU,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IACzC,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,eAAe,CAAC,EAAE,IAAI,CAAC;IACvB,eAAe,CAAC,EAAE,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,aAAa,CAAC,sBAAsB,CAAC,CAAC;IAC1D,oBAAoB,CAAC,EAAE,aAAa,CAAC,wBAAwB,CAAC,CAAC;IAC/D,aAAa,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC9C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBACa,eAAgB,SAAQ,SAAS,CAAC,oBAAoB,CAAC;IAEpD,QAAQ,CAAC,EAAE,GAAG,CAAC;IAC3B,SAAS,UAAS;IACN,cAAc,UAAS;IACnC,aAAa,UAAS;IACtB,wBAAwB,UAAS;gBAErB,KAAK,EAAE,oBAAoB;IAMvC,SAAS,GAAI,UAAU,cAAc,UAEnC;IAGF,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO;IAIzB,iBAAiB,GAAI,KAAK,KAAK,UAqB7B;IAEF,0BAA0B,aAExB;IAEF,eAAe,aAUb;IAEF,iBAAiB;IAIjB,oBAAoB;IAIpB,YAAY,GAAI,OAAO,0BAA0B,UAQ/C;IAEF,gBAAgB,GAAI,OAAO,IAAI,UAQ7B;IAEF,cAAc,GAAI,KAAK,IAAI,UAQzB;IAEF,MAAM;IAiIN,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,SAAM;IAIzC,uBAAuB,GAAI,IAAI,cAAc,CAAC,gBAAgB,CAAC,UAG7D;IAEF,IAAI,WAAW,qBAad;IAED,IAAI,SAAS,qBAYZ;CACJ"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/date-range-picker/date-range-picker.tsx"],"sourcesContent":["import { ComponentType, Component, SyntheticEvent } from 'react';\nimport {\n DateRangePicker as DateRangePickerKendo,\n DateRangePickerChangeEvent,\n CalendarHeaderTitleProps,\n MultiViewCalendarProps,\n CalendarCellProps,\n ActiveView,\n} from '@progress/kendo-react-dateinputs';\nimport { Icon, InputDateMask, Stack } from '@servicetitan/design-system';\nimport { DateRange } from '@servicetitan/form-state';\nimport { observable, action, makeObservable } from 'mobx';\nimport { observer } from 'mobx-react';\nimport classnames from 'classnames';\nimport moment from 'moment';\nimport * as Styles from './date-range-picker.module.css';\nimport { FieldState } from 'formstate';\n\nexport interface DateRangePickerProps {\n field: FieldState<DateRange | undefined>;\n ['qa-testing']: string;\n placeHolder?: string;\n minDate?: Date;\n maxDate?: Date;\n calendarMinDate?: Date;\n calendarMaxDate?: Date;\n topView?: ActiveView;\n bottomView?: ActiveView;\n className?: string;\n calendarComponent?: ComponentType<MultiViewCalendarProps>;\n headerTitleComponent?: ComponentType<CalendarHeaderTitleProps>;\n cellComponent?: ComponentType<CalendarCellProps>;\n inputFormat?: string;\n horizontalAlign?: 'left' | 'center' | 'right';\n disabled?: boolean;\n small?: boolean;\n disableRangeValidation?: boolean;\n maskChar?: string;\n}\n\n@observer\nexport class DateRangePicker extends Component<DateRangePickerProps> {\n // `HTMLDivElement` leads to issues with Node/SSR\n @observable wrapElem?: any; /* HTMLDivElement */\n isFocused = false;\n @observable showDatePicker = false;\n isIconClicked = false;\n isDateRangePickerClicked = false;\n\n constructor(props: DateRangePickerProps) {\n super(props);\n makeObservable(this);\n }\n\n @action\n handleRef = (wrapElem: HTMLDivElement) => {\n this.wrapElem = wrapElem;\n };\n\n @action\n toggleShow(show?: boolean) {\n this.showDatePicker = show !== undefined ? show : !this.showDatePicker;\n }\n\n handleClickGlobal = (evt: Event) => {\n if (!(evt.target instanceof Node)) {\n return;\n }\n\n const isPrevFocused = this.isFocused;\n\n this.isFocused = this.isDateRangePickerClicked;\n\n if (!this.isFocused && isPrevFocused) {\n // click outside\n this.props.field.enableAutoValidationAndValidate();\n\n this.toggleShow(false);\n } else if (this.isFocused && !isPrevFocused && !this.isIconClicked) {\n // click inside but outside icons\n this.props.field.disableAutoValidation();\n }\n\n this.isIconClicked = false;\n this.isDateRangePickerClicked = false;\n };\n\n handleClickDateRangePicker = () => {\n this.isDateRangePickerClicked = true;\n };\n\n handleClickIcon = () => {\n this.isIconClicked = true;\n\n if (this.showDatePicker) {\n this.props.field.enableAutoValidationAndValidate();\n } else {\n this.props.field.disableAutoValidation();\n }\n\n this.toggleShow();\n };\n\n componentDidMount() {\n window.addEventListener('click', this.handleClickGlobal);\n }\n\n componentWillUnmount() {\n window.removeEventListener('click', this.handleClickGlobal);\n }\n\n handleChange = (event: DateRangePickerChangeEvent) => {\n const value = event.target.value;\n\n if (value.start && value.end && value.start > value.end) {\n [value.start, value.end] = [value.end, value.start];\n }\n\n this.props.field.onChange({ from: value.start ?? undefined, to: value.end ?? undefined });\n };\n\n handleFromChange = (from?: Date) => {\n const to = this.props.field.value ? this.props.field.value.to : undefined;\n\n if (from || to) {\n this.props.field.onChange({ from, to });\n } else {\n this.props.field.onChange(undefined);\n }\n };\n\n handleToChange = (to?: Date) => {\n const from = this.props.field.value ? this.props.field.value.from : undefined;\n\n if (from || to) {\n this.props.field.onChange({ from, to });\n } else {\n this.props.field.onChange(undefined);\n }\n };\n\n render() {\n const { hasError } = this.props.field;\n const {\n 'qa-testing': qaTestingLocator,\n placeHolder,\n inputFormat,\n className,\n calendarComponent,\n headerTitleComponent,\n cellComponent,\n minDate,\n maxDate,\n calendarMinDate,\n calendarMaxDate,\n topView,\n bottomView,\n horizontalAlign,\n disabled = false,\n small,\n maskChar,\n } = this.props;\n\n const value = this.props.field.value ? this.props.field.value : {};\n\n const horizontalAlignClass = classnames({\n [Styles.popupCenter]: horizontalAlign === 'center',\n [Styles.popupRight]: horizontalAlign === 'right',\n });\n\n return (\n <div\n className={classnames(Styles.dateRangePicker, className)}\n ref={this.handleRef}\n onClick={this.handleClickDateRangePicker}\n >\n <DateRangePickerKendo\n className={Styles.dateRangePickerKendo}\n calendarSettings={{\n min: minDate ?? calendarMinDate,\n max: maxDate ?? calendarMaxDate,\n topView,\n bottomView,\n disabled,\n mode: 'range',\n headerTitle: headerTitleComponent,\n cell: cellComponent,\n }}\n popupSettings={{\n appendTo: this.wrapElem,\n className: horizontalAlignClass,\n }}\n startDateInputSettings={{\n tabIndex: -1,\n }}\n endDateInputSettings={{\n tabIndex: -1,\n }}\n show={this.showDatePicker}\n value={{ start: value.from ?? null, end: value.to ?? null }}\n onChange={this.handleChange}\n min={minDate}\n max={maxDate}\n calendar={calendarComponent}\n />\n <Stack alignItems=\"center\" className=\"flex-grow-1\">\n <Stack.Item fill>\n <InputDateMask\n shortLabel={\n <Icon\n name=\"today\"\n className={classnames(\n Styles.icon,\n `${qaTestingLocator}-icon-from`\n )}\n onClick={this.handleClickIcon}\n />\n }\n placeholder={placeHolder}\n value={value.from}\n onChange={this.handleFromChange}\n onBlur={this.handleFromChange}\n error={hasError}\n disabled={disabled}\n qa-testing={`${qaTestingLocator}-from`}\n dateFormat={inputFormat}\n minDate={minDate}\n maxDate={this.maxFromDate}\n small={small}\n maskChar={maskChar}\n />\n </Stack.Item>\n <Icon name=\"arrow_forward\" className={Styles.endLabel} />\n <Stack.Item fill>\n <InputDateMask\n shortLabel={\n <Icon\n name=\"today\"\n className={classnames(\n Styles.icon,\n `${qaTestingLocator}-icon-to`\n )}\n onClick={this.handleClickIcon}\n />\n }\n placeholder={placeHolder}\n value={value.to}\n onChange={this.handleToChange}\n onBlur={this.handleToChange}\n error={hasError}\n disabled={disabled}\n qa-testing={`${qaTestingLocator}-to`}\n dateFormat={inputFormat}\n minDate={this.minToDate}\n maxDate={maxDate}\n small={small}\n maskChar={maskChar}\n />\n </Stack.Item>\n </Stack>\n <input\n hidden\n // eslint-disable-next-line react/no-unknown-property\n qa-testing={qaTestingLocator}\n onChange={this.handleHiddenInputChange}\n />\n </div>\n );\n }\n\n formatDate(date?: Date, inputFormat = 'L') {\n return date ? moment(date).format(inputFormat) : '';\n }\n\n handleHiddenInputChange = (ev: SyntheticEvent<HTMLInputElement>) => {\n const values = ev.currentTarget.value.split('-').map(v => new Date(v));\n this.props.field.onChange({ from: values[0] || undefined, to: values[1] || undefined });\n };\n\n get maxFromDate() {\n const { disableRangeValidation, maxDate, field } = this.props;\n if (disableRangeValidation) {\n return maxDate;\n }\n\n const to = field.value ? field.value.to : undefined;\n\n if (maxDate && to) {\n return maxDate > to ? to : maxDate;\n }\n\n return maxDate ?? to;\n }\n\n get minToDate() {\n const { disableRangeValidation, minDate, field } = this.props;\n if (disableRangeValidation) {\n return minDate;\n }\n\n const from = field.value ? field.value.from : undefined;\n if (minDate && from) {\n return minDate < from ? from : minDate;\n }\n\n return minDate ?? from;\n }\n}\n"],"names":["Component","DateRangePicker","DateRangePickerKendo","Icon","InputDateMask","Stack","observable","action","makeObservable","observer","classnames","moment","Styles","toggleShow","show","showDatePicker","undefined","componentDidMount","window","addEventListener","handleClickGlobal","componentWillUnmount","removeEventListener","render","value","hasError","props","field","qaTestingLocator","placeHolder","inputFormat","className","calendarComponent","headerTitleComponent","cellComponent","minDate","maxDate","calendarMinDate","calendarMaxDate","topView","bottomView","horizontalAlign","disabled","small","maskChar","horizontalAlignClass","popupCenter","popupRight","div","dateRangePicker","ref","handleRef","onClick","handleClickDateRangePicker","dateRangePickerKendo","calendarSettings","min","max","mode","headerTitle","cell","popupSettings","appendTo","wrapElem","startDateInputSettings","tabIndex","endDateInputSettings","start","from","end","to","onChange","handleChange","calendar","alignItems","Item","fill","shortLabel","name","icon","handleClickIcon","placeholder","handleFromChange","onBlur","error","qa-testing","dateFormat","maxFromDate","endLabel","handleToChange","minToDate","input","hidden","handleHiddenInputChange","formatDate","date","format","disableRangeValidation","isFocused","isIconClicked","isDateRangePickerClicked","evt","target","Node","isPrevFocused","enableAutoValidationAndValidate","disableAutoValidation","event","ev","values","currentTarget","split","map","v","Date"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/date-range-picker/date-range-picker.tsx"],"sourcesContent":["import type { ComponentType, SyntheticEvent } from 'react';\nimport { Component } from 'react';\nimport type {\n DateRangePickerChangeEvent,\n CalendarHeaderTitleProps,\n MultiViewCalendarProps,\n CalendarCellProps,\n ActiveView,\n} from '@progress/kendo-react-dateinputs';\nimport { DateRangePicker as DateRangePickerKendo } from '@progress/kendo-react-dateinputs';\nimport { Icon, InputDateMask, Stack } from '@servicetitan/design-system';\nimport type { DateRange } from '@servicetitan/form-state';\nimport { observable, action, makeObservable } from 'mobx';\nimport { observer } from 'mobx-react';\nimport classnames from 'classnames';\nimport moment from 'moment';\nimport * as Styles from './date-range-picker.module.css';\nimport { FieldState } from 'formstate';\n\nexport interface DateRangePickerProps {\n field: FieldState<DateRange | undefined>;\n ['qa-testing']: string;\n placeHolder?: string;\n minDate?: Date;\n maxDate?: Date;\n calendarMinDate?: Date;\n calendarMaxDate?: Date;\n topView?: ActiveView;\n bottomView?: ActiveView;\n className?: string;\n calendarComponent?: ComponentType<MultiViewCalendarProps>;\n headerTitleComponent?: ComponentType<CalendarHeaderTitleProps>;\n cellComponent?: ComponentType<CalendarCellProps>;\n inputFormat?: string;\n horizontalAlign?: 'left' | 'center' | 'right';\n disabled?: boolean;\n small?: boolean;\n disableRangeValidation?: boolean;\n maskChar?: string;\n}\n\n@observer\nexport class DateRangePicker extends Component<DateRangePickerProps> {\n // `HTMLDivElement` leads to issues with Node/SSR\n @observable wrapElem?: any; /* HTMLDivElement */\n isFocused = false;\n @observable showDatePicker = false;\n isIconClicked = false;\n isDateRangePickerClicked = false;\n\n constructor(props: DateRangePickerProps) {\n super(props);\n makeObservable(this);\n }\n\n @action\n handleRef = (wrapElem: HTMLDivElement) => {\n this.wrapElem = wrapElem;\n };\n\n @action\n toggleShow(show?: boolean) {\n this.showDatePicker = show !== undefined ? show : !this.showDatePicker;\n }\n\n handleClickGlobal = (evt: Event) => {\n if (!(evt.target instanceof Node)) {\n return;\n }\n\n const isPrevFocused = this.isFocused;\n\n this.isFocused = this.isDateRangePickerClicked;\n\n if (!this.isFocused && isPrevFocused) {\n // click outside\n this.props.field.enableAutoValidationAndValidate();\n\n this.toggleShow(false);\n } else if (this.isFocused && !isPrevFocused && !this.isIconClicked) {\n // click inside but outside icons\n this.props.field.disableAutoValidation();\n }\n\n this.isIconClicked = false;\n this.isDateRangePickerClicked = false;\n };\n\n handleClickDateRangePicker = () => {\n this.isDateRangePickerClicked = true;\n };\n\n handleClickIcon = () => {\n this.isIconClicked = true;\n\n if (this.showDatePicker) {\n this.props.field.enableAutoValidationAndValidate();\n } else {\n this.props.field.disableAutoValidation();\n }\n\n this.toggleShow();\n };\n\n componentDidMount() {\n window.addEventListener('click', this.handleClickGlobal);\n }\n\n componentWillUnmount() {\n window.removeEventListener('click', this.handleClickGlobal);\n }\n\n handleChange = (event: DateRangePickerChangeEvent) => {\n const value = event.target.value;\n\n if (value.start && value.end && value.start > value.end) {\n [value.start, value.end] = [value.end, value.start];\n }\n\n this.props.field.onChange({ from: value.start ?? undefined, to: value.end ?? undefined });\n };\n\n handleFromChange = (from?: Date) => {\n const to = this.props.field.value ? this.props.field.value.to : undefined;\n\n if (from || to) {\n this.props.field.onChange({ from, to });\n } else {\n this.props.field.onChange(undefined);\n }\n };\n\n handleToChange = (to?: Date) => {\n const from = this.props.field.value ? this.props.field.value.from : undefined;\n\n if (from || to) {\n this.props.field.onChange({ from, to });\n } else {\n this.props.field.onChange(undefined);\n }\n };\n\n render() {\n const { hasError } = this.props.field;\n const {\n 'qa-testing': qaTestingLocator,\n placeHolder,\n inputFormat,\n className,\n calendarComponent,\n headerTitleComponent,\n cellComponent,\n minDate,\n maxDate,\n calendarMinDate,\n calendarMaxDate,\n topView,\n bottomView,\n horizontalAlign,\n disabled = false,\n small,\n maskChar,\n } = this.props;\n\n const value = this.props.field.value ? this.props.field.value : {};\n\n const horizontalAlignClass = classnames({\n [Styles.popupCenter]: horizontalAlign === 'center',\n [Styles.popupRight]: horizontalAlign === 'right',\n });\n\n return (\n <div\n className={classnames(Styles.dateRangePicker, className)}\n ref={this.handleRef}\n onClick={this.handleClickDateRangePicker}\n >\n <DateRangePickerKendo\n className={Styles.dateRangePickerKendo}\n calendarSettings={{\n min: minDate ?? calendarMinDate,\n max: maxDate ?? calendarMaxDate,\n topView,\n bottomView,\n disabled,\n mode: 'range',\n headerTitle: headerTitleComponent,\n cell: cellComponent,\n }}\n popupSettings={{\n appendTo: this.wrapElem,\n className: horizontalAlignClass,\n }}\n startDateInputSettings={{\n tabIndex: -1,\n }}\n endDateInputSettings={{\n tabIndex: -1,\n }}\n show={this.showDatePicker}\n value={{ start: value.from ?? null, end: value.to ?? null }}\n onChange={this.handleChange}\n min={minDate}\n max={maxDate}\n calendar={calendarComponent}\n />\n <Stack alignItems=\"center\" className=\"flex-grow-1\">\n <Stack.Item fill>\n <InputDateMask\n shortLabel={\n <Icon\n name=\"today\"\n className={classnames(\n Styles.icon,\n `${qaTestingLocator}-icon-from`\n )}\n onClick={this.handleClickIcon}\n />\n }\n placeholder={placeHolder}\n value={value.from}\n onChange={this.handleFromChange}\n onBlur={this.handleFromChange}\n error={hasError}\n disabled={disabled}\n qa-testing={`${qaTestingLocator}-from`}\n dateFormat={inputFormat}\n minDate={minDate}\n maxDate={this.maxFromDate}\n small={small}\n maskChar={maskChar}\n />\n </Stack.Item>\n <Icon name=\"arrow_forward\" className={Styles.endLabel} />\n <Stack.Item fill>\n <InputDateMask\n shortLabel={\n <Icon\n name=\"today\"\n className={classnames(\n Styles.icon,\n `${qaTestingLocator}-icon-to`\n )}\n onClick={this.handleClickIcon}\n />\n }\n placeholder={placeHolder}\n value={value.to}\n onChange={this.handleToChange}\n onBlur={this.handleToChange}\n error={hasError}\n disabled={disabled}\n qa-testing={`${qaTestingLocator}-to`}\n dateFormat={inputFormat}\n minDate={this.minToDate}\n maxDate={maxDate}\n small={small}\n maskChar={maskChar}\n />\n </Stack.Item>\n </Stack>\n <input\n hidden\n // eslint-disable-next-line react/no-unknown-property\n qa-testing={qaTestingLocator}\n onChange={this.handleHiddenInputChange}\n />\n </div>\n );\n }\n\n formatDate(date?: Date, inputFormat = 'L') {\n return date ? moment(date).format(inputFormat) : '';\n }\n\n handleHiddenInputChange = (ev: SyntheticEvent<HTMLInputElement>) => {\n const values = ev.currentTarget.value.split('-').map(v => new Date(v));\n this.props.field.onChange({ from: values[0] || undefined, to: values[1] || undefined });\n };\n\n get maxFromDate() {\n const { disableRangeValidation, maxDate, field } = this.props;\n if (disableRangeValidation) {\n return maxDate;\n }\n\n const to = field.value ? field.value.to : undefined;\n\n if (maxDate && to) {\n return maxDate > to ? to : maxDate;\n }\n\n return maxDate ?? to;\n }\n\n get minToDate() {\n const { disableRangeValidation, minDate, field } = this.props;\n if (disableRangeValidation) {\n return minDate;\n }\n\n const from = field.value ? field.value.from : undefined;\n if (minDate && from) {\n return minDate < from ? from : minDate;\n }\n\n return minDate ?? from;\n }\n}\n"],"names":["Component","DateRangePicker","DateRangePickerKendo","Icon","InputDateMask","Stack","observable","action","makeObservable","observer","classnames","moment","Styles","toggleShow","show","showDatePicker","undefined","componentDidMount","window","addEventListener","handleClickGlobal","componentWillUnmount","removeEventListener","render","value","hasError","props","field","qaTestingLocator","placeHolder","inputFormat","className","calendarComponent","headerTitleComponent","cellComponent","minDate","maxDate","calendarMinDate","calendarMaxDate","topView","bottomView","horizontalAlign","disabled","small","maskChar","horizontalAlignClass","popupCenter","popupRight","div","dateRangePicker","ref","handleRef","onClick","handleClickDateRangePicker","dateRangePickerKendo","calendarSettings","min","max","mode","headerTitle","cell","popupSettings","appendTo","wrapElem","startDateInputSettings","tabIndex","endDateInputSettings","start","from","end","to","onChange","handleChange","calendar","alignItems","Item","fill","shortLabel","name","icon","handleClickIcon","placeholder","handleFromChange","onBlur","error","qa-testing","dateFormat","maxFromDate","endLabel","handleToChange","minToDate","input","hidden","handleHiddenInputChange","formatDate","date","format","disableRangeValidation","isFocused","isIconClicked","isDateRangePickerClicked","evt","target","Node","isPrevFocused","enableAutoValidationAndValidate","disableAutoValidation","event","ev","values","currentTarget","split","map","v","Date"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { FC } from 'react';
1
+ import type { FC } from 'react';
2
2
  export declare const ColorPickerExample: FC;
3
3
  //# sourceMappingURL=color-picker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"color-picker.d.ts","sourceRoot":"","sources":["../../src/demo/color-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,EAAE,EAAE,MAAM,OAAO,CAAC;AA+BtD,eAAO,MAAM,kBAAkB,EAAE,EAsB/B,CAAC"}
1
+ {"version":3,"file":"color-picker.d.ts","sourceRoot":"","sources":["../../src/demo/color-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAiChC,eAAO,MAAM,kBAAkB,EAAE,EAsB/B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/demo/color-picker.tsx"],"sourcesContent":["import { Fragment, useRef, useMemo, FC } from 'react';\n\nimport { observer } from 'mobx-react';\n\nimport { Text, Card, Tag } from '@servicetitan/design-system';\n\nimport { ColorPicker, ColorPickerPreviewProps } from '..';\n\nimport { FieldState } from 'formstate';\n\ninterface PreviewProps extends ColorPickerPreviewProps {\n label: string;\n}\n\nconst Preview: FC<PreviewProps> = ({ color, label }) => (\n <Fragment>\n <Text size={2} className=\"m-t-3 m-b-1\">\n Preview\n </Text>\n <Card light padding=\"none\">\n <Tag color={color} className=\"m-1-i\">\n {label}\n </Tag>\n </Card>\n </Fragment>\n);\n\nfunction useColorField<T extends string | undefined>(initial: T) {\n return useRef(new FieldState(initial)).current;\n}\n\nexport const ColorPickerExample: FC = observer(() => {\n const defaultField = useColorField<string | undefined>(undefined);\n\n const preview: FC<ColorPickerPreviewProps> = useMemo(\n () =>\n ({ color }) => <Preview label=\"Confirmed Appointment\" color={color} />,\n []\n );\n\n return (\n <Fragment>\n <Text size={4} className=\"m-b-half\">\n Default\n </Text>\n <ColorPicker\n label=\"Tag Color\"\n value={defaultField.value}\n onChange={defaultField.onChange}\n preview={preview}\n />\n </Fragment>\n );\n});\n"],"names":["Fragment","useRef","useMemo","observer","Text","Card","Tag","ColorPicker","FieldState","Preview","color","label","size","className","light","padding","useColorField","initial","current","ColorPickerExample","defaultField","undefined","preview","value","onChange"],"mappings":";AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,OAAO,QAAY,QAAQ;AAEtD,SAASC,QAAQ,QAAQ,aAAa;AAEtC,SAASC,IAAI,EAAEC,IAAI,EAAEC,GAAG,QAAQ,8BAA8B;AAE9D,SAASC,WAAW,QAAiC,KAAK;AAE1D,SAASC,UAAU,QAAQ,YAAY;AAMvC,MAAMC,UAA4B,CAAC,EAAEC,KAAK,EAAEC,KAAK,EAAE,iBAC/C,MAACX;;0BACG,KAACI;gBAAKQ,MAAM;gBAAGC,WAAU;0BAAc;;0BAGvC,KAACR;gBAAKS,KAAK;gBAACC,SAAQ;0BAChB,cAAA,KAACT;oBAAII,OAAOA;oBAAOG,WAAU;8BACxBF;;;;;AAMjB,SAASK,cAA4CC,OAAU;IAC3D,OAAOhB,OAAO,IAAIO,WAAWS,UAAUC,OAAO;AAClD;AAEA,OAAO,MAAMC,qBAAyBhB,SAAS;IAC3C,MAAMiB,eAAeJ,cAAkCK;IAEvD,MAAMC,UAAuCpB,QACzC,IACI,CAAC,EAAEQ,KAAK,EAAE,iBAAK,KAACD;gBAAQE,OAAM;gBAAwBD,OAAOA;gBACjE,EAAE;IAGN,qBACI,MAACV;;0BACG,KAACI;gBAAKQ,MAAM;gBAAGC,WAAU;0BAAW;;0BAGpC,KAACN;gBACGI,OAAM;gBACNY,OAAOH,aAAaG,KAAK;gBACzBC,UAAUJ,aAAaI,QAAQ;gBAC/BF,SAASA;;;;AAIzB,GAAG"}
1
+ {"version":3,"sources":["../../src/demo/color-picker.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { Fragment, useRef, useMemo } from 'react';\n\nimport { observer } from 'mobx-react';\n\nimport { Text, Card, Tag } from '@servicetitan/design-system';\n\nimport type { ColorPickerPreviewProps } from '..';\nimport { ColorPicker } from '..';\n\nimport { FieldState } from 'formstate';\n\ninterface PreviewProps extends ColorPickerPreviewProps {\n label: string;\n}\n\nconst Preview: FC<PreviewProps> = ({ color, label }) => (\n <Fragment>\n <Text size={2} className=\"m-t-3 m-b-1\">\n Preview\n </Text>\n <Card light padding=\"none\">\n <Tag color={color} className=\"m-1-i\">\n {label}\n </Tag>\n </Card>\n </Fragment>\n);\n\nfunction useColorField<T extends string | undefined>(initial: T) {\n return useRef(new FieldState(initial)).current;\n}\n\nexport const ColorPickerExample: FC = observer(() => {\n const defaultField = useColorField<string | undefined>(undefined);\n\n const preview: FC<ColorPickerPreviewProps> = useMemo(\n () =>\n ({ color }) => <Preview label=\"Confirmed Appointment\" color={color} />,\n []\n );\n\n return (\n <Fragment>\n <Text size={4} className=\"m-b-half\">\n Default\n </Text>\n <ColorPicker\n label=\"Tag Color\"\n value={defaultField.value}\n onChange={defaultField.onChange}\n preview={preview}\n />\n </Fragment>\n );\n});\n"],"names":["Fragment","useRef","useMemo","observer","Text","Card","Tag","ColorPicker","FieldState","Preview","color","label","size","className","light","padding","useColorField","initial","current","ColorPickerExample","defaultField","undefined","preview","value","onChange"],"mappings":";AACA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,OAAO,QAAQ,QAAQ;AAElD,SAASC,QAAQ,QAAQ,aAAa;AAEtC,SAASC,IAAI,EAAEC,IAAI,EAAEC,GAAG,QAAQ,8BAA8B;AAG9D,SAASC,WAAW,QAAQ,KAAK;AAEjC,SAASC,UAAU,QAAQ,YAAY;AAMvC,MAAMC,UAA4B,CAAC,EAAEC,KAAK,EAAEC,KAAK,EAAE,iBAC/C,MAACX;;0BACG,KAACI;gBAAKQ,MAAM;gBAAGC,WAAU;0BAAc;;0BAGvC,KAACR;gBAAKS,KAAK;gBAACC,SAAQ;0BAChB,cAAA,KAACT;oBAAII,OAAOA;oBAAOG,WAAU;8BACxBF;;;;;AAMjB,SAASK,cAA4CC,OAAU;IAC3D,OAAOhB,OAAO,IAAIO,WAAWS,UAAUC,OAAO;AAClD;AAEA,OAAO,MAAMC,qBAAyBhB,SAAS;IAC3C,MAAMiB,eAAeJ,cAAkCK;IAEvD,MAAMC,UAAuCpB,QACzC,IACI,CAAC,EAAEQ,KAAK,EAAE,iBAAK,KAACD;gBAAQE,OAAM;gBAAwBD,OAAOA;gBACjE,EAAE;IAGN,qBACI,MAACV;;0BACG,KAACI;gBAAKQ,MAAM;gBAAGC,WAAU;0BAAW;;0BAGpC,KAACN;gBACGI,OAAM;gBACNY,OAAOH,aAAaG,KAAK;gBACzBC,UAAUJ,aAAaI,QAAQ;gBAC/BF,SAASA;;;;AAIzB,GAAG"}
@@ -1,3 +1,3 @@
1
- import { FC } from 'react';
1
+ import type { FC } from 'react';
2
2
  export declare const DateRangePickerExample: FC;
3
3
  //# sourceMappingURL=date-range-picker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"date-range-picker.d.ts","sourceRoot":"","sources":["../../src/demo/date-range-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoB,EAAE,EAAE,MAAM,OAAO,CAAC;AAe7C,eAAO,MAAM,sBAAsB,EAAE,EAiBnC,CAAC"}
1
+ {"version":3,"file":"date-range-picker.d.ts","sourceRoot":"","sources":["../../src/demo/date-range-picker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAgBhC,eAAO,MAAM,sBAAsB,EAAE,EAiBnC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/demo/date-range-picker.tsx"],"sourcesContent":["import { Fragment, useRef, FC } from 'react';\n\nimport { observer } from 'mobx-react';\n\nimport { Text } from '@servicetitan/design-system';\nimport { DateRange } from '@servicetitan/form-state';\n\nimport { DateRangePicker } from '..';\n\nimport { FieldState } from 'formstate';\n\nfunction useDateRangeField<T extends DateRange | undefined>(initial: T) {\n return useRef(new FieldState(initial)).current;\n}\n\nexport const DateRangePickerExample: FC = observer(() => {\n const defaultField = useDateRangeField<DateRange | undefined>(undefined);\n\n return (\n <Fragment>\n <Text size={4} className=\"m-b-half\">\n Default\n </Text>\n <DateRangePicker\n maskChar=\"X\"\n field={defaultField}\n qa-testing=\"qa-date-range-picker\"\n horizontalAlign=\"right\"\n small\n />\n </Fragment>\n );\n});\n"],"names":["Fragment","useRef","observer","Text","DateRangePicker","FieldState","useDateRangeField","initial","current","DateRangePickerExample","defaultField","undefined","size","className","maskChar","field","qa-testing","horizontalAlign","small"],"mappings":";AAAA,SAASA,QAAQ,EAAEC,MAAM,QAAY,QAAQ;AAE7C,SAASC,QAAQ,QAAQ,aAAa;AAEtC,SAASC,IAAI,QAAQ,8BAA8B;AAGnD,SAASC,eAAe,QAAQ,KAAK;AAErC,SAASC,UAAU,QAAQ,YAAY;AAEvC,SAASC,kBAAmDC,OAAU;IAClE,OAAON,OAAO,IAAII,WAAWE,UAAUC,OAAO;AAClD;AAEA,OAAO,MAAMC,yBAA6BP,SAAS;IAC/C,MAAMQ,eAAeJ,kBAAyCK;IAE9D,qBACI,MAACX;;0BACG,KAACG;gBAAKS,MAAM;gBAAGC,WAAU;0BAAW;;0BAGpC,KAACT;gBACGU,UAAS;gBACTC,OAAOL;gBACPM,cAAW;gBACXC,iBAAgB;gBAChBC,KAAK;;;;AAIrB,GAAG"}
1
+ {"version":3,"sources":["../../src/demo/date-range-picker.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { Fragment, useRef } from 'react';\n\nimport { observer } from 'mobx-react';\n\nimport { Text } from '@servicetitan/design-system';\nimport type { DateRange } from '@servicetitan/form-state';\n\nimport { DateRangePicker } from '..';\n\nimport { FieldState } from 'formstate';\n\nfunction useDateRangeField<T extends DateRange | undefined>(initial: T) {\n return useRef(new FieldState(initial)).current;\n}\n\nexport const DateRangePickerExample: FC = observer(() => {\n const defaultField = useDateRangeField<DateRange | undefined>(undefined);\n\n return (\n <Fragment>\n <Text size={4} className=\"m-b-half\">\n Default\n </Text>\n <DateRangePicker\n maskChar=\"X\"\n field={defaultField}\n qa-testing=\"qa-date-range-picker\"\n horizontalAlign=\"right\"\n small\n />\n </Fragment>\n );\n});\n"],"names":["Fragment","useRef","observer","Text","DateRangePicker","FieldState","useDateRangeField","initial","current","DateRangePickerExample","defaultField","undefined","size","className","maskChar","field","qa-testing","horizontalAlign","small"],"mappings":";AACA,SAASA,QAAQ,EAAEC,MAAM,QAAQ,QAAQ;AAEzC,SAASC,QAAQ,QAAQ,aAAa;AAEtC,SAASC,IAAI,QAAQ,8BAA8B;AAGnD,SAASC,eAAe,QAAQ,KAAK;AAErC,SAASC,UAAU,QAAQ,YAAY;AAEvC,SAASC,kBAAmDC,OAAU;IAClE,OAAON,OAAO,IAAII,WAAWE,UAAUC,OAAO;AAClD;AAEA,OAAO,MAAMC,yBAA6BP,SAAS;IAC/C,MAAMQ,eAAeJ,kBAAyCK;IAE9D,qBACI,MAACX;;0BACG,KAACG;gBAAKS,MAAM;gBAAGC,WAAU;0BAAW;;0BAGpC,KAACT;gBACGU,UAAS;gBACTC,OAAOL;gBACPM,cAAW;gBACXC,iBAAgB;gBAChBC,KAAK;;;;AAIrB,GAAG"}
@@ -1,3 +1,3 @@
1
- import { FC } from 'react';
1
+ import type { FC } from 'react';
2
2
  export declare const FileUploaderExample: FC;
3
3
  //# sourceMappingURL=file-uploader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-uploader.d.ts","sourceRoot":"","sources":["../../src/demo/file-uploader.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoB,EAAE,EAAE,MAAM,OAAO,CAAC;AAW7C,eAAO,MAAM,mBAAmB,EAAE,EA8EhC,CAAC"}
1
+ {"version":3,"file":"file-uploader.d.ts","sourceRoot":"","sources":["../../src/demo/file-uploader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAahC,eAAO,MAAM,mBAAmB,EAAE,EA8EhC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/demo/file-uploader.tsx"],"sourcesContent":["import { useRef, Fragment, FC } from 'react';\nimport { observer } from 'mobx-react';\nimport { BodyText } from '@servicetitan/design-system';\nimport { FileUploader, FileUploaderConfigurationProvider, FileDescriptor } from '..';\n\nimport { FieldState } from 'formstate';\n\nfunction useFilesField(initial: FileDescriptor[]) {\n return useRef(new FieldState(initial)).current;\n}\n\nexport const FileUploaderExample: FC = observer(() => {\n const defaultField = useFilesField([]);\n\n const multipleField = useFilesField([\n { file: 'multiple-1.png' },\n { file: 'multiple-2.png' },\n { file: 'multiple-3.png' },\n ]);\n\n const displayField = useFilesField([{ file: 'display.png' }]);\n\n const customField = useFilesField([]);\n const withExtensionValidation = useFilesField([]);\n\n return (\n <Fragment>\n <BodyText size=\"large\" className=\"m-b-half\">\n Default\n </BodyText>\n <FileUploader\n value={defaultField.value}\n onChange={defaultField.onChange}\n folderName=\"test\"\n />\n\n <BodyText size=\"large\" className=\"m-t-4 m-b-half\">\n Multiple mode\n </BodyText>\n <FileUploader\n value={multipleField.value}\n onChange={multipleField.onChange}\n folderName=\"test\"\n multiple\n />\n\n <BodyText size=\"large\" className=\"m-t-4 m-b-half\">\n Display mode\n </BodyText>\n <FileUploader value={displayField.value} folderName=\"test\" multiple />\n\n <BodyText size=\"large\" className=\"m-t-4 m-b-half\">\n Custom configuration\n </BodyText>\n <FileUploaderConfigurationProvider\n value={{\n target: '/Custom/Upload/Url',\n }}\n >\n <FileUploader\n value={customField.value}\n onChange={customField.onChange}\n folderName=\"test\"\n multiple\n config={{\n simultaneousUploads: 3,\n }}\n />\n </FileUploaderConfigurationProvider>\n\n <BodyText size=\"large\" className=\"m-t-4 m-b-half\">\n With file extension validation{' '}\n <BodyText inline el=\"span\">\n Try uploading not png\n </BodyText>\n </BodyText>\n\n <FileUploader\n value={withExtensionValidation.value}\n onChange={withExtensionValidation.onChange}\n folderName=\"test\"\n multiple\n config={{\n simultaneousUploads: 3,\n fileType: ['png'],\n }}\n />\n </Fragment>\n );\n});\n"],"names":["useRef","Fragment","observer","BodyText","FileUploader","FileUploaderConfigurationProvider","FieldState","useFilesField","initial","current","FileUploaderExample","defaultField","multipleField","file","displayField","customField","withExtensionValidation","size","className","value","onChange","folderName","multiple","target","config","simultaneousUploads","inline","el","fileType"],"mappings":";AAAA,SAASA,MAAM,EAAEC,QAAQ,QAAY,QAAQ;AAC7C,SAASC,QAAQ,QAAQ,aAAa;AACtC,SAASC,QAAQ,QAAQ,8BAA8B;AACvD,SAASC,YAAY,EAAEC,iCAAiC,QAAwB,KAAK;AAErF,SAASC,UAAU,QAAQ,YAAY;AAEvC,SAASC,cAAcC,OAAyB;IAC5C,OAAOR,OAAO,IAAIM,WAAWE,UAAUC,OAAO;AAClD;AAEA,OAAO,MAAMC,sBAA0BR,SAAS;IAC5C,MAAMS,eAAeJ,cAAc,EAAE;IAErC,MAAMK,gBAAgBL,cAAc;QAChC;YAAEM,MAAM;QAAiB;QACzB;YAAEA,MAAM;QAAiB;QACzB;YAAEA,MAAM;QAAiB;KAC5B;IAED,MAAMC,eAAeP,cAAc;QAAC;YAAEM,MAAM;QAAc;KAAE;IAE5D,MAAME,cAAcR,cAAc,EAAE;IACpC,MAAMS,0BAA0BT,cAAc,EAAE;IAEhD,qBACI,MAACN;;0BACG,KAACE;gBAASc,MAAK;gBAAQC,WAAU;0BAAW;;0BAG5C,KAACd;gBACGe,OAAOR,aAAaQ,KAAK;gBACzBC,UAAUT,aAAaS,QAAQ;gBAC/BC,YAAW;;0BAGf,KAAClB;gBAASc,MAAK;gBAAQC,WAAU;0BAAiB;;0BAGlD,KAACd;gBACGe,OAAOP,cAAcO,KAAK;gBAC1BC,UAAUR,cAAcQ,QAAQ;gBAChCC,YAAW;gBACXC,QAAQ;;0BAGZ,KAACnB;gBAASc,MAAK;gBAAQC,WAAU;0BAAiB;;0BAGlD,KAACd;gBAAae,OAAOL,aAAaK,KAAK;gBAAEE,YAAW;gBAAOC,QAAQ;;0BAEnE,KAACnB;gBAASc,MAAK;gBAAQC,WAAU;0BAAiB;;0BAGlD,KAACb;gBACGc,OAAO;oBACHI,QAAQ;gBACZ;0BAEA,cAAA,KAACnB;oBACGe,OAAOJ,YAAYI,KAAK;oBACxBC,UAAUL,YAAYK,QAAQ;oBAC9BC,YAAW;oBACXC,QAAQ;oBACRE,QAAQ;wBACJC,qBAAqB;oBACzB;;;0BAIR,MAACtB;gBAASc,MAAK;gBAAQC,WAAU;;oBAAiB;oBACf;kCAC/B,KAACf;wBAASuB,MAAM;wBAACC,IAAG;kCAAO;;;;0BAK/B,KAACvB;gBACGe,OAAOH,wBAAwBG,KAAK;gBACpCC,UAAUJ,wBAAwBI,QAAQ;gBAC1CC,YAAW;gBACXC,QAAQ;gBACRE,QAAQ;oBACJC,qBAAqB;oBACrBG,UAAU;wBAAC;qBAAM;gBACrB;;;;AAIhB,GAAG"}
1
+ {"version":3,"sources":["../../src/demo/file-uploader.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useRef, Fragment } from 'react';\nimport { observer } from 'mobx-react';\nimport { BodyText } from '@servicetitan/design-system';\nimport type { FileDescriptor } from '..';\nimport { FileUploader, FileUploaderConfigurationProvider } from '..';\n\nimport { FieldState } from 'formstate';\n\nfunction useFilesField(initial: FileDescriptor[]) {\n return useRef(new FieldState(initial)).current;\n}\n\nexport const FileUploaderExample: FC = observer(() => {\n const defaultField = useFilesField([]);\n\n const multipleField = useFilesField([\n { file: 'multiple-1.png' },\n { file: 'multiple-2.png' },\n { file: 'multiple-3.png' },\n ]);\n\n const displayField = useFilesField([{ file: 'display.png' }]);\n\n const customField = useFilesField([]);\n const withExtensionValidation = useFilesField([]);\n\n return (\n <Fragment>\n <BodyText size=\"large\" className=\"m-b-half\">\n Default\n </BodyText>\n <FileUploader\n value={defaultField.value}\n onChange={defaultField.onChange}\n folderName=\"test\"\n />\n\n <BodyText size=\"large\" className=\"m-t-4 m-b-half\">\n Multiple mode\n </BodyText>\n <FileUploader\n value={multipleField.value}\n onChange={multipleField.onChange}\n folderName=\"test\"\n multiple\n />\n\n <BodyText size=\"large\" className=\"m-t-4 m-b-half\">\n Display mode\n </BodyText>\n <FileUploader value={displayField.value} folderName=\"test\" multiple />\n\n <BodyText size=\"large\" className=\"m-t-4 m-b-half\">\n Custom configuration\n </BodyText>\n <FileUploaderConfigurationProvider\n value={{\n target: '/Custom/Upload/Url',\n }}\n >\n <FileUploader\n value={customField.value}\n onChange={customField.onChange}\n folderName=\"test\"\n multiple\n config={{\n simultaneousUploads: 3,\n }}\n />\n </FileUploaderConfigurationProvider>\n\n <BodyText size=\"large\" className=\"m-t-4 m-b-half\">\n With file extension validation{' '}\n <BodyText inline el=\"span\">\n Try uploading not png\n </BodyText>\n </BodyText>\n\n <FileUploader\n value={withExtensionValidation.value}\n onChange={withExtensionValidation.onChange}\n folderName=\"test\"\n multiple\n config={{\n simultaneousUploads: 3,\n fileType: ['png'],\n }}\n />\n </Fragment>\n );\n});\n"],"names":["useRef","Fragment","observer","BodyText","FileUploader","FileUploaderConfigurationProvider","FieldState","useFilesField","initial","current","FileUploaderExample","defaultField","multipleField","file","displayField","customField","withExtensionValidation","size","className","value","onChange","folderName","multiple","target","config","simultaneousUploads","inline","el","fileType"],"mappings":";AACA,SAASA,MAAM,EAAEC,QAAQ,QAAQ,QAAQ;AACzC,SAASC,QAAQ,QAAQ,aAAa;AACtC,SAASC,QAAQ,QAAQ,8BAA8B;AAEvD,SAASC,YAAY,EAAEC,iCAAiC,QAAQ,KAAK;AAErE,SAASC,UAAU,QAAQ,YAAY;AAEvC,SAASC,cAAcC,OAAyB;IAC5C,OAAOR,OAAO,IAAIM,WAAWE,UAAUC,OAAO;AAClD;AAEA,OAAO,MAAMC,sBAA0BR,SAAS;IAC5C,MAAMS,eAAeJ,cAAc,EAAE;IAErC,MAAMK,gBAAgBL,cAAc;QAChC;YAAEM,MAAM;QAAiB;QACzB;YAAEA,MAAM;QAAiB;QACzB;YAAEA,MAAM;QAAiB;KAC5B;IAED,MAAMC,eAAeP,cAAc;QAAC;YAAEM,MAAM;QAAc;KAAE;IAE5D,MAAME,cAAcR,cAAc,EAAE;IACpC,MAAMS,0BAA0BT,cAAc,EAAE;IAEhD,qBACI,MAACN;;0BACG,KAACE;gBAASc,MAAK;gBAAQC,WAAU;0BAAW;;0BAG5C,KAACd;gBACGe,OAAOR,aAAaQ,KAAK;gBACzBC,UAAUT,aAAaS,QAAQ;gBAC/BC,YAAW;;0BAGf,KAAClB;gBAASc,MAAK;gBAAQC,WAAU;0BAAiB;;0BAGlD,KAACd;gBACGe,OAAOP,cAAcO,KAAK;gBAC1BC,UAAUR,cAAcQ,QAAQ;gBAChCC,YAAW;gBACXC,QAAQ;;0BAGZ,KAACnB;gBAASc,MAAK;gBAAQC,WAAU;0BAAiB;;0BAGlD,KAACd;gBAAae,OAAOL,aAAaK,KAAK;gBAAEE,YAAW;gBAAOC,QAAQ;;0BAEnE,KAACnB;gBAASc,MAAK;gBAAQC,WAAU;0BAAiB;;0BAGlD,KAACb;gBACGc,OAAO;oBACHI,QAAQ;gBACZ;0BAEA,cAAA,KAACnB;oBACGe,OAAOJ,YAAYI,KAAK;oBACxBC,UAAUL,YAAYK,QAAQ;oBAC9BC,YAAW;oBACXC,QAAQ;oBACRE,QAAQ;wBACJC,qBAAqB;oBACzB;;;0BAIR,MAACtB;gBAASc,MAAK;gBAAQC,WAAU;;oBAAiB;oBACf;kCAC/B,KAACf;wBAASuB,MAAM;wBAACC,IAAG;kCAAO;;;;0BAK/B,KAACvB;gBACGe,OAAOH,wBAAwBG,KAAK;gBACpCC,UAAUJ,wBAAwBI,QAAQ;gBAC1CC,YAAW;gBACXC,QAAQ;gBACRE,QAAQ;oBACJC,qBAAqB;oBACrBG,UAAU;wBAAC;qBAAM;gBACrB;;;;AAIhB,GAAG"}
@@ -1,3 +1,3 @@
1
- import { FC } from 'react';
1
+ import type { FC } from 'react';
2
2
  export declare const InputDateMaskExample: FC;
3
3
  //# sourceMappingURL=input-date-mask.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"input-date-mask.d.ts","sourceRoot":"","sources":["../../src/demo/input-date-mask.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAoB,MAAM,OAAO,CAAC;AAa7C,eAAO,MAAM,oBAAoB,EAAE,EAejC,CAAC"}
1
+ {"version":3,"file":"input-date-mask.d.ts","sourceRoot":"","sources":["../../src/demo/input-date-mask.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAchC,eAAO,MAAM,oBAAoB,EAAE,EAejC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/demo/input-date-mask.tsx"],"sourcesContent":["import { FC, Fragment, useRef } from 'react';\n\nimport { observer } from 'mobx-react';\n\nimport { Text, Icon } from '@servicetitan/design-system';\nimport { FieldState } from 'formstate';\n\nimport { InputDateMask } from '..';\n\nfunction useInputDateMaskField<T extends Date | undefined>(initial: T) {\n return useRef(new FieldState(initial)).current;\n}\n\nexport const InputDateMaskExample: FC = observer(() => {\n const defaultField = useInputDateMaskField(undefined);\n\n return (\n <Fragment>\n <Text size={4} className=\"m-b-half\">\n Default\n </Text>\n <InputDateMask\n value={defaultField.value}\n onChange={defaultField.onChange}\n shortLabel={<Icon name=\"event\" />}\n />\n </Fragment>\n );\n});\n"],"names":["Fragment","useRef","observer","Text","Icon","FieldState","InputDateMask","useInputDateMaskField","initial","current","InputDateMaskExample","defaultField","undefined","size","className","value","onChange","shortLabel","name"],"mappings":";AAAA,SAAaA,QAAQ,EAAEC,MAAM,QAAQ,QAAQ;AAE7C,SAASC,QAAQ,QAAQ,aAAa;AAEtC,SAASC,IAAI,EAAEC,IAAI,QAAQ,8BAA8B;AACzD,SAASC,UAAU,QAAQ,YAAY;AAEvC,SAASC,aAAa,QAAQ,KAAK;AAEnC,SAASC,sBAAkDC,OAAU;IACjE,OAAOP,OAAO,IAAII,WAAWG,UAAUC,OAAO;AAClD;AAEA,OAAO,MAAMC,uBAA2BR,SAAS;IAC7C,MAAMS,eAAeJ,sBAAsBK;IAE3C,qBACI,MAACZ;;0BACG,KAACG;gBAAKU,MAAM;gBAAGC,WAAU;0BAAW;;0BAGpC,KAACR;gBACGS,OAAOJ,aAAaI,KAAK;gBACzBC,UAAUL,aAAaK,QAAQ;gBAC/BC,0BAAY,KAACb;oBAAKc,MAAK;;;;;AAIvC,GAAG"}
1
+ {"version":3,"sources":["../../src/demo/input-date-mask.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { Fragment, useRef } from 'react';\n\nimport { observer } from 'mobx-react';\n\nimport { Text, Icon } from '@servicetitan/design-system';\nimport { FieldState } from 'formstate';\n\nimport { InputDateMask } from '..';\n\nfunction useInputDateMaskField<T extends Date | undefined>(initial: T) {\n return useRef(new FieldState(initial)).current;\n}\n\nexport const InputDateMaskExample: FC = observer(() => {\n const defaultField = useInputDateMaskField(undefined);\n\n return (\n <Fragment>\n <Text size={4} className=\"m-b-half\">\n Default\n </Text>\n <InputDateMask\n value={defaultField.value}\n onChange={defaultField.onChange}\n shortLabel={<Icon name=\"event\" />}\n />\n </Fragment>\n );\n});\n"],"names":["Fragment","useRef","observer","Text","Icon","FieldState","InputDateMask","useInputDateMaskField","initial","current","InputDateMaskExample","defaultField","undefined","size","className","value","onChange","shortLabel","name"],"mappings":";AACA,SAASA,QAAQ,EAAEC,MAAM,QAAQ,QAAQ;AAEzC,SAASC,QAAQ,QAAQ,aAAa;AAEtC,SAASC,IAAI,EAAEC,IAAI,QAAQ,8BAA8B;AACzD,SAASC,UAAU,QAAQ,YAAY;AAEvC,SAASC,aAAa,QAAQ,KAAK;AAEnC,SAASC,sBAAkDC,OAAU;IACjE,OAAOP,OAAO,IAAII,WAAWG,UAAUC,OAAO;AAClD;AAEA,OAAO,MAAMC,uBAA2BR,SAAS;IAC7C,MAAMS,eAAeJ,sBAAsBK;IAE3C,qBACI,MAACZ;;0BACG,KAACG;gBAAKU,MAAM;gBAAGC,WAAU;0BAAW;;0BAGpC,KAACR;gBACGS,OAAOJ,aAAaI,KAAK;gBACzBC,UAAUL,aAAaK,QAAQ;gBAC/BC,0BAAY,KAACb;oBAAKc,MAAK;;;;;AAIvC,GAAG"}
@@ -1,3 +1,3 @@
1
- import { FC } from 'react';
1
+ import type { FC } from 'react';
2
2
  export declare const NumberInputExample: FC;
3
3
  //# sourceMappingURL=number-input.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"number-input.d.ts","sourceRoot":"","sources":["../../src/demo/number-input.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoB,EAAE,EAAqB,MAAM,OAAO,CAAC;AAchE,eAAO,MAAM,kBAAkB,EAAE,EAuG/B,CAAC"}
1
+ {"version":3,"file":"number-input.d.ts","sourceRoot":"","sources":["../../src/demo/number-input.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAqB,MAAM,OAAO,CAAC;AAenD,eAAO,MAAM,kBAAkB,EAAE,EAuG/B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/demo/number-input.tsx"],"sourcesContent":["import { useRef, Fragment, FC, PropsWithChildren } from 'react';\n\nimport { observer } from 'mobx-react';\n\nimport { Stack, Text } from '@servicetitan/design-system';\n\nimport { NumberInput } from '..';\n\nimport { FieldState } from 'formstate';\n\nfunction useNumberField<T extends number | undefined>(initial: T) {\n return useRef(new FieldState(initial)).current;\n}\n\nexport const NumberInputExample: FC = observer(() => {\n const defaultField = useNumberField<number | undefined>(undefined);\n const zeroEmptyValueField = useNumberField<number>(0);\n const precisionField = useNumberField<number | undefined>(undefined);\n const limitedRangeField = useNumberField<number | undefined>(undefined);\n const withoutThousandsSeparator = useNumberField<number | undefined>(undefined);\n\n const limitedRangeFieldPreset = useNumberField<number | undefined>(100);\n const precisionFieldPreset = useNumberField<number | undefined>(3.6666666);\n const precisionFieldPresetExtreme = useNumberField<number | undefined>(3.6666666);\n\n return (\n <Fragment>\n <Text size={4} className=\"m-b-half\">\n Default\n </Text>\n <NumberInput\n value={defaultField.value}\n onChange={defaultField.onChange}\n emptyValue={undefined}\n />\n\n <Text size={4} className=\"m-t-4 m-b-half\">\n Zero as empty value\n </Text>\n <NumberInput\n value={zeroEmptyValueField.value}\n onChange={zeroEmptyValueField.onChange}\n emptyValue={0}\n />\n\n <Text size={4} className=\"m-t-4 m-b-half\">\n Precision\n </Text>\n <NumberInput\n value={precisionField.value}\n onChange={precisionField.onChange}\n emptyValue={undefined}\n decimalPlaces={3}\n />\n\n <Text size={4} className=\"m-t-4 m-b-half\">\n Limited range\n </Text>\n <NumberInput\n value={limitedRangeField.value}\n onChange={limitedRangeField.onChange}\n emptyValue={undefined}\n min={3}\n max={7}\n />\n\n <Text size={4} className=\"m-t-4 m-b-half\">\n Without thousands separator\n </Text>\n <NumberInput\n value={withoutThousandsSeparator.value}\n onChange={withoutThousandsSeparator.onChange}\n emptyValue={undefined}\n decimalPlaces={0}\n useEmptyThousandsSeparator\n />\n\n <hr className=\"m-y-4\" />\n\n <Text size={4} className=\"m-t-4 m-b-half\">\n Preset value out of range\n </Text>\n <StoredValueWrapper value={limitedRangeFieldPreset.value}>\n <NumberInput\n value={limitedRangeFieldPreset.value}\n onChange={limitedRangeFieldPreset.onChange}\n emptyValue={undefined}\n min={3}\n max={7}\n />\n </StoredValueWrapper>\n\n <Text size={4} className=\"m-t-4 m-b-half\">\n Preset value with precision out of limit\n </Text>\n <StoredValueWrapper value={precisionFieldPreset.value}>\n <NumberInput\n value={precisionFieldPreset.value}\n onChange={precisionFieldPreset.onChange}\n emptyValue={undefined}\n decimalPlaces={3}\n />\n </StoredValueWrapper>\n\n <Text size={4} className=\"m-t-4 m-b-half\">\n Preset value with precision out of limit (zero decimals allowed)\n </Text>\n <StoredValueWrapper value={precisionFieldPresetExtreme.value}>\n <NumberInput\n value={precisionFieldPresetExtreme.value}\n onChange={precisionFieldPresetExtreme.onChange}\n emptyValue={undefined}\n decimalPlaces={0}\n />\n </StoredValueWrapper>\n </Fragment>\n );\n});\n\nconst StoredValueWrapper: FC<PropsWithChildren<{ value?: number }>> = ({ children, value }) => (\n <Stack alignItems=\"baseline\">\n {children}\n <Text size={3} className=\"m-l-3\">\n Stored value: {value}\n </Text>\n </Stack>\n);\n"],"names":["useRef","Fragment","observer","Stack","Text","NumberInput","FieldState","useNumberField","initial","current","NumberInputExample","defaultField","undefined","zeroEmptyValueField","precisionField","limitedRangeField","withoutThousandsSeparator","limitedRangeFieldPreset","precisionFieldPreset","precisionFieldPresetExtreme","size","className","value","onChange","emptyValue","decimalPlaces","min","max","useEmptyThousandsSeparator","hr","StoredValueWrapper","children","alignItems"],"mappings":";AAAA,SAASA,MAAM,EAAEC,QAAQ,QAA+B,QAAQ;AAEhE,SAASC,QAAQ,QAAQ,aAAa;AAEtC,SAASC,KAAK,EAAEC,IAAI,QAAQ,8BAA8B;AAE1D,SAASC,WAAW,QAAQ,KAAK;AAEjC,SAASC,UAAU,QAAQ,YAAY;AAEvC,SAASC,eAA6CC,OAAU;IAC5D,OAAOR,OAAO,IAAIM,WAAWE,UAAUC,OAAO;AAClD;AAEA,OAAO,MAAMC,qBAAyBR,SAAS;IAC3C,MAAMS,eAAeJ,eAAmCK;IACxD,MAAMC,sBAAsBN,eAAuB;IACnD,MAAMO,iBAAiBP,eAAmCK;IAC1D,MAAMG,oBAAoBR,eAAmCK;IAC7D,MAAMI,4BAA4BT,eAAmCK;IAErE,MAAMK,0BAA0BV,eAAmC;IACnE,MAAMW,uBAAuBX,eAAmC;IAChE,MAAMY,8BAA8BZ,eAAmC;IAEvE,qBACI,MAACN;;0BACG,KAACG;gBAAKgB,MAAM;gBAAGC,WAAU;0BAAW;;0BAGpC,KAAChB;gBACGiB,OAAOX,aAAaW,KAAK;gBACzBC,UAAUZ,aAAaY,QAAQ;gBAC/BC,YAAYZ;;0BAGhB,KAACR;gBAAKgB,MAAM;gBAAGC,WAAU;0BAAiB;;0BAG1C,KAAChB;gBACGiB,OAAOT,oBAAoBS,KAAK;gBAChCC,UAAUV,oBAAoBU,QAAQ;gBACtCC,YAAY;;0BAGhB,KAACpB;gBAAKgB,MAAM;gBAAGC,WAAU;0BAAiB;;0BAG1C,KAAChB;gBACGiB,OAAOR,eAAeQ,KAAK;gBAC3BC,UAAUT,eAAeS,QAAQ;gBACjCC,YAAYZ;gBACZa,eAAe;;0BAGnB,KAACrB;gBAAKgB,MAAM;gBAAGC,WAAU;0BAAiB;;0BAG1C,KAAChB;gBACGiB,OAAOP,kBAAkBO,KAAK;gBAC9BC,UAAUR,kBAAkBQ,QAAQ;gBACpCC,YAAYZ;gBACZc,KAAK;gBACLC,KAAK;;0BAGT,KAACvB;gBAAKgB,MAAM;gBAAGC,WAAU;0BAAiB;;0BAG1C,KAAChB;gBACGiB,OAAON,0BAA0BM,KAAK;gBACtCC,UAAUP,0BAA0BO,QAAQ;gBAC5CC,YAAYZ;gBACZa,eAAe;gBACfG,0BAA0B;;0BAG9B,KAACC;gBAAGR,WAAU;;0BAEd,KAACjB;gBAAKgB,MAAM;gBAAGC,WAAU;0BAAiB;;0BAG1C,KAACS;gBAAmBR,OAAOL,wBAAwBK,KAAK;0BACpD,cAAA,KAACjB;oBACGiB,OAAOL,wBAAwBK,KAAK;oBACpCC,UAAUN,wBAAwBM,QAAQ;oBAC1CC,YAAYZ;oBACZc,KAAK;oBACLC,KAAK;;;0BAIb,KAACvB;gBAAKgB,MAAM;gBAAGC,WAAU;0BAAiB;;0BAG1C,KAACS;gBAAmBR,OAAOJ,qBAAqBI,KAAK;0BACjD,cAAA,KAACjB;oBACGiB,OAAOJ,qBAAqBI,KAAK;oBACjCC,UAAUL,qBAAqBK,QAAQ;oBACvCC,YAAYZ;oBACZa,eAAe;;;0BAIvB,KAACrB;gBAAKgB,MAAM;gBAAGC,WAAU;0BAAiB;;0BAG1C,KAACS;gBAAmBR,OAAOH,4BAA4BG,KAAK;0BACxD,cAAA,KAACjB;oBACGiB,OAAOH,4BAA4BG,KAAK;oBACxCC,UAAUJ,4BAA4BI,QAAQ;oBAC9CC,YAAYZ;oBACZa,eAAe;;;;;AAKnC,GAAG;AAEH,MAAMK,qBAAgE,CAAC,EAAEC,QAAQ,EAAET,KAAK,EAAE,iBACtF,MAACnB;QAAM6B,YAAW;;YACbD;0BACD,MAAC3B;gBAAKgB,MAAM;gBAAGC,WAAU;;oBAAQ;oBACdC"}
1
+ {"version":3,"sources":["../../src/demo/number-input.tsx"],"sourcesContent":["import type { FC, PropsWithChildren } from 'react';\nimport { useRef, Fragment } from 'react';\n\nimport { observer } from 'mobx-react';\n\nimport { Stack, Text } from '@servicetitan/design-system';\n\nimport { NumberInput } from '..';\n\nimport { FieldState } from 'formstate';\n\nfunction useNumberField<T extends number | undefined>(initial: T) {\n return useRef(new FieldState(initial)).current;\n}\n\nexport const NumberInputExample: FC = observer(() => {\n const defaultField = useNumberField<number | undefined>(undefined);\n const zeroEmptyValueField = useNumberField<number>(0);\n const precisionField = useNumberField<number | undefined>(undefined);\n const limitedRangeField = useNumberField<number | undefined>(undefined);\n const withoutThousandsSeparator = useNumberField<number | undefined>(undefined);\n\n const limitedRangeFieldPreset = useNumberField<number | undefined>(100);\n const precisionFieldPreset = useNumberField<number | undefined>(3.6666666);\n const precisionFieldPresetExtreme = useNumberField<number | undefined>(3.6666666);\n\n return (\n <Fragment>\n <Text size={4} className=\"m-b-half\">\n Default\n </Text>\n <NumberInput\n value={defaultField.value}\n onChange={defaultField.onChange}\n emptyValue={undefined}\n />\n\n <Text size={4} className=\"m-t-4 m-b-half\">\n Zero as empty value\n </Text>\n <NumberInput\n value={zeroEmptyValueField.value}\n onChange={zeroEmptyValueField.onChange}\n emptyValue={0}\n />\n\n <Text size={4} className=\"m-t-4 m-b-half\">\n Precision\n </Text>\n <NumberInput\n value={precisionField.value}\n onChange={precisionField.onChange}\n emptyValue={undefined}\n decimalPlaces={3}\n />\n\n <Text size={4} className=\"m-t-4 m-b-half\">\n Limited range\n </Text>\n <NumberInput\n value={limitedRangeField.value}\n onChange={limitedRangeField.onChange}\n emptyValue={undefined}\n min={3}\n max={7}\n />\n\n <Text size={4} className=\"m-t-4 m-b-half\">\n Without thousands separator\n </Text>\n <NumberInput\n value={withoutThousandsSeparator.value}\n onChange={withoutThousandsSeparator.onChange}\n emptyValue={undefined}\n decimalPlaces={0}\n useEmptyThousandsSeparator\n />\n\n <hr className=\"m-y-4\" />\n\n <Text size={4} className=\"m-t-4 m-b-half\">\n Preset value out of range\n </Text>\n <StoredValueWrapper value={limitedRangeFieldPreset.value}>\n <NumberInput\n value={limitedRangeFieldPreset.value}\n onChange={limitedRangeFieldPreset.onChange}\n emptyValue={undefined}\n min={3}\n max={7}\n />\n </StoredValueWrapper>\n\n <Text size={4} className=\"m-t-4 m-b-half\">\n Preset value with precision out of limit\n </Text>\n <StoredValueWrapper value={precisionFieldPreset.value}>\n <NumberInput\n value={precisionFieldPreset.value}\n onChange={precisionFieldPreset.onChange}\n emptyValue={undefined}\n decimalPlaces={3}\n />\n </StoredValueWrapper>\n\n <Text size={4} className=\"m-t-4 m-b-half\">\n Preset value with precision out of limit (zero decimals allowed)\n </Text>\n <StoredValueWrapper value={precisionFieldPresetExtreme.value}>\n <NumberInput\n value={precisionFieldPresetExtreme.value}\n onChange={precisionFieldPresetExtreme.onChange}\n emptyValue={undefined}\n decimalPlaces={0}\n />\n </StoredValueWrapper>\n </Fragment>\n );\n});\n\nconst StoredValueWrapper: FC<PropsWithChildren<{ value?: number }>> = ({ children, value }) => (\n <Stack alignItems=\"baseline\">\n {children}\n <Text size={3} className=\"m-l-3\">\n Stored value: {value}\n </Text>\n </Stack>\n);\n"],"names":["useRef","Fragment","observer","Stack","Text","NumberInput","FieldState","useNumberField","initial","current","NumberInputExample","defaultField","undefined","zeroEmptyValueField","precisionField","limitedRangeField","withoutThousandsSeparator","limitedRangeFieldPreset","precisionFieldPreset","precisionFieldPresetExtreme","size","className","value","onChange","emptyValue","decimalPlaces","min","max","useEmptyThousandsSeparator","hr","StoredValueWrapper","children","alignItems"],"mappings":";AACA,SAASA,MAAM,EAAEC,QAAQ,QAAQ,QAAQ;AAEzC,SAASC,QAAQ,QAAQ,aAAa;AAEtC,SAASC,KAAK,EAAEC,IAAI,QAAQ,8BAA8B;AAE1D,SAASC,WAAW,QAAQ,KAAK;AAEjC,SAASC,UAAU,QAAQ,YAAY;AAEvC,SAASC,eAA6CC,OAAU;IAC5D,OAAOR,OAAO,IAAIM,WAAWE,UAAUC,OAAO;AAClD;AAEA,OAAO,MAAMC,qBAAyBR,SAAS;IAC3C,MAAMS,eAAeJ,eAAmCK;IACxD,MAAMC,sBAAsBN,eAAuB;IACnD,MAAMO,iBAAiBP,eAAmCK;IAC1D,MAAMG,oBAAoBR,eAAmCK;IAC7D,MAAMI,4BAA4BT,eAAmCK;IAErE,MAAMK,0BAA0BV,eAAmC;IACnE,MAAMW,uBAAuBX,eAAmC;IAChE,MAAMY,8BAA8BZ,eAAmC;IAEvE,qBACI,MAACN;;0BACG,KAACG;gBAAKgB,MAAM;gBAAGC,WAAU;0BAAW;;0BAGpC,KAAChB;gBACGiB,OAAOX,aAAaW,KAAK;gBACzBC,UAAUZ,aAAaY,QAAQ;gBAC/BC,YAAYZ;;0BAGhB,KAACR;gBAAKgB,MAAM;gBAAGC,WAAU;0BAAiB;;0BAG1C,KAAChB;gBACGiB,OAAOT,oBAAoBS,KAAK;gBAChCC,UAAUV,oBAAoBU,QAAQ;gBACtCC,YAAY;;0BAGhB,KAACpB;gBAAKgB,MAAM;gBAAGC,WAAU;0BAAiB;;0BAG1C,KAAChB;gBACGiB,OAAOR,eAAeQ,KAAK;gBAC3BC,UAAUT,eAAeS,QAAQ;gBACjCC,YAAYZ;gBACZa,eAAe;;0BAGnB,KAACrB;gBAAKgB,MAAM;gBAAGC,WAAU;0BAAiB;;0BAG1C,KAAChB;gBACGiB,OAAOP,kBAAkBO,KAAK;gBAC9BC,UAAUR,kBAAkBQ,QAAQ;gBACpCC,YAAYZ;gBACZc,KAAK;gBACLC,KAAK;;0BAGT,KAACvB;gBAAKgB,MAAM;gBAAGC,WAAU;0BAAiB;;0BAG1C,KAAChB;gBACGiB,OAAON,0BAA0BM,KAAK;gBACtCC,UAAUP,0BAA0BO,QAAQ;gBAC5CC,YAAYZ;gBACZa,eAAe;gBACfG,0BAA0B;;0BAG9B,KAACC;gBAAGR,WAAU;;0BAEd,KAACjB;gBAAKgB,MAAM;gBAAGC,WAAU;0BAAiB;;0BAG1C,KAACS;gBAAmBR,OAAOL,wBAAwBK,KAAK;0BACpD,cAAA,KAACjB;oBACGiB,OAAOL,wBAAwBK,KAAK;oBACpCC,UAAUN,wBAAwBM,QAAQ;oBAC1CC,YAAYZ;oBACZc,KAAK;oBACLC,KAAK;;;0BAIb,KAACvB;gBAAKgB,MAAM;gBAAGC,WAAU;0BAAiB;;0BAG1C,KAACS;gBAAmBR,OAAOJ,qBAAqBI,KAAK;0BACjD,cAAA,KAACjB;oBACGiB,OAAOJ,qBAAqBI,KAAK;oBACjCC,UAAUL,qBAAqBK,QAAQ;oBACvCC,YAAYZ;oBACZa,eAAe;;;0BAIvB,KAACrB;gBAAKgB,MAAM;gBAAGC,WAAU;0BAAiB;;0BAG1C,KAACS;gBAAmBR,OAAOH,4BAA4BG,KAAK;0BACxD,cAAA,KAACjB;oBACGiB,OAAOH,4BAA4BG,KAAK;oBACxCC,UAAUJ,4BAA4BI,QAAQ;oBAC9CC,YAAYZ;oBACZa,eAAe;;;;;AAKnC,GAAG;AAEH,MAAMK,qBAAgE,CAAC,EAAEC,QAAQ,EAAET,KAAK,EAAE,iBACtF,MAACnB;QAAM6B,YAAW;;YACbD;0BACD,MAAC3B;gBAAKgB,MAAM;gBAAGC,WAAU;;oBAAQ;oBACdC"}
@@ -1,3 +1,3 @@
1
- import { FC } from 'react';
1
+ import type { FC } from 'react';
2
2
  export declare const OrdinalNumberInputExample: FC;
3
3
  //# sourceMappingURL=original-number-input.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"original-number-input.d.ts","sourceRoot":"","sources":["../../src/demo/original-number-input.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAoB,MAAM,OAAO,CAAC;AAc7C,eAAO,MAAM,yBAAyB,EAAE,EAiBtC,CAAC"}
1
+ {"version":3,"file":"original-number-input.d.ts","sourceRoot":"","sources":["../../src/demo/original-number-input.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAehC,eAAO,MAAM,yBAAyB,EAAE,EAiBtC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/demo/original-number-input.tsx"],"sourcesContent":["import { FC, Fragment, useRef } from 'react';\n\nimport { observer } from 'mobx-react';\n\nimport { Text } from '@servicetitan/design-system';\n\nimport { FieldState } from 'formstate';\n\nimport { OrdinalNumberInput } from '..';\n\nfunction useOrdinalNumberInputField<T extends number | undefined>(initial: T) {\n return useRef(new FieldState(initial)).current;\n}\n\nexport const OrdinalNumberInputExample: FC = observer(() => {\n const defaultField = useOrdinalNumberInputField(undefined);\n\n return (\n <Fragment>\n <Text size={4} className=\"m-b-half\">\n Default\n </Text>\n <OrdinalNumberInput\n value={defaultField.value}\n onChange={defaultField.onChange}\n min={1}\n max={31}\n placeholder=\"1 - 31\"\n />\n </Fragment>\n );\n});\n"],"names":["Fragment","useRef","observer","Text","FieldState","OrdinalNumberInput","useOrdinalNumberInputField","initial","current","OrdinalNumberInputExample","defaultField","undefined","size","className","value","onChange","min","max","placeholder"],"mappings":";AAAA,SAAaA,QAAQ,EAAEC,MAAM,QAAQ,QAAQ;AAE7C,SAASC,QAAQ,QAAQ,aAAa;AAEtC,SAASC,IAAI,QAAQ,8BAA8B;AAEnD,SAASC,UAAU,QAAQ,YAAY;AAEvC,SAASC,kBAAkB,QAAQ,KAAK;AAExC,SAASC,2BAAyDC,OAAU;IACxE,OAAON,OAAO,IAAIG,WAAWG,UAAUC,OAAO;AAClD;AAEA,OAAO,MAAMC,4BAAgCP,SAAS;IAClD,MAAMQ,eAAeJ,2BAA2BK;IAEhD,qBACI,MAACX;;0BACG,KAACG;gBAAKS,MAAM;gBAAGC,WAAU;0BAAW;;0BAGpC,KAACR;gBACGS,OAAOJ,aAAaI,KAAK;gBACzBC,UAAUL,aAAaK,QAAQ;gBAC/BC,KAAK;gBACLC,KAAK;gBACLC,aAAY;;;;AAI5B,GAAG"}
1
+ {"version":3,"sources":["../../src/demo/original-number-input.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { Fragment, useRef } from 'react';\n\nimport { observer } from 'mobx-react';\n\nimport { Text } from '@servicetitan/design-system';\n\nimport { FieldState } from 'formstate';\n\nimport { OrdinalNumberInput } from '..';\n\nfunction useOrdinalNumberInputField<T extends number | undefined>(initial: T) {\n return useRef(new FieldState(initial)).current;\n}\n\nexport const OrdinalNumberInputExample: FC = observer(() => {\n const defaultField = useOrdinalNumberInputField(undefined);\n\n return (\n <Fragment>\n <Text size={4} className=\"m-b-half\">\n Default\n </Text>\n <OrdinalNumberInput\n value={defaultField.value}\n onChange={defaultField.onChange}\n min={1}\n max={31}\n placeholder=\"1 - 31\"\n />\n </Fragment>\n );\n});\n"],"names":["Fragment","useRef","observer","Text","FieldState","OrdinalNumberInput","useOrdinalNumberInputField","initial","current","OrdinalNumberInputExample","defaultField","undefined","size","className","value","onChange","min","max","placeholder"],"mappings":";AACA,SAASA,QAAQ,EAAEC,MAAM,QAAQ,QAAQ;AAEzC,SAASC,QAAQ,QAAQ,aAAa;AAEtC,SAASC,IAAI,QAAQ,8BAA8B;AAEnD,SAASC,UAAU,QAAQ,YAAY;AAEvC,SAASC,kBAAkB,QAAQ,KAAK;AAExC,SAASC,2BAAyDC,OAAU;IACxE,OAAON,OAAO,IAAIG,WAAWG,UAAUC,OAAO;AAClD;AAEA,OAAO,MAAMC,4BAAgCP,SAAS;IAClD,MAAMQ,eAAeJ,2BAA2BK;IAEhD,qBACI,MAACX;;0BACG,KAACG;gBAAKS,MAAM;gBAAGC,WAAU;0BAAW;;0BAGpC,KAACR;gBACGS,OAAOJ,aAAaI,KAAK;gBACzBC,UAAUL,aAAaK,QAAQ;gBAC/BC,KAAK;gBACLC,KAAK;gBACLC,aAAY;;;;AAI5B,GAAG"}
@@ -1,3 +1,3 @@
1
- import { FC } from 'react';
1
+ import type { FC } from 'react';
2
2
  export declare const PhoneNumberInputA2Example: FC;
3
3
  //# sourceMappingURL=phone-number-input-a2.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"phone-number-input-a2.d.ts","sourceRoot":"","sources":["../../src/demo/phone-number-input-a2.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAe,EAAE,EAAY,MAAM,OAAO,CAAC;AAyBlD,eAAO,MAAM,yBAAyB,EAAE,EA+DtC,CAAC"}
1
+ {"version":3,"file":"phone-number-input-a2.d.ts","sourceRoot":"","sources":["../../src/demo/phone-number-input-a2.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,EAAE,EAAE,MAAM,OAAO,CAAC;AA0B7C,eAAO,MAAM,yBAAyB,EAAE,EA+DtC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/demo/phone-number-input-a2.tsx"],"sourcesContent":["import { ChangeEvent, FC, useState } from 'react';\n\nimport { observer } from 'mobx-react';\n\nimport { Culture } from '@servicetitan/culture';\n\nimport { PhoneNumberInputA2 } from '..';\n\ntype CultureKey = 'nanp' | 'au';\n\nconst cultures: Record<CultureKey, Culture> = {\n nanp: {\n PhoneFormat: {\n SimplePhoneMask: '(999) 999-9999?',\n SampleSimplePhoneNumber: '(123) 456-7890',\n },\n } as Culture,\n au: {\n PhoneFormat: {\n SimplePhoneMask: '99 9999 9999',\n SampleSimplePhoneNumber: '04 1234 5678',\n },\n } as Culture,\n};\n\nexport const PhoneNumberInputA2Example: FC = observer(() => {\n const [value, setValue] = useState('');\n const [cultureKey, setCultureKey] = useState<CultureKey>('nanp');\n const [sip, setSip] = useState(false);\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n setValue(e.target.value);\n };\n\n const handleCultureChange = (e: ChangeEvent<HTMLInputElement>) => {\n setCultureKey(e.target.value as CultureKey);\n setValue('');\n };\n\n return (\n <div>\n <fieldset>\n <legend>Region</legend>\n <label>\n <input\n type=\"radio\"\n name=\"culture\"\n value=\"nanp\"\n checked={cultureKey === 'nanp'}\n onChange={handleCultureChange}\n />\n US/Canada (NANP)\n </label>\n <label style={{ marginLeft: 16 }}>\n <input\n type=\"radio\"\n name=\"culture\"\n value=\"au\"\n checked={cultureKey === 'au'}\n onChange={handleCultureChange}\n />\n Australia\n </label>\n </fieldset>\n <br />\n <label>\n <input\n type=\"checkbox\"\n checked={sip}\n onChange={e => {\n setSip(e.target.checked);\n setValue('');\n }}\n />\n SIP\n </label>\n <br />\n <br />\n <PhoneNumberInputA2\n culture={cultures[cultureKey]}\n label=\"Phone\"\n value={value}\n onChange={handleChange}\n sip={sip}\n />\n <p>Returned value: {value}</p>\n </div>\n );\n});\n"],"names":["useState","observer","PhoneNumberInputA2","cultures","nanp","PhoneFormat","SimplePhoneMask","SampleSimplePhoneNumber","au","PhoneNumberInputA2Example","value","setValue","cultureKey","setCultureKey","sip","setSip","handleChange","e","target","handleCultureChange","div","fieldset","legend","label","input","type","name","checked","onChange","style","marginLeft","br","culture","p"],"mappings":";AAAA,SAA0BA,QAAQ,QAAQ,QAAQ;AAElD,SAASC,QAAQ,QAAQ,aAAa;AAItC,SAASC,kBAAkB,QAAQ,KAAK;AAIxC,MAAMC,WAAwC;IAC1CC,MAAM;QACFC,aAAa;YACTC,iBAAiB;YACjBC,yBAAyB;QAC7B;IACJ;IACAC,IAAI;QACAH,aAAa;YACTC,iBAAiB;YACjBC,yBAAyB;QAC7B;IACJ;AACJ;AAEA,OAAO,MAAME,4BAAgCR,SAAS;IAClD,MAAM,CAACS,OAAOC,SAAS,GAAGX,SAAS;IACnC,MAAM,CAACY,YAAYC,cAAc,GAAGb,SAAqB;IACzD,MAAM,CAACc,KAAKC,OAAO,GAAGf,SAAS;IAE/B,MAAMgB,eAAe,CAACC;QAClBN,SAASM,EAAEC,MAAM,CAACR,KAAK;IAC3B;IAEA,MAAMS,sBAAsB,CAACF;QACzBJ,cAAcI,EAAEC,MAAM,CAACR,KAAK;QAC5BC,SAAS;IACb;IAEA,qBACI,MAACS;;0BACG,MAACC;;kCACG,KAACC;kCAAO;;kCACR,MAACC;;0CACG,KAACC;gCACGC,MAAK;gCACLC,MAAK;gCACLhB,OAAM;gCACNiB,SAASf,eAAe;gCACxBgB,UAAUT;;4BACZ;;;kCAGN,MAACI;wBAAMM,OAAO;4BAAEC,YAAY;wBAAG;;0CAC3B,KAACN;gCACGC,MAAK;gCACLC,MAAK;gCACLhB,OAAM;gCACNiB,SAASf,eAAe;gCACxBgB,UAAUT;;4BACZ;;;;;0BAIV,KAACY;0BACD,MAACR;;kCACG,KAACC;wBACGC,MAAK;wBACLE,SAASb;wBACTc,UAAUX,CAAAA;4BACNF,OAAOE,EAAEC,MAAM,CAACS,OAAO;4BACvBhB,SAAS;wBACb;;oBACF;;;0BAGN,KAACoB;0BACD,KAACA;0BACD,KAAC7B;gBACG8B,SAAS7B,QAAQ,CAACS,WAAW;gBAC7BW,OAAM;gBACNb,OAAOA;gBACPkB,UAAUZ;gBACVF,KAAKA;;0BAET,MAACmB;;oBAAE;oBAAiBvB;;;;;AAGhC,GAAG"}
1
+ {"version":3,"sources":["../../src/demo/phone-number-input-a2.tsx"],"sourcesContent":["import type { ChangeEvent, FC } from 'react';\nimport { useState } from 'react';\n\nimport { observer } from 'mobx-react';\n\nimport type { Culture } from '@servicetitan/culture';\n\nimport { PhoneNumberInputA2 } from '..';\n\ntype CultureKey = 'nanp' | 'au';\n\nconst cultures: Record<CultureKey, Culture> = {\n nanp: {\n PhoneFormat: {\n SimplePhoneMask: '(999) 999-9999?',\n SampleSimplePhoneNumber: '(123) 456-7890',\n },\n } as Culture,\n au: {\n PhoneFormat: {\n SimplePhoneMask: '99 9999 9999',\n SampleSimplePhoneNumber: '04 1234 5678',\n },\n } as Culture,\n};\n\nexport const PhoneNumberInputA2Example: FC = observer(() => {\n const [value, setValue] = useState('');\n const [cultureKey, setCultureKey] = useState<CultureKey>('nanp');\n const [sip, setSip] = useState(false);\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n setValue(e.target.value);\n };\n\n const handleCultureChange = (e: ChangeEvent<HTMLInputElement>) => {\n setCultureKey(e.target.value as CultureKey);\n setValue('');\n };\n\n return (\n <div>\n <fieldset>\n <legend>Region</legend>\n <label>\n <input\n type=\"radio\"\n name=\"culture\"\n value=\"nanp\"\n checked={cultureKey === 'nanp'}\n onChange={handleCultureChange}\n />\n US/Canada (NANP)\n </label>\n <label style={{ marginLeft: 16 }}>\n <input\n type=\"radio\"\n name=\"culture\"\n value=\"au\"\n checked={cultureKey === 'au'}\n onChange={handleCultureChange}\n />\n Australia\n </label>\n </fieldset>\n <br />\n <label>\n <input\n type=\"checkbox\"\n checked={sip}\n onChange={e => {\n setSip(e.target.checked);\n setValue('');\n }}\n />\n SIP\n </label>\n <br />\n <br />\n <PhoneNumberInputA2\n culture={cultures[cultureKey]}\n label=\"Phone\"\n value={value}\n onChange={handleChange}\n sip={sip}\n />\n <p>Returned value: {value}</p>\n </div>\n );\n});\n"],"names":["useState","observer","PhoneNumberInputA2","cultures","nanp","PhoneFormat","SimplePhoneMask","SampleSimplePhoneNumber","au","PhoneNumberInputA2Example","value","setValue","cultureKey","setCultureKey","sip","setSip","handleChange","e","target","handleCultureChange","div","fieldset","legend","label","input","type","name","checked","onChange","style","marginLeft","br","culture","p"],"mappings":";AACA,SAASA,QAAQ,QAAQ,QAAQ;AAEjC,SAASC,QAAQ,QAAQ,aAAa;AAItC,SAASC,kBAAkB,QAAQ,KAAK;AAIxC,MAAMC,WAAwC;IAC1CC,MAAM;QACFC,aAAa;YACTC,iBAAiB;YACjBC,yBAAyB;QAC7B;IACJ;IACAC,IAAI;QACAH,aAAa;YACTC,iBAAiB;YACjBC,yBAAyB;QAC7B;IACJ;AACJ;AAEA,OAAO,MAAME,4BAAgCR,SAAS;IAClD,MAAM,CAACS,OAAOC,SAAS,GAAGX,SAAS;IACnC,MAAM,CAACY,YAAYC,cAAc,GAAGb,SAAqB;IACzD,MAAM,CAACc,KAAKC,OAAO,GAAGf,SAAS;IAE/B,MAAMgB,eAAe,CAACC;QAClBN,SAASM,EAAEC,MAAM,CAACR,KAAK;IAC3B;IAEA,MAAMS,sBAAsB,CAACF;QACzBJ,cAAcI,EAAEC,MAAM,CAACR,KAAK;QAC5BC,SAAS;IACb;IAEA,qBACI,MAACS;;0BACG,MAACC;;kCACG,KAACC;kCAAO;;kCACR,MAACC;;0CACG,KAACC;gCACGC,MAAK;gCACLC,MAAK;gCACLhB,OAAM;gCACNiB,SAASf,eAAe;gCACxBgB,UAAUT;;4BACZ;;;kCAGN,MAACI;wBAAMM,OAAO;4BAAEC,YAAY;wBAAG;;0CAC3B,KAACN;gCACGC,MAAK;gCACLC,MAAK;gCACLhB,OAAM;gCACNiB,SAASf,eAAe;gCACxBgB,UAAUT;;4BACZ;;;;;0BAIV,KAACY;0BACD,MAACR;;kCACG,KAACC;wBACGC,MAAK;wBACLE,SAASb;wBACTc,UAAUX,CAAAA;4BACNF,OAAOE,EAAEC,MAAM,CAACS,OAAO;4BACvBhB,SAAS;wBACb;;oBACF;;;0BAGN,KAACoB;0BACD,KAACA;0BACD,KAAC7B;gBACG8B,SAAS7B,QAAQ,CAACS,WAAW;gBAC7BW,OAAM;gBACNb,OAAOA;gBACPkB,UAAUZ;gBACVF,KAAKA;;0BAET,MAACmB;;oBAAE;oBAAiBvB;;;;;AAGhC,GAAG"}
@@ -1,3 +1,3 @@
1
- import { FC } from 'react';
1
+ import type { FC } from 'react';
2
2
  export declare const PhoneNumberInputExample: FC;
3
3
  //# sourceMappingURL=phone-number-input.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"phone-number-input.d.ts","sourceRoot":"","sources":["../../src/demo/phone-number-input.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAM3B,eAAO,MAAM,uBAAuB,EAAE,EAEpC,CAAC"}
1
+ {"version":3,"file":"phone-number-input.d.ts","sourceRoot":"","sources":["../../src/demo/phone-number-input.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAMhC,eAAO,MAAM,uBAAuB,EAAE,EAEpC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/demo/phone-number-input.tsx"],"sourcesContent":["import { FC } from 'react';\n\nimport { observer } from 'mobx-react';\n\nimport { PhoneNumberInput } from '..';\n\nexport const PhoneNumberInputExample: FC = observer(() => (\n <PhoneNumberInput placeholder=\"(123) 456-7890\" label=\"Phone\" />\n));\n"],"names":["observer","PhoneNumberInput","PhoneNumberInputExample","placeholder","label"],"mappings":";AAEA,SAASA,QAAQ,QAAQ,aAAa;AAEtC,SAASC,gBAAgB,QAAQ,KAAK;AAEtC,OAAO,MAAMC,0BAA8BF,SAAS,kBAChD,KAACC;QAAiBE,aAAY;QAAiBC,OAAM;QACtD"}
1
+ {"version":3,"sources":["../../src/demo/phone-number-input.tsx"],"sourcesContent":["import type { FC } from 'react';\n\nimport { observer } from 'mobx-react';\n\nimport { PhoneNumberInput } from '..';\n\nexport const PhoneNumberInputExample: FC = observer(() => (\n <PhoneNumberInput placeholder=\"(123) 456-7890\" label=\"Phone\" />\n));\n"],"names":["observer","PhoneNumberInput","PhoneNumberInputExample","placeholder","label"],"mappings":";AAEA,SAASA,QAAQ,QAAQ,aAAa;AAEtC,SAASC,gBAAgB,QAAQ,KAAK;AAEtC,OAAO,MAAMC,0BAA8BF,SAAS,kBAChD,KAACC;QAAiBE,aAAY;QAAiBC,OAAM;QACtD"}
@@ -1,4 +1,4 @@
1
- import { FC, PropsWithChildren } from 'react';
1
+ import type { FC, PropsWithChildren } from 'react';
2
2
  export interface FileUploaderConfig {
3
3
  target?: string;
4
4
  downloadPath?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/file-uploader/config.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAI9C,MAAM,WAAW,kBAAkB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACxC;AAED,eAAO,MAAM,iCAAiC,mEAE7C,CAAC;AAEF,UAAU,sCAAuC,SAAQ,iBAAiB,CAAC,EAAE,CAAC;IAC1E,KAAK,EAAE,kBAAkB,CAAC;CAC7B;AAED,eAAO,MAAM,iCAAiC,EAAE,EAAE,CAAC,sCAAsC,CAOxF,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/file-uploader/config.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAInD,MAAM,WAAW,kBAAkB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACxC;AAED,eAAO,MAAM,iCAAiC,mEAE7C,CAAC;AAEF,UAAU,sCAAuC,SAAQ,iBAAiB,CAAC,EAAE,CAAC;IAC1E,KAAK,EAAE,kBAAkB,CAAC;CAC7B;AAED,eAAO,MAAM,iCAAiC,EAAE,EAAE,CAAC,sCAAsC,CAOxF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/file-uploader/config.tsx"],"sourcesContent":["import { FC, PropsWithChildren } from 'react';\n\nimport { Provider, symbolToken } from '@servicetitan/react-ioc';\n\nexport interface FileUploaderConfig {\n target?: string;\n downloadPath?: string;\n chunkSize?: number;\n testChunks?: boolean;\n forceChunkSize?: boolean;\n simultaneousUploads?: number;\n headers?: Record<string, string>;\n permanentErrors?: number[];\n fileType?: string[];\n errorParser?(error?: string): string;\n}\n\nexport const FILE_UPLOADER_CONFIGURATION_TOKEN = symbolToken<FileUploaderConfig>(\n 'FILE_UPLOADER_CONFIGURATION_TOKEN'\n);\n\ninterface FileUploaderConfigurationProviderProps extends PropsWithChildren<{}> {\n value: FileUploaderConfig;\n}\n\nexport const FileUploaderConfigurationProvider: FC<FileUploaderConfigurationProviderProps> = ({\n value,\n children,\n}) => (\n <Provider singletons={[{ provide: FILE_UPLOADER_CONFIGURATION_TOKEN, useValue: value }]}>\n {children}\n </Provider>\n);\n"],"names":["Provider","symbolToken","FILE_UPLOADER_CONFIGURATION_TOKEN","FileUploaderConfigurationProvider","value","children","singletons","provide","useValue"],"mappings":";AAEA,SAASA,QAAQ,EAAEC,WAAW,QAAQ,0BAA0B;AAehE,OAAO,MAAMC,oCAAoCD,YAC7C,qCACF;AAMF,OAAO,MAAME,oCAAgF,CAAC,EAC1FC,KAAK,EACLC,QAAQ,EACX,iBACG,KAACL;QAASM,YAAY;YAAC;gBAAEC,SAASL;gBAAmCM,UAAUJ;YAAM;SAAE;kBAClFC;OAEP"}
1
+ {"version":3,"sources":["../../src/file-uploader/config.tsx"],"sourcesContent":["import type { FC, PropsWithChildren } from 'react';\n\nimport { Provider, symbolToken } from '@servicetitan/react-ioc';\n\nexport interface FileUploaderConfig {\n target?: string;\n downloadPath?: string;\n chunkSize?: number;\n testChunks?: boolean;\n forceChunkSize?: boolean;\n simultaneousUploads?: number;\n headers?: Record<string, string>;\n permanentErrors?: number[];\n fileType?: string[];\n errorParser?(error?: string): string;\n}\n\nexport const FILE_UPLOADER_CONFIGURATION_TOKEN = symbolToken<FileUploaderConfig>(\n 'FILE_UPLOADER_CONFIGURATION_TOKEN'\n);\n\ninterface FileUploaderConfigurationProviderProps extends PropsWithChildren<{}> {\n value: FileUploaderConfig;\n}\n\nexport const FileUploaderConfigurationProvider: FC<FileUploaderConfigurationProviderProps> = ({\n value,\n children,\n}) => (\n <Provider singletons={[{ provide: FILE_UPLOADER_CONFIGURATION_TOKEN, useValue: value }]}>\n {children}\n </Provider>\n);\n"],"names":["Provider","symbolToken","FILE_UPLOADER_CONFIGURATION_TOKEN","FileUploaderConfigurationProvider","value","children","singletons","provide","useValue"],"mappings":";AAEA,SAASA,QAAQ,EAAEC,WAAW,QAAQ,0BAA0B;AAehE,OAAO,MAAMC,oCAAoCD,YAC7C,qCACF;AAMF,OAAO,MAAME,oCAAgF,CAAC,EAC1FC,KAAK,EACLC,QAAQ,EACX,iBACG,KAACL;QAASM,YAAY;YAAC;gBAAEC,SAASL;gBAAmCM,UAAUJ;YAAM;SAAE;kBAClFC;OAEP"}
@@ -1 +1 @@
1
- {"version":3,"file":"file-uploader.d.ts","sourceRoot":"","sources":["../../src/file-uploader/file-uploader.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,OAAO,CAAC;AAOhD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAInF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAEnD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAQtC,UAAU,WAAW;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AA4BD,KAAK,uBAAuB,GAAG,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,OAAO,CAAC;AAEhG,UAAU,iBAAkB,SAAQ,IAAI,CAAC,eAAe,EAAE,uBAAuB,CAAC;IAC9E,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;CAC5C;AAED,qBACa,YAAa,SAAQ,SAAS,CAAC,iBAAiB,CAAC;IAC1D,MAAM,CAAC,YAAY;;MAEjB;IAIM,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAExB,MAAM,EAAE,WAAW,EAAE,CAAM;IAEvC,QAAQ,EAAG,QAAQ,CAAC;gBAER,KAAK,EAAE,iBAAiB;IAMpC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM;IASrC,WAAW;IAKX,oBAAoB,GAAI,MAAM,IAAI,EAAE,UAAU,MAAM,UAgBlD;IAGF,mBAAmB,GAAI,MAAM,IAAI,EAAE,UAAU,MAAM,UAiBjD;IAGF,iBAAiB,GAAI,MAAM,IAAI,EAAE,UAAU,MAAM,UAU/C;IAEF,iBAAiB;IAejB,oBAAoB;IAIpB,cAAc,GAAI,MAAM,cAAc,UAWpC;IAEF,cAAc,GAAI,OAAO,QAAQ,UAa/B;IAEF,aAAa,GAAI,6BAA6B;QAAE,IAAI,EAAE,cAAc,CAAC;QAAC,OAAO,EAAE,IAAI,CAAA;KAAE,UAgBnF;IAEF,YAAY,GAAI,UAAU,cAAc,UAQtC;IAEF,iBAAiB,aAEf;IAEF,MAAM;CAwDT"}
1
+ {"version":3,"file":"file-uploader.d.ts","sourceRoot":"","sources":["../../src/file-uploader/file-uploader.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAY,MAAM,OAAO,CAAC;AAO5C,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAInF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAEnD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAQtC,UAAU,WAAW;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AA4BD,KAAK,uBAAuB,GAAG,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,OAAO,CAAC;AAEhG,UAAU,iBAAkB,SAAQ,IAAI,CAAC,eAAe,EAAE,uBAAuB,CAAC;IAC9E,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;CAC5C;AAED,qBACa,YAAa,SAAQ,SAAS,CAAC,iBAAiB,CAAC;IAC1D,MAAM,CAAC,YAAY;;MAEjB;IAIM,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAExB,MAAM,EAAE,WAAW,EAAE,CAAM;IAEvC,QAAQ,EAAG,QAAQ,CAAC;gBAER,KAAK,EAAE,iBAAiB;IAMpC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM;IASrC,WAAW;IAKX,oBAAoB,GAAI,MAAM,IAAI,EAAE,UAAU,MAAM,UAgBlD;IAGF,mBAAmB,GAAI,MAAM,IAAI,EAAE,UAAU,MAAM,UAiBjD;IAGF,iBAAiB,GAAI,MAAM,IAAI,EAAE,UAAU,MAAM,UAU/C;IAEF,iBAAiB;IAejB,oBAAoB;IAIpB,cAAc,GAAI,MAAM,cAAc,UAWpC;IAEF,cAAc,GAAI,OAAO,QAAQ,UAa/B;IAEF,aAAa,GAAI,6BAA6B;QAAE,IAAI,EAAE,cAAc,CAAC;QAAC,OAAO,EAAE,IAAI,CAAA;KAAE,UAgBnF;IAEF,YAAY,GAAI,UAAU,cAAc,UAQtC;IAEF,iBAAiB,aAEf;IAEF,MAAM;CAwDT"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/file-uploader/file-uploader.tsx"],"sourcesContent":["import { Component, Fragment, FC } from 'react';\n\nimport { injectDependency, optional } from '@servicetitan/react-ioc';\n\nimport { observer } from 'mobx-react';\nimport { observable, action, makeObservable } from 'mobx';\n\nimport type { FileDescriptor, FilePickerProps } from '@servicetitan/design-system';\nimport { FilePicker, Banner } from '@servicetitan/design-system';\nimport { Confirm } from '@servicetitan/confirm';\n\nimport type { FileUploaderConfig } from './config';\nimport { FILE_UPLOADER_CONFIGURATION_TOKEN } from './config';\nimport { Uploader } from './uploader';\n\nimport { v4 as uuid } from 'uuid';\n\nfunction immutableSplice<T>(arr: T[], start: number, deleteCount: number, ...items: T[]) {\n return [...arr.slice(0, start), ...items, ...arr.slice(start + deleteCount)];\n}\n\ninterface UploadError {\n id: string;\n file: File;\n message?: string;\n}\n\ninterface UploadErrorsProps {\n errors: UploadError[];\n multiple?: boolean;\n className?: string;\n onClose(): void;\n}\n\nconst UploadErrors: FC<UploadErrorsProps> = ({ errors, className, onClose, multiple }) => {\n const title = multiple\n ? 'One or more files could not be uploaded:'\n : 'Your file could not be uploaded';\n\n return (\n <Banner icon status=\"critical\" title={title} className={className} onClose={onClose}>\n <ul className=\"p-x-0-i\">\n {errors.map(({ id, file, message }) => (\n <li key={id} style={!multiple ? { listStyle: 'none' } : {}}>\n {multiple && file.name}\n {message && (multiple ? ` (${message})` : message)}\n </li>\n ))}\n </ul>\n </Banner>\n );\n};\n\ntype ExcludedFilePickerProps = 'onDelete' | 'onDownload' | 'onReplace' | 'onSelected' | 'value';\n\ninterface FileUploaderProps extends Omit<FilePickerProps, ExcludedFilePickerProps> {\n config?: FileUploaderConfig;\n value: FileDescriptor[];\n folderName?: string;\n hideReplace?: boolean;\n hideDownload?: boolean;\n onChange?(value: FileDescriptor[]): void;\n}\n\n@observer\nexport class FileUploader extends Component<FileUploaderProps> {\n static defaultProps = {\n folderName: 'temp',\n };\n\n @injectDependency(FILE_UPLOADER_CONFIGURATION_TOKEN)\n @optional()\n declare config?: FileUploaderConfig;\n\n @observable errors: UploadError[] = [];\n\n uploader!: Uploader;\n\n constructor(props: FileUploaderProps) {\n super(props);\n makeObservable(this);\n }\n\n @action\n addError(file: File, message?: string) {\n this.errors.push({\n file,\n message,\n id: uuid(),\n });\n }\n\n @action\n clearErrors() {\n this.errors = [];\n }\n\n @action\n handleUploadProgress = (file: File, progress: number) => {\n if (!this.props.onChange) {\n return;\n }\n\n const index = this.props.value.findIndex(fileDescriptor => fileDescriptor.file === file);\n if (index !== -1) {\n this.props.onChange(\n immutableSplice(this.props.value, index, 1, {\n ...this.props.value[index],\n uploadProgress: progress,\n })\n );\n } else {\n this.uploader.cancel(file);\n }\n };\n\n @action\n handleUploadSuccess = (file: File, message?: string) => {\n if (!this.props.onChange) {\n return;\n }\n\n const index = this.props.value.findIndex(fileDescriptor => fileDescriptor.file === file);\n if (index !== -1) {\n this.props.onChange(\n immutableSplice(this.props.value, index, 1, {\n ...this.props.value[index],\n ...(message\n ? { file: message, displayName: file.name, downloadLink: message }\n : { file: file.name }),\n uploadProgress: undefined,\n })\n );\n }\n };\n\n @action\n handleUploadError = (file: File, message?: string) => {\n if (!this.props.onChange) {\n return;\n }\n\n this.addError(file, message);\n\n this.props.onChange(\n this.props.value.filter(fileDescriptor => fileDescriptor.file !== file)\n );\n };\n\n componentDidMount() {\n this.uploader = new Uploader(\n {\n ...this.config,\n ...this.props.config,\n },\n {\n progress: this.handleUploadProgress,\n success: this.handleUploadSuccess,\n error: this.handleUploadError,\n },\n this.props.folderName\n );\n }\n\n componentWillUnmount() {\n this.uploader.cancel();\n }\n\n handleDownload = (file: FileDescriptor) => {\n if (!file.downloadLink) {\n return;\n }\n\n const path =\n this.props.config?.downloadPath ??\n this.config?.downloadPath ??\n `/app/api/fileuploader/folders/${this.props.folderName}/files/`;\n\n window.open(path + file.downloadLink);\n };\n\n handleSelected = (files: FileList) => {\n if (!this.props.onChange) {\n return;\n }\n\n this.props.onChange([\n ...this.props.value,\n ...Array.from(files).map(file => ({\n file,\n uploadProgress: 0,\n })),\n ]);\n this.uploader.upload(files);\n };\n\n handleReplace = ({ file: { file }, newFile }: { file: FileDescriptor; newFile: File }) => {\n if (!this.props.onChange) {\n return;\n }\n\n const index = this.props.value.findIndex(fileDescriptor => fileDescriptor.file === file);\n if (index !== -1) {\n this.uploader.upload(newFile);\n\n this.props.onChange(\n immutableSplice(this.props.value, index, 1, {\n file: newFile,\n uploadProgress: 0,\n })\n );\n }\n };\n\n handleDelete = ({ file }: FileDescriptor) => {\n if (!this.props.onChange) {\n return;\n }\n\n this.props.onChange(\n this.props.value.filter(fileDescriptor => fileDescriptor.file !== file)\n );\n };\n\n handleErrorsClose = () => {\n this.clearErrors();\n };\n\n render() {\n const {\n value,\n onChange,\n hideReplace,\n hideDownload,\n limitReached,\n multiple,\n config,\n folderName,\n ...rest\n } = this.props;\n\n if (!onChange && !value.length) {\n return null;\n }\n\n const readonlyProps = onChange\n ? {}\n : {\n onReplace: undefined,\n onDelete: undefined,\n limitReached: true,\n };\n\n return (\n <Fragment>\n {!!this.errors.length && (\n <UploadErrors\n errors={this.errors}\n onClose={this.handleErrorsClose}\n className=\"m-b-2\"\n multiple={multiple}\n />\n )}\n <Confirm\n onConfirm={this.handleDelete}\n title=\"Are you sure you want to delete this file?\"\n >\n {onDelete => (\n <FilePicker\n value={value.length ? value : undefined}\n onReplace={!hideReplace ? this.handleReplace : undefined}\n onSelected={this.handleSelected}\n onDelete={onDelete}\n onDownload={!hideDownload ? this.handleDownload : undefined}\n limitReached={limitReached}\n multiple={multiple}\n {...rest}\n {...readonlyProps}\n />\n )}\n </Confirm>\n </Fragment>\n );\n }\n}\n"],"names":["Component","Fragment","injectDependency","optional","observer","observable","action","makeObservable","FilePicker","Banner","Confirm","FILE_UPLOADER_CONFIGURATION_TOKEN","Uploader","v4","uuid","immutableSplice","arr","start","deleteCount","items","slice","UploadErrors","errors","className","onClose","multiple","title","icon","status","ul","map","id","file","message","li","style","listStyle","name","FileUploader","addError","push","clearErrors","componentDidMount","uploader","config","props","progress","handleUploadProgress","success","handleUploadSuccess","error","handleUploadError","folderName","componentWillUnmount","cancel","render","value","onChange","hideReplace","hideDownload","limitReached","rest","length","readonlyProps","onReplace","undefined","onDelete","handleErrorsClose","onConfirm","handleDelete","handleReplace","onSelected","handleSelected","onDownload","handleDownload","index","findIndex","fileDescriptor","uploadProgress","displayName","downloadLink","filter","path","downloadPath","window","open","files","Array","from","upload","newFile","defaultProps"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/file-uploader/file-uploader.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { Component, Fragment } from 'react';\n\nimport { injectDependency, optional } from '@servicetitan/react-ioc';\n\nimport { observer } from 'mobx-react';\nimport { observable, action, makeObservable } from 'mobx';\n\nimport type { FileDescriptor, FilePickerProps } from '@servicetitan/design-system';\nimport { FilePicker, Banner } from '@servicetitan/design-system';\nimport { Confirm } from '@servicetitan/confirm';\n\nimport type { FileUploaderConfig } from './config';\nimport { FILE_UPLOADER_CONFIGURATION_TOKEN } from './config';\nimport { Uploader } from './uploader';\n\nimport { v4 as uuid } from 'uuid';\n\nfunction immutableSplice<T>(arr: T[], start: number, deleteCount: number, ...items: T[]) {\n return [...arr.slice(0, start), ...items, ...arr.slice(start + deleteCount)];\n}\n\ninterface UploadError {\n id: string;\n file: File;\n message?: string;\n}\n\ninterface UploadErrorsProps {\n errors: UploadError[];\n multiple?: boolean;\n className?: string;\n onClose(): void;\n}\n\nconst UploadErrors: FC<UploadErrorsProps> = ({ errors, className, onClose, multiple }) => {\n const title = multiple\n ? 'One or more files could not be uploaded:'\n : 'Your file could not be uploaded';\n\n return (\n <Banner icon status=\"critical\" title={title} className={className} onClose={onClose}>\n <ul className=\"p-x-0-i\">\n {errors.map(({ id, file, message }) => (\n <li key={id} style={!multiple ? { listStyle: 'none' } : {}}>\n {multiple && file.name}\n {message && (multiple ? ` (${message})` : message)}\n </li>\n ))}\n </ul>\n </Banner>\n );\n};\n\ntype ExcludedFilePickerProps = 'onDelete' | 'onDownload' | 'onReplace' | 'onSelected' | 'value';\n\ninterface FileUploaderProps extends Omit<FilePickerProps, ExcludedFilePickerProps> {\n config?: FileUploaderConfig;\n value: FileDescriptor[];\n folderName?: string;\n hideReplace?: boolean;\n hideDownload?: boolean;\n onChange?(value: FileDescriptor[]): void;\n}\n\n@observer\nexport class FileUploader extends Component<FileUploaderProps> {\n static defaultProps = {\n folderName: 'temp',\n };\n\n @injectDependency(FILE_UPLOADER_CONFIGURATION_TOKEN)\n @optional()\n declare config?: FileUploaderConfig;\n\n @observable errors: UploadError[] = [];\n\n uploader!: Uploader;\n\n constructor(props: FileUploaderProps) {\n super(props);\n makeObservable(this);\n }\n\n @action\n addError(file: File, message?: string) {\n this.errors.push({\n file,\n message,\n id: uuid(),\n });\n }\n\n @action\n clearErrors() {\n this.errors = [];\n }\n\n @action\n handleUploadProgress = (file: File, progress: number) => {\n if (!this.props.onChange) {\n return;\n }\n\n const index = this.props.value.findIndex(fileDescriptor => fileDescriptor.file === file);\n if (index !== -1) {\n this.props.onChange(\n immutableSplice(this.props.value, index, 1, {\n ...this.props.value[index],\n uploadProgress: progress,\n })\n );\n } else {\n this.uploader.cancel(file);\n }\n };\n\n @action\n handleUploadSuccess = (file: File, message?: string) => {\n if (!this.props.onChange) {\n return;\n }\n\n const index = this.props.value.findIndex(fileDescriptor => fileDescriptor.file === file);\n if (index !== -1) {\n this.props.onChange(\n immutableSplice(this.props.value, index, 1, {\n ...this.props.value[index],\n ...(message\n ? { file: message, displayName: file.name, downloadLink: message }\n : { file: file.name }),\n uploadProgress: undefined,\n })\n );\n }\n };\n\n @action\n handleUploadError = (file: File, message?: string) => {\n if (!this.props.onChange) {\n return;\n }\n\n this.addError(file, message);\n\n this.props.onChange(\n this.props.value.filter(fileDescriptor => fileDescriptor.file !== file)\n );\n };\n\n componentDidMount() {\n this.uploader = new Uploader(\n {\n ...this.config,\n ...this.props.config,\n },\n {\n progress: this.handleUploadProgress,\n success: this.handleUploadSuccess,\n error: this.handleUploadError,\n },\n this.props.folderName\n );\n }\n\n componentWillUnmount() {\n this.uploader.cancel();\n }\n\n handleDownload = (file: FileDescriptor) => {\n if (!file.downloadLink) {\n return;\n }\n\n const path =\n this.props.config?.downloadPath ??\n this.config?.downloadPath ??\n `/app/api/fileuploader/folders/${this.props.folderName}/files/`;\n\n window.open(path + file.downloadLink);\n };\n\n handleSelected = (files: FileList) => {\n if (!this.props.onChange) {\n return;\n }\n\n this.props.onChange([\n ...this.props.value,\n ...Array.from(files).map(file => ({\n file,\n uploadProgress: 0,\n })),\n ]);\n this.uploader.upload(files);\n };\n\n handleReplace = ({ file: { file }, newFile }: { file: FileDescriptor; newFile: File }) => {\n if (!this.props.onChange) {\n return;\n }\n\n const index = this.props.value.findIndex(fileDescriptor => fileDescriptor.file === file);\n if (index !== -1) {\n this.uploader.upload(newFile);\n\n this.props.onChange(\n immutableSplice(this.props.value, index, 1, {\n file: newFile,\n uploadProgress: 0,\n })\n );\n }\n };\n\n handleDelete = ({ file }: FileDescriptor) => {\n if (!this.props.onChange) {\n return;\n }\n\n this.props.onChange(\n this.props.value.filter(fileDescriptor => fileDescriptor.file !== file)\n );\n };\n\n handleErrorsClose = () => {\n this.clearErrors();\n };\n\n render() {\n const {\n value,\n onChange,\n hideReplace,\n hideDownload,\n limitReached,\n multiple,\n config,\n folderName,\n ...rest\n } = this.props;\n\n if (!onChange && !value.length) {\n return null;\n }\n\n const readonlyProps = onChange\n ? {}\n : {\n onReplace: undefined,\n onDelete: undefined,\n limitReached: true,\n };\n\n return (\n <Fragment>\n {!!this.errors.length && (\n <UploadErrors\n errors={this.errors}\n onClose={this.handleErrorsClose}\n className=\"m-b-2\"\n multiple={multiple}\n />\n )}\n <Confirm\n onConfirm={this.handleDelete}\n title=\"Are you sure you want to delete this file?\"\n >\n {onDelete => (\n <FilePicker\n value={value.length ? value : undefined}\n onReplace={!hideReplace ? this.handleReplace : undefined}\n onSelected={this.handleSelected}\n onDelete={onDelete}\n onDownload={!hideDownload ? this.handleDownload : undefined}\n limitReached={limitReached}\n multiple={multiple}\n {...rest}\n {...readonlyProps}\n />\n )}\n </Confirm>\n </Fragment>\n );\n }\n}\n"],"names":["Component","Fragment","injectDependency","optional","observer","observable","action","makeObservable","FilePicker","Banner","Confirm","FILE_UPLOADER_CONFIGURATION_TOKEN","Uploader","v4","uuid","immutableSplice","arr","start","deleteCount","items","slice","UploadErrors","errors","className","onClose","multiple","title","icon","status","ul","map","id","file","message","li","style","listStyle","name","FileUploader","addError","push","clearErrors","componentDidMount","uploader","config","props","progress","handleUploadProgress","success","handleUploadSuccess","error","handleUploadError","folderName","componentWillUnmount","cancel","render","value","onChange","hideReplace","hideDownload","limitReached","rest","length","readonlyProps","onReplace","undefined","onDelete","handleErrorsClose","onConfirm","handleDelete","handleReplace","onSelected","handleSelected","onDownload","handleDownload","index","findIndex","fileDescriptor","uploadProgress","displayName","downloadLink","filter","path","downloadPath","window","open","files","Array","from","upload","newFile","defaultProps"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { FormState, ValidatableMapOrArray } from 'formstate';
1
+ import type { FormState, ValidatableMapOrArray } from 'formstate';
2
2
  export interface FormStateErrorBannerProps<T extends ValidatableMapOrArray> {
3
3
  form: FormState<T>;
4
4
  className?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"form-state-error-banner.d.ts","sourceRoot":"","sources":["../../src/form-state-error-banner/form-state-error-banner.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAE7D,MAAM,WAAW,yBAAyB,CAAC,CAAC,SAAS,qBAAqB;IACtE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,oBAAoB,GAC5B,CAAC,SAAS,qBAAqB,kDAK7B,yBAAyB,CAAC,CAAC,CAAC,4CAuBlC,CAAC"}
1
+ {"version":3,"file":"form-state-error-banner.d.ts","sourceRoot":"","sources":["../../src/form-state-error-banner/form-state-error-banner.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAElE,MAAM,WAAW,yBAAyB,CAAC,CAAC,SAAS,qBAAqB;IACtE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,oBAAoB,GAC5B,CAAC,SAAS,qBAAqB,kDAK7B,yBAAyB,CAAC,CAAC,CAAC,4CAuBlC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/form-state-error-banner/form-state-error-banner.tsx"],"sourcesContent":["import { Banner } from '@servicetitan/design-system';\nimport { traverseFormState } from '@servicetitan/form-state';\nimport { observer } from 'mobx-react';\nimport { FormState, ValidatableMapOrArray } from 'formstate';\n\nexport interface FormStateErrorBannerProps<T extends ValidatableMapOrArray> {\n form: FormState<T>;\n className?: string;\n errorTitle?: string;\n successTitle?: string;\n}\n\nexport const FormStateErrorBanner = observer(\n <T extends ValidatableMapOrArray>({\n form,\n className,\n errorTitle = 'Form Incomplete',\n successTitle = 'Form Complete',\n }: FormStateErrorBannerProps<T>) => {\n const errors: string[] = [];\n traverseFormState(true, form, (_0, formState) => {\n if (formState.formError) {\n errors.push(formState.formError);\n }\n });\n if (form.formError) {\n errors.push(form.formError);\n }\n const status = errors.length === 0 ? 'success' : 'critical';\n const title = errors.length === 0 ? successTitle : errorTitle;\n return (\n <Banner className={className} status={status} icon title={title}>\n <ul>\n {errors.map((e, index) => (\n // eslint-disable-next-line react/no-array-index-key\n <li key={index}>{e}</li>\n ))}\n </ul>\n </Banner>\n );\n }\n);\n"],"names":["Banner","traverseFormState","observer","FormStateErrorBanner","form","className","errorTitle","successTitle","errors","_0","formState","formError","push","status","length","title","icon","ul","map","e","index","li"],"mappings":";AAAA,SAASA,MAAM,QAAQ,8BAA8B;AACrD,SAASC,iBAAiB,QAAQ,2BAA2B;AAC7D,SAASC,QAAQ,QAAQ,aAAa;AAUtC,OAAO,MAAMC,uBAAuBD,SAChC,CAAkC,EAC9BE,IAAI,EACJC,SAAS,EACTC,aAAa,iBAAiB,EAC9BC,eAAe,eAAe,EACH;IAC3B,MAAMC,SAAmB,EAAE;IAC3BP,kBAAkB,MAAMG,MAAM,CAACK,IAAIC;QAC/B,IAAIA,UAAUC,SAAS,EAAE;YACrBH,OAAOI,IAAI,CAACF,UAAUC,SAAS;QACnC;IACJ;IACA,IAAIP,KAAKO,SAAS,EAAE;QAChBH,OAAOI,IAAI,CAACR,KAAKO,SAAS;IAC9B;IACA,MAAME,SAASL,OAAOM,MAAM,KAAK,IAAI,YAAY;IACjD,MAAMC,QAAQP,OAAOM,MAAM,KAAK,IAAIP,eAAeD;IACnD,qBACI,KAACN;QAAOK,WAAWA;QAAWQ,QAAQA;QAAQG,IAAI;QAACD,OAAOA;kBACtD,cAAA,KAACE;sBACIT,OAAOU,GAAG,CAAC,CAACC,GAAGC,QACZ,oDAAoD;8BACpD,KAACC;8BAAgBF;mBAARC;;;AAK7B,GACF"}
1
+ {"version":3,"sources":["../../src/form-state-error-banner/form-state-error-banner.tsx"],"sourcesContent":["import { Banner } from '@servicetitan/design-system';\nimport { traverseFormState } from '@servicetitan/form-state';\nimport { observer } from 'mobx-react';\nimport type { FormState, ValidatableMapOrArray } from 'formstate';\n\nexport interface FormStateErrorBannerProps<T extends ValidatableMapOrArray> {\n form: FormState<T>;\n className?: string;\n errorTitle?: string;\n successTitle?: string;\n}\n\nexport const FormStateErrorBanner = observer(\n <T extends ValidatableMapOrArray>({\n form,\n className,\n errorTitle = 'Form Incomplete',\n successTitle = 'Form Complete',\n }: FormStateErrorBannerProps<T>) => {\n const errors: string[] = [];\n traverseFormState(true, form, (_0, formState) => {\n if (formState.formError) {\n errors.push(formState.formError);\n }\n });\n if (form.formError) {\n errors.push(form.formError);\n }\n const status = errors.length === 0 ? 'success' : 'critical';\n const title = errors.length === 0 ? successTitle : errorTitle;\n return (\n <Banner className={className} status={status} icon title={title}>\n <ul>\n {errors.map((e, index) => (\n // eslint-disable-next-line react/no-array-index-key\n <li key={index}>{e}</li>\n ))}\n </ul>\n </Banner>\n );\n }\n);\n"],"names":["Banner","traverseFormState","observer","FormStateErrorBanner","form","className","errorTitle","successTitle","errors","_0","formState","formError","push","status","length","title","icon","ul","map","e","index","li"],"mappings":";AAAA,SAASA,MAAM,QAAQ,8BAA8B;AACrD,SAASC,iBAAiB,QAAQ,2BAA2B;AAC7D,SAASC,QAAQ,QAAQ,aAAa;AAUtC,OAAO,MAAMC,uBAAuBD,SAChC,CAAkC,EAC9BE,IAAI,EACJC,SAAS,EACTC,aAAa,iBAAiB,EAC9BC,eAAe,eAAe,EACH;IAC3B,MAAMC,SAAmB,EAAE;IAC3BP,kBAAkB,MAAMG,MAAM,CAACK,IAAIC;QAC/B,IAAIA,UAAUC,SAAS,EAAE;YACrBH,OAAOI,IAAI,CAACF,UAAUC,SAAS;QACnC;IACJ;IACA,IAAIP,KAAKO,SAAS,EAAE;QAChBH,OAAOI,IAAI,CAACR,KAAKO,SAAS;IAC9B;IACA,MAAME,SAASL,OAAOM,MAAM,KAAK,IAAI,YAAY;IACjD,MAAMC,QAAQP,OAAOM,MAAM,KAAK,IAAIP,eAAeD;IACnD,qBACI,KAACN;QAAOK,WAAWA;QAAWQ,QAAQA;QAAQG,IAAI;QAACD,OAAOA;kBACtD,cAAA,KAACE;sBACIT,OAAOU,GAAG,CAAC,CAACC,GAAGC,QACZ,oDAAoD;8BACpD,KAACC;8BAAgBF;mBAARC;;;AAK7B,GACF"}
@@ -1,5 +1,5 @@
1
- import { FC, PropsWithChildren } from 'react';
2
- import { InputProps } from '@servicetitan/design-system';
1
+ import type { FC, PropsWithChildren } from 'react';
2
+ import type { InputProps } from '@servicetitan/design-system';
3
3
  export interface InputDateMaskProps extends Omit<InputProps, 'onChange' | 'value'> {
4
4
  value?: Date;
5
5
  ['qa-testing']?: string;