@gpa-gemstone/react-interactive
Version: 
Interactive UI Components for GPA products
508 lines (507 loc) • 30.6 kB
JavaScript
"use strict";
// ******************************************************************************************************
//  GenericSlice.tsx - Gbtc
//
//  Copyright © 2020, Grid Protection Alliance.  All Rights Reserved.
//
//  Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See
//  the NOTICE file distributed with this work for additional information regarding copyright ownership.
//  The GPA licenses this file to you under the MIT License (MIT), the "License"; you may not use this
//  file except in compliance with the License. You may obtain a copy of the License at:
//
//      http://opensource.org/licenses/MIT
//
//  Unless agreed to in writing, the subject software distributed under the License is distributed on an
//  "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the
//  License for the specific language governing permissions and limitations.
//
//  Code Modification History:
//  ----------------------------------------------------------------------------------------------------
//  11/04/2020 - Billy Ernest
//       Generated original version of source code.
// ******************************************************************************************************
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
    o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
    if (mod && mod.__esModule) return mod;
    var result = {};
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    __setModuleDefault(result, mod);
    return result;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (g && (g = 0, op[0] && (_ = 0)), _) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var toolkit_1 = require("@reduxjs/toolkit");
var _ = __importStar(require("lodash"));
var GenericController_1 = __importDefault(require("./GenericController"));
/**
 * A generic class providing functionalities related to a slice of data.
 */
