@sealcode/sealgen 0.19.26 → 0.19.29
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/@types/forms/controls/dropdown.d.ts +6 -6
- package/@types/forms/controls/single-reference.d.ts +9 -6
- package/@types/forms/fields/field.d.ts +2 -2
- package/@types/forms/fields/pick-from-list.d.ts +2 -2
- package/@types/forms/fields/simple-form-field.d.ts +1 -1
- package/@types/forms/multiform.d.ts +4 -3
- package/@types/page/stateful-page.d.ts +1 -1
- package/@types/src/add-collection.d.ts +1 -0
- package/@types/src/add-crud.d.ts +3 -0
- package/@types/src/add-crud.test.d.ts +1 -0
- package/@types/src/add-jdd-component.d.ts +1 -0
- package/@types/src/add-list-route.test.d.ts +1 -0
- package/@types/src/add-route.d.ts +3 -0
- package/@types/src/add-route.test.d.ts +1 -0
- package/@types/src/build.d.ts +3 -0
- package/@types/src/builders/backend-ts-builder.d.ts +7 -0
- package/@types/src/builders/builder.d.ts +11 -0
- package/@types/src/builders/colors-builder.d.ts +10 -0
- package/@types/src/builders/css-builder.d.ts +19 -0
- package/@types/src/builders/fonts-builder.d.ts +7 -0
- package/@types/src/builders/frontend-ts-builder.d.ts +11 -0
- package/@types/src/cli.d.ts +2 -0
- package/@types/src/components/components.d.ts +2 -0
- package/@types/src/components/tabs.d.ts +2 -0
- package/@types/src/components/toggle-modal.d.ts +6 -0
- package/@types/src/controllers/password-generate-button.stimulus.d.ts +5 -0
- package/@types/src/controllers/sealgen-table.stimulus.d.ts +13 -0
- package/@types/src/embeddable-file-extensions.d.ts +1 -0
- package/@types/src/esbuild-plugins/load-assets.d.ts +5 -0
- package/@types/src/esbuild-plugins/rewrite-asset-imports.d.ts +5 -0
- package/@types/src/example.test.d.ts +1 -0
- package/@types/src/forms/controls/array.d.ts +33 -0
- package/@types/src/forms/controls/autocomplete.d.ts +22 -0
- package/@types/src/forms/controls/big-radio-group.d.ts +14 -0
- package/@types/src/forms/controls/checkbox-group.d.ts +21 -0
- package/@types/src/forms/controls/checkbox.d.ts +17 -0
- package/@types/src/forms/controls/checkboxed-list-input.d.ts +21 -0
- package/@types/src/forms/controls/checkboxed-list-input.test.d.ts +1 -0
- package/@types/src/forms/controls/collapsible-checkbox-group.d.ts +11 -0
- package/@types/src/forms/controls/collapsible-field-group.d.ts +21 -0
- package/@types/src/forms/controls/controls.d.ts +32 -0
- package/@types/src/forms/controls/derived-frame.d.ts +19 -0
- package/@types/src/forms/controls/derived.d.ts +13 -0
- package/@types/src/forms/controls/dropdown.d.ts +30 -0
- package/@types/src/forms/controls/editable-collection-subset.d.ts +20 -0
- package/@types/src/forms/controls/field-group.d.ts +23 -0
- package/@types/src/forms/controls/file.d.ts +12 -0
- package/@types/src/forms/controls/file.test.d.ts +1 -0
- package/@types/src/forms/controls/form-control.d.ts +23 -0
- package/@types/src/forms/controls/form-field-control.d.ts +13 -0
- package/@types/src/forms/controls/form-header.d.ts +8 -0
- package/@types/src/forms/controls/form-paragraph.d.ts +7 -0
- package/@types/src/forms/controls/frame.d.ts +17 -0
- package/@types/src/forms/controls/hidden-input.d.ts +9 -0
- package/@types/src/forms/controls/html.d.ts +11 -0
- package/@types/src/forms/controls/hybrid.d.ts +10 -0
- package/@types/src/forms/controls/image.d.ts +19 -0
- package/@types/src/forms/controls/image.test.d.ts +1 -0
- package/@types/src/forms/controls/multiple-files.d.ts +42 -0
- package/@types/src/forms/controls/multiple-images.d.ts +19 -0
- package/@types/src/forms/controls/number.d.ts +13 -0
- package/@types/src/forms/controls/password-with-generator.d.ts +6 -0
- package/@types/src/forms/controls/radio.d.ts +16 -0
- package/@types/src/forms/controls/simple-input.d.ts +35 -0
- package/@types/src/forms/controls/single-reference.d.ts +14 -0
- package/@types/src/forms/controls/single-reference.test.d.ts +1 -0
- package/@types/src/forms/controls/table.d.ts +41 -0
- package/@types/src/forms/controls/textarea.d.ts +25 -0
- package/@types/src/forms/controls/tickable.d.ts +25 -0
- package/@types/src/forms/fields/boolean.d.ts +22 -0
- package/@types/src/forms/fields/boolean.test.d.ts +1 -0
- package/@types/src/forms/fields/checkboxed-list.d.ts +23 -0
- package/@types/src/forms/fields/collection-field.d.ts +22 -0
- package/@types/src/forms/fields/color.d.ts +4 -0
- package/@types/src/forms/fields/coordinates.d.ts +14 -0
- package/@types/src/forms/fields/date.d.ts +13 -0
- package/@types/src/forms/fields/datetime.d.ts +14 -0
- package/@types/src/forms/fields/deep-reverse-single-reference-list.d.ts +20 -0
- package/@types/src/forms/fields/deep-reverse-single-reference-table.d.ts +16 -0
- package/@types/src/forms/fields/email.d.ts +10 -0
- package/@types/src/forms/fields/email.test.d.ts +1 -0
- package/@types/src/forms/fields/enum-multiple-sealious.d.ts +16 -0
- package/@types/src/forms/fields/existing-sealious-value.d.ts +6 -0
- package/@types/src/forms/fields/field.d.ts +85 -0
- package/@types/src/forms/fields/field.test.d.ts +1 -0
- package/@types/src/forms/fields/fields.d.ts +34 -0
- package/@types/src/forms/fields/file.d.ts +25 -0
- package/@types/src/forms/fields/file.test.d.ts +1 -0
- package/@types/src/forms/fields/float.d.ts +4 -0
- package/@types/src/forms/fields/get-field-for-sealious.d.ts +33 -0
- package/@types/src/forms/fields/html.d.ts +6 -0
- package/@types/src/forms/fields/hybrid.d.ts +11 -0
- package/@types/src/forms/fields/image.d.ts +5 -0
- package/@types/src/forms/fields/int.d.ts +6 -0
- package/@types/src/forms/fields/item-draft.d.ts +20 -0
- package/@types/src/forms/fields/json.d.ts +13 -0
- package/@types/src/forms/fields/markdown.d.ts +6 -0
- package/@types/src/forms/fields/multiple-files.d.ts +16 -0
- package/@types/src/forms/fields/number.d.ts +25 -0
- package/@types/src/forms/fields/number.test.d.ts +1 -0
- package/@types/src/forms/fields/password.d.ts +10 -0
- package/@types/src/forms/fields/phone-number-with-country-code.d.ts +13 -0
- package/@types/src/forms/fields/phone-number.d.ts +17 -0
- package/@types/src/forms/fields/pick-from-list-sealious.d.ts +11 -0
- package/@types/src/forms/fields/pick-from-list.d.ts +15 -0
- package/@types/src/forms/fields/pick-from-list.test.d.ts +1 -0
- package/@types/src/forms/fields/proxy-field.d.ts +15 -0
- package/@types/src/forms/fields/regexp.d.ts +21 -0
- package/@types/src/forms/fields/regexp.test.d.ts +1 -0
- package/@types/src/forms/fields/simple-form-field.d.ts +31 -0
- package/@types/src/forms/fields/single-reference.d.ts +19 -0
- package/@types/src/forms/fields/structured-array.d.ts +23 -0
- package/@types/src/forms/fields/table.d.ts +16 -0
- package/@types/src/forms/fields/text.d.ts +6 -0
- package/@types/src/forms/fields/url.d.ts +6 -0
- package/@types/src/forms/form-types.d.ts +28 -0
- package/@types/src/forms/form.d.ts +34 -0
- package/@types/src/forms/form.test.d.ts +6 -0
- package/@types/src/forms/multiform.d.ts +23 -0
- package/@types/src/forms/multiform.test.d.ts +1 -0
- package/@types/src/generate-collections.d.ts +2 -0
- package/@types/src/generate-components.d.ts +1 -0
- package/@types/src/generate-routes.d.ts +5 -0
- package/@types/src/generate-routes.test.d.ts +1 -0
- package/@types/src/generate-stimulus.d.ts +1 -0
- package/@types/src/get-fonts.d.ts +2 -0
- package/@types/src/index.d.ts +48 -0
- package/@types/src/make-env.d.ts +1 -0
- package/@types/src/make-hidden-inputs.d.ts +5 -0
- package/@types/src/mount.d.ts +6 -0
- package/@types/src/notifier.d.ts +2 -0
- package/@types/src/page/access-control.d.ts +6 -0
- package/@types/src/page/default-list-filters.d.ts +18 -0
- package/@types/src/page/list.d.ts +49 -0
- package/@types/src/page/mountable-with-fields.d.ts +49 -0
- package/@types/src/page/mountable-with-fields.test.d.ts +1 -0
- package/@types/src/page/mountable.d.ts +10 -0
- package/@types/src/page/page.d.ts +18 -0
- package/@types/src/page/props-parser.d.ts +15 -0
- package/@types/src/page/sealious-list.d.ts +20 -0
- package/@types/src/page/sealious-list.test.d.ts +1 -0
- package/@types/src/page/stateful-page.d.ts +63 -0
- package/@types/src/page/stateful-page.test.d.ts +1 -0
- package/@types/src/register-external.d.ts +2 -0
- package/@types/src/register-external.test.d.ts +1 -0
- package/@types/src/run.d.ts +1 -0
- package/@types/src/sanitize.d.ts +1 -0
- package/@types/src/target-locreq.d.ts +4 -0
- package/@types/src/templates/collection.d.ts +1 -0
- package/@types/src/templates/form.d.ts +14 -0
- package/@types/src/templates/form.test.d.ts +1 -0
- package/@types/src/templates/jdd-component.d.ts +1 -0
- package/@types/src/templates/jdd-editor.d.ts +1 -0
- package/@types/src/templates/list.d.ts +1 -0
- package/@types/src/templates/long-running-process.d.ts +1 -0
- package/@types/src/templates/multiform.d.ts +1 -0
- package/@types/src/templates/page.d.ts +1 -0
- package/@types/src/templates/post.d.ts +1 -0
- package/@types/src/templates/redirect.d.ts +1 -0
- package/@types/src/templates/route-test.d.ts +1 -0
- package/@types/src/templates/shared/collection-create-form.d.ts +1 -0
- package/@types/src/templates/shared/collection-edit-form.d.ts +1 -0
- package/@types/src/templates/shared/collection-list.d.ts +16 -0
- package/@types/src/templates/shared/item-delete.d.ts +1 -0
- package/@types/src/templates/shared/shared-crud-form-fields.d.ts +1 -0
- package/@types/src/templates/stateful-page.d.ts +1 -0
- package/@types/src/templates/stimulus-controller.d.ts +1 -0
- package/@types/src/templates/templates.d.ts +1 -0
- package/@types/src/test_utils/exec_async.d.ts +1 -0
- package/@types/src/test_utils/locator_is_visible.d.ts +2 -0
- package/@types/src/test_utils/test-on-real-app.d.ts +26 -0
- package/@types/src/utils/assert-throws.d.ts +1 -0
- package/@types/src/utils/base64.d.ts +2 -0
- package/@types/src/utils/browser-creator.d.ts +1 -0
- package/@types/src/utils/escape-url-params.d.ts +2 -0
- package/@types/src/utils/exec.d.ts +5 -0
- package/@types/src/utils/extract-fields-from-collection.d.ts +14 -0
- package/@types/src/utils/format-external-url.d.ts +1 -0
- package/@types/src/utils/import-path.d.ts +2 -0
- package/@types/src/utils/input-wrapper.d.ts +5 -0
- package/@types/src/utils/list-collections.d.ts +1 -0
- package/@types/src/utils/make-slug.d.ts +1 -0
- package/@types/src/utils/module-dirname.d.ts +1 -0
- package/@types/src/utils/natural-numbers.d.ts +1 -0
- package/@types/src/utils/prettier.d.ts +3 -0
- package/@types/src/utils/question.d.ts +1 -0
- package/@types/src/utils/render-attributes.d.ts +1 -0
- package/@types/src/utils/sleep.d.ts +1 -0
- package/@types/src/utils/translate.d.ts +4 -0
- package/@types/src/utils/url-with-new-params.d.ts +2 -0
- package/@types/src/utils/utils.d.ts +17 -0
- package/@types/src/utils/walk.d.ts +1 -0
- package/@types/src/utils/with-fallback.d.ts +2 -0
- package/@types/src/utils/wrap-attributes.d.ts +3 -0
- package/@types/src/utils/write-file.d.ts +1 -0
- package/lib/add-route.js +1 -3
- package/lib/builders/colors-builder.js +4 -5
- package/lib/forms/controls/file.js +1 -1
- package/lib/forms/controls/multiple-files.js +6 -5
- package/lib/forms/controls/single-reference.js +4 -1
- package/lib/forms/controls/tickable.js +1 -1
- package/lib/forms/fields/file.js +5 -5
- package/lib/forms/fields/image.js +1 -3
- package/lib/forms/fields/phone-number-with-country-code.js +0 -1
- package/lib/forms/fields/simple-form-field.js +1 -1
- package/lib/forms/fields/structured-array.js +1 -2
- package/lib/get-fonts.js +5 -1
- package/lib/page/mountable-with-fields.js +1 -2
- package/lib/page/mountable-with-fields.test.js +1 -1
- package/lib/page/sealious-list.js +3 -1
- package/package.json +2 -2
- package/src/build.ts +1 -2
- package/src/cli.ts +4 -5
- package/src/forms/controls/controls.ts +0 -1
- package/src/forms/controls/dropdown.ts +15 -13
- package/src/forms/controls/file.ts +1 -1
- package/src/forms/controls/html.ts +4 -3
- package/src/forms/controls/multiple-files.ts +9 -12
- package/src/forms/controls/number.ts +8 -8
- package/src/forms/controls/single-reference.ts +25 -12
- package/src/forms/controls/table.ts +2 -2
- package/src/forms/controls/textarea.ts +4 -3
- package/src/forms/controls/tickable.ts +2 -2
- package/src/forms/fields/deep-reverse-single-reference-list.ts +2 -5
- package/src/forms/fields/deep-reverse-single-reference-table.ts +16 -14
- package/src/forms/fields/field.ts +4 -4
- package/src/forms/fields/file.ts +27 -21
- package/src/forms/fields/image.ts +1 -5
- package/src/forms/fields/phone-number-with-country-code.ts +1 -2
- package/src/forms/fields/pick-from-list.ts +2 -2
- package/src/forms/fields/simple-form-field.ts +3 -3
- package/src/forms/fields/structured-array.ts +2 -3
- package/src/forms/fields/table.ts +4 -7
- package/src/forms/multiform.ts +9 -6
- package/src/generate-routes.ts +3 -3
- package/src/get-fonts.ts +7 -3
- package/src/notifier.ts +1 -2
- package/src/page/list.ts +4 -4
- package/src/page/mountable-with-fields.test.ts +1 -1
- package/src/page/mountable-with-fields.ts +4 -4
- package/src/page/sealious-list.ts +17 -8
- package/src/page/stateful-page.ts +1 -1
- package/src/templates/jdd-editor.ts +1 -1
- package/src/test_utils/test-on-real-app.ts +5 -5
- package/tsconfig.json +2 -0
- package/src/forms/controls/big-radio-group.ts +0 -48
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function sleep(time: number): Promise<unknown>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type Awaited<T> = T extends Promise<infer U> ? U : T;
|
|
2
|
+
export type UnwrapArray<T> = T extends Array<infer U> ? U : T;
|
|
3
|
+
export declare function keys<S extends string>(object: Record<S, unknown>): S[];
|
|
4
|
+
export type ExtractTail<T extends any[]> = T extends [infer _, ...infer Tail] ? Tail : never;
|
|
5
|
+
export { sleep } from "./sleep.js";
|
|
6
|
+
export { naturalNumbers } from "./natural-numbers.js";
|
|
7
|
+
export { UrlWithNewParams } from "./url-with-new-params.js";
|
|
8
|
+
export { exec } from "./exec.js";
|
|
9
|
+
export { importPath, curryImportPath } from "./import-path.js";
|
|
10
|
+
export { listCollections } from "./list-collections.js";
|
|
11
|
+
export { walkDir } from "./walk.js";
|
|
12
|
+
export { assertThrowsAsync } from "./assert-throws.js";
|
|
13
|
+
export * from "./make-slug.js";
|
|
14
|
+
export * from "./render-attributes.js";
|
|
15
|
+
export * from "./format-external-url.js";
|
|
16
|
+
export * from "./base64.js";
|
|
17
|
+
export * from "./with-fallback.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function walkDir(dir: string): Promise<string[]>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function writeFile(path: string, content: string): Promise<void>;
|
package/lib/add-route.js
CHANGED
|
@@ -46,9 +46,7 @@ async function addRoute(params, app_directory = process.cwd()) {
|
|
|
46
46
|
}
|
|
47
47
|
]);
|
|
48
48
|
const { action, url, mode } = response;
|
|
49
|
-
const extension = ["list", "lpr", "page", "sreact", "jdd-editor"].includes(
|
|
50
|
-
mode
|
|
51
|
-
) ? "tsx" : "ts";
|
|
49
|
+
const extension = ["list", "lpr", "page", "sreact", "jdd-editor"].includes(mode) ? "tsx" : "ts";
|
|
52
50
|
const base_file_name = escape_url_params(url) || "index";
|
|
53
51
|
const file_path = target_locreq.resolve(
|
|
54
52
|
`src/back/routes/${base_file_name}.${mode}.${extension}`
|
|
@@ -401,15 +401,14 @@ class ColorsBuilder extends Builder {
|
|
|
401
401
|
document.addEventListener("click", (event) => {
|
|
402
402
|
const box = event.target.closest(".color-box");
|
|
403
403
|
if (box) {
|
|
404
|
-
const css_var =
|
|
405
|
-
"is-main"
|
|
406
|
-
|
|
407
|
-
? \`var(--color-\${box.getAttribute(
|
|
404
|
+
const css_var =
|
|
405
|
+
box.classList.contains("is-main") ?
|
|
406
|
+
\`var(--color-\${box.getAttribute(
|
|
408
407
|
"data-color-group-name"
|
|
409
408
|
)}-\${box.getAttribute(
|
|
410
409
|
"data-color-name"
|
|
411
410
|
)})\`
|
|
412
|
-
:
|
|
411
|
+
: \`var(--color-\${box.getAttribute(
|
|
413
412
|
"data-color-group-name"
|
|
414
413
|
)}-\${box.getAttribute(
|
|
415
414
|
"data-color-name"
|
|
@@ -40,9 +40,7 @@ class MultipleFiles extends FormFieldControl {
|
|
|
40
40
|
files = [files];
|
|
41
41
|
}
|
|
42
42
|
await Promise.all(
|
|
43
|
-
files.map(
|
|
44
|
-
(file) => this.addFileAssociation(ctx, file)
|
|
45
|
-
)
|
|
43
|
+
files.map((file) => this.addFileAssociation(ctx, file))
|
|
46
44
|
);
|
|
47
45
|
ctx.body = this.renderFrame(
|
|
48
46
|
ctx,
|
|
@@ -51,7 +49,10 @@ class MultipleFiles extends FormFieldControl {
|
|
|
51
49
|
});
|
|
52
50
|
}
|
|
53
51
|
async deleteFileAssociation(ctx, file_item_id) {
|
|
54
|
-
await
|
|
52
|
+
await this.getReferencingCollection().removeByID(
|
|
53
|
+
ctx.$context,
|
|
54
|
+
file_item_id
|
|
55
|
+
);
|
|
55
56
|
}
|
|
56
57
|
async addFileAssociation(ctx, file) {
|
|
57
58
|
const file_field = this.getFileField();
|
|
@@ -63,7 +64,7 @@ class MultipleFiles extends FormFieldControl {
|
|
|
63
64
|
[this.field.collection_field.referencing_field]: await this.field.getItemId(ctx),
|
|
64
65
|
[file_field.name]: file
|
|
65
66
|
};
|
|
66
|
-
await
|
|
67
|
+
await this.getReferencingCollection().create(ctx.$context, body);
|
|
67
68
|
}
|
|
68
69
|
getFrameRelativeURL() {
|
|
69
70
|
return `${this.field.name}_files`;
|
|
@@ -8,7 +8,7 @@ class SingleReferenceDropdown extends FreeformDropdown {
|
|
|
8
8
|
super(
|
|
9
9
|
field,
|
|
10
10
|
async (ctx) => {
|
|
11
|
-
const { items } = await ctx
|
|
11
|
+
const { items } = await this.getCollection(ctx).list(ctx.$context).fetch();
|
|
12
12
|
return [
|
|
13
13
|
{ value: "", label: "--" },
|
|
14
14
|
...items.map((item) => ({
|
|
@@ -22,6 +22,9 @@ class SingleReferenceDropdown extends FreeformDropdown {
|
|
|
22
22
|
this.field = field;
|
|
23
23
|
this.options = options;
|
|
24
24
|
}
|
|
25
|
+
getCollection(ctx) {
|
|
26
|
+
return ctx.$app.collections[this.field.sealiousField.target_collection];
|
|
27
|
+
}
|
|
25
28
|
setOptionLabelGetter(getter) {
|
|
26
29
|
this.options.getLabel = getter;
|
|
27
30
|
return this;
|
|
@@ -73,7 +73,7 @@ class Tickable extends FormFieldControl {
|
|
|
73
73
|
})();
|
|
74
74
|
</script>
|
|
75
75
|
|
|
76
|
-
${(~valid || !!field_message) && !this.options.hide_errors && fctx.validate ? `<div class="input__error">${Array.from(new Set([message, field_message
|
|
76
|
+
${(~valid || !!field_message) && !this.options.hide_errors && fctx.validate ? `<div class="input__error">${Array.from(new Set([message, field_message?.message || false].filter((e) => !!e))).join(" \u2022 ")}</div>` : ""}
|
|
77
77
|
`
|
|
78
78
|
);
|
|
79
79
|
}
|
package/lib/forms/fields/file.js
CHANGED
|
@@ -27,21 +27,21 @@ class File extends FormField {
|
|
|
27
27
|
raw_value,
|
|
28
28
|
"old",
|
|
29
29
|
predicates.instanceOf(PathFilePointer)
|
|
30
|
-
) ? await ctx.$app.fileManager.toPointer(
|
|
31
|
-
raw_value.old
|
|
32
|
-
) : null;
|
|
30
|
+
) ? await ctx.$app.fileManager.toPointer(raw_value.old) : null;
|
|
33
31
|
const new_file = hasFieldOfType(
|
|
34
32
|
raw_value,
|
|
35
33
|
"new",
|
|
36
34
|
predicates.or(
|
|
37
|
-
predicates.array(
|
|
35
|
+
predicates.array(
|
|
36
|
+
predicates.instanceOf(PathFilePointer)
|
|
37
|
+
),
|
|
38
38
|
predicates.instanceOf(PathFilePointer)
|
|
39
39
|
)
|
|
40
40
|
) ? Array.isArray(raw_value.new) ? raw_value.new[0] : raw_value.new : null;
|
|
41
41
|
result = {
|
|
42
42
|
parsable: true,
|
|
43
43
|
error: null,
|
|
44
|
-
parsed_value: { old: old_file, new: new_file }
|
|
44
|
+
parsed_value: { old: old_file, new: new_file || null }
|
|
45
45
|
};
|
|
46
46
|
}
|
|
47
47
|
return result;
|
|
@@ -39,7 +39,7 @@ class TextBasedSimpleField extends SimpleFormField {
|
|
|
39
39
|
}
|
|
40
40
|
async postSealiousCreate(_ctx, _created_item, _formData) {
|
|
41
41
|
}
|
|
42
|
-
async postSealiousEdit(
|
|
42
|
+
async postSealiousEdit(_ctx, _edited_item, _formData) {
|
|
43
43
|
}
|
|
44
44
|
getControl() {
|
|
45
45
|
return new SimpleInput(this, {
|
package/lib/get-fonts.js
CHANGED
|
@@ -75,7 +75,11 @@ async function getFonts(_ = {}) {
|
|
|
75
75
|
fonts_css_file_path,
|
|
76
76
|
content.replace(/@font-face {/g, "@font-face {\nfont-display: swap;")
|
|
77
77
|
);
|
|
78
|
-
|
|
78
|
+
try {
|
|
79
|
+
await unlink("public/fonsta.config.json");
|
|
80
|
+
} catch {
|
|
81
|
+
console.info("No fonsta config present, using just google fonts");
|
|
82
|
+
}
|
|
79
83
|
await rmdir("public/tmp");
|
|
80
84
|
console.info("Downloaded new fonts pack from Font Squirrel");
|
|
81
85
|
console.info("Downloaded new fonts pack");
|
|
@@ -10,8 +10,7 @@ class MountableWithFields extends Mountable {
|
|
|
10
10
|
this.field_names_prefix = "";
|
|
11
11
|
// useful for multiform, where many forms are merged into one and field assignment is made using the prefix
|
|
12
12
|
this.form_id = "";
|
|
13
|
-
|
|
14
|
-
this.fields = {};
|
|
13
|
+
this.fields = {};
|
|
15
14
|
}
|
|
16
15
|
/** most routes should be setup using .mount(), but mount runs before
|
|
17
16
|
initialization so we don't yet have controls, app, etc ready for dynamic
|
|
@@ -16,7 +16,7 @@ describe("mountable-with-fields", () => {
|
|
|
16
16
|
async onSubmit(ctx, form_values) {
|
|
17
17
|
const data = await this.getParsedValues(ctx);
|
|
18
18
|
data.not_required?.trim();
|
|
19
|
-
data.required.trim();
|
|
19
|
+
(data.required || "").trim();
|
|
20
20
|
const { parsed: data2 } = await this.fields.not_required.getParsedValue(
|
|
21
21
|
ctx,
|
|
22
22
|
form_values.raw_values
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sealcode/sealgen",
|
|
3
|
-
"version": "0.19.
|
|
3
|
+
"version": "0.19.29",
|
|
4
4
|
"description": "Module to automate adding routes and collections to a sealious application",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"source-map-support": "^0.5.21",
|
|
57
57
|
"ts-node": "^10.9.1",
|
|
58
58
|
"typescript": "6.0.3",
|
|
59
|
-
"typescript-eslint": "
|
|
59
|
+
"typescript-eslint": "8.70",
|
|
60
60
|
"wait-port": "^1.0.4"
|
|
61
61
|
},
|
|
62
62
|
"types": "./@types/index.d.ts",
|
package/src/build.ts
CHANGED
|
@@ -126,8 +126,7 @@ export async function buildProject({
|
|
|
126
126
|
await build(watch);
|
|
127
127
|
} catch (e) {
|
|
128
128
|
console.error("CAUGHT!");
|
|
129
|
-
|
|
130
|
-
console.error(e.message);
|
|
129
|
+
console.error((e as Error).message);
|
|
131
130
|
if (!watch) {
|
|
132
131
|
process.exit(1);
|
|
133
132
|
}
|
package/src/cli.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
|
|
2
3
|
import yargs from "yargs/yargs";
|
|
3
4
|
import { addCollection } from "./add-collection.js";
|
|
4
5
|
import { addJDDComponent } from "./add-jdd-component.js";
|
|
@@ -16,10 +17,8 @@ import {
|
|
|
16
17
|
registerExternalStyles,
|
|
17
18
|
} from "./register-external.js";
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
(args: Record<string, string | boolean>) => Promise<void> | undefined
|
|
22
|
-
> = {
|
|
20
|
+
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
|
21
|
+
const actions: Record<string, (args: any) => Promise<void> | undefined> = {
|
|
23
22
|
"add-collection": addCollection,
|
|
24
23
|
"add-route": addRoute,
|
|
25
24
|
"add-crud": addCRUD,
|
|
@@ -47,5 +46,5 @@ void (async function () {
|
|
|
47
46
|
const action = process.argv.at(2);
|
|
48
47
|
const fn = actions[action || "default"] || actions.default;
|
|
49
48
|
const args = yargs(process.argv).argv as Record<string, string | boolean>;
|
|
50
|
-
await fn(args);
|
|
49
|
+
await fn!(args);
|
|
51
50
|
})();
|
|
@@ -15,9 +15,9 @@ export type DropdownOptions = {
|
|
|
15
15
|
|
|
16
16
|
export type DropdownOption = { value: string; label: string };
|
|
17
17
|
|
|
18
|
-
export class FreeformDropdown extends SimpleInput {
|
|
18
|
+
export class FreeformDropdown<ParsedValue> extends SimpleInput {
|
|
19
19
|
constructor(
|
|
20
|
-
public field: FormField<boolean,
|
|
20
|
+
public field: FormField<boolean, ParsedValue | null>,
|
|
21
21
|
public _generateOptions: (ctx: Context) => Promise<DropdownOption[]>,
|
|
22
22
|
public options: DropdownOptions = {
|
|
23
23
|
label: field.label || field.name,
|
|
@@ -39,15 +39,15 @@ export class FreeformDropdown extends SimpleInput {
|
|
|
39
39
|
return {
|
|
40
40
|
...original,
|
|
41
41
|
...Object.fromEntries([
|
|
42
|
-
...(this.options.autosubmit
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
42
|
+
...(this.options.autosubmit ?
|
|
43
|
+
[
|
|
44
|
+
[
|
|
45
|
+
"onchange",
|
|
46
|
+
((original.onchange as string | undefined) || "") +
|
|
47
|
+
";this.form.submit();",
|
|
48
|
+
],
|
|
49
|
+
]
|
|
50
|
+
: []),
|
|
51
51
|
]),
|
|
52
52
|
} as Record<string, string>;
|
|
53
53
|
}
|
|
@@ -74,9 +74,11 @@ export class FreeformDropdown extends SimpleInput {
|
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
export class Dropdown
|
|
77
|
+
export class Dropdown<
|
|
78
|
+
Required extends boolean,
|
|
79
|
+
> extends FreeformDropdown<string> {
|
|
78
80
|
constructor(
|
|
79
|
-
public field: PickFromListField<
|
|
81
|
+
public field: PickFromListField<Required>,
|
|
80
82
|
public options: DropdownOptions = {
|
|
81
83
|
label: field.label || field.name,
|
|
82
84
|
autosubmit: false,
|
|
@@ -29,8 +29,9 @@ export class HTML extends FormControl {
|
|
|
29
29
|
if (typeof this.renderer === "string") {
|
|
30
30
|
return this.renderer;
|
|
31
31
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
33
|
+
return typeof this.renderer == "function" ?
|
|
34
|
+
this.renderer(fctx)
|
|
35
|
+
: this.renderer;
|
|
35
36
|
}
|
|
36
37
|
}
|
|
@@ -44,7 +44,7 @@ export class MultipleFiles extends FormFieldControl {
|
|
|
44
44
|
router.post(
|
|
45
45
|
this.getFrameRelativeURL() + "/delete/:file_item_id",
|
|
46
46
|
async (ctx) => {
|
|
47
|
-
await this.deleteFileAssociation(ctx, ctx.params.file_item_id);
|
|
47
|
+
await this.deleteFileAssociation(ctx, ctx.params.file_item_id!);
|
|
48
48
|
ctx.body = this.renderFrame(
|
|
49
49
|
ctx,
|
|
50
50
|
await this.renderFrameContent(ctx)
|
|
@@ -62,9 +62,7 @@ export class MultipleFiles extends FormFieldControl {
|
|
|
62
62
|
files = [files];
|
|
63
63
|
}
|
|
64
64
|
await Promise.all(
|
|
65
|
-
files.map((file) =>
|
|
66
|
-
this.addFileAssociation(ctx, file as unknown as FilePointer)
|
|
67
|
-
)
|
|
65
|
+
files.map((file) => this.addFileAssociation(ctx, file))
|
|
68
66
|
);
|
|
69
67
|
ctx.body = this.renderFrame(
|
|
70
68
|
ctx,
|
|
@@ -74,9 +72,10 @@ export class MultipleFiles extends FormFieldControl {
|
|
|
74
72
|
}
|
|
75
73
|
|
|
76
74
|
async deleteFileAssociation(ctx: Context, file_item_id: string) {
|
|
77
|
-
await
|
|
78
|
-
|
|
79
|
-
|
|
75
|
+
await this.getReferencingCollection().removeByID(
|
|
76
|
+
ctx.$context,
|
|
77
|
+
file_item_id
|
|
78
|
+
);
|
|
80
79
|
}
|
|
81
80
|
|
|
82
81
|
async addFileAssociation(ctx: Context, file: FilePointer) {
|
|
@@ -90,9 +89,7 @@ export class MultipleFiles extends FormFieldControl {
|
|
|
90
89
|
await this.field.getItemId(ctx),
|
|
91
90
|
[file_field.name]: file,
|
|
92
91
|
};
|
|
93
|
-
await ctx.$
|
|
94
|
-
this.field.collection_field.referencing_collection
|
|
95
|
-
].create(ctx.$context, body);
|
|
92
|
+
await this.getReferencingCollection().create(ctx.$context, body);
|
|
96
93
|
}
|
|
97
94
|
|
|
98
95
|
getFrameRelativeURL() {
|
|
@@ -124,7 +121,7 @@ export class MultipleFiles extends FormFieldControl {
|
|
|
124
121
|
const result =
|
|
125
122
|
this.field.collection_field.app.collections[
|
|
126
123
|
this.field.collection_field.referencing_collection
|
|
127
|
-
]
|
|
124
|
+
]!;
|
|
128
125
|
return result;
|
|
129
126
|
}
|
|
130
127
|
|
|
@@ -203,7 +200,7 @@ export class MultipleFiles extends FormFieldControl {
|
|
|
203
200
|
.ids([item_id])
|
|
204
201
|
.attach({ [this.field.collection_field.name]: true })
|
|
205
202
|
.fetch();
|
|
206
|
-
return item
|
|
203
|
+
return item!
|
|
207
204
|
.getAttachments(this.field.collection_field.name)
|
|
208
205
|
.filter((f) => f);
|
|
209
206
|
}
|
|
@@ -5,8 +5,8 @@ import { SimpleInput, SimpleInputOptions } from "./simple-input.js";
|
|
|
5
5
|
export type NumberOptions = SimpleInputOptions & Partial<{ step: number }>;
|
|
6
6
|
|
|
7
7
|
export class Number extends SimpleInput {
|
|
8
|
-
field
|
|
9
|
-
options
|
|
8
|
+
field!: NumberField;
|
|
9
|
+
options!: NumberOptions;
|
|
10
10
|
constructor(field: NumberField, options: NumberOptions) {
|
|
11
11
|
super(field, options);
|
|
12
12
|
}
|
|
@@ -22,12 +22,12 @@ export class Number extends SimpleInput {
|
|
|
22
22
|
return {
|
|
23
23
|
...original,
|
|
24
24
|
...Object.fromEntries([
|
|
25
|
-
...(this.field.options.min
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
...(this.field.options.max
|
|
29
|
-
|
|
30
|
-
|
|
25
|
+
...(this.field.options.min ?
|
|
26
|
+
[["min", this.field.options.min]]
|
|
27
|
+
: []),
|
|
28
|
+
...(this.field.options.max ?
|
|
29
|
+
[["max", this.field.options.max]]
|
|
30
|
+
: []),
|
|
31
31
|
...(this.options.step ? [["step", this.options.step]] : []),
|
|
32
32
|
]),
|
|
33
33
|
} as Record<string, string>;
|
|
@@ -1,17 +1,27 @@
|
|
|
1
|
-
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
import { Context } from "koa";
|
|
4
|
+
import {
|
|
5
|
+
Field as SealiousField,
|
|
6
|
+
FieldTypes as SealiousFieldTypes,
|
|
7
|
+
} from "sealious";
|
|
2
8
|
import { CollectionField } from "../fields/collection-field.js";
|
|
3
9
|
import { DropdownOptions, FreeformDropdown } from "./dropdown.js";
|
|
4
10
|
import { Collection, CollectionItem } from "sealious";
|
|
11
|
+
import { FormField } from "../../index.js";
|
|
12
|
+
|
|
13
|
+
export type ExtractFieldDecoded<F extends SealiousField<any, any, any>> =
|
|
14
|
+
F extends SealiousField<infer T, unknown, unknown> ? T : never;
|
|
5
15
|
|
|
6
16
|
export class SingleReferenceDropdown<
|
|
7
17
|
TargetCollection extends Collection,
|
|
8
|
-
|
|
18
|
+
SealiousField extends SealiousFieldTypes.SingleReference,
|
|
9
19
|
Required extends boolean,
|
|
10
|
-
> extends FreeformDropdown {
|
|
20
|
+
> extends FreeformDropdown<ExtractFieldDecoded<SealiousField>> {
|
|
11
21
|
constructor(
|
|
12
|
-
public field: CollectionField<
|
|
22
|
+
public field: CollectionField<SealiousField, Required>,
|
|
13
23
|
public options: DropdownOptions & {
|
|
14
|
-
getLabel?: (item: CollectionItem<
|
|
24
|
+
getLabel?: (item: CollectionItem<TargetCollection>) => string;
|
|
15
25
|
} = {
|
|
16
26
|
label: field.label || field.name,
|
|
17
27
|
autosubmit: false,
|
|
@@ -19,20 +29,17 @@ export class SingleReferenceDropdown<
|
|
|
19
29
|
}
|
|
20
30
|
) {
|
|
21
31
|
super(
|
|
22
|
-
field,
|
|
32
|
+
field as FormField<any, any>,
|
|
23
33
|
async (ctx) => {
|
|
24
|
-
const { items } = await ctx
|
|
25
|
-
field.sealiousField.target_collection
|
|
26
|
-
]
|
|
34
|
+
const { items } = await this.getCollection(ctx)
|
|
27
35
|
.list(ctx.$context)
|
|
28
36
|
.fetch();
|
|
29
37
|
return [
|
|
30
38
|
{ value: "", label: "--" },
|
|
31
39
|
...items.map((item) => ({
|
|
32
40
|
value: item.id,
|
|
33
|
-
label:
|
|
34
|
-
? options.getLabel(item)
|
|
35
|
-
: item.id,
|
|
41
|
+
label:
|
|
42
|
+
options.getLabel ? options.getLabel(item) : item.id,
|
|
36
43
|
})),
|
|
37
44
|
];
|
|
38
45
|
},
|
|
@@ -40,6 +47,12 @@ export class SingleReferenceDropdown<
|
|
|
40
47
|
);
|
|
41
48
|
}
|
|
42
49
|
|
|
50
|
+
getCollection(ctx: Context) {
|
|
51
|
+
return ctx.$app.collections[
|
|
52
|
+
this.field.sealiousField.target_collection
|
|
53
|
+
]! as TargetCollection;
|
|
54
|
+
}
|
|
55
|
+
|
|
43
56
|
setOptionLabelGetter(
|
|
44
57
|
getter: (item: CollectionItem<TargetCollection>) => string
|
|
45
58
|
): this {
|
|
@@ -71,7 +71,7 @@ export class Table<F extends Record<string, FormField>> extends FormControl {
|
|
|
71
71
|
Object.entries(
|
|
72
72
|
row as Record<string, unknown>
|
|
73
73
|
).map(([key, value]) => [
|
|
74
|
-
this.table_field.columns[key]
|
|
74
|
+
this.table_field.columns[key]!.name,
|
|
75
75
|
value,
|
|
76
76
|
])
|
|
77
77
|
) as any) || {},
|
|
@@ -99,7 +99,7 @@ export class Table<F extends Record<string, FormField>> extends FormControl {
|
|
|
99
99
|
const inner_fctx = get_row_fctx(row, row_index);
|
|
100
100
|
return tempstream`<td>${this.options.subfield_controls[
|
|
101
101
|
column_name
|
|
102
|
-
]
|
|
102
|
+
]!.render({ ...fctx, ...inner_fctx })}</td>`;
|
|
103
103
|
})
|
|
104
104
|
.map(async (html) =>
|
|
105
105
|
(await html).replaceAll(
|
|
@@ -19,11 +19,11 @@ export class Textarea extends SimpleInput {
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
renderDescription() {
|
|
22
|
-
return this.options.description
|
|
23
|
-
|
|
22
|
+
return this.options.description ?
|
|
23
|
+
/* HTML */ `<div class="form-input__description">
|
|
24
24
|
${this.options.description}
|
|
25
25
|
</div>`
|
|
26
|
-
:
|
|
26
|
+
: "";
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
async getInputAttributes(
|
|
@@ -49,6 +49,7 @@ export class Textarea extends SimpleInput {
|
|
|
49
49
|
attributes: string,
|
|
50
50
|
data: Record<string, FormDataValue>
|
|
51
51
|
) {
|
|
52
|
+
// eslint-disable-next-line no-await-in-loop, @typescript-eslint/no-unsafe-assignment
|
|
52
53
|
const { parsed: value } = await this.field.getParsedValue(ctx, data);
|
|
53
54
|
return /* HTML */ `<textarea ${attributes}>
|
|
54
55
|
${String(value) || ""}</textarea
|
|
@@ -24,7 +24,7 @@ export abstract class Tickable<T> extends FormFieldControl {
|
|
|
24
24
|
super([field]);
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
public type
|
|
27
|
+
public type!: "checkbox" | "radio";
|
|
28
28
|
|
|
29
29
|
abstract getValueAttribute(
|
|
30
30
|
ctx: Context,
|
|
@@ -133,7 +133,7 @@ export abstract class Tickable<T> extends FormFieldControl {
|
|
|
133
133
|
!this.options.hide_errors &&
|
|
134
134
|
fctx.validate
|
|
135
135
|
) ?
|
|
136
|
-
`<div class="input__error">${Array.from(new Set([message, field_message
|
|
136
|
+
`<div class="input__error">${Array.from(new Set([message, field_message?.message || false].filter((e) => !!e))).join(" • ")}</div>`
|
|
137
137
|
: ""}
|
|
138
138
|
`
|
|
139
139
|
);
|
|
@@ -19,9 +19,7 @@ export class DeepReverseSingleReferenceList extends CheckboxedListField<
|
|
|
19
19
|
super(false, async (ctx: Context) => {
|
|
20
20
|
const { items } = await ctx.$app.collections[
|
|
21
21
|
sealious_field.target_collection
|
|
22
|
-
]
|
|
23
|
-
.list(ctx.$context)
|
|
24
|
-
.fetch();
|
|
22
|
+
]!.list(ctx.$context).fetch();
|
|
25
23
|
|
|
26
24
|
return items.map((s) => ({
|
|
27
25
|
label: this.item_label_getter(s),
|
|
@@ -48,8 +46,7 @@ export class DeepReverseSingleReferenceList extends CheckboxedListField<
|
|
|
48
46
|
// First, we remove links refering to current item
|
|
49
47
|
const { items: existing_links } = await ctx.$app.collections[
|
|
50
48
|
this.sealious_field.intermediary_collection
|
|
51
|
-
]
|
|
52
|
-
.list(ctx.$context)
|
|
49
|
+
]!.list(ctx.$context)
|
|
53
50
|
.filter({
|
|
54
51
|
[this.sealious_field.referencing_field]: created_item.id,
|
|
55
52
|
})
|