cotomy 0.1.59 → 0.1.62
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/README.md +16 -0
- package/dist/cjs/index.cjs +2 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/esm/api.js +468 -0
- package/dist/esm/api.js.map +1 -0
- package/dist/esm/debug.js +42 -0
- package/dist/esm/debug.js.map +1 -0
- package/dist/esm/form.js +383 -0
- package/dist/esm/form.js.map +1 -0
- package/dist/esm/index.js +6 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/page.js +128 -0
- package/dist/esm/page.js.map +1 -0
- package/dist/esm/view.js +1198 -0
- package/dist/esm/view.js.map +1 -0
- package/dist/{view.d.ts → types/view.d.ts} +10 -3
- package/package.json +25 -6
- package/dist/index.js +0 -2
- package/dist/index.js.map +0 -1
- /package/dist/{api.d.ts → types/api.d.ts} +0 -0
- /package/dist/{debug.d.ts → types/debug.d.ts} +0 -0
- /package/dist/{form.d.ts → types/form.d.ts} +0 -0
- /package/dist/{index.d.ts → types/index.d.ts} +0 -0
- /package/dist/{page.d.ts → types/page.d.ts} +0 -0
package/dist/esm/form.js
ADDED
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
import dayjs from "dayjs";
|
|
2
|
+
import { StatusCodes } from "http-status-codes";
|
|
3
|
+
import { CotomyApi, CotomyApiException, CotomyApiResponse, CotomyBracketBindNameGenerator, CotomyNotFoundException, CotomyViewRenderer } from "./api";
|
|
4
|
+
import { CotomyDebugFeature, CotomyDebugSettings } from "./debug";
|
|
5
|
+
import { CotomyElement, CotomyWindow } from "./view";
|
|
6
|
+
export class CotomyForm extends CotomyElement {
|
|
7
|
+
generateId(prefix = "__cotomy_form__") {
|
|
8
|
+
return super.generateId(prefix);
|
|
9
|
+
}
|
|
10
|
+
method() {
|
|
11
|
+
return this.attribute("method") ?? "get";
|
|
12
|
+
}
|
|
13
|
+
actionUrl() {
|
|
14
|
+
return this.attribute("action") ?? location.pathname + location.search;
|
|
15
|
+
}
|
|
16
|
+
async reloadAsync() {
|
|
17
|
+
CotomyWindow.instance.reload();
|
|
18
|
+
}
|
|
19
|
+
get autoReload() {
|
|
20
|
+
return this.attribute("data-cotomy-autoreload") !== "false";
|
|
21
|
+
}
|
|
22
|
+
set autoReload(value) {
|
|
23
|
+
if (value) {
|
|
24
|
+
this.attribute("data-cotomy-autoreload", null);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
this.attribute("data-cotomy-autoreload", "false");
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
get initialized() {
|
|
31
|
+
return this.hasAttribute("data-cotomy-initialized");
|
|
32
|
+
}
|
|
33
|
+
initialize() {
|
|
34
|
+
if (!this.initialized) {
|
|
35
|
+
this.on("submit", async (e) => {
|
|
36
|
+
e.preventDefault();
|
|
37
|
+
e.stopPropagation();
|
|
38
|
+
await this.submitAsync();
|
|
39
|
+
});
|
|
40
|
+
this.attribute("data-cotomy-initialized", "");
|
|
41
|
+
}
|
|
42
|
+
return this;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export class CotomyQueryForm extends CotomyForm {
|
|
46
|
+
method() {
|
|
47
|
+
return "get";
|
|
48
|
+
}
|
|
49
|
+
async submitAsync() {
|
|
50
|
+
const url = this.actionUrl();
|
|
51
|
+
const queryParams = {};
|
|
52
|
+
const queryString = url.split("?")[1];
|
|
53
|
+
if (queryString) {
|
|
54
|
+
queryString.split("&").forEach(param => {
|
|
55
|
+
const [key, value] = param.split("=");
|
|
56
|
+
if (key && value) {
|
|
57
|
+
queryParams[key] = decodeURIComponent(value);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
this.find("[name]").forEach(input => {
|
|
62
|
+
const name = input.attribute("name");
|
|
63
|
+
if (name) {
|
|
64
|
+
const value = input.value;
|
|
65
|
+
if (value) {
|
|
66
|
+
queryParams[name] = encodeURIComponent(value);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
delete queryParams[name];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
const newQueryString = Object.entries(queryParams)
|
|
74
|
+
.map(([key, value]) => `${key}=${value}`)
|
|
75
|
+
.join("&");
|
|
76
|
+
location.href = `${url.split("?")[0]}?${newQueryString}`;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export class CotomyApiFailedEvent extends Event {
|
|
80
|
+
constructor(_response, eventName = "cotomy:apifailed") {
|
|
81
|
+
super(eventName, { bubbles: true, cancelable: true });
|
|
82
|
+
this._response = _response;
|
|
83
|
+
}
|
|
84
|
+
get response() {
|
|
85
|
+
return this._response;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export class CotomyApiForm extends CotomyForm {
|
|
89
|
+
apiClient() {
|
|
90
|
+
return new CotomyApi();
|
|
91
|
+
}
|
|
92
|
+
actionUrl() {
|
|
93
|
+
return this.attribute("action");
|
|
94
|
+
}
|
|
95
|
+
apiFailed(handle) {
|
|
96
|
+
this.on("cotomy:apifailed", async (e) => {
|
|
97
|
+
await handle(e);
|
|
98
|
+
});
|
|
99
|
+
return this;
|
|
100
|
+
}
|
|
101
|
+
triggerApiFailedEvent(response) {
|
|
102
|
+
this.trigger("cotomy:apifailed", new CotomyApiFailedEvent(response));
|
|
103
|
+
if (CotomyDebugSettings.isEnabled(CotomyDebugFeature.Api)) {
|
|
104
|
+
console.error("API request failed:", response);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
submitFailed(handle) {
|
|
108
|
+
this.on("cotomy:submitfailed", async (e) => {
|
|
109
|
+
await handle(e);
|
|
110
|
+
});
|
|
111
|
+
return this;
|
|
112
|
+
}
|
|
113
|
+
triggerSubmitFailedEvent(response) {
|
|
114
|
+
this.trigger("cotomy:submitfailed", new CotomyApiFailedEvent(response, "cotomy:submitfailed"));
|
|
115
|
+
if (CotomyDebugSettings.isEnabled(CotomyDebugFeature.Api)) {
|
|
116
|
+
console.error("Submit failed:", response);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
method() {
|
|
120
|
+
return this.attribute("method") ?? "post";
|
|
121
|
+
}
|
|
122
|
+
formData() {
|
|
123
|
+
const formElement = this.element;
|
|
124
|
+
const formData = new FormData(formElement);
|
|
125
|
+
this.find("input[type=datetime-local][name]:not([disabled])").forEach(input => {
|
|
126
|
+
const localDateTime = input.value;
|
|
127
|
+
if (localDateTime) {
|
|
128
|
+
const date = new Date(localDateTime);
|
|
129
|
+
if (!isNaN(date.getTime())) {
|
|
130
|
+
formData.set(input.attribute("name"), dayjs(date).format("YYYY-MM-DDTHH:mmZ"));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
if (CotomyDebugSettings.isEnabled(CotomyDebugFeature.FormData)) {
|
|
135
|
+
console.debug("FormData:", Array.from(formData.entries()));
|
|
136
|
+
}
|
|
137
|
+
return formData;
|
|
138
|
+
}
|
|
139
|
+
;
|
|
140
|
+
async submitAsync() {
|
|
141
|
+
const formData = this.formData();
|
|
142
|
+
await this.submitToApiAsync(formData);
|
|
143
|
+
}
|
|
144
|
+
async submitToApiAsync(formData) {
|
|
145
|
+
const api = this.apiClient();
|
|
146
|
+
try {
|
|
147
|
+
const response = await api.submitAsync({
|
|
148
|
+
method: this.method(),
|
|
149
|
+
action: this.actionUrl(),
|
|
150
|
+
body: formData,
|
|
151
|
+
});
|
|
152
|
+
return response;
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
if (error instanceof CotomyApiException) {
|
|
156
|
+
this.triggerApiFailedEvent(error.response);
|
|
157
|
+
this.triggerSubmitFailedEvent(error.response);
|
|
158
|
+
}
|
|
159
|
+
throw error;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
export class CotomyEntityApiForm extends CotomyApiForm {
|
|
164
|
+
actionUrl() {
|
|
165
|
+
const base = this.attribute("action");
|
|
166
|
+
const keys = this.externalKey ? [this.externalKey] : this.pathKeyInputs.map(e => encodeURIComponent(e.value));
|
|
167
|
+
return `${base}/${keys.join("/")}`;
|
|
168
|
+
}
|
|
169
|
+
method() {
|
|
170
|
+
if (this.hasAttribute("method") && this.attribute("method") !== "") {
|
|
171
|
+
return this.attribute("method");
|
|
172
|
+
}
|
|
173
|
+
if (this.externalKey)
|
|
174
|
+
return "put";
|
|
175
|
+
if (this.pathKeyInputs.length > 0 && this.pathKeyInputs.every(e => e.readonly))
|
|
176
|
+
return "put";
|
|
177
|
+
if (this.keyInputs.length > 0 && this.keyInputs.every(e => e.readonly))
|
|
178
|
+
return "put";
|
|
179
|
+
return "post";
|
|
180
|
+
}
|
|
181
|
+
get externalKey() {
|
|
182
|
+
return this.attribute("data-cotomy-key") || undefined;
|
|
183
|
+
}
|
|
184
|
+
setExternalKey(response) {
|
|
185
|
+
if (this.requiresExternalKey && response.status === StatusCodes.CREATED) {
|
|
186
|
+
if (this.hasExternalKey) {
|
|
187
|
+
if (CotomyDebugSettings.isEnabled(CotomyDebugFeature.FormLoad)) {
|
|
188
|
+
console.warn("External key already exists, but server responded with 201 Created. Possible duplicate POST.");
|
|
189
|
+
}
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
const location = response.headers.get("Location");
|
|
193
|
+
if (!location)
|
|
194
|
+
return;
|
|
195
|
+
const normalize = (url) => {
|
|
196
|
+
const s = url.replace(/[?#].*$/, "");
|
|
197
|
+
return s.endsWith("/") ? s.slice(0, -1) : s;
|
|
198
|
+
};
|
|
199
|
+
const toPath = (u) => {
|
|
200
|
+
try {
|
|
201
|
+
return new URL(u, location).pathname;
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
return u;
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
const baseAction = normalize(toPath(this.attribute("action")));
|
|
208
|
+
const locPath = normalize(toPath(location));
|
|
209
|
+
const actionParts = baseAction.split("/");
|
|
210
|
+
const locationParts = locPath.split("/");
|
|
211
|
+
const isPrefix = locationParts.length >= actionParts.length && actionParts.every((p, i) => p === locationParts[i]);
|
|
212
|
+
if (!isPrefix) {
|
|
213
|
+
throw new Error(`Location path does not start with action path. action="${baseAction}", location="${locPath}"`);
|
|
214
|
+
}
|
|
215
|
+
const addedParts = locationParts.slice(actionParts.length).filter(Boolean);
|
|
216
|
+
if (addedParts.length === 1 && addedParts[0]) {
|
|
217
|
+
this.attribute("data-cotomy-key", addedParts[0]);
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
const msg = `Location does not contain a single external key segment.
|
|
221
|
+
action="${baseAction}", location="${locPath}", added=["${addedParts.join('","')}"]`;
|
|
222
|
+
throw new Error(msg);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
get requiresExternalKey() {
|
|
227
|
+
return this.attribute("data-cotomy-identify") !== "false" && this.keyInputs.length == 0 && this.pathKeyInputs.length == 0;
|
|
228
|
+
}
|
|
229
|
+
get hasExternalKey() {
|
|
230
|
+
return !!this.externalKey;
|
|
231
|
+
}
|
|
232
|
+
get pathKeyInputs() {
|
|
233
|
+
return this.find("[data-cotomy-keyindex]").sort((a, b) => {
|
|
234
|
+
const aIndex = parseInt(a.attribute("data-cotomy-keyindex") ?? "0");
|
|
235
|
+
const bIndex = parseInt(b.attribute("data-cotomy-keyindex") ?? "0");
|
|
236
|
+
return aIndex - bIndex;
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
get keyInputs() {
|
|
240
|
+
return this.contains("[data-cotomy-key]") ? this.find("[data-cotomy-key]").sort((a, b) => {
|
|
241
|
+
const aIndex = parseInt(a.attribute("data-cotomy-key") ?? "0");
|
|
242
|
+
const bIndex = parseInt(b.attribute("data-cotomy-key") ?? "0");
|
|
243
|
+
return aIndex - bIndex;
|
|
244
|
+
}) : this.find("[name][data-cotomy-key]");
|
|
245
|
+
}
|
|
246
|
+
get usePathKey() {
|
|
247
|
+
const use = this.pathKeyInputs.length > 0 || this.requiresExternalKey;
|
|
248
|
+
if (use && this.hasExternalKey && CotomyDebugSettings.isEnabled(CotomyDebugFeature.FormLoad)) {
|
|
249
|
+
console.warn("Both externalKey and pathKeyInputs are present. Using externalKey and ignoring pathKeyInputs.");
|
|
250
|
+
}
|
|
251
|
+
return use;
|
|
252
|
+
}
|
|
253
|
+
get pathKeyString() {
|
|
254
|
+
return this.externalKey || this.pathKeyInputs.map(e => e.value).join("/");
|
|
255
|
+
}
|
|
256
|
+
async submitToApiAsync(formData) {
|
|
257
|
+
const response = await super.submitToApiAsync(formData);
|
|
258
|
+
if (this.requiresExternalKey && response.status === StatusCodes.CREATED) {
|
|
259
|
+
this.setExternalKey(response);
|
|
260
|
+
}
|
|
261
|
+
return response;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
export class CotomyEntityFillApiForm extends CotomyEntityApiForm {
|
|
265
|
+
constructor() {
|
|
266
|
+
super(...arguments);
|
|
267
|
+
this._fillers = {};
|
|
268
|
+
}
|
|
269
|
+
filler(type, func) {
|
|
270
|
+
this._fillers[type] = func;
|
|
271
|
+
return this;
|
|
272
|
+
}
|
|
273
|
+
initialize() {
|
|
274
|
+
if (!this.initialized) {
|
|
275
|
+
super.initialize();
|
|
276
|
+
this.filler("datetime-local", (input, value) => {
|
|
277
|
+
const hasOffset = /[+-]\d{2}:\d{2}$/.test(value);
|
|
278
|
+
const date = hasOffset ? new Date(value) : new Date(`${value}Z`);
|
|
279
|
+
if (!isNaN(date.getTime())) {
|
|
280
|
+
input.value = dayjs(date).format("YYYY-MM-DDTHH:mm");
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
input.value = "";
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
this.filler("checkbox", (input, value) => {
|
|
287
|
+
input.attribute("checked", null);
|
|
288
|
+
if (value) {
|
|
289
|
+
input.attribute("checked", "");
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
this.filler("radio", (input, value) => {
|
|
293
|
+
input.attribute("checked", null);
|
|
294
|
+
if (input.value === value) {
|
|
295
|
+
input.attribute("checked", "");
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
CotomyWindow.instance.ready(async () => {
|
|
299
|
+
await this.loadAsync();
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
return this;
|
|
303
|
+
}
|
|
304
|
+
async submitToApiAsync(formData) {
|
|
305
|
+
const response = await super.submitToApiAsync(formData);
|
|
306
|
+
if (response.ok) {
|
|
307
|
+
await this.fillAsync(response);
|
|
308
|
+
}
|
|
309
|
+
return response;
|
|
310
|
+
}
|
|
311
|
+
async reloadAsync() {
|
|
312
|
+
await this.loadAsync();
|
|
313
|
+
}
|
|
314
|
+
loadActionUrl() {
|
|
315
|
+
return this.actionUrl();
|
|
316
|
+
}
|
|
317
|
+
bindNameGenerator() {
|
|
318
|
+
return new CotomyBracketBindNameGenerator();
|
|
319
|
+
}
|
|
320
|
+
renderer() {
|
|
321
|
+
return new CotomyViewRenderer(this, this.bindNameGenerator());
|
|
322
|
+
}
|
|
323
|
+
async loadAsync() {
|
|
324
|
+
const hasPathKeys = this.pathKeyInputs.length > 0 && this.pathKeyInputs.every(e => !!e.value);
|
|
325
|
+
const hasKeyInputs = this.keyInputs.length > 0 && this.keyInputs.every(e => !!e.value);
|
|
326
|
+
if (!this.hasExternalKey && !hasPathKeys && !hasKeyInputs) {
|
|
327
|
+
return new CotomyApiResponse();
|
|
328
|
+
}
|
|
329
|
+
const api = this.apiClient();
|
|
330
|
+
try {
|
|
331
|
+
const response = await api.getAsync(this.loadActionUrl());
|
|
332
|
+
await this.fillAsync(response);
|
|
333
|
+
return response;
|
|
334
|
+
}
|
|
335
|
+
catch (error) {
|
|
336
|
+
if (error instanceof CotomyApiException) {
|
|
337
|
+
this.triggerApiFailedEvent(error.response);
|
|
338
|
+
}
|
|
339
|
+
if (error instanceof CotomyNotFoundException) {
|
|
340
|
+
return error.response;
|
|
341
|
+
}
|
|
342
|
+
throw error;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
async fillObjectAsync(bindNameGenerator, target, propertyName = undefined) {
|
|
346
|
+
for (const [key, value] of Object.entries(target)) {
|
|
347
|
+
if (key.endsWith('[]')) {
|
|
348
|
+
continue;
|
|
349
|
+
}
|
|
350
|
+
const pname = bindNameGenerator.create(key, propertyName);
|
|
351
|
+
if (Array.isArray(value))
|
|
352
|
+
continue;
|
|
353
|
+
if (value && typeof value === "object") {
|
|
354
|
+
await this.fillObjectAsync(bindNameGenerator, value, pname);
|
|
355
|
+
continue;
|
|
356
|
+
}
|
|
357
|
+
this.find(`input[name="${pname}" i]:not([data-cotomy-fill="false"]):not([multiple]),
|
|
358
|
+
textarea[name="${pname}" i]:not([data-cotomy-fill="false"]),
|
|
359
|
+
select[name="${pname}" i]:not([data-cotomy-fill="false"]):not([multiple])`).forEach(input => {
|
|
360
|
+
if (CotomyDebugSettings.isEnabled(CotomyDebugFeature.Fill)) {
|
|
361
|
+
console.debug(`Filling input[name="${pname}"] with value:`, value);
|
|
362
|
+
}
|
|
363
|
+
const type = input.attribute("type")?.toLowerCase();
|
|
364
|
+
if (type && this._fillers[type]) {
|
|
365
|
+
this._fillers[type](input, value);
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
input.value = String(value || "");
|
|
369
|
+
}
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
async fillAsync(response) {
|
|
374
|
+
if (response.ok && response.available) {
|
|
375
|
+
await this.fillObjectAsync(this.bindNameGenerator(), await response.objectAsync());
|
|
376
|
+
await this.renderer().applyAsync(response);
|
|
377
|
+
}
|
|
378
|
+
this.pathKeyInputs.forEach(e => e.readonly = true);
|
|
379
|
+
this.keyInputs.forEach(e => e.readonly = true);
|
|
380
|
+
this.find("textarea").forEach(e => e.input());
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
//# sourceMappingURL=form.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form.js","sourceRoot":"","sources":["../../src/form.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { CotomyApi, CotomyApiException, CotomyApiResponse, CotomyBracketBindNameGenerator, CotomyConflictException, CotomyDotBindNameGenerator, CotomyForbiddenException, CotomyHttpClientError, CotomyHttpServerError, CotomyInvalidFormDataBodyException, CotomyNotFoundException, CotomyRequestInvalidException, CotomyResponseJsonParseException, CotomyTooManyRequestsException, CotomyUnauthorizedException, CotomyViewRenderer } from "./api";
|
|
2
|
+
export { CotomyDebugFeature, CotomyDebugSettings } from "./debug";
|
|
3
|
+
export { CotomyApiFailedEvent, CotomyApiForm, CotomyEntityApiForm, CotomyEntityFillApiForm, CotomyForm, CotomyQueryForm } from "./form";
|
|
4
|
+
export { CotomyPageController, CotomyUrl } from "./page";
|
|
5
|
+
export { CotomyElement, CotomyMetaElement, CotomyWindow } from "./view";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,SAAS,EACT,kBAAkB,EAClB,iBAAiB,EACjB,8BAA8B,EAC9B,uBAAuB,EACvB,0BAA0B,EAC1B,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,EACrB,kCAAkC,EAClC,uBAAuB,EACvB,6BAA6B,EAAE,gCAAgC,EAAE,8BAA8B,EAAE,2BAA2B,EAC5H,kBAAkB,EAErB,MAAM,OAAO,CAAC;AACf,OAAO,EACH,kBAAkB,EAClB,mBAAmB,EACtB,MAAM,SAAS,CAAC;AACjB,OAAO,EACH,oBAAoB,EAAE,aAAa,EAAE,mBAAmB,EAAE,uBAAuB,EACjF,UAAU,EACV,eAAe,EAClB,MAAM,QAAQ,CAAC;AAChB,OAAO,EACH,oBAAoB,EACpB,SAAS,EACZ,MAAM,QAAQ,CAAC;AAChB,OAAO,EACH,aAAa,EACb,iBAAiB,EACjB,YAAY,EACf,MAAM,QAAQ,CAAC"}
|
package/dist/esm/page.js
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import dayjs from "dayjs";
|
|
2
|
+
import timezone from 'dayjs/plugin/timezone';
|
|
3
|
+
import utc from 'dayjs/plugin/utc';
|
|
4
|
+
import { CotomyDebugFeature, CotomyDebugSettings } from "./debug";
|
|
5
|
+
import { CotomyWindow } from "./view";
|
|
6
|
+
dayjs.extend(utc);
|
|
7
|
+
dayjs.extend(timezone);
|
|
8
|
+
export class CotomyUrl {
|
|
9
|
+
static location() {
|
|
10
|
+
return new CotomyUrl();
|
|
11
|
+
}
|
|
12
|
+
constructor(url = null) {
|
|
13
|
+
this._url = new URL(url ?? (location.pathname + location.search), location.origin);
|
|
14
|
+
}
|
|
15
|
+
get url() {
|
|
16
|
+
return this._url.pathname + this._url.search;
|
|
17
|
+
}
|
|
18
|
+
get path() {
|
|
19
|
+
return this._url.pathname;
|
|
20
|
+
}
|
|
21
|
+
get segments() {
|
|
22
|
+
return this._url.pathname.split("/").filter(s => s.length > 0);
|
|
23
|
+
}
|
|
24
|
+
get query() {
|
|
25
|
+
return this._url.search.replace(/^\?/, "");
|
|
26
|
+
}
|
|
27
|
+
get parameters() {
|
|
28
|
+
const dict = {};
|
|
29
|
+
this._url.searchParams.forEach((value, key) => { dict[key] = value; });
|
|
30
|
+
return dict;
|
|
31
|
+
}
|
|
32
|
+
redirect() {
|
|
33
|
+
window.location.href = this.url;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export class CotomyPageController {
|
|
37
|
+
constructor() {
|
|
38
|
+
this._forms = {};
|
|
39
|
+
}
|
|
40
|
+
static set(type) {
|
|
41
|
+
if (this._instance) {
|
|
42
|
+
throw new Error("PageController is already initialized.");
|
|
43
|
+
}
|
|
44
|
+
this._instance = new type();
|
|
45
|
+
CotomyWindow.instance.load(async () => {
|
|
46
|
+
if (CotomyDebugSettings.isEnabled(CotomyDebugFeature.Page)) {
|
|
47
|
+
console.debug("CotomyPageController initialize.");
|
|
48
|
+
}
|
|
49
|
+
CotomyWindow.instance.initialize();
|
|
50
|
+
await CotomyPageController._instance.initializeAsync();
|
|
51
|
+
CotomyWindow.instance.trigger("cotomy:ready");
|
|
52
|
+
});
|
|
53
|
+
return this._instance;
|
|
54
|
+
}
|
|
55
|
+
static get() {
|
|
56
|
+
if (!(this._instance instanceof CotomyPageController)) {
|
|
57
|
+
throw new Error("PageController is not initialized. Use CotomyPageController.set() to initialize it.");
|
|
58
|
+
}
|
|
59
|
+
return this._instance;
|
|
60
|
+
}
|
|
61
|
+
setForm(form) {
|
|
62
|
+
if (!form.id) {
|
|
63
|
+
form.generateId();
|
|
64
|
+
}
|
|
65
|
+
this._forms[form.id] = form;
|
|
66
|
+
form.removed(() => {
|
|
67
|
+
delete this._forms[form.id];
|
|
68
|
+
});
|
|
69
|
+
return form.initialize();
|
|
70
|
+
}
|
|
71
|
+
getForm(id, type) {
|
|
72
|
+
const form = this._forms[id];
|
|
73
|
+
if (!form)
|
|
74
|
+
return undefined;
|
|
75
|
+
if (type && !(form instanceof type)) {
|
|
76
|
+
throw new Error(`Form "${id}" is not instance of expected type.`);
|
|
77
|
+
}
|
|
78
|
+
return form;
|
|
79
|
+
}
|
|
80
|
+
forms() {
|
|
81
|
+
return Object.values(this._forms);
|
|
82
|
+
}
|
|
83
|
+
async restoreAsync() {
|
|
84
|
+
for (const f of this.forms()) {
|
|
85
|
+
if (CotomyWindow.instance.reloading) {
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
if (f.autoReload) {
|
|
89
|
+
await f.reloadAsync();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
isValidUtcDateString(value) {
|
|
94
|
+
return dayjs(value).isValid() && (value.endsWith("Z") || /[+-]\d{2}:\d{2}$/.test(value));
|
|
95
|
+
}
|
|
96
|
+
initializeDateTimeElements() {
|
|
97
|
+
CotomyWindow.instance.body.find("[data-cotomy-datetime]:not([data-cotomy-formatted])").forEach(e => {
|
|
98
|
+
if (dayjs(e.text).isValid()) {
|
|
99
|
+
const timezone = e.attribute("data-cotomy-timezone")
|
|
100
|
+
|| e.closest("[data-cotomy-timezone]")?.attribute("data-cotomy-timezone");
|
|
101
|
+
const format = e.attribute("data-cotomy-format") ?? "YYYY-MM-DD HH:mm";
|
|
102
|
+
const lt = this.isValidUtcDateString(e.text) ? dayjs(e.text) : dayjs(`${dayjs(e.text).format("YYYY-MM-DDTHH:mm:ss")}Z`);
|
|
103
|
+
const dt = e.attribute("data-cotomy-datetime") === "local" ? lt : lt.utc();
|
|
104
|
+
e.text = (timezone && timezone.trim() !== "") ? dt.tz(timezone).format(format) : dt.format(format);
|
|
105
|
+
e.attribute("data-cotomy-formatted", "");
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
async initializeAsync() {
|
|
110
|
+
this.initializeDateTimeElements();
|
|
111
|
+
CotomyWindow.instance.pageshow(async (e) => {
|
|
112
|
+
if (e.persisted) {
|
|
113
|
+
await this.restoreAsync();
|
|
114
|
+
if (CotomyWindow.instance.reloading) {
|
|
115
|
+
e.stopImmediatePropagation();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
get body() {
|
|
121
|
+
return CotomyWindow.instance.body;
|
|
122
|
+
}
|
|
123
|
+
get url() {
|
|
124
|
+
return new CotomyUrl();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
CotomyPageController._instance = null;
|
|
128
|
+
//# sourceMappingURL=page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/page.ts"],"names":[],"mappings":"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"}
|