@servicetitan/form 14.3.0 → 16.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. package/dist/date-range-picker/date-range-picker.d.ts +47 -0
  2. package/dist/date-range-picker/date-range-picker.d.ts.map +1 -0
  3. package/dist/date-range-picker/date-range-picker.js +256 -0
  4. package/dist/date-range-picker/date-range-picker.js.map +1 -0
  5. package/dist/date-range-picker/date-range-picker.module.css +37 -0
  6. package/dist/date-range-picker/index.d.ts +2 -0
  7. package/dist/date-range-picker/index.d.ts.map +1 -0
  8. package/dist/date-range-picker/index.js +14 -0
  9. package/dist/date-range-picker/index.js.map +1 -0
  10. package/dist/demo/date-range-picker.d.ts +3 -0
  11. package/dist/demo/date-range-picker.d.ts.map +1 -0
  12. package/dist/demo/date-range-picker.js +17 -0
  13. package/dist/demo/date-range-picker.js.map +1 -0
  14. package/dist/demo/index.d.ts +4 -0
  15. package/dist/demo/index.d.ts.map +1 -1
  16. package/dist/demo/index.js +4 -0
  17. package/dist/demo/index.js.map +1 -1
  18. package/dist/demo/input-date-mask.d.ts +3 -0
  19. package/dist/demo/input-date-mask.d.ts.map +1 -0
  20. package/dist/demo/input-date-mask.js +17 -0
  21. package/dist/demo/input-date-mask.js.map +1 -0
  22. package/dist/demo/original-number-input.d.ts +3 -0
  23. package/dist/demo/original-number-input.d.ts.map +1 -0
  24. package/dist/demo/original-number-input.js +17 -0
  25. package/dist/demo/original-number-input.js.map +1 -0
  26. package/dist/demo/phone-number-input.d.ts +3 -0
  27. package/dist/demo/phone-number-input.d.ts.map +1 -0
  28. package/dist/demo/phone-number-input.js +8 -0
  29. package/dist/demo/phone-number-input.js.map +1 -0
  30. package/dist/index.d.ts +4 -0
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +4 -0
  33. package/dist/index.js.map +1 -1
  34. package/dist/input-date-mask/index.d.ts +2 -0
  35. package/dist/input-date-mask/index.d.ts.map +1 -0
  36. package/dist/input-date-mask/index.js +14 -0
  37. package/dist/input-date-mask/index.js.map +1 -0
  38. package/dist/input-date-mask/input-date-mask.d.ts +14 -0
  39. package/dist/input-date-mask/input-date-mask.d.ts.map +1 -0
  40. package/dist/input-date-mask/input-date-mask.js +122 -0
  41. package/dist/input-date-mask/input-date-mask.js.map +1 -0
  42. package/dist/input-date-mask/input-date-mask.module.css +22 -0
  43. package/dist/original-number-input/index.d.ts +2 -0
  44. package/dist/original-number-input/index.d.ts.map +1 -0
  45. package/dist/original-number-input/index.js +14 -0
  46. package/dist/original-number-input/index.js.map +1 -0
  47. package/dist/original-number-input/ordinal-number-input.d.ts +22 -0
  48. package/dist/original-number-input/ordinal-number-input.d.ts.map +1 -0
  49. package/dist/original-number-input/ordinal-number-input.js +149 -0
  50. package/dist/original-number-input/ordinal-number-input.js.map +1 -0
  51. package/dist/phone-number-input/index.d.ts +2 -0
  52. package/dist/phone-number-input/index.d.ts.map +1 -0
  53. package/dist/phone-number-input/index.js +14 -0
  54. package/dist/phone-number-input/index.js.map +1 -0
  55. package/dist/phone-number-input/phone-number-input.d.ts +7 -0
  56. package/dist/phone-number-input/phone-number-input.d.ts.map +1 -0
  57. package/dist/phone-number-input/phone-number-input.js +26 -0
  58. package/dist/phone-number-input/phone-number-input.js.map +1 -0
  59. package/package.json +20 -13
  60. package/src/date-range-picker/date-range-picker.module.css +37 -0
  61. package/src/date-range-picker/date-range-picker.module.css.d.ts +7 -0
  62. package/src/date-range-picker/date-range-picker.tsx +297 -0
  63. package/src/date-range-picker/index.ts +1 -0
  64. package/src/demo/date-range-picker.tsx +33 -0
  65. package/src/demo/index.ts +4 -0
  66. package/src/demo/input-date-mask.tsx +30 -0
  67. package/src/demo/original-number-input.tsx +32 -0
  68. package/src/demo/phone-number-input.tsx +9 -0
  69. package/src/index.ts +4 -0
  70. package/src/input-date-mask/index.ts +1 -0
  71. package/src/input-date-mask/input-date-mask.module.css +22 -0
  72. package/src/input-date-mask/input-date-mask.module.css.d.ts +4 -0
  73. package/src/input-date-mask/input-date-mask.tsx +157 -0
  74. package/src/original-number-input/__tests__/ordinal-number-input.test.tsx +51 -0
  75. package/src/original-number-input/index.ts +1 -0
  76. package/src/original-number-input/ordinal-number-input.tsx +111 -0
  77. package/src/phone-number-input/index.ts +1 -0
  78. package/src/phone-number-input/phone-number-input.tsx +19 -0
