@navette-js/panels 0.0.0-stage → 1.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +8 -2
- package/THIRD-PARTY-NOTICES.md +12 -0
- package/dist/FILAMENT-LICENSE.md +21 -0
- package/dist/filament/css/filament/filament/app.css +2 -0
- package/dist/filament/fonts/INTER-LICENSE.txt +92 -0
- package/dist/filament/fonts/filament/filament/inter/index.css +1 -0
- package/dist/filament/fonts/filament/filament/inter/inter-cyrillic-ext-wght-normal-SP7Z6XGK.woff2 +0 -0
- package/dist/filament/fonts/filament/filament/inter/inter-cyrillic-wght-normal-DR6K5BQD.woff2 +0 -0
- package/dist/filament/fonts/filament/filament/inter/inter-greek-ext-wght-normal-A2J6H3EX.woff2 +0 -0
- package/dist/filament/fonts/filament/filament/inter/inter-greek-wght-normal-ZABHMKQG.woff2 +0 -0
- package/dist/filament/fonts/filament/filament/inter/inter-latin-ext-wght-normal-ZIT2UBIY.woff2 +0 -0
- package/dist/filament/fonts/filament/filament/inter/inter-latin-wght-normal-DIHYUR35.woff2 +0 -0
- package/dist/filament/fonts/filament/filament/inter/inter-vietnamese-wght-normal-VWEHJHBA.woff2 +0 -0
- package/dist/filament/js/filament/actions/actions.js +1 -0
- package/dist/filament/js/filament/filament/app.js +1 -0
- package/dist/filament/js/filament/filament/echo.js +13 -0
- package/dist/filament/js/filament/forms/components/builder.js +1 -0
- package/dist/filament/js/filament/forms/components/checkbox-list.js +1 -0
- package/dist/filament/js/filament/forms/components/code-editor.js +38 -0
- package/dist/filament/js/filament/forms/components/color-picker.js +1 -0
- package/dist/filament/js/filament/forms/components/date-time-picker.js +1 -0
- package/dist/filament/js/filament/forms/components/file-upload.js +116 -0
- package/dist/filament/js/filament/forms/components/js-field.js +1 -0
- package/dist/filament/js/filament/forms/components/key-value.js +1 -0
- package/dist/filament/js/filament/forms/components/markdown-editor.js +51 -0
- package/dist/filament/js/filament/forms/components/repeater.js +1 -0
- package/dist/filament/js/filament/forms/components/rich-editor.js +161 -0
- package/dist/filament/js/filament/forms/components/select.js +11 -0
- package/dist/filament/js/filament/forms/components/slider.js +1 -0
- package/dist/filament/js/filament/forms/components/tags-input.js +1 -0
- package/dist/filament/js/filament/forms/components/text-input/password-reveal.js +1 -0
- package/dist/filament/js/filament/forms/components/textarea.js +1 -0
- package/dist/filament/js/filament/forms/components/toggle-buttons.js +1 -0
- package/dist/filament/js/filament/notifications/notifications.js +1 -0
- package/dist/filament/js/filament/schemas/components/actions.js +1 -0
- package/dist/filament/js/filament/schemas/components/js-component.js +1 -0
- package/dist/filament/js/filament/schemas/components/tabs.js +1 -0
- package/dist/filament/js/filament/schemas/components/wizard.js +1 -0
- package/dist/filament/js/filament/schemas/schemas.js +1 -0
- package/dist/filament/js/filament/support/support.js +46 -0
- package/dist/filament/js/filament/tables/components/columns/checkbox.js +1 -0
- package/dist/filament/js/filament/tables/components/columns/select.js +11 -0
- package/dist/filament/js/filament/tables/components/columns/text-input.js +1 -0
- package/dist/filament/js/filament/tables/components/columns/toggle.js +1 -0
- package/dist/filament/js/filament/tables/tables.js +1 -0
- package/dist/filament/js/filament/widgets/components/chart.js +31 -0
- package/dist/filament/js/filament/widgets/components/js-widget.js +1 -0
- package/dist/filament/js/filament/widgets/components/stats-overview/stat/chart.js +20 -0
- package/dist/navette/navette/calendar.css +108 -0
- package/dist/navette/navette/motion.css +101 -0
- package/dist/navette/navette/motion.js +49 -0
- package/lib/auth.d.ts +61 -0
- package/lib/auth.js +142 -0
- package/lib/calendar.d.ts +82 -0
- package/lib/calendar.js +107 -0
- package/lib/index.d.ts +1619 -0
- package/lib/index.js +3487 -0
- package/lib/notifications.d.ts +76 -0
- package/lib/notifications.js +112 -0
- package/lib/topbar.d.ts +90 -0
- package/lib/topbar.js +241 -0
- package/package.json +59 -4
- package/resources/filament/LICENSE.md +21 -0
- package/resources/filament/README.md +2 -0
- package/resources/filament/packages/actions/resources/css/actions.css +30 -0
- package/resources/filament/packages/actions/resources/css/index.css +1 -0
- package/resources/filament/packages/forms/dist/index.css +1 -0
- package/resources/filament/packages/forms/resources/css/components/builder.css +206 -0
- package/resources/filament/packages/forms/resources/css/components/checkbox-list.css +55 -0
- package/resources/filament/packages/forms/resources/css/components/code-editor.css +79 -0
- package/resources/filament/packages/forms/resources/css/components/color-picker.css +17 -0
- package/resources/filament/packages/forms/resources/css/components/date-time-picker.css +127 -0
- package/resources/filament/packages/forms/resources/css/components/field.css +88 -0
- package/resources/filament/packages/forms/resources/css/components/file-upload/filepond-plugin-media-preview.css +104 -0
- package/resources/filament/packages/forms/resources/css/components/file-upload.css +199 -0
- package/resources/filament/packages/forms/resources/css/components/key-value.css +57 -0
- package/resources/filament/packages/forms/resources/css/components/markdown-editor.css +343 -0
- package/resources/filament/packages/forms/resources/css/components/modal-table-select.css +17 -0
- package/resources/filament/packages/forms/resources/css/components/radio.css +41 -0
- package/resources/filament/packages/forms/resources/css/components/repeater.css +401 -0
- package/resources/filament/packages/forms/resources/css/components/rich-editor.css +666 -0
- package/resources/filament/packages/forms/resources/css/components/select.css +13 -0
- package/resources/filament/packages/forms/resources/css/components/slider.css +54 -0
- package/resources/filament/packages/forms/resources/css/components/tags-input.css +33 -0
- package/resources/filament/packages/forms/resources/css/components/text-input.css +20 -0
- package/resources/filament/packages/forms/resources/css/components/textarea.css +26 -0
- package/resources/filament/packages/forms/resources/css/components/toggle-buttons.css +49 -0
- package/resources/filament/packages/forms/resources/css/index.css +32 -0
- package/resources/filament/packages/infolists/resources/css/components/code.css +21 -0
- package/resources/filament/packages/infolists/resources/css/components/color.css +34 -0
- package/resources/filament/packages/infolists/resources/css/components/entry.css +68 -0
- package/resources/filament/packages/infolists/resources/css/components/icon.css +39 -0
- package/resources/filament/packages/infolists/resources/css/components/image.css +161 -0
- package/resources/filament/packages/infolists/resources/css/components/key-value.css +24 -0
- package/resources/filament/packages/infolists/resources/css/components/repeatable.css +136 -0
- package/resources/filament/packages/infolists/resources/css/components/text.css +234 -0
- package/resources/filament/packages/infolists/resources/css/index.css +14 -0
- package/resources/filament/packages/notifications/resources/css/database-notifications.css +56 -0
- package/resources/filament/packages/notifications/resources/css/index.css +3 -0
- package/resources/filament/packages/notifications/resources/css/notification.css +109 -0
- package/resources/filament/packages/notifications/resources/css/notifications.css +29 -0
- package/resources/filament/packages/panels/resources/css/base.css +13 -0
- package/resources/filament/packages/panels/resources/css/components/global-search.css +93 -0
- package/resources/filament/packages/panels/resources/css/components/header.css +56 -0
- package/resources/filament/packages/panels/resources/css/components/layout.css +182 -0
- package/resources/filament/packages/panels/resources/css/components/logo.css +11 -0
- package/resources/filament/packages/panels/resources/css/components/page.css +60 -0
- package/resources/filament/packages/panels/resources/css/components/sidebar.css +311 -0
- package/resources/filament/packages/panels/resources/css/components/tenant-menu.css +49 -0
- package/resources/filament/packages/panels/resources/css/components/theme-switcher.css +15 -0
- package/resources/filament/packages/panels/resources/css/components/topbar.css +89 -0
- package/resources/filament/packages/panels/resources/css/components/user-menu.css +46 -0
- package/resources/filament/packages/panels/resources/css/index.css +40 -0
- package/resources/filament/packages/panels/resources/css/theme.css +2 -0
- package/resources/filament/packages/panels/resources/css/utilities.css +3 -0
- package/resources/filament/packages/panels/resources/css/widgets/account-widget.css +21 -0
- package/resources/filament/packages/panels/resources/css/widgets/filament-info-widget.css +21 -0
- package/resources/filament/packages/schemas/resources/css/components/actions.css +29 -0
- package/resources/filament/packages/schemas/resources/css/components/flex.css +106 -0
- package/resources/filament/packages/schemas/resources/css/components/form.css +7 -0
- package/resources/filament/packages/schemas/resources/css/components/fused-group.css +337 -0
- package/resources/filament/packages/schemas/resources/css/components/icon.css +11 -0
- package/resources/filament/packages/schemas/resources/css/components/image.css +12 -0
- package/resources/filament/packages/schemas/resources/css/components/section.css +24 -0
- package/resources/filament/packages/schemas/resources/css/components/tabs.css +77 -0
- package/resources/filament/packages/schemas/resources/css/components/text.css +77 -0
- package/resources/filament/packages/schemas/resources/css/components/unordered-list.css +15 -0
- package/resources/filament/packages/schemas/resources/css/components/wizard.css +177 -0
- package/resources/filament/packages/schemas/resources/css/index.css +12 -0
- package/resources/filament/packages/schemas/resources/css/schema.css +132 -0
- package/resources/filament/packages/support/dist/index.css +1 -0
- package/resources/filament/packages/support/resources/css/base.css +23 -0
- package/resources/filament/packages/support/resources/css/components/avatar.css +15 -0
- package/resources/filament/packages/support/resources/css/components/badge.css +90 -0
- package/resources/filament/packages/support/resources/css/components/breadcrumbs.css +25 -0
- package/resources/filament/packages/support/resources/css/components/button.css +214 -0
- package/resources/filament/packages/support/resources/css/components/callout.css +57 -0
- package/resources/filament/packages/support/resources/css/components/dropdown/header.css +21 -0
- package/resources/filament/packages/support/resources/css/components/dropdown/index.css +79 -0
- package/resources/filament/packages/support/resources/css/components/dropdown/list/index.css +7 -0
- package/resources/filament/packages/support/resources/css/components/dropdown/list/item.css +74 -0
- package/resources/filament/packages/support/resources/css/components/empty-state.css +67 -0
- package/resources/filament/packages/support/resources/css/components/fieldset.css +23 -0
- package/resources/filament/packages/support/resources/css/components/grid.css +511 -0
- package/resources/filament/packages/support/resources/css/components/icon-button.css +124 -0
- package/resources/filament/packages/support/resources/css/components/icon.css +31 -0
- package/resources/filament/packages/support/resources/css/components/input/checkbox.css +32 -0
- package/resources/filament/packages/support/resources/css/components/input/index.css +55 -0
- package/resources/filament/packages/support/resources/css/components/input/one-time-code.css +7 -0
- package/resources/filament/packages/support/resources/css/components/input/radio.css +11 -0
- package/resources/filament/packages/support/resources/css/components/input/select.css +154 -0
- package/resources/filament/packages/support/resources/css/components/input/wrapper.css +107 -0
- package/resources/filament/packages/support/resources/css/components/link.css +90 -0
- package/resources/filament/packages/support/resources/css/components/loading-indicator.css +3 -0
- package/resources/filament/packages/support/resources/css/components/loading-section.css +3 -0
- package/resources/filament/packages/support/resources/css/components/modal.css +494 -0
- package/resources/filament/packages/support/resources/css/components/pagination.css +160 -0
- package/resources/filament/packages/support/resources/css/components/section.css +234 -0
- package/resources/filament/packages/support/resources/css/components/tabs.css +70 -0
- package/resources/filament/packages/support/resources/css/components/toggle.css +60 -0
- package/resources/filament/packages/support/resources/css/components/tooltip.css +36 -0
- package/resources/filament/packages/support/resources/css/index.css +133 -0
- package/resources/filament/packages/support/resources/css/sortable.css +3 -0
- package/resources/filament/packages/support/resources/css/utilities.css +897 -0
- package/resources/filament/packages/tables/resources/css/actions.css +51 -0
- package/resources/filament/packages/tables/resources/css/cell.css +139 -0
- package/resources/filament/packages/tables/resources/css/column-manager.css +48 -0
- package/resources/filament/packages/tables/resources/css/columns/checkbox.css +54 -0
- package/resources/filament/packages/tables/resources/css/columns/color.css +76 -0
- package/resources/filament/packages/tables/resources/css/columns/icon.css +81 -0
- package/resources/filament/packages/tables/resources/css/columns/image.css +207 -0
- package/resources/filament/packages/tables/resources/css/columns/layout/grid.css +49 -0
- package/resources/filament/packages/tables/resources/css/columns/layout/panel.css +3 -0
- package/resources/filament/packages/tables/resources/css/columns/layout/split.css +35 -0
- package/resources/filament/packages/tables/resources/css/columns/layout/stack.css +29 -0
- package/resources/filament/packages/tables/resources/css/columns/select.css +36 -0
- package/resources/filament/packages/tables/resources/css/columns/summaries/icon-count.css +43 -0
- package/resources/filament/packages/tables/resources/css/columns/summaries/range.css +27 -0
- package/resources/filament/packages/tables/resources/css/columns/summaries/text.css +29 -0
- package/resources/filament/packages/tables/resources/css/columns/summaries/values.css +33 -0
- package/resources/filament/packages/tables/resources/css/columns/text-input.css +36 -0
- package/resources/filament/packages/tables/resources/css/columns/text.css +319 -0
- package/resources/filament/packages/tables/resources/css/columns/toggle.css +54 -0
- package/resources/filament/packages/tables/resources/css/container.css +311 -0
- package/resources/filament/packages/tables/resources/css/content.css +342 -0
- package/resources/filament/packages/tables/resources/css/empty-state.css +31 -0
- package/resources/filament/packages/tables/resources/css/group-header.css +54 -0
- package/resources/filament/packages/tables/resources/css/header-cell.css +224 -0
- package/resources/filament/packages/tables/resources/css/index.css +26 -0
- package/resources/filament/packages/tables/resources/css/row.css +47 -0
- package/resources/filament/packages/tables/resources/css/table.css +394 -0
- package/resources/filament/packages/widgets/resources/css/chart-widget.css +88 -0
- package/resources/filament/packages/widgets/resources/css/index.css +3 -0
- package/resources/filament/packages/widgets/resources/css/stats-overview-widget.css +67 -0
- package/resources/filament/packages/widgets/resources/css/widget.css +3 -0
- package/theme.css +17 -0
- package/views/components/logo.ejs +9 -0
- package/views/components/tenant-menu.ejs +13 -0
- package/views/components/user-menu.ejs +82 -0
- package/views/layout/base.ejs +129 -0
- package/views/layout/index.ejs +41 -0
- package/views/layout/simple.ejs +19 -0
- package/views/livewire/sidebar.ejs +123 -0
- package/views/livewire/topbar.ejs +47 -0
- package/views/pages/page.ejs +143 -0
- package/views/pages/simple.ejs +32 -0
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,1619 @@
|
|
|
1
|
+
import { type Mailer, type MailMessage } from './auth.ts';
|
|
2
|
+
export { consoleMailer, fileMailer, hashPassword, knexAuthProvider, knexTenantProvider, mailText, verifyPassword, type Mailer, type MailMessage, type TableQuery } from './auth.ts';
|
|
3
|
+
import { type Request, type Response, type Router } from 'express';
|
|
4
|
+
import { Action } from '@navette-js/actions';
|
|
5
|
+
import { Step, Wizard } from '@navette-js/forms';
|
|
6
|
+
import { Component as SchemaComponent, Schema, type SchemaHost } from '@navette-js/schemas';
|
|
7
|
+
export { Notification, Notifications } from './notifications.ts';
|
|
8
|
+
import { type CalendarEvent, type CalendarLabels, type CalendarView } from './calendar.ts';
|
|
9
|
+
export { addDays, addMonths, CALENDAR_LABELS, dayOf, daysBetween, eventsOn, renderCalendar, renderCalendarEvent, timeOf, visibleRange, type CalendarEvent, type CalendarLabels, type CalendarModel, type CalendarView } from './calendar.ts';
|
|
10
|
+
import { type DatabaseNotificationStore, type GlobalSearchCategory, type GlobalSearchResult } from './topbar.ts';
|
|
11
|
+
export { DatabaseNotifications, GlobalSearch, knexNotificationStore, timeAgo, type DatabaseNotificationAction, type DatabaseNotificationRecord, type DatabaseNotificationStore, type GlobalSearchCategory, type GlobalSearchResult } from './topbar.ts';
|
|
12
|
+
import { ColorManager, RenderHookRegistry, type Palette, type RenderHookCallback } from '@navette-js/support';
|
|
13
|
+
import type { DataAdapter } from '@navette-js/database';
|
|
14
|
+
import { Table, type ColumnState, type FilterState, type TableHost } from '@navette-js/tables';
|
|
15
|
+
import { Component, type WireRuntime } from '@navette-js/wire';
|
|
16
|
+
export declare const ASSET_VERSION = "5.11.2.0";
|
|
17
|
+
/** Utilisateur connecté. Votre fournisseur d'authentification peut y ajouter ce qu'il veut (rôle, équipe…) : les politiques le reçoivent tel quel. */
|
|
18
|
+
export type User = {
|
|
19
|
+
id: string | number;
|
|
20
|
+
name: string;
|
|
21
|
+
email: string;
|
|
22
|
+
[key: string]: unknown;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Politique d'une resource : une fonction par capacité, nommée comme dans Laravel
|
|
26
|
+
* (`viewAny`, `create`, `update`, `delete`, `deleteAny`, `restore`, `forceDelete`, `reorder`, ou vos propres noms).
|
|
27
|
+
* Capacité absente : autorisée.
|
|
28
|
+
*/
|
|
29
|
+
export type Policy<R = any> = Partial<Record<string, (user: User, record: R | null) => boolean | Promise<boolean>>>;
|
|
30
|
+
/** Plugin : un paquet de configuration réutilisable. `register` reçoit le panel en cours de construction ; `boot` est appelé au montage du routeur. */
|
|
31
|
+
export type Plugin = {
|
|
32
|
+
id: string;
|
|
33
|
+
register(panel: Panel): void;
|
|
34
|
+
boot?(panel: Panel): void;
|
|
35
|
+
};
|
|
36
|
+
/** Question posée au crochet d'autorisation du panel. `resource`, `page` ou `widget` dit sur quoi elle porte. */
|
|
37
|
+
export type AuthorizationCheck = {
|
|
38
|
+
user: User;
|
|
39
|
+
ability: string;
|
|
40
|
+
resource: unknown | null;
|
|
41
|
+
record: unknown | null;
|
|
42
|
+
page: typeof Page | null;
|
|
43
|
+
widget: typeof Widget | null;
|
|
44
|
+
};
|
|
45
|
+
/** Rend `true` ou `false` pour décider, `undefined` pour laisser la politique de la resource (ou `canAccess` / `canView`) répondre. */
|
|
46
|
+
export type Authorizer = (check: AuthorizationCheck) => boolean | undefined | Promise<boolean | undefined>;
|
|
47
|
+
type MaybePromise<T> = T | Promise<T>;
|
|
48
|
+
/**
|
|
49
|
+
* Fournisseur d'utilisateurs. `attempt` et `find` suffisent pour la connexion ; les méthodes facultatives activent
|
|
50
|
+
* l'inscription (`create`, `findByEmail`), la réinitialisation du mot de passe (`findByEmail`, `update`, `getPasswordFingerprint`),
|
|
51
|
+
* la vérification de l'adresse (`hasVerifiedEmail`, `markEmailAsVerified`) et la page de profil (`update`).
|
|
52
|
+
* `knexAuthProvider(knex)` les fournit toutes pour une table `users` au format de Laravel.
|
|
53
|
+
*/
|
|
54
|
+
export interface AuthProvider {
|
|
55
|
+
attempt(email: string, password: string): MaybePromise<User | null>;
|
|
56
|
+
find(id: string | number): MaybePromise<User | null>;
|
|
57
|
+
findByEmail?(email: string): MaybePromise<User | null>;
|
|
58
|
+
/** Crée l'utilisateur ; le mot de passe est reçu en clair, à hacher par le fournisseur. */
|
|
59
|
+
create?(data: {
|
|
60
|
+
name: string;
|
|
61
|
+
email: string;
|
|
62
|
+
password: string;
|
|
63
|
+
}): MaybePromise<User>;
|
|
64
|
+
/** Met à jour nom, adresse ou mot de passe (en clair, à hacher). Changer d'adresse doit annuler sa vérification. */
|
|
65
|
+
update?(user: User, data: {
|
|
66
|
+
name?: string;
|
|
67
|
+
email?: string;
|
|
68
|
+
password?: string;
|
|
69
|
+
}): MaybePromise<User>;
|
|
70
|
+
hasVerifiedEmail?(user: User): MaybePromise<boolean>;
|
|
71
|
+
markEmailAsVerified?(user: User): MaybePromise<void>;
|
|
72
|
+
/** Valeur qui change avec le mot de passe enregistré : un lien de réinitialisation déjà servi devient invalide. */
|
|
73
|
+
getPasswordFingerprint?(user: User): MaybePromise<string>;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Locataires d'un panel (équipes, organisations…) : port de `->tenant(Team::class)`. Chaque page du panel vit alors
|
|
77
|
+
* sous `/<panel>/<clé du locataire>/…`, et seul un membre du locataire peut l'ouvrir.
|
|
78
|
+
*/
|
|
79
|
+
export interface TenantProvider<T = any> {
|
|
80
|
+
/** Locataires dont l'utilisateur est membre. */
|
|
81
|
+
getTenants(user: User): MaybePromise<T[]>;
|
|
82
|
+
/** Locataire d'après sa clé dans l'adresse (venue du navigateur : à valider). */
|
|
83
|
+
find(key: string): MaybePromise<T | null>;
|
|
84
|
+
canAccess(user: User, tenant: T): MaybePromise<boolean>;
|
|
85
|
+
getKey(tenant: T): string;
|
|
86
|
+
getName(tenant: T): string;
|
|
87
|
+
/** Texte au-dessus du nom dans le menu (« Current team »), ou `null`. */
|
|
88
|
+
getCurrentTenantLabel?(tenant: T): string | null;
|
|
89
|
+
getAvatarUrl?(tenant: T): string | null;
|
|
90
|
+
/** Création (page d'inscription d'un locataire) : l'utilisateur en devient membre. */
|
|
91
|
+
create?(data: Record<string, unknown>, user: User): MaybePromise<T>;
|
|
92
|
+
update?(tenant: T, data: Record<string, unknown>): MaybePromise<T>;
|
|
93
|
+
}
|
|
94
|
+
export type PanelContext = {
|
|
95
|
+
req: Request;
|
|
96
|
+
res: Response;
|
|
97
|
+
panel: Panel;
|
|
98
|
+
user: User | null;
|
|
99
|
+
mailbox: string;
|
|
100
|
+
tenant?: unknown;
|
|
101
|
+
};
|
|
102
|
+
/**
|
|
103
|
+
* Thème prédéfini d'un panel : un jeu de couleurs (palettes ou simples couleurs), éventuellement une police et du CSS.
|
|
104
|
+
* Quand un panel en déclare plusieurs, l'utilisateur choisit le sien dans son menu ; le choix est gardé dans un cookie.
|
|
105
|
+
*/
|
|
106
|
+
export type Theme = {
|
|
107
|
+
id: string;
|
|
108
|
+
label: string;
|
|
109
|
+
colors?: Record<string, Palette | string>;
|
|
110
|
+
font?: {
|
|
111
|
+
family: string;
|
|
112
|
+
url?: string;
|
|
113
|
+
};
|
|
114
|
+
/** CSS ajouté à la page pour ce thème (écrit par le développeur du panel, inséré tel quel). */
|
|
115
|
+
css?: string;
|
|
116
|
+
};
|
|
117
|
+
export declare class NavigationItem {
|
|
118
|
+
label: string;
|
|
119
|
+
_url: string;
|
|
120
|
+
_icon: string | null;
|
|
121
|
+
_group: string | null;
|
|
122
|
+
_sort: number;
|
|
123
|
+
_isActive: ((path: string) => boolean) | null;
|
|
124
|
+
_badge: string | number | null;
|
|
125
|
+
_badgeColor: string;
|
|
126
|
+
constructor(label: string);
|
|
127
|
+
static make(label: string): NavigationItem;
|
|
128
|
+
url(url: string): this;
|
|
129
|
+
icon(icon: string | null): this;
|
|
130
|
+
group(group: string | null): this;
|
|
131
|
+
sort(sort: number): this;
|
|
132
|
+
badge(badge: string | number | null, color?: string): this;
|
|
133
|
+
/** Par défaut un élément est actif sur son URL exacte, comme une page Filament (les resources fourniront leur propre règle). */
|
|
134
|
+
isActiveWhen(fn: (path: string) => boolean): this;
|
|
135
|
+
isActive(path: string): boolean;
|
|
136
|
+
}
|
|
137
|
+
export declare class Panel {
|
|
138
|
+
private _id;
|
|
139
|
+
private _path;
|
|
140
|
+
private _brandName;
|
|
141
|
+
private _brandLogo;
|
|
142
|
+
private _darkModeBrandLogo;
|
|
143
|
+
private _brandLogoHeight;
|
|
144
|
+
private _favicon;
|
|
145
|
+
private _theme;
|
|
146
|
+
private _motion;
|
|
147
|
+
private _themes;
|
|
148
|
+
private _font;
|
|
149
|
+
private _login;
|
|
150
|
+
private _auth;
|
|
151
|
+
private _key;
|
|
152
|
+
private _pages;
|
|
153
|
+
private _resources;
|
|
154
|
+
private _navigationItems;
|
|
155
|
+
private _navigationGroups;
|
|
156
|
+
private _maxContentWidth;
|
|
157
|
+
readonly colors: ColorManager;
|
|
158
|
+
static make(): Panel;
|
|
159
|
+
id(id: string): this;
|
|
160
|
+
path(path: string): this;
|
|
161
|
+
brandName(name: string): this;
|
|
162
|
+
brandLogo(url: string): this;
|
|
163
|
+
darkModeBrandLogo(url: string): this;
|
|
164
|
+
brandLogoHeight(height: string): this;
|
|
165
|
+
/** Icône d'onglet du navigateur. */
|
|
166
|
+
favicon(url: string | null): this;
|
|
167
|
+
getFavicon(): string | null;
|
|
168
|
+
/**
|
|
169
|
+
* Feuille de thème compilée par l'application (Tailwind) : elle remplace la feuille par défaut de Filament.
|
|
170
|
+
* Équivalent de `->viteTheme()` : le thème importe `@navette-js/panels/theme.css` et déclare ses propres sources.
|
|
171
|
+
*/
|
|
172
|
+
theme(url: string | null): this;
|
|
173
|
+
getTheme(): string | null;
|
|
174
|
+
/**
|
|
175
|
+
* Mouvement et indicateurs de chargement propres à Navette (ressorts, pastille d'activité, roue des zones différées).
|
|
176
|
+
* C'est un écart assumé avec Filament : `motion(false)` rend l'interface d'origine, sans rien d'ajouté.
|
|
177
|
+
*/
|
|
178
|
+
motion(enabled?: boolean): this;
|
|
179
|
+
hasMotion(): boolean;
|
|
180
|
+
/** Thèmes proposés à l'utilisateur ; le premier est le thème par défaut. */
|
|
181
|
+
themes(themes: Theme[]): this;
|
|
182
|
+
getThemes(): Theme[];
|
|
183
|
+
/** Thème de la requête : celui du cookie s'il est déclaré, sinon le premier. Null si le panel n'a pas de thèmes. */
|
|
184
|
+
resolveTheme(req: Request): Theme | null;
|
|
185
|
+
rememberTheme(res: Response, theme: Theme): void;
|
|
186
|
+
/** Exécute un rendu avec les couleurs du thème de la requête. */
|
|
187
|
+
withTheme<T>(req: Request, fn: () => T): T;
|
|
188
|
+
setColors(colors: Record<string, Palette | string>): this;
|
|
189
|
+
/** Police du panel. Sans URL : fournisseur Bunny Fonts, comme `->font('Albert Sans')` dans Filament. */
|
|
190
|
+
font(family: string, url?: string): this;
|
|
191
|
+
login(page?: typeof Login): this;
|
|
192
|
+
auth(provider: AuthProvider): this;
|
|
193
|
+
key(key: string): this;
|
|
194
|
+
pages(pages: (typeof Page)[]): this;
|
|
195
|
+
/** Enregistre des resources : leurs pages et leur élément de navigation. */
|
|
196
|
+
resources(resources: (typeof Resource)[]): this;
|
|
197
|
+
navigationItems(items: NavigationItem[]): this;
|
|
198
|
+
/** Ordre des groupes de navigation. */
|
|
199
|
+
navigationGroups(groups: string[]): this;
|
|
200
|
+
private _plugins;
|
|
201
|
+
/** Applique un plugin : un objet qui configure le panel (resources, pages, render hooks, thèmes…). */
|
|
202
|
+
plugin(plugin: Plugin): this;
|
|
203
|
+
plugins(plugins: Plugin[]): this;
|
|
204
|
+
getPlugins(): Plugin[];
|
|
205
|
+
private _renderHooks;
|
|
206
|
+
/**
|
|
207
|
+
* Insère du HTML à un emplacement nommé de l'interface de ce panel (noms : `PanelsRenderHook`, `TablesRenderHook`, `ActionsRenderHook`, `WidgetsRenderHook`).
|
|
208
|
+
* `scopes` limite le hook à certaines pages ou resources (leur classe). Le HTML rendu est inséré tel quel : échappez toute donnée avec `e()`.
|
|
209
|
+
*/
|
|
210
|
+
renderHook(name: string, render: RenderHookCallback, scopes?: unknown | unknown[] | null): this;
|
|
211
|
+
getRenderHooks(): RenderHookRegistry;
|
|
212
|
+
private _authorizer;
|
|
213
|
+
/** Branche votre propre système de permissions : consulté avant toute politique, pour chaque capacité, page et widget. */
|
|
214
|
+
authorizeUsing(authorizer: Authorizer | null): this;
|
|
215
|
+
/** Décision d'autorisation : le crochet du panel d'abord, puis la règle fournie ; sans utilisateur, toujours non. */
|
|
216
|
+
authorize(user: User | null, ability: string, subject?: {
|
|
217
|
+
resource?: unknown;
|
|
218
|
+
record?: unknown;
|
|
219
|
+
page?: typeof Page;
|
|
220
|
+
widget?: typeof Widget;
|
|
221
|
+
rule?: (() => boolean | Promise<boolean>) | null;
|
|
222
|
+
}): Promise<boolean>;
|
|
223
|
+
/** Une page est-elle accessible à cet utilisateur ? Liste : `viewAny` ; création : `create` ; édition : vérifiée sur l'enregistrement ; page libre : `canAccess`. */
|
|
224
|
+
canAccessPage(PageClass: typeof Page, user: User | null): Promise<boolean>;
|
|
225
|
+
private _widgets;
|
|
226
|
+
/** Widgets du panel (tableau de bord, pages libres) : enregistrés comme composants, à afficher par `getHeaderWidgets()` d'une page. */
|
|
227
|
+
widgets(widgets: (typeof Widget)[]): this;
|
|
228
|
+
getWidgets(): (typeof Widget)[];
|
|
229
|
+
maxContentWidth(width: string): this;
|
|
230
|
+
getId(): string;
|
|
231
|
+
getBrandName(): string;
|
|
232
|
+
getAuth(): AuthProvider;
|
|
233
|
+
getLoginPage(): typeof Login | null;
|
|
234
|
+
getPages(): (typeof Page)[];
|
|
235
|
+
getResources(): (typeof Resource)[];
|
|
236
|
+
private _globalSearch;
|
|
237
|
+
private _globalSearchKeyBindings;
|
|
238
|
+
private _globalSearchDebounce;
|
|
239
|
+
private _globalSearchSuffix;
|
|
240
|
+
/** `false` retire le champ de recherche globale. Il n'apparaît de toute façon que si une resource est cherchable. */
|
|
241
|
+
globalSearch(condition?: boolean): this;
|
|
242
|
+
/** Raccourcis qui placent le curseur dans le champ : `['command+k', 'ctrl+k']`. */
|
|
243
|
+
globalSearchKeyBindings(keyBindings: string[]): this;
|
|
244
|
+
getGlobalSearchKeyBindings(): string[];
|
|
245
|
+
/** Délai entre la frappe et la recherche (`500ms` par défaut). */
|
|
246
|
+
globalSearchDebounce(debounce: string): this;
|
|
247
|
+
getGlobalSearchDebounce(): string;
|
|
248
|
+
globalSearchFieldSuffix(suffix: string | null): this;
|
|
249
|
+
/** Affiche le premier raccourci dans le champ, écrit selon la plateforme du navigateur (comme Filament : « META+K » hors Mac pour `command+k`). */
|
|
250
|
+
globalSearchFieldKeyBindingSuffix(): this;
|
|
251
|
+
getGlobalSearchFieldSuffix(userAgent?: string): string | null;
|
|
252
|
+
hasGlobalSearch(): boolean;
|
|
253
|
+
/** Résultats par resource, dans l'ordre d'enregistrement ; seules les resources que l'utilisateur peut lister sont interrogées. */
|
|
254
|
+
getGlobalSearchResults(search: string, user: User | null): Promise<GlobalSearchCategory[]>;
|
|
255
|
+
private _databaseNotifications;
|
|
256
|
+
private _databaseNotificationsPolling;
|
|
257
|
+
/** Active la cloche des notifications enregistrées en base, lues et écrites par ce stockage (`knexNotificationStore(knex)`). */
|
|
258
|
+
databaseNotifications(store: DatabaseNotificationStore | null): this;
|
|
259
|
+
getDatabaseNotifications(): DatabaseNotificationStore | null;
|
|
260
|
+
/** Intervalle de rafraîchissement (`30s` par défaut) ; `null` pour ne pas interroger le serveur. */
|
|
261
|
+
databaseNotificationsPolling(interval: string | null): this;
|
|
262
|
+
getDatabaseNotificationsPollingInterval(): string | null;
|
|
263
|
+
private _topbar;
|
|
264
|
+
private _topNavigation;
|
|
265
|
+
private _navigation;
|
|
266
|
+
private _sidebarCollapsibleOnDesktop;
|
|
267
|
+
private _sidebarFullyCollapsibleOnDesktop;
|
|
268
|
+
private _positions;
|
|
269
|
+
/** Barre du haut (présente par défaut, comme dans Filament) : `topbar(false)` met logo, recherche, cloche et menu dans la sidebar. */
|
|
270
|
+
topbar(condition?: boolean): this;
|
|
271
|
+
hasTopbar(): boolean;
|
|
272
|
+
/** Navigation dans la barre du haut (menus déroulants par groupe) au lieu de la sidebar. */
|
|
273
|
+
topNavigation(condition?: boolean): this;
|
|
274
|
+
hasTopNavigation(): boolean;
|
|
275
|
+
/** `navigation(false)` retire toute navigation (ni sidebar ni menus). */
|
|
276
|
+
navigation(condition?: boolean): this;
|
|
277
|
+
hasNavigation(): boolean;
|
|
278
|
+
/** Sidebar repliable sur grand écran en une colonne d'icônes. */
|
|
279
|
+
sidebarCollapsibleOnDesktop(condition?: boolean): this;
|
|
280
|
+
isSidebarCollapsibleOnDesktop(): boolean;
|
|
281
|
+
/** Sidebar entièrement masquable sur grand écran. */
|
|
282
|
+
sidebarFullyCollapsibleOnDesktop(condition?: boolean): this;
|
|
283
|
+
isSidebarFullyCollapsibleOnDesktop(): boolean;
|
|
284
|
+
/** Emplacement du menu utilisateur ; par défaut, la barre du haut si elle existe. */
|
|
285
|
+
userMenuPosition(position: 'topbar' | 'sidebar' | null): this;
|
|
286
|
+
getUserMenuPosition(): 'topbar' | 'sidebar';
|
|
287
|
+
globalSearchPosition(position: 'topbar' | 'sidebar' | null): this;
|
|
288
|
+
getGlobalSearchPosition(): 'topbar' | 'sidebar';
|
|
289
|
+
databaseNotificationsPosition(position: 'topbar' | 'sidebar' | null): this;
|
|
290
|
+
getDatabaseNotificationsPosition(): 'topbar' | 'sidebar';
|
|
291
|
+
private _userMenuItems;
|
|
292
|
+
/** Éléments ajoutés au menu utilisateur (actions à adresse ou à modale). `sort()` négatif : au-dessus du choix du thème. Clés `profile` et `logout` : remplacent ceux par défaut. */
|
|
293
|
+
userMenuItems(items: Record<string, Action> | Action[]): this;
|
|
294
|
+
getUserMenuItems(): Record<string, Action>;
|
|
295
|
+
private _registration;
|
|
296
|
+
private _passwordReset;
|
|
297
|
+
private _emailVerification;
|
|
298
|
+
private _profile;
|
|
299
|
+
private _mailer;
|
|
300
|
+
/** Page d'inscription (`/register`). Le fournisseur d'utilisateurs doit savoir créer (`create`) et chercher par adresse (`findByEmail`). */
|
|
301
|
+
registration(page?: typeof Register | null): this;
|
|
302
|
+
hasRegistration(): boolean;
|
|
303
|
+
getRegistrationPage(): typeof Register | null;
|
|
304
|
+
/** Mot de passe oublié : demande (`/password-reset/request`) et réinitialisation par un lien signé envoyé par e-mail. */
|
|
305
|
+
passwordReset(request?: typeof RequestPasswordReset, reset?: typeof ResetPassword): this;
|
|
306
|
+
hasPasswordReset(): boolean;
|
|
307
|
+
getPasswordResetPages(): {
|
|
308
|
+
request: typeof RequestPasswordReset;
|
|
309
|
+
reset: typeof ResetPassword;
|
|
310
|
+
};
|
|
311
|
+
/** Vérification de l'adresse e-mail : un lien signé est envoyé à l'inscription ; tant qu'il n'est pas suivi, seule l'invitation à vérifier est accessible (`isRequired`). */
|
|
312
|
+
emailVerification(prompt?: typeof EmailVerificationPrompt, isRequired?: boolean): this;
|
|
313
|
+
hasEmailVerification(): boolean;
|
|
314
|
+
isEmailVerificationRequired(): boolean;
|
|
315
|
+
getEmailVerificationPrompt(): typeof EmailVerificationPrompt | null;
|
|
316
|
+
/** Page de profil (`/profile`) : nom, adresse, mot de passe. `isSimple` : mise en page simple (par défaut) ou complète. */
|
|
317
|
+
profile(page?: typeof EditProfile, isSimple?: boolean): this;
|
|
318
|
+
hasProfile(): boolean;
|
|
319
|
+
getProfile(): {
|
|
320
|
+
page: typeof EditProfile;
|
|
321
|
+
isSimple: boolean;
|
|
322
|
+
};
|
|
323
|
+
/** Envoi des e-mails (réinitialisation, vérification). Par défaut : écrits dans la console. */
|
|
324
|
+
mailer(mailer: Mailer): this;
|
|
325
|
+
sendMail(message: MailMessage): Promise<void>;
|
|
326
|
+
getAuthKey(): string;
|
|
327
|
+
getRegistrationUrl(): string;
|
|
328
|
+
getRequestPasswordResetUrl(): string;
|
|
329
|
+
getResetPasswordUrl(user: User, fingerprint: string): string;
|
|
330
|
+
/** Charge d'un jeton de réinitialisation valide pour ce panel, sinon `null`. */
|
|
331
|
+
readResetPasswordToken(token: unknown): {
|
|
332
|
+
uid: string | number;
|
|
333
|
+
fp: string;
|
|
334
|
+
} | null;
|
|
335
|
+
getVerifyEmailUrl(user: User): string;
|
|
336
|
+
checkVerifyEmailUrl(id: string, hash: string, expires: unknown, signature: unknown): boolean;
|
|
337
|
+
getEmailVerificationPromptUrl(): string;
|
|
338
|
+
getProfileUrl(): string | null;
|
|
339
|
+
/** L'utilisateur doit-il encore vérifier son adresse avant d'utiliser le panel ? */
|
|
340
|
+
mustVerifyEmail(user: User | null): Promise<boolean>;
|
|
341
|
+
private _tenant;
|
|
342
|
+
private _tenantOwnershipColumn;
|
|
343
|
+
private _tenantRegistration;
|
|
344
|
+
private _tenantProfile;
|
|
345
|
+
private _tenantMenu;
|
|
346
|
+
private _tenantMenuItems;
|
|
347
|
+
private _tenantScope;
|
|
348
|
+
/**
|
|
349
|
+
* Rend le panel multi-locataire. `ownershipColumn` : colonne qui rattache un enregistrement à son locataire (`team_id`) ;
|
|
350
|
+
* les resources du panel ne lisent et n'écrivent alors que les enregistrements du locataire courant (voir `Resource.isScopedToTenant`).
|
|
351
|
+
*/
|
|
352
|
+
tenant(provider: TenantProvider | null, options?: {
|
|
353
|
+
ownershipColumn?: string;
|
|
354
|
+
}): this;
|
|
355
|
+
hasTenancy(): boolean;
|
|
356
|
+
getTenantProvider(): TenantProvider;
|
|
357
|
+
getTenantOwnershipColumn(): string | null;
|
|
358
|
+
/** Page de création d'un locataire (`/new`). */
|
|
359
|
+
tenantRegistration(page: typeof RegisterTenant | null): this;
|
|
360
|
+
getTenantRegistrationPage(): typeof RegisterTenant | null;
|
|
361
|
+
/** Page de profil du locataire (`/<locataire>/profile`). */
|
|
362
|
+
tenantProfile(page: typeof EditTenantProfile | null): this;
|
|
363
|
+
getTenantProfilePage(): typeof EditTenantProfile | null;
|
|
364
|
+
tenantMenu(condition?: boolean): this;
|
|
365
|
+
hasTenantMenu(): boolean;
|
|
366
|
+
tenantMenuItems(items: Record<string, Action> | Action[]): this;
|
|
367
|
+
getTenantMenuItems(): Record<string, Action>;
|
|
368
|
+
/** Exécute `fn` pour un locataire : les adresses produites (`getUrl`) et les requêtes des resources lui sont rattachées. */
|
|
369
|
+
withTenant<T>(tenant: unknown, fn: () => T): T;
|
|
370
|
+
/** Locataire de la requête en cours (équivalent de `Filament::getTenant()`), ou `null`. */
|
|
371
|
+
getTenant<T = any>(): T | null;
|
|
372
|
+
getTenantUrlKey(tenant: unknown): string;
|
|
373
|
+
private _subNavigationPosition;
|
|
374
|
+
/** Position par défaut de la sous-navigation des pages (`start`, comme Filament). */
|
|
375
|
+
subNavigationPosition(position: 'start' | 'end' | 'top'): this;
|
|
376
|
+
getSubNavigationPosition(): 'start' | 'end' | 'top';
|
|
377
|
+
private _appUrl;
|
|
378
|
+
/** Adresse publique de l'application (`https://exemple.fr`), utilisée dans les liens envoyés par e-mail. Sans elle, l'origine de la requête est reprise : à éviter en production (en-tête `Host` falsifiable). */
|
|
379
|
+
appUrl(url: string | null): this;
|
|
380
|
+
getAppUrl(): string | null;
|
|
381
|
+
getMaxContentWidth(): string;
|
|
382
|
+
/** Adresse dans le panel ; dans un panel à locataires, préfixée par le locataire courant (ou celui donné). */
|
|
383
|
+
getUrl(sub?: string, tenant?: unknown): string;
|
|
384
|
+
/** Adresse hors locataire (connexion, inscription, profil, création d'un locataire). */
|
|
385
|
+
getBaseUrl(sub?: string): string;
|
|
386
|
+
getLoginUrl(): string;
|
|
387
|
+
getLogoutUrl(): string;
|
|
388
|
+
/** Préfixe de l'endpoint Livewire de ce panel (`/livewire`, ou `/<chemin>/livewire`) : chaque panel a le sien. */
|
|
389
|
+
getLivewirePrefix(): string;
|
|
390
|
+
assetUrl(file: string): string;
|
|
391
|
+
getBrand(): Record<string, unknown>;
|
|
392
|
+
getFont(): typeof this._font;
|
|
393
|
+
/** Avatar par défaut : port de UiAvatarsProvider (service externe ui-avatars.com, initiales du nom). */
|
|
394
|
+
getUserAvatarUrl(user: User): string;
|
|
395
|
+
/** Avatar d'un locataire : celui de son fournisseur (`getAvatarUrl`), sinon ses initiales. */
|
|
396
|
+
getTenantAvatarUrl(tenant: unknown): string;
|
|
397
|
+
private _spa;
|
|
398
|
+
/** Navigation sans rechargement (`wire:navigate`) entre les pages du panel, comme `->spa()`. */
|
|
399
|
+
spa(condition?: boolean): this;
|
|
400
|
+
hasSpaMode(): boolean;
|
|
401
|
+
getAvatarUrlFor(name: string): string;
|
|
402
|
+
/** Groupes de navigation : pages enregistrées + éléments libres, triés, groupés dans l'ordre déclaré. */
|
|
403
|
+
/** Compteurs de navigation calculés (équivalent de getNavigationBadge()) : adresse de la page → valeur. */
|
|
404
|
+
resolveNavigationBadges(): Promise<Map<string, string | number | null>>;
|
|
405
|
+
/** Adresses des pages du menu que cet utilisateur ne peut pas ouvrir. */
|
|
406
|
+
resolveInaccessiblePages(user: User | null): Promise<Set<string>>;
|
|
407
|
+
getNavigation(path: string, badges?: Map<string, string | number | null>, hidden?: Set<string>): {
|
|
408
|
+
label: string | null;
|
|
409
|
+
itemsId: string;
|
|
410
|
+
isActive: boolean;
|
|
411
|
+
items: {
|
|
412
|
+
label: string;
|
|
413
|
+
url: string;
|
|
414
|
+
icon: string | null;
|
|
415
|
+
isActive: boolean;
|
|
416
|
+
badge: string | number | null;
|
|
417
|
+
badgeColorClasses: string[];
|
|
418
|
+
}[];
|
|
419
|
+
}[];
|
|
420
|
+
private sign;
|
|
421
|
+
logIn(res: Response, user: User, remember: boolean): void;
|
|
422
|
+
logOut(res: Response): void;
|
|
423
|
+
user(req: Request): Promise<User | null>;
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Emplacements de render hook d'un panel — mêmes noms que `Filament\View\PanelsRenderHook`.
|
|
427
|
+
* Ceux d'une brique pas encore portée (barre du haut, recherche globale, menu de locataire, sous-navigation, inscription,
|
|
428
|
+
* réinitialisation du mot de passe, enregistrements liés) sont déclarés mais ne sont rendus nulle part pour l'instant : voir `UNPLACED_RENDER_HOOKS`.
|
|
429
|
+
*/
|
|
430
|
+
export declare const PanelsRenderHook: {
|
|
431
|
+
readonly AUTH_LOGIN_FORM_AFTER: "panels::auth.login.form.after";
|
|
432
|
+
readonly AUTH_LOGIN_FORM_BEFORE: "panels::auth.login.form.before";
|
|
433
|
+
readonly AUTH_PASSWORD_RESET_REQUEST_FORM_AFTER: "panels::auth.password-reset.request.form.after";
|
|
434
|
+
readonly AUTH_PASSWORD_RESET_REQUEST_FORM_BEFORE: "panels::auth.password-reset.request.form.before";
|
|
435
|
+
readonly AUTH_PASSWORD_RESET_RESET_FORM_AFTER: "panels::auth.password-reset.reset.form.after";
|
|
436
|
+
readonly AUTH_PASSWORD_RESET_RESET_FORM_BEFORE: "panels::auth.password-reset.reset.form.before";
|
|
437
|
+
readonly AUTH_REGISTER_FORM_AFTER: "panels::auth.register.form.after";
|
|
438
|
+
readonly AUTH_REGISTER_FORM_BEFORE: "panels::auth.register.form.before";
|
|
439
|
+
readonly BODY_END: "panels::body.end";
|
|
440
|
+
readonly BODY_START: "panels::body.start";
|
|
441
|
+
readonly CONTENT_AFTER: "panels::content.after";
|
|
442
|
+
readonly CONTENT_BEFORE: "panels::content.before";
|
|
443
|
+
readonly CONTENT_END: "panels::content.end";
|
|
444
|
+
readonly CONTENT_START: "panels::content.start";
|
|
445
|
+
readonly FOOTER: "panels::footer";
|
|
446
|
+
readonly GLOBAL_SEARCH_AFTER: "panels::global-search.after";
|
|
447
|
+
readonly GLOBAL_SEARCH_BEFORE: "panels::global-search.before";
|
|
448
|
+
readonly GLOBAL_SEARCH_END: "panels::global-search.end";
|
|
449
|
+
readonly GLOBAL_SEARCH_START: "panels::global-search.start";
|
|
450
|
+
readonly HEAD_END: "panels::head.end";
|
|
451
|
+
readonly HEAD_START: "panels::head.start";
|
|
452
|
+
readonly LAYOUT_END: "panels::layout.end";
|
|
453
|
+
readonly LAYOUT_START: "panels::layout.start";
|
|
454
|
+
readonly PAGE_END: "panels::page.end";
|
|
455
|
+
readonly PAGE_FOOTER_WIDGETS_AFTER: "panels::page.footer-widgets.after";
|
|
456
|
+
readonly PAGE_FOOTER_WIDGETS_BEFORE: "panels::page.footer-widgets.before";
|
|
457
|
+
readonly PAGE_FOOTER_WIDGETS_END: "panels::page.footer-widgets.end";
|
|
458
|
+
readonly PAGE_FOOTER_WIDGETS_START: "panels::page.footer-widgets.start";
|
|
459
|
+
readonly PAGE_HEADER_ACTIONS_AFTER: "panels::page.header.actions.after";
|
|
460
|
+
readonly PAGE_HEADER_ACTIONS_BEFORE: "panels::page.header.actions.before";
|
|
461
|
+
readonly PAGE_HEADER_HEADING_AFTER: "panels::page.header.heading.after";
|
|
462
|
+
readonly PAGE_HEADER_HEADING_BEFORE: "panels::page.header.heading.before";
|
|
463
|
+
readonly PAGE_HEADER_WIDGETS_AFTER: "panels::page.header-widgets.after";
|
|
464
|
+
readonly PAGE_HEADER_WIDGETS_BEFORE: "panels::page.header-widgets.before";
|
|
465
|
+
readonly PAGE_HEADER_WIDGETS_END: "panels::page.header-widgets.end";
|
|
466
|
+
readonly PAGE_HEADER_WIDGETS_START: "panels::page.header-widgets.start";
|
|
467
|
+
readonly PAGE_START: "panels::page.start";
|
|
468
|
+
/** Le nom contient « module-menu » dans Filament : conservé tel quel. */
|
|
469
|
+
readonly PAGE_SUB_NAVIGATION_MOBILE_MENU_AFTER: "panels::page.sub-navigation.module-menu.after";
|
|
470
|
+
readonly PAGE_SUB_NAVIGATION_MOBILE_MENU_BEFORE: "panels::page.sub-navigation.module-menu.before";
|
|
471
|
+
readonly PAGE_SUB_NAVIGATION_SIDEBAR_AFTER: "panels::page.sub-navigation.sidebar.after";
|
|
472
|
+
readonly PAGE_SUB_NAVIGATION_SIDEBAR_BEFORE: "panels::page.sub-navigation.sidebar.before";
|
|
473
|
+
readonly PAGE_SUB_NAVIGATION_START_AFTER: "panels::page.sub-navigation.start.after";
|
|
474
|
+
readonly PAGE_SUB_NAVIGATION_START_BEFORE: "panels::page.sub-navigation.start.before";
|
|
475
|
+
readonly PAGE_SUB_NAVIGATION_TOP_AFTER: "panels::page.sub-navigation.top.after";
|
|
476
|
+
readonly PAGE_SUB_NAVIGATION_TOP_BEFORE: "panels::page.sub-navigation.top.before";
|
|
477
|
+
readonly PAGE_SUB_NAVIGATION_END_AFTER: "panels::page.sub-navigation.end.after";
|
|
478
|
+
readonly PAGE_SUB_NAVIGATION_END_BEFORE: "panels::page.sub-navigation.end.before";
|
|
479
|
+
readonly RESOURCE_PAGES_LIST_RECORDS_TABLE_AFTER: "panels::resource.pages.list-records.table.after";
|
|
480
|
+
readonly RESOURCE_PAGES_LIST_RECORDS_TABLE_BEFORE: "panels::resource.pages.list-records.table.before";
|
|
481
|
+
readonly RESOURCE_PAGES_LIST_RECORDS_TABS_END: "panels::resource.pages.list-records.tabs.end";
|
|
482
|
+
readonly RESOURCE_PAGES_LIST_RECORDS_TABS_START: "panels::resource.pages.list-records.tabs.start";
|
|
483
|
+
readonly RESOURCE_PAGES_MANAGE_RELATED_RECORDS_TABLE_AFTER: "panels::resource.pages.manage-related-records.table.after";
|
|
484
|
+
readonly RESOURCE_PAGES_MANAGE_RELATED_RECORDS_TABLE_BEFORE: "panels::resource.pages.manage-related-records.table.before";
|
|
485
|
+
readonly RESOURCE_RELATION_MANAGER_AFTER: "panels::resource.relation-manager.after";
|
|
486
|
+
readonly RESOURCE_RELATION_MANAGER_BEFORE: "panels::resource.relation-manager.before";
|
|
487
|
+
readonly RESOURCE_TABS_END: "panels::resource.tabs.end";
|
|
488
|
+
readonly RESOURCE_TABS_START: "panels::resource.tabs.start";
|
|
489
|
+
readonly SCRIPTS_AFTER: "panels::scripts.after";
|
|
490
|
+
readonly SCRIPTS_BEFORE: "panels::scripts.before";
|
|
491
|
+
readonly SIDEBAR_FOOTER: "panels::sidebar.footer";
|
|
492
|
+
readonly SIDEBAR_LOGO_AFTER: "panels::sidebar.logo.after";
|
|
493
|
+
readonly SIDEBAR_LOGO_BEFORE: "panels::sidebar.logo.before";
|
|
494
|
+
readonly SIDEBAR_START: "panels::sidebar.start";
|
|
495
|
+
readonly SIDEBAR_NAV_END: "panels::sidebar.nav.end";
|
|
496
|
+
readonly SIDEBAR_NAV_START: "panels::sidebar.nav.start";
|
|
497
|
+
readonly SIMPLE_LAYOUT_END: "panels::simple-layout.end";
|
|
498
|
+
readonly SIMPLE_LAYOUT_START: "panels::simple-layout.start";
|
|
499
|
+
readonly SIMPLE_PAGE_END: "panels::simple-page.end";
|
|
500
|
+
readonly SIMPLE_PAGE_START: "panels::simple-page.start";
|
|
501
|
+
readonly STYLES_AFTER: "panels::styles.after";
|
|
502
|
+
readonly STYLES_BEFORE: "panels::styles.before";
|
|
503
|
+
readonly TENANT_MENU_AFTER: "panels::tenant-menu.after";
|
|
504
|
+
readonly TENANT_MENU_BEFORE: "panels::tenant-menu.before";
|
|
505
|
+
readonly TOPBAR_AFTER: "panels::topbar.after";
|
|
506
|
+
readonly TOPBAR_BEFORE: "panels::topbar.before";
|
|
507
|
+
readonly TOPBAR_END: "panels::topbar.end";
|
|
508
|
+
readonly TOPBAR_LOGO_AFTER: "panels::topbar.logo.after";
|
|
509
|
+
readonly TOPBAR_LOGO_BEFORE: "panels::topbar.logo.before";
|
|
510
|
+
readonly TOPBAR_START: "panels::topbar.start";
|
|
511
|
+
readonly USER_MENU_AFTER: "panels::user-menu.after";
|
|
512
|
+
readonly USER_MENU_BEFORE: "panels::user-menu.before";
|
|
513
|
+
readonly USER_MENU_PROFILE_AFTER: "panels::user-menu.profile.after";
|
|
514
|
+
readonly USER_MENU_PROFILE_BEFORE: "panels::user-menu.profile.before";
|
|
515
|
+
};
|
|
516
|
+
/** Emplacements de render hook des widgets — mêmes noms que `Filament\Widgets\View\WidgetsRenderHook`. Rendus par `TableWidget`. */
|
|
517
|
+
export declare const WidgetsRenderHook: {
|
|
518
|
+
readonly TABLE_WIDGET_END: "widgets::table-widget.end";
|
|
519
|
+
readonly TABLE_WIDGET_START: "widgets::table-widget.start";
|
|
520
|
+
};
|
|
521
|
+
/**
|
|
522
|
+
* Emplacements déclarés mais rendus nulle part pour l'instant, avec la brique qui leur manque.
|
|
523
|
+
* Les quatre « tabs » ne sont rendus par aucune vue de Filament 5.11.2 non plus.
|
|
524
|
+
*/
|
|
525
|
+
export declare const UNPLACED_RENDER_HOOKS: Record<string, string>;
|
|
526
|
+
/** Base commune : composant à état hébergeant des schémas (`<nom>Schema(schema)`). */
|
|
527
|
+
declare abstract class BasePage extends Component implements SchemaHost {
|
|
528
|
+
get panel(): Panel;
|
|
529
|
+
getSchema(name: string): Schema;
|
|
530
|
+
contentSchema(schema: Schema): Schema;
|
|
531
|
+
/** Portées des render hooks de cette page : sa classe (et sa resource pour une page de resource), comme `getRenderHookScopes()` dans Filament. */
|
|
532
|
+
getRenderHookScopes(): unknown[];
|
|
533
|
+
}
|
|
534
|
+
/** Page d'un panel, dans la mise en page complète (sidebar, en-tête). */
|
|
535
|
+
export declare class Page extends BasePage {
|
|
536
|
+
/** Méthodes que le navigateur peut appeler. Une sous-classe ajoute les siennes : `static callable = ['approve']`. */
|
|
537
|
+
static callable: string[];
|
|
538
|
+
static slug: string;
|
|
539
|
+
static title: string | null;
|
|
540
|
+
static navigationLabel: string | null;
|
|
541
|
+
static navigationIcon: string | null;
|
|
542
|
+
static navigationGroup: string | null;
|
|
543
|
+
static navigationSort: number;
|
|
544
|
+
static navigationBadge: string | number | null;
|
|
545
|
+
static navigationBadgeColor: string;
|
|
546
|
+
static shouldRegisterNavigation: boolean;
|
|
547
|
+
/** Page réservée à certains utilisateurs : rendre `false` la retire du menu et la refuse (403). */
|
|
548
|
+
static canAccess(_user: User): boolean | Promise<boolean>;
|
|
549
|
+
static getTitle(): string;
|
|
550
|
+
static getNavigationLabel(): string;
|
|
551
|
+
/** Chaque requête, y compris les mises à jour envoyées par le navigateur, exige un utilisateur authentifié : un snapshot conservé après déconnexion ne suffit pas. */
|
|
552
|
+
boot(): Promise<void>;
|
|
553
|
+
protected isAccessAuthorized(ctx: PanelContext): boolean | Promise<boolean>;
|
|
554
|
+
getTitle(): string;
|
|
555
|
+
getHeading(): string;
|
|
556
|
+
getBreadcrumbs(): {
|
|
557
|
+
label: string;
|
|
558
|
+
url: string | null;
|
|
559
|
+
}[];
|
|
560
|
+
getHeaderActions(): Action[];
|
|
561
|
+
getPageClasses(): string[];
|
|
562
|
+
/** Sous-navigation de la page : vide par défaut. */
|
|
563
|
+
getSubNavigation(): SubNavigationItem[] | Promise<SubNavigationItem[]>;
|
|
564
|
+
/** Position de la sous-navigation : `start` (colonne avant le contenu), `end` (après) ou `top` (onglets). Par défaut : celle de la resource, sinon du panel. */
|
|
565
|
+
static subNavigationPosition: 'start' | 'end' | 'top' | null;
|
|
566
|
+
getSubNavigationPosition(): 'start' | 'end' | 'top';
|
|
567
|
+
/** Widgets affichés sous le contenu de la page (port de getFooterWidgets). */
|
|
568
|
+
getFooterWidgets(): (typeof Widget)[];
|
|
569
|
+
getFooterWidgetsColumns(): number | Record<string, number>;
|
|
570
|
+
/** Port de filament-widgets::components.widgets, dans le schéma `footerWidgets` de la page. */
|
|
571
|
+
protected renderFooterWidgets(): Promise<string>;
|
|
572
|
+
/** Widgets affichés au-dessus du contenu de la page, et données passées à chacun (propriétés du widget). */
|
|
573
|
+
getHeaderWidgets(): (typeof Widget)[];
|
|
574
|
+
getHeaderWidgetsColumns(): number;
|
|
575
|
+
getWidgetData(): Record<string, unknown>;
|
|
576
|
+
/** Port de filament-widgets::components.widgets, dans le schéma `headerWidgets` de la page. */
|
|
577
|
+
protected renderHeaderWidgets(): Promise<string>;
|
|
578
|
+
/** Widgets que l'utilisateur courant a le droit de voir (port de filterVisibleWidgets). */
|
|
579
|
+
protected filterVisibleWidgets(candidates: (typeof Widget)[]): Promise<(typeof Widget)[]>;
|
|
580
|
+
/** Grille de widgets d'un schéma (port de Grid + getWidgetsSchemaComponents) : chaque widget est un composant enfant, « lazy » par défaut. */
|
|
581
|
+
protected renderWidgetsGrid(widgets: (typeof Widget)[], columns: number | Record<string, number>, schemaKey: string): Promise<string>;
|
|
582
|
+
/** Contenu de la page : par défaut son schéma `content`. */
|
|
583
|
+
protected renderContent(): Promise<string>;
|
|
584
|
+
mountedActions: {
|
|
585
|
+
name: string;
|
|
586
|
+
arguments: Record<string, unknown>;
|
|
587
|
+
context: Record<string, unknown>;
|
|
588
|
+
data?: Record<string, unknown>;
|
|
589
|
+
}[];
|
|
590
|
+
getActionMountContext(): Record<string, unknown>;
|
|
591
|
+
protected getActionRecord(): unknown;
|
|
592
|
+
/** Enregistrement visé par une action montée dans un contexte donné (ligne de table…). */
|
|
593
|
+
protected resolveActionRecord(_context: Record<string, unknown>): Promise<unknown>;
|
|
594
|
+
/** Actions pouvant être montées dans un contexte donné (en-tête de page par défaut). */
|
|
595
|
+
protected getMountableActions(context: Record<string, unknown>): Action[] | Promise<Action[]>;
|
|
596
|
+
/**
|
|
597
|
+
* Actions portées par un composant de schéma (Repeater : ajouter, supprimer, déplacer ; Section : actions d'en-tête).
|
|
598
|
+
* La clé vient du navigateur : elle doit désigner un composant réel du schéma, ou le schéma lui-même.
|
|
599
|
+
*/
|
|
600
|
+
protected getSchemaComponentActions(key: string): Promise<Action[]>;
|
|
601
|
+
/** Contexte retenu pour une action montée : celui du serveur, jamais celui du navigateur tel quel. */
|
|
602
|
+
protected resolveMountContext(clientContext: unknown): Record<string, unknown>;
|
|
603
|
+
private findMountableAction;
|
|
604
|
+
private actionContext;
|
|
605
|
+
/** Schéma du formulaire d'une action montée : clé `mountedActionSchema<n>`, état sous `mountedActions.<n>.data` (comme Filament). */
|
|
606
|
+
getMountedActionSchema(index: number): Promise<Schema | null>;
|
|
607
|
+
private renderActionModal;
|
|
608
|
+
/** Annule un rendu partiel de modale préparé par un champ réactif, quand la même requête exécute ensuite une action. */
|
|
609
|
+
private cancelModalPartialRender;
|
|
610
|
+
/** Champ réactif du formulaire d'une action montée : exécute `afterStateUpdated`, puis ne renvoie que la modale concernée (comme Filament). */
|
|
611
|
+
updatedMountedActions(_value: unknown, key: string | null): Promise<void>;
|
|
612
|
+
/** Appel, depuis le JavaScript d'un champ, d'une méthode que ce champ expose (ex. recherche d'un Select). Sans rendu. */
|
|
613
|
+
callSchemaComponentMethod(componentKey: unknown, method: unknown, args?: unknown): Promise<unknown>;
|
|
614
|
+
/** Une action masquée ne peut être ni montée ni exécutée, même par un appel forgé depuis le navigateur. */
|
|
615
|
+
private assertActionVisible;
|
|
616
|
+
private syncActionModals;
|
|
617
|
+
/** Faux pour un composant à table : ses modales sont rendues dans la table (comme Filament). */
|
|
618
|
+
protected rendersActionModalsInPage(): boolean;
|
|
619
|
+
renderActionModals(): Promise<string>;
|
|
620
|
+
/** Monte une action : sans modale elle s'exécute tout de suite ; avec modale, seul le fragment des modales est renvoyé. */
|
|
621
|
+
mountAction(name: unknown, args?: unknown, _context?: unknown): Promise<void>;
|
|
622
|
+
unmountAction(_shouldCancelParentActions?: unknown): void;
|
|
623
|
+
callMountedAction(_args?: unknown): Promise<void>;
|
|
624
|
+
render(): Promise<string>;
|
|
625
|
+
}
|
|
626
|
+
/**
|
|
627
|
+
* Tableau de bord (port de Filament\Pages\Dashboard) : une grille de widgets, précédée d'un formulaire de filtres
|
|
628
|
+
* quand la page définit `filtersFormSchema(schema)` (port de HasFiltersForm). Les filtres sont passés aux widgets sous `pageFilters`.
|
|
629
|
+
*/
|
|
630
|
+
export declare class Dashboard extends Page {
|
|
631
|
+
static slug: string;
|
|
632
|
+
static title: string;
|
|
633
|
+
static navigationIcon: string;
|
|
634
|
+
static navigationSort: number;
|
|
635
|
+
/** État du formulaire de filtres. Reste `null` tant que la page n'a pas de filtres. */
|
|
636
|
+
filters: Record<string, unknown> | null;
|
|
637
|
+
/** Widgets du tableau de bord. Par défaut : ceux du panel (`panel.widgets([...])`). */
|
|
638
|
+
getWidgets(): (typeof Widget)[];
|
|
639
|
+
/** Colonnes de la grille : un nombre (au point de rupture `lg`), ou un nombre par point de rupture. */
|
|
640
|
+
getColumns(): number | Record<string, number>;
|
|
641
|
+
hasFiltersForm(): boolean;
|
|
642
|
+
getSchema(name: string): Schema;
|
|
643
|
+
mount(): void;
|
|
644
|
+
getWidgetData(): Record<string, unknown>;
|
|
645
|
+
protected renderContent(): Promise<string>;
|
|
646
|
+
}
|
|
647
|
+
/** Limiteur de tentatives en mémoire : `max` essais par fenêtre, par clé. Suffisant pour une instance ; à remplacer par un magasin partagé si le panel tourne sur plusieurs. */
|
|
648
|
+
export declare class Throttle {
|
|
649
|
+
private hits;
|
|
650
|
+
private max;
|
|
651
|
+
private windowMs;
|
|
652
|
+
constructor(max?: number, windowMs?: number);
|
|
653
|
+
/** Enregistre un essai ; rend 0 s'il est permis, sinon le nombre de secondes à attendre. */
|
|
654
|
+
hit(key: string, now?: number): number;
|
|
655
|
+
clear(key: string): void;
|
|
656
|
+
}
|
|
657
|
+
/** Page à mise en page « simple » (connexion, inscription…). */
|
|
658
|
+
export declare abstract class SimplePage extends BasePage {
|
|
659
|
+
abstract getTitle(): string;
|
|
660
|
+
getHeading(): string | null;
|
|
661
|
+
/** Sous-titre, en HTML de confiance (composé par la page, données échappées). */
|
|
662
|
+
getSubheading(): string | null;
|
|
663
|
+
hasLogo(): boolean;
|
|
664
|
+
render(): Promise<string>;
|
|
665
|
+
}
|
|
666
|
+
/** Inscription (port de Filament\Auth\Pages\Register) : nom, adresse, mot de passe confirmé ; l'utilisateur est connecté, puis invité à vérifier son adresse si le panel l'exige. */
|
|
667
|
+
export declare class Register extends SimplePage {
|
|
668
|
+
static callable: string[];
|
|
669
|
+
data: Record<string, unknown>;
|
|
670
|
+
mount(): void;
|
|
671
|
+
getTitle(): string;
|
|
672
|
+
getHeading(): string;
|
|
673
|
+
getSubheading(): string | null;
|
|
674
|
+
formSchema(schema: Schema): Schema;
|
|
675
|
+
contentSchema(schema: Schema): Schema;
|
|
676
|
+
/** Données validées, juste avant la création (ajouter une valeur, normaliser l'adresse…). */
|
|
677
|
+
protected mutateFormDataBeforeRegister(data: Record<string, unknown>): Record<string, unknown> | Promise<Record<string, unknown>>;
|
|
678
|
+
/** Création de l'utilisateur : par défaut `create()` du fournisseur d'utilisateurs. */
|
|
679
|
+
protected handleRegistration(data: Record<string, unknown>): Promise<User> | User;
|
|
680
|
+
register(): Promise<void>;
|
|
681
|
+
}
|
|
682
|
+
/** Demande de réinitialisation du mot de passe (port de RequestPasswordReset) : un lien signé, valable 60 minutes, part par e-mail. */
|
|
683
|
+
export declare class RequestPasswordReset extends SimplePage {
|
|
684
|
+
static callable: string[];
|
|
685
|
+
data: Record<string, unknown>;
|
|
686
|
+
mount(): void;
|
|
687
|
+
getTitle(): string;
|
|
688
|
+
getHeading(): string;
|
|
689
|
+
getSubheading(): string | null;
|
|
690
|
+
formSchema(schema: Schema): Schema;
|
|
691
|
+
contentSchema(schema: Schema): Schema;
|
|
692
|
+
request(): Promise<void>;
|
|
693
|
+
}
|
|
694
|
+
/** Nouveau mot de passe, depuis le lien reçu par e-mail (port de ResetPassword). Le lien ne sert qu'une fois : il meurt avec l'ancien mot de passe. */
|
|
695
|
+
export declare class ResetPassword extends SimplePage {
|
|
696
|
+
static callable: string[];
|
|
697
|
+
static locked: string[];
|
|
698
|
+
email: string | null;
|
|
699
|
+
password: string;
|
|
700
|
+
passwordConfirmation: string;
|
|
701
|
+
token: string | null;
|
|
702
|
+
mount(params: Record<string, unknown>): void;
|
|
703
|
+
/** Comme Filament : le formulaire n'a pas de chemin d'état, ses champs sont des propriétés de la page. */
|
|
704
|
+
getSchema(name: string): Schema;
|
|
705
|
+
getTitle(): string;
|
|
706
|
+
getHeading(): string;
|
|
707
|
+
formSchema(schema: Schema): Schema;
|
|
708
|
+
contentSchema(schema: Schema): Schema;
|
|
709
|
+
resetPassword(): Promise<void>;
|
|
710
|
+
}
|
|
711
|
+
/** Invitation à vérifier son adresse (port de EmailVerificationPrompt), avec le lien « Resend it. ». */
|
|
712
|
+
export declare class EmailVerificationPrompt extends SimplePage {
|
|
713
|
+
static callable: string[];
|
|
714
|
+
mount(): Promise<void>;
|
|
715
|
+
getTitle(): string;
|
|
716
|
+
getHeading(): string;
|
|
717
|
+
contentSchema(schema: Schema): Schema;
|
|
718
|
+
/** Seule action de la page : renvoyer l'e-mail (deux fois par minute au plus). */
|
|
719
|
+
mountAction(name: unknown): Promise<void>;
|
|
720
|
+
}
|
|
721
|
+
/** Profil de l'utilisateur (port de EditProfile) : nom, adresse, nouveau mot de passe ; le mot de passe actuel est exigé pour changer l'adresse ou le mot de passe. */
|
|
722
|
+
export declare class EditProfile extends SimplePage {
|
|
723
|
+
static callable: string[];
|
|
724
|
+
static slug: string;
|
|
725
|
+
data: Record<string, unknown>;
|
|
726
|
+
static getLabel(): string;
|
|
727
|
+
mount(): Promise<void>;
|
|
728
|
+
boot(): Promise<void>;
|
|
729
|
+
getTitle(): string;
|
|
730
|
+
hasLogo(): boolean;
|
|
731
|
+
formSchema(schema: Schema): Schema;
|
|
732
|
+
contentSchema(schema: Schema): Schema;
|
|
733
|
+
save(): Promise<void>;
|
|
734
|
+
}
|
|
735
|
+
/** Création d'un locataire (port de RegisterTenant) : la sous-classe donne son libellé et son formulaire (`formSchema`). */
|
|
736
|
+
export declare abstract class RegisterTenant extends SimplePage {
|
|
737
|
+
static callable: string[];
|
|
738
|
+
static slug: string;
|
|
739
|
+
data: Record<string, unknown>;
|
|
740
|
+
static getLabel(): string;
|
|
741
|
+
/** Le panel accepte-t-il la création ? Par défaut : si le fournisseur de locataires sait créer. */
|
|
742
|
+
static canView(panel: Panel, _user: User): boolean | Promise<boolean>;
|
|
743
|
+
boot(): Promise<void>;
|
|
744
|
+
mount(): void;
|
|
745
|
+
getTitle(): string;
|
|
746
|
+
hasLogo(): boolean;
|
|
747
|
+
formSchema(schema: Schema): Schema;
|
|
748
|
+
contentSchema(schema: Schema): Schema;
|
|
749
|
+
protected mutateFormDataBeforeRegister(data: Record<string, unknown>): Record<string, unknown> | Promise<Record<string, unknown>>;
|
|
750
|
+
protected handleRegistration(data: Record<string, unknown>): unknown;
|
|
751
|
+
register(): Promise<void>;
|
|
752
|
+
}
|
|
753
|
+
/** Profil du locataire courant (port de EditTenantProfile), dans la mise en page complète. */
|
|
754
|
+
export declare abstract class EditTenantProfile extends Page {
|
|
755
|
+
static callable: string[];
|
|
756
|
+
static slug: string;
|
|
757
|
+
static shouldRegisterNavigation: boolean;
|
|
758
|
+
data: Record<string, unknown>;
|
|
759
|
+
static getLabel(): string;
|
|
760
|
+
static getTitle(): string;
|
|
761
|
+
protected isAccessAuthorized(ctx: PanelContext): boolean | Promise<boolean>;
|
|
762
|
+
mount(): void;
|
|
763
|
+
formSchema(schema: Schema): Schema;
|
|
764
|
+
contentSchema(schema: Schema): Schema;
|
|
765
|
+
save(): Promise<void>;
|
|
766
|
+
}
|
|
767
|
+
export declare class Login extends SimplePage {
|
|
768
|
+
static callable: string[];
|
|
769
|
+
data: Record<string, unknown>;
|
|
770
|
+
mount(): void;
|
|
771
|
+
getTitle(): string;
|
|
772
|
+
getHeading(): string;
|
|
773
|
+
getSubheading(): string | null;
|
|
774
|
+
formSchema(schema: Schema): Schema;
|
|
775
|
+
contentSchema(schema: Schema): Schema;
|
|
776
|
+
authenticate(): Promise<void>;
|
|
777
|
+
}
|
|
778
|
+
/** L'utilisateur du composant hôte a-t-il cette capacité sur la resource (ou le relation manager) du composant ? À utiliser dans `authorize()` de vos actions. */
|
|
779
|
+
export declare const can: (livewire: unknown, ability: string, record?: unknown) => Promise<boolean> | boolean;
|
|
780
|
+
/** Resource : un modèle, ses pages, sa table et sa navigation (port partiel de Filament\Resources\Resource). */
|
|
781
|
+
export declare abstract class Resource {
|
|
782
|
+
static panel: Panel;
|
|
783
|
+
static slug: string;
|
|
784
|
+
static modelLabel: string;
|
|
785
|
+
static pluralModelLabel: string | null;
|
|
786
|
+
static navigationIcon: string | null;
|
|
787
|
+
static navigationGroup: string | null;
|
|
788
|
+
static navigationSort: number;
|
|
789
|
+
static navigationBadge: string | number | null;
|
|
790
|
+
static adapter: DataAdapter;
|
|
791
|
+
/** Dans un panel à locataires : les enregistrements sont-ils propres à chaque locataire ? (vrai par défaut, comme Filament) */
|
|
792
|
+
static isScopedToTenant: boolean;
|
|
793
|
+
/** Colonne du locataire pour cette resource (par défaut celle du panel : `panel.tenant(provider, { ownershipColumn })`). */
|
|
794
|
+
static tenantOwnershipColumn: string | null;
|
|
795
|
+
/**
|
|
796
|
+
* Pages de la resource, à remplacer par vos sous-classes pour en changer le comportement :
|
|
797
|
+
* `static pages = { index: MyList, create: MyCreate, edit: MyEdit }`.
|
|
798
|
+
*/
|
|
799
|
+
static pages: {
|
|
800
|
+
index?: typeof ListRecords;
|
|
801
|
+
create?: typeof CreateRecord;
|
|
802
|
+
edit?: typeof EditRecord;
|
|
803
|
+
view?: typeof ViewRecord;
|
|
804
|
+
};
|
|
805
|
+
/** Page de consultation (`ViewRecord`) : vrai pour l'ajouter aux pages de la resource ; la ligne d'une table y mène alors, comme dans Filament. */
|
|
806
|
+
static hasViewPage: boolean;
|
|
807
|
+
/** Qui peut faire quoi sur cette resource. Sans politique, tout utilisateur connecté peut tout. */
|
|
808
|
+
static policy: Policy | null;
|
|
809
|
+
/** L'utilisateur a-t-il cette capacité (sur cet enregistrement, s'il y en a un) ? */
|
|
810
|
+
static can(ability: string, user: User | null, record?: unknown): Promise<boolean>;
|
|
811
|
+
/** Widgets de la resource (équivalent de getWidgets()) : enregistrés comme composants. */
|
|
812
|
+
static widgets: (typeof Widget)[];
|
|
813
|
+
/** Widgets affichés au-dessus de la table de la page de liste (équivalent de ListRecords::getHeaderWidgets()). */
|
|
814
|
+
static headerWidgets: (typeof Widget)[];
|
|
815
|
+
/** Relation managers affichés sous le formulaire d'édition (équivalent de getRelations()). */
|
|
816
|
+
static relations: any[];
|
|
817
|
+
/** Onglets de la page de liste (équivalent de ListRecords::getTabs()). */
|
|
818
|
+
static tabs(): Record<string, Tab>;
|
|
819
|
+
/** Resource « simple » (équivalent de ManageRecords) : une seule page, création et édition en modales. */
|
|
820
|
+
static isSimple: boolean;
|
|
821
|
+
static getPluralModelLabel(): string;
|
|
822
|
+
static getTitleCasePluralModelLabel(): string;
|
|
823
|
+
static getUrl(page?: string, record?: string | number): string;
|
|
824
|
+
/** Pages d'enregistrements liés (port de ManageRelatedRecords) : `{ comments: ManagePostComments }` répond sous `<slug>/{record}/comments`. */
|
|
825
|
+
static relatedPages: Record<string, typeof ManageRelatedRecords>;
|
|
826
|
+
/** Pages proposées dans la sous-navigation d'un enregistrement, dans l'ordre : `['view', 'edit', 'comments']`. Vide : pas de sous-navigation. */
|
|
827
|
+
static recordSubNavigation: string[];
|
|
828
|
+
/** Port de getRecordSubNavigation() + generateNavigationItems() : un onglet par page déclarée, celui de la page courante actif. */
|
|
829
|
+
static getRecordSubNavigation(page: {
|
|
830
|
+
getRecordKey(): string | null;
|
|
831
|
+
constructor: Function;
|
|
832
|
+
}): SubNavigationItem[];
|
|
833
|
+
private static _registered;
|
|
834
|
+
/** Classe de page réellement enregistrée pour un nom (les pages sont générées une seule fois par resource). */
|
|
835
|
+
static getRegisteredPage(name: string): typeof Page | undefined;
|
|
836
|
+
static table(table: Table): Table;
|
|
837
|
+
static form(schema: Schema): Schema;
|
|
838
|
+
/** Schéma de la page de consultation (équivalent de `infolist()`). */
|
|
839
|
+
static infolist(schema: Schema): Schema;
|
|
840
|
+
/** Colonnes interrogées par la recherche globale ; par défaut, l'attribut de titre. Tableau vide : resource non cherchable. */
|
|
841
|
+
static globallySearchableAttributes: string[] | null;
|
|
842
|
+
static getGloballySearchableAttributes(): string[];
|
|
843
|
+
static canGloballySearch(): boolean;
|
|
844
|
+
/** Rang du groupe de cette resource dans les résultats (`$globalSearchSort`) ; sans rang : après les autres, dans l'ordre d'enregistrement. */
|
|
845
|
+
static globalSearchSort: number | null;
|
|
846
|
+
/** Nombre de résultats rendus par resource (50, comme Filament). */
|
|
847
|
+
static globalSearchResultsLimit: number;
|
|
848
|
+
static getGlobalSearchResultTitle(record: any): string;
|
|
849
|
+
/** Précisions affichées sous le titre : `{ Author: 'Jane' }`. Les valeurs vides sont écartées. */
|
|
850
|
+
static getGlobalSearchResultDetails(_record: any): Record<string, unknown> | Promise<Record<string, unknown>>;
|
|
851
|
+
/** Adresse d'un résultat : page « View », sinon édition ; pour une resource simple, la liste avec l'action ouverte. Nul si l'utilisateur n'a aucun accès. */
|
|
852
|
+
static getGlobalSearchResultUrl(record: any, user: User | null): Promise<string | null>;
|
|
853
|
+
static getGlobalSearchResults(search: string, user: User | null): Promise<GlobalSearchResult[]>;
|
|
854
|
+
/** Attribut affiché comme titre d'un enregistrement (`$recordTitleAttribute`). */
|
|
855
|
+
static recordTitleAttribute: string | null;
|
|
856
|
+
/** Sans attribut de titre : le libellé du modèle, en capitales initiales (« Leave Request »), comme Filament. */
|
|
857
|
+
static getRecordTitle(record: any): string;
|
|
858
|
+
/** Pages de la resource, générées : liste, création, édition. */
|
|
859
|
+
static getPages(): Record<string, typeof Page>;
|
|
860
|
+
private static buildPages;
|
|
861
|
+
}
|
|
862
|
+
/** Onglet de sous-navigation d'une page. */
|
|
863
|
+
export type SubNavigationItem = {
|
|
864
|
+
label: string;
|
|
865
|
+
icon: string | null;
|
|
866
|
+
url: string;
|
|
867
|
+
active: boolean;
|
|
868
|
+
};
|
|
869
|
+
type ColumnSpan = number | 'full';
|
|
870
|
+
/** Widget : composant affiché dans une grille de page (port de Filament\Widgets\Widget). */
|
|
871
|
+
export declare abstract class Widget extends Component {
|
|
872
|
+
static componentName: string;
|
|
873
|
+
/** Largeur dans la grille de widgets : un nombre de colonnes, ou `'full'`. */
|
|
874
|
+
static columnSpan: ColumnSpan;
|
|
875
|
+
/** Chargé quand il devient visible (comme `$isLazy`). */
|
|
876
|
+
static isLazy: boolean;
|
|
877
|
+
get panel(): Panel;
|
|
878
|
+
/** Widget réservé à certains utilisateurs : rendre `false` le retire de la page et refuse son chargement. */
|
|
879
|
+
static canView(_user: User): boolean | Promise<boolean>;
|
|
880
|
+
boot(): Promise<void>;
|
|
881
|
+
/** Classes et style de colonne de grille, au point de rupture `lg` comme Filament. */
|
|
882
|
+
protected gridColumn(): {
|
|
883
|
+
classes: string[];
|
|
884
|
+
style: string;
|
|
885
|
+
};
|
|
886
|
+
placeholder(): string;
|
|
887
|
+
/** Enveloppe commune (port de filament-widgets::components.widget). */
|
|
888
|
+
protected wrap(content: string, classes?: string[]): string;
|
|
889
|
+
}
|
|
890
|
+
/**
|
|
891
|
+
* Calendrier (propre à Navette) : vues mois, semaine et liste, navigation rendue par le serveur, sans bibliothèque JavaScript.
|
|
892
|
+
*
|
|
893
|
+
* Le minimum : étendre la classe et rendre les événements de la période affichée.
|
|
894
|
+
*
|
|
895
|
+
* class LeaveCalendar extends CalendarWidget {
|
|
896
|
+
* static heading = 'Leave';
|
|
897
|
+
* async getEvents({ start, end }) { return [{ id: 1, title: 'Ada — vacation', start: '2026-11-12', end: '2026-11-14', color: 'success' }]; }
|
|
898
|
+
* }
|
|
899
|
+
*
|
|
900
|
+
* Tout le reste se redéfinit méthode par méthode : vues proposées, premier jour de la semaine, langue, libellés, nombre
|
|
901
|
+
* d'événements par case, réaction au clic sur un jour (`onDateClick`) ou sur un événement (`onEventClick`), rendu d'un
|
|
902
|
+
* événement (`renderEvent`), pied de case (`renderDayFooter`), boutons de la barre d'outils (`renderToolbarEnd`), et
|
|
903
|
+
* l'apparence par les variables CSS de `.nv-cal` (`getExtraClasses`, `getStyle`).
|
|
904
|
+
*/
|
|
905
|
+
export declare abstract class CalendarWidget extends Widget {
|
|
906
|
+
static columnSpan: ColumnSpan;
|
|
907
|
+
/** Titre affiché avant la période (« Leave — November 2026 »). */
|
|
908
|
+
static heading: string | null;
|
|
909
|
+
static callable: string[];
|
|
910
|
+
/** La vue et la date ne changent que par les méthodes ci-dessous, qui les valident. */
|
|
911
|
+
static locked: string[];
|
|
912
|
+
view: CalendarView;
|
|
913
|
+
/** Date d'ancrage (`YYYY-MM-DD`) : le mois ou la semaine affichés la contiennent. Vide : aujourd'hui. */
|
|
914
|
+
date: string;
|
|
915
|
+
/** Événements dont une partie tombe entre `start` et `end` (inclus, `YYYY-MM-DD`). Appelée à chaque rendu : filtrez en base. */
|
|
916
|
+
abstract getEvents(range: {
|
|
917
|
+
start: string;
|
|
918
|
+
end: string;
|
|
919
|
+
view: CalendarView;
|
|
920
|
+
}): CalendarEvent[] | Promise<CalendarEvent[]>;
|
|
921
|
+
/** Vues proposées, la première étant celle d'arrivée. Une seule vue : le sélecteur disparaît. */
|
|
922
|
+
getViews(): CalendarView[];
|
|
923
|
+
/** 0 = dimanche, 1 = lundi… */
|
|
924
|
+
getFirstDayOfWeek(): number;
|
|
925
|
+
/** Langue des noms de mois et de jours (`Intl`). */
|
|
926
|
+
getLocale(): string;
|
|
927
|
+
getLabels(): CalendarLabels;
|
|
928
|
+
/** En vue mois, au-delà de ce nombre, la case affiche « +N more » (qui ouvre la liste sur ce jour). */
|
|
929
|
+
getMaxEventsPerDay(): number;
|
|
930
|
+
getHeading(): string | null;
|
|
931
|
+
/** Date du jour, `YYYY-MM-DD` (UTC par défaut ; à redéfinir pour un autre fuseau). */
|
|
932
|
+
getToday(): string;
|
|
933
|
+
/** Clic sur un numéro de jour. Redéfinir cette méthode rend les jours cliquables : ouvrir une page (`this.redirect`), notifier, changer de vue… */
|
|
934
|
+
onDateClick(_date: string): void | Promise<void>;
|
|
935
|
+
/** Clic sur un événement sans adresse. L'événement est relu côté serveur : `event.extra` est disponible. */
|
|
936
|
+
onEventClick(_event: CalendarEvent): void | Promise<void>;
|
|
937
|
+
/** HTML d'un événement (déjà échappé), ou `null` pour le rendu par défaut (`renderCalendarEvent`). */
|
|
938
|
+
renderEvent(_event: CalendarEvent, _context: {
|
|
939
|
+
day: string;
|
|
940
|
+
view: CalendarView;
|
|
941
|
+
}): string | null;
|
|
942
|
+
/** HTML ajouté au bas de chaque case (déjà échappé). */
|
|
943
|
+
renderDayFooter(_day: string, _events: CalendarEvent[]): string;
|
|
944
|
+
/** HTML placé à droite de la barre d'outils (déjà échappé) : un lien « New », un filtre… */
|
|
945
|
+
renderToolbarEnd(): string;
|
|
946
|
+
/** Classes ajoutées au calendrier, pour y accrocher vos styles ou redéfinir ses variables CSS. */
|
|
947
|
+
getExtraClasses(): string[];
|
|
948
|
+
/** Variables CSS posées sur le calendrier : `{ '--nv-cal-day-min-height': '9rem' }`. */
|
|
949
|
+
getStyle(): Record<string, string>;
|
|
950
|
+
private anchor;
|
|
951
|
+
private currentView;
|
|
952
|
+
private shift;
|
|
953
|
+
previousPeriod(): void;
|
|
954
|
+
nextPeriod(): void;
|
|
955
|
+
goToToday(): void;
|
|
956
|
+
setView(view: unknown): void;
|
|
957
|
+
/** « +N more » : la liste, ancrée sur ce jour (ou la semaine si la liste n'est pas proposée). */
|
|
958
|
+
showDay(date: unknown): void;
|
|
959
|
+
private datesClickable;
|
|
960
|
+
private eventsClickable;
|
|
961
|
+
selectDate(date: unknown): Promise<void>;
|
|
962
|
+
/** L'identifiant vient du navigateur : l'événement est recherché parmi ceux de la période affichée, jamais cru sur parole. */
|
|
963
|
+
selectEvent(id: unknown): Promise<void>;
|
|
964
|
+
render(): Promise<string>;
|
|
965
|
+
}
|
|
966
|
+
/**
|
|
967
|
+
* Page calendrier (propre à Navette) : le même calendrier que `CalendarWidget`, sur une page entière, avec les actions de
|
|
968
|
+
* Filament — donc des modales, des formulaires, des confirmations, des panneaux latéraux.
|
|
969
|
+
*
|
|
970
|
+
* class Planning extends CalendarPage {
|
|
971
|
+
* static slug = 'planning';
|
|
972
|
+
* async getEvents({ start, end }) { return db('shifts').where('day', '>=', start).where('day', '<=', end)… }
|
|
973
|
+
* // Clic sur un jour : une modale avec un formulaire, prérempli avec la date.
|
|
974
|
+
* dateAction() {
|
|
975
|
+
* return Action.make('createShift').modalHeading('New shift')
|
|
976
|
+
* .schema([Select.make('employee_id').options(…).required(), DatePicker.make('day').required()])
|
|
977
|
+
* .fillForm(({ arguments: args }) => ({ day: CalendarPage.dateOf(args) }))
|
|
978
|
+
* .action(async ({ data }) => { await db('shifts').insert(data); Notification.make().success().title('Saved').send(); });
|
|
979
|
+
* }
|
|
980
|
+
* // Clic sur un événement : une autre action ; l'événement est relu côté serveur.
|
|
981
|
+
* eventAction() {
|
|
982
|
+
* return Action.make('editShift').schema([…])
|
|
983
|
+
* .fillForm(async ({ livewire, arguments: args }) => (await livewire.findEvent(args.event))?.extra ?? {})
|
|
984
|
+
* .action(async ({ livewire, arguments: args, data }) => { const event = await livewire.findEvent(args.event); if (event) await db('shifts').where({ id: event.id }).update(data); });
|
|
985
|
+
* }
|
|
986
|
+
* }
|
|
987
|
+
*
|
|
988
|
+
* Trois façons de réagir à un clic, au choix : une **adresse** sur l'événement (`url` : page dédiée), une **action** (modale),
|
|
989
|
+
* ou du **code libre** en redéfinissant `onDateClick()` / `onEventClick()` (rediriger, notifier, écrire en base, monter l'action
|
|
990
|
+
* de son choix avec `this.mountAction(nom, arguments)`). `getHeaderActions()` ajoute des boutons en tête de page, et
|
|
991
|
+
* `getCalendarActions()` déclare d'autres actions montables depuis votre propre rendu (`renderEvent`, `renderToolbarEnd`).
|
|
992
|
+
*/
|
|
993
|
+
export declare abstract class CalendarPage extends Page {
|
|
994
|
+
static callable: string[];
|
|
995
|
+
static locked: string[];
|
|
996
|
+
view: CalendarView;
|
|
997
|
+
date: string;
|
|
998
|
+
abstract getEvents(range: {
|
|
999
|
+
start: string;
|
|
1000
|
+
end: string;
|
|
1001
|
+
view: CalendarView;
|
|
1002
|
+
}): CalendarEvent[] | Promise<CalendarEvent[]>;
|
|
1003
|
+
getViews(): CalendarView[];
|
|
1004
|
+
getFirstDayOfWeek(): number;
|
|
1005
|
+
getLocale(): string;
|
|
1006
|
+
getLabels(): CalendarLabels;
|
|
1007
|
+
getMaxEventsPerDay(): number;
|
|
1008
|
+
getCalendarHeading(): string | null;
|
|
1009
|
+
getToday(): string;
|
|
1010
|
+
renderEvent(_event: CalendarEvent, _context: {
|
|
1011
|
+
day: string;
|
|
1012
|
+
view: CalendarView;
|
|
1013
|
+
}): string | null;
|
|
1014
|
+
renderDayFooter(_day: string, _events: CalendarEvent[]): string;
|
|
1015
|
+
renderToolbarEnd(): string;
|
|
1016
|
+
getExtraClasses(): string[];
|
|
1017
|
+
getStyle(): Record<string, string>;
|
|
1018
|
+
/** Action ouverte au clic sur un jour ; elle reçoit `arguments.date`. Nul : les jours ne sont pas cliquables (sauf `onDateClick` redéfini). */
|
|
1019
|
+
dateAction(): Action | null;
|
|
1020
|
+
/** Action ouverte au clic sur un événement sans adresse ; elle reçoit `arguments.event` (identifiant, à relire avec `findEvent`). */
|
|
1021
|
+
eventAction(): Action | null;
|
|
1022
|
+
/** Autres actions montables depuis votre propre HTML : `wire:click="mountAction('nom', { … })"`. */
|
|
1023
|
+
getCalendarActions(): Action[];
|
|
1024
|
+
/** Par défaut : ouvre `dateAction()`. À redéfinir pour faire autre chose (rediriger vers une page de création, par exemple). */
|
|
1025
|
+
onDateClick(date: string): Promise<void>;
|
|
1026
|
+
/** Par défaut : ouvre `eventAction()`. L'événement a été retrouvé côté serveur avant l'appel. */
|
|
1027
|
+
onEventClick(event: CalendarEvent): Promise<void>;
|
|
1028
|
+
/** Date d'un clic, relue dans les arguments d'une action : ils viennent du navigateur, seule une vraie date est rendue. */
|
|
1029
|
+
static dateOf(args: Record<string, unknown> | null | undefined): string | null;
|
|
1030
|
+
/** Événement de la période affichée portant cet identifiant, ou nul : ne jamais agir sur un identifiant reçu sans passer par ici. */
|
|
1031
|
+
findEvent(id: unknown): Promise<CalendarEvent | null>;
|
|
1032
|
+
protected getMountableActions(context: Record<string, unknown>): Promise<Action[]>;
|
|
1033
|
+
private firstDay;
|
|
1034
|
+
private anchor;
|
|
1035
|
+
private currentView;
|
|
1036
|
+
private shift;
|
|
1037
|
+
previousPeriod(): void;
|
|
1038
|
+
nextPeriod(): void;
|
|
1039
|
+
goToToday(): void;
|
|
1040
|
+
setView(view: unknown): void;
|
|
1041
|
+
showDay(date: unknown): void;
|
|
1042
|
+
private datesClickable;
|
|
1043
|
+
private eventsClickable;
|
|
1044
|
+
selectDate(date: unknown): Promise<void>;
|
|
1045
|
+
selectEvent(id: unknown): Promise<void>;
|
|
1046
|
+
protected renderContent(): Promise<string>;
|
|
1047
|
+
}
|
|
1048
|
+
/** Compte de l'utilisateur connecté : avatar, nom, déconnexion (port de Filament\Widgets\AccountWidget). */
|
|
1049
|
+
export declare class AccountWidget extends Widget {
|
|
1050
|
+
static isLazy: boolean;
|
|
1051
|
+
render(): string;
|
|
1052
|
+
}
|
|
1053
|
+
/** Version de Navette et liens utiles (pendant de Filament\Widgets\FilamentInfoWidget, dont il reprend le balisage et les classes). */
|
|
1054
|
+
export declare class NavetteInfoWidget extends Widget {
|
|
1055
|
+
static isLazy: boolean;
|
|
1056
|
+
static homeUrl: string;
|
|
1057
|
+
static documentationUrl: string;
|
|
1058
|
+
static githubUrl: string;
|
|
1059
|
+
static version: string;
|
|
1060
|
+
render(): string;
|
|
1061
|
+
}
|
|
1062
|
+
/** Une statistique d'un StatsOverviewWidget (port de Stat). */
|
|
1063
|
+
export declare class Stat {
|
|
1064
|
+
private _description;
|
|
1065
|
+
private _descriptionIcon;
|
|
1066
|
+
private _descriptionIconPosition;
|
|
1067
|
+
private _color;
|
|
1068
|
+
private _icon;
|
|
1069
|
+
private _chart;
|
|
1070
|
+
private _url;
|
|
1071
|
+
private label;
|
|
1072
|
+
private value;
|
|
1073
|
+
constructor(label: string, value: string | number | null);
|
|
1074
|
+
static make(label: string, value: string | number | null): Stat;
|
|
1075
|
+
description(text: string | null): this;
|
|
1076
|
+
descriptionIcon(name: string | null, position?: 'before' | 'after'): this;
|
|
1077
|
+
/** Couleur de la description et de la courbe. */
|
|
1078
|
+
color(color: string | null): this;
|
|
1079
|
+
icon(name: string | null): this;
|
|
1080
|
+
/** Courbe de tendance : une liste de valeurs, ou des valeurs par libellé. */
|
|
1081
|
+
chart(values: Record<string, number> | number[] | null): this;
|
|
1082
|
+
url(url: string | null): this;
|
|
1083
|
+
hasChart(): boolean;
|
|
1084
|
+
toHtml(panel: Panel, key: string): string;
|
|
1085
|
+
}
|
|
1086
|
+
/** Rangée de statistiques (port de StatsOverviewWidget). */
|
|
1087
|
+
export declare abstract class StatsOverviewWidget extends Widget {
|
|
1088
|
+
static columnSpan: ColumnSpan;
|
|
1089
|
+
/** Intervalle de rafraîchissement (`'5s'` dans Filament par défaut), ou null pour ne pas rafraîchir. */
|
|
1090
|
+
static pollingInterval: string | null;
|
|
1091
|
+
abstract getStats(): Stat[] | Promise<Stat[]>;
|
|
1092
|
+
/** Colonnes de la rangée : comme Filament, trois, ou quatre quand le nombre de statistiques s'y prête. */
|
|
1093
|
+
protected getColumns(count: number): number;
|
|
1094
|
+
render(): Promise<string>;
|
|
1095
|
+
}
|
|
1096
|
+
/** Données d'un graphique, au format de Chart.js : `{ datasets: [{ label, data, … }], labels: [...] }`. */
|
|
1097
|
+
export type ChartData = {
|
|
1098
|
+
datasets?: Record<string, unknown>[];
|
|
1099
|
+
labels?: unknown[];
|
|
1100
|
+
[key: string]: unknown;
|
|
1101
|
+
};
|
|
1102
|
+
/**
|
|
1103
|
+
* Graphique Chart.js (port de Filament\Widgets\ChartWidget). Une sous-classe donne `getType()` (`'line'`, `'bar'`, `'pie'`,
|
|
1104
|
+
* `'doughnut'`, `'radar'`, `'polarArea'`, `'scatter'`, `'bubble'`) et `getData()`. Le rendu est fait dans le navigateur par le
|
|
1105
|
+
* composant `chart.js` de Filament ; le serveur n'envoie de nouvelles données que si elles ont changé (somme de contrôle).
|
|
1106
|
+
*/
|
|
1107
|
+
export declare abstract class ChartWidget extends Widget {
|
|
1108
|
+
static callable: string[];
|
|
1109
|
+
static locked: string[];
|
|
1110
|
+
/** Intervalle de rafraîchissement (`'5s'` par défaut dans Filament), ou null pour ne pas rafraîchir. */
|
|
1111
|
+
static pollingInterval: string | null;
|
|
1112
|
+
static heading: string | null;
|
|
1113
|
+
static description: string | null;
|
|
1114
|
+
/** Couleur des séries qui n'en précisent pas. */
|
|
1115
|
+
static color: string;
|
|
1116
|
+
/** Hauteur maximale du graphique (`'300px'`). */
|
|
1117
|
+
static maxHeight: string | null;
|
|
1118
|
+
static isCollapsible: boolean;
|
|
1119
|
+
dataChecksum: string | null;
|
|
1120
|
+
/** Filtre choisi, parmi `getFilters()`. */
|
|
1121
|
+
filter: string | null;
|
|
1122
|
+
private _cachedData;
|
|
1123
|
+
abstract getType(): string;
|
|
1124
|
+
getData(): ChartData | Promise<ChartData>;
|
|
1125
|
+
/** Options de Chart.js. */
|
|
1126
|
+
getOptions(): Record<string, unknown> | null;
|
|
1127
|
+
/** Filtres proposés dans l'en-tête : valeur vers libellé. */
|
|
1128
|
+
getFilters(): Record<string, string> | null;
|
|
1129
|
+
getHeading(): string | null;
|
|
1130
|
+
getDescription(): string | null;
|
|
1131
|
+
getColor(): string;
|
|
1132
|
+
getMaxHeight(): string | null;
|
|
1133
|
+
/** Texte lu par les lecteurs d'écran à la place du graphique. */
|
|
1134
|
+
getChartAssistiveContent(): string | null;
|
|
1135
|
+
protected getCachedData(): Promise<ChartData>;
|
|
1136
|
+
protected generateDataChecksum(): Promise<string>;
|
|
1137
|
+
mount(): Promise<void>;
|
|
1138
|
+
/** Appelé par le rafraîchissement périodique et avant chaque rendu : n'émet les données que si elles ont changé. */
|
|
1139
|
+
updateChartData(): Promise<void>;
|
|
1140
|
+
render(): Promise<string>;
|
|
1141
|
+
}
|
|
1142
|
+
/**
|
|
1143
|
+
* Table dans un widget (port de Filament\Widgets\TableWidget) : recherche, tri, pagination simple (précédent / suivant).
|
|
1144
|
+
* Une sous-classe donne `table(table)` et `getDataAdapterForTable()`. Pas d'actions ni de filtres pour l'instant.
|
|
1145
|
+
*/
|
|
1146
|
+
export declare abstract class TableWidget extends Widget implements TableHost {
|
|
1147
|
+
static columnSpan: ColumnSpan;
|
|
1148
|
+
static callable: string[];
|
|
1149
|
+
/** Titre de la table ; par défaut tiré du nom de la classe (`FlaggedOrders` : « Flagged Orders »). */
|
|
1150
|
+
static heading: string | null;
|
|
1151
|
+
tableSearch: string;
|
|
1152
|
+
tableSort: string | null;
|
|
1153
|
+
tableColumnSearches: Record<string, string>;
|
|
1154
|
+
tableRecordsPerPage: number;
|
|
1155
|
+
paginators: Record<string, number>;
|
|
1156
|
+
tableColumns: ColumnState[];
|
|
1157
|
+
abstract table(table: Table<any>): Table<any>;
|
|
1158
|
+
abstract getDataAdapterForTable(): DataAdapter;
|
|
1159
|
+
getTableHeading(): string;
|
|
1160
|
+
getTable(): Table<any>;
|
|
1161
|
+
mount(): void;
|
|
1162
|
+
tableGrouping: string | null;
|
|
1163
|
+
sortTable(column?: string | null, direction?: string | null): void;
|
|
1164
|
+
gotoPage(page: number, _pageName?: string): void;
|
|
1165
|
+
nextPage(_pageName?: string): void;
|
|
1166
|
+
previousPage(_pageName?: string): void;
|
|
1167
|
+
applyTableColumnManager(state?: unknown, _wasReordered?: unknown): void;
|
|
1168
|
+
resetTableColumnManager(): void;
|
|
1169
|
+
updatedTableSearch(): void;
|
|
1170
|
+
updatedTableColumnSearches(): void;
|
|
1171
|
+
updatedTableRecordsPerPage(): void;
|
|
1172
|
+
updatedTableSort(): void;
|
|
1173
|
+
render(): Promise<string>;
|
|
1174
|
+
}
|
|
1175
|
+
/** Widgets qui reçoivent les filtres du tableau de bord (port de InteractsWithPageFilters) : `static reactive = PAGE_FILTERS` et une propriété `pageFilters`. */
|
|
1176
|
+
export declare const PAGE_FILTERS: string[];
|
|
1177
|
+
/**
|
|
1178
|
+
* Widget de statistiques lié à la table d'une page de liste (port de InteractsWithPageTable) : il reçoit l'état de la table
|
|
1179
|
+
* (recherche, filtres, onglet…) et peut agréger exactement les enregistrements qu'elle affiche.
|
|
1180
|
+
*/
|
|
1181
|
+
export declare abstract class PageTableStatsWidget extends StatsOverviewWidget {
|
|
1182
|
+
/** Page de liste dont la table est observée (équivalent de getTablePage()). */
|
|
1183
|
+
static tablePage: () => typeof ListRecords;
|
|
1184
|
+
static reactive: string[];
|
|
1185
|
+
activeTab: string | null;
|
|
1186
|
+
paginators: Record<string, number>;
|
|
1187
|
+
tableColumnSearches: Record<string, string>;
|
|
1188
|
+
tableFilters: Record<string, FilterState>;
|
|
1189
|
+
tableRecordsPerPage: number;
|
|
1190
|
+
tableSearch: string;
|
|
1191
|
+
tableSort: string | null;
|
|
1192
|
+
/** Agrégats sur la requête courante de la table. L'état reçu passe par la même validation que sur la page. */
|
|
1193
|
+
protected aggregatePageTable(columns?: {
|
|
1194
|
+
sum?: string[];
|
|
1195
|
+
avg?: string[];
|
|
1196
|
+
}, modify?: ((query: any) => void) | null): Promise<{
|
|
1197
|
+
count: number;
|
|
1198
|
+
sum: Record<string, number>;
|
|
1199
|
+
avg: Record<string, number>;
|
|
1200
|
+
}>;
|
|
1201
|
+
/** Tendance mensuelle sur la requête courante de la table (voir `ObjectionAdapter.trendPerMonth`). */
|
|
1202
|
+
protected trendPageTable(options: {
|
|
1203
|
+
start: Date;
|
|
1204
|
+
end: Date;
|
|
1205
|
+
dateColumn?: string;
|
|
1206
|
+
average?: string;
|
|
1207
|
+
modify?: (query: any) => void;
|
|
1208
|
+
}): Promise<number[]>;
|
|
1209
|
+
}
|
|
1210
|
+
/** Composant de schéma qui intègre la table du composant hôte (port de EmbeddedTable). */
|
|
1211
|
+
export declare class EmbeddedTable extends SchemaComponent {
|
|
1212
|
+
static make(): EmbeddedTable;
|
|
1213
|
+
toHtml(): Promise<string>;
|
|
1214
|
+
}
|
|
1215
|
+
/** Onglet d'une page de liste : restreint la requête de la table et peut afficher un compteur (port de Tab). */
|
|
1216
|
+
export declare class Tab {
|
|
1217
|
+
private _label;
|
|
1218
|
+
private _badge;
|
|
1219
|
+
private _badgeColor;
|
|
1220
|
+
private _hasBadgeColor;
|
|
1221
|
+
private _query;
|
|
1222
|
+
constructor(label?: string | null);
|
|
1223
|
+
static make(label?: string | null): Tab;
|
|
1224
|
+
/** Compteur, calculé après l'affichage de la page (comme `lazyLoadedBadge()`). */
|
|
1225
|
+
badge(resolver: () => number | string | null | Promise<number | string | null>): this;
|
|
1226
|
+
badgeColor(color: string): this;
|
|
1227
|
+
query(modifier: (query: any) => void): this;
|
|
1228
|
+
getLabel(key: string): string;
|
|
1229
|
+
hasBadge(): boolean;
|
|
1230
|
+
getBadge(): Promise<number | string | null>;
|
|
1231
|
+
getBadgeColor(): string;
|
|
1232
|
+
/** Faux tant que `badgeColor()` n'a pas été appelé : un badge chargé après coup ne reçoit alors aucune classe de couleur, comme dans Filament. */
|
|
1233
|
+
hasBadgeColor(): boolean;
|
|
1234
|
+
getQuery(): ((query: any) => void) | null;
|
|
1235
|
+
}
|
|
1236
|
+
/** Page de liste d'une resource : état de table et méthodes appelées par le navigateur (port de ListRecords + InteractsWithTable). */
|
|
1237
|
+
export declare class ListRecords extends Page implements TableHost {
|
|
1238
|
+
static callable: string[];
|
|
1239
|
+
static resource: typeof Resource;
|
|
1240
|
+
tableSearch: string;
|
|
1241
|
+
tableSort: string | null;
|
|
1242
|
+
tableColumnSearches: Record<string, string>;
|
|
1243
|
+
tableRecordsPerPage: number;
|
|
1244
|
+
paginators: Record<string, number>;
|
|
1245
|
+
selectedTableRecords: string[];
|
|
1246
|
+
deselectedTableRecords: string[];
|
|
1247
|
+
isTrackingDeselectedTableRecords: boolean;
|
|
1248
|
+
tableFilters: Record<string, FilterState>;
|
|
1249
|
+
tableDeferredFilters: Record<string, FilterState>;
|
|
1250
|
+
tableColumns: ColumnState[];
|
|
1251
|
+
isTableReordering: boolean;
|
|
1252
|
+
/** Regroupement courant de la table (`identifiant:direction`), choisi dans la barre d'outils. */
|
|
1253
|
+
tableGrouping: string | null;
|
|
1254
|
+
updatedTableGrouping(): void;
|
|
1255
|
+
/** Entre dans le mode « tri manuel » ou en sort (port de toggleTableReordering). */
|
|
1256
|
+
toggleTableReordering(): Promise<void>;
|
|
1257
|
+
/** Enregistre le nouvel ordre : seules les clés de la table sont retenues, chacune reçoit son rang (port de reorderTable). */
|
|
1258
|
+
reorderTable(order: unknown, _draggedRecordKey?: unknown): Promise<void>;
|
|
1259
|
+
mount(_params?: Record<string, unknown>): Promise<void>;
|
|
1260
|
+
/** Formulaire des filtres : un groupe par filtre, lié à `tableDeferredFilters.<filtre>`. */
|
|
1261
|
+
tableFiltersFormSchema(schema: Schema): Schema;
|
|
1262
|
+
applyTableFilters(): void;
|
|
1263
|
+
/** Retrait d'un indicateur de filtre actif : le champ visé est effacé de l'état appliqué et du formulaire. */
|
|
1264
|
+
removeTableFilter(filterName: unknown, field?: unknown): void;
|
|
1265
|
+
/** Champ réactif du formulaire des filtres (changement d'opérateur d'une règle) : exécute son `afterStateUpdated`. */
|
|
1266
|
+
updatedTableDeferredFilters(_value: unknown, key: string | null): Promise<void>;
|
|
1267
|
+
resetTableFiltersForm(): void;
|
|
1268
|
+
removeTableFilters(): void;
|
|
1269
|
+
applyTableColumnManager(state?: unknown, _wasReordered?: unknown): void;
|
|
1270
|
+
resetTableColumnManager(): void;
|
|
1271
|
+
activeTab: string | null;
|
|
1272
|
+
getTabs(): Record<string, Tab>;
|
|
1273
|
+
/** Onglet actif, ramené à une clé déclarée (une valeur inconnue envoyée par le navigateur vaut l'onglet par défaut). */
|
|
1274
|
+
getActiveTabKey(): string;
|
|
1275
|
+
updatedActiveTab(): void;
|
|
1276
|
+
modifyTableQuery(query: {
|
|
1277
|
+
modifiers?: ((q: any) => void)[];
|
|
1278
|
+
}): void;
|
|
1279
|
+
get resource(): typeof Resource;
|
|
1280
|
+
getHeaderWidgets(): (typeof Widget)[];
|
|
1281
|
+
/** Port de ExposesTableToWidgets : l'état de la table est passé aux widgets, qui peuvent refaire la même requête. */
|
|
1282
|
+
getWidgetData(): Record<string, unknown>;
|
|
1283
|
+
protected rendersActionModalsInPage(): boolean;
|
|
1284
|
+
getBulkActions(): Action[];
|
|
1285
|
+
/** Actions de ligne déclarées par la table, groupes dépliés. */
|
|
1286
|
+
getRecordActions(): Action[];
|
|
1287
|
+
protected getMountableActions(context: Record<string, unknown>): Action[] | Promise<Action[]>;
|
|
1288
|
+
/** Seules les formes de contexte connues sont retenues ; la clé d'enregistrement est revérifiée en base au montage. */
|
|
1289
|
+
protected resolveMountContext(clientContext: unknown): Record<string, unknown>;
|
|
1290
|
+
protected resolveActionRecord(context: Record<string, unknown>): Promise<unknown>;
|
|
1291
|
+
/**
|
|
1292
|
+
* Écriture d'une cellule modifiable (port de `updateTableColumnState`). Tout vient du navigateur : la colonne doit exister, être
|
|
1293
|
+
* modifiable et visible, l'enregistrement être dans la portée de la table et modifiable par l'utilisateur, la valeur être valide.
|
|
1294
|
+
*/
|
|
1295
|
+
updateTableColumnState(columnName: unknown, recordKey: unknown, input: unknown): Promise<unknown>;
|
|
1296
|
+
/** Clés sélectionnées : la liste envoyée, ou — en mode « tout sélectionner » — tous les enregistrements de la requête courante sauf ceux désélectionnés. */
|
|
1297
|
+
getSelectedRecordKeys(): Promise<string[]>;
|
|
1298
|
+
deselectAllTableRecords(): void;
|
|
1299
|
+
getTable(): Table;
|
|
1300
|
+
renderTable(): Promise<string>;
|
|
1301
|
+
/** Actions affichées dans l'en-tête de la table (aucune pour une page de liste : elles sont dans l'en-tête de page). */
|
|
1302
|
+
protected renderTableHeaderActions(ctx: any): Promise<string[]>;
|
|
1303
|
+
sortTable(column?: string | null, direction?: string | null): void;
|
|
1304
|
+
gotoPage(page: number, _pageName?: string): void;
|
|
1305
|
+
nextPage(_pageName?: string): void;
|
|
1306
|
+
previousPage(_pageName?: string): void;
|
|
1307
|
+
updatedTableSearch(): void;
|
|
1308
|
+
getDataAdapterForTable(): DataAdapter;
|
|
1309
|
+
getDataAdapter(): DataAdapter;
|
|
1310
|
+
updatedTableColumnSearches(): void;
|
|
1311
|
+
updatedTableRecordsPerPage(): void;
|
|
1312
|
+
updatedTableSort(): void;
|
|
1313
|
+
getBreadcrumbs(): {
|
|
1314
|
+
label: string;
|
|
1315
|
+
url: string | null;
|
|
1316
|
+
}[];
|
|
1317
|
+
getHeaderActions(): Action[];
|
|
1318
|
+
getPageClasses(): string[];
|
|
1319
|
+
contentSchema(schema: Schema): Schema;
|
|
1320
|
+
}
|
|
1321
|
+
/**
|
|
1322
|
+
* Table des enregistrements liés à un autre (port de RelationManager) : composant enfant de la page d'édition, chargé quand il devient visible.
|
|
1323
|
+
* Les sous-classes déclarent `relationship`, `adapterFor()`, `table()` et `form()`.
|
|
1324
|
+
*/
|
|
1325
|
+
export declare class RelationManager extends ListRecords {
|
|
1326
|
+
static relationship: string;
|
|
1327
|
+
static modelLabel: string;
|
|
1328
|
+
static pluralModelLabel: string | null;
|
|
1329
|
+
static recordTitleAttribute: string | null;
|
|
1330
|
+
/** Adaptateur limité aux enregistrements liés au propriétaire donné. */
|
|
1331
|
+
static adapterFor(_ownerKey: string): DataAdapter;
|
|
1332
|
+
/** Politique des enregistrements liés (mêmes capacités que celle d'une resource). */
|
|
1333
|
+
static policy: Policy | null;
|
|
1334
|
+
protected isAccessAuthorized(ctx: PanelContext): Promise<boolean>;
|
|
1335
|
+
static table(table: Table): Table;
|
|
1336
|
+
static form(schema: Schema): Schema;
|
|
1337
|
+
static getTitle(): string;
|
|
1338
|
+
/** Clé de l'enregistrement propriétaire : fixée au montage par la page, jamais modifiable depuis le navigateur. */
|
|
1339
|
+
ownerRecord: string;
|
|
1340
|
+
static locked: string[];
|
|
1341
|
+
_facade: any;
|
|
1342
|
+
/** Ce que ListRecords attend d'une resource, fourni ici par le relation manager. */
|
|
1343
|
+
get resource(): any;
|
|
1344
|
+
getTable(): Table;
|
|
1345
|
+
/** Rattache un enregistrement existant au propriétaire. */
|
|
1346
|
+
static attach(_ownerKey: string, _recordKey: string): Promise<void>;
|
|
1347
|
+
/** Détache des enregistrements du propriétaire, sans les supprimer. */
|
|
1348
|
+
static detach(_ownerKey: string, _recordKeys: string[]): Promise<void>;
|
|
1349
|
+
/** Enregistrements rattachables correspondant à la recherche : [clé, libellé]. */
|
|
1350
|
+
static searchAttachable(_ownerKey: string, _search: string): Promise<[string, string][]>;
|
|
1351
|
+
/** Libellé d'un enregistrement rattachable, ou null s'il ne l'est pas (sert aussi de validation). */
|
|
1352
|
+
static attachableLabel(_ownerKey: string, _recordKey: string): Promise<string | null>;
|
|
1353
|
+
getHeaderActions(): Action[];
|
|
1354
|
+
placeholder(): string;
|
|
1355
|
+
/** Comme Filament : un relation manager a ses propres emplacements, pas ceux de la page de liste. */
|
|
1356
|
+
contentSchema(schema: Schema): Schema;
|
|
1357
|
+
render(): Promise<string>;
|
|
1358
|
+
}
|
|
1359
|
+
/**
|
|
1360
|
+
* Page des enregistrements liés à un enregistrement (port de ManageRelatedRecords) : une table, avec création, consultation et
|
|
1361
|
+
* édition en modales. Déclarée par `static relatedPages` de la resource propriétaire, elle répond sous `<slug>/{record}/<nom>`.
|
|
1362
|
+
*/
|
|
1363
|
+
export declare class ManageRelatedRecords extends ListRecords {
|
|
1364
|
+
/** Resource propriétaire : fixée à l'enregistrement de la page. */
|
|
1365
|
+
static parentResource: typeof Resource;
|
|
1366
|
+
static relationship: string;
|
|
1367
|
+
static modelLabel: string;
|
|
1368
|
+
static pluralModelLabel: string | null;
|
|
1369
|
+
static recordTitleAttribute: string | null;
|
|
1370
|
+
static policy: Policy | null;
|
|
1371
|
+
/** Adaptateur limité aux enregistrements liés au propriétaire donné. */
|
|
1372
|
+
static adapterFor(_ownerKey: string): DataAdapter;
|
|
1373
|
+
static table(table: Table): Table;
|
|
1374
|
+
static form(schema: Schema): Schema;
|
|
1375
|
+
static infolist(schema: Schema): Schema;
|
|
1376
|
+
static getTitle(): string;
|
|
1377
|
+
static getNavigationLabel(): string;
|
|
1378
|
+
/** Clé de l'enregistrement propriétaire : tirée de l'adresse au montage, jamais modifiable depuis le navigateur. */
|
|
1379
|
+
recordKey: string;
|
|
1380
|
+
static locked: string[];
|
|
1381
|
+
_owner: any;
|
|
1382
|
+
_facade: any;
|
|
1383
|
+
private get related();
|
|
1384
|
+
mount(params: Record<string, unknown>): Promise<void>;
|
|
1385
|
+
/** Le propriétaire est relu et son accès vérifié à chaque requête. */
|
|
1386
|
+
hydrate(): Promise<void>;
|
|
1387
|
+
getRecordKey(): string | null;
|
|
1388
|
+
/** Ce que ListRecords attend d'une resource, fourni ici par la page. */
|
|
1389
|
+
get resource(): any;
|
|
1390
|
+
getTable(): Table;
|
|
1391
|
+
getHeaderActions(): Action[];
|
|
1392
|
+
/** Comme Filament : le contenu de la page est un groupe (onglets éventuels, puis la table). */
|
|
1393
|
+
contentSchema(schema: Schema): Schema;
|
|
1394
|
+
getTitle(): string;
|
|
1395
|
+
getSubNavigation(): SubNavigationItem[];
|
|
1396
|
+
getBreadcrumbs(): {
|
|
1397
|
+
label: string;
|
|
1398
|
+
url: string | null;
|
|
1399
|
+
}[];
|
|
1400
|
+
getPageClasses(): string[];
|
|
1401
|
+
}
|
|
1402
|
+
/** Base des pages à formulaire d'une resource. */
|
|
1403
|
+
declare abstract class ResourceFormPage extends Page {
|
|
1404
|
+
/** Champ réactif du formulaire (`live()` + `afterStateUpdated()`) : `set(nom, valeur)` écrit à côté du champ modifié. */
|
|
1405
|
+
updatedData(_value: unknown, key: string | null): Promise<void>;
|
|
1406
|
+
static resource: typeof Resource;
|
|
1407
|
+
data: Record<string, unknown>;
|
|
1408
|
+
get resource(): typeof Resource;
|
|
1409
|
+
getDataAdapter(): DataAdapter;
|
|
1410
|
+
getRecordKey(): string | null;
|
|
1411
|
+
abstract getOperation(): 'create' | 'edit';
|
|
1412
|
+
abstract getSubmitMethod(): string;
|
|
1413
|
+
abstract getFormActions(): Action[];
|
|
1414
|
+
protected getRecord(): unknown;
|
|
1415
|
+
/** Deux colonnes par défaut à partir de `lg`, comme `defaultForm()` de Filament ; la resource peut en décider autrement. */
|
|
1416
|
+
formSchema(schema: Schema): Schema;
|
|
1417
|
+
/**
|
|
1418
|
+
* Étapes d'un assistant (équivalent du trait HasWizard de Filament) : dès que la méthode en retourne, la page présente son formulaire
|
|
1419
|
+
* étape par étape, avec « Back » / « Next » et le bouton d'enregistrement sur la dernière étape.
|
|
1420
|
+
*/
|
|
1421
|
+
protected getSteps(): Step[] | null;
|
|
1422
|
+
/** Vrai : les étapes sont accessibles dans n'importe quel ordre, sans validation au passage. */
|
|
1423
|
+
protected hasSkippableSteps(): boolean;
|
|
1424
|
+
/** Étape affichée à l'ouverture (à partir de 1). */
|
|
1425
|
+
protected getStartStep(): number;
|
|
1426
|
+
protected getWizardComponent(steps: Step[]): Wizard;
|
|
1427
|
+
contentSchema(schema: Schema): Schema;
|
|
1428
|
+
/** Destination de « Cancel » quand le navigateur n'a pas d'historique : la liste, sauf si la page en décide autrement. */
|
|
1429
|
+
protected getCancelUrl(): string;
|
|
1430
|
+
protected cancelAction(): Action;
|
|
1431
|
+
/** Valide le formulaire ; en cas d'erreur, les pose sur le composant et prévient le navigateur. */
|
|
1432
|
+
protected validateForm(): Promise<boolean>;
|
|
1433
|
+
}
|
|
1434
|
+
/** Page de création d'un enregistrement (port de CreateRecord). */
|
|
1435
|
+
export declare class CreateRecord extends ResourceFormPage {
|
|
1436
|
+
static callable: string[];
|
|
1437
|
+
mount(): void;
|
|
1438
|
+
getOperation(): 'create';
|
|
1439
|
+
getSubmitMethod(): string;
|
|
1440
|
+
getTitle(): string;
|
|
1441
|
+
getBreadcrumbs(): {
|
|
1442
|
+
label: string;
|
|
1443
|
+
url: string | null;
|
|
1444
|
+
}[];
|
|
1445
|
+
getPageClasses(): string[];
|
|
1446
|
+
getFormActions(): Action[];
|
|
1447
|
+
/** Transforme les données validées avant la création (ajouter l'auteur, calculer un champ…). */
|
|
1448
|
+
protected mutateFormDataBeforeCreate(data: Record<string, unknown>): Record<string, unknown> | Promise<Record<string, unknown>>;
|
|
1449
|
+
/** Juste avant la création ; lever une erreur l'annule. */
|
|
1450
|
+
protected beforeCreate(_data: Record<string, unknown>): void | Promise<void>;
|
|
1451
|
+
/** La création elle-même : par défaut, l'adaptateur de la resource. */
|
|
1452
|
+
protected handleRecordCreation(data: Record<string, unknown>): Promise<any>;
|
|
1453
|
+
/** Après la création (journal, envoi d'un message…). */
|
|
1454
|
+
protected afterCreate(_record: any): void | Promise<void>;
|
|
1455
|
+
/** Où aller ensuite : par défaut, la page d'édition du nouvel enregistrement. */
|
|
1456
|
+
protected getRedirectUrl(record: any): string;
|
|
1457
|
+
/** Titre de la notification de succès ; `null` pour ne rien afficher. */
|
|
1458
|
+
protected getCreatedNotificationTitle(): string | null;
|
|
1459
|
+
create(another?: boolean): Promise<void>;
|
|
1460
|
+
createAnother(): Promise<void>;
|
|
1461
|
+
}
|
|
1462
|
+
/** Action de suppression d'un enregistrement, avec confirmation (port de Filament\Actions\DeleteAction dans une page de resource). */
|
|
1463
|
+
export declare class DeleteAction {
|
|
1464
|
+
/** Sur une page d'édition : supprime l'enregistrement de la page puis revient à la liste. Sur une ligne de table : supprime la ligne. */
|
|
1465
|
+
static make(): Action;
|
|
1466
|
+
}
|
|
1467
|
+
/** Action de duplication : comme `Action`, avec la liste des attributs à ne pas recopier. */
|
|
1468
|
+
export type ReplicateActionInstance = Action & {
|
|
1469
|
+
excludeAttributes(attributes: string[]): ReplicateActionInstance;
|
|
1470
|
+
};
|
|
1471
|
+
/** Duplication d'une ligne de table (port de ReplicateAction) : la copie reprend les attributs de l'enregistrement, sauf sa clé, ses dates et ceux exclus. */
|
|
1472
|
+
export declare class ReplicateAction {
|
|
1473
|
+
static make(): ReplicateActionInstance;
|
|
1474
|
+
}
|
|
1475
|
+
/** Création en modale avec le formulaire de la resource (port de CreateAction). */
|
|
1476
|
+
export declare class CreateAction {
|
|
1477
|
+
/** Sans argument, la resource (ou le relation manager) est celle du composant hôte. */
|
|
1478
|
+
static make(resource?: typeof Resource | null): Action;
|
|
1479
|
+
}
|
|
1480
|
+
/** Édition en modale d'une ligne de table, avec le formulaire de la resource (port de EditAction). */
|
|
1481
|
+
export declare class EditAction {
|
|
1482
|
+
/** Sans argument, la resource (ou le relation manager) est celle du composant hôte. */
|
|
1483
|
+
static make(resource?: typeof Resource | null): Action;
|
|
1484
|
+
}
|
|
1485
|
+
/** Lien vers la page de consultation de l'enregistrement (port de ViewAction, quand la resource a une page « View »). */
|
|
1486
|
+
export declare class ViewAction {
|
|
1487
|
+
static make(resource?: typeof Resource | null): Action;
|
|
1488
|
+
}
|
|
1489
|
+
/** Rattache un enregistrement existant au propriétaire d'un relation manager (port de AttachAction). */
|
|
1490
|
+
export declare class AttachAction {
|
|
1491
|
+
static make(): Action;
|
|
1492
|
+
}
|
|
1493
|
+
/** Détache une ligne du propriétaire sans la supprimer (port de DetachAction). */
|
|
1494
|
+
export declare class DetachAction {
|
|
1495
|
+
static make(): Action;
|
|
1496
|
+
}
|
|
1497
|
+
/** Détache les lignes sélectionnées (port de DetachBulkAction). */
|
|
1498
|
+
export declare class DetachBulkAction {
|
|
1499
|
+
static make(): Action;
|
|
1500
|
+
}
|
|
1501
|
+
/** Restauration d'un enregistrement supprimé (port de RestoreAction). Visible seulement s'il est supprimé. */
|
|
1502
|
+
export declare class RestoreAction {
|
|
1503
|
+
static make(): Action;
|
|
1504
|
+
}
|
|
1505
|
+
/** Suppression définitive d'un enregistrement supprimé (port de ForceDeleteAction). Visible seulement s'il est supprimé. */
|
|
1506
|
+
export declare class ForceDeleteAction {
|
|
1507
|
+
static make(): Action;
|
|
1508
|
+
}
|
|
1509
|
+
/** Suppression groupée des enregistrements sélectionnés dans une table (port de DeleteBulkAction). */
|
|
1510
|
+
export declare class DeleteBulkAction {
|
|
1511
|
+
static make(): Action;
|
|
1512
|
+
}
|
|
1513
|
+
/** Page d'édition d'un enregistrement (port de EditRecord). */
|
|
1514
|
+
export declare class EditRecord extends ResourceFormPage {
|
|
1515
|
+
static callable: string[];
|
|
1516
|
+
recordKey: string;
|
|
1517
|
+
/** Onglet de relation manager actif (indice dans `Resource.relations`). */
|
|
1518
|
+
activeRelationManager: string;
|
|
1519
|
+
/**
|
|
1520
|
+
* Page précédente (équivalent de `url()->previous()`), retenue au premier affichage. Elle vient de l'en-tête Referer :
|
|
1521
|
+
* seule une adresse de ce même site est acceptée, et elle n'est plus modifiable ensuite.
|
|
1522
|
+
*/
|
|
1523
|
+
previousUrl: string;
|
|
1524
|
+
protected getCancelUrl(): string;
|
|
1525
|
+
contentSchema(schema: Schema): Schema;
|
|
1526
|
+
static locked: string[];
|
|
1527
|
+
_record: any;
|
|
1528
|
+
mount(params: Record<string, unknown>): Promise<void>;
|
|
1529
|
+
/** L'enregistrement est relu à chaque requête, comme dans Filament (pas de liaison de route). */
|
|
1530
|
+
hydrate(): Promise<void>;
|
|
1531
|
+
protected getRecord(): unknown;
|
|
1532
|
+
getRecordKey(): string | null;
|
|
1533
|
+
getActionMountContext(): Record<string, unknown>;
|
|
1534
|
+
protected getActionRecord(): unknown;
|
|
1535
|
+
/** Comme une page générée par Filament : suppression, plus restauration et suppression définitive si le modèle a la suppression douce. */
|
|
1536
|
+
getHeaderActions(): Action[];
|
|
1537
|
+
getOperation(): 'edit';
|
|
1538
|
+
getSubmitMethod(): string;
|
|
1539
|
+
getTitle(): string;
|
|
1540
|
+
getBreadcrumbs(): {
|
|
1541
|
+
label: string;
|
|
1542
|
+
url: string | null;
|
|
1543
|
+
}[];
|
|
1544
|
+
getSubNavigation(): SubNavigationItem[];
|
|
1545
|
+
getPageClasses(): string[];
|
|
1546
|
+
getFormActions(): Action[];
|
|
1547
|
+
/** Transforme les valeurs de l'enregistrement avant de remplir le formulaire. */
|
|
1548
|
+
protected mutateFormDataBeforeFill(data: Record<string, unknown>): Record<string, unknown> | Promise<Record<string, unknown>>;
|
|
1549
|
+
/** Transforme les données validées avant l'enregistrement. */
|
|
1550
|
+
protected mutateFormDataBeforeSave(data: Record<string, unknown>): Record<string, unknown> | Promise<Record<string, unknown>>;
|
|
1551
|
+
/** Juste avant l'enregistrement ; lever une erreur l'annule. */
|
|
1552
|
+
protected beforeSave(_data: Record<string, unknown>): void | Promise<void>;
|
|
1553
|
+
/** L'enregistrement lui-même : par défaut, l'adaptateur de la resource. */
|
|
1554
|
+
protected handleRecordUpdate(record: any, data: Record<string, unknown>): Promise<any>;
|
|
1555
|
+
/** Après l'enregistrement. */
|
|
1556
|
+
protected afterSave(_record: any): void | Promise<void>;
|
|
1557
|
+
/** Adresse où aller après l'enregistrement ; `null` (défaut) : rester sur la page. */
|
|
1558
|
+
protected getRedirectUrl(_record: any): string | null;
|
|
1559
|
+
/** Titre de la notification de succès ; `null` pour ne rien afficher. */
|
|
1560
|
+
protected getSavedNotificationTitle(): string | null;
|
|
1561
|
+
save(): Promise<void>;
|
|
1562
|
+
}
|
|
1563
|
+
/** Page de consultation d'un enregistrement (port de ViewRecord) : le schéma `infolist()` de la resource, en lecture seule. */
|
|
1564
|
+
export declare class ViewRecord extends Page {
|
|
1565
|
+
static resource: typeof Resource;
|
|
1566
|
+
static locked: string[];
|
|
1567
|
+
recordKey: string;
|
|
1568
|
+
/** Onglet de relation manager actif (indice dans `Resource.relations`). */
|
|
1569
|
+
activeRelationManager: string;
|
|
1570
|
+
_record: any;
|
|
1571
|
+
get resource(): typeof Resource;
|
|
1572
|
+
getDataAdapter(): DataAdapter;
|
|
1573
|
+
mount(params: Record<string, unknown>): Promise<void>;
|
|
1574
|
+
/** L'enregistrement est relu à chaque requête, comme sur la page d'édition. */
|
|
1575
|
+
hydrate(): Promise<void>;
|
|
1576
|
+
getRecordKey(): string | null;
|
|
1577
|
+
getActionMountContext(): Record<string, unknown>;
|
|
1578
|
+
protected getActionRecord(): unknown;
|
|
1579
|
+
infolistSchema(schema: Schema): Schema;
|
|
1580
|
+
contentSchema(schema: Schema): Schema;
|
|
1581
|
+
/** Par défaut : le lien vers la page d'édition (EditAction d'une page « View »). */
|
|
1582
|
+
getHeaderActions(): Action[];
|
|
1583
|
+
protected editAction(): Action;
|
|
1584
|
+
getTitle(): string;
|
|
1585
|
+
getBreadcrumbs(): {
|
|
1586
|
+
label: string;
|
|
1587
|
+
url: string | null;
|
|
1588
|
+
}[];
|
|
1589
|
+
getSubNavigation(): SubNavigationItem[];
|
|
1590
|
+
getPageClasses(): string[];
|
|
1591
|
+
}
|
|
1592
|
+
/** Sidebar : logo, menu du locataire, recherche, navigation, et — sans barre du haut — cloche et menu utilisateur. */
|
|
1593
|
+
export declare class Sidebar extends Component {
|
|
1594
|
+
static callable: string[];
|
|
1595
|
+
currentPath: string;
|
|
1596
|
+
static locked: string[];
|
|
1597
|
+
mount(params: Record<string, unknown>): void;
|
|
1598
|
+
/** Un élément de resource reste actif sur ses pages de création et d'édition. */
|
|
1599
|
+
render(): Promise<string>;
|
|
1600
|
+
/** Choix d'un thème par l'utilisateur : seul un thème déclaré par le panel est accepté ; la page est rechargée pour l'appliquer. */
|
|
1601
|
+
setTheme(id: unknown): void;
|
|
1602
|
+
}
|
|
1603
|
+
/** Barre du haut (port de Filament\Livewire\Topbar) : logo, navigation éventuelle, recherche, cloche, menu utilisateur. */
|
|
1604
|
+
export declare class Topbar extends Component {
|
|
1605
|
+
static callable: string[];
|
|
1606
|
+
currentPath: string;
|
|
1607
|
+
static locked: string[];
|
|
1608
|
+
mount(params: Record<string, unknown>): void;
|
|
1609
|
+
render(): Promise<string>;
|
|
1610
|
+
setTheme(id: unknown): void;
|
|
1611
|
+
}
|
|
1612
|
+
/** Menu utilisateur des pages simples d'un utilisateur connecté (port de SimpleUserMenu). */
|
|
1613
|
+
export declare class SimpleUserMenu extends Component {
|
|
1614
|
+
static callable: string[];
|
|
1615
|
+
render(): Promise<string>;
|
|
1616
|
+
setTheme(id: unknown): void;
|
|
1617
|
+
}
|
|
1618
|
+
/** Routeur Express d'un panel : assets, endpoint du runtime, authentification, locataires, pages protégées. */
|
|
1619
|
+
export declare function panelRouter(panel: Panel, runtime: WireRuntime): Router;
|