Browse Source

Merge pull request #18080 from abpframework/issue/18079-convert-standalone

Convert  Extensible system Components to   standalone
pull/18145/head
Mahmut Gundogdu 3 years ago
committed by GitHub
parent
commit
aa71e0a938
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      npm/ng-packs/packages/components/extensible/src/lib/components/date-time-picker/extensible-date-time-picker.component.ts
  2. 2
      npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.html
  3. 133
      npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.ts
  4. 123
      npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form.component.ts
  5. 51
      npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.ts
  6. 5
      npm/ng-packs/packages/components/extensible/src/lib/components/grid-actions/grid-actions.component.ts
  7. 5
      npm/ng-packs/packages/components/extensible/src/lib/components/page-toolbar/page-toolbar.component.ts
  8. 1
      npm/ng-packs/packages/components/extensible/src/lib/directives/prop-data.directive.ts
  9. 35
      npm/ng-packs/packages/components/extensible/src/lib/extensible.module.ts
  10. 1
      npm/ng-packs/packages/components/extensible/src/lib/pipes/create-injector.pipe.ts
  11. 77
      npm/ng-packs/packages/components/extensible/src/lib/services/extensible-form-prop.service.ts
  12. 5
      npm/ng-packs/packages/components/page/src/page.module.ts
  13. 8
      npm/ng-packs/packages/core/src/lib/abstracts/ng-model.component.ts
  14. 4
      npm/ng-packs/packages/theme-shared/src/lib/components/checkbox/checkbox.component.ts
  15. 4
      npm/ng-packs/packages/theme-shared/src/lib/components/form-input/form-input.component.ts
  16. 11
      npm/ng-packs/packages/theme-shared/src/lib/components/password/password.component.ts
  17. 7
      npm/ng-packs/packages/theme-shared/src/lib/directives/ellipsis.directive.ts
  18. 1
      npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-default.directive.ts
  19. 1
      npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-list.directive.ts
  20. 11
      npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts

7
npm/ng-packs/packages/components/extensible/src/lib/components/date-time-picker/extensible-date-time-picker.component.ts

