@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.
Files changed (187) hide show
  1. package/README.md +2 -1
  2. package/assets/fonts/Montserrat/Montserrat-bold.eot +0 -0
  3. package/assets/fonts/Montserrat/Montserrat-bold.ttf +0 -0
  4. package/assets/fonts/Montserrat/Montserrat-bold.woff +0 -0
  5. package/assets/fonts/Montserrat/Montserrat-bold.woff2 +0 -0
  6. package/assets/fonts/OpenSans/OpenSans-bold.eot +0 -0
  7. package/assets/fonts/OpenSans/OpenSans-bold.ttf +0 -0
  8. package/assets/fonts/OpenSans/OpenSans-bold.woff +0 -0
  9. package/assets/fonts/OpenSans/OpenSans-bold.woff2 +0 -0
  10. package/assets/fonts/OpenSans/OpenSans-normal.eot +0 -0
  11. package/assets/fonts/OpenSans/OpenSans-normal.ttf +0 -0
  12. package/assets/fonts/OpenSans/OpenSans-normal.woff +0 -0
  13. package/assets/fonts/OpenSans/OpenSans-normal.woff2 +0 -0
  14. package/assets/fonts/Roboto/Roboto-bold.woff2 +0 -0
  15. package/assets/fonts/Roboto/Roboto-normal.woff2 +0 -0
  16. package/button/README.md +47 -0
  17. package/button/entry-button-config.d.ts +26 -0
  18. package/button/entry-button.directive.d.ts +18 -0
  19. package/button/entry-button.module.d.ts +9 -0
  20. package/{header → button}/index.d.ts +1 -1
  21. package/button/public-api.d.ts +3 -0
  22. package/dialog/README.md +2 -2
  23. package/dialog/entry-dialog-buttons-alignment.type.d.ts +1 -1
  24. package/dialog/entry-dialog-config.model.d.ts +1 -1
  25. package/dialog/entry-dialog.module.d.ts +4 -1
  26. package/esm2020/{header/enigmatry-entry-components-header.mjs → button/enigmatry-entry-components-button.mjs} +1 -1
  27. package/esm2020/button/entry-button-config.mjs +22 -0
  28. package/esm2020/button/entry-button.directive.mjs +56 -0
  29. package/esm2020/button/entry-button.module.mjs +28 -0
  30. package/esm2020/button/public-api.mjs +4 -0
  31. package/esm2020/dialog/dialogs/entry-dialog.component.mjs +8 -5
  32. package/esm2020/dialog/entry-dialog-buttons-alignment.type.mjs +1 -1
  33. package/esm2020/dialog/entry-dialog-config.model.mjs +3 -3
  34. package/esm2020/dialog/entry-dialog.module.mjs +16 -4
  35. package/esm2020/file-input/enigmatry-entry-components-file-input.mjs +5 -0
  36. package/esm2020/file-input/entry-file-input.component.mjs +197 -0
  37. package/esm2020/file-input/entry-file-input.module.mjs +40 -0
  38. package/esm2020/file-input/public-api.mjs +3 -0
  39. package/esm2020/permissions/enigmatry-entry-components-permissions.mjs +5 -0
  40. package/esm2020/permissions/permission-type.mjs +2 -0
  41. package/esm2020/permissions/permission.directive.mjs +35 -0
  42. package/esm2020/permissions/permission.guard.mjs +14 -0
  43. package/esm2020/permissions/permission.module.mjs +29 -0
  44. package/esm2020/permissions/permission.pipe.mjs +20 -0
  45. package/esm2020/permissions/permission.service.mjs +3 -0
  46. package/esm2020/permissions/public-api.mjs +6 -0
  47. package/esm2020/public-api.mjs +4 -3
  48. package/esm2020/search-filter/entry-search-filter.component.mjs +8 -6
  49. package/esm2020/search-filter/entry-search-filter.module.mjs +12 -4
  50. package/esm2020/search-filter/search-filter-input/search-filter-input.component.mjs +9 -4
  51. package/esm2020/validation/entry-form-errors.component.mjs +7 -3
  52. package/fesm2015/enigmatry-entry-components-button.mjs +110 -0
  53. package/fesm2015/enigmatry-entry-components-button.mjs.map +1 -0
  54. package/fesm2015/enigmatry-entry-components-dialog.mjs +22 -7
  55. package/fesm2015/enigmatry-entry-components-dialog.mjs.map +1 -1
  56. package/fesm2015/enigmatry-entry-components-file-input.mjs +237 -0
  57. package/fesm2015/enigmatry-entry-components-file-input.mjs.map +1 -0
  58. package/fesm2015/enigmatry-entry-components-permissions.mjs +98 -0
  59. package/fesm2015/enigmatry-entry-components-permissions.mjs.map +1 -0
  60. package/fesm2015/enigmatry-entry-components-search-filter.mjs +24 -9
  61. package/fesm2015/enigmatry-entry-components-search-filter.mjs.map +1 -1
  62. package/fesm2015/enigmatry-entry-components-validation.mjs +6 -2
  63. package/fesm2015/enigmatry-entry-components-validation.mjs.map +1 -1
  64. package/fesm2015/enigmatry-entry-components.mjs +3 -2
  65. package/fesm2015/enigmatry-entry-components.mjs.map +1 -1
  66. package/fesm2020/enigmatry-entry-components-button.mjs +107 -0
  67. package/fesm2020/enigmatry-entry-components-button.mjs.map +1 -0
  68. package/fesm2020/enigmatry-entry-components-dialog.mjs +22 -7
  69. package/fesm2020/enigmatry-entry-components-dialog.mjs.map +1 -1
  70. package/fesm2020/enigmatry-entry-components-file-input.mjs +240 -0
  71. package/fesm2020/enigmatry-entry-components-file-input.mjs.map +1 -0
  72. package/fesm2020/enigmatry-entry-components-permissions.mjs +97 -0
  73. package/fesm2020/enigmatry-entry-components-permissions.mjs.map +1 -0
  74. package/fesm2020/enigmatry-entry-components-search-filter.mjs +24 -9
  75. package/fesm2020/enigmatry-entry-components-search-filter.mjs.map +1 -1
  76. package/fesm2020/enigmatry-entry-components-validation.mjs +6 -2
  77. package/fesm2020/enigmatry-entry-components-validation.mjs.map +1 -1
  78. package/fesm2020/enigmatry-entry-components.mjs +3 -2
  79. package/fesm2020/enigmatry-entry-components.mjs.map +1 -1
  80. package/file-input/README.md +71 -0
  81. package/file-input/entry-file-input.component.d.ts +74 -0
  82. package/file-input/entry-file-input.module.d.ts +12 -0
  83. package/{toolbar → file-input}/index.d.ts +1 -1
  84. package/file-input/public-api.d.ts +2 -0
  85. package/package.json +24 -16
  86. package/permissions/README.md +68 -0
  87. package/permissions/index.d.ts +5 -0
  88. package/permissions/permission-type.d.ts +3 -0
  89. package/permissions/permission.directive.d.ts +11 -0
  90. package/permissions/permission.guard.d.ts +2 -0
  91. package/permissions/permission.module.d.ts +9 -0
  92. package/permissions/permission.pipe.d.ts +11 -0
  93. package/permissions/permission.service.d.ts +4 -0
  94. package/permissions/public-api.d.ts +5 -0
  95. package/public-api.d.ts +3 -2
  96. package/search-filter/entry-search-filter.module.d.ts +4 -2
  97. package/search-filter/search-filter-input/search-filter-input.component.d.ts +4 -2
  98. package/styles/_generator.scss +20 -0
  99. package/styles/modules/_default-theme.scss +63 -0
  100. package/styles/modules/components/buttons/_generator.scss +8 -0
  101. package/styles/modules/components/dialogs/_generator.scss +16 -0
  102. package/styles/modules/components/forms/_generator.scss +15 -0
  103. package/styles/modules/components/search-filter/_generator.scss +15 -0
  104. package/styles/modules/components/tables/_cells.scss +19 -0
  105. package/styles/modules/components/tables/_generator.scss +7 -0
  106. package/styles/modules/components/tables/_no-result.scss +10 -0
  107. package/styles/modules/components/tables/_rows.scss +23 -0
  108. package/styles/modules/components/tables/_sorting.scss +11 -0
  109. package/styles/modules/components/tables/_table-body.scss +11 -0
  110. package/styles/modules/typography/_fonts.scss +46 -68
  111. package/styles/modules/vendors/angular-material/_generator.scss +46 -0
  112. package/styles/modules/vendors/angular-material/_palette-generator.scss +32 -0
  113. package/styles/modules/vendors/angular-material/_typography-generator.scss +101 -0
  114. package/styles/partials/core/components/_index.scss +4 -0
  115. package/styles/partials/core/components/dialogs/_general.scss +23 -0
  116. package/styles/partials/core/components/forms/_general.scss +28 -0
  117. package/styles/partials/core/components/search-filter/_general.scss +9 -0
  118. package/styles/partials/core/components/tables/_general.scss +17 -0
  119. package/styles/partials/generator-test.scss +29 -0
  120. package/styles/partials/theming.scss +1 -0
  121. package/dialog/styles/modules/_generator.scss +0 -11
  122. package/dialog/styles/modules/components/dialogs/_general.scss +0 -11
  123. package/dialog/styles/modules/components/dialogs/footers/_general.scss +0 -26
  124. package/dialog/styles/modules/components/dialogs/headers/_general.scss +0 -16
  125. package/dialog/styles/modules/theming/_default-theming.scss +0 -29
  126. package/dialog/styles/partials/core/_index.scss +0 -3
  127. package/dialog/styles/partials/core/components/_index.scss +0 -1
  128. package/dialog/styles/partials/core/components/dialogs/_general.scss +0 -78
  129. package/dialog/styles/partials/core/components/dialogs/_index.scss +0 -1
  130. package/dialog/styles/partials/core/elements/_general.scss +0 -10
  131. package/dialog/styles/partials/core/elements/_index.scss +0 -1
  132. package/dialog/styles/partials/core/layouts/_alignments.scss +0 -13
  133. package/dialog/styles/partials/core/layouts/_index.scss +0 -1
  134. package/dialog/styles/partials/main.scss +0 -1
  135. package/esm2020/header/entry-header.component.mjs +0 -13
  136. package/esm2020/header/entry-header.module.mjs +0 -24
  137. package/esm2020/header/public-api.mjs +0 -3
  138. package/esm2020/toolbar/enigmatry-entry-components-toolbar.mjs +0 -5
  139. package/esm2020/toolbar/entry-toolbar.component.mjs +0 -43
  140. package/esm2020/toolbar/entry-toolbar.module.mjs +0 -24
  141. package/esm2020/toolbar/public-api.mjs +0 -3
  142. package/fesm2015/enigmatry-entry-components-header.mjs +0 -41
  143. package/fesm2015/enigmatry-entry-components-header.mjs.map +0 -1
  144. package/fesm2015/enigmatry-entry-components-toolbar.mjs +0 -71
  145. package/fesm2015/enigmatry-entry-components-toolbar.mjs.map +0 -1
  146. package/fesm2020/enigmatry-entry-components-header.mjs +0 -41
  147. package/fesm2020/enigmatry-entry-components-header.mjs.map +0 -1
  148. package/fesm2020/enigmatry-entry-components-toolbar.mjs +0 -71
  149. package/fesm2020/enigmatry-entry-components-toolbar.mjs.map +0 -1
  150. package/header/README.md +0 -41
  151. package/header/entry-header.component.d.ts +0 -6
  152. package/header/entry-header.module.d.ts +0 -8
  153. package/header/public-api.d.ts +0 -2
  154. package/header/styles/modules/_generator.scss +0 -13
  155. package/header/styles/modules/components/buttons/_general.scss +0 -26
  156. package/header/styles/modules/components/headers/_general.scss +0 -13
  157. package/header/styles/modules/theming/_default-theming.scss +0 -21
  158. package/header/styles/partials/core/_index.scss +0 -3
  159. package/header/styles/partials/core/components/_index.scss +0 -2
  160. package/header/styles/partials/core/components/buttons/_general.scss +0 -42
  161. package/header/styles/partials/core/components/buttons/_index.scss +0 -1
  162. package/header/styles/partials/core/components/headers/_general.scss +0 -9
  163. package/header/styles/partials/core/components/headers/_index.scss +0 -1
  164. package/header/styles/partials/core/elements/_index.scss +0 -1
  165. package/header/styles/partials/core/elements/headings.scss +0 -3
  166. package/header/styles/partials/core/layouts/_alignment.scss +0 -6
  167. package/header/styles/partials/core/layouts/_index.scss +0 -1
  168. package/header/styles/partials/main.scss +0 -1
  169. package/styles/_generate.scss +0 -15
  170. package/styles/modules/_breakpoints.scss +0 -37
  171. package/styles/modules/_generate.scss +0 -5
  172. package/styles/modules/_variables.scss +0 -22
  173. package/styles/modules/states/_hover.scss +0 -27
  174. package/styles/modules/theming/_default-theming.scss +0 -9
  175. package/styles/modules/typography/_generate.scss +0 -7
  176. package/toolbar/README.md +0 -39
  177. package/toolbar/entry-toolbar.component.d.ts +0 -28
  178. package/toolbar/entry-toolbar.module.d.ts +0 -8
  179. package/toolbar/public-api.d.ts +0 -2
  180. package/toolbar/styles/modules/_generate.scss +0 -10
  181. package/toolbar/styles/modules/components/toolbar/_general.scss +0 -34
  182. package/toolbar/styles/modules/theming/_default-theming.scss +0 -8
  183. package/toolbar/styles/partials/core/_index.scss +0 -1
  184. package/toolbar/styles/partials/core/components/_index.scss +0 -1
  185. package/toolbar/styles/partials/core/components/toolbar/_general.scss +0 -100
  186. package/toolbar/styles/partials/core/components/toolbar/_index.scss +0 -1
  187. 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">{{error}}</mat-error>
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">{{error}}</mat-error>
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/header';\nexport * from '@enigmatry/entry-components/dialog';\nexport * from '@enigmatry/entry-components/search-filter';\nexport * from '@enigmatry/entry-components/toolbar';\nexport * from '@enigmatry/entry-components/validation';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;AAAA;;AAEG;;ACFH;;AAEG"}
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
+ }
@@ -1,5 +1,5 @@
1
1
  /**
2
2
  * Generated bundle index. Do not edit.
3
3
  */
