@sealcode/sealgen 0.8.15 → 0.8.16
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/controls.d.ts +1 -0
- package/@types/forms/controls/multiple-files.d.ts +8 -0
- package/@types/forms/controls/multiple-photos.d.ts +18 -0
- package/@types/forms/controls/photo.d.ts +1 -0
- package/@types/forms/controls/simple-input.d.ts +0 -1
- package/@types/utils/render-attributes.d.ts +1 -0
- package/@types/utils/utils.d.ts +1 -0
- package/lib/forms/controls/controls.js +1 -0
- package/lib/forms/controls/controls.js.map +1 -1
- package/lib/forms/controls/multiple-files.js +41 -17
- package/lib/forms/controls/multiple-files.js.map +1 -1
- package/lib/forms/controls/multiple-photos.js +37 -0
- package/lib/forms/controls/multiple-photos.js.map +1 -0
- package/lib/forms/controls/photo.js +1 -0
- package/lib/forms/controls/photo.js.map +1 -1
- package/lib/forms/controls/simple-input.js +2 -19
- package/lib/forms/controls/simple-input.js.map +1 -1
- package/lib/forms/fields/file.js +2 -3
- package/lib/forms/fields/file.js.map +1 -1
- package/lib/utils/render-attributes.js +23 -0
- package/lib/utils/render-attributes.js.map +1 -0
- package/lib/utils/utils.js +1 -0
- package/lib/utils/utils.js.map +1 -1
- package/package.json +2 -2
- package/src/forms/controls/controls.ts +1 -0
- package/src/forms/controls/multiple-files.ts +55 -17
- package/src/forms/controls/multiple-photos.ts +44 -0
- package/src/forms/controls/photo.ts +1 -0
- package/src/forms/controls/simple-input.ts +2 -18
- package/src/forms/fields/file.ts +6 -3
- package/src/forms/forms.scss +44 -0
- package/src/utils/render-attributes.ts +17 -0
- package/src/utils/utils.ts +1 -0
|
@@ -15,6 +15,7 @@ export declare class MultipleFiles extends FormFieldControl {
|
|
|
15
15
|
field: MultipleFilesField;
|
|
16
16
|
options: MultipleFilesOptions;
|
|
17
17
|
constructor(field: MultipleFilesField, options?: MultipleFilesOptions);
|
|
18
|
+
getClassModifiers(): string[];
|
|
18
19
|
mount(router: Router): void;
|
|
19
20
|
deleteFileAssociation(ctx: Context, file_item_id: string): Promise<void>;
|
|
20
21
|
addFileAssociation(ctx: Context, file: SealiousFile): Promise<void>;
|
|
@@ -25,7 +26,14 @@ export declare class MultipleFiles extends FormFieldControl {
|
|
|
25
26
|
getReferencingCollection(): Collection;
|
|
26
27
|
getFileField(): SealiousField | null;
|
|
27
28
|
extractFileFromItem(item: CollectionItem): Promise<SealiousFile | null>;
|
|
29
|
+
renderFileItemPreview(fileItem: CollectionItem, file: SealiousFile): Promise<FlatTemplatable>;
|
|
28
30
|
renderFileItem(fileItem: CollectionItem, file: SealiousFile): Promise<FlatTemplatable>;
|
|
31
|
+
renderFileRemoveButton(fileItem: CollectionItem): FlatTemplatable;
|
|
29
32
|
getFileItems(ctx: Context): Promise<CollectionItem<any>[]>;
|
|
33
|
+
getInputAttributes(): {
|
|
34
|
+
type: string;
|
|
35
|
+
name: string;
|
|
36
|
+
multiple: boolean;
|
|
37
|
+
};
|
|
30
38
|
renderFrameContent(ctx: Context): Promise<FlatTemplatable>;
|
|
31
39
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { File as SealiousFile, CollectionItem } from "sealious";
|
|
2
|
+
import { FlatTemplatable } from "tempstream";
|
|
3
|
+
import { MultipleFiles, MultipleFilesOptions } from "./multiple-files";
|
|
4
|
+
import { MultipleFiles as MultipleFilesField } from "../fields/multiple-files";
|
|
5
|
+
import KoaResponsiveImageRouter from "koa-responsive-image-router";
|
|
6
|
+
export declare class MultiplePhotos extends MultipleFiles {
|
|
7
|
+
field: MultipleFilesField;
|
|
8
|
+
imageRouter: KoaResponsiveImageRouter;
|
|
9
|
+
constructor(field: MultipleFilesField, imageRouter: KoaResponsiveImageRouter, options?: MultipleFilesOptions);
|
|
10
|
+
getClassModifiers(): string[];
|
|
11
|
+
getInputAttributes(): {
|
|
12
|
+
accept: string;
|
|
13
|
+
type: string;
|
|
14
|
+
name: string;
|
|
15
|
+
multiple: boolean;
|
|
16
|
+
};
|
|
17
|
+
renderFileItem(fileItem: CollectionItem, file: SealiousFile): Promise<FlatTemplatable>;
|
|
18
|
+
}
|
|
@@ -15,6 +15,7 @@ export declare class Photo extends File {
|
|
|
15
15
|
filename?: string;
|
|
16
16
|
}): Promise<FlatTemplatable>;
|
|
17
17
|
getInputAttributes(ctx: Context, data: Record<string, FormDataValue>, field_prefix: string, form_id: string): Promise<{
|
|
18
|
+
accept: string;
|
|
18
19
|
onchange: string;
|
|
19
20
|
}>;
|
|
20
21
|
}
|
|
@@ -24,7 +24,6 @@ export declare class SimpleInput<ParsedValue, Options extends SimpleInputOptions
|
|
|
24
24
|
getID(): string;
|
|
25
25
|
getPlaceholder(): string;
|
|
26
26
|
getInputAttributes(ctx: Context, data: Record<string, FormDataValue>, field_prefix: string, form_id: string): Promise<Record<string, string | boolean>>;
|
|
27
|
-
renderAttributes(attrs: Record<string, string | boolean>): string;
|
|
28
27
|
postInput(ctx: Context): Promise<FlatTemplatable>;
|
|
29
28
|
renderInput(ctx: Context, attributes_str: string, data: Record<string, FormDataValue>): Promise<FlatTemplatable>;
|
|
30
29
|
render<Fields extends Record<string, FormField>>(ctx: Context, data: Record<string, FormDataValue>, _messages: FormMessage[], field_prefix: string, form_id: string, show_errors: boolean): Promise<FlatTemplatable>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function renderAttributes(attrs: Record<string, string | boolean>): string;
|
package/@types/utils/utils.d.ts
CHANGED
|
@@ -50,4 +50,5 @@ __exportStar(require("./file"), exports);
|
|
|
50
50
|
__exportStar(require("./photo"), exports);
|
|
51
51
|
__exportStar(require("./multiple-files"), exports);
|
|
52
52
|
__exportStar(require("./number"), exports);
|
|
53
|
+
__exportStar(require("./multiple-photos"), exports);
|
|
53
54
|
//# sourceMappingURL=controls.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controls.js","sourceRoot":"","sources":["../../../src/forms/controls/controls.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,2DAAwD;AAA/C,sHAAA,gBAAgB,OAAA;AACzB,2EAAwE;AAA/D,sIAAA,wBAAwB,OAAA;AACjC,iCAAgC;AAAvB,8FAAA,KAAK,OAAA;AACd,iEAA8D;AAArD,4HAAA,mBAAmB,OAAA;AAC5B,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AACjB,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AACtB,+BAA8B;AAArB,4FAAA,IAAI,OAAA;AACb,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AACjB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,4CAA0B;AAC1B,6CAA2B;AAC3B,6CAA2B;AAC3B,0CAAwB;AACxB,oDAAkC;AAClC,mDAAiC;AACjC,4DAA0C;AAC1C,+DAA6C;AAC7C,iDAA+B;AAC/B,yCAAuB;AACvB,0CAAwB;AACxB,mDAAiC;AACjC,2CAAyB"}
|
|
1
|
+
{"version":3,"file":"controls.js","sourceRoot":"","sources":["../../../src/forms/controls/controls.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,2DAAwD;AAA/C,sHAAA,gBAAgB,OAAA;AACzB,2EAAwE;AAA/D,sIAAA,wBAAwB,OAAA;AACjC,iCAAgC;AAAvB,8FAAA,KAAK,OAAA;AACd,iEAA8D;AAArD,4HAAA,mBAAmB,OAAA;AAC5B,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AACjB,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AACtB,+BAA8B;AAArB,4FAAA,IAAI,OAAA;AACb,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AACjB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,4CAA0B;AAC1B,6CAA2B;AAC3B,6CAA2B;AAC3B,0CAAwB;AACxB,oDAAkC;AAClC,mDAAiC;AACjC,4DAA0C;AAC1C,+DAA6C;AAC7C,iDAA+B;AAC/B,yCAAuB;AACvB,0CAAwB;AACxB,mDAAiC;AACjC,2CAAyB;AACzB,oDAAkC"}
|
|
@@ -6,12 +6,16 @@ const input_wrapper_1 = require("../../utils/input-wrapper");
|
|
|
6
6
|
const tempstream_1 = require("tempstream");
|
|
7
7
|
const form_field_control_1 = require("./form-field-control");
|
|
8
8
|
const ts_predicates_1 = require("@sealcode/ts-predicates");
|
|
9
|
+
const render_attributes_1 = require("../../utils/render-attributes");
|
|
9
10
|
class MultipleFiles extends form_field_control_1.FormFieldControl {
|
|
10
11
|
constructor(field, options) {
|
|
11
12
|
super([field]);
|
|
12
13
|
this.field = field;
|
|
13
14
|
this.options = options || {};
|
|
14
15
|
}
|
|
16
|
+
getClassModifiers() {
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
15
19
|
mount(router) {
|
|
16
20
|
router.get(this.getFrameRelativeURL(), async (ctx) => {
|
|
17
21
|
ctx.body = this.renderFrame(ctx, await this.renderFrameContent(ctx));
|
|
@@ -21,12 +25,15 @@ class MultipleFiles extends form_field_control_1.FormFieldControl {
|
|
|
21
25
|
ctx.body = this.renderFrame(ctx, await this.renderFrameContent(ctx));
|
|
22
26
|
});
|
|
23
27
|
router.post(this.getFrameRelativeURL() + "/add", async (ctx) => {
|
|
24
|
-
|
|
25
|
-
if (!
|
|
26
|
-
ctx.body = "Missing
|
|
28
|
+
let files = ctx.$body.files;
|
|
29
|
+
if (!files || !ts_predicates_1.is(files, ts_predicates_1.predicates.object)) {
|
|
30
|
+
ctx.body = "Missing files";
|
|
27
31
|
return;
|
|
28
32
|
}
|
|
29
|
-
|
|
33
|
+
if (!Array.isArray(files)) {
|
|
34
|
+
files = [files];
|
|
35
|
+
}
|
|
36
|
+
await Promise.all(files.map((file) => this.addFileAssociation(ctx, file)));
|
|
30
37
|
ctx.body = this.renderFrame(ctx, await this.renderFrameContent(ctx));
|
|
31
38
|
});
|
|
32
39
|
}
|
|
@@ -82,20 +89,34 @@ class MultipleFiles extends form_field_control_1.FormFieldControl {
|
|
|
82
89
|
}
|
|
83
90
|
return await sealious_1.File.fromID(item.collection.app, item.get(sealious_field.name).id);
|
|
84
91
|
}
|
|
92
|
+
async renderFileItemPreview(fileItem, file) {
|
|
93
|
+
return file.filename || "no filename";
|
|
94
|
+
}
|
|
85
95
|
async renderFileItem(fileItem, file) {
|
|
86
|
-
return /* HTML */ `<li>
|
|
87
|
-
<a
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
data-turbo-frame="${this.getFrameID()}"
|
|
92
|
-
action="${this.getFrameRelativeURL()}/delete/${fileItem.id}"
|
|
93
|
-
method="POST"
|
|
96
|
+
return /* HTML */ `<li class="file-list-item">
|
|
97
|
+
<a
|
|
98
|
+
class="file-list-item__preview"
|
|
99
|
+
href="${file.getURL()}"
|
|
100
|
+
data-turbo="false"
|
|
94
101
|
>
|
|
95
|
-
|
|
96
|
-
</
|
|
102
|
+
${this.renderFileItemPreview(fileItem, file)}
|
|
103
|
+
</a>
|
|
104
|
+
${this.renderFileRemoveButton(fileItem)}
|
|
97
105
|
</li>`;
|
|
98
106
|
}
|
|
107
|
+
renderFileRemoveButton(fileItem) {
|
|
108
|
+
return /* HTML */ ` <form
|
|
109
|
+
data-turbo-frame="${this.getFrameID()}"
|
|
110
|
+
action="${this.getFrameRelativeURL()}/delete/${fileItem.id}"
|
|
111
|
+
method="POST"
|
|
112
|
+
>
|
|
113
|
+
<input
|
|
114
|
+
type="submit"
|
|
115
|
+
value="X"
|
|
116
|
+
class="file-list-action file-list-item__button file-list-item__button--delete"
|
|
117
|
+
/>
|
|
118
|
+
</form>`;
|
|
119
|
+
}
|
|
99
120
|
async getFileItems(ctx) {
|
|
100
121
|
const item_id = await this.field.getItemId(ctx);
|
|
101
122
|
const { items: [item], } = await this.field.collection_field.collection
|
|
@@ -107,14 +128,17 @@ class MultipleFiles extends form_field_control_1.FormFieldControl {
|
|
|
107
128
|
.getAttachments(this.field.collection_field.name)
|
|
108
129
|
.filter((f) => f);
|
|
109
130
|
}
|
|
131
|
+
getInputAttributes() {
|
|
132
|
+
return { type: "file", name: "files", multiple: true };
|
|
133
|
+
}
|
|
110
134
|
async renderFrameContent(ctx) {
|
|
111
135
|
const files = (await Promise.all((await this.getFileItems(ctx)).map(async (item) => [
|
|
112
136
|
item,
|
|
113
137
|
await this.extractFileFromItem(item),
|
|
114
138
|
]))).filter(([_, f]) => f !== null);
|
|
115
|
-
return input_wrapper_1.inputWrapper(["multiple-files", this.field.name], tempstream_1.tempstream /* HTML */ `
|
|
139
|
+
return input_wrapper_1.inputWrapper(["multiple-files", this.field.name, ...this.getClassModifiers()], tempstream_1.tempstream /* HTML */ `
|
|
116
140
|
<label>${this.options.label || this.field.name}</label>
|
|
117
|
-
<ul>
|
|
141
|
+
<ul class="multiple-files__list">
|
|
118
142
|
${files.map(([item, file]) => this.renderFileItem(item, file))}
|
|
119
143
|
</ul>
|
|
120
144
|
<form
|
|
@@ -123,7 +147,7 @@ class MultipleFiles extends form_field_control_1.FormFieldControl {
|
|
|
123
147
|
enctype="multipart/form-data"
|
|
124
148
|
data-turbo-frame="${this.getFrameID()}"
|
|
125
149
|
>
|
|
126
|
-
<input
|
|
150
|
+
<input ${render_attributes_1.renderAttributes(this.getInputAttributes())} />
|
|
127
151
|
<input
|
|
128
152
|
type="submit"
|
|
129
153
|
value="${this.options.uploadLabel || "Upload"}"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multiple-files.js","sourceRoot":"","sources":["../../../src/forms/controls/multiple-files.ts"],"names":[],"mappings":";;;AACA,uCAKkB;AAElB,6DAAyD;AACzD,2CAAyD;AAGzD,6DAAwD;AACxD,2DAAyD;
|
|
1
|
+
{"version":3,"file":"multiple-files.js","sourceRoot":"","sources":["../../../src/forms/controls/multiple-files.ts"],"names":[],"mappings":";;;AACA,uCAKkB;AAElB,6DAAyD;AACzD,2CAAyD;AAGzD,6DAAwD;AACxD,2DAAyD;AACzD,qEAAiE;AAIjE,MAAa,aAAc,SAAQ,qCAAgB;IAElD,YACQ,KAAyB,EAChC,OAA8B;QAE9B,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAHR,UAAK,GAAL,KAAK,CAAoB;QAIhC,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED,iBAAiB;QAChB,OAAO,EAAE,CAAC;IACX,CAAC;IAED,KAAK,CAAC,MAAc;QACnB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACpD,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAC1B,GAAG,EACH,MAAM,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAClC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CACV,IAAI,CAAC,mBAAmB,EAAE,GAAG,uBAAuB,EACpD,KAAK,EAAE,GAAG,EAAE,EAAE;YACb,MAAM,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC/D,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAC1B,GAAG,EACH,MAAM,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAClC,CAAC;QACH,CAAC,CACD,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC9D,IAAI,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,KAAsC,CAAC;YAC7D,IAAI,CAAC,KAAK,IAAI,CAAC,kBAAE,CAAC,KAAK,EAAE,0BAAU,CAAC,MAAM,CAAC,EAAE;gBAC5C,GAAG,CAAC,IAAI,GAAG,eAAe,CAAC;gBAC3B,OAAO;aACP;YACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBAC1B,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;aAChB;YACD,MAAM,OAAO,CAAC,GAAG,CAChB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAClB,IAAI,CAAC,kBAAkB,CACtB,GAAG,EACH,IAA+B,CAC/B,CACD,CACD,CAAC;YACF,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAC1B,GAAG,EACH,MAAM,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAClC,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,GAAY,EAAE,YAAoB;QAC7D,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,CACzB,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,sBAAsB,CAClD,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,GAAY,EAAE,IAAkB;QACxD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACvC,IAAI,CAAC,UAAU,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;SAC3D;QACD,MAAM,IAAI,GAAG;YACZ,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,EAC9C,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC;YAChC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI;SACvB,CAAC;QACF,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,CACzB,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,sBAAsB,CAClD,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,mBAAmB;QAClB,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC;IACnC,CAAC;IAED,UAAU;QACT,4BAA4B;QAC5B,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,2BAA2B,CAAC;IACvD,CAAC;IAED,WAAW,CAAC,GAAY,EAAE,OAAyB;QAClD,OAAO,uBAAU,CAAA,UAAU,CAAC;KACzB,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,mBAAmB,EAAE,GAAG;SAClD,IAAI,CAAC,UAAU,EAAE;;;KAGrB,OAAO,IAAI,EAAE;iBACD,CAAC;IACjB,CAAC;IAED,MAAM,CACL,GAAY,EACZ,KAAoC,EACpC,SAAa,EACb,iBAAyB,EACzB,OAAe,EACf,QAAiB;QAEjB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,wBAAwB;QACvB,MAAM,MAAM,GACX,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAC1C,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,sBAAsB,CAClD,CAAC;QACH,OAAO,MAAM,CAAC;IACf,CAAC;IAED,YAAY;QACX,KAAK,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAC/C,IAAI,CAAC,wBAAwB,EAAE,CAAC,MAAM,CACtC,EAAE;YACF,IAAI,KAAK,CAAC,kBAAkB,EAAE;gBAC7B,OAAO,KAAK,CAAC;aACb;SACD;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,KAAK,CAAC,mBAAmB,CACxB,IAAoB;QAEpB,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,IAAI,CAAC,cAAc,EAAE;YACpB,OAAO,IAAI,CAAC;SACZ;QACD,OAAO,MAAM,eAAY,CAAC,MAAM,CAC9B,IAAI,CAAC,UAAyB,CAAC,GAAG,EACnC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,CAChC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,qBAAqB,CAC1B,QAAwB,EACxB,IAAkB;QAElB,OAAO,IAAI,CAAC,QAAQ,IAAI,aAAa,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,cAAc,CACnB,QAAwB,EACxB,IAAkB;QAElB,OAAO,UAAU,CAAC;;;YAGR,IAAI,CAAC,MAAM,EAAE;;;MAGnB,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,IAAI,CAAC;;KAE3C,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC;QAClC,CAAC;IACR,CAAC;IAED,sBAAsB,CAAC,QAAwB;QAC9C,OAAO,UAAU,CAAC;uBACG,IAAI,CAAC,UAAU,EAAE;aAC3B,IAAI,CAAC,mBAAmB,EAAE,WAAW,QAAQ,CAAC,EAAE;;;;;;;;UAQnD,CAAC;IACV,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAY;QAC9B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,EACL,KAAK,EAAE,CAAC,IAAI,CAAC,GACb,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,UAAU;aAC9C,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;aAClB,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;aACd,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;aACpD,KAAK,EAAE,CAAC;QACV,OAAO,IAAI;aACT,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC;aAChD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,kBAAkB;QACjB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,GAAY;QACpC,MAAM,KAAK,GAAG,CACb,MAAM,OAAO,CAAC,GAAG,CAChB,CACC,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAC5B,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;YACrB,IAAI;YACJ,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;SACpC,CAAC,CACF,CACD,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAqC,CAAC;QAErE,OAAO,4BAAY,CAClB,CAAC,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,EAChE,uBAAU,CAAA,UAAU,CAAC;aACX,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI;;OAE3C,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAC5B,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAC/B;;;eAGS,IAAI,CAAC,mBAAmB,EAAE;;;yBAGhB,IAAI,CAAC,UAAU,EAAE;;cAE5B,oCAAgB,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;;;eAG1C,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,QAAQ;;;;IAI/C,CACD,CAAC;IACH,CAAC;CACD;AAxOD,sCAwOC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MultiplePhotos = void 0;
|
|
4
|
+
const tempstream_1 = require("tempstream");
|
|
5
|
+
const multiple_files_1 = require("./multiple-files");
|
|
6
|
+
class MultiplePhotos extends multiple_files_1.MultipleFiles {
|
|
7
|
+
constructor(field, imageRouter, options) {
|
|
8
|
+
super(field, options);
|
|
9
|
+
this.field = field;
|
|
10
|
+
this.imageRouter = imageRouter;
|
|
11
|
+
}
|
|
12
|
+
getClassModifiers() {
|
|
13
|
+
return ["multiple-files--photos"];
|
|
14
|
+
}
|
|
15
|
+
getInputAttributes() {
|
|
16
|
+
return { ...super.getInputAttributes(), accept: "image/*" };
|
|
17
|
+
}
|
|
18
|
+
async renderFileItem(fileItem, file) {
|
|
19
|
+
const path = file.getDataPath();
|
|
20
|
+
if (!path) {
|
|
21
|
+
return "missing file";
|
|
22
|
+
}
|
|
23
|
+
return tempstream_1.tempstream /* HTML */ `<li>
|
|
24
|
+
<a href="${file.getURL()}" data-turbo="false">
|
|
25
|
+
${this.imageRouter.image({
|
|
26
|
+
path,
|
|
27
|
+
resolutions: [150, 300],
|
|
28
|
+
sizes_attr: "150px",
|
|
29
|
+
})}
|
|
30
|
+
</a>
|
|
31
|
+
<span class="filename"> ${file.filename || "no filename"}</span>
|
|
32
|
+
${this.renderFileRemoveButton(fileItem)}
|
|
33
|
+
</li>`;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.MultiplePhotos = MultiplePhotos;
|
|
37
|
+
//# sourceMappingURL=multiple-photos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multiple-photos.js","sourceRoot":"","sources":["../../../src/forms/controls/multiple-photos.ts"],"names":[],"mappings":";;;AACA,2CAAyD;AACzD,qDAAuE;AAIvE,MAAa,cAAe,SAAQ,8BAAa;IAChD,YACQ,KAAyB,EACzB,WAAqC,EAC5C,OAA8B;QAE9B,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAJf,UAAK,GAAL,KAAK,CAAoB;QACzB,gBAAW,GAAX,WAAW,CAA0B;IAI7C,CAAC;IAED,iBAAiB;QAChB,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACnC,CAAC;IAED,kBAAkB;QACjB,OAAO,EAAE,GAAG,KAAK,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,cAAc,CACnB,QAAwB,EACxB,IAAkB;QAElB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE;YACV,OAAO,cAAc,CAAC;SACtB;QACD,OAAO,uBAAU,CAAA,UAAU,CAAC;cAChB,IAAI,CAAC,MAAM,EAAE;MACrB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;YACxB,IAAI;YACJ,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;YACvB,UAAU,EAAE,OAAO;SACnB,CAAC;;6BAEuB,IAAI,CAAC,QAAQ,IAAI,aAAa;KACtD,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC;QAClC,CAAC;IACR,CAAC;CACD;AArCD,wCAqCC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"photo.js","sourceRoot":"","sources":["../../../src/forms/controls/photo.ts"],"names":[],"mappings":";;;AACA,2CAAyD;AACzD,iCAA8B;AAC9B,uCAAgD;AAMhD,MAAa,KAAM,SAAQ,WAAI;IAC9B,YACQ,KAAwC,EACxC,WAAqC,EAC5C,OAA4B;QAE5B,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAJf,UAAK,GAAL,KAAK,CAAmC;QACxC,gBAAW,GAAX,WAAW,CAA0B;IAI7C,CAAC;IAED,KAAK,CAAC,WAAW;QAChB,OAAO,kDAAkD,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,iBAAiB,CACtB,GAAY,EACZ,SAA6C;QAE7C,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;QACnC,MAAM,UAAU,GAAG,cAAc,CAAC;QAClC,IAAI,CAAC,EAAE,EAAE;YACR,OAAO,eAAe,UAAU,UAAU,CAAC;SAC3C;QACD,MAAM,IAAI,GAAG,MAAM,eAAY,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACrD,OAAO,uBAAU,CAAA,UAAU,CAAC,eAAe,UAAU;KAClD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;YACxB,WAAW,EAAE,CAAC,GAAG,CAAC;YAClB,UAAU,EAAE,OAAO;YACnB,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE;YACxB,SAAS,EAAE,MAAM,IAAI,CAAC,WAAW,EAAE;SACnC,CAAC;SACI,CAAC;IACT,CAAC;IAED,KAAK,CAAC,kBAAkB,CACvB,GAAY,EACZ,IAAmC,EACnC,YAAoB,EACpB,OAAe;QAEf,MAAM,QAAQ,GAAG,CAAC,MAAM,KAAK,CAAC,kBAAkB,CAC/C,GAAG,EACH,IAAI,EACJ,YAAY,EACZ,OAAO,CACP,CAAqC,CAAC;QACvC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACxD,OAAO;YACN,GAAG,QAAQ;YACX,QAAQ,EACP,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;gBACzB,GAAG;gBACH;;;;;;;;4EAQwE,MAAM,IAAI,CAAC,WAAW,EAAE;;EAElG;qBACI,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC;qBACrB,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;SACvB,CAAC;IACH,CAAC;CACD;
|
|
1
|
+
{"version":3,"file":"photo.js","sourceRoot":"","sources":["../../../src/forms/controls/photo.ts"],"names":[],"mappings":";;;AACA,2CAAyD;AACzD,iCAA8B;AAC9B,uCAAgD;AAMhD,MAAa,KAAM,SAAQ,WAAI;IAC9B,YACQ,KAAwC,EACxC,WAAqC,EAC5C,OAA4B;QAE5B,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAJf,UAAK,GAAL,KAAK,CAAmC;QACxC,gBAAW,GAAX,WAAW,CAA0B;IAI7C,CAAC;IAED,KAAK,CAAC,WAAW;QAChB,OAAO,kDAAkD,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,iBAAiB,CACtB,GAAY,EACZ,SAA6C;QAE7C,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;QACnC,MAAM,UAAU,GAAG,cAAc,CAAC;QAClC,IAAI,CAAC,EAAE,EAAE;YACR,OAAO,eAAe,UAAU,UAAU,CAAC;SAC3C;QACD,MAAM,IAAI,GAAG,MAAM,eAAY,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACrD,OAAO,uBAAU,CAAA,UAAU,CAAC,eAAe,UAAU;KAClD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;YACxB,WAAW,EAAE,CAAC,GAAG,CAAC;YAClB,UAAU,EAAE,OAAO;YACnB,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE;YACxB,SAAS,EAAE,MAAM,IAAI,CAAC,WAAW,EAAE;SACnC,CAAC;SACI,CAAC;IACT,CAAC;IAED,KAAK,CAAC,kBAAkB,CACvB,GAAY,EACZ,IAAmC,EACnC,YAAoB,EACpB,OAAe;QAEf,MAAM,QAAQ,GAAG,CAAC,MAAM,KAAK,CAAC,kBAAkB,CAC/C,GAAG,EACH,IAAI,EACJ,YAAY,EACZ,OAAO,CACP,CAAqC,CAAC;QACvC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACxD,OAAO;YACN,GAAG,QAAQ;YACX,MAAM,EAAE,SAAS;YACjB,QAAQ,EACP,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;gBACzB,GAAG;gBACH;;;;;;;;4EAQwE,MAAM,IAAI,CAAC,WAAW,EAAE;;EAElG;qBACI,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC;qBACrB,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;SACvB,CAAC;IACH,CAAC;CACD;AAnED,sBAmEC"}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SimpleInput = void 0;
|
|
4
4
|
const tempstream_1 = require("tempstream");
|
|
5
|
-
const sanitize_1 = require("../../sanitize");
|
|
6
5
|
const input_wrapper_1 = require("../../utils/input-wrapper");
|
|
6
|
+
const render_attributes_1 = require("../../utils/render-attributes");
|
|
7
7
|
const controls_1 = require("./controls");
|
|
8
8
|
class SimpleInput extends controls_1.FormFieldControl {
|
|
9
9
|
constructor(field, options) {
|
|
@@ -54,23 +54,6 @@ class SimpleInput extends controls_1.FormFieldControl {
|
|
|
54
54
|
...(this.options.step ? [["step", this.options.step]] : []),
|
|
55
55
|
]);
|
|
56
56
|
}
|
|
57
|
-
renderAttributes(attrs) {
|
|
58
|
-
return Object.entries(attrs)
|
|
59
|
-
.map(([key, value]) => {
|
|
60
|
-
if (typeof value === "boolean") {
|
|
61
|
-
if (value) {
|
|
62
|
-
return key;
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
return "";
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
return `${key}="${sanitize_1.attribute(value)}"`;
|
|
70
|
-
}
|
|
71
|
-
})
|
|
72
|
-
.join(" ");
|
|
73
|
-
}
|
|
74
57
|
async postInput(ctx) {
|
|
75
58
|
return "";
|
|
76
59
|
}
|
|
@@ -86,7 +69,7 @@ class SimpleInput extends controls_1.FormFieldControl {
|
|
|
86
69
|
return input_wrapper_1.inputWrapper([id, type, input_wrapper_1.getRequiredClass(this.field.required)], tempstream_1.tempstream /* HTML */ `
|
|
87
70
|
${label ? `<label for="${id}">${label}</label>` : ""}
|
|
88
71
|
${await this.preInput(ctx, data)}
|
|
89
|
-
${this.renderInput(ctx,
|
|
72
|
+
${this.renderInput(ctx, render_attributes_1.renderAttributes(await this.getInputAttributes(ctx, data, field_prefix, form_id)), data)}
|
|
90
73
|
${this.postInput(ctx)}
|
|
91
74
|
${~valid && !this.options.hide_errors && show_errors
|
|
92
75
|
? `<div class="input__error">${message}</div>`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simple-input.js","sourceRoot":"","sources":["../../../src/forms/controls/simple-input.ts"],"names":[],"mappings":";;;AACA,2CAAyD;AACzD,
|
|
1
|
+
{"version":3,"file":"simple-input.js","sourceRoot":"","sources":["../../../src/forms/controls/simple-input.ts"],"names":[],"mappings":"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"}
|
package/lib/forms/fields/file.js
CHANGED
|
@@ -34,9 +34,8 @@ class File extends field_1.FormField {
|
|
|
34
34
|
raw_value.old.id
|
|
35
35
|
? await sealious_1.File.fromID(ctx.$app, raw_value.old.id)
|
|
36
36
|
: null;
|
|
37
|
-
const new_file = ts_predicates_1.
|
|
38
|
-
raw_value.new
|
|
39
|
-
? raw_value.new
|
|
37
|
+
const new_file = ts_predicates_1.hasFieldOfType(raw_value, "new", ts_predicates_1.predicates.array(ts_predicates_1.predicates.object)) && raw_value.new[0] instanceof sealious_1.File
|
|
38
|
+
? raw_value.new[0]
|
|
40
39
|
: null;
|
|
41
40
|
result = {
|
|
42
41
|
parsable: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file.js","sourceRoot":"","sources":["../../../src/forms/fields/file.ts"],"names":[],"mappings":";;;AAAA,2DAMiC;AAEjC,uCAAgD;AAEhD,mCAAsD;AAOtD,MAAa,IAA+B,SAAQ,iBAGnD;IACA,KAAK,CAAC,KAAK,CACV,GAAY,EACZ,SAAwB;QAExB,IAAI,MAAM,CAAC;QACX,IACC,SAAS,YAAY,eAAY;YACjC,CAAC,kBAAE,CAAC,SAAS,EAAE,0BAAU,CAAC,MAAM,CAAC;gBAChC,wBAAQ,CACP;oBACC,QAAQ,EAAE,0BAAU,CAAC,MAAM;oBAC3B,EAAE,EAAE,0BAAU,CAAC,MAAM;iBACrB,EACD,SAAS,CACT;gBACD,SAAS,CAAC,EAAE,CAAC,EACb;YACD,MAAM,IAAI,GAAG,MAAM,eAAY,CAAC,MAAM,CACrC,GAAG,CAAC,IAAI,EACR,SAAS,CAAC,EAAY,CACtB,CAAC;YACF,MAAM,GAAG;gBACR,YAAY,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE;gBACtC,KAAK,EAAE,IAAI;gBACX,QAAQ,EAAE,IAAY;aACtB,CAAC;SACF;aAAM,IAAI,CAAC,kBAAE,CAAC,SAAS,EAAE,0BAAU,CAAC,MAAM,CAAC,EAAE;YAC7C,MAAM,GAAG;gBACR,YAAY,EAAE,IAAI;gBAClB,KAAK,EAAE,wEAAwE;gBAC/E,QAAQ,EAAE,KAAc;aACxB,CAAC;SACF;aAAM;YACN,MAAM,QAAQ,GACb,8BAAc,CAAC,SAAS,EAAE,KAAK,EAAE,0BAAU,CAAC,MAAM,CAAC;gBACnD,wBAAQ,CACP,EAAE,EAAE,EAAE,0BAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,0BAAU,CAAC,MAAM,EAAE,EACtD,SAAS,CAAC,GAAG,CACb;gBACD,SAAS,CAAC,GAAG,CAAC,EAAE;gBACf,CAAC,CAAC,MAAM,eAAY,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvD,CAAC,CAAC,IAAI,CAAC;YACT,MAAM,QAAQ,GACb,
|
|
1
|
+
{"version":3,"file":"file.js","sourceRoot":"","sources":["../../../src/forms/fields/file.ts"],"names":[],"mappings":";;;AAAA,2DAMiC;AAEjC,uCAAgD;AAEhD,mCAAsD;AAOtD,MAAa,IAA+B,SAAQ,iBAGnD;IACA,KAAK,CAAC,KAAK,CACV,GAAY,EACZ,SAAwB;QAExB,IAAI,MAAM,CAAC;QACX,IACC,SAAS,YAAY,eAAY;YACjC,CAAC,kBAAE,CAAC,SAAS,EAAE,0BAAU,CAAC,MAAM,CAAC;gBAChC,wBAAQ,CACP;oBACC,QAAQ,EAAE,0BAAU,CAAC,MAAM;oBAC3B,EAAE,EAAE,0BAAU,CAAC,MAAM;iBACrB,EACD,SAAS,CACT;gBACD,SAAS,CAAC,EAAE,CAAC,EACb;YACD,MAAM,IAAI,GAAG,MAAM,eAAY,CAAC,MAAM,CACrC,GAAG,CAAC,IAAI,EACR,SAAS,CAAC,EAAY,CACtB,CAAC;YACF,MAAM,GAAG;gBACR,YAAY,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE;gBACtC,KAAK,EAAE,IAAI;gBACX,QAAQ,EAAE,IAAY;aACtB,CAAC;SACF;aAAM,IAAI,CAAC,kBAAE,CAAC,SAAS,EAAE,0BAAU,CAAC,MAAM,CAAC,EAAE;YAC7C,MAAM,GAAG;gBACR,YAAY,EAAE,IAAI;gBAClB,KAAK,EAAE,wEAAwE;gBAC/E,QAAQ,EAAE,KAAc;aACxB,CAAC;SACF;aAAM;YACN,MAAM,QAAQ,GACb,8BAAc,CAAC,SAAS,EAAE,KAAK,EAAE,0BAAU,CAAC,MAAM,CAAC;gBACnD,wBAAQ,CACP,EAAE,EAAE,EAAE,0BAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,0BAAU,CAAC,MAAM,EAAE,EACtD,SAAS,CAAC,GAAG,CACb;gBACD,SAAS,CAAC,GAAG,CAAC,EAAE;gBACf,CAAC,CAAC,MAAM,eAAY,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvD,CAAC,CAAC,IAAI,CAAC;YACT,MAAM,QAAQ,GACb,8BAAc,CACb,SAAS,EACT,KAAK,EACL,0BAAU,CAAC,KAAK,CAAC,0BAAU,CAAC,MAAM,CAAC,CACnC,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,eAAY;gBAC5C,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;gBAClB,CAAC,CAAC,IAAI,CAAC;YACT,MAAM,GAAG;gBACR,QAAQ,EAAE,IAAY;gBACtB,KAAK,EAAE,IAAI;gBACX,YAAY,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE;aAC9C,CAAC;SACF;QACD,OAAO,MAAM,CAAC;IACf,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,GAAY,EAAE,IAAmC;QACvE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAClD,OAAO,MAAM,CAAC,GAAG,IAAI,SAAS,CAAC;IAChC,CAAC;IAED,aAAa;QACZ,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IACjC,CAAC;CACD;AAvED,oBAuEC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderAttributes = void 0;
|
|
4
|
+
const sanitize_1 = require("../sanitize");
|
|
5
|
+
function renderAttributes(attrs) {
|
|
6
|
+
return Object.entries(attrs)
|
|
7
|
+
.map(([key, value]) => {
|
|
8
|
+
if (typeof value === "boolean") {
|
|
9
|
+
if (value) {
|
|
10
|
+
return key;
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
return "";
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
return `${key}="${sanitize_1.attribute(value)}"`;
|
|
18
|
+
}
|
|
19
|
+
})
|
|
20
|
+
.join(" ");
|
|
21
|
+
}
|
|
22
|
+
exports.renderAttributes = renderAttributes;
|
|
23
|
+
//# sourceMappingURL=render-attributes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-attributes.js","sourceRoot":"","sources":["../../src/utils/render-attributes.ts"],"names":[],"mappings":";;;AAAA,0CAAwC;AAExC,SAAgB,gBAAgB,CAAC,KAAuC;IACvE,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACrB,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE;YAC/B,IAAI,KAAK,EAAE;gBACV,OAAO,GAAG,CAAC;aACX;iBAAM;gBACN,OAAO,EAAE,CAAC;aACV;SACD;aAAM;YACN,OAAO,GAAG,GAAG,KAAK,oBAAS,CAAC,KAAK,CAAC,GAAG,CAAC;SACtC;IACF,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAC;AACb,CAAC;AAdD,4CAcC"}
|
package/lib/utils/utils.js
CHANGED
|
@@ -27,4 +27,5 @@ Object.defineProperty(exports, "listCollections", { enumerable: true, get: funct
|
|
|
27
27
|
var walk_1 = require("./walk");
|
|
28
28
|
Object.defineProperty(exports, "walkDir", { enumerable: true, get: function () { return walk_1.walkDir; } });
|
|
29
29
|
__exportStar(require("./make-slug"), exports);
|
|
30
|
+
__exportStar(require("./render-attributes"), exports);
|
|
30
31
|
//# sourceMappingURL=utils.js.map
|
package/lib/utils/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAGA,iCAAgC;AAAvB,8FAAA,KAAK,OAAA;AACd,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AACvB,6DAAyD;AAAhD,uHAAA,gBAAgB,OAAA;AACzB,+BAA8B;AAArB,4FAAA,IAAI,OAAA;AACb,6CAA4D;AAAnD,yGAAA,UAAU,OAAA;AAAE,8GAAA,eAAe,OAAA;AACpC,uDAAqD;AAA5C,mHAAA,eAAe,OAAA;AACxB,+BAAiC;AAAxB,+FAAA,OAAO,OAAA;AAChB,8CAA4B"}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAGA,iCAAgC;AAAvB,8FAAA,KAAK,OAAA;AACd,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AACvB,6DAAyD;AAAhD,uHAAA,gBAAgB,OAAA;AACzB,+BAA8B;AAArB,4FAAA,IAAI,OAAA;AACb,6CAA4D;AAAnD,yGAAA,UAAU,OAAA;AAAE,8GAAA,eAAe,OAAA;AACpC,uDAAqD;AAA5C,mHAAA,eAAe,OAAA;AACxB,+BAAiC;AAAxB,+FAAA,OAAO,OAAA;AAChB,8CAA4B;AAC5B,sDAAoC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sealcode/sealgen",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.16",
|
|
4
4
|
"description": "Module to automate adding routes and collections to a sealious application",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -53,6 +53,6 @@
|
|
|
53
53
|
"@koa/router": "^10.1.1",
|
|
54
54
|
"koa": "^2.13.0",
|
|
55
55
|
"koa-responsive-image-router": "^0.2.2",
|
|
56
|
-
"sealious": "^0.17.
|
|
56
|
+
"sealious": "^0.17.15"
|
|
57
57
|
}
|
|
58
58
|
}
|
|
@@ -12,6 +12,7 @@ import { MultipleFiles as MultipleFilesField } from "../fields/multiple-files";
|
|
|
12
12
|
import { FormDataValue } from "../form";
|
|
13
13
|
import { FormFieldControl } from "./form-field-control";
|
|
14
14
|
import { is, predicates } from "@sealcode/ts-predicates";
|
|
15
|
+
import { renderAttributes } from "../../utils/render-attributes";
|
|
15
16
|
|
|
16
17
|
export type MultipleFilesOptions = { label?: string; uploadLabel?: string };
|
|
17
18
|
|
|
@@ -25,6 +26,10 @@ export class MultipleFiles extends FormFieldControl {
|
|
|
25
26
|
this.options = options || {};
|
|
26
27
|
}
|
|
27
28
|
|
|
29
|
+
getClassModifiers(): string[] {
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
|
|
28
33
|
mount(router: Router) {
|
|
29
34
|
router.get(this.getFrameRelativeURL(), async (ctx) => {
|
|
30
35
|
ctx.body = this.renderFrame(
|
|
@@ -45,12 +50,22 @@ export class MultipleFiles extends FormFieldControl {
|
|
|
45
50
|
);
|
|
46
51
|
|
|
47
52
|
router.post(this.getFrameRelativeURL() + "/add", async (ctx) => {
|
|
48
|
-
|
|
49
|
-
if (!
|
|
50
|
-
ctx.body = "Missing
|
|
53
|
+
let files = ctx.$body.files as SealiousFile | SealiousFile[];
|
|
54
|
+
if (!files || !is(files, predicates.object)) {
|
|
55
|
+
ctx.body = "Missing files";
|
|
51
56
|
return;
|
|
52
57
|
}
|
|
53
|
-
|
|
58
|
+
if (!Array.isArray(files)) {
|
|
59
|
+
files = [files];
|
|
60
|
+
}
|
|
61
|
+
await Promise.all(
|
|
62
|
+
files.map((file) =>
|
|
63
|
+
this.addFileAssociation(
|
|
64
|
+
ctx,
|
|
65
|
+
file as unknown as SealiousFile
|
|
66
|
+
)
|
|
67
|
+
)
|
|
68
|
+
);
|
|
54
69
|
ctx.body = this.renderFrame(
|
|
55
70
|
ctx,
|
|
56
71
|
await this.renderFrameContent(ctx)
|
|
@@ -141,24 +156,43 @@ export class MultipleFiles extends FormFieldControl {
|
|
|
141
156
|
);
|
|
142
157
|
}
|
|
143
158
|
|
|
159
|
+
async renderFileItemPreview(
|
|
160
|
+
fileItem: CollectionItem,
|
|
161
|
+
file: SealiousFile
|
|
162
|
+
): Promise<FlatTemplatable> {
|
|
163
|
+
return file.filename || "no filename";
|
|
164
|
+
}
|
|
165
|
+
|
|
144
166
|
async renderFileItem(
|
|
145
167
|
fileItem: CollectionItem,
|
|
146
168
|
file: SealiousFile
|
|
147
169
|
): Promise<FlatTemplatable> {
|
|
148
|
-
return /* HTML */ `<li>
|
|
149
|
-
<a
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
data-turbo-frame="${this.getFrameID()}"
|
|
154
|
-
action="${this.getFrameRelativeURL()}/delete/${fileItem.id}"
|
|
155
|
-
method="POST"
|
|
170
|
+
return /* HTML */ `<li class="file-list-item">
|
|
171
|
+
<a
|
|
172
|
+
class="file-list-item__preview"
|
|
173
|
+
href="${file.getURL()}"
|
|
174
|
+
data-turbo="false"
|
|
156
175
|
>
|
|
157
|
-
|
|
158
|
-
</
|
|
176
|
+
${this.renderFileItemPreview(fileItem, file)}
|
|
177
|
+
</a>
|
|
178
|
+
${this.renderFileRemoveButton(fileItem)}
|
|
159
179
|
</li>`;
|
|
160
180
|
}
|
|
161
181
|
|
|
182
|
+
renderFileRemoveButton(fileItem: CollectionItem): FlatTemplatable {
|
|
183
|
+
return /* HTML */ ` <form
|
|
184
|
+
data-turbo-frame="${this.getFrameID()}"
|
|
185
|
+
action="${this.getFrameRelativeURL()}/delete/${fileItem.id}"
|
|
186
|
+
method="POST"
|
|
187
|
+
>
|
|
188
|
+
<input
|
|
189
|
+
type="submit"
|
|
190
|
+
value="X"
|
|
191
|
+
class="file-list-action file-list-item__button file-list-item__button--delete"
|
|
192
|
+
/>
|
|
193
|
+
</form>`;
|
|
194
|
+
}
|
|
195
|
+
|
|
162
196
|
async getFileItems(ctx: Context) {
|
|
163
197
|
const item_id = await this.field.getItemId(ctx);
|
|
164
198
|
const {
|
|
@@ -173,6 +207,10 @@ export class MultipleFiles extends FormFieldControl {
|
|
|
173
207
|
.filter((f) => f);
|
|
174
208
|
}
|
|
175
209
|
|
|
210
|
+
getInputAttributes() {
|
|
211
|
+
return { type: "file", name: "files", multiple: true };
|
|
212
|
+
}
|
|
213
|
+
|
|
176
214
|
async renderFrameContent(ctx: Context): Promise<FlatTemplatable> {
|
|
177
215
|
const files = (
|
|
178
216
|
await Promise.all(
|
|
@@ -186,10 +224,10 @@ export class MultipleFiles extends FormFieldControl {
|
|
|
186
224
|
).filter(([_, f]) => f !== null) as [CollectionItem, SealiousFile][];
|
|
187
225
|
|
|
188
226
|
return inputWrapper(
|
|
189
|
-
["multiple-files", this.field.name],
|
|
227
|
+
["multiple-files", this.field.name, ...this.getClassModifiers()],
|
|
190
228
|
tempstream/* HTML */ `
|
|
191
229
|
<label>${this.options.label || this.field.name}</label>
|
|
192
|
-
<ul>
|
|
230
|
+
<ul class="multiple-files__list">
|
|
193
231
|
${files.map(([item, file]) =>
|
|
194
232
|
this.renderFileItem(item, file)
|
|
195
233
|
)}
|
|
@@ -200,7 +238,7 @@ export class MultipleFiles extends FormFieldControl {
|
|
|
200
238
|
enctype="multipart/form-data"
|
|
201
239
|
data-turbo-frame="${this.getFrameID()}"
|
|
202
240
|
>
|
|
203
|
-
<input
|
|
241
|
+
<input ${renderAttributes(this.getInputAttributes())} />
|
|
204
242
|
<input
|
|
205
243
|
type="submit"
|
|
206
244
|
value="${this.options.uploadLabel || "Upload"}"
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { File as SealiousFile, CollectionItem } from "sealious";
|
|
2
|
+
import { FlatTemplatable, tempstream } from "tempstream";
|
|
3
|
+
import { MultipleFiles, MultipleFilesOptions } from "./multiple-files";
|
|
4
|
+
import { MultipleFiles as MultipleFilesField } from "../fields/multiple-files";
|
|
5
|
+
import KoaResponsiveImageRouter from "koa-responsive-image-router";
|
|
6
|
+
|
|
7
|
+
export class MultiplePhotos extends MultipleFiles {
|
|
8
|
+
constructor(
|
|
9
|
+
public field: MultipleFilesField,
|
|
10
|
+
public imageRouter: KoaResponsiveImageRouter,
|
|
11
|
+
options?: MultipleFilesOptions
|
|
12
|
+
) {
|
|
13
|
+
super(field, options);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
getClassModifiers() {
|
|
17
|
+
return ["multiple-files--photos"];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
getInputAttributes() {
|
|
21
|
+
return { ...super.getInputAttributes(), accept: "image/*" };
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async renderFileItem(
|
|
25
|
+
fileItem: CollectionItem,
|
|
26
|
+
file: SealiousFile
|
|
27
|
+
): Promise<FlatTemplatable> {
|
|
28
|
+
const path = file.getDataPath();
|
|
29
|
+
if (!path) {
|
|
30
|
+
return "missing file";
|
|
31
|
+
}
|
|
32
|
+
return tempstream/* HTML */ `<li>
|
|
33
|
+
<a href="${file.getURL()}" data-turbo="false">
|
|
34
|
+
${this.imageRouter.image({
|
|
35
|
+
path,
|
|
36
|
+
resolutions: [150, 300],
|
|
37
|
+
sizes_attr: "150px",
|
|
38
|
+
})}
|
|
39
|
+
</a>
|
|
40
|
+
<span class="filename"> ${file.filename || "no filename"}</span>
|
|
41
|
+
${this.renderFileRemoveButton(fileItem)}
|
|
42
|
+
</li>`;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Context } from "koa";
|
|
2
2
|
import { FlatTemplatable, tempstream } from "tempstream";
|
|
3
|
-
import { attribute } from "../../sanitize";
|
|
4
3
|
import { getRequiredClass, inputWrapper } from "../../utils/input-wrapper";
|
|
4
|
+
import { renderAttributes } from "../../utils/render-attributes";
|
|
5
5
|
import { FormField } from "../fields/field";
|
|
6
6
|
import { FormDataValue, FormMessage } from "../form";
|
|
7
7
|
import { FormFieldControl } from "./controls";
|
|
@@ -101,22 +101,6 @@ export class SimpleInput<
|
|
|
101
101
|
]);
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
-
renderAttributes(attrs: Record<string, string | boolean>) {
|
|
105
|
-
return Object.entries(attrs)
|
|
106
|
-
.map(([key, value]) => {
|
|
107
|
-
if (typeof value === "boolean") {
|
|
108
|
-
if (value) {
|
|
109
|
-
return key;
|
|
110
|
-
} else {
|
|
111
|
-
return "";
|
|
112
|
-
}
|
|
113
|
-
} else {
|
|
114
|
-
return `${key}="${attribute(value)}"`;
|
|
115
|
-
}
|
|
116
|
-
})
|
|
117
|
-
.join(" ");
|
|
118
|
-
}
|
|
119
|
-
|
|
120
104
|
async postInput(ctx: Context): Promise<FlatTemplatable> {
|
|
121
105
|
return "";
|
|
122
106
|
}
|
|
@@ -154,7 +138,7 @@ export class SimpleInput<
|
|
|
154
138
|
${await this.preInput(ctx, data)}
|
|
155
139
|
${this.renderInput(
|
|
156
140
|
ctx,
|
|
157
|
-
|
|
141
|
+
renderAttributes(
|
|
158
142
|
await this.getInputAttributes(
|
|
159
143
|
ctx,
|
|
160
144
|
data,
|
package/src/forms/fields/file.ts
CHANGED
|
@@ -62,9 +62,12 @@ export class File<Required extends boolean> extends FormField<
|
|
|
62
62
|
? await SealiousFile.fromID(ctx.$app, raw_value.old.id)
|
|
63
63
|
: null;
|
|
64
64
|
const new_file =
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
65
|
+
hasFieldOfType(
|
|
66
|
+
raw_value,
|
|
67
|
+
"new",
|
|
68
|
+
predicates.array(predicates.object)
|
|
69
|
+
) && raw_value.new[0] instanceof SealiousFile
|
|
70
|
+
? raw_value.new[0]
|
|
68
71
|
: null;
|
|
69
72
|
result = {
|
|
70
73
|
parsable: true as true,
|
package/src/forms/forms.scss
CHANGED
|
@@ -30,3 +30,47 @@
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
|
+
|
|
34
|
+
.form-input__wrapper--multiple-files--photos {
|
|
35
|
+
ul {
|
|
36
|
+
list-style: none;
|
|
37
|
+
display: grid;
|
|
38
|
+
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
|
|
39
|
+
grid-gap: 10px;
|
|
40
|
+
margin-bottom: 20px;
|
|
41
|
+
|
|
42
|
+
li {
|
|
43
|
+
background-color: white;
|
|
44
|
+
box-shadow: 1px 1px 6px 0px #00000038;
|
|
45
|
+
padding: 10px;
|
|
46
|
+
display: grid;
|
|
47
|
+
grid-template-columns: 1fr 20px;
|
|
48
|
+
grid-template-rows: 20px auto min-content;
|
|
49
|
+
grid-row-gap: 10px;
|
|
50
|
+
|
|
51
|
+
a {
|
|
52
|
+
grid-row: 1/3;
|
|
53
|
+
grid-column: 1/3;
|
|
54
|
+
|
|
55
|
+
picture,
|
|
56
|
+
img {
|
|
57
|
+
width: 100%;
|
|
58
|
+
height: 150px;
|
|
59
|
+
object-fit: contain;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.filename {
|
|
64
|
+
grid-row: 3/4;
|
|
65
|
+
grid-column: 1/3;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
form {
|
|
69
|
+
grid-row: 1/2;
|
|
70
|
+
grid-column: 2/3;
|
|
71
|
+
position: relative;
|
|
72
|
+
z-index: 2;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { attribute } from "../sanitize";
|
|
2
|
+
|
|
3
|
+
export function renderAttributes(attrs: Record<string, string | boolean>) {
|
|
4
|
+
return Object.entries(attrs)
|
|
5
|
+
.map(([key, value]) => {
|
|
6
|
+
if (typeof value === "boolean") {
|
|
7
|
+
if (value) {
|
|
8
|
+
return key;
|
|
9
|
+
} else {
|
|
10
|
+
return "";
|
|
11
|
+
}
|
|
12
|
+
} else {
|
|
13
|
+
return `${key}="${attribute(value)}"`;
|
|
14
|
+
}
|
|
15
|
+
})
|
|
16
|
+
.join(" ");
|
|
17
|
+
}
|
package/src/utils/utils.ts
CHANGED