@neovici/cosmoz-form 0.0.0 → 1.0.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.
Files changed (160) hide show
  1. package/dist/add/index.d.ts +3 -0
  2. package/dist/add/index.d.ts.map +1 -0
  3. package/dist/add/index.js +2 -0
  4. package/dist/add/render.d.ts +44 -0
  5. package/dist/add/render.d.ts.map +1 -0
  6. package/dist/add/render.js +42 -0
  7. package/dist/add/styles.d.ts +2 -0
  8. package/dist/add/styles.d.ts.map +1 -0
  9. package/dist/add/styles.js +42 -0
  10. package/dist/add/types.d.ts +4 -0
  11. package/dist/add/types.d.ts.map +1 -0
  12. package/dist/add/types.js +1 -0
  13. package/dist/controls/cz-toggle.d.ts +2 -0
  14. package/dist/controls/cz-toggle.d.ts.map +1 -0
  15. package/dist/controls/cz-toggle.js +40 -0
  16. package/dist/form-dialog/form-dialog.d.ts +27 -0
  17. package/dist/form-dialog/form-dialog.d.ts.map +1 -0
  18. package/dist/form-dialog/form-dialog.js +61 -0
  19. package/dist/form-dialog/form-dialogable.d.ts +11 -0
  20. package/dist/form-dialog/form-dialogable.d.ts.map +1 -0
  21. package/dist/form-dialog/form-dialogable.js +19 -0
  22. package/dist/form-dialog/index.d.ts +4 -0
  23. package/dist/form-dialog/index.d.ts.map +1 -0
  24. package/dist/form-dialog/index.js +3 -0
  25. package/dist/form-dialog/style.css.d.ts +3 -0
  26. package/dist/form-dialog/style.css.d.ts.map +1 -0
  27. package/dist/form-dialog/style.css.js +36 -0
  28. package/dist/form-dialog/use-form-dialogable.d.ts +12 -0
  29. package/dist/form-dialog/use-form-dialogable.d.ts.map +1 -0
  30. package/dist/form-dialog/use-form-dialogable.js +24 -0
  31. package/dist/helpers.d.ts +11 -0
  32. package/dist/helpers.d.ts.map +1 -0
  33. package/dist/helpers.js +26 -0
  34. package/dist/hooks/use-opened.d.ts +7 -0
  35. package/dist/hooks/use-opened.d.ts.map +1 -0
  36. package/dist/hooks/use-opened.js +10 -0
  37. package/dist/index.d.ts +13 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +11 -0
  40. package/dist/inputs/autocomplete.d.ts +25 -0
  41. package/dist/inputs/autocomplete.d.ts.map +1 -0
  42. package/dist/inputs/autocomplete.js +40 -0
  43. package/dist/inputs/base.d.ts +18 -0
  44. package/dist/inputs/base.d.ts.map +1 -0
  45. package/dist/inputs/base.js +41 -0
  46. package/dist/inputs/basic.d.ts +3 -0
  47. package/dist/inputs/basic.d.ts.map +1 -0
  48. package/dist/inputs/basic.js +6 -0
  49. package/dist/inputs/common.d.ts +31 -0
  50. package/dist/inputs/common.d.ts.map +1 -0
  51. package/dist/inputs/common.js +72 -0
  52. package/dist/inputs/date-range.d.ts +10 -0
  53. package/dist/inputs/date-range.d.ts.map +1 -0
  54. package/dist/inputs/date-range.js +46 -0
  55. package/dist/inputs/file-drop.d.ts +2 -0
  56. package/dist/inputs/file-drop.d.ts.map +1 -0
  57. package/dist/inputs/file-drop.js +16 -0
  58. package/dist/inputs/file.d.ts +7 -0
  59. package/dist/inputs/file.d.ts.map +1 -0
  60. package/dist/inputs/file.js +22 -0
  61. package/dist/inputs/index.d.ts +7 -0
  62. package/dist/inputs/index.d.ts.map +1 -0
  63. package/dist/inputs/index.js +6 -0
  64. package/dist/inputs/inline-file.d.ts +3 -0
  65. package/dist/inputs/inline-file.d.ts.map +1 -0
  66. package/dist/inputs/inline-file.js +81 -0
  67. package/dist/inputs/read-only-number.d.ts +6 -0
  68. package/dist/inputs/read-only-number.d.ts.map +1 -0
  69. package/dist/inputs/read-only-number.js +34 -0
  70. package/dist/inputs/render.d.ts +12 -0
  71. package/dist/inputs/render.d.ts.map +1 -0
  72. package/dist/inputs/render.js +25 -0
  73. package/dist/inputs/toggle.d.ts +5 -0
  74. package/dist/inputs/toggle.d.ts.map +1 -0
  75. package/dist/inputs/toggle.js +18 -0
  76. package/dist/render/fields.d.ts +25 -0
  77. package/dist/render/fields.d.ts.map +1 -0
  78. package/dist/render/fields.js +31 -0
  79. package/dist/render/index.d.ts +3 -0
  80. package/dist/render/index.d.ts.map +1 -0
  81. package/dist/render/index.js +2 -0
  82. package/dist/render/items.d.ts +32 -0
  83. package/dist/render/items.d.ts.map +1 -0
  84. package/dist/render/items.js +72 -0
  85. package/dist/render/styles.d.ts +2 -0
  86. package/dist/render/styles.d.ts.map +1 -0
  87. package/dist/render/styles.js +60 -0
  88. package/dist/styles/button.d.ts +3 -0
  89. package/dist/styles/button.d.ts.map +1 -0
  90. package/dist/styles/button.js +100 -0
  91. package/dist/styles/toggle.d.ts +3 -0
  92. package/dist/styles/toggle.d.ts.map +1 -0
  93. package/dist/styles/toggle.js +46 -0
  94. package/dist/test/use-form.test.d.ts +2 -0
  95. package/dist/test/use-form.test.d.ts.map +1 -0
  96. package/dist/test/use-form.test.js +217 -0
  97. package/dist/test/use-items.test.d.ts +2 -0
  98. package/dist/test/use-items.test.d.ts.map +1 -0
  99. package/dist/test/use-items.test.js +328 -0
  100. package/dist/test/use-validated-form.test.d.ts +2 -0
  101. package/dist/test/use-validated-form.test.d.ts.map +1 -0
  102. package/dist/test/use-validated-form.test.js +99 -0
  103. package/dist/touch.d.ts +9 -0
  104. package/dist/touch.d.ts.map +1 -0
  105. package/dist/touch.js +13 -0
  106. package/dist/types/index.d.ts +57 -0
  107. package/dist/types/index.d.ts.map +1 -0
  108. package/dist/types/index.js +1 -0
  109. package/dist/use-form-core.d.ts +13 -0
  110. package/dist/use-form-core.d.ts.map +1 -0
  111. package/dist/use-form-core.js +43 -0
  112. package/dist/use-form.d.ts +6 -0
  113. package/dist/use-form.d.ts.map +1 -0
  114. package/dist/use-form.js +12 -0
  115. package/dist/use-items/apply-rules.d.ts +11 -0
  116. package/dist/use-items/apply-rules.d.ts.map +1 -0
  117. package/dist/use-items/apply-rules.js +13 -0
  118. package/dist/use-items/common-rules.d.ts +4 -0
  119. package/dist/use-items/common-rules.d.ts.map +1 -0
  120. package/dist/use-items/common-rules.js +5 -0
  121. package/dist/use-items/index.d.ts +6 -0
  122. package/dist/use-items/index.d.ts.map +1 -0
  123. package/dist/use-items/index.js +5 -0
  124. package/dist/use-items/use-items.d.ts +25 -0
  125. package/dist/use-items/use-items.d.ts.map +1 -0
  126. package/dist/use-items/use-items.js +58 -0
  127. package/dist/use-items/use-list-validation.d.ts +7 -0
  128. package/dist/use-items/use-list-validation.d.ts.map +1 -0
  129. package/dist/use-items/use-list-validation.js +23 -0
  130. package/dist/use-items/use-validated-items.d.ts +18 -0
  131. package/dist/use-items/use-validated-items.d.ts.map +1 -0
  132. package/dist/use-items/use-validated-items.js +17 -0
  133. package/dist/use-items-filter.d.ts +9 -0
  134. package/dist/use-items-filter.d.ts.map +1 -0
  135. package/dist/use-items-filter.js +12 -0
  136. package/dist/use-validated-form$.d.ts +23 -0
  137. package/dist/use-validated-form$.d.ts.map +1 -0
  138. package/dist/use-validated-form$.js +18 -0
  139. package/dist/use-validated-form-core.d.ts +17 -0
  140. package/dist/use-validated-form-core.d.ts.map +1 -0
  141. package/dist/use-validated-form-core.js +20 -0
  142. package/dist/use-validated-form.d.ts +11 -0
  143. package/dist/use-validated-form.d.ts.map +1 -0
  144. package/dist/use-validated-form.js +11 -0
  145. package/dist/util/gln.d.ts +2 -0
  146. package/dist/util/gln.d.ts.map +1 -0
  147. package/dist/util/gln.js +11 -0
  148. package/dist/util/luhn.d.ts +2 -0
  149. package/dist/util/luhn.d.ts.map +1 -0
  150. package/dist/util/luhn.js +16 -0
  151. package/dist/util/number.d.ts +2 -0
  152. package/dist/util/number.d.ts.map +1 -0
  153. package/dist/util/number.js +1 -0
  154. package/dist/validation/index.d.ts +26 -0
  155. package/dist/validation/index.d.ts.map +1 -0
  156. package/dist/validation/index.js +47 -0
  157. package/dist/validation/rules.d.ts +32 -0
  158. package/dist/validation/rules.d.ts.map +1 -0
  159. package/dist/validation/rules.js +99 -0
  160. package/package.json +6 -4
