UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 11.8 kB
{"version":3,"file":"table-layout.mjs","names":[],"sources":["../../../../../../packages/components/table/src/table-layout.ts"],"sourcesContent":["import { isRef, nextTick, ref } from 'vue'\nimport { isNull } from 'lodash-unified'\nimport { hasOwn, isClient, isNumber, isString } from '@element-plus/utils'\nimport { parseHeight } from './util'\n\nimport type { Ref } from 'vue'\nimport type { TableColumnCtx } from './table-column/defaults'\nimport type { TableHeader } from './table-header'\nimport type { DefaultRow, Table } from './table/defaults'\nimport type { Store } from './store'\n\nclass TableLayout<T extends DefaultRow> {\n observers: TableHeader[]\n table: Table<T>\n store: Store<T>\n columns: TableColumnCtx<T>[]\n fit: boolean\n showHeader: boolean\n\n height: Ref<null | number>\n scrollX: Ref<boolean>\n scrollY: Ref<boolean>\n bodyWidth: Ref<null | number>\n fixedWidth: Ref<null | number>\n rightFixedWidth: Ref<null | number>\n tableHeight!: Ref<null | number>\n headerHeight!: Ref<null | number> // Table Header Height\n appendHeight!: Ref<null | number> // Append Slot Height\n footerHeight!: Ref<null | number> // Table Footer Height\n gutterWidth: number\n constructor(options: Record<string, any>) {\n this.observers = []\n this.table = null as unknown as Table<T>\n this.store = null as unknown as Store<T>\n this.columns = []\n this.fit = true\n this.showHeader = true\n this.height = ref(null)\n this.scrollX = ref(false)\n this.scrollY = ref(false)\n this.bodyWidth = ref(null)\n this.fixedWidth = ref(null)\n this.rightFixedWidth = ref(null)\n this.gutterWidth = 0\n for (const name in options) {\n if (hasOwn(options, name)) {\n if (isRef(this[name])) {\n ;(this[name] as Ref).value = options[name]\n } else {\n this[name as keyof typeof this] = options[name]\n }\n }\n }\n if (!this.table) {\n throw new Error('Table is required for Table Layout')\n }\n if (!this.store) {\n throw new Error('Store is required for Table Layout')\n }\n }\n\n updateScrollY() {\n const height = this.height.value\n /**\n * When the height is not initialized, it is null.\n * After the table is initialized, when the height is not configured, the height is 0.\n */\n if (isNull(height)) return false\n const scrollBarRef = this.table.refs.scrollBarRef\n if (this.table.vnode.el && scrollBarRef?.wrapRef) {\n let scrollY = true\n const prevScrollY = this.scrollY.value\n scrollY =\n scrollBarRef.wrapRef.scrollHeight > scrollBarRef.wrapRef.clientHeight\n this.scrollY.value = scrollY\n return prevScrollY !== scrollY\n }\n return false\n }\n\n setHeight(value: string | number | null, prop = 'height') {\n if (!isClient) return\n const el = this.table.vnode.el\n value = parseHeight(value)\n this.height.value = Number(value)\n\n if (!el && (value || value === 0)) {\n nextTick(() => this.setHeight(value, prop))\n return\n }\n\n if (el && isNumber(value)) {\n el.style[prop] = `${value}px`\n this.updateElsHeight()\n } else if (el && isString(value)) {\n el.style[prop] = value\n this.updateElsHeight()\n }\n }\n\n setMaxHeight(value: string | number | null) {\n this.setHeight(value, 'max-height')\n }\n\n getFlattenColumns(): TableColumnCtx<T>[] {\n const flattenColumns: TableColumnCtx<T>[] = []\n const columns = this.table.store.states.columns.value\n columns.forEach((column) => {\n if (column.isColumnGroup) {\n // eslint-disable-next-line prefer-spread\n flattenColumns.push.apply(flattenColumns, column.columns)\n } else {\n flattenColumns.push(column)\n }\n })\n\n return flattenColumns\n }\n\n updateElsHeight() {\n this.updateScrollY()\n this.notifyObservers('scrollable')\n }\n\n headerDisplayNone(elm: HTMLElement) {\n if (!elm) return true\n let headerChild = elm\n while (headerChild.tagName !== 'DIV') {\n if (getComputedStyle(headerChild).display === 'none') {\n return true\n }\n headerChild = headerChild.parentElement!\n }\n return false\n }\n\n updateColumnsWidth() {\n if (!isClient) return\n const fit = this.fit\n const bodyWidth = this.table.vnode.el?.clientWidth\n let bodyMinWidth = 0\n\n const flattenColumns = this.getFlattenColumns()\n const flexColumns = flattenColumns.filter(\n (column) => !isNumber(column.width)\n )\n flattenColumns.forEach((column) => {\n // Clean those columns whose width changed from flex to unflex\n if (isNumber(column.width) && column.realWidth) column.realWidth = null\n })\n if (flexColumns.length > 0 && fit) {\n flattenColumns.forEach((column) => {\n bodyMinWidth += Number(column.width || column.minWidth || 80)\n })\n if (bodyMinWidth <= bodyWidth) {\n // DON'T HAVE SCROLL BAR\n this.scrollX.value = false\n\n const totalFlexWidth = bodyWidth - bodyMinWidth\n\n if (flexColumns.length === 1) {\n flexColumns[0].realWidth =\n Number(flexColumns[0].minWidth || 80) + totalFlexWidth\n } else {\n const allColumnsWidth = flexColumns.reduce(\n (prev, column) => prev + Number(column.minWidth || 80),\n 0\n )\n const flexWidthPerPixel = totalFlexWidth / allColumnsWidth\n let noneFirstWidth = 0\n\n flexColumns.forEach((column, index) => {\n if (index === 0) return\n const flexWidth = Math.floor(\n Number(column.minWidth || 80) * flexWidthPerPixel\n )\n noneFirstWidth += flexWidth\n column.realWidth = Number(column.minWidth || 80) + flexWidth\n })\n\n flexColumns[0].realWidth =\n Number(flexColumns[0].minWidth || 80) +\n totalFlexWidth -\n noneFirstWidth\n }\n } else {\n // HAVE HORIZONTAL SCROLL BAR\n this.scrollX.value = true\n flexColumns.forEach((column) => {\n column.realWidth = Number(column.minWidth)\n })\n }\n\n this.bodyWidth.value = Math.max(bodyMinWidth, bodyWidth)\n this.table.state.resizeState.value.width = this.bodyWidth.value\n } else {\n flattenColumns.forEach((column) => {\n if (!column.width && !column.minWidth) {\n column.realWidth = 80\n } else {\n column.realWidth = Number(column.width || column.minWidth)\n }\n bodyMinWidth += column.realWidth\n })\n this.scrollX.value = bodyMinWidth > bodyWidth\n\n this.bodyWidth.value = bodyMinWidth\n }\n\n const fixedColumns = this.store.states.fixedColumns.value\n\n if (fixedColumns.length > 0) {\n let fixedWidth = 0\n fixedColumns.forEach((column) => {\n fixedWidth += Number(column.realWidth || column.width)\n })\n\n this.fixedWidth.value = fixedWidth\n }\n\n const rightFixedColumns = this.store.states.rightFixedColumns.value\n if (rightFixedColumns.length > 0) {\n let rightFixedWidth = 0\n rightFixedColumns.forEach((column) => {\n rightFixedWidth += Number(column.realWidth || column.width)\n })\n\n this.rightFixedWidth.value = rightFixedWidth\n }\n this.notifyObservers('columns')\n }\n\n addObserver(observer: TableHeader) {\n this.observers.push(observer)\n }\n\n removeObserver(observer: TableHeader) {\n const index = this.observers.indexOf(observer)\n if (index !== -1) {\n this.observers.splice(index, 1)\n }\n }\n\n notifyObservers(event: string) {\n const observers = this.observers\n observers.forEach((observer) => {\n switch (event) {\n case 'columns':\n observer.state?.onColumnsChange(this as TableLayout<DefaultRow>)\n break\n case 'scrollable':\n observer.state?.onScrollableChange(this as TableLayout<DefaultRow>)\n break\n default:\n throw new Error(`Table Layout don't have event ${event}.`)\n }\n })\n }\n}\n\nexport default TableLayout\n"],"mappings":";;;;;;;;AAWA,IAAM,cAAN,MAAwC;CAmBtC,YAAY,SAA8B;AACxC,OAAK,YAAY,EAAE;AACnB,OAAK,QAAQ;AACb,OAAK,QAAQ;AACb,OAAK,UAAU,EAAE;AACjB,OAAK,MAAM;AACX,OAAK,aAAa;AAClB,OAAK,SAAS,IAAI,KAAK;AACvB,OAAK,UAAU,IAAI,MAAM;AACzB,OAAK,UAAU,IAAI,MAAM;AACzB,OAAK,YAAY,IAAI,KAAK;AAC1B,OAAK,aAAa,IAAI,KAAK;AAC3B,OAAK,kBAAkB,IAAI,KAAK;AAChC,OAAK,cAAc;AACnB,OAAK,MAAM,QAAQ,QACjB,KAAI,OAAO,SAAS,KAAK,CACvB,KAAI,MAAM,KAAK,MAAM,CAClB,CAAC,KAAK,MAAc,QAAQ,QAAQ;MAErC,MAAK,QAA6B,QAAQ;AAIhD,MAAI,CAAC,KAAK,MACR,OAAM,IAAI,MAAM,qCAAqC;AAEvD,MAAI,CAAC,KAAK,MACR,OAAM,IAAI,MAAM,qCAAqC;;CAIzD,gBAAgB;EACd,MAAM,SAAS,KAAK,OAAO;;;;;AAK3B,MAAI,OAAO,OAAO,CAAE,QAAO;EAC3B,MAAM,eAAe,KAAK,MAAM,KAAK;AACrC,MAAI,KAAK,MAAM,MAAM,MAAM,cAAc,SAAS;GAChD,IAAI,UAAU;GACd,MAAM,cAAc,KAAK,QAAQ;AACjC,aACE,aAAa,QAAQ,eAAe,aAAa,QAAQ;AAC3D,QAAK,QAAQ,QAAQ;AACrB,UAAO,gBAAgB;;AAEzB,SAAO;;CAGT,UAAU,OAA+B,OAAO,UAAU;AACxD,MAAI,CAAC,SAAU;EACf,MAAM,KAAK,KAAK,MAAM,MAAM;AAC5B,UAAQ,YAAY,MAAM;AAC1B,OAAK,OAAO,QAAQ,OAAO,MAAM;AAEjC,MAAI,CAAC,OAAO,SAAS,UAAU,IAAI;AACjC,kBAAe,KAAK,UAAU,OAAO,KAAK,CAAC;AAC3C;;AAGF,MAAI,MAAM,SAAS,MAAM,EAAE;AACzB,MAAG,MAAM,QAAQ,GAAG,MAAM;AAC1B,QAAK,iBAAiB;aACb,MAAM,SAAS,MAAM,EAAE;AAChC,MAAG,MAAM,QAAQ;AACjB,QAAK,iBAAiB;;;CAI1B,aAAa,OAA+B;AAC1C,OAAK,UAAU,OAAO,aAAa;;CAGrC,oBAAyC;EACvC,MAAM,iBAAsC,EAAE;AAE9C,EADgB,KAAK,MAAM,MAAM,OAAO,QAAQ,MACxC,SAAS,WAAW;AAC1B,OAAI,OAAO,cAET,gBAAe,KAAK,MAAM,gBAAgB,OAAO,QAAQ;OAEzD,gBAAe,KAAK,OAAO;IAE7B;AAEF,SAAO;;CAGT,kBAAkB;AAChB,OAAK,eAAe;AACpB,OAAK,gBAAgB,aAAa;;CAGpC,kBAAkB,KAAkB;AAClC,MAAI,CAAC,IAAK,QAAO;EACjB,IAAI,cAAc;AAClB,SAAO,YAAY,YAAY,OAAO;AACpC,OAAI,iBAAiB,YAAY,CAAC,YAAY,OAC5C,QAAO;AAET,iBAAc,YAAY;;AAE5B,SAAO;;CAGT,qBAAqB;AACnB,MAAI,CAAC,SAAU;EACf,MAAM,MAAM,KAAK;EACjB,MAAM,YAAY,KAAK,MAAM,MAAM,IAAI;EACvC,IAAI,eAAe;EAEnB,MAAM,iBAAiB,KAAK,mBAAmB;EAC/C,MAAM,cAAc,eAAe,QAChC,WAAW,CAAC,SAAS,OAAO,MAAM,CACpC;AACD,iBAAe,SAAS,WAAW;AAEjC,OAAI,SAAS,OAAO,MAAM,IAAI,OAAO,UAAW,QAAO,YAAY;IACnE;AACF,MAAI,YAAY,SAAS,KAAK,KAAK;AACjC,kBAAe,SAAS,WAAW;AACjC,oBAAgB,OAAO,OAAO,SAAS,OAAO,YAAY,GAAG;KAC7D;AACF,OAAI,gBAAgB,WAAW;AAE7B,SAAK,QAAQ,QAAQ;IAErB,MAAM,iBAAiB,YAAY;AAEnC,QAAI,YAAY,WAAW,EACzB,aAAY,GAAG,YACb,OAAO,YAAY,GAAG,YAAY,GAAG,GAAG;SACrC;KAKL,MAAM,oBAAoB,iBAJF,YAAY,QACjC,MAAM,WAAW,OAAO,OAAO,OAAO,YAAY,GAAG,EACtD,EACD;KAED,IAAI,iBAAiB;AAErB,iBAAY,SAAS,QAAQ,UAAU;AACrC,UAAI,UAAU,EAAG;MACjB,MAAM,YAAY,KAAK,MACrB,OAAO,OAAO,YAAY,GAAG,GAAG,kBACjC;AACD,wBAAkB;AAClB,aAAO,YAAY,OAAO,OAAO,YAAY,GAAG,GAAG;OACnD;AAEF,iBAAY,GAAG,YACb,OAAO,YAAY,GAAG,YAAY,GAAG,GACrC,iBACA;;UAEC;AAEL,SAAK,QAAQ,QAAQ;AACrB,gBAAY,SAAS,WAAW;AAC9B,YAAO,YAAY,OAAO,OAAO,SAAS;MAC1C;;AAGJ,QAAK,UAAU,QAAQ,KAAK,IAAI,cAAc,UAAU;AACxD,QAAK,MAAM,MAAM,YAAY,MAAM,QAAQ,KAAK,UAAU;SACrD;AACL,kBAAe,SAAS,WAAW;AACjC,QAAI,CAAC,OAAO,SAAS,CAAC,OAAO,SAC3B,QAAO,YAAY;QAEnB,QAAO,YAAY,OAAO,OAAO,SAAS,OAAO,SAAS;AAE5D,oBAAgB,OAAO;KACvB;AACF,QAAK,QAAQ,QAAQ,eAAe;AAEpC,QAAK,UAAU,QAAQ;;EAGzB,MAAM,eAAe,KAAK,MAAM,OAAO,aAAa;AAEpD,MAAI,aAAa,SAAS,GAAG;GAC3B,IAAI,aAAa;AACjB,gBAAa,SAAS,WAAW;AAC/B,kBAAc,OAAO,OAAO,aAAa,OAAO,MAAM;KACtD;AAEF,QAAK,WAAW,QAAQ;;EAG1B,MAAM,oBAAoB,KAAK,MAAM,OAAO,kBAAkB;AAC9D,MAAI,kBAAkB,SAAS,GAAG;GAChC,IAAI,kBAAkB;AACtB,qBAAkB,SAAS,WAAW;AACpC,uBAAmB,OAAO,OAAO,aAAa,OAAO,MAAM;KAC3D;AAEF,QAAK,gBAAgB,QAAQ;;AAE/B,OAAK,gBAAgB,UAAU;;CAGjC,YAAY,UAAuB;AACjC,OAAK,UAAU,KAAK,SAAS;;CAG/B,eAAe,UAAuB;EACpC,MAAM,QAAQ,KAAK,UAAU,QAAQ,SAAS;AAC9C,MAAI,UAAU,GACZ,MAAK,UAAU,OAAO,OAAO,EAAE;;CAInC,gBAAgB,OAAe;AAE7B,EADkB,KAAK,UACb,SAAS,aAAa;AAC9B,WAAQ,OAAR;IACE,KAAK;AACH,cAAS,OAAO,gBAAgB,KAAgC;AAChE;IACF,KAAK;AACH,cAAS,OAAO,mBAAmB,KAAgC;AACnE;IACF,QACE,OAAM,IAAI,MAAM,iCAAiC,MAAM,GAAG;;IAE9D"}