@dignite/ng.site 0.0.0-stage → 1.0.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.
@@ -0,0 +1,1409 @@
1
+ import * as i0 from '@angular/core';
2
+ import { OnInit, OnChanges, AfterContentInit, EventEmitter, ElementRef, SimpleChanges, PipeTransform, OnDestroy } from '@angular/core';
3
+ import { FieldTypeConfigBase, FieldTypeControlBase, FieldTypeDefinition, FlexFieldValue } from '@dignite/ng.flex-fields';
4
+ import * as _abp_ng_core from '@abp/ng.core';
5
+ import { FullAuditedEntityDto, ExtensibleAuditedEntityDto, ExtensibleEntityDto, CreationAuditedEntityDto, PagedAndSortedResultRequestDto, Rest, ListResultDto, PagedResultDto, LocalizationService, ListService } from '@abp/ng.core';
6
+ import { AbstractControl, UntypedFormGroup, FormBuilder, FormGroup, FormArray } from '@angular/forms';
7
+ import * as rxjs from 'rxjs';
8
+ import { Observable } from 'rxjs';
9
+ import { ConfirmationService, ToasterService } from '@abp/ng.theme.shared';
10
+ import { CdkDragDrop } from '@angular/cdk/drag-drop';
11
+ import { CKEditorConfigContributor, CKEditorDisplayContributor, CKEditorUploadProvider } from '@dignite/ng.flex-fields-ckeditor';
12
+ import { Routes } from '@angular/router';
13
+
14
+ /**
15
+ * Mirrors `SiteAdminPermissions` (`src/Dignite.Site.Admin.Application.Contracts/Permissions/SiteAdminPermissions.cs`).
16
+ *
17
+ * Note the group name is the bare string `SiteAdmin`, not `Site.Admin` - these are the exact strings the
18
+ * server checks, so they cannot be prefixed further here.
19
+ */
20
+ declare enum eSitePolicyNames {
21
+ Pages = "SiteAdmin.Pages",
22
+ PagesCreate = "SiteAdmin.Pages.Create",
23
+ PagesUpdate = "SiteAdmin.Pages.Update",
24
+ PagesDelete = "SiteAdmin.Pages.Delete",
25
+ ContentTypes = "SiteAdmin.ContentTypes",
26
+ ContentTypesCreate = "SiteAdmin.ContentTypes.Create",
27
+ ContentTypesUpdate = "SiteAdmin.ContentTypes.Update",
28
+ ContentTypesDelete = "SiteAdmin.ContentTypes.Delete",
29
+ Fields = "SiteAdmin.Fields",
30
+ FieldsCreate = "SiteAdmin.Fields.Create",
31
+ FieldsUpdate = "SiteAdmin.Fields.Update",
32
+ FieldsDelete = "SiteAdmin.Fields.Delete",
33
+ /** Separate from update on purpose: renaming a field migrates every stored value. */
34
+ FieldsRename = "SiteAdmin.Fields.Rename",
35
+ FieldGroups = "SiteAdmin.FieldGroups",
36
+ FieldGroupsCreate = "SiteAdmin.FieldGroups.Create",
37
+ FieldGroupsUpdate = "SiteAdmin.FieldGroups.Update",
38
+ FieldGroupsDelete = "SiteAdmin.FieldGroups.Delete",
39
+ Contents = "SiteAdmin.Contents",
40
+ ContentsCreate = "SiteAdmin.Contents.Create",
41
+ ContentsUpdate = "SiteAdmin.Contents.Update",
42
+ ContentsDelete = "SiteAdmin.Contents.Delete"
43
+ }
44
+
45
+ interface ContentTypeFieldDto {
46
+ fieldId?: string;
47
+ required?: boolean;
48
+ searchable?: boolean;
49
+ showInList?: boolean;
50
+ displayName?: string | null;
51
+ order?: number;
52
+ }
53
+ interface ContentTypeDto extends FullAuditedEntityDto<string> {
54
+ pageId?: string;
55
+ name?: string;
56
+ displayName?: string;
57
+ description?: string | null;
58
+ fields?: ContentTypeFieldDto[];
59
+ }
60
+
61
+ /** Designer-side editor for a `Content` field's configuration: which content type to restrict to (if
62
+ * any), single- vs. multi-select, and a placeholder. */
63
+ declare class ContentConfigComponent extends FieldTypeConfigBase implements OnInit {
64
+ private readonly contentTypeAdminService;
65
+ contentTypes: ContentTypeDto[];
66
+ protected configurationDefaults(): object;
67
+ ngOnInit(): void;
68
+ static ɵfac: i0.ɵɵFactoryDeclaration<ContentConfigComponent, never>;
69
+ static ɵcmp: i0.ɵɵComponentDeclaration<ContentConfigComponent, "site-content-config", never, {}, {}, never, never, true, never>;
70
+ }
71
+
72
+ /**
73
+ * Configuration of a `Content` field, shaped for `FormBuilder.group()`. Mirrors `ContentConfiguration`
74
+ * (`src/Dignite.FlexFields.Site/Dignite/FlexFields/Site/Content/ContentConfiguration.cs`).
75
+ *
76
+ * The property names are the **stored** configuration keys, not a naming choice.
77
+ */
78
+ declare class ContentConfiguration {
79
+ /** Restricts the picker to Content of this content type. `null` = unrestricted. */
80
+ 'Content.ContentTypeId': unknown;
81
+ 'Content.Multiple': unknown;
82
+ 'Content.Placeholder': unknown;
83
+ }
84
+
85
+ declare enum ContentStatus {
86
+ Draft = 0,
87
+ Published = 1,
88
+ Archived = 2
89
+ }
90
+ declare const contentStatusOptions: _abp_ng_core.ABP.Option<typeof ContentStatus>[];
91
+
92
+ interface ContentDto extends FullAuditedEntityDto<string> {
93
+ pageId?: string;
94
+ contentTypeId?: string;
95
+ cultureName?: string;
96
+ slug?: string;
97
+ publishTime?: string;
98
+ status?: ContentStatus;
99
+ url?: string;
100
+ fieldValues?: Record<string, object>;
101
+ }
102
+
103
+ /**
104
+ * Edits the value of a `Content` field: a picker over other Content, restricted to
105
+ * `Content.ContentTypeId` when set. The value is always a flat array of ids, even in single-select mode
106
+ * - matching the server's `ContentFieldType`, which always stores `List<Guid>`.
107
+ *
108
+ * The picker list is fetched once, in {@link ngOnInit} - `Content.ContentTypeId` is fixed for the
109
+ * lifetime of one rendered control (it belongs to the field's own definition, not something this
110
+ * component's own inputs can change), so there is nothing to react to afterward.
111
+ */
112
+ declare class ContentControlComponent extends FieldTypeControlBase implements OnInit {
113
+ private readonly contentAdminService;
114
+ /**
115
+ * A signal, not a plain field: it is filled by an HTTP callback, and this control renders in the content
116
+ * editor's page flow, under the host layout's OnPush ancestors - a plain-field write there never marks
117
+ * them for check, so the options (and a stored selection) would stay blank until an unrelated event.
118
+ */
119
+ readonly options: i0.WritableSignal<ContentDto[]>;
120
+ get multiple(): boolean;
121
+ get placeholder(): string;
122
+ protected configurationDefaults(): object;
123
+ protected createControl(): AbstractControl;
124
+ ngOnInit(): void;
125
+ static ɵfac: i0.ɵɵFactoryDeclaration<ContentControlComponent, never>;
126
+ static ɵcmp: i0.ɵɵComponentDeclaration<ContentControlComponent, "site-content-control", never, {}, {}, never, never, true, never>;
127
+ }
128
+
129
+ /** The registration key. Must equal `ContentFieldType.ControlName` on the server. */
130
+ declare const CONTENT_FIELD_TYPE_NAME = "Content";
131
+ /**
132
+ * Site's 8th field type, alongside the six the flex-fields library ships and Site's own `Seo` (the
133
+ * 7th). The server registers `ContentFieldType` through DI automatically; the client has no equivalent
134
+ * discovery, so it is registered here and wired in through `provideSite()` (GitHub issue #49).
135
+ *
136
+ * Named "Content" rather than DynamicForms' own "Entry" - Site's domain has no "Entry" concept, only
137
+ * `Content`, so the field type is named after what it actually references.
138
+ *
139
+ * **No search component.** `ContentFieldType.IndexValueType` is `Guid` on the server (so a future
140
+ * filter UI is possible), but no `searchComponent` ships this round - same state CKEditor/the file field
141
+ * are currently in.
142
+ */
143
+ declare const CONTENT_FIELD_TYPE: FieldTypeDefinition;
144
+
145
+ /**
146
+ * Displays the value of a `Content` field read-only: the referenced Content, resolved by id. An id
147
+ * that no longer resolves (deleted since picked) is silently dropped rather than shown as an error -
148
+ * the same "fail open" stance the server's own `Content.cshtml` partial takes.
149
+ */
150
+ declare class ContentViewComponent implements OnChanges {
151
+ private readonly contentAdminService;
152
+ showInList: boolean;
153
+ fields?: FlexFieldValue;
154
+ /** Registration key of the field type - always `Content` here. */
155
+ type?: string;
156
+ value: unknown;
157
+ /**
158
+ * A signal, not a plain field: it is filled by an HTTP callback, and this view renders in the content
159
+ * list's page flow, under the host layout's OnPush ancestors - a plain-field write there never marks
160
+ * them for check, so the cell would stay at `-` until an unrelated event.
161
+ */
162
+ readonly resolved: i0.WritableSignal<ContentDto[]>;
163
+ get summaryText(): string;
164
+ ngOnChanges(): void;
165
+ static ɵfac: i0.ɵɵFactoryDeclaration<ContentViewComponent, never>;
166
+ static ɵcmp: i0.ɵɵComponentDeclaration<ContentViewComponent, "site-content-view", never, { "showInList": { "alias": "showInList"; "required": false; }; "fields": { "alias": "fields"; "required": false; }; "type": { "alias": "type"; "required": false; }; "value": { "alias": "value"; "required": false; }; }, {}, never, never, true, never>;
167
+ }
168
+
169
+ /** Designer-side editor for a file field's configuration: which of Site's containers, one file or many. */
170
+ declare class FileConfigComponent extends FieldTypeConfigBase {
171
+ readonly containerNames: readonly ["images", "attachments"];
172
+ readonly names: {
173
+ readonly fileContainerName: "FileExplorer.FileContainerName";
174
+ readonly uploadFileMultiple: "FileExplorer.UploadFileMultiple";
175
+ };
176
+ protected configurationDefaults(): object;
177
+ static ɵfac: i0.ɵɵFactoryDeclaration<FileConfigComponent, never>;
178
+ static ɵcmp: i0.ɵɵComponentDeclaration<FileConfigComponent, "site-file-config", never, {}, {}, never, never, true, never>;
179
+ }
180
+
181
+ /**
182
+ * The configuration keys of the file field type. **Persisted data**: every field (and every Matrix
183
+ * block's nested configuration) stores them under these names, which date from when the field type was
184
+ * `Dignite.Abp.FlexFields`' - the same keys as the server's `FileFieldConfigurationNames`.
185
+ */
186
+ declare const FILE_FIELD_CONFIGURATION_NAMES: {
187
+ readonly fileContainerName: "FileExplorer.FileContainerName";
188
+ readonly uploadFileMultiple: "FileExplorer.UploadFileMultiple";
189
+ };
190
+ /** Configuration of a file field, shaped for `FormBuilder.group()`. */
191
+ declare class FileFieldConfiguration {
192
+ [FILE_FIELD_CONFIGURATION_NAMES.fileContainerName]: unknown;
193
+ [FILE_FIELD_CONFIGURATION_NAMES.uploadFileMultiple]: unknown;
194
+ }
195
+
196
+ /** Edits a file field's value: picks one or more files from Site's file library. */
197
+ declare class FileControlComponent extends FieldTypeControlBase {
198
+ get multiple(): boolean;
199
+ get containerName(): string;
200
+ /** No fallback container: an unconfigured field is a misconfiguration to surface, not paper over. */
201
+ get isContainerConfigured(): boolean;
202
+ protected configurationDefaults(): object;
203
+ protected createControl(): AbstractControl;
204
+ onSelectedFileChange(files: unknown[]): void;
205
+ static ɵfac: i0.ɵɵFactoryDeclaration<FileControlComponent, never>;
206
+ static ɵcmp: i0.ɵɵComponentDeclaration<FileControlComponent, "site-file-control", never, {}, {}, never, never, true, never>;
207
+ }
208
+
209
+ /**
210
+ * The registration key. **Persisted data** (every field definition of this type, Matrix block
211
+ * configurations included) - unchanged from when the field type was `Dignite.Abp.FlexFields`'; must equal
212
+ * the server's `FileFieldType.ControlName`.
213
+ */
214
+ declare const FILE_FIELD_TYPE_NAME = "FileExplorer";
215
+ /**
216
+ * The file field type: picks one or more files from Site's file library. Registered by `provideSite()`
217
+ * like `Seo` and `Content` - the client has no equivalent of the server's DI discovery.
218
+ *
219
+ * **No search component.** `FileFieldType.IndexValueType` is null - the value is an array of file
220
+ * objects with no typed index column to project into.
221
+ */
222
+ declare const FILE_FIELD_TYPE: FieldTypeDefinition;
223
+
224
+ /** The part of a picked file the view reads - what the picker denormalized into the value. */
225
+ interface FileFieldFileValue {
226
+ url?: string;
227
+ name?: string;
228
+ mimeType?: string;
229
+ }
230
+ /** Displays a file field's value read-only: the first file's preview, plus a count. */
231
+ declare class FileViewComponent {
232
+ /** Renders bare, without the label wrapper, for use inside a table cell. */
233
+ showInList: boolean;
234
+ fields?: FlexFieldValue;
235
+ /** Registration key of the field type (`FileExplorer`). */
236
+ type?: string;
237
+ value: unknown;
238
+ get files(): FileFieldFileValue[];
239
+ static ɵfac: i0.ɵɵFactoryDeclaration<FileViewComponent, never>;
240
+ static ɵcmp: i0.ɵɵComponentDeclaration<FileViewComponent, "site-file-view", never, { "showInList": { "alias": "showInList"; "required": false; }; "fields": { "alias": "fields"; "required": false; }; "type": { "alias": "type"; "required": false; }; "value": { "alias": "value"; "required": false; }; }, {}, never, never, true, never>;
241
+ }
242
+
243
+ /**
244
+ * Designer-side editor for a `Seo` field's configuration: the two advisory character limits.
245
+ *
246
+ * They are thresholds the value editor counts against, not validation - see {@link SeoConfiguration}.
247
+ */
248
+ declare class SeoConfigComponent extends FieldTypeConfigBase {
249
+ protected configurationDefaults(): object;
250
+ static ɵfac: i0.ɵɵFactoryDeclaration<SeoConfigComponent, never>;
251
+ static ɵcmp: i0.ɵɵComponentDeclaration<SeoConfigComponent, "site-seo-config", never, {}, {}, never, never, true, never>;
252
+ }
253
+
254
+ /**
255
+ * Configuration of a `Seo` field, shaped for `FormBuilder.group()`. Mirrors `SeoConfiguration`
256
+ * (`src/Dignite.Site.Domain/Seo/SeoConfiguration.cs`).
257
+ *
258
+ * The property names are the **stored** configuration keys, not a naming choice.
259
+ *
260
+ * Both limits are **advisory**. `SeoFieldType.Validate` does not reject an over-length value, because a
261
+ * search engine truncates an over-long title or description rather than rejecting it. They are a
262
+ * threshold for an editing UI (or AI-generated content) to aim for, so the control renders them as a
263
+ * counter and never as a `Validators.maxLength`.
264
+ */
265
+ declare class SeoConfiguration {
266
+ /** 60 - Google's practical truncation point for a search result title. */
267
+ 'Seo.MetaTitleCharLimit': unknown;
268
+ /** 160 - the conventional SERP snippet length. */
269
+ 'Seo.MetaDescriptionCharLimit': unknown;
270
+ }
271
+
272
+ interface IRemoteStreamContent {
273
+ fileName?: string | null;
274
+ contentType?: string;
275
+ contentLength?: number | null;
276
+ }
277
+
278
+ interface CreateDirectoryInput {
279
+ containerName: string;
280
+ name: string;
281
+ parentId?: string | null;
282
+ }
283
+ interface CreateFileInput {
284
+ containerName: string;
285
+ directoryId?: string | null;
286
+ file: IRemoteStreamContent;
287
+ }
288
+ interface DirectoryDescriptorDto extends ExtensibleAuditedEntityDto<string> {
289
+ containerName?: string;
290
+ name?: string;
291
+ parentId?: string | null;
292
+ order?: number;
293
+ }
294
+ interface DirectoryDescriptorInfoDto extends ExtensibleEntityDto<string> {
295
+ containerName?: string;
296
+ name?: string;
297
+ parentId?: string | null;
298
+ order?: number;
299
+ children?: DirectoryDescriptorInfoDto[];
300
+ }
301
+ interface FileContainerConfigurationDto {
302
+ maxBlobSize?: number;
303
+ allowedFileTypeNames?: string[];
304
+ createDirectoryPermissionName?: string | null;
305
+ createFilePermissionName?: string | null;
306
+ updateFilePermissionName?: string | null;
307
+ deleteFilePermissionName?: string | null;
308
+ getFilePermissionName?: string | null;
309
+ }
310
+ interface FileDescriptorDto extends CreationAuditedEntityDto<string> {
311
+ containerName?: string;
312
+ blobName?: string;
313
+ directoryId?: string | null;
314
+ size?: number;
315
+ name?: string;
316
+ mimeType?: string;
317
+ url?: string | null;
318
+ tenantId?: string | null;
319
+ }
320
+ interface GetDirectoriesInput {
321
+ containerName: string;
322
+ }
323
+ interface GetFilesInput extends PagedAndSortedResultRequestDto {
324
+ containerName: string;
325
+ directoryId?: string | null;
326
+ creatorId?: string | null;
327
+ filter?: string | null;
328
+ }
329
+ interface MoveDirectoryInput {
330
+ parentId?: string | null;
331
+ order?: number;
332
+ }
333
+ interface UpdateDirectoryInput {
334
+ name: string;
335
+ }
336
+ interface UpdateFileInput {
337
+ name?: string | null;
338
+ directoryId?: string | null;
339
+ directoryIdSpecified?: boolean;
340
+ }
341
+
342
+ declare class DirectoryAdminService {
343
+ private restService;
344
+ apiName: string;
345
+ create: (input: CreateDirectoryInput, config?: Partial<Rest.Config>) => rxjs.Observable<DirectoryDescriptorDto>;
346
+ delete: (id: string, config?: Partial<Rest.Config>) => rxjs.Observable<void>;
347
+ get: (id: string, config?: Partial<Rest.Config>) => rxjs.Observable<DirectoryDescriptorDto>;
348
+ getList: (input: GetDirectoriesInput, config?: Partial<Rest.Config>) => rxjs.Observable<ListResultDto<DirectoryDescriptorInfoDto>>;
349
+ move: (id: string, input: MoveDirectoryInput, config?: Partial<Rest.Config>) => rxjs.Observable<DirectoryDescriptorDto>;
350
+ update: (id: string, input: UpdateDirectoryInput, config?: Partial<Rest.Config>) => rxjs.Observable<DirectoryDescriptorDto>;
351
+ static ɵfac: i0.ɵɵFactoryDeclaration<DirectoryAdminService, never>;
352
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
353
+ }
354
+
355
+ declare class FileAdminService {
356
+ private restService;
357
+ apiName: string;
358
+ create: (input: CreateFileInput, config?: Partial<Rest.Config>) => rxjs.Observable<FileDescriptorDto>;
359
+ delete: (id: string, config?: Partial<Rest.Config>) => rxjs.Observable<void>;
360
+ get: (id: string, config?: Partial<Rest.Config>) => rxjs.Observable<FileDescriptorDto>;
361
+ getContainerConfiguration: (containerName: string, config?: Partial<Rest.Config>) => rxjs.Observable<FileContainerConfigurationDto>;
362
+ getList: (input: GetFilesInput, config?: Partial<Rest.Config>) => rxjs.Observable<PagedResultDto<FileDescriptorDto>>;
363
+ update: (id: string, input: UpdateFileInput, config?: Partial<Rest.Config>) => rxjs.Observable<FileDescriptorDto>;
364
+ static ɵfac: i0.ɵɵFactoryDeclaration<FileAdminService, never>;
365
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
366
+ }
367
+
368
+ type index_d$h_CreateDirectoryInput = CreateDirectoryInput;
369
+ type index_d$h_CreateFileInput = CreateFileInput;
370
+ type index_d$h_DirectoryAdminService = DirectoryAdminService;
371
+ declare const index_d$h_DirectoryAdminService: typeof DirectoryAdminService;
372
+ type index_d$h_DirectoryDescriptorDto = DirectoryDescriptorDto;
373
+ type index_d$h_DirectoryDescriptorInfoDto = DirectoryDescriptorInfoDto;
374
+ type index_d$h_FileAdminService = FileAdminService;
375
+ declare const index_d$h_FileAdminService: typeof FileAdminService;
376
+ type index_d$h_FileContainerConfigurationDto = FileContainerConfigurationDto;
377
+ type index_d$h_FileDescriptorDto = FileDescriptorDto;
378
+ type index_d$h_GetDirectoriesInput = GetDirectoriesInput;
379
+ type index_d$h_GetFilesInput = GetFilesInput;
380
+ type index_d$h_MoveDirectoryInput = MoveDirectoryInput;
381
+ type index_d$h_UpdateDirectoryInput = UpdateDirectoryInput;
382
+ type index_d$h_UpdateFileInput = UpdateFileInput;
383
+ declare namespace index_d$h {
384
+ export { index_d$h_DirectoryAdminService as DirectoryAdminService, index_d$h_FileAdminService as FileAdminService };
385
+ export type { index_d$h_CreateDirectoryInput as CreateDirectoryInput, index_d$h_CreateFileInput as CreateFileInput, index_d$h_DirectoryDescriptorDto as DirectoryDescriptorDto, index_d$h_DirectoryDescriptorInfoDto as DirectoryDescriptorInfoDto, index_d$h_FileContainerConfigurationDto as FileContainerConfigurationDto, index_d$h_FileDescriptorDto as FileDescriptorDto, index_d$h_GetDirectoriesInput as GetDirectoriesInput, index_d$h_GetFilesInput as GetFilesInput, index_d$h_MoveDirectoryInput as MoveDirectoryInput, index_d$h_UpdateDirectoryInput as UpdateDirectoryInput, index_d$h_UpdateFileInput as UpdateFileInput };
386
+ }
387
+
388
+ /**
389
+ * Edits the value of a `Seo` field.
390
+ *
391
+ * Unlike every built-in field type, this binds a **`FormGroup`** rather than a single control: the
392
+ * value is a composite object, and the group's shape is exactly `SeoFieldValue`, so what the form
393
+ * produces round-trips back to the server unchanged.
394
+ *
395
+ * **No sub-field is individually required, even when the field usage is.** The server's
396
+ * `SeoFieldType.Validate` only rejects a *missing bundle*; SEO fields are supplementary and the
397
+ * platform falls back to defaults for whatever is left blank (总体设计 §5.3). Since a `FormGroup`
398
+ * always produces an object, a required Seo field is satisfied by being rendered at all - adding
399
+ * `Validators.required` to the parts would enforce something the server does not.
400
+ *
401
+ * **The share image is picked, not typed** (GitHub issue #72): the file library's modal, fixed to the
402
+ * `images` container, uploads or selects one file and its `url` is what `ogImage` stores - still a
403
+ * plain string, so a value an MCP client wrote (an external address included) shows and can be replaced
404
+ * or removed the same way.
405
+ */
406
+ declare class SeoControlComponent extends FieldTypeControlBase {
407
+ readonly ogImageContainerName = "images";
408
+ readonly ogImageWidth = 1200;
409
+ readonly ogImageHeight = 630;
410
+ ogImagePickerOpen: boolean;
411
+ protected configurationDefaults(): object;
412
+ /**
413
+ * Untyped on purpose. `FieldTypeControlBase.createControl` is declared to return
414
+ * `AbstractControl<any, any, any>`, and a typed `FormGroup<{...}>` is not assignable to it - typed
415
+ * forms fix `TRawValue` to the group's own shape. Every built-in field type returns a single
416
+ * control, so this is the first one to hit it.
417
+ */
418
+ protected createControl(): AbstractControl;
419
+ /** The bound group, for the template's counters. */
420
+ get seoGroup(): UntypedFormGroup | null;
421
+ /** The stored share image address, or '' when there is none. */
422
+ get ogImage(): string;
423
+ onOgImagePicked(files: FileDescriptorDto[]): void;
424
+ removeOgImage(): void;
425
+ get metaTitleLength(): number;
426
+ get metaDescriptionLength(): number;
427
+ get metaTitleCharLimit(): number;
428
+ get metaDescriptionCharLimit(): number;
429
+ private setOgImage;
430
+ /**
431
+ * A fresh value is a live object; one that has round-tripped through storage arrives as parsed JSON.
432
+ * Anything else - the base class seeds `''` when there is no value - means "nothing stored yet".
433
+ */
434
+ private currentValue;
435
+ static ɵfac: i0.ɵɵFactoryDeclaration<SeoControlComponent, never>;
436
+ static ɵcmp: i0.ɵɵComponentDeclaration<SeoControlComponent, "site-seo-control", never, {}, {}, never, never, true, never>;
437
+ }
438
+
439
+ /** The registration key. Must equal `SeoFieldNames.FieldTypeName` on the server. */
440
+ declare const SEO_FIELD_TYPE_NAME = "Seo";
441
+ /**
442
+ * Site's seventh field type, alongside the six the flex-fields library ships. The server registers
443
+ * `SeoFieldType` through DI automatically; the client has no equivalent discovery, so it is registered
444
+ * here and wired in through `provideSite()`.
445
+ *
446
+ * This is not optional wiring: `seo` is a platform-preset seeded field, so a fresh install already has
447
+ * one. Without this registration `FieldTypeResolver.get('Seo')` throws and both the field designer and
448
+ * the content editor break on first use.
449
+ *
450
+ * **No search component.** `SeoFieldType.IndexValueType` is null - the value is a composite object with
451
+ * no typed index column to project into - so a `Seo` field can never be searched and must not offer a
452
+ * filter control.
453
+ *
454
+ * `displayNameKey` reads `FlexFieldsSite::...`, not `Site::...`: `SeoFieldType` moved from
455
+ * `Dignite.Site.Domain` into `Dignite.FlexFields.Site` alongside Content/Matrix/Table (GitHub issue
456
+ * #49), and its `LocalizationResource` moved with it.
457
+ */
458
+ declare const SEO_FIELD_TYPE: FieldTypeDefinition;
459
+
460
+ /**
461
+ * The value a `Seo` field stores. Mirrors `SeoFieldValue`
462
+ * (`src/Dignite.FlexFields.Site/Dignite/FlexFields/Site/Seo/SeoFieldValue.cs`); the server serializes it with
463
+ * `JsonSerializerDefaults.Web`, so the wire names are camelCase exactly as written here.
464
+ *
465
+ * One field, one composite value - a content type opts into the whole bundle with a single reference
466
+ * rather than pulling in four separate fields.
467
+ */
468
+ interface SeoFieldValue {
469
+ /** Overrides `<title>`/`og:title`; empty falls back to the content's own title field. */
470
+ metaTitle?: string;
471
+ /** Overrides `<meta name="description">`/`og:description`. */
472
+ metaDescription?: string;
473
+ /**
474
+ * Image URL for social sharing. The admin UI fills it with the (relative) `url` of a file picked from the
475
+ * `images` file container; any absolute image URL is equally valid (an MCP client may write one).
476
+ * When emitted as `og:image` a relative address is put on the site's primary domain, and an image from the
477
+ * site's file library is cropped to 1200x630.
478
+ */
479
+ ogImage?: string;
480
+ /**
481
+ * The one platform-recognized semantic: when true the content is excluded from the sitemap and gets
482
+ * a `noindex` robots meta tag.
483
+ */
484
+ noIndex?: boolean;
485
+ }
486
+
487
+ /**
488
+ * Displays the value of a `Seo` field read-only.
489
+ *
490
+ * In a list cell there is room for one thing, so it shows the meta title and flags `noindex` - the one
491
+ * part of the bundle with a platform-recognized consequence.
492
+ */
493
+ declare class SeoViewComponent {
494
+ readonly ogImageWidth = 1200;
495
+ readonly ogImageHeight = 630;
496
+ /** Renders bare, without the label wrapper, for use inside a table cell. */
497
+ showInList: boolean;
498
+ fields?: FlexFieldValue;
499
+ /** Registration key of the field type - always `Seo` here. */
500
+ type?: string;
501
+ value: unknown;
502
+ get seo(): SeoFieldValue;
503
+ get hasValue(): boolean;
504
+ static ɵfac: i0.ɵɵFactoryDeclaration<SeoViewComponent, never>;
505
+ static ɵcmp: i0.ɵɵComponentDeclaration<SeoViewComponent, "site-seo-view", never, { "showInList": { "alias": "showInList"; "required": false; }; "fields": { "alias": "fields"; "required": false; }; "type": { "alias": "type"; "required": false; }; "value": { "alias": "value"; "required": false; }; }, {}, never, never, true, never>;
506
+ }
507
+
508
+ declare const MY_FILES_NODE_KEY = "__site-my-files__";
509
+ declare const isMyFilesNode: (node: {
510
+ key?: string;
511
+ } | null | undefined) => boolean;
512
+ /**
513
+ * A directory, reshaped in place by {@link FileDirectoryTreeComponent.buildNodeTree} into
514
+ * what `abp-tree` expects (`title`/`key`/`children`/...), plus the synthetic "My Files" virtual root.
515
+ */
516
+ interface DirectoryTreeNode extends Partial<DirectoryDescriptorDto> {
517
+ key: string;
518
+ title: string;
519
+ children: DirectoryTreeNode[];
520
+ expanded: boolean;
521
+ isLeaf?: boolean;
522
+ isVirtualRoot?: boolean;
523
+ isFirstChildOfDirectory?: boolean;
524
+ }
525
+ declare class FileDirectoryTreeComponent implements AfterContentInit {
526
+ private directoryAdminService;
527
+ private fb;
528
+ private confirmation;
529
+ private localizationService;
530
+ private readonly hostElement;
531
+ constructor(directoryAdminService: DirectoryAdminService, fb: FormBuilder, confirmation: ConfirmationService, localizationService: LocalizationService);
532
+ directoryTree: DirectoryTreeNode[];
533
+ selectedTreeNode: DirectoryTreeNode | undefined;
534
+ set theSelectedTreeNode(v: DirectoryTreeNode | undefined);
535
+ nodeBeingEdited: DirectoryTreeNode | undefined;
536
+ expandedNodeKeys: string[];
537
+ set fileContainerName(v: string);
538
+ get fileContainerName(): string;
539
+ private _fileContainerName;
540
+ nodeClick: EventEmitter<DirectoryTreeNode>;
541
+ treeNodeData: EventEmitter<DirectoryTreeNode[]>;
542
+ ngAfterContentInit(): void;
543
+ loadData(): void;
544
+ private loadDirectoryTree;
545
+ private createMyFilesNode;
546
+ isMyFilesNode: (node: {
547
+ key?: string;
548
+ } | null | undefined) => boolean;
549
+ /** Reshapes the flat, parent-referencing directory list into the nested tree `abp-tree` renders. */
550
+ private buildNodeTree;
551
+ /** Dragged-directory highlight state, tracked globally so it clears even if the drop lands outside the tree. */
552
+ isDirectoryDragging: boolean;
553
+ onDirectoryDragStart(event: DragEvent): void;
554
+ onDirectoryDragEnd(): void;
555
+ beforeDrop: (arg: unknown) => rxjs.Observable<boolean>;
556
+ /**
557
+ * The node icon itself stops propagation via `(click)="$event.stopPropagation()"`, so a click on
558
+ * it never reaches here - no need to distinguish where the click came from.
559
+ */
560
+ activeNode(node: DirectoryTreeNode): void;
561
+ isNodeSelected: (node: DirectoryTreeNode) => boolean;
562
+ onExpandChange(event: {
563
+ node: DirectoryTreeNode;
564
+ }): void;
565
+ directoryFormModalOpen: boolean;
566
+ directoryFormBusy: boolean;
567
+ directoryForm: FormGroup | undefined;
568
+ directoryFormSubmit: ElementRef<HTMLButtonElement>;
569
+ openDirectoryForm(parentNode?: DirectoryTreeNode, editing?: boolean): void;
570
+ deleteDirectory(node: DirectoryTreeNode): void;
571
+ onDirectoryFormVisibleChange(visible: boolean): void;
572
+ private readonly validatorsService;
573
+ saveDirectoryForm(): void;
574
+ static ɵfac: i0.ɵɵFactoryDeclaration<FileDirectoryTreeComponent, never>;
575
+ static ɵcmp: i0.ɵɵComponentDeclaration<FileDirectoryTreeComponent, "site-file-directory-tree", never, { "theSelectedTreeNode": { "alias": "theSelectedTreeNode"; "required": false; }; "fileContainerName": { "alias": "fileContainerName"; "required": false; }; }, { "nodeClick": "nodeClick"; "treeNodeData": "treeNodeData"; }, never, never, true, never>;
576
+ }
577
+
578
+ /** A file mid-upload, tracked alongside its outcome for the status toast. */
579
+ interface UploadingFile extends File {
580
+ status?: 1 | 2;
581
+ }
582
+ declare class FileModalComponent implements OnChanges {
583
+ private fileService;
584
+ private toaster;
585
+ readonly list: ListService;
586
+ private confirmation;
587
+ private localizationService;
588
+ private fileTable?;
589
+ private tableRecalculationFrame?;
590
+ readonly tableSortIcons: {
591
+ sortAscending: string;
592
+ sortDescending: string;
593
+ };
594
+ constructor(fileService: FileAdminService, toaster: ToasterService, list: ListService, confirmation: ConfirmationService, localizationService: LocalizationService);
595
+ private loadContainerConfiguration;
596
+ createDirectoryPermissionName: string;
597
+ /** No default: an unconfigured container is a caller bug, not implicitly "Images". */
598
+ set fileContainerName(v: string);
599
+ get fileContainerName(): string;
600
+ private _fileContainerName;
601
+ multiple: boolean;
602
+ sizeLimit: number;
603
+ set limit(v: number);
604
+ set visible(v: boolean);
605
+ visibleChange: EventEmitter<boolean>;
606
+ modalOpen: boolean;
607
+ /**
608
+ * The two secondary dialogs' open/busy flags are signals, not plain fields: they are written after an
609
+ * HTTP call returns (rename, move), and bound on `<abp-modal>` elements that sit in this component's own
610
+ * view - under the host layout's OnPush ancestors (`abp-router-outlet`, the LeptonX layouts), where a
611
+ * plain-field write in a response callback never marks the view for check, so the dialog would stay open
612
+ * until some unrelated event happened to. What renders *inside* a dialog (header/body/footer) is attached
613
+ * to the application root by `NgbModal` and refreshed on every tick, so the plain fields it reads
614
+ * (`data`, `uploadingFiles`, `isRenaming`, ...) are not affected.
615
+ */
616
+ readonly fileNameModalOpen: i0.WritableSignal<boolean>;
617
+ onFileNameModalVisibleChange(visible: boolean): void;
618
+ onModalVisibleChange(visible: boolean): void;
619
+ /** Recomputes the table's column widths once the modal has finished its open transition. */
620
+ onModalInit(): void;
621
+ private scheduleTableRecalculation;
622
+ modalSave(): void;
623
+ selectedTreeNode: DirectoryTreeNode | undefined;
624
+ private hasQueryHook;
625
+ loadData(): void;
626
+ /** Flattened directory list from the tree, for the breadcrumb-style path lookups below. */
627
+ private flattenedDirectories;
628
+ private getSelectedDirectoryId;
629
+ onTreeNodeData(nodes: DirectoryTreeNode[]): void;
630
+ private getDirectoryPath;
631
+ getFileDirectoryPath(directoryId: string | undefined): string;
632
+ private flattenTree;
633
+ onTreeNodeClick(node: DirectoryTreeNode): void;
634
+ uploadingFiles: UploadingFile[];
635
+ onFileInputChange(event: Event): Promise<void>;
636
+ private setUploadStatus;
637
+ private uploadFile;
638
+ data: PagedResultDto<FileDescriptorDto>;
639
+ filters: GetFilesInput;
640
+ selectFilefn: EventEmitter<FileDescriptorDto[]>;
641
+ private hookToQuery;
642
+ deleteSelectedFiles(): void;
643
+ private batchDeleteFiles;
644
+ readonly moveModalOpen: i0.WritableSignal<boolean>;
645
+ readonly moveModalBusy: i0.WritableSignal<boolean>;
646
+ moveTargetDirectoryNode: DirectoryTreeNode | undefined;
647
+ openMoveModal(): void;
648
+ onMoveTargetDirectoryChange(node: DirectoryTreeNode): void;
649
+ onMoveModalVisibleChange(visible: boolean): void;
650
+ moveSelectedFiles(): Promise<void>;
651
+ closeFileStatusModal(): void;
652
+ selectedFiles: FileDescriptorDto[];
653
+ isAllSelected: boolean;
654
+ selectPickerFile: FileDescriptorDto[];
655
+ ngOnChanges(changes: SimpleChanges): void;
656
+ onRowCheckboxChange(event: Event, row: FileDescriptorDto, rows: FileDescriptorDto[]): void;
657
+ private areAllSelected;
658
+ onSelectAllChange(event: Event, rows: FileDescriptorDto[]): void;
659
+ isRowSelected: (id: string) => boolean;
660
+ private removeDuplicatesById;
661
+ /** Editing form, one row at a time - opening a second one replaces it. */
662
+ fileNameForm: FormGroup | undefined;
663
+ editingFileRow: FileDescriptorDto | undefined;
664
+ isRenaming: boolean;
665
+ onSubmitFileName(): void;
666
+ onEditFileName(row: FileDescriptorDto): void;
667
+ onCancelFileNameEdit(): void;
668
+ static ɵfac: i0.ɵɵFactoryDeclaration<FileModalComponent, never>;
669
+ static ɵcmp: i0.ɵɵComponentDeclaration<FileModalComponent, "site-file-modal", never, { "fileContainerName": { "alias": "fileContainerName"; "required": false; }; "multiple": { "alias": "multiple"; "required": false; }; "limit": { "alias": "limit"; "required": false; }; "visible": { "alias": "visible"; "required": false; }; "selectPickerFile": { "alias": "selectPickerFile"; "required": false; }; }, { "visibleChange": "visibleChange"; "selectFilefn": "selectFilefn"; }, never, never, true, never>;
670
+ }
671
+
672
+ declare class FilePickerComponent implements OnChanges {
673
+ multiple: boolean;
674
+ /** No default: a caller that never specifies a container has a configuration bug, not an "Images" one. */
675
+ fileContainerName: string;
676
+ selectFormFile: FileDescriptorDto[];
677
+ selectedFileChange: EventEmitter<FileDescriptorDto[]>;
678
+ /** This component's single source of truth; also passed straight to the modal to reselect what's already picked. */
679
+ fileShowTable: FileDescriptorDto[];
680
+ modalOpen: boolean;
681
+ ngOnChanges(changes: SimpleChanges): void;
682
+ onSelectFile(files: FileDescriptorDto[]): void;
683
+ deleteFileTableItem(index: number): void;
684
+ drop(event: CdkDragDrop<FileDescriptorDto[]>): void;
685
+ static ɵfac: i0.ɵɵFactoryDeclaration<FilePickerComponent, never>;
686
+ static ɵcmp: i0.ɵɵComponentDeclaration<FilePickerComponent, "site-file-picker", never, { "multiple": { "alias": "multiple"; "required": false; }; "fileContainerName": { "alias": "fileContainerName"; "required": false; }; "selectFormFile": { "alias": "selectFormFile"; "required": false; }; }, { "selectedFileChange": "selectedFileChange"; }, never, never, true, never>;
687
+ }
688
+
689
+ /**
690
+ * Creates a short-lived object URL for a Blob so previews can reference the
691
+ * browser-managed blob instead of holding a base64 copy in memory. Callers own
692
+ * the returned URL and must revoke it (URL.revokeObjectURL) when it is no longer
693
+ * needed to avoid leaking the underlying blob.
694
+ */
695
+ declare class ObjectUrlService {
696
+ get(file: Blob): string;
697
+ static ɵfac: i0.ɵɵFactoryDeclaration<ObjectUrlService, never>;
698
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
699
+ }
700
+
701
+ declare class FormatFileSizePipe implements PipeTransform {
702
+ transform(bytes: number): string;
703
+ static ɵfac: i0.ɵɵFactoryDeclaration<FormatFileSizePipe, never>;
704
+ static ɵpipe: i0.ɵɵPipeDeclaration<FormatFileSizePipe, "formatFileSize", true>;
705
+ }
706
+
707
+ /** A locally-picked `File` awaiting upload, or an already-uploaded file passed in via `fileData`. */
708
+ interface UploadTableItem {
709
+ id?: string;
710
+ name?: string;
711
+ size: number;
712
+ type?: string;
713
+ fileSize?: string;
714
+ src?: string;
715
+ }
716
+ interface FileUploadChangeEvent {
717
+ theFilesToBeUploaded: UploadTableItem[];
718
+ deleteTheUploadedFiles: UploadTableItem[];
719
+ isSubmit: boolean;
720
+ }
721
+ declare class FileUploadComponent implements OnDestroy {
722
+ private formatFileSizePipe;
723
+ private objectUrlService;
724
+ private fileAdminService;
725
+ constructor(formatFileSizePipe: FormatFileSizePipe, objectUrlService: ObjectUrlService, fileAdminService: FileAdminService);
726
+ /**
727
+ * No default: an unconfigured container is not silently treated as any particular one - the
728
+ * upload input just doesn't render until a container is set (see the template).
729
+ */
730
+ set fileContainerName(v: string);
731
+ get fileContainerName(): string;
732
+ private _fileContainerName;
733
+ multiple: boolean;
734
+ /** Already-uploaded files to show pre-populated in the table, e.g. when editing an existing record. */
735
+ set fileData(files: UploadTableItem[]);
736
+ fileDataChange: EventEmitter<FileUploadChangeEvent>;
737
+ /**
738
+ * A signal, not a plain field: the container's real limit arrives in an HTTP callback, and a plain-field
739
+ * write there never marks a host's OnPush ancestors for check, so the "exceeds the maximum size" hint
740
+ * would keep showing the pre-fetch 1MB default until an unrelated event.
741
+ */
742
+ readonly sizeLimit: i0.WritableSignal<number>;
743
+ set limit(v: number);
744
+ filesTableData: UploadTableItem[];
745
+ private readonly previewObjectUrls;
746
+ private readonly deletedUploadedFiles;
747
+ fileUploadInput: ElementRef<HTMLInputElement>;
748
+ onFileInputChange(event: Event): Promise<void>;
749
+ deleteFileTableItem(index: number, item: UploadTableItem): void;
750
+ private addFiles;
751
+ private emitChange;
752
+ ngOnDestroy(): void;
753
+ private releasePreviewUrl;
754
+ static ɵfac: i0.ɵɵFactoryDeclaration<FileUploadComponent, never>;
755
+ static ɵcmp: i0.ɵɵComponentDeclaration<FileUploadComponent, "site-file-upload", never, { "fileContainerName": { "alias": "fileContainerName"; "required": false; }; "multiple": { "alias": "multiple"; "required": false; }; "fileData": { "alias": "fileData"; "required": false; }; "limit": { "alias": "limit"; "required": false; }; }, { "fileDataChange": "fileDataChange"; }, never, never, true, never>;
756
+ }
757
+
758
+ /**
759
+ * A thumbnail (image) or type icon (anything else) for one file. Site's file containers are publicly
760
+ * readable, so an image is shown straight from its public address (`/api/site-public/files/...`), asked
761
+ * for at the thumbnail's size so the browser does not download the full upload. The address is stored
762
+ * relative; it is shown - and linked - from the `SiteAdmin` API's host (`SiteFileUrlService`).
763
+ */
764
+ declare class FilePreviewComponent implements OnChanges {
765
+ private readonly fileUrls;
766
+ width: string;
767
+ /** The file's address: the public read endpoint's, or a local `blob:`/`data:` URL for a file not uploaded yet. */
768
+ src: string;
769
+ type: string;
770
+ name: string;
771
+ className: string;
772
+ /** Server-side resize for the thumbnail (cropped to fill when both are set). Ignored for a local URL. */
773
+ resizeWidth?: number;
774
+ resizeHeight?: number;
775
+ isImage: boolean;
776
+ isAudio: boolean;
777
+ isVideo: boolean;
778
+ displaySrc: string;
779
+ /** {@link src} where this UI can reach it - the download link. */
780
+ linkHref: string;
781
+ ngOnChanges(): void;
782
+ private updateFileType;
783
+ /** Falls back to a generic file icon when the type has no dedicated one. */
784
+ getFileIconClass(): string;
785
+ static ɵfac: i0.ɵɵFactoryDeclaration<FilePreviewComponent, never>;
786
+ static ɵcmp: i0.ɵɵComponentDeclaration<FilePreviewComponent, "site-file-preview", never, { "width": { "alias": "width"; "required": false; }; "src": { "alias": "src"; "required": false; }; "type": { "alias": "type"; "required": false; }; "name": { "alias": "name"; "required": false; }; "className": { "alias": "className"; "required": false; }; "resizeWidth": { "alias": "resizeWidth"; "required": false; }; "resizeHeight": { "alias": "resizeHeight"; "required": false; }; }, {}, never, never, true, never>;
787
+ }
788
+
789
+ interface FileTypeIcon {
790
+ type: string;
791
+ icon: string;
792
+ }
793
+ /** Fallback icon by MIME type (or file extension, for the few types MIME can't distinguish). */
794
+ declare const IMAGE_TYPE_OPTIONS: readonly FileTypeIcon[];
795
+
796
+ /**
797
+ * Lets a CKEditor field work with Site's images on the `SiteAdmin` API's host while storing them relative.
798
+ * A stored address is relative (`<img src="/api/site-public/files/...">`, see `SITE_FILE_PATH`), and this
799
+ * admin UI is served from another origin, where it does not resolve.
800
+ *
801
+ * So the editor's **model** holds the absolute address, and only the data the editor hands out is
802
+ * relative: a plugin converts an image's `src` (`imageBlock`/`imageInline`) on the way in (upcast:
803
+ * `setData()`, the initial value, a paste) from relative to absolute, and on the way out (data downcast:
804
+ * `getData()` - the form value that is saved, the Source view, a copy) from absolute back to relative.
805
+ * Everything CKEditor itself does with the model's `src` then just works: the editing view shows it, and
806
+ * `ImageUtils.setImageNaturalSizeAttributes` reads an uploaded image's size from it (`width`/`height`).
807
+ * HTML and Markdown fields alike: both load images into the same model. Links (`<a href>`) are left alone.
808
+ * The upload provider hands the editor the absolute address for the same reason.
809
+ *
810
+ * Registered by `provideSite()` under `CKEDITOR_CONFIG_CONTRIBUTORS` (with `useFactory`, so it can inject);
811
+ * the pattern is the one in `@dignite/ng.flex-fields-ckeditor`'s README, "Customizing the editor
812
+ * configuration".
813
+ */
814
+ declare function siteCKEditorConfigContributor(): CKEditorConfigContributor;
815
+
816
+ /**
817
+ * Lets the read-only rich-text view (`ff-ckeditor-view`: a content list cell, say) show Site's images on the
818
+ * `SiteAdmin` API's host. The stored HTML holds relative addresses (`<img src="/api/site-public/files/...">`,
819
+ * see `SITE_FILE_PATH`), which do not resolve when this admin UI is served from another origin. The editor
820
+ * itself is handled by `siteCKEditorConfigContributor`; this is its counterpart for the view, which has no
821
+ * editor to convert in.
822
+ *
823
+ * Only `src` is rewritten, in the double- and single-quoted spellings; links (`<a href>`) are left alone, as
824
+ * in the editor. The result is for display only: the view never hands HTML back, so nothing saved carries the
825
+ * host. When the UI shares its API's origin (`apiBase` empty) the HTML comes back untouched.
826
+ *
827
+ * Registered by `provideSite()` under `CKEDITOR_DISPLAY_CONTRIBUTORS` (with `useFactory`, so it can inject);
828
+ * the pattern is the one in `@dignite/ng.flex-fields-ckeditor`'s README, "Customizing the read-only view".
829
+ */
830
+ declare function siteCKEditorDisplayContributor(): CKEditorDisplayContributor;
831
+
832
+ /**
833
+ * Uploads an image inserted into a CKEditor field into Site's file library and hands the editor the
834
+ * file's public address to embed - the same `/api/site-public/files/...` address a file field stores, so
835
+ * the image is served to visitors like any other site file. Registered as the `CKEDITOR_UPLOAD_PROVIDER`
836
+ * by `provideSite()`; the field's `CKEditor.ImagesContainerName` names the container (normally
837
+ * `images`).
838
+ *
839
+ * The editor gets the address on the `SiteAdmin` API's host: its model holds absolute addresses, so it can
840
+ * show the image and read its size (`width`/`height`); `siteCKEditorConfigContributor` turns it back into
841
+ * the relative address the server handed out when the editor's data is read and saved.
842
+ */
843
+ declare class SiteCKEditorUploadProvider implements CKEditorUploadProvider {
844
+ private readonly fileAdminService;
845
+ private readonly fileUrls;
846
+ upload(file: File, containerName: string): Observable<string>;
847
+ static ɵfac: i0.ɵɵFactoryDeclaration<SiteCKEditorUploadProvider, never>;
848
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
849
+ }
850
+
851
+ /**
852
+ * Site's file containers - the server's `SiteFileContainerNames`. The file library works in these only;
853
+ * a file field names one of them. `images` takes pictures, `attachments` documents only.
854
+ */
855
+ declare const SITE_FILE_CONTAINER_NAMES: readonly ["images", "attachments"];
856
+ /** Pictures only (raster formats, no SVG) - what a share image or an image field uses. */
857
+ declare const SITE_IMAGES_CONTAINER_NAME = "images";
858
+
859
+ /**
860
+ * The path every Site file is served under - the server's `SiteFileUrl.RoutePrefix`. The admin API hands
861
+ * out addresses relative to it (`FileDescriptorDto.url`, `/api/site-public/files/...?__tenant=`), and that
862
+ * relative address is what a field stores: no host is written into content. The public site resolves it
863
+ * against its own origin; this admin UI, served from another origin, shows it from its `SiteAdmin` API
864
+ * host (`SiteFileUrlService`).
865
+ */
866
+ declare const SITE_FILE_PATH = "/api/site-public/files/";
867
+ /** Whether `url` addresses a file Site serves (and so can be resized), as opposed to an external image. */
868
+ declare function isSiteFileUrl(url: string | null | undefined): boolean;
869
+ /**
870
+ * `url` asked for at `width` x `height` (`?Width=&Height=`, the server crops to fill when both are given),
871
+ * keeping every other query parameter - `__tenant` in particular. Anything that is not a Site file address
872
+ * (a local `blob:` URL, an external image) comes back unchanged, as does a call without a size. Mirrors the
873
+ * server's `SiteFileUrl.Sized`.
874
+ */
875
+ declare function sizedFileUrl(url: string | null | undefined, width?: number, height?: number): string;
876
+ /**
877
+ * `url` on `apiBase` when it is a relative Site file address; anything else - an absolute address, a local
878
+ * `blob:`/`data:` URL, an external image - comes back unchanged, as does every address when `apiBase` is
879
+ * empty (an admin UI served from its API's own origin). Mirrors the server's `SiteFileUrl.Absolutize`.
880
+ */
881
+ declare function absoluteFileUrl(url: string | null | undefined, apiBase: string): string;
882
+
883
+ /**
884
+ * Where this admin UI shows Site's files from. A stored address is relative (`/api/site-public/files/...`,
885
+ * see `SITE_FILE_PATH`), and this UI is served from an origin of its own, so the previews
886
+ * (`site-file-preview`: the file picker and modal, a file field, the SEO share image) put the `SiteAdmin`
887
+ * API's host - `environment.apis.SiteAdmin.url`, where the file library's admin API lives - in front of it.
888
+ * The CKEditor field does the same inside the editor (`siteCKEditorConfigContributor`). Nothing that is
889
+ * saved carries that host.
890
+ */
891
+ declare class SiteFileUrlService {
892
+ private readonly environment;
893
+ /** The `SiteAdmin` API's base URL, with no trailing slash; empty when the UI shares its API's origin. */
894
+ get apiBase(): string;
895
+ /** A stored file address as this UI loads it - see `absoluteFileUrl`. */
896
+ toDisplay(url: string | null | undefined): string;
897
+ static ɵfac: i0.ɵɵFactoryDeclaration<SiteFileUrlService, never>;
898
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
899
+ }
900
+
901
+ declare class ValidatorsService {
902
+ private toaster;
903
+ private localizationService;
904
+ constructor(toaster: ToasterService, localizationService: LocalizationService);
905
+ isCheckForm(input: {
906
+ [key: string]: boolean;
907
+ }, module?: string): boolean;
908
+ getFormValidationStatus(formEntity: FormGroup | FormArray): Record<string, boolean>;
909
+ static ɵfac: i0.ɵɵFactoryDeclaration<ValidatorsService, never>;
910
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
911
+ }
912
+
913
+ declare enum FlexFieldQueryOperator {
914
+ Equals = 0,
915
+ NotEquals = 1,
916
+ Contains = 2,
917
+ GreaterThan = 3,
918
+ GreaterThanOrEqual = 4,
919
+ LessThan = 5,
920
+ LessThanOrEqual = 6,
921
+ In = 7
922
+ }
923
+ declare const flexFieldQueryOperatorOptions: _abp_ng_core.ABP.Option<typeof FlexFieldQueryOperator>[];
924
+
925
+ declare enum FlexFieldValueType {
926
+ String = 0,
927
+ Number = 1,
928
+ DateTime = 2,
929
+ Boolean = 3,
930
+ Guid = 4
931
+ }
932
+ declare const flexFieldValueTypeOptions: _abp_ng_core.ABP.Option<typeof FlexFieldValueType>[];
933
+
934
+ interface FlexFieldQueryCondition {
935
+ fieldId?: string;
936
+ fieldName?: string;
937
+ operator?: FlexFieldQueryOperator;
938
+ value?: string;
939
+ valueType?: FlexFieldValueType;
940
+ }
941
+
942
+ type index_d$g_FlexFieldQueryCondition = FlexFieldQueryCondition;
943
+ type index_d$g_FlexFieldQueryOperator = FlexFieldQueryOperator;
944
+ declare const index_d$g_FlexFieldQueryOperator: typeof FlexFieldQueryOperator;
945
+ type index_d$g_FlexFieldValueType = FlexFieldValueType;
946
+ declare const index_d$g_FlexFieldValueType: typeof FlexFieldValueType;
947
+ declare const index_d$g_flexFieldQueryOperatorOptions: typeof flexFieldQueryOperatorOptions;
948
+ declare const index_d$g_flexFieldValueTypeOptions: typeof flexFieldValueTypeOptions;
949
+ declare namespace index_d$g {
950
+ export { index_d$g_FlexFieldQueryOperator as FlexFieldQueryOperator, index_d$g_FlexFieldValueType as FlexFieldValueType, index_d$g_flexFieldQueryOperatorOptions as flexFieldQueryOperatorOptions, index_d$g_flexFieldValueTypeOptions as flexFieldValueTypeOptions };
951
+ export type { index_d$g_FlexFieldQueryCondition as FlexFieldQueryCondition };
952
+ }
953
+
954
+ declare namespace index_d$f {
955
+ export {
956
+ index_d$g as FlexFields,
957
+ };
958
+ }
959
+
960
+ interface CreateContentTypeDto {
961
+ pageId: string;
962
+ name: string;
963
+ displayName: string;
964
+ description?: string | null;
965
+ fields?: ContentTypeFieldDto[] | null;
966
+ }
967
+ interface UpdateContentTypeDto {
968
+ name: string;
969
+ displayName: string;
970
+ description?: string | null;
971
+ fields?: ContentTypeFieldDto[] | null;
972
+ }
973
+
974
+ declare class ContentTypeAdminService {
975
+ private restService;
976
+ apiName: string;
977
+ create: (input: CreateContentTypeDto, config?: Partial<Rest.Config>) => rxjs.Observable<ContentTypeDto>;
978
+ delete: (id: string, config?: Partial<Rest.Config>) => rxjs.Observable<void>;
979
+ findByName: (pageId: string, name: string, config?: Partial<Rest.Config>) => rxjs.Observable<ContentTypeDto>;
980
+ get: (id: string, config?: Partial<Rest.Config>) => rxjs.Observable<ContentTypeDto>;
981
+ getList: (config?: Partial<Rest.Config>) => rxjs.Observable<ListResultDto<ContentTypeDto>>;
982
+ getListByPage: (pageId: string, config?: Partial<Rest.Config>) => rxjs.Observable<ListResultDto<ContentTypeDto>>;
983
+ update: (id: string, input: UpdateContentTypeDto, config?: Partial<Rest.Config>) => rxjs.Observable<ContentTypeDto>;
984
+ static ɵfac: i0.ɵɵFactoryDeclaration<ContentTypeAdminService, never>;
985
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
986
+ }
987
+
988
+ type index_d$e_ContentTypeAdminService = ContentTypeAdminService;
989
+ declare const index_d$e_ContentTypeAdminService: typeof ContentTypeAdminService;
990
+ type index_d$e_CreateContentTypeDto = CreateContentTypeDto;
991
+ type index_d$e_UpdateContentTypeDto = UpdateContentTypeDto;
992
+ declare namespace index_d$e {
993
+ export { index_d$e_ContentTypeAdminService as ContentTypeAdminService };
994
+ export type { index_d$e_CreateContentTypeDto as CreateContentTypeDto, index_d$e_UpdateContentTypeDto as UpdateContentTypeDto };
995
+ }
996
+
997
+ interface CreateContentDto {
998
+ contentTypeId: string;
999
+ cultureName: string;
1000
+ slug?: string;
1001
+ publishTime: string;
1002
+ status?: ContentStatus;
1003
+ fieldValues?: Record<string, object> | null;
1004
+ }
1005
+ interface GetContentListInput extends PagedAndSortedResultRequestDto {
1006
+ pageId?: string | null;
1007
+ cultureName?: string | null;
1008
+ contentTypeId?: string | null;
1009
+ status?: ContentStatus | null;
1010
+ publishedBefore?: string | null;
1011
+ publishedAfter?: string | null;
1012
+ filter?: string | null;
1013
+ flexFieldConditions?: FlexFieldQueryCondition[] | null;
1014
+ }
1015
+ interface UpdateContentDto {
1016
+ slug?: string;
1017
+ publishTime: string;
1018
+ status?: ContentStatus;
1019
+ fieldValues?: Record<string, object> | null;
1020
+ contentTypeId?: string | null;
1021
+ }
1022
+
1023
+ declare class ContentAdminService {
1024
+ private restService;
1025
+ apiName: string;
1026
+ create: (input: CreateContentDto, config?: Partial<Rest.Config>) => rxjs.Observable<ContentDto>;
1027
+ delete: (id: string, config?: Partial<Rest.Config>) => rxjs.Observable<void>;
1028
+ findBySlug: (pageId: string, cultureName: string, slug: string, config?: Partial<Rest.Config>) => rxjs.Observable<ContentDto>;
1029
+ get: (id: string, config?: Partial<Rest.Config>) => rxjs.Observable<ContentDto>;
1030
+ getList: (input: GetContentListInput, config?: Partial<Rest.Config>) => rxjs.Observable<PagedResultDto<ContentDto>>;
1031
+ update: (id: string, input: UpdateContentDto, config?: Partial<Rest.Config>) => rxjs.Observable<ContentDto>;
1032
+ static ɵfac: i0.ɵɵFactoryDeclaration<ContentAdminService, never>;
1033
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
1034
+ }
1035
+
1036
+ type index_d$d_ContentAdminService = ContentAdminService;
1037
+ declare const index_d$d_ContentAdminService: typeof ContentAdminService;
1038
+ type index_d$d_CreateContentDto = CreateContentDto;
1039
+ type index_d$d_GetContentListInput = GetContentListInput;
1040
+ type index_d$d_UpdateContentDto = UpdateContentDto;
1041
+ declare namespace index_d$d {
1042
+ export { index_d$d_ContentAdminService as ContentAdminService };
1043
+ export type { index_d$d_CreateContentDto as CreateContentDto, index_d$d_GetContentListInput as GetContentListInput, index_d$d_UpdateContentDto as UpdateContentDto };
1044
+ }
1045
+
1046
+ interface CreateFieldDto {
1047
+ name: string;
1048
+ displayName: string;
1049
+ fieldTypeName: string;
1050
+ description?: string | null;
1051
+ configuration?: Record<string, object> | null;
1052
+ groupName?: string | null;
1053
+ }
1054
+ interface GetFieldListInput {
1055
+ filter?: string | null;
1056
+ }
1057
+ interface RenameFieldDto {
1058
+ newName: string;
1059
+ }
1060
+ interface UpdateFieldDto {
1061
+ displayName: string;
1062
+ fieldTypeName: string;
1063
+ description?: string | null;
1064
+ configuration?: Record<string, object> | null;
1065
+ groupName?: string | null;
1066
+ }
1067
+
1068
+ interface FieldDto extends FullAuditedEntityDto<string> {
1069
+ name?: string;
1070
+ displayName?: string;
1071
+ description?: string | null;
1072
+ fieldTypeName?: string;
1073
+ configuration?: Record<string, object>;
1074
+ groupName?: string | null;
1075
+ }
1076
+ interface FieldTypeDto {
1077
+ name?: string;
1078
+ indexable?: boolean;
1079
+ composite?: boolean;
1080
+ valueShape?: FieldValuePropertyDto[] | null;
1081
+ }
1082
+ interface FieldValuePropertyDto {
1083
+ name?: string;
1084
+ type?: string;
1085
+ description?: string | null;
1086
+ }
1087
+
1088
+ declare class FieldAdminService {
1089
+ private restService;
1090
+ apiName: string;
1091
+ create: (input: CreateFieldDto, config?: Partial<Rest.Config>) => rxjs.Observable<FieldDto>;
1092
+ delete: (id: string, config?: Partial<Rest.Config>) => rxjs.Observable<void>;
1093
+ findByName: (name: string, config?: Partial<Rest.Config>) => rxjs.Observable<FieldDto>;
1094
+ get: (id: string, config?: Partial<Rest.Config>) => rxjs.Observable<FieldDto>;
1095
+ getFieldTypes: (config?: Partial<Rest.Config>) => rxjs.Observable<ListResultDto<FieldTypeDto>>;
1096
+ getList: (input: GetFieldListInput, config?: Partial<Rest.Config>) => rxjs.Observable<ListResultDto<FieldDto>>;
1097
+ rename: (id: string, input: RenameFieldDto, config?: Partial<Rest.Config>) => rxjs.Observable<FieldDto>;
1098
+ update: (id: string, input: UpdateFieldDto, config?: Partial<Rest.Config>) => rxjs.Observable<FieldDto>;
1099
+ static ɵfac: i0.ɵɵFactoryDeclaration<FieldAdminService, never>;
1100
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
1101
+ }
1102
+
1103
+ type index_d$c_CreateFieldDto = CreateFieldDto;
1104
+ type index_d$c_FieldAdminService = FieldAdminService;
1105
+ declare const index_d$c_FieldAdminService: typeof FieldAdminService;
1106
+ type index_d$c_GetFieldListInput = GetFieldListInput;
1107
+ type index_d$c_RenameFieldDto = RenameFieldDto;
1108
+ type index_d$c_UpdateFieldDto = UpdateFieldDto;
1109
+ declare namespace index_d$c {
1110
+ export { index_d$c_FieldAdminService as FieldAdminService };
1111
+ export type { index_d$c_CreateFieldDto as CreateFieldDto, index_d$c_GetFieldListInput as GetFieldListInput, index_d$c_RenameFieldDto as RenameFieldDto, index_d$c_UpdateFieldDto as UpdateFieldDto };
1112
+ }
1113
+
1114
+ interface CreatePageDto {
1115
+ name: string;
1116
+ displayName: string;
1117
+ route: string;
1118
+ template: string;
1119
+ parentId?: string | null;
1120
+ isActive?: boolean;
1121
+ }
1122
+ interface GetPageListInput {
1123
+ isActive?: boolean | null;
1124
+ filter?: string | null;
1125
+ }
1126
+ interface UpdatePageDto {
1127
+ name: string;
1128
+ displayName: string;
1129
+ route: string;
1130
+ template: string;
1131
+ parentId?: string | null;
1132
+ isActive?: boolean;
1133
+ }
1134
+
1135
+ interface PageDto extends FullAuditedEntityDto<string> {
1136
+ name?: string;
1137
+ displayName?: string;
1138
+ route?: string;
1139
+ template?: string;
1140
+ isHomePage?: boolean;
1141
+ parentId?: string | null;
1142
+ isActive?: boolean;
1143
+ contentTypes?: ContentTypeDto[] | null;
1144
+ }
1145
+
1146
+ declare class PageAdminService {
1147
+ private restService;
1148
+ apiName: string;
1149
+ create: (input: CreatePageDto, config?: Partial<Rest.Config>) => rxjs.Observable<PageDto>;
1150
+ delete: (id: string, config?: Partial<Rest.Config>) => rxjs.Observable<void>;
1151
+ findByName: (name: string, config?: Partial<Rest.Config>) => rxjs.Observable<PageDto>;
1152
+ get: (id: string, config?: Partial<Rest.Config>) => rxjs.Observable<PageDto>;
1153
+ getList: (input: GetPageListInput, config?: Partial<Rest.Config>) => rxjs.Observable<ListResultDto<PageDto>>;
1154
+ update: (id: string, input: UpdatePageDto, config?: Partial<Rest.Config>) => rxjs.Observable<PageDto>;
1155
+ static ɵfac: i0.ɵɵFactoryDeclaration<PageAdminService, never>;
1156
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
1157
+ }
1158
+
1159
+ type index_d$b_CreatePageDto = CreatePageDto;
1160
+ type index_d$b_GetPageListInput = GetPageListInput;
1161
+ type index_d$b_PageAdminService = PageAdminService;
1162
+ declare const index_d$b_PageAdminService: typeof PageAdminService;
1163
+ type index_d$b_UpdatePageDto = UpdatePageDto;
1164
+ declare namespace index_d$b {
1165
+ export { index_d$b_PageAdminService as PageAdminService };
1166
+ export type { index_d$b_CreatePageDto as CreatePageDto, index_d$b_GetPageListInput as GetPageListInput, index_d$b_UpdatePageDto as UpdatePageDto };
1167
+ }
1168
+
1169
+ interface SiteSchemaContentTypeDto {
1170
+ name?: string;
1171
+ displayName?: string;
1172
+ description?: string | null;
1173
+ fields?: SiteSchemaFieldDto[];
1174
+ }
1175
+ interface SiteSchemaDto {
1176
+ enabledLanguages?: string[];
1177
+ defaultLanguage?: string;
1178
+ primaryDomain?: string;
1179
+ pages?: SiteSchemaPageDto[];
1180
+ }
1181
+ interface SiteSchemaFieldDto {
1182
+ name?: string;
1183
+ displayName?: string;
1184
+ description?: string | null;
1185
+ fieldTypeName?: string;
1186
+ configuration?: Record<string, object>;
1187
+ required?: boolean;
1188
+ searchable?: boolean;
1189
+ order?: number;
1190
+ showInList?: boolean;
1191
+ }
1192
+ interface SiteSchemaPageDto {
1193
+ name?: string;
1194
+ displayName?: string;
1195
+ route?: string;
1196
+ isHomePage?: boolean;
1197
+ isActive?: boolean;
1198
+ parent?: string | null;
1199
+ contentTypes?: SiteSchemaContentTypeDto[];
1200
+ }
1201
+
1202
+ declare class SiteSchemaAdminService {
1203
+ private restService;
1204
+ apiName: string;
1205
+ get: (config?: Partial<Rest.Config>) => rxjs.Observable<SiteSchemaDto>;
1206
+ static ɵfac: i0.ɵɵFactoryDeclaration<SiteSchemaAdminService, never>;
1207
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
1208
+ }
1209
+
1210
+ type index_d$a_SiteSchemaAdminService = SiteSchemaAdminService;
1211
+ declare const index_d$a_SiteSchemaAdminService: typeof SiteSchemaAdminService;
1212
+ type index_d$a_SiteSchemaContentTypeDto = SiteSchemaContentTypeDto;
1213
+ type index_d$a_SiteSchemaDto = SiteSchemaDto;
1214
+ type index_d$a_SiteSchemaFieldDto = SiteSchemaFieldDto;
1215
+ type index_d$a_SiteSchemaPageDto = SiteSchemaPageDto;
1216
+ declare namespace index_d$a {
1217
+ export { index_d$a_SiteSchemaAdminService as SiteSchemaAdminService };
1218
+ export type { index_d$a_SiteSchemaContentTypeDto as SiteSchemaContentTypeDto, index_d$a_SiteSchemaDto as SiteSchemaDto, index_d$a_SiteSchemaFieldDto as SiteSchemaFieldDto, index_d$a_SiteSchemaPageDto as SiteSchemaPageDto };
1219
+ }
1220
+
1221
+ declare namespace index_d$9 {
1222
+ export {
1223
+ index_d$e as ContentTypes,
1224
+ index_d$d as Contents,
1225
+ index_d$c as Fields,
1226
+ index_d$h as Files,
1227
+ index_d$b as Pages,
1228
+ index_d$a as Schema,
1229
+ };
1230
+ }
1231
+
1232
+ type index_d$8_ContentTypeDto = ContentTypeDto;
1233
+ type index_d$8_ContentTypeFieldDto = ContentTypeFieldDto;
1234
+ declare namespace index_d$8 {
1235
+ export type { index_d$8_ContentTypeDto as ContentTypeDto, index_d$8_ContentTypeFieldDto as ContentTypeFieldDto };
1236
+ }
1237
+
1238
+ type index_d$7_ContentDto = ContentDto;
1239
+ type index_d$7_ContentStatus = ContentStatus;
1240
+ declare const index_d$7_ContentStatus: typeof ContentStatus;
1241
+ declare const index_d$7_contentStatusOptions: typeof contentStatusOptions;
1242
+ declare namespace index_d$7 {
1243
+ export { index_d$7_ContentStatus as ContentStatus, index_d$7_contentStatusOptions as contentStatusOptions };
1244
+ export type { index_d$7_ContentDto as ContentDto };
1245
+ }
1246
+
1247
+ type index_d$6_FieldDto = FieldDto;
1248
+ type index_d$6_FieldTypeDto = FieldTypeDto;
1249
+ type index_d$6_FieldValuePropertyDto = FieldValuePropertyDto;
1250
+ declare namespace index_d$6 {
1251
+ export type { index_d$6_FieldDto as FieldDto, index_d$6_FieldTypeDto as FieldTypeDto, index_d$6_FieldValuePropertyDto as FieldValuePropertyDto };
1252
+ }
1253
+
1254
+ type index_d$5_PageDto = PageDto;
1255
+ declare namespace index_d$5 {
1256
+ export type { index_d$5_PageDto as PageDto };
1257
+ }
1258
+
1259
+ declare namespace index_d$4 {
1260
+ export {
1261
+ index_d$9 as Admin,
1262
+ index_d$8 as ContentTypes,
1263
+ index_d$7 as Contents,
1264
+ index_d$6 as Fields,
1265
+ index_d$5 as Pages,
1266
+ };
1267
+ }
1268
+
1269
+ declare namespace index_d$3 {
1270
+ export {
1271
+ index_d$f as Abp,
1272
+ index_d$4 as Site,
1273
+ };
1274
+ }
1275
+
1276
+ type index_d$2_IRemoteStreamContent = IRemoteStreamContent;
1277
+ declare namespace index_d$2 {
1278
+ export type { index_d$2_IRemoteStreamContent as IRemoteStreamContent };
1279
+ }
1280
+
1281
+ declare namespace index_d$1 {
1282
+ export {
1283
+ index_d$2 as Content,
1284
+ };
1285
+ }
1286
+
1287
+ declare namespace index_d {
1288
+ export {
1289
+ index_d$1 as Abp,
1290
+ };
1291
+ }
1292
+
1293
+ /**
1294
+ * Flattens a content-list query into the shape ASP.NET Core's model binder actually reads.
1295
+ *
1296
+ * `GET /api/site-admin/contents` binds `GetContentListInput` from the query string, and that input
1297
+ * carries `FlexFieldConditions: List<FlexFieldQueryCondition>` - a collection of complex objects.
1298
+ * ASP.NET Core binds those only from indexed keys (`flexFieldConditions[0].fieldId=...`), whereas the
1299
+ * generated proxy hands the array straight to `RestService`, which builds an `HttpParams` via
1300
+ * `{ fromObject }`. Angular stringifies each element, so the server receives
1301
+ * `flexFieldConditions=[object Object]` and every condition is silently dropped - no error, just
1302
+ * unfiltered results. Hence this translation rather than using the generated `getList`.
1303
+ *
1304
+ * The flex-fields demo does not need an equivalent because its list endpoint is a POST with a body
1305
+ * (`/api/app/product/search`); Site's is a GET, so the conditions have to survive the query string.
1306
+ */
1307
+ declare function toContentListParams(input: GetContentListInput): Record<string, unknown>;
1308
+
1309
+ interface ContentListState {
1310
+ filters: GetContentListInput;
1311
+ appliedConditions: FlexFieldQueryCondition[];
1312
+ /** Raw `flexFieldSearch` form value, keyed by field name - what each search widget should redisplay. */
1313
+ searchValues: Record<string, unknown>;
1314
+ page: number;
1315
+ sortKey: string | number;
1316
+ sortOrder: string;
1317
+ maxResultCount: number;
1318
+ }
1319
+ /**
1320
+ * Remembers the content list's filters, search conditions and paging across a round trip to the
1321
+ * create/edit page and back.
1322
+ *
1323
+ * `ContentsComponent` is destroyed on every route change - editing a content is a full page
1324
+ * (`content-editor.component.ts`), not a dialog - so without this, `filters`, the applied flex-field
1325
+ * search and the `ListService` it owns would all reset to their defaults every time an admin finishes
1326
+ * editing and returns to the list.
1327
+ *
1328
+ * In-memory rather than the URL: `flexFieldConditions` covers arbitrary per-content-type fields, and
1329
+ * round-tripping that shape through query params would need close to as much code as the search feature
1330
+ * itself. Losing the snapshot on a hard refresh is an acceptable trade for an admin filter, unlike a
1331
+ * shareable resource link.
1332
+ */
1333
+ declare class ContentListStateService {
1334
+ private snapshot?;
1335
+ save(state: ContentListState): void;
1336
+ restore(): ContentListState | undefined;
1337
+ static ɵfac: i0.ɵɵFactoryDeclaration<ContentListStateService, never>;
1338
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
1339
+ }
1340
+
1341
+ /**
1342
+ * Stands in for `ContentAdminService.getList` alone. Everything else on the generated proxy is used
1343
+ * directly - only the list call needs `flexFieldConditions` flattened before it reaches `RestService`
1344
+ * (see {@link toContentListParams}). Kept here rather than patched into `proxy/` so that re-running
1345
+ * `abp generate-proxy` cannot quietly revert the fix.
1346
+ */
1347
+ declare class ContentQueryService {
1348
+ private readonly restService;
1349
+ readonly apiName = "SiteAdmin";
1350
+ getList: (input: GetContentListInput, config?: Partial<Rest.Config>) => rxjs.Observable<PagedResultDto<ContentDto>>;
1351
+ static ɵfac: i0.ɵɵFactoryDeclaration<ContentQueryService, never>;
1352
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
1353
+ }
1354
+
1355
+ /**
1356
+ * The reference data every screen needs but none of them owns: the site's enabled languages, the whole
1357
+ * field library, and which field types can be indexed. Each is fetched once and replayed; call the
1358
+ * matching `invalidate*` after a write that would change it.
1359
+ *
1360
+ * **On the schema endpoint.** `GET /api/site-admin/schema` is keyed by *name* all the way down -
1361
+ * `SiteSchemaContentTypeDto` and `SiteSchemaFieldDto` carry no id. That shape exists for MCP, which
1362
+ * addresses everything by name. The admin UI cannot resolve a content type's fields through it, because
1363
+ * a `ContentDto` identifies its type only by `contentTypeId` (a Guid) and there is nothing to join a
1364
+ * Guid to a name on. So the schema is used here for site-level settings only; field resolution goes
1365
+ * through {@link getFieldsById}, joined against `ContentTypeDto.fields[].fieldId`.
1366
+ */
1367
+ declare class SiteReferenceDataService {
1368
+ private readonly schemaService;
1369
+ private readonly fieldService;
1370
+ private readonly contentTypeService;
1371
+ private schemaCache?;
1372
+ private fieldsCache?;
1373
+ private indexableCache?;
1374
+ private contentTypesCache?;
1375
+ /** Site-level settings. `enabledLanguages[0]` is the default language. */
1376
+ getSchema(): Observable<SiteSchemaDto>;
1377
+ /** The whole field library keyed by id - `ContentTypeFieldDto` carries only `fieldId`. */
1378
+ getFieldsById(): Observable<Map<string, FieldDto>>;
1379
+ /**
1380
+ * Whether a field type has a query-index slot at all, keyed by field type name. Straight from the
1381
+ * server: the answer is `IFieldType.IndexValueType`, and the Angular flex-fields library deliberately
1382
+ * does not restate it. A type that answers `false` can never be searched however its `searchable` flag
1383
+ * is set - `FlexFieldIndexManagerBase.GetIndexableFieldsAsync` skips it regardless.
1384
+ */
1385
+ getIndexableByFieldType(): Observable<Map<string, boolean>>;
1386
+ /**
1387
+ * Every content type, across every page, keyed by id - `ContentDto` carries only `contentTypeId`, and
1388
+ * `ContentTypeAdminService.getListByPage` alone cannot resolve a name for a row whose page is not the
1389
+ * one currently selected in a filter.
1390
+ */
1391
+ getContentTypesById(): Observable<Map<string, ContentTypeDto>>;
1392
+ invalidateFields(): void;
1393
+ invalidateSchema(): void;
1394
+ invalidateContentTypes(): void;
1395
+ static ɵfac: i0.ɵɵFactoryDeclaration<SiteReferenceDataService, never>;
1396
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
1397
+ }
1398
+
1399
+ /**
1400
+ * No `admin` path segment (unlike Dignite.Cms's `/cms/admin/...`): the public tier has no Angular UI,
1401
+ * so every route here is an admin route and the extra segment would carry no information.
1402
+ *
1403
+ * The parent deliberately has no `pathMatch: 'full'`. It did while this library was a stub, which
1404
+ * would have stopped any child route from ever matching.
1405
+ */
1406
+ declare const SITE_ROUTES: Routes;
1407
+
1408
+ export { CONTENT_FIELD_TYPE, CONTENT_FIELD_TYPE_NAME, ContentConfigComponent, ContentConfiguration, ContentControlComponent, ContentListStateService, ContentQueryService, ContentViewComponent, index_d$3 as Dignite, FILE_FIELD_CONFIGURATION_NAMES, FILE_FIELD_TYPE, FILE_FIELD_TYPE_NAME, FileConfigComponent, FileControlComponent, FileDirectoryTreeComponent, FileFieldConfiguration, FileModalComponent, FilePickerComponent, FilePreviewComponent, FileUploadComponent, FileViewComponent, FormatFileSizePipe, IMAGE_TYPE_OPTIONS, MY_FILES_NODE_KEY, ObjectUrlService, SEO_FIELD_TYPE, SEO_FIELD_TYPE_NAME, SITE_FILE_CONTAINER_NAMES, SITE_FILE_PATH, SITE_IMAGES_CONTAINER_NAME, SITE_ROUTES, SeoConfigComponent, SeoConfiguration, SeoControlComponent, SeoViewComponent, SiteCKEditorUploadProvider, SiteFileUrlService, SiteReferenceDataService, ValidatorsService, index_d as Volo, absoluteFileUrl, eSitePolicyNames, isMyFilesNode, isSiteFileUrl, siteCKEditorConfigContributor, siteCKEditorDisplayContributor, sizedFileUrl, toContentListParams };
1409
+ export type { ContentListState, DirectoryTreeNode, FileTypeIcon, FileUploadChangeEvent, SeoFieldValue };