@@ -0,0 +1,3 @@
1
+ export * from './render';
2
+ export * from './styles';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/add/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './render';
2
+ export * from './styles';
@@ -0,0 +1,44 @@
1
+ import { nothing } from 'lit-html';
2
+ import { Progress } from './types';
3
+ import { UseValidatedForm } from '../use-validated-form-core';
4
+ export declare const nothing$: () => symbol;
5
+ export declare const then$: <P, R>(p$?: PromiseLike<P>, fn?: () => R) => Promise<R>;
6
+ interface RenderAddFields<T extends object> extends UseValidatedForm<T> {
7
+ error?: Error | {
8
+ message: string;
9
+ };
10
+ }
11
+ export declare const renderAddFields: <T extends object>({ error, ...thru }: RenderAddFields<T>) => import("..").Renderable[];
12
+ export declare const renderFailure$: <T>(save$?: PromiseLike<T>) => import("lit-html/directive.js").DirectiveResult<{
13
+ new (_partInfo: import("lit-html/directive.js").PartInfo): import("lit-html/directives/until.js").UntilDirective<typeof nothing | PromiseLike<symbol | import("lit-html").TemplateResult<1>> | undefined>;
14
+ }>;
15
+ interface Button {
16
+ slot?: string;
17
+ content?: unknown;
18
+ progress?: boolean;
19
+ disabled?: boolean;
20
+ title: string;
21
+ onSave: () => void;
22
+ onClick?: () => void;
23
+ }
24
+ interface RenderButton extends Omit<Button, 'progress'> {
25
+ progress?: Progress;
26
+ save$?: PromiseLike<unknown>;
27
+ }
28
+ export declare const renderButton$: ({ save$, progress, ...thru }: RenderButton) => import("lit-html/directive.js").DirectiveResult<{
29
+ new (_partInfo: import("lit-html/directive.js").PartInfo): import("lit-html/directives/until.js").UntilDirective<import("lit-html").TemplateResult<1> | Promise<import("lit-html").TemplateResult<1>>>;
30
+ }>;
31
+ interface RenderAddForm {
32
+ button: string;
33
+ tab: string;
34
+ tabCard?: string;
35
+ hash?: string;
36
+ }
37
+ interface RenderAddFormOpts<T extends object> extends RenderAddFields<T> {
38
+ disabled?: boolean;
39
+ save$?: PromiseLike<unknown>;
40
+ onSave: () => void;
41
+ }
42
+ export declare const renderAddForm$: <T extends object>({ button: buttonTitle, tab, tabCard, hash, }: RenderAddForm) => ({ disabled, save$, onSave, ...pass }: RenderAddFormOpts<T>) => import("lit-html").TemplateResult<1>;
43
+ export {};
44
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/add/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,OAAO,EAAE,MAAM,UAAU,CAAC;AAKzC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE9D,eAAO,MAAM,QAAQ,cAAgB,CAAC;AACtC,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,eAC5B,CAAC;AAElC,UAAU,eAAe,CAAC,CAAC,SAAS,MAAM,CAAE,SAAQ,gBAAgB,CAAC,CAAC,CAAC;IACtE,KAAK,CAAC,EAAE,KAAK,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CACpC;AACD,eAAO,MAAM,eAAe,GAAI,CAAC,SAAS,MAAM,EAAE,oBAG/C,eAAe,CAAC,CAAC,CAAC,8BAGpB,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,CAAC,EAAE,QAAQ,WAAW,CAAC,CAAC,CAAC;;EAItD,CAAC;AAEH,UAAU,MAAM;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AACD,UAAU,YAAa,SAAQ,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC;IACtD,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,KAAK,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;CAC7B;AACD,eAAO,MAAM,aAAa,GAAI,8BAA8B,YAAY;;EAiCvE,CAAC;AAEF,UAAU,aAAa;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,UAAU,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAE,SAAQ,eAAe,CAAC,CAAC,CAAC;IACvE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,EAAE,MAAM,IAAI,CAAC;CACnB;AACD,eAAO,MAAM,cAAc,GACzB,CAAC,SAAS,MAAM,EAAE,8CAKhB,aAAa,MACf,sCAAsC,iBAAiB,CAAC,CAAC,CAAC,yCAUpC,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { html, nothing } from 'lit-html';
2
+ import { until } from 'lit-html/directives/until.js';
3
+ import { ifDefined } from 'lit-html/directives/if-defined.js';
4
+ import { when } from 'lit-html/directives/when.js';
5
+ import { renderFields } from '../render';
6
+ export const nothing$ = () => nothing;
7
+ export const then$ = (p$, fn) => Promise.resolve(p$).then(fn, fn);
8
+ export const renderAddFields = ({ error, ...thru }) => [
9
+ renderFields(thru),
10
+ when(error, (err) => html `<div class="failure">${err.message}</div>`),
11
+ ];
12
+ export const renderFailure$ = (save$) => until(save$?.then(nothing$, (e) => html `<div class="failure">${e.message}</div>`), nothing);
13
+ export const renderButton$ = ({ save$, progress, ...thru }) => {
14
+ const button = ({ onSave, onClick = onSave, title, disabled, progress, content = nothing, slot, }) => html ` <button
15
+ class="button save"
16
+ slot=${ifDefined(slot)}
17
+ ?disabled=${disabled}
18
+ ?data-progress=${progress}
19
+ @click=${(ev) => {
20
+ ev.stopPropagation();
21
+ return onClick();
22
+ }}
23
+ >
24
+ ${content} ${title}
25
+ </button>`;
26
+ return until(then$(save$, () => button(thru)), button({
27
+ ...thru,
28
+ disabled: true,
29
+ progress: true,
30
+ content: html `<cz-spinner></cz-spinner> ${when(progress, (p) => p.join('/'))}`,
31
+ }));
32
+ };
33
+ export const renderAddForm$ = ({ button: buttonTitle, tab, tabCard = tab, hash, }) => ({ disabled, save$, onSave, ...pass }) => html ` <cosmoz-tabs class="flex" hash-param=${ifDefined(hash)}>
34
+ <cosmoz-tab name="overview" heading=${tab}>
35
+ <cosmoz-tab-card heading=${tabCard}>
36
+ ${renderFields(pass)} ${renderFailure$(save$)}
37
+ </cosmoz-tab-card>
38
+ </cosmoz-tab>
39
+ </cosmoz-tabs>
40
+ <cosmoz-bottom-bar active>
41
+ ${renderButton$({ save$, onSave, disabled, title: buttonTitle })}
42
+ </cosmoz-bottom-bar>`;
@@ -0,0 +1,2 @@
1
+ export declare const renderAddStyles: () => string;
2
+ //# sourceMappingURL=styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/add/styles.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,eAAe,cAuC3B,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { tagged as css } from '@neovici/cosmoz-utils';
2
+ import buttonStyles from '../styles/button';
3
+ export const renderAddStyles = () => css `
4
+ :host {
5
+ display: flex;
6
+ flex-direction: column;
7
+ height: 100%;
8
+ }
9
+
10
+ .forbidden {
11
+ font-size: 16px;
12
+ }
13
+
14
+ .failure {
15
+ font-size: 12px;
16
+ line-height: 20px;
17
+ margin: 8px 0;
18
+ }
19
+
20
+ .failure,
21
+ .forbidden {
22
+ color: var(--error-color, #fc5c5b);
23
+ }
24
+
25
+ .input-common::part(float) {
26
+ font-size: 14px;
27
+ line-height: 20px;
28
+ }
29
+
30
+ .input-toggle {
31
+ margin-top: 0.875em;
32
+ }
33
+
34
+ cosmoz-tab-card::part(content) {
35
+ padding-bottom: 24px;
36
+ }
37
+
38
+ ${buttonStyles}
39
+ .button cz-spinner {
40
+ margin-right: 8px;
41
+ }
42
+ `;
@@ -0,0 +1,4 @@
1
+ type ProgressValue = string | number;
2
+ export type Progress = [ProgressValue, ProgressValue];
3
+ export {};
4
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/add/types.ts"],"names":[],"mappings":"AAAA,KAAK,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;AACrC,MAAM,MAAM,QAAQ,GAAG,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cz-toggle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cz-toggle.d.ts","sourceRoot":"","sources":["../../src/controls/cz-toggle.ts"],"names":[],"mappings":""}
@@ -0,0 +1,40 @@
1
+ import { css, sheet } from '@neovici/cosmoz-utils';
2
+ import { component, html, useCallback } from '@pionjs/pion';
3
+ import { live } from 'lit-html/directives/live.js';
4
+ import { when } from 'lit-html/directives/when.js';
5
+ import toggleStyles from '../styles/toggle';
6
+ const CzToggle = (host) => {
7
+ const { label, value, disabled, error } = host;
8
+ const onChange = useCallback((e) => host.dispatchEvent(new CustomEvent('change', {
9
+ detail: e.target.checked,
10
+ })), []);
11
+ return html `<input
12
+ id="toggle"
13
+ class="toggle"
14
+ part="toggle"
15
+ type="checkbox"
16
+ .checked=${live(!!value)}
17
+ ?disabled=${disabled}
18
+ @change=${onChange}
19
+ />
20
+ ${when(label, () => html `<label for="toggle">${label}</label>`)}
21
+ <slot name="suffix"></slot>
22
+ ${when(error, (error) => html `<div class="failure">${error}</div>`)} `;
23
+ };
24
+ const style = css `
25
+ ${toggleStyles}
26
+
27
+ :host {
28
+ display: block;
29
+ }
30
+
31
+ :host > * {
32
+ vertical-align: middle;
33
+ line-height: 0px;
34
+ }
35
+
36
+ ::slotted(*) {
37
+ margin-left: 5px;
38
+ }
39
+ `;
40
+ customElements.define('cz-toggle', component(CzToggle, { styleSheets: [sheet(style)] }));
@@ -0,0 +1,27 @@
1
+ import { Props as DialogProps } from '@neovici/cosmoz-dialog-next';
2
+ import '@neovici/cosmoz-dialog-next/loading';
3
+ import { Props as AddProps } from '../use-validated-form$';
4
+ import '@neovici/cosmoz-spinner';
5
+ import { Renderable, Resolvable } from '../types';
6
+ interface Props<T extends object> extends DialogProps, AddProps<T> {
7
+ heading: string;
8
+ description?: Renderable;
9
+ auto?: boolean;
10
+ uncancelable?: boolean;
11
+ hideCancelButton?: boolean;
12
+ saveText?: string;
13
+ }
14
+ export interface Dialog<T extends object> extends Props<T> {
15
+ name?: string;
16
+ title?: string;
17
+ renderInPortal?: boolean;
18
+ backdrop?: boolean;
19
+ }
20
+ export declare const formDialog: <T extends object>(props?: Dialog<T>) => Renderable;
21
+ export declare const formDialog$: <T extends object>(props$: Resolvable<Dialog<T>>) => import("lit-html/directive.js").DirectiveResult<{
22
+ new (_partInfo: import("lit-html/directive.js").PartInfo): import("lit-html/directives/until.js").UntilDirective<import("lit-html").TemplateResult<1> | Promise<symbol | {
23
+ toString(): string;
24
+ } | readonly Renderable[] | null | undefined>>;
25
+ }>;
26
+ export {};
27
+ //# sourceMappingURL=form-dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-dialog.d.ts","sourceRoot":"","sources":["../../src/form-dialog/form-dialog.ts"],"names":[],"mappings":"AAMA,OAAO,EAAU,KAAK,IAAI,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,qCAAqC,CAAC;AAI7C,OAAO,EAAqB,KAAK,IAAI,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,yBAAyB,CAAC;AAIjC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAElD,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;AA2CD,MAAM,WAAW,MAAM,CAAC,CAAC,SAAS,MAAM,CAAE,SAAQ,KAAK,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,MAAM,EAAE,QAAQ,MAAM,CAAC,CAAC,CAAC,KAAG,UAoBhE,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,MAAM,EAAE,QAAQ,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;;;;EAIzE,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { useEffect } from '@pionjs/pion';
2
+ import { html, nothing } from 'lit-html';
3
+ import { when } from 'lit-html/directives/when.js';
4
+ import { ifDefined } from 'lit-html/directives/if-defined.js';
5
+ import { _ } from '@neovici/cosmoz-i18next';
6
+ import { portal } from '@neovici/cosmoz-utils/directives/portal';
7
+ import { dialog } from '@neovici/cosmoz-dialog-next';
8
+ import '@neovici/cosmoz-dialog-next/loading';
9
+ import buttonStyles from '../styles/button';
10
+ import { renderFields, renderStyles } from '../render';
11
+ import { renderFailure$, renderButton$ } from '../add/render';
12
+ import { useValidatedForm$ } from '../use-validated-form$';
13
+ import '@neovici/cosmoz-spinner';
14
+ import styles from './style.css';
15
+ import { invoke } from '@neovici/cosmoz-utils/function';
16
+ import { until } from 'lit-html/directives/until.js';
17
+ const FormDialog = (host) => {
18
+ const { description, auto, uncancelable, hideCancelButton, saveText = _('OK'), } = host, { onSave, disabled, save$, progress, ...form } = useValidatedForm$(host);
19
+ useEffect(() => {
20
+ if (!auto) {
21
+ return;
22
+ }
23
+ onSave();
24
+ }, [auto]);
25
+ return html ` <style>
26
+ ${buttonStyles} ${renderStyles(form)}${styles}
27
+ </style>
28
+ ${when(description, () => html `<p class="description">${description}</p>`)}
29
+ <div class="form" part="form">${renderFields(form)}</div>
30
+ <div class="buttons">
31
+ ${renderFailure$(save$)}
32
+ ${renderButton$({ save$, onSave, disabled, title: saveText, progress })}
33
+ ${when(!hideCancelButton, () => html `<button class="button" value="cancel" ?disabled=${uncancelable}>
34
+ ${_('Cancel')}
35
+ </button>`)}
36
+ </div>`;
37
+ };
38
+ customElements.define('cosmoz-form-dialog-next', dialog(FormDialog, { observedAttributes: ['allow-empty'] }));
39
+ export const formDialog = (props) => {
40
+ if (!props)
41
+ return nothing;
42
+ const dialog = html `<cosmoz-form-dialog-next
43
+ ?backdrop=${props.backdrop ?? true}
44
+ name=${ifDefined(props.name)}
45
+ ?allow-empty=${props.allowEmpty}
46
+ .heading=${props.heading ?? props.title}
47
+ .description=${props.description}
48
+ .fields=${props.fields}
49
+ .initial=${props.initial}
50
+ .rules=${props.rules}
51
+ .onClose=${props.onClose}
52
+ .onSave=${props.onSave}
53
+ .auto=${props.auto}
54
+ .uncancelable=${props.uncancelable}
55
+ .hideCancelButton=${props.hideCancelButton}
56
+ .manualFocus=${props.manualFocus}
57
+ .saveText=${props.saveText}
58
+ ></cosmoz-form-dialog-next>`;
59
+ return props.renderInPortal ? portal(dialog) : dialog;
60
+ };
61
+ export const formDialog$ = (props$) => until(Promise.resolve(invoke(props$)).then(formDialog, () => nothing), html `<cosmoz-dialog-loading></cosmoz-dialog-loading>`);
@@ -0,0 +1,11 @@
1
+ import { nothing } from 'lit-html';
2
+ import { Dialog } from './form-dialog';
3
+ export declare const formDialogable: <T extends {
4
+ new (...args: any[]): any;
5
+ }>(base: T) => {
6
+ new (...args: any[]): {
7
+ [x: string]: any;
8
+ renderFormDialog<T_1 extends object>(dialog: Dialog<T_1>): typeof nothing | (() => import("..").Renderable);
9
+ };
10
+ } & T;
11
+ //# sourceMappingURL=form-dialogable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-dialogable.d.ts","sourceRoot":"","sources":["../../src/form-dialog/form-dialogable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAc,MAAM,EAAE,MAAM,eAAe,CAAC;AAEnD,eAAO,MAAM,cAAc,GAAI,CAAC,SAAS;IAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAA;CAAE,EACrE,MAAM,CAAC;kBADiD,GAAG,EAAE;;qCAIjC,MAAM;;KAkBjC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { nothing } from 'lit-html';
2
+ import { formDialog } from './form-dialog';
3
+ export const formDialogable = (base) => class extends base {
4
+ renderFormDialog(dialog) {
5
+ return !dialog
6
+ ? nothing
7
+ : () => {
8
+ const onClose = (...args) => {
9
+ this._dialog = undefined;
10
+ dialog.onClose?.(...args);
11
+ };
12
+ return formDialog({
13
+ ...dialog,
14
+ onClose,
15
+ onSave: (...args) => Promise.resolve(dialog.onSave?.(...args)).then(onClose),
16
+ });
17
+ };
18
+ }
19
+ };
@@ -0,0 +1,4 @@
1
+ export * from './form-dialog';
2
+ export * from './form-dialogable';
3
+ export * from './use-form-dialogable';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,3 @@
1
+ export * from './form-dialog';
2
+ export * from './form-dialogable';
3
+ export * from './use-form-dialogable';
@@ -0,0 +1,3 @@
1
+ declare const styles: string;
2
+ export default styles;
3
+ //# sourceMappingURL=style.css.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.css.d.ts","sourceRoot":"","sources":["../../src/form-dialog/style.css.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,MAAM,QAiCX,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { tagged as css } from '@neovici/cosmoz-utils';
2
+ const styles = css `
3
+ .description {
4
+ padding: 0 24px;
5
+ }
6
+ .description * {
7
+ line-height: normal;
8
+ }
9
+ .form {
10
+ overflow-y: auto;
11
+ display: flex;
12
+ flex-direction: column;
13
+ }
14
+ .input {
15
+ margin-top: 20px;
16
+ padding: 0px 24px 4px 24px;
17
+ }
18
+ .input:last-child {
19
+ margin-bottom: 16px;
20
+ }
21
+ .save {
22
+ font-weight: bold;
23
+ }
24
+ .save[data-progress] {
25
+ opacity: 0.6;
26
+ }
27
+ .failure {
28
+ color: #fc5c5b;
29
+ align-self: center;
30
+ flex: 1;
31
+ }
32
+ cz-spinner {
33
+ align-self: center;
34
+ }
35
+ `;
36
+ export default styles;
@@ -0,0 +1,12 @@
1
+ import type { Dialog } from './form-dialog';
2
+ export interface Dialogable<T extends object> extends Dialog<T> {
3
+ preventClose?: boolean;
4
+ preventRefresh?: boolean;
5
+ }
6
+ export declare const useFormDialogable: () => {
7
+ dialog: Dialogable<object> | undefined;
8
+ rtkn: unknown;
9
+ setRtkn: import("@pionjs/pion").StateUpdater<unknown>;
10
+ open: <T extends object>(dialog: Dialogable<T>) => void;
11
+ };
12
+ //# 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,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;AACD,eAAO,MAAM,iBAAiB;;;;WAa1B,CAAC,SAAS,MAAM,UAAU,UAAU,CAAC,CAAC,CAAC;CAuB1C,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { useCallback, useState } from '@pionjs/pion';
2
+ import { useOpened } from '../hooks/use-opened';
3
+ export const useFormDialogable = () => {
4
+ const { opened: maybeDialog, onOpen, onClose, } = useOpened();
5
+ const [rtkn, setRtkn] = useState();
6
+ const dialog = typeof maybeDialog === 'boolean' ? undefined : maybeDialog;
7
+ return {
8
+ dialog,
9
+ rtkn,
10
+ 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
+ };
24
+ };
@@ -0,0 +1,11 @@
1
+ import { Field } from './types';
2
+ export { invoke } from '@neovici/cosmoz-utils/function';
3
+ type InvokeValueReturn<F, V> = F extends (...args: any) => infer R ? R : V;
4
+ export declare function invokeValue<V, A extends any[], F extends ((value: V, ...args: A) => any) | undefined | null>(valueFn: F, value: V, ...args: A): InvokeValueReturn<F, V>;
5
+ interface Initiatable<T extends object, K extends keyof T, V extends T[K]> {
6
+ id: K;
7
+ initiate: (value: V, values: T) => any;
8
+ }
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[] | (string extends infer T_1 ? T_1 extends string ? T_1 extends keyof NonNullable<V> ? NonNullable<V>[T_1] : undefined : never : never)))[];
11
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +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,qJAMrB,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { array } from '@neovici/cosmoz-utils/array';
2
+ import { prop } from '@neovici/cosmoz-utils/object';
3
+ export { invoke } from '@neovici/cosmoz-utils/function';
4
+ export function invokeValue(valueFn, value, ...args) {
5
+ return valueFn ? valueFn(value, ...args) : value;
6
+ }
7
+ // TODO: Better typing with better inference
8
+ export const initiate = (obj, fields) => Object.fromEntries(fields.map(({ id, initiate }) => [
9
+ id,
10
+ initiate ? initiate(obj[id], obj) : obj[id],
11
+ ]));
12
+ /*
13
+ * Transforms primitive values to an item from options
14
+ * and selection back to a primitive value on change.
15
+ */
16
+ export const primeval = [
17
+ (value, values, { options, valueProperty }) => options
18
+ ? array(value).map((v) => (['string', 'number'].includes(typeof v) &&
19
+ options.find((c) => prop(valueProperty)(c) === v)) ??
20
+ v)
21
+ : value,
22
+ (value, values, { valueProperty }) => value &&
23
+ (Array.isArray(value)
24
+ ? value.map(prop(valueProperty))
25
+ : prop(valueProperty)(value)),
26
+ ];
@@ -0,0 +1,7 @@
1
+ export declare const useOpened: <T>() => {
2
+ opened: boolean | T;
3
+ onOpen: (opened: T | boolean) => void;
4
+ onClose: () => void;
5
+ onToggle: () => void;
6
+ };
7
+ //# sourceMappingURL=use-opened.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-opened.d.ts","sourceRoot":"","sources":["../../src/hooks/use-opened.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,GAAI,CAAC;;qBAKP,CAAC,GAAG,OAAO;;;CAM9B,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { useState, useMemo } from '@pionjs/pion';
2
+ export const useOpened = () => {
3
+ const [opened, setOpened] = useState(() => false);
4
+ return useMemo(() => ({
5
+ opened,
6
+ onOpen: (opened) => setOpened(opened ?? true),
7
+ onClose: () => setOpened(false),
8
+ onToggle: () => setOpened((opened) => !opened),
9
+ }), [opened]);
10
+ };
@@ -0,0 +1,13 @@
1
+ export * from './helpers';
2
+ export * from './inputs';
3
+ export * from './render';
4
+ export * from './validation';
5
+ export * from './use-form';
6
+ export * from './use-validated-form';
7
+ export * from './use-validated-form$';
8
+ export * from './use-items';
9
+ export * from './touch';
10
+ export * from './use-items-filter';
11
+ export * from './form-dialog';
12
+ export type * from './types';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAE9B,mBAAmB,SAAS,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ export * from './helpers';
2
+ export * from './inputs';
3
+ export * from './render';
4
+ export * from './validation';
5
+ export * from './use-form';
6
+ export * from './use-validated-form';
7
+ export * from './use-validated-form$';
8
+ export * from './use-items';
9
+ export * from './touch';
10
+ export * from './use-items-filter';
11
+ export * from './form-dialog';
@@ -0,0 +1,25 @@
1
+ import '@neovici/cosmoz-autocomplete';
2
+ import { Resolvable } from '../types';
3
+ type OptionsOpts<T, V> = {
4
+ active: boolean;
5
+ query: string;
6
+ value: V;
7
+ values: T;
8
+ };
9
+ export interface AutocompleteProps<T extends object, K extends keyof T, V extends T[K]> {
10
+ options?: Resolvable<unknown[] | false | undefined, [OptionsOpts<T, V>]>;
11
+ limit?: number;
12
+ textProperty?: string;
13
+ valueProperty?: string;
14
+ keepOpened?: boolean;
15
+ keepQuery?: boolean;
16
+ wrap?: boolean;
17
+ showSingle?: boolean;
18
+ preserveOrder?: boolean;
19
+ itemRenderer?: unknown;
20
+ textual?: unknown;
21
+ externalSearch?: boolean;
22
+ }
23
+ export declare const autocomplete: <T extends object, K extends keyof T, V extends T[K]>({ field, value, values, onChange: update, ...thru }: import("..").InputProps<T, K, V>) => import("..").Renderable;
24
+ export {};
25
+ //# sourceMappingURL=autocomplete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autocomplete.d.ts","sourceRoot":"","sources":["../../src/inputs/autocomplete.ts"],"names":[],"mappings":"AAKA,OAAO,8BAA8B,CAAC;AAGtC,OAAO,EAAiB,UAAU,EAAE,MAAM,UAAU,CAAC;AAGrD,KAAK,WAAW,CAAC,CAAC,EAAE,CAAC,IAAI;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,CAAC;IACT,MAAM,EAAE,CAAC,CAAC;CACV,CAAC;AAEF,MAAM,WAAW,iBAAiB,CACjC,CAAC,SAAS,MAAM,EAChB,CAAC,SAAS,MAAM,CAAC,EACjB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAEd,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,GAAG,KAAK,GAAG,SAAS,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;AAOD,eAAO,MAAM,YAAY,GACvB,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,mHAiEpD,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { html } from 'lit-html';
2
+ import { live } from 'lit-html/directives/live.js';
3
+ import { ifDefined } from 'lit-html/directives/if-defined.js';
4
+ import { guard } from 'lit-html/directives/guard.js';
5
+ import '@neovici/cosmoz-autocomplete';
6
+ import { input } from './base';
7
+ import { renderContents } from './render';
8
+ export const autocomplete = input(({ id, label, noLabelFloat, alwaysFloatLabel, error, warning, suffix, disabled, onChange, options, limit, min, textProperty, valueProperty, value, values, itemRenderer, keepOpened, keepQuery, placeholder, wrap, showSingle, preserveOrder, title, textual, description, externalSearch, ...thru }) => {
9
+ return html `<cosmoz-autocomplete
10
+ class="input input-autocomplete"
11
+ ?data-warning=${!!warning}
12
+ name=${id}
13
+ ?disabled=${disabled}
14
+ ?wrap=${wrap}
15
+ ?no-label-float=${noLabelFloat}
16
+ ?always-float-label=${alwaysFloatLabel}
17
+ ?invalid=${!!error}
18
+ ?keep-opened=${!!keepOpened}
19
+ ?keep-query=${!!keepQuery}
20
+ ?show-single=${!!showSingle}
21
+ ?preserve-order=${!!preserveOrder}
22
+ .placeholder=${placeholder}
23
+ .itemRenderer=${ifDefined(itemRenderer)}
24
+ .errorMessage=${error}
25
+ .label=${label}
26
+ .value=${live(value)}
27
+ .source=${guard([options, value, values], () => typeof options === 'function'
28
+ ? (info) => options({ ...thru, ...info, value, values })
29
+ : options)}
30
+ .textProperty=${textProperty}
31
+ .valueProperty=${valueProperty}
32
+ .limit=${limit}
33
+ .min=${min}
34
+ .title=${ifDefined(title)}
35
+ .textual=${textual}
36
+ .onChange=${(options) => onChange((limit === 1 ? options?.[0] : options))}
37
+ ?external-search=${externalSearch}
38
+ >${renderContents({ suffix, warning, description })}</cosmoz-autocomplete
39
+ >`;
40
+ });