[IMP] hr_work_entry_contract: convert calendar views to owl

Converts calendar views in hr_work_entry_contract to owl.

task-2992657

closes odoo/odoo#101657

X-original-commit: 9ffd5bba4b02df35fcd18908d21fa3bc95974f1e
Related: odoo/enterprise#32039
Signed-off-by: William Braeckman (wbr) <wbr@odoo.com>
This commit is contained in:
Leonardo Pavan Rocha
2022-09-29 20:50:57 +02:00
parent 0983db73e4
commit 9d4f2624df
5 changed files with 112 additions and 76 deletions
@@ -1,76 +0,0 @@
odoo.define('hr_work_entry_contract.work_entries_calendar', function(require) {
'use strict';
var core = require('web.core');
var WorkEntryControllerMixin = require('hr_work_entry_contract.WorkEntryControllerMixin');
var CalendarController = require("web.CalendarController");
var CalendarModel = require('web.CalendarModel');
var CalendarRenderer = require('web.CalendarRenderer');
var CalendarView = require('web.CalendarView');
var viewRegistry = require('web.view_registry');
var _t = core._t;
var WorkEntryCalendarController = CalendarController.extend(WorkEntryControllerMixin, {
events: _.extend({}, WorkEntryControllerMixin.events, CalendarController.prototype.events),
// Returns the records from the model
_fetchRecords: function () {
var self = this;
var records = _.filter(this.model.data.data, function (data) {
// Filter records that are not inside the current month
// (because in calendar view some days of prev. and next month are visible)
return data.record.date_start.isBefore(self.lastDay) && data.record.date_stop.isAfter(self.firstDay);
});
return _.pluck(records, 'record');
},
_fetchFirstDay: function () {
return this.model.data.target_date.clone().startOf('month');
},
_fetchLastDay: function () {
return this.model.data.target_date.clone().endOf('month');
},
_displayWarning: function ($warning) {
this.$('.o_calendar_container').before($warning);
},
});
var WorkEntryCalendarModel = CalendarModel.extend({
/**
* Display everybody's work entries if no employee filter exists
* @private
* @override
* @param {any} filter
* @returns {Deferred}
*/
_loadFilter: function (filter) {
return this._super.apply(this, arguments).then(function () {
var filters = filter.filters;
var all_filter = filters[filters.length - 1];
if (all_filter) {
all_filter.label = _t("Everybody's work entries");
if (filter.write_model && filter.filters.length <= 1 && all_filter.active === undefined) {
filter.all = true;
all_filter.active = true;
}
}
});
}
});
var WorkEntryCalendarView = CalendarView.extend({
config: _.extend({}, CalendarView.prototype.config, {
Controller: WorkEntryCalendarController,
Model: WorkEntryCalendarModel,
Renderer: CalendarRenderer,
}),
});
viewRegistry.add('work_entries_calendar', WorkEntryCalendarView);
return WorkEntryCalendarController;
});
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates>
<t t-name="hr_work_entry_contract.calendar.controlButtons" t-inherit="web.CalendarController.controlButtons" t-inherit-mode="primary" owl="1">
<xpath expr="//span[hasclass('o_calendar_scale_buttons')]" position="after">
<span class="btn-regenerate-work-entries">
<button class="btn btn-secondary" t-on-click="onRegenerateWorkEntries">
Regenerate Work Entries
</button>
</span>
</xpath>
</t>
</templates>
@@ -0,0 +1,31 @@
/** @odoo-module **/
import { registry } from "@web/core/registry";
import { CalendarController } from '@web/views/calendar/calendar_controller';
import { WorkEntryCalendarModel } from "@hr_work_entry_contract/views/work_entry_calendar/work_entry_calendar_model";
import { calendarView } from "@web/views/calendar/calendar_view";
import { useWorkEntry } from "@hr_work_entry_contract/views/work_entry_hook";
export class WorkEntryCalendarController extends CalendarController {
setup() {
super.setup(...arguments);
const { onRegenerateWorkEntries } = useWorkEntry({
getEmployeeIds: this.getEmployeeIds.bind(this),
getRange: this.model.computeRange.bind(this.model),
});
this.onRegenerateWorkEntries = onRegenerateWorkEntries;
}
getEmployeeIds() {
return [...new Set(Object.values(this.model.records).map(rec => rec.rawRecord.employee_id[0]))];
}
}
export const WorkEntryCalendarView = {
...calendarView,
Controller: WorkEntryCalendarController,
Model: WorkEntryCalendarModel,
buttonTemplate: "hr_work_entry_contract.calendar.controlButtons",
}
registry.category("views").add("work_entries_calendar", WorkEntryCalendarView);
@@ -0,0 +1,38 @@
/** @odoo-module **/
import { CalendarModel } from "@web/views/calendar/calendar_model";
import { useWorkEntry } from "@hr_work_entry_contract/views/work_entry_hook";
const { DateTime } = luxon;
export class WorkEntryCalendarModel extends CalendarModel {
setup() {
super.setup(...arguments);
const { generateWorkEntries } = useWorkEntry({ getRange: this.computeRange.bind(this) });
this.generateWorkEntries = generateWorkEntries;
}
computeRange() {
const { scale, date } = this.meta;
const start = date.startOf(scale);
const end = date.endOf(scale);
return { start, end };
}
makeFilterAll() {
return {
...super.makeFilterAll(...arguments),
label: this.env._t("Everybody's work entries"),
active: true,
};
}
async updateData(data) {
const { start } = this.computeRange();
const shouldGenerateWorkEntries = start <= DateTime.now();
if (shouldGenerateWorkEntries) {
await this.generateWorkEntries();
}
await super.updateData(data);
}
}
@@ -0,0 +1,30 @@
/** @odoo-module **/
import { serializeDate } from "@web/core/l10n/dates";
import { useService } from "@web/core/utils/hooks";
export function useWorkEntry({ getEmployeeIds, getRange }) {
const orm = useService("orm");
const action = useService("action");
return {
onRegenerateWorkEntries: () => {
const { start, end } = getRange();
action.doAction('hr_work_entry_contract.hr_work_entry_regeneration_wizard_action', {
additionalContext: {
default_employee_ids: getEmployeeIds(),
date_start: serializeDate(start),
date_end: serializeDate(end),
}
});
},
generateWorkEntries: () => {
const { start, end } = getRange();
return orm.call(
'hr.employee',
'generate_work_entries',
[[], serializeDate(start), serializeDate(end)]
);
},
}
}