@sitecore-jss/sitecore-jss-angular 23.0.0-canary.8 → 23.0.0

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.
@@ -1,23 +1,22 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, ViewContainerRef, TemplateRef, Input, Directive, HostBinding, Component, Renderer2, ElementRef, InjectionToken, Injector, createNgModule, Injectable, TransferState, EventEmitter, KeyValueDiffers, ChangeDetectorRef, PLATFORM_ID, ViewChild, ContentChild, Output, ɵisPromise as _isPromise, NgModule } from '@angular/core';
2
+ import { inject, ViewContainerRef, TemplateRef, Input, Directive, Renderer2, ElementRef, InjectionToken, Component, Injector, createNgModule, Injectable, EventEmitter, KeyValueDiffers, ChangeDetectorRef, PLATFORM_ID, ViewChild, ContentChild, Output, HostBinding, TransferState, ɵisPromise as _isPromise, NgModule } from '@angular/core';
3
3
  import { mediaApi } from '@sitecore-jss/sitecore-jss/media';
4
4
  export { mediaApi } from '@sitecore-jss/sitecore-jss/media';
5
- import { isFieldValueEmpty, EditMode, isDynamicPlaceholder, getDynamicPlaceholderPattern, LayoutServicePageState } from '@sitecore-jss/sitecore-jss/layout';
6
- export { EditMode, GraphQLLayoutService, LayoutServicePageState, RestLayoutService, getChildPlaceholder, getContentStylesheetLink, getFieldValue } from '@sitecore-jss/sitecore-jss/layout';
7
- import { MetadataKind, DEFAULT_PLACEHOLDER_UID, mapButtonToCommand, getJssPagesClientData } from '@sitecore-jss/sitecore-jss/editing';
8
- export { DefaultEditFrameButton, DefaultEditFrameButtons, handleEditorAnchors, isEditorActive, resetEditorChromes } from '@sitecore-jss/sitecore-jss/editing';
5
+ import { isFieldValueEmpty, isDynamicPlaceholder, getDynamicPlaceholderPattern } from '@sitecore-jss/sitecore-jss/layout';
6
+ export { GraphQLLayoutService, LayoutServicePageState, RestLayoutService, getChildPlaceholder, getFieldValue } from '@sitecore-jss/sitecore-jss/layout';
9
7
  import { Router, RedirectCommand, UrlTree, ActivatedRoute, ROUTES } from '@angular/router';
10
- import { isAbsoluteUrl, isServer } from '@sitecore-jss/sitecore-jss/utils';
8
+ import { isAbsoluteUrl } from '@sitecore-jss/sitecore-jss/utils';
11
9
  export { isServer } from '@sitecore-jss/sitecore-jss/utils';
12
10
  import * as i1 from '@angular/common';
13
- import { isPlatformServer, CommonModule, DatePipe, DOCUMENT, isPlatformBrowser } from '@angular/common';
14
- import { BehaviorSubject, Observable, isObservable, from, of, lastValueFrom } from 'rxjs';
11
+ import { isPlatformServer, CommonModule, DatePipe } from '@angular/common';
12
+ import { Observable, BehaviorSubject, isObservable, from, of, lastValueFrom } from 'rxjs';
15
13
  import { takeWhile, take, mergeMap } from 'rxjs/operators';
16
- import { constants, form, debug } from '@sitecore-jss/sitecore-jss';
14
+ import { constants } from '@sitecore-jss/sitecore-jss';
17
15
  export { ClientError, MemoryCacheClient, NativeDataFetcher, constants, debug, enableDebug } from '@sitecore-jss/sitecore-jss';
16
+ import { mapButtonToCommand } from '@sitecore-jss/sitecore-jss/editing';
17
+ export { DefaultEditFrameButton, DefaultEditFrameButtons, handleEditorAnchors, isEditorActive, resetEditorChromes } from '@sitecore-jss/sitecore-jss/editing';
18
18
  export { GraphQLDictionaryService, RestDictionaryService } from '@sitecore-jss/sitecore-jss/i18n';
19
- export { DefaultRetryStrategy, GraphQLRequestClient, getEdgeProxyContentUrl } from '@sitecore-jss/sitecore-jss/graphql';
20
- export { CdpHelper, DEFAULT_VARIANT, GraphQLPersonalizeService, getGroomedVariantIds, personalizeLayout } from '@sitecore-jss/sitecore-jss/personalize';
19
+ export { DefaultRetryStrategy, GraphQLRequestClient } from '@sitecore-jss/sitecore-jss/graphql';
21
20
  export { trackingApi } from '@sitecore-jss/sitecore-jss/tracking';
22
21
 
23
22
  /**
@@ -63,38 +62,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
63
62
  args: ['scFile']
64
63
  }] } });
65
64
 
66
- /**
67
- * Component that renders a field' metadata chrome element.
68
- */
69
- class FieldMetadataMarkerComponent {
70
- metadata;
71
- kind = MetadataKind.Open;
72
- get metadataString() {
73
- return this.metadata ? JSON.stringify(this.metadata) : '';
74
- }
75
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: FieldMetadataMarkerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
76
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: FieldMetadataMarkerComponent, isStandalone: true, selector: "code[scFieldMetadataMarker]", inputs: { metadata: "metadata", kind: "kind" }, host: { properties: { "attr.type": "\"text/sitecore\"", "attr.chrometype": "\"field\"", "class": "\"scpm\"", "attr.kind": "this.kind" } }, ngImport: i0, template: '{{ metadataString }}', isInline: true });
77
- }
78
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: FieldMetadataMarkerComponent, decorators: [{
79
- type: Component,
80
- args: [{
81
- selector: 'code[scFieldMetadataMarker]',
82
- template: '{{ metadataString }}',
83
- host: {
84
- '[attr.type]': '"text/sitecore"',
85
- '[attr.chrometype]': '"field"',
86
- '[class]': '"scpm"',
87
- },
88
- }]
89
- }], propDecorators: { metadata: [{
90
- type: Input
91
- }], kind: [{
92
- type: HostBinding,
93
- args: ['attr.kind']
94
- }, {
95
- type: Input
96
- }] } });
97
-
98
65
  /**
99
66
  * Base class that contains common functionality for the field directives.
100
67
  */
