diff --git a/oo_list_manager/static/src/views/list/list_controller.js b/oo_list_manager/static/src/views/list/list_controller.js index ebd1ffd53..38d003986 100644 --- a/oo_list_manager/static/src/views/list/list_controller.js +++ b/oo_list_manager/static/src/views/list/list_controller.js @@ -69,11 +69,40 @@ patch(ListController.prototype, { } }, + /** + * 固定列 + * @param ev + */ + onClickLock(ev){ + this.isChange = true; + const id = ev.currentTarget.dataset.id; + const columns = [...this.ooManager.columns]; + const columnIdx = columns.findIndex(item => item.id === id); + if (columnIdx >= 0) { + columns[columnIdx].lock = !columns[columnIdx].lock; + } + const lockedTrue = columns.filter(item => item.lock); + const lockedFalse = columns.filter(item => !item.lock); + lockedTrue.forEach((column, i) => { + column.seq = i + 1; + }); + lockedFalse.forEach((column, i) => { + column.seq = i + 1 + lockedTrue.length; + }); + this.ooManager.columns = [...lockedTrue, ...lockedFalse]; + }, + + /** + * 序号 + */ onChangeSerialNum() { this.isChange = true; this.ooManager.serial_num = !this.ooManager.serial_num; }, + /** + * 表头搜索 + */ onChangeFilter() { this.isChange = true; this.ooManager.filter = !this.ooManager.filter; diff --git a/oo_list_manager/static/src/views/list/list_controller.xml b/oo_list_manager/static/src/views/list/list_controller.xml index 14a6c4de4..ee2f73603 100644 --- a/oo_list_manager/static/src/views/list/list_controller.xml +++ b/oo_list_manager/static/src/views/list/list_controller.xml @@ -35,12 +35,15 @@
- +
+
+ +
diff --git a/oo_list_manager/static/src/views/list/list_renderer.js b/oo_list_manager/static/src/views/list/list_renderer.js index e1a1bbc2b..1daf2e6c9 100644 --- a/oo_list_manager/static/src/views/list/list_renderer.js +++ b/oo_list_manager/static/src/views/list/list_renderer.js @@ -4,13 +4,28 @@ import {ListRenderer} from "@web/views/list/list_renderer"; import {patch} from "@web/core/utils/patch"; import {loadJS, loadCSS} from "@web/core/assets"; import {ListRendererCust} from "@tree_view_advanced_filter/tree_view_advanced_filter/tree" +import {onWillDestroy, useEffect} from "@odoo/owl"; patch(ListRenderer.prototype, { setup() { super.setup(); - if(this.isX2Many) { + if (this.isX2Many) { this.props.ooManagerSerialNum = true; } + const computeFunction = this.computeFreeze.bind(this); + const resizeObserver = new ResizeObserver(computeFunction); + useEffect( + (tableEl) => { + if (tableEl) { + resizeObserver.observe(tableEl); + return () => resizeObserver.unobserve(tableEl); + } + }, + () => [this.tableRef.el] + ); + onWillDestroy(() => { + resizeObserver.disconnect(); + }); }, getActiveColumns(list) { @@ -38,6 +53,13 @@ patch(ListRenderer.prototype, { return seqX - seqY; }); + for (const column of columns) { + const mColumn = this.props.ooManagerColumns.find(item => item.id === column.id) + if (mColumn) { + column.label = mColumn.string; + } + } + return columns } else { @@ -53,6 +75,89 @@ patch(ListRenderer.prototype, { headers.forEach((th, index) => { th.style.minWidth = `${Math.floor(this.columnWidths[index])}px`; }); + this._computeLock(); + }, + + computeFreeze() { + const computeFunction = this._computeLock.bind(this); + const compute = () => { + computeFunction(); + window.removeEventListener('scroll', compute, true) + } + window.addEventListener('scroll', compute, true); + return new Promise(resolve => { + setTimeout(computeFunction, 200); + }) + }, + + _computeLock() { + const table = this.tableRef.el; + if (!table) return; + const thead = [...table.querySelectorAll('thead tr th')]; + const filter_box = [...table.querySelectorAll('thead .o_filter_box td')]; + const tbody = [...table.querySelectorAll('tbody tr')]; + const tfoot = [...table.querySelectorAll('tfoot tr')]; + const setStyle = (element, left) => { + element.classList.add('position-sticky'); + Object.assign(element.style, { + left: `${left}px`, + backgroundColor: 'white', + zIndex: '4' + }) + } + const removeStyle = (element) => { + element.classList.remove('position-sticky'); + element.style.left = 'auto'; + element.style.zIndex = ''; + } + for (let i = 0; i < thead.length; i++) { + const theadThClassList = thead[i].classList + if (theadThClassList.contains('o_column_freeze') || theadThClassList.contains('o_list_record_selector') || theadThClassList.contains('list-number')) { + let left = 0; + for (let j = 0; j < i; j++) { + left += thead[j].getBoundingClientRect().width; + } + for (const tbodyTrElement of tbody) { + if (tbodyTrElement.classList.contains('o_data_row')) { + const td = tbodyTrElement.querySelectorAll('td')[i]; + td && setStyle(td, left); + } + } + for (const tfootTrElement of tfoot) { + const td = tfootTrElement.querySelectorAll('td')[i]; + td && setStyle(td, left); + } + setStyle(thead[i], left); + if (filter_box[i]) { + setStyle(filter_box[i], left); + } + } else { + removeStyle(thead[i]); + if (filter_box[i]) { + removeStyle(filter_box[i]); + } + for (const tbodyTrElement of tbody) { + if (tbodyTrElement.classList.contains('o_data_row')) { + const td = tbodyTrElement.querySelectorAll('td')[i]; + td && removeStyle(td); + } + } + for (const tfootTrElement of tfoot) { + const td = tfootTrElement.querySelectorAll('td')[i]; + td && removeStyle(td); + } + } + } + }, + + getColumnClass(column) { + const classNames = super.getColumnClass(column); + if (!this.props.ooManagerColumns) return classNames; + const mColumn = this.props.ooManagerColumns.find(item => item.id === column.id); + if (mColumn && mColumn.lock) { + return classNames + ' o_column_freeze'; + } + return classNames; }, /** diff --git a/oo_list_manager/static/src/views/list/list_renderer.scss b/oo_list_manager/static/src/views/list/list_renderer.scss new file mode 100644 index 000000000..78533fc18 --- /dev/null +++ b/oo_list_manager/static/src/views/list/list_renderer.scss @@ -0,0 +1,3 @@ +.o_column_freeze { + +} \ No newline at end of file diff --git a/oo_list_manager/static/src/views/list/list_renderer.xml b/oo_list_manager/static/src/views/list/list_renderer.xml index 4f4c4eac3..4e9228630 100644 --- a/oo_list_manager/static/src/views/list/list_renderer.xml +++ b/oo_list_manager/static/src/views/list/list_renderer.xml @@ -17,6 +17,7 @@ + diff --git a/yuthon_hr_employee/views/yuthon_hr_employee_views.xml b/yuthon_hr_employee/views/yuthon_hr_employee_views.xml index adbb129e7..6083efe6f 100644 --- a/yuthon_hr_employee/views/yuthon_hr_employee_views.xml +++ b/yuthon_hr_employee/views/yuthon_hr_employee_views.xml @@ -355,7 +355,7 @@ - hr.employee.inherit.del.form + hr.employee.inherit.del.tree hr.employee