UNPKG

@netgrif/components-core

Version:

Netgrif Application engine frontend core Angular library

77 lines 11.4 kB
import { GridFiller } from './model/grid-filler'; export class GridLayoutHelper { _log; constructor(_log) { this._log = _log; } static addGridRows(grid, newRowCount, columnCount) { while (grid.length < newRowCount) { grid.push(GridLayoutHelper.newGridRow(columnCount)); } } static newGridRow(cols) { return [new GridFiller(0, cols - 1)]; } fillBlankSpace(gridElements, columnCount, elementVisibilityCondition = () => true) { const grid = []; gridElements.forEach(element => { const elementRowEnd = element.layout.y + element.layout.rows - 1; const elementColEnd = element.layout.x + element.layout.cols - 1; if (elementRowEnd >= grid.length) { GridLayoutHelper.addGridRows(grid, elementRowEnd + 1, columnCount); } for (let row = element.layout.y; row <= elementRowEnd; row++) { if (!elementVisibilityCondition(element)) { for (const filler of grid[row]) { filler.isIntentional = false; } } else { const newFillers = []; for (const filler of grid[row]) { newFillers.push(...filler.fillersAfterCover(element.layout.x, elementColEnd)); } grid[row] = newFillers; } } }); const result = gridElements.filter(element => elementVisibilityCondition(element)) .map(element => ({ item: element, type: element.type, layout: element.layout })); let encounteredFirst = false; for (let y = grid.length - 1; y >= 0; y--) { const row = grid[y]; if (row.length === 0) { encounteredFirst = true; } row.forEach(filler => { if (!encounteredFirst && !filler.isFullWidth(columnCount)) { encounteredFirst = true; } if (encounteredFirst && (filler.isIntentional || !filler.isFullWidth(columnCount))) { result.push(filler.convertToGridElement(y)); } }); } return result.sort((a, b) => { if (a.layout.y < b.layout.y) { return -1; } else if (a.layout.y > b.layout.y) { return 1; } if (a.layout.x < b.layout.x) { return -1; } else if (a.layout.x > b.layout.x) { return 1; } this._log.warn('Two elements in grid layout have the same X and Y coordinates! Make sure your data is valid.'); return 0; }); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1sYXlvdXQtaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmV0Z3JpZi1jb21wb25lbnRzLWNvcmUvc3JjL2xpYi91dGlsaXR5L2dyaWQtbGF5b3V0L2dyaWQtbGF5b3V0LWhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFLL0MsTUFBTSxPQUFPLGdCQUFnQjtJQUVMO0lBQXBCLFlBQW9CLElBQW1CO1FBQW5CLFNBQUksR0FBSixJQUFJLENBQWU7SUFDdkMsQ0FBQztJQUVPLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBOEIsRUFBRSxXQUFtQixFQUFFLFdBQW1CO1FBQy9GLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxXQUFXLEVBQUU7WUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztTQUN2RDtJQUNMLENBQUM7SUFFTyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQVk7UUFDbEMsT0FBTyxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRU0sY0FBYyxDQUFDLFlBQWdDLEVBQ2hDLFdBQW1CLEVBQ25CLDZCQUF3RCxHQUFHLEVBQUUsQ0FBQyxJQUFJO1FBQ3BGLE1BQU0sSUFBSSxHQUE2QixFQUFFLENBQUM7UUFFMUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUMzQixNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7WUFDakUsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsT0FBTyxD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Q0FBQyxFQUFFO2dCQUN6QixPQUFPLENBQUMsQ0FBQyxDQUFDO2FBQ2I7aUJBQU0sSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtnQkFDaEMsT0FBTyxDQUFDLENBQUM7YUFDWjtZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLDhGQUE4RixDQUFDLENBQUM7WUFDL0csT0FBTyxDQUFDLENBQUM7UUFDYixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FFSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7R3JpZEZpbGxlcn0gZnJvbSAnLi9tb2RlbC9ncmlkLWZpbGxlcic7XG5pbXBvcnQge0dyaWRFbGVtZW50V2l0aEl0ZW19IGZyb20gJy4vbW9kZWwvZ3JpZC1lbGVtZW50LXdpdGgtaXRlbSc7XG5pbXBvcnQge0dyaWRFbGVtZW50fSBmcm9tICcuL21vZGVsL2dyaWQtZWxlbWVudCc7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gJy4uLy4uL2xvZ2dlci9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBHcmlkTGF5b3V0SGVscGVyIHtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2xvZzogTG9nZ2VyU2VydmljZSkge1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGFkZEdyaWRSb3dzKGdyaWQ6IEFycmF5PEFycmF5PEdyaWRGaWxsZXI+PiwgbmV3Um93Q291bnQ6IG51bWJlciwgY29sdW1uQ291bnQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB3aGlsZSAoZ3JpZC5sZW5ndGggPCBuZXdSb3dDb3VudCkge1xuICAgICAgICAgICAgZ3JpZC5wdXNoKEdyaWRMYXlvdXRIZWxwZXIubmV3R3JpZFJvdyhjb2x1bW5Db3VudCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgbmV3R3JpZFJvdyhjb2xzOiBudW1iZXIpOiBBcnJheTxHcmlkRmlsbGVyPiB7XG4gICAgICAgIHJldHVybiBbbmV3IEdyaWRGaWxsZXIoMCwgY29scyAtIDEpXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmlsbEJsYW5rU3BhY2UoZ3JpZEVsZW1lbnRzOiBBcnJheTxHcmlkRWxlbWVudD4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkNvdW50OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRWaXNpYmlsaXR5Q29uZGl0aW9uOiAoZWxlbWVudDogYW55KSA9PiBib29sZWFuID0gKCkgPT4gdHJ1ZSk6IEFycmF5PEdyaWRFbGVtZW50V2l0aEl0ZW08dW5rbm93bj4+IHtcbiAgICAgICAgY29uc3QgZ3JpZDogQXJyYXk8QXJyYXk8R3JpZEZpbGxlcj4+ID0gW107XG5cbiAgICAgICAgZ3JpZEVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50Um93RW5kID0gZWxlbWVudC5sYXlvdXQueSArIGVsZW1lbnQubGF5b3V0LnJvd3MgLSAxO1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudENvbEVuZCA9IGVsZW1lbnQubGF5b3V0LnggKyBlbGVtZW50LmxheW91dC5jb2xzIC0gMTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Um93RW5kID49IGdyaWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgR3JpZExheW91dEhlbHBlci5hZGRHcmlkUm93cyhncmlkLCBlbGVtZW50Um93RW5kICsgMSwgY29sdW1uQ291bnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgcm93ID0gZWxlbWVudC5sYXlvdXQueTsgcm93IDw9IGVsZW1lbnRSb3dFbmQ7IHJvdysrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50VmlzaWJpbGl0eUNvbmRpdGlvbihlbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpbGxlciBvZiBncmlkW3Jvd10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxlci5pc0ludGVudGlvbmFsID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdGaWxsZXJzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmlsbGVyIG9mIGdyaWRbcm93XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RmlsbGVycy5wdXNoKC4uLmZpbGxlci5maWxsZXJzQWZ0ZXJDb3ZlcihlbGVtZW50LmxheW91dC54LCBlbGVtZW50Q29sRW5kKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZ3JpZFtyb3ddID0gbmV3RmlsbGVycztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdDogQXJyYXk8R3JpZEVsZW1lbnRXaXRoSXRlbTx1bmtub3duPj4gPSBncmlkRWxlbWVudHMuZmlsdGVyKGVsZW1lbnQgPT4gZWxlbWVudFZpc2liaWxpdHlDb25kaXRpb24oZWxlbWVudCkpXG4gICAgICAgICAgICAubWFwKGVsZW1lbnQgPT4gKHtcbiAgICAgICAgICAgICAgICBpdGVtOiBlbGVtZW50LFxuICAgICAgICAgICAgICAgIHR5cGU6IGVsZW1lbnQudHlwZSxcbiAgICAgICAgICAgICAgICBsYXlvdXQ6IGVsZW1lbnQubGF5b3V0XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIGxldCBlbmNvdW50ZXJlZEZpcnN0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IHkgPSBncmlkLmxlbmd0aCAtIDE7IHkgPj0gMDsgeS0tKSB7XG4gICAgICAgICAgICBjb25zdCByb3cgPSBncmlkW3ldO1xuICAgICAgICAgICAgaWYgKHJvdy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBlbmNvdW50ZXJlZEZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJvdy5mb3JFYWNoKGZpbGxlciA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbmNvdW50ZXJlZEZpcnN0ICYmICFmaWxsZXIuaXNGdWxsV2lkdGgoY29sdW1uQ291bnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVuY291bnRlcmVkRmlyc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZW5jb3VudGVyZWRGaXJzdCAmJiAoZmlsbGVyLmlzSW50ZW50aW9uYWwgfHwgIWZpbGxlci5pc0Z1bGxXaWR0aChjb2x1bW5Db3VudCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZpbGxlci5jb252ZXJ0VG9HcmlkRWxlbWVudCh5KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0LnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGlmIChhLmxheW91dC55IDwgYi5sYXlvdXQueSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYS5sYXlvdXQueSA+IGIubGF5b3V0LnkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhLmxheW91dC54IDwgYi5sYXlvdXQueCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYS5sYXlvdXQueCA+IGIubGF5b3V0LngpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2xvZy53YXJuKCdUd28gZWxlbWVudHMgaW4gZ3JpZCBsYXlvdXQgaGF2ZSB0aGUgc2FtZSBYIGFuZCBZIGNvb3JkaW5hdGVzISBNYWtlIHN1cmUgeW91ciBkYXRhIGlzIHZhbGlkLicpO1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0pO1xuICAgIH1cblxufVxuIl19