OWL
data_display
Kanban Renderer
Odoo 19 OWL component — Kanban Renderer (views)
Related requirements
- List, form, header, tabs, full DB code Odoo 19 list + form with workflow header, notebook tabs, and ace/code fields for full Text from DB.
Live preview
Interactive
Source excerpt
web/static/src/views/kanban/kanban_renderer.js
import { Component, onPatched, onWillDestroy, useEffect, useRef, useState } from "@odoo/owl";
import { ConfirmationDialog } from "@web/core/confirmation_dialog/confirmation_dialog";
import { Dropdown } from "@web/core/dropdown/dropdown";
import { DropdownItem } from "@web/core/dropdown/dropdown_item";
import { useHotkey } from "@web/core/hotkeys/hotkey_hook";
import { _t } from "@web/core/l10n/translation";
import { evaluateExpr } from "@web/core/py_js/py";
import { registry } from "@web/core/registry";
import { useBus, useService } from "@web/core/utils/hooks";
import { useSortable } from "@web/core/utils/sortable_owl";
import { MOVABLE_RECORD_TYPES } from "@web/model/relational_model/dynamic_group_list";
import { isNull } from "@web/views/utils";
import { ColumnProgress } from "@web/views/view_components/column_progress";
import { useBounceButton } from "@web/views/view_hook";
import { KanbanColumnExamplesDialog } from "./kanban_column_examples_dialog";
import { KanbanColumnQuickCreate } from "./kanban_column_quick_create";
import { KanbanHeader } from "./kanban_header";
import { KanbanRecord } from "./kanban_record";
import { KanbanRecordQuickCreate } from "./kanban_record_quick_create";
import { Widget } from "@web/views/widgets/widget";
import { ActionHelper } from "@web/views/action_helper";
const DRAGGABLE_GROUP_TYPES = ["many2one"];
function validateColumnQuickCreateExamples(data) {
const { allowedGroupBys = [], examples = [], foldField = "" } = data;
if (!allowedGroupBys.length) {
throw new Error("The example data must contain an array of allowed groupbys");
}
if (!examples.length) {
throw new Error("The example data must contain an array of examples");
}
const someHasFoldedColumns = examples.some(({ foldedColumns = [] }) => foldedColumns.length);
if (!foldField && someHasFoldedColumns) {
throw new Error("The example data must contain a fold field if there are folded columns");
}
}
export class KanbanRenderer extends Component {
static template = "web.KanbanRenderer";
static components = {
Dropdown,
DropdownItem,
ColumnProgress,
KanbanColumnQuickCreate,
KanbanHeader,
KanbanRecord,
KanbanRecordQuickCreate,
Widget,
ActionHelper,
};
static props = [
"archInfo",
"Compiler",
"list",
"deleteRecord",
"openRecord",
"readonly?",
"forceGlobalClick?",
"noContentHelp?",
"scrollTop?",
"canQuickCreate?",
"quickCreateState?",
"progressBarState?",
"addLabel?",
"onAdd?",
];
static defaultProps = {
scrollTop: () => {},
quickCreateState: { groupId: false },
tooltipInfo: {},
};
setup() {
this.dialogClose = [];
/**
* @type {{ processedIds: string[], columnQuickCreateIsFolded: boolean }}
*/
this.state = useState({
selectionAvailable: false,
processedIds: [],
columnQuickCreateIsFolded:
!this.props.list.isGrouped || this.props.list.groups.length > 0,
});
this.dialog = useService("dialog");
this.exampleData = registry
.category("kanban_examples")
.get(this.props.archInfo.examples, null);
if (this.exampleData) {
validateColumnQuickCreateExamples(this.exampleData);
}
this.lastCheckedRecord = null;
// Sortable
let dataRecordId;
let dataGroupId;
this.rootRef = useRef("root");
if (this.canUseSortable) {
useSortable({
enable: () => this.canResequenceRecords,
// Params
ref: this.rootRef,
elements: ".o_draggable",
ignore: ".dropdown,select",
groups: () => this.props.list.isGrouped && ".o_kanban_group",
connectGroups: () => this.canMoveRecords,
cursor: "move",
placeholderClasses: ["visible", "opacity-50", "my-2"],
// Hooks
onDragStart: (params) => {
const { element, group } = params;
dataRecordId = element.dataset.id;
dataGroupId = group && group.dataset.id;
if (this.props.list.selection?.length) {
this.props.list.selection.forEach((record) => {
record.toggleSelection(false);
});
}
return this.sortStart(params);
Registry / API
- Registry name
KanbanRenderer- Category
—- Module
web- Slug
kanban-renderer- Nav group
data_display