axioma-material 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +63 -0
  2. package/fesm2022/axioma-material.mjs +767 -0
  3. package/fesm2022/axioma-material.mjs.map +1 -0
  4. package/index.d.ts +5 -0
  5. package/lib/confirmation-dialog/confirmation-data.d.ts +13 -0
  6. package/lib/confirmation-dialog/confirmation-dialog.component.d.ts +11 -0
  7. package/lib/confirmation.service.d.ts +8 -0
  8. package/lib/detail-actions/detail-actions.component.d.ts +11 -0
  9. package/lib/email/checkUserExistsFn.d.ts +2 -0
  10. package/lib/email/email.component.d.ts +25 -0
  11. package/lib/grid/grid-config.d.ts +29 -0
  12. package/lib/grid/grid.component.d.ts +54 -0
  13. package/lib/loading.interceptor.d.ts +2 -0
  14. package/lib/snack.service.d.ts +8 -0
  15. package/package.json +25 -0
  16. package/public-api.d.ts +19 -0
  17. package/state/crud/crud.actions.d.ts +64 -0
  18. package/state/crud/crud.effects.d.ts +41 -0
  19. package/state/crud/crud.module.d.ts +7 -0
  20. package/state/crud/crud.reducer.d.ts +36 -0
  21. package/state/crud/crud.selectors.d.ts +21 -0
  22. package/state/grid/grid-setup.d.ts +6 -0
  23. package/state/grid/grid.actions.d.ts +57 -0
  24. package/state/grid/grid.effects.d.ts +44 -0
  25. package/state/grid/grid.module.d.ts +7 -0
  26. package/state/grid/grid.reducer.d.ts +20 -0
  27. package/state/grid/grid.selectors.d.ts +17 -0
  28. package/state/grid/models.d.ts +41 -0
  29. package/state/router/router.actions.d.ts +11 -0
  30. package/state/router/router.effects.d.ts +13 -0
  31. package/state/router/router.module.d.ts +7 -0
  32. package/state/router/router.selectors.d.ts +13 -0
  33. package/state/router/store-route-serializer.d.ts +10 -0
  34. package/state/shared/shared.actions.d.ts +37 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"axioma-material.mjs","sources":["../../../projects/material/src/lib/snack.service.ts","../../../projects/material/src/state/shared/shared.actions.ts","../../../projects/material/src/lib/loading.interceptor.ts","../../../projects/material/src/lib/confirmation-dialog/confirmation-dialog.component.ts","../../../projects/material/src/lib/confirmation-dialog/confirmation-dialog.component.html","../../../projects/material/src/lib/confirmation.service.ts","../../../projects/material/src/lib/detail-actions/detail-actions.component.ts","../../../projects/material/src/lib/detail-actions/detail-actions.component.html","../../../projects/material/src/lib/email/email.component.ts","../../../projects/material/src/lib/email/email.component.html","../../../projects/material/src/state/grid/grid.actions.ts","../../../projects/material/src/state/grid/grid.reducer.ts","../../../projects/material/src/state/grid/models.ts","../../../projects/material/src/state/router/router.selectors.ts","../../../projects/material/src/state/grid/grid.selectors.ts","../../../projects/material/src/lib/grid/grid.component.ts","../../../projects/material/src/lib/grid/grid.component.html","../../../projects/material/src/state/router/router.actions.ts","../../../projects/material/src/state/router/router.effects.ts","../../../projects/material/src/state/router/router.module.ts","../../../projects/material/src/state/grid/grid.effects.ts","../../../projects/material/src/state/grid/grid.module.ts","../../../projects/material/src/state/crud/crud.actions.ts","../../../projects/material/src/state/crud/crud.reducer.ts","../../../projects/material/src/state/crud/crud.selectors.ts","../../../projects/material/src/state/crud/crud.effects.ts","../../../projects/material/src/state/crud/crud.module.ts","../../../projects/material/src/public-api.ts","../../../projects/material/src/axioma-material.ts"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SnackService {\r\n snackBar = inject(MatSnackBar);\r\n info(message: string, action: string = 'Dismiss', duration: number = 3000) {\r\n this.snackBar.open(message, action, { duration });\r\n }\r\n}\r\n","import { createActionGroup, emptyProps, props } from '@ngrx/store';\r\n\r\nexport const SharedActions = createActionGroup({\r\n source: 'Shared',\r\n events: {\r\n 'Back': emptyProps(),\r\n 'Init': emptyProps(),\r\n 'Init Success': props<{build: string}>(),\r\n 'Noop': emptyProps(),\r\n 'Start Request': emptyProps(),\r\n 'End Request': emptyProps(),\r\n 'Transient Error': props<{source: string, error: any}>(),\r\n 'Bad Error': props<{source: string, error: any}>(),\r\n 'Navigate': props<{url: string}>(),\r\n 'Access Denied': emptyProps(),\r\n 'Login': props<{returnUrl: string}>(),\r\n }\r\n});\r\n","import { HttpErrorResponse, HttpInterceptorFn, HttpResponse } from '@angular/common/http';\r\nimport { inject } from '@angular/core';\r\nimport { Store } from '@ngrx/store';\r\nimport { SharedActions } from '../state/shared/shared.actions';\r\nimport { catchError, map } from 'rxjs';\r\n\r\nexport const loadingInterceptor: HttpInterceptorFn = (req, next) => {\r\n let store = inject(Store);\r\n store.dispatch(SharedActions.startRequest())\r\n try {\r\n return next(req)\r\n .pipe(catchError((err) => {\r\n store.dispatch(SharedActions.endRequest());\r\n throw err;\r\n }))\r\n .pipe(map(e => {\r\n if (e instanceof HttpResponse || e instanceof HttpErrorResponse) {\r\n store.dispatch(SharedActions.endRequest());\r\n }\r\n return e;\r\n }));\r\n } catch (err) {\r\n console.log('error', err);\r\n store.dispatch(SharedActions.endRequest());\r\n throw err;\r\n }\r\n};\r\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport {\r\n MatDialogRef,\r\n MAT_DIALOG_DATA,\r\n MatDialogContent,\r\n MatDialogActions,\r\n MatDialogTitle\r\n \r\n} from '@angular/material/dialog';\r\nimport { ButtonData, ConfirmationData } from './confirmation-data';\r\n@Component({\r\n selector: 'x-confirmation-dialog',\r\n imports: [NgTemplateOutlet, MatButtonModule, MatDialogContent, MatDialogActions, MatDialogTitle],\r\n templateUrl: './confirmation-dialog.component.html',\r\n styleUrl: './confirmation-dialog.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ConfirmationDialogComponent {\r\n data: ConfirmationData = inject(MAT_DIALOG_DATA);\r\n dialogRef = inject(MatDialogRef<ConfirmationDialogComponent>);\r\n \r\n constructor() {\r\n this.data.buttons ??= [{\r\n text: 'Yes',\r\n value: true,\r\n default: true,\r\n color: 'primary'\r\n }, {\r\n text: 'No',\r\n value: false,\r\n default: false,\r\n }]\r\n }\r\n clickButton(button: ButtonData) {\r\n this.dialogRef.close(button.value);\r\n }\r\n\r\n \r\n\r\n}\r\n","<h2 mat-dialog-title>{{data.title}}</h2>\r\n<mat-dialog-content cdkTrapFocus class=\"mat-typography\">\r\n @if(data.message){\r\n <p>{{data.message}}</p>\r\n } @else if (data.messageRef) {\r\n <ng-container *ngTemplateOutlet=\"data.messageRef\"></ng-container>\r\n }\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n @for(button of data.buttons; track button){\r\n @if(button.default){\r\n <button mat-button (click)=\"clickButton(button)\" cdkFocusInitial>{{button.text}}</button>\r\n } @else {\r\n <button mat-button (click)=\"clickButton(button)\">{{button.text}}</button>\r\n }\r\n }\r\n</mat-dialog-actions>","import { inject, Injectable } from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { ConfirmationDialogComponent } from './confirmation-dialog/confirmation-dialog.component';\r\nimport { Observable } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ConfirmationService {\r\n private dialog = inject(MatDialog);\r\n\r\n confirm(message: string, title = 'Confirmation'): Observable<boolean> {\r\n let ref = this.dialog.open(ConfirmationDialogComponent, {\r\n data: {\r\n title,\r\n message\r\n }\r\n });\r\n return ref.afterClosed();\r\n }\r\n\r\n \r\n}\r\n","import { booleanAttribute, ChangeDetectionStrategy, Component, EventEmitter, inject, Input, Output } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { Location } from '@angular/common';\r\nimport { take } from 'rxjs';\r\n@Component({\r\n selector: 'x-detail-actions',\r\n imports: [MatToolbarModule, MatIconModule, MatButtonModule],\r\n templateUrl: './detail-actions.component.html',\r\n styleUrl: './detail-actions.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class DetailActionsComponent {\r\n @Input({ transform: booleanAttribute, alias: 'no-routing' }) dontRoute = false;\r\n @Output() cancel = new EventEmitter<void>();\r\n private location = inject(Location);\r\n constructor() {\r\n this.cancel.pipe(take(1)).subscribe(() =>\r\n this.dontRoute || this.location.back()\r\n );\r\n }\r\n}\r\n","<mat-toolbar class=\"flex flex-row gap-2 p-2\">\r\n <button mat-stroked-button type=\"submit\"><mat-icon>save</mat-icon> Save</button>\r\n <button mat-button type=\"button\" (click)=\"cancel.emit()\"><mat-icon>cancel</mat-icon> Cancel</button>\r\n <div class=\"flex-grow\"></div>\r\n <ng-content select=\"[right]\"></ng-content>\r\n</mat-toolbar>","import { toSignal } from '@angular/core/rxjs-interop';\r\nimport {\r\n booleanAttribute, ChangeDetectionStrategy, Component, effect, EventEmitter, forwardRef, inject, Input, input,\r\n Output\r\n} from '@angular/core';\r\nimport {\r\n NG_VALUE_ACCESSOR, NG_VALIDATORS, ControlValueAccessor, Validator, AbstractControl,\r\n ValidationErrors, FormControl, Validators, ReactiveFormsModule\r\n} from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { first, map, of } from 'rxjs';\r\nimport { RouterModule } from '@angular/router';\r\nimport { CheckUserExistsFn } from './checkUserExistsFn';\r\n\r\n@Component({\r\n selector: 'x-email',\r\n imports: [ReactiveFormsModule, MatFormFieldModule, MatInputModule, RouterModule],\r\n templateUrl: './email.component.html',\r\n styleUrl: './email.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '(blur)': 'onTouch($event)'\r\n },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n multi: true,\r\n useExisting: EmailComponent\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => EmailComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class EmailComponent implements ControlValueAccessor, Validator {\r\n @Input({ required: true }) checkUserExistsFn?: CheckUserExistsFn;\r\n @Output() login = new EventEmitter<void>();\r\n @Input() label = 'Email';\r\n @Output() exists = new EventEmitter<boolean>();\r\n $touched = input(false, { transform: booleanAttribute, alias: 'touched' });\r\n $existing = input(<boolean | undefined>false, { transform: booleanAttribute, alias: 'existing' });\r\n control = new FormControl('', [Validators.required, Validators.email]);\r\n onChange = (_: any) => { };\r\n onTouch = (_: any) => { };\r\n onValidationChange = () => { };\r\n writeValue(obj: any): void {\r\n this.control.setValue(obj);\r\n }\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: any): void {\r\n this.onTouch = fn;\r\n }\r\n setDisabledState?(isDisabled: boolean): void {\r\n isDisabled\r\n ? this.control.disable()\r\n : this.control.enable();\r\n }\r\n validate(_: AbstractControl): ValidationErrors | null {\r\n return this.control.errors\r\n }\r\n registerOnValidatorChange?(fn: () => void): void {\r\n this.onValidationChange = fn;\r\n }\r\n constructor() {\r\n\r\n let $valid = toSignal(this.control.statusChanges);\r\n effect(() => {\r\n this.onValidationChange();\r\n });\r\n\r\n let $value = toSignal(this.control.valueChanges);\r\n effect(() => {\r\n this.onChange($value());\r\n });\r\n\r\n this.control.setAsyncValidators(() => {\r\n let existing = this.$existing();\r\n let value = this.control.value;\r\n if (!value || typeof existing === 'undefined') {\r\n return of(null);\r\n }\r\n return this.checkUserExistsFn!(value).pipe(\r\n map(exists =>{\r\n this.exists.emit(exists);\r\n return exists === existing ? null : existing ? { missing: true } : { exists: true };\r\n }),\r\n first()\r\n );\r\n });\r\n\r\n effect(() => {\r\n let touched = this.$touched();\r\n if (touched) {\r\n this.control.markAsTouched();\r\n } else {\r\n this.control.markAsUntouched();\r\n }\r\n })\r\n }\r\n}\r\n","<mat-form-field >\r\n <mat-label>{{label}}</mat-label>\r\n <input matInput type=\"email\" [formControl]=\"control\" required>\r\n <mat-hint><ng-content></ng-content></mat-hint>\r\n @if (control.hasError('required')){\r\n <mat-error>Email is required</mat-error>\r\n } @else if (control.hasError('email')){\r\n <mat-error>Email is invalid</mat-error>\r\n } @else if (control.hasError('exists')){\r\n <mat-error>Email already exists: <a (click)=\"login.emit()\">sign in</a>.</mat-error>\r\n } @else if (control.hasError('missing')){\r\n <mat-error>Email is missing</mat-error>\r\n }\r\n</mat-form-field>","import { createActionGroup, emptyProps, props } from '@ngrx/store';\r\nimport { GenericDataRequest, GroupFilter } from './models';\r\n\r\nexport const GridActions = createActionGroup({\r\n source: 'Grid',\r\n events: {\r\n 'Refresh': emptyProps(),\r\n 'Load': props<{ name: string, request?: GenericDataRequest }>(),\r\n 'Load Success': props<{ name: string, count?: number, data?: any[] }>(),\r\n 'Change Paging': props<{ pageIndex: number, pageSize: number }>(),\r\n 'Change Sort': props<{ sort: string, dir: string }>(),\r\n 'Change Filter': props<{ filter: string }>(),\r\n 'Update Request': props<{ request: GenericDataRequest }>(),\r\n 'Go To': props<{ url: string, filter: GroupFilter }>(),\r\n 'Bulk Delete': props<{ ids: number[] | undefined }>(),\r\n 'Bulk Delete Success': emptyProps(),\r\n }\r\n});\r\n","import { createFeature, createReducer, on } from '@ngrx/store';\r\nimport { GridActions } from './grid.actions';\r\nexport const gridFeatureKey = 'grid';\r\n\r\nexport interface GridMap {\r\n [key: string]: GridData;\r\n}\r\n\r\nexport interface GridData {\r\n count: number | undefined;\r\n data: any[] | undefined;\r\n loading: boolean;\r\n}\r\n\r\nexport interface State {\r\n grids: GridMap;\r\n}\r\n\r\nexport const initialState: State = {\r\n grids: {} as GridMap\r\n};\r\n\r\nexport const reducer = createReducer(\r\n initialState,\r\n on(GridActions.loadSuccess, (state, { name, data, count }) => ({\r\n ...state,\r\n grids: { ...state.grids, [name]: { ...state.grids[name], data, count, loading: false } }\r\n })),\r\n on(GridActions.load, (state, { name }) => ({\r\n ...state,\r\n grids: { ...state.grids, [name]: { ...state.grids[name], \r\n data: undefined,\r\n count: undefined,\r\n loading: true } }\r\n })),\r\n);\r\n\r\nexport const gridFeature = createFeature({\r\n name: gridFeatureKey,\r\n reducer,\r\n});\r\n\r\n","export enum FilterLogic {\r\n Or = 0,\r\n And = 1,\r\n}\r\n\r\nexport interface GroupFilter {\r\n /** Logical composition in the group */\r\n logic?: FilterLogic;\r\n /** Nested groups */\r\n groups?: GroupFilter[] | undefined;\r\n /** Filters */\r\n fields?: FieldFilter[] | undefined;\r\n}\r\n\r\nexport interface GenericDataRequest {\r\n filters?: GroupFilter | undefined;\r\n sortBy?: string | undefined;\r\n sortDir?: SortDir | undefined;\r\n paging?: Paging | undefined;\r\n}\r\n\r\nexport interface FieldFilter {\r\n names?: string[] | undefined;\r\n operator?: FilterOperator | undefined;\r\n values?: string[] | undefined;\r\n}\r\n\r\nexport enum FilterOperator {\r\n Contains = 0,\r\n Equals = 1,\r\n Greater = 2,\r\n Less = 3,\r\n In = 4,\r\n}\r\n\r\nexport enum SortDir {\r\n Asc = 0,\r\n Desc = 1,\r\n}\r\n\r\n/** Paging data */\r\nexport interface Paging {\r\n /** 1-based page number */\r\n page: number;\r\n /** Page size */\r\n pageSize: number;\r\n}\r\n\r\n","import { RouterReducerState } from \"@ngrx/router-store\";\r\nimport { createFeatureSelector, createSelector } from \"@ngrx/store\";\r\nimport { RouterState } from \"./store-route-serializer\";\r\n\r\nexport const selectRouter = createFeatureSelector<RouterReducerState<RouterState>>('router');\r\n\r\nexport const selectRouterState = createSelector(\r\n selectRouter,\r\n state => state?.state\r\n);\r\n\r\nexport const selectRouteParams = createSelector(\r\n selectRouterState,\r\n state => state?.params\r\n);\r\n\r\nexport const selectRouteParam = (name?: string) => createSelector(\r\n selectRouteParams,\r\n params => (params && name) ? params[name] : undefined\r\n);\r\n\r\nexport const selectUrl = createSelector(\r\n selectRouterState,\r\n state => decodeUriInternal(state?.url)!\r\n);\r\n\r\nexport const selectSiteSlugParam = createSelector(\r\n selectRouteParam('site-slug'),\r\n selectUrl,\r\n (s, u) => s ?? (!!u ? null : undefined)\r\n)\r\n\r\nexport const selectQueryParams = createSelector(\r\n selectRouterState,\r\n state => state?.queryParams\r\n);\r\n\r\nexport const selectQueryParam = (name: string) => createSelector(\r\n selectQueryParams,\r\n params => params ? params[name] : undefined\r\n);\r\n\r\nexport const selectDataParam = (name: string) => createSelector(\r\n selectRouterState,\r\n state => state?.data[name]\r\n);\r\n\r\nexport const selectUrlWithoutQuery = createSelector(\r\n selectRouterState,\r\n state => decodeUriInternal(state?.url?.split('?')[0])!\r\n);\r\n\r\nexport const selectUrlSegments = (count: number) => createSelector(\r\n selectUrlWithoutQuery,\r\n url => {\r\n let segs = url.split('/');\r\n return segs.slice(0, Math.min(segs.length, count)).join('/');\r\n }\r\n);\r\n\r\n\r\nconst decodeUriInternal = (source?: string): string | undefined => {\r\n return !!source ? decodeURI(source) : source;\r\n}","import { createSelector } from '@ngrx/store';\r\nimport { GridData, gridFeature } from './grid.reducer';\r\nimport { FilterLogic, GenericDataRequest, GroupFilter, SortDir } from './models';\r\nimport { selectQueryParam, selectRouterState } from '../router/router.selectors';\r\nimport { GridSetup } from './grid-setup';\r\n\r\nexport const selectGridData = (name: string) => createSelector(\r\n gridFeature.selectGrids,\r\n (grids): GridData | undefined => grids ? grids[name] : undefined\r\n);\r\n\r\nexport const selectPageIndex = createSelector(\r\n selectQueryParam('page'),\r\n (p): number => (p ? +p : 1) - 1\r\n);\r\nexport const selectPageSize = createSelector(\r\n selectQueryParam('size'),\r\n (s): number => s ? +s : 25\r\n);\r\n\r\nexport const selectGridFilters = (name: string) => createSelector(\r\n selectQueryParam(name),\r\n (params): GroupFilter | undefined => params ? JSON.parse(atob(params)) : undefined\r\n);\r\n\r\nexport const selectTotalCount = (name: string) => createSelector(\r\n selectGridData(name),\r\n data => data?.count ?? 0\r\n);\r\n\r\nexport const selectGridSetup = createSelector(\r\n selectRouterState,\r\n s => s?.data['grid'] ? (s.data['grid'] as GridSetup) : undefined\r\n);\r\n\r\nexport const selectSortBy = createSelector(\r\n selectGridSetup,\r\n selectQueryParam('sort-by'),\r\n (s,q) => q ? q : s?.sortBy\r\n);\r\n\r\nexport const selectSortDir = createSelector(\r\n selectGridSetup,\r\n selectQueryParam('sort-dir'),\r\n (s, q) => {\r\n q = (q??s?.sortDir)?.toLowerCase();\r\n return q == 'desc' ? SortDir.Desc : SortDir.Asc\r\n }\r\n);\r\n\r\nexport const selectSearchFields = createSelector(\r\n selectGridSetup,\r\n d => d?.searchFields\r\n);\r\n\r\nexport const selectIsGrid = createSelector(\r\n selectGridSetup,\r\n s => !!s\r\n);\r\n\r\nexport const selectGridName = createSelector(\r\n selectGridSetup,\r\n s => s?.controllerMethod\r\n);\r\n\r\n\r\nexport const selectDataUrl = createSelector(\r\n selectGridSetup,\r\n s => `/api/${s?.controllerMethod}`\r\n);\r\n\r\n\r\nexport const selectFilterText = createSelector(\r\n selectGridFilters('filter'),\r\n f => f?.fields?.at(0)?.values?.at(0) ?? ''\r\n);\r\nexport const selectDataRequest = createSelector(\r\n selectPageIndex,\r\n selectPageSize,\r\n selectSortBy,\r\n selectSortDir,\r\n selectGridFilters('base-filter'),\r\n selectGridFilters('filter'),\r\n (pageIndex, pageSize, sortBy, sortDir, baseFilters, filters): GenericDataRequest => ({\r\n paging: { page: pageIndex + 1, pageSize },\r\n sortBy,\r\n sortDir,\r\n filters: combineFilters([baseFilters, filters])\r\n })\r\n)\r\n\r\nfunction combineFilters(filters: (GroupFilter | undefined)[]): GroupFilter | undefined {\r\n let filtered = filters.filter(f => !!f) as GroupFilter[];\r\n if (filtered.length == 0) {\r\n return undefined;\r\n }\r\n if (filtered.length == 1) {\r\n return filtered[0];\r\n }\r\n return { logic: FilterLogic.And, groups: filtered };\r\n}\r\n\r\n","import {\r\n booleanAttribute, ChangeDetectionStrategy, Component, computed, effect, inject,\r\n input, Input, Signal, signal, TemplateRef\r\n} from '@angular/core';\r\nimport { ActionConfig, GridColumn, GridConfig } from './grid-config';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatPaginatorModule, PageEvent } from '@angular/material/paginator';\r\nimport { MatSortModule, Sort, SortDirection } from '@angular/material/sort';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { ActivatedRoute, Router, RouterModule } from '@angular/router';\r\nimport { Store } from '@ngrx/store';\r\nimport { GridActions } from '../../state/grid/grid.actions';\r\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\r\nimport { filter, switchMap } from 'rxjs';\r\nimport {\r\n selectDataRequest, selectFilterText, selectGridData, selectGridName, selectPageIndex,\r\n selectPageSize,\r\n selectSearchFields,\r\n selectSortBy,\r\n selectSortDir\r\n} from '../../state/grid/grid.selectors';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatCheckboxChange, MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { SelectionModel } from '@angular/cdk/collections';\r\nimport { Actions, ofType } from '@ngrx/effects';\r\nimport { SortDir } from '../../state/grid/models';\r\n\r\n@Component({\r\n selector: 'x-grid',\r\n imports: [MatInputModule, MatTableModule, MatToolbarModule, MatButtonModule,\r\n MatCheckboxModule, MatTooltipModule, MatIconModule, RouterModule,\r\n MatSortModule, MatPaginatorModule, NgTemplateOutlet],\r\n templateUrl: './grid.component.html',\r\n styleUrl: './grid.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class GridComponent<T> {\r\n private $deleteSuccess = toSignal(inject(Actions).pipe(ofType(GridActions.bulkDeleteSuccess)));\r\n private route = inject(ActivatedRoute);\r\n private router = inject(Router);\r\n private store = inject(Store);\r\n selection = new SelectionModel<T>(true, [], true, (a, b) => ((<any>a).id ?? a) === ((<any>b).id ?? b));\r\n $config = signal<GridConfig<T> | undefined>(undefined);\r\n @Input() set config(val: GridConfig<T> | undefined) {\r\n this.$config.set(val);\r\n };\r\n $sort = this.store.selectSignal(selectSortBy);\r\n $dir: Signal<SortDirection>;\r\n $bulk = input(false, { alias: 'bulk', transform: booleanAttribute });\r\n $allSelected = signal(false);\r\n $gridName = this.store.selectSignal(selectGridName);\r\n $columns = computed(() => this.$config()?.columns);\r\n $buttons = computed(() => this.$config()?.buttons);\r\n $displayedColumns = computed(() => {\r\n let res = this.$columns()?.map(c => c.name);\r\n if (res && this.$hasActions()) {\r\n res.push('actions');\r\n }\r\n if (res && this.$bulk()) {\r\n res.unshift('select');\r\n }\r\n return res;\r\n });\r\n $gridData = toSignal(toObservable(this.$gridName).pipe(\r\n filter(name => !!name),\r\n switchMap(name => this.store.select(selectGridData(name!)))));\r\n $filter = this.store.selectSignal(selectFilterText);\r\n $pageIndex = this.store.selectSignal(selectPageIndex);\r\n $pageSize = this.store.selectSignal(selectPageSize);\r\n $dataSource = computed(() => this.$gridData()?.data ?? []);\r\n $searchColumns = this.store.selectSignal(selectSearchFields);\r\n $hasSearch = computed(() => this.$searchColumns()?.length ?? 0);\r\n $actions = computed(() => this.$config()?.actions);\r\n $hasActions = computed(() => this.$actions()?.length ?? 0);\r\n $selectedCount: Signal<number | undefined>;\r\n toggleAll() {\r\n this.selection.clear();\r\n this.$allSelected.set(!this.$allSelected());\r\n }\r\n toggleOne(e: MatCheckboxChange, row: T) {\r\n if (this.$allSelected()) {\r\n this.selection.clear();\r\n this.$allSelected.set(false);\r\n this.selection.select(row);\r\n } else\r\n this.selection.toggle(row);\r\n if (e.checked != this.selection.isSelected(row))\r\n e.source.checked = this.selection.isSelected(row);\r\n }\r\n deleteSelected() {\r\n this.store.dispatch(GridActions.bulkDelete({ ids: this.selection.selected.map(s => (<any>s).id) }));\r\n }\r\n pageChange(e: PageEvent) {\r\n this.store.dispatch(GridActions.changePaging({ pageIndex: e.pageIndex, pageSize: e.pageSize }));\r\n }\r\n sortChange(e: Sort) {\r\n this.store.dispatch(GridActions.changeSort({ sort: e.active, dir: e.direction }));\r\n }\r\n\r\n refresh() {\r\n this.selection.clear();\r\n this.store.dispatch(GridActions.refresh());\r\n }\r\n setFilter(filter: string) {\r\n this.store.dispatch(GridActions.changeFilter({ filter }));\r\n }\r\n filterKeyUp(event: KeyboardEvent) {\r\n this.setFilter((event.target as HTMLInputElement).value);\r\n }\r\n getDisplayRef(col: GridColumn<T>): TemplateRef<any> | null {\r\n if (col.display instanceof TemplateRef)\r\n return col.display as TemplateRef<any>;\r\n return null;\r\n }\r\n getDisplayFunc(col: GridColumn<T>): ((row: T) => string | null) | null {\r\n if (col.display instanceof Function)\r\n return col.display as (row: T) => string | null;\r\n return null;\r\n }\r\n\r\n display(col: GridColumn<T>, row: T) {\r\n let func = this.getDisplayFunc(col);\r\n if (func)\r\n return func(row);\r\n return (<any>row)[col.name];\r\n }\r\n\r\n onRowClick(row: T) {\r\n if (!this.$config()?.defaultAction)\r\n return;\r\n let action = this.$actions()?.find(a => a.name === this.$config()?.defaultAction);\r\n if (action?.routerLink) {\r\n let link = action.routerLink(row);\r\n if (!Array.isArray(link))\r\n link = [link];\r\n this.router.navigate(link, { relativeTo: this.route });\r\n } else if (action?.action) {\r\n action.action(row);\r\n }\r\n }\r\n\r\n onAction(e: MouseEvent, row: any, action: ActionConfig<T>) {\r\n e.stopPropagation();\r\n if (action.action)\r\n action.action(row);\r\n }\r\n\r\n getStyle(col: GridColumn<T>) {\r\n return { 'max-width': col.width ?? 'auto' };\r\n }\r\n\r\n $request = this.store.selectSignal(selectDataRequest);\r\n\r\n constructor() {\r\n let $dir = this.store.selectSignal(selectSortDir);\r\n this.$dir = computed(() => $dir() == SortDir.Desc ? 'desc' : 'asc');\r\n effect(() =>{\r\n this.$deleteSuccess();\r\n this.selection.clear();\r\n this.$allSelected.set(false);\r\n });\r\n \r\n let $selectionChanged = toSignal(this.selection.changed);\r\n this.$selectedCount = computed(() => {\r\n let selection = $selectionChanged()?.source;\r\n let total = this.$gridData()?.count;\r\n return this.$allSelected() && !selection?.hasValue() ? total : selection?.selected.length;\r\n });\r\n }\r\n}\r\n","<mat-toolbar class=\"flex flex-row gap-2 p-2\">\r\n @if($hasSearch()){\r\n <div class=\"h-full\">\r\n <mat-form-field>\r\n <mat-label>Search</mat-label>\r\n <mat-icon matPrefix>search</mat-icon>\r\n <input matInput type=\"text\" [value]=\"$filter()\" (keyup)=\"filterKeyUp($event)\">\r\n @if ($filter()) {\r\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"setFilter('')\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n </div>\r\n }\r\n <ng-content select=\"[toolbar]\"></ng-content>\r\n @for(button of $buttons(); track button.name){\r\n <button mat-button [routerLink]=\"button.routerLink?button.routerLink():undefined\" [matTooltip]=\"button.text\"\r\n (click)=\"onAction($event,undefined,button)\"><mat-icon>{{button.icon}}</mat-icon> {{button.text}}</button>\r\n }\r\n @if ($config()?.new){\r\n <a mat-button routerLink=\"../new\"><mat-icon>add</mat-icon> New</a>\r\n }\r\n @if($config()?.refresh)\r\n {\r\n <button mat-button (click)=\"refresh()\"><mat-icon>sync</mat-icon> Refresh</button>\r\n }\r\n @if($bulk()){\r\n <button mat-button [disabled]=\"!$selectedCount()\" (click)=\"deleteSelected()\"><mat-icon>delete</mat-icon> Delete</button>\r\n }\r\n <span class=\"flex-grow\"></span>\r\n @if ($selectedCount() || $allSelected()){\r\n <span class=\"text-sm\"> {{$selectedCount()??0}} items selected</span>\r\n }\r\n</mat-toolbar>\r\n<mat-table [dataSource]=\"$dataSource()\" matSort (matSortChange)=\"sortChange($event)\"\r\n [matSortActive]=\"$sort()\" [matSortDirection]=\"$dir()\" matSortDisableClear>\r\n @if ($bulk()){\r\n <ng-container matColumnDef=\"select\">\r\n <mat-header-cell *matHeaderCellDef class=\"select\" matTooltip=\"Select all\">\r\n <mat-checkbox (change)=\"$event ? toggleAll() : null\" [checked]=\"!selection.hasValue() && $allSelected()\"\r\n [indeterminate]=\"selection.hasValue() && !$allSelected()\">\r\n </mat-checkbox>\r\n </mat-header-cell>\r\n <mat-cell *matCellDef=\"let row\" class=\"select\">\r\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"toggleOne($event, row)\"\r\n [checked]=\"selection.isSelected(row) || $allSelected() && !selection.hasValue()\">\r\n </mat-checkbox>\r\n </mat-cell>\r\n </ng-container>\r\n }\r\n @for(column of $columns(); track column.name){\r\n <ng-container [matColumnDef]=\"column.name\">\r\n @if (column.sort){\r\n <mat-header-cell [style]=\"getStyle(column)\" *matHeaderCellDef\r\n mat-sort-header>{{column.header}}</mat-header-cell>\r\n } @else {\r\n <mat-header-cell [style]=\"getStyle(column)\" *matHeaderCellDef>{{column.header}}</mat-header-cell>\r\n }\r\n <mat-cell [style]=\"getStyle(column)\" *matCellDef=\"let row\">\r\n @if(column.href || column.routerLink){\r\n <a [routerLink]=\"column.routerLink?column.routerLink(row):undefined\"\r\n [attr.href]=\"column.href?column.href(row):undefined\"\r\n (click)=\"column.action?column.action(row):undefined\">\r\n {{ display(column,row) }}\r\n </a>\r\n } @else if (getDisplayRef(column)) {\r\n <ng-container *ngTemplateOutlet=\"getDisplayRef(column); context: { $implicit: row}\"></ng-container>\r\n } @else {\r\n {{ display(column,row)}}\r\n }\r\n </mat-cell>\r\n </ng-container>\r\n }\r\n @if($hasActions()){\r\n <ng-container matColumnDef=\"actions\">\r\n <mat-header-cell *matHeaderCellDef>Actions</mat-header-cell>\r\n <mat-cell *matCellDef=\"let row\">\r\n @for(action of $actions(); track action.name){\r\n <button type=\"button\" mat-icon-button [disabled]=\"action.disabled?action.disabled(row):undefined\"\r\n [matTooltip]=\"action.text\" (click)=\"onAction($event, row, action)\"\r\n [queryParams]=\"action.queryParams?action.queryParams(row):undefined\"\r\n [routerLink]=\"action.routerLink?action.routerLink(row):undefined\">\r\n <mat-icon>{{action.icon}}</mat-icon>\r\n </button>\r\n }\r\n </mat-cell>\r\n </ng-container>\r\n }\r\n <mat-header-row *matHeaderRowDef=\"$displayedColumns()\"></mat-header-row>\r\n <mat-row [class.clickable]=\"!!$config()?.defaultAction\" *matRowDef=\"let row; columns: $displayedColumns()\"\r\n (click)=\"onRowClick(row)\"></mat-row>\r\n</mat-table>\r\n<mat-paginator [pageIndex]=\"$pageIndex()\" [length]=\"$gridData()?.count\" [pageSize]=\"$pageSize()\"\r\n (page)=\"pageChange($event)\" aria-label=\"Select page\"></mat-paginator>","import { createActionGroup, props } from \"@ngrx/store\";\r\n\r\nexport const RouterActions = createActionGroup({\r\n source: 'Router',\r\n events: {\r\n 'Set Query Params': props<{ queryParams:{[key:string]:string}}>()\r\n }\r\n});\r\n","import { Injectable, inject } from \"@angular/core\";\r\nimport { Actions, createEffect, ofType } from \"@ngrx/effects\";\r\nimport { RouterActions } from \"./router.actions\";\r\nimport { Router } from \"@angular/router\";\r\nimport { tap } from \"rxjs\";\r\nimport { concatLatestFrom } from \"@ngrx/operators\";\r\nimport { Store } from \"@ngrx/store\";\r\nimport { selectQueryParams } from \"./router.selectors\";\r\n\r\n@Injectable()\r\nexport class RouterEffects {\r\n private store = inject(Store);\r\n private actions$ = inject(Actions);\r\n private router = inject(Router);\r\n $set = createEffect(() => this.actions$.pipe(\r\n ofType(RouterActions.setQueryParams),\r\n concatLatestFrom(() => this.store.select(selectQueryParams)),\r\n tap(([{ queryParams }, params]) => {\r\n this.router.navigate([], { queryParams: Object.assign({...params},queryParams) });\r\n })\r\n ), { dispatch: false });\r\n}","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { provideEffects } from '@ngrx/effects';\r\nimport { RouterEffects } from './router.effects';\r\n\r\n\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule\r\n ], \r\n providers: [\r\n provideEffects(RouterEffects)\r\n ]\r\n})\r\nexport class StateRouterModule { }\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { Actions, createEffect, ofType } from '@ngrx/effects';\r\nimport { catchError, concatMap, filter, map, mergeMap, tap } from 'rxjs/operators';\r\nimport { concatLatestFrom } from '@ngrx/operators';\r\nimport { GridActions } from './grid.actions';\r\nimport { Store } from '@ngrx/store';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { selectDataRequest, selectDataUrl, selectGridName, selectIsGrid, selectSearchFields, selectTotalCount } from './grid.selectors';\r\nimport { SharedActions } from '../shared/shared.actions';\r\nimport { of } from 'rxjs';\r\nimport { GridData } from './grid.reducer';\r\nimport { FilterLogic, FilterOperator, SortDir } from './models';\r\nimport { selectQueryParam, selectUrl, selectUrlWithoutQuery } from '../router/router.selectors';\r\nimport { ConfirmationService } from '../../lib/confirmation.service';\r\nimport { SnackService } from '../../lib/snack.service';\r\nimport { ROUTER_NAVIGATION } from '@ngrx/router-store';\r\n\r\n@Injectable()\r\nexport class GridEffects {\r\n private snack = inject(SnackService);\r\n private client = inject(HttpClient);\r\n private store = inject(Store);\r\n private actions$ = inject(Actions);\r\n private confirmation = inject(ConfirmationService);\r\n\r\n changePaging$ = createEffect(() => {\r\n return this.actions$.pipe(\r\n ofType(GridActions.changePaging),\r\n concatLatestFrom(() => this.store.select(selectDataRequest)),\r\n map(([{ pageIndex, pageSize }, req]) => GridActions.updateRequest({ request: { ...req, paging: { page: pageIndex + 1, pageSize } } }))\r\n );\r\n });\r\n\r\n changeSort$ = createEffect(() => {\r\n return this.actions$.pipe(\r\n ofType(GridActions.changeSort),\r\n concatLatestFrom(() => this.store.select(selectDataRequest)),\r\n map(([{ sort, dir }, req]) => GridActions.updateRequest({ request: { ...req, sortBy: sort, sortDir: dir == \"asc\" ? SortDir.Asc : SortDir.Desc } }))\r\n );\r\n });\r\n\r\n updateRequest$ = createEffect(() => {\r\n return this.actions$.pipe(\r\n ofType(GridActions.updateRequest),\r\n concatLatestFrom(_ => [\r\n this.store.select(selectUrl),\r\n this.store.select(selectUrlWithoutQuery),\r\n this.store.select(selectQueryParam('base-filter'))\r\n ]),\r\n mergeMap(([{ request }, oldUrl, urlWithoutQuery, filter]) => {\r\n let url = `${urlWithoutQuery}?page=${request.paging?.page}&size=${request.paging?.pageSize}&sort-by=${request.sortBy ?? ''}&sort-dir=${request.sortDir == SortDir.Desc ? 'desc' : 'asc'}&filter=${request.filters ? btoa(JSON.stringify(request.filters)) : ''}&base-filter=${filter ?? ''}`;\r\n return oldUrl == url\r\n ? []\r\n : [SharedActions.navigate({ url })];\r\n })\r\n );\r\n });\r\n\r\n loadFromUrl$ = createEffect(() => {\r\n return this.actions$.pipe(\r\n ofType(ROUTER_NAVIGATION),\r\n concatLatestFrom(() => [\r\n this.store.select(selectIsGrid)]),\r\n filter(([_, isGrid]) => !!isGrid),\r\n map(() => GridActions.refresh())\r\n );\r\n });\r\n changeFilter$ = createEffect(() => {\r\n return this.actions$.pipe(\r\n ofType(GridActions.changeFilter),\r\n concatLatestFrom(() => [\r\n this.store.select(selectDataRequest),\r\n this.store.select(selectSearchFields)\r\n ]),\r\n map(([{ filter }, req, fields]) => GridActions.updateRequest({\r\n request: {\r\n ...req, filters: filter\r\n ? { logic: FilterLogic.And, fields: [{ names: fields, operator: FilterOperator.Contains, values: [filter] }] }\r\n : undefined\r\n }\r\n }))\r\n );\r\n });\r\n\r\n goTo$ = createEffect(() => {\r\n return this.actions$.pipe(\r\n ofType(GridActions.goTo),\r\n map(({ url, filter }) => SharedActions.navigate({ url: `${url}?base-filter=${filter ? btoa(JSON.stringify(filter)) : ''}` }))\r\n );\r\n });\r\n\r\n loadData$ = createEffect(() => {\r\n return this.actions$.pipe(\r\n ofType(GridActions.load),\r\n concatLatestFrom(() => [\r\n this.store.select(selectDataUrl),\r\n this.store.select(selectDataRequest)\r\n ]),\r\n concatMap(([{ type, name, request }, dataUrl, requestUrl]) =>\r\n this.client.post<GridData>(dataUrl, request ?? requestUrl).pipe(\r\n map(data => GridActions.loadSuccess({ name, ...data })),\r\n catchError(error => of(SharedActions.badError({ source: type, error }))))\r\n )\r\n );\r\n });\r\n\r\n bulkDelete$ = createEffect(() => {\r\n return this.actions$.pipe(\r\n ofType(GridActions.bulkDelete),\r\n concatLatestFrom(() => [\r\n this.store.select(selectGridName),\r\n this.store.select(selectDataUrl),\r\n this.store.select(selectDataRequest)\r\n ]),\r\n concatLatestFrom(([,name])=>this.store.select(selectTotalCount(name!))),\r\n mergeMap(([[{ type, ids }, name, url, request], totalCount]) =>\r\n this.confirmation.confirm(\r\n `Are you sure you want to delete ${ids?.length ? ids.length : totalCount} items?`,\r\n 'Delete',\r\n ).pipe(\r\n filter(c => c),\r\n concatMap(_ => {\r\n let headers = new HttpHeaders({ 'Content-Type': 'application/json' });\r\n let body = {\r\n ...request,\r\n paging: undefined,\r\n sortBy: undefined,\r\n sortDir: undefined,\r\n filters: ids?.length ? {\r\n logic: FilterLogic.And,\r\n fields: [{\r\n names: ['id'], operator: FilterOperator.In, values: ids.map(id => id.toString())\r\n }]\r\n } : request.filters\r\n };\r\n return this.client.delete(url, { headers, body }).pipe(\r\n map(() => GridActions.bulkDeleteSuccess()),\r\n catchError(error => of(SharedActions.badError({ source: type, error }))));\r\n }\r\n )\r\n )\r\n )\r\n )\r\n });\r\n\r\n refresh$ = createEffect(() => {\r\n return this.actions$.pipe(\r\n ofType(GridActions.refresh),\r\n concatLatestFrom(() => this.store.select(selectGridName)),\r\n map(([_, name]) => GridActions.load({ name:name! }))\r\n );\r\n });\r\n\r\n bulkDeleteSuccess$ = createEffect(() => {\r\n return this.actions$.pipe(\r\n ofType(GridActions.bulkDeleteSuccess),\r\n tap(() => this.snack.info('Deleted!')),\r\n map(() => GridActions.refresh())\r\n );\r\n });\r\n\r\n constructor() { }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { GridEffects } from './grid.effects';\r\nimport { provideState } from '@ngrx/store';\r\nimport { gridFeature } from './grid.reducer';\r\nimport { provideEffects } from '@ngrx/effects';\r\n\r\n\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule\r\n ],\r\n providers: [\r\n provideState(gridFeature),\r\n provideEffects([GridEffects])\r\n ]\r\n})\r\nexport class GridModule { }\r\n","import { createActionGroup, props } from '@ngrx/store';\r\nimport { NamedItem } from './crud.reducer';\r\n\r\nexport const CrudActions = createActionGroup({\r\n source: 'Crud',\r\n events: {\r\n 'Load All': props<{ name: string }>(),\r\n 'Load All Success': props<{ name: string, all: NamedItem[] }>(),\r\n 'Configure': props<{ name: string, param: string }>(),\r\n 'Delete': props<{ name: string, value: any }>(),\r\n 'Save': props<{ name: string, value: any, stay?:boolean }>(),\r\n 'Save Success': props<{ name: string, value: any, stay?:boolean }>(),\r\n 'Clear Saved': props<{ name: string }>(),\r\n 'Load': props<{ name: string }>(),\r\n 'Load Success': props<{ name: string, value: any }>()\r\n }\r\n});\r\n","import { createFeature, createReducer, on } from '@ngrx/store';\r\nimport { CrudActions } from './crud.actions';\r\n\r\nexport interface NamedItem {\r\n id: number,\r\n name: string\r\n}\r\n\r\nexport const crudFeatureKey = 'crud';\r\n\r\nexport interface State {\r\n urlPrefix: string,\r\n map: {\r\n [key: string]: {\r\n param?: string,\r\n all: NamedItem[],\r\n value?: any\r\n }\r\n },\r\n}\r\n\r\nexport const initialState: State = {\r\n urlPrefix: '/api',\r\n map: {}\r\n};\r\n\r\nexport const reducer = createReducer(\r\n initialState,\r\n on(CrudActions.load, CrudActions.clearSaved, (state, { name }) => ({ ...state, map: { ...state.map, [name]: { ...state.map[name], value: undefined } } })), \r\n on(CrudActions.configure, (state, { name, param }) => ({ ...state, map: { ...state.map, [name]: { ...state.map[name], param } } })),\r\n on(CrudActions.loadSuccess, (state, { name, value }) => ({ ...state, map: { ...state.map, [name]: { ...state.map[name], value } } })),\r\n on(CrudActions.saveSuccess, (state, { name, value }) => ({ ...state, map: { ...state.map, [name]: { ...state.map[name], value } } })),\r\n on(CrudActions.loadAllSuccess, (state, { name, all }) => ({ ...state, map: { ...state.map, [name]: { ...state.map[name], all } } })),\r\n);\r\n\r\nexport const crudFeature = createFeature({\r\n name: crudFeatureKey,\r\n reducer,\r\n});\r\n\r\n","import { createSelector } from '@ngrx/store';\r\nimport { crudFeature } from './crud.reducer';\r\n\r\nexport const selectParamName = (name: string) => createSelector(\r\n crudFeature.selectMap,\r\n map => map[name]?.param\r\n);\r\n\r\nexport const selectValue = (name: string) => createSelector(\r\n crudFeature.selectMap,\r\n map => map ? map[name]?.value : undefined\r\n);\r\n\r\nexport const selectAll = (name: string) => createSelector(\r\n crudFeature.selectMap,\r\n map => map ? map[name]?.all : undefined\r\n);\r\n\r\n\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { Actions, createEffect, ofType } from '@ngrx/effects';\r\nimport { concatLatestFrom } from '@ngrx/operators';\r\nimport { catchError, concatMap, filter, map, mergeMap, tap } from 'rxjs/operators';\r\nimport { CrudActions } from './crud.actions';\r\nimport { Store } from '@ngrx/store';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { ConfirmationService } from '../../lib/confirmation.service';\r\nimport { selectParamName } from './crud.selectors';\r\nimport { selectRouteParam } from '../router/router.selectors';\r\nimport { crudFeature, NamedItem } from './crud.reducer';\r\nimport { of } from 'rxjs';\r\nimport { SharedActions } from '../shared/shared.actions';\r\nimport { Location } from '@angular/common';\r\nimport { GridActions } from '../grid/grid.actions';\r\nimport { SnackService } from '../../lib/snack.service';\r\n\r\n@Injectable()\r\nexport class CrudEffects {\r\n confirmation = inject(ConfirmationService);\r\n private snack = inject(SnackService);\r\n private store = inject(Store);\r\n private actions$ = inject(Actions);\r\n private client = inject(HttpClient);\r\n private location = inject(Location);\r\n\r\n load$ = createEffect(() => {\r\n return this.actions$.pipe(\r\n ofType(CrudActions.load),\r\n concatLatestFrom(({ name }) =>\r\n this.store.select(selectParamName(name))\r\n ),\r\n concatLatestFrom(([_, param]) => [\r\n this.store.select(crudFeature.selectUrlPrefix),\r\n this.store.select(selectRouteParam(param)),\r\n ]),\r\n concatMap(([[{ type, name }], prefix, id]) =>\r\n id ? this.client.get(`${prefix}/${name}/${id}`).pipe(\r\n map(value => CrudActions.loadSuccess({ name, value })),\r\n catchError(error => of(SharedActions.badError({ source: type, error }))))\r\n : of(CrudActions.loadSuccess({ name, value: undefined }))\r\n ));\r\n });\r\n\r\n loadAll$ = createEffect(() => {\r\n return this.actions$.pipe(\r\n ofType(CrudActions.loadAll),\r\n concatLatestFrom(() => [\r\n this.store.select(crudFeature.selectUrlPrefix)\r\n ]),\r\n concatMap(([{ type, name }, prefix]) =>\r\n this.client.get<NamedItem[]>(`${prefix}/${name}/all`).pipe(\r\n map(all => CrudActions.loadAllSuccess({ name, all })),\r\n catchError(error => of(SharedActions.badError({ source: type, error }))))\r\n ));\r\n });\r\n\r\n save$ = createEffect(() => {\r\n return this.actions$.pipe(\r\n ofType(CrudActions.save),\r\n concatLatestFrom(() => [\r\n this.store.select(crudFeature.selectUrlPrefix)\r\n ]),\r\n mergeMap(([{ type, name, value, stay }, prefix]) =>\r\n (value.id\r\n ? this.client.put(`${prefix}/${name}/${value.id}`, value)\r\n : this.client.post(`${prefix}/${name}`, value))\r\n .pipe(\r\n map(value => CrudActions.saveSuccess({ name, value, stay })),\r\n catchError(error => of(SharedActions.badError({ source: type, error }))))\r\n )\r\n );\r\n });\r\n\r\n saveSuccess$ = createEffect(() => {\r\n return this.actions$.pipe(\r\n ofType(CrudActions.saveSuccess),\r\n map(({ stay }) => {\r\n this.snack.info('Saved!');\r\n if (!stay) this.location.back();\r\n })\r\n );\r\n }, { dispatch: false });\r\n\r\n delete$ = createEffect(() => {\r\n return this.actions$.pipe(\r\n ofType(CrudActions.delete),\r\n concatLatestFrom(() => [\r\n this.store.select(crudFeature.selectUrlPrefix)\r\n ]),\r\n concatMap(([{ type, name, value }, prefix]) => {\r\n let nameStr = value.name ?? `the ${name.toLowerCase()}`;\r\n return this.confirmation.confirm(`Are you sure you want to delete ${nameStr}?`,'Delete').pipe(\r\n filter(confirmed => confirmed),\r\n mergeMap(() => this.client.delete(`${prefix}/${name}/${value.id}`).pipe(\r\n map(() => GridActions.refresh()),\r\n tap(() => this.snack.info('Deleted!')),\r\n catchError(error => of(SharedActions.badError({ source: type, error })))\r\n ))\r\n );\r\n })\r\n );\r\n });\r\n\r\n\r\n constructor() { }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { provideState } from '@ngrx/store';\r\nimport { crudFeature } from './crud.reducer';\r\nimport { provideEffects } from '@ngrx/effects';\r\nimport { CrudEffects } from './crud.effects';\r\n\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule\r\n ],\r\n providers: [\r\n provideState(crudFeature),\r\n provideEffects(CrudEffects) \r\n ]\r\n})\r\nexport class CrudModule { }\r\n","/*\r\n * Public API Surface of the library\r\n */\r\n\r\nexport * from './lib/snack.service';\r\nexport * from './lib/loading.interceptor';\r\nexport * from './lib/confirmation.service';\r\nexport * from './lib/confirmation-dialog/confirmation-dialog.component';\r\nexport * from './lib/detail-actions/detail-actions.component';\r\nexport * from './lib/email/email.component';\r\nexport * from './lib/grid/grid.component';\r\nexport * from './lib/grid/grid-config';\r\nexport * from './state/router/router.module';\r\nexport * from './state/router/router.actions';\r\nexport * from './state/router/router.selectors';\r\nexport * from './state/grid/grid.module';\r\nexport * from './state/grid/grid.actions';\r\nexport { gridFeature } from './state/grid/grid.reducer';\r\nexport * from './state/grid/grid.selectors';\r\nexport * from './state/crud/crud.module';\r\nexport * from './state/crud/crud.actions';\r\nexport { crudFeature } from './state/crud/crud.reducer';\r\nexport * from './state/crud/crud.selectors'; \r\n\r\n\r\n\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i3","i2","initialState","reducer","i4","i8","map","filter","catchError","tap"],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="axioma-material" />
5
+ export * from './public-api';
@@ -0,0 +1,13 @@
1
+ import { TemplateRef } from "@angular/core";
2
+ export interface ConfirmationData {
3
+ title: string;
4
+ message?: string;
5
+ messageRef?: TemplateRef<any>;
6
+ buttons?: ButtonData[];
7
+ }
8
+ export interface ButtonData {
9
+ text: string;
10
+ value: any;
11
+ default: boolean;
12
+ color?: 'primary' | 'accent' | 'warn';
13
+ }
@@ -0,0 +1,11 @@
1
+ import { MatDialogRef } from '@angular/material/dialog';
2
+ import { ButtonData, ConfirmationData } from './confirmation-data';
3
+ import * as i0 from "@angular/core";
4
+ export declare class ConfirmationDialogComponent {
5
+ data: ConfirmationData;
6
+ dialogRef: MatDialogRef<any, any>;
7
+ constructor();
8
+ clickButton(button: ButtonData): void;
9
+ static ɵfac: i0.ɵɵFactoryDeclaration<ConfirmationDialogComponent, never>;
10
+ static ɵcmp: i0.ɵɵComponentDeclaration<ConfirmationDialogComponent, "x-confirmation-dialog", never, {}, {}, never, never, true, never>;
11
+ }
@@ -0,0 +1,8 @@
1
+ import { Observable } from 'rxjs';
2
+ import * as i0 from "@angular/core";
3
+ export declare class ConfirmationService {
4
+ private dialog;
5
+ confirm(message: string, title?: string): Observable<boolean>;
6
+ static ɵfac: i0.ɵɵFactoryDeclaration<ConfirmationService, never>;
7
+ static ɵprov: i0.ɵɵInjectableDeclaration<ConfirmationService>;
8
+ }
@@ -0,0 +1,11 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export declare class DetailActionsComponent {
4
+ dontRoute: boolean;
5
+ cancel: EventEmitter<void>;
6
+ private location;
7
+ constructor();
8
+ static ɵfac: i0.ɵɵFactoryDeclaration<DetailActionsComponent, never>;
9
+ static ɵcmp: i0.ɵɵComponentDeclaration<DetailActionsComponent, "x-detail-actions", never, { "dontRoute": { "alias": "no-routing"; "required": false; }; }, { "cancel": "cancel"; }, never, ["[right]"], true, never>;
10
+ static ngAcceptInputType_dontRoute: unknown;
11
+ }
@@ -0,0 +1,2 @@
1
+ import { Observable } from "rxjs";
2
+ export type CheckUserExistsFn = (email: string) => Observable<boolean>;
@@ -0,0 +1,25 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import { ControlValueAccessor, Validator, AbstractControl, ValidationErrors, FormControl } from '@angular/forms';
3
+ import { CheckUserExistsFn } from './checkUserExistsFn';
4
+ import * as i0 from "@angular/core";
5
+ export declare class EmailComponent implements ControlValueAccessor, Validator {
6
+ checkUserExistsFn?: CheckUserExistsFn;
7
+ login: EventEmitter<void>;
8
+ label: string;
9
+ exists: EventEmitter<boolean>;
10
+ $touched: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
11
+ $existing: import("@angular/core").InputSignalWithTransform<boolean | undefined, unknown>;
12
+ control: FormControl<string | null>;
13
+ onChange: (_: any) => void;
14
+ onTouch: (_: any) => void;
15
+ onValidationChange: () => void;
16
+ writeValue(obj: any): void;
17
+ registerOnChange(fn: any): void;
18
+ registerOnTouched(fn: any): void;
19
+ setDisabledState?(isDisabled: boolean): void;
20
+ validate(_: AbstractControl): ValidationErrors | null;
21
+ registerOnValidatorChange?(fn: () => void): void;
22
+ constructor();
23
+ static ɵfac: i0.ɵɵFactoryDeclaration<EmailComponent, never>;
24
+ static ɵcmp: i0.ɵɵComponentDeclaration<EmailComponent, "x-email", never, { "checkUserExistsFn": { "alias": "checkUserExistsFn"; "required": true; }; "label": { "alias": "label"; "required": false; }; "$touched": { "alias": "touched"; "required": false; "isSignal": true; }; "$existing": { "alias": "existing"; "required": false; "isSignal": true; }; }, { "login": "login"; "exists": "exists"; }, never, ["*"], true, never>;
25
+ }
@@ -0,0 +1,29 @@
1
+ import { TemplateRef } from "@angular/core";
2
+ export interface ActionConfig<T> {
3
+ style?: 'icon' | 'text' | 'icon-text';
4
+ name: string;
5
+ text?: string;
6
+ icon?: string;
7
+ routerLink?: (row?: T) => string[] | string;
8
+ queryParams?: (row?: T) => any;
9
+ disabled?: (row: T) => boolean;
10
+ action?: (row: T) => void;
11
+ }
12
+ export interface GridColumn<T> {
13
+ name: string;
14
+ header: string;
15
+ sort?: boolean;
16
+ width?: string;
17
+ display?: ((row: T) => string | null) | TemplateRef<any>;
18
+ href?: (row: T) => string | null;
19
+ routerLink?: (row: T) => string[] | string | null;
20
+ action?: (row: T) => void;
21
+ }
22
+ export interface GridConfig<T> {
23
+ defaultAction?: string;
24
+ refresh?: boolean;
25
+ new?: boolean;
26
+ columns: GridColumn<T>[];
27
+ actions?: ActionConfig<T>[];
28
+ buttons?: ActionConfig<T>[];
29
+ }
@@ -0,0 +1,54 @@
1
+ import { Signal, TemplateRef } from '@angular/core';
2
+ import { ActionConfig, GridColumn, GridConfig } from './grid-config';
3
+ import { PageEvent } from '@angular/material/paginator';
4
+ import { Sort, SortDirection } from '@angular/material/sort';
5
+ import { MatCheckboxChange } from '@angular/material/checkbox';
6
+ import { SelectionModel } from '@angular/cdk/collections';
7
+ import * as i0 from "@angular/core";
8
+ export declare class GridComponent<T> {
9
+ private $deleteSuccess;
10
+ private route;
11
+ private router;
12
+ private store;
13
+ selection: SelectionModel<T>;
14
+ $config: import("@angular/core").WritableSignal<GridConfig<T> | undefined>;
15
+ set config(val: GridConfig<T> | undefined);
16
+ $sort: Signal<any>;
17
+ $dir: Signal<SortDirection>;
18
+ $bulk: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
19
+ $allSelected: import("@angular/core").WritableSignal<boolean>;
20
+ $gridName: Signal<string | undefined>;
21
+ $columns: Signal<GridColumn<T>[] | undefined>;
22
+ $buttons: Signal<ActionConfig<T>[] | undefined>;
23
+ $displayedColumns: Signal<string[] | undefined>;
24
+ $gridData: Signal<import("../../state/grid/grid.reducer").GridData | undefined>;
25
+ $filter: Signal<string>;
26
+ $pageIndex: Signal<number>;
27
+ $pageSize: Signal<number>;
28
+ $dataSource: Signal<any[]>;
29
+ $searchColumns: Signal<string[] | undefined>;
30
+ $hasSearch: Signal<number>;
31
+ $actions: Signal<ActionConfig<T>[] | undefined>;
32
+ $hasActions: Signal<number>;
33
+ $selectedCount: Signal<number | undefined>;
34
+ toggleAll(): void;
35
+ toggleOne(e: MatCheckboxChange, row: T): void;
36
+ deleteSelected(): void;
37
+ pageChange(e: PageEvent): void;
38
+ sortChange(e: Sort): void;
39
+ refresh(): void;
40
+ setFilter(filter: string): void;
41
+ filterKeyUp(event: KeyboardEvent): void;
42
+ getDisplayRef(col: GridColumn<T>): TemplateRef<any> | null;
43
+ getDisplayFunc(col: GridColumn<T>): ((row: T) => string | null) | null;
44
+ display(col: GridColumn<T>, row: T): any;
45
+ onRowClick(row: T): void;
46
+ onAction(e: MouseEvent, row: any, action: ActionConfig<T>): void;
47
+ getStyle(col: GridColumn<T>): {
48
+ 'max-width': string;
49
+ };
50
+ $request: Signal<import("../../state/grid/models").GenericDataRequest>;
51
+ constructor();
52
+ static ɵfac: i0.ɵɵFactoryDeclaration<GridComponent<any>, never>;
53
+ static ɵcmp: i0.ɵɵComponentDeclaration<GridComponent<any>, "x-grid", never, { "config": { "alias": "config"; "required": false; }; "$bulk": { "alias": "bulk"; "required": false; "isSignal": true; }; }, {}, never, ["[toolbar]"], true, never>;
54
+ }
@@ -0,0 +1,2 @@
1
+ import { HttpInterceptorFn } from '@angular/common/http';
2
+ export declare const loadingInterceptor: HttpInterceptorFn;
@@ -0,0 +1,8 @@
1
+ import { MatSnackBar } from '@angular/material/snack-bar';
2
+ import * as i0 from "@angular/core";
3
+ export declare class SnackService {
4
+ snackBar: MatSnackBar;
5
+ info(message: string, action?: string, duration?: number): void;
6
+ static ɵfac: i0.ɵɵFactoryDeclaration<SnackService, never>;
7
+ static ɵprov: i0.ɵɵInjectableDeclaration<SnackService>;
8
+ }
package/package.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "axioma-material",
3
+ "author": "Petr Shelomovskiy",
4
+ "license": "MIT",
5
+ "version": "1.0.1",
6
+ "peerDependencies": {
7
+ "@angular/common": "^19.1.0",
8
+ "@angular/core": "^19.1.0"
9
+ },
10
+ "dependencies": {
11
+ "tslib": "^2.3.0"
12
+ },
13
+ "sideEffects": false,
14
+ "module": "fesm2022/axioma-material.mjs",
15
+ "typings": "index.d.ts",
16
+ "exports": {
17
+ "./package.json": {
18
+ "default": "./package.json"
19
+ },
20
+ ".": {
21
+ "types": "./index.d.ts",
22
+ "default": "./fesm2022/axioma-material.mjs"
23
+ }
24
+ }
25
+ }
@@ -0,0 +1,19 @@
1
+ export * from './lib/snack.service';
2
+ export * from './lib/loading.interceptor';
3
+ export * from './lib/confirmation.service';
4
+ export * from './lib/confirmation-dialog/confirmation-dialog.component';
5
+ export * from './lib/detail-actions/detail-actions.component';
6
+ export * from './lib/email/email.component';
7
+ export * from './lib/grid/grid.component';
8
+ export * from './lib/grid/grid-config';
9
+ export * from './state/router/router.module';
10
+ export * from './state/router/router.actions';
11
+ export * from './state/router/router.selectors';
12
+ export * from './state/grid/grid.module';
13
+ export * from './state/grid/grid.actions';
14
+ export { gridFeature } from './state/grid/grid.reducer';
15
+ export * from './state/grid/grid.selectors';
16
+ export * from './state/crud/crud.module';
17
+ export * from './state/crud/crud.actions';
18
+ export { crudFeature } from './state/crud/crud.reducer';
19
+ export * from './state/crud/crud.selectors';
@@ -0,0 +1,64 @@
1
+ import { NamedItem } from './crud.reducer';
2
+ export declare const CrudActions: {
3
+ loadAll: import("@ngrx/store").ActionCreator<"[Crud] Load All", (props: {
4
+ name: string;
5
+ }) => {
6
+ name: string;
7
+ } & import("@ngrx/store").Action<"[Crud] Load All">>;
8
+ loadAllSuccess: import("@ngrx/store").ActionCreator<"[Crud] Load All Success", (props: {
9
+ name: string;
10
+ all: NamedItem[];
11
+ }) => {
12
+ name: string;
13
+ all: NamedItem[];
14
+ } & import("@ngrx/store").Action<"[Crud] Load All Success">>;
15
+ configure: import("@ngrx/store").ActionCreator<"[Crud] Configure", (props: {
16
+ name: string;
17
+ param: string;
18
+ }) => {
19
+ name: string;
20
+ param: string;
21
+ } & import("@ngrx/store").Action<"[Crud] Configure">>;
22
+ delete: import("@ngrx/store").ActionCreator<"[Crud] Delete", (props: {
23
+ name: string;
24
+ value: any;
25
+ }) => {
26
+ name: string;
27
+ value: any;
28
+ } & import("@ngrx/store").Action<"[Crud] Delete">>;
29
+ save: import("@ngrx/store").ActionCreator<"[Crud] Save", (props: {
30
+ name: string;
31
+ value: any;
32
+ stay?: boolean;
33
+ }) => {
34
+ name: string;
35
+ value: any;
36
+ stay?: boolean;
37
+ } & import("@ngrx/store").Action<"[Crud] Save">>;
38
+ saveSuccess: import("@ngrx/store").ActionCreator<"[Crud] Save Success", (props: {
39
+ name: string;
40
+ value: any;
41
+ stay?: boolean;
42
+ }) => {
43
+ name: string;
44
+ value: any;
45
+ stay?: boolean;
46
+ } & import("@ngrx/store").Action<"[Crud] Save Success">>;
47
+ clearSaved: import("@ngrx/store").ActionCreator<"[Crud] Clear Saved", (props: {
48
+ name: string;
49
+ }) => {
50
+ name: string;
51
+ } & import("@ngrx/store").Action<"[Crud] Clear Saved">>;
52
+ load: import("@ngrx/store").ActionCreator<"[Crud] Load", (props: {
53
+ name: string;
54
+ }) => {
55
+ name: string;
56
+ } & import("@ngrx/store").Action<"[Crud] Load">>;
57
+ loadSuccess: import("@ngrx/store").ActionCreator<"[Crud] Load Success", (props: {
58
+ name: string;
59
+ value: any;
60
+ }) => {
61
+ name: string;
62
+ value: any;
63
+ } & import("@ngrx/store").Action<"[Crud] Load Success">>;
64
+ };
@@ -0,0 +1,41 @@
1
+ import { ConfirmationService } from '../../lib/confirmation.service';
2
+ import { NamedItem } from './crud.reducer';
3
+ import * as i0 from "@angular/core";
4
+ export declare class CrudEffects {
5
+ confirmation: ConfirmationService;
6
+ private snack;
7
+ private store;
8
+ private actions$;
9
+ private client;
10
+ private location;
11
+ load$: import("rxjs").Observable<({
12
+ source: string;
13
+ error: any;
14
+ } & import("@ngrx/store").Action<"[Shared] Bad Error">) | ({
15
+ name: string;
16
+ value: any;
17
+ } & import("@ngrx/store").Action<"[Crud] Load Success">)> & import("@ngrx/effects").CreateEffectMetadata;
18
+ loadAll$: import("rxjs").Observable<({
19
+ source: string;
20
+ error: any;
21
+ } & import("@ngrx/store").Action<"[Shared] Bad Error">) | ({
22
+ name: string;
23
+ all: NamedItem[];
24
+ } & import("@ngrx/store").Action<"[Crud] Load All Success">)> & import("@ngrx/effects").CreateEffectMetadata;
25
+ save$: import("rxjs").Observable<({
26
+ source: string;
27
+ error: any;
28
+ } & import("@ngrx/store").Action<"[Shared] Bad Error">) | ({
29
+ name: string;
30
+ value: any;
31
+ stay?: boolean;
32
+ } & import("@ngrx/store").Action<"[Crud] Save Success">)> & import("@ngrx/effects").CreateEffectMetadata;
33
+ saveSuccess$: import("rxjs").Observable<void> & import("@ngrx/effects").CreateEffectMetadata;
34
+ delete$: import("rxjs").Observable<({
35
+ source: string;
36
+ error: any;
37
+ } & import("@ngrx/store").Action<"[Shared] Bad Error">) | import("@ngrx/store").Action<"[Grid] Refresh">> & import("@ngrx/effects").CreateEffectMetadata;
38
+ constructor();
39
+ static ɵfac: i0.ɵɵFactoryDeclaration<CrudEffects, never>;
40
+ static ɵprov: i0.ɵɵInjectableDeclaration<CrudEffects>;
41
+ }
@@ -0,0 +1,7 @@
1
+ import * as i0 from "@angular/core";
2
+ import * as i1 from "@angular/common";
3
+ export declare class CrudModule {
4
+ static ɵfac: i0.ɵɵFactoryDeclaration<CrudModule, never>;
5
+ static ɵmod: i0.ɵɵNgModuleDeclaration<CrudModule, never, [typeof i1.CommonModule], never>;
6
+ static ɵinj: i0.ɵɵInjectorDeclaration<CrudModule>;
7
+ }
@@ -0,0 +1,36 @@
1
+ export interface NamedItem {
2
+ id: number;
3
+ name: string;
4
+ }
5
+ export declare const crudFeatureKey = "crud";
6
+ export interface State {
7
+ urlPrefix: string;
8
+ map: {
9
+ [key: string]: {
10
+ param?: string;
11
+ all: NamedItem[];
12
+ value?: any;
13
+ };
14
+ };
15
+ }
16
+ export declare const initialState: State;
17
+ export declare const reducer: import("@ngrx/store").ActionReducer<State, import("@ngrx/store").Action<string>>;
18
+ export declare const crudFeature: {
19
+ name: "crud";
20
+ reducer: import("@ngrx/store").ActionReducer<State, import("@ngrx/store").Action<string>>;
21
+ selectCrudState: import("@ngrx/store").MemoizedSelector<Record<string, any>, State, (featureState: State) => State>;
22
+ selectMap: import("@ngrx/store").MemoizedSelector<Record<string, any>, {
23
+ [key: string]: {
24
+ param?: string;
25
+ all: NamedItem[];
26
+ value?: any;
27
+ };
28
+ }, (featureState: State) => {
29
+ [key: string]: {
30
+ param?: string;
31
+ all: NamedItem[];
32
+ value?: any;
33
+ };
34
+ }>;
35
+ selectUrlPrefix: import("@ngrx/store").MemoizedSelector<Record<string, any>, string, (featureState: State) => string>;
36
+ };