@aquera/nile-elements 1.2.1 → 1.2.2
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.
- package/README.md +4 -0
- package/demo/variables.css +4 -2
- package/dist/index.cjs.js +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.js +167 -88
- package/dist/nile-grid/index.cjs.js +1 -1
- package/dist/nile-grid/index.esm.js +1 -1
- package/dist/nile-grid/nile-grid-body/index.cjs.js +2 -0
- package/dist/{nile-grid-body → nile-grid/nile-grid-body}/index.esm.js +1 -1
- package/dist/{nile-grid-cell-item/nile-grid-cell-item.cjs.js → nile-grid/nile-grid-body/nile-grid-body.cjs.js} +2 -2
- package/dist/nile-grid/nile-grid-body/nile-grid-body.cjs.js.map +1 -0
- package/dist/{nile-grid-body → nile-grid/nile-grid-body}/nile-grid-body.css.cjs.js +1 -1
- package/dist/nile-grid/nile-grid-body/nile-grid-body.css.cjs.js.map +1 -0
- package/dist/{nile-grid-body → nile-grid/nile-grid-body}/nile-grid-body.css.esm.js +0 -4
- package/dist/nile-grid/nile-grid-body/nile-grid-body.esm.js +5 -0
- package/dist/nile-grid/nile-grid-cell-item/index.cjs.js +2 -0
- package/dist/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/index.esm.js +1 -1
- package/dist/nile-grid/nile-grid-cell-item/nile-grid-cell-item.cjs.js +2 -0
- package/dist/nile-grid/nile-grid-cell-item/nile-grid-cell-item.cjs.js.map +1 -0
- package/dist/nile-grid/nile-grid-cell-item/nile-grid-cell-item.css.cjs.js +2 -0
- package/dist/nile-grid/nile-grid-cell-item/nile-grid-cell-item.css.cjs.js.map +1 -0
- package/dist/nile-grid/nile-grid-cell-item/nile-grid-cell-item.css.esm.js +67 -0
- package/dist/nile-grid/nile-grid-cell-item/nile-grid-cell-item.esm.js +12 -0
- package/dist/nile-grid/nile-grid-cell-item/nile-grid-cell-item.utils.cjs.js.map +1 -0
- package/dist/nile-grid/nile-grid-head/index.cjs.js +2 -0
- package/dist/{nile-grid-head → nile-grid/nile-grid-head}/index.esm.js +1 -1
- package/dist/nile-grid/nile-grid-head/nile-grid-head.cjs.js +2 -0
- package/dist/nile-grid/nile-grid-head/nile-grid-head.cjs.js.map +1 -0
- package/dist/nile-grid/nile-grid-head/nile-grid-head.css.cjs.js.map +1 -0
- package/dist/nile-grid/nile-grid-head/nile-grid-head.esm.js +5 -0
- package/dist/nile-grid/nile-grid-head-item/index.cjs.js +2 -0
- package/dist/{nile-grid-head-item → nile-grid/nile-grid-head-item}/index.esm.js +1 -1
- package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.cjs.js +2 -0
- package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.cjs.js.map +1 -0
- package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.css.cjs.js +2 -0
- package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.css.cjs.js.map +1 -0
- package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.css.esm.js +59 -0
- package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.esm.js +13 -0
- package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.utils.cjs.js +2 -0
- package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.utils.cjs.js.map +1 -0
- package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.utils.esm.js +1 -0
- package/dist/nile-grid/nile-grid-row/index.cjs.js +2 -0
- package/dist/{nile-grid-row → nile-grid/nile-grid-row}/index.esm.js +1 -1
- package/dist/nile-grid/nile-grid-row/nile-grid-row.cjs.js +2 -0
- package/dist/nile-grid/nile-grid-row/nile-grid-row.cjs.js.map +1 -0
- package/dist/nile-grid/nile-grid-row/nile-grid-row.css.cjs.js +2 -0
- package/dist/nile-grid/nile-grid-row/nile-grid-row.css.cjs.js.map +1 -0
- package/dist/nile-grid/nile-grid-row/nile-grid-row.css.esm.js +36 -0
- package/dist/nile-grid/nile-grid-row/nile-grid-row.esm.js +8 -0
- package/dist/nile-grid/nile-grid.cjs.js +1 -1
- package/dist/nile-grid/nile-grid.cjs.js.map +1 -1
- package/dist/nile-grid/nile-grid.css.cjs.js +1 -1
- package/dist/nile-grid/nile-grid.css.cjs.js.map +1 -1
- package/dist/nile-grid/nile-grid.css.esm.js +9 -6
- package/dist/nile-grid/nile-grid.esm.js +6 -6
- package/dist/nile-grid/nile-grid.layout.cjs.js +2 -0
- package/dist/nile-grid/nile-grid.layout.cjs.js.map +1 -0
- package/dist/nile-grid/nile-grid.layout.esm.js +1 -0
- package/dist/nile-grid/nile-grid.resize.cjs.js +2 -0
- package/dist/nile-grid/nile-grid.resize.cjs.js.map +1 -0
- package/dist/nile-grid/nile-grid.resize.esm.js +1 -0
- package/dist/nile-grid/nile-grid.types.cjs.js +2 -0
- package/dist/nile-grid/nile-grid.types.cjs.js.map +1 -0
- package/dist/nile-grid/nile-grid.types.esm.js +1 -0
- package/dist/nile-grid/nile-grid.utils.cjs.js +1 -1
- package/dist/nile-grid/nile-grid.utils.cjs.js.map +1 -1
- package/dist/nile-grid/nile-grid.utils.esm.js +1 -1
- package/dist/nile-grid/nile-grid.width.cjs.js +2 -0
- package/dist/nile-grid/nile-grid.width.cjs.js.map +1 -0
- package/dist/nile-grid/nile-grid.width.esm.js +1 -0
- package/dist/src/index.d.ts +5 -5
- package/dist/src/index.js +5 -5
- package/dist/src/index.js.map +1 -1
- package/dist/src/nile-grid/nile-grid-body/index.js.map +1 -0
- package/dist/src/{nile-grid-body → nile-grid/nile-grid-body}/nile-grid-body.css.js +0 -4
- package/dist/src/nile-grid/nile-grid-body/nile-grid-body.css.js.map +1 -0
- package/dist/src/{nile-grid-body → nile-grid/nile-grid-body}/nile-grid-body.d.ts +1 -1
- package/dist/src/{nile-grid-body → nile-grid/nile-grid-body}/nile-grid-body.js +2 -2
- package/dist/src/nile-grid/nile-grid-body/nile-grid-body.js.map +1 -0
- package/dist/src/nile-grid/nile-grid-cell-item/index.js.map +1 -0
- package/dist/src/nile-grid/nile-grid-cell-item/nile-grid-cell-item.css.js +79 -0
- package/dist/src/nile-grid/nile-grid-cell-item/nile-grid-cell-item.css.js.map +1 -0
- package/dist/src/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/nile-grid-cell-item.d.ts +1 -4
- package/dist/src/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/nile-grid-cell-item.js +2 -12
- package/dist/src/nile-grid/nile-grid-cell-item/nile-grid-cell-item.js.map +1 -0
- package/dist/src/nile-grid/nile-grid-cell-item/nile-grid-cell-item.utils.js.map +1 -0
- package/dist/src/nile-grid/nile-grid-head/index.js.map +1 -0
- package/dist/src/nile-grid/nile-grid-head/nile-grid-head.css.js.map +1 -0
- package/dist/src/{nile-grid-head → nile-grid/nile-grid-head}/nile-grid-head.d.ts +2 -1
- package/dist/src/{nile-grid-head → nile-grid/nile-grid-head}/nile-grid-head.js +11 -3
- package/dist/src/nile-grid/nile-grid-head/nile-grid-head.js.map +1 -0
- package/dist/src/nile-grid/nile-grid-head-item/index.js.map +1 -0
- package/dist/src/{nile-grid-head-item → nile-grid/nile-grid-head-item}/nile-grid-head-item.css.js +30 -5
- package/dist/src/nile-grid/nile-grid-head-item/nile-grid-head-item.css.js.map +1 -0
- package/dist/src/{nile-grid-head-item → nile-grid/nile-grid-head-item}/nile-grid-head-item.d.ts +3 -4
- package/dist/src/{nile-grid-head-item → nile-grid/nile-grid-head-item}/nile-grid-head-item.js +12 -15
- package/dist/src/nile-grid/nile-grid-head-item/nile-grid-head-item.js.map +1 -0
- package/dist/src/nile-grid/nile-grid-head-item/nile-grid-head-item.utils.d.ts +34 -0
- package/dist/src/{nile-grid-head-item → nile-grid/nile-grid-head-item}/nile-grid-head-item.utils.js +27 -4
- package/dist/src/nile-grid/nile-grid-head-item/nile-grid-head-item.utils.js.map +1 -0
- package/dist/src/nile-grid/nile-grid-row/index.js.map +1 -0
- package/dist/src/nile-grid/nile-grid-row/nile-grid-row.css.js +48 -0
- package/dist/src/nile-grid/nile-grid-row/nile-grid-row.css.js.map +1 -0
- package/dist/src/{nile-grid-row → nile-grid/nile-grid-row}/nile-grid-row.d.ts +5 -2
- package/dist/src/{nile-grid-row → nile-grid/nile-grid-row}/nile-grid-row.js +23 -6
- package/dist/src/nile-grid/nile-grid-row/nile-grid-row.js.map +1 -0
- package/dist/src/nile-grid/nile-grid.css.js +7 -4
- package/dist/src/nile-grid/nile-grid.css.js.map +1 -1
- package/dist/src/nile-grid/nile-grid.d.ts +19 -4
- package/dist/src/nile-grid/nile-grid.js +76 -23
- package/dist/src/nile-grid/nile-grid.js.map +1 -1
- package/dist/src/nile-grid/nile-grid.layout.d.ts +28 -0
- package/dist/src/nile-grid/nile-grid.layout.js +346 -0
- package/dist/src/nile-grid/nile-grid.layout.js.map +1 -0
- package/dist/src/nile-grid/nile-grid.resize.d.ts +58 -0
- package/dist/src/nile-grid/nile-grid.resize.js +100 -0
- package/dist/src/nile-grid/nile-grid.resize.js.map +1 -0
- package/dist/src/nile-grid/nile-grid.types.d.ts +3 -0
- package/dist/src/nile-grid/nile-grid.types.js +2 -0
- package/dist/src/nile-grid/nile-grid.types.js.map +1 -0
- package/dist/src/nile-grid/nile-grid.utils.d.ts +22 -4
- package/dist/src/nile-grid/nile-grid.utils.js +24 -141
- package/dist/src/nile-grid/nile-grid.utils.js.map +1 -1
- package/dist/src/nile-grid/nile-grid.width.d.ts +25 -0
- package/dist/src/nile-grid/nile-grid.width.js +301 -0
- package/dist/src/nile-grid/nile-grid.width.js.map +1 -0
- package/dist/src/version.js +2 -2
- package/dist/src/version.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/index.ts +5 -5
- package/src/{nile-grid-body → nile-grid/nile-grid-body}/nile-grid-body.css.ts +0 -4
- package/src/{nile-grid-body → nile-grid/nile-grid-body}/nile-grid-body.ts +3 -3
- package/src/nile-grid/nile-grid-cell-item/nile-grid-cell-item.css.ts +81 -0
- package/src/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/nile-grid-cell-item.ts +5 -15
- package/src/{nile-grid-head → nile-grid/nile-grid-head}/nile-grid-head.ts +6 -4
- package/src/{nile-grid-head-item → nile-grid/nile-grid-head-item}/nile-grid-head-item.css.ts +30 -5
- package/src/{nile-grid-head-item → nile-grid/nile-grid-head-item}/nile-grid-head-item.ts +10 -25
- package/src/{nile-grid-head-item → nile-grid/nile-grid-head-item}/nile-grid-head-item.utils.ts +30 -4
- package/src/nile-grid/nile-grid-row/nile-grid-row.css.ts +50 -0
- package/src/{nile-grid-row → nile-grid/nile-grid-row}/nile-grid-row.ts +13 -8
- package/src/nile-grid/nile-grid.css.ts +7 -4
- package/src/nile-grid/nile-grid.layout.ts +514 -0
- package/src/nile-grid/nile-grid.resize.ts +143 -0
- package/src/nile-grid/nile-grid.ts +79 -53
- package/src/nile-grid/nile-grid.types.ts +1 -0
- package/src/nile-grid/nile-grid.utils.ts +27 -203
- package/src/nile-grid/nile-grid.width.ts +397 -0
- package/vscode-html-custom-data.json +48 -65
- package/dist/nile-grid-body/index.cjs.js +0 -2
- package/dist/nile-grid-body/nile-grid-body.cjs.js +0 -2
- package/dist/nile-grid-body/nile-grid-body.cjs.js.map +0 -1
- package/dist/nile-grid-body/nile-grid-body.css.cjs.js.map +0 -1
- package/dist/nile-grid-body/nile-grid-body.esm.js +0 -5
- package/dist/nile-grid-cell-item/index.cjs.js +0 -2
- package/dist/nile-grid-cell-item/nile-grid-cell-item.cjs.js.map +0 -1
- package/dist/nile-grid-cell-item/nile-grid-cell-item.css.cjs.js +0 -2
- package/dist/nile-grid-cell-item/nile-grid-cell-item.css.cjs.js.map +0 -1
- package/dist/nile-grid-cell-item/nile-grid-cell-item.css.esm.js +0 -35
- package/dist/nile-grid-cell-item/nile-grid-cell-item.esm.js +0 -12
- package/dist/nile-grid-cell-item/nile-grid-cell-item.utils.cjs.js.map +0 -1
- package/dist/nile-grid-head/index.cjs.js +0 -2
- package/dist/nile-grid-head/nile-grid-head.cjs.js +0 -2
- package/dist/nile-grid-head/nile-grid-head.cjs.js.map +0 -1
- package/dist/nile-grid-head/nile-grid-head.css.cjs.js.map +0 -1
- package/dist/nile-grid-head/nile-grid-head.esm.js +0 -5
- package/dist/nile-grid-head-item/index.cjs.js +0 -2
- package/dist/nile-grid-head-item/nile-grid-head-item.cjs.js +0 -2
- package/dist/nile-grid-head-item/nile-grid-head-item.cjs.js.map +0 -1
- package/dist/nile-grid-head-item/nile-grid-head-item.css.cjs.js +0 -2
- package/dist/nile-grid-head-item/nile-grid-head-item.css.cjs.js.map +0 -1
- package/dist/nile-grid-head-item/nile-grid-head-item.css.esm.js +0 -34
- package/dist/nile-grid-head-item/nile-grid-head-item.esm.js +0 -12
- package/dist/nile-grid-head-item/nile-grid-head-item.utils.cjs.js +0 -2
- package/dist/nile-grid-head-item/nile-grid-head-item.utils.cjs.js.map +0 -1
- package/dist/nile-grid-head-item/nile-grid-head-item.utils.esm.js +0 -1
- package/dist/nile-grid-row/index.cjs.js +0 -2
- package/dist/nile-grid-row/nile-grid-row.cjs.js +0 -2
- package/dist/nile-grid-row/nile-grid-row.cjs.js.map +0 -1
- package/dist/nile-grid-row/nile-grid-row.css.cjs.js +0 -2
- package/dist/nile-grid-row/nile-grid-row.css.cjs.js.map +0 -1
- package/dist/nile-grid-row/nile-grid-row.css.esm.js +0 -15
- package/dist/nile-grid-row/nile-grid-row.esm.js +0 -7
- package/dist/src/nile-grid-body/index.js.map +0 -1
- package/dist/src/nile-grid-body/nile-grid-body.css.js.map +0 -1
- package/dist/src/nile-grid-body/nile-grid-body.js.map +0 -1
- package/dist/src/nile-grid-cell-item/index.js.map +0 -1
- package/dist/src/nile-grid-cell-item/nile-grid-cell-item.css.js +0 -47
- package/dist/src/nile-grid-cell-item/nile-grid-cell-item.css.js.map +0 -1
- package/dist/src/nile-grid-cell-item/nile-grid-cell-item.js.map +0 -1
- package/dist/src/nile-grid-cell-item/nile-grid-cell-item.utils.js.map +0 -1
- package/dist/src/nile-grid-head/index.js.map +0 -1
- package/dist/src/nile-grid-head/nile-grid-head.css.js.map +0 -1
- package/dist/src/nile-grid-head/nile-grid-head.js.map +0 -1
- package/dist/src/nile-grid-head-item/index.js.map +0 -1
- package/dist/src/nile-grid-head-item/nile-grid-head-item.css.js.map +0 -1
- package/dist/src/nile-grid-head-item/nile-grid-head-item.js.map +0 -1
- package/dist/src/nile-grid-head-item/nile-grid-head-item.utils.d.ts +0 -10
- package/dist/src/nile-grid-head-item/nile-grid-head-item.utils.js.map +0 -1
- package/dist/src/nile-grid-row/index.js.map +0 -1
- package/dist/src/nile-grid-row/nile-grid-row.css.js +0 -27
- package/dist/src/nile-grid-row/nile-grid-row.css.js.map +0 -1
- package/dist/src/nile-grid-row/nile-grid-row.js.map +0 -1
- package/src/nile-grid-cell-item/nile-grid-cell-item.css.ts +0 -49
- package/src/nile-grid-row/nile-grid-row.css.ts +0 -29
- /package/dist/{nile-grid-body → nile-grid/nile-grid-body}/index.cjs.js.map +0 -0
- /package/dist/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/index.cjs.js.map +0 -0
- /package/dist/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/nile-grid-cell-item.utils.cjs.js +0 -0
- /package/dist/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/nile-grid-cell-item.utils.esm.js +0 -0
- /package/dist/{nile-grid-head → nile-grid/nile-grid-head}/index.cjs.js.map +0 -0
- /package/dist/{nile-grid-head → nile-grid/nile-grid-head}/nile-grid-head.css.cjs.js +0 -0
- /package/dist/{nile-grid-head → nile-grid/nile-grid-head}/nile-grid-head.css.esm.js +0 -0
- /package/dist/{nile-grid-head-item → nile-grid/nile-grid-head-item}/index.cjs.js.map +0 -0
- /package/dist/{nile-grid-row → nile-grid/nile-grid-row}/index.cjs.js.map +0 -0
- /package/dist/src/{nile-grid-body → nile-grid/nile-grid-body}/index.d.ts +0 -0
- /package/dist/src/{nile-grid-body → nile-grid/nile-grid-body}/index.js +0 -0
- /package/dist/src/{nile-grid-body → nile-grid/nile-grid-body}/nile-grid-body.css.d.ts +0 -0
- /package/dist/src/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/index.d.ts +0 -0
- /package/dist/src/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/index.js +0 -0
- /package/dist/src/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/nile-grid-cell-item.css.d.ts +0 -0
- /package/dist/src/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/nile-grid-cell-item.utils.d.ts +0 -0
- /package/dist/src/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/nile-grid-cell-item.utils.js +0 -0
- /package/dist/src/{nile-grid-head → nile-grid/nile-grid-head}/index.d.ts +0 -0
- /package/dist/src/{nile-grid-head → nile-grid/nile-grid-head}/index.js +0 -0
- /package/dist/src/{nile-grid-head → nile-grid/nile-grid-head}/nile-grid-head.css.d.ts +0 -0
- /package/dist/src/{nile-grid-head → nile-grid/nile-grid-head}/nile-grid-head.css.js +0 -0
- /package/dist/src/{nile-grid-head-item → nile-grid/nile-grid-head-item}/index.d.ts +0 -0
- /package/dist/src/{nile-grid-head-item → nile-grid/nile-grid-head-item}/index.js +0 -0
- /package/dist/src/{nile-grid-head-item → nile-grid/nile-grid-head-item}/nile-grid-head-item.css.d.ts +0 -0
- /package/dist/src/{nile-grid-row → nile-grid/nile-grid-row}/index.d.ts +0 -0
- /package/dist/src/{nile-grid-row → nile-grid/nile-grid-row}/index.js +0 -0
- /package/dist/src/{nile-grid-row → nile-grid/nile-grid-row}/nile-grid-row.css.d.ts +0 -0
- /package/src/{nile-grid-body → nile-grid/nile-grid-body}/index.ts +0 -0
- /package/src/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/index.ts +0 -0
- /package/src/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/nile-grid-cell-item.utils.ts +0 -0
- /package/src/{nile-grid-head → nile-grid/nile-grid-head}/index.ts +0 -0
- /package/src/{nile-grid-head → nile-grid/nile-grid-head}/nile-grid-head.css.ts +0 -0
- /package/src/{nile-grid-head-item → nile-grid/nile-grid-head-item}/index.ts +0 -0
- /package/src/{nile-grid-row → nile-grid/nile-grid-row}/index.ts +0 -0
|
@@ -0,0 +1,514 @@
|
|
|
1
|
+
import { NileGrid } from './nile-grid';
|
|
2
|
+
import { HeadItemEl } from './nile-grid.types';
|
|
3
|
+
import { getHead, getBody } from './nile-grid.utils';
|
|
4
|
+
import { getScrollbarComp } from './nile-grid.resize';
|
|
5
|
+
import { computeColumnWidths } from './nile-grid.width';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @param nileGrid Parent NileGrid instance
|
|
9
|
+
* @param slotEl <slot> element hosting head/body
|
|
10
|
+
* @param ensureWidths Function to ensure columnWidths length matches colCount
|
|
11
|
+
* @param rebuildTemplate Function(colCount, widths) -> grid-template string
|
|
12
|
+
* @param stickyLeftIndexes Mutable list of left-sticky column indexes
|
|
13
|
+
* @param stickyRightIndexes Mutable list of right-sticky column indexes
|
|
14
|
+
* @returns void
|
|
15
|
+
*/
|
|
16
|
+
export const layout = (
|
|
17
|
+
nileGrid: NileGrid,
|
|
18
|
+
slotEl: any,
|
|
19
|
+
ensureWidths: any,
|
|
20
|
+
rebuildTemplate: any,
|
|
21
|
+
stickyLeftIndexes: number[],
|
|
22
|
+
stickyRightIndexes: number[]
|
|
23
|
+
) => {
|
|
24
|
+
const head = getHead(slotEl);
|
|
25
|
+
const body = getBody(slotEl);
|
|
26
|
+
if (!body) return;
|
|
27
|
+
|
|
28
|
+
const headRows = head
|
|
29
|
+
? (Array.from(head.querySelectorAll('nile-grid-row')) as HTMLElement[])
|
|
30
|
+
: [];
|
|
31
|
+
const bodyRows = Array.from(
|
|
32
|
+
body.querySelectorAll('nile-grid-row')
|
|
33
|
+
) as HTMLElement[];
|
|
34
|
+
|
|
35
|
+
let colCount = 0;
|
|
36
|
+
colCount = computeHeadLayout(nileGrid, headRows, [], colCount, stickyLeftIndexes, stickyRightIndexes, nileGrid.columnWidths);
|
|
37
|
+
if (colCount) {
|
|
38
|
+
computeBodyLayout(nileGrid, bodyRows, [], colCount, stickyLeftIndexes, stickyRightIndexes, nileGrid.columnWidths);
|
|
39
|
+
} else {
|
|
40
|
+
colCount = computeBodyLayout(nileGrid, bodyRows, [], colCount, stickyLeftIndexes, stickyRightIndexes, nileGrid.columnWidths);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
setTimeout(() => {
|
|
44
|
+
computeColumnWidths(nileGrid, colCount, nileGrid.columnWidths, slotEl);
|
|
45
|
+
});
|
|
46
|
+
ensureWidths(colCount);
|
|
47
|
+
nileGrid.colTemplate = rebuildTemplate(colCount, nileGrid.columnWidths);
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* @param nileGrid The parent NileGrid instance
|
|
52
|
+
* @param rows Array of grid row elements
|
|
53
|
+
* @param carry Array tracking rowspan, colspan continuation
|
|
54
|
+
* @param colCount Total column count
|
|
55
|
+
* @param stickyLeftIndexes List of sticky-left column indexes
|
|
56
|
+
* @param stickyRightIndexes List of sticky-right column indexes
|
|
57
|
+
* @param columnWidths Computed column widths
|
|
58
|
+
* @param opts Options controlling layout behavior
|
|
59
|
+
* @returns Final computed column count
|
|
60
|
+
*/
|
|
61
|
+
function layoutRows(
|
|
62
|
+
nileGrid: NileGrid,
|
|
63
|
+
rows: HTMLElement[],
|
|
64
|
+
carry: number[],
|
|
65
|
+
colCount: number,
|
|
66
|
+
stickyLeftIndexes: number[],
|
|
67
|
+
stickyRightIndexes: number[],
|
|
68
|
+
columnWidths: number[],
|
|
69
|
+
opts: { itemSelector: string; useStickyAttr?: boolean; handleRowBg?: boolean }
|
|
70
|
+
): number {
|
|
71
|
+
rows.forEach((row, rIdx) => {
|
|
72
|
+
if (nileGrid.hoverable) row.setAttribute('hover', 'true');
|
|
73
|
+
colCount = layoutSingleRow(
|
|
74
|
+
nileGrid,
|
|
75
|
+
row,
|
|
76
|
+
rIdx,
|
|
77
|
+
carry,
|
|
78
|
+
colCount,
|
|
79
|
+
stickyLeftIndexes,
|
|
80
|
+
stickyRightIndexes,
|
|
81
|
+
columnWidths,
|
|
82
|
+
opts
|
|
83
|
+
);
|
|
84
|
+
});
|
|
85
|
+
return colCount;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* @param nileGrid The grid element being processed
|
|
90
|
+
* @param row Single row element to layout
|
|
91
|
+
* @param rIdx Row index in the grid
|
|
92
|
+
* @param carry Rowspan tracking array
|
|
93
|
+
* @param colCount Current column count
|
|
94
|
+
* @param stickyLeftIndexes Sticky-left indexes
|
|
95
|
+
* @param stickyRightIndexes Sticky-right indexes
|
|
96
|
+
* @param columnWidths Column widths array
|
|
97
|
+
* @param opts Layout options
|
|
98
|
+
* @returns Updated column count
|
|
99
|
+
*/
|
|
100
|
+
function layoutSingleRow(
|
|
101
|
+
nileGrid: NileGrid,
|
|
102
|
+
row: HTMLElement,
|
|
103
|
+
rIdx: number,
|
|
104
|
+
carry: number[],
|
|
105
|
+
colCount: number,
|
|
106
|
+
stickyLeftIndexes: number[],
|
|
107
|
+
stickyRightIndexes: number[],
|
|
108
|
+
columnWidths: number[],
|
|
109
|
+
opts: { itemSelector: string; useStickyAttr?: boolean }
|
|
110
|
+
): number {
|
|
111
|
+
let c = 1;
|
|
112
|
+
const rStart = rIdx + 1;
|
|
113
|
+
const items = [...row.querySelectorAll(opts.itemSelector)] as HTMLElement[];
|
|
114
|
+
|
|
115
|
+
for (const el of items) {
|
|
116
|
+
while ((carry[c - 1] || 0) > 0) c++;
|
|
117
|
+
({ c, colCount } = layoutCell(
|
|
118
|
+
nileGrid,
|
|
119
|
+
el,
|
|
120
|
+
c,
|
|
121
|
+
rStart,
|
|
122
|
+
carry,
|
|
123
|
+
colCount,
|
|
124
|
+
stickyLeftIndexes,
|
|
125
|
+
stickyRightIndexes,
|
|
126
|
+
columnWidths,
|
|
127
|
+
opts
|
|
128
|
+
));
|
|
129
|
+
}
|
|
130
|
+
decrementCarry(carry);
|
|
131
|
+
return colCount;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* @param nileGrid The parent grid
|
|
136
|
+
* @param el Cell element being laid out
|
|
137
|
+
* @param c Current column index
|
|
138
|
+
* @param rStart Row start index
|
|
139
|
+
* @param carry Rowspan carry array
|
|
140
|
+
* @param colCount Current max column count
|
|
141
|
+
* @param stickyLeftIndexes Left sticky indexes
|
|
142
|
+
* @param stickyRightIndexes Right sticky indexes
|
|
143
|
+
* @param columnWidths Column widths
|
|
144
|
+
* @param opts Sticky and layout options
|
|
145
|
+
* @returns Updated column index and column count
|
|
146
|
+
*/
|
|
147
|
+
function layoutCell(
|
|
148
|
+
nileGrid: NileGrid,
|
|
149
|
+
el: HTMLElement,
|
|
150
|
+
c: number,
|
|
151
|
+
rStart: number,
|
|
152
|
+
carry: number[],
|
|
153
|
+
colCount: number,
|
|
154
|
+
stickyLeftIndexes: number[],
|
|
155
|
+
stickyRightIndexes: number[],
|
|
156
|
+
columnWidths: number[],
|
|
157
|
+
opts: { useStickyAttr?: boolean }
|
|
158
|
+
) {
|
|
159
|
+
const colspan = Math.max(1, +el.getAttribute('colspan')! || 1);
|
|
160
|
+
const rowspan = Math.max(1, +el.getAttribute('rowspan')! || 1);
|
|
161
|
+
handleRowspan(nileGrid, el, rowspan);
|
|
162
|
+
|
|
163
|
+
const cStart = c;
|
|
164
|
+
const cEnd = c + colspan;
|
|
165
|
+
setGridPosition(el, cStart, cEnd, rStart, rowspan);
|
|
166
|
+
handleSticky(
|
|
167
|
+
el,
|
|
168
|
+
cStart,
|
|
169
|
+
opts,
|
|
170
|
+
stickyLeftIndexes,
|
|
171
|
+
stickyRightIndexes,
|
|
172
|
+
columnWidths
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
for (let k = 0; k < colspan; k++) {
|
|
176
|
+
carry[c - 1 + k] = Math.max(carry[c - 1 + k] || 0, rowspan);
|
|
177
|
+
}
|
|
178
|
+
return {
|
|
179
|
+
c: cEnd,
|
|
180
|
+
colCount: Math.max(colCount, cEnd - 1),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* @param nileGrid The grid container
|
|
186
|
+
* @param el Element that spans multiple rows
|
|
187
|
+
* @param rowspan Number of rows to span
|
|
188
|
+
*/
|
|
189
|
+
function handleRowspan(nileGrid: NileGrid, el: HTMLElement, rowspan: number) {
|
|
190
|
+
if (rowspan <= 1) return;
|
|
191
|
+
nileGrid.cellHeight ||= el.getBoundingClientRect().height;
|
|
192
|
+
el.style.position = 'absolute';
|
|
193
|
+
el.style.height = `${nileGrid.cellHeight * rowspan}px`;
|
|
194
|
+
el.style.zIndex = '2';
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* @param el Grid item element
|
|
199
|
+
* @param cStart Starting column index
|
|
200
|
+
* @param cEnd Ending column index
|
|
201
|
+
* @param rStart Starting row index
|
|
202
|
+
* @param rowspan Row span value
|
|
203
|
+
*/
|
|
204
|
+
function setGridPosition(
|
|
205
|
+
el: HTMLElement,
|
|
206
|
+
cStart: number,
|
|
207
|
+
cEnd: number,
|
|
208
|
+
rStart: number,
|
|
209
|
+
rowspan: number
|
|
210
|
+
) {
|
|
211
|
+
const rEnd = rStart + rowspan;
|
|
212
|
+
el.style.gridColumn = `${cStart} / ${cEnd}`;
|
|
213
|
+
el.style.gridRow = `${rStart} / ${rEnd}`;
|
|
214
|
+
(el as any).dataset.cStart = String(cStart);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* @param el Grid item element
|
|
219
|
+
* @param cStart Column start index
|
|
220
|
+
* @param opts Sticky configuration options
|
|
221
|
+
* @param stickyLeftIndexes Left sticky indexes
|
|
222
|
+
* @param stickyRightIndexes Right sticky indexes
|
|
223
|
+
* @param columnWidths Array of column widths
|
|
224
|
+
*/
|
|
225
|
+
function handleSticky(
|
|
226
|
+
el: HTMLElement,
|
|
227
|
+
cStart: number,
|
|
228
|
+
opts: { useStickyAttr?: boolean },
|
|
229
|
+
stickyLeftIndexes: number[],
|
|
230
|
+
stickyRightIndexes: number[],
|
|
231
|
+
columnWidths: number[]
|
|
232
|
+
) {
|
|
233
|
+
if (opts.useStickyAttr && el.getAttribute('sticky') === "left" && !stickyLeftIndexes.includes(cStart - 1)) {
|
|
234
|
+
stickyLeftIndexes.push(cStart - 1);
|
|
235
|
+
}
|
|
236
|
+
if (opts.useStickyAttr && el.getAttribute('sticky') === "right" && !stickyRightIndexes.includes(cStart - 1)) {
|
|
237
|
+
stickyRightIndexes.push(cStart - 1);
|
|
238
|
+
}
|
|
239
|
+
applySticky(el, cStart - 1, stickyLeftIndexes, stickyRightIndexes, columnWidths);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* @param carry Rowspan tracking array
|
|
244
|
+
*/
|
|
245
|
+
function decrementCarry(carry: number[]) {
|
|
246
|
+
for (let i = 0; i < carry.length; i++) {
|
|
247
|
+
if (carry[i] > 0) {
|
|
248
|
+
carry[i]--;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* @param el Target grid cell element
|
|
255
|
+
* @param colIndex Column index
|
|
256
|
+
* @param stickyLeftIndexes Sticky-left indexes
|
|
257
|
+
* @param stickyRightIndexes Sticky-right indexes
|
|
258
|
+
* @param columnWidths Column widths array
|
|
259
|
+
*/
|
|
260
|
+
function applySticky(
|
|
261
|
+
el: HTMLElement,
|
|
262
|
+
colIndex: number,
|
|
263
|
+
stickyLeftIndexes: number[],
|
|
264
|
+
stickyRightIndexes: number[],
|
|
265
|
+
columnWidths: number[]
|
|
266
|
+
) {
|
|
267
|
+
const onLeft = stickyLeftIndexes.includes(colIndex);
|
|
268
|
+
const onRight = stickyRightIndexes.includes(colIndex);
|
|
269
|
+
if (!onLeft && !onRight) return;
|
|
270
|
+
|
|
271
|
+
prepareStickyElement(el);
|
|
272
|
+
if (onLeft && !onRight) {
|
|
273
|
+
applyLeftSticky(el, colIndex, stickyLeftIndexes, columnWidths);
|
|
274
|
+
} else {
|
|
275
|
+
applyRightSticky(el, colIndex, stickyRightIndexes, columnWidths);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* @param el Grid item element to prepare for sticky positioning
|
|
281
|
+
*/
|
|
282
|
+
function prepareStickyElement(el: HTMLElement) {
|
|
283
|
+
el.style.position = 'sticky';
|
|
284
|
+
el.style.zIndex = '2';
|
|
285
|
+
el.style.left = '';
|
|
286
|
+
el.style.right = '';
|
|
287
|
+
el.removeAttribute('data-sticky');
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* @param el Target element
|
|
292
|
+
* @param colIndex Column index
|
|
293
|
+
* @param stickyLeftIndexes Sticky-left column indexes
|
|
294
|
+
* @param columnWidths Column width array
|
|
295
|
+
*/
|
|
296
|
+
function applyLeftSticky(
|
|
297
|
+
el: HTMLElement,
|
|
298
|
+
colIndex: number,
|
|
299
|
+
stickyLeftIndexes: number[],
|
|
300
|
+
columnWidths: number[]
|
|
301
|
+
) {
|
|
302
|
+
el.setAttribute('data-sticky', 'left');
|
|
303
|
+
const leftOrder = [...stickyLeftIndexes].sort((a, b) => a - b);
|
|
304
|
+
const pos = leftOrder.indexOf(colIndex);
|
|
305
|
+
const left = computeOffset(leftOrder, pos, columnWidths);
|
|
306
|
+
el.style.left = `${Math.max(0, Math.round(left))}px`;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* @param el Target element
|
|
311
|
+
* @param colIndex Column index
|
|
312
|
+
* @param stickyRightIndexes Sticky-right indexes
|
|
313
|
+
* @param columnWidths Column widths array
|
|
314
|
+
*/
|
|
315
|
+
function applyRightSticky(
|
|
316
|
+
el: HTMLElement,
|
|
317
|
+
colIndex: number,
|
|
318
|
+
stickyRightIndexes: number[],
|
|
319
|
+
columnWidths: number[]
|
|
320
|
+
) {
|
|
321
|
+
el.setAttribute('data-sticky', 'right');
|
|
322
|
+
const rightOrder = [...stickyRightIndexes].sort((a, b) => b - a);
|
|
323
|
+
const pos = rightOrder.indexOf(colIndex);
|
|
324
|
+
const scrollbarComp = getScrollbarComp(el);
|
|
325
|
+
const right = computeOffset(rightOrder, pos, columnWidths, scrollbarComp);
|
|
326
|
+
el.style.right = `${Math.max(0, Math.round(right - 2))}px`;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* @param nileGrid Grid instance to sync shadows for
|
|
331
|
+
*/
|
|
332
|
+
export function syncStickyShadows(nileGrid: NileGrid) {
|
|
333
|
+
const { showRightOnLeftStickies, showLeftOnRightStickies } = getShadowStates(nileGrid);
|
|
334
|
+
const { head, body } = getHeadAndBody(nileGrid);
|
|
335
|
+
|
|
336
|
+
toggleStickyShadow(head, 'nile-grid-head-item', 'left', 'shadow-right', showRightOnLeftStickies);
|
|
337
|
+
toggleStickyShadow(body, 'nile-grid-cell-item', 'left', 'shadow-right', showRightOnLeftStickies);
|
|
338
|
+
toggleStickyShadow(head, 'nile-grid-head-item', 'right', 'shadow-left', showLeftOnRightStickies);
|
|
339
|
+
toggleStickyShadow(body, 'nile-grid-cell-item', 'right', 'shadow-left', showLeftOnRightStickies);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* @param nileGrid Grid instance
|
|
344
|
+
* @returns Object containing booleans for left/right shadow visibility
|
|
345
|
+
*/
|
|
346
|
+
function getShadowStates(nileGrid: NileGrid) {
|
|
347
|
+
const max = Math.max(0, nileGrid.scrollWidth - nileGrid.clientWidth);
|
|
348
|
+
return {
|
|
349
|
+
showRightOnLeftStickies: nileGrid.scrollLeft > 0,
|
|
350
|
+
showLeftOnRightStickies: nileGrid.scrollLeft < max
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* @param root Root element (head or body)
|
|
356
|
+
* @param tag Target tag selector
|
|
357
|
+
* @param side Sticky side ('left' or 'right')
|
|
358
|
+
* @param cls Shadow CSS class to toggle
|
|
359
|
+
* @param on Whether to apply or remove the shadow
|
|
360
|
+
*/
|
|
361
|
+
function toggleStickyShadow(
|
|
362
|
+
root: HTMLElement | undefined,
|
|
363
|
+
tag: string,
|
|
364
|
+
side: 'left' | 'right',
|
|
365
|
+
cls: string,
|
|
366
|
+
on: boolean
|
|
367
|
+
) {
|
|
368
|
+
if (!root) return;
|
|
369
|
+
const sel = `${tag}[data-sticky="${side}"]`;
|
|
370
|
+
root.querySelectorAll<HTMLElement>(sel).forEach(el => el.classList.toggle(cls, on));
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/** rebuildTemplate
|
|
374
|
+
* @param colCount Number of columns
|
|
375
|
+
* @param columnWidths Array of explicit column widths (px)
|
|
376
|
+
* @returns CSS grid-template-columns string
|
|
377
|
+
*/
|
|
378
|
+
export const rebuildTemplate = (
|
|
379
|
+
colCount: number,
|
|
380
|
+
columnWidths: number[]
|
|
381
|
+
): string => {
|
|
382
|
+
const parts: string[] = [];
|
|
383
|
+
|
|
384
|
+
for (let i = 0; i < colCount; i++) {
|
|
385
|
+
const explicit = columnWidths[i];
|
|
386
|
+
if (i === colCount - 1) {
|
|
387
|
+
parts.push(`minmax(${explicit}px, auto)`);
|
|
388
|
+
} else {
|
|
389
|
+
parts.push(`${explicit}px`);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return parts.join(' ');
|
|
393
|
+
};
|
|
394
|
+
|
|
395
|
+
/** computeHeadLayout
|
|
396
|
+
* @param nileGrid Grid instance
|
|
397
|
+
* @param headRows Header rows (<nile-grid-row>[])
|
|
398
|
+
* @param carryHead Rowspan carry tracking array
|
|
399
|
+
* @param colCount Current column count
|
|
400
|
+
* @param stickyLeftIndexes Left-sticky indexes
|
|
401
|
+
* @param stickyRightIndexes Right-sticky indexes
|
|
402
|
+
* @param columnWidths Column widths array
|
|
403
|
+
* @returns Final column count after header layout
|
|
404
|
+
*/
|
|
405
|
+
function computeHeadLayout(
|
|
406
|
+
nileGrid: NileGrid,
|
|
407
|
+
headRows: HTMLElement[],
|
|
408
|
+
carryHead: number[],
|
|
409
|
+
colCount: number,
|
|
410
|
+
stickyLeftIndexes: number[],
|
|
411
|
+
stickyRightIndexes: number[],
|
|
412
|
+
columnWidths: number[]
|
|
413
|
+
): number {
|
|
414
|
+
return layoutRows(
|
|
415
|
+
nileGrid,
|
|
416
|
+
headRows,
|
|
417
|
+
carryHead,
|
|
418
|
+
colCount,
|
|
419
|
+
stickyLeftIndexes,
|
|
420
|
+
stickyRightIndexes,
|
|
421
|
+
columnWidths,
|
|
422
|
+
{
|
|
423
|
+
itemSelector: 'nile-grid-head-item',
|
|
424
|
+
useStickyAttr: true,
|
|
425
|
+
handleRowBg: false,
|
|
426
|
+
}
|
|
427
|
+
);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
/** computeBodyLayout
|
|
431
|
+
* @param nileGrid Grid instance
|
|
432
|
+
* @param bodyRows Body rows (<nile-grid-row>[])
|
|
433
|
+
* @param carryBody Rowspan carry tracking array
|
|
434
|
+
* @param colCount Current column count
|
|
435
|
+
* @param stickyLeftIndexes Left-sticky indexes
|
|
436
|
+
* @param stickyRightIndexes Right-sticky indexes
|
|
437
|
+
* @param columnWidths Column widths array
|
|
438
|
+
* @returns Final column count after body layout
|
|
439
|
+
*/
|
|
440
|
+
function computeBodyLayout(
|
|
441
|
+
nileGrid: NileGrid,
|
|
442
|
+
bodyRows: HTMLElement[],
|
|
443
|
+
carryBody: number[],
|
|
444
|
+
colCount: number,
|
|
445
|
+
stickyLeftIndexes: number[],
|
|
446
|
+
stickyRightIndexes: number[],
|
|
447
|
+
columnWidths: number[]
|
|
448
|
+
): number {
|
|
449
|
+
return layoutRows(
|
|
450
|
+
nileGrid,
|
|
451
|
+
bodyRows,
|
|
452
|
+
carryBody,
|
|
453
|
+
colCount,
|
|
454
|
+
stickyLeftIndexes,
|
|
455
|
+
stickyRightIndexes,
|
|
456
|
+
columnWidths,
|
|
457
|
+
{
|
|
458
|
+
itemSelector: 'nile-grid-cell-item',
|
|
459
|
+
useStickyAttr: false,
|
|
460
|
+
handleRowBg: true,
|
|
461
|
+
}
|
|
462
|
+
);
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
/**
|
|
466
|
+
* @param nileGrid Grid container element
|
|
467
|
+
* @param colCount Total number of columns
|
|
468
|
+
* @param columnWidths Column width array
|
|
469
|
+
* @param headElement Header element for template update
|
|
470
|
+
*/
|
|
471
|
+
export function applyColumnsTemplate(
|
|
472
|
+
nileGrid: NileGrid,
|
|
473
|
+
columnWidths: number[]
|
|
474
|
+
) {
|
|
475
|
+
const cols = columnWidths
|
|
476
|
+
.map((w, idx) => {
|
|
477
|
+
if (idx === columnWidths.length - 1) {
|
|
478
|
+
return `minmax(${Math.round(w)}px, auto)`;
|
|
479
|
+
}
|
|
480
|
+
return `${Math.max(0, Math.round(w))}px`;
|
|
481
|
+
})
|
|
482
|
+
.join(' ');
|
|
483
|
+
nileGrid.style.setProperty('--nile-grid-columns', cols);
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* @param order Array of sticky column indexes
|
|
488
|
+
* @param pos Current position within order
|
|
489
|
+
* @param widths Column widths
|
|
490
|
+
* @param base Base offset value
|
|
491
|
+
* @returns Computed pixel offset
|
|
492
|
+
*/
|
|
493
|
+
function computeOffset(
|
|
494
|
+
order: number[],
|
|
495
|
+
pos: number,
|
|
496
|
+
widths: number[],
|
|
497
|
+
base = 0
|
|
498
|
+
) {
|
|
499
|
+
let total = base;
|
|
500
|
+
for (let i = 0; i < pos; i++) total += widths[order[i]] ?? 0;
|
|
501
|
+
return total;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
/**
|
|
505
|
+
* @param nileGrid Grid instance
|
|
506
|
+
* @returns Head and body elements from the grid slot
|
|
507
|
+
*/
|
|
508
|
+
function getHeadAndBody(nileGrid: NileGrid) {
|
|
509
|
+
if (!nileGrid.shadowRoot) return { head: undefined, body: undefined };
|
|
510
|
+
const assigned = nileGrid.slotEl.assignedElements();
|
|
511
|
+
const find = (tag: string) =>
|
|
512
|
+
assigned.find(n => n.tagName.toLowerCase() === tag) as HTMLElement | undefined;
|
|
513
|
+
return { head: find('nile-grid-head'), body: find('nile-grid-body') };
|
|
514
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { NileGrid } from './nile-grid';
|
|
2
|
+
import { HeadItemEl } from './nile-grid.types';
|
|
3
|
+
import { totalReducible, takeFromRight, giveToRight } from './nile-grid.width';
|
|
4
|
+
import { rebuildTemplate, syncStickyShadows, applyColumnsTemplate } from './nile-grid.layout';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @param minColumnWidth Minimum allowed column width
|
|
8
|
+
* @param resizeStart Guide line element (start)
|
|
9
|
+
* @param resizeEnd Guide line element (end)
|
|
10
|
+
* @param col Active column index
|
|
11
|
+
* @param scrollHeight Height to apply to guides
|
|
12
|
+
* @param columnWidths Current column widths
|
|
13
|
+
* @returns void
|
|
14
|
+
*/
|
|
15
|
+
export const resizeLinesHandler = (
|
|
16
|
+
minColumnWidth: number,
|
|
17
|
+
resizeStart: HTMLElement,
|
|
18
|
+
resizeEnd: HTMLElement,
|
|
19
|
+
col: number,
|
|
20
|
+
scrollHeight: number,
|
|
21
|
+
columnWidths: number[],
|
|
22
|
+
) => {
|
|
23
|
+
resizeStart.style.display = 'block';
|
|
24
|
+
resizeEnd.style.display = 'block';
|
|
25
|
+
resizeStart.style.height = scrollHeight + 'px';
|
|
26
|
+
resizeEnd.style.height = scrollHeight + 'px';
|
|
27
|
+
const floor = minColumnWidth;
|
|
28
|
+
const safe = (n: number) => Math.max(0, Math.round(n || 0));
|
|
29
|
+
const sum = (arr: number[], endExclusive: number) => safe(arr.slice(0, Math.max(0, endExclusive)).reduce((a, b) => a + (b || 0), 0));
|
|
30
|
+
|
|
31
|
+
const totalGridWidth = safe(columnWidths.reduce((a, b) => a + (b || 0), 0));
|
|
32
|
+
const baseLeft = sum(columnWidths, col);
|
|
33
|
+
const appliedColWidth = safe(Math.max(floor, columnWidths[col] ?? floor));
|
|
34
|
+
let handleLeft = baseLeft + appliedColWidth;
|
|
35
|
+
|
|
36
|
+
const minEdge = baseLeft + floor;
|
|
37
|
+
const maxEdge = totalGridWidth;
|
|
38
|
+
handleLeft = Math.min(Math.max(handleLeft, minEdge), maxEdge);
|
|
39
|
+
handleLeft = Math.max(handleLeft, 20);
|
|
40
|
+
|
|
41
|
+
resizeStart.style.left = `${handleLeft - 6}px`;
|
|
42
|
+
resizeEnd.style.left = `${handleLeft - 2}px`;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @param targetWidth New computed width in pixels
|
|
47
|
+
* @param min Minimum allowed width
|
|
48
|
+
* @param max Maximum allowed width
|
|
49
|
+
* @returns Adjusted column width
|
|
50
|
+
*/
|
|
51
|
+
export function computeNewWidth(opts: {
|
|
52
|
+
target: HTMLElement;
|
|
53
|
+
col: number;
|
|
54
|
+
widthPx: number;
|
|
55
|
+
floor: number;
|
|
56
|
+
columnWidths: number[];
|
|
57
|
+
}) {
|
|
58
|
+
const { target, col, widthPx, floor, columnWidths } = opts;
|
|
59
|
+
const hasSpan =
|
|
60
|
+
!!target.getAttribute('colspan') &&
|
|
61
|
+
parseInt(target.getAttribute('colspan')!, 10) > 1;
|
|
62
|
+
const prevW = columnWidths[col] ?? floor;
|
|
63
|
+
const newWraw = hasSpan ? widthPx - (columnWidths[col - 1] ?? 0) : widthPx;
|
|
64
|
+
const newW = Math.max(
|
|
65
|
+
floor,
|
|
66
|
+
Math.round(Number.isFinite(newWraw) ? newWraw : prevW)
|
|
67
|
+
);
|
|
68
|
+
return { prevW, newW, delta0: newW - prevW };
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* @param columnWidths Current widths array
|
|
73
|
+
* @param containerWidth Container total width
|
|
74
|
+
*/
|
|
75
|
+
export function resizeNoScroll(opts: {
|
|
76
|
+
grid: NileGrid;
|
|
77
|
+
col: number;
|
|
78
|
+
prevW: number;
|
|
79
|
+
newW: number;
|
|
80
|
+
floor: number;
|
|
81
|
+
}) {
|
|
82
|
+
const { grid, col, prevW, newW, floor } = opts;
|
|
83
|
+
let delta = newW - prevW;
|
|
84
|
+
|
|
85
|
+
if (delta > 0) {
|
|
86
|
+
const rightReducible = totalReducible(grid.columnWidths, col + 1, floor);
|
|
87
|
+
if (rightReducible <= 0) return;
|
|
88
|
+
delta = Math.min(delta, rightReducible);
|
|
89
|
+
grid.columnWidths[col] = prevW + delta;
|
|
90
|
+
if (delta > 0) takeFromRight(grid.columnWidths, col + 1, delta, floor);
|
|
91
|
+
} else {
|
|
92
|
+
if (col === grid.columnWidths.length - 1) return;
|
|
93
|
+
const shrink = -delta;
|
|
94
|
+
const newColW = Math.max(floor, prevW - shrink);
|
|
95
|
+
const actualShrink = prevW - newColW;
|
|
96
|
+
grid.columnWidths[col] = newColW;
|
|
97
|
+
const remaining = giveToRight(grid.columnWidths, col + 1, actualShrink);
|
|
98
|
+
if (remaining > 0) grid.columnWidths[col] = prevW;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* @param columnWidths Current widths
|
|
104
|
+
* @param containerWidth Container width
|
|
105
|
+
*/
|
|
106
|
+
export function resizeWithScroll(opts: {
|
|
107
|
+
grid: NileGrid;
|
|
108
|
+
col: number;
|
|
109
|
+
newW: number;
|
|
110
|
+
}) {
|
|
111
|
+
const { grid, col, newW } = opts;
|
|
112
|
+
grid.columnWidths[col] = newW;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* @param el Target element within grid
|
|
117
|
+
* @returns Scrollbar width compensation value
|
|
118
|
+
*/
|
|
119
|
+
export function getScrollbarComp(el: HTMLElement) {
|
|
120
|
+
const scroller = el.closest('nile-grid') as HTMLElement | null;
|
|
121
|
+
return scroller ? scroller.offsetWidth - scroller.clientWidth : 0;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* @param nileGrid The parent grid
|
|
126
|
+
* @param columnWidths New column width array
|
|
127
|
+
*/
|
|
128
|
+
export function applyAfterResize(grid: any, col: number) {
|
|
129
|
+
resizeLinesHandler(
|
|
130
|
+
grid.minColumnWidth,
|
|
131
|
+
grid.resizeStart,
|
|
132
|
+
grid.resizeEnd,
|
|
133
|
+
col,
|
|
134
|
+
grid.scrollHeight,
|
|
135
|
+
grid.columnWidths
|
|
136
|
+
);
|
|
137
|
+
grid.colTemplate = rebuildTemplate(
|
|
138
|
+
grid.columnWidths.length,
|
|
139
|
+
grid.columnWidths
|
|
140
|
+
);
|
|
141
|
+
syncStickyShadows(grid);
|
|
142
|
+
applyColumnsTemplate(grid, grid.columnWidths);
|
|
143
|
+
}
|