4
- /// <amd-module name="@enigmatry/entry-components/toolbar" />
4
+ /// <amd-module name="@enigmatry/entry-components/file-input" />
5
5
  export * from './public-api';
@@ -0,0 +1,2 @@
1
+ export { EntryFileInputModule } from './entry-file-input.module';
2
+ export { EntryFileInputComponent } from './entry-file-input.component';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@enigmatry/entry-components",
3
- "version": "1.15.1-preview.3",
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
- "./header": {
54
- "types": "./header/index.d.ts",
55
- "esm2020": "./esm2020/header/enigmatry-entry-components-header.mjs",
56
- "es2020": "./fesm2020/enigmatry-entry-components-header.mjs",
57
- "es2015": "./fesm2015/enigmatry-entry-components-header.mjs",
58
- "node": "./fesm2015/enigmatry-entry-components-header.mjs",
59
- "default": "./fesm2020/enigmatry-entry-components-header.mjs"
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&lt;T&gt; 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,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@enigmatry/entry-components/permissions" />
5
+ export * from './public-api';
@@ -0,0 +1,3 @@
1
+ export type PermissionType = number | string | {
2
+ id: number | string;
3
+ };
@@ -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,2 @@
1
+ import { CanActivateFn } from '@angular/router';
2
+ export declare const entryPermissionGuard: CanActivateFn;
@@ -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,4 @@
1
+ import { PermissionType } from './permission-type';
2
+ export declare abstract class EntryPermissionService<T extends PermissionType> {
3
+ abstract hasPermissions(permissions: T[]): boolean;
4
+ }
@@ -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 "@angular/material/select";
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
+ );
@@ -0,0 +1,8 @@
1
+ @use 'sass:map';
2
+
3
+ @mixin generate-from($theme) {
4
+ .entry-button.mdc-button:disabled {
5
+ background-color: map.get($theme, 'general', 'colors', 'disabled', 'background');
6
+ color: map.get($theme, 'general', 'colors', 'disabled', 'foreground');
7
+ }
8
+ }