@@ -0,0 +1,111 @@
1
+ import { Input, InputProps } from '@servicetitan/design-system';
2
+ import { action, observable, makeObservable } from 'mobx';
3
+ import { observer } from 'mobx-react';
4
+ import { Component, ChangeEvent } from 'react';
5
+
6
+ export interface OrdinalNumberInputProps extends Omit<InputProps, 'onChange'> {
7
+ min: number;
8
+ max: number;
9
+ value?: number;
10
+ onChange?(value?: number): void;
11
+ }
12
+
13
+ @observer
14
+ export class OrdinalNumberInput extends Component<OrdinalNumberInputProps> {
15
+ @observable hasFocus = false;
16
+
17
+ constructor(props: OrdinalNumberInputProps) {
18
+ super(props);
19
+ makeObservable(this);
20
+ }
21
+
22
+ render() {
23
+ const { min, max, value, onChange, ...props } = this.props;
24
+
25
+ return (
26
+ <Input
27
+ placeholder={this.getPlaceholder()}
28
+ {...props}
29
+ value={this.getDisplayValue()}
30
+ onFocus={this.handleFocus}
31
+ onBlur={this.handleBlur}
32
+ onChange={this.handleChange}
33
+ />
34
+ );
35
+ }
36
+
37
+ @action private handleFocus = () => (this.hasFocus = true);
38
+ @action private handleBlur = () => (this.hasFocus = false);
39
+
40
+ private handleChange = (e: ChangeEvent<HTMLInputElement>): void => {
41
+ const parsed = parseIntIntoRange(e.currentTarget.value, this.props.min, this.props.max);
42
+ if (this.props.onChange) {
43
+ this.props.onChange(parsed);
44
+ }
45
+ };
46
+
47
+ private getPlaceholder() {
48
+ return `${this.props.min}‒${this.props.max}`;
49
+ }
50
+
51
+ private getDisplayValue() {
52
+ const value = this.props.value;
53
+ if (typeof value !== 'number') {
54
+ return '';
55
+ }
56
+ return this.hasFocus ? value.toString() : ordinalString(value);
57
+ }
58
+ }
59
+
60
+ export function parseIntIntoRange(input: string, min: number, max: number) {
61
+ let parsed = parseInt(input, 10);
62
+ if (Number.isNaN(parsed)) {
63
+ return undefined;
64
+ }
65
+ if (parsed < min) {
66
+ parsed = min;
67
+ } else if (parsed > max) {
68
+ parsed = max;
69
+ }
70
+ return parsed;
71
+ }
72
+
73
+ export function ordinalString(num: number): string {
74
+ switch (num % 100) {
75
+ case 11:
76
+ case 12:
77
+ case 13:
78
+ return num.toString() + 'th';
79
+ default:
80
+ switch (num % 10) {
81
+ case 1:
82
+ return num.toString() + 'st';
83
+ case 2:
84
+ return num.toString() + 'nd';
85
+ case 3:
86
+ return num.toString() + 'rd';
87
+ default:
88
+ return num.toString() + 'th';
89
+ }
90
+ }
91
+ }
92
+
93
+ export function ordinalSuffix(num: number): string {
94
+ switch (num % 100) {
95
+ case 11:
96
+ case 12:
97
+ case 13:
98
+ return 'th';
99
+ default:
100
+ switch (num % 10) {
101
+ case 1:
102
+ return 'st';
103
+ case 2:
104
+ return 'nd';
105
+ case 3:
106
+ return 'rd';
107
+ default:
108
+ return 'th';
109
+ }
110
+ }
111
+ }
@@ -0,0 +1 @@
1
+ export * from './phone-number-input';
@@ -0,0 +1,19 @@
1
+ import { forwardRef } from 'react';
2
+ import InputMask from 'react-input-mask';
3
+
4
+ import { Form, FormInputProps } from '@servicetitan/design-system';
5
+
6
+ export interface PhoneNumberInputProps extends FormInputProps {
7
+ sip?: boolean;
8
+ }
9
+
10
+ export const PhoneNumberInput = forwardRef<HTMLInputElement, PhoneNumberInputProps>(
11
+ ({ sip, ...props }, ref) =>
12
+ sip ? (
13
+ <Form.Input {...props} ref={ref} />
14
+ ) : (
15
+ <InputMask maskChar={null} mask="(999) 999-9999" {...props}>
16
+ {() => <Form.Input ref={ref} {...props} />}
17
+ </InputMask>
18
+ )
19
+ );