UNPKG

@paddls/ngx-easy-table

Version:
119 lines 16.6 kB
import { Pipe } from "@angular/core"; import * as i0 from "@angular/core"; import * as i1 from "./pagination.service"; const LARGE_NUMBER = Number.MAX_SAFE_INTEGER; export class PaginatePipe { constructor(service) { this.service = service; // store the values from the last time the pipe was invoked this.state = {}; } transform(collection, args) { // When an observable is passed through the AsyncPipe, it will output // `null` until the subscription resolves. In this case, we want to // use the cached data from the `state` object to prevent the NgFor // from flashing empty until the real values arrive. if (!(collection instanceof Array)) { let _id = args.id || this.service.defaultId(); if (this.state[_id]) { return this.state[_id].slice; } else { return collection; } } let serverSideMode = args.totalItems && args.totalItems !== collection.length; let instance = this.createInstance(collection, args); let id = instance.id; let start, end; let perPage = instance.itemsPerPage; let emitChange = this.service.register(instance); if (!serverSideMode && collection instanceof Array) { perPage = +perPage || LARGE_NUMBER; start = (instance.currentPage - 1) * perPage; end = start + perPage; let isIdentical = this.stateIsIdentical(id, collection, start, end); if (isIdentical) { return this.state[id].slice; } else { let slice = collection.slice(start, end); this.saveState(id, collection, slice, start, end); this.service.change.emit(id); return slice; } } else { if (emitChange) { this.service.change.emit(id); } // save the state for server-side collection to avoid null // flash as new data loads. this.saveState(id, collection, collection, start, end); return collection; } } /** * Create an PaginationInstance object, using defaults for any optional properties not supplied. */ createInstance(collection, config) { this.checkConfig(config); return { id: config.id != null ? config.id : this.service.defaultId(), itemsPerPage: Number(config.itemsPerPage) || 0, currentPage: Number(config.currentPage) || 1, totalItems: Number(config.totalItems) || collection.length }; } /** * Ensure the argument passed to the filter contains the required properties. */ checkConfig(config) { const required = ['itemsPerPage', 'currentPage']; const missing = required.filter(prop => !(prop in config)); if (0 < missing.length) { throw new Error(`PaginatePipe: Argument is missing the following required properties: ${missing.join(', ')}`); } } /** * To avoid returning a brand new array each time the pipe is run, we store the state of the sliced * array for a given id. This means that the next time the pipe is run on this collection & id, we just * need to check that the collection, start and end points are all identical, and if so, return the * last sliced array. */ saveState(id, collection, slice, start, end) { this.state[id] = { collection, size: collection.length, slice, start, end }; } /** * For a given id, returns true if the collection, size, start and end values are identical. */ stateIsIdentical(id, collection, start, end) { let state = this.state[id]; if (!state) { return false; } let isMetaDataIdentical = state.size === collection.length && state.start === start && state.end === end; if (!isMetaDataIdentical) { return false; } return state.slice.every((element, index) => element === collection[start + index]); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PaginatePipe, deps: [{ token: i1.PaginationService }], target: i0.ɵɵFactoryTarget.Pipe }); } static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: PaginatePipe, name: "paginate", pure: false }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PaginatePipe, decorators: [{ type: Pipe, args: [{ name: 'paginate', pure: false }] }], ctorParameters: function () { return [{ type: i1.PaginationService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGUucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1lYXN5LXRhYmxlL3NyYy9saWIvZmVhdHVyZXMvcGFnaW5hdGlvbi9wYWdpbmF0ZS5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7OztBQUluQyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7QUF1QjdDLE1BQU0sT0FBTyxZQUFZO0lBS3JCLFlBQW9CLE9BQTBCO1FBQTFCLFlBQU8sR0FBUCxPQUFPLENBQW1CO1FBSDlDLDJEQUEyRDtRQUNuRCxVQUFLLEdBQWdDLEVBQUUsQ0FBQztJQUdoRCxDQUFDO0lBRU0sU0FBUyxDQUE2QixVQUFhLEVBQUUsSUFBc0I7UUFFOUUscUVBQXFFO1FBQ3JFLG1FQUFtRTtRQUNuRSxtRUFBbUU7UUFDbkUsb0RBQW9EO1FBQ3BELElBQUksQ0FBQyxDQUFDLFVBQVUsWUFBWSxLQUFLLENBQUMsRUFBRTtZQUNoQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDOUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNqQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBVSxDQUFDO2FBQ3JDO2lCQUFNO2dCQUNILE9BQU8sVUFBVSxDQUFDO2FBQ3JCO1NBQ0o7UUFFRCxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUM5RSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNyRCxJQUFJLEVBQUUsR0FB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RSxHQUFXO1FBQ3ZHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUc7WUFDYixVQUFVO1lBQ1YsSUFBSSxFQUFFLFVBQVUsQ0FBQyxNQUFNO1lBQ3ZCLEtBQUs7WUFDTCxLQUFLO1lBQ0wsR0FBRztTQUNOLENBQUM7SUFDTixDQUFDO0lBRUQ7O09BRUc7SUFDSyxnQkFBZ0IsQ0FBQyxFQUFVLEVBQUUsVUFBMEIsRUFBRSxLQUFhLEVBQUUsR0FBVztRQUN2RixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDUixPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUNELElBQUksbUJBQW1CLEdBQUcsS0FBSyxDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsTUFBTTtZQUN0RCxLQUFLLENBQUMsS0FBSyxLQUFLLEtBQUs7WUFDckIsS0FBSyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUM7UUFFdEIsSUFBRyxDQUFDLG1CQUFtQixFQUFFO1lBQ3JCLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBRUQsT0FBUSxLQUFLLENBQUMsS0FBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEtBQUssVUFBVSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3hHLENBQUM7OEdBdEhRLFlBQVk7NEdBQVosWUFBWTs7MkZBQVosWUFBWTtrQkFKeEIsSUFBSTttQkFBQztvQkFDRixJQUFJLEVBQUUsVUFBVTtvQkFDaEIsSUFBSSxFQUFFLEtBQUs7aUJBQ2QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1BpcGV9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge1BhZ2luYXRpb25TZXJ2aWNlfSBmcm9tIFwiLi9wYWdpbmF0aW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7UGFnaW5hdGlvbkluc3RhbmNlSW50ZXJmYWNlfSBmcm9tICcuL2ludGVyZmFjZXMvcGFnaW5hdGlvbi1pbnN0YW5jZS5pbnRlcmZhY2UnO1xuXG5jb25zdCBMQVJHRV9OVU1CRVIgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvbjxUPiA9IFRbXSB8IFJlYWRvbmx5QXJyYXk8VD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGVQaXBlQXJncyB7XG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgaXRlbXNQZXJQYWdlPzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIGN1cnJlbnRQYWdlPzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIHRvdGFsSXRlbXM/OiBzdHJpbmcgfCBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZVN0YXRlIHtcbiAgICBjb2xsZWN0aW9uOiBBcnJheUxpa2U8YW55PjtcbiAgICBzaXplOiBudW1iZXI7XG4gICAgc3RhcnQ6IG51bWJlcjtcbiAgICBlbmQ6IG51bWJlcjtcbiAgICBzbGljZTogQXJyYXlMaWtlPGFueT47XG59XG5cbkBQaXBlKHtcbiAgICBuYW1lOiAncGFnaW5hdGUnLFxuICAgIHB1cmU6IGZhbHNlXG59KVxuZXhwb3J0IGNsYXNzIFBhZ2luYXRlUGlwZSB7XG5cbiAgICAvLyBzdG9yZSB0aGUgdmFsdWVzIGZyb20gdGhlIGxhc3QgdGltZSB0aGUgcGlwZSB3YXMgaW52b2tlZFxuICAgIHByaXZhdGUgc3RhdGU6IHsgW2lkOiBzdHJpbmddOiBQaXBlU3RhdGUgfSA9IHt9O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBzZXJ2aWNlOiBQYWdpbmF0aW9uU2VydmljZSkge1xuICAgIH1cblxuICAgIHB1YmxpYyB0cmFuc2Zvcm08VCwgVSBleHRlbmRzIENvbGxlY3Rpb248VD4+KGNvbGxlY3Rpb246IFUsIGFyZ3M6IFBhZ2luYXRlUGlwZUFyZ3MpOiBVIHtcblxuICAgICAgICAvLyBXaGVuIGFuIG9ic2VydmFibGUgaXMgcGFzc2VkIHRocm91Z2ggdGhlIEFzeW5jUGlwZSwgaXQgd2lsbCBvdXRwdXRcbiAgICAgICAgLy8gYG51bGxgIHVudGlsIHRoZSBzdWJzY3JpcHRpb24gcmVzb2x2ZXMuIEluIHRoaXMgY2FzZSwgd2Ugd2FudCB0b1xuICAgICAgICAvLyB1c2UgdGhlIGNhY2hlZCBkYXRhIGZyb20gdGhlIGBzdGF0ZWAgb2JqZWN0IHRvIHByZXZlbnQgdGhlIE5nRm9yXG4gICAgICAgIC8vIGZyb20gZmxhc2hpbmcgZW1wdHkgdW50aWwgdGhlIHJlYWwgdmFsdWVzIGFycml2ZS5cbiAgICAgICAgaWYgKCEoY29sbGVjdGlvbiBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgICAgICAgbGV0IF9pZCA9IGFyZ3MuaWQgfHwgdGhpcy5zZXJ2aWNlLmRlZmF1bHRJZCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGVbX2lkXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlW19pZF0uc2xpY2UgYXMgVTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2VydmVyU2lkZU1vZGUgPSBhcmdzLnRvdGFsSXRlbXMgJiYgYXJncy50b3RhbEl0ZW1zICE9PSBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgICAgICAgbGV0IGluc3RhbmNlID0gdGhpcy5jcmVhdGVJbnN0YW5jZShjb2xsZWN0aW9uLCBhcmdzKTtcbiAgICAgICAgbGV0IGlkID0gaW5zdGFuY2UuaWQ7XG5cbiAgICAgICAgbGV0IHN0YXJ0LCBlbmQ7XG4gICAgICAgIGxldCBwZXJQYWdlID0gaW5zdGFuY2UuaXRlbXNQZXJQYWdlO1xuXG4gICAgICAgIGxldCBlbWl0Q2hhbmdlID0gdGhpcy5zZXJ2aWNlLnJlZ2lzdGVyKGluc3RhbmNlKTtcblxuICAgICAgICBpZiAoIXNlcnZlclNpZGVNb2RlICYmIGNvbGxlY3Rpb24gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgcGVyUGFnZSA9ICtwZXJQYWdlIHx8IExBUkdFX05VTUJFUjtcbiAgICAgICAgICAgIHN0YXJ0ID0gKGluc3RhbmNlLmN1cnJlbnRQYWdlIC0gMSkgKiBwZXJQYWdlO1xuICAgICAgICAgICAgZW5kID0gc3RhcnQgKyBwZXJQYWdlO1xuXG4gICAgICAgICAgICBsZXQgaXNJZGVudGljYWwgPSB0aGlzLnN0YXRlSXNJZGVudGljYWwoaWQhLCBjb2xsZWN0aW9uLCBzdGFydCwgZW5kKTtcbiAgICAgICAgICAgIGlmIChpc0lkZW50aWNhbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlW2lkIV0uc2xpY2UgYXMgVTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHNsaWNlID0gY29sbGVjdGlvbi5zbGljZShzdGFydCwgZW5kKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVTdGF0ZShpZCEsIGNvbGxlY3Rpb24sIHNsaWNlLCBzdGFydCwgZW5kKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2UuY2hhbmdlLmVtaXQoaWQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBzbGljZSBhcyBVO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGVtaXRDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2UuY2hhbmdlLmVtaXQoaWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzYXZlIHRoZSBzdGF0ZSBmb3Igc2VydmVyLXNpZGUgY29sbGVjdGlvbiB0byBhdm9pZCBudWxsXG4gICAgICAgICAgICAvLyBmbGFzaCBhcyBuZXcgZGF0YSBsb2Fkcy5cbiAgICAgICAgICAgIHRoaXMuc2F2ZVN0YXRlKGlkISwgY29sbGVjdGlvbiwgY29sbGVjdGlvbiwgc3RhcnQsIGVuZCk7XG5cbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuIFBhZ2luYXRpb25JbnN0YW5jZSBvYmplY3QsIHVzaW5nIGRlZmF1bHRzIGZvciBhbnkgb3B0aW9uYWwgcHJvcGVydGllcyBub3Qgc3VwcGxpZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVJbnN0YW5jZShjb2xsZWN0aW9uOiByZWFkb25seSBhbnlbXSwgY29uZmlnOiBQYWdpbmF0ZVBpcGVBcmdzKTogUGFnaW5hdGlvbkluc3RhbmNlSW50ZXJmYWNlIHtcbiAgICAgICAgdGhpcy5jaGVja0NvbmZpZyhjb25maWcpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogY29uZmlnLmlkICE9IG51bGwgPyBjb25maWcuaWQgOiB0aGlzLnNlcnZpY2UuZGVmYXVsdElkKCksXG4gICAgICAgICAgICBpdGVtc1BlclBhZ2U6IE51bWJlcihjb25maWcuaXRlbXNQZXJQYWdlKSB8fCAwLFxuICAgICAgICAgICAgY3VycmVudFBhZ2U6IE51bWJlcihjb25maWcuY3VycmVudFBhZ2UpIHx8IDEsXG4gICAgICAgICAgICB0b3RhbEl0ZW1zOiBOdW1iZXIoY29uZmlnLnRvdGFsSXRlbXMpIHx8IGNvbGxlY3Rpb24ubGVuZ3RoXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5zdXJlIHRoZSBhcmd1bWVudCBwYXNzZWQgdG8gdGhlIGZpbHRlciBjb250YWlucyB0aGUgcmVxdWlyZWQgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNoZWNrQ29uZmlnKGNvbmZpZzogUGFnaW5hdGVQaXBlQXJncyk6IHZvaWQge1xuICAgICAgICBjb25zdCByZXF1aXJlZCA9IFsnaXRlbXNQZXJQYWdlJywgJ2N1cnJlbnRQYWdlJ107XG5cbiAgICAgICAgY29uc3QgbWlzc2luZyA9IHJlcXVpcmVkLmZpbHRlcihwcm9wID0+ICEocHJvcCBpbiBjb25maWcpKTtcbiAgICAgICAgaWYgKDAgPCBtaXNzaW5nLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYWdpbmF0ZVBpcGU6IEFyZ3VtZW50IGlzIG1pc3NpbmcgdGhlIGZvbGxvd2luZyByZXF1aXJlZCBwcm9wZXJ0aWVzOiAke21pc3Npbmcuam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvIGF2b2lkIHJldHVybmluZyBhIGJyYW5kIG5ldyBhcnJheSBlYWNoIHRpbWUgdGhlIHBpcGUgaXMgcnVuLCB3ZSBzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIHNsaWNlZFxuICAgICAqIGFycmF5IGZvciBhIGdpdmVuIGlkLiBUaGlzIG1lYW5zIHRoYXQgdGhlIG5leHQgdGltZSB0aGUgcGlwZSBpcyBydW4gb24gdGhpcyBjb2xsZWN0aW9uICYgaWQsIHdlIGp1c3RcbiAgICAgKiBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIGNvbGxlY3Rpb24sIHN0YXJ0IGFuZCBlbmQgcG9pbnRzIGFyZSBhbGwgaWRlbnRpY2FsLCBhbmQgaWYgc28sIHJldHVybiB0aGVcbiAgICAgKiBsYXN0IHNsaWNlZCBhcnJheS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHNhdmVTdGF0ZShpZDogc3RyaW5nLCBjb2xsZWN0aW9uOiBBcnJheUxpa2U8YW55Piwgc2xpY2U6IEFycmF5TGlrZTxhbnk+LCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnN0YXRlW2lkXSA9IHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgICAgICBzaXplOiBjb2xsZWN0aW9uLmxlbmd0aCxcbiAgICAgICAgICAgIHNsaWNlLFxuICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICBlbmRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3IgYSBnaXZlbiBpZCwgcmV0dXJucyB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uLCBzaXplLCBzdGFydCBhbmQgZW5kIHZhbHVlcyBhcmUgaWRlbnRpY2FsLlxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGVJc0lkZW50aWNhbChpZDogc3RyaW5nLCBjb2xsZWN0aW9uOiBBcnJheUxpa2U8YW55Piwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZVtpZF07XG4gICAgICAgIGlmICghc3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaXNNZXRhRGF0YUlkZW50aWNhbCA9IHN0YXRlLnNpemUgPT09IGNvbGxlY3Rpb24ubGVuZ3RoICYmXG4gICAgICAgICAgICBzdGF0ZS5zdGFydCA9PT0gc3RhcnQgJiZcbiAgICAgICAgICAgIHN0YXRlLmVuZCA9PT0gZW5kO1xuXG4gICAgICAgIGlmKCFpc01ldGFEYXRhSWRlbnRpY2FsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHN0YXRlLnNsaWNlIGFzIEFycmF5PGFueT4pLmV2ZXJ5KChlbGVtZW50LCBpbmRleCkgPT4gZWxlbWVudCA9PT0gY29sbGVjdGlvbltzdGFydCArIGluZGV4XSk7XG4gICAgfVxufVxuIl19