OWL
forms
Many2 Many Binary Field
Odoo 19 OWL component — Many2 Many Binary Field (views)
Live preview
Interactive
Source excerpt
web/static/src/views/fields/many2many_binary/many2many_binary_field.js
import { _t } from "@web/core/l10n/translation";
import { registry } from "@web/core/registry";
import { useService } from "@web/core/utils/hooks";
import { standardFieldProps } from "../standard_field_props";
import { FileInput } from "@web/core/file_input/file_input";
import { useX2ManyCrud } from "@web/views/fields/relational_utils";
import { Component } from "@odoo/owl";
export class Many2ManyBinaryField extends Component {
static template = "web.Many2ManyBinaryField";
static components = {
FileInput,
};
static props = {
...standardFieldProps,
acceptedFileExtensions: { type: String, optional: true },
className: { type: String, optional: true },
numberOfFiles: { type: Number, optional: true },
};
setup() {
this.orm = useService("orm");
this.notification = useService("notification");
this.operations = useX2ManyCrud(() => this.props.record.data[this.props.name], true);
}
get uploadText() {
return this.props.record.fields[this.props.name].string;
}
get files() {
return this.props.record.data[this.props.name].records.map((record) => {
return {
...record.data,
id: record.resId,
};
});
}
getUrl(id) {
return "/web/content/" + id + "?download=true";
}
getExtension(file) {
return file.name.replace(/^.*\./, "");
}
isImage(file) {
return file.mimetype.startsWith("image/");
}
async onFileUploaded(files) {
for (const file of files) {
if (file.error) {
return this.notification.add(file.error, {
title: _t("Uploading error"),
type: "danger",
});
}
await this.operations.saveRecord([file.id]);
}
}
async onFileRemove(deleteId) {
const record = this.props.record.data[this.props.name].records.find(
(record) => record.resId === deleteId
);
this.operations.removeRecord(record);
}
}
export const many2ManyBinaryField = {
component: Many2ManyBinaryField,
supportedOptions: [
{
label: _t("Accepted file extensions"),
name: "accepted_file_extensions",
type: "string",
},
{
label: _t("Number of files"),
name: "number_of_files",
type: "integer",
},
],
supportedTypes: ["many2many"],
isEmpty: () => false,
relatedFields: [
{ name: "name", type: "char" },
{ name: "mimetype", type: "char" },
],
extractProps: ({ attrs, options }) => ({
acceptedFileExtensions: options.accepted_file_extensions,
className: attrs.class,
numberOfFiles: options.number_of_files,
}),
};
registry.category("fields").add("many2many_binary", many2ManyBinaryField);
Registry / API
- Registry name
Many2ManyBinaryField- Category
—- Module
web- Slug
many2-many-binary-field- Nav group
forms