@@ -108,34 +75,6 @@ class BaseFieldDirective {
108
75
  shouldRender() {
109
76
  return !!this.field?.editable || !isFieldValueEmpty(this.field);
110
77
  }
111
- /**
112
- * Renders the empty field markup which is required by Pages in editMode 'metadata' in case field is empty.
113
- */
114
- renderEmpty() {
115
- if (this.field?.metadata && this.editable) {
116
- this.renderMetadata(MetadataKind.Open);
117
- if (this.emptyFieldEditingTemplate) {
118
- this.viewContainer.createEmbeddedView(this.emptyFieldEditingTemplate);
119
- }
120
- else {
121
- this.viewContainer.createComponent(this.defaultFieldEditingComponent);
122
- }
123
- this.renderMetadata(MetadataKind.Close);
124
- }
125
- }
126
- /**
127
- * Renders a metadata chrome marker for the field. Required by Pages in editMode 'metadata'.
128
- * @param {string} kind - 'open' or 'close' to indicate the start or end of the metadata chrome
129
- */
130
- renderMetadata(kind) {
131
- if (this.field?.metadata && this.editable) {
132
- const metadataChrome = this.viewContainer.createComponent(FieldMetadataMarkerComponent);
133
- metadataChrome.setInput('kind', kind);
134
- if (kind === MetadataKind.Open) {
135
- metadataChrome.setInput('metadata', this.field.metadata);
136
- }
137
- }
138
- }
139
78
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: BaseFieldDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
140
79
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: BaseFieldDirective, isStandalone: true, ngImport: i0 });
141
80
  }
@@ -143,30 +82,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
143
82
  type: Directive
144
83
  }] });
145
84
 
146
- /**
147
- * Default component that will be rendered in pages when image field is empty.
148
- */
149
- class DefaultEmptyImageFieldEditingComponent {
150
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: DefaultEmptyImageFieldEditingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
151
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: DefaultEmptyImageFieldEditingComponent, isStandalone: true, selector: "[sc-default-empty-image-field-editing-placeholder]", ngImport: i0, template: `
152
- <img
153
- alt=""
154
- src='data:image/svg+xml,%3Csvg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 240 240" style="enable-background:new 0 0 240 240;" xml:space="preserve"%3E%3Cstyle type="text/css"%3E .st0%7Bfill:none;%7D .st1%7Bfill:%23969696;%7D .st2%7Bfill:%23FFFFFF;%7D .st3%7Bfill:%23FFFFFF;stroke:%23FFFFFF;stroke-width:0.75;stroke-miterlimit:10;%7D%0A%3C/style%3E%3Cg%3E%3Crect class="st0" width="240" height="240"/%3E%3Cg%3E%3Cg%3E%3Crect x="20" y="20" class="st1" width="200" height="200"/%3E%3C/g%3E%3Cg%3E%3Ccircle class="st2" cx="174" cy="67" r="14"/%3E%3Cpath class="st2" d="M174,54c7.17,0,13,5.83,13,13s-5.83,13-13,13s-13-5.83-13-13S166.83,54,174,54 M174,52 c-8.28,0-15,6.72-15,15s6.72,15,15,15s15-6.72,15-15S182.28,52,174,52L174,52z"/%3E%3C/g%3E%3Cpolyline class="st3" points="29.5,179.25 81.32,122.25 95.41,137.75 137.23,91.75 209.5,179.75 "/%3E%3C/g%3E%3C/g%3E%3C/svg%3E'
155
- class="scEmptyImage"
156
- />
157
- `, isInline: true, styles: [":host{min-width:48px;min-height:48px;max-width:400px;max-height:400px;cursor:pointer}\n"] });
158
- }
159
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: DefaultEmptyImageFieldEditingComponent, decorators: [{
160
- type: Component,
161
- args: [{ selector: '[sc-default-empty-image-field-editing-placeholder]', template: `
162
- <img
163
- alt=""
164
- src='data:image/svg+xml,%3Csvg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 240 240" style="enable-background:new 0 0 240 240;" xml:space="preserve"%3E%3Cstyle type="text/css"%3E .st0%7Bfill:none;%7D .st1%7Bfill:%23969696;%7D .st2%7Bfill:%23FFFFFF;%7D .st3%7Bfill:%23FFFFFF;stroke:%23FFFFFF;stroke-width:0.75;stroke-miterlimit:10;%7D%0A%3C/style%3E%3Cg%3E%3Crect class="st0" width="240" height="240"/%3E%3Cg%3E%3Cg%3E%3Crect x="20" y="20" class="st1" width="200" height="200"/%3E%3C/g%3E%3Cg%3E%3Ccircle class="st2" cx="174" cy="67" r="14"/%3E%3Cpath class="st2" d="M174,54c7.17,0,13,5.83,13,13s-5.83,13-13,13s-13-5.83-13-13S166.83,54,174,54 M174,52 c-8.28,0-15,6.72-15,15s6.72,15,15,15s15-6.72,15-15S182.28,52,174,52L174,52z"/%3E%3C/g%3E%3Cpolyline class="st3" points="29.5,179.25 81.32,122.25 95.41,137.75 137.23,91.75 209.5,179.75 "/%3E%3C/g%3E%3C/g%3E%3C/svg%3E'
165
- class="scEmptyImage"
166
- />
167
- `, styles: [":host{min-width:48px;min-height:48px;max-width:400px;max-height:400px;cursor:pointer}\n"] }]
168
- }] });
169
-
170
85
  class ImageDirective extends BaseFieldDirective {
171
86
  field;
172
87
  editable = true;
@@ -180,14 +95,6 @@ class ImageDirective extends BaseFieldDirective {
180
95
  mediaUrlPrefix;
181
96
  urlParams = {};
182
97
  attrs = {};
183
- /**
184
- * Custom template to render in Pages in Metadata edit mode if field value is empty
185
- */
186
- emptyFieldEditingTemplate;
187
- /**
188
- * Default component to render in Pages in Metadata edit mode if field value is empty and emptyFieldEditingTemplate is not provided
189
- */
190
- defaultFieldEditingComponent = DefaultEmptyImageFieldEditingComponent;
191
98
  inlineRef = null;
192
99
  templateRef = inject(TemplateRef);
193
100
  renderer = inject(Renderer2);
@@ -204,7 +111,6 @@ class ImageDirective extends BaseFieldDirective {
204
111
  }
205
112
  updateView() {
206
113
  if (!this.shouldRender()) {
207
- super.renderEmpty();
208
114
  return;
209
115
  }
210
116
  const overrideAttrs = {
@@ -235,9 +141,7 @@ class ImageDirective extends BaseFieldDirective {
235
141
  }
236
142
  attrs = this.getImageAttrs(img, overrideAttrs, this.urlParams);
237
143
  if (attrs) {
238
- this.renderMetadata(MetadataKind.Open);
239
144
  this.renderTemplate(attrs);
240
- this.renderMetadata(MetadataKind.Close);
241
145
  }
242
146
  }
243
147
  getImageAttrs(fieldAttrs, parsedAttrs, imageParams) {
@@ -302,7 +206,7 @@ class ImageDirective extends BaseFieldDirective {
302
206
  this.inlineRef = span;
303
207
  }
304
208
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ImageDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
305
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: ImageDirective, isStandalone: true, selector: "[scImage]", inputs: { field: ["scImage", "field"], editable: ["scImageEditable", "editable"], mediaUrlPrefix: ["scImageMediaUrlPrefix", "mediaUrlPrefix"], urlParams: ["scImageUrlParams", "urlParams"], attrs: ["scImageAttrs", "attrs"], emptyFieldEditingTemplate: ["scImageEmptyFieldEditingTemplate", "emptyFieldEditingTemplate"] }, usesInheritance: true, usesOnChanges: true, ngImport: i0 });
209
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: ImageDirective, isStandalone: true, selector: "[scImage]", inputs: { field: ["scImage", "field"], editable: ["scImageEditable", "editable"], mediaUrlPrefix: ["scImageMediaUrlPrefix", "mediaUrlPrefix"], urlParams: ["scImageUrlParams", "urlParams"], attrs: ["scImageAttrs", "attrs"] }, usesInheritance: true, usesOnChanges: true, ngImport: i0 });
306
210
  }
