@abp/ng.cms-kit 10.5.0 → 10.6.0-rc.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.
@@ -1,5 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, Injectable, Component, Injector, input, output, DestroyRef, ChangeDetectionStrategy, InjectionToken } from '@angular/core';
2
+ import { inject, Injectable, ChangeDetectionStrategy, Component, signal, Injector, input, output, DestroyRef, InjectionToken } from '@angular/core';
3
+ import { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
4
  import * as i3$1 from '@angular/common';
4
5
  import { CommonModule, DatePipe } from '@angular/common';
5
6
  import * as i1$1 from '@angular/forms';
@@ -19,7 +20,6 @@ import * as i2$1 from '@ngx-validate/core';
19
20
  import { NgxValidateCoreModule } from '@ngx-validate/core';
20
21
  import { prepareSlugFromControl, CodeMirrorEditorComponent, ToastuiEditorComponent, dasharize } from '@abp/ng.cms-kit';
21
22
  import { forkJoin, of, Subject, map as map$1, tap as tap$1 } from 'rxjs';
22
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
23
23
  import { TreeComponent } from '@abp/ng.components/tree';
24
24
 
25
25
  var eCmsKitAdminComponents;
@@ -112,10 +112,10 @@ class PageFormService {
112
112
  this.router.navigate(['/cms/pages']);
113
113
  }));
114
114
  }
115
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: PageFormService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
116
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: PageFormService, providedIn: 'root' }); }
115
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PageFormService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
116
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PageFormService, providedIn: 'root' }); }
117
117
  }
118
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: PageFormService, decorators: [{
118
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PageFormService, decorators: [{
119
119
  type: Injectable,
120
120
  args: [{
121
121
  providedIn: 'root',
@@ -177,10 +177,10 @@ class BlogPostFormService {
177
177
  this.router.navigate(['/cms/blog-posts']);
178
178
  }));
179
179
  }
180
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BlogPostFormService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
181
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BlogPostFormService, providedIn: 'root' }); }
180
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: BlogPostFormService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
181
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: BlogPostFormService, providedIn: 'root' }); }
182
182
  }
183
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BlogPostFormService, decorators: [{
183
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: BlogPostFormService, decorators: [{
184
184
  type: Injectable,
185
185
  args: [{
186
186
  providedIn: 'root',
@@ -227,10 +227,10 @@ class CommentEntityService {
227
227
  }
228
228
  });
229
229
  }
230
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: CommentEntityService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
231
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: CommentEntityService, providedIn: 'root' }); }
230
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CommentEntityService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
231
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CommentEntityService, providedIn: 'root' }); }
232
232
  }
