功能增强:支持配置排序字段,Limit数量

This commit is contained in:
夜未央
2025-08-05 17:04:58 +08:00
parent 078665386d
commit e4eadfbb99
3 changed files with 64 additions and 25 deletions
@@ -1,13 +1,13 @@
/** @odoo-module **/
import {ListController} from "@web/views/list/list_controller";
import {patch} from "@web/core/utils/patch";
import {onWillStart, useState, useRef, useExternalListener} from "@odoo/owl";
import {Dropdown} from "@web/core/dropdown/dropdown";
import {CheckBox} from "@web/core/checkbox/checkbox";
import {useSortable} from "@web/core/utils/sortable_owl";
import {useService} from "@web/core/utils/hooks";
import {usePosition} from "@web/core/position_hook";
import { ListController } from "@web/views/list/list_controller";
import { patch } from "@web/core/utils/patch";
import { onWillStart, useState, useRef, useExternalListener,onWillRender} from "@odoo/owl";
import { Dropdown } from "@web/core/dropdown/dropdown";
import { CheckBox } from "@web/core/checkbox/checkbox";
import { useSortable } from "@web/core/utils/sortable_owl";
import { useService } from "@web/core/utils/hooks";
import { usePosition } from "@web/core/position_hook";
patch(ListController.prototype, {
@@ -18,13 +18,15 @@ patch(ListController.prototype, {
this.ooColumnsRef = useRef('ooColumnsRef');
this.ooManagerRef = useRef('ooManagerRef');
this.ooListRef = useRef('ooListRef');
this.ooManager = useState({
state: false,
key: '',
filter: false,
serial_num: false,
sticky_end: false,
default_order_field: '',
default_order_type: 'asc',
default_page_size: 0,
columns: this.archInfo.columns.filter((column) => {
if (column.type === "field" && column.widget !== 'handle') {
return column
@@ -34,28 +36,20 @@ patch(ListController.prototype, {
return column.name
})
});
console.log(this.ooManager.columns)
onWillStart(async () => {
const manager_data = await this.orm.call('ir.ui.view', 'get_manager_data', [this.env.config.viewId]);
console.log(manager_data)
if (!Object.keys(manager_data).length || !manager_data.columns) {
this.ooManager.columns.forEach(val => {
val.visibility = !!!val.column_invisible;
})
} else {
// 简化逻辑:如果字段不一致(字段名判断),则重置视图
const currentColumns = this.ooManager.columns;
const savedColumns = manager_data.columns || [];
// 比较字段名是否一致
const currentColumnNames = currentColumns.map(col => col.name).sort();
const savedColumnNames = savedColumns.map(col => col.name).sort();
const isFieldConsistent = JSON.stringify(currentColumnNames) === JSON.stringify(savedColumnNames);
if (!isFieldConsistent) {
// 字段不一致,重置视图配置
this.ooManager.columns.forEach(val => {
@@ -69,7 +63,19 @@ patch(ListController.prototype, {
}
this.ooManager.show = manager_data.show;
})
onWillRender(() => {
if (this.ooManager.default_page_size>0) {
this.model.config.limit = this.ooManager.default_page_size;
// this.model.load();
}
if (this.ooManager.default_order_field) {
this.model.config.orderBy = [];
this.model.config.orderBy.push({
name: this.ooManager.default_order_field,
[this.ooManager.default_order_type]: true
});
}
});
usePosition('ooListRef', () => this.ooManagerRef.el, {
position: "bottom-start",
})
@@ -84,7 +90,6 @@ patch(ListController.prototype, {
useExternalListener(window, "click", this.onGlobalClick.bind(this));
},
onGlobalClick(ev) {
if (this.ooListRef.el && !this.ooListRef.el.contains(ev.target)) {
this.ooManager.state = false;
@@ -169,7 +174,7 @@ patch(ListController.prototype, {
* @param params
*/
sortColumnDrop(params) {
const {element, previous} = params;
const { element, previous } = params;
const fromId = element.dataset.id;
const toId = previous ? previous.dataset.id : null;
@@ -192,7 +197,6 @@ patch(ListController.prototype, {
this.ooManager.columns = columns;
},
/**
* 保存
* @returns {*}
@@ -208,7 +212,10 @@ patch(ListController.prototype, {
columns: this.ooManager.columns,
filter: this.ooManager.filter,
serial_num: this.ooManager.serial_num,
sticky_end: this.ooManager.sticky_end
sticky_end: this.ooManager.sticky_end,
default_order_field: this.ooManager.default_order_field,
default_order_type: this.ooManager.default_order_type,
default_page_size: this.ooManager.default_page_size,
}
]
);
@@ -39,6 +39,41 @@
</div>
</div>
</div>
<!-- 新增配置:默认页数和默认排序 -->
<div class="d-flex align-items-center pb-2">
<div class="d-flex align-items-center me-3">
<label class="me-1">默认页数:</label>
<input type="number" min="0" class="form-control"
t-model.number="ooManager.default_page_size"
t-on-blur="onChangeColumns"
style="width: 100px;"/>
</div>
<div class="d-flex align-items-center">
<label class="me-1">默认排序:</label>
<select class="form-select"
t-model="ooManager.default_order_field"
t-on-change="onChangeColumns"
style="width: 150px;">
<option t-att-value="''">默认</option>
<option t-foreach="ooManager.columns"
t-as="col"
t-key="col.id"
t-att-value="col.name">
<t t-esc="col.string"/>
</option>
</select>
</div>
<div class="d-flex align-items-center">
<label class="me-1">排序方式:</label>
<select class="form-select"
t-model="ooManager.default_order_type"
t-on-change="onChangeColumns"
style="width: 150px;">
<option value="asc">升序</option>
<option value='desc'>降序</option>
</select>
</div>
</div>
<div class="d-flex align-items-center pb-2">
<input type="text" class="form-control" t-model="ooManager.key"/>
<i class="btn btn-primary fa fa-refresh ms-2" t-on-click="()=>this.ooManager.key = ''"/>
@@ -206,7 +206,6 @@ patch(ListRenderer.prototype, {
}
if (this.props.ooManagerStickyEnd) {
console.log('ooManagerStickyEnd')
let rightOffset = 0;
const rightStickyIndices = [];
@@ -262,7 +261,6 @@ patch(ListRenderer.prototype, {
* @returns {boolean}
*/
get hasOptionalFields() {
console.log('hasOptionalFields')
return false
},
get displayOptionalFields() {
@@ -272,7 +270,6 @@ patch(ListRenderer.prototype, {
getActiveColumns(list) {
if (this.props.ooManagerColumns) {
console.log(this.allColumns)
const columns = this.allColumns.filter((col) => {
if (list.isGrouped && col.widget === "handle") return false;
const mColumn = this.props.ooManagerColumns.find(item => item.id === col.id);