@abp/ng.components 10.1.0 → 10.2.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.
- package/fesm2022/abp-ng.components-chart.js.mjs +40 -53
- package/fesm2022/abp-ng.components-chart.js.mjs.map +1 -1
- package/fesm2022/abp-ng.components-dynamic-form.mjs +7 -9
- package/fesm2022/abp-ng.components-dynamic-form.mjs.map +1 -1
- package/fesm2022/abp-ng.components-extensible.mjs +383 -361
- package/fesm2022/abp-ng.components-extensible.mjs.map +1 -1
- package/fesm2022/abp-ng.components-lookup.mjs +4 -5
- package/fesm2022/abp-ng.components-lookup.mjs.map +1 -1
- package/fesm2022/abp-ng.components-page.mjs +45 -52
- package/fesm2022/abp-ng.components-page.mjs.map +1 -1
- package/fesm2022/abp-ng.components-tree.mjs +59 -69
- package/fesm2022/abp-ng.components-tree.mjs.map +1 -1
- package/package.json +3 -3
- package/types/abp-ng.components-chart.js.d.ts +18 -18
- package/types/abp-ng.components-dynamic-form.d.ts +1 -1
- package/types/abp-ng.components-extensible.d.ts +147 -105
- package/types/abp-ng.components-page.d.ts +17 -18
- package/types/abp-ng.components-tree.d.ts +47 -33
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, ChangeDetectorRef, input, Optional, SkipSelf,
|
|
2
|
+
import { inject, ChangeDetectorRef, input, viewChild, Optional, SkipSelf, ChangeDetectionStrategy, Component, InjectionToken, Injectable, forwardRef, Injector, effect, isSignal, TemplateRef, ViewContainerRef, Directive, viewChildren, signal, contentChild, LOCALE_ID, PLATFORM_ID, output, computed, Pipe, NgModule } from '@angular/core';
|
|
3
3
|
import * as i2 from '@angular/forms';
|
|
4
4
|
import { ControlContainer, ReactiveFormsModule, Validators, NG_VALUE_ACCESSOR, FormGroupDirective, FormsModule, UntypedFormGroup, UntypedFormControl } from '@angular/forms';
|
|
5
5
|
import * as i1 from '@ng-bootstrap/ng-bootstrap';
|
|
6
|
-
import { NgbDateAdapter, NgbTimeAdapter, NgbDatepickerModule, NgbTimepickerModule,
|
|
6
|
+
import { NgbInputDatepicker, NgbTimepicker, NgbDateAdapter, NgbTimeAdapter, NgbDatepickerModule, NgbTimepickerModule, NgbTooltip, NgbTypeaheadModule, NgbDropdownModule, NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap';
|
|
7
7
|
import * as i3 from '@ngx-validate/core';
|
|
8
8
|
import { NgxValidateCoreModule } from '@ngx-validate/core';
|
|
9
9
|
import { DateTimeAdapter, DateAdapter, TimeAdapter, DisabledDirective, EllipsisDirective, AbpVisibleDirective, NgxDatatableDefaultDirective, NgxDatatableListDirective, ThemeSharedModule } from '@abp/ng.theme.shared';
|
|
10
10
|
import { RestService, ConfigStateService, AbpValidators, LocalizationPipe, TrackByService, ShowPasswordDirective, PermissionDirective, escapeHtmlChars, TimezoneService, PermissionService, UtcToLocalPipe, LocalizationService, createLocalizationPipeKeyGenerator, CoreModule } from '@abp/ng.core';
|
|
11
11
|
import { of, Subject, debounceTime as debounceTime$1, distinctUntilChanged as distinctUntilChanged$1, map as map$1, filter, merge, pipe, zip } from 'rxjs';
|
|
12
12
|
import { map, debounceTime, distinctUntilChanged, switchMap, filter as filter$1, take } from 'rxjs/operators';
|
|
13
|
+
import { NgComponentOutlet, NgTemplateOutlet, AsyncPipe, isPlatformBrowser } from '@angular/common';
|
|
13
14
|
import { LinkedList } from '@abp/utils';
|
|
14
|
-
import { NgClass, NgComponentOutlet, NgTemplateOutlet, AsyncPipe, isPlatformBrowser } from '@angular/common';
|
|
15
15
|
import * as i1$1 from '@swimlane/ngx-datatable';
|
|
16
16
|
import { SelectionType, NgxDatatableModule } from '@swimlane/ngx-datatable';
|
|
17
17
|
|
|
@@ -25,15 +25,17 @@ class ExtensibleDateTimePickerComponent {
|
|
|
25
25
|
this.prop = input(...(ngDevMode ? [undefined, { debugName: "prop" }] : []));
|
|
26
26
|
this.meridian = input(false, ...(ngDevMode ? [{ debugName: "meridian" }] : []));
|
|
27
27
|
this.placement = input('bottom-left', ...(ngDevMode ? [{ debugName: "placement" }] : []));
|
|
28
|
+
this.date = viewChild.required(NgbInputDatepicker);
|
|
29
|
+
this.time = viewChild.required(NgbTimepicker);
|
|
28
30
|
}
|
|
29
31
|
setDate(dateStr) {
|
|
30
|
-
this.date.writeValue(dateStr);
|
|
32
|
+
this.date().writeValue(dateStr);
|
|
31
33
|
}
|
|
32
34
|
setTime(dateStr) {
|
|
33
|
-
this.time.writeValue(dateStr);
|
|
35
|
+
this.time().writeValue(dateStr);
|
|
34
36
|
}
|
|
35
37
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: ExtensibleDateTimePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
36
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.
|
|
38
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.0.9", type: ExtensibleDateTimePickerComponent, isStandalone: true, selector: "abp-extensible-date-time-picker", inputs: { prop: { classPropertyName: "prop", publicName: "prop", isSignal: true, isRequired: false, transformFunction: null }, meridian: { classPropertyName: "meridian", publicName: "meridian", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "date", first: true, predicate: NgbInputDatepicker, descendants: true, isSignal: true }, { propertyName: "time", first: true, predicate: NgbTimepicker, descendants: true, isSignal: true }], exportAs: ["abpExtensibleDateTimePicker"], ngImport: i0, template: `
|
|
37
39
|
<input
|
|
38
40
|
[id]="prop().id"
|
|
39
41
|
[formControlName]="prop().name"
|
|
@@ -116,13 +118,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
|
|
|
116
118
|
},
|
|
117
119
|
],
|
|
118
120
|
}]
|
|
119
|
-
}], propDecorators: { prop: [{ type: i0.Input, args: [{ isSignal: true, alias: "prop", required: false }] }], meridian: [{ type: i0.Input, args: [{ isSignal: true, alias: "meridian", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], date: [{
|
|
120
|
-
type: ViewChild,
|
|
121
|
-
args: [NgbInputDatepicker]
|
|
122
|
-
}], time: [{
|
|
123
|
-
type: ViewChild,
|
|
124
|
-
args: [NgbTimepicker]
|
|
125
|
-
}] } });
|
|
121
|
+
}], propDecorators: { prop: [{ type: i0.Input, args: [{ isSignal: true, alias: "prop", required: false }] }], meridian: [{ type: i0.Input, args: [{ isSignal: true, alias: "meridian", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], date: [{ type: i0.ViewChild, args: [i0.forwardRef(() => NgbInputDatepicker), { isSignal: true }] }], time: [{ type: i0.ViewChild, args: [i0.forwardRef(() => NgbTimepicker), { isSignal: true }] }] } });
|
|
126
122
|
|
|
127
123
|
const EXTENSIONS_IDENTIFIER = new InjectionToken('EXTENSIONS_IDENTIFIER');
|
|
128
124
|
const EXTENSIONS_ACTION_TYPE = new InjectionToken('EXTENSIONS_ACTION_TYPE');
|
|
@@ -138,137 +134,6 @@ const EXTENSIONS_FORM_PROP_DATA = new InjectionToken('EXTENSIONS_FORM_PROP_DATA'
|
|
|
138
134
|
|
|
139
135
|
const EXTRA_PROPERTIES_KEY = 'extraProperties';
|
|
140
136
|
|
|
141
|
-
class PropList extends LinkedList {
|
|
142
|
-
}
|
|
143
|
-
class PropData {
|
|
144
|
-
get data() {
|
|
145
|
-
return {
|
|
146
|
-
getInjected: this.getInjected,
|
|
147
|
-
index: this.index,
|
|
148
|
-
record: this.record,
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
class Prop {
|
|
153
|
-
constructor(type, name, displayName, permission, visible = _ => true, isExtra = false, template, className, formText, tooltip, displayTextResolver) {
|
|
154
|
-
this.type = type;
|
|
155
|
-
this.name = name;
|
|
156
|
-
this.displayName = displayName;
|
|
157
|
-
this.permission = permission;
|
|
158
|
-
this.visible = visible;
|
|
159
|
-
this.isExtra = isExtra;
|
|
160
|
-
this.template = template;
|
|
161
|
-
this.className = className;
|
|
162
|
-
this.formText = formText;
|
|
163
|
-
this.tooltip = tooltip;
|
|
164
|
-
this.displayTextResolver = displayTextResolver;
|
|
165
|
-
this.displayName = this.displayName || this.name;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
class PropsFactory {
|
|
169
|
-
constructor() {
|
|
170
|
-
this.contributorCallbacks = {};
|
|
171
|
-
}
|
|
172
|
-
get(name) {
|
|
173
|
-
this.contributorCallbacks[name] = this.contributorCallbacks[name] || [];
|
|
174
|
-
return new this._ctor(this.contributorCallbacks[name]);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
class Props {
|
|
178
|
-
get props() {
|
|
179
|
-
const propList = new this._ctor();
|
|
180
|
-
this.callbackList.forEach(callback => callback(propList));
|
|
181
|
-
return propList;
|
|
182
|
-
}
|
|
183
|
-
constructor(callbackList) {
|
|
184
|
-
this.callbackList = callbackList;
|
|
185
|
-
}
|
|
186
|
-
addContributor(contributeCallback) {
|
|
187
|
-
this.callbackList.push(contributeCallback);
|
|
188
|
-
}
|
|
189
|
-
clearContributors() {
|
|
190
|
-
while (this.callbackList.length)
|
|
191
|
-
this.callbackList.pop();
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
class FormPropList extends PropList {
|
|
196
|
-
}
|
|
197
|
-
class FormProps extends Props {
|
|
198
|
-
constructor() {
|
|
199
|
-
super(...arguments);
|
|
200
|
-
this._ctor = FormPropList;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
class GroupedFormPropList {
|
|
204
|
-
constructor() {
|
|
205
|
-
this.items = [];
|
|
206
|
-
this.count = 1;
|
|
207
|
-
}
|
|
208
|
-
addItem(item) {
|
|
209
|
-
const groupName = item.group?.name;
|
|
210
|
-
let group = this.items.find(i => i.group?.name === groupName);
|
|
211
|
-
if (group) {
|
|
212
|
-
group.formPropList.addTail(item);
|
|
213
|
-
}
|
|
214
|
-
else {
|
|
215
|
-
group = {
|
|
216
|
-
formPropList: new FormPropList(),
|
|
217
|
-
group: item.group || { name: `default${this.count++}`, className: item.group?.className },
|
|
218
|
-
};
|
|
219
|
-
group.formPropList.addHead(item);
|
|
220
|
-
this.items.push(group);
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
class CreateFormPropsFactory extends PropsFactory {
|
|
225
|
-
constructor() {
|
|
226
|
-
super(...arguments);
|
|
227
|
-
this._ctor = FormProps;
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
class EditFormPropsFactory extends PropsFactory {
|
|
231
|
-
constructor() {
|
|
232
|
-
super(...arguments);
|
|
233
|
-
this._ctor = FormProps;
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
class FormProp extends Prop {
|
|
237
|
-
constructor(options) {
|
|
238
|
-
super(options.type, options.name, options.displayName || '', options.permission || '', options.visible, options.isExtra, options.template, options.className, options.formText, options.tooltip);
|
|
239
|
-
this.group = options.group;
|
|
240
|
-
this.className = options.className;
|
|
241
|
-
this.formText = options.formText;
|
|
242
|
-
this.tooltip = options.tooltip;
|
|
243
|
-
this.asyncValidators = options.asyncValidators || (_ => []);
|
|
244
|
-
this.validators = options.validators || (_ => []);
|
|
245
|
-
this.disabled = options.disabled || (_ => false);
|
|
246
|
-
this.readonly = options.readonly || (_ => false);
|
|
247
|
-
this.autocomplete = options.autocomplete || 'off';
|
|
248
|
-
this.options = options.options;
|
|
249
|
-
this.id = options.id || options.name;
|
|
250
|
-
const defaultValue = options.defaultValue;
|
|
251
|
-
this.defaultValue = isFalsyValue(defaultValue) ? defaultValue : defaultValue || '';
|
|
252
|
-
this.displayTextResolver = options.displayTextResolver;
|
|
253
|
-
}
|
|
254
|
-
static create(options) {
|
|
255
|
-
return new FormProp(options);
|
|
256
|
-
}
|
|
257
|
-
static createMany(arrayOfOptions) {
|
|
258
|
-
return arrayOfOptions.map(FormProp.create);
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
class FormPropData extends PropData {
|
|
262
|
-
constructor(injector, record) {
|
|
263
|
-
super();
|
|
264
|
-
this.record = record;
|
|
265
|
-
this.getInjected = injector.get.bind(injector);
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
function isFalsyValue(defaultValue) {
|
|
269
|
-
return [0, '', false].indexOf(defaultValue) > -1;
|
|
270
|
-
}
|
|
271
|
-
|
|
272
137
|
const TYPEAHEAD_TEXT_SUFFIX = '_Text';
|
|
273
138
|
const TYPEAHEAD_TEXT_SUFFIX_REGEX = /_Text$/;
|
|
274
139
|
function createTypeaheadOptions(lookup) {
|
|
@@ -486,6 +351,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
|
|
|
486
351
|
}], propDecorators: { prop: [{ type: i0.Input, args: [{ isSignal: true, alias: "prop", required: true }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: true }] }] } });
|
|
487
352
|
|
|
488
353
|
class ExtensibleFormPropComponent {
|
|
354
|
+
#groupDirective;
|
|
355
|
+
get disabled() {
|
|
356
|
+
const data = this.data();
|
|
357
|
+
if (!data)
|
|
358
|
+
return false;
|
|
359
|
+
return this.disabledFn(data);
|
|
360
|
+
}
|
|
489
361
|
constructor() {
|
|
490
362
|
this.service = inject(ExtensibleFormPropService);
|
|
491
363
|
this.cdRef = inject(ChangeDetectorRef);
|
|
@@ -493,6 +365,11 @@ class ExtensibleFormPropComponent {
|
|
|
493
365
|
this.#groupDirective = inject(FormGroupDirective);
|
|
494
366
|
this.injector = inject(Injector);
|
|
495
367
|
this.form = this.#groupDirective.form;
|
|
368
|
+
this.data = input.required(...(ngDevMode ? [{ debugName: "data" }] : []));
|
|
369
|
+
this.prop = input.required(...(ngDevMode ? [{ debugName: "prop" }] : []));
|
|
370
|
+
this.first = input(undefined, ...(ngDevMode ? [{ debugName: "first" }] : []));
|
|
371
|
+
this.isFirstGroup = input(undefined, ...(ngDevMode ? [{ debugName: "isFirstGroup" }] : []));
|
|
372
|
+
this.fieldRef = viewChild.required('field');
|
|
496
373
|
this.asterisk = '';
|
|
497
374
|
this.containerClassName = 'mb-2';
|
|
498
375
|
this.showPassword = false;
|
|
@@ -501,14 +378,52 @@ class ExtensibleFormPropComponent {
|
|
|
501
378
|
this.passwordKey = "ThemeShared.Extensions.PasswordComponent" /* eExtensibleComponents.PasswordComponent */;
|
|
502
379
|
this.disabledFn = (data) => false;
|
|
503
380
|
this.search = (text$) => text$
|
|
504
|
-
? text$.pipe(debounceTime(300), distinctUntilChanged(), switchMap(text => this.prop?.options?.(this.data, text) || of([])))
|
|
381
|
+
? text$.pipe(debounceTime(300), distinctUntilChanged(), switchMap(text => this.prop()?.options?.(this.data(), text) || of([])))
|
|
505
382
|
: of([]);
|
|
506
383
|
this.typeaheadFormatter = (option) => option.key;
|
|
507
384
|
this.meridian$ = this.service.meridian$;
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
385
|
+
// Watch prop changes and update state
|
|
386
|
+
effect(() => {
|
|
387
|
+
const currentProp = this.prop();
|
|
388
|
+
const data = this.data();
|
|
389
|
+
if (!currentProp || !data)
|
|
390
|
+
return;
|
|
391
|
+
const { options, readonly, disabled, validators, className, template } = currentProp;
|
|
392
|
+
if (template) {
|
|
393
|
+
this.injectorForCustomComponent = Injector.create({
|
|
394
|
+
providers: [
|
|
395
|
+
{
|
|
396
|
+
provide: EXTENSIONS_FORM_PROP,
|
|
397
|
+
useValue: currentProp,
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
provide: EXTENSIONS_FORM_PROP_DATA,
|
|
401
|
+
useValue: data?.record,
|
|
402
|
+
},
|
|
403
|
+
{ provide: ControlContainer, useExisting: FormGroupDirective },
|
|
404
|
+
],
|
|
405
|
+
parent: this.injector,
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
if (options)
|
|
409
|
+
this.options$ = options(data);
|
|
410
|
+
if (readonly)
|
|
411
|
+
this.readonly = readonly(data);
|
|
412
|
+
if (disabled) {
|
|
413
|
+
this.disabledFn = disabled;
|
|
414
|
+
}
|
|
415
|
+
if (validators) {
|
|
416
|
+
this.validators = validators(data);
|
|
417
|
+
this.setAsterisk();
|
|
418
|
+
}
|
|
419
|
+
if (className !== undefined) {
|
|
420
|
+
this.containerClassName = className;
|
|
421
|
+
}
|
|
422
|
+
const [keyControl, valueControl] = this.getTypeaheadControls();
|
|
423
|
+
if (keyControl && valueControl)
|
|
424
|
+
this.typeaheadModel = { key: keyControl.value, value: valueControl.value };
|
|
425
|
+
this.cdRef.markForCheck();
|
|
426
|
+
});
|
|
512
427
|
}
|
|
513
428
|
setTypeaheadValue(selectedOption) {
|
|
514
429
|
this.typeaheadModel = selectedOption || { key: null, value: null };
|
|
@@ -520,11 +435,11 @@ class ExtensibleFormPropComponent {
|
|
|
520
435
|
valueControl?.setValue(value);
|
|
521
436
|
}
|
|
522
437
|
get isInvalid() {
|
|
523
|
-
const control = this.form.get(this.prop.name);
|
|
438
|
+
const control = this.form.get(this.prop().name);
|
|
524
439
|
return control?.touched && control.invalid;
|
|
525
440
|
}
|
|
526
441
|
getTypeaheadControls() {
|
|
527
|
-
const { name } = this.prop;
|
|
442
|
+
const { name } = this.prop();
|
|
528
443
|
const extraPropName = `${EXTRA_PROPERTIES_KEY}.${name}`;
|
|
529
444
|
const keyControl = this.form.get(addTypeaheadTextSuffix(extraPropName)) ||
|
|
530
445
|
this.form.get(addTypeaheadTextSuffix(name));
|
|
@@ -535,9 +450,9 @@ class ExtensibleFormPropComponent {
|
|
|
535
450
|
this.asterisk = this.service.calcAsterisks(this.validators);
|
|
536
451
|
}
|
|
537
452
|
ngAfterViewInit() {
|
|
538
|
-
if (this.isFirstGroup && this.first && this.fieldRef) {
|
|
453
|
+
if (this.isFirstGroup() && this.first() && this.fieldRef()) {
|
|
539
454
|
requestAnimationFrame(() => {
|
|
540
|
-
this.fieldRef.nativeElement.focus();
|
|
455
|
+
this.fieldRef().nativeElement.focus();
|
|
541
456
|
});
|
|
542
457
|
}
|
|
543
458
|
}
|
|
@@ -547,45 +462,8 @@ class ExtensibleFormPropComponent {
|
|
|
547
462
|
getType(prop) {
|
|
548
463
|
return this.service.getType(prop);
|
|
549
464
|
}
|
|
550
|
-
ngOnChanges({ prop, data }) {
|
|
551
|
-
const currentProp = prop?.currentValue;
|
|
552
|
-
const { options, readonly, disabled, validators, className, template } = currentProp || {};
|
|
553
|
-
if (template) {
|
|
554
|
-
this.injectorForCustomComponent = Injector.create({
|
|
555
|
-
providers: [
|
|
556
|
-
{
|
|
557
|
-
provide: EXTENSIONS_FORM_PROP,
|
|
558
|
-
useValue: currentProp,
|
|
559
|
-
},
|
|
560
|
-
{
|
|
561
|
-
provide: EXTENSIONS_FORM_PROP_DATA,
|
|
562
|
-
useValue: data?.currentValue?.record,
|
|
563
|
-
},
|
|
564
|
-
{ provide: ControlContainer, useExisting: FormGroupDirective },
|
|
565
|
-
],
|
|
566
|
-
parent: this.injector,
|
|
567
|
-
});
|
|
568
|
-
}
|
|
569
|
-
if (options)
|
|
570
|
-
this.options$ = options(this.data);
|
|
571
|
-
if (readonly)
|
|
572
|
-
this.readonly = readonly(this.data);
|
|
573
|
-
if (disabled) {
|
|
574
|
-
this.disabledFn = disabled;
|
|
575
|
-
}
|
|
576
|
-
if (validators) {
|
|
577
|
-
this.validators = validators(this.data);
|
|
578
|
-
this.setAsterisk();
|
|
579
|
-
}
|
|
580
|
-
if (className !== undefined) {
|
|
581
|
-
this.containerClassName = className;
|
|
582
|
-
}
|
|
583
|
-
const [keyControl, valueControl] = this.getTypeaheadControls();
|
|
584
|
-
if (keyControl && valueControl)
|
|
585
|
-
this.typeaheadModel = { key: keyControl.value, value: valueControl.value };
|
|
586
|
-
}
|
|
587
465
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: ExtensibleFormPropComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
588
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.9", type: ExtensibleFormPropComponent, isStandalone: true, selector: "abp-extensible-form-prop", inputs: { data: "data", prop: "prop", first: "first", isFirstGroup: "isFirstGroup" }, providers: [ExtensibleFormPropService], viewQueries: [{ propertyName: "fieldRef", first: true, predicate: ["field"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *abpPermission=\"prop.permission; runChangeDetection: false\">\r\n @switch (getComponent(prop)) {\r\n @case ('template') {\r\n <ng-container *ngComponentOutlet=\"prop.template; injector: injectorForCustomComponent\" />\r\n }\r\n }\r\n\r\n <div [ngClass]=\"containerClassName\" class=\"mb-2\">\r\n @switch (getComponent(prop)) {\r\n @case ('input') {\r\n <ng-template [ngTemplateOutlet]=\"label\" />\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [autocomplete]=\"prop.autocomplete\"\r\n [type]=\"getType(prop)\"\r\n [abpDisabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n class=\"form-control\"\r\n />\r\n }\r\n @case ('hidden') {\r\n <input [formControlName]=\"prop.name\" type=\"hidden\" />\r\n }\r\n @case ('checkbox') {\r\n <div class=\"form-check\" validationTarget>\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n />\r\n <ng-template\r\n [ngTemplateOutlet]=\"label\"\r\n [ngTemplateOutletContext]=\"{ $implicit: 'form-check-label' }\"\r\n />\r\n </div>\r\n }\r\n @case ('select') {\r\n <ng-template [ngTemplateOutlet]=\"label\" />\r\n <select\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n class=\"form-select form-control\"\r\n >\r\n @for (option of options$ | async; track option.value) {\r\n <option [ngValue]=\"option.value\">\r\n @if (prop.isExtra) {\r\n {{ '::' + option.key | abpLocalization }}\r\n } @else {\r\n {{ option.key }}\r\n }\r\n </option>\r\n }\r\n </select>\r\n }\r\n @case ('multiselect') {\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <abp-extensible-form-multi-select\r\n [prop]=\"prop\"\r\n [options]=\"options$ | async\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n />\r\n }\r\n @case ('typeahead') {\r\n <ng-template [ngTemplateOutlet]=\"label\" />\r\n <div #typeahead class=\"position-relative\" validationStyle validationTarget>\r\n <input\r\n #field\r\n [id]=\"prop.id\"\r\n [autocomplete]=\"prop.autocomplete\"\r\n [abpDisabled]=\"disabled\"\r\n [ngbTypeahead]=\"search\"\r\n [editable]=\"false\"\r\n [inputFormatter]=\"typeaheadFormatter\"\r\n [resultFormatter]=\"typeaheadFormatter\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n [(ngModel)]=\"typeaheadModel\"\r\n (selectItem)=\"setTypeaheadValue($event.item)\"\r\n (blur)=\"setTypeaheadValue(typeaheadModel)\"\r\n [class.is-invalid]=\"typeahead.classList.contains('is-invalid')\"\r\n class=\"form-control\"\r\n />\r\n <input [formControlName]=\"prop.name\" type=\"hidden\" />\r\n </div>\r\n }\r\n @case ('date') {\r\n <ng-template [ngTemplateOutlet]=\"label\" />\r\n <input\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n (click)=\"datepicker.open()\"\r\n (keyup.space)=\"datepicker.open()\"\r\n ngbDatepicker\r\n #datepicker=\"ngbDatepicker\"\r\n type=\"text\"\r\n class=\"form-control\"\r\n />\r\n }\r\n @case ('time') {\r\n <ng-template [ngTemplateOutlet]=\"label\" />\r\n <ngb-timepicker [formControlName]=\"prop.name\" />\r\n }\r\n @case ('dateTime') {\r\n <ng-template [ngTemplateOutlet]=\"label\" />\r\n <abp-extensible-date-time-picker [prop]=\"prop\" [meridian]=\"meridian$ | async\" />\r\n }\r\n @case ('textarea') {\r\n <ng-template [ngTemplateOutlet]=\"label\" />\r\n <textarea\r\n #field\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpDisabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n class=\"form-control\"\r\n ></textarea>\r\n }\r\n @case ('passwordinputgroup') {\r\n <ng-template [ngTemplateOutlet]=\"label\" />\r\n <div class=\"input-group form-group\" validationTarget>\r\n <input\r\n class=\"form-control\"\r\n [id]=\"prop.id\"\r\n [formControlName]=\"prop.name\"\r\n [abpShowPassword]=\"showPassword\"\r\n />\r\n <button class=\"btn btn-secondary\" type=\"button\" (click)=\"showPassword = !showPassword\">\r\n <i\r\n class=\"fa\"\r\n aria-hidden=\"true\"\r\n [ngClass]=\"{\r\n 'fa-eye-slash': !showPassword,\r\n 'fa-eye': showPassword,\r\n }\"\r\n ></i>\r\n </button>\r\n </div>\r\n }\r\n }\r\n\r\n @if (prop.formText) {\r\n <small class=\"text-muted d-block\">{{ prop.formText | abpLocalization }}</small>\r\n }\r\n </div>\r\n</ng-container>\r\n\r\n<ng-template #label let-classes>\r\n <label [htmlFor]=\"prop.id\" [ngClass]=\"classes || 'form-label d-inline-block'\">\r\n <span class=\"d-inline-flex align-items-center gap-1 text-nowrap\">\r\n @if (prop.displayTextResolver) {\r\n {{ prop.displayTextResolver(data) | abpLocalization }}\r\n } @else {\r\n @if (prop.isExtra) {\r\n {{ '::' + prop.displayName | abpLocalization }}\r\n } @else {\r\n {{ prop.displayName | abpLocalization }}\r\n }\r\n }\r\n {{ asterisk }}\r\n @if (prop.tooltip) {\r\n <i\r\n [ngbTooltip]=\"prop.tooltip.text | abpLocalization\"\r\n [placement]=\"prop.tooltip.placement || 'auto'\"\r\n container=\"body\"\r\n class=\"bi bi-info-circle\"\r\n ></i>\r\n }\r\n </span>\r\n </label>\r\n</ng-template>\r\n", dependencies: [{ kind: "component", type: ExtensibleDateTimePickerComponent, selector: "abp-extensible-date-time-picker", inputs: ["prop", "meridian", "placement"], exportAs: ["abpExtensibleDateTimePicker"] }, { kind: "component", type: ExtensibleFormMultiselectComponent, selector: "abp-extensible-form-multi-select", inputs: ["prop", "options"] }, { kind: "ngmodule", type: NgbDatepickerModule }, { kind: "directive", type: i1.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: NgbTimepickerModule }, { kind: "component", type: i1.NgbTimepicker, selector: "ngb-timepicker", inputs: ["meridian", "spinners", "seconds", "hourStep", "minuteStep", "secondStep", "readonlyInputs", "size"], exportAs: ["ngbTimepicker"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.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: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: DisabledDirective, selector: "[abpDisabled]", inputs: ["abpDisabled"] }, { kind: "ngmodule", type: NgxValidateCoreModule }, { kind: "directive", type: i3.ValidationStyleDirective, selector: "[validationStyle]", exportAs: ["validationStyle"] }, { kind: "directive", type: i3.ValidationTargetDirective, selector: "[validationTarget]", exportAs: ["validationTarget"] }, { kind: "directive", type: i3.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "ngmodule", type: NgbTypeaheadModule }, { kind: "directive", type: i1.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "container", "editable", "focusFirst", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate", "selectOnExact", "showHint", "placement", "popperOptions", "popupClass"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }, { kind: "directive", type: ShowPasswordDirective, selector: "[abpShowPassword]", inputs: ["abpShowPassword"] }, { kind: "directive", type: PermissionDirective, selector: "[abpPermission]", inputs: ["abpPermission", "abpPermissionRunChangeDetection"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }, { kind: "pipe", type: AsyncPipe, name: "async" }], viewProviders: [
|
|
466
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.9", type: ExtensibleFormPropComponent, isStandalone: true, selector: "abp-extensible-form-prop", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, prop: { classPropertyName: "prop", publicName: "prop", isSignal: true, isRequired: true, transformFunction: null }, first: { classPropertyName: "first", publicName: "first", isSignal: true, isRequired: false, transformFunction: null }, isFirstGroup: { classPropertyName: "isFirstGroup", publicName: "isFirstGroup", isSignal: true, isRequired: false, transformFunction: null } }, providers: [ExtensibleFormPropService], viewQueries: [{ propertyName: "fieldRef", first: true, predicate: ["field"], descendants: true, isSignal: true }], ngImport: i0, template: "<ng-container *abpPermission=\"prop().permission; runChangeDetection: false\">\r\n @switch (getComponent(prop())) {\r\n @case ('template') {\r\n <ng-container *ngComponentOutlet=\"prop().template; injector: injectorForCustomComponent\" />\r\n }\r\n }\r\n\r\n <div [class]=\"containerClassName\" class=\"mb-2\">\r\n @switch (getComponent(prop())) {\r\n @case ('input') {\r\n <ng-template [ngTemplateOutlet]=\"label\" />\r\n <input\r\n #field\r\n [id]=\"prop().id\"\r\n [formControlName]=\"prop().name\"\r\n [autocomplete]=\"prop().autocomplete\"\r\n [type]=\"getType(prop())\"\r\n [abpDisabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n class=\"form-control\"\r\n />\r\n }\r\n @case ('hidden') {\r\n <input [formControlName]=\"prop().name\" type=\"hidden\" />\r\n }\r\n @case ('checkbox') {\r\n <div class=\"form-check\" validationTarget>\r\n <input\r\n #field\r\n [id]=\"prop().id\"\r\n [formControlName]=\"prop().name\"\r\n [abpDisabled]=\"disabled\"\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n />\r\n <ng-template\r\n [ngTemplateOutlet]=\"label\"\r\n [ngTemplateOutletContext]=\"{ $implicit: 'form-check-label' }\"\r\n />\r\n </div>\r\n }\r\n @case ('select') {\r\n <ng-template [ngTemplateOutlet]=\"label\" />\r\n <select\r\n #field\r\n [id]=\"prop().id\"\r\n [formControlName]=\"prop().name\"\r\n [abpDisabled]=\"disabled\"\r\n class=\"form-select form-control\"\r\n >\r\n @for (option of options$ | async; track option.value) {\r\n <option [ngValue]=\"option.value\">\r\n @if (prop().isExtra) {\r\n {{ '::' + option.key | abpLocalization }}\r\n } @else {\r\n {{ option.key }}\r\n }\r\n </option>\r\n }\r\n </select>\r\n }\r\n @case ('multiselect') {\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <abp-extensible-form-multi-select\r\n [prop]=\"prop()\"\r\n [options]=\"options$ | async\"\r\n [formControlName]=\"prop().name\"\r\n [abpDisabled]=\"disabled\"\r\n />\r\n }\r\n @case ('typeahead') {\r\n <ng-template [ngTemplateOutlet]=\"label\" />\r\n <div #typeahead class=\"position-relative\" validationStyle validationTarget>\r\n <input\r\n #field\r\n [id]=\"prop().id\"\r\n [autocomplete]=\"prop().autocomplete\"\r\n [abpDisabled]=\"disabled\"\r\n [ngbTypeahead]=\"search\"\r\n [editable]=\"false\"\r\n [inputFormatter]=\"typeaheadFormatter\"\r\n [resultFormatter]=\"typeaheadFormatter\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n [(ngModel)]=\"typeaheadModel\"\r\n (selectItem)=\"setTypeaheadValue($event.item)\"\r\n (blur)=\"setTypeaheadValue(typeaheadModel)\"\r\n [class.is-invalid]=\"typeahead.classList.contains('is-invalid')\"\r\n class=\"form-control\"\r\n />\r\n <input [formControlName]=\"prop().name\" type=\"hidden\" />\r\n </div>\r\n }\r\n @case ('date') {\r\n <ng-template [ngTemplateOutlet]=\"label\" />\r\n <input\r\n [id]=\"prop().id\"\r\n [formControlName]=\"prop().name\"\r\n (click)=\"datepicker.open()\"\r\n (keyup.space)=\"datepicker.open()\"\r\n ngbDatepicker\r\n #datepicker=\"ngbDatepicker\"\r\n type=\"text\"\r\n class=\"form-control\"\r\n />\r\n }\r\n @case ('time') {\r\n <ng-template [ngTemplateOutlet]=\"label\" />\r\n <ngb-timepicker [formControlName]=\"prop().name\" />\r\n }\r\n @case ('dateTime') {\r\n <ng-template [ngTemplateOutlet]=\"label\" />\r\n <abp-extensible-date-time-picker [prop]=\"prop()\" [meridian]=\"meridian$ | async\" />\r\n }\r\n @case ('textarea') {\r\n <ng-template [ngTemplateOutlet]=\"label\" />\r\n <textarea\r\n #field\r\n [id]=\"prop().id\"\r\n [formControlName]=\"prop().name\"\r\n [abpDisabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n class=\"form-control\"\r\n ></textarea>\r\n }\r\n @case ('passwordinputgroup') {\r\n <ng-template [ngTemplateOutlet]=\"label\" />\r\n <div class=\"input-group form-group\" validationTarget>\r\n <input\r\n class=\"form-control\"\r\n [id]=\"prop().id\"\r\n [formControlName]=\"prop().name\"\r\n [abpShowPassword]=\"showPassword\"\r\n />\r\n <button class=\"btn btn-secondary\" type=\"button\" (click)=\"showPassword = !showPassword\">\r\n <i\r\n class=\"fa\"\r\n aria-hidden=\"true\"\r\n [class]=\"{\r\n 'fa-eye-slash': !showPassword,\r\n 'fa-eye': showPassword,\r\n }\"\r\n ></i>\r\n </button>\r\n </div>\r\n }\r\n }\r\n\r\n @if (prop().formText) {\r\n <small class=\"text-muted d-block\">{{ prop().formText | abpLocalization }}</small>\r\n }\r\n </div>\r\n</ng-container>\r\n\r\n<ng-template #label let-classes>\r\n <label [htmlFor]=\"prop().id\" [class]=\"classes || 'form-label d-inline-block'\">\r\n <span class=\"d-inline-flex align-items-center gap-1 text-nowrap\">\r\n @if (prop().displayTextResolver) {\r\n {{ prop().displayTextResolver(data()) | abpLocalization }}\r\n } @else {\r\n @if (prop().isExtra) {\r\n {{ '::' + prop().displayName | abpLocalization }}\r\n } @else {\r\n {{ prop().displayName | abpLocalization }}\r\n }\r\n }\r\n {{ asterisk }}\r\n @if (prop().tooltip) {\r\n <i\r\n [ngbTooltip]=\"prop().tooltip.text | abpLocalization\"\r\n [placement]=\"prop().tooltip.placement || 'auto'\"\r\n container=\"body\"\r\n class=\"bi bi-info-circle\"\r\n ></i>\r\n }\r\n </span>\r\n </label>\r\n</ng-template>\r\n", dependencies: [{ kind: "component", type: ExtensibleDateTimePickerComponent, selector: "abp-extensible-date-time-picker", inputs: ["prop", "meridian", "placement"], exportAs: ["abpExtensibleDateTimePicker"] }, { kind: "component", type: ExtensibleFormMultiselectComponent, selector: "abp-extensible-form-multi-select", inputs: ["prop", "options"] }, { kind: "ngmodule", type: NgbDatepickerModule }, { kind: "directive", type: i1.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: NgbTimepickerModule }, { kind: "component", type: i1.NgbTimepicker, selector: "ngb-timepicker", inputs: ["meridian", "spinners", "seconds", "hourStep", "minuteStep", "secondStep", "readonlyInputs", "size"], exportAs: ["ngbTimepicker"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.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: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: DisabledDirective, selector: "[abpDisabled]", inputs: ["abpDisabled"] }, { kind: "ngmodule", type: NgxValidateCoreModule }, { kind: "directive", type: i3.ValidationStyleDirective, selector: "[validationStyle]", exportAs: ["validationStyle"] }, { kind: "directive", type: i3.ValidationTargetDirective, selector: "[validationTarget]", exportAs: ["validationTarget"] }, { kind: "directive", type: i3.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "ngmodule", type: NgbTypeaheadModule }, { kind: "directive", type: i1.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "container", "editable", "focusFirst", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate", "selectOnExact", "showHint", "placement", "popperOptions", "popupClass"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }, { kind: "directive", type: ShowPasswordDirective, selector: "[abpShowPassword]", inputs: ["abpShowPassword"] }, { kind: "directive", type: PermissionDirective, selector: "[abpPermission]", inputs: ["abpPermission", "abpPermissionRunChangeDetection"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }, { kind: "pipe", type: AsyncPipe, name: "async" }], viewProviders: [
|
|
589
467
|
{
|
|
590
468
|
provide: ControlContainer,
|
|
591
469
|
useFactory: selfFactory,
|
|
@@ -611,7 +489,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
|
|
|
611
489
|
PermissionDirective,
|
|
612
490
|
LocalizationPipe,
|
|
613
491
|
AsyncPipe,
|
|
614
|
-
NgClass,
|
|
615
492
|
NgComponentOutlet,
|
|
616
493
|
NgTemplateOutlet,
|
|
617
494
|
FormsModule,
|
|
@@ -623,19 +500,140 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
|
|
|
623
500
|
},
|
|
624
501
|
{ provide: NgbDateAdapter, useClass: DateAdapter },
|
|
625
502
|
{ provide: NgbTimeAdapter, useClass: TimeAdapter },
|
|
626
|
-
], template: "<ng-container *abpPermission=\"prop.permission; runChangeDetection: false\">\r\n @switch (getComponent(prop)) {\r\n @case ('template') {\r\n <ng-container *ngComponentOutlet=\"prop.template; injector: injectorForCustomComponent\" />\r\n }\r\n }\r\n\r\n <div [
|
|
627
|
-
}], propDecorators: { data: [{
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
503
|
+
], template: "<ng-container *abpPermission=\"prop().permission; runChangeDetection: false\">\r\n @switch (getComponent(prop())) {\r\n @case ('template') {\r\n <ng-container *ngComponentOutlet=\"prop().template; injector: injectorForCustomComponent\" />\r\n }\r\n }\r\n\r\n <div [class]=\"containerClassName\" class=\"mb-2\">\r\n @switch (getComponent(prop())) {\r\n @case ('input') {\r\n <ng-template [ngTemplateOutlet]=\"label\" />\r\n <input\r\n #field\r\n [id]=\"prop().id\"\r\n [formControlName]=\"prop().name\"\r\n [autocomplete]=\"prop().autocomplete\"\r\n [type]=\"getType(prop())\"\r\n [abpDisabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n class=\"form-control\"\r\n />\r\n }\r\n @case ('hidden') {\r\n <input [formControlName]=\"prop().name\" type=\"hidden\" />\r\n }\r\n @case ('checkbox') {\r\n <div class=\"form-check\" validationTarget>\r\n <input\r\n #field\r\n [id]=\"prop().id\"\r\n [formControlName]=\"prop().name\"\r\n [abpDisabled]=\"disabled\"\r\n type=\"checkbox\"\r\n class=\"form-check-input\"\r\n />\r\n <ng-template\r\n [ngTemplateOutlet]=\"label\"\r\n [ngTemplateOutletContext]=\"{ $implicit: 'form-check-label' }\"\r\n />\r\n </div>\r\n }\r\n @case ('select') {\r\n <ng-template [ngTemplateOutlet]=\"label\" />\r\n <select\r\n #field\r\n [id]=\"prop().id\"\r\n [formControlName]=\"prop().name\"\r\n [abpDisabled]=\"disabled\"\r\n class=\"form-select form-control\"\r\n >\r\n @for (option of options$ | async; track option.value) {\r\n <option [ngValue]=\"option.value\">\r\n @if (prop().isExtra) {\r\n {{ '::' + option.key | abpLocalization }}\r\n } @else {\r\n {{ option.key }}\r\n }\r\n </option>\r\n }\r\n </select>\r\n }\r\n @case ('multiselect') {\r\n <ng-template [ngTemplateOutlet]=\"label\"></ng-template>\r\n <abp-extensible-form-multi-select\r\n [prop]=\"prop()\"\r\n [options]=\"options$ | async\"\r\n [formControlName]=\"prop().name\"\r\n [abpDisabled]=\"disabled\"\r\n />\r\n }\r\n @case ('typeahead') {\r\n <ng-template [ngTemplateOutlet]=\"label\" />\r\n <div #typeahead class=\"position-relative\" validationStyle validationTarget>\r\n <input\r\n #field\r\n [id]=\"prop().id\"\r\n [autocomplete]=\"prop().autocomplete\"\r\n [abpDisabled]=\"disabled\"\r\n [ngbTypeahead]=\"search\"\r\n [editable]=\"false\"\r\n [inputFormatter]=\"typeaheadFormatter\"\r\n [resultFormatter]=\"typeaheadFormatter\"\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n [(ngModel)]=\"typeaheadModel\"\r\n (selectItem)=\"setTypeaheadValue($event.item)\"\r\n (blur)=\"setTypeaheadValue(typeaheadModel)\"\r\n [class.is-invalid]=\"typeahead.classList.contains('is-invalid')\"\r\n class=\"form-control\"\r\n />\r\n <input [formControlName]=\"prop().name\" type=\"hidden\" />\r\n </div>\r\n }\r\n @case ('date') {\r\n <ng-template [ngTemplateOutlet]=\"label\" />\r\n <input\r\n [id]=\"prop().id\"\r\n [formControlName]=\"prop().name\"\r\n (click)=\"datepicker.open()\"\r\n (keyup.space)=\"datepicker.open()\"\r\n ngbDatepicker\r\n #datepicker=\"ngbDatepicker\"\r\n type=\"text\"\r\n class=\"form-control\"\r\n />\r\n }\r\n @case ('time') {\r\n <ng-template [ngTemplateOutlet]=\"label\" />\r\n <ngb-timepicker [formControlName]=\"prop().name\" />\r\n }\r\n @case ('dateTime') {\r\n <ng-template [ngTemplateOutlet]=\"label\" />\r\n <abp-extensible-date-time-picker [prop]=\"prop()\" [meridian]=\"meridian$ | async\" />\r\n }\r\n @case ('textarea') {\r\n <ng-template [ngTemplateOutlet]=\"label\" />\r\n <textarea\r\n #field\r\n [id]=\"prop().id\"\r\n [formControlName]=\"prop().name\"\r\n [abpDisabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n class=\"form-control\"\r\n ></textarea>\r\n }\r\n @case ('passwordinputgroup') {\r\n <ng-template [ngTemplateOutlet]=\"label\" />\r\n <div class=\"input-group form-group\" validationTarget>\r\n <input\r\n class=\"form-control\"\r\n [id]=\"prop().id\"\r\n [formControlName]=\"prop().name\"\r\n [abpShowPassword]=\"showPassword\"\r\n />\r\n <button class=\"btn btn-secondary\" type=\"button\" (click)=\"showPassword = !showPassword\">\r\n <i\r\n class=\"fa\"\r\n aria-hidden=\"true\"\r\n [class]=\"{\r\n 'fa-eye-slash': !showPassword,\r\n 'fa-eye': showPassword,\r\n }\"\r\n ></i>\r\n </button>\r\n </div>\r\n }\r\n }\r\n\r\n @if (prop().formText) {\r\n <small class=\"text-muted d-block\">{{ prop().formText | abpLocalization }}</small>\r\n }\r\n </div>\r\n</ng-container>\r\n\r\n<ng-template #label let-classes>\r\n <label [htmlFor]=\"prop().id\" [class]=\"classes || 'form-label d-inline-block'\">\r\n <span class=\"d-inline-flex align-items-center gap-1 text-nowrap\">\r\n @if (prop().displayTextResolver) {\r\n {{ prop().displayTextResolver(data()) | abpLocalization }}\r\n } @else {\r\n @if (prop().isExtra) {\r\n {{ '::' + prop().displayName | abpLocalization }}\r\n } @else {\r\n {{ prop().displayName | abpLocalization }}\r\n }\r\n }\r\n {{ asterisk }}\r\n @if (prop().tooltip) {\r\n <i\r\n [ngbTooltip]=\"prop().tooltip.text | abpLocalization\"\r\n [placement]=\"prop().tooltip.placement || 'auto'\"\r\n container=\"body\"\r\n class=\"bi bi-info-circle\"\r\n ></i>\r\n }\r\n </span>\r\n </label>\r\n</ng-template>\r\n" }]
|
|
504
|
+
}], ctorParameters: () => [], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: true }] }], prop: [{ type: i0.Input, args: [{ isSignal: true, alias: "prop", required: true }] }], first: [{ type: i0.Input, args: [{ isSignal: true, alias: "first", required: false }] }], isFirstGroup: [{ type: i0.Input, args: [{ isSignal: true, alias: "isFirstGroup", required: false }] }], fieldRef: [{ type: i0.ViewChild, args: ['field', { isSignal: true }] }] } });
|
|
505
|
+
|
|
506
|
+
class PropList extends LinkedList {
|
|
507
|
+
}
|
|
508
|
+
class PropData {
|
|
509
|
+
get data() {
|
|
510
|
+
return {
|
|
511
|
+
getInjected: this.getInjected,
|
|
512
|
+
// `record` / `index` may be signals; always use `data.record` / `data.index`.
|
|
513
|
+
index: isSignal(this.index) ? this.index() : this.index,
|
|
514
|
+
record: isSignal(this.record) ? this.record() : this.record,
|
|
515
|
+
};
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
class Prop {
|
|
519
|
+
constructor(type, name, displayName, permission, visible = _ => true, isExtra = false, template, className, formText, tooltip, displayTextResolver) {
|
|
520
|
+
this.type = type;
|
|
521
|
+
this.name = name;
|
|
522
|
+
this.displayName = displayName;
|
|
523
|
+
this.permission = permission;
|
|
524
|
+
this.visible = visible;
|
|
525
|
+
this.isExtra = isExtra;
|
|
526
|
+
this.template = template;
|
|
527
|
+
this.className = className;
|
|
528
|
+
this.formText = formText;
|
|
529
|
+
this.tooltip = tooltip;
|
|
530
|
+
this.displayTextResolver = displayTextResolver;
|
|
531
|
+
this.displayName = this.displayName || this.name;
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
class PropsFactory {
|
|
535
|
+
constructor() {
|
|
536
|
+
this.contributorCallbacks = {};
|
|
537
|
+
}
|
|
538
|
+
get(name) {
|
|
539
|
+
this.contributorCallbacks[name] = this.contributorCallbacks[name] || [];
|
|
540
|
+
return new this._ctor(this.contributorCallbacks[name]);
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
class Props {
|
|
544
|
+
get props() {
|
|
545
|
+
const propList = new this._ctor();
|
|
546
|
+
this.callbackList.forEach(callback => callback(propList));
|
|
547
|
+
return propList;
|
|
548
|
+
}
|
|
549
|
+
constructor(callbackList) {
|
|
550
|
+
this.callbackList = callbackList;
|
|
551
|
+
}
|
|
552
|
+
addContributor(contributeCallback) {
|
|
553
|
+
this.callbackList.push(contributeCallback);
|
|
554
|
+
}
|
|
555
|
+
clearContributors() {
|
|
556
|
+
while (this.callbackList.length)
|
|
557
|
+
this.callbackList.pop();
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
class FormPropList extends PropList {
|
|
562
|
+
}
|
|
563
|
+
class FormProps extends Props {
|
|
564
|
+
constructor() {
|
|
565
|
+
super(...arguments);
|
|
566
|
+
this._ctor = FormPropList;
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
class GroupedFormPropList {
|
|
570
|
+
constructor() {
|
|
571
|
+
this.items = [];
|
|
572
|
+
this.count = 1;
|
|
573
|
+
}
|
|
574
|
+
addItem(item) {
|
|
575
|
+
const groupName = item.group?.name;
|
|
576
|
+
let group = this.items.find(i => i.group?.name === groupName);
|
|
577
|
+
if (group) {
|
|
578
|
+
group.formPropList.addTail(item);
|
|
579
|
+
}
|
|
580
|
+
else {
|
|
581
|
+
group = {
|
|
582
|
+
formPropList: new FormPropList(),
|
|
583
|
+
group: item.group || { name: `default${this.count++}`, className: item.group?.className },
|
|
584
|
+
};
|
|
585
|
+
group.formPropList.addHead(item);
|
|
586
|
+
this.items.push(group);
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
class CreateFormPropsFactory extends PropsFactory {
|
|
591
|
+
constructor() {
|
|
592
|
+
super(...arguments);
|
|
593
|
+
this._ctor = FormProps;
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
class EditFormPropsFactory extends PropsFactory {
|
|
597
|
+
constructor() {
|
|
598
|
+
super(...arguments);
|
|
599
|
+
this._ctor = FormProps;
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
class FormProp extends Prop {
|
|
603
|
+
constructor(options) {
|
|
604
|
+
super(options.type, options.name, options.displayName || '', options.permission || '', options.visible, options.isExtra, options.template, options.className, options.formText, options.tooltip);
|
|
605
|
+
this.group = options.group;
|
|
606
|
+
this.className = options.className;
|
|
607
|
+
this.formText = options.formText;
|
|
608
|
+
this.tooltip = options.tooltip;
|
|
609
|
+
this.asyncValidators = options.asyncValidators || (_ => []);
|
|
610
|
+
this.validators = options.validators || (_ => []);
|
|
611
|
+
this.disabled = options.disabled || (_ => false);
|
|
612
|
+
this.readonly = options.readonly || (_ => false);
|
|
613
|
+
this.autocomplete = options.autocomplete || 'off';
|
|
614
|
+
this.options = options.options;
|
|
615
|
+
this.id = options.id || options.name;
|
|
616
|
+
const defaultValue = options.defaultValue;
|
|
617
|
+
this.defaultValue = isFalsyValue(defaultValue) ? defaultValue : defaultValue || '';
|
|
618
|
+
this.displayTextResolver = options.displayTextResolver;
|
|
619
|
+
}
|
|
620
|
+
static create(options) {
|
|
621
|
+
return new FormProp(options);
|
|
622
|
+
}
|
|
623
|
+
static createMany(arrayOfOptions) {
|
|
624
|
+
return arrayOfOptions.map(FormProp.create);
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
class FormPropData extends PropData {
|
|
628
|
+
constructor(injector, record) {
|
|
629
|
+
super();
|
|
630
|
+
this.record = record;
|
|
631
|
+
this.getInjected = injector.get.bind(injector);
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
function isFalsyValue(defaultValue) {
|
|
635
|
+
return [0, '', false].indexOf(defaultValue) > -1;
|
|
636
|
+
}
|
|
639
637
|
|
|
640
638
|
class ActionList extends LinkedList {
|
|
641
639
|
}
|
|
@@ -643,8 +641,9 @@ class ActionData {
|
|
|
643
641
|
get data() {
|
|
644
642
|
return {
|
|
645
643
|
getInjected: this.getInjected,
|
|
646
|
-
index
|
|
647
|
-
|
|
644
|
+
// `record` / `index` may be signals; always use `data.record` / `data.index`.
|
|
645
|
+
index: isSignal(this.index) ? this.index() : this.index,
|
|
646
|
+
record: isSignal(this.record) ? this.record() : this.record,
|
|
648
647
|
};
|
|
649
648
|
}
|
|
650
649
|
}
|
|
@@ -826,20 +825,28 @@ class PropDataDirective extends PropData {
|
|
|
826
825
|
super();
|
|
827
826
|
this.tempRef = inject(TemplateRef);
|
|
828
827
|
this.vcRef = inject(ViewContainerRef);
|
|
828
|
+
this.propList = input(undefined, { ...(ngDevMode ? { debugName: "propList" } : {}), alias: 'abpPropDataFromList' });
|
|
829
|
+
this.record = input.required({ ...(ngDevMode ? { debugName: "record" } : {}), alias: 'abpPropDataWithRecord' });
|
|
830
|
+
this.index = input(undefined, { ...(ngDevMode ? { debugName: "index" } : {}), alias: 'abpPropDataAtIndex' });
|
|
829
831
|
this.getInjected = injector.get.bind(injector);
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
832
|
+
// Watch for input changes and re-render
|
|
833
|
+
effect(() => {
|
|
834
|
+
// Read all inputs to track them
|
|
835
|
+
this.record();
|
|
836
|
+
this.index();
|
|
837
|
+
this.propList();
|
|
838
|
+
this.vcRef.clear();
|
|
839
|
+
this.vcRef.createEmbeddedView(this.tempRef, {
|
|
840
|
+
$implicit: this.data,
|
|
841
|
+
index: 0,
|
|
842
|
+
});
|
|
836
843
|
});
|
|
837
844
|
}
|
|
838
845
|
ngOnDestroy() {
|
|
839
846
|
this.vcRef.clear();
|
|
840
847
|
}
|
|
841
848
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: PropDataDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
842
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "
|
|
849
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.0.9", type: PropDataDirective, isStandalone: true, selector: "[abpPropData]", inputs: { propList: { classPropertyName: "propList", publicName: "abpPropDataFromList", isSignal: true, isRequired: false, transformFunction: null }, record: { classPropertyName: "record", publicName: "abpPropDataWithRecord", isSignal: true, isRequired: true, transformFunction: null }, index: { classPropertyName: "index", publicName: "abpPropDataAtIndex", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["abpPropData"], usesInheritance: true, ngImport: i0 }); }
|
|
843
850
|
}
|
|
844
851
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: PropDataDirective, decorators: [{
|
|
845
852
|
type: Directive,
|
|
@@ -847,16 +854,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
|
|
|
847
854
|
exportAs: 'abpPropData',
|
|
848
855
|
selector: '[abpPropData]',
|
|
849
856
|
}]
|
|
850
|
-
}], ctorParameters: () => [], propDecorators: { propList: [{
|
|
851
|
-
type: Input,
|
|
852
|
-
args: ['abpPropDataFromList']
|
|
853
|
-
}], record: [{
|
|
854
|
-
type: Input,
|
|
855
|
-
args: ['abpPropDataWithRecord']
|
|
856
|
-
}], index: [{
|
|
857
|
-
type: Input,
|
|
858
|
-
args: ['abpPropDataAtIndex']
|
|
859
|
-
}] } });
|
|
857
|
+
}], ctorParameters: () => [], propDecorators: { propList: [{ type: i0.Input, args: [{ isSignal: true, alias: "abpPropDataFromList", required: false }] }], record: [{ type: i0.Input, args: [{ isSignal: true, alias: "abpPropDataWithRecord", required: true }] }], index: [{ type: i0.Input, args: [{ isSignal: true, alias: "abpPropDataAtIndex", required: false }] }] } });
|
|
860
858
|
|
|
861
859
|
class ExtensibleFormComponent {
|
|
862
860
|
constructor() {
|
|
@@ -865,13 +863,18 @@ class ExtensibleFormComponent {
|
|
|
865
863
|
this.container = inject(ControlContainer);
|
|
866
864
|
this.extensions = inject(ExtensionsService);
|
|
867
865
|
this.identifier = inject(EXTENSIONS_IDENTIFIER);
|
|
866
|
+
this.formProps = viewChildren(ExtensibleFormPropComponent, ...(ngDevMode ? [{ debugName: "formProps" }] : []));
|
|
867
|
+
this.selectedRecord = input(undefined, ...(ngDevMode ? [{ debugName: "selectedRecord" }] : []));
|
|
868
868
|
this.extraPropertiesKey = EXTRA_PROPERTIES_KEY;
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
869
|
+
this.groupedPropList = signal(undefined, ...(ngDevMode ? [{ debugName: "groupedPropList" }] : []));
|
|
870
|
+
this.record = signal(undefined, ...(ngDevMode ? [{ debugName: "record" }] : []));
|
|
871
|
+
effect(() => {
|
|
872
|
+
const recordValue = this.selectedRecord();
|
|
873
|
+
const type = !recordValue || JSON.stringify(recordValue) === '{}' ? 'create' : 'edit';
|
|
874
|
+
const propList = this.extensions[`${type}FormProps`].get(this.identifier).props;
|
|
875
|
+
this.groupedPropList.set(this.createGroupedList(propList));
|
|
876
|
+
this.record.set(recordValue);
|
|
877
|
+
});
|
|
875
878
|
}
|
|
876
879
|
get form() {
|
|
877
880
|
return (this.container ? this.container.control : { controls: {} });
|
|
@@ -888,12 +891,15 @@ class ExtensibleFormComponent {
|
|
|
888
891
|
}
|
|
889
892
|
//TODO: Reactor this method
|
|
890
893
|
isAnyGroupMemberVisible(index, data) {
|
|
891
|
-
const
|
|
894
|
+
const groupedPropListValue = this.groupedPropList();
|
|
895
|
+
if (!groupedPropListValue)
|
|
896
|
+
return false;
|
|
897
|
+
const { items } = groupedPropListValue;
|
|
892
898
|
const formPropList = items[index].formPropList.toArray();
|
|
893
899
|
return formPropList.some(prop => prop.visible(data));
|
|
894
900
|
}
|
|
895
901
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: ExtensibleFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
896
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.9", type: ExtensibleFormComponent, isStandalone: true, selector: "abp-extensible-form", inputs: { selectedRecord: "selectedRecord" }, viewQueries: [{ propertyName: "formProps", predicate: ExtensibleFormPropComponent, descendants: true }], exportAs: ["abpExtensibleForm"], ngImport: i0, template: "@if (form) {\r\n
|
|
902
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.9", type: ExtensibleFormComponent, isStandalone: true, selector: "abp-extensible-form", inputs: { selectedRecord: { classPropertyName: "selectedRecord", publicName: "selectedRecord", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "formProps", predicate: ExtensibleFormPropComponent, descendants: true, isSignal: true }], exportAs: ["abpExtensibleForm"], ngImport: i0, template: "@if (form) {\r\n@for (groupedProp of groupedPropList()?.items; track i; let i = $index; let first = $first) {\r\n<ng-container *abpPropData=\"let data; fromList: groupedProp.formPropList; withRecord: record()\">\r\n @if (isAnyGroupMemberVisible(i, data) && groupedProp.group?.className) {\r\n <div [class]=\"groupedProp.group?.className\"\r\n [attr.data-name]=\"groupedProp.group?.name || groupedProp.group?.className\">\r\n <ng-container [ngTemplateOutlet]=\"propListTemplate\"\r\n [ngTemplateOutletContext]=\"{ groupedProp: groupedProp, data: data, isFirstGroup: first}\">\r\n </ng-container>\r\n </div>\r\n } @else {\r\n <ng-container [ngTemplateOutlet]=\"propListTemplate\"\r\n [ngTemplateOutletContext]=\"{ groupedProp: groupedProp, data: data, isFirstGroup: first }\">\r\n </ng-container>\r\n }\r\n</ng-container>\r\n}\r\n}\r\n\r\n<ng-template let-groupedProp=\"groupedProp\" let-data=\"data\" let-isFirstGroup=\"isFirstGroup\" #propListTemplate>\r\n @for (prop of groupedProp.formPropList; let index = $index; let first = $first; track prop.name) {\r\n @if (prop.visible(data)) {\r\n @if (extraProperties.controls[prop.name]) {\r\n <ng-container [formGroupName]=\"extraPropertiesKey\">\r\n <abp-extensible-form-prop [prop]=\"prop\" [data]=\"data\" [class]=\"prop.className\" />\r\n </ng-container>\r\n } @else {\r\n @if (form.get(prop.name)) {\r\n <abp-extensible-form-prop [class]=\"prop.className\" [prop]=\"prop\" [data]=\"data\" [first]=\"first\"\r\n [isFirstGroup]=\"isFirstGroup\" />\r\n }\r\n }\r\n }\r\n }\r\n</ng-template>", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: PropDataDirective, selector: "[abpPropData]", inputs: ["abpPropDataFromList", "abpPropDataWithRecord", "abpPropDataAtIndex"], exportAs: ["abpPropData"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "component", type: ExtensibleFormPropComponent, selector: "abp-extensible-form-prop", inputs: ["data", "prop", "first", "isFirstGroup"] }], viewProviders: [
|
|
897
903
|
{
|
|
898
904
|
provide: ControlContainer,
|
|
899
905
|
useFactory: selfFactory,
|
|
@@ -903,19 +909,14 @@ class ExtensibleFormComponent {
|
|
|
903
909
|
}
|
|
904
910
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: ExtensibleFormComponent, decorators: [{
|
|
905
911
|
type: Component,
|
|
906
|
-
args: [{ exportAs: 'abpExtensibleForm', selector: 'abp-extensible-form', imports: [
|
|
912
|
+
args: [{ exportAs: 'abpExtensibleForm', selector: 'abp-extensible-form', imports: [NgTemplateOutlet, PropDataDirective, ReactiveFormsModule, ExtensibleFormPropComponent], changeDetection: ChangeDetectionStrategy.OnPush, viewProviders: [
|
|
907
913
|
{
|
|
908
914
|
provide: ControlContainer,
|
|
909
915
|
useFactory: selfFactory,
|
|
910
916
|
deps: [[new Optional(), new SkipSelf(), ControlContainer]],
|
|
911
917
|
},
|
|
912
|
-
], template: "@if (form) {\r\n
|
|
913
|
-
}], propDecorators: { formProps: [{
|
|
914
|
-
type: ViewChildren,
|
|
915
|
-
args: [ExtensibleFormPropComponent]
|
|
916
|
-
}], selectedRecord: [{
|
|
917
|
-
type: Input
|
|
918
|
-
}] } });
|
|
918
|
+
], template: "@if (form) {\r\n@for (groupedProp of groupedPropList()?.items; track i; let i = $index; let first = $first) {\r\n<ng-container *abpPropData=\"let data; fromList: groupedProp.formPropList; withRecord: record()\">\r\n @if (isAnyGroupMemberVisible(i, data) && groupedProp.group?.className) {\r\n <div [class]=\"groupedProp.group?.className\"\r\n [attr.data-name]=\"groupedProp.group?.name || groupedProp.group?.className\">\r\n <ng-container [ngTemplateOutlet]=\"propListTemplate\"\r\n [ngTemplateOutletContext]=\"{ groupedProp: groupedProp, data: data, isFirstGroup: first}\">\r\n </ng-container>\r\n </div>\r\n } @else {\r\n <ng-container [ngTemplateOutlet]=\"propListTemplate\"\r\n [ngTemplateOutletContext]=\"{ groupedProp: groupedProp, data: data, isFirstGroup: first }\">\r\n </ng-container>\r\n }\r\n</ng-container>\r\n}\r\n}\r\n\r\n<ng-template let-groupedProp=\"groupedProp\" let-data=\"data\" let-isFirstGroup=\"isFirstGroup\" #propListTemplate>\r\n @for (prop of groupedProp.formPropList; let index = $index; let first = $first; track prop.name) {\r\n @if (prop.visible(data)) {\r\n @if (extraProperties.controls[prop.name]) {\r\n <ng-container [formGroupName]=\"extraPropertiesKey\">\r\n <abp-extensible-form-prop [prop]=\"prop\" [data]=\"data\" [class]=\"prop.className\" />\r\n </ng-container>\r\n } @else {\r\n @if (form.get(prop.name)) {\r\n <abp-extensible-form-prop [class]=\"prop.className\" [prop]=\"prop\" [data]=\"data\" [first]=\"first\"\r\n [isFirstGroup]=\"isFirstGroup\" />\r\n }\r\n }\r\n }\r\n }\r\n</ng-template>" }]
|
|
919
|
+
}], ctorParameters: () => [], propDecorators: { formProps: [{ type: i0.ViewChildren, args: [i0.forwardRef(() => ExtensibleFormPropComponent), { isSignal: true }] }], selectedRecord: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedRecord", required: false }] }] } });
|
|
919
920
|
|
|
920
921
|
// Fix for https://github.com/angular/angular/issues/23904
|
|
921
922
|
// @dynamic
|
|
@@ -923,6 +924,7 @@ class AbstractActionsComponent extends ActionData {
|
|
|
923
924
|
constructor() {
|
|
924
925
|
const injector = inject(Injector);
|
|
925
926
|
super();
|
|
927
|
+
this.record = input.required(...(ngDevMode ? [{ debugName: "record" }] : []));
|
|
926
928
|
this.getInjected = injector.get.bind(injector);
|
|
927
929
|
const extensions = injector.get(ExtensionsService);
|
|
928
930
|
const name = injector.get(EXTENSIONS_IDENTIFIER);
|
|
@@ -930,28 +932,27 @@ class AbstractActionsComponent extends ActionData {
|
|
|
930
932
|
this.actionList = extensions[type].get(name).actions;
|
|
931
933
|
}
|
|
932
934
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: AbstractActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
933
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "
|
|
935
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.0.9", type: AbstractActionsComponent, isStandalone: true, inputs: { record: { classPropertyName: "record", publicName: "record", isSignal: true, isRequired: true, transformFunction: null } }, usesInheritance: true, ngImport: i0 }); }
|
|
934
936
|
}
|
|
935
937
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: AbstractActionsComponent, decorators: [{
|
|
936
938
|
type: Directive
|
|
937
|
-
}], ctorParameters: () => [], propDecorators: { record: [{
|
|
938
|
-
type: Input
|
|
939
|
-
}] } });
|
|
939
|
+
}], ctorParameters: () => [], propDecorators: { record: [{ type: i0.Input, args: [{ isSignal: true, alias: "record", required: true }] }] } });
|
|
940
940
|
|
|
941
941
|
class GridActionsComponent extends AbstractActionsComponent {
|
|
942
942
|
constructor() {
|
|
943
943
|
super();
|
|
944
|
-
this.icon = 'fa fa-cog';
|
|
945
|
-
this.
|
|
944
|
+
this.icon = input('fa fa-cog', ...(ngDevMode ? [{ debugName: "icon" }] : []));
|
|
945
|
+
this.index = input(undefined, ...(ngDevMode ? [{ debugName: "index" }] : []));
|
|
946
|
+
this.text = input('', ...(ngDevMode ? [{ debugName: "text" }] : []));
|
|
946
947
|
this.trackByFn = (_, item) => item.text;
|
|
947
948
|
}
|
|
948
949
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: GridActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
949
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.9", type: GridActionsComponent, isStandalone: true, selector: "abp-grid-actions", inputs: { icon: "icon", index: "index", text: "text" }, providers: [
|
|
950
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.9", type: GridActionsComponent, isStandalone: true, selector: "abp-grid-actions", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, index: { classPropertyName: "index", publicName: "index", isSignal: true, isRequired: false, transformFunction: null }, text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
|
|
950
951
|
{
|
|
951
952
|
provide: EXTENSIONS_ACTION_TYPE,
|
|
952
953
|
useValue: 'entityActions',
|
|
953
954
|
},
|
|
954
|
-
], exportAs: ["abpGridActions"], usesInheritance: true, ngImport: i0, template: "@if (actionList.length > 1) {\r\n
|
|
955
|
+
], exportAs: ["abpGridActions"], usesInheritance: true, ngImport: i0, template: "@if (actionList.length > 1) {\r\n<div ngbDropdown container=\"body\" class=\"d-inline-block\">\r\n <button class=\"btn btn-primary btn-sm dropdown-toggle\" data-toggle=\"dropdown\" aria-haspopup=\"true\" ngbDropdownToggle>\r\n <i [class]=\"icon()\" [class.me-1]=\"icon()\"></i>{{ text() | abpLocalization }}\r\n </button>\r\n <div ngbDropdownMenu>\r\n @for (action of actionList; track action.text) {\r\n <ng-container [ngTemplateOutlet]=\"dropDownBtnItemTmp\" [ngTemplateOutletContext]=\"{ $implicit: action }\">\r\n </ng-container>\r\n }\r\n </div>\r\n</div>\r\n}\r\n\r\n@if (actionList.length === 1) {\r\n<ng-container [ngTemplateOutlet]=\"btnTmp\"\r\n [ngTemplateOutletContext]=\"{ $implicit: actionList.get(0).value }\"></ng-container>\r\n}\r\n\r\n<ng-template #dropDownBtnItemTmp let-action>\r\n @if (action.visible(data)) {\r\n <button ngbDropdownItem *abpPermission=\"action.permission; runChangeDetection: false\" (click)=\"action.action(data)\"\r\n type=\"button\">\r\n <ng-container *ngTemplateOutlet=\"buttonContentTmp; context: { $implicit: action }\"></ng-container>\r\n </button>\r\n }\r\n</ng-template>\r\n\r\n<ng-template #buttonContentTmp let-action>\r\n <i [class]=\"action.icon\" [class.me-1]=\"action.icon && !action.showOnlyIcon\"></i>\r\n @if (!action.showOnlyIcon) {\r\n @if (action.icon) {\r\n <span>{{ action.text | abpLocalization }}</span>\r\n } @else {\r\n <div abpEllipsis>{{ action.text | abpLocalization }}</div>\r\n }\r\n }\r\n</ng-template>\r\n\r\n<ng-template #btnTmp let-action>\r\n @if (action.visible(data)) {\r\n @if (action.tooltip) {\r\n <button *abpPermission=\"action.permission; runChangeDetection: false\" (click)=\"action.action(data)\" type=\"button\"\r\n [class]=\"action.btnClass\" [style]=\"action.btnStyle\" [ngbTooltip]=\"action.tooltip.text | abpLocalization\"\r\n [placement]=\"action.tooltip.placement || 'auto'\" triggers=\"hover\" container=\"body\">\r\n <ng-container *ngTemplateOutlet=\"buttonContentTmp; context: { $implicit: action }\"></ng-container>\r\n </button>\r\n } @else {\r\n <button *abpPermission=\"action.permission; runChangeDetection: false\" (click)=\"action.action(data)\" type=\"button\"\r\n [class]=\"action.btnClass\" [style]=\"action.btnStyle\">\r\n <ng-container *ngTemplateOutlet=\"buttonContentTmp; context: { $implicit: action }\"></ng-container>\r\n </button>\r\n }\r\n }\r\n</ng-template>", dependencies: [{ kind: "ngmodule", type: NgbDropdownModule }, { kind: "directive", type: i1.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i1.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i1.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "directive", type: i1.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["tabindex", "disabled"] }, { kind: "directive", type: i1.NgbDropdownButtonItem, selector: "button[ngbDropdownItem]" }, { kind: "directive", type: EllipsisDirective, selector: "[abpEllipsis]", inputs: ["abpEllipsis", "title", "abpEllipsisEnabled"] }, { kind: "directive", type: PermissionDirective, selector: "[abpPermission]", inputs: ["abpPermission", "abpPermissionRunChangeDetection"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: NgbTooltipModule }, { kind: "directive", type: i1.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
955
956
|
}
|
|
956
957
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: GridActionsComponent, decorators: [{
|
|
957
958
|
type: Component,
|
|
@@ -959,7 +960,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
|
|
|
959
960
|
NgbDropdownModule,
|
|
960
961
|
EllipsisDirective,
|
|
961
962
|
PermissionDirective,
|
|
962
|
-
NgClass,
|
|
963
963
|
LocalizationPipe,
|
|
964
964
|
NgTemplateOutlet,
|
|
965
965
|
NgbTooltipModule,
|
|
@@ -968,29 +968,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
|
|
|
968
968
|
provide: EXTENSIONS_ACTION_TYPE,
|
|
969
969
|
useValue: 'entityActions',
|
|
970
970
|
},
|
|
971
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (actionList.length > 1) {\r\n
|
|
972
|
-
}], ctorParameters: () => [], propDecorators: { icon: [{
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
971
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (actionList.length > 1) {\r\n<div ngbDropdown container=\"body\" class=\"d-inline-block\">\r\n <button class=\"btn btn-primary btn-sm dropdown-toggle\" data-toggle=\"dropdown\" aria-haspopup=\"true\" ngbDropdownToggle>\r\n <i [class]=\"icon()\" [class.me-1]=\"icon()\"></i>{{ text() | abpLocalization }}\r\n </button>\r\n <div ngbDropdownMenu>\r\n @for (action of actionList; track action.text) {\r\n <ng-container [ngTemplateOutlet]=\"dropDownBtnItemTmp\" [ngTemplateOutletContext]=\"{ $implicit: action }\">\r\n </ng-container>\r\n }\r\n </div>\r\n</div>\r\n}\r\n\r\n@if (actionList.length === 1) {\r\n<ng-container [ngTemplateOutlet]=\"btnTmp\"\r\n [ngTemplateOutletContext]=\"{ $implicit: actionList.get(0).value }\"></ng-container>\r\n}\r\n\r\n<ng-template #dropDownBtnItemTmp let-action>\r\n @if (action.visible(data)) {\r\n <button ngbDropdownItem *abpPermission=\"action.permission; runChangeDetection: false\" (click)=\"action.action(data)\"\r\n type=\"button\">\r\n <ng-container *ngTemplateOutlet=\"buttonContentTmp; context: { $implicit: action }\"></ng-container>\r\n </button>\r\n }\r\n</ng-template>\r\n\r\n<ng-template #buttonContentTmp let-action>\r\n <i [class]=\"action.icon\" [class.me-1]=\"action.icon && !action.showOnlyIcon\"></i>\r\n @if (!action.showOnlyIcon) {\r\n @if (action.icon) {\r\n <span>{{ action.text | abpLocalization }}</span>\r\n } @else {\r\n <div abpEllipsis>{{ action.text | abpLocalization }}</div>\r\n }\r\n }\r\n</ng-template>\r\n\r\n<ng-template #btnTmp let-action>\r\n @if (action.visible(data)) {\r\n @if (action.tooltip) {\r\n <button *abpPermission=\"action.permission; runChangeDetection: false\" (click)=\"action.action(data)\" type=\"button\"\r\n [class]=\"action.btnClass\" [style]=\"action.btnStyle\" [ngbTooltip]=\"action.tooltip.text | abpLocalization\"\r\n [placement]=\"action.tooltip.placement || 'auto'\" triggers=\"hover\" container=\"body\">\r\n <ng-container *ngTemplateOutlet=\"buttonContentTmp; context: { $implicit: action }\"></ng-container>\r\n </button>\r\n } @else {\r\n <button *abpPermission=\"action.permission; runChangeDetection: false\" (click)=\"action.action(data)\" type=\"button\"\r\n [class]=\"action.btnClass\" [style]=\"action.btnStyle\">\r\n <ng-container *ngTemplateOutlet=\"buttonContentTmp; context: { $implicit: action }\"></ng-container>\r\n </button>\r\n }\r\n }\r\n</ng-template>" }]
|
|
972
|
+
}], ctorParameters: () => [], propDecorators: { icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], index: [{ type: i0.Input, args: [{ isSignal: true, alias: "index", required: false }] }], text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: false }] }] } });
|
|
973
|
+
|
|
974
|
+
class ExtensibleTableRowDetailComponent {
|
|
975
|
+
constructor() {
|
|
976
|
+
this.rowHeight = input('100%', ...(ngDevMode ? [{ debugName: "rowHeight" }] : []));
|
|
977
|
+
this.template = contentChild((TemplateRef), ...(ngDevMode ? [{ debugName: "template" }] : []));
|
|
978
|
+
}
|
|
979
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: ExtensibleTableRowDetailComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
980
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.0.9", type: ExtensibleTableRowDetailComponent, isStandalone: true, selector: "abp-extensible-table-row-detail", inputs: { rowHeight: { classPropertyName: "rowHeight", publicName: "rowHeight", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "template", first: true, predicate: (TemplateRef), descendants: true, isSignal: true }], ngImport: i0, template: '', isInline: true }); }
|
|
981
|
+
}
|
|
982
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: ExtensibleTableRowDetailComponent, decorators: [{
|
|
983
|
+
type: Component,
|
|
984
|
+
args: [{
|
|
985
|
+
selector: 'abp-extensible-table-row-detail',
|
|
986
|
+
template: '',
|
|
987
|
+
}]
|
|
988
|
+
}], propDecorators: { rowHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowHeight", required: false }] }], template: [{ type: i0.ContentChild, args: [i0.forwardRef(() => TemplateRef), { isSignal: true }] }] } });
|
|
979
989
|
|
|
980
990
|
const DEFAULT_ACTIONS_COLUMN_WIDTH = 150;
|
|
981
991
|
class ExtensibleTableComponent {
|
|
982
992
|
#injector;
|
|
983
|
-
|
|
984
|
-
this.
|
|
993
|
+
get data() {
|
|
994
|
+
return this._data();
|
|
985
995
|
}
|
|
986
|
-
|
|
987
|
-
|
|
996
|
+
set data(value) {
|
|
997
|
+
this._data.set(value);
|
|
988
998
|
}
|
|
989
|
-
|
|
990
|
-
this.
|
|
999
|
+
get effectiveRowDetailTemplate() {
|
|
1000
|
+
return this.rowDetailComponent()?.template() ?? this.rowDetailTemplate();
|
|
991
1001
|
}
|
|
992
|
-
|
|
993
|
-
this.
|
|
1002
|
+
get effectiveRowDetailHeight() {
|
|
1003
|
+
return this.rowDetailComponent()?.rowHeight() ?? this.rowDetailHeight();
|
|
994
1004
|
}
|
|
995
1005
|
constructor() {
|
|
996
1006
|
this.#injector = inject(Injector);
|
|
@@ -1003,19 +1013,41 @@ class ExtensibleTableComponent {
|
|
|
1003
1013
|
this.permissionService = inject(PermissionService);
|
|
1004
1014
|
this.platformId = inject(PLATFORM_ID);
|
|
1005
1015
|
this.isBrowser = isPlatformBrowser(this.platformId);
|
|
1006
|
-
|
|
1007
|
-
this.
|
|
1008
|
-
this.
|
|
1009
|
-
this.
|
|
1010
|
-
this.
|
|
1011
|
-
|
|
1012
|
-
this.
|
|
1013
|
-
this.
|
|
1014
|
-
this.
|
|
1015
|
-
this.
|
|
1016
|
-
this.
|
|
1017
|
-
|
|
1016
|
+
// Input signals
|
|
1017
|
+
this.actionsTextInput = input(undefined, { ...(ngDevMode ? { debugName: "actionsTextInput" } : {}), alias: 'actionsText' });
|
|
1018
|
+
this.dataInput = input([], { ...(ngDevMode ? { debugName: "dataInput" } : {}), alias: 'data' });
|
|
1019
|
+
this.list = input.required(...(ngDevMode ? [{ debugName: "list" }] : []));
|
|
1020
|
+
this.recordsTotal = input.required(...(ngDevMode ? [{ debugName: "recordsTotal" }] : []));
|
|
1021
|
+
this.actionsColumnWidthInput = input(undefined, { ...(ngDevMode ? { debugName: "actionsColumnWidthInput" } : {}), alias: 'actionsColumnWidth' });
|
|
1022
|
+
this.actionsTemplate = input(undefined, ...(ngDevMode ? [{ debugName: "actionsTemplate" }] : []));
|
|
1023
|
+
this.selectable = input(false, ...(ngDevMode ? [{ debugName: "selectable" }] : []));
|
|
1024
|
+
this.selectionTypeInput = input(SelectionType.multiClick, { ...(ngDevMode ? { debugName: "selectionTypeInput" } : {}), alias: 'selectionType' });
|
|
1025
|
+
this.selected = input([], ...(ngDevMode ? [{ debugName: "selected" }] : []));
|
|
1026
|
+
this.infiniteScroll = input(false, ...(ngDevMode ? [{ debugName: "infiniteScroll" }] : []));
|
|
1027
|
+
this.isLoading = input(false, ...(ngDevMode ? [{ debugName: "isLoading" }] : []));
|
|
1028
|
+
this.scrollThreshold = input(10, ...(ngDevMode ? [{ debugName: "scrollThreshold" }] : []));
|
|
1029
|
+
this.tableHeight = input(undefined, ...(ngDevMode ? [{ debugName: "tableHeight" }] : []));
|
|
1030
|
+
this.rowDetailTemplate = input(undefined, ...(ngDevMode ? [{ debugName: "rowDetailTemplate" }] : []));
|
|
1031
|
+
this.rowDetailHeight = input('100%', ...(ngDevMode ? [{ debugName: "rowDetailHeight" }] : []));
|
|
1032
|
+
// Output signals
|
|
1033
|
+
this.tableActivate = output();
|
|
1034
|
+
this.selectionChange = output();
|
|
1035
|
+
this.loadMore = output();
|
|
1036
|
+
this.rowDetailToggle = output();
|
|
1037
|
+
// Internal signals
|
|
1038
|
+
this._data = signal([], ...(ngDevMode ? [{ debugName: "_data" }] : []));
|
|
1018
1039
|
this._actionsColumnWidth = signal(DEFAULT_ACTIONS_COLUMN_WIDTH, ...(ngDevMode ? [{ debugName: "_actionsColumnWidth" }] : []));
|
|
1040
|
+
this.rowDetailComponent = contentChild(ExtensibleTableRowDetailComponent, ...(ngDevMode ? [{ debugName: "rowDetailComponent" }] : []));
|
|
1041
|
+
this.table = viewChild.required('table');
|
|
1042
|
+
// Computed values
|
|
1043
|
+
this.actionsText = computed(() => {
|
|
1044
|
+
return this.actionsTextInput() ?? (this.actionList.length >= 1 ? 'AbpUi::Actions' : '');
|
|
1045
|
+
}, ...(ngDevMode ? [{ debugName: "actionsText" }] : []));
|
|
1046
|
+
this.selectionType = computed(() => {
|
|
1047
|
+
const value = this.selectionTypeInput();
|
|
1048
|
+
return typeof value === 'string' ? SelectionType[value] : value;
|
|
1049
|
+
}, ...(ngDevMode ? [{ debugName: "selectionType" }] : []));
|
|
1050
|
+
this.trackByFn = (_, item) => item.name;
|
|
1019
1051
|
// Infinite scroll: debounced load more subject
|
|
1020
1052
|
this.loadMoreSubject = new Subject();
|
|
1021
1053
|
this.loadMoreSubscription = this.loadMoreSubject
|
|
@@ -1031,6 +1063,49 @@ class ExtensibleTableComponent {
|
|
|
1031
1063
|
.actions;
|
|
1032
1064
|
this.hasAtLeastOnePermittedAction =
|
|
1033
1065
|
this.permissionService.filterItemsByPolicy(this.actionList.toArray().map(action => ({ requiredPolicy: action.permission }))).length > 0;
|
|
1066
|
+
// Watch actionsColumnWidth input
|
|
1067
|
+
effect(() => {
|
|
1068
|
+
const width = this.actionsColumnWidthInput();
|
|
1069
|
+
this._actionsColumnWidth.set(width ? Number(width) : undefined);
|
|
1070
|
+
});
|
|
1071
|
+
// Watch data input changes
|
|
1072
|
+
effect(() => {
|
|
1073
|
+
const dataValue = this.dataInput();
|
|
1074
|
+
if (!dataValue)
|
|
1075
|
+
return;
|
|
1076
|
+
if (dataValue.length < 1) {
|
|
1077
|
+
this.list().totalCount = this.recordsTotal();
|
|
1078
|
+
}
|
|
1079
|
+
this._data.set(dataValue.map((record, index) => this.prepareRecord(record, index)));
|
|
1080
|
+
});
|
|
1081
|
+
}
|
|
1082
|
+
prepareRecord(record, index) {
|
|
1083
|
+
this.propList.forEach(prop => {
|
|
1084
|
+
const propData = { getInjected: this.getInjected, record, index };
|
|
1085
|
+
const value = this.getContent(prop.value, propData);
|
|
1086
|
+
const propKey = `_${prop.value.name}`;
|
|
1087
|
+
record[propKey] = {
|
|
1088
|
+
visible: prop.value.visible(propData),
|
|
1089
|
+
value,
|
|
1090
|
+
};
|
|
1091
|
+
if (prop.value.component) {
|
|
1092
|
+
record[propKey].injector = Injector.create({
|
|
1093
|
+
providers: [
|
|
1094
|
+
{
|
|
1095
|
+
provide: PROP_DATA_STREAM,
|
|
1096
|
+
useValue: value,
|
|
1097
|
+
},
|
|
1098
|
+
{
|
|
1099
|
+
provide: ROW_RECORD,
|
|
1100
|
+
useValue: record,
|
|
1101
|
+
},
|
|
1102
|
+
],
|
|
1103
|
+
parent: this.#injector,
|
|
1104
|
+
});
|
|
1105
|
+
record[propKey].component = prop.value.component;
|
|
1106
|
+
}
|
|
1107
|
+
});
|
|
1108
|
+
return record;
|
|
1034
1109
|
}
|
|
1035
1110
|
getIcon(value) {
|
|
1036
1111
|
return value
|
|
@@ -1056,41 +1131,6 @@ class ExtensibleTableComponent {
|
|
|
1056
1131
|
}
|
|
1057
1132
|
}));
|
|
1058
1133
|
}
|
|
1059
|
-
ngOnChanges({ data }) {
|
|
1060
|
-
if (!data?.currentValue)
|
|
1061
|
-
return;
|
|
1062
|
-
if (data.currentValue.length < 1) {
|
|
1063
|
-
this.list.totalCount = this.recordsTotal;
|
|
1064
|
-
}
|
|
1065
|
-
this.data = data.currentValue.map((record, index) => {
|
|
1066
|
-
this.propList.forEach(prop => {
|
|
1067
|
-
const propData = { getInjected: this.getInjected, record, index };
|
|
1068
|
-
const value = this.getContent(prop.value, propData);
|
|
1069
|
-
const propKey = `_${prop.value.name}`;
|
|
1070
|
-
record[propKey] = {
|
|
1071
|
-
visible: prop.value.visible(propData),
|
|
1072
|
-
value,
|
|
1073
|
-
};
|
|
1074
|
-
if (prop.value.component) {
|
|
1075
|
-
record[propKey].injector = Injector.create({
|
|
1076
|
-
providers: [
|
|
1077
|
-
{
|
|
1078
|
-
provide: PROP_DATA_STREAM,
|
|
1079
|
-
useValue: value,
|
|
1080
|
-
},
|
|
1081
|
-
{
|
|
1082
|
-
provide: ROW_RECORD,
|
|
1083
|
-
useValue: record,
|
|
1084
|
-
},
|
|
1085
|
-
],
|
|
1086
|
-
parent: this.#injector,
|
|
1087
|
-
});
|
|
1088
|
-
record[propKey].component = prop.value.component;
|
|
1089
|
-
}
|
|
1090
|
-
});
|
|
1091
|
-
return record;
|
|
1092
|
-
});
|
|
1093
|
-
}
|
|
1094
1134
|
isVisibleActions(rowData) {
|
|
1095
1135
|
const actions = this.actionList.toArray();
|
|
1096
1136
|
const visibleActions = actions.filter(action => {
|
|
@@ -1108,8 +1148,9 @@ class ExtensibleTableComponent {
|
|
|
1108
1148
|
return visibleActions.length > 0;
|
|
1109
1149
|
}
|
|
1110
1150
|
onSelect({ selected }) {
|
|
1111
|
-
this.selected
|
|
1112
|
-
|
|
1151
|
+
const selectedValue = this.selected();
|
|
1152
|
+
selectedValue.splice(0, selectedValue.length);
|
|
1153
|
+
selectedValue.push(...selected);
|
|
1113
1154
|
this.selectionChange.emit(selected);
|
|
1114
1155
|
}
|
|
1115
1156
|
onScroll(scrollEvent) {
|
|
@@ -1125,24 +1166,34 @@ class ExtensibleTableComponent {
|
|
|
1125
1166
|
}
|
|
1126
1167
|
}
|
|
1127
1168
|
shouldHandleScroll() {
|
|
1128
|
-
return this.infiniteScroll && !this.isLoading;
|
|
1169
|
+
return this.infiniteScroll() && !this.isLoading();
|
|
1129
1170
|
}
|
|
1130
1171
|
isNearScrollBottom(element) {
|
|
1131
1172
|
const { offsetHeight, scrollTop, scrollHeight } = element;
|
|
1132
|
-
return offsetHeight + scrollTop >= scrollHeight - this.scrollThreshold;
|
|
1173
|
+
return offsetHeight + scrollTop >= scrollHeight - this.scrollThreshold();
|
|
1133
1174
|
}
|
|
1134
1175
|
triggerLoadMore() {
|
|
1135
1176
|
this.loadMore.emit();
|
|
1136
1177
|
}
|
|
1137
1178
|
getTableHeight() {
|
|
1138
|
-
if (!this.infiniteScroll)
|
|
1179
|
+
if (!this.infiniteScroll())
|
|
1139
1180
|
return 'auto';
|
|
1140
|
-
|
|
1181
|
+
const tableHeight = this.tableHeight();
|
|
1182
|
+
return tableHeight ? `${tableHeight}px` : 'auto';
|
|
1183
|
+
}
|
|
1184
|
+
toggleExpandRow(row) {
|
|
1185
|
+
const table = this.table();
|
|
1186
|
+
if (table && table.rowDetail) {
|
|
1187
|
+
table.rowDetail.toggleExpandRow(row);
|
|
1188
|
+
}
|
|
1189
|
+
this.rowDetailToggle.emit(row);
|
|
1141
1190
|
}
|
|
1142
1191
|
ngAfterViewInit() {
|
|
1143
|
-
if (!this.infiniteScroll) {
|
|
1144
|
-
this.list
|
|
1145
|
-
|
|
1192
|
+
if (!this.infiniteScroll()) {
|
|
1193
|
+
this.list()
|
|
1194
|
+
?.requestStatus$?.pipe(filter(status => status === 'loading'))
|
|
1195
|
+
.subscribe(() => {
|
|
1196
|
+
this._data.set([]);
|
|
1146
1197
|
this.cdr.markForCheck();
|
|
1147
1198
|
});
|
|
1148
1199
|
}
|
|
@@ -1151,7 +1202,7 @@ class ExtensibleTableComponent {
|
|
|
1151
1202
|
this.loadMoreSubscription.unsubscribe();
|
|
1152
1203
|
}
|
|
1153
1204
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: ExtensibleTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1154
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.9", type: ExtensibleTableComponent, isStandalone: true, selector: "abp-extensible-table", inputs: { actionsText: "actionsText", data: "data", list: "list", recordsTotal: "recordsTotal", actionsColumnWidth: "actionsColumnWidth", actionsTemplate: "actionsTemplate", selectable: "selectable", selectionType: "selectionType", selected: "selected", infiniteScroll: "infiniteScroll", isLoading: "isLoading", scrollThreshold: "scrollThreshold", tableHeight: "tableHeight" }, outputs: { tableActivate: "tableActivate", selectionChange: "selectionChange", loadMore: "loadMore" }, exportAs: ["abpExtensibleTable"], usesOnChanges: true, ngImport: i0, template: "@if (isBrowser) {\r\n <ngx-datatable\r\n default\r\n [rows]=\"data\"\r\n [count]=\"recordsTotal\"\r\n [list]=\"list\"\r\n [selectionType]=\"selectable ? _selectionType : undefined\"\r\n (activate)=\"tableActivate.emit($event)\"\r\n (select)=\"onSelect($event)\"\r\n [selected]=\"selected\"\r\n (scroll)=\"onScroll($event)\"\r\n [scrollbarV]=\"infiniteScroll\"\r\n [style.height]=\"getTableHeight()\"\r\n [loadingIndicator]=\"infiniteScroll && isLoading\"\r\n [footerHeight]=\"infiniteScroll ? false : 50\"\r\n>\r\n@if(selectable) {\r\n <ngx-datatable-column [width]=\"50\" [sortable]=\"false\" [canAutoResize]=\"false\" [draggable]=\"false\" [resizeable]=\"false\">\r\n\r\n <ng-template ngx-datatable-header-template let-value=\"value\" let-allRowsSelected=\"allRowsSelected\"\r\n let-selectFn=\"selectFn\">\r\n @if (_selectionType !== 'single') {\r\n <div class=\"form-check\">\r\n <input class=\"form-check-input table-check\" type=\"checkbox\" [checked]=\"allRowsSelected\"\r\n (change)=\"selectFn(!allRowsSelected)\" />\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <ng-template ngx-datatable-cell-template let-value=\"value\" let-row=\"row\" let-isSelected=\"isSelected\"\r\n let-onCheckboxChangeFn=\"onCheckboxChangeFn\">\r\n @if(_selectionType === 'single') {\r\n <div class=\"h-100 form-check form-check-sm form-check-custom form-check-solid\">\r\n <input class=\"form-check-input\" type=\"radio\" [checked]=\"isSelected\" (change)=\"onCheckboxChangeFn($event)\" />\r\n </div>\r\n }\r\n @if (_selectionType !== 'single') {\r\n <div class=\"h-100 form-check form-check-sm form-check-custom form-check-solid\">\r\n <input class=\"form-check-input\" type=\"checkbox\" [checked]=\"isSelected\" (change)=\"onCheckboxChangeFn($event)\" />\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n </ngx-datatable-column>\r\n }\r\n @if (actionsTemplate || (actionList.length && hasAtLeastOnePermittedAction)) {\r\n <ngx-datatable-column\r\n [name]=\"actionsText | abpLocalization\"\r\n [maxWidth]=\"_actionsColumnWidth() ?? undefined\"\r\n [width]=\"_actionsColumnWidth() ?? 200\"\r\n [canAutoResize]=\"!_actionsColumnWidth()\"\r\n [sortable]=\"false\"\r\n >\r\n <ng-template let-row=\"row\" let-i=\"rowIndex\" ngx-datatable-cell-template>\r\n <ng-container\r\n *ngTemplateOutlet=\"actionsTemplate || gridActions; context: { $implicit: row, index: i }\"\r\n ></ng-container>\r\n <ng-template #gridActions>\r\n @if (isVisibleActions(row)) {\r\n <abp-grid-actions [index]=\"i\" [record]=\"row\" text=\"AbpUi::Actions\"></abp-grid-actions>\r\n }\r\n </ng-template>\r\n </ng-template>\r\n </ngx-datatable-column>\r\n }\r\n @for (prop of propList; track prop.name; let i = $index) {\r\n <ngx-datatable-column\r\n *abpVisible=\"prop.columnVisible(getInjected)\"\r\n [width]=\"columnWidths[i] ?? 200\"\r\n [canAutoResize]=\"!columnWidths[i]\"\r\n [name]=\"(prop.isExtra ? '::' + prop.displayName : prop.displayName) | abpLocalization\"\r\n [prop]=\"prop.name\"\r\n [sortable]=\"prop.sortable\"\r\n >\r\n <ng-template ngx-datatable-header-template let-column=\"column\" let-sortFn=\"sortFn\">\r\n @if (prop.tooltip) {\r\n <span\r\n [ngbTooltip]=\"prop.tooltip.text | abpLocalization\"\r\n [placement]=\"prop.tooltip.placement || 'auto'\"\r\n container=\"body\"\r\n [class.pointer]=\"prop.sortable\"\r\n (click)=\"prop.sortable && sortFn(column)\"\r\n >\r\n {{ column.name }} <i class=\"fa fa-info-circle\" aria-hidden=\"true\"></i>\r\n </span>\r\n } @else {\r\n <span\r\n [class.pointer]=\"prop.sortable\"\r\n (click)=\"prop.sortable && sortFn(column)\"\r\n >\r\n {{ column.name }}\r\n </span>\r\n }\r\n </ng-template>\r\n <ng-template let-row=\"row\" let-i=\"index\" ngx-datatable-cell-template>\r\n <ng-container *abpPermission=\"prop.permission; runChangeDetection: false\">\r\n <ng-container *abpVisible=\"row['_' + prop.name]?.visible\">\r\n @if (!row['_' + prop.name].component) {\r\n @if (prop.type === 'datetime' || prop.type === 'date' || prop.type === 'time') {\r\n <div\r\n [innerHTML]=\"\r\n !prop.isExtra\r\n ? (row['_' + prop.name]?.value | async | abpUtcToLocal:prop.type)\r\n : ('::' + (row['_' + prop.name]?.value | async | abpUtcToLocal:prop.type) | abpLocalization)\r\n \"\r\n (click)=\"\r\n prop.action && prop.action({ getInjected: getInjected, record: row, index: i })\r\n \"\r\n [ngClass]=\"entityPropTypeClasses[prop.type]\"\r\n [class.pointer]=\"prop.action\"\r\n ></div>\r\n } @else {\r\n <div\r\n [innerHTML]=\"\r\n !prop.isExtra\r\n ? (row['_' + prop.name]?.value | async)\r\n : ('::' + (row['_' + prop.name]?.value | async) | abpLocalization)\r\n \"\r\n (click)=\"\r\n prop.action && prop.action({ getInjected: getInjected, record: row, index: i })\r\n \"\r\n [ngClass]=\"entityPropTypeClasses[prop.type]\"\r\n [class.pointer]=\"prop.action\"\r\n ></div>\r\n }\r\n } @else {\r\n <ng-container\r\n *ngComponentOutlet=\"\r\n row['_' + prop.name].component;\r\n injector: row['_' + prop.name].injector\r\n \"\r\n ></ng-container>\r\n }\r\n </ng-container>\r\n </ng-container>\r\n </ng-template>\r\n </ngx-datatable-column>\r\n }\r\n</ngx-datatable>\r\n}\r\n", dependencies: [{ kind: "directive", type: AbpVisibleDirective, selector: "[abpVisible]", inputs: ["abpVisible"] }, { kind: "ngmodule", type: NgxDatatableModule }, { kind: "component", type: i1$1.DatatableComponent, selector: "ngx-datatable", inputs: ["targetMarkerTemplate", "rows", "groupRowsBy", "groupedRows", "columns", "selected", "scrollbarV", "scrollbarVDynamic", "scrollbarH", "rowHeight", "columnMode", "headerHeight", "footerHeight", "externalPaging", "externalSorting", "limit", "count", "offset", "loadingIndicator", "ghostLoadingIndicator", "selectionType", "reorderable", "swapColumns", "sortType", "sorts", "cssClasses", "messages", "rowClass", "selectCheck", "displayCheck", "groupExpansionDefault", "trackByProp", "selectAllRowsOnPage", "virtualization", "treeFromRelation", "treeToRelation", "summaryRow", "summaryHeight", "summaryPosition", "disableRowCheck", "rowDraggable", "enableClearingSortState", "rowIdentity"], outputs: ["scroll", "activate", "select", "sort", "page", "reorder", "resize", "tableContextmenu", "treeAction", "rowDragEvents"] }, { kind: "directive", type: i1$1.DataTableColumnDirective, selector: "ngx-datatable-column", inputs: ["name", "prop", "bindAsUnsafeHtml", "frozenLeft", "frozenRight", "flexGrow", "resizeable", "comparator", "pipe", "sortable", "draggable", "canAutoResize", "minWidth", "width", "maxWidth", "checkboxable", "headerCheckboxable", "headerClass", "cellClass", "isTreeColumn", "treeLevelIndent", "summaryFunc", "summaryTemplate", "cellTemplate", "headerTemplate", "treeToggleTemplate", "ghostCellTemplate"] }, { kind: "directive", type: i1$1.DataTableColumnHeaderDirective, selector: "[ngx-datatable-header-template]" }, { kind: "directive", type: i1$1.DataTableColumnCellDirective, selector: "[ngx-datatable-cell-template]" }, { kind: "component", type: GridActionsComponent, selector: "abp-grid-actions", inputs: ["icon", "index", "text"], exportAs: ["abpGridActions"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: NgxDatatableDefaultDirective, selector: "ngx-datatable[default]", inputs: ["class"], exportAs: ["ngxDatatableDefault"] }, { kind: "directive", type: NgxDatatableListDirective, selector: "ngx-datatable[list]", inputs: ["list"], exportAs: ["ngxDatatableList"] }, { kind: "directive", type: PermissionDirective, selector: "[abpPermission]", inputs: ["abpPermission", "abpPermissionRunChangeDetection"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }, { kind: "pipe", type: UtcToLocalPipe, name: "abpUtcToLocal" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1205
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.9", type: ExtensibleTableComponent, isStandalone: true, selector: "abp-extensible-table", inputs: { actionsTextInput: { classPropertyName: "actionsTextInput", publicName: "actionsText", isSignal: true, isRequired: false, transformFunction: null }, dataInput: { classPropertyName: "dataInput", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, list: { classPropertyName: "list", publicName: "list", isSignal: true, isRequired: true, transformFunction: null }, recordsTotal: { classPropertyName: "recordsTotal", publicName: "recordsTotal", isSignal: true, isRequired: true, transformFunction: null }, actionsColumnWidthInput: { classPropertyName: "actionsColumnWidthInput", publicName: "actionsColumnWidth", isSignal: true, isRequired: false, transformFunction: null }, actionsTemplate: { classPropertyName: "actionsTemplate", publicName: "actionsTemplate", isSignal: true, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, selectionTypeInput: { classPropertyName: "selectionTypeInput", publicName: "selectionType", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, infiniteScroll: { classPropertyName: "infiniteScroll", publicName: "infiniteScroll", isSignal: true, isRequired: false, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null }, scrollThreshold: { classPropertyName: "scrollThreshold", publicName: "scrollThreshold", isSignal: true, isRequired: false, transformFunction: null }, tableHeight: { classPropertyName: "tableHeight", publicName: "tableHeight", isSignal: true, isRequired: false, transformFunction: null }, rowDetailTemplate: { classPropertyName: "rowDetailTemplate", publicName: "rowDetailTemplate", isSignal: true, isRequired: false, transformFunction: null }, rowDetailHeight: { classPropertyName: "rowDetailHeight", publicName: "rowDetailHeight", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { tableActivate: "tableActivate", selectionChange: "selectionChange", loadMore: "loadMore", rowDetailToggle: "rowDetailToggle" }, queries: [{ propertyName: "rowDetailComponent", first: true, predicate: ExtensibleTableRowDetailComponent, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "table", first: true, predicate: ["table"], descendants: true, isSignal: true }], exportAs: ["abpExtensibleTable"], ngImport: i0, template: "@if (isBrowser) {\r\n <ngx-datatable\r\n #table\r\n default\r\n [rows]=\"data\"\r\n [count]=\"recordsTotal()\"\r\n [list]=\"list()\"\r\n [selectionType]=\"selectable() ? selectionType() : undefined\"\r\n (activate)=\"tableActivate.emit($event)\"\r\n (select)=\"onSelect($event)\"\r\n [selected]=\"selected()\"\r\n (scroll)=\"onScroll($event)\"\r\n [scrollbarV]=\"infiniteScroll()\"\r\n [style.height]=\"getTableHeight()\"\r\n [loadingIndicator]=\"infiniteScroll() && isLoading()\"\r\n [footerHeight]=\"infiniteScroll() ? false : 50\"\r\n >\r\n @if (effectiveRowDetailTemplate) {\r\n <ngx-datatable-row-detail [rowHeight]=\"effectiveRowDetailHeight\">\r\n <ng-template let-row=\"row\" let-expanded=\"expanded\" ngx-datatable-row-detail-template>\r\n <ng-container\r\n [ngTemplateOutlet]=\"effectiveRowDetailTemplate\"\r\n [ngTemplateOutletContext]=\"{ row: row, expanded: expanded }\"\r\n ></ng-container>\r\n </ng-template>\r\n </ngx-datatable-row-detail>\r\n\r\n <ngx-datatable-column\r\n [width]=\"50\"\r\n [resizeable]=\"false\"\r\n [sortable]=\"false\"\r\n [draggable]=\"false\"\r\n [canAutoResize]=\"false\"\r\n >\r\n <ng-template let-row=\"row\" let-expanded=\"expanded\" ngx-datatable-cell-template>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-link text-decoration-none text-muted p-0\"\r\n [attr.aria-label]=\"expanded ? 'Collapse' : 'Expand'\"\r\n (click)=\"toggleExpandRow(row)\"\r\n >\r\n <i class=\"fa\" [class.fa-chevron-down]=\"!expanded\" [class.fa-chevron-up]=\"expanded\"></i>\r\n </button>\r\n </ng-template>\r\n </ngx-datatable-column>\r\n }\r\n @if (selectable()) {\r\n <ngx-datatable-column\r\n [width]=\"50\"\r\n [sortable]=\"false\"\r\n [canAutoResize]=\"false\"\r\n [draggable]=\"false\"\r\n [resizeable]=\"false\"\r\n >\r\n <ng-template\r\n ngx-datatable-header-template\r\n let-value=\"value\"\r\n let-allRowsSelected=\"allRowsSelected\"\r\n let-selectFn=\"selectFn\"\r\n >\r\n @if (selectionType() !== 'single') {\r\n <div class=\"form-check\">\r\n <input\r\n class=\"form-check-input table-check\"\r\n type=\"checkbox\"\r\n [checked]=\"allRowsSelected\"\r\n (change)=\"selectFn(!allRowsSelected)\"\r\n />\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <ng-template\r\n ngx-datatable-cell-template\r\n let-value=\"value\"\r\n let-row=\"row\"\r\n let-isSelected=\"isSelected\"\r\n let-onCheckboxChangeFn=\"onCheckboxChangeFn\"\r\n >\r\n @if (selectionType() === 'single') {\r\n <div class=\"h-100 form-check form-check-sm form-check-custom form-check-solid\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"radio\"\r\n [checked]=\"isSelected\"\r\n (change)=\"onCheckboxChangeFn($event)\"\r\n />\r\n </div>\r\n }\r\n @if (selectionType() !== 'single') {\r\n <div class=\"h-100 form-check form-check-sm form-check-custom form-check-solid\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [checked]=\"isSelected\"\r\n (change)=\"onCheckboxChangeFn($event)\"\r\n />\r\n </div>\r\n }\r\n </ng-template>\r\n </ngx-datatable-column>\r\n }\r\n @if (actionsTemplate() || (actionList.length && hasAtLeastOnePermittedAction)) {\r\n <ngx-datatable-column\r\n [name]=\"actionsText() | abpLocalization\"\r\n [maxWidth]=\"_actionsColumnWidth() ?? undefined\"\r\n [width]=\"_actionsColumnWidth() ?? 200\"\r\n [canAutoResize]=\"!_actionsColumnWidth()\"\r\n [sortable]=\"false\"\r\n >\r\n <ng-template let-row=\"row\" let-i=\"rowIndex\" ngx-datatable-cell-template>\r\n @if (actionsTemplate(); as template) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, index: i }\"\r\n ></ng-container>\r\n } @else if (isVisibleActions(row)) {\r\n <abp-grid-actions [index]=\"i\" [record]=\"row\" text=\"AbpUi::Actions\"></abp-grid-actions>\r\n }\r\n </ng-template>\r\n </ngx-datatable-column>\r\n }\r\n @for (prop of propList; track prop.name; let i = $index) {\r\n <ngx-datatable-column\r\n *abpVisible=\"prop.columnVisible(getInjected)\"\r\n [width]=\"columnWidths()[i] ?? 200\"\r\n [canAutoResize]=\"!columnWidths()[i]\"\r\n [name]=\"(prop.isExtra ? '::' + prop.displayName : prop.displayName) | abpLocalization\"\r\n [prop]=\"prop.name\"\r\n [sortable]=\"prop.sortable\"\r\n >\r\n <ng-template ngx-datatable-header-template let-column=\"column\" let-sortFn=\"sortFn\">\r\n @if (prop.tooltip) {\r\n <span\r\n [ngbTooltip]=\"prop.tooltip.text | abpLocalization\"\r\n [placement]=\"prop.tooltip.placement || 'auto'\"\r\n container=\"body\"\r\n [class.pointer]=\"prop.sortable\"\r\n (click)=\"prop.sortable && sortFn(column)\"\r\n >\r\n {{ column.name }} <i class=\"fa fa-info-circle\" aria-hidden=\"true\"></i>\r\n </span>\r\n } @else {\r\n <span [class.pointer]=\"prop.sortable\" (click)=\"prop.sortable && sortFn(column)\">\r\n {{ column.name }}\r\n </span>\r\n }\r\n </ng-template>\r\n <ng-template let-row=\"row\" let-i=\"index\" ngx-datatable-cell-template>\r\n <ng-container *abpPermission=\"prop.permission; runChangeDetection: false\">\r\n <ng-container *abpVisible=\"row['_' + prop.name]?.visible\">\r\n @if (!row['_' + prop.name].component) {\r\n @if (prop.type === 'datetime' || prop.type === 'date' || prop.type === 'time') {\r\n <div\r\n [innerHTML]=\"\r\n !prop.isExtra\r\n ? (row['_' + prop.name]?.value | async | abpUtcToLocal: prop.type)\r\n : ('::' + (row['_' + prop.name]?.value | async | abpUtcToLocal: prop.type)\r\n | abpLocalization)\r\n \"\r\n (click)=\"\r\n prop.action &&\r\n prop.action({ getInjected: getInjected, record: row, index: i })\r\n \"\r\n [class]=\"entityPropTypeClasses[prop.type]\"\r\n [class.pointer]=\"prop.action\"\r\n ></div>\r\n } @else {\r\n <div\r\n [innerHTML]=\"\r\n !prop.isExtra\r\n ? (row['_' + prop.name]?.value | async)\r\n : ('::' + (row['_' + prop.name]?.value | async) | abpLocalization)\r\n \"\r\n (click)=\"\r\n prop.action &&\r\n prop.action({ getInjected: getInjected, record: row, index: i })\r\n \"\r\n [class]=\"entityPropTypeClasses[prop.type]\"\r\n [class.pointer]=\"prop.action\"\r\n ></div>\r\n }\r\n } @else {\r\n <ng-container\r\n *ngComponentOutlet=\"\r\n row['_' + prop.name].component;\r\n injector: row['_' + prop.name].injector\r\n \"\r\n ></ng-container>\r\n }\r\n </ng-container>\r\n </ng-container>\r\n </ng-template>\r\n </ngx-datatable-column>\r\n }\r\n </ngx-datatable>\r\n}\r\n", styles: [":host ::ng-deep .ngx-datatable.material .datatable-body .datatable-row-detail{background:none;padding:0}\n"], dependencies: [{ kind: "directive", type: AbpVisibleDirective, selector: "[abpVisible]", inputs: ["abpVisible"] }, { kind: "ngmodule", type: NgxDatatableModule }, { kind: "component", type: i1$1.DatatableComponent, selector: "ngx-datatable", inputs: ["targetMarkerTemplate", "rows", "groupRowsBy", "groupedRows", "columns", "selected", "scrollbarV", "scrollbarVDynamic", "scrollbarH", "rowHeight", "columnMode", "headerHeight", "footerHeight", "externalPaging", "externalSorting", "limit", "count", "offset", "loadingIndicator", "ghostLoadingIndicator", "selectionType", "reorderable", "swapColumns", "sortType", "sorts", "cssClasses", "messages", "rowClass", "selectCheck", "displayCheck", "groupExpansionDefault", "trackByProp", "selectAllRowsOnPage", "virtualization", "treeFromRelation", "treeToRelation", "summaryRow", "summaryHeight", "summaryPosition", "disableRowCheck", "rowDraggable", "enableClearingSortState", "rowIdentity"], outputs: ["scroll", "activate", "select", "sort", "page", "reorder", "resize", "tableContextmenu", "treeAction", "rowDragEvents"] }, { kind: "directive", type: i1$1.DatatableRowDetailDirective, selector: "ngx-datatable-row-detail", inputs: ["rowHeight", "template"], outputs: ["toggle"] }, { kind: "directive", type: i1$1.DatatableRowDetailTemplateDirective, selector: "[ngx-datatable-row-detail-template]" }, { kind: "directive", type: i1$1.DataTableColumnDirective, selector: "ngx-datatable-column", inputs: ["name", "prop", "bindAsUnsafeHtml", "frozenLeft", "frozenRight", "flexGrow", "resizeable", "comparator", "pipe", "sortable", "draggable", "canAutoResize", "minWidth", "width", "maxWidth", "checkboxable", "headerCheckboxable", "headerClass", "cellClass", "isTreeColumn", "treeLevelIndent", "summaryFunc", "summaryTemplate", "cellTemplate", "headerTemplate", "treeToggleTemplate", "ghostCellTemplate"] }, { kind: "directive", type: i1$1.DataTableColumnHeaderDirective, selector: "[ngx-datatable-header-template]" }, { kind: "directive", type: i1$1.DataTableColumnCellDirective, selector: "[ngx-datatable-cell-template]" }, { kind: "component", type: GridActionsComponent, selector: "abp-grid-actions", inputs: ["icon", "index", "text"], exportAs: ["abpGridActions"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: NgxDatatableDefaultDirective, selector: "ngx-datatable[default]", inputs: ["class"], exportAs: ["ngxDatatableDefault"] }, { kind: "directive", type: NgxDatatableListDirective, selector: "ngx-datatable[list]", inputs: ["list"], exportAs: ["ngxDatatableList"] }, { kind: "directive", type: PermissionDirective, selector: "[abpPermission]", inputs: ["abpPermission", "abpPermissionRunChangeDetection"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }, { kind: "pipe", type: UtcToLocalPipe, name: "abpUtcToLocal" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1155
1206
|
}
|
|
1156
1207
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: ExtensibleTableComponent, decorators: [{
|
|
1157
1208
|
type: Component,
|
|
@@ -1168,40 +1219,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
|
|
|
1168
1219
|
AsyncPipe,
|
|
1169
1220
|
NgTemplateOutlet,
|
|
1170
1221
|
NgComponentOutlet,
|
|
1171
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (isBrowser) {\r\n <ngx-datatable\r\n
|
|
1172
|
-
}], ctorParameters: () => [], propDecorators: { actionsText: [{
|
|
1173
|
-
type: Input
|
|
1174
|
-
}], data: [{
|
|
1175
|
-
type: Input
|
|
1176
|
-
}], list: [{
|
|
1177
|
-
type: Input
|
|
1178
|
-
}], recordsTotal: [{
|
|
1179
|
-
type: Input
|
|
1180
|
-
}], actionsColumnWidth: [{
|
|
1181
|
-
type: Input
|
|
1182
|
-
}], actionsTemplate: [{
|
|
1183
|
-
type: Input
|
|
1184
|
-
}], tableActivate: [{
|
|
1185
|
-
type: Output
|
|
1186
|
-
}], selectable: [{
|
|
1187
|
-
type: Input
|
|
1188
|
-
}], selectionType: [{
|
|
1189
|
-
type: Input
|
|
1190
|
-
}], selected: [{
|
|
1191
|
-
type: Input
|
|
1192
|
-
}], selectionChange: [{
|
|
1193
|
-
type: Output
|
|
1194
|
-
}], infiniteScroll: [{
|
|
1195
|
-
type: Input
|
|
1196
|
-
}], isLoading: [{
|
|
1197
|
-
type: Input
|
|
1198
|
-
}], scrollThreshold: [{
|
|
1199
|
-
type: Input
|
|
1200
|
-
}], loadMore: [{
|
|
1201
|
-
type: Output
|
|
1202
|
-
}], tableHeight: [{
|
|
1203
|
-
type: Input
|
|
1204
|
-
}] } });
|
|
1222
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (isBrowser) {\r\n <ngx-datatable\r\n #table\r\n default\r\n [rows]=\"data\"\r\n [count]=\"recordsTotal()\"\r\n [list]=\"list()\"\r\n [selectionType]=\"selectable() ? selectionType() : undefined\"\r\n (activate)=\"tableActivate.emit($event)\"\r\n (select)=\"onSelect($event)\"\r\n [selected]=\"selected()\"\r\n (scroll)=\"onScroll($event)\"\r\n [scrollbarV]=\"infiniteScroll()\"\r\n [style.height]=\"getTableHeight()\"\r\n [loadingIndicator]=\"infiniteScroll() && isLoading()\"\r\n [footerHeight]=\"infiniteScroll() ? false : 50\"\r\n >\r\n @if (effectiveRowDetailTemplate) {\r\n <ngx-datatable-row-detail [rowHeight]=\"effectiveRowDetailHeight\">\r\n <ng-template let-row=\"row\" let-expanded=\"expanded\" ngx-datatable-row-detail-template>\r\n <ng-container\r\n [ngTemplateOutlet]=\"effectiveRowDetailTemplate\"\r\n [ngTemplateOutletContext]=\"{ row: row, expanded: expanded }\"\r\n ></ng-container>\r\n </ng-template>\r\n </ngx-datatable-row-detail>\r\n\r\n <ngx-datatable-column\r\n [width]=\"50\"\r\n [resizeable]=\"false\"\r\n [sortable]=\"false\"\r\n [draggable]=\"false\"\r\n [canAutoResize]=\"false\"\r\n >\r\n <ng-template let-row=\"row\" let-expanded=\"expanded\" ngx-datatable-cell-template>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-link text-decoration-none text-muted p-0\"\r\n [attr.aria-label]=\"expanded ? 'Collapse' : 'Expand'\"\r\n (click)=\"toggleExpandRow(row)\"\r\n >\r\n <i class=\"fa\" [class.fa-chevron-down]=\"!expanded\" [class.fa-chevron-up]=\"expanded\"></i>\r\n </button>\r\n </ng-template>\r\n </ngx-datatable-column>\r\n }\r\n @if (selectable()) {\r\n <ngx-datatable-column\r\n [width]=\"50\"\r\n [sortable]=\"false\"\r\n [canAutoResize]=\"false\"\r\n [draggable]=\"false\"\r\n [resizeable]=\"false\"\r\n >\r\n <ng-template\r\n ngx-datatable-header-template\r\n let-value=\"value\"\r\n let-allRowsSelected=\"allRowsSelected\"\r\n let-selectFn=\"selectFn\"\r\n >\r\n @if (selectionType() !== 'single') {\r\n <div class=\"form-check\">\r\n <input\r\n class=\"form-check-input table-check\"\r\n type=\"checkbox\"\r\n [checked]=\"allRowsSelected\"\r\n (change)=\"selectFn(!allRowsSelected)\"\r\n />\r\n </div>\r\n }\r\n </ng-template>\r\n\r\n <ng-template\r\n ngx-datatable-cell-template\r\n let-value=\"value\"\r\n let-row=\"row\"\r\n let-isSelected=\"isSelected\"\r\n let-onCheckboxChangeFn=\"onCheckboxChangeFn\"\r\n >\r\n @if (selectionType() === 'single') {\r\n <div class=\"h-100 form-check form-check-sm form-check-custom form-check-solid\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"radio\"\r\n [checked]=\"isSelected\"\r\n (change)=\"onCheckboxChangeFn($event)\"\r\n />\r\n </div>\r\n }\r\n @if (selectionType() !== 'single') {\r\n <div class=\"h-100 form-check form-check-sm form-check-custom form-check-solid\">\r\n <input\r\n class=\"form-check-input\"\r\n type=\"checkbox\"\r\n [checked]=\"isSelected\"\r\n (change)=\"onCheckboxChangeFn($event)\"\r\n />\r\n </div>\r\n }\r\n </ng-template>\r\n </ngx-datatable-column>\r\n }\r\n @if (actionsTemplate() || (actionList.length && hasAtLeastOnePermittedAction)) {\r\n <ngx-datatable-column\r\n [name]=\"actionsText() | abpLocalization\"\r\n [maxWidth]=\"_actionsColumnWidth() ?? undefined\"\r\n [width]=\"_actionsColumnWidth() ?? 200\"\r\n [canAutoResize]=\"!_actionsColumnWidth()\"\r\n [sortable]=\"false\"\r\n >\r\n <ng-template let-row=\"row\" let-i=\"rowIndex\" ngx-datatable-cell-template>\r\n @if (actionsTemplate(); as template) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"{ $implicit: row, index: i }\"\r\n ></ng-container>\r\n } @else if (isVisibleActions(row)) {\r\n <abp-grid-actions [index]=\"i\" [record]=\"row\" text=\"AbpUi::Actions\"></abp-grid-actions>\r\n }\r\n </ng-template>\r\n </ngx-datatable-column>\r\n }\r\n @for (prop of propList; track prop.name; let i = $index) {\r\n <ngx-datatable-column\r\n *abpVisible=\"prop.columnVisible(getInjected)\"\r\n [width]=\"columnWidths()[i] ?? 200\"\r\n [canAutoResize]=\"!columnWidths()[i]\"\r\n [name]=\"(prop.isExtra ? '::' + prop.displayName : prop.displayName) | abpLocalization\"\r\n [prop]=\"prop.name\"\r\n [sortable]=\"prop.sortable\"\r\n >\r\n <ng-template ngx-datatable-header-template let-column=\"column\" let-sortFn=\"sortFn\">\r\n @if (prop.tooltip) {\r\n <span\r\n [ngbTooltip]=\"prop.tooltip.text | abpLocalization\"\r\n [placement]=\"prop.tooltip.placement || 'auto'\"\r\n container=\"body\"\r\n [class.pointer]=\"prop.sortable\"\r\n (click)=\"prop.sortable && sortFn(column)\"\r\n >\r\n {{ column.name }} <i class=\"fa fa-info-circle\" aria-hidden=\"true\"></i>\r\n </span>\r\n } @else {\r\n <span [class.pointer]=\"prop.sortable\" (click)=\"prop.sortable && sortFn(column)\">\r\n {{ column.name }}\r\n </span>\r\n }\r\n </ng-template>\r\n <ng-template let-row=\"row\" let-i=\"index\" ngx-datatable-cell-template>\r\n <ng-container *abpPermission=\"prop.permission; runChangeDetection: false\">\r\n <ng-container *abpVisible=\"row['_' + prop.name]?.visible\">\r\n @if (!row['_' + prop.name].component) {\r\n @if (prop.type === 'datetime' || prop.type === 'date' || prop.type === 'time') {\r\n <div\r\n [innerHTML]=\"\r\n !prop.isExtra\r\n ? (row['_' + prop.name]?.value | async | abpUtcToLocal: prop.type)\r\n : ('::' + (row['_' + prop.name]?.value | async | abpUtcToLocal: prop.type)\r\n | abpLocalization)\r\n \"\r\n (click)=\"\r\n prop.action &&\r\n prop.action({ getInjected: getInjected, record: row, index: i })\r\n \"\r\n [class]=\"entityPropTypeClasses[prop.type]\"\r\n [class.pointer]=\"prop.action\"\r\n ></div>\r\n } @else {\r\n <div\r\n [innerHTML]=\"\r\n !prop.isExtra\r\n ? (row['_' + prop.name]?.value | async)\r\n : ('::' + (row['_' + prop.name]?.value | async) | abpLocalization)\r\n \"\r\n (click)=\"\r\n prop.action &&\r\n prop.action({ getInjected: getInjected, record: row, index: i })\r\n \"\r\n [class]=\"entityPropTypeClasses[prop.type]\"\r\n [class.pointer]=\"prop.action\"\r\n ></div>\r\n }\r\n } @else {\r\n <ng-container\r\n *ngComponentOutlet=\"\r\n row['_' + prop.name].component;\r\n injector: row['_' + prop.name].injector\r\n \"\r\n ></ng-container>\r\n }\r\n </ng-container>\r\n </ng-container>\r\n </ng-template>\r\n </ngx-datatable-column>\r\n }\r\n </ngx-datatable>\r\n}\r\n", styles: [":host ::ng-deep .ngx-datatable.material .datatable-body .datatable-row-detail{background:none;padding:0}\n"] }]
|
|
1223
|
+
}], ctorParameters: () => [], propDecorators: { actionsTextInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "actionsText", required: false }] }], dataInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], list: [{ type: i0.Input, args: [{ isSignal: true, alias: "list", required: true }] }], recordsTotal: [{ type: i0.Input, args: [{ isSignal: true, alias: "recordsTotal", required: true }] }], actionsColumnWidthInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "actionsColumnWidth", required: false }] }], actionsTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "actionsTemplate", required: false }] }], selectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectable", required: false }] }], selectionTypeInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectionType", required: false }] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }], infiniteScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "infiniteScroll", required: false }] }], isLoading: [{ type: i0.Input, args: [{ isSignal: true, alias: "isLoading", required: false }] }], scrollThreshold: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollThreshold", required: false }] }], tableHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "tableHeight", required: false }] }], rowDetailTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowDetailTemplate", required: false }] }], rowDetailHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowDetailHeight", required: false }] }], tableActivate: [{ type: i0.Output, args: ["tableActivate"] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], loadMore: [{ type: i0.Output, args: ["loadMore"] }], rowDetailToggle: [{ type: i0.Output, args: ["rowDetailToggle"] }], rowDetailComponent: [{ type: i0.ContentChild, args: [i0.forwardRef(() => ExtensibleTableRowDetailComponent), { isSignal: true }] }], table: [{ type: i0.ViewChild, args: ['table', { isSignal: true }] }] } });
|
|
1205
1224
|
|
|
1206
1225
|
class CreateInjectorPipe {
|
|
1207
1226
|
transform(_, action, context) {
|
|
@@ -1256,7 +1275,7 @@ class PageToolbarComponent extends AbstractActionsComponent {
|
|
|
1256
1275
|
provide: EXTENSIONS_ACTION_TYPE,
|
|
1257
1276
|
useValue: 'toolbarActions',
|
|
1258
1277
|
},
|
|
1259
|
-
], exportAs: ["abpPageToolbar"], usesInheritance: true, ngImport: i0, template: "<div class=\"row justify-content-end mx-0 gap-2\" id=\"AbpContentToolbar\">\r\n @for (action of actionList; track action.component || action.action; let last = $last) {\r\n <div class=\"col-auto px-0 pt-0\" [class.pe-0]=\"last\">\r\n @if (action.visible(data)) {\r\n <ng-container *abpPermission=\"action.permission; runChangeDetection: false\">\r\n @if (action.component; as component) {\r\n <ng-container
|
|
1278
|
+
], exportAs: ["abpPageToolbar"], usesInheritance: true, ngImport: i0, template: "<div class=\"row justify-content-end mx-0 gap-2\" id=\"AbpContentToolbar\">\r\n @for (action of actionList; track action.component || action.action; let last = $last) {\r\n <div class=\"col-auto px-0 pt-0\" [class.pe-0]=\"last\">\r\n @if (action.visible(data)) {\r\n <ng-container *abpPermission=\"action.permission; runChangeDetection: false\">\r\n @if (action.component; as component) {\r\n <ng-container *ngComponentOutlet=\"component; injector: record | createInjector: action:this\"></ng-container>\r\n\r\n }@else {\r\n @if (asToolbarAction(action).value; as toolbarAction ) {\r\n <button (click)=\"action.action(data)\" type=\"button\"\r\n [class]=\"toolbarAction?.btnClass ? toolbarAction?.btnClass : defaultBtnClass\"\r\n class=\"d-inline-flex align-items-center gap-1\">\r\n <i [class]=\"toolbarAction?.icon\" [class.me-1]=\"toolbarAction?.icon\"></i>\r\n {{ toolbarAction?.text | abpLocalization }}\r\n </button>\r\n }\r\n }\r\n </ng-container>\r\n }\r\n </div>\r\n }\r\n</div>", dependencies: [{ kind: "directive", type: PermissionDirective, selector: "[abpPermission]", inputs: ["abpPermission", "abpPermissionRunChangeDetection"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "pipe", type: CreateInjectorPipe, name: "createInjector" }, { kind: "pipe", type: LocalizationPipe, name: "abpLocalization" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1260
1279
|
}
|
|
1261
1280
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: PageToolbarComponent, decorators: [{
|
|
1262
1281
|
type: Component,
|
|
@@ -1264,14 +1283,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
|
|
|
1264
1283
|
CreateInjectorPipe,
|
|
1265
1284
|
PermissionDirective,
|
|
1266
1285
|
LocalizationPipe,
|
|
1267
|
-
NgClass,
|
|
1268
1286
|
NgComponentOutlet,
|
|
1269
1287
|
], providers: [
|
|
1270
1288
|
{
|
|
1271
1289
|
provide: EXTENSIONS_ACTION_TYPE,
|
|
1272
1290
|
useValue: 'toolbarActions',
|
|
1273
1291
|
},
|
|
1274
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"row justify-content-end mx-0 gap-2\" id=\"AbpContentToolbar\">\r\n @for (action of actionList; track action.component || action.action; let last = $last) {\r\n <div class=\"col-auto px-0 pt-0\" [class.pe-0]=\"last\">\r\n @if (action.visible(data)) {\r\n <ng-container *abpPermission=\"action.permission; runChangeDetection: false\">\r\n @if (action.component; as component) {\r\n <ng-container
|
|
1292
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"row justify-content-end mx-0 gap-2\" id=\"AbpContentToolbar\">\r\n @for (action of actionList; track action.component || action.action; let last = $last) {\r\n <div class=\"col-auto px-0 pt-0\" [class.pe-0]=\"last\">\r\n @if (action.visible(data)) {\r\n <ng-container *abpPermission=\"action.permission; runChangeDetection: false\">\r\n @if (action.component; as component) {\r\n <ng-container *ngComponentOutlet=\"component; injector: record | createInjector: action:this\"></ng-container>\r\n\r\n }@else {\r\n @if (asToolbarAction(action).value; as toolbarAction ) {\r\n <button (click)=\"action.action(data)\" type=\"button\"\r\n [class]=\"toolbarAction?.btnClass ? toolbarAction?.btnClass : defaultBtnClass\"\r\n class=\"d-inline-flex align-items-center gap-1\">\r\n <i [class]=\"toolbarAction?.icon\" [class.me-1]=\"toolbarAction?.icon\"></i>\r\n {{ toolbarAction?.text | abpLocalization }}\r\n </button>\r\n }\r\n }\r\n </ng-container>\r\n }\r\n </div>\r\n }\r\n</div>" }]
|
|
1275
1293
|
}], ctorParameters: () => [] });
|
|
1276
1294
|
|
|
1277
1295
|
var objectExtensions = /*#__PURE__*/Object.freeze({
|
|
@@ -1289,7 +1307,8 @@ function mergeWithDefaultActions(extension, defaultActions, ...contributors) {
|
|
|
1289
1307
|
});
|
|
1290
1308
|
}
|
|
1291
1309
|
|
|
1292
|
-
function generateFormFromProps(
|
|
1310
|
+
function generateFormFromProps(propData) {
|
|
1311
|
+
const data = propData.data;
|
|
1293
1312
|
const extensions = data.getInjected((ExtensionsService));
|
|
1294
1313
|
const identifier = data.getInjected(EXTENSIONS_IDENTIFIER);
|
|
1295
1314
|
const form = new UntypedFormGroup({});
|
|
@@ -1579,6 +1598,7 @@ const importWithExport = [
|
|
|
1579
1598
|
CreateInjectorPipe,
|
|
1580
1599
|
ExtensibleFormComponent,
|
|
1581
1600
|
ExtensibleTableComponent,
|
|
1601
|
+
ExtensibleTableRowDetailComponent,
|
|
1582
1602
|
ExtensibleFormMultiselectComponent,
|
|
1583
1603
|
];
|
|
1584
1604
|
class ExtensibleModule {
|
|
@@ -1599,6 +1619,7 @@ class ExtensibleModule {
|
|
|
1599
1619
|
CreateInjectorPipe,
|
|
1600
1620
|
ExtensibleFormComponent,
|
|
1601
1621
|
ExtensibleTableComponent,
|
|
1622
|
+
ExtensibleTableRowDetailComponent,
|
|
1602
1623
|
ExtensibleFormMultiselectComponent], exports: [DisabledDirective,
|
|
1603
1624
|
ExtensibleDateTimePickerComponent,
|
|
1604
1625
|
ExtensibleFormPropComponent,
|
|
@@ -1608,6 +1629,7 @@ class ExtensibleModule {
|
|
|
1608
1629
|
CreateInjectorPipe,
|
|
1609
1630
|
ExtensibleFormComponent,
|
|
1610
1631
|
ExtensibleTableComponent,
|
|
1632
|
+
ExtensibleTableRowDetailComponent,
|
|
1611
1633
|
ExtensibleFormMultiselectComponent] }); }
|
|
1612
1634
|
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: ExtensibleModule, imports: [CoreModule,
|
|
1613
1635
|
ThemeSharedModule,
|
|
@@ -1646,5 +1668,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
|
|
|
1646
1668
|
* Generated bundle index. Do not edit.
|
|
1647
1669
|
*/
|
|
1648
1670
|
|
|
1649
|
-
export { ActionList, CreateFormPropsFactory, CreateInjectorPipe, ENTITY_PROP_TYPE_CLASSES, EXTENSIBLE_FORM_VIEW_PROVIDER, EXTENSIONS_ACTION_CALLBACK, EXTENSIONS_ACTION_DATA, EXTENSIONS_ACTION_TYPE, EXTENSIONS_FORM_PROP, EXTENSIONS_FORM_PROP_DATA, EXTENSIONS_IDENTIFIER, EXTRA_PROPERTIES_KEY, EditFormPropsFactory, EntityAction, EntityActionList, EntityActions, EntityActionsFactory, EntityProp, EntityPropList, EntityProps, EntityPropsFactory, ExtensibleDateTimePickerComponent, ExtensibleFormComponent, ExtensibleFormMultiselectComponent, ExtensibleFormPropComponent, ExtensibleModule, ExtensibleTableComponent, ExtensionsService, FormProp, FormPropData, FormPropList, FormProps, GridActionsComponent, objectExtensions as ObjectExtensions, PROP_DATA_STREAM, PageToolbarComponent, PropDataDirective, PropList, ROW_RECORD, ToolbarAction, ToolbarActionList, ToolbarActions, ToolbarActionsFactory, ToolbarComponent, checkPolicies, createExtraPropertyValueResolver, generateFormFromProps, getObjectExtensionEntitiesFromStore, mapEntitiesToContributors, mergeWithDefaultActions, mergeWithDefaultProps };
|
|
1671
|
+
export { ActionList, CreateFormPropsFactory, CreateInjectorPipe, ENTITY_PROP_TYPE_CLASSES, EXTENSIBLE_FORM_VIEW_PROVIDER, EXTENSIONS_ACTION_CALLBACK, EXTENSIONS_ACTION_DATA, EXTENSIONS_ACTION_TYPE, EXTENSIONS_FORM_PROP, EXTENSIONS_FORM_PROP_DATA, EXTENSIONS_IDENTIFIER, EXTRA_PROPERTIES_KEY, EditFormPropsFactory, EntityAction, EntityActionList, EntityActions, EntityActionsFactory, EntityProp, EntityPropList, EntityProps, EntityPropsFactory, ExtensibleDateTimePickerComponent, ExtensibleFormComponent, ExtensibleFormMultiselectComponent, ExtensibleFormPropComponent, ExtensibleModule, ExtensibleTableComponent, ExtensibleTableRowDetailComponent, ExtensionsService, FormProp, FormPropData, FormPropList, FormProps, GridActionsComponent, objectExtensions as ObjectExtensions, PROP_DATA_STREAM, PageToolbarComponent, PropDataDirective, PropList, ROW_RECORD, ToolbarAction, ToolbarActionList, ToolbarActions, ToolbarActionsFactory, ToolbarComponent, checkPolicies, createExtraPropertyValueResolver, generateFormFromProps, getObjectExtensionEntitiesFromStore, mapEntitiesToContributors, mergeWithDefaultActions, mergeWithDefaultProps };
|
|
1650
1672
|
//# sourceMappingURL=abp-ng.components-extensible.mjs.map
|