233
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: CommentEntityService, decorators: [{
233
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CommentEntityService, decorators: [{
234
234
  type: Injectable,
235
235
  args: [{
236
236
  providedIn: 'root',
@@ -239,16 +239,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
239
239
 
240
240
  class CommentListComponent {
241
241
  constructor() {
242
- this.data = { items: [], totalCount: 0 };
243
242
  this.list = inject((ListService));
244
243
  this.commentEntityService = inject(CommentEntityService);
245
244
  this.commentService = inject(CommentAdminService);
246
245
  this.fb = inject(FormBuilder);
246
+ this.data = toSignal(this.list.hookToQuery(query => {
247
+ const filters = this.list.filter || {};
248
+ const input = {
249
+ ...query,
250
+ ...filters,
251
+ };
252
+ return this.commentService.getList(input);
253
+ }), {
254
+ initialValue: { items: [], totalCount: 0 },
255
+ });
247
256
  this.commentApproveStateOptions = commentApproveStateOptions;
248
257
  }
249
258
  ngOnInit() {
250
259
  this.createFilterForm();
251
- this.hookToQuery();
252
260
  this.requireApprovement = this.commentEntityService.requireApprovement;
253
261
  }
254
262
  createFilterForm() {
@@ -272,35 +280,23 @@ class CommentListComponent {
272
280
  this.list.filter = filters;
273
281
  this.list.get();
274
282
  }
275
- hookToQuery() {
276
- this.list
277
- .hookToQuery(query => {
278
- const filters = this.list.filter || {};
279
- const input = {
280
- ...query,
281
- ...filters,
282
- };
283
- return this.commentService.getList(input);
284
- })
285
- .subscribe(res => (this.data = res));
286
- }
287
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: CommentListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
288
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: CommentListComponent, isStandalone: true, selector: "abp-comment-list", providers: [
283
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CommentListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
284
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: CommentListComponent, isStandalone: true, selector: "abp-comment-list", providers: [
289
285
  ListService,
290
286
  {
291
287
  provide: EXTENSIONS_IDENTIFIER,
292
288
  useValue: eCmsKitAdminComponents.CommentList,
293
289
  },
294
- ], ngImport: i0, template: "<abp-page [title]=\"'CmsKit::Comments' | abpLocalization\">\r\n <div class=\"card mb-4\">\r\n <div class=\"card-body\">\r\n <form [formGroup]=\"filterForm\" (ngSubmit)=\"onFilter()\">\r\n <div class=\"row align-items-end\">\r\n <div class=\"col-lg-4 col-md-12\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-6 col-md-6\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"creationStartDate\">\r\n {{ 'CmsKit::StartDate' | abpLocalization }}\r\n </label>\r\n <input\r\n id=\"creationStartDate\"\r\n formControlName=\"creationStartDate\"\r\n (click)=\"startDatePicker.open()\"\r\n (keyup.space)=\"startDatePicker.open()\"\r\n ngbDatepicker\r\n #startDatePicker=\"ngbDatepicker\"\r\n type=\"text\"\r\n class=\"form-control\"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6 col-md-6\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"creationEndDate\">\r\n {{ 'CmsKit::EndDate' | abpLocalization }}\r\n </label>\r\n <input\r\n id=\"creationEndDate\"\r\n formControlName=\"creationEndDate\"\r\n class=\"form-control\"\r\n ngbDatepicker\r\n #endDatePicker=\"ngbDatepicker\"\r\n (click)=\"endDatePicker.toggle()\"\r\n readonly\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-lg-2 col-md-6\">\r\n <abp-form-input\r\n formControlName=\"author\"\r\n [label]=\"'CmsKit::Username' | abpLocalization\"\r\n type=\"text\"\r\n />\r\n </div>\r\n\r\n <div class=\"col-lg-2 col-md-6\">\r\n <abp-form-input\r\n formControlName=\"entityType\"\r\n [label]=\"'CmsKit::EntityType' | abpLocalization\"\r\n type=\"text\"\r\n />\r\n </div>\r\n @if (requireApprovement) {\r\n <div class=\"col-lg-2 col-md-6\">\r\n <div class=\"mb-3\">\r\n <label class=\"mb-1 form-label\" for=\"commentApproveState\">\r\n {{ 'CmsKit::CommentFilter:ApproveState' | abpLocalization }}\r\n </label>\r\n <select\r\n id=\"commentApproveState\"\r\n formControlName=\"commentApproveState\"\r\n class=\"form-control\"\r\n >\r\n @for (option of commentApproveStateOptions; track option.value) {\r\n <option [value]=\"option.value\">\r\n {{ 'CmsKit::CommentFilter:' + option.value | abpLocalization }}\r\n </option>\r\n }\r\n </select>\r\n </div>\r\n </div>\r\n }\r\n <div class=\"col-lg-2 col-md-6\">\r\n <abp-button class=\"w-100 mb-3\" buttonType=\"Primary\" type=\"submit\">\r\n <i class=\"fa fa-search\" aria-hidden=\"true\"></i>\r\n </abp-button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card\">\r\n <abp-extensible-table [data]=\"data.items\" [recordsTotal]=\"data.totalCount\" [list]=\"list\" />\r\n </div>\r\n</abp-page>\r\n", dependencies: [{ kind: "ngmodule", type: ExtensibleModule }, { kind: "component", type: i1.ExtensibleTableComponent, selector: "abp-extensible-table", inputs: ["actionsText", "data", "list", "recordsTotal", "actionsColumnWidth", "actionsTemplate", "selectable", "selectionType", "selected", "infiniteScroll", "isLoading", "scrollThreshold", "tableHeight", "rowDetailTemplate", "rowDetailHeight"], outputs: ["tableActivate", "selectionChange", "loadMore", "rowDetailToggle"], exportAs: ["abpExtensibleTable"] }, { kind: "ngmodule", type: PageModule }, { kind: "component", type: i2.PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: NgbDatepickerModule }, { kind: "directive", type: i3.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "contentTemplate", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "popperOptions", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: FormInputComponent, selector: "abp-form-input", inputs: ["inputId", "inputReadonly", "label", "labelClass", "inputPlaceholder", "inputStyle", "inputClass"], outputs: ["formBlur", "formFocus"] }, { kind: "component", type: ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }], viewProviders: [
290
+ ], ngImport: i0, template: "<abp-page [title]=\"'CmsKit::Comments' | abpLocalization\">\r\n <div class=\"card mb-4\">\r\n <div class=\"card-body\">\r\n <form [formGroup]=\"filterForm\" (ngSubmit)=\"onFilter()\">\r\n <div class=\"row align-items-end\">\r\n <div class=\"col-lg-4 col-md-12\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-6 col-md-6\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"creationStartDate\">\r\n {{ 'CmsKit::StartDate' | abpLocalization }}\r\n </label>\r\n <input\r\n id=\"creationStartDate\"\r\n formControlName=\"creationStartDate\"\r\n (click)=\"startDatePicker.open()\"\r\n (keyup.space)=\"startDatePicker.open()\"\r\n ngbDatepicker\r\n #startDatePicker=\"ngbDatepicker\"\r\n type=\"text\"\r\n class=\"form-control\"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6 col-md-6\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"creationEndDate\">\r\n {{ 'CmsKit::EndDate' | abpLocalization }}\r\n </label>\r\n <input\r\n id=\"creationEndDate\"\r\n formControlName=\"creationEndDate\"\r\n class=\"form-control\"\r\n ngbDatepicker\r\n #endDatePicker=\"ngbDatepicker\"\r\n (click)=\"endDatePicker.toggle()\"\r\n readonly\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-lg-2 col-md-6\">\r\n <abp-form-input\r\n formControlName=\"author\"\r\n [label]=\"'CmsKit::Username' | abpLocalization\"\r\n type=\"text\"\r\n />\r\n </div>\r\n\r\n <div class=\"col-lg-2 col-md-6\">\r\n <abp-form-input\r\n formControlName=\"entityType\"\r\n [label]=\"'CmsKit::EntityType' | abpLocalization\"\r\n type=\"text\"\r\n />\r\n </div>\r\n @if (requireApprovement) {\r\n <div class=\"col-lg-2 col-md-6\">\r\n <div class=\"mb-3\">\r\n <label class=\"mb-1 form-label\" for=\"commentApproveState\">\r\n {{ 'CmsKit::CommentFilter:ApproveState' | abpLocalization }}\r\n </label>\r\n <select\r\n id=\"commentApproveState\"\r\n formControlName=\"commentApproveState\"\r\n class=\"form-control\"\r\n >\r\n @for (option of commentApproveStateOptions; track option.value) {\r\n <option [value]=\"option.value\">\r\n {{ 'CmsKit::CommentFilter:' + option.value | abpLocalization }}\r\n </option>\r\n }\r\n </select>\r\n </div>\r\n </div>\r\n }\r\n <div class=\"col-lg-2 col-md-6\">\r\n <abp-button class=\"w-100 mb-3\" buttonType=\"Primary\" type=\"submit\">\r\n <i class=\"fa fa-search\" aria-hidden=\"true\"></i>\r\n </abp-button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card\">\r\n <abp-extensible-table [data]=\"data().items\" [recordsTotal]=\"data().totalCount\" [list]=\"list\" />\r\n </div>\r\n</abp-page>\r\n", dependencies: [{ kind: "ngmodule", type: ExtensibleModule }, { kind: "component", type: i1.ExtensibleTableComponent, selector: "abp-extensible-table", inputs: ["actionsText", "data", "list", "recordsTotal", "actionsColumnWidth", "actionsTemplate", "selectable", "selectionType", "selected", "infiniteScroll", "isLoading", "scrollThreshold", "tableHeight", "rowDetailTemplate", "rowDetailHeight"], outputs: ["tableActivate", "selectionChange", "loadMore", "rowDetailToggle"], exportAs: ["abpExtensibleTable"] }, { kind: "ngmodule", type: PageModule }, { kind: "component", type: i2.PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: NgbDatepickerModule }, { kind: "directive", type: i3.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "contentTemplate", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "popperOptions", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: FormInputComponent, selector: "abp-form-input", inputs: ["inputId", "inputReadonly", "label", "labelClass", "inputPlaceholder", "inputStyle", "inputClass"], outputs: ["formBlur", "formFocus"] }, { kind: "component", type: ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }], viewProviders: [
295
291
  {
296
292
  provide: NgbDateAdapter,
297
293
  useClass: DateTimeAdapter,
298
294
  },
299
- ] }); }
295
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
300
296
  }
301
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: CommentListComponent, decorators: [{
297
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CommentListComponent, decorators: [{
302
298
  type: Component,
303
- args: [{ selector: 'abp-comment-list', providers: [
299
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'abp-comment-list', providers: [
304
300
  ListService,
305
301
  {
306
302
  provide: EXTENSIONS_IDENTIFIER,
@@ -320,29 +316,42 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
320
316
  LocalizationPipe,
321
317
  FormInputComponent,
322
318
  ButtonComponent,
323
- ], template: "<abp-page [title]=\"'CmsKit::Comments' | abpLocalization\">\r\n <div class=\"card mb-4\">\r\n <div class=\"card-body\">\r\n <form [formGroup]=\"filterForm\" (ngSubmit)=\"onFilter()\">\r\n <div class=\"row align-items-end\">\r\n <div class=\"col-lg-4 col-md-12\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-6 col-md-6\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"creationStartDate\">\r\n {{ 'CmsKit::StartDate' | abpLocalization }}\r\n </label>\r\n <input\r\n id=\"creationStartDate\"\r\n formControlName=\"creationStartDate\"\r\n (click)=\"startDatePicker.open()\"\r\n (keyup.space)=\"startDatePicker.open()\"\r\n ngbDatepicker\r\n #startDatePicker=\"ngbDatepicker\"\r\n type=\"text\"\r\n class=\"form-control\"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6 col-md-6\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"creationEndDate\">\r\n {{ 'CmsKit::EndDate' | abpLocalization }}\r\n </label>\r\n <input\r\n id=\"creationEndDate\"\r\n formControlName=\"creationEndDate\"\r\n class=\"form-control\"\r\n ngbDatepicker\r\n #endDatePicker=\"ngbDatepicker\"\r\n (click)=\"endDatePicker.toggle()\"\r\n readonly\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-lg-2 col-md-6\">\r\n <abp-form-input\r\n formControlName=\"author\"\r\n [label]=\"'CmsKit::Username' | abpLocalization\"\r\n type=\"text\"\r\n />\r\n </div>\r\n\r\n <div class=\"col-lg-2 col-md-6\">\r\n <abp-form-input\r\n formControlName=\"entityType\"\r\n [label]=\"'CmsKit::EntityType' | abpLocalization\"\r\n type=\"text\"\r\n />\r\n </div>\r\n @if (requireApprovement) {\r\n <div class=\"col-lg-2 col-md-6\">\r\n <div class=\"mb-3\">\r\n <label class=\"mb-1 form-label\" for=\"commentApproveState\">\r\n {{ 'CmsKit::CommentFilter:ApproveState' | abpLocalization }}\r\n </label>\r\n <select\r\n id=\"commentApproveState\"\r\n formControlName=\"commentApproveState\"\r\n class=\"form-control\"\r\n >\r\n @for (option of commentApproveStateOptions; track option.value) {\r\n <option [value]=\"option.value\">\r\n {{ 'CmsKit::CommentFilter:' + option.value | abpLocalization }}\r\n </option>\r\n }\r\n </select>\r\n </div>\r\n </div>\r\n }\r\n <div class=\"col-lg-2 col-md-6\">\r\n <abp-button class=\"w-100 mb-3\" buttonType=\"Primary\" type=\"submit\">\r\n <i class=\"fa fa-search\" aria-hidden=\"true\"></i>\r\n </abp-button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card\">\r\n <abp-extensible-table [data]=\"data.items\" [recordsTotal]=\"data.totalCount\" [list]=\"list\" />\r\n </div>\r\n</abp-page>\r\n" }]
319
+ ], template: "<abp-page [title]=\"'CmsKit::Comments' | abpLocalization\">\r\n <div class=\"card mb-4\">\r\n <div class=\"card-body\">\r\n <form [formGroup]=\"filterForm\" (ngSubmit)=\"onFilter()\">\r\n <div class=\"row align-items-end\">\r\n <div class=\"col-lg-4 col-md-12\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-6 col-md-6\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"creationStartDate\">\r\n {{ 'CmsKit::StartDate' | abpLocalization }}\r\n </label>\r\n <input\r\n id=\"creationStartDate\"\r\n formControlName=\"creationStartDate\"\r\n (click)=\"startDatePicker.open()\"\r\n (keyup.space)=\"startDatePicker.open()\"\r\n ngbDatepicker\r\n #startDatePicker=\"ngbDatepicker\"\r\n type=\"text\"\r\n class=\"form-control\"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6 col-md-6\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"creationEndDate\">\r\n {{ 'CmsKit::EndDate' | abpLocalization }}\r\n </label>\r\n <input\r\n id=\"creationEndDate\"\r\n formControlName=\"creationEndDate\"\r\n class=\"form-control\"\r\n ngbDatepicker\r\n #endDatePicker=\"ngbDatepicker\"\r\n (click)=\"endDatePicker.toggle()\"\r\n readonly\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-lg-2 col-md-6\">\r\n <abp-form-input\r\n formControlName=\"author\"\r\n [label]=\"'CmsKit::Username' | abpLocalization\"\r\n type=\"text\"\r\n />\r\n </div>\r\n\r\n <div class=\"col-lg-2 col-md-6\">\r\n <abp-form-input\r\n formControlName=\"entityType\"\r\n [label]=\"'CmsKit::EntityType' | abpLocalization\"\r\n type=\"text\"\r\n />\r\n </div>\r\n @if (requireApprovement) {\r\n <div class=\"col-lg-2 col-md-6\">\r\n <div class=\"mb-3\">\r\n <label class=\"mb-1 form-label\" for=\"commentApproveState\">\r\n {{ 'CmsKit::CommentFilter:ApproveState' | abpLocalization }}\r\n </label>\r\n <select\r\n id=\"commentApproveState\"\r\n formControlName=\"commentApproveState\"\r\n class=\"form-control\"\r\n >\r\n @for (option of commentApproveStateOptions; track option.value) {\r\n <option [value]=\"option.value\">\r\n {{ 'CmsKit::CommentFilter:' + option.value | abpLocalization }}\r\n </option>\r\n }\r\n </select>\r\n </div>\r\n </div>\r\n }\r\n <div class=\"col-lg-2 col-md-6\">\r\n <abp-button class=\"w-100 mb-3\" buttonType=\"Primary\" type=\"submit\">\r\n <i class=\"fa fa-search\" aria-hidden=\"true\"></i>\r\n </abp-button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card\">\r\n <abp-extensible-table [data]=\"data().items\" [recordsTotal]=\"data().totalCount\" [list]=\"list\" />\r\n </div>\r\n</abp-page>\r\n" }]
324
320
  }] });
325
321
 
326
322
  class CommentDetailsComponent {
327
323
  constructor() {
328
- this.comment = null;
329
- this.data = { items: [], totalCount: 0 };
324
+ this.comment = signal(null, /* @ts-ignore */
325
+ ...(ngDevMode ? [{ debugName: "comment" }] : /* istanbul ignore next */ []));
326
+ this.commentId = signal(null, /* @ts-ignore */
327
+ ...(ngDevMode ? [{ debugName: "commentId" }] : /* istanbul ignore next */ []));
330
328
  this.list = inject((ListService));
331
329
  this.commentEntityService = inject(CommentEntityService);
332
330
  this.commentService = inject(CommentAdminService);
333
331
  this.route = inject(ActivatedRoute);
334
332
  this.router = inject(Router);
335
333
  this.fb = inject(FormBuilder);
334
+ this.data = toSignal(this.list.hookToQuery(query => {
335
+ const filters = this.list.filter || {};
336
+ const input = {
337
+ repliedCommentId: this.commentId() ?? undefined,
338
+ ...query,
339
+ ...filters,
340
+ };
341
+ return this.commentService.getList(input);
342
+ }), {
343
+ initialValue: { items: [], totalCount: 0 },
344
+ });
336
345
  this.commentApproveStateOptions = commentApproveStateOptions;
337
346
  }
338
347
  ngOnInit() {
339
348
  this.route.params.subscribe(params => {
340
349
  const id = params['id'];
341
350
  if (id) {
342
- this.commentId = id;
351
+ this.commentId.set(id);
343
352
  this.loadComment(id);
344
353
  this.createFilterForm();
345
- this.hookToQuery();
354
+ this.list.get();
346
355
  }
347
356
  });
348
357
  this.requireApprovement = this.commentEntityService.requireApprovement;
@@ -357,7 +366,7 @@ class CommentDetailsComponent {
357
366
  }
358
367
  loadComment(id) {
359
368
  this.commentService.get(id).subscribe(comment => {
360
- this.comment = comment;
369
+ this.comment.set(comment);
361
370
  });
362
371
  }
363
372
  onFilter() {
@@ -365,46 +374,33 @@ class CommentDetailsComponent {
365
374
  const filters = {
366
375
  author: formValue.author || undefined,
367
376
  commentApproveState: formValue.commentApproveState,
368
- repliedCommentId: this.commentId,
377
+ repliedCommentId: this.commentId() ?? undefined,
369
378
  creationStartDate: formValue.creationStartDate || undefined,
370
379
  creationEndDate: formValue.creationEndDate || undefined,
371
380
  };
372
381
  this.list.filter = filters;
373
382
  this.list.get();
374
383
  }
375
- hookToQuery() {
376
- this.list
377
- .hookToQuery(query => {
378
- const filters = this.list.filter || {};
379
- const input = {
380
- repliedCommentId: this.commentId,
381
- ...query,
382
- ...filters,
383
- };
384
- return this.commentService.getList(input);
385
- })
386
- .subscribe(res => (this.data = res));
387
- }
388
384
  navigateToReply(id) {
389
385
  this.router.navigate(['/cms/comments', id]);
390
386
  }
391
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: CommentDetailsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
392
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: CommentDetailsComponent, isStandalone: true, selector: "abp-comment-details", providers: [
387
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CommentDetailsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
388
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: CommentDetailsComponent, isStandalone: true, selector: "abp-comment-details", providers: [
393
389
  ListService,
394
390
  {
395
391
  provide: EXTENSIONS_IDENTIFIER,
396
392
  useValue: eCmsKitAdminComponents.CommentDetails,
397
393
  },
398
- ], ngImport: i0, template: "<abp-page [title]=\"'CmsKit::Comments' | abpLocalization\">\r\n @if (comment) {\r\n <div class=\"card mb-4\">\r\n <div class=\"card-body\">\r\n <table class=\"table\">\r\n <tr>\r\n <td width=\"10%\">\r\n <b>{{ 'CmsKit::EntityType' | abpLocalization }}</b\r\n >:\r\n </td>\r\n <td>{{ comment.entityType }}</td>\r\n </tr>\r\n <tr>\r\n <td>\r\n <b>{{ 'CmsKit::EntityId' | abpLocalization }}</b\r\n >:\r\n </td>\r\n <td>{{ comment.entityId }}</td>\r\n </tr>\r\n <tr>\r\n <td>\r\n <b>{{ 'AbpIdentity::CreationTime' | abpLocalization }}</b\r\n >:\r\n </td>\r\n <td>{{ comment.creationTime | date }}</td>\r\n </tr>\r\n <tr>\r\n <td>\r\n <b>{{ 'CmsKit::Username' | abpLocalization }}</b\r\n >:\r\n </td>\r\n <td>{{ comment.author?.name }}</td>\r\n </tr>\r\n @if (comment.repliedCommentId) {\r\n <tr>\r\n <td>\r\n <b>{{ 'CmsKit::ReplyTo' | abpLocalization }}</b\r\n >:\r\n </td>\r\n <td>\r\n <a (click)=\"navigateToReply(comment.repliedCommentId!)\" style=\"cursor: pointer\">\r\n {{ comment.repliedCommentId }}\r\n </a>\r\n </td>\r\n </tr>\r\n }\r\n <tr>\r\n <td class=\"align-text-top\">\r\n <b>{{ 'CmsKit::Text' | abpLocalization }}</b\r\n >:\r\n </td>\r\n <td>{{ comment.text }}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"card mb-4\">\r\n <div class=\"card-body\">\r\n <form [formGroup]=\"filterForm\" (ngSubmit)=\"onFilter()\">\r\n <input type=\"hidden\" [value]=\"commentId\" />\r\n <div class=\"row\">\r\n <div class=\"col-lg-4 col-md-12\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-6 col-md-6\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"creationStartDate\">\r\n {{ 'CmsKit::StartDate' | abpLocalization }}\r\n </label>\r\n <input\r\n id=\"creationStartDate\"\r\n formControlName=\"creationStartDate\"\r\n (click)=\"startDatePicker.open()\"\r\n (keyup.space)=\"startDatePicker.open()\"\r\n ngbDatepicker\r\n #startDatePicker=\"ngbDatepicker\"\r\n type=\"text\"\r\n class=\"form-control\"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6 col-md-6\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"creationEndDate\">\r\n {{ 'CmsKit::EndDate' | abpLocalization }}\r\n </label>\r\n <input\r\n id=\"creationEndDate\"\r\n formControlName=\"creationEndDate\"\r\n class=\"form-control\"\r\n ngbDatepicker\r\n #endDatePicker=\"ngbDatepicker\"\r\n (click)=\"endDatePicker.toggle()\"\r\n readonly\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-lg-4 col-md-12\">\r\n <abp-form-input\r\n formControlName=\"author\"\r\n [label]=\"'CmsKit::Username' | abpLocalization\"\r\n type=\"text\"\r\n />\r\n </div>\r\n @if (requireApprovement) {\r\n <div class=\"col-lg-2 col-md-12\">\r\n <div class=\"mb-3\">\r\n <label class=\"mb-1 form-label\" for=\"commentApproveState\">\r\n {{ 'CmsKit::CommentFilter:ApproveState' | abpLocalization }}\r\n </label>\r\n <select\r\n id=\"commentApproveState\"\r\n formControlName=\"commentApproveState\"\r\n class=\"form-control\"\r\n >\r\n @for (option of commentApproveStateOptions; track option.value) {\r\n <option [value]=\"option.value\">\r\n {{ 'CmsKit::CommentFilter:' + option.value | abpLocalization }}\r\n </option>\r\n }\r\n </select>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"col-lg-2 col-md-12\">\r\n <div class=\"d-grid gap-2\">\r\n <abp-button class=\"mt-md-4\" buttonType=\"Primary\" type=\"submit\">\r\n <i class=\"fa fa-search\" aria-hidden=\"true\"></i>\r\n </abp-button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <h3>{{ 'CmsKit::RepliesToThisComment' | abpLocalization }}</h3>\r\n\r\n <div class=\"card\">\r\n <abp-extensible-table [data]=\"data.items\" [recordsTotal]=\"data.totalCount\" [list]=\"list\" />\r\n </div>\r\n</abp-page>\r\n", dependencies: [{ kind: "component", type: ExtensibleTableComponent, selector: "abp-extensible-table", inputs: ["actionsText", "data", "list", "recordsTotal", "actionsColumnWidth", "actionsTemplate", "selectable", "selectionType", "selected", "infiniteScroll", "isLoading", "scrollThreshold", "tableHeight", "rowDetailTemplate", "rowDetailHeight"], outputs: ["tableActivate", "selectionChange", "loadMore", "rowDetailToggle"], exportAs: ["abpExtensibleTable"] }, { kind: "component", type: PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: NgbDatepickerModule }, { kind: "directive", type: i3.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "contentTemplate", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "popperOptions", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: FormInputComponent, selector: "abp-form-input", inputs: ["inputId", "inputReadonly", "label", "labelClass", "inputPlaceholder", "inputStyle", "inputClass"], outputs: ["formBlur", "formFocus"] }, { kind: "component", type: ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }, { kind: "pipe", type: i3$1.DatePipe, name: "date" }], viewProviders: [
394
+ ], ngImport: i0, template: "<abp-page [title]=\"'CmsKit::Comments' | abpLocalization\">\r\n @if (comment(); as comment) {\r\n <div class=\"card mb-4\">\r\n <div class=\"card-body\">\r\n <table class=\"table\">\r\n <tr>\r\n <td width=\"10%\">\r\n <b>{{ 'CmsKit::EntityType' | abpLocalization }}</b\r\n >:\r\n </td>\r\n <td>{{ comment.entityType }}</td>\r\n </tr>\r\n <tr>\r\n <td>\r\n <b>{{ 'CmsKit::EntityId' | abpLocalization }}</b\r\n >:\r\n </td>\r\n <td>{{ comment.entityId }}</td>\r\n </tr>\r\n <tr>\r\n <td>\r\n <b>{{ 'AbpIdentity::CreationTime' | abpLocalization }}</b\r\n >:\r\n </td>\r\n <td>{{ comment.creationTime | date }}</td>\r\n </tr>\r\n <tr>\r\n <td>\r\n <b>{{ 'CmsKit::Username' | abpLocalization }}</b\r\n >:\r\n </td>\r\n <td>{{ comment.author?.name }}</td>\r\n </tr>\r\n @if (comment.repliedCommentId) {\r\n <tr>\r\n <td>\r\n <b>{{ 'CmsKit::ReplyTo' | abpLocalization }}</b\r\n >:\r\n </td>\r\n <td>\r\n <a (click)=\"navigateToReply(comment.repliedCommentId!)\" style=\"cursor: pointer\">\r\n {{ comment.repliedCommentId }}\r\n </a>\r\n </td>\r\n </tr>\r\n }\r\n <tr>\r\n <td class=\"align-text-top\">\r\n <b>{{ 'CmsKit::Text' | abpLocalization }}</b\r\n >:\r\n </td>\r\n <td>{{ comment.text }}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"card mb-4\">\r\n <div class=\"card-body\">\r\n <form [formGroup]=\"filterForm\" (ngSubmit)=\"onFilter()\">\r\n <input type=\"hidden\" [value]=\"commentId()\" />\r\n <div class=\"row\">\r\n <div class=\"col-lg-4 col-md-12\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-6 col-md-6\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"creationStartDate\">\r\n {{ 'CmsKit::StartDate' | abpLocalization }}\r\n </label>\r\n <input\r\n id=\"creationStartDate\"\r\n formControlName=\"creationStartDate\"\r\n (click)=\"startDatePicker.open()\"\r\n (keyup.space)=\"startDatePicker.open()\"\r\n ngbDatepicker\r\n #startDatePicker=\"ngbDatepicker\"\r\n type=\"text\"\r\n class=\"form-control\"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6 col-md-6\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"creationEndDate\">\r\n {{ 'CmsKit::EndDate' | abpLocalization }}\r\n </label>\r\n <input\r\n id=\"creationEndDate\"\r\n formControlName=\"creationEndDate\"\r\n class=\"form-control\"\r\n ngbDatepicker\r\n #endDatePicker=\"ngbDatepicker\"\r\n (click)=\"endDatePicker.toggle()\"\r\n readonly\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-lg-4 col-md-12\">\r\n <abp-form-input\r\n formControlName=\"author\"\r\n [label]=\"'CmsKit::Username' | abpLocalization\"\r\n type=\"text\"\r\n />\r\n </div>\r\n @if (requireApprovement) {\r\n <div class=\"col-lg-2 col-md-12\">\r\n <div class=\"mb-3\">\r\n <label class=\"mb-1 form-label\" for=\"commentApproveState\">\r\n {{ 'CmsKit::CommentFilter:ApproveState' | abpLocalization }}\r\n </label>\r\n <select\r\n id=\"commentApproveState\"\r\n formControlName=\"commentApproveState\"\r\n class=\"form-control\"\r\n >\r\n @for (option of commentApproveStateOptions; track option.value) {\r\n <option [value]=\"option.value\">\r\n {{ 'CmsKit::CommentFilter:' + option.value | abpLocalization }}\r\n </option>\r\n }\r\n </select>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"col-lg-2 col-md-12\">\r\n <div class=\"d-grid gap-2\">\r\n <abp-button class=\"mt-md-4\" buttonType=\"Primary\" type=\"submit\">\r\n <i class=\"fa fa-search\" aria-hidden=\"true\"></i>\r\n </abp-button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <h3>{{ 'CmsKit::RepliesToThisComment' | abpLocalization }}</h3>\r\n\r\n <div class=\"card\">\r\n <abp-extensible-table [data]=\"data().items\" [recordsTotal]=\"data().totalCount\" [list]=\"list\" />\r\n </div>\r\n</abp-page>\r\n", dependencies: [{ kind: "component", type: ExtensibleTableComponent, selector: "abp-extensible-table", inputs: ["actionsText", "data", "list", "recordsTotal", "actionsColumnWidth", "actionsTemplate", "selectable", "selectionType", "selected", "infiniteScroll", "isLoading", "scrollThreshold", "tableHeight", "rowDetailTemplate", "rowDetailHeight"], outputs: ["tableActivate", "selectionChange", "loadMore", "rowDetailToggle"], exportAs: ["abpExtensibleTable"] }, { kind: "component", type: PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: NgbDatepickerModule }, { kind: "directive", type: i3.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "contentTemplate", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "popperOptions", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: FormInputComponent, selector: "abp-form-input", inputs: ["inputId", "inputReadonly", "label", "labelClass", "inputPlaceholder", "inputStyle", "inputClass"], outputs: ["formBlur", "formFocus"] }, { kind: "component", type: ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }, { kind: "pipe", type: i3$1.DatePipe, name: "date" }], viewProviders: [
399
395
  {
400
396
  provide: NgbDateAdapter,
401
397
  useClass: DateTimeAdapter,
402
398
  },
403
- ] }); }
399
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
404
400
  }
405
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: CommentDetailsComponent, decorators: [{
401
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CommentDetailsComponent, decorators: [{
406
402
  type: Component,
407
- args: [{ selector: 'abp-comment-details', providers: [
403
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'abp-comment-details', providers: [
408
404
  ListService,
409
405
  {
410
406
  provide: EXTENSIONS_IDENTIFIER,
@@ -425,7 +421,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
425
421
  DatePipe,
426
422
  FormInputComponent,
427
423
  ButtonComponent,
428
- ], template: "<abp-page [title]=\"'CmsKit::Comments' | abpLocalization\">\r\n @if (comment) {\r\n <div class=\"card mb-4\">\r\n <div class=\"card-body\">\r\n <table class=\"table\">\r\n <tr>\r\n <td width=\"10%\">\r\n <b>{{ 'CmsKit::EntityType' | abpLocalization }}</b\r\n >:\r\n </td>\r\n <td>{{ comment.entityType }}</td>\r\n </tr>\r\n <tr>\r\n <td>\r\n <b>{{ 'CmsKit::EntityId' | abpLocalization }}</b\r\n >:\r\n </td>\r\n <td>{{ comment.entityId }}</td>\r\n </tr>\r\n <tr>\r\n <td>\r\n <b>{{ 'AbpIdentity::CreationTime' | abpLocalization }}</b\r\n >:\r\n </td>\r\n <td>{{ comment.creationTime | date }}</td>\r\n </tr>\r\n <tr>\r\n <td>\r\n <b>{{ 'CmsKit::Username' | abpLocalization }}</b\r\n >:\r\n </td>\r\n <td>{{ comment.author?.name }}</td>\r\n </tr>\r\n @if (comment.repliedCommentId) {\r\n <tr>\r\n <td>\r\n <b>{{ 'CmsKit::ReplyTo' | abpLocalization }}</b\r\n >:\r\n </td>\r\n <td>\r\n <a (click)=\"navigateToReply(comment.repliedCommentId!)\" style=\"cursor: pointer\">\r\n {{ comment.repliedCommentId }}\r\n </a>\r\n </td>\r\n </tr>\r\n }\r\n <tr>\r\n <td class=\"align-text-top\">\r\n <b>{{ 'CmsKit::Text' | abpLocalization }}</b\r\n >:\r\n </td>\r\n <td>{{ comment.text }}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"card mb-4\">\r\n <div class=\"card-body\">\r\n <form [formGroup]=\"filterForm\" (ngSubmit)=\"onFilter()\">\r\n <input type=\"hidden\" [value]=\"commentId\" />\r\n <div class=\"row\">\r\n <div class=\"col-lg-4 col-md-12\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-6 col-md-6\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"creationStartDate\">\r\n {{ 'CmsKit::StartDate' | abpLocalization }}\r\n </label>\r\n <input\r\n id=\"creationStartDate\"\r\n formControlName=\"creationStartDate\"\r\n (click)=\"startDatePicker.open()\"\r\n (keyup.space)=\"startDatePicker.open()\"\r\n ngbDatepicker\r\n #startDatePicker=\"ngbDatepicker\"\r\n type=\"text\"\r\n class=\"form-control\"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6 col-md-6\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"creationEndDate\">\r\n {{ 'CmsKit::EndDate' | abpLocalization }}\r\n </label>\r\n <input\r\n id=\"creationEndDate\"\r\n formControlName=\"creationEndDate\"\r\n class=\"form-control\"\r\n ngbDatepicker\r\n #endDatePicker=\"ngbDatepicker\"\r\n (click)=\"endDatePicker.toggle()\"\r\n readonly\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-lg-4 col-md-12\">\r\n <abp-form-input\r\n formControlName=\"author\"\r\n [label]=\"'CmsKit::Username' | abpLocalization\"\r\n type=\"text\"\r\n />\r\n </div>\r\n @if (requireApprovement) {\r\n <div class=\"col-lg-2 col-md-12\">\r\n <div class=\"mb-3\">\r\n <label class=\"mb-1 form-label\" for=\"commentApproveState\">\r\n {{ 'CmsKit::CommentFilter:ApproveState' | abpLocalization }}\r\n </label>\r\n <select\r\n id=\"commentApproveState\"\r\n formControlName=\"commentApproveState\"\r\n class=\"form-control\"\r\n >\r\n @for (option of commentApproveStateOptions; track option.value) {\r\n <option [value]=\"option.value\">\r\n {{ 'CmsKit::CommentFilter:' + option.value | abpLocalization }}\r\n </option>\r\n }\r\n </select>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"col-lg-2 col-md-12\">\r\n <div class=\"d-grid gap-2\">\r\n <abp-button class=\"mt-md-4\" buttonType=\"Primary\" type=\"submit\">\r\n <i class=\"fa fa-search\" aria-hidden=\"true\"></i>\r\n </abp-button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <h3>{{ 'CmsKit::RepliesToThisComment' | abpLocalization }}</h3>\r\n\r\n <div class=\"card\">\r\n <abp-extensible-table [data]=\"data.items\" [recordsTotal]=\"data.totalCount\" [list]=\"list\" />\r\n </div>\r\n</abp-page>\r\n" }]
424
+ ], template: "<abp-page [title]=\"'CmsKit::Comments' | abpLocalization\">\r\n @if (comment(); as comment) {\r\n <div class=\"card mb-4\">\r\n <div class=\"card-body\">\r\n <table class=\"table\">\r\n <tr>\r\n <td width=\"10%\">\r\n <b>{{ 'CmsKit::EntityType' | abpLocalization }}</b\r\n >:\r\n </td>\r\n <td>{{ comment.entityType }}</td>\r\n </tr>\r\n <tr>\r\n <td>\r\n <b>{{ 'CmsKit::EntityId' | abpLocalization }}</b\r\n >:\r\n </td>\r\n <td>{{ comment.entityId }}</td>\r\n </tr>\r\n <tr>\r\n <td>\r\n <b>{{ 'AbpIdentity::CreationTime' | abpLocalization }}</b\r\n >:\r\n </td>\r\n <td>{{ comment.creationTime | date }}</td>\r\n </tr>\r\n <tr>\r\n <td>\r\n <b>{{ 'CmsKit::Username' | abpLocalization }}</b\r\n >:\r\n </td>\r\n <td>{{ comment.author?.name }}</td>\r\n </tr>\r\n @if (comment.repliedCommentId) {\r\n <tr>\r\n <td>\r\n <b>{{ 'CmsKit::ReplyTo' | abpLocalization }}</b\r\n >:\r\n </td>\r\n <td>\r\n <a (click)=\"navigateToReply(comment.repliedCommentId!)\" style=\"cursor: pointer\">\r\n {{ comment.repliedCommentId }}\r\n </a>\r\n </td>\r\n </tr>\r\n }\r\n <tr>\r\n <td class=\"align-text-top\">\r\n <b>{{ 'CmsKit::Text' | abpLocalization }}</b\r\n >:\r\n </td>\r\n <td>{{ comment.text }}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"card mb-4\">\r\n <div class=\"card-body\">\r\n <form [formGroup]=\"filterForm\" (ngSubmit)=\"onFilter()\">\r\n <input type=\"hidden\" [value]=\"commentId()\" />\r\n <div class=\"row\">\r\n <div class=\"col-lg-4 col-md-12\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-6 col-md-6\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"creationStartDate\">\r\n {{ 'CmsKit::StartDate' | abpLocalization }}\r\n </label>\r\n <input\r\n id=\"creationStartDate\"\r\n formControlName=\"creationStartDate\"\r\n (click)=\"startDatePicker.open()\"\r\n (keyup.space)=\"startDatePicker.open()\"\r\n ngbDatepicker\r\n #startDatePicker=\"ngbDatepicker\"\r\n type=\"text\"\r\n class=\"form-control\"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6 col-md-6\">\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\" for=\"creationEndDate\">\r\n {{ 'CmsKit::EndDate' | abpLocalization }}\r\n </label>\r\n <input\r\n id=\"creationEndDate\"\r\n formControlName=\"creationEndDate\"\r\n class=\"form-control\"\r\n ngbDatepicker\r\n #endDatePicker=\"ngbDatepicker\"\r\n (click)=\"endDatePicker.toggle()\"\r\n readonly\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-lg-4 col-md-12\">\r\n <abp-form-input\r\n formControlName=\"author\"\r\n [label]=\"'CmsKit::Username' | abpLocalization\"\r\n type=\"text\"\r\n />\r\n </div>\r\n @if (requireApprovement) {\r\n <div class=\"col-lg-2 col-md-12\">\r\n <div class=\"mb-3\">\r\n <label class=\"mb-1 form-label\" for=\"commentApproveState\">\r\n {{ 'CmsKit::CommentFilter:ApproveState' | abpLocalization }}\r\n </label>\r\n <select\r\n id=\"commentApproveState\"\r\n formControlName=\"commentApproveState\"\r\n class=\"form-control\"\r\n >\r\n @for (option of commentApproveStateOptions; track option.value) {\r\n <option [value]=\"option.value\">\r\n {{ 'CmsKit::CommentFilter:' + option.value | abpLocalization }}\r\n </option>\r\n }\r\n </select>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"col-lg-2 col-md-12\">\r\n <div class=\"d-grid gap-2\">\r\n <abp-button class=\"mt-md-4\" buttonType=\"Primary\" type=\"submit\">\r\n <i class=\"fa fa-search\" aria-hidden=\"true\"></i>\r\n </abp-button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n\r\n <h3>{{ 'CmsKit::RepliesToThisComment' | abpLocalization }}</h3>\r\n\r\n <div class=\"card\">\r\n <abp-extensible-table [data]=\"data().items\" [recordsTotal]=\"data().totalCount\" [list]=\"list\" />\r\n </div>\r\n</abp-page>\r\n" }]
429
425
  }] });
430
426
 
431
427
  const CMS_KIT_COMMENTS_REQUIRE_APPROVEMENT = 'CmsKit.Comments.RequireApprovement';
@@ -435,8 +431,10 @@ class TagModalComponent {
435
431
  this.tagService = inject(TagAdminService);
436
432
  this.injector = inject(Injector);
437
433
  this.toasterService = inject(ToasterService);
438
- this.selected = input(...(ngDevMode ? [undefined, { debugName: "selected" }] : /* istanbul ignore next */ []));
439
- this.sectionId = input(...(ngDevMode ? [undefined, { debugName: "sectionId" }] : /* istanbul ignore next */ []));
434
+ this.selected = input(/* @ts-ignore */
435
+ ...(ngDevMode ? [undefined, { debugName: "selected" }] : /* istanbul ignore next */ []));
436
+ this.sectionId = input(/* @ts-ignore */
437
+ ...(ngDevMode ? [undefined, { debugName: "sectionId" }] : /* istanbul ignore next */ []));
440
438
  this.visibleChange = output();
441
439
  }
442
440
  ngOnInit() {
@@ -467,12 +465,12 @@ class TagModalComponent {
467
465
  this.toasterService.success('AbpUi::SavedSuccessfully');
468
466
  });
469
467
  }
470
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TagModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
471
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: TagModalComponent, isStandalone: true, selector: "abp-tag-modal", inputs: { selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, sectionId: { classPropertyName: "sectionId", publicName: "sectionId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visibleChange: "visibleChange" }, ngImport: i0, template: "<abp-modal [visible]=\"true\" (visibleChange)=\"onVisibleChange($event)\">\r\n <ng-template #abpHeader>\r\n <h3>\r\n {{ (selected()?.id ? 'AbpUi::Edit' : 'AbpUi::New') | abpLocalization }}\r\n </h3>\r\n </ng-template>\r\n\r\n <ng-template #abpBody>\r\n @if (form) {\r\n <form [formGroup]=\"form\" (ngSubmit)=\"save()\" validateOnSubmit>\r\n <abp-extensible-form [selectedRecord]=\"selected()\" />\r\n </form>\r\n } @else {\r\n <div class=\"text-center\">\r\n <i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i>\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-outline-primary\" abpClose>\r\n {{ 'AbpUi::Cancel' | abpLocalization }}\r\n </button>\r\n <abp-button iconClass=\"fa fa-check\" [disabled]=\"form?.invalid\" (click)=\"save()\">\r\n {{ 'AbpUi::Save' | abpLocalization }}\r\n </abp-button>\r\n </ng-template>\r\n</abp-modal>\r\n", dependencies: [{ kind: "component", type: ExtensibleFormComponent, selector: "abp-extensible-form", inputs: ["selectedRecord"], exportAs: ["abpExtensibleForm"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: NgxValidateCoreModule }, { kind: "directive", type: i2$1.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "component", type: ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }, { kind: "directive", type: ModalCloseDirective, selector: "[abpClose]" }, { kind: "component", type: ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }] }); }
468
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TagModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
469
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: TagModalComponent, isStandalone: true, selector: "abp-tag-modal", inputs: { selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, sectionId: { classPropertyName: "sectionId", publicName: "sectionId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visibleChange: "visibleChange" }, ngImport: i0, template: "<abp-modal [visible]=\"true\" (visibleChange)=\"onVisibleChange($event)\">\r\n <ng-template #abpHeader>\r\n <h3>\r\n {{ (selected()?.id ? 'AbpUi::Edit' : 'AbpUi::New') | abpLocalization }}\r\n </h3>\r\n </ng-template>\r\n\r\n <ng-template #abpBody>\r\n @if (form) {\r\n <form [formGroup]=\"form\" (ngSubmit)=\"save()\" [validateOnSubmit]=\"true\">\r\n <abp-extensible-form [selectedRecord]=\"selected()\" />\r\n </form>\r\n } @else {\r\n <div class=\"text-center\">\r\n <i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i>\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-outline-primary\" abpClose>\r\n {{ 'AbpUi::Cancel' | abpLocalization }}\r\n </button>\r\n <abp-button iconClass=\"fa fa-check\" [disabled]=\"form?.invalid\" (click)=\"save()\">\r\n {{ 'AbpUi::Save' | abpLocalization }}\r\n </abp-button>\r\n </ng-template>\r\n</abp-modal>\r\n", dependencies: [{ kind: "component", type: ExtensibleFormComponent, selector: "abp-extensible-form", inputs: ["selectedRecord"], exportAs: ["abpExtensibleForm"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: NgxValidateCoreModule }, { kind: "directive", type: i2$1.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "component", type: ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }, { kind: "directive", type: ModalCloseDirective, selector: "[abpClose]" }, { kind: "component", type: ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
472
470
  }
473
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TagModalComponent, decorators: [{
471
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TagModalComponent, decorators: [{
474
472
  type: Component,
475
- args: [{ selector: 'abp-tag-modal', imports: [
473
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'abp-tag-modal', imports: [
476
474
  ExtensibleFormComponent,
477
475
  LocalizationPipe,
478
476
  ReactiveFormsModule,
@@ -481,57 +479,48 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
481
479
  ModalComponent,
482
480
  ModalCloseDirective,
483
481
  ButtonComponent,
484
- ], template: "<abp-modal [visible]=\"true\" (visibleChange)=\"onVisibleChange($event)\">\r\n <ng-template #abpHeader>\r\n <h3>\r\n {{ (selected()?.id ? 'AbpUi::Edit' : 'AbpUi::New') | abpLocalization }}\r\n </h3>\r\n </ng-template>\r\n\r\n <ng-template #abpBody>\r\n @if (form) {\r\n <form [formGroup]=\"form\" (ngSubmit)=\"save()\" validateOnSubmit>\r\n <abp-extensible-form [selectedRecord]=\"selected()\" />\r\n </form>\r\n } @else {\r\n <div class=\"text-center\">\r\n <i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i>\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-outline-primary\" abpClose>\r\n {{ 'AbpUi::Cancel' | abpLocalization }}\r\n </button>\r\n <abp-button iconClass=\"fa fa-check\" [disabled]=\"form?.invalid\" (click)=\"save()\">\r\n {{ 'AbpUi::Save' | abpLocalization }}\r\n </abp-button>\r\n </ng-template>\r\n</abp-modal>\r\n" }]
482
+ ], template: "<abp-modal [visible]=\"true\" (visibleChange)=\"onVisibleChange($event)\">\r\n <ng-template #abpHeader>\r\n <h3>\r\n {{ (selected()?.id ? 'AbpUi::Edit' : 'AbpUi::New') | abpLocalization }}\r\n </h3>\r\n </ng-template>\r\n\r\n <ng-template #abpBody>\r\n @if (form) {\r\n <form [formGroup]=\"form\" (ngSubmit)=\"save()\" [validateOnSubmit]=\"true\">\r\n <abp-extensible-form [selectedRecord]=\"selected()\" />\r\n </form>\r\n } @else {\r\n <div class=\"text-center\">\r\n <i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i>\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-outline-primary\" abpClose>\r\n {{ 'AbpUi::Cancel' | abpLocalization }}\r\n </button>\r\n <abp-button iconClass=\"fa fa-check\" [disabled]=\"form?.invalid\" (click)=\"save()\">\r\n {{ 'AbpUi::Save' | abpLocalization }}\r\n </abp-button>\r\n </ng-template>\r\n</abp-modal>\r\n" }]
485
483
  }], propDecorators: { selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }], sectionId: [{ type: i0.Input, args: [{ isSignal: true, alias: "sectionId", required: false }] }], visibleChange: [{ type: i0.Output, args: ["visibleChange"] }] } });
486
484
 
487
485
  class TagListComponent {
488
486
  constructor() {
489
- this.data = { items: [], totalCount: 0 };
490
487
  this.list = inject((ListService));
491
488
  this.tagService = inject(TagAdminService);
492
489
  this.confirmationService = inject(ConfirmationService);
493
- this.filter = '';
494
- this.isModalVisible = false;
495
- this.tagDefinitions = [];
496
- }
497
- ngOnInit() {
498
- this.loadTagDefinitions();
499
- this.hookToQuery();
500
- }
501
- loadTagDefinitions() {
502
- this.tagService.getTagDefinitions().subscribe(definitions => {
503
- this.tagDefinitions = definitions;
490
+ this.data = toSignal(this.list.hookToQuery(query => {
491
+ let filters = {};
492
+ if (this.list.filter) {
493
+ filters.filter = this.list.filter;
494
+ }
495
+ const input = {
496
+ ...query,
497
+ ...filters,
498
+ };
499
+ return this.tagService.getList(input);
500
+ }), {
501
+ initialValue: { items: [], totalCount: 0 },
502
+ });
503
+ this.tagDefinitions = toSignal(this.tagService.getTagDefinitions(), {
504
+ initialValue: [],
504
505
  });
506
+ this.filter = '';
507
+ this.isModalVisible = signal(false, /* @ts-ignore */
508
+ ...(ngDevMode ? [{ debugName: "isModalVisible" }] : /* istanbul ignore next */ []));
509
+ this.selected = signal(undefined, /* @ts-ignore */
510
+ ...(ngDevMode ? [{ debugName: "selected" }] : /* istanbul ignore next */ []));
505
511
  }
506
512
  onSearch() {
507
513
  this.list.filter = this.filter;
508
514
  this.list.get();
509
515
  }
510
516
  add() {
511
- this.selected = {};
512
- this.isModalVisible = true;
517
+ this.selected.set({});
518
+ this.isModalVisible.set(true);
513
519
  }
514
520
  edit(id) {
515
521
  this.tagService.get(id).subscribe(tag => {
516
- this.selected = tag;
517
- this.isModalVisible = true;
518
- });
519
- }
520
- hookToQuery() {
521
- this.list
522
- .hookToQuery(query => {
523
- let filters = {};
524
- if (this.list.filter) {
525
- filters.filter = this.list.filter;
526
- }
527
- const input = {
528
- ...query,
529
- ...filters,
530
- };
531
- return this.tagService.getList(input);
532
- })
533
- .subscribe(res => {
534
- this.data = res;
522
+ this.selected.set(tag);
523
+ this.isModalVisible.set(true);
535
524
  });
536
525
  }
537
526
  onVisibleModalChange(visibilityChange) {
@@ -541,8 +530,8 @@ class TagListComponent {
541
530
  if (visibilityChange.refresh) {
542
531
  this.list.get();
543
532
  }
544
- this.selected = null;
545
- this.isModalVisible = false;
533
+ this.selected.set(undefined);
534
+ this.isModalVisible.set(false);
546
535
  }
547
536
  delete(id, name) {
548
537
  this.confirmationService
@@ -551,24 +540,22 @@ class TagListComponent {
551
540
  })
552
541
  .subscribe((status) => {
553
542
  if (status === Confirmation.Status.confirm) {
554
- this.tagService.delete(id).subscribe(() => {
555
- this.list.get();
556
- });
543
+ this.tagService.delete(id).subscribe(() => this.list.get());
557
544
  }
558
545
  });
559
546
  }
560
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TagListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
561
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: TagListComponent, isStandalone: true, selector: "abp-tag-list", providers: [
547
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TagListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
548
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: TagListComponent, isStandalone: true, selector: "abp-tag-list", providers: [
562
549
  ListService,
563
550
  {
564
551
  provide: EXTENSIONS_IDENTIFIER,
565
552
  useValue: eCmsKitAdminComponents.Tags,
566
553
  },
567
- ], ngImport: i0, template: "<abp-page [title]=\"'CmsKit::Tags' | abpLocalization\" [toolbar]=\"data.items\">\r\n <div class=\"card mb-4\">\r\n <div class=\"card-body\">\r\n <div class=\"row\">\r\n <div class=\"col-12\">\r\n <div class=\"input-group\">\r\n <input\r\n type=\"search\"\r\n class=\"form-control\"\r\n [placeholder]=\"'AbpUi::PagerSearch' | abpLocalization\"\r\n [(ngModel)]=\"filter\"\r\n (keyup.enter)=\"onSearch()\"\r\n />\r\n <button class=\"btn btn-primary\" type=\"button\" (click)=\"onSearch()\">\r\n <i class=\"fa fa-search\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card\">\r\n <abp-extensible-table [data]=\"data.items\" [recordsTotal]=\"data.totalCount\" [list]=\"list\" />\r\n </div>\r\n\r\n @if (isModalVisible) {\r\n <abp-tag-modal [selected]=\"selected\" (visibleChange)=\"onVisibleModalChange($event)\" />\r\n }\r\n</abp-page>\r\n", dependencies: [{ kind: "component", type: ExtensibleTableComponent, selector: "abp-extensible-table", inputs: ["actionsText", "data", "list", "recordsTotal", "actionsColumnWidth", "actionsTemplate", "selectable", "selectionType", "selected", "infiniteScroll", "isLoading", "scrollThreshold", "tableHeight", "rowDetailTemplate", "rowDetailHeight"], outputs: ["tableActivate", "selectionChange", "loadMore", "rowDetailToggle"], exportAs: ["abpExtensibleTable"] }, { kind: "component", type: PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: TagModalComponent, selector: "abp-tag-modal", inputs: ["selected", "sectionId"], outputs: ["visibleChange"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }] }); }
554
+ ], ngImport: i0, template: "<abp-page [title]=\"'CmsKit::Tags' | abpLocalization\" [toolbar]=\"data().items\">\r\n <div class=\"card mb-4\">\r\n <div class=\"card-body\">\r\n <div class=\"row\">\r\n <div class=\"col-12\">\r\n <div class=\"input-group\">\r\n <input\r\n type=\"search\"\r\n class=\"form-control\"\r\n [placeholder]=\"'AbpUi::PagerSearch' | abpLocalization\"\r\n [(ngModel)]=\"filter\"\r\n (keyup.enter)=\"onSearch()\"\r\n />\r\n <button class=\"btn btn-primary\" type=\"button\" (click)=\"onSearch()\">\r\n <i class=\"fa fa-search\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card\">\r\n <abp-extensible-table [data]=\"data().items\" [recordsTotal]=\"data().totalCount\" [list]=\"list\" />\r\n </div>\r\n\r\n @if (isModalVisible()) {\r\n <abp-tag-modal [selected]=\"selected()\" (visibleChange)=\"onVisibleModalChange($event)\" />\r\n }\r\n</abp-page>\r\n", dependencies: [{ kind: "component", type: ExtensibleTableComponent, selector: "abp-extensible-table", inputs: ["actionsText", "data", "list", "recordsTotal", "actionsColumnWidth", "actionsTemplate", "selectable", "selectionType", "selected", "infiniteScroll", "isLoading", "scrollThreshold", "tableHeight", "rowDetailTemplate", "rowDetailHeight"], outputs: ["tableActivate", "selectionChange", "loadMore", "rowDetailToggle"], exportAs: ["abpExtensibleTable"] }, { kind: "component", type: PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: TagModalComponent, selector: "abp-tag-modal", inputs: ["selected", "sectionId"], outputs: ["visibleChange"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
568
555
  }
569
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TagListComponent, decorators: [{
556
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TagListComponent, decorators: [{
570
557
  type: Component,
571
- args: [{ selector: 'abp-tag-list', providers: [
558
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'abp-tag-list', providers: [
572
559
  ListService,
573
560
  {
574
561
  provide: EXTENSIONS_IDENTIFIER,
@@ -581,28 +568,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
581
568
  FormsModule,
582
569
  CommonModule,
583
570
  TagModalComponent,
584
- ], template: "<abp-page [title]=\"'CmsKit::Tags' | abpLocalization\" [toolbar]=\"data.items\">\r\n <div class=\"card mb-4\">\r\n <div class=\"card-body\">\r\n <div class=\"row\">\r\n <div class=\"col-12\">\r\n <div class=\"input-group\">\r\n <input\r\n type=\"search\"\r\n class=\"form-control\"\r\n [placeholder]=\"'AbpUi::PagerSearch' | abpLocalization\"\r\n [(ngModel)]=\"filter\"\r\n (keyup.enter)=\"onSearch()\"\r\n />\r\n <button class=\"btn btn-primary\" type=\"button\" (click)=\"onSearch()\">\r\n <i class=\"fa fa-search\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card\">\r\n <abp-extensible-table [data]=\"data.items\" [recordsTotal]=\"data.totalCount\" [list]=\"list\" />\r\n </div>\r\n\r\n @if (isModalVisible) {\r\n <abp-tag-modal [selected]=\"selected\" (visibleChange)=\"onVisibleModalChange($event)\" />\r\n }\r\n</abp-page>\r\n" }]
571
+ ], template: "<abp-page [title]=\"'CmsKit::Tags' | abpLocalization\" [toolbar]=\"data().items\">\r\n <div class=\"card mb-4\">\r\n <div class=\"card-body\">\r\n <div class=\"row\">\r\n <div class=\"col-12\">\r\n <div class=\"input-group\">\r\n <input\r\n type=\"search\"\r\n class=\"form-control\"\r\n [placeholder]=\"'AbpUi::PagerSearch' | abpLocalization\"\r\n [(ngModel)]=\"filter\"\r\n (keyup.enter)=\"onSearch()\"\r\n />\r\n <button class=\"btn btn-primary\" type=\"button\" (click)=\"onSearch()\">\r\n <i class=\"fa fa-search\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card\">\r\n <abp-extensible-table [data]=\"data().items\" [recordsTotal]=\"data().totalCount\" [list]=\"list\" />\r\n </div>\r\n\r\n @if (isModalVisible()) {\r\n <abp-tag-modal [selected]=\"selected()\" (visibleChange)=\"onVisibleModalChange($event)\" />\r\n }\r\n</abp-page>\r\n" }]
585
572
  }] });
586
573
 
587
574
  class PageListComponent {
588
575
  constructor() {
589
- this.data = { items: [], totalCount: 0 };
590
576
  this.list = inject((ListService));
591
577
  this.pageService = inject(PageAdminService);
592
578
  this.confirmationService = inject(ConfirmationService);
593
579
  this.toasterService = inject(ToasterService);
594
- this.filter = '';
595
- }
596
- ngOnInit() {
597
- this.hookToQuery();
598
- }
599
- onSearch() {
600
- this.list.filter = this.filter;
601
- this.list.get();
602
- }
603
- hookToQuery() {
604
- this.list
605
- .hookToQuery(query => {
580
+ this.data = toSignal(this.list.hookToQuery(query => {
606
581
  let filters = {};
607
582
  if (this.list.filter) {
608
583
  filters.filter = this.list.filter;
@@ -612,10 +587,14 @@ class PageListComponent {
612
587
  ...filters,
613
588
  };
614
589
  return this.pageService.getList(input);
615
- })
616
- .subscribe(res => {
617
- this.data = res;
590
+ }), {
591
+ initialValue: { items: [], totalCount: 0 },
618
592
  });
593
+ this.filter = '';
594
+ }
595
+ onSearch() {
596
+ this.list.filter = this.filter;
597
+ this.list.get();
619
598
  }
620
599
  delete(id) {
621
600
  this.confirmationService
@@ -625,9 +604,7 @@ class PageListComponent {
625
604
  })
626
605
  .subscribe((status) => {
627
606
  if (status === Confirmation.Status.confirm) {
628
- this.pageService.delete(id).subscribe(() => {
629
- this.list.get();
630
- });
607
+ this.pageService.delete(id).subscribe(() => this.list.get());
631
608
  }
632
609
  });
633
610
  }
@@ -642,24 +619,24 @@ class PageListComponent {
642
619
  }
643
620
  });
644
621
  }
645
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: PageListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
646
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.17", type: PageListComponent, isStandalone: true, selector: "abp-page-list", providers: [
622
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PageListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
623
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.5", type: PageListComponent, isStandalone: true, selector: "abp-page-list", providers: [
647
624
  ListService,
648
625
  {
649
626
  provide: EXTENSIONS_IDENTIFIER,
650
627
  useValue: eCmsKitAdminComponents.Pages,
651
628
  },
652
- ], ngImport: i0, template: "<abp-page [title]=\"'CmsKit::Pages' | abpLocalization\" [toolbar]=\"data.items\">\r\n <div class=\"card mb-4\">\r\n <div class=\"card-body\">\r\n <div class=\"row\">\r\n <div class=\"col-12\">\r\n <div class=\"input-group\">\r\n <input\r\n type=\"search\"\r\n class=\"form-control\"\r\n [placeholder]=\"'AbpUi::PagerSearch' | abpLocalization\"\r\n [(ngModel)]=\"filter\"\r\n (keyup.enter)=\"onSearch()\"\r\n />\r\n <button class=\"btn btn-primary\" type=\"button\" (click)=\"onSearch()\">\r\n <i class=\"fa fa-search\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card\">\r\n <abp-extensible-table [data]=\"data.items\" [recordsTotal]=\"data.totalCount\" [list]=\"list\" />\r\n </div>\r\n</abp-page>\r\n", dependencies: [{ kind: "component", type: ExtensibleTableComponent, selector: "abp-extensible-table", inputs: ["actionsText", "data", "list", "recordsTotal", "actionsColumnWidth", "actionsTemplate", "selectable", "selectionType", "selected", "infiniteScroll", "isLoading", "scrollThreshold", "tableHeight", "rowDetailTemplate", "rowDetailHeight"], outputs: ["tableActivate", "selectionChange", "loadMore", "rowDetailToggle"], exportAs: ["abpExtensibleTable"] }, { kind: "component", type: PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }] }); }
629
+ ], ngImport: i0, template: "<abp-page [title]=\"'CmsKit::Pages' | abpLocalization\" [toolbar]=\"data().items\">\r\n <div class=\"card mb-4\">\r\n <div class=\"card-body\">\r\n <div class=\"row\">\r\n <div class=\"col-12\">\r\n <div class=\"input-group\">\r\n <input\r\n type=\"search\"\r\n class=\"form-control\"\r\n [placeholder]=\"'AbpUi::PagerSearch' | abpLocalization\"\r\n [(ngModel)]=\"filter\"\r\n (keyup.enter)=\"onSearch()\"\r\n />\r\n <button class=\"btn btn-primary\" type=\"button\" (click)=\"onSearch()\">\r\n <i class=\"fa fa-search\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card\">\r\n <abp-extensible-table\r\n [data]=\"data().items\"\r\n [recordsTotal]=\"data().totalCount\"\r\n [list]=\"list\"\r\n />\r\n </div>\r\n</abp-page>\r\n", dependencies: [{ kind: "component", type: ExtensibleTableComponent, selector: "abp-extensible-table", inputs: ["actionsText", "data", "list", "recordsTotal", "actionsColumnWidth", "actionsTemplate", "selectable", "selectionType", "selected", "infiniteScroll", "isLoading", "scrollThreshold", "tableHeight", "rowDetailTemplate", "rowDetailHeight"], outputs: ["tableActivate", "selectionChange", "loadMore", "rowDetailToggle"], exportAs: ["abpExtensibleTable"] }, { kind: "component", type: PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
653
630
  }
654
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: PageListComponent, decorators: [{
631
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PageListComponent, decorators: [{
655
632
  type: Component,
656
- args: [{ selector: 'abp-page-list', providers: [
633
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'abp-page-list', providers: [
657
634
  ListService,
658
635
  {
659
636
  provide: EXTENSIONS_IDENTIFIER,
660
637
  useValue: eCmsKitAdminComponents.Pages,
661
638
  },
662
- ], imports: [ExtensibleTableComponent, PageComponent, LocalizationPipe, FormsModule, CommonModule], template: "<abp-page [title]=\"'CmsKit::Pages' | abpLocalization\" [toolbar]=\"data.items\">\r\n <div class=\"card mb-4\">\r\n <div class=\"card-body\">\r\n <div class=\"row\">\r\n <div class=\"col-12\">\r\n <div class=\"input-group\">\r\n <input\r\n type=\"search\"\r\n class=\"form-control\"\r\n [placeholder]=\"'AbpUi::PagerSearch' | abpLocalization\"\r\n [(ngModel)]=\"filter\"\r\n (keyup.enter)=\"onSearch()\"\r\n />\r\n <button class=\"btn btn-primary\" type=\"button\" (click)=\"onSearch()\">\r\n <i class=\"fa fa-search\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card\">\r\n <abp-extensible-table [data]=\"data.items\" [recordsTotal]=\"data.totalCount\" [list]=\"list\" />\r\n </div>\r\n</abp-page>\r\n" }]
639
+ ], imports: [ExtensibleTableComponent, PageComponent, LocalizationPipe, FormsModule, CommonModule], template: "<abp-page [title]=\"'CmsKit::Pages' | abpLocalization\" [toolbar]=\"data().items\">\r\n <div class=\"card mb-4\">\r\n <div class=\"card-body\">\r\n <div class=\"row\">\r\n <div class=\"col-12\">\r\n <div class=\"input-group\">\r\n <input\r\n type=\"search\"\r\n class=\"form-control\"\r\n [placeholder]=\"'AbpUi::PagerSearch' | abpLocalization\"\r\n [(ngModel)]=\"filter\"\r\n (keyup.enter)=\"onSearch()\"\r\n />\r\n <button class=\"btn btn-primary\" type=\"button\" (click)=\"onSearch()\">\r\n <i class=\"fa fa-search\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card\">\r\n <abp-extensible-table\r\n [data]=\"data().items\"\r\n [recordsTotal]=\"data().totalCount\"\r\n [list]=\"list\"\r\n />\r\n </div>\r\n</abp-page>\r\n" }]
663
640
  }] });