307
211
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: ImageDirective, decorators: [{
308
212
  type: Directive,
@@ -322,38 +226,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
322
226
  }], attrs: [{
323
227
  type: Input,
324
228
  args: ['scImageAttrs']
325
- }], emptyFieldEditingTemplate: [{
326
- type: Input,
327
- args: ['scImageEmptyFieldEditingTemplate']
328
229
  }] } });
329
230
 
330
- /**
331
- * Default component that will be rendered in pages when field is empty; applies for text, richtext, date and link fields.
332
- */
333
- class DefaultEmptyFieldEditingComponent {
334
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: DefaultEmptyFieldEditingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
335
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: DefaultEmptyFieldEditingComponent, isStandalone: true, selector: "<span>[sc-default-empty-text-field-editing-placeholder]</span>", ngImport: i0, template: '[No text in field]', isInline: true });
336
- }
337
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: DefaultEmptyFieldEditingComponent, decorators: [{
338
- type: Component,
339
- args: [{
340
- selector: '<span>[sc-default-empty-text-field-editing-placeholder]</span>',
341
- template: '[No text in field]',
342
- }]
343
- }] });
344
-
345
231
  class LinkDirective extends BaseFieldDirective {
346
232
  editable = true;
347
233
  attrs = {};
348
234
  field;
349
- /**
350
- * Custom template to render in Pages in Metadata edit mode if field value is empty
351
- */
352
- emptyFieldEditingTemplate;
353
- /**
354
- * Default component to render in Pages in Metadata edit mode if field value is empty and emptyFieldEditingTemplate is not provided
355
- */
356
- defaultFieldEditingComponent = DefaultEmptyFieldEditingComponent;
357
235
  templateRef = inject(TemplateRef);
358
236
  renderer = inject(Renderer2);
359
237
  inlineRef = null;
@@ -403,12 +281,11 @@ class LinkDirective extends BaseFieldDirective {
403
281
  /**
404
282
  * Determines if directive should render the field as is
405
283
  * Returns true if we are in edit mode 'chromes' (field.editable is present) or field is not empty
406
- * or link field text is present and we are not in edit mode 'metadata'
284
+ * or link field text is present.
407
285
  * The right side of the expression was added to preserve existing functionality
408
286
  */
409
287
  shouldRender() {
410
- return (super.shouldRender() ||
411
- !!((this.field?.text || this.field?.value?.text) && !this.field?.metadata));
288
+ return super.shouldRender() || !!(this.field?.text || this.field?.value?.text);
412
289
  }
413
290
  updateView() {
414
291
  const field = this.field;
@@ -417,7 +294,6 @@ class LinkDirective extends BaseFieldDirective {
417
294
  }
418
295
  else {
419
296
  if (!this.shouldRender()) {
420
- super.renderEmpty();
421
297
  return;
422
298
  }
423
299
  const props = field.href ? field : field.value;
@@ -426,9 +302,7 @@ class LinkDirective extends BaseFieldDirective {
426
302
  const href = `${props?.href}${anchor}`;
427
303
  const mergedAttrs = { ...props, ...this.attrs, href };
428
304
  delete mergedAttrs.anchor;
429
- this.renderMetadata(MetadataKind.Open);
430
305
  this.renderTemplate(mergedAttrs, linkText);
431
- this.renderMetadata(MetadataKind.Close);
432
306
  }
433
307
  }
434
308
  renderInlineWrapper(editableFirstPart, editableLastPart) {
@@ -464,7 +338,7 @@ class LinkDirective extends BaseFieldDirective {
464
338
  return attrs;
465
339
  }
466
340
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: LinkDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
467
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: LinkDirective, isStandalone: true, selector: "[scLink]", inputs: { editable: ["scLinkEditable", "editable"], attrs: ["scLinkAttrs", "attrs"], field: ["scLink", "field"], emptyFieldEditingTemplate: ["scLinkEmptyFieldEditingTemplate", "emptyFieldEditingTemplate"] }, usesInheritance: true, usesOnChanges: true, ngImport: i0 });
341
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: LinkDirective, isStandalone: true, selector: "[scLink]", inputs: { editable: ["scLinkEditable", "editable"], attrs: ["scLinkAttrs", "attrs"], field: ["scLink", "field"] }, usesInheritance: true, usesOnChanges: true, ngImport: i0 });
468
342
  }
469
343
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: LinkDirective, decorators: [{
470
344
  type: Directive,
@@ -478,19 +352,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
478
352
  }], field: [{
479
353
  type: Input,
480
354
  args: ['scLink']
481
- }], emptyFieldEditingTemplate: [{
482
- type: Input,
483
- args: ['scLinkEmptyFieldEditingTemplate']
484
355
  }] } });
485
356
 
486
357
  class RouterLinkDirective extends LinkDirective {
487
358
  editable = true;
488
359
  attrs = {};
489
360
  field;
490
- /**
491
- * Custom template to render in Pages in Metadata edit mode if field value is empty
492
- */
493
- emptyFieldEditingTemplate;
494
361
  router = inject(Router);
495
362
  renderTemplate(props, linkText) {
496
363
  const viewRef = this.viewContainer.createEmbeddedView(this.templateRef);
@@ -513,7 +380,7 @@ class RouterLinkDirective extends LinkDirective {
513
380
  });
514
381
  }
515
382
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: RouterLinkDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
516
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: RouterLinkDirective, isStandalone: true, selector: "[scRouterLink]", inputs: { editable: ["scRouterLinkEditable", "editable"], attrs: ["scRouterLinkAttrs", "attrs"], field: ["scRouterLink", "field"], emptyFieldEditingTemplate: ["scRouterLinkEmptyFieldEditingTemplate", "emptyFieldEditingTemplate"] }, usesInheritance: true, ngImport: i0 });
383
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: RouterLinkDirective, isStandalone: true, selector: "[scRouterLink]", inputs: { editable: ["scRouterLinkEditable", "editable"], attrs: ["scRouterLinkAttrs", "attrs"], field: ["scRouterLink", "field"] }, usesInheritance: true, ngImport: i0 });
517
384
  }
