@momentumcms/admin 0.5.2 → 0.5.4
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/fesm2022/{momentumcms-admin-array-field.component-DH6vaHO-.mjs → momentumcms-admin-array-field.component-BLL21bqy.mjs} +2 -2
- package/fesm2022/{momentumcms-admin-array-field.component-DH6vaHO-.mjs.map → momentumcms-admin-array-field.component-BLL21bqy.mjs.map} +1 -1
- package/fesm2022/{momentumcms-admin-blocks-field.component-BxJRfiV3.mjs → momentumcms-admin-blocks-field.component-BQHIguqN.mjs} +119 -30
- package/fesm2022/momentumcms-admin-blocks-field.component-BQHIguqN.mjs.map +1 -0
- package/fesm2022/{momentumcms-admin-collapsible-field.component-CsjYCkGw.mjs → momentumcms-admin-collapsible-field.component-DSE4X1xV.mjs} +2 -2
- package/fesm2022/{momentumcms-admin-collapsible-field.component-CsjYCkGw.mjs.map → momentumcms-admin-collapsible-field.component-DSE4X1xV.mjs.map} +1 -1
- package/fesm2022/{momentumcms-admin-global-edit.page-CmLAM17O.mjs → momentumcms-admin-global-edit.page-CHr9vOxQ.mjs} +2 -2
- package/fesm2022/{momentumcms-admin-global-edit.page-CmLAM17O.mjs.map → momentumcms-admin-global-edit.page-CHr9vOxQ.mjs.map} +1 -1
- package/fesm2022/{momentumcms-admin-group-field.component-CMKcqfjy.mjs → momentumcms-admin-group-field.component-qy0Z-cRK.mjs} +2 -2
- package/fesm2022/{momentumcms-admin-group-field.component-CMKcqfjy.mjs.map → momentumcms-admin-group-field.component-qy0Z-cRK.mjs.map} +1 -1
- package/fesm2022/{momentumcms-admin-momentumcms-admin-BTZEdMNj.mjs → momentumcms-admin-momentumcms-admin-DDwm1Rm3.mjs} +1123 -450
- package/fesm2022/momentumcms-admin-momentumcms-admin-DDwm1Rm3.mjs.map +1 -0
- package/fesm2022/{momentumcms-admin-relationship-field.component-DNZUCENa.mjs → momentumcms-admin-relationship-field.component-DS68G61P.mjs} +2 -2
- package/fesm2022/{momentumcms-admin-relationship-field.component-DNZUCENa.mjs.map → momentumcms-admin-relationship-field.component-DS68G61P.mjs.map} +1 -1
- package/fesm2022/{momentumcms-admin-rich-text-field.component-BVAQkX3O.mjs → momentumcms-admin-rich-text-field.component-CZQSu4lc.mjs} +2 -2
- package/fesm2022/{momentumcms-admin-rich-text-field.component-BVAQkX3O.mjs.map → momentumcms-admin-rich-text-field.component-CZQSu4lc.mjs.map} +1 -1
- package/fesm2022/{momentumcms-admin-row-field.component-0F6cnUK_.mjs → momentumcms-admin-row-field.component-109gO-Rp.mjs} +2 -2
- package/fesm2022/{momentumcms-admin-row-field.component-0F6cnUK_.mjs.map → momentumcms-admin-row-field.component-109gO-Rp.mjs.map} +1 -1
- package/fesm2022/{momentumcms-admin-tabs-field.component-qYlbl8Ud.mjs → momentumcms-admin-tabs-field.component-DG8vPjj4.mjs} +2 -2
- package/fesm2022/{momentumcms-admin-tabs-field.component-qYlbl8Ud.mjs.map → momentumcms-admin-tabs-field.component-DG8vPjj4.mjs.map} +1 -1
- package/fesm2022/momentumcms-admin.mjs +1 -1
- package/package.json +1 -1
- package/types/momentumcms-admin.d.ts +231 -5
- package/fesm2022/momentumcms-admin-blocks-field.component-BxJRfiV3.mjs.map +0 -1
- package/fesm2022/momentumcms-admin-momentumcms-admin-BTZEdMNj.mjs.map +0 -1
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { Routes, CanActivateFn, CanDeactivateFn } from '@angular/router';
|
|
2
2
|
import * as _angular_core from '@angular/core';
|
|
3
3
|
import { Type, InjectionToken, Signal, Provider, OnInit, WritableSignal, makeEnvironmentProviders } from '@angular/core';
|
|
4
|
-
import { CollectionConfig, GlobalConfig, PluginAdminRouteDescriptor, MomentumPlugin, MomentumConfig, MomentumAdminConfig, MediaDocument, AdminConfig, ImageSizeConfig, Field,
|
|
4
|
+
import { CollectionConfig, GlobalConfig, PluginAdminRouteDescriptor, MomentumPlugin, AdminComponentsConfig, MomentumConfig, MomentumAdminConfig, MediaDocument, DocumentStatus as DocumentStatus$1, AdminConfig, ImageSizeConfig, Field, BlockConfig, UploadField } from '@momentumcms/core';
|
|
5
5
|
import { HttpContextToken, HttpInterceptorFn } from '@angular/common/http';
|
|
6
6
|
import { Observable } from 'rxjs';
|
|
7
7
|
import * as _momentumcms_admin from '@momentumcms/admin';
|
|
8
8
|
import { DataTableColumn, DataTableSort, DataTableRowAction, DataTableRowActionEvent, FieldDisplayType, FieldDisplayFieldMeta, FieldDisplayNumberFormat, FieldDisplayDateFormat, PopoverTrigger, ValidationError, SelectOption } from '@momentumcms/ui';
|
|
9
9
|
import * as _angular_forms_signals from '@angular/forms/signals';
|
|
10
10
|
import { CdkDragDrop } from '@angular/cdk/drag-drop';
|
|
11
|
+
import * as dist_libs_core_src from 'dist/libs/core/src';
|
|
11
12
|
|
|
12
13
|
/**
|
|
13
14
|
* Momentum Admin Routes Factory
|
|
@@ -77,6 +78,8 @@ interface MomentumAdminRouteData {
|
|
|
77
78
|
globals?: GlobalConfig[];
|
|
78
79
|
branding?: MomentumAdminBranding;
|
|
79
80
|
pluginRoutes?: AdminPluginRoute[];
|
|
81
|
+
adminComponents?: AdminComponentsConfig;
|
|
82
|
+
plugins?: MomentumPlugin[];
|
|
80
83
|
}
|
|
81
84
|
/**
|
|
82
85
|
* Creates Angular routes for the Momentum CMS admin UI.
|
|
@@ -1388,6 +1391,9 @@ interface HasUnsavedChanges {
|
|
|
1388
1391
|
}
|
|
1389
1392
|
/**
|
|
1390
1393
|
* Route guard that prompts the user before navigating away from a dirty form.
|
|
1394
|
+
*
|
|
1395
|
+
* Defensive: checks that the component implements HasUnsavedChanges before calling.
|
|
1396
|
+
* This is necessary because AdminPageResolver wraps the actual page component.
|
|
1391
1397
|
*/
|
|
1392
1398
|
declare const unsavedChangesGuard: CanDeactivateFn<HasUnsavedChanges>;
|
|
1393
1399
|
|
|
@@ -1638,6 +1644,8 @@ declare class AdminShellComponent implements OnInit {
|
|
|
1638
1644
|
private readonly auth;
|
|
1639
1645
|
private readonly collectionAccess;
|
|
1640
1646
|
private readonly sidebar;
|
|
1647
|
+
private readonly componentRegistry;
|
|
1648
|
+
private readonly slotRegistry;
|
|
1641
1649
|
readonly entitySheet: EntitySheetService;
|
|
1642
1650
|
/** All collections from route data */
|
|
1643
1651
|
private readonly allCollections;
|
|
@@ -1850,6 +1858,8 @@ declare class EntityListWidget<T extends Entity = Entity> {
|
|
|
1850
1858
|
private readonly route;
|
|
1851
1859
|
/** Template ref for complex cell rendering (group, array, json). */
|
|
1852
1860
|
private readonly complexCellTemplate;
|
|
1861
|
+
/** Template ref for badge cell rendering (_status column). */
|
|
1862
|
+
private readonly badgeCellTemplate;
|
|
1853
1863
|
/** The collection configuration */
|
|
1854
1864
|
readonly collection: _angular_core.InputSignal<CollectionConfig>;
|
|
1855
1865
|
/** Base path for entity routes */
|
|
@@ -1909,8 +1919,16 @@ declare class EntityListWidget<T extends Entity = Entity> {
|
|
|
1909
1919
|
readonly selectedEntities: _angular_core.WritableSignal<T[]>;
|
|
1910
1920
|
readonly searchQuery: _angular_core.ModelSignal<string>;
|
|
1911
1921
|
readonly viewingTrash: _angular_core.WritableSignal<boolean>;
|
|
1922
|
+
readonly statusFilter: _angular_core.WritableSignal<DocumentStatus$1 | null>;
|
|
1923
|
+
/** Status filter options for versioned collections */
|
|
1924
|
+
readonly statusFilterOptions: {
|
|
1925
|
+
label: string;
|
|
1926
|
+
value: DocumentStatus$1 | null;
|
|
1927
|
+
}[];
|
|
1912
1928
|
/** Whether the collection has soft delete enabled */
|
|
1913
1929
|
readonly hasSoftDelete: _angular_core.Signal<boolean>;
|
|
1930
|
+
/** Whether the collection has versioning with drafts enabled */
|
|
1931
|
+
readonly hasVersioning: _angular_core.Signal<boolean>;
|
|
1914
1932
|
/** Computed collection label */
|
|
1915
1933
|
readonly collectionLabel: _angular_core.Signal<string>;
|
|
1916
1934
|
/** Computed collection label singular */
|
|
@@ -1949,6 +1967,13 @@ declare class EntityListWidget<T extends Entity = Entity> {
|
|
|
1949
1967
|
* Format a value based on its type.
|
|
1950
1968
|
*/
|
|
1951
1969
|
private formatValue;
|
|
1970
|
+
/**
|
|
1971
|
+
* Look up a badge configuration from a column's badgeMap.
|
|
1972
|
+
*/
|
|
1973
|
+
getBadgeConfig(value: unknown, column: EntityListColumn<T>): {
|
|
1974
|
+
label: string;
|
|
1975
|
+
variant: 'default' | 'secondary' | 'destructive' | 'outline';
|
|
1976
|
+
} | null;
|
|
1952
1977
|
/**
|
|
1953
1978
|
* Generate a brief summary string for complex field values (group, array, json).
|
|
1954
1979
|
*/
|
|
@@ -1989,6 +2014,10 @@ declare class EntityListWidget<T extends Entity = Entity> {
|
|
|
1989
2014
|
* Toggle between active and trash views.
|
|
1990
2015
|
*/
|
|
1991
2016
|
toggleTrashView(): void;
|
|
2017
|
+
/**
|
|
2018
|
+
* Set the status filter for versioned collections.
|
|
2019
|
+
*/
|
|
2020
|
+
setStatusFilter(status: DocumentStatus$1 | null): void;
|
|
1992
2021
|
/**
|
|
1993
2022
|
* Handle create button click.
|
|
1994
2023
|
*/
|
|
@@ -2514,8 +2543,10 @@ declare class EntityFormWidget<T extends Entity = Entity> {
|
|
|
2514
2543
|
readonly draftSaved: _angular_core.OutputEmitterRef<void>;
|
|
2515
2544
|
/** Model signal — the single source of truth for form data */
|
|
2516
2545
|
readonly formModel: _angular_core.WritableSignal<Record<string, unknown>>;
|
|
2517
|
-
/**
|
|
2518
|
-
|
|
2546
|
+
/** Reactive form data that tracks Signal Forms changes for downstream consumers (e.g. live preview).
|
|
2547
|
+
* Reads the root FieldState value directly so it re-triggers when any field value changes,
|
|
2548
|
+
* unlike formModel which may keep the same object reference after in-place mutations. */
|
|
2549
|
+
readonly formData: _angular_core.Signal<Record<string, unknown>>;
|
|
2519
2550
|
/** Signal forms tree — created once when collection is available */
|
|
2520
2551
|
readonly entityForm: _angular_core.WritableSignal<_angular_forms_signals.FieldTree<Record<string, unknown>, string | number> | null>;
|
|
2521
2552
|
/** Original data for edit mode */
|
|
@@ -2579,6 +2610,8 @@ declare class EntityFormWidget<T extends Entity = Entity> {
|
|
|
2579
2610
|
readonly canEdit: _angular_core.Signal<boolean>;
|
|
2580
2611
|
/** Whether collection has versioning with drafts enabled */
|
|
2581
2612
|
readonly hasVersioning: _angular_core.Signal<boolean>;
|
|
2613
|
+
/** Current document status (from form model or default to 'draft') */
|
|
2614
|
+
readonly documentStatus: _angular_core.Signal<DocumentStatus$1>;
|
|
2582
2615
|
/** Whether draft save is available (edit mode with existing entity) */
|
|
2583
2616
|
readonly canSaveDraft: _angular_core.Signal<boolean>;
|
|
2584
2617
|
constructor();
|
|
@@ -2635,6 +2668,10 @@ declare class EntityFormWidget<T extends Entity = Entity> {
|
|
|
2635
2668
|
* Switch from view to edit mode.
|
|
2636
2669
|
*/
|
|
2637
2670
|
switchToEdit(): void;
|
|
2671
|
+
/**
|
|
2672
|
+
* Handle status change from publish controls.
|
|
2673
|
+
*/
|
|
2674
|
+
onStatusChanged(status: DocumentStatus$1): void;
|
|
2638
2675
|
/**
|
|
2639
2676
|
* Handle version restore — reload the entity data.
|
|
2640
2677
|
*/
|
|
@@ -3436,6 +3473,195 @@ declare function provideMomentumFieldRenderers(): ReturnType<typeof makeEnvironm
|
|
|
3436
3473
|
*/
|
|
3437
3474
|
declare function provideFieldRenderer(type: string, loader: () => Promise<Type<unknown>>): ReturnType<typeof makeEnvironmentProviders>;
|
|
3438
3475
|
|
|
3476
|
+
type Loader$1 = () => Promise<unknown>;
|
|
3477
|
+
/**
|
|
3478
|
+
* Registry for swappable admin page components.
|
|
3479
|
+
*
|
|
3480
|
+
* Maps page keys (e.g., 'dashboard', 'collection-list') to lazy component loaders.
|
|
3481
|
+
* Per-collection overrides use the pattern: 'collections/{slug}/{type}'.
|
|
3482
|
+
*
|
|
3483
|
+
* Resolution chain: per-collection → global → undefined (use built-in default).
|
|
3484
|
+
*/
|
|
3485
|
+
declare class AdminComponentRegistry {
|
|
3486
|
+
private readonly components;
|
|
3487
|
+
/** Register a lazy loader for a page key. Later registrations override earlier ones. */
|
|
3488
|
+
register(key: string, loader: Loader$1): void;
|
|
3489
|
+
/** Get the lazy loader for a page key. Returns undefined if not registered. */
|
|
3490
|
+
get(key: string): Loader$1 | undefined;
|
|
3491
|
+
/** Check if a page key has a registered component. */
|
|
3492
|
+
has(key: string): boolean;
|
|
3493
|
+
/**
|
|
3494
|
+
* Resolve a component loader with per-collection fallback.
|
|
3495
|
+
*
|
|
3496
|
+
* For collection pages, tries `collections/{slug}/{type}` first,
|
|
3497
|
+
* then falls back to the global key (e.g., 'collection-list').
|
|
3498
|
+
*/
|
|
3499
|
+
resolve(key: string, slug?: string): Loader$1 | undefined;
|
|
3500
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AdminComponentRegistry, never>;
|
|
3501
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AdminComponentRegistry>;
|
|
3502
|
+
}
|
|
3503
|
+
|
|
3504
|
+
type Loader = () => Promise<unknown>;
|
|
3505
|
+
/**
|
|
3506
|
+
* Registry for admin layout slot components.
|
|
3507
|
+
*
|
|
3508
|
+
* Slots are additive — multiple components can be registered for the same slot key.
|
|
3509
|
+
* Per-collection slots use the pattern: `{base-slot}:{collection-slug}`.
|
|
3510
|
+
*
|
|
3511
|
+
* Resolution merges global + per-collection loaders (global first).
|
|
3512
|
+
*
|
|
3513
|
+
* The registry is signal-aware: `resolve()` reads an internal version signal,
|
|
3514
|
+
* so Angular effects that call `resolve()` will re-run when new slots are registered.
|
|
3515
|
+
*/
|
|
3516
|
+
declare class AdminSlotRegistry {
|
|
3517
|
+
private readonly slots;
|
|
3518
|
+
/** Incremented on every register() so signal-based consumers re-evaluate. */
|
|
3519
|
+
private readonly _version;
|
|
3520
|
+
/** Register a lazy loader for a slot. Multiple loaders per slot are supported. Duplicate loaders are skipped. */
|
|
3521
|
+
register(slot: string, loader: Loader): void;
|
|
3522
|
+
/** Get all loaders for a slot key. Returns empty array if none registered. */
|
|
3523
|
+
getAll(slot: string): Loader[];
|
|
3524
|
+
/** Check if a slot has any registered loaders. */
|
|
3525
|
+
has(slot: string): boolean;
|
|
3526
|
+
/**
|
|
3527
|
+
* Resolve slot loaders, merging global and per-collection entries.
|
|
3528
|
+
*
|
|
3529
|
+
* Reads the internal version signal so Angular effects tracking this call
|
|
3530
|
+
* will re-run when new slots are registered.
|
|
3531
|
+
*/
|
|
3532
|
+
resolve(slot: string, slug?: string): Loader[];
|
|
3533
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AdminSlotRegistry, never>;
|
|
3534
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AdminSlotRegistry>;
|
|
3535
|
+
}
|
|
3536
|
+
|
|
3537
|
+
/** Lazy loader that returns an Angular component class. */
|
|
3538
|
+
type ComponentLoader = () => Promise<Type<unknown>>;
|
|
3539
|
+
/**
|
|
3540
|
+
* Keys for swappable admin pages.
|
|
3541
|
+
* Used in AdminComponentRegistry to replace built-in pages.
|
|
3542
|
+
*
|
|
3543
|
+
* Resolution chain for collection pages:
|
|
3544
|
+
* per-collection key (e.g. "collections/articles/list")
|
|
3545
|
+
* → global key (e.g. "collection-list")
|
|
3546
|
+
* → built-in default
|
|
3547
|
+
*/
|
|
3548
|
+
type AdminComponentKey = 'dashboard' | 'login' | 'media' | 'collection-list' | 'collection-edit' | 'collection-view' | 'global-edit';
|
|
3549
|
+
/**
|
|
3550
|
+
* Keys for named layout slots in admin pages.
|
|
3551
|
+
* Slots are additive — multiple components can be registered for the same slot.
|
|
3552
|
+
*
|
|
3553
|
+
* Per-collection variants use the pattern: `{base-slot}:{collection-slug}`
|
|
3554
|
+
* e.g. `collection-list:before:articles`
|
|
3555
|
+
*/
|
|
3556
|
+
type AdminSlotKey = 'shell:header' | 'shell:footer' | 'shell:nav-start' | 'shell:nav-end' | 'dashboard:before' | 'dashboard:after' | 'collection-list:before' | 'collection-list:after' | 'collection-edit:before' | 'collection-edit:after' | 'collection-edit:sidebar' | 'collection-view:before' | 'collection-view:after' | 'login:before' | 'login:after' | `${'collection-list' | 'collection-edit' | 'collection-view'}:${'before' | 'after' | 'sidebar'}:${string}`;
|
|
3557
|
+
/**
|
|
3558
|
+
* Context passed to slot components via input bindings.
|
|
3559
|
+
* Available as inputs on any component rendered in a slot.
|
|
3560
|
+
*/
|
|
3561
|
+
interface AdminSlotContext {
|
|
3562
|
+
/** The collection config, if the slot is within a collection page. */
|
|
3563
|
+
collection?: CollectionConfig;
|
|
3564
|
+
/** The entity ID, if the slot is within an entity view/edit page. */
|
|
3565
|
+
entityId?: string;
|
|
3566
|
+
}
|
|
3567
|
+
|
|
3568
|
+
/**
|
|
3569
|
+
* Register a custom admin page component override.
|
|
3570
|
+
*
|
|
3571
|
+
* ```typescript
|
|
3572
|
+
* export const appConfig: ApplicationConfig = {
|
|
3573
|
+
* providers: [
|
|
3574
|
+
* provideAdminComponent('dashboard', () =>
|
|
3575
|
+
* import('./custom-dashboard.component').then(m => m.CustomDashboard)
|
|
3576
|
+
* ),
|
|
3577
|
+
* ],
|
|
3578
|
+
* };
|
|
3579
|
+
* ```
|
|
3580
|
+
*/
|
|
3581
|
+
declare function provideAdminComponent(key: string, loader: ComponentLoader): ReturnType<typeof makeEnvironmentProviders>;
|
|
3582
|
+
/**
|
|
3583
|
+
* Register a component into an admin layout slot.
|
|
3584
|
+
*
|
|
3585
|
+
* ```typescript
|
|
3586
|
+
* export const appConfig: ApplicationConfig = {
|
|
3587
|
+
* providers: [
|
|
3588
|
+
* provideAdminSlot('dashboard:before', () =>
|
|
3589
|
+
* import('./welcome-banner.component').then(m => m.WelcomeBanner)
|
|
3590
|
+
* ),
|
|
3591
|
+
* ],
|
|
3592
|
+
* };
|
|
3593
|
+
* ```
|
|
3594
|
+
*/
|
|
3595
|
+
declare function provideAdminSlot(slot: string, loader: ComponentLoader): ReturnType<typeof makeEnvironmentProviders>;
|
|
3596
|
+
/**
|
|
3597
|
+
* Read AdminComponentsConfig and CollectionAdminComponentsConfig from config
|
|
3598
|
+
* and register them into AdminComponentRegistry and AdminSlotRegistry.
|
|
3599
|
+
*
|
|
3600
|
+
* Called once in AdminShellComponent.ngOnInit() after route data is available.
|
|
3601
|
+
*/
|
|
3602
|
+
declare function registerConfigComponents(collections: CollectionConfig[], adminComponents: AdminComponentsConfig | undefined, componentRegistry: AdminComponentRegistry, slotRegistry: AdminSlotRegistry): void;
|
|
3603
|
+
|
|
3604
|
+
/**
|
|
3605
|
+
* Renders all components registered for a named admin layout slot.
|
|
3606
|
+
*
|
|
3607
|
+
* Usage:
|
|
3608
|
+
* ```html
|
|
3609
|
+
* <mcms-admin-slot slot="dashboard:before" />
|
|
3610
|
+
* <mcms-admin-slot slot="collection-list:before" [collectionSlug]="slug" />
|
|
3611
|
+
* ```
|
|
3612
|
+
*/
|
|
3613
|
+
declare class AdminSlotOutlet {
|
|
3614
|
+
private readonly registry;
|
|
3615
|
+
/** The slot key to render (e.g., 'dashboard:before'). */
|
|
3616
|
+
readonly slot: _angular_core.InputSignal<string>;
|
|
3617
|
+
/** Optional collection slug for per-collection slot resolution. */
|
|
3618
|
+
readonly collectionSlug: _angular_core.InputSignal<string | undefined>;
|
|
3619
|
+
/** Optional context passed as inputs to slot components. */
|
|
3620
|
+
readonly context: _angular_core.InputSignal<AdminSlotContext>;
|
|
3621
|
+
/** Resolved component types after lazy loading. */
|
|
3622
|
+
readonly resolvedComponents: _angular_core.WritableSignal<Type<unknown>[]>;
|
|
3623
|
+
/** Inputs to pass to each slot component. */
|
|
3624
|
+
readonly slotInputs: _angular_core.Signal<{
|
|
3625
|
+
collection?: dist_libs_core_src.CollectionConfig;
|
|
3626
|
+
entityId?: string;
|
|
3627
|
+
}>;
|
|
3628
|
+
/** Incremented on every effect run to detect stale promise resolutions. */
|
|
3629
|
+
private loadGeneration;
|
|
3630
|
+
constructor();
|
|
3631
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AdminSlotOutlet, never>;
|
|
3632
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AdminSlotOutlet, "mcms-admin-slot", never, { "slot": { "alias": "slot"; "required": true; "isSignal": true; }; "collectionSlug": { "alias": "collectionSlug"; "required": false; "isSignal": true; }; "context": { "alias": "context"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
3633
|
+
}
|
|
3634
|
+
|
|
3635
|
+
/**
|
|
3636
|
+
* Registry-aware page resolver that delegates to either a registered
|
|
3637
|
+
* custom component or the built-in fallback.
|
|
3638
|
+
*
|
|
3639
|
+
* Used as the `loadComponent` for every admin route. Route `data` provides:
|
|
3640
|
+
* - `adminPageKey` — the registry key (e.g., 'dashboard', 'collection-list')
|
|
3641
|
+
* - `adminPageFallback` — lazy loader for the built-in default
|
|
3642
|
+
*
|
|
3643
|
+
* For collection pages, reads `:slug` from route params to check per-collection overrides.
|
|
3644
|
+
*
|
|
3645
|
+
* Subscribes to route observables so the component re-resolves when Angular
|
|
3646
|
+
* reuses the instance for sibling routes (e.g., navigating between collections).
|
|
3647
|
+
*
|
|
3648
|
+
* Implements HasUnsavedChanges to delegate to the resolved component for
|
|
3649
|
+
* the unsaved changes guard.
|
|
3650
|
+
*/
|
|
3651
|
+
declare class AdminPageResolver implements OnInit, HasUnsavedChanges {
|
|
3652
|
+
private readonly registry;
|
|
3653
|
+
private readonly route;
|
|
3654
|
+
private readonly destroyRef;
|
|
3655
|
+
private readonly outlet;
|
|
3656
|
+
readonly resolvedComponent: _angular_core.WritableSignal<Type<unknown> | null>;
|
|
3657
|
+
/** Incremented on every load to detect stale promise resolutions. */
|
|
3658
|
+
private loadGeneration;
|
|
3659
|
+
ngOnInit(): void;
|
|
3660
|
+
hasUnsavedChanges(): boolean;
|
|
3661
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AdminPageResolver, never>;
|
|
3662
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AdminPageResolver, "mcms-admin-page-resolver", never, {}, {}, never, never, true, never>;
|
|
3663
|
+
}
|
|
3664
|
+
|
|
3439
3665
|
/**
|
|
3440
3666
|
* Dynamic field renderer that resolves components lazily from the registry.
|
|
3441
3667
|
*
|
|
@@ -3901,5 +4127,5 @@ declare class MediaPickerDialog {
|
|
|
3901
4127
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<MediaPickerDialog, "mcms-media-picker-dialog", never, {}, {}, never, never, true, never>;
|
|
3902
4128
|
}
|
|
3903
4129
|
|
|
3904
|
-
export { AdminShellComponent, AdminSidebarWidget, BlockEditDialog, BlockInserterComponent, BlockWrapperComponent, CheckboxFieldRenderer, CollectionAccessService, CollectionCardWidget, CollectionEditPage, CollectionListPage, CollectionViewPage, DashboardPage, DateFieldRenderer, EntityFormWidget, EntityListWidget, EntitySheetService, EntityViewWidget, FeedbackService, FieldRenderer, FieldRendererRegistry, ForgotPasswordFormComponent, ForgotPasswordPage, LivePreviewComponent, LoginPage, MOMENTUM_API, MOMENTUM_API_CONTEXT, McmsThemeService, MediaLibraryPage, MediaPickerDialog, MediaPreviewComponent, MomentumApiService, MomentumAuthService, NumberFieldRenderer, PublishControlsWidget, ResetPasswordFormComponent, ResetPasswordPage, SHEET_QUERY_PARAMS, SKIP_AUTO_TOAST, SelectFieldRenderer, SetupPage, TextFieldRenderer, UploadFieldRenderer, UploadService, VersionHistoryWidget, VersionService, VisualBlockEditorComponent, adminGuard, authGuard, collectionAccessGuard, crudToastInterceptor, getFieldNodeState, getSubNode, getTitleField, guestGuard, injectHasAnyRole, injectHasRole, injectIsAdmin, injectIsAuthenticated, injectMomentumAPI, injectTypedMomentumAPI, injectUser, injectUserRole, injectVersionService, momentumAdminRoutes, provideFieldRenderer, provideMomentumAPI, provideMomentumFieldRenderers, setupGuard, unsavedChangesGuard };
|
|
3905
|
-
export type { AdminBranding, AdminNavItem, AdminNavSection, AdminPluginRoute, AdminUser, AuthResult, AuthSession, AuthUser, BaseUser, BlockEditDialogData, BlockItem, BreadcrumbItem, CollectionGroup, CollectionPermissions, CollectionWithCount, DeleteResult, DeviceSize, DocumentStatus, DocumentVersionParsed, DraftSaveResult, Entity, EntityAction, EntityFormMode, EntityListActionEvent, EntityListBulkActionEvent, EntityListColumn, EntityListFindResult, EntitySheetResult, EntityViewActionEvent, EntityViewFieldConfig, FieldNodeState, FindByIdOptions, FindOptions, FindResult, HasUnsavedChanges, McmsTheme, MediaPickerDialogData, MediaPickerResult, MediaPreviewData, MomentumAPIContext, MomentumAPIServer, MomentumAdminBranding, MomentumAdminOptions, MomentumAdminRouteData, MomentumClientAPI, MomentumCollectionAPI, PublishResult, RestoreResult, RestoreVersionOptions, SetupStatus, StatusResult, TypedCollectionAPI, TypedFindByIdOptions, TypedFindOptions, TypedMomentumClientAPI, UploadProgress, UserContext, VersionFindOptions, VersionQueryResult, VisualEditorState };
|
|
4130
|
+
export { AdminComponentRegistry, AdminPageResolver, AdminShellComponent, AdminSidebarWidget, AdminSlotOutlet, AdminSlotRegistry, BlockEditDialog, BlockInserterComponent, BlockWrapperComponent, CheckboxFieldRenderer, CollectionAccessService, CollectionCardWidget, CollectionEditPage, CollectionListPage, CollectionViewPage, DashboardPage, DateFieldRenderer, EntityFormWidget, EntityListWidget, EntitySheetService, EntityViewWidget, FeedbackService, FieldRenderer, FieldRendererRegistry, ForgotPasswordFormComponent, ForgotPasswordPage, LivePreviewComponent, LoginPage, MOMENTUM_API, MOMENTUM_API_CONTEXT, McmsThemeService, MediaLibraryPage, MediaPickerDialog, MediaPreviewComponent, MomentumApiService, MomentumAuthService, NumberFieldRenderer, PublishControlsWidget, ResetPasswordFormComponent, ResetPasswordPage, SHEET_QUERY_PARAMS, SKIP_AUTO_TOAST, SelectFieldRenderer, SetupPage, TextFieldRenderer, UploadFieldRenderer, UploadService, VersionHistoryWidget, VersionService, VisualBlockEditorComponent, adminGuard, authGuard, collectionAccessGuard, crudToastInterceptor, getFieldNodeState, getSubNode, getTitleField, guestGuard, injectHasAnyRole, injectHasRole, injectIsAdmin, injectIsAuthenticated, injectMomentumAPI, injectTypedMomentumAPI, injectUser, injectUserRole, injectVersionService, momentumAdminRoutes, provideAdminComponent, provideAdminSlot, provideFieldRenderer, provideMomentumAPI, provideMomentumFieldRenderers, registerConfigComponents, setupGuard, unsavedChangesGuard };
|
|
4131
|
+
export type { AdminBranding, AdminComponentKey, AdminNavItem, AdminNavSection, AdminPluginRoute, AdminSlotContext, AdminSlotKey, AdminUser, AuthResult, AuthSession, AuthUser, BaseUser, BlockEditDialogData, BlockItem, BreadcrumbItem, CollectionGroup, CollectionPermissions, CollectionWithCount, ComponentLoader, DeleteResult, DeviceSize, DocumentStatus, DocumentVersionParsed, DraftSaveResult, Entity, EntityAction, EntityFormMode, EntityListActionEvent, EntityListBulkActionEvent, EntityListColumn, EntityListFindResult, EntitySheetResult, EntityViewActionEvent, EntityViewFieldConfig, FieldNodeState, FindByIdOptions, FindOptions, FindResult, HasUnsavedChanges, McmsTheme, MediaPickerDialogData, MediaPickerResult, MediaPreviewData, MomentumAPIContext, MomentumAPIServer, MomentumAdminBranding, MomentumAdminOptions, MomentumAdminRouteData, MomentumClientAPI, MomentumCollectionAPI, PublishResult, RestoreResult, RestoreVersionOptions, SetupStatus, StatusResult, TypedCollectionAPI, TypedFindByIdOptions, TypedFindOptions, TypedMomentumClientAPI, UploadProgress, UserContext, VersionFindOptions, VersionQueryResult, VisualEditorState };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"momentumcms-admin-blocks-field.component-BxJRfiV3.mjs","sources":["../../../../libs/admin/src/lib/widgets/entity-form/field-renderers/blocks-field.component.ts"],"sourcesContent":["import {\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\teffect,\n\tinput,\n\tuntracked,\n} from '@angular/core';\nimport {\n\tCdkDropList,\n\tCdkDrag,\n\tCdkDragHandle,\n\ttype CdkDragDrop,\n\tmoveItemInArray,\n} from '@angular/cdk/drag-drop';\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { heroPlus, heroTrash, heroBars2 } from '@ng-icons/heroicons/outline';\nimport {\n\tCard,\n\tCardHeader,\n\tCardTitle,\n\tCardContent,\n\tCardFooter,\n\tButton,\n\tBadge,\n} from '@momentumcms/ui';\nimport { humanizeFieldName } from '@momentumcms/core';\nimport type { Field, BlockConfig } from '@momentumcms/core';\nimport type { EntityFormMode } from '../entity-form.types';\nimport {\n\tgetFieldNodeState,\n\tgetSubNode,\n\tisRecord,\n\tgetFieldDefaultValue,\n\tnormalizeBlockDefaults,\n} from '../entity-form.types';\nimport { FieldRenderer } from './field-renderer.component';\n\n/** Shape of a block item in the stored data */\ninterface BlockItem {\n\tblockType: string;\n\t[key: string]: unknown;\n}\n\n/**\n * Blocks field renderer.\n *\n * Renders a list of typed blocks. Each block has a `blockType` discriminator\n * and type-specific fields. Users can add, remove, and reorder blocks.\n * A dropdown allows selecting which block type to add.\n *\n * Data container pattern: passes block sub-field FieldTree nodes via\n * getSubNode(getSubNode(formNode, blockIndex), subFieldName).\n * Block mutations use nodeState.value.set(newArray).\n */\n@Component({\n\tselector: 'mcms-blocks-field-renderer',\n\timports: [\n\t\tCard,\n\t\tCardHeader,\n\t\tCardTitle,\n\t\tCardContent,\n\t\tCardFooter,\n\t\tButton,\n\t\tBadge,\n\t\tNgIcon,\n\t\tCdkDropList,\n\t\tCdkDrag,\n\t\tCdkDragHandle,\n\t\tFieldRenderer,\n\t],\n\tproviders: [provideIcons({ heroPlus, heroTrash, heroBars2 })],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\ttemplate: `\n\t\t<mcms-card>\n\t\t\t<mcms-card-header>\n\t\t\t\t<div class=\"flex items-center justify-between\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<mcms-card-title>{{ label() }}</mcms-card-title>\n\t\t\t\t\t\t@if (description()) {\n\t\t\t\t\t\t\t<p class=\"text-sm text-muted-foreground mt-1\">{{ description() }}</p>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t\t<span class=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t{{ blocks().length }}{{ maxRows() ? ' / ' + maxRows() : '' }} blocks\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t</mcms-card-header>\n\t\t\t<mcms-card-content>\n\t\t\t\t@if (blocks().length === 0) {\n\t\t\t\t\t<p class=\"text-sm text-muted-foreground py-4 text-center\">\n\t\t\t\t\t\tNo blocks yet. Add a block to get started.\n\t\t\t\t\t</p>\n\t\t\t\t} @else {\n\t\t\t\t\t<div\n\t\t\t\t\t\tcdkDropList\n\t\t\t\t\t\t(cdkDropListDropped)=\"onDrop($event)\"\n\t\t\t\t\t\tclass=\"space-y-3\"\n\t\t\t\t\t\trole=\"list\"\n\t\t\t\t\t\taria-label=\"Content blocks\"\n\t\t\t\t\t>\n\t\t\t\t\t\t@for (block of blocks(); track $index; let i = $index) {\n\t\t\t\t\t\t\t<div cdkDrag class=\"border rounded-lg bg-card\" [cdkDragDisabled]=\"isDisabled()\">\n\t\t\t\t\t\t\t\t<div class=\"flex items-center gap-3 px-4 py-2 border-b bg-muted/50 rounded-t-lg\">\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tcdkDragHandle\n\t\t\t\t\t\t\t\t\t\tclass=\"cursor-grab text-muted-foreground hover:text-foreground\"\n\t\t\t\t\t\t\t\t\t\t[class.hidden]=\"isDisabled()\"\n\t\t\t\t\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t\t\t\t\t\t[attr.aria-label]=\"'Reorder ' + getBlockLabel(block.blockType) + ' block'\"\n\t\t\t\t\t\t\t\t\t\taria-roledescription=\"sortable\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<ng-icon name=\"heroBars2\" size=\"16\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<mcms-badge>{{ getBlockLabel(block.blockType) }}</mcms-badge>\n\t\t\t\t\t\t\t\t\t<div class=\"flex-1\"></div>\n\t\t\t\t\t\t\t\t\t@if (canRemoveBlock()) {\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\tmcms-button\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\t\t\t\tclass=\"h-7 w-7 text-destructive hover:text-destructive\"\n\t\t\t\t\t\t\t\t\t\t\t(click)=\"removeBlock(i)\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.aria-label]=\"'Remove ' + getBlockLabel(block.blockType) + ' block'\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<ng-icon name=\"heroTrash\" size=\"14\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"p-4 space-y-3\">\n\t\t\t\t\t\t\t\t\t@for (subField of getBlockFields(block.blockType); track subField.name) {\n\t\t\t\t\t\t\t\t\t\t<mcms-field-renderer\n\t\t\t\t\t\t\t\t\t\t\t[field]=\"subField\"\n\t\t\t\t\t\t\t\t\t\t\t[formNode]=\"getBlockSubNode(i, subField.name)\"\n\t\t\t\t\t\t\t\t\t\t\t[formTree]=\"formTree()\"\n\t\t\t\t\t\t\t\t\t\t\t[formModel]=\"formModel()\"\n\t\t\t\t\t\t\t\t\t\t\t[mode]=\"mode()\"\n\t\t\t\t\t\t\t\t\t\t\t[path]=\"getBlockSubFieldPath(i, subField.name)\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</mcms-card-content>\n\t\t\t@if (canAddBlock()) {\n\t\t\t\t<mcms-card-footer>\n\t\t\t\t\t<div class=\"flex gap-2\">\n\t\t\t\t\t\t@for (blockDef of blockDefinitions(); track blockDef.slug) {\n\t\t\t\t\t\t\t<button mcms-button variant=\"outline\" (click)=\"addBlock(blockDef.slug)\">\n\t\t\t\t\t\t\t\t<ng-icon name=\"heroPlus\" size=\"16\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t{{ blockDef.labels?.singular || blockDef.slug }}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t</mcms-card-footer>\n\t\t\t}\n\t\t</mcms-card>\n\t`,\n})\nexport class BlocksFieldRenderer {\n\t/** Field definition (must be a BlocksField) */\n\treadonly field = input.required<Field>();\n\n\t/** Signal forms FieldTree node for this blocks array */\n\treadonly formNode = input<unknown>(null);\n\n\t/** Root signal forms FieldTree (for layout fields that look up child nodes) */\n\treadonly formTree = input<unknown>(null);\n\n\t/** Form model data (for condition evaluation and relationship filterOptions) */\n\treadonly formModel = input<Record<string, unknown>>({});\n\n\t/** Form mode */\n\treadonly mode = input<EntityFormMode>('create');\n\n\t/** Field path (e.g., \"content\") */\n\treadonly path = input.required<string>();\n\n\t/** Bridge: extract FieldState from formNode */\n\tprivate readonly nodeState = computed(() => getFieldNodeState(this.formNode()));\n\n\t/** Computed label */\n\treadonly label = computed(() => this.field().label || humanizeFieldName(this.field().name));\n\n\t/** Computed description */\n\treadonly description = computed(() => this.field().description || '');\n\n\t/** Block type definitions from the field */\n\treadonly blockDefinitions = computed((): BlockConfig[] => {\n\t\tconst f = this.field();\n\t\tif (f.type === 'blocks') {\n\t\t\treturn f.blocks;\n\t\t}\n\t\treturn [];\n\t});\n\n\t/** Min rows constraint */\n\treadonly minRows = computed((): number => {\n\t\tconst f = this.field();\n\t\treturn f.type === 'blocks' ? (f.minRows ?? 0) : 0;\n\t});\n\n\t/** Max rows constraint */\n\treadonly maxRows = computed((): number | undefined => {\n\t\tconst f = this.field();\n\t\treturn f.type === 'blocks' ? f.maxRows : undefined;\n\t});\n\n\t/** Current blocks as typed items (read from FieldState) */\n\treadonly blocks = computed((): BlockItem[] => {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return [];\n\t\tconst val = state.value();\n\t\tif (Array.isArray(val)) {\n\t\t\treturn val.filter(\n\t\t\t\t(item): item is BlockItem => isRecord(item) && typeof item['blockType'] === 'string',\n\t\t\t);\n\t\t}\n\t\treturn [];\n\t});\n\n\t/**\n\t * Normalize loaded blocks: ensure every block has defaults for all definition fields.\n\t * Blocks saved before new fields were added won't have those keys, and\n\t * signal-forms only creates controls for keys present in the model.\n\t */\n\tprivate readonly _normalizeBlocks = effect(() => {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return;\n\t\tconst val = state.value();\n\t\tif (!Array.isArray(val)) return;\n\n\t\tconst { normalized, changed } = normalizeBlockDefaults(val, this.blockDefMap());\n\t\tif (changed) {\n\t\t\tuntracked(() => state.value.set(normalized));\n\t\t}\n\t});\n\n\t/** Whether the field is disabled (view mode) */\n\treadonly isDisabled = computed(() => this.mode() === 'view');\n\n\t/** Whether a new block can be added */\n\treadonly canAddBlock = computed((): boolean => {\n\t\tif (this.isDisabled()) return false;\n\t\tconst max = this.maxRows();\n\t\treturn max === undefined || this.blocks().length < max;\n\t});\n\n\t/** Whether blocks can be removed */\n\treadonly canRemoveBlock = computed((): boolean => {\n\t\tif (this.isDisabled()) return false;\n\t\treturn this.blocks().length > this.minRows();\n\t});\n\n\t/** Block definition lookup cache */\n\tprivate readonly blockDefMap = computed((): Map<string, BlockConfig> => {\n\t\tconst map = new Map<string, BlockConfig>();\n\t\tfor (const def of this.blockDefinitions()) {\n\t\t\tmap.set(def.slug, def);\n\t\t}\n\t\treturn map;\n\t});\n\n\t/** Get display label for a block type */\n\tgetBlockLabel(blockType: string): string {\n\t\tconst def = this.blockDefMap().get(blockType);\n\t\treturn def?.labels?.singular || blockType;\n\t}\n\n\t/** Get fields for a block type */\n\tgetBlockFields(blockType: string): Field[] {\n\t\tconst def = this.blockDefMap().get(blockType);\n\t\treturn def?.fields.filter((f) => !f.admin?.hidden) ?? [];\n\t}\n\n\t/** Get a FieldTree sub-node for a block's sub-field */\n\tgetBlockSubNode(blockIndex: number, subFieldName: string): unknown {\n\t\tconst blockNode = getSubNode(this.formNode(), blockIndex);\n\t\treturn getSubNode(blockNode, subFieldName);\n\t}\n\n\t/** Get the full path for a block's sub-field */\n\tgetBlockSubFieldPath(blockIndex: number, subFieldName: string): string {\n\t\treturn `${this.path()}.${blockIndex}.${subFieldName}`;\n\t}\n\n\t/** Handle drag-drop reorder */\n\tonDrop(event: CdkDragDrop<unknown>): void {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return;\n\t\tconst blocks = [...this.blocks()];\n\t\tmoveItemInArray(blocks, event.previousIndex, event.currentIndex);\n\t\tstate.value.set(blocks);\n\t}\n\n\t/** Add a new block of the given type */\n\taddBlock(blockType: string): void {\n\t\tconst def = this.blockDefMap().get(blockType);\n\t\tif (!def) return;\n\t\tconst state = this.nodeState();\n\t\tif (!state) return;\n\n\t\tconst newBlock: BlockItem = { blockType };\n\t\tfor (const field of def.fields) {\n\t\t\tnewBlock[field.name] = getFieldDefaultValue(field);\n\t\t}\n\n\t\tconst blocks = [...this.blocks(), newBlock];\n\t\tstate.value.set(blocks);\n\t}\n\n\t/** Remove a block at the given index */\n\tremoveBlock(index: number): void {\n\t\tconst state = this.nodeState();\n\t\tif (!state) return;\n\t\tconst blocks = this.blocks().filter((_, i) => i !== index);\n\t\tstate.value.set(blocks);\n\t}\n}\n"],"names":[],"mappings":"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"}
|