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