518
385
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: RouterLinkDirective, decorators: [{
519
386
  type: Directive,
@@ -527,9 +394,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
527
394
  }], field: [{
528
395
  type: Input,
529
396
  args: ['scRouterLink']
530
- }], emptyFieldEditingTemplate: [{
531
- type: Input,
532
- args: ['scRouterLinkEmptyFieldEditingTemplate']
533
397
  }] } });
534
398
 
535
399
  class GenericLinkDirective extends LinkDirective {
@@ -537,10 +401,6 @@ class GenericLinkDirective extends LinkDirective {
537
401
  attrs = {};
538
402
  field;
539
403
  extras;
540
- /**
541
- * Custom template to render in Pages in Metadata edit mode if field value is empty
542
- */
543
- emptyFieldEditingTemplate;
544
404
  router = inject(Router);
545
405
  renderTemplate(props, linkText) {
546
406
  const viewRef = this.viewContainer.createEmbeddedView(this.templateRef);
@@ -576,7 +436,7 @@ class GenericLinkDirective extends LinkDirective {
576
436
  });
577
437
  }
578
438
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: GenericLinkDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
579
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: GenericLinkDirective, isStandalone: true, selector: "[scGenericLink]", inputs: { editable: ["scGenericLinkEditable", "editable"], attrs: ["scGenericLinkAttrs", "attrs"], field: ["scGenericLink", "field"], extras: ["scGenericLinkExtras", "extras"], emptyFieldEditingTemplate: ["scGenericLinkEmptyFieldEditingTemplate", "emptyFieldEditingTemplate"] }, usesInheritance: true, ngImport: i0 });
439
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: GenericLinkDirective, isStandalone: true, selector: "[scGenericLink]", inputs: { editable: ["scGenericLinkEditable", "editable"], attrs: ["scGenericLinkAttrs", "attrs"], field: ["scGenericLink", "field"], extras: ["scGenericLinkExtras", "extras"] }, usesInheritance: true, ngImport: i0 });
580
440
  }
581
441
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: GenericLinkDirective, decorators: [{
582
442
  type: Directive,
@@ -593,9 +453,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
593
453
  }], extras: [{
594
454
  type: Input,
595
455
  args: ['scGenericLinkExtras']
596
- }], emptyFieldEditingTemplate: [{
597
- type: Input,
598
- args: ['scGenericLinkEmptyFieldEditingTemplate']
599
456
  }] } });
600
457
 