664
641
 
665
642
  class PageFormComponent {
@@ -669,53 +646,57 @@ class PageFormComponent {
669
646
  this.pageFormService = inject(PageFormService);
670
647
  this.route = inject(ActivatedRoute);
671
648
  this.destroyRef = inject(DestroyRef);
672
- this.page = null;
649
+ this.page = signal(null, /* @ts-ignore */
650
+ ...(ngDevMode ? [{ debugName: "page" }] : /* istanbul ignore next */ []));
673
651
  this.pageId = null;
674
- this.isEditMode = false;
652
+ this.isEditMode = signal(false, /* @ts-ignore */
653
+ ...(ngDevMode ? [{ debugName: "isEditMode" }] : /* istanbul ignore next */ []));
675
654
  }
676
655
  ngOnInit() {
677
656
  const id = this.route.snapshot.params['id'];
678
657
  if (id) {
679
- this.isEditMode = true;
658
+ this.isEditMode.set(true);
680
659
  this.pageId = id;
681
660
  this.loadPage(id);
682
661
  }
683
662
  else {
684
- this.isEditMode = false;
663
+ this.isEditMode.set(false);
685
664
  this.buildForm();
686
665
  }
687
666
  }
688
667
  loadPage(id) {
689
668
  this.pageService.get(id).subscribe(page => {
690
- this.page = page;
669
+ this.page.set(page);
691
670
  this.buildForm();
692
671
  });
693
672
  }
694
673
  buildForm() {
695
- const data = new FormPropData(this.injector, this.page || {});
674
+ const currentPage = this.page();
675
+ const data = new FormPropData(this.injector, currentPage || {});
696
676
  const baseForm = generateFormFromProps(data);
697
677
  this.form = new FormGroup({
698
678
  ...baseForm.controls,
699
- content: new FormControl(this.page?.content || ''),
700
- script: new FormControl(this.page?.script || ''),
701
- style: new FormControl(this.page?.style || ''),
679
+ content: new FormControl(currentPage?.content || ''),
680
+ script: new FormControl(currentPage?.script || ''),
681
+ style: new FormControl(currentPage?.style || ''),
702
682
  });
703
683
  prepareSlugFromControl(this.form, 'title', 'slug', this.destroyRef);
704
684
  }
705
685
  executeSaveOperation(operation) {
706
- if (this.isEditMode) {
707
- if (!this.page || !this.pageId) {
686
+ if (this.isEditMode()) {
687
+ const currentPage = this.page();
688
+ if (!currentPage || !this.pageId) {
708
689
  return;
709
690
  }
710
691
  switch (operation) {
711
692
  case 'save':
712
- this.pageFormService.update(this.pageId, this.form, this.page).subscribe();
693
+ this.pageFormService.update(this.pageId, this.form, currentPage).subscribe();
713
694
  break;
714
695
  case 'draft':
715
- this.pageFormService.updateAsDraft(this.pageId, this.form, this.page).subscribe();
696
+ this.pageFormService.updateAsDraft(this.pageId, this.form, currentPage).subscribe();
716
697
  break;
717
698
  case 'publish':
718
- this.pageFormService.updateAndPublish(this.pageId, this.form, this.page).subscribe();
699
+ this.pageFormService.updateAndPublish(this.pageId, this.form, currentPage).subscribe();
719
700
  break;
720
701
  }
721
702
  return;
@@ -741,17 +722,17 @@ class PageFormComponent {
741
722
  publish() {
742
723
  this.executeSaveOperation('publish');
743
724
  }
744
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: PageFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
745
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: PageFormComponent, isStandalone: true, selector: "abp-page-form", providers: [
725
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PageFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
726
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: PageFormComponent, isStandalone: true, selector: "abp-page-form", providers: [
746
727
  {
747
728
  provide: EXTENSIONS_IDENTIFIER,
748
729
  useValue: eCmsKitAdminComponents.PageForm,
749
730
  },
750
- ], ngImport: i0, template: "<abp-page [title]=\"'CmsKit::Pages' | abpLocalization\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n @if (form && (!isEditMode || page)) {\r\n <form [formGroup]=\"form\" (ngSubmit)=\"save()\" validateOnSubmit>\r\n <!-- Basic fields outside tabs -->\r\n <abp-extensible-form [selectedRecord]=\"page || {}\" />\r\n\r\n <!-- Tabs for Content, Script, and Style -->\r\n <ul ngbNav #nav=\"ngbNav\" class=\"nav-tabs mt-3\">\r\n <li ngbNavItem>\r\n <a ngbNavLink>{{ 'CmsKit::Content' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <abp-toastui-editor formControlName=\"content\" />\r\n </div>\r\n </ng-template>\r\n </li>\r\n\r\n <li ngbNavItem>\r\n <a ngbNavLink>{{ 'CmsKit::Script' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <abp-codemirror-editor formControlName=\"script\" />\r\n </div>\r\n </ng-template>\r\n </li>\r\n\r\n <li ngbNavItem>\r\n <a ngbNavLink>{{ 'CmsKit::Style' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <abp-codemirror-editor formControlName=\"style\" />\r\n </div>\r\n </ng-template>\r\n </li>\r\n </ul>\r\n <div class=\"mt-2 fade-in-top\" [ngbNavOutlet]=\"nav\"></div>\r\n </form>\r\n } @else {\r\n <div class=\"text-center\">\r\n <i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i>\r\n </div>\r\n }\r\n </div>\r\n <div class=\"card-footer\">\r\n <div class=\"d-flex justify-content-start gap-2\">\r\n <button class=\"btn btn-secondary\" (click)=\"saveAsDraft()\" [disabled]=\"form?.invalid\">\r\n {{ 'CmsKit::SaveAsDraft' | abpLocalization }}\r\n </button>\r\n <abp-button (click)=\"publish()\" [disabled]=\"form?.invalid\">\r\n {{ 'CmsKit::Publish' | abpLocalization }}\r\n </abp-button>\r\n </div>\r\n </div>\r\n </div>\r\n</abp-page>\r\n", dependencies: [{ kind: "component", type: ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "component", type: CodeMirrorEditorComponent, selector: "abp-codemirror-editor" }, { kind: "component", type: ExtensibleFormComponent, selector: "abp-extensible-form", inputs: ["selectedRecord"], exportAs: ["abpExtensibleForm"] }, { kind: "component", type: PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }, { kind: "component", type: ToastuiEditorComponent, selector: "abp-toastui-editor" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: NgxValidateCoreModule }, { kind: "directive", type: i2$1.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "directive", type: i2$1.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "ngmodule", type: NgbNavModule }, { kind: "directive", type: i3.NgbNavContent, selector: "ng-template[ngbNavContent]" }, { kind: "directive", type: i3.NgbNav, selector: "[ngbNav]", inputs: ["activeId", "animation", "destroyOnHide", "orientation", "roles", "keyboard"], outputs: ["activeIdChange", "shown", "hidden", "navChange"], exportAs: ["ngbNav"] }, { kind: "directive", type: i3.NgbNavItem, selector: "[ngbNavItem]", inputs: ["destroyOnHide", "disabled", "domId", "ngbNavItem"], outputs: ["shown", "hidden"], exportAs: ["ngbNavItem"] }, { kind: "directive", type: i3.NgbNavItemRole, selector: "[ngbNavItem]:not(ng-container)" }, { kind: "directive", type: i3.NgbNavLink, selector: "a[ngbNavLink]" }, { kind: "directive", type: i3.NgbNavLinkBase, selector: "[ngbNavLink]" }, { kind: "component", type: i3.NgbNavOutlet, selector: "[ngbNavOutlet]", inputs: ["paneRole", "ngbNavOutlet"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }] }); }
731
+ ], ngImport: i0, template: "<abp-page [title]=\"'CmsKit::Pages' | abpLocalization\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n @if (form && (!isEditMode() || page())) {\r\n <form [formGroup]=\"form\" (ngSubmit)=\"save()\" [validateOnSubmit]=\"true\">\r\n <!-- Basic fields outside tabs -->\r\n <abp-extensible-form [selectedRecord]=\"page() || {}\" />\r\n\r\n <!-- Tabs for Content, Script, and Style -->\r\n <ul ngbNav #nav=\"ngbNav\" class=\"nav-tabs mt-3\">\r\n <li ngbNavItem>\r\n <a ngbNavLink>{{ 'CmsKit::Content' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <abp-toastui-editor formControlName=\"content\" />\r\n </div>\r\n </ng-template>\r\n </li>\r\n\r\n <li ngbNavItem>\r\n <a ngbNavLink>{{ 'CmsKit::Script' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <abp-codemirror-editor formControlName=\"script\" />\r\n </div>\r\n </ng-template>\r\n </li>\r\n\r\n <li ngbNavItem>\r\n <a ngbNavLink>{{ 'CmsKit::Style' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <abp-codemirror-editor formControlName=\"style\" />\r\n </div>\r\n </ng-template>\r\n </li>\r\n </ul>\r\n <div class=\"mt-2 fade-in-top\" [ngbNavOutlet]=\"nav\"></div>\r\n </form>\r\n } @else {\r\n <div class=\"text-center\">\r\n <i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i>\r\n </div>\r\n }\r\n </div>\r\n <div class=\"card-footer\">\r\n <div class=\"d-flex justify-content-start gap-2\">\r\n <button class=\"btn btn-secondary\" (click)=\"saveAsDraft()\" [disabled]=\"form?.invalid\">\r\n {{ 'CmsKit::SaveAsDraft' | abpLocalization }}\r\n </button>\r\n <abp-button (click)=\"publish()\" [disabled]=\"form?.invalid\">\r\n {{ 'CmsKit::Publish' | abpLocalization }}\r\n </abp-button>\r\n </div>\r\n </div>\r\n </div>\r\n</abp-page>\r\n", dependencies: [{ kind: "component", type: ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "component", type: CodeMirrorEditorComponent, selector: "abp-codemirror-editor" }, { kind: "component", type: ExtensibleFormComponent, selector: "abp-extensible-form", inputs: ["selectedRecord"], exportAs: ["abpExtensibleForm"] }, { kind: "component", type: PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }, { kind: "component", type: ToastuiEditorComponent, selector: "abp-toastui-editor" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: NgxValidateCoreModule }, { kind: "directive", type: i2$1.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "directive", type: i2$1.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "ngmodule", type: NgbNavModule }, { kind: "directive", type: i3.NgbNavContent, selector: "ng-template[ngbNavContent]" }, { kind: "directive", type: i3.NgbNav, selector: "[ngbNav]", inputs: ["activeId", "animation", "destroyOnHide", "orientation", "roles", "keyboard"], outputs: ["activeIdChange", "shown", "hidden", "navChange"], exportAs: ["ngbNav"] }, { kind: "directive", type: i3.NgbNavItem, selector: "[ngbNavItem]", inputs: ["destroyOnHide", "disabled", "domId", "ngbNavItem"], outputs: ["shown", "hidden"], exportAs: ["ngbNavItem"] }, { kind: "directive", type: i3.NgbNavItemRole, selector: "[ngbNavItem]:not(ng-container)" }, { kind: "directive", type: i3.NgbNavLink, selector: "a[ngbNavLink]" }, { kind: "directive", type: i3.NgbNavLinkBase, selector: "[ngbNavLink]" }, { kind: "component", type: i3.NgbNavOutlet, selector: "[ngbNavOutlet]", inputs: ["paneRole", "ngbNavOutlet"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
751
732
  }
752
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: PageFormComponent, decorators: [{
733
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PageFormComponent, decorators: [{
753
734
  type: Component,
754
- args: [{ selector: 'abp-page-form', providers: [
735
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'abp-page-form', providers: [
755
736
  {
756
737
  provide: EXTENSIONS_IDENTIFIER,
757
738
  useValue: eCmsKitAdminComponents.PageForm,
@@ -767,7 +748,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
767
748
  CommonModule,
768
749
  NgxValidateCoreModule,
769
750
  NgbNavModule,
770
- ], template: "<abp-page [title]=\"'CmsKit::Pages' | abpLocalization\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n @if (form && (!isEditMode || page)) {\r\n <form [formGroup]=\"form\" (ngSubmit)=\"save()\" validateOnSubmit>\r\n <!-- Basic fields outside tabs -->\r\n <abp-extensible-form [selectedRecord]=\"page || {}\" />\r\n\r\n <!-- Tabs for Content, Script, and Style -->\r\n <ul ngbNav #nav=\"ngbNav\" class=\"nav-tabs mt-3\">\r\n <li ngbNavItem>\r\n <a ngbNavLink>{{ 'CmsKit::Content' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <abp-toastui-editor formControlName=\"content\" />\r\n </div>\r\n </ng-template>\r\n </li>\r\n\r\n <li ngbNavItem>\r\n <a ngbNavLink>{{ 'CmsKit::Script' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <abp-codemirror-editor formControlName=\"script\" />\r\n </div>\r\n </ng-template>\r\n </li>\r\n\r\n <li ngbNavItem>\r\n <a ngbNavLink>{{ 'CmsKit::Style' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <abp-codemirror-editor formControlName=\"style\" />\r\n </div>\r\n </ng-template>\r\n </li>\r\n </ul>\r\n <div class=\"mt-2 fade-in-top\" [ngbNavOutlet]=\"nav\"></div>\r\n </form>\r\n } @else {\r\n <div class=\"text-center\">\r\n <i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i>\r\n </div>\r\n }\r\n </div>\r\n <div class=\"card-footer\">\r\n <div class=\"d-flex justify-content-start gap-2\">\r\n <button class=\"btn btn-secondary\" (click)=\"saveAsDraft()\" [disabled]=\"form?.invalid\">\r\n {{ 'CmsKit::SaveAsDraft' | abpLocalization }}\r\n </button>\r\n <abp-button (click)=\"publish()\" [disabled]=\"form?.invalid\">\r\n {{ 'CmsKit::Publish' | abpLocalization }}\r\n </abp-button>\r\n </div>\r\n </div>\r\n </div>\r\n</abp-page>\r\n" }]
751
+ ], template: "<abp-page [title]=\"'CmsKit::Pages' | abpLocalization\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n @if (form && (!isEditMode() || page())) {\r\n <form [formGroup]=\"form\" (ngSubmit)=\"save()\" [validateOnSubmit]=\"true\">\r\n <!-- Basic fields outside tabs -->\r\n <abp-extensible-form [selectedRecord]=\"page() || {}\" />\r\n\r\n <!-- Tabs for Content, Script, and Style -->\r\n <ul ngbNav #nav=\"ngbNav\" class=\"nav-tabs mt-3\">\r\n <li ngbNavItem>\r\n <a ngbNavLink>{{ 'CmsKit::Content' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <abp-toastui-editor formControlName=\"content\" />\r\n </div>\r\n </ng-template>\r\n </li>\r\n\r\n <li ngbNavItem>\r\n <a ngbNavLink>{{ 'CmsKit::Script' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <abp-codemirror-editor formControlName=\"script\" />\r\n </div>\r\n </ng-template>\r\n </li>\r\n\r\n <li ngbNavItem>\r\n <a ngbNavLink>{{ 'CmsKit::Style' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <abp-codemirror-editor formControlName=\"style\" />\r\n </div>\r\n </ng-template>\r\n </li>\r\n </ul>\r\n <div class=\"mt-2 fade-in-top\" [ngbNavOutlet]=\"nav\"></div>\r\n </form>\r\n } @else {\r\n <div class=\"text-center\">\r\n <i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i>\r\n </div>\r\n }\r\n </div>\r\n <div class=\"card-footer\">\r\n <div class=\"d-flex justify-content-start gap-2\">\r\n <button class=\"btn btn-secondary\" (click)=\"saveAsDraft()\" [disabled]=\"form?.invalid\">\r\n {{ 'CmsKit::SaveAsDraft' | abpLocalization }}\r\n </button>\r\n <abp-button (click)=\"publish()\" [disabled]=\"form?.invalid\">\r\n {{ 'CmsKit::Publish' | abpLocalization }}\r\n </abp-button>\r\n </div>\r\n </div>\r\n </div>\r\n</abp-page>\r\n" }]
771
752
  }] });
772
753
 
773
754
  class BlogModalComponent {
@@ -776,9 +757,11 @@ class BlogModalComponent {
776
757
  this.injector = inject(Injector);
777
758
  this.toasterService = inject(ToasterService);
778
759
  this.destroyRef = inject(DestroyRef);
779
- this.selected = input(...(ngDevMode ? [undefined, { debugName: "selected" }] : /* istanbul ignore next */ []));
760
+ this.selected = input(/* @ts-ignore */
761
+ ...(ngDevMode ? [undefined, { debugName: "selected" }] : /* istanbul ignore next */ []));
780
762
  this.visibleChange = output();
781
- this.modalBusy = false;
763
+ this.modalBusy = signal(false, /* @ts-ignore */
764
+ ...(ngDevMode ? [{ debugName: "modalBusy" }] : /* istanbul ignore next */ []));
782
765
  }
783
766
  ngOnInit() {
784
767
  this.buildForm();
@@ -792,11 +775,12 @@ class BlogModalComponent {
792
775
  this.visibleChange.emit({ visible, refresh });
793
776
  }
794
777
  save() {
795
- if (this.modalBusy) {
778
+ if (this.modalBusy()) {
796
779
  return;
797
780
  }
798
- this.modalBusy = true;
781
+ this.modalBusy.set(true);
799
782
  if (!this.form.valid) {
783
+ this.modalBusy.set(false);
800
784
  return;
801
785
  }
802
786
  let observable$ = this.blogService.create(this.form.value);
@@ -808,17 +792,17 @@ class BlogModalComponent {
808
792
  ...this.form.value,
809
793
  });
810
794
  }
811
- observable$.pipe(finalize(() => (this.modalBusy = false))).subscribe(() => {
795
+ observable$.pipe(finalize(() => this.modalBusy.set(false))).subscribe(() => {
812
796
  this.onVisibleChange(false, true);
813
797
  this.toasterService.success('AbpUi::SavedSuccessfully');
814
798
  });
815
799
  }
816
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BlogModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
817
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: BlogModalComponent, isStandalone: true, selector: "abp-blog-modal", inputs: { selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visibleChange: "visibleChange" }, ngImport: i0, template: "<abp-modal [visible]=\"true\" (visibleChange)=\"onVisibleChange($event)\" [busy]=\"modalBusy\">\r\n <ng-template #abpHeader>\r\n <h3>\r\n {{ (selected()?.id ? 'AbpUi::Edit' : 'AbpUi::New') | abpLocalization }}\r\n </h3>\r\n </ng-template>\r\n\r\n <ng-template #abpBody>\r\n @if (form) {\r\n <form [formGroup]=\"form\" (ngSubmit)=\"save()\" validateOnSubmit>\r\n <abp-extensible-form [selectedRecord]=\"selected()\" />\r\n </form>\r\n } @else {\r\n <div class=\"text-center\">\r\n <i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i>\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-outline-primary\" abpClose>\r\n {{ 'AbpUi::Cancel' | abpLocalization }}\r\n </button>\r\n <abp-button iconClass=\"fa fa-check\" [disabled]=\"form?.invalid\" (click)=\"save()\">\r\n {{ 'AbpUi::Save' | abpLocalization }}\r\n </abp-button>\r\n </ng-template>\r\n</abp-modal>\r\n", dependencies: [{ kind: "component", type: ExtensibleFormComponent, selector: "abp-extensible-form", inputs: ["selectedRecord"], exportAs: ["abpExtensibleForm"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: NgxValidateCoreModule }, { kind: "directive", type: i2$1.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "component", type: ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }, { kind: "directive", type: ModalCloseDirective, selector: "[abpClose]" }, { kind: "component", type: ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }] }); }
800
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: BlogModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
801
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: BlogModalComponent, isStandalone: true, selector: "abp-blog-modal", inputs: { selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visibleChange: "visibleChange" }, ngImport: i0, template: "<abp-modal [visible]=\"true\" (visibleChange)=\"onVisibleChange($event)\" [busy]=\"modalBusy()\">\r\n <ng-template #abpHeader>\r\n <h3>\r\n {{ (selected()?.id ? 'AbpUi::Edit' : 'AbpUi::New') | abpLocalization }}\r\n </h3>\r\n </ng-template>\r\n\r\n <ng-template #abpBody>\r\n @if (form) {\r\n <form [formGroup]=\"form\" (ngSubmit)=\"save()\" [validateOnSubmit]=\"true\">\r\n <abp-extensible-form [selectedRecord]=\"selected()\" />\r\n </form>\r\n } @else {\r\n <div class=\"text-center\">\r\n <i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i>\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-outline-primary\" abpClose>\r\n {{ 'AbpUi::Cancel' | abpLocalization }}\r\n </button>\r\n <abp-button iconClass=\"fa fa-check\" [disabled]=\"form?.invalid\" (click)=\"save()\">\r\n {{ 'AbpUi::Save' | abpLocalization }}\r\n </abp-button>\r\n </ng-template>\r\n</abp-modal>\r\n", dependencies: [{ kind: "component", type: ExtensibleFormComponent, selector: "abp-extensible-form", inputs: ["selectedRecord"], exportAs: ["abpExtensibleForm"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: NgxValidateCoreModule }, { kind: "directive", type: i2$1.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "component", type: ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }, { kind: "directive", type: ModalCloseDirective, selector: "[abpClose]" }, { kind: "component", type: ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
818
802
  }
819
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BlogModalComponent, decorators: [{
803
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: BlogModalComponent, decorators: [{
820
804
  type: Component,
821
- args: [{ selector: 'abp-blog-modal', imports: [
805
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'abp-blog-modal', imports: [
822
806
  ExtensibleFormComponent,
823
807
  LocalizationPipe,
824
808
  ReactiveFormsModule,
@@ -827,7 +811,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
827
811
  ModalComponent,
828
812
  ModalCloseDirective,
829
813
  ButtonComponent,
830
- ], template: "<abp-modal [visible]=\"true\" (visibleChange)=\"onVisibleChange($event)\" [busy]=\"modalBusy\">\r\n <ng-template #abpHeader>\r\n <h3>\r\n {{ (selected()?.id ? 'AbpUi::Edit' : 'AbpUi::New') | abpLocalization }}\r\n </h3>\r\n </ng-template>\r\n\r\n <ng-template #abpBody>\r\n @if (form) {\r\n <form [formGroup]=\"form\" (ngSubmit)=\"save()\" validateOnSubmit>\r\n <abp-extensible-form [selectedRecord]=\"selected()\" />\r\n </form>\r\n } @else {\r\n <div class=\"text-center\">\r\n <i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i>\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-outline-primary\" abpClose>\r\n {{ 'AbpUi::Cancel' | abpLocalization }}\r\n </button>\r\n <abp-button iconClass=\"fa fa-check\" [disabled]=\"form?.invalid\" (click)=\"save()\">\r\n {{ 'AbpUi::Save' | abpLocalization }}\r\n </abp-button>\r\n </ng-template>\r\n</abp-modal>\r\n" }]
814
+ ], template: "<abp-modal [visible]=\"true\" (visibleChange)=\"onVisibleChange($event)\" [busy]=\"modalBusy()\">\r\n <ng-template #abpHeader>\r\n <h3>\r\n {{ (selected()?.id ? 'AbpUi::Edit' : 'AbpUi::New') | abpLocalization }}\r\n </h3>\r\n </ng-template>\r\n\r\n <ng-template #abpBody>\r\n @if (form) {\r\n <form [formGroup]=\"form\" (ngSubmit)=\"save()\" [validateOnSubmit]=\"true\">\r\n <abp-extensible-form [selectedRecord]=\"selected()\" />\r\n </form>\r\n } @else {\r\n <div class=\"text-center\">\r\n <i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i>\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-outline-primary\" abpClose>\r\n {{ 'AbpUi::Cancel' | abpLocalization }}\r\n </button>\r\n <abp-button iconClass=\"fa fa-check\" [disabled]=\"form?.invalid\" (click)=\"save()\">\r\n {{ 'AbpUi::Save' | abpLocalization }}\r\n </abp-button>\r\n </ng-template>\r\n</abp-modal>\r\n" }]
831
815
  }], propDecorators: { selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }], visibleChange: [{ type: i0.Output, args: ["visibleChange"] }] } });
832
816
 
833
817
  class BlogFeaturesModalComponent {
@@ -835,9 +819,13 @@ class BlogFeaturesModalComponent {
835
819
  this.blogFeatureService = inject(BlogFeatureAdminService);
836
820
  this.fb = inject(FormBuilder);
837
821
  this.toasterService = inject(ToasterService);
838
- this.blogId = input(...(ngDevMode ? [undefined, { debugName: "blogId" }] : /* istanbul ignore next */ []));
822
+ this.blogId = input(/* @ts-ignore */
823
+ ...(ngDevMode ? [undefined, { debugName: "blogId" }] : /* istanbul ignore next */ []));
839
824
  this.visibleChange = output();
840
- this.features = [];
825
+ this.form = signal(undefined, /* @ts-ignore */
826
+ ...(ngDevMode ? [{ debugName: "form" }] : /* istanbul ignore next */ []));
827
+ this.features = signal([], /* @ts-ignore */
828
+ ...(ngDevMode ? [{ debugName: "features" }] : /* istanbul ignore next */ []));
841
829
  this.initialFeatureStates = new Map();
842
830
  }
843
831
  ngOnInit() {
@@ -847,40 +835,39 @@ class BlogFeaturesModalComponent {
847
835
  }
848
836
  loadFeatures() {
849
837
  this.blogFeatureService.getList(this.blogId()).subscribe(features => {
850
- this.features = features.sort((a, b) => (a.featureName || '').localeCompare(b.featureName || ''));
851
- // Store initial states
852
- this.initialFeatureStates = new Map(this.features.map(f => [f.featureName || '', f.isEnabled || false]));
853
- this.buildForm();
838
+ const sorted = features.sort((a, b) => (a.featureName || '').localeCompare(b.featureName || ''));
839
+ this.features.set(sorted);
840
+ this.initialFeatureStates = new Map(sorted.map(f => [f.featureName || '', f.isEnabled || false]));
841
+ this.buildForm(sorted);
854
842
  });
855
843
  }
856
- buildForm() {
857
- const featureControls = this.features.map(feature => this.fb.group({
844
+ buildForm(features) {
845
+ const featureControls = features.map(feature => this.fb.group({
858
846
  featureName: [feature.featureName],
859
847
  isEnabled: [feature.isEnabled],
860
848
  isAvailable: [feature.isAvailable ?? true],
861
849
  }));
862
- this.form = this.fb.group({
850
+ this.form.set(this.fb.group({
863
851
  features: this.fb.array(featureControls),
864
- });
852
+ }));
865
853
  }
866
854
  get featuresFormArray() {
867
- return this.form.get('features');
855
+ return this.form().get('features');
868
856
  }
869
857
  onVisibleChange(visible, refresh = false) {
870
858
  this.visibleChange.emit({ visible, refresh });
871
859
  }
872
860
  save() {
873
- if (!this.form.valid || !this.blogId()) {
861
+ const currentForm = this.form();
862
+ if (!currentForm?.valid || !this.blogId()) {
874
863
  return;
875
864
  }
876
- const featuresArray = this.form.get('features');
877
- // Only save features that have changed
865
+ const featuresArray = currentForm.get('features');
878
866
  const changedFeatures = featuresArray.controls
879
867
  .map(control => {
880
868
  const featureName = control.get('featureName')?.value;
881
869
  const isEnabled = control.get('isEnabled')?.value;
882
870
  const initialIsEnabled = this.initialFeatureStates.get(featureName);
883
- // Only include if the value has changed
884
871
  if (featureName && initialIsEnabled !== isEnabled) {
885
872
  return {
886
873
  featureName,
@@ -890,27 +877,22 @@ class BlogFeaturesModalComponent {
890
877
  return null;
891
878
  })
892
879
  .filter((input) => input !== null);
893
- // If no features changed, just close the modal
894
880
  if (changedFeatures.length === 0) {
895
881
  this.onVisibleChange(false, false);
896
882
  return;
897
883
  }
898
- // Save only changed features
899
884
  const saveObservables = changedFeatures.map(input => this.blogFeatureService.set(this.blogId(), input));
900
- // Use forkJoin to save all changed features at once
901
- forkJoin(saveObservables).subscribe({
902
- next: () => {
903
- this.onVisibleChange(false, true);
904
- this.toasterService.success('AbpUi::SavedSuccessfully');
905
- },
885
+ forkJoin(saveObservables).subscribe(() => {
886
+ this.onVisibleChange(false, true);
887
+ this.toasterService.success('AbpUi::SavedSuccessfully');
906
888
  });
907
889
  }
908
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BlogFeaturesModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
909
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: BlogFeaturesModalComponent, isStandalone: true, selector: "abp-blog-features-modal", inputs: { blogId: { classPropertyName: "blogId", publicName: "blogId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visibleChange: "visibleChange" }, ngImport: i0, template: "<abp-modal [visible]=\"true\" (visibleChange)=\"onVisibleChange($event)\">\r\n <ng-template #abpHeader>\r\n <h3>{{ 'CmsKit::Features' | abpLocalization }}</h3>\r\n </ng-template>\r\n\r\n <ng-template #abpBody>\r\n @if (form) {\r\n <form [formGroup]=\"form\" (ngSubmit)=\"save()\" validateOnSubmit>\r\n <div formArrayName=\"features\">\r\n @for (featureControl of featuresFormArray.controls; track $index; let i = $index) {\r\n <div class=\"mb-3\" [formGroupName]=\"i\">\r\n @let isAvailable = featureControl.get('isAvailable')?.value;\r\n @if (isAvailable) {\r\n <div class=\"form-check\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n id=\"feature-{{ i }}\"\r\n formControlName=\"isEnabled\"\r\n />\r\n <label class=\"form-check-label\" for=\"feature-{{ i }}\">\r\n {{ 'CmsKit::' + features[i]?.featureName | abpLocalization }}\r\n </label>\r\n </div>\r\n } @else {\r\n <div\r\n data-toggle=\"tooltip\"\r\n [title]=\"'CmsKit::BlogFeatureNotAvailable' | abpLocalization\"\r\n >\r\n <div class=\"form-check\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n id=\"feature-{{ i }}\"\r\n formControlName=\"isEnabled\"\r\n disabled\r\n />\r\n <label class=\"form-check-label\" for=\"feature-{{ i }}\">\r\n {{ 'CmsKit::' + features[i]?.featureName | abpLocalization }}\r\n </label>\r\n </div>\r\n </div>\r\n }\r\n <input type=\"hidden\" formControlName=\"featureName\" />\r\n <input type=\"hidden\" formControlName=\"isAvailable\" />\r\n </div>\r\n }\r\n </div>\r\n </form>\r\n } @else {\r\n <div class=\"text-center\">\r\n <i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i>\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-outline-primary\" abpClose>\r\n {{ 'AbpUi::Cancel' | abpLocalization }}\r\n </button>\r\n <abp-button iconClass=\"fa fa-check\" [disabled]=\"form?.invalid\" (click)=\"save()\">\r\n {{ 'AbpUi::Save' | abpLocalization }}\r\n </abp-button>\r\n </ng-template>\r\n</abp-modal>\r\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1$1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1$1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: NgxValidateCoreModule }, { kind: "directive", type: i2$1.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "directive", type: i2$1.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "component", type: ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }, { kind: "directive", type: ModalCloseDirective, selector: "[abpClose]" }, { kind: "component", type: ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }] }); }
890
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: BlogFeaturesModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
891
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: BlogFeaturesModalComponent, isStandalone: true, selector: "abp-blog-features-modal", inputs: { blogId: { classPropertyName: "blogId", publicName: "blogId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visibleChange: "visibleChange" }, ngImport: i0, template: "<abp-modal [visible]=\"true\" (visibleChange)=\"onVisibleChange($event)\">\r\n <ng-template #abpHeader>\r\n <h3>{{ 'CmsKit::Features' | abpLocalization }}</h3>\r\n </ng-template>\r\n\r\n <ng-template #abpBody>\r\n @if (form(); as currentForm) {\r\n <form [formGroup]=\"currentForm\" (ngSubmit)=\"save()\" [validateOnSubmit]=\"true\">\r\n <div formArrayName=\"features\">\r\n @for (featureControl of featuresFormArray.controls; track $index; let i = $index) {\r\n <div class=\"mb-3\" [formGroupName]=\"i\">\r\n @let isAvailable = featureControl.get('isAvailable')?.value;\r\n @if (isAvailable) {\r\n <div class=\"form-check\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n id=\"feature-{{ i }}\"\r\n formControlName=\"isEnabled\"\r\n />\r\n <label class=\"form-check-label\" for=\"feature-{{ i }}\">\r\n {{ 'CmsKit::' + features()[i]?.featureName | abpLocalization }}\r\n </label>\r\n </div>\r\n } @else {\r\n <div\r\n data-toggle=\"tooltip\"\r\n [title]=\"'CmsKit::BlogFeatureNotAvailable' | abpLocalization\"\r\n >\r\n <div class=\"form-check\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n id=\"feature-{{ i }}\"\r\n formControlName=\"isEnabled\"\r\n [disabled]=\"true\"\r\n />\r\n <label class=\"form-check-label\" for=\"feature-{{ i }}\">\r\n {{ 'CmsKit::' + features()[i]?.featureName | abpLocalization }}\r\n </label>\r\n </div>\r\n </div>\r\n }\r\n <input type=\"hidden\" formControlName=\"featureName\" />\r\n <input type=\"hidden\" formControlName=\"isAvailable\" />\r\n </div>\r\n }\r\n </div>\r\n </form>\r\n } @else {\r\n <div class=\"text-center\">\r\n <i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i>\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-outline-primary\" abpClose>\r\n {{ 'AbpUi::Cancel' | abpLocalization }}\r\n </button>\r\n <abp-button iconClass=\"fa fa-check\" [disabled]=\"form()?.invalid\" (click)=\"save()\">\r\n {{ 'AbpUi::Save' | abpLocalization }}\r\n </abp-button>\r\n </ng-template>\r\n</abp-modal>\r\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.CheckboxControlValueAccessor, selector: "input[type=checkbox]:not([ngNoCva])[formControlName],input[type=checkbox]:not([ngNoCva])[formControl],input[type=checkbox]:not([ngNoCva])[ngModel]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1$1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1$1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: NgxValidateCoreModule }, { kind: "directive", type: i2$1.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "directive", type: i2$1.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "component", type: ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }, { kind: "directive", type: ModalCloseDirective, selector: "[abpClose]" }, { kind: "component", type: ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
910
892
  }
911
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BlogFeaturesModalComponent, decorators: [{
893
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: BlogFeaturesModalComponent, decorators: [{
912
894
  type: Component,
913
- args: [{ selector: 'abp-blog-features-modal', imports: [
895
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'abp-blog-features-modal', imports: [
914
896
  LocalizationPipe,
915
897
  ReactiveFormsModule,
916
898
  CommonModule,
@@ -918,34 +900,49 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
918
900
  ModalComponent,
919
901
  ModalCloseDirective,
920
902
  ButtonComponent,
921
- ], template: "<abp-modal [visible]=\"true\" (visibleChange)=\"onVisibleChange($event)\">\r\n <ng-template #abpHeader>\r\n <h3>{{ 'CmsKit::Features' | abpLocalization }}</h3>\r\n </ng-template>\r\n\r\n <ng-template #abpBody>\r\n @if (form) {\r\n <form [formGroup]=\"form\" (ngSubmit)=\"save()\" validateOnSubmit>\r\n <div formArrayName=\"features\">\r\n @for (featureControl of featuresFormArray.controls; track $index; let i = $index) {\r\n <div class=\"mb-3\" [formGroupName]=\"i\">\r\n @let isAvailable = featureControl.get('isAvailable')?.value;\r\n @if (isAvailable) {\r\n <div class=\"form-check\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n id=\"feature-{{ i }}\"\r\n formControlName=\"isEnabled\"\r\n />\r\n <label class=\"form-check-label\" for=\"feature-{{ i }}\">\r\n {{ 'CmsKit::' + features[i]?.featureName | abpLocalization }}\r\n </label>\r\n </div>\r\n } @else {\r\n <div\r\n data-toggle=\"tooltip\"\r\n [title]=\"'CmsKit::BlogFeatureNotAvailable' | abpLocalization\"\r\n >\r\n <div class=\"form-check\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n id=\"feature-{{ i }}\"\r\n formControlName=\"isEnabled\"\r\n disabled\r\n />\r\n <label class=\"form-check-label\" for=\"feature-{{ i }}\">\r\n {{ 'CmsKit::' + features[i]?.featureName | abpLocalization }}\r\n </label>\r\n </div>\r\n </div>\r\n }\r\n <input type=\"hidden\" formControlName=\"featureName\" />\r\n <input type=\"hidden\" formControlName=\"isAvailable\" />\r\n </div>\r\n }\r\n </div>\r\n </form>\r\n } @else {\r\n <div class=\"text-center\">\r\n <i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i>\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-outline-primary\" abpClose>\r\n {{ 'AbpUi::Cancel' | abpLocalization }}\r\n </button>\r\n <abp-button iconClass=\"fa fa-check\" [disabled]=\"form?.invalid\" (click)=\"save()\">\r\n {{ 'AbpUi::Save' | abpLocalization }}\r\n </abp-button>\r\n </ng-template>\r\n</abp-modal>\r\n" }]
903
+ ], template: "<abp-modal [visible]=\"true\" (visibleChange)=\"onVisibleChange($event)\">\r\n <ng-template #abpHeader>\r\n <h3>{{ 'CmsKit::Features' | abpLocalization }}</h3>\r\n </ng-template>\r\n\r\n <ng-template #abpBody>\r\n @if (form(); as currentForm) {\r\n <form [formGroup]=\"currentForm\" (ngSubmit)=\"save()\" [validateOnSubmit]=\"true\">\r\n <div formArrayName=\"features\">\r\n @for (featureControl of featuresFormArray.controls; track $index; let i = $index) {\r\n <div class=\"mb-3\" [formGroupName]=\"i\">\r\n @let isAvailable = featureControl.get('isAvailable')?.value;\r\n @if (isAvailable) {\r\n <div class=\"form-check\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n id=\"feature-{{ i }}\"\r\n formControlName=\"isEnabled\"\r\n />\r\n <label class=\"form-check-label\" for=\"feature-{{ i }}\">\r\n {{ 'CmsKit::' + features()[i]?.featureName | abpLocalization }}\r\n </label>\r\n </div>\r\n } @else {\r\n <div\r\n data-toggle=\"tooltip\"\r\n [title]=\"'CmsKit::BlogFeatureNotAvailable' | abpLocalization\"\r\n >\r\n <div class=\"form-check\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n id=\"feature-{{ i }}\"\r\n formControlName=\"isEnabled\"\r\n [disabled]=\"true\"\r\n />\r\n <label class=\"form-check-label\" for=\"feature-{{ i }}\">\r\n {{ 'CmsKit::' + features()[i]?.featureName | abpLocalization }}\r\n </label>\r\n </div>\r\n </div>\r\n }\r\n <input type=\"hidden\" formControlName=\"featureName\" />\r\n <input type=\"hidden\" formControlName=\"isAvailable\" />\r\n </div>\r\n }\r\n </div>\r\n </form>\r\n } @else {\r\n <div class=\"text-center\">\r\n <i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i>\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-outline-primary\" abpClose>\r\n {{ 'AbpUi::Cancel' | abpLocalization }}\r\n </button>\r\n <abp-button iconClass=\"fa fa-check\" [disabled]=\"form()?.invalid\" (click)=\"save()\">\r\n {{ 'AbpUi::Save' | abpLocalization }}\r\n </abp-button>\r\n </ng-template>\r\n</abp-modal>\r\n" }]
922
904
  }], propDecorators: { blogId: [{ type: i0.Input, args: [{ isSignal: true, alias: "blogId", required: false }] }], visibleChange: [{ type: i0.Output, args: ["visibleChange"] }] } });
923
905
 
924
906
  class BlogListComponent {
925
907
  constructor() {
926
- this.data = { items: [], totalCount: 0 };
927
908
  this.list = inject((ListService));
928
909
  this.blogService = inject(BlogAdminService);
929
910
  this.confirmationService = inject(ConfirmationService);
911
+ this.data = toSignal(this.list.hookToQuery(query => {
912
+ let filters = {};
913
+ if (this.list.filter) {
914
+ filters.filter = this.list.filter;
915
+ }
916
+ const input = {
917
+ ...query,
918
+ ...filters,
919
+ };
920
+ return this.blogService.getList(input);
921
+ }), {
922
+ initialValue: { items: [], totalCount: 0 },
923
+ });
930
924
  this.filter = '';
931
- this.isModalVisible = false;
932
- this.isFeaturesModalVisible = false;
933
- }
934
- ngOnInit() {
935
- this.hookToQuery();
925
+ this.isModalVisible = signal(false, /* @ts-ignore */
926
+ ...(ngDevMode ? [{ debugName: "isModalVisible" }] : /* istanbul ignore next */ []));
927
+ this.selected = signal(undefined, /* @ts-ignore */
928
+ ...(ngDevMode ? [{ debugName: "selected" }] : /* istanbul ignore next */ []));
929
+ this.isFeaturesModalVisible = signal(false, /* @ts-ignore */
930
+ ...(ngDevMode ? [{ debugName: "isFeaturesModalVisible" }] : /* istanbul ignore next */ []));
931
+ this.selectedBlogId = signal(undefined, /* @ts-ignore */
932
+ ...(ngDevMode ? [{ debugName: "selectedBlogId" }] : /* istanbul ignore next */ []));
936
933
  }
937
934
  onSearch() {
938
935
  this.list.filter = this.filter;
939
936
  this.list.get();
940
937
  }
941
938
  add() {
942
- this.selected = {};
943
- this.isModalVisible = true;
939
+ this.selected.set({});
940
+ this.isModalVisible.set(true);
944
941
  }
945
942
  edit(id) {
946
943
  this.blogService.get(id).subscribe(blog => {
947
- this.selected = blog;
948
- this.isModalVisible = true;
944
+ this.selected.set(blog);
945
+ this.isModalVisible.set(true);
949
946
  });
950
947
  }
951
948
  delete(id, name) {
@@ -955,32 +952,13 @@ class BlogListComponent {
955
952
  })
956
953
  .subscribe((status) => {
957
954
  if (status === Confirmation.Status.confirm) {
958
- this.blogService.delete(id).subscribe(() => {
959
- this.list.get();
960
- });
955
+ this.blogService.delete(id).subscribe(() => this.list.get());
961
956
  }
962
957
  });
963
958
  }
964
959
  openFeatures(id) {
965
- this.selectedBlogId = id;
966
- this.isFeaturesModalVisible = true;
967
- }
968
- hookToQuery() {
969
- this.list
970
- .hookToQuery(query => {
971
- let filters = {};
972
- if (this.list.filter) {
973
- filters.filter = this.list.filter;
974
- }
975
- const input = {
976
- ...query,
977
- ...filters,
978
- };
979
- return this.blogService.getList(input);
980
- })
981
- .subscribe(res => {
982
- this.data = res;
983
- });
960
+ this.selectedBlogId.set(id);
961
+ this.isFeaturesModalVisible.set(true);
984
962
  }
985
963
  onVisibleModalChange(visibilityChange) {
986
964
  if (visibilityChange.visible) {
@@ -989,8 +967,8 @@ class BlogListComponent {
989
967
  if (visibilityChange.refresh) {
990
968
  this.list.get();
991
969
  }
992
- this.selected = null;
993
- this.isModalVisible = false;
970
+ this.selected.set(undefined);
971
+ this.isModalVisible.set(false);
994
972
  }
995
973
  onFeaturesModalChange(visibilityChange) {
996
974
  if (visibilityChange.visible) {
@@ -999,21 +977,21 @@ class BlogListComponent {
999
977
  if (visibilityChange.refresh) {
1000
978
  this.list.get();
1001
979
  }
1002
- this.selectedBlogId = null;
1003
- this.isFeaturesModalVisible = false;
980
+ this.selectedBlogId.set(undefined);
981
+ this.isFeaturesModalVisible.set(false);
1004
982
  }
1005
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BlogListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1006
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: BlogListComponent, isStandalone: true, selector: "abp-blog-list", providers: [
983
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: BlogListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
984
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: BlogListComponent, isStandalone: true, selector: "abp-blog-list", providers: [
1007
985
  ListService,
1008
986
  {
1009
987
  provide: EXTENSIONS_IDENTIFIER,
1010
988
  useValue: eCmsKitAdminComponents.Blogs,
1011
989
  },
1012
- ], ngImport: i0, template: "<abp-page [title]=\"'CmsKit::Blogs' | abpLocalization\" [toolbar]=\"data.items\">\r\n <div class=\"card\">\r\n <abp-extensible-table [data]=\"data.items\" [recordsTotal]=\"data.totalCount\" [list]=\"list\" />\r\n </div>\r\n\r\n @if (isModalVisible) {\r\n <abp-blog-modal [selected]=\"selected\" (visibleChange)=\"onVisibleModalChange($event)\" />\r\n }\r\n\r\n @if (isFeaturesModalVisible) {\r\n <abp-blog-features-modal\r\n [blogId]=\"selectedBlogId\"\r\n (visibleChange)=\"onFeaturesModalChange($event)\"\r\n />\r\n }\r\n</abp-page>\r\n", dependencies: [{ kind: "component", type: ExtensibleTableComponent, selector: "abp-extensible-table", inputs: ["actionsText", "data", "list", "recordsTotal", "actionsColumnWidth", "actionsTemplate", "selectable", "selectionType", "selected", "infiniteScroll", "isLoading", "scrollThreshold", "tableHeight", "rowDetailTemplate", "rowDetailHeight"], outputs: ["tableActivate", "selectionChange", "loadMore", "rowDetailToggle"], exportAs: ["abpExtensibleTable"] }, { kind: "component", type: PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: BlogModalComponent, selector: "abp-blog-modal", inputs: ["selected"], outputs: ["visibleChange"] }, { kind: "component", type: BlogFeaturesModalComponent, selector: "abp-blog-features-modal", inputs: ["blogId"], outputs: ["visibleChange"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }] }); }
990
+ ], ngImport: i0, template: "<abp-page [title]=\"'CmsKit::Blogs' | abpLocalization\" [toolbar]=\"data().items\">\r\n <div class=\"card\">\r\n <abp-extensible-table [data]=\"data().items\" [recordsTotal]=\"data().totalCount\" [list]=\"list\" />\r\n </div>\r\n\r\n @if (isModalVisible()) {\r\n <abp-blog-modal [selected]=\"selected()\" (visibleChange)=\"onVisibleModalChange($event)\" />\r\n }\r\n\r\n @if (isFeaturesModalVisible()) {\r\n <abp-blog-features-modal\r\n [blogId]=\"selectedBlogId()\"\r\n (visibleChange)=\"onFeaturesModalChange($event)\"\r\n />\r\n }\r\n</abp-page>\r\n", dependencies: [{ kind: "component", type: ExtensibleTableComponent, selector: "abp-extensible-table", inputs: ["actionsText", "data", "list", "recordsTotal", "actionsColumnWidth", "actionsTemplate", "selectable", "selectionType", "selected", "infiniteScroll", "isLoading", "scrollThreshold", "tableHeight", "rowDetailTemplate", "rowDetailHeight"], outputs: ["tableActivate", "selectionChange", "loadMore", "rowDetailToggle"], exportAs: ["abpExtensibleTable"] }, { kind: "component", type: PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: BlogModalComponent, selector: "abp-blog-modal", inputs: ["selected"], outputs: ["visibleChange"] }, { kind: "component", type: BlogFeaturesModalComponent, selector: "abp-blog-features-modal", inputs: ["blogId"], outputs: ["visibleChange"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1013
991
  }
1014
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BlogListComponent, decorators: [{
992
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: BlogListComponent, decorators: [{
1015
993
  type: Component,
1016
- args: [{ selector: 'abp-blog-list', providers: [
994
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'abp-blog-list', providers: [
1017
995
  ListService,
1018
996
  {
1019
997
  provide: EXTENSIONS_IDENTIFIER,
@@ -1027,32 +1005,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
1027
1005
  CommonModule,
1028
1006
  BlogModalComponent,
1029
1007
  BlogFeaturesModalComponent,
1030
- ], template: "<abp-page [title]=\"'CmsKit::Blogs' | abpLocalization\" [toolbar]=\"data.items\">\r\n <div class=\"card\">\r\n <abp-extensible-table [data]=\"data.items\" [recordsTotal]=\"data.totalCount\" [list]=\"list\" />\r\n </div>\r\n\r\n @if (isModalVisible) {\r\n <abp-blog-modal [selected]=\"selected\" (visibleChange)=\"onVisibleModalChange($event)\" />\r\n }\r\n\r\n @if (isFeaturesModalVisible) {\r\n <abp-blog-features-modal\r\n [blogId]=\"selectedBlogId\"\r\n (visibleChange)=\"onFeaturesModalChange($event)\"\r\n />\r\n }\r\n</abp-page>\r\n" }]
1008
+ ], template: "<abp-page [title]=\"'CmsKit::Blogs' | abpLocalization\" [toolbar]=\"data().items\">\r\n <div class=\"card\">\r\n <abp-extensible-table [data]=\"data().items\" [recordsTotal]=\"data().totalCount\" [list]=\"list\" />\r\n </div>\r\n\r\n @if (isModalVisible()) {\r\n <abp-blog-modal [selected]=\"selected()\" (visibleChange)=\"onVisibleModalChange($event)\" />\r\n }\r\n\r\n @if (isFeaturesModalVisible()) {\r\n <abp-blog-features-modal\r\n [blogId]=\"selectedBlogId()\"\r\n (visibleChange)=\"onFeaturesModalChange($event)\"\r\n />\r\n }\r\n</abp-page>\r\n" }]
1031
1009
  }] });
1032
1010
 
1033
1011
  class BlogPostListComponent {
1034
1012
  constructor() {
1035
- this.data = { items: [], totalCount: 0 };
1036
1013
  this.list = inject((ListService));
1037
1014
  this.blogPostService = inject(BlogPostAdminService);
1038
1015
  this.confirmationService = inject(ConfirmationService);
1039
- this.filter = '';
1040
- this.statusFilter = null;
1041
- this.BlogPostStatus = BlogPostStatus;
1042
- }
1043
- ngOnInit() {
1044
- this.hookToQuery();
1045
- }
1046
- onSearch() {
1047
- this.list.filter = this.filter;
1048
- this.list.get();
1049
- }
1050
- onStatusChange() {
1051
- this.list.get();
1052
- }
1053
- hookToQuery() {
1054
- this.list
1055
- .hookToQuery(query => {
1016
+ this.data = toSignal(this.list.hookToQuery(query => {
1056
1017
  let filters = {};
1057
1018
  if (this.list.filter) {
1058
1019
  filters.filter = this.list.filter;
@@ -1065,8 +1026,19 @@ class BlogPostListComponent {
1065
1026
  ...filters,
1066
1027
  };
1067
1028
  return this.blogPostService.getList(input);
1068
- })
1069
- .subscribe(res => (this.data = res));
1029
+ }), {
1030
+ initialValue: { items: [], totalCount: 0 },
1031
+ });
1032
+ this.filter = '';
1033
+ this.statusFilter = null;
1034
+ this.BlogPostStatus = BlogPostStatus;
1035
+ }
1036
+ onSearch() {
1037
+ this.list.filter = this.filter;
1038
+ this.list.get();
1039
+ }
1040
+ onStatusChange() {
1041
+ this.list.get();
1070
1042
  }
1071
1043
  delete(id, title) {
1072
1044
  this.confirmationService
@@ -1077,30 +1049,28 @@ class BlogPostListComponent {
1077
1049
  })
1078
1050
  .subscribe((status) => {
1079
1051
  if (status === Confirmation.Status.confirm) {
1080
- this.blogPostService.delete(id).subscribe(() => {
1081
- this.list.get();
1082
- });
1052
+ this.blogPostService.delete(id).subscribe(() => this.list.get());
1083
1053
  }
1084
1054
  });
1085
1055
  }
1086
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BlogPostListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1087
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.17", type: BlogPostListComponent, isStandalone: true, selector: "abp-blog-post-list", providers: [
1056
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: BlogPostListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1057
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.5", type: BlogPostListComponent, isStandalone: true, selector: "abp-blog-post-list", providers: [
1088
1058
  ListService,
1089
1059
  {
1090
1060
  provide: EXTENSIONS_IDENTIFIER,
1091
1061
  useValue: eCmsKitAdminComponents.BlogPosts,
1092
1062
  },
1093
- ], ngImport: i0, template: "<abp-page [title]=\"'CmsKit::BlogPosts' | abpLocalization\" [toolbar]=\"data.items\">\r\n <div class=\"card mb-4\">\r\n <div class=\"card-body\">\r\n <div class=\"row\">\r\n <div class=\"col-2\">\r\n <select class=\"form-select\" [(ngModel)]=\"statusFilter\" (change)=\"onStatusChange()\">\r\n <option [ngValue]=\"null\">{{ 'CmsKit::AllPosts' | abpLocalization }}</option>\r\n <option [ngValue]=\"BlogPostStatus.Draft\">\r\n {{ 'CmsKit::' + 'CmsKit.BlogPost.Status.0' | abpLocalization }}\r\n </option>\r\n <option [ngValue]=\"BlogPostStatus.Published\">\r\n {{ 'CmsKit::' + 'CmsKit.BlogPost.Status.1' | abpLocalization }}\r\n </option>\r\n <option [ngValue]=\"BlogPostStatus.WaitingForReview\">\r\n {{ 'CmsKit::' + 'CmsKit.BlogPost.Status.2' | abpLocalization }}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col-10\">\r\n <div class=\"input-group\">\r\n <input\r\n type=\"search\"\r\n class=\"form-control\"\r\n [placeholder]=\"'AbpUi::PagerSearch' | abpLocalization\"\r\n [(ngModel)]=\"filter\"\r\n (keyup.enter)=\"onSearch()\"\r\n />\r\n <button class=\"btn btn-primary\" type=\"button\" (click)=\"onSearch()\">\r\n <i class=\"fa fa-search\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card\">\r\n <abp-extensible-table [data]=\"data.items\" [recordsTotal]=\"data.totalCount\" [list]=\"list\" />\r\n </div>\r\n</abp-page>\r\n", dependencies: [{ kind: "component", type: ExtensibleTableComponent, selector: "abp-extensible-table", inputs: ["actionsText", "data", "list", "recordsTotal", "actionsColumnWidth", "actionsTemplate", "selectable", "selectionType", "selected", "infiniteScroll", "isLoading", "scrollThreshold", "tableHeight", "rowDetailTemplate", "rowDetailHeight"], outputs: ["tableActivate", "selectionChange", "loadMore", "rowDetailToggle"], exportAs: ["abpExtensibleTable"] }, { kind: "component", type: PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }] }); }
1063
+ ], ngImport: i0, template: "<abp-page [title]=\"'CmsKit::BlogPosts' | abpLocalization\" [toolbar]=\"data().items\">\r\n <div class=\"card mb-4\">\r\n <div class=\"card-body\">\r\n <div class=\"row\">\r\n <div class=\"col-2\">\r\n <select class=\"form-select\" [(ngModel)]=\"statusFilter\" (change)=\"onStatusChange()\">\r\n <option [ngValue]=\"null\">{{ 'CmsKit::AllPosts' | abpLocalization }}</option>\r\n <option [ngValue]=\"BlogPostStatus.Draft\">\r\n {{ 'CmsKit::' + 'CmsKit.BlogPost.Status.0' | abpLocalization }}\r\n </option>\r\n <option [ngValue]=\"BlogPostStatus.Published\">\r\n {{ 'CmsKit::' + 'CmsKit.BlogPost.Status.1' | abpLocalization }}\r\n </option>\r\n <option [ngValue]=\"BlogPostStatus.WaitingForReview\">\r\n {{ 'CmsKit::' + 'CmsKit.BlogPost.Status.2' | abpLocalization }}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col-10\">\r\n <div class=\"input-group\">\r\n <input\r\n type=\"search\"\r\n class=\"form-control\"\r\n [placeholder]=\"'AbpUi::PagerSearch' | abpLocalization\"\r\n [(ngModel)]=\"filter\"\r\n (keyup.enter)=\"onSearch()\"\r\n />\r\n <button class=\"btn btn-primary\" type=\"button\" (click)=\"onSearch()\">\r\n <i class=\"fa fa-search\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card\">\r\n <abp-extensible-table\r\n [data]=\"data().items\"\r\n [recordsTotal]=\"data().totalCount\"\r\n [list]=\"list\"\r\n />\r\n </div>\r\n</abp-page>\r\n", dependencies: [{ kind: "component", type: ExtensibleTableComponent, selector: "abp-extensible-table", inputs: ["actionsText", "data", "list", "recordsTotal", "actionsColumnWidth", "actionsTemplate", "selectable", "selectionType", "selected", "infiniteScroll", "isLoading", "scrollThreshold", "tableHeight", "rowDetailTemplate", "rowDetailHeight"], outputs: ["tableActivate", "selectionChange", "loadMore", "rowDetailToggle"], exportAs: ["abpExtensibleTable"] }, { kind: "component", type: PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1094
1064
  }
1095
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BlogPostListComponent, decorators: [{
1065
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: BlogPostListComponent, decorators: [{
1096
1066
  type: Component,
1097
- args: [{ selector: 'abp-blog-post-list', providers: [
1067
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'abp-blog-post-list', providers: [
1098
1068
  ListService,
1099
1069
  {
1100
1070
  provide: EXTENSIONS_IDENTIFIER,
1101
1071
  useValue: eCmsKitAdminComponents.BlogPosts,
1102
1072
  },
1103
- ], imports: [ExtensibleTableComponent, PageComponent, LocalizationPipe, FormsModule, CommonModule], template: "<abp-page [title]=\"'CmsKit::BlogPosts' | abpLocalization\" [toolbar]=\"data.items\">\r\n <div class=\"card mb-4\">\r\n <div class=\"card-body\">\r\n <div class=\"row\">\r\n <div class=\"col-2\">\r\n <select class=\"form-select\" [(ngModel)]=\"statusFilter\" (change)=\"onStatusChange()\">\r\n <option [ngValue]=\"null\">{{ 'CmsKit::AllPosts' | abpLocalization }}</option>\r\n <option [ngValue]=\"BlogPostStatus.Draft\">\r\n {{ 'CmsKit::' + 'CmsKit.BlogPost.Status.0' | abpLocalization }}\r\n </option>\r\n <option [ngValue]=\"BlogPostStatus.Published\">\r\n {{ 'CmsKit::' + 'CmsKit.BlogPost.Status.1' | abpLocalization }}\r\n </option>\r\n <option [ngValue]=\"BlogPostStatus.WaitingForReview\">\r\n {{ 'CmsKit::' + 'CmsKit.BlogPost.Status.2' | abpLocalization }}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col-10\">\r\n <div class=\"input-group\">\r\n <input\r\n type=\"search\"\r\n class=\"form-control\"\r\n [placeholder]=\"'AbpUi::PagerSearch' | abpLocalization\"\r\n [(ngModel)]=\"filter\"\r\n (keyup.enter)=\"onSearch()\"\r\n />\r\n <button class=\"btn btn-primary\" type=\"button\" (click)=\"onSearch()\">\r\n <i class=\"fa fa-search\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card\">\r\n <abp-extensible-table [data]=\"data.items\" [recordsTotal]=\"data.totalCount\" [list]=\"list\" />\r\n </div>\r\n</abp-page>\r\n" }]
1073
+ ], imports: [ExtensibleTableComponent, PageComponent, LocalizationPipe, FormsModule, CommonModule], template: "<abp-page [title]=\"'CmsKit::BlogPosts' | abpLocalization\" [toolbar]=\"data().items\">\r\n <div class=\"card mb-4\">\r\n <div class=\"card-body\">\r\n <div class=\"row\">\r\n <div class=\"col-2\">\r\n <select class=\"form-select\" [(ngModel)]=\"statusFilter\" (change)=\"onStatusChange()\">\r\n <option [ngValue]=\"null\">{{ 'CmsKit::AllPosts' | abpLocalization }}</option>\r\n <option [ngValue]=\"BlogPostStatus.Draft\">\r\n {{ 'CmsKit::' + 'CmsKit.BlogPost.Status.0' | abpLocalization }}\r\n </option>\r\n <option [ngValue]=\"BlogPostStatus.Published\">\r\n {{ 'CmsKit::' + 'CmsKit.BlogPost.Status.1' | abpLocalization }}\r\n </option>\r\n <option [ngValue]=\"BlogPostStatus.WaitingForReview\">\r\n {{ 'CmsKit::' + 'CmsKit.BlogPost.Status.2' | abpLocalization }}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col-10\">\r\n <div class=\"input-group\">\r\n <input\r\n type=\"search\"\r\n class=\"form-control\"\r\n [placeholder]=\"'AbpUi::PagerSearch' | abpLocalization\"\r\n [(ngModel)]=\"filter\"\r\n (keyup.enter)=\"onSearch()\"\r\n />\r\n <button class=\"btn btn-primary\" type=\"button\" (click)=\"onSearch()\">\r\n <i class=\"fa fa-search\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"card\">\r\n <abp-extensible-table\r\n [data]=\"data().items\"\r\n [recordsTotal]=\"data().totalCount\"\r\n [list]=\"list\"\r\n />\r\n </div>\r\n</abp-page>\r\n" }]
1104
1074
  }] });
1105
1075
 
1106
1076
  class BlogPostFormComponent {
@@ -1113,39 +1083,43 @@ class BlogPostFormComponent {
1113
1083
  this.blogPostFormService = inject(BlogPostFormService);
1114
1084
  this.route = inject(ActivatedRoute);
1115
1085
  this.destroyRef = inject(DestroyRef);
1116
- this.blogPost = null;
1086
+ this.blogPost = signal(null, /* @ts-ignore */
1087
+ ...(ngDevMode ? [{ debugName: "blogPost" }] : /* istanbul ignore next */ []));
1117
1088
  this.blogPostId = null;
1118
- this.isEditMode = false;
1089
+ this.isEditMode = signal(false, /* @ts-ignore */
1090
+ ...(ngDevMode ? [{ debugName: "isEditMode" }] : /* istanbul ignore next */ []));
1119
1091
  this.coverImageFile = null;
1120
- this.coverImagePreview = null;
1121
- this.tags = '';
1122
- this.isTagsEnabled = true;
1092
+ this.coverImagePreview = signal(null, /* @ts-ignore */
1093
+ ...(ngDevMode ? [{ debugName: "coverImagePreview" }] : /* istanbul ignore next */ []));
1094
+ this.tags = signal('', /* @ts-ignore */
1095
+ ...(ngDevMode ? [{ debugName: "tags" }] : /* istanbul ignore next */ []));
1096
+ this.isTagsEnabled = signal(true, /* @ts-ignore */
1097
+ ...(ngDevMode ? [{ debugName: "isTagsEnabled" }] : /* istanbul ignore next */ []));
1123
1098
  this.BLOG_POST_ENTITY_TYPE = 'BlogPost';
1124
1099
  }
1125
1100
  ngOnInit() {
1126
1101
  const id = this.route.snapshot.params['id'];
1127
1102
  if (id) {
1128
- this.isEditMode = true;
1103
+ this.isEditMode.set(true);
1129
1104
  this.blogPostId = id;
1130
1105
  this.loadBlogPost(id);
1131
1106
  }
1132
1107
  else {
1133
- this.isEditMode = false;
1108
+ this.isEditMode.set(false);
1134
1109
  this.buildForm();
1135
1110
  }
1136
1111
  }
1137
1112
  loadBlogPost(id) {
1138
1113
  this.blogPostService.get(id).subscribe(blogPost => {
1139
- this.blogPost = blogPost;
1114
+ this.blogPost.set(blogPost);
1140
1115
  if (blogPost.coverImageMediaId) {
1141
- this.coverImagePreview = `/api/cms-kit/media/${blogPost.coverImageMediaId}`;
1116
+ this.coverImagePreview.set(`/api/cms-kit/media/${blogPost.coverImageMediaId}`);
1142
1117
  }
1143
1118
  this.buildForm();
1144
1119
  this.loadTags(id);
1145
1120
  });
1146
1121
  }
1147
1122
  loadTags(blogPostId) {
1148
- // TODO: use the public service to load the tags
1149
1123
  this.restService
1150
1124
  .request({
1151
1125
  method: 'GET',
@@ -1153,25 +1127,24 @@ class BlogPostFormComponent {
1153
1127
  })
1154
1128
  .subscribe(tags => {
1155
1129
  if (tags && tags.length > 0) {
1156
- this.tags = tags.map(t => t.name || '').join(', ');
1130
+ this.tags.set(tags.map(t => t.name || '').join(', '));
1157
1131
  }
1158
1132
  });
1159
1133
  }
1160
1134
  buildForm() {
1161
- const data = new FormPropData(this.injector, this.blogPost || {});
1135
+ const currentBlogPost = this.blogPost();
1136
+ const data = new FormPropData(this.injector, currentBlogPost || {});
1162
1137
  const baseForm = generateFormFromProps(data);
1163
1138
  this.form = new FormGroup({
1164
1139
  ...baseForm.controls,
1165
- content: new FormControl(this.blogPost?.content || ''),
1166
- coverImageMediaId: new FormControl(this.blogPost?.coverImageMediaId || null),
1140
+ content: new FormControl(currentBlogPost?.content || ''),
1141
+ coverImageMediaId: new FormControl(currentBlogPost?.coverImageMediaId || null),
1167
1142
  });
1168
1143
  prepareSlugFromControl(this.form, 'title', 'slug', this.destroyRef);
1169
- // Check if tags feature is enabled for the blog
1170
- const blogId = this.form.get('blogId')?.value || this.blogPost?.blogId;
1144
+ const blogId = this.form.get('blogId')?.value || currentBlogPost?.blogId;
1171
1145
  if (blogId) {
1172
1146
  this.checkTagsFeature(blogId);
1173
1147
  }
1174
- // Listen for blog selection changes
1175
1148
  this.form
1176
1149
  .get('blogId')
1177
1150
  ?.valueChanges.pipe(takeUntilDestroyed(this.destroyRef))
@@ -1189,7 +1162,7 @@ class BlogPostFormComponent {
1189
1162
  })
1190
1163
  .subscribe(feature => {
1191
1164
  const { isEnabled } = feature || {};
1192
- this.isTagsEnabled = isEnabled;
1165
+ this.isTagsEnabled.set(isEnabled);
1193
1166
  });
1194
1167
  }
1195
1168
  onCoverImageChange(event) {
@@ -1198,14 +1171,14 @@ class BlogPostFormComponent {
1198
1171
  this.coverImageFile = input.files[0];
1199
1172
  const reader = new FileReader();
1200
1173
  reader.onload = (e) => {
1201
- this.coverImagePreview = e.target.result;
1174
+ this.coverImagePreview.set(e.target.result);
1202
1175
  };
1203
1176
  reader.readAsDataURL(this.coverImageFile);
1204
1177
  }
1205
1178
  }
1206
1179
  removeCoverImage() {
1207
1180
  this.coverImageFile = null;
1208
- this.coverImagePreview = null;
1181
+ this.coverImagePreview.set(null);
1209
1182
  this.form.patchValue({ coverImageMediaId: null });
1210
1183
  }
1211
1184
  uploadCoverImage() {
@@ -1221,10 +1194,11 @@ class BlogPostFormComponent {
1221
1194
  }), switchMap(result => of(result.id || null)));
1222
1195
  }
1223
1196
  setTags(blogPostId) {
1224
- if (!this.tags || !this.tags.trim()) {
1197
+ const tagsValue = this.tags();
1198
+ if (!tagsValue || !tagsValue.trim()) {
1225
1199
  return of(null);
1226
1200
  }
1227
- const tagArray = this.tags
1201
+ const tagArray = tagsValue
1228
1202
  .split(',')
1229
1203
  .map(t => t.trim())
1230
1204
  .filter(t => t.length > 0);
@@ -1238,18 +1212,18 @@ class BlogPostFormComponent {
1238
1212
  });
1239
1213
  }
1240
1214
  executeSaveOperation(operation) {
1241
- // First upload cover image if selected
1242
1215
  this.uploadCoverImage()
1243
1216
  .pipe(tap(coverImageMediaId => {
1244
1217
  if (coverImageMediaId) {
1245
1218
  this.form.patchValue({ coverImageMediaId });
1246
1219
  }
1247
1220
  }), switchMap(() => {
1248
- if (this.isEditMode) {
1249
- if (!this.blogPost || !this.blogPostId) {
1221
+ if (this.isEditMode()) {
1222
+ const currentBlogPost = this.blogPost();
1223
+ if (!currentBlogPost || !this.blogPostId) {
1250
1224
  return of(null);
1251
1225
  }
1252
- return this.blogPostFormService.update(this.blogPostId, this.form, this.blogPost);
1226
+ return this.blogPostFormService.update(this.blogPostId, this.form, currentBlogPost);
1253
1227
  }
1254
1228
  switch (operation) {
1255
1229
  case 'save':
@@ -1266,7 +1240,6 @@ class BlogPostFormComponent {
1266
1240
  if (!result || !result.id) {
1267
1241
  return of(null);
1268
1242
  }
1269
- // Set tags after blog post is created/updated
1270
1243
  return forkJoin([of(result), this.setTags(result.id)]);
1271
1244
  }))
1272
1245
  .subscribe();
@@ -1280,17 +1253,17 @@ class BlogPostFormComponent {
1280
1253
  sendToReview() {
1281
1254
  this.executeSaveOperation('sendToReview');
1282
1255
  }
1283
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BlogPostFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1284
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: BlogPostFormComponent, isStandalone: true, selector: "abp-blog-post-form", providers: [
1256
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: BlogPostFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1257
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: BlogPostFormComponent, isStandalone: true, selector: "abp-blog-post-form", providers: [
1285
1258
  {
1286
1259
  provide: EXTENSIONS_IDENTIFIER,
1287
1260
  useValue: eCmsKitAdminComponents.BlogPostForm,
1288
1261
  },
1289
- ], ngImport: i0, template: "<abp-page [title]=\"'CmsKit::BlogPosts' | abpLocalization\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n @if (form && (!isEditMode || blogPost)) {\r\n <form [formGroup]=\"form\" (ngSubmit)=\"saveAsDraft()\" validateOnSubmit>\r\n <!-- Cover Image -->\r\n <div class=\"mb-3\">\r\n @if (coverImagePreview) {\r\n <div class=\"mb-2\">\r\n <img [src]=\"coverImagePreview\" height=\"120\" alt=\"Cover Image\" />\r\n <br />\r\n <button type=\"button\" class=\"btn btn-link p-0\" (click)=\"removeCoverImage()\">\r\n {{ 'CmsKit::RemoveCoverImage' | abpLocalization }}\r\n </button>\r\n <br />\r\n </div>\r\n }\r\n <label class=\"form-label\"\r\n >{{ 'CmsKit::CoverImage' | abpLocalization }}\r\n <span class=\"badge text-bg-light\">16:9</span></label\r\n >\r\n <input\r\n type=\"file\"\r\n class=\"form-control\"\r\n accept=\"image/*\"\r\n (change)=\"onCoverImageChange($event)\"\r\n />\r\n </div>\r\n\r\n <!-- Basic fields -->\r\n <abp-extensible-form [selectedRecord]=\"blogPost || {}\" />\r\n\r\n <!-- Content editor -->\r\n <div class=\"mt-3\">\r\n <label class=\"form-label\">{{ 'CmsKit::Content' | abpLocalization }}</label>\r\n <abp-toastui-editor formControlName=\"content\" />\r\n </div>\r\n </form>\r\n\r\n <!-- Tags Editor -->\r\n @if (isTagsEnabled) {\r\n <hr />\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">{{ 'CmsKit::Tags' | abpLocalization }}</label>\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n [(ngModel)]=\"tags\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n [placeholder]=\"'CmsKit::TagsHelpText' | abpLocalization\"\r\n />\r\n <div class=\"form-text\">{{ 'CmsKit::TagsHelpText' | abpLocalization }}</div>\r\n </div>\r\n }\r\n } @else {\r\n <div class=\"text-center\">\r\n <i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i>\r\n </div>\r\n }\r\n </div>\r\n <div class=\"card-footer\">\r\n <div class=\"d-flex justify-content-start gap-2\">\r\n <button class=\"btn btn-secondary\" (click)=\"saveAsDraft()\" [disabled]=\"form?.invalid\">\r\n {{ 'CmsKit::SaveAsDraft' | abpLocalization }}\r\n </button>\r\n @if (isEditMode) {\r\n <abp-button (click)=\"publish()\" [disabled]=\"form?.invalid\">\r\n {{ 'CmsKit::Publish' | abpLocalization }}\r\n </abp-button>\r\n } @else {\r\n <abp-button (click)=\"publish()\" [disabled]=\"form?.invalid\">\r\n {{ 'CmsKit::Publish' | abpLocalization }}\r\n </abp-button>\r\n <abp-button (click)=\"sendToReview()\" [disabled]=\"form?.invalid\">\r\n {{ 'CmsKit::SendToReviewToPublish' | abpLocalization }}\r\n </abp-button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</abp-page>\r\n", dependencies: [{ kind: "component", type: ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "component", type: ExtensibleFormComponent, selector: "abp-extensible-form", inputs: ["selectedRecord"], exportAs: ["abpExtensibleForm"] }, { kind: "component", type: PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }, { kind: "component", type: ToastuiEditorComponent, selector: "abp-toastui-editor" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: NgxValidateCoreModule }, { kind: "directive", type: i2$1.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "directive", type: i2$1.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }] }); }
1262
+ ], ngImport: i0, template: "<abp-page [title]=\"'CmsKit::BlogPosts' | abpLocalization\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n @if (form && (!isEditMode() || blogPost())) {\r\n <form [formGroup]=\"form\" (ngSubmit)=\"saveAsDraft()\" [validateOnSubmit]=\"true\">\r\n <!-- Cover Image -->\r\n <div class=\"mb-3\">\r\n @if (coverImagePreview()) {\r\n <div class=\"mb-2\">\r\n <img [src]=\"coverImagePreview()\" height=\"120\" alt=\"Cover Image\" />\r\n <br />\r\n <button type=\"button\" class=\"btn btn-link p-0\" (click)=\"removeCoverImage()\">\r\n {{ 'CmsKit::RemoveCoverImage' | abpLocalization }}\r\n </button>\r\n <br />\r\n </div>\r\n }\r\n <label class=\"form-label\"\r\n >{{ 'CmsKit::CoverImage' | abpLocalization }}\r\n <span class=\"badge text-bg-light\">16:9</span></label\r\n >\r\n <input\r\n type=\"file\"\r\n class=\"form-control\"\r\n accept=\"image/*\"\r\n (change)=\"onCoverImageChange($event)\"\r\n />\r\n </div>\r\n\r\n <!-- Basic fields -->\r\n <abp-extensible-form [selectedRecord]=\"blogPost() || {}\" />\r\n\r\n <!-- Content editor -->\r\n <div class=\"mt-3\">\r\n <label class=\"form-label\">{{ 'CmsKit::Content' | abpLocalization }}</label>\r\n <abp-toastui-editor formControlName=\"content\" />\r\n </div>\r\n </form>\r\n\r\n <!-- Tags Editor -->\r\n @if (isTagsEnabled()) {\r\n <hr />\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">{{ 'CmsKit::Tags' | abpLocalization }}</label>\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n [ngModel]=\"tags()\"\r\n (ngModelChange)=\"tags.set($event)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n [placeholder]=\"'CmsKit::TagsHelpText' | abpLocalization\"\r\n />\r\n <div class=\"form-text\">{{ 'CmsKit::TagsHelpText' | abpLocalization }}</div>\r\n </div>\r\n }\r\n } @else {\r\n <div class=\"text-center\">\r\n <i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i>\r\n </div>\r\n }\r\n </div>\r\n <div class=\"card-footer\">\r\n <div class=\"d-flex justify-content-start gap-2\">\r\n <button class=\"btn btn-secondary\" (click)=\"saveAsDraft()\" [disabled]=\"form?.invalid\">\r\n {{ 'CmsKit::SaveAsDraft' | abpLocalization }}\r\n </button>\r\n @if (isEditMode()) {\r\n <abp-button (click)=\"publish()\" [disabled]=\"form?.invalid\">\r\n {{ 'CmsKit::Publish' | abpLocalization }}\r\n </abp-button>\r\n } @else {\r\n <abp-button (click)=\"publish()\" [disabled]=\"form?.invalid\">\r\n {{ 'CmsKit::Publish' | abpLocalization }}\r\n </abp-button>\r\n <abp-button (click)=\"sendToReview()\" [disabled]=\"form?.invalid\">\r\n {{ 'CmsKit::SendToReviewToPublish' | abpLocalization }}\r\n </abp-button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</abp-page>\r\n", dependencies: [{ kind: "component", type: ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "component", type: ExtensibleFormComponent, selector: "abp-extensible-form", inputs: ["selectedRecord"], exportAs: ["abpExtensibleForm"] }, { kind: "component", type: PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }, { kind: "component", type: ToastuiEditorComponent, selector: "abp-toastui-editor" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: NgxValidateCoreModule }, { kind: "directive", type: i2$1.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "directive", type: i2$1.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1290
1263
  }
1291
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BlogPostFormComponent, decorators: [{
1264
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: BlogPostFormComponent, decorators: [{
1292
1265
  type: Component,
1293
- args: [{ selector: 'abp-blog-post-form', providers: [
1266
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'abp-blog-post-form', providers: [
1294
1267
  {
1295
1268
  provide: EXTENSIONS_IDENTIFIER,
1296
1269
  useValue: eCmsKitAdminComponents.BlogPostForm,
@@ -1305,7 +1278,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
1305
1278
  FormsModule,
1306
1279
  CommonModule,
1307
1280
  NgxValidateCoreModule,
1308
- ], template: "<abp-page [title]=\"'CmsKit::BlogPosts' | abpLocalization\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n @if (form && (!isEditMode || blogPost)) {\r\n <form [formGroup]=\"form\" (ngSubmit)=\"saveAsDraft()\" validateOnSubmit>\r\n <!-- Cover Image -->\r\n <div class=\"mb-3\">\r\n @if (coverImagePreview) {\r\n <div class=\"mb-2\">\r\n <img [src]=\"coverImagePreview\" height=\"120\" alt=\"Cover Image\" />\r\n <br />\r\n <button type=\"button\" class=\"btn btn-link p-0\" (click)=\"removeCoverImage()\">\r\n {{ 'CmsKit::RemoveCoverImage' | abpLocalization }}\r\n </button>\r\n <br />\r\n </div>\r\n }\r\n <label class=\"form-label\"\r\n >{{ 'CmsKit::CoverImage' | abpLocalization }}\r\n <span class=\"badge text-bg-light\">16:9</span></label\r\n >\r\n <input\r\n type=\"file\"\r\n class=\"form-control\"\r\n accept=\"image/*\"\r\n (change)=\"onCoverImageChange($event)\"\r\n />\r\n </div>\r\n\r\n <!-- Basic fields -->\r\n <abp-extensible-form [selectedRecord]=\"blogPost || {}\" />\r\n\r\n <!-- Content editor -->\r\n <div class=\"mt-3\">\r\n <label class=\"form-label\">{{ 'CmsKit::Content' | abpLocalization }}</label>\r\n <abp-toastui-editor formControlName=\"content\" />\r\n </div>\r\n </form>\r\n\r\n <!-- Tags Editor -->\r\n @if (isTagsEnabled) {\r\n <hr />\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">{{ 'CmsKit::Tags' | abpLocalization }}</label>\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n [(ngModel)]=\"tags\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n [placeholder]=\"'CmsKit::TagsHelpText' | abpLocalization\"\r\n />\r\n <div class=\"form-text\">{{ 'CmsKit::TagsHelpText' | abpLocalization }}</div>\r\n </div>\r\n }\r\n } @else {\r\n <div class=\"text-center\">\r\n <i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i>\r\n </div>\r\n }\r\n </div>\r\n <div class=\"card-footer\">\r\n <div class=\"d-flex justify-content-start gap-2\">\r\n <button class=\"btn btn-secondary\" (click)=\"saveAsDraft()\" [disabled]=\"form?.invalid\">\r\n {{ 'CmsKit::SaveAsDraft' | abpLocalization }}\r\n </button>\r\n @if (isEditMode) {\r\n <abp-button (click)=\"publish()\" [disabled]=\"form?.invalid\">\r\n {{ 'CmsKit::Publish' | abpLocalization }}\r\n </abp-button>\r\n } @else {\r\n <abp-button (click)=\"publish()\" [disabled]=\"form?.invalid\">\r\n {{ 'CmsKit::Publish' | abpLocalization }}\r\n </abp-button>\r\n <abp-button (click)=\"sendToReview()\" [disabled]=\"form?.invalid\">\r\n {{ 'CmsKit::SendToReviewToPublish' | abpLocalization }}\r\n </abp-button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</abp-page>\r\n" }]
1281
+ ], template: "<abp-page [title]=\"'CmsKit::BlogPosts' | abpLocalization\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n @if (form && (!isEditMode() || blogPost())) {\r\n <form [formGroup]=\"form\" (ngSubmit)=\"saveAsDraft()\" [validateOnSubmit]=\"true\">\r\n <!-- Cover Image -->\r\n <div class=\"mb-3\">\r\n @if (coverImagePreview()) {\r\n <div class=\"mb-2\">\r\n <img [src]=\"coverImagePreview()\" height=\"120\" alt=\"Cover Image\" />\r\n <br />\r\n <button type=\"button\" class=\"btn btn-link p-0\" (click)=\"removeCoverImage()\">\r\n {{ 'CmsKit::RemoveCoverImage' | abpLocalization }}\r\n </button>\r\n <br />\r\n </div>\r\n }\r\n <label class=\"form-label\"\r\n >{{ 'CmsKit::CoverImage' | abpLocalization }}\r\n <span class=\"badge text-bg-light\">16:9</span></label\r\n >\r\n <input\r\n type=\"file\"\r\n class=\"form-control\"\r\n accept=\"image/*\"\r\n (change)=\"onCoverImageChange($event)\"\r\n />\r\n </div>\r\n\r\n <!-- Basic fields -->\r\n <abp-extensible-form [selectedRecord]=\"blogPost() || {}\" />\r\n\r\n <!-- Content editor -->\r\n <div class=\"mt-3\">\r\n <label class=\"form-label\">{{ 'CmsKit::Content' | abpLocalization }}</label>\r\n <abp-toastui-editor formControlName=\"content\" />\r\n </div>\r\n </form>\r\n\r\n <!-- Tags Editor -->\r\n @if (isTagsEnabled()) {\r\n <hr />\r\n <div class=\"mb-3\">\r\n <label class=\"form-label\">{{ 'CmsKit::Tags' | abpLocalization }}</label>\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n [ngModel]=\"tags()\"\r\n (ngModelChange)=\"tags.set($event)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n [placeholder]=\"'CmsKit::TagsHelpText' | abpLocalization\"\r\n />\r\n <div class=\"form-text\">{{ 'CmsKit::TagsHelpText' | abpLocalization }}</div>\r\n </div>\r\n }\r\n } @else {\r\n <div class=\"text-center\">\r\n <i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i>\r\n </div>\r\n }\r\n </div>\r\n <div class=\"card-footer\">\r\n <div class=\"d-flex justify-content-start gap-2\">\r\n <button class=\"btn btn-secondary\" (click)=\"saveAsDraft()\" [disabled]=\"form?.invalid\">\r\n {{ 'CmsKit::SaveAsDraft' | abpLocalization }}\r\n </button>\r\n @if (isEditMode()) {\r\n <abp-button (click)=\"publish()\" [disabled]=\"form?.invalid\">\r\n {{ 'CmsKit::Publish' | abpLocalization }}\r\n </abp-button>\r\n } @else {\r\n <abp-button (click)=\"publish()\" [disabled]=\"form?.invalid\">\r\n {{ 'CmsKit::Publish' | abpLocalization }}\r\n </abp-button>\r\n <abp-button (click)=\"sendToReview()\" [disabled]=\"form?.invalid\">\r\n {{ 'CmsKit::SendToReviewToPublish' | abpLocalization }}\r\n </abp-button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</abp-page>\r\n" }]
1309
1282
  }] });
1310
1283
 
1311
1284
  // Constants
@@ -1324,16 +1297,24 @@ class MenuItemModalComponent {
1324
1297
  this.toasterService = inject(ToasterService);
1325
1298
  this.destroyRef = inject(DestroyRef);
1326
1299
  // Inputs/Outputs
1327
- this.selected = input(...(ngDevMode ? [undefined, { debugName: "selected" }] : /* istanbul ignore next */ []));
1328
- this.parentId = input(...(ngDevMode ? [undefined, { debugName: "parentId" }] : /* istanbul ignore next */ []));
1329
- this.visible = input(true, ...(ngDevMode ? [{ debugName: "visible" }] : /* istanbul ignore next */ []));
1300
+ this.selected = input(/* @ts-ignore */
1301
+ ...(ngDevMode ? [undefined, { debugName: "selected" }] : /* istanbul ignore next */ []));
1302
+ this.parentId = input(/* @ts-ignore */
1303
+ ...(ngDevMode ? [undefined, { debugName: "parentId" }] : /* istanbul ignore next */ []));
1304
+ this.visible = input(true, /* @ts-ignore */
1305
+ ...(ngDevMode ? [{ debugName: "visible" }] : /* istanbul ignore next */ []));
1330
1306
  this.visibleChange = output();
1331
- this.activeTab = TABS.URL;
1332
- // Page selection state
1333
- this.pages = [];
1334
- this.selectedPage = null;
1335
- this.pageSearchText = '';
1336
- this.filteredPages = [];
1307
+ this.activeTab = signal(TABS.URL, /* @ts-ignore */
1308
+ ...(ngDevMode ? [{ debugName: "activeTab" }] : /* istanbul ignore next */ []));
1309
+ // Page search state
1310
+ this.pages = signal([], /* @ts-ignore */
1311
+ ...(ngDevMode ? [{ debugName: "pages" }] : /* istanbul ignore next */ []));
1312
+ this.selectedPage = signal(null, /* @ts-ignore */
1313
+ ...(ngDevMode ? [{ debugName: "selectedPage" }] : /* istanbul ignore next */ []));
1314
+ this.pageSearchText = signal('', /* @ts-ignore */
1315
+ ...(ngDevMode ? [{ debugName: "pageSearchText" }] : /* istanbul ignore next */ []));
1316
+ this.filteredPages = signal([], /* @ts-ignore */
1317
+ ...(ngDevMode ? [{ debugName: "filteredPages" }] : /* istanbul ignore next */ []));
1337
1318
  // Search subject for debouncing
1338
1319
  this.pageSearchSubject = new Subject();
1339
1320
  }
@@ -1361,10 +1342,10 @@ class MenuItemModalComponent {
1361
1342
  }), takeUntilDestroyed(this.destroyRef))
1362
1343
  .subscribe({
1363
1344
  next: result => {
1364
- this.filteredPages = result.items || [];
1345
+ this.filteredPages.set(result.items || []);
1365
1346
  },
1366
1347
  error: () => {
1367
- this.filteredPages = [];
1348
+ this.filteredPages.set([]);
1368
1349
  },
1369
1350
  });
1370
1351
  }
@@ -1392,8 +1373,8 @@ class MenuItemModalComponent {
1392
1373
  .pipe(takeUntilDestroyed(this.destroyRef))
1393
1374
  .subscribe({
1394
1375
  next: ({ menuItem, pages }) => {
1395
- this.pages = pages.items || [];
1396
- this.filteredPages = this.pages;
1376
+ this.pages.set(pages.items || []);
1377
+ this.filteredPages.set(pages.items || []);
1397
1378
  this.buildForm(menuItem);
1398
1379
  this.initializePageSelection(menuItem);
1399
1380
  },
@@ -1411,8 +1392,8 @@ class MenuItemModalComponent {
1411
1392
  .pipe(takeUntilDestroyed(this.destroyRef))
1412
1393
  .subscribe({
1413
1394
  next: result => {
1414
- this.pages = result.items || [];
1415
- this.filteredPages = this.pages;
1395
+ this.pages.set(result.items || []);
1396
+ this.filteredPages.set(result.items || []);
1416
1397
  },
1417
1398
  error: () => {
1418
1399
  this.toasterService.error('AbpUi::ErrorMessage');
@@ -1424,16 +1405,15 @@ class MenuItemModalComponent {
1424
1405
  */
1425
1406
  initializePageSelection(menuItem) {
1426
1407
  if (menuItem.pageId) {
1427
- this.activeTab = TABS.PAGE;
1428
- this.selectedPage = this.pages.find(p => p.id === menuItem.pageId) || null;
1429
- const url = this.selectedPage
1430
- ? this.generateUrlFromPage(this.selectedPage)
1431
- : menuItem.url || '';
1408
+ this.activeTab.set(TABS.PAGE);
1409
+ const page = this.pages().find(p => p.id === menuItem.pageId) || null;
1410
+ this.selectedPage.set(page);
1411
+ const url = page ? this.generateUrlFromPage(page) : menuItem.url || '';
1432
1412
  this.form.patchValue({ pageId: menuItem.pageId, url }, { emitEvent: false });
1433
- this.pageSearchText = this.selectedPage?.title || '';
1413
+ this.pageSearchText.set(page?.title || '');
1434
1414
  }
1435
1415
  else if (menuItem.url) {
1436
- this.activeTab = TABS.URL;
1416
+ this.activeTab.set(TABS.URL);
1437
1417
  this.form.patchValue({ url: menuItem.url, pageId: null }, { emitEvent: false });
1438
1418
  }
1439
1419
  }
@@ -1452,9 +1432,9 @@ class MenuItemModalComponent {
1452
1432
  * Handles page search input changes
1453
1433
  */
1454
1434
  onPageSearchChange(searchText) {
1455
- this.pageSearchText = searchText;
1435
+ this.pageSearchText.set(searchText);
1456
1436
  if (!searchText?.trim()) {
1457
- this.filteredPages = this.pages;
1437
+ this.filteredPages.set(this.pages());
1458
1438
  return;
1459
1439
  }
1460
1440
  this.pageSearchSubject.next(searchText);
@@ -1463,8 +1443,8 @@ class MenuItemModalComponent {
1463
1443
  * Handles dropdown open event
1464
1444
  */
1465
1445
  onDropdownOpen() {
1466
- if (!this.pageSearchText?.trim()) {
1467
- this.filteredPages = this.pages;
1446
+ if (!this.pageSearchText()?.trim()) {
1447
+ this.filteredPages.set(this.pages());
1468
1448
  }
1469
1449
  }
1470
1450
  /**
@@ -1473,19 +1453,19 @@ class MenuItemModalComponent {
1473
1453
  selectPage(page) {
1474
1454
  if (!page)
1475
1455
  return;
1476
- this.selectedPage = page;
1456
+ this.selectedPage.set(page);
1477
1457
  const url = this.generateUrlFromPage(page);
1478
1458
  this.form.patchValue({ pageId: page.id, url }, { emitEvent: false });
1479
- this.pageSearchText = page.title || '';
1459
+ this.pageSearchText.set(page.title || '');
1480
1460
  }
1481
1461
  /**
1482
1462
  * Clears the selected page
1483
1463
  */
1484
1464
  clearPageSelection() {
1485
1465
  this.form.patchValue({ pageId: null }, { emitEvent: false });
1486
- this.selectedPage = null;
1487
- this.pageSearchText = '';
1488
- this.filteredPages = this.pages;
1466
+ this.selectedPage.set(null);
1467
+ this.pageSearchText.set('');
1468
+ this.filteredPages.set(this.pages());
1489
1469
  }
1490
1470
  /**
1491
1471
  * Builds the reactive form for menu item creation/editing
@@ -1507,7 +1487,7 @@ class MenuItemModalComponent {
1507
1487
  */
1508
1488
  loadAvailableOrder(parentId, menuItemId) {
1509
1489
  if (menuItemId)
1510
- return; // Only needed for new items
1490
+ return;
1511
1491
  const order$ = parentId
1512
1492
  ? this.menuItemService.getAvailableMenuOrder(parentId)
1513
1493
  : this.menuItemService.getAvailableMenuOrder();
@@ -1527,7 +1507,7 @@ class MenuItemModalComponent {
1527
1507
  * Handles tab changes
1528
1508
  */
1529
1509
  onTabChange(activeId) {
1530
- this.activeTab = activeId;
1510
+ this.activeTab.set(activeId);
1531
1511
  }
1532
1512
  /**
1533
1513
  * Handles URL input changes - clears page selection if URL is manually entered
@@ -1536,8 +1516,8 @@ class MenuItemModalComponent {
1536
1516
  const urlValue = this.form.get('url')?.value;
1537
1517
  if (urlValue && this.form.get('pageId')?.value) {
1538
1518
  this.clearPageSelection();
1539
- if (this.activeTab === TABS.PAGE) {
1540
- this.activeTab = TABS.URL;
1519
+ if (this.activeTab() === TABS.PAGE) {
1520
+ this.activeTab.set(TABS.URL);
1541
1521
  }
1542
1522
  }
1543
1523
  }
@@ -1570,17 +1550,14 @@ class MenuItemModalComponent {
1570
1550
  prepareFormValue() {
1571
1551
  const formValue = { ...this.form.value };
1572
1552
  if (formValue.pageId) {
1573
- // If pageId is set, generate URL from the page
1574
- const selectedPage = this.pages.find(p => p.id === formValue.pageId);
1575
- if (selectedPage) {
1576
- formValue.url = this.generateUrlFromPage(selectedPage);
1553
+ const page = this.pages().find(p => p.id === formValue.pageId);
1554
+ if (page) {
1555
+ formValue.url = this.generateUrlFromPage(page);
1577
1556
  }
1578
1557
  }
1579
1558
  else if (formValue.url) {
1580
- // If URL is manually entered, ensure pageId is cleared
1581
1559
  formValue.pageId = null;
1582
1560
  }
1583
- // Clean up undefined values
1584
1561
  return {
1585
1562
  ...formValue,
1586
1563
  url: formValue.url || undefined,
@@ -1604,12 +1581,12 @@ class MenuItemModalComponent {
1604
1581
  };
1605
1582
  return this.menuItemService.update(id, updateInput);
1606
1583
  }
1607
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: MenuItemModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1608
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: MenuItemModalComponent, isStandalone: true, selector: "abp-menu-item-modal", inputs: { selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, parentId: { classPropertyName: "parentId", publicName: "parentId", isSignal: true, isRequired: false, transformFunction: null }, visible: { classPropertyName: "visible", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visibleChange: "visibleChange" }, ngImport: i0, template: "<abp-modal [visible]=\"visible()\" (visibleChange)=\"onVisibleChange($event)\">\r\n <ng-template #abpHeader>\r\n <h3>\r\n @if (selected()?.id) {\r\n {{ 'AbpUi::Edit' | abpLocalization }}\r\n } @else {\r\n {{ 'AbpUi::New' | abpLocalization }}\r\n }\r\n </h3>\r\n </ng-template>\r\n\r\n <ng-template #abpBody>\r\n @if (form) {\r\n <form [formGroup]=\"form\" (ngSubmit)=\"save()\" validateOnSubmit>\r\n <ul\r\n ngbNav\r\n #nav=\"ngbNav\"\r\n class=\"nav-tabs\"\r\n [(activeId)]=\"activeTab\"\r\n (activeIdChange)=\"onTabChange($event)\"\r\n >\r\n <li ngbNavItem=\"url\">\r\n <a ngbNavLink>{{ 'CmsKit::Url' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <label class=\"form-label\">{{ 'CmsKit::Url' | abpLocalization }}</label>\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n formControlName=\"url\"\r\n [disabled]=\"isPageSelected\"\r\n (input)=\"onUrlInput()\"\r\n />\r\n </div>\r\n </ng-template>\r\n </li>\r\n <li ngbNavItem=\"page\">\r\n <a ngbNavLink>{{ 'CmsKit::Page' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <label class=\"form-label\">{{ 'CmsKit::Page' | abpLocalization }}</label>\r\n <div\r\n class=\"position-relative\"\r\n ngbDropdown\r\n #pageDropdown=\"ngbDropdown\"\r\n display=\"static\"\r\n (openChange)=\"onDropdownOpen()\"\r\n >\r\n <button\r\n class=\"form-select form-control text-start d-flex align-items-center justify-content-between\"\r\n type=\"button\"\r\n id=\"pageSelectDropdown\"\r\n ngbDropdownToggle\r\n [class.text-muted]=\"!selectedPage\"\r\n >\r\n <span>{{ selectedPage?.title || ('CmsKit::Page' | abpLocalization) }}</span>\r\n </button>\r\n <div\r\n class=\"dropdown-menu w-100\"\r\n ngbDropdownMenu\r\n aria-labelledby=\"pageSelectDropdown\"\r\n style=\"max-height: 300px; overflow-y: auto\"\r\n >\r\n <div class=\"p-2 border-bottom\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n [(ngModel)]=\"pageSearchText\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (input)=\"onPageSearchChange($any($event.target).value)\"\r\n (click)=\"$event.stopPropagation()\"\r\n placeholder=\"{{ 'AbpUi::Search' | abpLocalization }}\"\r\n autocomplete=\"off\"\r\n />\r\n </div>\r\n @if (filteredPages.length > 0) {\r\n @for (page of filteredPages; track page.id) {\r\n <button\r\n type=\"button\"\r\n class=\"dropdown-item\"\r\n (click)=\"selectPage(page); pageDropdown.close()\"\r\n >\r\n {{ page.title }}\r\n </button>\r\n }\r\n } @else if (pageSearchText && pageSearchText.length > 0) {\r\n <div class=\"dropdown-item text-muted\">\r\n {{ 'No results found' }}\r\n </div>\r\n } @else if (pages.length === 0) {\r\n <div class=\"dropdown-item text-muted\">\r\n {{ 'No pages found' }}\r\n </div>\r\n }\r\n @if (selectedPage) {\r\n <div class=\"dropdown-divider\"></div>\r\n <button\r\n type=\"button\"\r\n class=\"dropdown-item text-danger\"\r\n (click)=\"clearPageSelection(); pageDropdown.close()\"\r\n >\r\n {{ 'AbpUi::Clear' | abpLocalization }}\r\n </button>\r\n }\r\n </div>\r\n <input [formControlName]=\"'pageId'\" type=\"hidden\" />\r\n </div>\r\n </div>\r\n </ng-template>\r\n </li>\r\n </ul>\r\n <div class=\"mt-2 fade-in-top\" [ngbNavOutlet]=\"nav\"></div>\r\n <hr />\r\n <abp-extensible-form [selectedRecord]=\"selected() || {}\" />\r\n </form>\r\n }\r\n </ng-template>\r\n\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-outline-primary\" abpClose>\r\n {{ 'AbpUi::Cancel' | abpLocalization }}\r\n </button>\r\n <abp-button (click)=\"save()\" [disabled]=\"form?.invalid\">\r\n {{ 'AbpUi::Save' | abpLocalization }}\r\n </abp-button>\r\n </ng-template>\r\n</abp-modal>\r\n", styles: [".dropdown-toggle:after{display:none!important}\n"], dependencies: [{ kind: "component", type: ExtensibleFormComponent, selector: "abp-extensible-form", inputs: ["selectedRecord"], exportAs: ["abpExtensibleForm"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: NgxValidateCoreModule }, { kind: "directive", type: i2$1.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "directive", type: i2$1.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "component", type: ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }, { kind: "directive", type: ModalCloseDirective, selector: "[abpClose]" }, { kind: "component", type: ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "ngmodule", type: NgbNavModule }, { kind: "directive", type: i3.NgbNavContent, selector: "ng-template[ngbNavContent]" }, { kind: "directive", type: i3.NgbNav, selector: "[ngbNav]", inputs: ["activeId", "animation", "destroyOnHide", "orientation", "roles", "keyboard"], outputs: ["activeIdChange", "shown", "hidden", "navChange"], exportAs: ["ngbNav"] }, { kind: "directive", type: i3.NgbNavItem, selector: "[ngbNavItem]", inputs: ["destroyOnHide", "disabled", "domId", "ngbNavItem"], outputs: ["shown", "hidden"], exportAs: ["ngbNavItem"] }, { kind: "directive", type: i3.NgbNavItemRole, selector: "[ngbNavItem]:not(ng-container)" }, { kind: "directive", type: i3.NgbNavLink, selector: "a[ngbNavLink]" }, { kind: "directive", type: i3.NgbNavLinkBase, selector: "[ngbNavLink]" }, { kind: "component", type: i3.NgbNavOutlet, selector: "[ngbNavOutlet]", inputs: ["paneRole", "ngbNavOutlet"] }, { kind: "ngmodule", type: NgbDropdownModule }, { kind: "directive", type: i3.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i3.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i3.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }] }); }
1584
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: MenuItemModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1585
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: MenuItemModalComponent, isStandalone: true, selector: "abp-menu-item-modal", inputs: { selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, parentId: { classPropertyName: "parentId", publicName: "parentId", isSignal: true, isRequired: false, transformFunction: null }, visible: { classPropertyName: "visible", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visibleChange: "visibleChange" }, ngImport: i0, template: "<abp-modal [visible]=\"visible()\" (visibleChange)=\"onVisibleChange($event)\">\r\n <ng-template #abpHeader>\r\n <h3>\r\n @if (selected()?.id) {\r\n {{ 'AbpUi::Edit' | abpLocalization }}\r\n } @else {\r\n {{ 'AbpUi::New' | abpLocalization }}\r\n }\r\n </h3>\r\n </ng-template>\r\n\r\n <ng-template #abpBody>\r\n @if (form) {\r\n <form [formGroup]=\"form\" (ngSubmit)=\"save()\" [validateOnSubmit]=\"true\">\r\n <ul\r\n ngbNav\r\n #nav=\"ngbNav\"\r\n class=\"nav-tabs\"\r\n [activeId]=\"activeTab()\"\r\n (activeIdChange)=\"onTabChange($event)\"\r\n >\r\n <li ngbNavItem=\"url\">\r\n <a ngbNavLink>{{ 'CmsKit::Url' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <label class=\"form-label\">{{ 'CmsKit::Url' | abpLocalization }}</label>\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n formControlName=\"url\"\r\n [disabled]=\"isPageSelected\"\r\n (input)=\"onUrlInput()\"\r\n />\r\n </div>\r\n </ng-template>\r\n </li>\r\n <li ngbNavItem=\"page\">\r\n <a ngbNavLink>{{ 'CmsKit::Page' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <label class=\"form-label\">{{ 'CmsKit::Page' | abpLocalization }}</label>\r\n <div\r\n class=\"position-relative\"\r\n ngbDropdown\r\n #pageDropdown=\"ngbDropdown\"\r\n display=\"static\"\r\n (openChange)=\"onDropdownOpen()\"\r\n >\r\n <button\r\n class=\"form-select form-control text-start d-flex align-items-center justify-content-between\"\r\n type=\"button\"\r\n id=\"pageSelectDropdown\"\r\n ngbDropdownToggle\r\n [class.text-muted]=\"!selectedPage()\"\r\n >\r\n <span>{{ selectedPage()?.title || ('CmsKit::Page' | abpLocalization) }}</span>\r\n </button>\r\n <div\r\n class=\"dropdown-menu w-100\"\r\n ngbDropdownMenu\r\n aria-labelledby=\"pageSelectDropdown\"\r\n style=\"max-height: 300px; overflow-y: auto\"\r\n >\r\n <div class=\"p-2 border-bottom\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n [ngModel]=\"pageSearchText()\"\r\n (ngModelChange)=\"onPageSearchChange($event)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (click)=\"$event.stopPropagation()\"\r\n placeholder=\"{{ 'AbpUi::Search' | abpLocalization }}\"\r\n autocomplete=\"off\"\r\n />\r\n </div>\r\n @if (filteredPages().length > 0) {\r\n @for (page of filteredPages(); track page.id) {\r\n <button\r\n type=\"button\"\r\n class=\"dropdown-item\"\r\n (click)=\"selectPage(page); pageDropdown.close()\"\r\n >\r\n {{ page.title }}\r\n </button>\r\n }\r\n } @else if (pageSearchText() && pageSearchText().length > 0) {\r\n <div class=\"dropdown-item text-muted\">\r\n {{ 'No results found' }}\r\n </div>\r\n } @else if (pages().length === 0) {\r\n <div class=\"dropdown-item text-muted\">\r\n {{ 'No pages found' }}\r\n </div>\r\n }\r\n @if (selectedPage()) {\r\n <div class=\"dropdown-divider\"></div>\r\n <button\r\n type=\"button\"\r\n class=\"dropdown-item text-danger\"\r\n (click)=\"clearPageSelection(); pageDropdown.close()\"\r\n >\r\n {{ 'AbpUi::Clear' | abpLocalization }}\r\n </button>\r\n }\r\n </div>\r\n <input [formControlName]=\"'pageId'\" type=\"hidden\" />\r\n </div>\r\n </div>\r\n </ng-template>\r\n </li>\r\n </ul>\r\n <div class=\"mt-2 fade-in-top\" [ngbNavOutlet]=\"nav\"></div>\r\n <hr />\r\n <abp-extensible-form [selectedRecord]=\"selected() || {}\" />\r\n </form>\r\n }\r\n </ng-template>\r\n\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-outline-primary\" abpClose>\r\n {{ 'AbpUi::Cancel' | abpLocalization }}\r\n </button>\r\n <abp-button (click)=\"save()\" [disabled]=\"form?.invalid\">\r\n {{ 'AbpUi::Save' | abpLocalization }}\r\n </abp-button>\r\n </ng-template>\r\n</abp-modal>\r\n", styles: [".dropdown-toggle:after{display:none!important}\n"], dependencies: [{ kind: "component", type: ExtensibleFormComponent, selector: "abp-extensible-form", inputs: ["selectedRecord"], exportAs: ["abpExtensibleForm"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: NgxValidateCoreModule }, { kind: "directive", type: i2$1.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "directive", type: i2$1.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "component", type: ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }, { kind: "directive", type: ModalCloseDirective, selector: "[abpClose]" }, { kind: "component", type: ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "ngmodule", type: NgbNavModule }, { kind: "directive", type: i3.NgbNavContent, selector: "ng-template[ngbNavContent]" }, { kind: "directive", type: i3.NgbNav, selector: "[ngbNav]", inputs: ["activeId", "animation", "destroyOnHide", "orientation", "roles", "keyboard"], outputs: ["activeIdChange", "shown", "hidden", "navChange"], exportAs: ["ngbNav"] }, { kind: "directive", type: i3.NgbNavItem, selector: "[ngbNavItem]", inputs: ["destroyOnHide", "disabled", "domId", "ngbNavItem"], outputs: ["shown", "hidden"], exportAs: ["ngbNavItem"] }, { kind: "directive", type: i3.NgbNavItemRole, selector: "[ngbNavItem]:not(ng-container)" }, { kind: "directive", type: i3.NgbNavLink, selector: "a[ngbNavLink]" }, { kind: "directive", type: i3.NgbNavLinkBase, selector: "[ngbNavLink]" }, { kind: "component", type: i3.NgbNavOutlet, selector: "[ngbNavOutlet]", inputs: ["paneRole", "ngbNavOutlet"] }, { kind: "ngmodule", type: NgbDropdownModule }, { kind: "directive", type: i3.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i3.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i3.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1609
1586
  }
1610
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: MenuItemModalComponent, decorators: [{
1587
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: MenuItemModalComponent, decorators: [{
1611
1588
  type: Component,
1612
- args: [{ selector: 'abp-menu-item-modal', imports: [
1589
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'abp-menu-item-modal', imports: [
1613
1590
  ExtensibleFormComponent,
1614
1591
  LocalizationPipe,
1615
1592
  ReactiveFormsModule,
@@ -1621,20 +1598,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
1621
1598
  NgbNavModule,
1622
1599
  NgbDropdownModule,
1623
1600
  FormsModule,
1624
- ], template: "<abp-modal [visible]=\"visible()\" (visibleChange)=\"onVisibleChange($event)\">\r\n <ng-template #abpHeader>\r\n <h3>\r\n @if (selected()?.id) {\r\n {{ 'AbpUi::Edit' | abpLocalization }}\r\n } @else {\r\n {{ 'AbpUi::New' | abpLocalization }}\r\n }\r\n </h3>\r\n </ng-template>\r\n\r\n <ng-template #abpBody>\r\n @if (form) {\r\n <form [formGroup]=\"form\" (ngSubmit)=\"save()\" validateOnSubmit>\r\n <ul\r\n ngbNav\r\n #nav=\"ngbNav\"\r\n class=\"nav-tabs\"\r\n [(activeId)]=\"activeTab\"\r\n (activeIdChange)=\"onTabChange($event)\"\r\n >\r\n <li ngbNavItem=\"url\">\r\n <a ngbNavLink>{{ 'CmsKit::Url' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <label class=\"form-label\">{{ 'CmsKit::Url' | abpLocalization }}</label>\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n formControlName=\"url\"\r\n [disabled]=\"isPageSelected\"\r\n (input)=\"onUrlInput()\"\r\n />\r\n </div>\r\n </ng-template>\r\n </li>\r\n <li ngbNavItem=\"page\">\r\n <a ngbNavLink>{{ 'CmsKit::Page' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <label class=\"form-label\">{{ 'CmsKit::Page' | abpLocalization }}</label>\r\n <div\r\n class=\"position-relative\"\r\n ngbDropdown\r\n #pageDropdown=\"ngbDropdown\"\r\n display=\"static\"\r\n (openChange)=\"onDropdownOpen()\"\r\n >\r\n <button\r\n class=\"form-select form-control text-start d-flex align-items-center justify-content-between\"\r\n type=\"button\"\r\n id=\"pageSelectDropdown\"\r\n ngbDropdownToggle\r\n [class.text-muted]=\"!selectedPage\"\r\n >\r\n <span>{{ selectedPage?.title || ('CmsKit::Page' | abpLocalization) }}</span>\r\n </button>\r\n <div\r\n class=\"dropdown-menu w-100\"\r\n ngbDropdownMenu\r\n aria-labelledby=\"pageSelectDropdown\"\r\n style=\"max-height: 300px; overflow-y: auto\"\r\n >\r\n <div class=\"p-2 border-bottom\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n [(ngModel)]=\"pageSearchText\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (input)=\"onPageSearchChange($any($event.target).value)\"\r\n (click)=\"$event.stopPropagation()\"\r\n placeholder=\"{{ 'AbpUi::Search' | abpLocalization }}\"\r\n autocomplete=\"off\"\r\n />\r\n </div>\r\n @if (filteredPages.length > 0) {\r\n @for (page of filteredPages; track page.id) {\r\n <button\r\n type=\"button\"\r\n class=\"dropdown-item\"\r\n (click)=\"selectPage(page); pageDropdown.close()\"\r\n >\r\n {{ page.title }}\r\n </button>\r\n }\r\n } @else if (pageSearchText && pageSearchText.length > 0) {\r\n <div class=\"dropdown-item text-muted\">\r\n {{ 'No results found' }}\r\n </div>\r\n } @else if (pages.length === 0) {\r\n <div class=\"dropdown-item text-muted\">\r\n {{ 'No pages found' }}\r\n </div>\r\n }\r\n @if (selectedPage) {\r\n <div class=\"dropdown-divider\"></div>\r\n <button\r\n type=\"button\"\r\n class=\"dropdown-item text-danger\"\r\n (click)=\"clearPageSelection(); pageDropdown.close()\"\r\n >\r\n {{ 'AbpUi::Clear' | abpLocalization }}\r\n </button>\r\n }\r\n </div>\r\n <input [formControlName]=\"'pageId'\" type=\"hidden\" />\r\n </div>\r\n </div>\r\n </ng-template>\r\n </li>\r\n </ul>\r\n <div class=\"mt-2 fade-in-top\" [ngbNavOutlet]=\"nav\"></div>\r\n <hr />\r\n <abp-extensible-form [selectedRecord]=\"selected() || {}\" />\r\n </form>\r\n }\r\n </ng-template>\r\n\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-outline-primary\" abpClose>\r\n {{ 'AbpUi::Cancel' | abpLocalization }}\r\n </button>\r\n <abp-button (click)=\"save()\" [disabled]=\"form?.invalid\">\r\n {{ 'AbpUi::Save' | abpLocalization }}\r\n </abp-button>\r\n </ng-template>\r\n</abp-modal>\r\n", styles: [".dropdown-toggle:after{display:none!important}\n"] }]
1601
+ ], template: "<abp-modal [visible]=\"visible()\" (visibleChange)=\"onVisibleChange($event)\">\r\n <ng-template #abpHeader>\r\n <h3>\r\n @if (selected()?.id) {\r\n {{ 'AbpUi::Edit' | abpLocalization }}\r\n } @else {\r\n {{ 'AbpUi::New' | abpLocalization }}\r\n }\r\n </h3>\r\n </ng-template>\r\n\r\n <ng-template #abpBody>\r\n @if (form) {\r\n <form [formGroup]=\"form\" (ngSubmit)=\"save()\" [validateOnSubmit]=\"true\">\r\n <ul\r\n ngbNav\r\n #nav=\"ngbNav\"\r\n class=\"nav-tabs\"\r\n [activeId]=\"activeTab()\"\r\n (activeIdChange)=\"onTabChange($event)\"\r\n >\r\n <li ngbNavItem=\"url\">\r\n <a ngbNavLink>{{ 'CmsKit::Url' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <label class=\"form-label\">{{ 'CmsKit::Url' | abpLocalization }}</label>\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n formControlName=\"url\"\r\n [disabled]=\"isPageSelected\"\r\n (input)=\"onUrlInput()\"\r\n />\r\n </div>\r\n </ng-template>\r\n </li>\r\n <li ngbNavItem=\"page\">\r\n <a ngbNavLink>{{ 'CmsKit::Page' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <label class=\"form-label\">{{ 'CmsKit::Page' | abpLocalization }}</label>\r\n <div\r\n class=\"position-relative\"\r\n ngbDropdown\r\n #pageDropdown=\"ngbDropdown\"\r\n display=\"static\"\r\n (openChange)=\"onDropdownOpen()\"\r\n >\r\n <button\r\n class=\"form-select form-control text-start d-flex align-items-center justify-content-between\"\r\n type=\"button\"\r\n id=\"pageSelectDropdown\"\r\n ngbDropdownToggle\r\n [class.text-muted]=\"!selectedPage()\"\r\n >\r\n <span>{{ selectedPage()?.title || ('CmsKit::Page' | abpLocalization) }}</span>\r\n </button>\r\n <div\r\n class=\"dropdown-menu w-100\"\r\n ngbDropdownMenu\r\n aria-labelledby=\"pageSelectDropdown\"\r\n style=\"max-height: 300px; overflow-y: auto\"\r\n >\r\n <div class=\"p-2 border-bottom\">\r\n <input\r\n type=\"text\"\r\n class=\"form-control form-control-sm\"\r\n [ngModel]=\"pageSearchText()\"\r\n (ngModelChange)=\"onPageSearchChange($event)\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n (click)=\"$event.stopPropagation()\"\r\n placeholder=\"{{ 'AbpUi::Search' | abpLocalization }}\"\r\n autocomplete=\"off\"\r\n />\r\n </div>\r\n @if (filteredPages().length > 0) {\r\n @for (page of filteredPages(); track page.id) {\r\n <button\r\n type=\"button\"\r\n class=\"dropdown-item\"\r\n (click)=\"selectPage(page); pageDropdown.close()\"\r\n >\r\n {{ page.title }}\r\n </button>\r\n }\r\n } @else if (pageSearchText() && pageSearchText().length > 0) {\r\n <div class=\"dropdown-item text-muted\">\r\n {{ 'No results found' }}\r\n </div>\r\n } @else if (pages().length === 0) {\r\n <div class=\"dropdown-item text-muted\">\r\n {{ 'No pages found' }}\r\n </div>\r\n }\r\n @if (selectedPage()) {\r\n <div class=\"dropdown-divider\"></div>\r\n <button\r\n type=\"button\"\r\n class=\"dropdown-item text-danger\"\r\n (click)=\"clearPageSelection(); pageDropdown.close()\"\r\n >\r\n {{ 'AbpUi::Clear' | abpLocalization }}\r\n </button>\r\n }\r\n </div>\r\n <input [formControlName]=\"'pageId'\" type=\"hidden\" />\r\n </div>\r\n </div>\r\n </ng-template>\r\n </li>\r\n </ul>\r\n <div class=\"mt-2 fade-in-top\" [ngbNavOutlet]=\"nav\"></div>\r\n <hr />\r\n <abp-extensible-form [selectedRecord]=\"selected() || {}\" />\r\n </form>\r\n }\r\n </ng-template>\r\n\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-outline-primary\" abpClose>\r\n {{ 'AbpUi::Cancel' | abpLocalization }}\r\n </button>\r\n <abp-button (click)=\"save()\" [disabled]=\"form?.invalid\">\r\n {{ 'AbpUi::Save' | abpLocalization }}\r\n </abp-button>\r\n </ng-template>\r\n</abp-modal>\r\n", styles: [".dropdown-toggle:after{display:none!important}\n"] }]
1625
1602
  }], propDecorators: { selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }], parentId: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentId", required: false }] }], visible: [{ type: i0.Input, args: [{ isSignal: true, alias: "visible", required: false }] }], visibleChange: [{ type: i0.Output, args: ["visibleChange"] }] } });
1626
1603
 
1627
1604
  class MenuItemListComponent {
1628
1605
  constructor() {
1629
1606
  this.menuItemService = inject(MenuItemAdminService);
1630
1607
  this.confirmationService = inject(ConfirmationService);
1631
- this.nodes = [];
1632
- this.selectedNode = null;
1633
- this.expandedKeys = [];
1634
- this.draggable = true;
1635
- this.isModalVisible = false;
1636
- this.selectedMenuItem = null;
1637
- this.parentId = null;
1608
+ this.nodes = signal([], /* @ts-ignore */
1609
+ ...(ngDevMode ? [{ debugName: "nodes" }] : /* istanbul ignore next */ []));
1610
+ this.selectedNode = signal(null, /* @ts-ignore */
1611
+ ...(ngDevMode ? [{ debugName: "selectedNode" }] : /* istanbul ignore next */ []));
1612
+ this.expandedKeys = signal([], /* @ts-ignore */
1613
+ ...(ngDevMode ? [{ debugName: "expandedKeys" }] : /* istanbul ignore next */ []));
1614
+ this.draggable = signal(true, /* @ts-ignore */
1615
+ ...(ngDevMode ? [{ debugName: "draggable" }] : /* istanbul ignore next */ []));
1616
+ this.isModalVisible = signal(false, /* @ts-ignore */
1617
+ ...(ngDevMode ? [{ debugName: "isModalVisible" }] : /* istanbul ignore next */ []));
1618
+ this.selectedMenuItem = signal(null, /* @ts-ignore */
1619
+ ...(ngDevMode ? [{ debugName: "selectedMenuItem" }] : /* istanbul ignore next */ []));
1620
+ this.parentId = signal(null, /* @ts-ignore */
1621
+ ...(ngDevMode ? [{ debugName: "parentId" }] : /* istanbul ignore next */ []));
1638
1622
  this.beforeDrop = (event) => {
1639
1623
  return of(true);
1640
1624
  };
@@ -1645,19 +1629,19 @@ class MenuItemListComponent {
1645
1629
  loadMenuItems() {
1646
1630
  this.menuItemService.getList().subscribe(result => {
1647
1631
  if (result.items && result.items.length > 0) {
1648
- this.nodes = this.buildTreeNodes(result.items);
1649
- // Expand all nodes by default
1650
- this.expandedKeys = this.nodes.map(n => n.key);
1632
+ const treeNodes = this.buildTreeNodes(result.items);
1633
+ this.nodes.set(treeNodes);
1634
+ this.expandedKeys.set(treeNodes.map(n => n.key));
1651
1635
  }
1652
1636
  else {
1653
- this.nodes = [];
1637
+ this.nodes.set([]);
1638
+ this.expandedKeys.set([]);
1654
1639
  }
1655
1640
  });
1656
1641
  }
1657
1642
  buildTreeNodes(items) {
1658
1643
  const nodeMap = new Map();
1659
1644
  const rootNodes = [];
1660
- // First pass: create all nodes
1661
1645
  items.forEach(item => {
1662
1646
  const node = {
1663
1647
  key: item.id,
@@ -1668,7 +1652,6 @@ class MenuItemListComponent {
1668
1652
  };
1669
1653
  nodeMap.set(item.id, node);
1670
1654
  });
1671
- // Second pass: build tree structure
1672
1655
  items.forEach(item => {
1673
1656
  const node = nodeMap.get(item.id);
1674
1657
  if (item.parentId) {
@@ -1685,7 +1668,6 @@ class MenuItemListComponent {
1685
1668
  rootNodes.push(node);
1686
1669
  }
1687
1670
  });
1688
- // Sort by order
1689
1671
  const sortByOrder = (nodes) => {
1690
1672
  nodes.sort((a, b) => (a.entity.order || 0) - (b.entity.order || 0));
1691
1673
  nodes.forEach(node => {
@@ -1698,7 +1680,7 @@ class MenuItemListComponent {
1698
1680
  return rootNodes;
1699
1681
  }
1700
1682
  onSelectedNodeChange(node) {
1701
- this.selectedNode = node?.entity || null;
1683
+ this.selectedNode.set(node?.entity || null);
1702
1684
  }
1703
1685
  onDrop(event) {
1704
1686
  const node = event.dragNode?.origin?.entity;
@@ -1723,36 +1705,30 @@ class MenuItemListComponent {
1723
1705
  position: position,
1724
1706
  };
1725
1707
  this.menuItemService.moveMenuItem(node.id, input).subscribe({
1726
- next: () => {
1727
- this.loadMenuItems();
1728
- },
1729
- error: () => {
1730
- // Reload to rollback
1731
- this.loadMenuItems();
1732
- },
1708
+ next: () => this.loadMenuItems(),
1709
+ error: () => this.loadMenuItems(),
1733
1710
  });
1734
1711
  }
1735
1712
  else {
1736
- // Reload to rollback
1737
1713
  this.loadMenuItems();
1738
1714
  }
1739
1715
  });
1740
1716
  }
1741
1717
  add() {
1742
- this.selectedMenuItem = null;
1743
- this.parentId = null;
1744
- this.isModalVisible = true;
1718
+ this.selectedMenuItem.set(null);
1719
+ this.parentId.set(null);
1720
+ this.isModalVisible.set(true);
1745
1721
  }
1746
1722
  addSubMenuItem(parentId) {
1747
- this.selectedMenuItem = null;
1748
- this.parentId = parentId || null;
1749
- this.isModalVisible = true;
1723
+ this.selectedMenuItem.set(null);
1724
+ this.parentId.set(parentId || null);
1725
+ this.isModalVisible.set(true);
1750
1726
  }
1751
1727
  edit(id) {
1752
1728
  this.menuItemService.get(id).subscribe(menuItem => {
1753
- this.selectedMenuItem = menuItem;
1754
- this.parentId = null;
1755
- this.isModalVisible = true;
1729
+ this.selectedMenuItem.set(menuItem);
1730
+ this.parentId.set(null);
1731
+ this.isModalVisible.set(true);
1756
1732
  });
1757
1733
  }
1758
1734
  onVisibleModalChange(visibilityChange) {
@@ -1762,9 +1738,9 @@ class MenuItemListComponent {
1762
1738
  if (visibilityChange.refresh) {
1763
1739
  this.loadMenuItems();
1764
1740
  }
1765
- this.selectedMenuItem = null;
1766
- this.parentId = null;
1767
- this.isModalVisible = false;
1741
+ this.selectedMenuItem.set(null);
1742
+ this.parentId.set(null);
1743
+ this.isModalVisible.set(false);
1768
1744
  }
1769
1745
  delete(id, displayName) {
1770
1746
  this.confirmationService
@@ -1776,25 +1752,23 @@ class MenuItemListComponent {
1776
1752
  .subscribe((status) => {
1777
1753
  if (status === Confirmation.Status.confirm) {
1778
1754
  this.menuItemService.delete(id).subscribe({
1779
- next: () => {
1780
- this.loadMenuItems();
1781
- },
1755
+ next: () => this.loadMenuItems(),
1782
1756
  });
1783
1757
  }
1784
1758
  });
1785
1759
  }
1786
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: MenuItemListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1787
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: MenuItemListComponent, isStandalone: true, selector: "abp-menu-item-list", providers: [
1760
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: MenuItemListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1761
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: MenuItemListComponent, isStandalone: true, selector: "abp-menu-item-list", providers: [
1788
1762
  ListService,
1789
1763
  {
1790
1764
  provide: EXTENSIONS_IDENTIFIER,
1791
1765
  useValue: eCmsKitAdminComponents.Menus,
1792
1766
  },
1793
- ], ngImport: i0, template: "<abp-page [title]=\"'CmsKit::MenuItems' | abpLocalization\" [toolbar]=\"nodes\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n @if (nodes.length > 0) {\r\n <abp-tree\r\n [nodes]=\"nodes\"\r\n [draggable]=\"draggable\"\r\n [expandedKeys]=\"expandedKeys\"\r\n [selectedNode]=\"selectedNode\"\r\n (selectedNodeChange)=\"onSelectedNodeChange($event)\"\r\n [beforeDrop]=\"beforeDrop\"\r\n (dropOver)=\"onDrop($event)\"\r\n >\r\n <ng-template #menu let-node>\r\n <button\r\n class=\"dropdown-item\"\r\n (click)=\"edit(node.key)\"\r\n *abpPermission=\"'CmsKit.Menus.Update'\"\r\n >\r\n <i class=\"fa fa-pencil me-2\"></i>\r\n {{ 'AbpUi::Edit' | abpLocalization }}\r\n </button>\r\n <button\r\n class=\"dropdown-item\"\r\n (click)=\"addSubMenuItem(node.key)\"\r\n *abpPermission=\"'CmsKit.Menus.Create'\"\r\n >\r\n <i class=\"fa fa-plus me-2\"></i>\r\n {{ 'CmsKit::AddSubMenuItem' | abpLocalization }}\r\n </button>\r\n <button\r\n class=\"dropdown-item\"\r\n (click)=\"delete(node.key, node.title)\"\r\n *abpPermission=\"'CmsKit.Menus.Delete'\"\r\n >\r\n <i class=\"fa fa-remove me-2\"></i>\r\n {{ 'AbpUi::Delete' | abpLocalization }}\r\n </button>\r\n </ng-template>\r\n </abp-tree>\r\n } @else {\r\n <div class=\"text-muted text-center\">\r\n {{ 'CmsKit::NoMenuItems' | abpLocalization }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</abp-page>\r\n\r\n@if (isModalVisible) {\r\n <abp-menu-item-modal\r\n [selected]=\"selectedMenuItem || undefined\"\r\n [parentId]=\"parentId\"\r\n (visibleChange)=\"onVisibleModalChange($event)\"\r\n />\r\n}\r\n", dependencies: [{ kind: "component", type: PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }, { kind: "component", type: TreeComponent, selector: "abp-tree", inputs: ["noAnimation", "draggable", "checkable", "checkStrictly", "checkedKeys", "nodes", "expandedKeys", "selectedNode", "changeCheckboxWithNode", "isNodeSelected", "beforeDrop"], outputs: ["checkedKeysChange", "expandedKeysChange", "selectedNodeChange", "dropOver", "nzExpandChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: MenuItemModalComponent, selector: "abp-menu-item-modal", inputs: ["selected", "parentId", "visible"], outputs: ["visibleChange"] }, { kind: "directive", type: PermissionDirective, selector: "[abpPermission]", inputs: ["abpPermission", "abpPermissionRunChangeDetection"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }] }); }
1767
+ ], ngImport: i0, template: "<abp-page [title]=\"'CmsKit::MenuItems' | abpLocalization\" [toolbar]=\"nodes()\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n @if (nodes().length > 0) {\r\n <abp-tree\r\n [nodes]=\"nodes()\"\r\n [draggable]=\"draggable()\"\r\n [expandedKeys]=\"expandedKeys()\"\r\n [selectedNode]=\"selectedNode()\"\r\n (selectedNodeChange)=\"onSelectedNodeChange($event)\"\r\n [beforeDrop]=\"beforeDrop\"\r\n (dropOver)=\"onDrop($event)\"\r\n >\r\n <ng-template #menu let-node>\r\n <button\r\n class=\"dropdown-item\"\r\n (click)=\"edit(node.key)\"\r\n *abpPermission=\"'CmsKit.Menus.Update'\"\r\n >\r\n <i class=\"fa fa-pencil me-2\"></i>\r\n {{ 'AbpUi::Edit' | abpLocalization }}\r\n </button>\r\n <button\r\n class=\"dropdown-item\"\r\n (click)=\"addSubMenuItem(node.key)\"\r\n *abpPermission=\"'CmsKit.Menus.Create'\"\r\n >\r\n <i class=\"fa fa-plus me-2\"></i>\r\n {{ 'CmsKit::AddSubMenuItem' | abpLocalization }}\r\n </button>\r\n <button\r\n class=\"dropdown-item\"\r\n (click)=\"delete(node.key, node.title)\"\r\n *abpPermission=\"'CmsKit.Menus.Delete'\"\r\n >\r\n <i class=\"fa fa-remove me-2\"></i>\r\n {{ 'AbpUi::Delete' | abpLocalization }}\r\n </button>\r\n </ng-template>\r\n </abp-tree>\r\n } @else {\r\n <div class=\"text-muted text-center\">\r\n {{ 'CmsKit::NoMenuItems' | abpLocalization }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</abp-page>\r\n\r\n@if (isModalVisible()) {\r\n <abp-menu-item-modal\r\n [selected]=\"selectedMenuItem() || undefined\"\r\n [parentId]=\"parentId()\"\r\n (visibleChange)=\"onVisibleModalChange($event)\"\r\n />\r\n}\r\n", dependencies: [{ kind: "component", type: PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }, { kind: "component", type: TreeComponent, selector: "abp-tree", inputs: ["noAnimation", "draggable", "checkable", "checkStrictly", "checkedKeys", "nodes", "expandedKeys", "selectedNode", "changeCheckboxWithNode", "isNodeSelected", "beforeDrop"], outputs: ["checkedKeysChange", "expandedKeysChange", "selectedNodeChange", "dropOver", "nzExpandChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: MenuItemModalComponent, selector: "abp-menu-item-modal", inputs: ["selected", "parentId", "visible"], outputs: ["visibleChange"] }, { kind: "directive", type: PermissionDirective, selector: "[abpPermission]", inputs: ["abpPermission", "abpPermissionRunChangeDetection"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1794
1768
  }
1795
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: MenuItemListComponent, decorators: [{
1769
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: MenuItemListComponent, decorators: [{
1796
1770
  type: Component,
1797
- args: [{ selector: 'abp-menu-item-list', imports: [
1771
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'abp-menu-item-list', imports: [
1798
1772
  PageComponent,
1799
1773
  TreeComponent,
1800
1774
  LocalizationPipe,
@@ -1807,7 +1781,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
1807
1781
  provide: EXTENSIONS_IDENTIFIER,
1808
1782
  useValue: eCmsKitAdminComponents.Menus,
1809
1783
  },
1810
- ], template: "<abp-page [title]=\"'CmsKit::MenuItems' | abpLocalization\" [toolbar]=\"nodes\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n @if (nodes.length > 0) {\r\n <abp-tree\r\n [nodes]=\"nodes\"\r\n [draggable]=\"draggable\"\r\n [expandedKeys]=\"expandedKeys\"\r\n [selectedNode]=\"selectedNode\"\r\n (selectedNodeChange)=\"onSelectedNodeChange($event)\"\r\n [beforeDrop]=\"beforeDrop\"\r\n (dropOver)=\"onDrop($event)\"\r\n >\r\n <ng-template #menu let-node>\r\n <button\r\n class=\"dropdown-item\"\r\n (click)=\"edit(node.key)\"\r\n *abpPermission=\"'CmsKit.Menus.Update'\"\r\n >\r\n <i class=\"fa fa-pencil me-2\"></i>\r\n {{ 'AbpUi::Edit' | abpLocalization }}\r\n </button>\r\n <button\r\n class=\"dropdown-item\"\r\n (click)=\"addSubMenuItem(node.key)\"\r\n *abpPermission=\"'CmsKit.Menus.Create'\"\r\n >\r\n <i class=\"fa fa-plus me-2\"></i>\r\n {{ 'CmsKit::AddSubMenuItem' | abpLocalization }}\r\n </button>\r\n <button\r\n class=\"dropdown-item\"\r\n (click)=\"delete(node.key, node.title)\"\r\n *abpPermission=\"'CmsKit.Menus.Delete'\"\r\n >\r\n <i class=\"fa fa-remove me-2\"></i>\r\n {{ 'AbpUi::Delete' | abpLocalization }}\r\n </button>\r\n </ng-template>\r\n </abp-tree>\r\n } @else {\r\n <div class=\"text-muted text-center\">\r\n {{ 'CmsKit::NoMenuItems' | abpLocalization }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</abp-page>\r\n\r\n@if (isModalVisible) {\r\n <abp-menu-item-modal\r\n [selected]=\"selectedMenuItem || undefined\"\r\n [parentId]=\"parentId\"\r\n (visibleChange)=\"onVisibleModalChange($event)\"\r\n />\r\n}\r\n" }]
1784
+ ], template: "<abp-page [title]=\"'CmsKit::MenuItems' | abpLocalization\" [toolbar]=\"nodes()\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n @if (nodes().length > 0) {\r\n <abp-tree\r\n [nodes]=\"nodes()\"\r\n [draggable]=\"draggable()\"\r\n [expandedKeys]=\"expandedKeys()\"\r\n [selectedNode]=\"selectedNode()\"\r\n (selectedNodeChange)=\"onSelectedNodeChange($event)\"\r\n [beforeDrop]=\"beforeDrop\"\r\n (dropOver)=\"onDrop($event)\"\r\n >\r\n <ng-template #menu let-node>\r\n <button\r\n class=\"dropdown-item\"\r\n (click)=\"edit(node.key)\"\r\n *abpPermission=\"'CmsKit.Menus.Update'\"\r\n >\r\n <i class=\"fa fa-pencil me-2\"></i>\r\n {{ 'AbpUi::Edit' | abpLocalization }}\r\n </button>\r\n <button\r\n class=\"dropdown-item\"\r\n (click)=\"addSubMenuItem(node.key)\"\r\n *abpPermission=\"'CmsKit.Menus.Create'\"\r\n >\r\n <i class=\"fa fa-plus me-2\"></i>\r\n {{ 'CmsKit::AddSubMenuItem' | abpLocalization }}\r\n </button>\r\n <button\r\n class=\"dropdown-item\"\r\n (click)=\"delete(node.key, node.title)\"\r\n *abpPermission=\"'CmsKit.Menus.Delete'\"\r\n >\r\n <i class=\"fa fa-remove me-2\"></i>\r\n {{ 'AbpUi::Delete' | abpLocalization }}\r\n </button>\r\n </ng-template>\r\n </abp-tree>\r\n } @else {\r\n <div class=\"text-muted text-center\">\r\n {{ 'CmsKit::NoMenuItems' | abpLocalization }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</abp-page>\r\n\r\n@if (isModalVisible()) {\r\n <abp-menu-item-modal\r\n [selected]=\"selectedMenuItem() || undefined\"\r\n [parentId]=\"parentId()\"\r\n (visibleChange)=\"onVisibleModalChange($event)\"\r\n />\r\n}\r\n" }]
1811
1785
  }] });
1812
1786
 
1813
1787
  class CmsSettingsComponent {
@@ -1815,6 +1789,8 @@ class CmsSettingsComponent {
1815
1789
  this.commentAdminService = inject(CommentAdminService);
1816
1790
  this.configState = inject(ConfigStateService);
1817
1791
  this.toaster = inject(ToasterService);
1792
+ this.loading = signal(false, /* @ts-ignore */
1793
+ ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
1818
1794
  this.commentApprovalControl = new FormControl(false);
1819
1795
  }
1820
1796
  ngOnInit() {
@@ -1822,17 +1798,19 @@ class CmsSettingsComponent {
1822
1798
  this.commentApprovalControl.setValue(isCommentApprovalEnabled);
1823
1799
  }
1824
1800
  submit() {
1801
+ this.loading.set(true);
1825
1802
  this.commentAdminService
1826
1803
  .updateSettings({ commentRequireApprovement: this.commentApprovalControl.value })
1827
1804
  .pipe(finalize(() => {
1805
+ this.loading.set(false);
1828
1806
  this.configState.refreshAppState().subscribe();
1829
1807
  }))
1830
1808
  .subscribe(() => this.toaster.success('AbpUi::SavedSuccessfully', null));
1831
1809
  }
1832
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: CmsSettingsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1833
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.17", type: CmsSettingsComponent, isStandalone: true, selector: "abp-cms-settings", ngImport: i0, template: "<div id=\"CmsSettingsForm\" class=\"row\">\r\n <div class=\"col-md-12\">\r\n <ul ngbNav #nav=\"ngbNav\" class=\"nav-tabs\">\r\n <!-- Comments -->\r\n <li ngbNavItem>\r\n <a ngbNavLink>{{ 'CmsKit::CmsKit:Comment' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"abp-md-form\">\r\n <div (keyup.enter)=\"submit()\">\r\n <div class=\"mt-3\">\r\n <div class=\"form-check mb-2\">\r\n <input\r\n class=\"form-check-input\"\r\n [formControl]=\"commentApprovalControl\"\r\n type=\"checkbox\"\r\n id=\"EnableCommentApproval\"\r\n [checked]=\"commentApprovalControl.value\"\r\n (input)=\"commentApprovalControl.setValue($event.target.checked)\"\r\n />\r\n <label class=\"form-check-label\" for=\"EnableCommentApproval\">\r\n {{ 'CmsKit::CmsKitCommentOptions:RequireApprovement' | abpLocalization }}\r\n </label>\r\n <br />\r\n <small class=\"form-text text-muted\">{{\r\n 'CmsKit::CmsKitCommentOptions:RequireApprovementDescription' | abpLocalization\r\n }}</small>\r\n </div>\r\n </div>\r\n <hr class=\"my-3\" />\r\n <div>\r\n <abp-button (click)=\"submit()\" iconClass=\"fa fa-save\" [loading]=\"loading\">\r\n {{ 'AbpAccount::Save' | abpLocalization }}\r\n </abp-button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </li>\r\n </ul>\r\n <div [ngbNavOutlet]=\"nav\"></div>\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "directive", type: NgbNav, selector: "[ngbNav]", inputs: ["activeId", "animation", "destroyOnHide", "orientation", "roles", "keyboard"], outputs: ["activeIdChange", "shown", "hidden", "navChange"], exportAs: ["ngbNav"] }, { kind: "directive", type: NgbNavItem, selector: "[ngbNavItem]", inputs: ["destroyOnHide", "disabled", "domId", "ngbNavItem"], outputs: ["shown", "hidden"], exportAs: ["ngbNavItem"] }, { kind: "directive", type: NgbNavItemRole, selector: "[ngbNavItem]:not(ng-container)" }, { kind: "directive", type: NgbNavLink, selector: "a[ngbNavLink]" }, { kind: "directive", type: NgbNavLinkBase, selector: "[ngbNavLink]" }, { kind: "directive", type: NgbNavContent, selector: "ng-template[ngbNavContent]" }, { kind: "component", type: NgbNavOutlet, selector: "[ngbNavOutlet]", inputs: ["paneRole", "ngbNavOutlet"] }, { kind: "component", type: ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1810
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CmsSettingsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1811
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.5", type: CmsSettingsComponent, isStandalone: true, selector: "abp-cms-settings", ngImport: i0, template: "<div id=\"CmsSettingsForm\" class=\"row\">\r\n <div class=\"col-md-12\">\r\n <ul ngbNav #nav=\"ngbNav\" class=\"nav-tabs\">\r\n <!-- Comments -->\r\n <li ngbNavItem>\r\n <a ngbNavLink>{{ 'CmsKit::CmsKit:Comment' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"abp-md-form\">\r\n <div (keyup.enter)=\"submit()\">\r\n <div class=\"mt-3\">\r\n <div class=\"form-check mb-2\">\r\n <input\r\n class=\"form-check-input\"\r\n [formControl]=\"commentApprovalControl\"\r\n type=\"checkbox\"\r\n id=\"EnableCommentApproval\"\r\n [checked]=\"commentApprovalControl.value\"\r\n (input)=\"commentApprovalControl.setValue($event.target.checked)\"\r\n />\r\n <label class=\"form-check-label\" for=\"EnableCommentApproval\">\r\n {{ 'CmsKit::CmsKitCommentOptions:RequireApprovement' | abpLocalization }}\r\n </label>\r\n <br />\r\n <small class=\"form-text text-muted\">{{\r\n 'CmsKit::CmsKitCommentOptions:RequireApprovementDescription' | abpLocalization\r\n }}</small>\r\n </div>\r\n </div>\r\n <hr class=\"my-3\" />\r\n <div>\r\n <abp-button (click)=\"submit()\" iconClass=\"fa fa-save\" [loading]=\"loading()\">\r\n {{ 'AbpAccount::Save' | abpLocalization }}\r\n </abp-button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </li>\r\n </ul>\r\n <div [ngbNavOutlet]=\"nav\"></div>\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "directive", type: NgbNav, selector: "[ngbNav]", inputs: ["activeId", "animation", "destroyOnHide", "orientation", "roles", "keyboard"], outputs: ["activeIdChange", "shown", "hidden", "navChange"], exportAs: ["ngbNav"] }, { kind: "directive", type: NgbNavItem, selector: "[ngbNavItem]", inputs: ["destroyOnHide", "disabled", "domId", "ngbNavItem"], outputs: ["shown", "hidden"], exportAs: ["ngbNavItem"] }, { kind: "directive", type: NgbNavItemRole, selector: "[ngbNavItem]:not(ng-container)" }, { kind: "directive", type: NgbNavLink, selector: "a[ngbNavLink]" }, { kind: "directive", type: NgbNavLinkBase, selector: "[ngbNavLink]" }, { kind: "directive", type: NgbNavContent, selector: "ng-template[ngbNavContent]" }, { kind: "component", type: NgbNavOutlet, selector: "[ngbNavOutlet]", inputs: ["paneRole", "ngbNavOutlet"] }, { kind: "component", type: ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.CheckboxControlValueAccessor, selector: "input[type=checkbox]:not([ngNoCva])[formControlName],input[type=checkbox]:not([ngNoCva])[formControl],input[type=checkbox]:not([ngNoCva])[ngModel]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1834
1812
  }
1835
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: CmsSettingsComponent, decorators: [{
1813
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CmsSettingsComponent, decorators: [{
1836
1814
  type: Component,
1837
1815
  args: [{ selector: 'abp-cms-settings', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
1838
1816
  NgbNav,
@@ -1845,7 +1823,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
1845
1823
  LocalizationPipe,
1846
1824
  ButtonComponent,
1847
1825
  ReactiveFormsModule,
1848
- ], template: "<div id=\"CmsSettingsForm\" class=\"row\">\r\n <div class=\"col-md-12\">\r\n <ul ngbNav #nav=\"ngbNav\" class=\"nav-tabs\">\r\n <!-- Comments -->\r\n <li ngbNavItem>\r\n <a ngbNavLink>{{ 'CmsKit::CmsKit:Comment' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"abp-md-form\">\r\n <div (keyup.enter)=\"submit()\">\r\n <div class=\"mt-3\">\r\n <div class=\"form-check mb-2\">\r\n <input\r\n class=\"form-check-input\"\r\n [formControl]=\"commentApprovalControl\"\r\n type=\"checkbox\"\r\n id=\"EnableCommentApproval\"\r\n [checked]=\"commentApprovalControl.value\"\r\n (input)=\"commentApprovalControl.setValue($event.target.checked)\"\r\n />\r\n <label class=\"form-check-label\" for=\"EnableCommentApproval\">\r\n {{ 'CmsKit::CmsKitCommentOptions:RequireApprovement' | abpLocalization }}\r\n </label>\r\n <br />\r\n <small class=\"form-text text-muted\">{{\r\n 'CmsKit::CmsKitCommentOptions:RequireApprovementDescription' | abpLocalization\r\n }}</small>\r\n </div>\r\n </div>\r\n <hr class=\"my-3\" />\r\n <div>\r\n <abp-button (click)=\"submit()\" iconClass=\"fa fa-save\" [loading]=\"loading\">\r\n {{ 'AbpAccount::Save' | abpLocalization }}\r\n </abp-button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </li>\r\n </ul>\r\n <div [ngbNavOutlet]=\"nav\"></div>\r\n </div>\r\n</div>\r\n" }]
1826
+ ], template: "<div id=\"CmsSettingsForm\" class=\"row\">\r\n <div class=\"col-md-12\">\r\n <ul ngbNav #nav=\"ngbNav\" class=\"nav-tabs\">\r\n <!-- Comments -->\r\n <li ngbNavItem>\r\n <a ngbNavLink>{{ 'CmsKit::CmsKit:Comment' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"abp-md-form\">\r\n <div (keyup.enter)=\"submit()\">\r\n <div class=\"mt-3\">\r\n <div class=\"form-check mb-2\">\r\n <input\r\n class=\"form-check-input\"\r\n [formControl]=\"commentApprovalControl\"\r\n type=\"checkbox\"\r\n id=\"EnableCommentApproval\"\r\n [checked]=\"commentApprovalControl.value\"\r\n (input)=\"commentApprovalControl.setValue($event.target.checked)\"\r\n />\r\n <label class=\"form-check-label\" for=\"EnableCommentApproval\">\r\n {{ 'CmsKit::CmsKitCommentOptions:RequireApprovement' | abpLocalization }}\r\n </label>\r\n <br />\r\n <small class=\"form-text text-muted\">{{\r\n 'CmsKit::CmsKitCommentOptions:RequireApprovementDescription' | abpLocalization\r\n }}</small>\r\n </div>\r\n </div>\r\n <hr class=\"my-3\" />\r\n <div>\r\n <abp-button (click)=\"submit()\" iconClass=\"fa fa-save\" [loading]=\"loading()\">\r\n {{ 'AbpAccount::Save' | abpLocalization }}\r\n </abp-button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </li>\r\n </ul>\r\n <div [ngbNavOutlet]=\"nav\"></div>\r\n </div>\r\n</div>\r\n" }]
1849
1827
  }] });
1850
1828
 
1851
1829
  class GlobalResourcesComponent {
@@ -1853,7 +1831,8 @@ class GlobalResourcesComponent {
1853
1831
  this.globalResourceService = inject(GlobalResourceAdminService);
1854
1832
  this.toasterService = inject(ToasterService);
1855
1833
  this.destroyRef = inject(DestroyRef);
1856
- this.activeTab = 'script';
1834
+ this.activeTab = signal('script', /* @ts-ignore */
1835
+ ...(ngDevMode ? [{ debugName: "activeTab" }] : /* istanbul ignore next */ []));
1857
1836
  }
1858
1837
  ngOnInit() {
1859
1838
  this.buildForm();
@@ -1882,7 +1861,7 @@ class GlobalResourcesComponent {
1882
1861
  });
1883
1862
  }
1884
1863
  onTabChange(activeId) {
1885
- this.activeTab = activeId;
1864
+ this.activeTab.set(activeId);
1886
1865
  }
1887
1866
  save() {
1888
1867
  if (!this.form.valid) {
@@ -1905,12 +1884,12 @@ class GlobalResourcesComponent {
1905
1884
  },
1906
1885
  });
1907
1886
  }
1908
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: GlobalResourcesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1909
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.17", type: GlobalResourcesComponent, isStandalone: true, selector: "abp-global-resources", ngImport: i0, template: "<abp-page [title]=\"'CmsKit::GlobalResources' | abpLocalization\">\r\n <form [formGroup]=\"form\" (ngSubmit)=\"save()\" validateOnSubmit>\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n <ul\r\n ngbNav\r\n #nav=\"ngbNav\"\r\n class=\"nav-tabs\"\r\n [(activeId)]=\"activeTab\"\r\n (activeIdChange)=\"onTabChange($event)\"\r\n >\r\n <li ngbNavItem=\"script\">\r\n <a ngbNavLink>{{ 'CmsKit::Script' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <abp-codemirror-editor formControlName=\"script\" />\r\n </div>\r\n </ng-template>\r\n </li>\r\n <li ngbNavItem=\"style\">\r\n <a ngbNavLink>{{ 'CmsKit::Style' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <abp-codemirror-editor formControlName=\"style\" />\r\n </div>\r\n </ng-template>\r\n </li>\r\n </ul>\r\n <div class=\"mt-2 fade-in-top\" [ngbNavOutlet]=\"nav\"></div>\r\n </div>\r\n <div class=\"card-footer\">\r\n <!-- *abpPermission=\"'CmsKit.GlobalResources.Update'\" -->\r\n <abp-button type=\"submit\" [disabled]=\"form?.invalid\" (click)=\"save()\">\r\n {{ 'AbpUi::Save' | abpLocalization }}\r\n </abp-button>\r\n </div>\r\n </div>\r\n </form>\r\n</abp-page>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: NgxValidateCoreModule }, { kind: "directive", type: i2$1.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "directive", type: i2$1.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "ngmodule", type: NgbNavModule }, { kind: "directive", type: i3.NgbNavContent, selector: "ng-template[ngbNavContent]" }, { kind: "directive", type: i3.NgbNav, selector: "[ngbNav]", inputs: ["activeId", "animation", "destroyOnHide", "orientation", "roles", "keyboard"], outputs: ["activeIdChange", "shown", "hidden", "navChange"], exportAs: ["ngbNav"] }, { kind: "directive", type: i3.NgbNavItem, selector: "[ngbNavItem]", inputs: ["destroyOnHide", "disabled", "domId", "ngbNavItem"], outputs: ["shown", "hidden"], exportAs: ["ngbNavItem"] }, { kind: "directive", type: i3.NgbNavItemRole, selector: "[ngbNavItem]:not(ng-container)" }, { kind: "directive", type: i3.NgbNavLink, selector: "a[ngbNavLink]" }, { kind: "directive", type: i3.NgbNavLinkBase, selector: "[ngbNavLink]" }, { kind: "component", type: i3.NgbNavOutlet, selector: "[ngbNavOutlet]", inputs: ["paneRole", "ngbNavOutlet"] }, { kind: "component", type: CodeMirrorEditorComponent, selector: "abp-codemirror-editor" }, { kind: "component", type: PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }, { kind: "component", type: ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }] }); }
1887
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GlobalResourcesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1888
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.5", type: GlobalResourcesComponent, isStandalone: true, selector: "abp-global-resources", ngImport: i0, template: "<abp-page [title]=\"'CmsKit::GlobalResources' | abpLocalization\">\r\n <form [formGroup]=\"form\" (ngSubmit)=\"save()\" [validateOnSubmit]=\"true\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n <ul\r\n ngbNav\r\n #nav=\"ngbNav\"\r\n class=\"nav-tabs\"\r\n [activeId]=\"activeTab()\"\r\n (activeIdChange)=\"onTabChange($event)\"\r\n >\r\n <li ngbNavItem=\"script\">\r\n <a ngbNavLink>{{ 'CmsKit::Script' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <abp-codemirror-editor formControlName=\"script\" />\r\n </div>\r\n </ng-template>\r\n </li>\r\n <li ngbNavItem=\"style\">\r\n <a ngbNavLink>{{ 'CmsKit::Style' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <abp-codemirror-editor formControlName=\"style\" />\r\n </div>\r\n </ng-template>\r\n </li>\r\n </ul>\r\n <div class=\"mt-2 fade-in-top\" [ngbNavOutlet]=\"nav\"></div>\r\n </div>\r\n <div class=\"card-footer\">\r\n <!-- *abpPermission=\"'CmsKit.GlobalResources.Update'\" -->\r\n <abp-button type=\"submit\" [disabled]=\"form?.invalid\" (click)=\"save()\">\r\n {{ 'AbpUi::Save' | abpLocalization }}\r\n </abp-button>\r\n </div>\r\n </div>\r\n </form>\r\n</abp-page>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: NgxValidateCoreModule }, { kind: "directive", type: i2$1.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "directive", type: i2$1.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "ngmodule", type: NgbNavModule }, { kind: "directive", type: i3.NgbNavContent, selector: "ng-template[ngbNavContent]" }, { kind: "directive", type: i3.NgbNav, selector: "[ngbNav]", inputs: ["activeId", "animation", "destroyOnHide", "orientation", "roles", "keyboard"], outputs: ["activeIdChange", "shown", "hidden", "navChange"], exportAs: ["ngbNav"] }, { kind: "directive", type: i3.NgbNavItem, selector: "[ngbNavItem]", inputs: ["destroyOnHide", "disabled", "domId", "ngbNavItem"], outputs: ["shown", "hidden"], exportAs: ["ngbNavItem"] }, { kind: "directive", type: i3.NgbNavItemRole, selector: "[ngbNavItem]:not(ng-container)" }, { kind: "directive", type: i3.NgbNavLink, selector: "a[ngbNavLink]" }, { kind: "directive", type: i3.NgbNavLinkBase, selector: "[ngbNavLink]" }, { kind: "component", type: i3.NgbNavOutlet, selector: "[ngbNavOutlet]", inputs: ["paneRole", "ngbNavOutlet"] }, { kind: "component", type: CodeMirrorEditorComponent, selector: "abp-codemirror-editor" }, { kind: "component", type: PageComponent, selector: "abp-page", inputs: ["title", "toolbar", "breadcrumb"] }, { kind: "component", type: ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1910
1889
  }
1911
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: GlobalResourcesComponent, decorators: [{
1890
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: GlobalResourcesComponent, decorators: [{
1912
1891
  type: Component,
1913
- args: [{ selector: 'abp-global-resources', imports: [
1892
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'abp-global-resources', imports: [
1914
1893
  CommonModule,
1915
1894
  ReactiveFormsModule,
1916
1895
  NgxValidateCoreModule,
@@ -1919,7 +1898,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
1919
1898
  LocalizationPipe,
1920
1899
  PageComponent,
1921
1900
  ButtonComponent,
1922
- ], template: "<abp-page [title]=\"'CmsKit::GlobalResources' | abpLocalization\">\r\n <form [formGroup]=\"form\" (ngSubmit)=\"save()\" validateOnSubmit>\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n <ul\r\n ngbNav\r\n #nav=\"ngbNav\"\r\n class=\"nav-tabs\"\r\n [(activeId)]=\"activeTab\"\r\n (activeIdChange)=\"onTabChange($event)\"\r\n >\r\n <li ngbNavItem=\"script\">\r\n <a ngbNavLink>{{ 'CmsKit::Script' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <abp-codemirror-editor formControlName=\"script\" />\r\n </div>\r\n </ng-template>\r\n </li>\r\n <li ngbNavItem=\"style\">\r\n <a ngbNavLink>{{ 'CmsKit::Style' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <abp-codemirror-editor formControlName=\"style\" />\r\n </div>\r\n </ng-template>\r\n </li>\r\n </ul>\r\n <div class=\"mt-2 fade-in-top\" [ngbNavOutlet]=\"nav\"></div>\r\n </div>\r\n <div class=\"card-footer\">\r\n <!-- *abpPermission=\"'CmsKit.GlobalResources.Update'\" -->\r\n <abp-button type=\"submit\" [disabled]=\"form?.invalid\" (click)=\"save()\">\r\n {{ 'AbpUi::Save' | abpLocalization }}\r\n </abp-button>\r\n </div>\r\n </div>\r\n </form>\r\n</abp-page>\r\n" }]
1901
+ ], template: "<abp-page [title]=\"'CmsKit::GlobalResources' | abpLocalization\">\r\n <form [formGroup]=\"form\" (ngSubmit)=\"save()\" [validateOnSubmit]=\"true\">\r\n <div class=\"card\">\r\n <div class=\"card-body\">\r\n <ul\r\n ngbNav\r\n #nav=\"ngbNav\"\r\n class=\"nav-tabs\"\r\n [activeId]=\"activeTab()\"\r\n (activeIdChange)=\"onTabChange($event)\"\r\n >\r\n <li ngbNavItem=\"script\">\r\n <a ngbNavLink>{{ 'CmsKit::Script' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <abp-codemirror-editor formControlName=\"script\" />\r\n </div>\r\n </ng-template>\r\n </li>\r\n <li ngbNavItem=\"style\">\r\n <a ngbNavLink>{{ 'CmsKit::Style' | abpLocalization }}</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"mt-3\">\r\n <abp-codemirror-editor formControlName=\"style\" />\r\n </div>\r\n </ng-template>\r\n </li>\r\n </ul>\r\n <div class=\"mt-2 fade-in-top\" [ngbNavOutlet]=\"nav\"></div>\r\n </div>\r\n <div class=\"card-footer\">\r\n <!-- *abpPermission=\"'CmsKit.GlobalResources.Update'\" -->\r\n <abp-button type=\"submit\" [disabled]=\"form?.invalid\" (click)=\"save()\">\r\n {{ 'AbpUi::Save' | abpLocalization }}\r\n </abp-button>\r\n </div>\r\n </div>\r\n </form>\r\n</abp-page>\r\n" }]
1923
1902
  }] });
1924
1903
 
1925
1904
  const DEFAULT_COMMENT_ENTITY_ACTIONS = EntityAction.createMany([