@neovici/cosmoz-form 3.0.0 → 3.2.0-beta.1
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/form-dialog/form-dialog.d.ts +1 -1
- package/dist/form-dialog/form-dialog.d.ts.map +1 -1
- package/dist/form-dialog/form-dialog.js +5 -5
- package/dist/form-dialog/index.d.ts +1 -0
- package/dist/form-dialog/index.d.ts.map +1 -1
- package/dist/form-dialog/index.js +1 -0
- package/dist/form-dialog/use-form-dialogable$.d.ts +10 -0
- package/dist/form-dialog/use-form-dialogable$.d.ts.map +1 -0
- package/dist/form-dialog/use-form-dialogable$.js +17 -0
- package/dist/form-dialog/use-form-dialogable.d.ts +1 -0
- package/dist/form-dialog/use-form-dialogable.d.ts.map +1 -1
- package/dist/form-dialog/use-form-dialogable.js +13 -12
- package/dist/helpers.d.ts +1 -1
- package/dist/helpers.d.ts.map +1 -1
- package/dist/inputs/date-range.js +5 -5
- package/dist/inputs/inline-file.js +3 -3
- package/dist/test/use-form-dialogable$.test.d.ts +2 -0
- package/dist/test/use-form-dialogable$.test.d.ts.map +1 -0
- package/dist/test/use-form-dialogable$.test.js +103 -0
- package/dist/test/use-validated-form.test.js +6 -0
- package/dist/validation/rules.d.ts.map +1 -1
- package/dist/validation/rules.js +19 -17
- package/package.json +7 -6
|
@@ -15,7 +15,7 @@ export interface Dialog<T extends object> extends Props<T> {
|
|
|
15
15
|
name?: string;
|
|
16
16
|
}
|
|
17
17
|
export declare const formDialog: <T extends object>(props?: Dialog<T>) => Renderable;
|
|
18
|
-
export declare const formDialog$: <T extends object>(props$: Resolvable<Dialog<T>>) => import("lit-html/directive.js").DirectiveResult<{
|
|
18
|
+
export declare const formDialog$: <T extends object>(props$: Resolvable<Dialog<T>> | undefined) => import("lit-html/directive.js").DirectiveResult<{
|
|
19
19
|
new (_partInfo: import("lit-html/directive.js").PartInfo): import("lit-html/directives/until.js").UntilDirective<import("lit-html").TemplateResult<1> | Promise<symbol | {
|
|
20
20
|
toString(): string;
|
|
21
21
|
} | readonly Renderable[] | null | undefined>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-dialog.d.ts","sourceRoot":"","sources":["../../src/form-dialog/form-dialog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,IAAI,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"form-dialog.d.ts","sourceRoot":"","sources":["../../src/form-dialog/form-dialog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,IAAI,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,gCAAgC,CAAC;AACxC,OAAO,yBAAyB,CAAC;AAWjC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,KAAK,IAAI,QAAQ,EAAqB,MAAM,wBAAwB,CAAC;AAG9E,UAAU,KAAK,CAAC,CAAC,SAAS,MAAM,CAAE,SAAQ,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAiDD,MAAM,WAAW,MAAM,CAAC,CAAC,SAAS,MAAM,CAAE,SAAQ,KAAK,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,MAAM,EAAE,QAAQ,MAAM,CAAC,CAAC,CAAC,KAAG,UAkBhE,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,MAAM,EAC3C,QAAQ,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS;;;;EAKxC,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { dialog } from '@neovici/cosmoz-dialog';
|
|
2
2
|
import '@neovici/cosmoz-dialog/loading';
|
|
3
|
-
import { _ } from '@neovici/cosmoz-i18next';
|
|
4
3
|
import '@neovici/cosmoz-spinner';
|
|
5
|
-
import { invoke } from '@neovici/cosmoz-utils/
|
|
4
|
+
import { invoke$ } from '@neovici/cosmoz-utils/promise';
|
|
6
5
|
import { useEffect } from '@pionjs/pion';
|
|
6
|
+
import { t } from 'i18next';
|
|
7
7
|
import { html, nothing } from 'lit-html';
|
|
8
8
|
import { ifDefined } from 'lit-html/directives/if-defined.js';
|
|
9
9
|
import { until } from 'lit-html/directives/until.js';
|
|
@@ -14,7 +14,7 @@ import buttonStyles from '../styles/button';
|
|
|
14
14
|
import { useValidatedForm$ } from '../use-validated-form$';
|
|
15
15
|
import styles from './style.css';
|
|
16
16
|
const FormDialog = (host) => {
|
|
17
|
-
const { description, auto, uncancelable, hideCancelButton, saveText =
|
|
17
|
+
const { description, auto, uncancelable, hideCancelButton, saveText = t('OK'), } = host, { onSave, disabled, save$, progress, ...form } = useValidatedForm$(host);
|
|
18
18
|
useEffect(() => {
|
|
19
19
|
if (!auto) {
|
|
20
20
|
return;
|
|
@@ -30,7 +30,7 @@ const FormDialog = (host) => {
|
|
|
30
30
|
${renderFailure$(save$)}
|
|
31
31
|
${renderButton$({ save$, onSave, disabled, title: saveText, progress })}
|
|
32
32
|
${when(!hideCancelButton, () => html `<button class="button" value="cancel" ?disabled=${uncancelable}>
|
|
33
|
-
${
|
|
33
|
+
${t('Cancel')}
|
|
34
34
|
</button>`)}
|
|
35
35
|
</div>`;
|
|
36
36
|
};
|
|
@@ -57,4 +57,4 @@ export const formDialog = (props) => {
|
|
|
57
57
|
></cosmoz-form-dialog>`;
|
|
58
58
|
return dialog;
|
|
59
59
|
};
|
|
60
|
-
export const formDialog$ = (props$) => until(
|
|
60
|
+
export const formDialog$ = (props$) => until(invoke$(props$).then(formDialog, () => nothing), html `<cosmoz-dialog-loading></cosmoz-dialog-loading>`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/form-dialog/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/form-dialog/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Resolvable } from '../types';
|
|
2
|
+
import { type Dialog } from './form-dialog';
|
|
3
|
+
import { type Dialogable } from './use-form-dialogable';
|
|
4
|
+
export declare const useFormDialogable$: () => {
|
|
5
|
+
dialog: (() => Promise<Dialog<object>>) | undefined;
|
|
6
|
+
rtkn: symbol | undefined;
|
|
7
|
+
setRtkn: import("@pionjs/pion").StateUpdater<symbol | undefined>;
|
|
8
|
+
open: <T extends object>(resolvable: Resolvable<Dialogable<T>>) => void;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=use-form-dialogable$.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-form-dialogable$.d.ts","sourceRoot":"","sources":["../../src/form-dialog/use-form-dialogable$.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,KAAK,UAAU,EAAkB,MAAM,uBAAuB,CAAC;AAIxE,eAAO,MAAM,kBAAkB;mBAFM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;;;WAaxD,CAAC,SAAS,MAAM,cAAc,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;CAe1D,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { invoke$ } from '@neovici/cosmoz-utils/promise';
|
|
2
|
+
import { useCallback, useState } from '@pionjs/pion';
|
|
3
|
+
import { useOpened } from '../hooks/use-opened';
|
|
4
|
+
import { wrapDialogable } from './use-form-dialogable';
|
|
5
|
+
export const useFormDialogable$ = () => {
|
|
6
|
+
const { opened: maybeSlot, onOpen, onClose } = useOpened();
|
|
7
|
+
const [rtkn, setRtkn] = useState();
|
|
8
|
+
const slot = typeof maybeSlot === 'boolean' ? undefined : maybeSlot;
|
|
9
|
+
return {
|
|
10
|
+
dialog: slot?.value,
|
|
11
|
+
rtkn,
|
|
12
|
+
setRtkn,
|
|
13
|
+
open: useCallback((resolvable) => onOpen({
|
|
14
|
+
value: () => invoke$(resolvable).then((dialogable) => wrapDialogable(dialogable, onClose, setRtkn)),
|
|
15
|
+
}), [onClose, setRtkn]),
|
|
16
|
+
};
|
|
17
|
+
};
|
|
@@ -3,6 +3,7 @@ export interface Dialogable<T extends object> extends Dialog<T> {
|
|
|
3
3
|
preventClose?: boolean;
|
|
4
4
|
preventRefresh?: boolean;
|
|
5
5
|
}
|
|
6
|
+
export declare const wrapDialogable: <T extends object>(dialogable: Dialogable<T>, onClose: () => void, setRtkn: (s: symbol) => void) => Dialog<T>;
|
|
6
7
|
export declare const useFormDialogable: () => {
|
|
7
8
|
dialog: Dialogable<object> | undefined;
|
|
8
9
|
rtkn: unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-form-dialogable.d.ts","sourceRoot":"","sources":["../../src/form-dialog/use-form-dialogable.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,MAAM,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IAC9D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;
|
|
1
|
+
{"version":3,"file":"use-form-dialogable.d.ts","sourceRoot":"","sources":["../../src/form-dialog/use-form-dialogable.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,MAAM,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IAC9D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,eAAO,MAAM,cAAc,GAAI,CAAC,SAAS,MAAM,EAC9C,YAAY,UAAU,CAAC,CAAC,CAAC,EACzB,SAAS,MAAM,IAAI,EACnB,SAAS,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,KAC1B,MAAM,CAAC,CAAC,CAcT,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;WAa1B,CAAC,SAAS,MAAM,UAAU,UAAU,CAAC,CAAC,CAAC;CAW1C,CAAC"}
|
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
import { useCallback, useState } from '@pionjs/pion';
|
|
2
2
|
import { useOpened } from '../hooks/use-opened';
|
|
3
|
+
export const wrapDialogable = (dialogable, onClose, setRtkn) => ({
|
|
4
|
+
...dialogable,
|
|
5
|
+
onClose,
|
|
6
|
+
onSave: (values, initial, setProgress) => Promise.resolve(dialogable.onSave?.(values, initial, setProgress)).then(() => {
|
|
7
|
+
if (!dialogable.preventRefresh) {
|
|
8
|
+
setRtkn(Symbol('rtkn'));
|
|
9
|
+
}
|
|
10
|
+
if (!dialogable.preventClose) {
|
|
11
|
+
onClose();
|
|
12
|
+
}
|
|
13
|
+
}),
|
|
14
|
+
});
|
|
3
15
|
export const useFormDialogable = () => {
|
|
4
16
|
const { opened: maybeDialog, onOpen, onClose, } = useOpened();
|
|
5
17
|
const [rtkn, setRtkn] = useState();
|
|
@@ -8,17 +20,6 @@ export const useFormDialogable = () => {
|
|
|
8
20
|
dialog,
|
|
9
21
|
rtkn,
|
|
10
22
|
setRtkn,
|
|
11
|
-
open: useCallback((dialog) => onOpen(
|
|
12
|
-
...dialog,
|
|
13
|
-
onClose,
|
|
14
|
-
onSave: (values, initial, setProgress) => Promise.resolve(dialog.onSave?.(values, initial, setProgress)).then(() => {
|
|
15
|
-
if (!dialog?.preventRefresh) {
|
|
16
|
-
setRtkn(Symbol('rtkn'));
|
|
17
|
-
}
|
|
18
|
-
if (!dialog?.preventClose) {
|
|
19
|
-
onClose();
|
|
20
|
-
}
|
|
21
|
-
}),
|
|
22
|
-
}), [onClose]),
|
|
23
|
+
open: useCallback((dialog) => onOpen(wrapDialogable(dialog, onClose, setRtkn)), [onClose, setRtkn]),
|
|
23
24
|
};
|
|
24
25
|
};
|
package/dist/helpers.d.ts
CHANGED
|
@@ -7,5 +7,5 @@ interface Initiatable<T extends object, K extends keyof T, V extends T[K]> {
|
|
|
7
7
|
initiate: (value: V, values: T) => any;
|
|
8
8
|
}
|
|
9
9
|
export declare const initiate: <T extends object, K extends keyof T, V extends T[K]>(obj: T, fields: Initiatable<T, K, V>[]) => { [key in K]: ReturnType<Initiatable<T, K, V>["initiate"]>; };
|
|
10
|
-
export declare const primeval: ((<T extends object, K extends keyof T, V extends T[K], F extends Field<T, K, V>>(value: V, values: T, { options, valueProperty }: F) => V | ({} | V)[]) | (<T extends object, K extends keyof T, V extends T[K], F extends Field<T, K, V>>(value: V, values: T, { valueProperty }: F) => any[] | (
|
|
10
|
+
export declare const primeval: ((<T extends object, K extends keyof T, V extends T[K], F extends Field<T, K, V>>(value: V, values: T, { options, valueProperty }: F) => V | ({} | V)[]) | (<T extends object, K extends keyof T, V extends T[K], F extends Field<T, K, V>>(value: V, values: T, { valueProperty }: F) => any[] | (NonNullable<V> extends infer T_1 ? T_1 extends NonNullable<V> ? T_1 extends object ? string extends infer T_2 ? T_2 extends string ? T_2 extends keyof T_1 ? T_1[T_2] : undefined : never : never : T_1 : never : never)))[];
|
|
11
11
|
//# sourceMappingURL=helpers.d.ts.map
|
package/dist/helpers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAExD,KAAK,iBAAiB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC3E,wBAAgB,WAAW,CAC1B,CAAC,EACD,CAAC,SAAS,GAAG,EAAE,EACf,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,KAAK,GAAG,CAAC,GAAG,SAAS,GAAG,IAAI,EAC3D,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,GAAG,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAE3D;AAED,UAAU,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACxE,EAAE,EAAE,CAAC,CAAC;IACN,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,GAAG,CAAC;CACvC;AAED,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAC3E,KAAK,CAAC,EACN,QAAQ,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAOzB,GACH,GAAG,IAAI,CAAC,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,GACxD,CAAC;AAMH,eAAO,MAAM,QAAQ,KAEnB,CAAC,SAAS,MAAM,EAChB,CAAC,SAAS,MAAM,CAAC,EACjB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EACd,CAAC,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,SAEjB,CAAC,UACA,CAAC,8BACmB,CAAC,yBAa7B,CAAC,SAAS,MAAM,EAChB,CAAC,SAAS,MAAM,CAAC,EACjB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EACd,CAAC,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,SAEjB,CAAC,UACA,CAAC,qBACU,CAAC,
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAExD,KAAK,iBAAiB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC3E,wBAAgB,WAAW,CAC1B,CAAC,EACD,CAAC,SAAS,GAAG,EAAE,EACf,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,KAAK,GAAG,CAAC,GAAG,SAAS,GAAG,IAAI,EAC3D,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,GAAG,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAE3D;AAED,UAAU,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACxE,EAAE,EAAE,CAAC,CAAC;IACN,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,GAAG,CAAC;CACvC;AAED,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAC3E,KAAK,CAAC,EACN,QAAQ,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAOzB,GACH,GAAG,IAAI,CAAC,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,GACxD,CAAC;AAMH,eAAO,MAAM,QAAQ,KAEnB,CAAC,SAAS,MAAM,EAChB,CAAC,SAAS,MAAM,CAAC,EACjB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EACd,CAAC,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,SAEjB,CAAC,UACA,CAAC,8BACmB,CAAC,yBAa7B,CAAC,SAAS,MAAM,EAChB,CAAC,SAAS,MAAM,CAAC,EACjB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EACd,CAAC,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,SAEjB,CAAC,UACA,CAAC,qBACU,CAAC,0OAMrB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { t } from 'i18next';
|
|
2
2
|
import { html } from 'lit-html';
|
|
3
3
|
import { ifDefined } from 'lit-html/directives/if-defined.js';
|
|
4
4
|
import { live } from 'lit-html/directives/live.js';
|
|
@@ -17,7 +17,7 @@ const _dateRange = (type) => input(({ id, label, error, warning, disabled, onCha
|
|
|
17
17
|
?disabled=${disabled}
|
|
18
18
|
?invalid=${!!error?.from}
|
|
19
19
|
.errorMessage=${error?.from}
|
|
20
|
-
.label=${
|
|
20
|
+
.label=${t('From ({0})', { 0: label })}
|
|
21
21
|
.value=${live(value?.from)}
|
|
22
22
|
.max=${ifDefined(value?.to)}
|
|
23
23
|
@change=${({ target }) => onChange({ ...value, from: target.value })}
|
|
@@ -30,7 +30,7 @@ const _dateRange = (type) => input(({ id, label, error, warning, disabled, onCha
|
|
|
30
30
|
?disabled=${disabled}
|
|
31
31
|
?invalid=${!!error?.to}
|
|
32
32
|
.errorMessage=${error?.to}
|
|
33
|
-
.label=${
|
|
33
|
+
.label=${t('To ({0})', { 0: label })}
|
|
34
34
|
.value=${live(value?.to)}
|
|
35
35
|
.min=${ifDefined(value?.from)}
|
|
36
36
|
@change=${({ target }) => onChange({ ...value, to: target.value })}
|
|
@@ -41,6 +41,6 @@ export const dateRange = _dateRange('date'), dateTimeRange = _dateRange('datetim
|
|
|
41
41
|
// error is typed as string | false, but here we have an object with errors per field
|
|
42
42
|
// TODO: review how the error is handled
|
|
43
43
|
missingRange = (value) => (missing(value?.from) || missing(value?.to)) && {
|
|
44
|
-
from: missing(value?.from) &&
|
|
45
|
-
to: missing(value?.to) &&
|
|
44
|
+
from: missing(value?.from) && t('Required'),
|
|
45
|
+
to: missing(value?.to) && t('Required'),
|
|
46
46
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { _ } from '@neovici/cosmoz-i18next';
|
|
2
1
|
import { tagged as css } from '@neovici/cosmoz-utils';
|
|
3
2
|
import { invoke, noop } from '@neovici/cosmoz-utils/function';
|
|
3
|
+
import { t } from 'i18next';
|
|
4
4
|
import { html } from 'lit-html';
|
|
5
5
|
import { ifDefined } from 'lit-html/directives/if-defined.js';
|
|
6
6
|
import { until } from 'lit-html/directives/until.js';
|
|
@@ -46,11 +46,11 @@ const icon = html `<svg
|
|
|
46
46
|
</svg>`;
|
|
47
47
|
const humanLabel = (value) => {
|
|
48
48
|
if (!value)
|
|
49
|
-
return
|
|
49
|
+
return t('Choose file');
|
|
50
50
|
if (Array.isArray(value)) {
|
|
51
51
|
if (value.length === 1)
|
|
52
52
|
return value[0].name;
|
|
53
|
-
return
|
|
53
|
+
return t('{0} files', { 0: value.length });
|
|
54
54
|
}
|
|
55
55
|
return value.name;
|
|
56
56
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-form-dialogable$.test.d.ts","sourceRoot":"","sources":["../../src/test/use-form-dialogable$.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { renderHook } from '@neovici/testing';
|
|
2
|
+
import { assert, waitUntil } from '@open-wc/testing';
|
|
3
|
+
import { useFormDialogable$ } from '../form-dialog/use-form-dialogable$';
|
|
4
|
+
const makeDialogable = (overrides) => ({
|
|
5
|
+
heading: 'Test',
|
|
6
|
+
fields: [],
|
|
7
|
+
initial: {},
|
|
8
|
+
onSave: () => Promise.resolve(),
|
|
9
|
+
...overrides,
|
|
10
|
+
});
|
|
11
|
+
suite('useFormDialogable$', () => {
|
|
12
|
+
const fixture = () => renderHook(() => useFormDialogable$());
|
|
13
|
+
test('dialog is undefined initially', async () => {
|
|
14
|
+
const { result } = await fixture();
|
|
15
|
+
assert.isUndefined(result.current.dialog);
|
|
16
|
+
});
|
|
17
|
+
test('rtkn is undefined initially', async () => {
|
|
18
|
+
const { result } = await fixture();
|
|
19
|
+
assert.isUndefined(result.current.rtkn);
|
|
20
|
+
});
|
|
21
|
+
test('open() with synchronous Dialogable stores a resolver function', async () => {
|
|
22
|
+
const { result, nextUpdate } = await fixture();
|
|
23
|
+
result.current.open(makeDialogable());
|
|
24
|
+
await nextUpdate();
|
|
25
|
+
assert.isFunction(result.current.dialog);
|
|
26
|
+
});
|
|
27
|
+
test('open() with Promise<Dialogable> stores a resolver function', async () => {
|
|
28
|
+
const { result, nextUpdate } = await fixture();
|
|
29
|
+
result.current.open(Promise.resolve(makeDialogable()));
|
|
30
|
+
await nextUpdate();
|
|
31
|
+
assert.isFunction(result.current.dialog);
|
|
32
|
+
});
|
|
33
|
+
test('open() with () => Dialogable stores a resolver function', async () => {
|
|
34
|
+
const { result, nextUpdate } = await fixture();
|
|
35
|
+
result.current.open(() => makeDialogable());
|
|
36
|
+
await nextUpdate();
|
|
37
|
+
assert.isFunction(result.current.dialog);
|
|
38
|
+
});
|
|
39
|
+
test('dialog() resolves to wrapped Dialog with onClose', async () => {
|
|
40
|
+
const { result, nextUpdate } = await fixture();
|
|
41
|
+
result.current.open(makeDialogable());
|
|
42
|
+
await nextUpdate();
|
|
43
|
+
const resolved = await result.current.dialog();
|
|
44
|
+
assert.equal(resolved.heading, 'Test');
|
|
45
|
+
assert.isFunction(resolved.onClose);
|
|
46
|
+
assert.isFunction(resolved.onSave);
|
|
47
|
+
});
|
|
48
|
+
test('onSave calls original onSave and onClose', async () => {
|
|
49
|
+
const { result, nextUpdate } = await fixture();
|
|
50
|
+
let saved = false;
|
|
51
|
+
result.current.open(makeDialogable({
|
|
52
|
+
onSave: () => {
|
|
53
|
+
saved = true;
|
|
54
|
+
return Promise.resolve();
|
|
55
|
+
},
|
|
56
|
+
}));
|
|
57
|
+
await nextUpdate();
|
|
58
|
+
const resolved = await result.current.dialog();
|
|
59
|
+
await resolved.onSave({}, {});
|
|
60
|
+
assert.isTrue(saved);
|
|
61
|
+
await waitUntil(() => result.current.dialog === undefined);
|
|
62
|
+
});
|
|
63
|
+
test('onSave respects preventClose', async () => {
|
|
64
|
+
const { result, nextUpdate } = await fixture();
|
|
65
|
+
result.current.open(makeDialogable({ preventClose: true }));
|
|
66
|
+
await nextUpdate();
|
|
67
|
+
const resolved = await result.current.dialog();
|
|
68
|
+
await resolved.onSave({}, {});
|
|
69
|
+
assert.isFunction(result.current.dialog);
|
|
70
|
+
});
|
|
71
|
+
test('onSave respects preventRefresh', async () => {
|
|
72
|
+
const { result, nextUpdate } = await fixture();
|
|
73
|
+
result.current.open(makeDialogable({ preventRefresh: true }));
|
|
74
|
+
await nextUpdate();
|
|
75
|
+
const resolved = await result.current.dialog();
|
|
76
|
+
const initialRtkn = result.current.rtkn;
|
|
77
|
+
await resolved.onSave({}, {});
|
|
78
|
+
assert.equal(result.current.rtkn, initialRtkn);
|
|
79
|
+
});
|
|
80
|
+
test('dialog() resolves async Dialogable from Promise', async () => {
|
|
81
|
+
const { result, nextUpdate } = await fixture();
|
|
82
|
+
result.current.open(Promise.resolve(makeDialogable({ heading: 'Async Test' })));
|
|
83
|
+
await nextUpdate();
|
|
84
|
+
const resolved = await result.current.dialog();
|
|
85
|
+
assert.equal(resolved.heading, 'Async Test');
|
|
86
|
+
});
|
|
87
|
+
test('dialog() resolves lazy Dialogable from function', async () => {
|
|
88
|
+
const { result, nextUpdate } = await fixture();
|
|
89
|
+
result.current.open(() => makeDialogable({ heading: 'Lazy Test' }));
|
|
90
|
+
await nextUpdate();
|
|
91
|
+
const resolved = await result.current.dialog();
|
|
92
|
+
assert.equal(resolved.heading, 'Lazy Test');
|
|
93
|
+
});
|
|
94
|
+
test('onSave sets rtkn (refresh token)', async () => {
|
|
95
|
+
const { result, nextUpdate } = await fixture();
|
|
96
|
+
result.current.open(makeDialogable());
|
|
97
|
+
await nextUpdate();
|
|
98
|
+
const resolved = await result.current.dialog();
|
|
99
|
+
assert.isUndefined(result.current.rtkn);
|
|
100
|
+
await resolved.onSave({}, {});
|
|
101
|
+
assert.isTrue(typeof result.current.rtkn === 'symbol');
|
|
102
|
+
});
|
|
103
|
+
});
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
/* eslint-disable mocha/max-top-level-suites */
|
|
2
2
|
import { renderHook } from '@neovici/testing';
|
|
3
3
|
import { assert, waitUntil } from '@open-wc/testing';
|
|
4
|
+
import i18next from 'i18next';
|
|
4
5
|
import { useValidatedForm } from '../use-validated-form';
|
|
5
6
|
import { required, tooLong, tooShort } from '../validation';
|
|
7
|
+
i18next.init({
|
|
8
|
+
lng: 'en',
|
|
9
|
+
resources: { en: { translation: {} } },
|
|
10
|
+
fallbackLng: false,
|
|
11
|
+
});
|
|
6
12
|
suite('useValidatedForm', () => {
|
|
7
13
|
let result;
|
|
8
14
|
let nextUpdate;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/validation/rules.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAIhC,eAAO,MAAM,WAAW,MAAM,EAC7B,WAAW,KAAK,EAChB,YAAY,KAAK,CAAC;AAEnB,eAAO,MAAM,OAAO,GAAI,CAAC,EAAE,OAAO,CAAC,YAIQ,CAAC;AAE5C,eAAO,MAAM,MAAM,GAAI,CAAC,EAAE,OAAO,CAAC,KAAG,KAAK,IAAI,WAAW,CAAC,CAAC,CAAoB,CAAC;AAEhF,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,OAAO,CAAC,mBAAoC,CAAC;AAEzE,eAAO,MAAM,YAAY,GACvB,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EACnD,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,OAAO,KACzC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAEsD,CAAC;AAEvE,eAAO,MAAM,aAAa,GACxB,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,EACtE,YAAY,CAAC,KACX,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAKD,CAAC;AAEhB,wBAAgB,WAAW,CAC1B,CAAC,SAAS,MAAM,EAChB,CAAC,SAAS,MAAM,CAAC,EACjB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EACd,CAAC,EACD,EAAE,SAAS,MAAM,CAAC,EACjB,OAAO,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAMvC;AAED,eAAO,MAAM,QAAQ,GACnB,QAAQ,MAAM,MACd,CAAC,SAAS,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/validation/rules.ts"],"names":[],"mappings":"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"}
|
package/dist/validation/rules.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { _ } from '@neovici/cosmoz-i18next';
|
|
2
1
|
import { ensureDate } from '@neovici/cosmoz-utils/date';
|
|
3
2
|
import { format } from 'date-fns/format';
|
|
4
3
|
import { addDays } from 'date-fns/fp/addDays';
|
|
4
|
+
import { t } from 'i18next';
|
|
5
5
|
import { gln as isGln } from '../util/gln';
|
|
6
6
|
import { luhn as isLuhn } from '../util/luhn';
|
|
7
7
|
export const STRING_TEXT = 200, STRING_LONG = 50, STRING_SHORT = 20;
|
|
@@ -10,39 +10,41 @@ export const missing = (value) => value == null ||
|
|
|
10
10
|
Number.isNaN(value) ||
|
|
11
11
|
(Array.isArray(value) && value.length < 1);
|
|
12
12
|
export const exists = (value) => !missing(value);
|
|
13
|
-
export const required = (value) => missing(value) &&
|
|
13
|
+
export const required = (value) => missing(value) && t('Required');
|
|
14
14
|
export const requiredWhen = (condition) => (value, values) => values != null && condition(value, values) ? required(value) : false;
|
|
15
15
|
export const requireEither = (otherField) => (value, values) => missing(value) &&
|
|
16
16
|
values != null &&
|
|
17
17
|
missing(values[otherField]) &&
|
|
18
|
-
|
|
18
|
+
t('Required');
|
|
19
19
|
export function notAnOption(options, key) {
|
|
20
20
|
return (value) => !missing(value) &&
|
|
21
21
|
options != null &&
|
|
22
22
|
!options.some((option) => option[(key ?? 'value')] === value) &&
|
|
23
|
-
|
|
23
|
+
t('Option not among possible values');
|
|
24
24
|
}
|
|
25
25
|
export const tooShort = (length) => (value) => exists(value) &&
|
|
26
26
|
value.length < length &&
|
|
27
|
-
|
|
27
|
+
t('Must have at least {0} characters', { 0: length });
|
|
28
28
|
export const tooLong = (length) => (value) => exists(value) &&
|
|
29
29
|
value.length > length &&
|
|
30
|
-
|
|
30
|
+
t('Must have maximum {0} characters', { 0: length });
|
|
31
31
|
export const exactLength = (length) => (value) => exists(value) &&
|
|
32
32
|
value.length !== length &&
|
|
33
|
-
|
|
33
|
+
t('Must have exactly {0} characters', { 0: length });
|
|
34
34
|
export const tooSmall = (min) => (value) => exists(value) &&
|
|
35
35
|
value < min &&
|
|
36
|
-
|
|
37
|
-
export const tooSmallStrict = (min) => (value) => exists(value) &&
|
|
36
|
+
t('Value must be greater or equal to {0}', { 0: min });
|
|
37
|
+
export const tooSmallStrict = (min) => (value) => exists(value) &&
|
|
38
|
+
value <= min &&
|
|
39
|
+
t('Value must be greater than {0}', { 0: min });
|
|
38
40
|
export const tooBig = (max) => (value) => exists(value) &&
|
|
39
41
|
exists(max) &&
|
|
40
42
|
value > max &&
|
|
41
|
-
|
|
43
|
+
t('Value must be less or equal to {0}', { 0: max });
|
|
42
44
|
export const doesNotMatchFormat = (regexp, message = 'Does not match format: ' + regexp) => (value) => exists(value) && !value.match(regexp) && message;
|
|
43
|
-
export const luhn = (value) => exists(value) && !isLuhn(value) &&
|
|
44
|
-
export const gln = (value) => exists(value) && !isGln(value) &&
|
|
45
|
-
export const onlyDigits = (value) => exists(value) && !/^[0-9]+$/u.test(value) &&
|
|
45
|
+
export const luhn = (value) => exists(value) && !isLuhn(value) && t('Not a valid identification number');
|
|
46
|
+
export const gln = (value) => exists(value) && !isGln(value) && t('Not a valid identification number');
|
|
47
|
+
export const onlyDigits = (value) => exists(value) && !/^[0-9]+$/u.test(value) && t('Only digits allowed');
|
|
46
48
|
export const hint = (field) => ({
|
|
47
49
|
value: [
|
|
48
50
|
(value, values) => {
|
|
@@ -63,7 +65,7 @@ export const hint = (field) => ({
|
|
|
63
65
|
return false;
|
|
64
66
|
}
|
|
65
67
|
const hintValue = values[field];
|
|
66
|
-
return hintValue == null ? req :
|
|
68
|
+
return hintValue == null ? req : t('Option not among possible values');
|
|
67
69
|
},
|
|
68
70
|
});
|
|
69
71
|
export const afterStartDate = (startDateField, eq) => (value, values) => {
|
|
@@ -74,7 +76,7 @@ export const afterStartDate = (startDateField, eq) => (value, values) => {
|
|
|
74
76
|
const endTime = end.getTime();
|
|
75
77
|
const startTime = start.getTime();
|
|
76
78
|
const invalid = eq ? endTime < startTime : endTime <= startTime;
|
|
77
|
-
return invalid &&
|
|
79
|
+
return invalid && t('End date must be after start date');
|
|
78
80
|
};
|
|
79
81
|
export const minDate = (date) => (value) => {
|
|
80
82
|
const dateValue = ensureDate(value), minDateValue = ensureDate(date);
|
|
@@ -83,14 +85,14 @@ export const minDate = (date) => (value) => {
|
|
|
83
85
|
return (dateValue &&
|
|
84
86
|
minDateValue &&
|
|
85
87
|
dateValue.getTime() <= minDateValue.getTime() &&
|
|
86
|
-
|
|
88
|
+
t('Date must be bigger than {0}', { 0: date }));
|
|
87
89
|
};
|
|
88
90
|
export const maxDate = (date) => (value) => {
|
|
89
91
|
const dateValue = ensureDate(value), maxDateValue = ensureDate(date);
|
|
90
92
|
if (!dateValue || !maxDateValue)
|
|
91
93
|
return false;
|
|
92
94
|
return (maxDateValue.getTime() <= dateValue.getTime() &&
|
|
93
|
-
|
|
95
|
+
t('Date must be lower than {0}', { 0: date }));
|
|
94
96
|
};
|
|
95
97
|
export const maxDays = (days) => maxDate(format(addDays(days, new Date()), 'yyyy-MM-dd'));
|
|
96
98
|
export const xor = (otherField) => (value, values) => values[otherField] != null;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@neovici/cosmoz-form",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.2.0-beta.1",
|
|
4
4
|
"description": "A pionjs component",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"web-components",
|
|
@@ -70,19 +70,21 @@
|
|
|
70
70
|
"@lit-labs/virtualizer": "^2.1.1",
|
|
71
71
|
"@neovici/cosmoz-autocomplete": "^10.10.4 || ^11.0.0 || ^12.0.0 || ^13.0.0",
|
|
72
72
|
"@neovici/cosmoz-dialog": "^4.0.0 || ^5.0.0",
|
|
73
|
-
"@neovici/cosmoz-i18next": "^3.5.1",
|
|
74
73
|
"@neovici/cosmoz-icons": "^1.3.0",
|
|
75
74
|
"@neovici/cosmoz-input": "^5.5.0",
|
|
76
75
|
"@neovici/cosmoz-spinner": "^1.0.2",
|
|
77
|
-
"@neovici/cosmoz-utils": "^6.
|
|
76
|
+
"@neovici/cosmoz-utils": "^6.22.0",
|
|
78
77
|
"@pionjs/pion": "^2.5.2",
|
|
78
|
+
"@playwright/test": "^1.60.0",
|
|
79
|
+
"@web/test-runner-playwright": "^0.11.1",
|
|
79
80
|
"date-fns": "^4.1.0",
|
|
81
|
+
"i18next": ">=23.0.0 <27.0.0",
|
|
80
82
|
"lit-html": "^3.3.1"
|
|
81
83
|
},
|
|
82
84
|
"devDependencies": {
|
|
83
85
|
"@commitlint/cli": "^20.0.0",
|
|
84
86
|
"@commitlint/config-conventional": "^20.0.0",
|
|
85
|
-
"@neovici/cfg": "^2.
|
|
87
|
+
"@neovici/cfg": "^2.13.0",
|
|
86
88
|
"@neovici/testing": "^2.0.0",
|
|
87
89
|
"@open-wc/testing": "^4.0.0",
|
|
88
90
|
"@open-wc/testing-helpers": "^3.0.1",
|
|
@@ -103,7 +105,6 @@
|
|
|
103
105
|
"storybook": "^10.0.0"
|
|
104
106
|
},
|
|
105
107
|
"overrides": {
|
|
106
|
-
"conventional-changelog-conventionalcommits": ">= 8.0.0"
|
|
107
|
-
"@polymer/polymer": "^3.5.2"
|
|
108
|
+
"conventional-changelog-conventionalcommits": ">= 8.0.0"
|
|
108
109
|
}
|
|
109
110
|
}
|