601
458
  /**
@@ -805,46 +662,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
805
662
  }]
806
663
  }] });
807
664
 
808
- class BaseJssState {
809
- sitecore;
810
- viewBag;
811
- }
812
- /**
813
- * The service that is used to store and retrieve the current state of the app.
814
- * Referenced by the SDK to get the current state of the app.
815
- */
816
- class JssStateService {
817
- transferState = inject(TransferState);
818
- _state;
819
- constructor() {
820
- this._state = new BehaviorSubject({});
821
- }
822
- /**
823
- * Observable JSS state to subscribe to
824
- */
825
- get state() {
826
- return this._state.asObservable();
827
- }
828
- /**
829
- * The 'here and now' state value, usable without subscribing
830
- */
831
- get stateValue() {
832
- return this._state.value;
833
- }
834
- /**
835
- * Set new JSS state
836
- * @param {JssState} newState new state
837
- */
838
- setState(newState) {
839
- this._state.next(newState);
840
- }
841
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: JssStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
842
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: JssStateService });
843
- }
844
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: JssStateService, decorators: [{
845
- type: Injectable
846
- }], ctorParameters: () => [] });
847
-
848
665
  class PlaceholderComponent {
849
666
  name;
850
667
  rendering;
@@ -857,9 +674,7 @@ class PlaceholderComponent {
857
674
  renderEmptyTemplate;
858
675
  placeholderLoading;
859
676
  view;
860
- metadataNode;
861
677
  isLoading = true;
862
- metadataMode;
863
678
  chromeType;
864
679
  _inputs;
865
680
  _differ;
@@ -867,7 +682,6 @@ class PlaceholderComponent {
867
682
  placeholderData;
868
683
  destroyed = false;
869
684
  parentStyleAttribute = '';
870
- contextSubscription;
871
685
  differs = inject(KeyValueDiffers);
872
686
  componentFactory = inject(JssComponentFactoryService);
873
687
  changeDetectorRef = inject(ChangeDetectorRef);
@@ -879,12 +693,6 @@ class PlaceholderComponent {
879
693
  guardResolver = inject(GUARD_RESOLVER);
880
694
  dataResolver = inject(DATA_RESOLVER);
881
695
  platformId = inject(PLATFORM_ID);
882
- jssState = inject(JssStateService);
883
- constructor() {
884
- this.contextSubscription = this.jssState.state.subscribe(({ sitecore }) => {
885
- this.metadataMode = sitecore?.context.editMode === EditMode.Metadata;
886
- });
887
- }
888
696
  set inputs(value) {
889
697
  this._inputs = value;
890
698
  if (!this._differ && value) {
@@ -909,9 +717,6 @@ class PlaceholderComponent {
909
717
  ngOnDestroy() {
910
718
  this.destroyed = true;
911
719
  this._componentInstances = [];
912
- if (this.contextSubscription) {
913
- this.contextSubscription.unsubscribe();
914
- }
915
720
  }
916
721
  ngOnChanges(changes) {
917
722
  this.chromeType = changes.name ? 'placeholder' : 'rendering';
@@ -934,56 +739,16 @@ class PlaceholderComponent {
934
739
  changes.forEachChangedItem((change) => (updates[change.key] = change.currentValue));
935
740
  this._componentInstances.forEach((componentInstance) => this._setComponentInputs(componentInstance, updates));
936
741
  }
937
- /**
938
- * Gets id for Metadata code blocks, in specific format
939
- * Metadata code blocks will wrap be added around placeholder content and each rendering component
940
- * to allow for editing integration in Pages.
941
- * @param {string} kind code block type ("open" or "close"). "open" is added before an element, and "close" added after one.
942
- * @param {string?} renderingId rendering uid to apply as id to code block
943
- * @returns {string} formatted id value for code HTML node
944
- */
945
- getCodeBlockId = (kind, renderingId) => {
946
- if (this.rendering && kind === MetadataKind.Open) {
947
- const placeholderName = this.name;
948
- const id = renderingId || this.rendering?.uid;
949
- if (!renderingId && placeholderName) {
950
- let phId = '';
951
- for (const placeholder of Object.keys(this.rendering.placeholders || [])) {
952
- if (placeholderName === placeholder) {
953
- phId = id
954
- ? `${placeholderName}_${id}`
955
- : `${placeholderName}_${DEFAULT_PLACEHOLDER_UID}`;
956
- break;
957
- }
958
- // Check if the placeholder is a dynamic placeholder
959
- if (isDynamicPlaceholder(placeholder)) {
960
- const pattern = getDynamicPlaceholderPattern(placeholder);
961
- // Check if the placeholder matches the dynamic placeholder pattern
962
- if (pattern.test(placeholderName)) {
963
- phId = id ? `${placeholder}_${id}` : `${placeholder}_${DEFAULT_PLACEHOLDER_UID}`;
964
- break;
965
- }
966
- }
967
- }
968
- return phId;
969
- }
970
- else {
971
- return id;
972
- }
973
- }
974
- return undefined;
975
- };
976
742
  /**
977
743
  * Get renderings/components to be rendered for current placeholder name
978
744
  * Can modify the inner placeholders collection to adjust to using SXA dynamic placeholders
979
745
  * @returns {ComponentRendering<ComponentFields> | HtmlElementRendering[] | null} List of renderings to be rendered
980
746
  */
981
747
  getPlaceholder() {
982
- let phName = this.name?.slice() || '';
748
+ const phName = this.name?.slice() || '';
983
749
  /**
984
750
  * Process (SXA) dynamic placeholders
985
751
  * Find and replace the matching dynamic placeholder e.g 'nameOfContainer-{*}' with the requested e.g. 'nameOfContainer-1'.
986
- * For Metadata EditMode, we need to keep the raw placeholder name in place.
987
752
  */
988
753
  this.rendering?.placeholders &&
989
754
  Object.keys(this.rendering.placeholders).forEach((placeholder) => {
@@ -991,13 +756,8 @@ class PlaceholderComponent {
991
756
  ? getDynamicPlaceholderPattern(placeholder)
992
757
  : null;
993
758
  if (patternPlaceholder && patternPlaceholder.test(phName)) {
994
- if (this.metadataMode) {
995
- phName = placeholder;
996
- }
997
- else {
998
- this.rendering.placeholders[phName] = this.rendering.placeholders[placeholder];
999
- delete this.rendering.placeholders[placeholder];
1000
- }
759
+ this.rendering.placeholders[phName] = this.rendering.placeholders[placeholder];
760
+ delete this.rendering.placeholders[placeholder];
1001
761
  }
1002
762
  });
1003
763
  if (this.rendering &&
@@ -1050,26 +810,13 @@ class PlaceholderComponent {
1050
810
  try {
1051
811
  const nonGuarded = await this.guardResolver(factories);
1052
812
  const withData = await this.dataResolver(nonGuarded);
1053
- // not using index to ensure code blocks are rendered at correct positions
1054
813
  withData.forEach((rendering) => {
1055
- this.metadataMode &&
1056
- this.view.createEmbeddedView(this.metadataNode, {
1057
- kind: MetadataKind.Open,
1058
- chromeType: 'rendering',
1059
- renderingId: rendering.factory.componentDefinition?.uid,
1060
- });
1061
814
  if (this.renderEachTemplate && !isRawRendering(rendering.factory.componentDefinition)) {
1062
815
  this._renderTemplatedComponent(rendering.factory.componentDefinition);
1063
816
  }
1064
817
  else {
1065
818
  this._renderEmbeddedComponent(rendering.factory, rendering.data);
1066
819
  }
1067
- this.metadataMode &&
1068
- this.view.createEmbeddedView(this.metadataNode, {
1069
- kind: MetadataKind.Close,
1070
- chromeType: 'rendering',
1071
- renderingId: rendering.factory.componentDefinition?.uid,
1072
- });
1073
820
  });
1074
821
  this.isLoading = false;
1075
822
  this.changeDetectorRef.markForCheck();
@@ -1141,40 +888,11 @@ class PlaceholderComponent {
1141
888
  this._componentInstances.push(componentInstance);
1142
889
  }
1143
890
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: PlaceholderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1144
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: PlaceholderComponent, isStandalone: true, selector: "sc-placeholder,[sc-placeholder]", inputs: { name: "name", rendering: "rendering", renderings: "renderings", outputs: "outputs", clientOnly: "clientOnly", inputs: "inputs" }, outputs: { loaded: "loaded", failed: "failed" }, queries: [{ propertyName: "renderEachTemplate", first: true, predicate: RenderEachDirective, descendants: true, static: true }, { propertyName: "renderEmptyTemplate", first: true, predicate: RenderEmptyDirective, descendants: true, static: true }, { propertyName: "placeholderLoading", first: true, predicate: PlaceholderLoadingDirective, descendants: true, static: true }], viewQueries: [{ propertyName: "view", first: true, predicate: ["view"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "metadataNode", first: true, predicate: ["metadataCodeBlock"], descendants: true, read: TemplateRef }], usesOnChanges: true, ngImport: i0, template: `
891
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: PlaceholderComponent, isStandalone: true, selector: "sc-placeholder,[sc-placeholder]", inputs: { name: "name", rendering: "rendering", renderings: "renderings", outputs: "outputs", clientOnly: "clientOnly", inputs: "inputs" }, outputs: { loaded: "loaded", failed: "failed" }, queries: [{ propertyName: "renderEachTemplate", first: true, predicate: RenderEachDirective, descendants: true, static: true }, { propertyName: "renderEmptyTemplate", first: true, predicate: RenderEmptyDirective, descendants: true, static: true }, { propertyName: "placeholderLoading", first: true, predicate: PlaceholderLoadingDirective, descendants: true, static: true }], viewQueries: [{ propertyName: "view", first: true, predicate: ["view"], descendants: true, read: ViewContainerRef, static: true }], usesOnChanges: true, ngImport: i0, template: `
1145
892
  @if (isLoading) {
1146
893
  <ng-template [ngTemplateOutlet]="placeholderLoading?.templateRef"></ng-template>
1147
894
  }
1148
- <ng-template
1149
- #metadataCodeBlock
1150
- let-kind="kind"
1151
- let-type="chromeType"
1152
- let-renderingId="renderingId"
1153
- >
1154
- <code
1155
- [attr.kind]="kind"
1156
- type="text/sitecore"
1157
- [attr.chrometype]="type"
1158
- class="scpm"
1159
- [attr.id]="getCodeBlockId(kind, renderingId)"
1160
- ></code
1161
- ></ng-template>
1162
-
1163
- @if (metadataMode && metadataCodeBlock) {
1164
- <ng-container
1165
- *ngTemplateOutlet="metadataCodeBlock; context: { kind: 'open', chromeType: 'placeholder' }"
1166
- >
1167
- </ng-container>
1168
- }
1169
-
1170
895
  <ng-template #view></ng-template>
1171
-
1172
- @if (metadataMode && metadataCodeBlock) {
1173
- <ng-container
1174
- *ngTemplateOutlet="metadataCodeBlock; context: { kind: 'close', chromeType: 'placeholder' }"
1175
- >
1176
- </ng-container>
1177
- }
1178
896
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
1179
897
  }
1180
898
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: PlaceholderComponent, decorators: [{
@@ -1185,40 +903,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
1185
903
  @if (isLoading) {
1186
904
  <ng-template [ngTemplateOutlet]="placeholderLoading?.templateRef"></ng-template>
1187
905
  }
1188
- <ng-template
1189
- #metadataCodeBlock
1190
- let-kind="kind"
1191
- let-type="chromeType"
1192
- let-renderingId="renderingId"
1193
- >
1194
- <code
1195
- [attr.kind]="kind"
1196
- type="text/sitecore"
1197
- [attr.chrometype]="type"
1198
- class="scpm"
1199
- [attr.id]="getCodeBlockId(kind, renderingId)"
1200
- ></code
1201
- ></ng-template>
1202
-
1203
- @if (metadataMode && metadataCodeBlock) {
1204
- <ng-container
1205
- *ngTemplateOutlet="metadataCodeBlock; context: { kind: 'open', chromeType: 'placeholder' }"
1206
- >
1207
- </ng-container>
1208
- }
1209
-
1210
906
  <ng-template #view></ng-template>
1211
-
1212
- @if (metadataMode && metadataCodeBlock) {
1213
- <ng-container
1214
- *ngTemplateOutlet="metadataCodeBlock; context: { kind: 'close', chromeType: 'placeholder' }"
1215
- >
1216
- </ng-container>
1217
- }
1218
907
  `,
1219
908
  imports: [CommonModule],
1220
909
  }]
1221
- }], ctorParameters: () => [], propDecorators: { name: [{
910
+ }], propDecorators: { name: [{
1222
911
  type: Input
1223
912
  }], rendering: [{
1224
913
  type: Input
@@ -1244,9 +933,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
1244
933
  }], view: [{
1245
934
  type: ViewChild,
1246
935
  args: ['view', { read: ViewContainerRef, static: true }]
1247
- }], metadataNode: [{
1248
- type: ViewChild,
1249
- args: ['metadataCodeBlock', { read: TemplateRef }]
1250
936
  }], inputs: [{
1251
937
  type: Input
1252
938
  }] } });
@@ -1365,14 +1051,6 @@ class DateDirective extends BaseFieldDirective {
1365
1051
  locale;
1366
1052
  editable = true;
1367
1053
  field;
1368
- /**
1369
- * Custom template to render in Pages in Metadata edit mode if field value is empty
1370
- */
1371
- emptyFieldEditingTemplate;
1372
- /**
1373
- * Default component to render in Pages in Metadata edit mode if field value is empty and emptyFieldEditingTemplate is not provided
1374
- */
1375
- defaultFieldEditingComponent = DefaultEmptyFieldEditingComponent;
1376
1054
  templateRef = inject(TemplateRef);
1377
1055
  datePipe = inject(DatePipe);
1378
1056
  ngOnChanges(changes) {
@@ -1383,12 +1061,9 @@ class DateDirective extends BaseFieldDirective {
1383
1061
  }
1384
1062
  updateView() {
1385
1063
  if (!this.shouldRender()) {
1386
- super.renderEmpty();
1387
1064
  return;
1388
1065
  }
1389
- this.renderMetadata(MetadataKind.Open);
1390
1066
  this.viewRef = this.viewContainer.createEmbeddedView(this.templateRef);
1391
- this.renderMetadata(MetadataKind.Close);
1392
1067
  const field = this.field;
1393
1068
  const html = field.editable && this.editable ? field.editable : field.value;
1394
1069
  const setDangerously = field.editable && this.editable;
@@ -1402,7 +1077,7 @@ class DateDirective extends BaseFieldDirective {
1402
1077
  });
1403
1078
  }
1404
1079
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: DateDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
1405
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: DateDirective, isStandalone: true, selector: "[scDate]", inputs: { format: ["scDateFormat", "format"], timezone: ["scDateTimezone", "timezone"], locale: ["scDateLocale", "locale"], editable: ["scDateEditable", "editable"], field: ["scDate", "field"], emptyFieldEditingTemplate: ["scDateEmptyFieldEditingTemplate", "emptyFieldEditingTemplate"] }, usesInheritance: true, usesOnChanges: true, ngImport: i0 });
1080
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: DateDirective, isStandalone: true, selector: "[scDate]", inputs: { format: ["scDateFormat", "format"], timezone: ["scDateTimezone", "timezone"], locale: ["scDateLocale", "locale"], editable: ["scDateEditable", "editable"], field: ["scDate", "field"] }, usesInheritance: true, usesOnChanges: true, ngImport: i0 });
1406
1081
  }
1407
1082
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: DateDirective, decorators: [{
1408
1083
  type: Directive,
@@ -1424,9 +1099,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
1424
1099
  }], field: [{
1425
1100
  type: Input,
1426
1101
  args: ['scDate']
1427
- }], emptyFieldEditingTemplate: [{
1428
- type: Input,
1429
- args: ['scDateEmptyFieldEditingTemplate']
1430
1102
  }] } });
1431
1103
 
1432
1104
  class EditFrameComponent {
@@ -1521,139 +1193,49 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
1521
1193
  type: Input
1522
1194
  }] } });
1523
1195
 
1524
- /**
1525
- * Component that renders editing scripts and client data for the current page in Sitecore Editor.
1526
- * Only renders scripts when Metadata mode is used.
1527
- */
1528
- class EditingScriptsComponent {
1529
- renderer = inject(Renderer2);
1530
- stateService = inject(JssStateService);
1531
- document = inject(DOCUMENT);
1532
- ngOnInit() {
1533
- const state = this.stateService.stateValue;
1534
- const { pageState, editMode, clientData, clientScripts } = state.sitecore?.context || {};
1535
- // Don't render anything if not in editing mode or not server side
1536
- if (pageState === LayoutServicePageState.Normal ||
1537
- pageState === LayoutServicePageState.Preview ||
1538
- !isServer()) {
1539
- return;
1540
- }
1541
- if (editMode === EditMode.Metadata) {
1542
- const jssClientData = { ...clientData, ...getJssPagesClientData() };
1543
- clientScripts?.forEach((src) => {
1544
- const scriptElement = this.renderer.createElement('script');
1545
- scriptElement.src = src;
1546
- this.renderer.appendChild(this.document.body, scriptElement);
1547
- });
1548
- Object.keys(jssClientData).forEach((id) => {
1549
- const scriptElement = this.renderer.createElement('script');
1550
- scriptElement.id = id;
1551
- scriptElement.type = 'application/json';
1552
- scriptElement.innerHTML = JSON.stringify(jssClientData[id]);
1553
- this.renderer.appendChild(this.document.body, scriptElement);
1554
- });
1555
- }
1556
- }
1557
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: EditingScriptsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1558
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: EditingScriptsComponent, isStandalone: true, selector: "sc-editing-scripts", ngImport: i0, template: '', isInline: true });
1196
+ class BaseJssState {
1197
+ sitecore;
1198
+ viewBag;
1559
1199
  }
1560
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: EditingScriptsComponent, decorators: [{
1561
- type: Component,
1562
- args: [{
1563
- selector: 'sc-editing-scripts',
1564
- template: '',
1565
- }]
1566
- }] });
1567
-
1568
1200
  /**
1569
- * Injection token for the Sitecore Edge configuration.
1570
- */
1571
- const EDGE_CONFIG = new InjectionToken('Sc.edgeConfig');
1572
-
1573
- let { executeScriptElements, loadForm, subscribeToFormSubmitEvent } = form;
1574
- /**
1575
- * Mock function to replace the form module functions for `testing` purposes.
1576
- * @param {any} formModule - The form module to mock
1577
- */
1578
- const mockFormModule = (formModule) => {
1579
- executeScriptElements = formModule.executeScriptElements;
1580
- loadForm = formModule.loadForm;
1581
- subscribeToFormSubmitEvent = formModule.subscribeToFormSubmitEvent;
1582
- };
1583
- /**
1584
- * A component that renders a Sitecore Form.
1585
- * It fetches the form markup from the Sitecore Edge service and renders it in the component's template.
1201
+ * The service that is used to store and retrieve the current state of the app.
1202
+ * Referenced by the SDK to get the current state of the app.
1586
1203
  */
1587
- class FormComponent {
1204
+ class JssStateService {
1205
+ transferState = inject(TransferState);
1206
+ _state;
1207
+ constructor() {
1208
+ this._state = new BehaviorSubject({});
1209
+ }
1588
1210
  /**
1589
- * The rendering data for the component
1211
+ * Observable JSS state to subscribe to
1590
1212
  */
1591
- rendering;
1592
- hasError = false;
1593
- isEditing = false;
1594
- contextSubscription;
1595
- edgeConfig = inject(EDGE_CONFIG);
1596
- platformId = inject(PLATFORM_ID);
1597
- elRef = inject(ElementRef);
1598
- jssState = inject(JssStateService);
1599
- ngOnInit() {
1600
- if (isPlatformBrowser(this.platformId)) {
1601
- this.loadForm();
1602
- this.contextSubscription = this.jssState.state.subscribe(({ sitecore }) => {
1603
- this.isEditing = sitecore?.context.pageState !== LayoutServicePageState.Normal;
1604
- });
1605
- }
1213
+ get state() {
1214
+ return this._state.asObservable();
1606
1215
  }
1607
- ngOnDestroy() {
1608
- if (this.contextSubscription) {
1609
- this.contextSubscription.unsubscribe();
1610
- }
1216
+ /**
1217
+ * The 'here and now' state value, usable without subscribing
1218
+ */
1219
+ get stateValue() {
1220
+ return this._state.value;
1611
1221
  }
1612
1222
  /**
1613
- * Fetches the form markup from the Sitecore Edge service and renders it in the component's template.
1223
+ * Set new JSS state
1224
+ * @param {JssState} newState new state
1614
1225
  */
1615
- async loadForm() {
1616
- const { sitecoreEdgeContextId, sitecoreEdgeUrl } = this.edgeConfig;
1617
- try {
1618
- const content = await loadForm(sitecoreEdgeContextId, this.rendering.params.FormId, sitecoreEdgeUrl);
1619
- this.elRef.nativeElement.innerHTML = content;
1620
- this.elRef.nativeElement.className = this.rendering.params?.styles?.trimEnd() || '';
1621
- this.elRef.nativeElement.id = this.rendering.params?.RenderingIdentifier || '';
1622
- const form = this.elRef.nativeElement.querySelector('form');
1623
- if (!form) {
1624
- debug.form(`Form '${this.rendering.params.FormId}' was not able to render since form element was not found`);
1625
- return;
1626
- }
1627
- executeScriptElements(this.elRef.nativeElement);
1628
- if (!this.isEditing) {
1629
- subscribeToFormSubmitEvent(form, this.rendering.uid);
1630
- }
1631
- }
1632
- catch {
1633
- this.hasError = true;
1634
- }
1226
+ setState(newState) {
1227
+ this._state.next(newState);
1635
1228
  }
1636
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: FormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1637
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: FormComponent, isStandalone: true, selector: "app-form", inputs: { rendering: "rendering" }, ngImport: i0, template: "@if (isEditing) {\n @if (!rendering.params.FormId) {\n <div\n style=\"background: darkorange; outline: 5px solid orange; padding: 10px; color: white; max-width: 500px;\"\n >\n <h2>{{ rendering.componentName }}</h2>\n <p>JSS component is missing FormId rendering parameter.</p>\n </div>\n }\n @if (hasError) {\n <div class=\"sc-jss-placeholder-error\">There was a problem loading this section</div>\n }\n}\n" });
1229
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: JssStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1230
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: JssStateService });
1638
1231
  }
1639
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: FormComponent, decorators: [{
1640
- type: Component,
1641
- args: [{ selector: 'app-form', template: "@if (isEditing) {\n @if (!rendering.params.FormId) {\n <div\n style=\"background: darkorange; outline: 5px solid orange; padding: 10px; color: white; max-width: 500px;\"\n >\n <h2>{{ rendering.componentName }}</h2>\n <p>JSS component is missing FormId rendering parameter.</p>\n </div>\n }\n @if (hasError) {\n <div class=\"sc-jss-placeholder-error\">There was a problem loading this section</div>\n }\n}\n" }]
1642
- }], propDecorators: { rendering: [{
1643
- type: Input
1644
- }] } });
1232
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: JssStateService, decorators: [{
1233
+ type: Injectable
1234
+ }], ctorParameters: () => [] });
1645
1235
 
1646
1236
  class RichTextDirective extends BaseFieldDirective {
1647
1237
  editable = true;
1648
1238
  field;
1649
- /**
1650
- * Custom template to render in Pages in Metadata edit mode if field value is empty
1651
- */
1652
- emptyFieldEditingTemplate;
1653
- /**
1654
- * Default component to render in Pages in Metadata edit mode if field value is empty and emptyFieldEditingTemplate is not provided
1655
- */
1656
- defaultFieldEditingComponent = DefaultEmptyFieldEditingComponent;
1657
1239
  templateRef = inject(TemplateRef);
1658
1240
  renderer = inject(Renderer2);
1659
1241
  router = inject(Router);
@@ -1665,12 +1247,9 @@ class RichTextDirective extends BaseFieldDirective {
1665
1247
  }
1666
1248
  updateView() {
1667
1249
  if (!this.shouldRender()) {
1668
- super.renderEmpty();
1669
1250
  return;
1670
1251
  }
1671
- this.renderMetadata(MetadataKind.Open);
1672
1252
  this.viewRef = this.viewContainer.createEmbeddedView(this.templateRef);
1673
- this.renderMetadata(MetadataKind.Close);
1674
1253
  const field = this.field;
1675
1254
  const html = field.editable && this.editable ? field.editable : field.value;
1676
1255
  this.viewRef.rootNodes.forEach((node) => {
@@ -1694,7 +1273,7 @@ class RichTextDirective extends BaseFieldDirective {
1694
1273
  });
1695
1274
  }
1696
1275
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: RichTextDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
1697
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: RichTextDirective, isStandalone: true, selector: "[scRichText]", inputs: { editable: ["scRichTextEditable", "editable"], field: ["scRichText", "field"], emptyFieldEditingTemplate: ["scRichTextEmptyFieldEditingTemplate", "emptyFieldEditingTemplate"] }, usesInheritance: true, usesOnChanges: true, ngImport: i0 });
1276
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: RichTextDirective, isStandalone: true, selector: "[scRichText]", inputs: { editable: ["scRichTextEditable", "editable"], field: ["scRichText", "field"] }, usesInheritance: true, usesOnChanges: true, ngImport: i0 });
1698
1277
  }
1699
1278
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: RichTextDirective, decorators: [{
1700
1279
  type: Directive,
@@ -1707,23 +1286,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
1707
1286
  }], field: [{
1708
1287
  type: Input,
1709
1288
  args: ['scRichText']
1710
- }], emptyFieldEditingTemplate: [{
1711
- type: Input,
1712
- args: ['scRichTextEmptyFieldEditingTemplate']
1713
1289
  }] } });
1714
1290
 
1715
1291
  class TextDirective extends BaseFieldDirective {
1716
1292
  editable = true;
1717
1293
  encode = true;
1718
1294
  field;
1719
- /**
1720
- * Custom template to render in Pages in Metadata edit mode if field value is empty
1721
- */
1722
- emptyFieldEditingTemplate;
1723
- /**
1724
- * Default component to render in Pages in Metadata edit mode if field value is empty and emptyFieldEditingTemplate is not provided
1725
- */
1726
- defaultFieldEditingComponent = DefaultEmptyFieldEditingComponent;
1727
1295
  templateRef = inject(TemplateRef);
1728
1296
  ngOnChanges(changes) {
1729
1297
  if (changes.field || changes.editable || changes.encode) {
@@ -1733,12 +1301,9 @@ class TextDirective extends BaseFieldDirective {
1733
1301
  }
1734
1302
  updateView() {
1735
1303
  if (!this.shouldRender()) {
1736
- super.renderEmpty();
1737
1304
  return;
1738
1305
  }
1739
- this.renderMetadata(MetadataKind.Open);
1740
1306
  this.viewRef = this.viewContainer.createEmbeddedView(this.templateRef);
1741
- this.renderMetadata(MetadataKind.Close);
1742
1307
  const field = this.field;
1743
1308
  let editable = this.editable;
1744
1309
  // can't use editable value if we want to output unencoded
@@ -1757,7 +1322,7 @@ class TextDirective extends BaseFieldDirective {
1757
1322
  });
1758
1323
  }
1759
1324
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: TextDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
1760
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: TextDirective, isStandalone: true, selector: "[scText]", inputs: { editable: ["scTextEditable", "editable"], encode: ["scTextEncode", "encode"], field: ["scText", "field"], emptyFieldEditingTemplate: ["scTextEmptyFieldEditingTemplate", "emptyFieldEditingTemplate"] }, usesInheritance: true, usesOnChanges: true, ngImport: i0 });
1325
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.18", type: TextDirective, isStandalone: true, selector: "[scText]", inputs: { editable: ["scTextEditable", "editable"], encode: ["scTextEncode", "encode"], field: ["scText", "field"] }, usesInheritance: true, usesOnChanges: true, ngImport: i0 });
1761
1326
  }
1762
1327
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: TextDirective, decorators: [{
1763
1328
  type: Directive,
@@ -1773,9 +1338,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
1773
1338
  }], field: [{
1774
1339
  type: Input,
1775
1340
  args: ['scText']
1776
- }], emptyFieldEditingTemplate: [{
1777
- type: Input,
1778
- args: ['scTextEmptyFieldEditingTemplate']
1779
1341
  }] } });
1780
1342
 
1781
1343
  /**
@@ -2049,9 +1611,7 @@ class JssModule {
2049
1611
  RichTextDirective,
2050
1612
  MissingComponentComponent,
2051
1613
  HiddenRenderingComponent,
2052
- EditFrameComponent,
2053
- EditingScriptsComponent,
2054
- FormComponent], exports: [FileDirective,
1614
+ EditFrameComponent], exports: [FileDirective,
2055
1615
  ImageDirective,
2056
1616
  DateDirective,
2057
1617
  LinkDirective,
@@ -2065,9 +1625,7 @@ class JssModule {
2065
1625
  PlaceholderLoadingDirective,
2066
1626
  RichTextDirective,
2067
1627
  TextDirective,
2068
- EditFrameComponent,
2069
- EditingScriptsComponent,
2070
- FormComponent] });
1628
+ EditFrameComponent] });
2071
1629
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: JssModule, imports: [CommonModule,
2072
1630
  PlaceholderComponent,
2073
1631
  EditFrameComponent] });
@@ -2094,8 +1652,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
2094
1652
  MissingComponentComponent,
2095
1653
  HiddenRenderingComponent,
2096
1654
  EditFrameComponent,
2097
- EditingScriptsComponent,
2098
- FormComponent,
2099
1655
  ],
2100
1656
  exports: [
2101
1657
  FileDirective,
@@ -2113,8 +1669,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
2113
1669
  RichTextDirective,
2114
1670
  TextDirective,
2115
1671
  EditFrameComponent,
2116
- EditingScriptsComponent,
2117
- FormComponent,
2118
1672
  ],
2119
1673
  }]
2120
1674
  }] });
@@ -2123,5 +1677,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
2123
1677
  * Generated bundle index. Do not edit.
2124
1678
  */
2125
1679
 
2126
- export { BaseJssState, ComponentNameAndType, DYNAMIC_COMPONENT, DateDirective, EDGE_CONFIG, EditFrameComponent, EditingScriptsComponent, FileDirective, FormComponent, GenericLinkDirective, HiddenRenderingComponent, ImageDirective, JssModule, JssStateService, LinkDirective, PlaceholderComponent, PlaceholderLoadingDirective, RenderComponentComponent, RenderEachDirective, RenderEmptyDirective, RichTextDirective, RouterLinkDirective, TextDirective, isRawRendering };
1680
+ export { BaseJssState, ComponentNameAndType, DYNAMIC_COMPONENT, DateDirective, EditFrameComponent, FileDirective, GenericLinkDirective, HiddenRenderingComponent, ImageDirective, JssModule, JssStateService, LinkDirective, PlaceholderComponent, PlaceholderLoadingDirective, RenderComponentComponent, RenderEachDirective, RenderEmptyDirective, RichTextDirective, RouterLinkDirective, TextDirective, isRawRendering };
2127
1681
  //# sourceMappingURL=sitecore-jss-sitecore-jss-angular.mjs.map