var GenericSlice = /** @class */ (function () {
    /**
     * Creates a new GenericSlice of type T, which can be used to perform basic CRUD operations against
     * a specified web api.
     * @typeParam T - Model of Generic Slice
     * @param {string} name - string defining the name of the slice in the store
     * @param {string} apiPath - string containing relative path to web api
     * @param {keyof T} defaultSort - string showing default sort field
     * @param {boolean} ascending - (optional) default sort direction - defaults to true
     * @returns a new GenericSlice<T>
     */
    function GenericSlice(name, apiPath, defaultSort, ascending, options) {
        if (ascending === void 0) { ascending = true; }
        if (options === void 0) { options = null; }
        var _this = this;
        this.Name = "";
        this.APIPath = "";
        this.Data = function (state) { return state[_this.Name].Data; };
        this.Error = function (state) { return state[_this.Name].Error; };
        this.Datum = function (state, id) { return state[_this.Name].Data.find(function (d) { return d.ID === id; }); };
        this.Status = function (state) { return state[_this.Name].Status; };
        this.SortField = function (state) { return state[_this.Name].SortField; };
        this.Ascending = function (state) { return state[_this.Name].Ascending; };
        this.ParentID = function (state) { return state[_this.Name].ParentID; };
        this.SearchResults = function (state) { return state[_this.Name].SearchResults; };
        this.SearchStatus = function (state) { return state[_this.Name].SearchStatus; };
        this.SearchFilters = function (state) { return state[_this.Name].Filter; };
        this.PagedResults = function (state) { return state[_this.Name].PagedData; };
        this.PagedStatus = function (state) { return state[_this.Name].PagedStatus; };
        this.PagedFilters = function (state) { return state[_this.Name].PagedFilter; };
        this.PagedSortField = function (state) { return state[_this.Name].PagedSortField; };
        this.PagedAscending = function (state) { return state[_this.Name].PagedAscending; };
        this.CurrentPage = function (state) { return state[_this.Name].CurrentPage; };
        this.TotalPages = function (state) { return state[_this.Name].TotalPages; };
        this.TotalRecords = function (state) { return state[_this.Name].TotalRecords; };
        this.Name = name;
        this.APIPath = apiPath;
        this.fetchHandle = null;
        this.searchHandle = null;
        this.pageHandle = null;
        this.actionDependency = null;
        this.controller = new GenericController_1.default(apiPath, defaultSort, ascending);
        this.actionPendingDependency = null;
        this.actionFullfilledDependency = null;
        this.actionErrorDependency = null;
        if (options !== null && options.ActionDependencies !== undefined)
            this.actionDependency = options.ActionDependencies;
        if (options !== null && options.ActionPendingDependencies !== undefined)
            this.actionPendingDependency = options.ActionPendingDependencies;
        if (options !== null && options.ActionFullfilledDependencies !== undefined)
            this.actionFullfilledDependency = options.ActionFullfilledDependencies;
        if (options !== null && options.ActionErrorDependencies !== undefined)
            this.actionErrorDependency = options.ActionErrorDependencies;
        var additionalThunks = {};
        var additionalBuilder = function () { _.noop(); };
        if (options !== null && options.AddionalThunks !== undefined) {
            options.AddionalThunks.forEach(function (thunk) {
                additionalThunks[thunk.Name] = (0, toolkit_1.createAsyncThunk)("".concat(name, "/").concat(thunk.Name), function (arg_1, _a) { return __awaiter(_this, [arg_1, _a], void 0, function (arg, _b) {
                    var state, handle;
                    var getState = _b.getState;
                    return __generator(this, function (_c) {
                        switch (_c.label) {
                            case 0:
                                state = getState()[name];
                                if (this.actionDependency !== null)
                                    this.actionDependency(state, "".concat(name, "/").concat(thunk.Name), arg);
                                handle = thunk.Fetch(state, arg);
                                if (!(handle != null)) return [3 /*break*/, 2];
                                return [4 /*yield*/, handle];
                            case 1: return [2 /*return*/, _c.sent()];
                            case 2: return [2 /*return*/];
                        }
                    });
                }); });
            });
            additionalBuilder = function (builder) {
                var _a;
                (_a = options.AddionalThunks) === null || _a === void 0 ? void 0 : _a.forEach(function (thunk) {
                    builder.addCase(fetch.fulfilled, function (state, action) {
                        if (thunk.OnSuccess !== undefined)
                            thunk.OnSuccess(state, action.meta.requestId, action.payload, action.meta.arg);
                        if (_this.actionFullfilledDependency !== null)
                            _this.actionFullfilledDependency(state, "".concat(name, "/").concat(thunk.Name), action.meta.arg, action.meta.requestId);
                    });
                    builder.addCase(fetch.pending, function (state, action) {
                        if (thunk.OnPending !== undefined)
                            thunk.OnPending(state, action.meta.requestId, action.meta.arg);
                        if (_this.actionPendingDependency !== null)
                            _this.actionPendingDependency(state, "".concat(name, "/").concat(thunk.Name), action.meta.arg, action.meta.requestId);
                    });
                    builder.addCase(fetch.rejected, function (state, action) {
                        if (thunk.OnFailure !== undefined)
                            thunk.OnFailure(state, action.meta.requestId, action.payload, action.meta.arg);
                        if (_this.actionErrorDependency !== null)
                            _this.actionErrorDependency(state, "".concat(name, "/").concat(thunk.Name), action.meta.arg, action.meta.requestId);
                    });
                });
            };
        }
        var fetch = (0, toolkit_1.createAsyncThunk)("".concat(name, "/Fetch").concat(name), function (parentID_1, _a) { return __awaiter(_this, [parentID_1, _a], void 0, function (parentID, _b) {
            var state, handle;
            var signal = _b.signal, getState = _b.getState;
            return __generator(this, function (_c) {
                switch (_c.label) {
                    case 0:
                        state = getState()[name];
                        if (this.actionDependency !== null)
                            this.actionDependency(state, "".concat(name, "/Fetch").concat(name), parentID);
                        if (this.fetchHandle != null && this.fetchHandle.abort != null)
                            this.fetchHandle.abort('Prev');
                        handle = this.controller.Fetch(parentID, state.SortField, state.Ascending);
                        this.fetchHandle = handle;
                        signal.addEventListener('abort', function () {
                            if (handle.abort !== undefined)
                                handle.abort();
                        });
                        return [4 /*yield*/, handle];
                    case 1: return [2 /*return*/, _c.sent()];
                }
            });
        }); });
        var dBAction = (0, toolkit_1.createAsyncThunk)("".concat(name, "/DBAction").concat(name), function (args_1, _a) { return __awaiter(_this, [args_1, _a], void 0, function (args, _b) {
            var handle, state;
            var signal = _b.signal, getState = _b.getState;
            return __generator(this, function (_c) {
                switch (_c.label) {
                    case 0:
                        handle = this.controller.DBAction(args.verb, args.record);
                        state = getState()[name];
                        if (this.actionDependency !== null)
                            this.actionDependency(state, "".concat(name, "/DBAction").concat(name), args);
                        signal.addEventListener('abort', function () {
                            if (handle.abort !== undefined)
                                handle.abort();
                        });
                        return [4 /*yield*/, handle];
                    case 1: return [2 /*return*/, _c.sent()];
                }
            });
        }); });
        var dBSearch = (0, toolkit_1.createAsyncThunk)("".concat(name, "/Search").concat(name), function (args_1, _a) { return __awaiter(_this, [args_1, _a], void 0, function (args, _b) {
            var state, sortfield, asc, handle;
            var _c;
            var getState = _b.getState, signal = _b.signal;
            return __generator(this, function (_d) {
                switch (_d.label) {
                    case 0:
                        state = getState()[name];
                        if (this.actionDependency !== null)
                            this.actionDependency(state, "".concat(name, "/Search").concat(name), args);
                        sortfield = args.sortField;
                        asc = args.ascending;
                        sortfield = sortfield === undefined ? state.SortField : sortfield;
                        asc = asc === undefined ? state.Ascending : asc;
                        if (this.searchHandle != null && this.searchHandle.abort != null)
                            this.searchHandle.abort('Prev');
                        handle = this.controller.DBSearch(args.filter, sortfield, asc, (_c = state.ParentID) !== null && _c !== void 0 ? _c : undefined);
                        this.searchHandle = handle;
                        signal.addEventListener('abort', function () {
                            if (handle.abort !== undefined)
                                handle.abort();
                        });
                        return [4 /*yield*/, handle];
                    case 1: return [2 /*return*/, _d.sent()];
                }
            });
        }); });
        var dBSort = (0, toolkit_1.createAsyncThunk)("".concat(name, "/DBSort").concat(name), function (args_1, _a) { return __awaiter(_this, [args_1, _a], void 0, function (args, _b) {
            var state, sortFld, asc, handle;
            var signal = _b.signal, getState = _b.getState, dispatch = _b.dispatch;
            return __generator(this, function (_c) {
                switch (_c.label) {
                    case 0:
                        state = getState()[name];
                        if (this.actionDependency !== null)
                            this.actionDependency(state, "".concat(name, "/DBSort").concat(name), args);
                        sortFld = state.SortField;
                        asc = state.Ascending;
                        if (state.SortField === args.SortField)
                            asc = !args.Ascending;
                        else
                            sortFld = args.SortField;
                        dispatch(dBSearch({ filter: state.Filter, sortField: sortFld, ascending: asc }));
                        if (this.fetchHandle != null && this.fetchHandle.abort != null)
                            this.fetchHandle.abort('Prev');
                        handle = this.controller.Fetch(state.ParentID, sortFld, asc);
                        this.fetchHandle = handle;
                        signal.addEventListener('abort', function () {
                            if (handle.abort !== undefined)
                                handle.abort();
                        });
                        return [4 /*yield*/, handle];
                    case 1: return [2 /*return*/, _c.sent()];
                }
            });
        }); });
        var dBPage = (0, toolkit_1.createAsyncThunk)("".concat(name, "/Page").concat(name), function (args_1, _a) { return __awaiter(_this, [args_1, _a], void 0, function (args, _b) {
            var state, sortfield, asc, page, filts, handle;
            var _c, _d, _e;
            var getState = _b.getState, signal = _b.signal;
            return __generator(this, function (_f) {
                switch (_f.label) {
                    case 0:
                        state = getState()[name];
                        if (this.actionDependency !== null)
                            this.actionDependency(state, "".concat(name, "/Page").concat(name), args);
                        sortfield = args.sortField;
                        asc = args.ascending;
                        page = (_c = args.page) !== null && _c !== void 0 ? _c : 0;
                        filts = (_d = args.filter) !== null && _d !== void 0 ? _d : state.Filter;
                        sortfield = sortfield === undefined ? state.PagedSortField : sortfield;
                        asc = asc === undefined ? state.PagedAscending : asc;
                        if (this.pageHandle != null && this.pageHandle.abort != null)
                            this.pageHandle.abort('Prev');
                        handle = this.controller.PagedSearch(filts, sortfield, asc, page, (_e = state.ParentID) !== null && _e !== void 0 ? _e : undefined);
                        this.pageHandle = handle;
                        signal.addEventListener('abort', function () {
                            if (handle.abort !== undefined)
                                handle.abort();
                        });
                        return [4 /*yield*/, handle];
                    case 1: return [2 /*return*/, _f.sent()];
                }
            });
        }); });
        var setChanged = (0, toolkit_1.createAsyncThunk)("".concat(name, "/SetChanged").concat(name), function (args_1, _a) { return __awaiter(_this, [args_1, _a], void 0, function (args, _b) { return __generator(this, function (_c) {
            return [2 /*return*/];
        }); }); });
        var slice = (0, toolkit_1.createSlice)({
            name: this.Name,
            initialState: {
                Status: 'uninitiated',
                SearchStatus: 'uninitiated',
                Error: null,
                Data: [],
                SortField: defaultSort,
                Ascending: ascending,
                ParentID: null,
                SearchResults: [],
                Filter: [],
                ActiveFetchID: [],
                ActiveSearchID: [],
                PagedStatus: 'uninitiated',
                ActivePagedID: [],
                CurrentPage: 0,
                TotalPages: 0,
                TotalRecords: 0,
                PagedData: [],
                PagedSortField: defaultSort,
                PagedAscending: ascending,
                PagedFilter: []
            },
            reducers: {},
            extraReducers: function (builder) {
                builder.addCase(fetch.fulfilled, function (state, action) {
                    state.ActiveFetchID = state.ActiveFetchID.filter(function (id) { return id !== action.meta.requestId; });
                    state.Status = 'idle';
                    state.Error = null;
                    state.Data = action.payload;
                    if (_this.actionFullfilledDependency !== null)
                        _this.actionFullfilledDependency(state, "".concat(name, "/Fetch").concat(name), action.meta.arg, action.meta.requestId);
                });
                builder.addCase(fetch.pending, function (state, action) {
                    if (state.ParentID !== (action.meta.arg == null ? null : action.meta.arg))
                        state.SearchStatus = 'changed';
                    state.ParentID = (action.meta.arg == null ? null : action.meta.arg);
                    state.Status = 'loading';
                    state.ActiveFetchID.push(action.meta.requestId);
                    if (_this.actionPendingDependency !== null)
                        _this.actionPendingDependency(state, "".concat(name, "/Fetch").concat(name), action.meta.arg, action.meta.requestId);
                });
                builder.addCase(fetch.rejected, function (state, action) {
                    state.ActiveFetchID = state.ActiveFetchID.filter(function (id) { return id !== action.meta.requestId; });
                    if (state.ActiveFetchID.length > 0)
                        return;
                    state.Status = 'error';
                    state.Error = {
                        Message: (action.error.message == null ? '' : action.error.message),
                        Verb: 'FETCH',
                        Time: new Date().toString()
                    };
                    if (_this.actionErrorDependency !== null)
                        _this.actionErrorDependency(state, "".concat(name, "/Fetch").concat(name), action.meta.arg, action.meta.requestId);
                });
                builder.addCase(dBAction.pending, function (state, action) {
                    state.Status = 'loading';
                    if (_this.actionPendingDependency !== null)
                        _this.actionPendingDependency(state, "".concat(name, "/DBAction").concat(name), action.meta.arg, action.meta.requestId);
                });
                builder.addCase(dBAction.rejected, function (state, action) {
                    state.Status = 'error';
                    state.Error = {
                        Message: (action.error.message == null ? '' : action.error.message),
                        Verb: action.meta.arg.verb,
                        Time: new Date().toString()
                    };
                    if (_this.actionErrorDependency !== null)
                        _this.actionErrorDependency(state, "".concat(name, "/DBAction").concat(name), action.meta.arg, action.meta.requestId);
                });
                builder.addCase(dBAction.fulfilled, function (state, action) {
                    state.Status = 'changed';
                    state.SearchStatus = 'changed';
                    state.Error = null;
                    if (_this.actionFullfilledDependency !== null)
                        _this.actionFullfilledDependency(state, "".concat(name, "/DBAction").concat(name), action.meta.arg, action.meta.requestId);
                });
                builder.addCase(dBSearch.pending, function (state, action) {
                    state.SearchStatus = 'loading';
                    state.ActiveSearchID.push(action.meta.requestId);
                    if (_this.actionPendingDependency !== null)
                        _this.actionPendingDependency(state, "".concat(name, "/Search").concat(name), action.meta.arg, action.meta.requestId);
                });
                builder.addCase(dBSearch.rejected, function (state, action) {
                    state.ActiveSearchID = state.ActiveSearchID.filter(function (id) { return id !== action.meta.requestId; });
                    if (state.ActiveSearchID.length > 0)
                        return;
                    state.SearchStatus = 'error';
                    state.Error = {
                        Message: (action.error.message == null ? '' : action.error.message),
                        Verb: 'SEARCH',
                        Time: new Date().toString()
                    };
                    if (_this.actionErrorDependency !== null)
                        _this.actionErrorDependency(state, "".concat(name, "/Search").concat(name), action.meta.arg, action.meta.requestId);
                });
                builder.addCase(dBSearch.fulfilled, function (state, action) {
                    state.ActiveSearchID = state.ActiveSearchID.filter(function (id) { return id !== action.meta.requestId; });
                    state.SearchStatus = 'idle';
                    state.SearchResults = action.payload;
                    state.Filter = action.meta.arg.filter;
                    if (_this.actionFullfilledDependency !== null)
                        _this.actionFullfilledDependency(state, "".concat(name, "/Search").concat(name), action.meta.arg, action.meta.requestId);
                });
                builder.addCase(dBPage.pending, function (state, action) {
                    state.PagedStatus = 'loading';
                    state.ActivePagedID.push(action.meta.requestId);
                    if (_this.actionPendingDependency !== null)
                        _this.actionPendingDependency(state, "".concat(name, "/Page").concat(name), action.meta.arg, action.meta.requestId);
                });
                builder.addCase(dBPage.rejected, function (state, action) {
                    state.ActivePagedID = state.ActivePagedID.filter(function (id) { return id !== action.meta.requestId; });
                    if (state.ActivePagedID.length > 0)
                        return;
                    state.PagedStatus = 'error';
                    state.Error = {
                        Message: (action.error.message == null ? '' : action.error.message),
                        Verb: 'PAGE',
                        Time: new Date().toString()
                    };
                    if (_this.actionErrorDependency !== null)
                        _this.actionErrorDependency(state, "".concat(name, "/Page").concat(name), action.meta.arg, action.meta.requestId);
                });
                builder.addCase(dBPage.fulfilled, function (state, action) {
                    state.ActivePagedID = state.ActivePagedID.filter(function (id) { return id !== action.meta.requestId; });
                    state.PagedStatus = 'idle';
                    state.TotalPages = action.payload.NumberOfPages;
                    state.SearchResults = JSON.parse(action.payload.Data);
                    if (action.meta.arg.filter != null)
                        state.Filter = action.meta.arg.filter;
                    if (action.meta.arg.page !== undefined)
                        state.CurrentPage = action.meta.arg.page;
                    state.TotalRecords = action.payload.TotalRecords;
                    if (_this.actionFullfilledDependency !== null)
                        _this.actionFullfilledDependency(state, "".concat(name, "/Page").concat(name), action.meta.arg, action.meta.requestId);
                });
                builder.addCase(dBSort.pending, function (state, action) {
                    state.Status = 'loading';
                    state.ActiveFetchID.push(action.meta.requestId);
                    if (_this.actionPendingDependency !== null)
                        _this.actionPendingDependency(state, "".concat(name, "/DBSort").concat(name), action.meta.arg, action.meta.requestId);
                });
                builder.addCase(dBSort.rejected, function (state, action) {
                    state.ActiveFetchID = state.ActiveFetchID.filter(function (id) { return id !== action.meta.requestId; });
                    if (state.ActiveFetchID.length > 0)
                        return;
                    state.Status = 'error';
                    state.Error = {
                        Message: (action.error.message == null ? '' : action.error.message),
                        Verb: 'FETCH',
                        Time: new Date().toString()
                    };
                    if (_this.actionErrorDependency !== null)
                        _this.actionErrorDependency(state, "".concat(name, "/DBSort").concat(name), action.meta.arg, action.meta.requestId);
                });
                builder.addCase(dBSort.fulfilled, function (state, action) {
                    state.ActiveFetchID = state.ActiveFetchID.filter(function (id) { return id !== action.meta.requestId; });
                    state.Status = 'idle';
                    state.Error = null;
                    state.Data = action.payload;
                    if (state.SortField === action.meta.arg.SortField)
                        state.Ascending = !state.Ascending;
                    else
                        state.SortField = action.meta.arg.SortField;
                    if (_this.actionFullfilledDependency !== null)
                        _this.actionFullfilledDependency(state, "".concat(name, "/DBSort").concat(name), action.meta.arg, action.meta.requestId);
                });
                builder.addCase(setChanged.pending, function (state) {
                    state.Status = 'changed';
                    state.SearchStatus = 'changed';
                });
                additionalBuilder(builder);
            }
        });
        this.AdditionalThunk = additionalThunks;
        this.Fetch = fetch;
        this.DBAction = dBAction;
        this.Slice = slice;
        this.DBSearch = dBSearch;
        this.PagedSearch = dBPage;
        this.Sort = dBSort;
        this.Reducer = slice.reducer;
        this.SetChanged = setChanged;
    }
    return GenericSlice;
}());
exports.default = GenericSlice;