@ -7,19 +7,24 @@ import {
SkipSelf,
ViewChild,
} from '@angular/core';
import { ControlContainer } from '@angular/forms';
import { ControlContainer, ReactiveFormsModule } from '@angular/forms';
import {
NgbDateAdapter,
NgbDatepickerModule,
NgbInputDatepicker,
NgbTimeAdapter,
NgbTimepicker,
NgbTimepickerModule,
} from '@ng-bootstrap/ng-bootstrap';
import { FormProp } from '../../models/form-props';
import { selfFactory } from '../../utils/factory.util';
import { DateTimeAdapter } from '@abp/ng.theme.shared';
import { CommonModule } from '@angular/common';
@Component({
exportAs: 'abpExtensibleDateTimePicker',
standalone: true,
imports: [CommonModule, NgbDatepickerModule, ReactiveFormsModule, NgbTimepickerModule],
selector: 'abp-extensible-date-time-picker',
template: `
<input

2
npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.html

@ -124,7 +124,7 @@
<ng-template ngSwitchCase="dateTime">
<ng-template [ngTemplateOutlet]="label"></ng-template>
<abp-extensible-date-time-picker [prop]="prop" [meridian]="meridian" />
<abp-extensible-date-time-picker [prop]="prop" [meridian]="meridian$ | async" />
</ng-template>
<ng-template ngSwitchCase="textarea">

133
npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form-prop.component.ts

@ -1,11 +1,12 @@
import { EXTENSIONS_FORM_PROP, EXTENSIONS_FORM_PROP_DATA } from './../../tokens/extensions.token';
import { ABP, AbpValidators, ConfigStateService, TrackByService } from '@abp/ng.core';
import { ABP, CoreModule, TrackByService } from '@abp/ng.core';
import {
AfterViewInit,
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
ElementRef,
inject,
Injector,
Input,
OnChanges,
@ -17,26 +18,53 @@ import {
import {
ControlContainer,
FormGroupDirective,
UntypedFormGroup,
ReactiveFormsModule,
ValidatorFn,
Validators,
} from '@angular/forms';
import { NgbDateAdapter, NgbTimeAdapter } from '@ng-bootstrap/ng-bootstrap';
import {
NgbDateAdapter,
NgbDatepickerModule,
NgbTimeAdapter,
NgbTimepickerModule,
NgbTypeaheadModule,
} from '@ng-bootstrap/ng-bootstrap';
import { Observable, of } from 'rxjs';
import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators';
import { DateAdapter, TimeAdapter } from '@abp/ng.theme.shared';
import {
DateAdapter,
DisabledDirective,
PasswordComponent,
TimeAdapter,
} from '@abp/ng.theme.shared';
import { EXTRA_PROPERTIES_KEY } from '../../constants/extra-properties';
import { ePropType } from '../../enums/props.enum';
import { FormProp } from '../../models/form-props';
import { PropData } from '../../models/props';
import { selfFactory } from '../../utils/factory.util';
import { addTypeaheadTextSuffix } from '../../utils/typeahead.util';
import { eThemeSharedComponents } from "../../enums/components";
import { eThemeSharedComponents } from '../../enums/components';
import { ExtensibleDateTimePickerComponent } from '../date-time-picker/extensible-date-time-picker.component';
import { NgxValidateCoreModule } from '@ngx-validate/core';
import { ExtensibleFormPropService } from '../../services/extensible-form-prop.service';
import {CreateInjectorPipe} from "../../pipes/create-injector.pipe";
@Component({
selector: 'abp-extensible-form-prop',
templateUrl: './extensible-form-prop.component.html',
standalone: true,
imports: [
CoreModule,
ExtensibleDateTimePickerComponent,
NgbDatepickerModule,
NgbTimepickerModule,
ReactiveFormsModule,
DisabledDirective,
NgxValidateCoreModule,
NgbTypeaheadModule,
PasswordComponent,
CreateInjectorPipe
],
changeDetection: ChangeDetectionStrategy.OnPush,
providers: [ExtensibleFormPropService],
viewProviders: [
{
provide: ControlContainer,
@ -48,32 +76,27 @@ import { eThemeSharedComponents } from "../../enums/components";
],
})
export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit {
@Input() data!: PropData;
protected service = inject(ExtensibleFormPropService);
public readonly cdRef = inject(ChangeDetectorRef);
public readonly track = inject(TrackByService);
#groupDirective = inject(FormGroupDirective);
private injector = inject(Injector);
private readonly form = this.#groupDirective.form;
@Input() data!: PropData;
@Input() prop!: FormProp;
@Input() first?: boolean;
@ViewChild('field') private fieldRef!: ElementRef<HTMLElement>;
public injectorForCustomComponent?: Injector;
injectorForCustomComponent?: Injector;
asterisk = '';
containerClassName = 'mb-2';
options$: Observable<ABP.Option<any>[]> = of([]);
validators: ValidatorFn[] = [];
readonly!: boolean;
typeaheadModel: any;
passwordKey = eThemeSharedComponents.PasswordComponent;
private readonly form: UntypedFormGroup;
disabledFn = (data: PropData) => false;
get disabled() {
@ -100,27 +123,13 @@ export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit {
typeaheadFormatter = (option: ABP.Option<any>) => option.key;
get meridian() {
return (
this.configState.getDeep('localization.currentCulture.dateTimeFormat.shortTimePattern') || ''
).includes('tt');
}
meridian$ = this.service.meridian$;
get isInvalid() {
const control = this.form.get(this.prop.name);
return control?.touched && control.invalid;
}
constructor(
public readonly cdRef: ChangeDetectorRef,
public readonly track: TrackByService,
protected configState: ConfigStateService,
groupDirective: FormGroupDirective,
private injector: Injector,
) {
this.form = groupDirective.form;
}
private getTypeaheadControls() {
const { name } = this.prop;
const extraPropName = `${EXTRA_PROPERTIES_KEY}.${name}`;
@ -132,7 +141,7 @@ export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit {
}
private setAsterisk() {
this.asterisk = this.validators.some(isRequired) ? '*' : '';
this.asterisk = this.service.calcAsterisks(this.validators);
}
ngAfterViewInit() {
@ -143,51 +152,11 @@ export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit {
}
getComponent(prop: FormProp): string {
if (prop.template) {
return 'template';
}
switch (prop.type) {
case ePropType.Boolean:
return 'checkbox';
case ePropType.Date:
return 'date';
case ePropType.DateTime:
return 'dateTime';
case ePropType.Hidden:
return 'hidden';
case ePropType.MultiSelect:
return 'multiselect';
case ePropType.Text:
return 'textarea';
case ePropType.Time:
return 'time';
case ePropType.Typeahead:
return 'typeahead';
case ePropType.PasswordInputGroup:
return 'passwordinputgroup';
default:
return prop.options ? 'select' : 'input';
}
return this.service.getComponent(prop);
}
getType(prop: FormProp): string {
switch (prop.type) {
case ePropType.Date:
case ePropType.String:
return 'text';
case ePropType.Boolean:
return 'checkbox';
case ePropType.Number:
return 'number';
case ePropType.Email:
return 'email';
case ePropType.Password:
return 'password';
case ePropType.PasswordInputGroup:
return 'passwordinputgroup';
default:
return 'hidden';
}
return this.service.getType(prop);
}
ngOnChanges({ prop, data }: SimpleChanges) {
@ -229,11 +198,3 @@ export class ExtensibleFormPropComponent implements OnChanges, AfterViewInit {
this.typeaheadModel = { key: keyControl.value, value: valueControl.value };
}
}
function isRequired(validator: ValidatorFn) {
return (
validator === Validators.required ||
validator === AbpValidators.required ||
validator.name === 'required'
);
}

123
npm/ng-packs/packages/components/extensible/src/lib/components/extensible-form/extensible-form.component.ts

@ -1,73 +1,76 @@
import { TrackByService } from '@abp/ng.core';
import {TrackByService} from '@abp/ng.core';
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
Inject,
Input,
Optional,
QueryList,
SkipSelf,
ViewChildren,
ChangeDetectionStrategy,
ChangeDetectorRef,
Component, inject,
Input,
Optional,
QueryList,
SkipSelf,
ViewChildren,
} from '@angular/core';
import { ControlContainer, UntypedFormGroup } from '@angular/forms';
import { EXTRA_PROPERTIES_KEY } from '../../constants/extra-properties';
import { FormPropList, GroupedFormPropList } from '../../models/form-props';
import { ExtensionsService } from '../../services/extensions.service';
import { EXTENSIONS_IDENTIFIER } from '../../tokens/extensions.token';
import { selfFactory } from '../../utils/factory.util';
import { ExtensibleFormPropComponent } from './extensible-form-prop.component';
import {ControlContainer, ReactiveFormsModule, UntypedFormGroup} from '@angular/forms';
import {EXTRA_PROPERTIES_KEY} from '../../constants/extra-properties';
import {FormPropList, GroupedFormPropList} from '../../models/form-props';
import {ExtensionsService} from '../../services/extensions.service';
import {EXTENSIONS_IDENTIFIER} from '../../tokens/extensions.token';
import {selfFactory} from '../../utils/factory.util';
import {ExtensibleFormPropComponent} from './extensible-form-prop.component';
import {CommonModule} from "@angular/common";
import {PropDataDirective} from "../../directives/prop-data.directive";
@Component({
exportAs: 'abpExtensibleForm',
selector: 'abp-extensible-form',
templateUrl: './extensible-form.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
viewProviders: [
{
provide: ControlContainer,
useFactory: selfFactory,
deps: [[new Optional(), new SkipSelf(), ControlContainer]],
},
],
exportAs: 'abpExtensibleForm',
selector: 'abp-extensible-form',
templateUrl: './extensible-form.component.html',
standalone:true,
imports:[CommonModule, PropDataDirective,ReactiveFormsModule,ExtensibleFormPropComponent],
changeDetection: ChangeDetectionStrategy.OnPush,
viewProviders: [
{
provide: ControlContainer,
useFactory: selfFactory,
deps: [[new Optional(), new SkipSelf(), ControlContainer]],
},
],
})
export class ExtensibleFormComponent<R = any> {
@ViewChildren(ExtensibleFormPropComponent)
formProps!: QueryList<ExtensibleFormPropComponent>;
@Input()
set selectedRecord(record: R) {
const type = !record || JSON.stringify(record) === '{}' ? 'create' : 'edit';
const propList = this.extensions[`${type}FormProps`].get(this.identifier).props;
this.groupedPropList = this.createGroupedList(propList);
this.record = record;
}
@ViewChildren(ExtensibleFormPropComponent)
formProps!: QueryList<ExtensibleFormPropComponent>;
extraPropertiesKey = EXTRA_PROPERTIES_KEY;
groupedPropList!: GroupedFormPropList;
record!: R;
@Input()
set selectedRecord(record: R) {
const type = !record || JSON.stringify(record) === '{}' ? 'create' : 'edit';
const propList = this.extensions[`${type}FormProps`].get(this.identifier).props;
this.groupedPropList = this.createGroupedList(propList);
this.record = record;
}
createGroupedList(propList: FormPropList<R>) {
const groupedFormPropList = new GroupedFormPropList();
propList.forEach(item => {
groupedFormPropList.addItem(item.value);
});
return groupedFormPropList;
}
extraPropertiesKey = EXTRA_PROPERTIES_KEY;
groupedPropList!: GroupedFormPropList;
record!: R;
get form(): UntypedFormGroup {
return (this.container ? this.container.control : { controls: {} }) as UntypedFormGroup;
}
public readonly cdRef = inject(ChangeDetectorRef)
public readonly track = inject(TrackByService)
private container = inject(ControlContainer)
private extensions = inject(ExtensionsService);
private identifier = inject(EXTENSIONS_IDENTIFIER)
get extraProperties(): UntypedFormGroup {
return (this.form.controls.extraProperties || { controls: {} }) as UntypedFormGroup;
}
createGroupedList(propList: FormPropList<R>) {
const groupedFormPropList = new GroupedFormPropList();
propList.forEach(item => {
groupedFormPropList.addItem(item.value);
});
return groupedFormPropList;
}
get form(): UntypedFormGroup {
return (this.container ? this.container.control : {controls: {}}) as UntypedFormGroup;
}
get extraProperties(): UntypedFormGroup {
return (this.form.controls.extraProperties || {controls: {}}) as UntypedFormGroup;
}
constructor(
public readonly cdRef: ChangeDetectorRef,
public readonly track: TrackByService,
private container: ControlContainer,
private extensions: ExtensionsService,
@Inject(EXTENSIONS_IDENTIFIER) private identifier: string,
) {}
}

51
npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.ts

@ -1,17 +1,19 @@
import {
ABP,
ConfigStateService,
CoreModule,
getShortDateFormat,
getShortDateShortTimeFormat,
getShortTimeFormat,
ListService,
PermissionService,
} from '@abp/ng.core';
import { formatDate } from '@angular/common';
import { CommonModule, formatDate } from '@angular/common';
import {
ChangeDetectionStrategy,
Component,
EventEmitter,
inject,
Inject,
Injector,
Input,
@ -31,16 +33,28 @@ import { PropData } from '../../models/props';
import { ExtensionsService } from '../../services/extensions.service';
import {
ENTITY_PROP_TYPE_CLASSES,
EntityPropTypeClass,
EXTENSIONS_IDENTIFIER,
PROP_DATA_STREAM,
} from '../../tokens/extensions.token';
import { NgxDatatableModule } from '@swimlane/ngx-datatable';
import { GridActionsComponent } from '../grid-actions/grid-actions.component';
import { NgbTooltip } from '@ng-bootstrap/ng-bootstrap';
import { NgxDatatableDefaultDirective, NgxDatatableListDirective } from '@abp/ng.theme.shared';
const DEFAULT_ACTIONS_COLUMN_WIDTH = 150;
@Component({
@Component({
exportAs: 'abpExtensibleTable',
selector: 'abp-extensible-table',
standalone: true,
imports: [
CoreModule,
NgxDatatableModule,
GridActionsComponent,
NgbTooltip,
NgxDatatableDefaultDirective,
NgxDatatableListDirective,
],
templateUrl: './extensible-table.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
})
@ -50,6 +64,7 @@ export class ExtensibleTableComponent<R = any> implements OnChanges {
set actionsText(value: string) {
this._actionsText = value;
}
get actionsText(): string {
return this._actionsText ?? (this.actionList.length > 1 ? 'AbpUi::Actions' : '');
}
@ -57,19 +72,17 @@ export class ExtensibleTableComponent<R = any> implements OnChanges {
@Input() data!: R[];
@Input() list!: ListService;
@Input() recordsTotal!: number;
@Input() set actionsColumnWidth(width: number) {
this.setColumnWidths(width ? Number(width) : undefined);
}
@Input() actionsTemplate?: TemplateRef<any>;
@Output() tableActivate = new EventEmitter();
getInjected: typeof this.injector.get
hasAtLeastOnePermittedAction: boolean;
entityPropTypeClasses: EntityPropTypeClass;
readonly columnWidths!: number[];
readonly propList: EntityPropList<R>;
@ -78,20 +91,20 @@ export class ExtensibleTableComponent<R = any> implements OnChanges {
readonly trackByFn: TrackByFunction<EntityProp<R>> = (_, item) => item.name;
constructor(
@Inject(LOCALE_ID) private locale: string,
private config: ConfigStateService,
private injector: Injector,
) {
this.entityPropTypeClasses = injector.get(ENTITY_PROP_TYPE_CLASSES);
this.getInjected = injector.get.bind(injector);
const extensions = injector.get(ExtensionsService);
const name = injector.get(EXTENSIONS_IDENTIFIER);
locale = inject(LOCALE_ID);
private config = inject(ConfigStateService);
entityPropTypeClasses = inject(ENTITY_PROP_TYPE_CLASSES);
#injector = inject(Injector);
getInjected = this.#injector.get.bind(this.#injector);
constructor() {
const extensions = this.#injector.get(ExtensionsService);
const name = this.#injector.get(EXTENSIONS_IDENTIFIER);
this.propList = extensions.entityProps.get(name).props;
this.actionList = extensions['entityActions'].get(name)
.actions as unknown as EntityActionList<R>;
const permissionService = injector.get(PermissionService);
const permissionService = this.#injector.get(PermissionService);
this.hasAtLeastOnePermittedAction =
permissionService.filterItemsByPolicy(
this.actionList.toArray().map(action => ({ requiredPolicy: action.permission })),
@ -149,7 +162,7 @@ export class ExtensibleTableComponent<R = any> implements OnChanges {
if (!data?.currentValue) return;
if (data.currentValue.length < 1) {
this.list.totalCount = this.recordsTotal
this.list.totalCount = this.recordsTotal;
}
this.data = data.currentValue.map((record: any, index: number) => {
@ -170,7 +183,7 @@ export class ExtensibleTableComponent<R = any> implements OnChanges {
useValue: value,
},
],
parent: this.injector,
parent: this.#injector,
});
record[propKey].component = prop.value.component;
}

5
npm/ng-packs/packages/components/extensible/src/lib/components/grid-actions/grid-actions.component.ts

@ -8,9 +8,14 @@ import {
import { EntityAction, EntityActionList } from '../../models/entity-actions';
import { EXTENSIONS_ACTION_TYPE } from '../../tokens/extensions.token';
import { AbstractActionsComponent } from '../abstract-actions/abstract-actions.component';
import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap';
import { CoreModule } from '@abp/ng.core';
import {EllipsisDirective} from "@abp/ng.theme.shared";
@Component({
exportAs: 'abpGridActions',
standalone: true,
imports: [ CoreModule, NgbDropdownModule, EllipsisDirective],
selector: 'abp-grid-actions',
templateUrl: './grid-actions.component.html',
providers: [

5
npm/ng-packs/packages/components/extensible/src/lib/components/page-toolbar/page-toolbar.component.ts

@ -8,10 +8,14 @@ import {
} from '../../models/toolbar-actions';
import { EXTENSIONS_ACTION_TYPE } from '../../tokens/extensions.token';
import { AbstractActionsComponent } from '../abstract-actions/abstract-actions.component';
import { CreateInjectorPipe } from '../../pipes/create-injector.pipe';
import { CoreModule } from '@abp/ng.core';
@Component({
exportAs: 'abpPageToolbar',
selector: 'abp-page-toolbar',
standalone: true,
imports: [ CoreModule, CreateInjectorPipe],
templateUrl: './page-toolbar.component.html',
providers: [
{
@ -31,6 +35,7 @@ export class PageToolbarComponent<R = any>
readonly trackByFn: TrackByFunction<ToolbarComponent<R>> = (_, item) =>
item.action || item.component;
constructor(public readonly injector: Injector) {
super(injector);
}

1
npm/ng-packs/packages/components/extensible/src/lib/directives/prop-data.directive.ts

@ -13,6 +13,7 @@ import { PropData, PropList } from '../models/props';
@Directive({
exportAs: 'abpPropData',
selector: '[abpPropData]',
standalone: true,
})
export class PropDataDirective<L extends PropList<any>>
extends PropData<InferredData<L>>

35
npm/ng-packs/packages/components/extensible/src/lib/extensible.module.ts

@ -15,23 +15,25 @@ import {
ExtensibleTableComponent,
GridActionsComponent,
PageToolbarComponent,
ExtensibleDateTimePickerComponent
ExtensibleDateTimePickerComponent,
} from './components';
import { PropDataDirective } from './directives/prop-data.directive';
import { CreateInjectorPipe } from './pipes/create-injector.pipe';
import { DisabledDirective } from '@abp/ng.theme.shared';
const importWithExport = [
DisabledDirective,
ExtensibleDateTimePickerComponent,
ExtensibleFormPropComponent,
GridActionsComponent,
PropDataDirective,
PageToolbarComponent,
CreateInjectorPipe,
ExtensibleFormComponent,
ExtensibleTableComponent,
];
@NgModule({
declarations: [
ExtensibleDateTimePickerComponent,
PageToolbarComponent,
GridActionsComponent,
ExtensibleFormPropComponent,
ExtensibleFormComponent,
ExtensibleTableComponent,
PropDataDirective,
CreateInjectorPipe,
],
declarations: [],
imports: [
CoreModule,
ThemeSharedModule,
@ -41,15 +43,8 @@ import { DisabledDirective } from '@abp/ng.theme.shared';
NgbTimepickerModule,
NgbTypeaheadModule,
NgbTooltipModule,
DisabledDirective,
],
exports: [
PageToolbarComponent,
GridActionsComponent,
ExtensibleFormComponent,
ExtensibleTableComponent,
PropDataDirective,
CreateInjectorPipe,
...importWithExport,
],
exports: [...importWithExport],
})
export class ExtensibleModule {}

1
npm/ng-packs/packages/components/extensible/src/lib/pipes/create-injector.pipe.ts

@ -12,6 +12,7 @@ import { EXTENSIONS_ACTION_CALLBACK, EXTENSIONS_ACTION_DATA } from '../tokens/ex
@Pipe({
name: 'createInjector',
standalone: true,
})
export class CreateInjectorPipe<R> implements PipeTransform {
public transform(

77
npm/ng-packs/packages/components/extensible/src/lib/services/extensible-form-prop.service.ts

@ -0,0 +1,77 @@
import { inject, Injectable } from '@angular/core';
import { ValidatorFn, Validators } from '@angular/forms';
import { AbpValidators, ConfigStateService } from '@abp/ng.core';
import { map } from 'rxjs/operators';
import { FormProp } from '../models/form-props';
import { ePropType } from '../enums/props.enum';
@Injectable()
export class ExtensibleFormPropService {
readonly #configStateService = inject(ConfigStateService);
meridian$ = this.#configStateService
.getDeep$('localization.currentCulture.dateTimeFormat.shortTimePattern')
.pipe(map((shortTimePattern: string | undefined) => (shortTimePattern || '').includes('tt')));
isRequired(validator: ValidatorFn) {
return (
validator === Validators.required ||
validator === AbpValidators.required ||
validator.name === 'required'
);
}
getComponent(prop: FormProp) {
if (prop.template) {
return 'template';
}
switch (prop.type) {
case ePropType.Boolean:
return 'checkbox';
case ePropType.Date:
return 'date';
case ePropType.DateTime:
return 'dateTime';
case ePropType.Hidden:
return 'hidden';
case ePropType.MultiSelect:
return 'multiselect';
case ePropType.Text:
return 'textarea';
case ePropType.Time:
return 'time';
case ePropType.Typeahead:
return 'typeahead';
case ePropType.PasswordInputGroup:
return 'passwordinputgroup';
default:
return prop.options ? 'select' : 'input';
}
}
getType(prop: FormProp) {
switch (prop.type) {
case ePropType.Date:
case ePropType.String:
return 'text';
case ePropType.Boolean:
return 'checkbox';
case ePropType.Number:
return 'number';
case ePropType.Email:
return 'email';
case ePropType.Password:
return 'password';
case ePropType.PasswordInputGroup:
return 'passwordinputgroup';
default:
return 'hidden';
}
}
calcAsterisks(validators: ValidatorFn[]) {
if (!validators) return '';
const required = validators.find(v => this.isRequired(v));
return required ? '*' : '';
}
}

5
npm/ng-packs/packages/components/page/src/page.module.ts

@ -1,6 +1,5 @@
import { CoreModule } from '@abp/ng.core';
import { ThemeSharedModule } from '@abp/ng.theme.shared';
import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { PagePartDirective } from './page-part.directive';
import {
@ -9,7 +8,7 @@ import {
PageToolbarContainerComponent,
} from './page-parts.component';
import { PageComponent } from './page.component';
import {ExtensibleModule} from "@abp/ng.components/extensible";
import {PageToolbarComponent} from "@abp/ng.components/extensible";
const exportedDeclarations = [
PageComponent,
@ -21,7 +20,7 @@ const exportedDeclarations = [
@NgModule({
declarations: [...exportedDeclarations],
imports: [CommonModule, CoreModule, ThemeSharedModule, ExtensibleModule],
imports: [CoreModule, ThemeSharedModule, PageToolbarComponent],
exports: [...exportedDeclarations],
})
export class PageModule {}

8
npm/ng-packs/packages/core/src/lib/abstracts/ng-model.component.ts

@ -1,11 +1,11 @@
import { ChangeDetectorRef, Component, Injector, Input } from '@angular/core';
import { ChangeDetectorRef, Component, inject, Input } from '@angular/core';
import { ControlValueAccessor } from '@angular/forms';
// Not an abstract class on purpose. Do not change!
@Component({ template: '' })
export class AbstractNgModelComponent<T = any, U = T> implements ControlValueAccessor {
protected _value!: T;
protected cdRef: ChangeDetectorRef;
protected cdRef = inject(ChangeDetectorRef);
onChange?: (value: T) => void;
onTouched?: () => void;
@ -39,10 +39,6 @@ export class AbstractNgModelComponent<T = any, U = T> implements ControlValueAcc
return this._value;
}
constructor(public injector: Injector) {
this.cdRef = injector.get(ChangeDetectorRef);
}
notifyValueChange(): void {
if (this.onChange) {
this.onChange(this.value);

4
npm/ng-packs/packages/theme-shared/src/lib/components/checkbox/checkbox.component.ts

@ -43,8 +43,4 @@ export class FormCheckboxComponent extends AbstractNgModelComponent {
@Input() checkboxReadonly = false;
@Output() checkboxBlur = new EventEmitter<void>();
@Output() checkboxFocus = new EventEmitter<void>();
constructor(injector: Injector) {
super(injector);
}
}

4
npm/ng-packs/packages/theme-shared/src/lib/components/form-input/form-input.component.ts

@ -45,8 +45,4 @@ export class FormInputComponent extends AbstractNgModelComponent {
@Input() inputClass = 'form-control';
@Output() formBlur = new EventEmitter<void>();
@Output() formFocus = new EventEmitter<void>();
constructor(injector: Injector) {
super(injector);
}
}

11
npm/ng-packs/packages/theme-shared/src/lib/components/password/password.component.ts

@ -1,9 +1,12 @@
import { Component, forwardRef, Injector, Input } from '@angular/core';
import { Component, forwardRef, Input } from '@angular/core';
import { AbstractNgModelComponent } from '@abp/ng.core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
import { CommonModule } from '@angular/common';
@Component({
selector: 'abp-password',
standalone: true,
imports: [CommonModule, FormsModule],
templateUrl: `./password.component.html`,
providers: [
{
@ -18,10 +21,6 @@ export class PasswordComponent extends AbstractNgModelComponent {
@Input() formControlName!: string;
fieldTextType?: boolean;
constructor(injector: Injector) {
super(injector);
}
toggleFieldTextType() {
this.fieldTextType = !this.fieldTextType;
}

7
npm/ng-packs/packages/theme-shared/src/lib/directives/ellipsis.directive.ts

@ -10,6 +10,7 @@ import {
@Directive({
selector: '[abpEllipsis]',
standalone:true
})
export class EllipsisDirective implements AfterViewInit {
@Input('abpEllipsis')
@ -44,9 +45,3 @@ export class EllipsisDirective implements AfterViewInit {
this.cdRef.detectChanges();
}
}
@NgModule({
exports: [EllipsisDirective],
declarations: [EllipsisDirective],
})
export class EllipsisModule {}

1
npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-default.directive.ts

@ -7,6 +7,7 @@ import { debounceTime } from 'rxjs/operators';
@Directive({
// eslint-disable-next-line @angular-eslint/directive-selector
selector: 'ngx-datatable[default]',
standalone:true,
exportAs: 'ngxDatatableDefault',
})
export class NgxDatatableDefaultDirective implements AfterViewInit, OnDestroy {

1
npm/ng-packs/packages/theme-shared/src/lib/directives/ngx-datatable-list.directive.ts

@ -21,6 +21,7 @@ import {
@Directive({
// eslint-disable-next-line @angular-eslint/directive-selector
selector: 'ngx-datatable[list]',
standalone: true,
exportAs: 'ngxDatatableList',
})
export class NgxDatatableListDirective implements OnChanges, OnDestroy, OnInit {

11
npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts

@ -22,7 +22,7 @@ import { ModalComponent } from './components/modal/modal.component';
import { ToastContainerComponent } from './components/toast-container/toast-container.component';
import { ToastComponent } from './components/toast/toast.component';
import { DEFAULT_VALIDATION_BLUEPRINTS } from './constants/validation';
import { EllipsisModule } from './directives/ellipsis.directive';
import { EllipsisDirective } from './directives/ellipsis.directive';
import { LoadingDirective } from './directives/loading.directive';
import { NgxDatatableDefaultDirective } from './directives/ngx-datatable-default.directive';
import { NgxDatatableListDirective } from './directives/ngx-datatable-list.directive';
@ -52,9 +52,6 @@ const declarationsWithExports = [
ModalComponent,
ToastComponent,
ToastContainerComponent,
PasswordComponent,
NgxDatatableDefaultDirective,
NgxDatatableListDirective,
LoadingDirective,
ModalCloseDirective,
AbpVisibleDirective,
@ -68,14 +65,16 @@ const declarationsWithExports = [
NgxDatatableModule,
NgxValidateCoreModule,
NgbPaginationModule,
EllipsisModule,
EllipsisDirective,
CardModule,
PasswordComponent,
NgxDatatableDefaultDirective,
NgxDatatableListDirective,
DisabledDirective
],
declarations: [...declarationsWithExports, HttpErrorWrapperComponent],
exports: [
NgxDatatableModule,
EllipsisModule,
NgxValidateCoreModule,
CardModule,
DisabledDirective,

Loading…
Cancel
Save