@servicetitan/marketing-ui 0.5.0 → 0.8.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.
- package/dist/components/image-cropper/image-cropper.d.ts +23 -0
- package/dist/components/image-cropper/image-cropper.d.ts.map +1 -0
- package/dist/components/image-cropper/image-cropper.js +146 -0
- package/dist/components/image-cropper/image-cropper.js.map +1 -0
- package/dist/components/image-cropper/image-cropper.stories.d.ts +10 -0
- package/dist/components/image-cropper/image-cropper.stories.d.ts.map +1 -0
- package/dist/components/image-cropper/image-cropper.stories.js +55 -0
- package/dist/components/image-cropper/image-cropper.stories.js.map +1 -0
- package/dist/components/ui/date-range-picker/date-range-picker.d.ts +10 -0
- package/dist/components/ui/date-range-picker/date-range-picker.d.ts.map +1 -0
- package/dist/components/ui/date-range-picker/date-range-picker.js +77 -0
- package/dist/components/ui/date-range-picker/date-range-picker.js.map +1 -0
- package/dist/components/ui/date-range-picker/date-range-picker.module.less +42 -0
- package/dist/components/ui/date-range-picker/date-range-picker.stories.d.ts +10 -0
- package/dist/components/ui/date-range-picker/date-range-picker.stories.d.ts.map +1 -0
- package/dist/components/ui/date-range-picker/date-range-picker.stories.js +17 -0
- package/dist/components/ui/date-range-picker/date-range-picker.stories.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/date/__mocks__/date-mock.d.ts +5 -0
- package/dist/utils/date/__mocks__/date-mock.d.ts.map +1 -0
- package/dist/utils/date/__mocks__/date-mock.js +23 -0
- package/dist/utils/date/__mocks__/date-mock.js.map +1 -0
- package/dist/utils/date/date-range-picker-options.d.ts +45 -0
- package/dist/utils/date/date-range-picker-options.d.ts.map +1 -0
- package/dist/utils/date/date-range-picker-options.js +138 -0
- package/dist/utils/date/date-range-picker-options.js.map +1 -0
- package/dist/utils/date/date-range-picker-state.d.ts +24 -0
- package/dist/utils/date/date-range-picker-state.d.ts.map +1 -0
- package/dist/utils/date/date-range-picker-state.js +73 -0
- package/dist/utils/date/date-range-picker-state.js.map +1 -0
- package/dist/utils/date/date-tenant.d.ts +17 -0
- package/dist/utils/date/date-tenant.d.ts.map +1 -0
- package/dist/utils/date/date-tenant.js +51 -0
- package/dist/utils/date/date-tenant.js.map +1 -0
- package/dist/utils/date/date.d.ts +11 -0
- package/dist/utils/date/date.d.ts.map +1 -0
- package/dist/utils/date/date.js +22 -0
- package/dist/utils/date/date.js.map +1 -0
- package/dist/utils/date/index.d.ts +5 -0
- package/dist/utils/date/index.d.ts.map +1 -0
- package/dist/utils/date/index.js +17 -0
- package/dist/utils/date/index.js.map +1 -0
- package/dist/utils/history/history.d.ts +9 -3
- package/dist/utils/history/history.d.ts.map +1 -1
- package/dist/utils/history/history.js +9 -7
- package/dist/utils/history/history.js.map +1 -1
- package/dist/utils/history/index.d.ts +1 -0
- package/dist/utils/history/index.d.ts.map +1 -1
- package/dist/utils/history/index.js +1 -0
- package/dist/utils/history/index.js.map +1 -1
- package/dist/utils/history/query-params-handler.d.ts +1 -0
- package/dist/utils/history/query-params-handler.d.ts.map +1 -1
- package/dist/utils/history/query-params-handler.js +3 -0
- package/dist/utils/history/query-params-handler.js.map +1 -1
- package/dist/utils/history/url-params-handler.d.ts +18 -0
- package/dist/utils/history/url-params-handler.d.ts.map +1 -0
- package/dist/utils/history/url-params-handler.js +64 -0
- package/dist/utils/history/url-params-handler.js.map +1 -0
- package/dist/utils/history/use-query-params.d.ts.map +1 -1
- package/dist/utils/history/use-query-params.js +5 -3
- package/dist/utils/history/use-query-params.js.map +1 -1
- package/dist/utils/history/use-url-params.d.ts +5 -5
- package/dist/utils/history/use-url-params.d.ts.map +1 -1
- package/dist/utils/history/use-url-params.js +4 -19
- package/dist/utils/history/use-url-params.js.map +1 -1
- package/dist/utils/{use-init-effect.d.ts → invariable-hooks.d.ts} +6 -1
- package/dist/utils/invariable-hooks.d.ts.map +1 -0
- package/dist/utils/{use-init-effect.js → invariable-hooks.js} +11 -2
- package/dist/utils/invariable-hooks.js.map +1 -0
- package/dist/utils/param-parsers.d.ts +2 -1
- package/dist/utils/param-parsers.d.ts.map +1 -1
- package/dist/utils/param-parsers.js +21 -1
- package/dist/utils/param-parsers.js.map +1 -1
- package/package.json +5 -3
- package/src/components/image-cropper/image-cropper.stories.tsx +69 -0
- package/src/components/image-cropper/image-cropper.tsx +108 -0
- package/src/components/ui/date-range-picker/date-range-picker.module.less +42 -0
- package/src/components/ui/date-range-picker/date-range-picker.module.less.d.ts +4 -0
- package/src/components/ui/date-range-picker/date-range-picker.stories.tsx +22 -0
- package/src/components/ui/date-range-picker/date-range-picker.tsx +118 -0
- package/src/index.ts +2 -1
- package/src/utils/__tests__/param-parsers.test.ts +11 -2
- package/src/utils/date/__mocks__/date-mock.ts +23 -0
- package/src/utils/date/__tests__/date-range-picker.test.ts +139 -0
- package/src/utils/date/__tests__/date-tenant.test.ts +38 -0
- package/src/utils/date/date-range-picker-options.ts +167 -0
- package/src/utils/date/date-range-picker-state.ts +62 -0
- package/src/utils/date/date-tenant.ts +49 -0
- package/src/utils/date/date.ts +29 -0
- package/src/utils/date/index.ts +4 -0
- package/src/utils/history/__tests__/history.test.ts +9 -2
- package/src/utils/history/__tests__/url-params-handler.test.ts +32 -0
- package/src/utils/history/__tests__/use-url-params.test.ts +2 -1
- package/src/utils/history/history.ts +27 -10
- package/src/utils/history/index.ts +1 -0
- package/src/utils/history/query-params-handler.ts +4 -0
- package/src/utils/history/url-params-handler.ts +65 -0
- package/src/utils/history/use-query-params.ts +5 -3
- package/src/utils/history/use-url-params.ts +7 -32
- package/src/utils/{use-init-effect.ts → invariable-hooks.ts} +10 -1
- package/src/utils/param-parsers.ts +26 -1
- package/dist/utils/use-init-effect.d.ts.map +0 -1
- package/dist/utils/use-init-effect.js.map +0 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UrlParamsHandler = void 0;
|
|
4
|
+
const param_parsers_1 = require("../param-parsers");
|
|
5
|
+
const helpers_1 = require("../helpers");
|
|
6
|
+
class UrlParamsHandler {
|
|
7
|
+
constructor(parsers) {
|
|
8
|
+
Object.defineProperty(this, "parsers", {
|
|
9
|
+
enumerable: true,
|
|
10
|
+
configurable: true,
|
|
11
|
+
writable: true,
|
|
12
|
+
value: parsers
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
static from(parsers) {
|
|
16
|
+
return new UrlParamsHandler(parsers);
|
|
17
|
+
}
|
|
18
|
+
toString(values) {
|
|
19
|
+
const params = {};
|
|
20
|
+
if (!values) {
|
|
21
|
+
return params;
|
|
22
|
+
}
|
|
23
|
+
for (const key of helpers_1.keys(values)) {
|
|
24
|
+
const parser = this.parsers[key];
|
|
25
|
+
if (!parser) {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
const value = values[key];
|
|
29
|
+
if (value !== undefined) {
|
|
30
|
+
params[key] = parser.stringify(value);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return params;
|
|
34
|
+
}
|
|
35
|
+
parse(params) {
|
|
36
|
+
var _a;
|
|
37
|
+
const values = {};
|
|
38
|
+
for (const key of helpers_1.keys(params)) {
|
|
39
|
+
const parser = (_a = this.parsers) === null || _a === void 0 ? void 0 : _a[key];
|
|
40
|
+
if (!parser) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const value = params[key];
|
|
44
|
+
if (value !== undefined) {
|
|
45
|
+
values[key] = parser.parse(value);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return values;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.UrlParamsHandler = UrlParamsHandler;
|
|
52
|
+
Object.defineProperty(UrlParamsHandler, "parserString", {
|
|
53
|
+
enumerable: true,
|
|
54
|
+
configurable: true,
|
|
55
|
+
writable: true,
|
|
56
|
+
value: param_parsers_1.paramParsers.uri
|
|
57
|
+
});
|
|
58
|
+
Object.defineProperty(UrlParamsHandler, "parserNumber", {
|
|
59
|
+
enumerable: true,
|
|
60
|
+
configurable: true,
|
|
61
|
+
writable: true,
|
|
62
|
+
value: param_parsers_1.paramParsers.number
|
|
63
|
+
});
|
|
64
|
+
//# sourceMappingURL=url-params-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-params-handler.js","sourceRoot":"","sources":["../../../src/utils/history/url-params-handler.ts"],"names":[],"mappings":";;;AAAA,oDAAmE;AACnE,wCAAkC;AAUlC,MAAa,gBAAgB;IAIzB,YAAoB,OAAmC;;;;;mBAAnC;;IAAsC,CAAC;IAE3D,MAAM,CAAC,IAAI,CAAI,OAA8B;QACzC,OAAO,IAAI,gBAAgB,CAAI,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,QAAQ,CAAC,MAAwB;QAC7B,MAAM,MAAM,GAAkC,EAAE,CAAC;QAEjD,IAAI,CAAC,MAAM,EAAE;YACT,OAAO,MAAM,CAAC;SACjB;QAED,KAAK,MAAM,GAAG,IAAI,cAAI,CAAC,MAAM,CAAC,EAAE;YAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAEjC,IAAI,CAAC,MAAM,EAAE;gBACT,SAAS;aACZ;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAE1B,IAAI,KAAK,KAAK,SAAS,EAAE;gBACrB,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,KAAM,CAAC,CAAC;aAC1C;SACJ;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,MAA4B;;QAC9B,MAAM,MAAM,GAAoB,EAAE,CAAC;QAEnC,KAAK,MAAM,GAAG,IAAI,cAAI,CAAC,MAAM,CAAC,EAAE;YAC5B,MAAM,MAAM,GAAG,MAAA,IAAI,CAAC,OAAO,0CAAG,GAAG,CAAC,CAAC;YAEnC,IAAI,CAAC,MAAM,EAAE;gBACT,SAAS;aACZ;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAE1B,IAAI,KAAK,KAAK,SAAS,EAAE;gBACrB,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;aACrC;SACJ;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;;AApDL,4CAqDC;AApDG;;;;WAA+B,4BAAY,CAAC,GAAG;GAAC;AAChD;;;;WAA+B,4BAAY,CAAC,MAAM;GAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-query-params.d.ts","sourceRoot":"","sources":["../../../src/utils/history/use-query-params.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"use-query-params.d.ts","sourceRoot":"","sources":["../../../src/utils/history/use-query-params.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,GAAG,SAAS,CAAC;IACtE,MAAM,EAAE,CAAC,CAAC;IACV,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IACxB,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACxC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IACxC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IAC3C,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC;IAC1C,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC;CAC7C;AAcD,iBAAS,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,eAAe,CAAC,CAAC,CAAC,CAAC;AAChF,iBAAS,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACjD,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAC/B,eAAe,CAAC,CAAC,CAAC,CAAC;AAqCtB,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -4,6 +4,7 @@ exports.useQueryParams = void 0;
|
|
|
4
4
|
const react_1 = require("react");
|
|
5
5
|
const react_router_dom_1 = require("react-router-dom");
|
|
6
6
|
const history_1 = require("history");
|
|
7
|
+
const invariable_hooks_1 = require("../invariable-hooks");
|
|
7
8
|
const parseParams = (search) => {
|
|
8
9
|
const params = new URLSearchParams(search);
|
|
9
10
|
const out = {};
|
|
@@ -14,9 +15,10 @@ const stringifyParams = (params) => new URLSearchParams(params).toString();
|
|
|
14
15
|
function useQueryParams(handler) {
|
|
15
16
|
const history = react_router_dom_1.useHistory();
|
|
16
17
|
const search = history.location.search || '';
|
|
18
|
+
const memoHandler = invariable_hooks_1.useInvariableMemo(() => handler);
|
|
17
19
|
return react_1.useMemo(() => {
|
|
18
|
-
const currentValues =
|
|
19
|
-
const stringify = (params) =>
|
|
20
|
+
const currentValues = memoHandler ? memoHandler.parse(search) : parseParams(search);
|
|
21
|
+
const stringify = (params) => memoHandler ? memoHandler.toString(params) : stringifyParams(params);
|
|
20
22
|
const createPathWithParams = (pathName, params) => history_1.createPath({ pathname: pathName, search: stringify(params) });
|
|
21
23
|
const update = (params) => {
|
|
22
24
|
history.replace(createPathWithParams(history.location.pathname, params));
|
|
@@ -36,7 +38,7 @@ function useQueryParams(handler) {
|
|
|
36
38
|
pathname: history_1.createPath({ pathname: pathName, search: stringify(params) }),
|
|
37
39
|
}),
|
|
38
40
|
};
|
|
39
|
-
}, [search,
|
|
41
|
+
}, [search, memoHandler, history]);
|
|
40
42
|
}
|
|
41
43
|
exports.useQueryParams = useQueryParams;
|
|
42
44
|
//# sourceMappingURL=use-query-params.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-query-params.js","sourceRoot":"","sources":["../../../src/utils/history/use-query-params.ts"],"names":[],"mappings":";;;AAAA,iCAAgC;AAChC,uDAA8C;AAC9C,qCAAqC;
|
|
1
|
+
{"version":3,"file":"use-query-params.js","sourceRoot":"","sources":["../../../src/utils/history/use-query-params.ts"],"names":[],"mappings":";;;AAAA,iCAAgC;AAChC,uDAA8C;AAC9C,qCAAqC;AAErC,0DAAwD;AAYxD,MAAM,WAAW,GAAG,CAAI,MAAc,EAAK,EAAE;IACzC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,EAAE,CAAC;IAEf,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAE,GAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IAE5D,OAAO,GAAQ,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAgC,MAAS,EAAU,EAAE,CACzE,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;AAM3C,SAAS,cAAc,CAAI,OAA+B;IACtD,MAAM,OAAO,GAAG,6BAAU,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;IAC7C,MAAM,WAAW,GAAG,oCAAiB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;IAErD,OAAO,eAAO,CAAC,GAAG,EAAE;QAChB,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAI,MAAM,CAAC,CAAC;QACvF,MAAM,SAAS,GAAG,CAAC,MAAS,EAAE,EAAE,CAC5B,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAEzE,MAAM,oBAAoB,GAAG,CAAC,QAAgB,EAAE,MAAS,EAAE,EAAE,CACzD,oBAAU,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAElE,MAAM,MAAM,GAAG,CAAC,MAAS,EAAE,EAAE;YACzB,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7E,CAAC,CAAC;QAEF,OAAO;YACH,MAAM,EAAE,aAAa;YACrB,MAAM;YACN,aAAa,EAAE,CAAC,MAAkB,EAAE,EAAE,CAAC,MAAM,iCAAM,aAAa,GAAK,MAAM,EAAG;YAC9E,IAAI,EAAE,CAAC,QAAgB,EAAE,MAAS,EAAE,EAAE;gBAClC,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;YACzD,CAAC;YACD,OAAO,EAAE,CAAC,QAAgB,EAAE,MAAS,EAAE,EAAE;gBACrC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;YAC5D,CAAC;YACD,IAAI,EAAE,oBAAoB;YAC1B,IAAI,EAAE,CAAC,QAAgB,EAAE,MAAS,EAAE,EAAE,CAClC,OAAO,CAAC,UAAU,CAAC;gBACf,QAAQ,EAAE,oBAAU,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;aAC1E,CAAC;SACT,CAAC;IACN,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;AACvC,CAAC;AAEQ,wCAAc"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
declare type
|
|
3
|
-
[Prop in keyof
|
|
1
|
+
import { UrlParamsHandler } from './url-params-handler';
|
|
2
|
+
declare type StringParams<T extends Record<string, any>> = {
|
|
3
|
+
[Prop in keyof T]: string | undefined;
|
|
4
4
|
};
|
|
5
|
-
declare function useUrlParams<T extends Record<string, string>>():
|
|
6
|
-
declare function useUrlParams<T extends Record<string, any>>(parsers:
|
|
5
|
+
declare function useUrlParams<T extends Record<string, string>>(): StringParams<T>;
|
|
6
|
+
declare function useUrlParams<T extends Record<string, any>>(parsers: UrlParamsHandler<T>): Partial<T>;
|
|
7
7
|
export { useUrlParams };
|
|
8
8
|
//# sourceMappingURL=use-url-params.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-url-params.d.ts","sourceRoot":"","sources":["../../../src/utils/history/use-url-params.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"use-url-params.d.ts","sourceRoot":"","sources":["../../../src/utils/history/use-url-params.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxD,aAAK,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI;KAC9C,IAAI,IAAI,MAAM,CAAC,GAAG,MAAM,GAAG,SAAS;CACxC,CAAC;AAEF,iBAAS,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC;AAC3E,iBAAS,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAQ/F,OAAO,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -3,26 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.useUrlParams = void 0;
|
|
4
4
|
const react_1 = require("react");
|
|
5
5
|
const react_router_dom_1 = require("react-router-dom");
|
|
6
|
-
const
|
|
7
|
-
function useUrlParams(
|
|
6
|
+
const invariable_hooks_1 = require("../invariable-hooks");
|
|
7
|
+
function useUrlParams(handler) {
|
|
8
8
|
const params = react_router_dom_1.useParams();
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
return params;
|
|
12
|
-
}
|
|
13
|
-
const values = {};
|
|
14
|
-
for (const key of helpers_1.keys(params)) {
|
|
15
|
-
const parser = parsers[key];
|
|
16
|
-
if (!parser) {
|
|
17
|
-
continue;
|
|
18
|
-
}
|
|
19
|
-
const value = params[key];
|
|
20
|
-
if (value !== undefined) {
|
|
21
|
-
values[key] = parser.parse(value);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
return values;
|
|
25
|
-
}, [parsers, params]);
|
|
9
|
+
const memoHandler = invariable_hooks_1.useInvariableMemo(() => handler);
|
|
10
|
+
return react_1.useMemo(() => (memoHandler ? memoHandler.parse(params) : params), [params, memoHandler]);
|
|
26
11
|
}
|
|
27
12
|
exports.useUrlParams = useUrlParams;
|
|
28
13
|
//# sourceMappingURL=use-url-params.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-url-params.js","sourceRoot":"","sources":["../../../src/utils/history/use-url-params.ts"],"names":[],"mappings":";;;AAAA,iCAAgC;AAChC,uDAA6C;AAE7C,
|
|
1
|
+
{"version":3,"file":"use-url-params.js","sourceRoot":"","sources":["../../../src/utils/history/use-url-params.ts"],"names":[],"mappings":";;;AAAA,iCAAgC;AAChC,uDAA6C;AAE7C,0DAAwD;AAQxD,SAAS,YAAY,CAAI,OAA6B;IAClD,MAAM,MAAM,GAAG,4BAAS,EAAmB,CAAC;IAC5C,MAAM,WAAW,GAAG,oCAAiB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;IAErD,OAAO,eAAO,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;AACpG,CAAC;AAEQ,oCAAY"}
|
|
@@ -4,4 +4,9 @@
|
|
|
4
4
|
* @param dispose method called after component unmount
|
|
5
5
|
*/
|
|
6
6
|
export declare function useInitEffect(init: () => void, dispose?: () => void): void;
|
|
7
|
-
|
|
7
|
+
/**
|
|
8
|
+
* gets memo only once
|
|
9
|
+
* @param memo method that returns memoed data
|
|
10
|
+
*/
|
|
11
|
+
export declare function useInvariableMemo<T>(memo: () => T): T;
|
|
12
|
+
//# sourceMappingURL=invariable-hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invariable-hooks.d.ts","sourceRoot":"","sources":["../../src/utils/invariable-hooks.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,IAAI,QAOnE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAGrD"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.useInitEffect = void 0;
|
|
3
|
+
exports.useInvariableMemo = exports.useInitEffect = void 0;
|
|
4
4
|
const react_1 = require("react");
|
|
5
5
|
/**
|
|
6
6
|
* runs effect only once for component
|
|
@@ -15,4 +15,13 @@ function useInitEffect(init, dispose) {
|
|
|
15
15
|
}, []);
|
|
16
16
|
}
|
|
17
17
|
exports.useInitEffect = useInitEffect;
|
|
18
|
-
|
|
18
|
+
/**
|
|
19
|
+
* gets memo only once
|
|
20
|
+
* @param memo method that returns memoed data
|
|
21
|
+
*/
|
|
22
|
+
function useInvariableMemo(memo) {
|
|
23
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
24
|
+
return react_1.useMemo(memo, []);
|
|
25
|
+
}
|
|
26
|
+
exports.useInvariableMemo = useInvariableMemo;
|
|
27
|
+
//# sourceMappingURL=invariable-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invariable-hooks.js","sourceRoot":"","sources":["../../src/utils/invariable-hooks.ts"],"names":[],"mappings":";;;AAAA,iCAA2C;AAE3C;;;;GAIG;AACH,SAAgB,aAAa,CAAC,IAAgB,EAAE,OAAoB;IAChE,iBAAS,CAAC,GAAG,EAAE;QACX,IAAI,EAAE,CAAC;QAEP,OAAO,OAAO,CAAC;QACf,uDAAuD;IAC3D,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,CAAC;AAPD,sCAOC;AAED;;;GAGG;AACH,SAAgB,iBAAiB,CAAI,IAAa;IAC9C,uDAAuD;IACvD,OAAO,eAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAHD,8CAGC"}
|
|
@@ -4,7 +4,8 @@ export interface StringParamParser<T> {
|
|
|
4
4
|
}
|
|
5
5
|
export declare const paramParsers: {
|
|
6
6
|
string: StringParamParser<string>;
|
|
7
|
-
|
|
7
|
+
stringSet: <T extends string>(values: (string | T)[]) => StringParamParser<T>;
|
|
8
|
+
stringEnum: <TS extends string, TV>(map: Record<TS, TV>) => StringParamParser<TV>;
|
|
8
9
|
uri: StringParamParser<string>;
|
|
9
10
|
number: StringParamParser<number>;
|
|
10
11
|
date: StringParamParser<Date>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"param-parsers.d.ts","sourceRoot":"","sources":["../../src/utils/param-parsers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"param-parsers.d.ts","sourceRoot":"","sources":["../../src/utils/param-parsers.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAChC,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM,GAAG,SAAS,CAAC;IACxC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;CACvC;AAyFD,eAAO,MAAM,YAAY;;;;;;;;CAQxB,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.paramParsers = void 0;
|
|
4
|
+
const helpers_1 = require("./helpers");
|
|
4
5
|
const stringParser = {
|
|
5
6
|
stringify(value) {
|
|
6
7
|
return value || undefined;
|
|
@@ -9,7 +10,7 @@ const stringParser = {
|
|
|
9
10
|
return query || undefined;
|
|
10
11
|
},
|
|
11
12
|
};
|
|
12
|
-
const
|
|
13
|
+
const stringSetParser = (values) => ({
|
|
13
14
|
stringify(value) {
|
|
14
15
|
return value || undefined;
|
|
15
16
|
},
|
|
@@ -20,6 +21,24 @@ const stringEnumParser = (values) => ({
|
|
|
20
21
|
return undefined;
|
|
21
22
|
},
|
|
22
23
|
});
|
|
24
|
+
const stringEnumParser = (map) => ({
|
|
25
|
+
stringify(value) {
|
|
26
|
+
for (const key of helpers_1.keys(map)) {
|
|
27
|
+
if (map[key] === value) {
|
|
28
|
+
return key;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return undefined;
|
|
32
|
+
},
|
|
33
|
+
parse(query) {
|
|
34
|
+
const key = query;
|
|
35
|
+
// eslint-disable-next-line no-prototype-builtins
|
|
36
|
+
if (map.hasOwnProperty(key)) {
|
|
37
|
+
return map[key];
|
|
38
|
+
}
|
|
39
|
+
return undefined;
|
|
40
|
+
},
|
|
41
|
+
});
|
|
23
42
|
const uriParser = {
|
|
24
43
|
stringify(value) {
|
|
25
44
|
return value || undefined;
|
|
@@ -59,6 +78,7 @@ const boolParser = {
|
|
|
59
78
|
};
|
|
60
79
|
exports.paramParsers = {
|
|
61
80
|
string: stringParser,
|
|
81
|
+
stringSet: stringSetParser,
|
|
62
82
|
stringEnum: stringEnumParser,
|
|
63
83
|
uri: uriParser,
|
|
64
84
|
number: numberParser,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"param-parsers.js","sourceRoot":"","sources":["../../src/utils/param-parsers.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"param-parsers.js","sourceRoot":"","sources":["../../src/utils/param-parsers.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@servicetitan/marketing-ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Marketing UI component and utils",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -14,7 +14,8 @@
|
|
|
14
14
|
"src"
|
|
15
15
|
],
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"classnames": "~2.3.1"
|
|
17
|
+
"classnames": "~2.3.1",
|
|
18
|
+
"react-image-crop": "8.6.5"
|
|
18
19
|
},
|
|
19
20
|
"peerDependencies": {
|
|
20
21
|
"@servicetitan/design-system": "~10.1.1",
|
|
@@ -36,6 +37,7 @@
|
|
|
36
37
|
"@types/accounting": "~0.4.2",
|
|
37
38
|
"@types/history": "~4.7.7",
|
|
38
39
|
"@types/react": "~17.0.15",
|
|
40
|
+
"@types/react-image-crop": "8.1.2",
|
|
39
41
|
"@types/react-router-dom": "^5.1.8",
|
|
40
42
|
"accounting": "~0.4.1",
|
|
41
43
|
"history": "~4.10.1",
|
|
@@ -52,5 +54,5 @@
|
|
|
52
54
|
"less": true,
|
|
53
55
|
"webpack": false
|
|
54
56
|
},
|
|
55
|
-
"gitHead": "
|
|
57
|
+
"gitHead": "67ee035810f83c8ee85519f18ee746a7417f1c6d"
|
|
56
58
|
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ImageCropper } from './image-cropper';
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
title: 'Marketing UI/ImageCropper/ImageCropper',
|
|
6
|
+
component: ImageCropper,
|
|
7
|
+
parameters: {},
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
const BasicExample: React.FC = () => {
|
|
11
|
+
const [imageToEdit, setImageToEdit] = React.useState<File>();
|
|
12
|
+
const [croppedImage, setCroppedImage] = React.useState<string>();
|
|
13
|
+
|
|
14
|
+
const imageCropper = React.useRef<ImageCropper>(null);
|
|
15
|
+
|
|
16
|
+
const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
|
17
|
+
const file = e.target.files?.[0];
|
|
18
|
+
if (!file) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
setImageToEdit(file);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const handleSave = async () => {
|
|
26
|
+
if (!imageToEdit) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const file = await imageCropper.current?.getCroppedImg(imageToEdit.type, imageToEdit.name);
|
|
30
|
+
if (!file) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const reader = new FileReader();
|
|
34
|
+
reader.readAsDataURL(file);
|
|
35
|
+
reader.onload = () => {
|
|
36
|
+
setCroppedImage(reader.result as string);
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
return (
|
|
41
|
+
<React.Fragment>
|
|
42
|
+
<input type="file" accept="image/png, image/jpeg" onChange={handleFileChange} />
|
|
43
|
+
{imageToEdit && (
|
|
44
|
+
<div style={{ marginTop: 30 }}>
|
|
45
|
+
<button onClick={handleSave}>Save cropped image</button>
|
|
46
|
+
<div style={{ marginTop: 30 }}>
|
|
47
|
+
<ImageCropper
|
|
48
|
+
file={imageToEdit}
|
|
49
|
+
ref={imageCropper}
|
|
50
|
+
crop={{ width: 300, height: 300 }}
|
|
51
|
+
/>
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
)}
|
|
55
|
+
{croppedImage && (
|
|
56
|
+
<div style={{ marginTop: 30 }}>
|
|
57
|
+
<a href={croppedImage} download={imageToEdit?.name}>
|
|
58
|
+
Download
|
|
59
|
+
</a>
|
|
60
|
+
<div style={{ marginTop: 30 }}>
|
|
61
|
+
<img src={croppedImage} />
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
)}
|
|
65
|
+
</React.Fragment>
|
|
66
|
+
);
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export const basic = () => <BasicExample />;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { observable, action, makeObservable } from 'mobx';
|
|
3
|
+
import { observer } from 'mobx-react';
|
|
4
|
+
import ReactCrop, { Crop } from 'react-image-crop';
|
|
5
|
+
import 'react-image-crop/dist/ReactCrop.css';
|
|
6
|
+
|
|
7
|
+
interface ImageCropperProps {
|
|
8
|
+
file: File;
|
|
9
|
+
crop: {
|
|
10
|
+
width: number;
|
|
11
|
+
height: number;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
@observer
|
|
16
|
+
export class ImageCropper extends React.Component<ImageCropperProps> {
|
|
17
|
+
@observable private src?: string;
|
|
18
|
+
@observable private crop?: Crop;
|
|
19
|
+
@observable private image?: HTMLImageElement;
|
|
20
|
+
|
|
21
|
+
constructor(props: ImageCropperProps) {
|
|
22
|
+
super(props);
|
|
23
|
+
makeObservable(this);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
getCroppedImg = (type: string, fileName: string) =>
|
|
27
|
+
new Promise<File | undefined>(resolve => {
|
|
28
|
+
if (!this.image || !this.crop) {
|
|
29
|
+
resolve(undefined);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const { x, y } = this.crop;
|
|
34
|
+
if (x == null || y == null) {
|
|
35
|
+
resolve(undefined);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const { width, height } = this.props.crop;
|
|
40
|
+
const canvas = document.createElement('canvas');
|
|
41
|
+
canvas.width = width;
|
|
42
|
+
canvas.height = height;
|
|
43
|
+
const ctx = canvas.getContext('2d');
|
|
44
|
+
if (!ctx) {
|
|
45
|
+
resolve(undefined);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
ctx.drawImage(
|
|
50
|
+
this.image,
|
|
51
|
+
x * (this.image.naturalWidth / this.image.width),
|
|
52
|
+
y * (this.image.naturalHeight / this.image.height),
|
|
53
|
+
width,
|
|
54
|
+
height,
|
|
55
|
+
0,
|
|
56
|
+
0,
|
|
57
|
+
width,
|
|
58
|
+
height
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
canvas.toBlob(
|
|
62
|
+
blob => {
|
|
63
|
+
const result = blob ? new File([blob], fileName) : undefined;
|
|
64
|
+
resolve(result);
|
|
65
|
+
},
|
|
66
|
+
type,
|
|
67
|
+
1
|
|
68
|
+
);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
@action
|
|
72
|
+
componentDidMount = () => (this.src = URL.createObjectURL(this.props.file));
|
|
73
|
+
|
|
74
|
+
componentWillUnmount = () => {
|
|
75
|
+
if (this.src) {
|
|
76
|
+
URL.revokeObjectURL(this.src);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
render() {
|
|
81
|
+
return this.src ? (
|
|
82
|
+
<ReactCrop
|
|
83
|
+
locked
|
|
84
|
+
src={this.src}
|
|
85
|
+
crop={this.crop}
|
|
86
|
+
onChange={this.handleChange}
|
|
87
|
+
onImageLoaded={this.handleImageLoaded}
|
|
88
|
+
/>
|
|
89
|
+
) : null;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
@action
|
|
93
|
+
private handleChange = (crop: Crop) => (this.crop = crop);
|
|
94
|
+
|
|
95
|
+
@action
|
|
96
|
+
private handleImageLoaded = (image: HTMLImageElement) => {
|
|
97
|
+
this.image = image;
|
|
98
|
+
this.crop = {
|
|
99
|
+
unit: 'px',
|
|
100
|
+
x: 0,
|
|
101
|
+
y: 0,
|
|
102
|
+
width: this.props.crop.width * (image.width / image.naturalWidth),
|
|
103
|
+
height: this.props.crop.height * (image.height / image.naturalHeight),
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
return false;
|
|
107
|
+
};
|
|
108
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
@import (reference) '~@servicetitan/tokens/dist/tokens';
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* Custom value text is not supported for DateRangePicker now (will be implemented in DS-699)
|
|
5
|
+
* so temporary adding custom value manually
|
|
6
|
+
*/
|
|
7
|
+
.picker-container {
|
|
8
|
+
width: 260px;
|
|
9
|
+
|
|
10
|
+
:global {
|
|
11
|
+
.FormField {
|
|
12
|
+
position: relative;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.FormField__label {
|
|
16
|
+
margin: 0;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.DateRangeTrigger__shortLabel {
|
|
20
|
+
background: @color-white;
|
|
21
|
+
color: @color-neutral-90;
|
|
22
|
+
border-right: 0;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.Trigger__value {
|
|
26
|
+
display: none;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.Label__required {
|
|
30
|
+
display: none;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.picker-value {
|
|
35
|
+
position: absolute;
|
|
36
|
+
top: 0;
|
|
37
|
+
bottom: 0;
|
|
38
|
+
left: 40px;
|
|
39
|
+
z-index: 1;
|
|
40
|
+
max-width: 190px;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { DateRangePicker } from './date-range-picker';
|
|
3
|
+
import { DateRangePickerState, DateRangePickerOptionsTenantAds } from '../../../utils/date';
|
|
4
|
+
|
|
5
|
+
export default {
|
|
6
|
+
title: 'Marketing UI/ui/date-range-picker/DateRangePicker',
|
|
7
|
+
component: DateRangePicker,
|
|
8
|
+
parameters: {},
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
const tz = { UtcOffset: 0 };
|
|
12
|
+
const state = DateRangePickerState.createWithOptions(DateRangePickerOptionsTenantAds.create(tz));
|
|
13
|
+
|
|
14
|
+
const w = (style: { width?: string; height?: string }, Component: React.FC) => () =>
|
|
15
|
+
(
|
|
16
|
+
<div style={style}>
|
|
17
|
+
<Component />
|
|
18
|
+
</div>
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
export const dateRangePicker = w({}, () => <DateRangePicker state={state} />);
|
|
22
|
+
export const dateRangePickerCompare = w({}, () => <DateRangePicker state={state} compare />);
|