cabloy 5.1.177 → 5.1.179
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/.cabloy-version +1 -1
- package/CHANGELOG.md +18 -0
- package/package.json +1 -1
- package/repo-e2e/specs/cabloy-basic.spec.ts +68 -1
- package/repo-e2e/specs/controller-boundary.spec.ts +42 -0
- package/repo-e2e/specs/routed-dialog.spec.ts +15 -0
- package/vona/packages-cli/cli/package.json +1 -1
- package/vona/packages-cli/cli-set-api/cli/templates/tools/crudBasic/boilerplate/src/controller/{{resourceName}}.ts_ +1 -1
- package/vona/packages-cli/cli-set-api/package.json +1 -1
- package/vona/pnpm-lock.yaml +85 -223
- package/vona/pnpm-workspace.yaml +1 -1
- package/zova/packages-utils/zova-jsx/package.json +2 -2
- package/zova/packages-zova/zova/package.json +3 -3
- package/zova/packages-zova/zova-core/package.json +1 -1
- package/zova/packages-zova/zova-core/src/bean/beanContainer.ts +4 -0
- package/zova/packages-zova/zova-core/src/composables/useController.ts +4 -1
- package/zova/pnpm-lock.yaml +21 -21
- package/zova/src/suite/a-home/modules/home-indexadmin/src/page/dashboard/controller.tsx +31 -0
- package/zova/src/suite/a-home/modules/home-layoutadmin/src/component/layoutAdmin/render.tabs.tsx +18 -2
- package/zova/src/suite-vendor/a-zova/modules/a-router/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-router/src/bean/bean.router.ts +13 -22
- package/zova/src/suite-vendor/a-zova/modules/a-router/src/bean/sys.router.ts +1 -0
- package/zova/src/suite-vendor/a-zova/modules/a-router/src/lib/routerGuardDisposers.ts +19 -0
- package/zova/src/suite-vendor/a-zova/modules/a-router/src/monkey.ts +1 -0
- package/zova/src/suite-vendor/a-zova/modules/a-router/src/service/routerGuards.ts +12 -3
- package/zova/src/suite-vendor/a-zova/modules/a-router/src/types/pageMeta.ts +6 -1
- package/zova/src/suite-vendor/a-zova/modules/a-router/src/types/routerView.ts +5 -0
- package/zova/src/suite-vendor/a-zova/modules/a-router/test/lib/routerGuardDisposers.test.ts +24 -0
- package/zova/src/suite-vendor/a-zova/modules/a-zova/package.json +2 -2
- package/zova/src/suite-vendor/a-zova/package.json +3 -3
- /package/vona/patches/{zova-core@5.1.90.patch → zova-core@5.1.91.patch} +0 -0
package/.cabloy-version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
5.1.
|
|
1
|
+
5.1.179
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 5.1.179
|
|
4
|
+
|
|
5
|
+
### Improvements
|
|
6
|
+
|
|
7
|
+
- Refresh the Zova lockfile and core patch dependencies.
|
|
8
|
+
|
|
9
|
+
## 5.1.178
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
- Add `setPageMeta` support for configuring page metadata.
|
|
14
|
+
|
|
15
|
+
### Bug Fixes
|
|
16
|
+
|
|
17
|
+
- Fix router behavior.
|
|
18
|
+
- Correct `isAttemptActive` handling.
|
|
19
|
+
- Ensure route resources are ready before initializing controller data.
|
|
20
|
+
|
|
3
21
|
## 5.1.177
|
|
4
22
|
|
|
5
23
|
### Improvements
|
package/package.json
CHANGED
|
@@ -28,6 +28,16 @@ function collectPageErrors(page: Page) {
|
|
|
28
28
|
return errors;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
+
function collectConsoleErrors(page: Page) {
|
|
32
|
+
const errors: string[] = [];
|
|
33
|
+
page.on('console', message => {
|
|
34
|
+
if (message.type() === 'error') {
|
|
35
|
+
errors.push(message.text());
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
return errors;
|
|
39
|
+
}
|
|
40
|
+
|
|
31
41
|
async function loginAsAdmin(page: Page) {
|
|
32
42
|
await page.goto('/admin/', { waitUntil: 'load' });
|
|
33
43
|
if (page.url().includes('/admin/login')) {
|
|
@@ -319,7 +329,64 @@ test(
|
|
|
319
329
|
);
|
|
320
330
|
|
|
321
331
|
test(
|
|
322
|
-
'ATP-BASIC-FLOW-01:
|
|
332
|
+
'ATP-BASIC-FLOW-01: cold Admin navigation initializes dynamic resource selectors',
|
|
333
|
+
{ tag: ['@admin', '@flow'] },
|
|
334
|
+
async ({ browser }) => {
|
|
335
|
+
const context = await browser.newContext();
|
|
336
|
+
const page = await context.newPage();
|
|
337
|
+
const pageErrors = collectPageErrors(page);
|
|
338
|
+
const consoleErrors = collectConsoleErrors(page);
|
|
339
|
+
try {
|
|
340
|
+
await page.goto('/admin/login', { waitUntil: 'load' });
|
|
341
|
+
await page.evaluate(() => {
|
|
342
|
+
indexedDB.deleteDatabase('localforage');
|
|
343
|
+
localStorage.clear();
|
|
344
|
+
sessionStorage.clear();
|
|
345
|
+
});
|
|
346
|
+
await page.goto('/admin/login?returnTo=/rest/resource/training-student%253Astudent', {
|
|
347
|
+
waitUntil: 'load',
|
|
348
|
+
});
|
|
349
|
+
await page.getByPlaceholder('Your Username').fill('admin');
|
|
350
|
+
await page.getByPlaceholder('Your Password').fill('123456');
|
|
351
|
+
await expect(page.getByPlaceholder('Please input captcha')).not.toHaveValue('');
|
|
352
|
+
|
|
353
|
+
const initialSelect = waitForStudentSelect(page);
|
|
354
|
+
await page.getByRole('button', { name: 'Login', exact: true }).click();
|
|
355
|
+
try {
|
|
356
|
+
await expect(page).toHaveURL(studentResourceUrl);
|
|
357
|
+
await initialSelect;
|
|
358
|
+
} finally {
|
|
359
|
+
await initialSelect.catch(() => {});
|
|
360
|
+
}
|
|
361
|
+
await expect(page.getByLabel('Student Name')).toBeVisible();
|
|
362
|
+
|
|
363
|
+
await page.getByRole('link', { name: 'Home', exact: true }).click();
|
|
364
|
+
await expect(page).toHaveURL(/\/admin\/(?:\?|$)/);
|
|
365
|
+
await expect(page.locator('html')).toHaveAttribute('data-zova-hydrated', 'admin');
|
|
366
|
+
await expect(
|
|
367
|
+
page.getByRole('heading', { name: 'Vona integrated SSR', exact: true }),
|
|
368
|
+
).toBeVisible();
|
|
369
|
+
await expect(
|
|
370
|
+
page.getByRole('heading', { name: 'Zova standalone SSR', exact: true }),
|
|
371
|
+
).toBeVisible();
|
|
372
|
+
await expect(page.locator('body')).toBeVisible();
|
|
373
|
+
|
|
374
|
+
expect(pageErrors).toEqual([]);
|
|
375
|
+
expect(
|
|
376
|
+
consoleErrors.some(
|
|
377
|
+
error =>
|
|
378
|
+
error.includes("Cannot read properties of undefined (reading 'resource')") ||
|
|
379
|
+
error.includes('resource not specified'),
|
|
380
|
+
),
|
|
381
|
+
).toBeFalsy();
|
|
382
|
+
} finally {
|
|
383
|
+
await context.close();
|
|
384
|
+
}
|
|
385
|
+
},
|
|
386
|
+
);
|
|
387
|
+
|
|
388
|
+
test(
|
|
389
|
+
'ATP-BASIC-FLOW-02: Training Student flow filter wraps and submits queries',
|
|
323
390
|
{ tag: ['@admin', '@flow'] },
|
|
324
391
|
async ({ page }) => {
|
|
325
392
|
await page.setViewportSize({ width: 1440, height: 900 });
|
|
@@ -101,6 +101,48 @@ test(
|
|
|
101
101
|
},
|
|
102
102
|
);
|
|
103
103
|
|
|
104
|
+
test(
|
|
105
|
+
'ATP-BASIC-CONTROLLER-BOUNDARY-06: disposed and stale loads do not surface errors',
|
|
106
|
+
{ tag: ['@web', '@flow'] },
|
|
107
|
+
async ({ page }) => {
|
|
108
|
+
const pageErrors = collectPageErrors(page);
|
|
109
|
+
const consoleErrors = collectConsoleErrors(page);
|
|
110
|
+
const response = await page.goto('/demo/basic/controllerBoundary', { waitUntil: 'load' });
|
|
111
|
+
expect(response?.ok()).toBeTruthy();
|
|
112
|
+
await expect(page.locator('html')).toHaveAttribute('data-zova-hydrated', 'web');
|
|
113
|
+
await page.waitForTimeout(1_000);
|
|
114
|
+
|
|
115
|
+
const loading = page.getByRole('status');
|
|
116
|
+
const error = page.locator('.alert.alert-error');
|
|
117
|
+
const ready = page.getByText('Controller boundary probe ready', { exact: true });
|
|
118
|
+
|
|
119
|
+
const disposedLoading = loading.waitFor({ state: 'visible' });
|
|
120
|
+
await page.getByRole('button', { name: 'Mount failing probe', exact: true }).click();
|
|
121
|
+
await disposedLoading;
|
|
122
|
+
await page.getByRole('button', { name: 'Clear probe', exact: true }).click();
|
|
123
|
+
await page.waitForTimeout(1_000);
|
|
124
|
+
await expect(loading).toHaveCount(0);
|
|
125
|
+
await expect(error).toHaveCount(0);
|
|
126
|
+
await expect(ready).toHaveCount(0);
|
|
127
|
+
|
|
128
|
+
const staleLoading = loading.waitFor({ state: 'visible' });
|
|
129
|
+
await page.getByRole('button', { name: 'Mount failing probe', exact: true }).click();
|
|
130
|
+
await staleLoading;
|
|
131
|
+
await page.getByRole('button', { name: 'Mount fast success probe', exact: true }).click();
|
|
132
|
+
await expect(ready).toBeVisible();
|
|
133
|
+
await page.waitForTimeout(1_000);
|
|
134
|
+
await expect(error).toHaveCount(0);
|
|
135
|
+
await expect(ready).toBeVisible();
|
|
136
|
+
|
|
137
|
+
expect(pageErrors).toEqual([]);
|
|
138
|
+
expect(
|
|
139
|
+
consoleErrors.filter(error =>
|
|
140
|
+
/Cannot read properties of null \(reading ['"]state['"]\)/.test(error),
|
|
141
|
+
),
|
|
142
|
+
).toEqual([]);
|
|
143
|
+
},
|
|
144
|
+
);
|
|
145
|
+
|
|
104
146
|
test(
|
|
105
147
|
'ATP-BASIC-CONTROLLER-BOUNDARY-02: inline boundaries preserve phrasing-content markup',
|
|
106
148
|
{ tag: ['@web', '@flow'] },
|
|
@@ -195,6 +195,21 @@ test(
|
|
|
195
195
|
await expect(dialogA.getByRole('button', { name: 'Back', exact: true })).toHaveCount(0);
|
|
196
196
|
expect(page.url()).toBe(browserUrl);
|
|
197
197
|
|
|
198
|
+
await page.keyboard.press('Escape');
|
|
199
|
+
await expect(dialogA).toHaveCount(0);
|
|
200
|
+
expect(page.url()).toBe(browserUrl);
|
|
201
|
+
|
|
202
|
+
await page.getByRole('button', { name: 'Open A', exact: true }).click();
|
|
203
|
+
await expect(dialogA).toHaveCount(1);
|
|
204
|
+
await expect(
|
|
205
|
+
dialogA.getByRole('heading', { name: 'Routed Dialog Entry', exact: true }),
|
|
206
|
+
).toBeVisible();
|
|
207
|
+
await dialogA.getByRole('button', { name: 'Local push to detail', exact: true }).click();
|
|
208
|
+
await expect(
|
|
209
|
+
dialogA.getByRole('heading', { name: 'Routed Dialog Detail', exact: true }),
|
|
210
|
+
).toBeVisible();
|
|
211
|
+
expect(page.url()).toBe(browserUrl);
|
|
212
|
+
|
|
198
213
|
await page.keyboard.press('Escape');
|
|
199
214
|
await expect(dialogA).toHaveCount(0);
|
|
200
215
|
expect(page.url()).toBe(browserUrl);
|
|
@@ -65,5 +65,5 @@ export class Controller<%=argv.resourceNameCapitalize%> extends BeanBase {
|
|
|
65
65
|
@Passport.systemAdmin()
|
|
66
66
|
async deleteBulk(@Arg.body() command: Dto<%=argv.resourceNameCapitalize%>DeleteBulk): Promise<void> {
|
|
67
67
|
await this.scope.service.<%=argv.resourceName%>.deleteBulk(command.ids);
|
|
68
|
-
}
|
|
68
|
+
}
|
|
69
69
|
}
|