{"version":3,"file":"sowatech-shared-ngrx.mjs","sources":["../../../projects/shared/ngrx/error-handling.ts","../../../projects/shared/ngrx/effect-base.ts","../../../projects/shared/ngrx/logging-meta-reducer.ts","../../../projects/shared/ngrx/external-refresh-adapter.ts","../../../projects/shared/ngrx/external-refresh-action.directive.ts","../../../projects/shared/ngrx/sowatech-shared-ngrx.ts"],"sourcesContent":["import { HttpErrorResponse } from '@angular/common/http';\r\nimport { inject, ProviderToken, signal } from '@angular/core';\r\nimport { Actions, createEffect, ofType } from '@ngrx/effects';\r\nimport { Action, ActionCreator, createAction, Creator } from '@ngrx/store';\r\nimport { GenericEditDialogService } from '@sowatech/shared/swt-generic';\r\nimport { catchError, of, OperatorFunction } from 'rxjs';\r\nimport { filter, map, tap } from 'rxjs/operators';\r\n\r\n\r\n/**\r\n * Effect, der als Reaktion auf eine Failure Action den ErrorHandler mit angegebenem ActionText auslöst.\r\n * ```ts\r\n * loadListError$ = createErrorHandlerEffect(apiActions.loadListFailure, 'Laden der Liste');\r\n * ```\r\n */\r\nexport function createErrorHandlerEffect(\r\n    action: ActionCreator<string, Creator<[HttpErrorResponse], { error: ErrorParams; }>>,\r\n    actionText: string,\r\n    actions$ = inject(Actions),\r\n) {\r\n    return createEffect(() => actions$.pipe(\r\n        ofType(action),\r\n        map(ac => errorAction(ac.error, { handling: 'messageBox', actionText })),\r\n    ));\r\n}\r\n\r\n/**\r\n * Effect, der als Reaktion auf eine Failure Action den Fehler im Edit Dialog anzeigt.\r\n * ```ts\r\n * createError$ = createDialogErrorEffect(apiActions.createFailure);\r\n * ```\r\n */\r\nexport function createDialogErrorEffect(\r\n    action: ActionCreator<string, Creator<[HttpErrorResponse], { error: ErrorParams; }>>,\r\n    actions$ = inject(Actions),\r\n) {\r\n    return createEffect(() => actions$.pipe(\r\n        ofType(action),\r\n        map(ac => errorAction(ac.error, { handling: 'dialog', actionText: undefined })),\r\n    ));\r\n}\r\n\r\ntype HttpStatusCode = number;\r\nexport type ErrorParams = {\r\n    name: string;\r\n    message: string;\r\n    status: HttpStatusCode;\r\n    error: any;\r\n    trace?: string;\r\n};\r\n\r\ntype FailureParam = HttpErrorResponse;\r\ntype FailurePayload = { error: ErrorParams; };\r\ntype FailureAction = ActionCreator<string, Creator<[FailureParam], Action & FailurePayload>>;\r\n\r\n/**\r\n * Kann gesetzt werden, um eine Trace ID aus dem Error zu lesen\r\n * ```ts\r\n * errorPropsGetTraceId.set(error => {\r\n *     if (error instanceof HttpErrorResponse)\r\n *         return error.headers.get('X-Trace-Id') ?? undefined;\r\n *     return undefined;\r\n * });\r\n * ```\r\n */\r\nexport const errorPropsGetTraceId = signal<(error: unknown) => string | undefined>(() => undefined);\r\n\r\n/**\r\n * props für Failure Actions.\r\n * ```ts\r\n * createActionGroup({\r\n *     name: 'My API',\r\n *     events: {\r\n *         'Update Success': emptyProps(),\r\n *         'Update Failure': errorProps(),\r\n *     },\r\n * });\r\n *\r\n * catchError(err => of(apiActions.updateFailure(err)))\r\n * ```\r\n */\r\nexport const errorProps = () => (error: FailureParam): FailurePayload => ({\r\n    error: {\r\n        name: error.name,\r\n        message: error.message,\r\n        status: error.status,\r\n        error: error.error,\r\n        trace: errorPropsGetTraceId()(error),\r\n    }\r\n});\r\n\r\n/**\r\n * Abkürzung fürs Mappen zu einer Failure Action.\r\n *\r\n * ohne mapFailure: `catchError(err => of(apiActions.updateFailure(err)))`\r\n *\r\n * mit mapFailure: `mapFailure(apiActions.updateFailure)`\r\n */\r\nexport const mapFailure = (failureAction: FailureAction) => catchError(err => of(failureAction(err))) as OperatorFunction<unknown, Action & FailurePayload>;\r\n\r\ntype ErrorOptions = { handling: 'messageBox'; actionText: string; } | { handling: 'dialog'; actionText: undefined; };\r\n\r\n/**\r\n * globale Error Action, über die sämtliches ErrorHandling abgehandelt wird\r\n */\r\nexport const errorAction = createAction('[App] Error', (error: ErrorParams, errorOptions: ErrorOptions) => ({ error, actionText: errorOptions.actionText, handling: errorOptions.handling }));\r\n\r\n/**\r\n * Globaler Effect, der von `createDialogErrorEffect` gemappte Fehler im Dialog anzeigt.\r\n * Der Effect muss im AppModule registriert werden:\r\n * ```ts\r\n * EffectsModule.forRoot({ globalDialogErrorHandlingEffect })\r\n * ```\r\n */\r\nexport const globalDialogErrorHandlingEffect = createEffect(\r\n    (actions$ = inject(Actions), dialog = inject(GenericEditDialogService)) => {\r\n        return actions$.pipe(\r\n            ofType(errorAction),\r\n            filter(({ handling }) => handling === 'dialog'),\r\n            map(({ error }): string => error.error.titleKey && error.error.detailKey ? `${error.error.titleKey}: ${error.error.detailKey}` : error.message),\r\n            tap((msg: string) => dialog.showErrors([msg])),\r\n        );\r\n    },\r\n    { functional: true, dispatch: false },\r\n);\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\ntype ErrorHandlerService = ProviderToken<{ handleError: (error: any, actionText: string) => any; }>;\r\n\r\n/**\r\n * Globaler Effect, der von `createErrorHandlerEffect` gemappte Fehler über den ErrorHandler anzeigt\r\n * Ist eine Factory, weil der ErrorHandler nicht im shared liegt.\r\n * Der Effect muss im AppModule registriert werden:\r\n * ```ts\r\n * EffectsModule.forRoot({ globalErrorHandlingEffect: globalErrorHandlingEffectFactory(ErrorHandlerService) })\r\n * ```\r\n */\r\nexport function globalErrorHandlingEffectFactory(errorHandlerType: ErrorHandlerService) {\r\n    return createEffect(\r\n        (actions$ = inject(Actions), errorHandler = inject(errorHandlerType)) => {\r\n            return actions$.pipe(\r\n                ofType(errorAction),\r\n                filter(({ handling }) => handling === 'messageBox'),\r\n                tap(({ error, actionText }) => errorHandler.handleError(error, actionText)),\r\n            );\r\n        },\r\n        { functional: true, dispatch: false },\r\n    );\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { HttpErrorResponse } from '@angular/common/http';\r\nimport { inject } from '@angular/core';\r\nimport { Actions, createEffect, CreateEffectMetadata, ofType } from '@ngrx/effects';\r\nimport { Action, ActionCreator, Creator } from '@ngrx/store';\r\nimport { Observable, OperatorFunction, pipe } from 'rxjs';\r\n\r\nimport { createDialogErrorEffect, createErrorHandlerEffect, ErrorParams } from './error-handling';\r\n\r\n\r\ntype EffectReturnType = Observable<Action> & CreateEffectMetadata;\r\n\r\n/**\r\n * Abkürzung von `createEffect` für den Standardfall, wenn man auf Actions reagiert\r\n * ```ts\r\n * loadList$ = createActionEffect(\r\n *     [listActions.init, apiActions.createSuccess],\r\n *     switchMap(() => this.webApi.getList()),\r\n * );\r\n * create$ = createActionEffect(\r\n *     listActions.create,\r\n *     showDialog(new CreateDialog()),\r\n *     switchMap(({ dto }) => this.webApi.create(dto)),\r\n * );\r\n * ```\r\n */\r\nexport function createActionEffect<T extends string, P extends Creator>(actions: ActionCreator<T, P> | ActionCreator<T, P>[], op1: OperatorFunction<ReturnType<P>, Action>): EffectReturnType;\r\nexport function createActionEffect<T extends string, P extends Creator, A>(actions: ActionCreator<T, P> | ActionCreator<T, P>[], op1: OperatorFunction<ReturnType<P>, A>, op2: OperatorFunction<A, Action>): EffectReturnType;\r\nexport function createActionEffect<T extends string, P extends Creator, A, B>(actions: ActionCreator<T, P> | ActionCreator<T, P>[], op1: OperatorFunction<ReturnType<P>, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, Action>): EffectReturnType;\r\nexport function createActionEffect<T extends string, P extends Creator, A, B, C>(actions: ActionCreator<T, P> | ActionCreator<T, P>[], op1: OperatorFunction<ReturnType<P>, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, Action>): EffectReturnType;\r\nexport function createActionEffect<T extends string, P extends Creator, A, B, C, D>(actions: ActionCreator<T, P> | ActionCreator<T, P>[], op1: OperatorFunction<ReturnType<P>, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, Action>): EffectReturnType;\r\nexport function createActionEffect<T extends string, P extends Creator, A, B, C, D, E>(actions: ActionCreator<T, P> | ActionCreator<T, P>[], op1: OperatorFunction<ReturnType<P>, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>, op6: OperatorFunction<E, Action>): EffectReturnType;\r\nexport function createActionEffect<T extends string, P extends Creator, A, B, C, D, E, F>(actions: ActionCreator<T, P> | ActionCreator<T, P>[], op1: OperatorFunction<ReturnType<P>, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>, op6: OperatorFunction<E, F>, op7: OperatorFunction<F, Action>): EffectReturnType;\r\nexport function createActionEffect<T extends string, P extends Creator, A, B, C, D, E, F, G>(actions: ActionCreator<T, P> | ActionCreator<T, P>[], op1: OperatorFunction<ReturnType<P>, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>, op6: OperatorFunction<E, F>, op7: OperatorFunction<F, G>, op8: OperatorFunction<G, Action>): EffectReturnType;\r\nexport function createActionEffect<T extends string, P extends Creator, A, B, C, D, E, F, G, H>(actions: ActionCreator<T, P> | ActionCreator<T, P>[], op1: OperatorFunction<ReturnType<P>, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>, op6: OperatorFunction<E, F>, op7: OperatorFunction<F, G>, op8: OperatorFunction<G, H>, op9: OperatorFunction<H, Action>): EffectReturnType;\r\nexport function createActionEffect<T extends string, P extends Creator, A, B, C, D, E, F, G, H, I>(actions: ActionCreator<T, P> | ActionCreator<T, P>[], op1: OperatorFunction<ReturnType<P>, A>, op2: OperatorFunction<A, B>, op3: OperatorFunction<B, C>, op4: OperatorFunction<C, D>, op5: OperatorFunction<D, E>, op6: OperatorFunction<E, F>, op7: OperatorFunction<F, G>, op8: OperatorFunction<G, H>, op9: OperatorFunction<H, I>, op10: OperatorFunction<I, Action>): EffectReturnType;\r\nexport function createActionEffect(actions: ActionCreator | ActionCreator[], ...operators: OperatorFunction<any, any>[]): EffectReturnType {\r\n    const actions$ = inject(Actions);\r\n    const actionList = Array.isArray(actions) ? actions : [actions];\r\n    const operatorsPipe = pipe(...operators as [OperatorFunction<Action, Action>]);\r\n    return createEffect(() => actions$.pipe(ofType(...actionList), operatorsPipe));\r\n}\r\n\r\n/**\r\n * @deprecated\r\n * Benutze `createActionEffect` statt `this.on`,\r\n * `createErrorHandlerEffect` statt `this.onError`\r\n * und `createDialogErrorEffect` statt `this.onDialogError`\r\n */\r\nexport abstract class EffectBase {\r\n    protected readonly actions$ = inject(Actions);\r\n\r\n    protected on<T extends string, P extends Creator>(\r\n        actions: ActionCreator<T, P> | ActionCreator<T, P>[],\r\n        fn: (obs$: Observable<ReturnType<P>>) => Observable<Action>,\r\n    ) {\r\n        return createActionEffect(actions, fn);\r\n    }\r\n\r\n    protected onError(action: ActionCreator<string, Creator<[HttpErrorResponse], { error: ErrorParams; }>>, actionText: string) {\r\n        return createErrorHandlerEffect(action, actionText, this.actions$);\r\n    }\r\n\r\n    protected onDialogError(action: ActionCreator<string, Creator<[HttpErrorResponse], { error: ErrorParams; }>>) {\r\n        return createDialogErrorEffect(action, this.actions$);\r\n    }\r\n}\r\n","import { inject } from '@angular/core';\r\nimport { ActionReducer } from '@ngrx/store';\r\nimport { LoggerService } from '@sowatech/shared/logger';\r\n\r\n/**\r\n * Meta Reducer fürs Loggen der Actions. Wird konfiguriert im AppModule:\r\n * ```ts\r\n * StoreModule.forRoot({}, { metaReducers: [loggingMetaReducer] }),\r\n * ```\r\n */\r\nexport function loggingMetaReducer(reducer: ActionReducer<unknown>): ActionReducer<unknown> {\r\n    const logger = inject(LoggerService);\r\n    return function (state, action) {\r\n        if (!action.type.startsWith('@ngrx/'))\r\n            logger.log(action.type);\r\n        return reducer(state, action);\r\n    };\r\n}\r\n","import { inject } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { Actions, ofType } from '@ngrx/effects';\r\nimport { ActionCreator, createSelector, Creator, MemoizedSelector, on } from '@ngrx/store';\r\nimport type { RefreshParams, RefreshResult } from '@sowatech/shared/ds-datasource';\r\nimport type { GridComponent } from '@sowatech/shared/swt-generic';\r\nimport { filter } from 'rxjs/operators';\r\n\r\nexport interface ExternalRefreshState<T> {\r\n    refreshResult: RefreshResult<T> | null;\r\n    loading: boolean;\r\n}\r\n\r\ntype Last<T extends readonly unknown[]> = T extends readonly [...infer _, infer L] ? L : never;\r\ntype OnFunction<State, Creators extends readonly ActionCreator[]> = typeof on<State, Creators>;\r\ntype OnReducer<State, Creators extends readonly ActionCreator[]> = Last<Parameters<OnFunction<State, Creators>>>;\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\ntype Id = any;\r\n\r\nexport class ExternalRefreshAdapter<T> {\r\n    /**\r\n     * Initial State für external Refresh.\r\n     * ```ts\r\n     * type State = ExternalRefreshState<MyEntity> & { loading: boolean };\r\n     * const initialState: State = adapter.getInitialState({ loading: false });\r\n     * ```\r\n     * @param extraState zusätzlicher State, der neben dem `refreshResult` abgelegt wird\r\n     */\r\n    public getInitialState<ExtraState>(extraState?: ExtraState): ExternalRefreshState<T> & ExtraState {\r\n        if (!extraState) extraState = {} as ExtraState;\r\n        return { ...extraState, refreshResult: null, loading: false };\r\n    }\r\n\r\n    /**\r\n     * Zum Updaten des Refresh Results.\r\n     * ```ts\r\n     * on(apiActions.loadSuccess, (state, { refreshResult }) => adapter.update(refreshResult, state)),\r\n     * ```\r\n     */\r\n    public update<State extends ExternalRefreshState<T>>(result: RefreshResult<T>, state: State): State {\r\n        if (isCsvExport(result.refreshParams))\r\n            return state;\r\n        let refreshResult = result;\r\n        if (state.refreshResult && isAggregateOnlyRefresh(result.refreshParams))\r\n            refreshResult = { ...state.refreshResult, aggregateResults: result.aggregateResults };\r\n        return { ...state, refreshResult };\r\n    }\r\n\r\n    /**\r\n     * Zum Updaten des Refresh Results über `externalRefreshProps`\r\n     * ```ts\r\n     * // Action\r\n     * 'Load Success': externalRefreshProps<MyEntity>(),\r\n     * // Reducer\r\n     * on(apiActions.loadSuccess, adapter.updateFromAction()),\r\n     * ```\r\n     */\r\n    public updateFromAction<State extends ExternalRefreshState<T>>(): OnReducer<State, ExternalRefreshResultAction<T>[]> {\r\n        return (state, action: ExternalRefreshResultProps<T>) => this.update(action.refreshResult, state);\r\n    }\r\n\r\n    /**\r\n     * Löscht das Refresh Result\r\n     */\r\n    public clear<State extends ExternalRefreshState<T>>(state: State): State {\r\n        return { ...state, refreshResult: null };\r\n    }\r\n\r\n    public setLoading<State extends ExternalRefreshState<T>>(loading: boolean, state: State) {\r\n        return { ...state, loading };\r\n    }\r\n\r\n    /**\r\n     * Zum Setzen von `loading`\r\n     * ```ts\r\n     * on(apiActions.loadSuccess, apiAction.loadFailure, adapter.setLoadingStatic(false)),\r\n     * ```\r\n     */\r\n    public setLoadingStatic<State extends ExternalRefreshState<T>>(loading: boolean) {\r\n        return (state: State) => this.setLoading(loading, state);\r\n    }\r\n\r\n    /**\r\n     * Setzt Loading auf `true`, wenn nicht nur für die Aggregate Params neu geladen wird.\r\n     * ```ts\r\n     * on(apiActions.load, (state, { refreshParams }) => adapter.startLoading(refreshParams, state)),\r\n     * ```\r\n     */\r\n    public startLoading<State extends ExternalRefreshState<T>>(refreshParams: RefreshParams, state: State) {\r\n        if (!isRegularRefresh(refreshParams))\r\n            return state;\r\n        return this.setLoading(true, state);\r\n    }\r\n\r\n    /**\r\n     * Gibt ein paar nützliche Selectors zurück:\r\n     */\r\n    public getSelectors() {\r\n        /**\r\n         * Gibt die aktuell geladenen Daten zurück\r\n         * ```ts\r\n         * const selectCurrentPage = createSelector(selectRefreshResult, result => selectList(result));\r\n         * ```\r\n         */\r\n        function selectList(state: ExternalRefreshState<T>): T[] {\r\n            if (!state.refreshResult) return [];\r\n            return state.refreshResult.data;\r\n        }\r\n\r\n        /**\r\n         * Holt ein geladenes Item anhand der ID\r\n         * ```ts\r\n         * const selectFocusedItem createSelector(\r\n         *     selectRefreshResult,\r\n         *     selectFocusedId,\r\n         *     (result, id) => selectItem(result, id)\r\n         * );\r\n         * ```\r\n         */\r\n        function selectItem(state: ExternalRefreshState<T>, id: Id) {\r\n            if (!state.refreshResult) return undefined;\r\n            const idField = state.refreshResult.refreshParams.idField as keyof T;\r\n            return selectList(state).find(item => item[idField] === id);\r\n        }\r\n\r\n        /**\r\n         * Gibt alle IDs der aktuell geladenen Daten zurück\r\n         * ```ts\r\n         * const selectPageIds = createSelector(selectRefreshResult, result => selectIds(result));\r\n         * ```\r\n         */\r\n        function selectIds(state: ExternalRefreshState<T>): Id[] {\r\n            if (!state.refreshResult) return [];\r\n            const idField = state.refreshResult.refreshParams.idField as keyof T;\r\n            return selectList(state).map(item => item[idField]);\r\n        }\r\n\r\n        return {\r\n            selectList,\r\n            selectItem,\r\n            selectIds,\r\n        };\r\n    }\r\n\r\n    /**\r\n     * Da der Store immutable ist, muss der Selector für die Datasource überschrieben werden.\r\n     * (SHANG-465)\r\n     */\r\n    public createRefreshResultSelector(selector: MemoizedSelector<ExternalRefreshState<T>, RefreshResult<T> | null>) {\r\n        return createSelector(selector, result => JSON.parse(JSON.stringify(result)));\r\n    }\r\n}\r\n\r\n/**\r\n * Erstellt einen Adapter für den Umgang mit serverseitig geladenen Collections.\r\n * ```ts\r\n * const adapter = createExternalRefreshAdapter<MyEntity>();\r\n *\r\n * type State = ExternalRefreshState<MyEntity>;\r\n *\r\n * const initialState: State = adapter.getInitialState();\r\n *\r\n * const myFeature = createFeature({\r\n *     name: 'myFeature',\r\n *     reducer: createReducer(\r\n *         initialState,\r\n *         on(apiActions.loadSuccess, adapter.updateFromAction()),\r\n *         on(actions.load, (state, { refreshParams }) => adapter.startLoading(refreshParams, state)),\r\n *         on(apiActions.loadSuccess, apiActions.loadFailure, adapter.setLoadingStatic(false)),\r\n *     ),\r\n *     extraSelectors(baseSelectors) {\r\n *         const selectRefreshResult = adapter.createRefreshResultSelector(baseSelectors.selectRefreshResult);\r\n *         return {\r\n *             selectRefreshResult,\r\n *         };\r\n *     },\r\n * });\r\n *\r\n * // Load Action\r\n * 'Load': externalRefreshParamsProps(),\r\n * // API Action\r\n * 'Load Success': externalRefreshResultProps<MyEntity>(),\r\n * ```\r\n */\r\nexport function createExternalRefreshAdapter<T>() {\r\n    return new ExternalRefreshAdapter<T>();\r\n}\r\n\r\nexport type ExternalRefreshResultProps<T> = { refreshResult: RefreshResult<T>; };\r\nexport type ExternalRefreshResultAction<T> = ActionCreator<string, Creator<[RefreshResult<T>], ExternalRefreshResultProps<T> & { type: string; }>>;\r\n\r\nexport function externalRefreshResultProps<T>() {\r\n    return (refreshResult: RefreshResult<T>): ExternalRefreshResultProps<T> => ({ refreshResult });\r\n}\r\n\r\nexport type ExternalRefreshParamsProps = { refreshParams: RefreshParams; };\r\nexport type ExternalRefreshParamsAction<Type extends string = string> = ActionCreator<Type, Creator<[RefreshParams], ExternalRefreshParamsProps & { type: Type; }>>;\r\n\r\nexport function externalRefreshParamsProps() {\r\n    return (refreshParams: RefreshParams): ExternalRefreshParamsProps => ({ refreshParams: JSON.parse(JSON.stringify(refreshParams)) });\r\n}\r\n\r\nexport interface DatasourceCsvExportEffectOptions {\r\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n    action: ExternalRefreshResultAction<any>;\r\n    grid: () => GridComponent | null | undefined;\r\n}\r\n\r\n/**\r\n * Ermöglicht CSV-Downloads mit External Refresh über NGRX.\r\n * ```ts\r\n * constructor() {\r\n *     // ...\r\n *     handleCsvExportAction({ action: myActions.loadSuccess, grid: () => this.grid() });\r\n * }\r\n * ```\r\n */\r\nexport function handleCsvExportAction(options: DatasourceCsvExportEffectOptions) {\r\n    inject(Actions).pipe(\r\n        ofType(options.action),\r\n        filter(({ refreshResult }) => isCsvExport(refreshResult.refreshParams)),\r\n        takeUntilDestroyed(),\r\n    ).subscribe(({ refreshResult }) => {\r\n        const grid = options.grid();\r\n        if (!grid) return;\r\n        grid.downloadCsvWithData(refreshResult.data);\r\n    });\r\n}\r\n\r\nfunction isRegularRefresh(refreshParams: RefreshParams) {\r\n    return !refreshParams.mode || refreshParams.mode === 'page';\r\n}\r\n\r\nfunction isAggregateOnlyRefresh(refreshParams: RefreshParams) {\r\n    return refreshParams.mode === 'aggregate-data' || refreshParams.aggregateParam.aggregatesOnly;\r\n}\r\n\r\nfunction isCsvExport(refreshParams: RefreshParams) {\r\n    return refreshParams.mode === 'csv-export';\r\n}\r\n","import { Directive, effect, inject, input, untracked } from '@angular/core';\r\nimport { Store } from '@ngrx/store';\r\nimport { DatasourceComponent, RefreshType } from '@sowatech/shared/ds-datasource';\r\n\r\nimport { ExternalRefreshParamsAction } from './external-refresh-adapter';\r\n\r\n@Directive({\r\n    standalone: true,\r\n    selector: 'ds-datasource[externalRefreshAction][externalRefreshResult]'\r\n})\r\nexport class ExternalRefreshActionDirective {\r\n    private readonly datasource = inject(DatasourceComponent);\r\n    private readonly store = inject(Store);\r\n\r\n    public readonly externalRefreshAction = input.required<ExternalRefreshParamsAction>();\r\n\r\n    constructor() {\r\n        effect(() => {\r\n            const action = this.externalRefreshAction();\r\n            this.datasource.refreshResultRequested.subscribe(params => this.store.dispatch(action(params)));\r\n            untracked(() => this.datasource.refreshType.set(RefreshType.externalRefreshInput));\r\n        });\r\n    }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}