OWL
overlay
Export Data Dialog
Odoo 19 OWL component — Export Data Dialog (views)
Live preview
Interactive
Source excerpt
web/static/src/views/view_dialogs/export_data_dialog.js
import { _t } from "@web/core/l10n/translation";
import { browser } from "@web/core/browser/browser";
import { CheckBox } from "@web/core/checkbox/checkbox";
import { Dialog } from "@web/core/dialog/dialog";
import { rpc } from "@web/core/network/rpc";
import { unique } from "@web/core/utils/arrays";
import { useService } from "@web/core/utils/hooks";
import { fuzzyLookup } from "@web/core/utils/search";
import { useSortable } from "@web/core/utils/sortable_owl";
import { useDebounced } from "@web/core/utils/timing";
import { Component, useRef, useState, onMounted, onWillStart, onWillUnmount } from "@odoo/owl";
class DeleteExportListDialog extends Component {
static components = { Dialog };
static template = "web.DeleteExportListDialog";
static props = {
text: String,
close: Function,
delete: Function,
};
async onDelete() {
await this.props.delete();
this.props.close();
}
}
class ExportDataItem extends Component {
static template = "web.ExportDataItem";
static components = { ExportDataItem };
static props = {
exportList: { type: Object, optional: true },
field: { type: Object, optional: true },
filterSubfields: Function,
isDebug: Boolean,
isExpanded: Boolean,
isFieldExpandable: Function,
onAdd: Function,
loadFields: Function,
};
setup() {
this.state = useState({
subfields: [],
});
onWillStart(() => {
if (this.props.isExpanded) {
// automatically expand the item when subfields are already loaded
// and display subfields that match the search string
return this.toggleItem(this.props.field.id, false);
}
});
}
async toggleItem(id, isUserToggle) {
if (this.props.isFieldExpandable(id)) {
if (this.state.subfields.length) {
this.state.subfields = [];
} else {
const subfields = await this.props.loadFields(id, !isUserToggle);
if (subfields) {
this.state.subfields = isUserToggle
? subfields
: this.props.filterSubfields(subfields);
} else {
this.state.subfields = [];
}
}
}
}
onDoubleClick(id) {
if (!this.props.isFieldExpandable(id) && !this.isFieldSelected(id)) {
this.props.onAdd(id);
}
}
isFieldSelected(current) {
return this.props.exportList.find(({ id }) => id === current);
}
}
export class ExportDataDialog extends Component {
static template = "web.ExportDataDialog";
static components = { CheckBox, Dialog, ExportDataItem };
static props = {
close: { type: Function },
context: { type: Object, optional: true },
defaultExportList: { type: Array },
download: { type: Function },
getExportedFields: { type: Function },
root: { type: Object },
};
setup() {
this.dialog = useService("dialog");
this.notification = useService("notification");
this.orm = useService("orm");
this.draggableRef = useRef("draggable");
this.exportListRef = useRef("exportList");
this.searchRef = useRef("search");
this.knownFields = {};
this.expandedFields = {};
this.availableFormats = [];
this.templates = [];
this.isCompatible = false;
this.state = useState({
exportList: [],
isEditingTemplate: false,
search: [],
selectedFormat: 0,
templateId: null,
isSmall: this.env.isSmall,
disabled: false,
});
this.newTemplateText = _t("New template");
this.removeFieldText = _t("Remove field");
Registry / API
- Registry name
ExportDataDialog- Category
—- Module
web- Slug
export-data-dialog- Nav group
overlay