Initial commit: Mrp packages

This commit is contained in:
Ernad Husremovic 2025-08-29 15:20:50 +02:00
commit 50d736b3bd
739 changed files with 538193 additions and 0 deletions

View file

@ -0,0 +1,57 @@
/** @odoo-module **/
import { _lt } from "@web/core/l10n/translation";
import { registry } from "@web/core/registry";
import { useService } from "@web/core/utils/hooks";
import { CharField } from "@web/views/fields/char/char_field";
const { useState } = owl;
export class SlidesViewer extends CharField {
setup() {
super.setup();
this.notification = useService("notification");
this.page = 1;
this.state = useState({
isValid: true,
});
}
get fileName() {
return this.state.fileName || this.props.value || "";
}
_get_slide_page() {
return this.props.record.data[this.props.name+'_page'] ? this.props.record.data[this.props.name+'_page'] : this.page;
}
get url() {
var src = false;
if (this.props.value) {
// check given google slide url is valid or not
var googleRegExp = /(^https:\/\/docs.google.com).*(\/d\/e\/|\/d\/)([A-Za-z0-9-_]+)/;
var google = this.props.value.match(googleRegExp);
if (google && google[3]) {
src =
"https://docs.google.com/presentation" +
google[2] +
google[3] +
"/preview?slide=" +
this._get_slide_page();
}
}
return src || this.props.value;
}
onLoadFailed() {
this.state.isValid = false;
this.notification.add(this.env._t("Could not display the selected spreadsheet"), {
type: "danger",
});
}
}
SlidesViewer.template = "mrp.SlidesViewer";
SlidesViewer.displayName = _lt("Google Slides Viewer");
registry.category("fields").add("embed_viewer", SlidesViewer);

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates xml:space="preserve">
<t t-name="mrp.SlidesViewer" t-inherit="web.CharField">
<xpath expr="//t[@t-else='']" position="after">
<t t-if="url">
<iframe class="o_embed_iframe w-100"
alt="Slides viewer"
t-att-src="url"
t-att-name="props.name"
t-on-error="onLoadFailed"
/>
</t>
</xpath>
</t>
</templates>

View file

@ -0,0 +1,40 @@
/** @odoo-module **/
import { KanbanController } from "@web/views/kanban/kanban_controller";
import { useBus, useService } from "@web/core/utils/hooks";
const { useRef } = owl;
export class MrpDocumentsKanbanController extends KanbanController {
setup() {
super.setup();
this.uploadFileInputRef = useRef("uploadFileInput");
this.fileUploadService = useService("file_upload");
useBus(
this.fileUploadService.bus,
"FILE_UPLOAD_LOADED",
async () => {
await this.model.root.load();
this.model.notify();
},
);
}
async onFileInputChange(ev) {
if (!ev.target.files.length) {
return;
}
await this.fileUploadService.upload(
"/mrp/upload_attachment",
ev.target.files,
{
buildFormData: (formData) => {
formData.append("res_model", this.props.context.default_res_model);
formData.append("res_id", this.props.context.default_res_id);
},
},
);
// Reset the file input's value so that the same file may be uploaded twice.
ev.target.value = "";
}
}

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates>
<t t-name="mrp.MrpDocumentsKanbanView.Buttons" t-inherit="web.KanbanView.Buttons" t-inherit-mode="primary" owl="1">
<div role="toolbar" position="inside">
<input type="file" multiple="true" t-ref="uploadFileInput" class="o_input_file o_hidden" t-on-change.stop="onFileInputChange"/>
<button type="button" t-attf-class="btn btn-primary o_mrp_documents_kanban_upload"
t-on-click.stop.prevent="() => this.uploadFileInputRef.el.click()">
Upload
</button>
</div>
</t>
</templates>

View file

@ -0,0 +1,41 @@
/** @odoo-module **/
import { CANCEL_GLOBAL_CLICK, KanbanRecord } from "@web/views/kanban/kanban_record";
import { useService } from "@web/core/utils/hooks";
export class MrpDocumentsKanbanRecord extends KanbanRecord {
setup() {
super.setup();
this.messaging = useService("messaging");
}
/**
* @override
*
* Override to open the preview upon clicking the image, if compatible.
*/
onGlobalClick(ev) {
if (ev.target.closest(CANCEL_GLOBAL_CLICK) && !ev.target.classList.contains("o_mrp_download")) {
return;
}
if (ev.target.classList.contains("o_mrp_download")) {
window.location = `/web/content/mrp.document/${this.props.record.resId}/datas?download=true`;
return;
} else if (ev.target.closest(".o_kanban_previewer")) {
this.messaging.get().then((messaging) => {
const attachmentList = messaging.models["AttachmentList"].insert({
selectedAttachment: messaging.models["Attachment"].insert({
id: this.props.record.data.ir_attachment_id[0],
filename: this.props.record.data.name,
name: this.props.record.data.name,
mimetype: this.props.record.data.mimetype,
}),
});
this.dialog = messaging.models["Dialog"].insert({
attachmentListOwnerAsAttachmentView: attachmentList,
});
});
return;
}
return super.onGlobalClick(...arguments);
}
}

View file

@ -0,0 +1,22 @@
/** @odoo-module **/
import { useService } from "@web/core/utils/hooks";
import { KanbanRenderer } from "@web/views/kanban/kanban_renderer";
import { MrpDocumentsKanbanRecord } from "@mrp/views/mrp_documents_kanban/mrp_documents_kanban_record";
import { FileUploadProgressContainer } from "@web/core/file_upload/file_upload_progress_container";
import { FileUploadProgressKanbanRecord } from "@web/core/file_upload/file_upload_progress_record";
export class MrpDocumentsKanbanRenderer extends KanbanRenderer {
setup() {
super.setup();
this.fileUploadService = useService("file_upload");
}
}
MrpDocumentsKanbanRenderer.components = {
...KanbanRenderer.components,
FileUploadProgressContainer,
FileUploadProgressKanbanRecord,
KanbanRecord: MrpDocumentsKanbanRecord,
};
MrpDocumentsKanbanRenderer.template = "mrp.MrpDocumentsKanbanRenderer";

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates>
<t t-name="mrp.MrpDocumentsKanbanRenderer" owl="1" t-inherit-mode="primary" t-inherit="web.KanbanRenderer">
<!-- Before the first t-foreach -->
<xpath expr="//t[@t-key='groupOrRecord.key']" position="before">
<FileUploadProgressContainer fileUploads="fileUploadService.uploads" Component="constructor.components.FileUploadProgressKanbanRecord"/>
</xpath>
</t>
</templates>

View file

@ -0,0 +1,16 @@
/** @odoo-module **/
import { registry } from "@web/core/registry";
import { kanbanView } from "@web/views/kanban/kanban_view";
import { MrpDocumentsKanbanController } from "@mrp/views/mrp_documents_kanban/mrp_documents_kanban_controller";
import { MrpDocumentsKanbanRenderer } from "@mrp/views/mrp_documents_kanban/mrp_documents_kanban_renderer";
export const mrpDocumentsKanbanView = {
...kanbanView,
Controller: MrpDocumentsKanbanController,
Renderer: MrpDocumentsKanbanRenderer,
buttonTemplate: "mrp.MrpDocumentsKanbanView.Buttons",
};
registry.category("views").add("mrp_documents_kanban", mrpDocumentsKanbanView);