@enigmatry/entry-components 1.15.1-preview.3 → 1.15.1-preview.31
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/README.md +2 -1
- package/assets/fonts/Montserrat/Montserrat-bold.eot +0 -0
- package/assets/fonts/Montserrat/Montserrat-bold.ttf +0 -0
- package/assets/fonts/Montserrat/Montserrat-bold.woff +0 -0
- package/assets/fonts/Montserrat/Montserrat-bold.woff2 +0 -0
- package/assets/fonts/OpenSans/OpenSans-bold.eot +0 -0
- package/assets/fonts/OpenSans/OpenSans-bold.ttf +0 -0
- package/assets/fonts/OpenSans/OpenSans-bold.woff +0 -0
- package/assets/fonts/OpenSans/OpenSans-bold.woff2 +0 -0
- package/assets/fonts/OpenSans/OpenSans-normal.eot +0 -0
- package/assets/fonts/OpenSans/OpenSans-normal.ttf +0 -0
- package/assets/fonts/OpenSans/OpenSans-normal.woff +0 -0
- package/assets/fonts/OpenSans/OpenSans-normal.woff2 +0 -0
- package/assets/fonts/Roboto/Roboto-bold.woff2 +0 -0
- package/assets/fonts/Roboto/Roboto-normal.woff2 +0 -0
- package/button/README.md +47 -0
- package/button/entry-button-config.d.ts +26 -0
- package/button/entry-button.directive.d.ts +18 -0
- package/button/entry-button.module.d.ts +9 -0
- package/{header → button}/index.d.ts +1 -1
- package/button/public-api.d.ts +3 -0
- package/dialog/README.md +2 -2
- package/dialog/entry-dialog-buttons-alignment.type.d.ts +1 -1
- package/dialog/entry-dialog-config.model.d.ts +1 -1
- package/dialog/entry-dialog.module.d.ts +4 -1
- package/esm2020/{header/enigmatry-entry-components-header.mjs → button/enigmatry-entry-components-button.mjs} +1 -1
- package/esm2020/button/entry-button-config.mjs +22 -0
- package/esm2020/button/entry-button.directive.mjs +56 -0
- package/esm2020/button/entry-button.module.mjs +28 -0
- package/esm2020/button/public-api.mjs +4 -0
- package/esm2020/dialog/dialogs/entry-dialog.component.mjs +8 -5
- package/esm2020/dialog/entry-dialog-buttons-alignment.type.mjs +1 -1
- package/esm2020/dialog/entry-dialog-config.model.mjs +3 -3
- package/esm2020/dialog/entry-dialog.module.mjs +16 -4
- package/esm2020/file-input/enigmatry-entry-components-file-input.mjs +5 -0
- package/esm2020/file-input/entry-file-input.component.mjs +197 -0
- package/esm2020/file-input/entry-file-input.module.mjs +40 -0
- package/esm2020/file-input/public-api.mjs +3 -0
- package/esm2020/permissions/enigmatry-entry-components-permissions.mjs +5 -0
- package/esm2020/permissions/permission-type.mjs +2 -0
- package/esm2020/permissions/permission.directive.mjs +35 -0
- package/esm2020/permissions/permission.guard.mjs +14 -0
- package/esm2020/permissions/permission.module.mjs +29 -0
- package/esm2020/permissions/permission.pipe.mjs +20 -0
- package/esm2020/permissions/permission.service.mjs +3 -0
- package/esm2020/permissions/public-api.mjs +6 -0
- package/esm2020/public-api.mjs +4 -3
- package/esm2020/search-filter/entry-search-filter.component.mjs +8 -6
- package/esm2020/search-filter/entry-search-filter.module.mjs +12 -4
- package/esm2020/search-filter/search-filter-input/search-filter-input.component.mjs +9 -4
- package/esm2020/validation/entry-form-errors.component.mjs +7 -3
- package/fesm2015/enigmatry-entry-components-button.mjs +110 -0
- package/fesm2015/enigmatry-entry-components-button.mjs.map +1 -0
- package/fesm2015/enigmatry-entry-components-dialog.mjs +22 -7
- package/fesm2015/enigmatry-entry-components-dialog.mjs.map +1 -1
- package/fesm2015/enigmatry-entry-components-file-input.mjs +237 -0
- package/fesm2015/enigmatry-entry-components-file-input.mjs.map +1 -0
- package/fesm2015/enigmatry-entry-components-permissions.mjs +98 -0
- package/fesm2015/enigmatry-entry-components-permissions.mjs.map +1 -0
- package/fesm2015/enigmatry-entry-components-search-filter.mjs +24 -9
- package/fesm2015/enigmatry-entry-components-search-filter.mjs.map +1 -1
- package/fesm2015/enigmatry-entry-components-validation.mjs +6 -2
- package/fesm2015/enigmatry-entry-components-validation.mjs.map +1 -1
- package/fesm2015/enigmatry-entry-components.mjs +3 -2
- package/fesm2015/enigmatry-entry-components.mjs.map +1 -1
- package/fesm2020/enigmatry-entry-components-button.mjs +107 -0
- package/fesm2020/enigmatry-entry-components-button.mjs.map +1 -0
- package/fesm2020/enigmatry-entry-components-dialog.mjs +22 -7
- package/fesm2020/enigmatry-entry-components-dialog.mjs.map +1 -1
- package/fesm2020/enigmatry-entry-components-file-input.mjs +240 -0
- package/fesm2020/enigmatry-entry-components-file-input.mjs.map +1 -0
- package/fesm2020/enigmatry-entry-components-permissions.mjs +97 -0
- package/fesm2020/enigmatry-entry-components-permissions.mjs.map +1 -0
- package/fesm2020/enigmatry-entry-components-search-filter.mjs +24 -9
- package/fesm2020/enigmatry-entry-components-search-filter.mjs.map +1 -1
- package/fesm2020/enigmatry-entry-components-validation.mjs +6 -2
- package/fesm2020/enigmatry-entry-components-validation.mjs.map +1 -1
- package/fesm2020/enigmatry-entry-components.mjs +3 -2
- package/fesm2020/enigmatry-entry-components.mjs.map +1 -1
- package/file-input/README.md +71 -0
- package/file-input/entry-file-input.component.d.ts +74 -0
- package/file-input/entry-file-input.module.d.ts +12 -0
- package/{toolbar → file-input}/index.d.ts +1 -1
- package/file-input/public-api.d.ts +2 -0
- package/package.json +24 -16
- package/permissions/README.md +68 -0
- package/permissions/index.d.ts +5 -0
- package/permissions/permission-type.d.ts +3 -0
- package/permissions/permission.directive.d.ts +11 -0
- package/permissions/permission.guard.d.ts +2 -0
- package/permissions/permission.module.d.ts +9 -0
- package/permissions/permission.pipe.d.ts +11 -0
- package/permissions/permission.service.d.ts +4 -0
- package/permissions/public-api.d.ts +5 -0
- package/public-api.d.ts +3 -2
- package/search-filter/entry-search-filter.module.d.ts +4 -2
- package/search-filter/search-filter-input/search-filter-input.component.d.ts +4 -2
- package/styles/_generator.scss +20 -0
- package/styles/modules/_default-theme.scss +63 -0
- package/styles/modules/components/buttons/_generator.scss +8 -0
- package/styles/modules/components/dialogs/_generator.scss +16 -0
- package/styles/modules/components/forms/_generator.scss +15 -0
- package/styles/modules/components/search-filter/_generator.scss +15 -0
- package/styles/modules/components/tables/_cells.scss +19 -0
- package/styles/modules/components/tables/_generator.scss +7 -0
- package/styles/modules/components/tables/_no-result.scss +10 -0
- package/styles/modules/components/tables/_rows.scss +23 -0
- package/styles/modules/components/tables/_sorting.scss +11 -0
- package/styles/modules/components/tables/_table-body.scss +11 -0
- package/styles/modules/typography/_fonts.scss +46 -68
- package/styles/modules/vendors/angular-material/_generator.scss +46 -0
- package/styles/modules/vendors/angular-material/_palette-generator.scss +32 -0
- package/styles/modules/vendors/angular-material/_typography-generator.scss +101 -0
- package/styles/partials/core/components/_index.scss +4 -0
- package/styles/partials/core/components/dialogs/_general.scss +23 -0
- package/styles/partials/core/components/forms/_general.scss +28 -0
- package/styles/partials/core/components/search-filter/_general.scss +9 -0
- package/styles/partials/core/components/tables/_general.scss +17 -0
- package/styles/partials/generator-test.scss +29 -0
- package/styles/partials/theming.scss +1 -0
- package/dialog/styles/modules/_generator.scss +0 -11
- package/dialog/styles/modules/components/dialogs/_general.scss +0 -11
- package/dialog/styles/modules/components/dialogs/footers/_general.scss +0 -26
- package/dialog/styles/modules/components/dialogs/headers/_general.scss +0 -16
- package/dialog/styles/modules/theming/_default-theming.scss +0 -29
- package/dialog/styles/partials/core/_index.scss +0 -3
- package/dialog/styles/partials/core/components/_index.scss +0 -1
- package/dialog/styles/partials/core/components/dialogs/_general.scss +0 -78
- package/dialog/styles/partials/core/components/dialogs/_index.scss +0 -1
- package/dialog/styles/partials/core/elements/_general.scss +0 -10
- package/dialog/styles/partials/core/elements/_index.scss +0 -1
- package/dialog/styles/partials/core/layouts/_alignments.scss +0 -13
- package/dialog/styles/partials/core/layouts/_index.scss +0 -1
- package/dialog/styles/partials/main.scss +0 -1
- package/esm2020/header/entry-header.component.mjs +0 -13
- package/esm2020/header/entry-header.module.mjs +0 -24
- package/esm2020/header/public-api.mjs +0 -3
- package/esm2020/toolbar/enigmatry-entry-components-toolbar.mjs +0 -5
- package/esm2020/toolbar/entry-toolbar.component.mjs +0 -43
- package/esm2020/toolbar/entry-toolbar.module.mjs +0 -24
- package/esm2020/toolbar/public-api.mjs +0 -3
- package/fesm2015/enigmatry-entry-components-header.mjs +0 -41
- package/fesm2015/enigmatry-entry-components-header.mjs.map +0 -1
- package/fesm2015/enigmatry-entry-components-toolbar.mjs +0 -71
- package/fesm2015/enigmatry-entry-components-toolbar.mjs.map +0 -1
- package/fesm2020/enigmatry-entry-components-header.mjs +0 -41
- package/fesm2020/enigmatry-entry-components-header.mjs.map +0 -1
- package/fesm2020/enigmatry-entry-components-toolbar.mjs +0 -71
- package/fesm2020/enigmatry-entry-components-toolbar.mjs.map +0 -1
- package/header/README.md +0 -41
- package/header/entry-header.component.d.ts +0 -6
- package/header/entry-header.module.d.ts +0 -8
- package/header/public-api.d.ts +0 -2
- package/header/styles/modules/_generator.scss +0 -13
- package/header/styles/modules/components/buttons/_general.scss +0 -26
- package/header/styles/modules/components/headers/_general.scss +0 -13
- package/header/styles/modules/theming/_default-theming.scss +0 -21
- package/header/styles/partials/core/_index.scss +0 -3
- package/header/styles/partials/core/components/_index.scss +0 -2
- package/header/styles/partials/core/components/buttons/_general.scss +0 -42
- package/header/styles/partials/core/components/buttons/_index.scss +0 -1
- package/header/styles/partials/core/components/headers/_general.scss +0 -9
- package/header/styles/partials/core/components/headers/_index.scss +0 -1
- package/header/styles/partials/core/elements/_index.scss +0 -1
- package/header/styles/partials/core/elements/headings.scss +0 -3
- package/header/styles/partials/core/layouts/_alignment.scss +0 -6
- package/header/styles/partials/core/layouts/_index.scss +0 -1
- package/header/styles/partials/main.scss +0 -1
- package/styles/_generate.scss +0 -15
- package/styles/modules/_breakpoints.scss +0 -37
- package/styles/modules/_generate.scss +0 -5
- package/styles/modules/_variables.scss +0 -22
- package/styles/modules/states/_hover.scss +0 -27
- package/styles/modules/theming/_default-theming.scss +0 -9
- package/styles/modules/typography/_generate.scss +0 -7
- package/toolbar/README.md +0 -39
- package/toolbar/entry-toolbar.component.d.ts +0 -28
- package/toolbar/entry-toolbar.module.d.ts +0 -8
- package/toolbar/public-api.d.ts +0 -2
- package/toolbar/styles/modules/_generate.scss +0 -10
- package/toolbar/styles/modules/components/toolbar/_general.scss +0 -34
- package/toolbar/styles/modules/theming/_default-theming.scss +0 -8
- package/toolbar/styles/partials/core/_index.scss +0 -1
- package/toolbar/styles/partials/core/components/_index.scss +0 -1
- package/toolbar/styles/partials/core/components/toolbar/_general.scss +0 -100
- package/toolbar/styles/partials/core/components/toolbar/_index.scss +0 -1
- package/toolbar/styles/partials/main.scss +0 -1
|
@@ -21,7 +21,9 @@ class EntryFormErrorsComponent {
|
|
|
21
21
|
EntryFormErrorsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EntryFormErrorsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
22
22
|
EntryFormErrorsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: EntryFormErrorsComponent, selector: "entry-form-errors", inputs: { form: "form" }, ngImport: i0, template: `
|
|
23
23
|
<div *ngIf="form.errors">
|
|
24
|
-
<mat-error *ngFor="let error of form.errors.general">
|
|
24
|
+
<mat-error *ngFor="let error of form.errors.general">
|
|
25
|
+
<span class="mat-body-2">{{error}}</span>
|
|
26
|
+
</mat-error>
|
|
25
27
|
</div>
|
|
26
28
|
`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }], changeDetection: i0.ChangeDetectionStrategy.Default });
|
|
27
29
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EntryFormErrorsComponent, decorators: [{
|
|
@@ -30,7 +32,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
|
30
32
|
selector: 'entry-form-errors',
|
|
31
33
|
template: `
|
|
32
34
|
<div *ngIf="form.errors">
|
|
33
|
-
<mat-error *ngFor="let error of form.errors.general">
|
|
35
|
+
<mat-error *ngFor="let error of form.errors.general">
|
|
36
|
+
<span class="mat-body-2">{{error}}</span>
|
|
37
|
+
</mat-error>
|
|
34
38
|
</div>
|
|
35
39
|
`,
|
|
36
40
|
changeDetection: ChangeDetectionStrategy.Default
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enigmatry-entry-components-validation.mjs","sources":["../../../../libs/entry-components/validation/entry-form-errors.component.ts","../../../../libs/entry-components/validation/entry-validation-config.model.ts","../../../../libs/entry-components/validation/entry-validation.ts","../../../../libs/entry-components/validation/entry-display-control-validation.directive.ts","../../../../libs/entry-components/validation/entry-validation.module.ts","../../../../libs/entry-components/validation/enigmatry-entry-components-validation.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { UntypedFormGroup } from '@angular/forms';\n\n/**\n * A component used to display generic (form level) server side validation messages.\n * The messages are displayed as a list, each message in a new row.\n *\n * @example\n * ```html\n * <entry-form-errors [form]=\"myForm\">\n * </entry-form-errors>\n * ```\n */\n@Component({\n selector: 'entry-form-errors',\n template: `\n <div *ngIf=\"form.errors\">\n <mat-error *ngFor=\"let error of form.errors.general\">{{error}}</mat-error>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.Default\n})\nexport class EntryFormErrorsComponent {\n /** A form group for which the validation errors are being displayed. */\n @Input() form: UntypedFormGroup;\n}\n","import { InjectionToken } from '@angular/core';\nimport { AbstractControl } from '@angular/forms';\n\n/** Used to configure mapping between validation keys and messages */\nexport interface IEntryValidationMessage {\n /** Validation key (e.g. '_required_', '_minlength_', '_email_', etc.) */\n name: string;\n /**\n * Validation message. Can be static string or expression returning string\n * (when messages need to be resolved dynamically: parametrization, localization, etc.).\n */\n message: string | ((control: AbstractControl) => string);\n}\n\n/**\n * Used to provide default configurations on module level.\n */\nexport class EntryValidationConfig {\n /**\n * Validation key to message configuration on module level. Used to configure client side validation messages\n * for standard validators (_required_, _minLength_, _email_, etc.).\n *\n * **NOTE:** If using _Formly_ package to render forms, this configuration should not be used.\n * Instead, use `FormlyModule` to configure validation messages.\n *\n * @example\n * ```ts\n * new EntryValidationConfig() {\n * validationMessages: [\n * { name: 'required': message: 'This field is mandatory' },\n * { name: 'minlength', message: (control: AbstractControl) => `Minimal length is ${control.errors.minlength.requiredLength}`}\n * ]\n * }\n * ```\n */\n validationMessages: IEntryValidationMessage[];\n\n constructor(config: Partial<EntryValidationConfig> = {}) {\n this.validationMessages = config.validationMessages ?? [];\n }\n}\n\n/**\n * Entry validation injection token of EntryValidationConfig type containing validation default configurations.\n * Can be updated with custom configuration.\n *\n * Defaults:\n * - validationMessages: []\n */\nexport const ENTRY_VALIDATION_CONFIG = new InjectionToken<EntryValidationConfig>(\n 'EntryValidationConfig',\n {\n providedIn: 'root',\n factory: () => new EntryValidationConfig()\n }\n);\n","import { AbstractControl, FormArray, FormGroup, UntypedFormGroup, ValidationErrors } from '@angular/forms';\nimport { IValidationProblemDetails } from './validation-problem-details.interface';\n\n/** A key used to map server side validation errors on form level */\nconst FORM_ERROR_KEY = 'general';\n/** A key used to map server side validation errors on form field level */\nconst FORM_FIELD_ERROR_KEY = 'fromServer';\n\nconst getFormControl = (formControl: AbstractControl | null | undefined, keys: string[]): AbstractControl | null | undefined => {\n if (keys.length === 0) {\n return formControl;\n }\n if (formControl instanceof FormGroup) {\n return getFormControl(formControl.controls[keys[0].charAt(0).toLowerCase() + keys[0].slice(1)], keys.slice(1));\n }\n if (formControl instanceof FormArray && +keys[0] >= 0) {\n return getFormControl(formControl.controls[+keys[0]], keys.slice(1));\n }\n return null;\n};\n\n/**\n * Applies validation errors received from server side to the form.\n * The errors are applied to multiple levels: form, form group, form array, and form field.\n *\n * @param error Server side validation errors response.\n * @param form Form to apply validation errors to.\n */\nconst setServerSideValidationErrors = (error: IValidationProblemDetails, form: UntypedFormGroup) => {\n form.setErrors(null);\n const validationErrors = error?.errors;\n const formErrors: ValidationErrors = {};\n\n if (validationErrors) {\n // eslint-disable-next-line guard-for-in\n for (const key in validationErrors) {\n const control = getFormControl(form, key.split(/[.[\\]]+/gu));\n\n if (control) {\n const fieldErrors = {} as ValidationErrors;\n fieldErrors[FORM_FIELD_ERROR_KEY] = validationErrors[key];\n control.setErrors(fieldErrors);\n control.markAsTouched();\n } else {\n formErrors[FORM_ERROR_KEY] =\n formErrors[FORM_ERROR_KEY]?.concat(validationErrors[key]) || validationErrors[key];\n }\n }\n } else {\n formErrors[FORM_ERROR_KEY] = [`An error occurred on the server.`];\n }\n\n form.setErrors(formErrors);\n};\n\nexport {\n FORM_FIELD_ERROR_KEY,\n setServerSideValidationErrors\n};\n","import { Directive, ElementRef, Inject, Input, OnDestroy, OnInit } from '@angular/core';\nimport { ENTRY_VALIDATION_CONFIG, EntryValidationConfig } from './entry-validation-config.model';\nimport { AbstractControl, FormControlStatus } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { FORM_FIELD_ERROR_KEY } from './entry-validation';\n\n/**\n * A directive that displays configured validation messages or server side validations for given form control.\n * The messages are separated with coma(,) and displayed as _innerHTML_ value of host component.\n *\n * @example\n * ```html\n * <div entryDisplayControlValidation [control]=\"myForm.controls.firstName\">\n * </div\n * ```\n */\n@Directive({\n selector: '[entryDisplayControlValidation]'\n})\nexport class EntryDisplayControlValidationDirective implements OnInit, OnDestroy {\n /** Form control for which the validation messages are displayed for. */\n @Input() control: AbstractControl;\n\n private _controlSubscription: Subscription | undefined;\n\n constructor(\n @Inject(ENTRY_VALIDATION_CONFIG) private readonly _config: EntryValidationConfig,\n private readonly _element: ElementRef) {}\n\n ngOnInit(): void {\n this._controlSubscription = this.control.statusChanges\n .subscribe((controlStatus: FormControlStatus) => {\n if (controlStatus === 'INVALID') {\n this._element.nativeElement.innerText = this.extractValidationMessages();\n }\n });\n }\n\n ngOnDestroy(): void {\n if (this._controlSubscription) {\n this._controlSubscription.unsubscribe();\n }\n }\n\n private extractValidationMessages(): string {\n if (!this.control.errors) {\n return '';\n }\n const errorsString = this._config.validationMessages\n .map(validationMessage => this.control.errors[validationMessage.name]\n ? typeof(validationMessage.message) === 'string'\n ? validationMessage.message : validationMessage.message(this.control)\n : ''\n )\n .filter(message => message !== '')\n .join(', ');\n\n const serverErrors = this.control.errors[FORM_FIELD_ERROR_KEY];\n const serverErrorsString = serverErrors instanceof Array ? serverErrors.join(', ') : '';\n\n return [errorsString, serverErrorsString].filter(x => x !== '').join(', ');\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { EntryFormErrorsComponent } from './entry-form-errors.component';\nimport { MatInputModule } from '@angular/material/input';\nimport { EntryDisplayControlValidationDirective } from './entry-display-control-validation.directive';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\n\n@NgModule({\n declarations: [\n EntryFormErrorsComponent,\n EntryDisplayControlValidationDirective\n ],\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatInputModule\n ],\n exports: [\n EntryFormErrorsComponent,\n EntryDisplayControlValidationDirective\n ]\n})\nexport class EntryValidationModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"enigmatry-entry-components-validation.mjs","sources":["../../../../libs/entry-components/validation/entry-form-errors.component.ts","../../../../libs/entry-components/validation/entry-validation-config.model.ts","../../../../libs/entry-components/validation/entry-validation.ts","../../../../libs/entry-components/validation/entry-display-control-validation.directive.ts","../../../../libs/entry-components/validation/entry-validation.module.ts","../../../../libs/entry-components/validation/enigmatry-entry-components-validation.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { UntypedFormGroup } from '@angular/forms';\n\n/**\n * A component used to display generic (form level) server side validation messages.\n * The messages are displayed as a list, each message in a new row.\n *\n * @example\n * ```html\n * <entry-form-errors [form]=\"myForm\">\n * </entry-form-errors>\n * ```\n */\n@Component({\n selector: 'entry-form-errors',\n template: `\n <div *ngIf=\"form.errors\">\n <mat-error *ngFor=\"let error of form.errors.general\">\n <span class=\"mat-body-2\">{{error}}</span>\n </mat-error>\n </div>\n `,\n changeDetection: ChangeDetectionStrategy.Default\n})\nexport class EntryFormErrorsComponent {\n /** A form group for which the validation errors are being displayed. */\n @Input() form: UntypedFormGroup;\n}\n","import { InjectionToken } from '@angular/core';\nimport { AbstractControl } from '@angular/forms';\n\n/** Used to configure mapping between validation keys and messages */\nexport interface IEntryValidationMessage {\n /** Validation key (e.g. '_required_', '_minlength_', '_email_', etc.) */\n name: string;\n /**\n * Validation message. Can be static string or expression returning string\n * (when messages need to be resolved dynamically: parametrization, localization, etc.).\n */\n message: string | ((control: AbstractControl) => string);\n}\n\n/**\n * Used to provide default configurations on module level.\n */\nexport class EntryValidationConfig {\n /**\n * Validation key to message configuration on module level. Used to configure client side validation messages\n * for standard validators (_required_, _minLength_, _email_, etc.).\n *\n * **NOTE:** If using _Formly_ package to render forms, this configuration should not be used.\n * Instead, use `FormlyModule` to configure validation messages.\n *\n * @example\n * ```ts\n * new EntryValidationConfig() {\n * validationMessages: [\n * { name: 'required': message: 'This field is mandatory' },\n * { name: 'minlength', message: (control: AbstractControl) => `Minimal length is ${control.errors.minlength.requiredLength}`}\n * ]\n * }\n * ```\n */\n validationMessages: IEntryValidationMessage[];\n\n constructor(config: Partial<EntryValidationConfig> = {}) {\n this.validationMessages = config.validationMessages ?? [];\n }\n}\n\n/**\n * Entry validation injection token of EntryValidationConfig type containing validation default configurations.\n * Can be updated with custom configuration.\n *\n * Defaults:\n * - validationMessages: []\n */\nexport const ENTRY_VALIDATION_CONFIG = new InjectionToken<EntryValidationConfig>(\n 'EntryValidationConfig',\n {\n providedIn: 'root',\n factory: () => new EntryValidationConfig()\n }\n);\n","import { AbstractControl, FormArray, FormGroup, UntypedFormGroup, ValidationErrors } from '@angular/forms';\nimport { IValidationProblemDetails } from './validation-problem-details.interface';\n\n/** A key used to map server side validation errors on form level */\nconst FORM_ERROR_KEY = 'general';\n/** A key used to map server side validation errors on form field level */\nconst FORM_FIELD_ERROR_KEY = 'fromServer';\n\nconst getFormControl = (formControl: AbstractControl | null | undefined, keys: string[]): AbstractControl | null | undefined => {\n if (keys.length === 0) {\n return formControl;\n }\n if (formControl instanceof FormGroup) {\n return getFormControl(formControl.controls[keys[0].charAt(0).toLowerCase() + keys[0].slice(1)], keys.slice(1));\n }\n if (formControl instanceof FormArray && +keys[0] >= 0) {\n return getFormControl(formControl.controls[+keys[0]], keys.slice(1));\n }\n return null;\n};\n\n/**\n * Applies validation errors received from server side to the form.\n * The errors are applied to multiple levels: form, form group, form array, and form field.\n *\n * @param error Server side validation errors response.\n * @param form Form to apply validation errors to.\n */\nconst setServerSideValidationErrors = (error: IValidationProblemDetails, form: UntypedFormGroup) => {\n form.setErrors(null);\n const validationErrors = error?.errors;\n const formErrors: ValidationErrors = {};\n\n if (validationErrors) {\n // eslint-disable-next-line guard-for-in\n for (const key in validationErrors) {\n const control = getFormControl(form, key.split(/[.[\\]]+/gu));\n\n if (control) {\n const fieldErrors = {} as ValidationErrors;\n fieldErrors[FORM_FIELD_ERROR_KEY] = validationErrors[key];\n control.setErrors(fieldErrors);\n control.markAsTouched();\n } else {\n formErrors[FORM_ERROR_KEY] =\n formErrors[FORM_ERROR_KEY]?.concat(validationErrors[key]) || validationErrors[key];\n }\n }\n } else {\n formErrors[FORM_ERROR_KEY] = [`An error occurred on the server.`];\n }\n\n form.setErrors(formErrors);\n};\n\nexport {\n FORM_FIELD_ERROR_KEY,\n setServerSideValidationErrors\n};\n","import { Directive, ElementRef, Inject, Input, OnDestroy, OnInit } from '@angular/core';\nimport { ENTRY_VALIDATION_CONFIG, EntryValidationConfig } from './entry-validation-config.model';\nimport { AbstractControl, FormControlStatus } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { FORM_FIELD_ERROR_KEY } from './entry-validation';\n\n/**\n * A directive that displays configured validation messages or server side validations for given form control.\n * The messages are separated with coma(,) and displayed as _innerHTML_ value of host component.\n *\n * @example\n * ```html\n * <div entryDisplayControlValidation [control]=\"myForm.controls.firstName\">\n * </div\n * ```\n */\n@Directive({\n selector: '[entryDisplayControlValidation]'\n})\nexport class EntryDisplayControlValidationDirective implements OnInit, OnDestroy {\n /** Form control for which the validation messages are displayed for. */\n @Input() control: AbstractControl;\n\n private _controlSubscription: Subscription | undefined;\n\n constructor(\n @Inject(ENTRY_VALIDATION_CONFIG) private readonly _config: EntryValidationConfig,\n private readonly _element: ElementRef) {}\n\n ngOnInit(): void {\n this._controlSubscription = this.control.statusChanges\n .subscribe((controlStatus: FormControlStatus) => {\n if (controlStatus === 'INVALID') {\n this._element.nativeElement.innerText = this.extractValidationMessages();\n }\n });\n }\n\n ngOnDestroy(): void {\n if (this._controlSubscription) {\n this._controlSubscription.unsubscribe();\n }\n }\n\n private extractValidationMessages(): string {\n if (!this.control.errors) {\n return '';\n }\n const errorsString = this._config.validationMessages\n .map(validationMessage => this.control.errors[validationMessage.name]\n ? typeof(validationMessage.message) === 'string'\n ? validationMessage.message : validationMessage.message(this.control)\n : ''\n )\n .filter(message => message !== '')\n .join(', ');\n\n const serverErrors = this.control.errors[FORM_FIELD_ERROR_KEY];\n const serverErrorsString = serverErrors instanceof Array ? serverErrors.join(', ') : '';\n\n return [errorsString, serverErrorsString].filter(x => x !== '').join(', ');\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { EntryFormErrorsComponent } from './entry-form-errors.component';\nimport { MatInputModule } from '@angular/material/input';\nimport { EntryDisplayControlValidationDirective } from './entry-display-control-validation.directive';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\n\n@NgModule({\n declarations: [\n EntryFormErrorsComponent,\n EntryDisplayControlValidationDirective\n ],\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatInputModule\n ],\n exports: [\n EntryFormErrorsComponent,\n EntryDisplayControlValidationDirective\n ]\n})\nexport class EntryValidationModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
export * from '@enigmatry/entry-components/header';
|
|
2
1
|
export * from '@enigmatry/entry-components/dialog';
|
|
3
2
|
export * from '@enigmatry/entry-components/search-filter';
|
|
4
|
-
export * from '@enigmatry/entry-components/toolbar';
|
|
5
3
|
export * from '@enigmatry/entry-components/validation';
|
|
4
|
+
export * from '@enigmatry/entry-components/button';
|
|
5
|
+
export * from '@enigmatry/entry-components/file-input';
|
|
6
|
+
export * from '@enigmatry/entry-components/permissions';
|
|
6
7
|
|
|
7
8
|
/*
|
|
8
9
|
* Public API Surface of entry-components
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enigmatry-entry-components.mjs","sources":["../../../../libs/entry-components/public-api.ts","../../../../libs/entry-components/enigmatry-entry-components.ts"],"sourcesContent":["/*\n * Public API Surface of entry-components\n */\n\nexport * from '@enigmatry/entry-components/
|
|
1
|
+
{"version":3,"file":"enigmatry-entry-components.mjs","sources":["../../../../libs/entry-components/public-api.ts","../../../../libs/entry-components/enigmatry-entry-components.ts"],"sourcesContent":["/*\n * Public API Surface of entry-components\n */\n\nexport * from '@enigmatry/entry-components/dialog';\nexport * from '@enigmatry/entry-components/search-filter';\nexport * from '@enigmatry/entry-components/validation';\nexport * from '@enigmatry/entry-components/button';\nexport * from '@enigmatry/entry-components/file-input';\nexport * from '@enigmatry/entry-components/permissions';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;AAAA;;AAEG;;ACFH;;AAEG"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Entry File Input
|
|
2
|
+
|
|
3
|
+
`EntryFileInputComponent` is an Angular component that provides a custom file input button with additional functionality
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
Import the [EntryFileInputModule] in your NgModule:
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
import { EntryFileInputModule } from '@enigmatry/entry-components/file-input';
|
|
11
|
+
@NgModule({
|
|
12
|
+
imports: [
|
|
13
|
+
EntryFileInputModule,
|
|
14
|
+
...
|
|
15
|
+
],
|
|
16
|
+
...
|
|
17
|
+
})
|
|
18
|
+
export class MyModule {}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Usage
|
|
22
|
+
|
|
23
|
+
Use the entry-file-input component in your template:
|
|
24
|
+
|
|
25
|
+
```html
|
|
26
|
+
<entry-file-input
|
|
27
|
+
[label]="'Choose a file...'"
|
|
28
|
+
[matIcon]="'attachment'"
|
|
29
|
+
[accept]="'image/*'"
|
|
30
|
+
[multiple]="false"
|
|
31
|
+
[disabled]="false"
|
|
32
|
+
[(ngModel)]="files"
|
|
33
|
+
(selectedFile)="selectEvent($event)">
|
|
34
|
+
</entry-file-input>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
export class Sample {
|
|
39
|
+
|
|
40
|
+
files: File | FileList;
|
|
41
|
+
|
|
42
|
+
selectEvent(files: FileList | File): void {
|
|
43
|
+
if (files instanceof FileList) {
|
|
44
|
+
...
|
|
45
|
+
} else {
|
|
46
|
+
...
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## API Summary
|
|
53
|
+
|
|
54
|
+
#### Inputs
|
|
55
|
+
- matIcon: string
|
|
56
|
+
- MatIcon for the select file button. Defaults to 'insert_drive_file' (optional).
|
|
57
|
+
- multiple: boolean
|
|
58
|
+
- Sets if multiple files can be selected at once in.
|
|
59
|
+
- accept: string
|
|
60
|
+
- Sets files accepted when opening the file browser dialog. Same as "accept" attribute in `<input/>` element.
|
|
61
|
+
- disabled: boolean
|
|
62
|
+
- Disables input and clears selected files.
|
|
63
|
+
|
|
64
|
+
#### Events
|
|
65
|
+
|
|
66
|
+
- selectedFile: function($event)
|
|
67
|
+
- Emits a [File or FileList] object.
|
|
68
|
+
|
|
69
|
+
#### Styling
|
|
70
|
+
|
|
71
|
+
Button type and color can be styled by providing entry-button configuration.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { BooleanInput } from '@angular/cdk/coercion';
|
|
2
|
+
import { ElementRef, EventEmitter, NgZone, OnDestroy, OnInit, Renderer2 } from '@angular/core';
|
|
3
|
+
import { AbstractControl, ControlValueAccessor, ValidationErrors, Validator } from '@angular/forms';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export declare class EntryFileInputComponent implements OnInit, OnDestroy, ControlValueAccessor, Validator {
|
|
6
|
+
private readonly _ngZone;
|
|
7
|
+
private readonly _renderer;
|
|
8
|
+
/**
|
|
9
|
+
* Label for the select file button. Defaults to 'Choose file...'
|
|
10
|
+
*/
|
|
11
|
+
label: string;
|
|
12
|
+
/**
|
|
13
|
+
* MatIcon for the select file button. Defaults to 'insert_drive_file' (optional)
|
|
14
|
+
*/
|
|
15
|
+
matIcon?: string;
|
|
16
|
+
/**
|
|
17
|
+
* Same as 'accept' attribute in <input/> element.
|
|
18
|
+
*/
|
|
19
|
+
accept?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Same as 'multiple' attribute in <input/> element.
|
|
22
|
+
*/
|
|
23
|
+
set multiple(multiple: BooleanInput);
|
|
24
|
+
get multiple(): boolean;
|
|
25
|
+
private _multiple;
|
|
26
|
+
/**
|
|
27
|
+
* Same as 'disabled' attribute in <input/> element.
|
|
28
|
+
*/
|
|
29
|
+
set disabled(disabled: BooleanInput);
|
|
30
|
+
get disabled(): boolean;
|
|
31
|
+
private _disabled;
|
|
32
|
+
/**
|
|
33
|
+
* Same as 'readonly' attribute in <input/> element.
|
|
34
|
+
*/
|
|
35
|
+
set readonly(readonly: BooleanInput);
|
|
36
|
+
get readonly(): boolean;
|
|
37
|
+
private _readonly;
|
|
38
|
+
/**
|
|
39
|
+
* Size limit per file in KB (kilobytes)
|
|
40
|
+
*/
|
|
41
|
+
maxFileSizeInKb?: number;
|
|
42
|
+
/**
|
|
43
|
+
* Number of files allowed when multiple=true
|
|
44
|
+
*/
|
|
45
|
+
maxFileCount?: number;
|
|
46
|
+
/**
|
|
47
|
+
* Current selected [File | FileList] object.
|
|
48
|
+
*/
|
|
49
|
+
value: File | FileList | undefined;
|
|
50
|
+
/**
|
|
51
|
+
* Event emitted when a file is selected. Emits a [File | FileList] object.
|
|
52
|
+
*/
|
|
53
|
+
selectedFile: EventEmitter<File | FileList>;
|
|
54
|
+
_fileButton: ElementRef<HTMLElement>;
|
|
55
|
+
_fileInput: ElementRef<HTMLInputElement>;
|
|
56
|
+
private _destroy$;
|
|
57
|
+
constructor(_ngZone: NgZone, _renderer: Renderer2);
|
|
58
|
+
get fileNames(): string;
|
|
59
|
+
ngOnInit(): void;
|
|
60
|
+
ngOnDestroy(): void;
|
|
61
|
+
onFileSelect(event: Event): void;
|
|
62
|
+
clear(): void;
|
|
63
|
+
onChange: (_: any) => void;
|
|
64
|
+
onTouched: () => void;
|
|
65
|
+
writeValue(value: any): void;
|
|
66
|
+
registerOnChange(fn: any): void;
|
|
67
|
+
registerOnTouched(fn: any): void;
|
|
68
|
+
setDisabledState?(isDisabled: boolean): void;
|
|
69
|
+
validate(control: AbstractControl<File | FileList | undefined>): ValidationErrors;
|
|
70
|
+
private isFileCountLimitExceeded;
|
|
71
|
+
private isFileSizeLimitExceeded;
|
|
72
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<EntryFileInputComponent, never>;
|
|
73
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<EntryFileInputComponent, "entry-file-input", never, { "label": "label"; "matIcon": "matIcon"; "accept": "accept"; "multiple": "multiple"; "disabled": "disabled"; "readonly": "readonly"; "maxFileSizeInKb": "maxFileSizeInKb"; "maxFileCount": "maxFileCount"; }, { "selectedFile": "selectedFile"; }, never, never, false, never>;
|
|
74
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import * as i1 from "./entry-file-input.component";
|
|
3
|
+
import * as i2 from "@angular/common";
|
|
4
|
+
import * as i3 from "@angular/forms";
|
|
5
|
+
import * as i4 from "@angular/material/icon";
|
|
6
|
+
import * as i5 from "@angular/material/button";
|
|
7
|
+
import * as i6 from "@enigmatry/entry-components/button";
|
|
8
|
+
export declare class EntryFileInputModule {
|
|
9
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<EntryFileInputModule, never>;
|
|
10
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<EntryFileInputModule, [typeof i1.EntryFileInputComponent], [typeof i2.CommonModule, typeof i3.FormsModule, typeof i4.MatIconModule, typeof i5.MatButtonModule, typeof i6.EntryButtonModule], [typeof i1.EntryFileInputComponent]>;
|
|
11
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<EntryFileInputModule>;
|
|
12
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@enigmatry/entry-components",
|
|
3
|
-
"version": "1.15.1-preview.
|
|
3
|
+
"version": "1.15.1-preview.31",
|
|
4
4
|
"author": "Enigmatry",
|
|
5
5
|
"description": "Enigmatry entry angular material components",
|
|
6
6
|
"homepage": "https://github.com/enigmatry/entry-angular-building-blocks/tree/master/libs/entry-components#readme",
|
|
@@ -42,6 +42,14 @@
|
|
|
42
42
|
"node": "./fesm2015/enigmatry-entry-components.mjs",
|
|
43
43
|
"default": "./fesm2020/enigmatry-entry-components.mjs"
|
|
44
44
|
},
|
|
45
|
+
"./button": {
|
|
46
|
+
"types": "./button/index.d.ts",
|
|
47
|
+
"esm2020": "./esm2020/button/enigmatry-entry-components-button.mjs",
|
|
48
|
+
"es2020": "./fesm2020/enigmatry-entry-components-button.mjs",
|
|
49
|
+
"es2015": "./fesm2015/enigmatry-entry-components-button.mjs",
|
|
50
|
+
"node": "./fesm2015/enigmatry-entry-components-button.mjs",
|
|
51
|
+
"default": "./fesm2020/enigmatry-entry-components-button.mjs"
|
|
52
|
+
},
|
|
45
53
|
"./dialog": {
|
|
46
54
|
"types": "./dialog/index.d.ts",
|
|
47
55
|
"esm2020": "./esm2020/dialog/enigmatry-entry-components-dialog.mjs",
|
|
@@ -50,13 +58,21 @@
|
|
|
50
58
|
"node": "./fesm2015/enigmatry-entry-components-dialog.mjs",
|
|
51
59
|
"default": "./fesm2020/enigmatry-entry-components-dialog.mjs"
|
|
52
60
|
},
|
|
53
|
-
"./
|
|
54
|
-
"types": "./
|
|
55
|
-
"esm2020": "./esm2020/
|
|
56
|
-
"es2020": "./fesm2020/enigmatry-entry-components-
|
|
57
|
-
"es2015": "./fesm2015/enigmatry-entry-components-
|
|
58
|
-
"node": "./fesm2015/enigmatry-entry-components-
|
|
59
|
-
"default": "./fesm2020/enigmatry-entry-components-
|
|
61
|
+
"./file-input": {
|
|
62
|
+
"types": "./file-input/index.d.ts",
|
|
63
|
+
"esm2020": "./esm2020/file-input/enigmatry-entry-components-file-input.mjs",
|
|
64
|
+
"es2020": "./fesm2020/enigmatry-entry-components-file-input.mjs",
|
|
65
|
+
"es2015": "./fesm2015/enigmatry-entry-components-file-input.mjs",
|
|
66
|
+
"node": "./fesm2015/enigmatry-entry-components-file-input.mjs",
|
|
67
|
+
"default": "./fesm2020/enigmatry-entry-components-file-input.mjs"
|
|
68
|
+
},
|
|
69
|
+
"./permissions": {
|
|
70
|
+
"types": "./permissions/index.d.ts",
|
|
71
|
+
"esm2020": "./esm2020/permissions/enigmatry-entry-components-permissions.mjs",
|
|
72
|
+
"es2020": "./fesm2020/enigmatry-entry-components-permissions.mjs",
|
|
73
|
+
"es2015": "./fesm2015/enigmatry-entry-components-permissions.mjs",
|
|
74
|
+
"node": "./fesm2015/enigmatry-entry-components-permissions.mjs",
|
|
75
|
+
"default": "./fesm2020/enigmatry-entry-components-permissions.mjs"
|
|
60
76
|
},
|
|
61
77
|
"./search-filter": {
|
|
62
78
|
"types": "./search-filter/index.d.ts",
|
|
@@ -66,14 +82,6 @@
|
|
|
66
82
|
"node": "./fesm2015/enigmatry-entry-components-search-filter.mjs",
|
|
67
83
|
"default": "./fesm2020/enigmatry-entry-components-search-filter.mjs"
|
|
68
84
|
},
|
|
69
|
-
"./toolbar": {
|
|
70
|
-
"types": "./toolbar/index.d.ts",
|
|
71
|
-
"esm2020": "./esm2020/toolbar/enigmatry-entry-components-toolbar.mjs",
|
|
72
|
-
"es2020": "./fesm2020/enigmatry-entry-components-toolbar.mjs",
|
|
73
|
-
"es2015": "./fesm2015/enigmatry-entry-components-toolbar.mjs",
|
|
74
|
-
"node": "./fesm2015/enigmatry-entry-components-toolbar.mjs",
|
|
75
|
-
"default": "./fesm2020/enigmatry-entry-components-toolbar.mjs"
|
|
76
|
-
},
|
|
77
85
|
"./validation": {
|
|
78
86
|
"types": "./validation/index.d.ts",
|
|
79
87
|
"esm2020": "./esm2020/validation/enigmatry-entry-components-validation.mjs",
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Entry Permissions
|
|
2
|
+
|
|
3
|
+
Reusable angular components for applying permission-based authorization:
|
|
4
|
+
- Route guard
|
|
5
|
+
- View directives
|
|
6
|
+
- Pipe
|
|
7
|
+
|
|
8
|
+
## Integration
|
|
9
|
+
|
|
10
|
+
Permissions is part of the `@enigmatry/entry-components`:
|
|
11
|
+
|
|
12
|
+
```npm
|
|
13
|
+
npm i @enigmatry/entry-components
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Create a permission service that implements EntryPermissionService<T> where T is the permission type that you use in your application. You need to provide implementation of the hasPermissions method (for example by checking if the logged in user has needed permissions).
|
|
17
|
+
|
|
18
|
+
```ts
|
|
19
|
+
export class PermissionService implements EntryPermissionService<PermissionId> {
|
|
20
|
+
hasPermissions(permissions: PermissionId[]): boolean {
|
|
21
|
+
// TODO: provide implementation
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Import permissions module:
|
|
27
|
+
|
|
28
|
+
```ts
|
|
29
|
+
import { EntryPermissionModule } from '@enigmatry/entry-components/permissions';
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Provide implementation of the EntryPermissionService:
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
providers: [
|
|
36
|
+
{
|
|
37
|
+
provide: EntryPermissionService,
|
|
38
|
+
useClass: PermissionService
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
<!-- `PermissionService` should be provided in the root scope. -- TODO: add more details with example from the blueprint app -->
|
|
44
|
+
|
|
45
|
+
## Basic usage
|
|
46
|
+
|
|
47
|
+
### Route guard
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
canActivate: [entryPermissionGuard],
|
|
51
|
+
data: {
|
|
52
|
+
permissions: {
|
|
53
|
+
only: [PermissionId.UsersRead]
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### View directives
|
|
59
|
+
|
|
60
|
+
```html
|
|
61
|
+
<button mat-menu-item *entryPermissionsOnly="[PermissionId.UsersRead]" routerLink="users">Users</button>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Pipe
|
|
65
|
+
|
|
66
|
+
```ts
|
|
67
|
+
[isEnabled]="[PermissionId.UsersWrite] | entryHasPermissions"
|
|
68
|
+
```
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { PermissionType } from './permission-type';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/common";
|
|
4
|
+
export declare class EntryPermissionDirective<T extends PermissionType> {
|
|
5
|
+
private ngIfDirective;
|
|
6
|
+
private permissionService;
|
|
7
|
+
set only(permissions: T[]);
|
|
8
|
+
set except(permissions: T[]);
|
|
9
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<EntryPermissionDirective<any>, never>;
|
|
10
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<EntryPermissionDirective<any>, "[entryPermissionsOnly],[entryPermissionsExcept]", never, { "only": "entryPermissionsOnly"; "except": "entryPermissionsExcept"; }, {}, never, never, false, [{ directive: typeof i1.NgIf; inputs: {}; outputs: {}; }]>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import * as i1 from "./permission.directive";
|
|
3
|
+
import * as i2 from "./permission.pipe";
|
|
4
|
+
import * as i3 from "@angular/common";
|
|
5
|
+
export declare class EntryPermissionModule {
|
|
6
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<EntryPermissionModule, never>;
|
|
7
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<EntryPermissionModule, [typeof i1.EntryPermissionDirective, typeof i2.EntryPermissionPipe], [typeof i3.CommonModule], [typeof i1.EntryPermissionDirective, typeof i2.EntryPermissionPipe]>;
|
|
8
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<EntryPermissionModule>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { PipeTransform } from '@angular/core';
|
|
2
|
+
import { PermissionType } from './permission-type';
|
|
3
|
+
import { EntryPermissionService } from './permission.service';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export declare class EntryPermissionPipe<T extends PermissionType> implements PipeTransform {
|
|
6
|
+
private permissionsService;
|
|
7
|
+
constructor(permissionsService: EntryPermissionService<T>);
|
|
8
|
+
transform(permissions: T[]): boolean;
|
|
9
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<EntryPermissionPipe<any>, never>;
|
|
10
|
+
static ɵpipe: i0.ɵɵPipeDeclaration<EntryPermissionPipe<any>, "entryHasPermissions", false>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { EntryPermissionPipe } from './permission.pipe';
|
|
2
|
+
export { EntryPermissionDirective } from './permission.directive';
|
|
3
|
+
export { entryPermissionGuard } from './permission.guard';
|
|
4
|
+
export { EntryPermissionService } from './permission.service';
|
|
5
|
+
export { EntryPermissionModule } from './permission.module';
|
package/public-api.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
export * from '@enigmatry/entry-components/header';
|
|
2
1
|
export * from '@enigmatry/entry-components/dialog';
|
|
3
2
|
export * from '@enigmatry/entry-components/search-filter';
|
|
4
|
-
export * from '@enigmatry/entry-components/toolbar';
|
|
5
3
|
export * from '@enigmatry/entry-components/validation';
|
|
4
|
+
export * from '@enigmatry/entry-components/button';
|
|
5
|
+
export * from '@enigmatry/entry-components/file-input';
|
|
6
|
+
export * from '@enigmatry/entry-components/permissions';
|
|
@@ -5,9 +5,11 @@ import * as i3 from "@angular/common";
|
|
|
5
5
|
import * as i4 from "@angular/forms";
|
|
6
6
|
import * as i5 from "@angular/material/input";
|
|
7
7
|
import * as i6 from "@angular/material/button";
|
|
8
|
-
import * as i7 from "@
|
|
8
|
+
import * as i7 from "@enigmatry/entry-components/button";
|
|
9
|
+
import * as i8 from "@angular/material/select";
|
|
10
|
+
import * as i9 from "@angular/material/tooltip";
|
|
9
11
|
export declare class EntrySearchFilterModule {
|
|
10
12
|
static ɵfac: i0.ɵɵFactoryDeclaration<EntrySearchFilterModule, never>;
|
|
11
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<EntrySearchFilterModule, [typeof i1.EntrySearchFilterComponent, typeof i2.EntrySearchFilterInputComponent], [typeof i3.CommonModule, typeof i4.FormsModule, typeof i4.ReactiveFormsModule, typeof i5.MatInputModule, typeof i6.MatButtonModule, typeof i7.MatSelectModule], [typeof i1.EntrySearchFilterComponent]>;
|
|
13
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<EntrySearchFilterModule, [typeof i1.EntrySearchFilterComponent, typeof i2.EntrySearchFilterInputComponent], [typeof i3.CommonModule, typeof i4.FormsModule, typeof i4.ReactiveFormsModule, typeof i5.MatInputModule, typeof i6.MatButtonModule, typeof i7.EntryButtonModule, typeof i8.MatSelectModule, typeof i9.MatTooltipModule], [typeof i1.EntrySearchFilterComponent]>;
|
|
12
14
|
static ɵinj: i0.ɵɵInjectorDeclaration<EntrySearchFilterModule>;
|
|
13
15
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { UntypedFormGroup } from '@angular/forms';
|
|
2
|
-
import { ControlType } from './control-type.model';
|
|
3
2
|
import { EntrySearchFilterConfig } from '../search-filter-config.model';
|
|
4
3
|
import { SearchFilterBase } from './search-filter-base.model';
|
|
4
|
+
import { SelectSearchFilter } from './inputs/select-search-filter.model';
|
|
5
|
+
import { TextSearchFilter } from './inputs/text-search-filter.model';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
6
7
|
export declare class EntrySearchFilterInputComponent<T> {
|
|
7
8
|
config: EntrySearchFilterConfig;
|
|
@@ -9,8 +10,9 @@ export declare class EntrySearchFilterInputComponent<T> {
|
|
|
9
10
|
searchFilter: SearchFilterBase<T>;
|
|
10
11
|
/** Form group to which the search-filter input component will be added. */
|
|
11
12
|
form: UntypedFormGroup;
|
|
12
|
-
controlType: typeof ControlType;
|
|
13
13
|
constructor(config: EntrySearchFilterConfig);
|
|
14
|
+
get textSearchFilter(): TextSearchFilter | undefined;
|
|
15
|
+
get selectSearchFilter(): SelectSearchFilter<T> | undefined;
|
|
14
16
|
static ɵfac: i0.ɵɵFactoryDeclaration<EntrySearchFilterInputComponent<any>, never>;
|
|
15
17
|
static ɵcmp: i0.ɵɵComponentDeclaration<EntrySearchFilterInputComponent<any>, "entry-search-filter-input", never, { "searchFilter": "searchFilter"; "form": "form"; }, {}, never, never, false, never>;
|
|
16
18
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
@use 'modules/components/dialogs/generator' as dialog;
|
|
2
|
+
@use 'modules/components/forms/generator' as forms;
|
|
3
|
+
@use 'modules/components/search-filter/generator' as search-filter;
|
|
4
|
+
@use 'modules/components/tables/generator' as table;
|
|
5
|
+
@use 'modules/components/buttons/generator' as buttons;
|
|
6
|
+
@use 'modules/default-theme' as default;
|
|
7
|
+
@use 'modules/vendors/angular-material/generator' as material-theme;
|
|
8
|
+
@use 'sass:map';
|
|
9
|
+
@use 'partials/theming';
|
|
10
|
+
|
|
11
|
+
@mixin generate-from($custom-theme: ()) {
|
|
12
|
+
$merged-theme: map.deep-merge(default.$theme, $custom-theme);
|
|
13
|
+
|
|
14
|
+
@include material-theme.generate-from($merged-theme);
|
|
15
|
+
@include buttons.generate-from($merged-theme);
|
|
16
|
+
@include table.generate-from($merged-theme);
|
|
17
|
+
@include forms.generate-from($merged-theme);
|
|
18
|
+
@include search-filter.generate-from($merged-theme);
|
|
19
|
+
@include dialog.generate-from($merged-theme);
|
|
20
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
$theme: (
|
|
2
|
+
general: (
|
|
3
|
+
density: 0,
|
|
4
|
+
colors: (
|
|
5
|
+
primary-theme: null,
|
|
6
|
+
accent-theme: null,
|
|
7
|
+
primary: #2581C4,
|
|
8
|
+
accent: #EA518D,
|
|
9
|
+
font: #323232,
|
|
10
|
+
disabled: (
|
|
11
|
+
foreground: rgb(0 0 0 / .38),
|
|
12
|
+
background: rgb(0 0 0 / .12)
|
|
13
|
+
)
|
|
14
|
+
),
|
|
15
|
+
typography: null,
|
|
16
|
+
fonts: (
|
|
17
|
+
hero-titles: (
|
|
18
|
+
family: '',
|
|
19
|
+
size: 0
|
|
20
|
+
),
|
|
21
|
+
titles: (
|
|
22
|
+
family: '',
|
|
23
|
+
size: 0
|
|
24
|
+
),
|
|
25
|
+
body: (
|
|
26
|
+
family: '',
|
|
27
|
+
size: 0
|
|
28
|
+
),
|
|
29
|
+
buttons: (
|
|
30
|
+
family: '',
|
|
31
|
+
size: 0
|
|
32
|
+
)
|
|
33
|
+
),
|
|
34
|
+
spacing: (
|
|
35
|
+
default: 15px
|
|
36
|
+
),
|
|
37
|
+
buttons: (
|
|
38
|
+
icon-size: 48px
|
|
39
|
+
)
|
|
40
|
+
),
|
|
41
|
+
tables: (
|
|
42
|
+
cells: (
|
|
43
|
+
edge-gap: 4px
|
|
44
|
+
),
|
|
45
|
+
rows: (
|
|
46
|
+
selected-color: #FFF,
|
|
47
|
+
disabled-color: #F5F5F5,
|
|
48
|
+
odd-even-row: odd,
|
|
49
|
+
odd-even-background: #F0F0F0
|
|
50
|
+
),
|
|
51
|
+
contents: (
|
|
52
|
+
no-result: (
|
|
53
|
+
font-size: 13px,
|
|
54
|
+
font-weight: 500
|
|
55
|
+
)
|
|
56
|
+
)
|
|
57
|
+
),
|
|
58
|
+
dialogs: (
|
|
59
|
+
title: (
|
|
60
|
+
size: 20px
|
|
61
|
+
)
|
|
62
|
+
)
|
|
63
|
+
);
|