@@ -1,8 +1,7 @@
|
||||
odoo.define('website_rating_project.rating', function (require) {
|
||||
'use strict';
|
||||
/** @odoo-module **/
|
||||
|
||||
var time = require('web.time');
|
||||
var publicWidget = require('web.public.widget');
|
||||
import time from 'web.time';
|
||||
import publicWidget from 'web.public.widget';
|
||||
|
||||
publicWidget.registry.ProjectRatingImage = publicWidget.Widget.extend({
|
||||
selector: '.o_portal_project_rating .o_rating_image',
|
||||
@@ -29,4 +28,3 @@ publicWidget.registry.ProjectRatingImage = publicWidget.Widget.extend({
|
||||
return this._super.apply(this, arguments);
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,22 +1,19 @@
|
||||
odoo.define('project.ProjectCalendarView', function (require) {
|
||||
"use strict";
|
||||
/** @odoo-module **/
|
||||
|
||||
const CalendarController = require('web.CalendarController');
|
||||
const CalendarView = require('web.CalendarView');
|
||||
const viewRegistry = require('web.view_registry');
|
||||
import CalendarController from 'web.CalendarController';
|
||||
import CalendarView from 'web.CalendarView';
|
||||
import viewRegistry from 'web.view_registry';
|
||||
|
||||
const ProjectCalendarController = CalendarController.extend({
|
||||
_renderButtonsParameters() {
|
||||
return _.extend({}, this._super(...arguments), {scaleDrop: true});
|
||||
return Object.assign({}, this._super(...arguments), {scaleDrop: true});
|
||||
},
|
||||
});
|
||||
|
||||
const ProjectCalendarView = CalendarView.extend({
|
||||
config: _.extend({}, CalendarView.prototype.config, {
|
||||
Controller: ProjectCalendarController,
|
||||
}),
|
||||
});
|
||||
export const ProjectCalendarView = CalendarView.extend({
|
||||
config: Object.assign({}, CalendarView.prototype.config, {
|
||||
Controller: ProjectCalendarController,
|
||||
}),
|
||||
});
|
||||
|
||||
viewRegistry.add('project_calendar', ProjectCalendarView);
|
||||
return ProjectCalendarView;
|
||||
});
|
||||
|
||||
@@ -1,122 +1,116 @@
|
||||
odoo.define('project.ProjectFormView', function (require) {
|
||||
"use strict";
|
||||
/** @odoo-module **/
|
||||
|
||||
const Dialog = require('web.Dialog');
|
||||
const FormView = require('web.FormView');
|
||||
const FormController = require('web.FormController');
|
||||
const core = require('web.core');
|
||||
const { device } = require('web.config');
|
||||
const view_registry = require('web.view_registry');
|
||||
import Dialog from 'web.Dialog';
|
||||
import FormView from 'web.FormView';
|
||||
import FormController from 'web.FormController';
|
||||
import { bus, _t } from 'web.core';
|
||||
import { device } from 'web.config';
|
||||
import viewRegistry from 'web.view_registry';
|
||||
|
||||
const _t = core._t;
|
||||
|
||||
const ProjectFormController = FormController.extend({
|
||||
init() {
|
||||
this._super(...arguments);
|
||||
if (!device.isMobile) {
|
||||
core.bus.on("DOM_updated", this, () => {
|
||||
const $editable = this.$el.find('.note-editable');
|
||||
if ($editable.length) {
|
||||
const resizerHeight = this.$el.find('.o_wysiwyg_resizer').outerHeight();
|
||||
const newHeight = window.innerHeight - $editable.offset().top - resizerHeight - 1;
|
||||
$editable.outerHeight(newHeight);
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
_getActionMenuItems(state) {
|
||||
if (!this.archiveEnabled || !state.data['recurrence_id']) {
|
||||
return this._super(...arguments);
|
||||
}
|
||||
|
||||
this.archiveEnabled = false;
|
||||
let actions = this._super(...arguments);
|
||||
this.archiveEnabled = true;
|
||||
|
||||
if (actions) {
|
||||
const activeField = this.model.getActiveField(state);
|
||||
actions.items.other.unshift({
|
||||
description: state.data[activeField] ? _t('Archive') : _t('Unarchive'),
|
||||
callback: () => this._stopRecurrence(state.data['id'], state.data[activeField]?'archive':'unarchive'),
|
||||
});
|
||||
}
|
||||
|
||||
return actions;
|
||||
},
|
||||
|
||||
_onDeleteRecord() {
|
||||
const record = this.model.get(this.handle);
|
||||
|
||||
if(!record.data.recurrence_id) {
|
||||
return this._super(...arguments);
|
||||
}
|
||||
this._stopRecurrence(record.res_id, 'delete');
|
||||
},
|
||||
|
||||
_stopRecurrence(res_id, mode) {
|
||||
new Dialog(this, {
|
||||
buttons: [
|
||||
{
|
||||
classes: 'btn-primary',
|
||||
click: () => {
|
||||
this._rpc({
|
||||
model: 'project.task',
|
||||
method: 'action_stop_recurrence',
|
||||
args: [res_id],
|
||||
}).then(() => {
|
||||
if (mode === 'archive') {
|
||||
this._toggleArchiveState(true);
|
||||
} else if (mode === 'unarchive') {
|
||||
this._toggleArchiveState(false);
|
||||
} else if (mode === 'delete') {
|
||||
this._deleteRecords([this.handle]);
|
||||
}
|
||||
});
|
||||
},
|
||||
close: true,
|
||||
text: _t('Stop Recurrence'),
|
||||
},
|
||||
{
|
||||
click: () => {
|
||||
this._rpc({
|
||||
model: 'project.task',
|
||||
method: 'action_continue_recurrence',
|
||||
args: [res_id],
|
||||
}).then(() => {
|
||||
if (mode === 'archive') {
|
||||
this._toggleArchiveState(true);
|
||||
} else if (mode === 'unarchive') {
|
||||
this._toggleArchiveState(false);
|
||||
} else if (mode === 'delete') {
|
||||
this._deleteRecords([this.handle]);
|
||||
}
|
||||
});
|
||||
},
|
||||
close: true,
|
||||
text: _t('Continue Recurrence'),
|
||||
},
|
||||
{
|
||||
close: true,
|
||||
text: _t('Discard'),
|
||||
}
|
||||
],
|
||||
size: 'medium',
|
||||
title: _t('Confirmation'),
|
||||
$content: $('<main/>', {
|
||||
role: 'alert',
|
||||
text: _t('It seems that this task is part of a recurrence.'),
|
||||
}),
|
||||
}).open();
|
||||
const ProjectFormController = FormController.extend({
|
||||
init() {
|
||||
this._super(...arguments);
|
||||
if (!device.isMobile) {
|
||||
bus.on("DOM_updated", this, () => {
|
||||
const $editable = this.$el.find('.note-editable');
|
||||
if ($editable.length) {
|
||||
const resizerHeight = this.$el.find('.o_wysiwyg_resizer').outerHeight();
|
||||
const newHeight = window.innerHeight - $editable.offset().top - resizerHeight - 1;
|
||||
$editable.outerHeight(newHeight);
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
_getActionMenuItems(state) {
|
||||
if (!this.archiveEnabled || !state.data['recurrence_id']) {
|
||||
return this._super(...arguments);
|
||||
}
|
||||
});
|
||||
|
||||
const ProjectFormView = FormView.extend({
|
||||
config: _.extend({}, FormView.prototype.config, {
|
||||
Controller: ProjectFormController,
|
||||
}),
|
||||
});
|
||||
this.archiveEnabled = false;
|
||||
let actions = this._super(...arguments);
|
||||
this.archiveEnabled = true;
|
||||
|
||||
view_registry.add('project_form', ProjectFormView);
|
||||
if (actions) {
|
||||
const activeField = this.model.getActiveField(state);
|
||||
actions.items.other.unshift({
|
||||
description: state.data[activeField] ? _t('Archive') : _t('Unarchive'),
|
||||
callback: () => this._stopRecurrence(state.data['id'], state.data[activeField] ? 'archive' : 'unarchive'),
|
||||
});
|
||||
}
|
||||
|
||||
return ProjectFormView;
|
||||
return actions;
|
||||
},
|
||||
|
||||
_onDeleteRecord() {
|
||||
const record = this.model.get(this.handle);
|
||||
|
||||
if (!record.data.recurrence_id) {
|
||||
return this._super(...arguments);
|
||||
}
|
||||
this._stopRecurrence(record.res_id, 'delete');
|
||||
},
|
||||
|
||||
_stopRecurrence(resId, mode) {
|
||||
new Dialog(this, {
|
||||
buttons: [
|
||||
{
|
||||
classes: 'btn-primary',
|
||||
click: () => {
|
||||
this._rpc({
|
||||
model: 'project.task',
|
||||
method: 'action_stop_recurrence',
|
||||
args: [resId],
|
||||
}).then(() => {
|
||||
if (mode === 'archive') {
|
||||
this._toggleArchiveState(true);
|
||||
} else if (mode === 'unarchive') {
|
||||
this._toggleArchiveState(false);
|
||||
} else if (mode === 'delete') {
|
||||
this._deleteRecords([this.handle]);
|
||||
}
|
||||
});
|
||||
},
|
||||
close: true,
|
||||
text: _t('Stop Recurrence'),
|
||||
},
|
||||
{
|
||||
click: () => {
|
||||
this._rpc({
|
||||
model: 'project.task',
|
||||
method: 'action_continue_recurrence',
|
||||
args: [resId],
|
||||
}).then(() => {
|
||||
if (mode === 'archive') {
|
||||
this._toggleArchiveState(true);
|
||||
} else if (mode === 'unarchive') {
|
||||
this._toggleArchiveState(false);
|
||||
} else if (mode === 'delete') {
|
||||
this._deleteRecords([this.handle]);
|
||||
}
|
||||
});
|
||||
},
|
||||
close: true,
|
||||
text: _t('Continue Recurrence'),
|
||||
},
|
||||
{
|
||||
close: true,
|
||||
text: _t('Discard'),
|
||||
}
|
||||
],
|
||||
size: 'medium',
|
||||
title: _t('Confirmation'),
|
||||
$content: $('<main/>', {
|
||||
role: 'alert',
|
||||
text: _t('It seems that this task is part of a recurrence.'),
|
||||
}),
|
||||
}).open();
|
||||
}
|
||||
});
|
||||
|
||||
export const ProjectFormView = FormView.extend({
|
||||
config: Object.assign({}, FormView.prototype.config, {
|
||||
Controller: ProjectFormController,
|
||||
}),
|
||||
});
|
||||
|
||||
viewRegistry.add('project_form', ProjectFormView);
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
odoo.define('project.project_kanban', function (require) {
|
||||
'use strict';
|
||||
/** @odoo-module **/
|
||||
|
||||
var KanbanController = require('web.KanbanController');
|
||||
var KanbanView = require('web.KanbanView');
|
||||
var KanbanColumn = require('web.KanbanColumn');
|
||||
var view_registry = require('web.view_registry');
|
||||
var KanbanRecord = require('web.KanbanRecord');
|
||||
import KanbanController from 'web.KanbanController';
|
||||
import KanbanView from 'web.KanbanView';
|
||||
import KanbanColumn from 'web.KanbanColumn';
|
||||
import viewRegistry from 'web.view_registry';
|
||||
import KanbanRecord from 'web.KanbanRecord';
|
||||
|
||||
KanbanRecord.include({
|
||||
//--------------------------------------------------------------------------
|
||||
@@ -27,20 +26,20 @@ KanbanRecord.include({
|
||||
},
|
||||
});
|
||||
|
||||
var ProjectKanbanController = KanbanController.extend({
|
||||
custom_events: _.extend({}, KanbanController.prototype.custom_events, {
|
||||
export const ProjectKanbanController = KanbanController.extend({
|
||||
custom_events: Object.assign({}, KanbanController.prototype.custom_events, {
|
||||
'kanban_column_delete_wizard': '_onDeleteColumnWizard',
|
||||
}),
|
||||
|
||||
_onDeleteColumnWizard: function (ev) {
|
||||
ev.stopPropagation();
|
||||
const self = this;
|
||||
const column_id = ev.target.id;
|
||||
var state = this.model.get(this.handle, {raw: true});
|
||||
const columnId = ev.target.id;
|
||||
const state = this.model.get(this.handle, {raw: true});
|
||||
this._rpc({
|
||||
model: 'project.task.type',
|
||||
method: 'unlink_wizard',
|
||||
args: [column_id],
|
||||
args: [columnId],
|
||||
context: state.getContext(),
|
||||
}).then(function (res) {
|
||||
self.do_action(res);
|
||||
@@ -48,9 +47,9 @@ var ProjectKanbanController = KanbanController.extend({
|
||||
}
|
||||
});
|
||||
|
||||
var ProjectKanbanView = KanbanView.extend({
|
||||
config: _.extend({}, KanbanView.prototype.config, {
|
||||
Controller: ProjectKanbanController
|
||||
const ProjectKanbanView = KanbanView.extend({
|
||||
config: Object.assign({}, KanbanView.prototype.config, {
|
||||
Controller: ProjectKanbanController,
|
||||
}),
|
||||
});
|
||||
|
||||
@@ -65,7 +64,4 @@ KanbanColumn.include({
|
||||
}
|
||||
});
|
||||
|
||||
view_registry.add('project_kanban', ProjectKanbanView);
|
||||
|
||||
return ProjectKanbanController;
|
||||
});
|
||||
viewRegistry.add('project_kanban', ProjectKanbanView);
|
||||
|
||||
@@ -1,112 +1,106 @@
|
||||
odoo.define('project.ProjectListView', function (require) {
|
||||
"use strict";
|
||||
/** @odoo-module **/
|
||||
|
||||
const Dialog = require('web.Dialog');
|
||||
const ListView = require('web.ListView');
|
||||
const ListController = require('web.ListController');
|
||||
const core = require('web.core');
|
||||
const view_registry = require('web.view_registry');
|
||||
|
||||
const _t = core._t;
|
||||
|
||||
const ProjectListController = ListController.extend({
|
||||
_getActionMenuItems(state) {
|
||||
if(!this.archiveEnabled) {
|
||||
return this._super(...arguments);
|
||||
}
|
||||
|
||||
const recurringRecords = this.getSelectedRecords().filter(rec => rec.data.recurrence_id).map(rec => rec.data.id);
|
||||
this.archiveEnabled = recurringRecords.length == 0;
|
||||
let actions = this._super(...arguments);
|
||||
this.archiveEnabled = true;
|
||||
|
||||
if(actions && recurringRecords.length > 0) {
|
||||
actions.items.other.unshift({
|
||||
description: _t('Archive'),
|
||||
callback: () => this._stopRecurrence(recurringRecords, this.selectedRecords, 'archive'),
|
||||
}, {
|
||||
description: _t('Unarchive'),
|
||||
callback: () => this._toggleArchiveState(false)
|
||||
});
|
||||
}
|
||||
return actions;
|
||||
},
|
||||
|
||||
_onDeleteSelectedRecords() {
|
||||
const recurringRecords = this.getSelectedRecords().filter(rec => rec.data.recurrence_id).map(rec => rec.data.id);
|
||||
if(recurringRecords.length > 0) {
|
||||
return this._stopRecurrence(recurringRecords, this.selectedRecords, 'delete');
|
||||
}
|
||||
import { _t } from 'web.core';
|
||||
import Dialog from 'web.Dialog';
|
||||
import ListView from 'web.ListView';
|
||||
import ListController from 'web.ListController';
|
||||
import viewRegistry from 'web.view_registry';
|
||||
|
||||
const ProjectListController = ListController.extend({
|
||||
_getActionMenuItems(state) {
|
||||
if (!this.archiveEnabled) {
|
||||
return this._super(...arguments);
|
||||
},
|
||||
|
||||
_stopRecurrence(recurring_res_ids, res_ids, mode) {
|
||||
let warning;
|
||||
if (res_ids.length > 1) {
|
||||
warning = _t('It seems that some tasks are part of a recurrence.');
|
||||
} else {
|
||||
warning = _t('It seems that this task is part of a recurrence.');
|
||||
}
|
||||
return new Dialog(this, {
|
||||
buttons: [
|
||||
{
|
||||
classes: 'btn-primary',
|
||||
click: () => {
|
||||
this._rpc({
|
||||
model: 'project.task',
|
||||
method: 'action_stop_recurrence',
|
||||
args: [recurring_res_ids],
|
||||
}).then(() => {
|
||||
if (mode === 'archive') {
|
||||
this._toggleArchiveState(true);
|
||||
} else if (mode === 'delete') {
|
||||
this._deleteRecords(res_ids);
|
||||
}
|
||||
});
|
||||
},
|
||||
close: true,
|
||||
text: _t('Stop Recurrence'),
|
||||
},
|
||||
{
|
||||
click: () => {
|
||||
this._rpc({
|
||||
model: 'project.task',
|
||||
method: 'action_continue_recurrence',
|
||||
args: [recurring_res_ids],
|
||||
}).then(() => {
|
||||
if (mode === 'archive') {
|
||||
this._toggleArchiveState(true);
|
||||
} else if (mode === 'delete') {
|
||||
this._deleteRecords(res_ids);
|
||||
}
|
||||
});
|
||||
},
|
||||
close: true,
|
||||
text: _t('Continue Recurrence'),
|
||||
},
|
||||
{
|
||||
close: true,
|
||||
text: _t('Discard'),
|
||||
}
|
||||
],
|
||||
size: 'medium',
|
||||
title: _t('Confirmation'),
|
||||
$content: $('<main/>', {
|
||||
role: 'alert',
|
||||
text: warning,
|
||||
}),
|
||||
}).open();
|
||||
}
|
||||
});
|
||||
|
||||
const ProjectListView = ListView.extend({
|
||||
config: _.extend({}, ListView.prototype.config, {
|
||||
Controller: ProjectListController,
|
||||
}),
|
||||
});
|
||||
|
||||
view_registry.add('project_list', ProjectListView);
|
||||
const recurringRecords = this.getSelectedRecords().filter(rec => rec.data.recurrence_id).map(rec => rec.data.id);
|
||||
this.archiveEnabled = recurringRecords.length == 0;
|
||||
let actions = this._super(...arguments);
|
||||
this.archiveEnabled = true;
|
||||
|
||||
return ProjectListView;
|
||||
if (actions && recurringRecords.length > 0) {
|
||||
actions.items.other.unshift({
|
||||
description: _t('Archive'),
|
||||
callback: () => this._stopRecurrence(recurringRecords, this.selectedRecords, 'archive'),
|
||||
}, {
|
||||
description: _t('Unarchive'),
|
||||
callback: () => this._toggleArchiveState(false)
|
||||
});
|
||||
}
|
||||
return actions;
|
||||
},
|
||||
|
||||
_onDeleteSelectedRecords() {
|
||||
const recurringRecords = this.getSelectedRecords().filter(rec => rec.data.recurrence_id).map(rec => rec.data.id);
|
||||
if (recurringRecords.length > 0) {
|
||||
return this._stopRecurrence(recurringRecords, this.selectedRecords, 'delete');
|
||||
}
|
||||
|
||||
return this._super(...arguments);
|
||||
},
|
||||
|
||||
_stopRecurrence(recurringResIds, resIds, mode) {
|
||||
let warning;
|
||||
if (resIds.length > 1) {
|
||||
warning = _t('It seems that some tasks are part of a recurrence.');
|
||||
} else {
|
||||
warning = _t('It seems that this task is part of a recurrence.');
|
||||
}
|
||||
return new Dialog(this, {
|
||||
buttons: [
|
||||
{
|
||||
classes: 'btn-primary',
|
||||
click: () => {
|
||||
this._rpc({
|
||||
model: 'project.task',
|
||||
method: 'action_stop_recurrence',
|
||||
args: [recurringResIds],
|
||||
}).then(() => {
|
||||
if (mode === 'archive') {
|
||||
this._toggleArchiveState(true);
|
||||
} else if (mode === 'delete') {
|
||||
this._deleteRecords(resIds);
|
||||
}
|
||||
});
|
||||
},
|
||||
close: true,
|
||||
text: _t('Stop Recurrence'),
|
||||
},
|
||||
{
|
||||
click: () => {
|
||||
this._rpc({
|
||||
model: 'project.task',
|
||||
method: 'action_continue_recurrence',
|
||||
args: [recurringResIds],
|
||||
}).then(() => {
|
||||
if (mode === 'archive') {
|
||||
this._toggleArchiveState(true);
|
||||
} else if (mode === 'delete') {
|
||||
this._deleteRecords(resIds);
|
||||
}
|
||||
});
|
||||
},
|
||||
close: true,
|
||||
text: _t('Continue Recurrence'),
|
||||
},
|
||||
{
|
||||
close: true,
|
||||
text: _t('Discard'),
|
||||
}
|
||||
],
|
||||
size: 'medium',
|
||||
title: _t('Confirmation'),
|
||||
$content: $('<main/>', {
|
||||
role: 'alert',
|
||||
text: warning,
|
||||
}),
|
||||
}).open();
|
||||
}
|
||||
});
|
||||
|
||||
export const ProjectListView = ListView.extend({
|
||||
config: Object.assign({}, ListView.prototype.config, {
|
||||
Controller: ProjectListController,
|
||||
}),
|
||||
});
|
||||
|
||||
viewRegistry.add('project_list', ProjectListView);
|
||||
|
||||
@@ -1,38 +1,31 @@
|
||||
odoo.define('project.name_with_subtask_count', function (require) {
|
||||
"use strict";
|
||||
/** @odoo-module **/
|
||||
|
||||
const fieldRegistry = require('web.field_registry');
|
||||
const FieldChar = require('web.basic_fields').FieldChar;
|
||||
import fieldRegistry from 'web.field_registry';
|
||||
import { FieldChar } from 'web.basic_fields';
|
||||
|
||||
const FieldNameWithSubTaskCount = FieldChar.extend({
|
||||
/**
|
||||
* @override
|
||||
*/
|
||||
init() {
|
||||
this._super(...arguments);
|
||||
if (this.viewType === 'kanban') {
|
||||
// remove click event handler
|
||||
const {click, ...events} = this.events;
|
||||
this.events = events;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* @override
|
||||
*/
|
||||
_render() {
|
||||
let result = this._super.apply(this, arguments);
|
||||
if (this.recordData.child_text) {
|
||||
this.$el.append($('<span>')
|
||||
.addClass("text-muted ml-2")
|
||||
.text(this.recordData.child_text)
|
||||
.css('font-weight', 'normal'));
|
||||
}
|
||||
return result;
|
||||
export const FieldNameWithSubTaskCount = FieldChar.extend({
|
||||
/**
|
||||
* @override
|
||||
*/
|
||||
init() {
|
||||
this._super(...arguments);
|
||||
if (this.viewType === 'kanban') {
|
||||
// remove click event handler
|
||||
const {click, ...events} = this.events;
|
||||
this.events = events;
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
fieldRegistry.add('name_with_subtask_count', FieldNameWithSubTaskCount);
|
||||
|
||||
return FieldNameWithSubTaskCount;
|
||||
_render: function () {
|
||||
let result = this._super.apply(this, arguments);
|
||||
if (this.recordData.child_text) {
|
||||
this.$el.append($('<span>')
|
||||
.addClass("text-muted ml-2")
|
||||
.text(this.recordData.child_text)
|
||||
.css('font-weight', 'normal'));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
});
|
||||
|
||||
fieldRegistry.add('name_with_subtask_count', FieldNameWithSubTaskCount);
|
||||
|
||||
@@ -1,24 +1,19 @@
|
||||
odoo.define('project.project_rating_reporting', function (require) {
|
||||
'use strict';
|
||||
/** @odoo-module **/
|
||||
|
||||
const core = require('web.core');
|
||||
const _t = core._t;
|
||||
import { _t } from 'web.core';
|
||||
import GraphController from 'web.GraphController';
|
||||
import GraphView from 'web.GraphView';
|
||||
import PivotController from 'web.PivotController';
|
||||
import PivotView from 'web.PivotView';
|
||||
import viewRegistry from 'web.view_registry';
|
||||
|
||||
const viewRegistry = require('web.view_registry');
|
||||
|
||||
const PivotController = require('web.PivotController');
|
||||
const PivotView = require('web.PivotView');
|
||||
|
||||
const GraphController = require('web.GraphController');
|
||||
const GraphView = require('web.GraphView');
|
||||
|
||||
var ProjectPivotController = PivotController.extend({
|
||||
const ProjectPivotController = PivotController.extend({
|
||||
/**
|
||||
* @override
|
||||
*/
|
||||
init: function () {
|
||||
this._super.apply(this, arguments);
|
||||
var measures = JSON.parse(JSON.stringify(this.measures));
|
||||
const measures = JSON.parse(JSON.stringify(this.measures));
|
||||
if ('res_id' in measures) {
|
||||
measures.res_id.string = _t('Task');
|
||||
}
|
||||
@@ -32,15 +27,15 @@ var ProjectPivotController = PivotController.extend({
|
||||
},
|
||||
});
|
||||
|
||||
var ProjectPivotView = PivotView.extend({
|
||||
config: _.extend({}, PivotView.prototype.config, {
|
||||
const ProjectPivotView = PivotView.extend({
|
||||
config: Object.assign({}, PivotView.prototype.config, {
|
||||
Controller: ProjectPivotController,
|
||||
}),
|
||||
});
|
||||
|
||||
viewRegistry.add('project_rating_pivot', ProjectPivotView);
|
||||
|
||||
var ProjectGraphController = GraphController.extend({
|
||||
const ProjectGraphController = GraphController.extend({
|
||||
/**
|
||||
* @override
|
||||
*/
|
||||
@@ -58,12 +53,10 @@ var ProjectGraphController = GraphController.extend({
|
||||
},
|
||||
});
|
||||
|
||||
var ProjectGraphView = GraphView.extend({
|
||||
config: _.extend({}, GraphView.prototype.config, {
|
||||
const ProjectGraphView = GraphView.extend({
|
||||
config: Object.assign({}, GraphView.prototype.config, {
|
||||
Controller: ProjectGraphController,
|
||||
}),
|
||||
});
|
||||
|
||||
viewRegistry.add('project_rating_graph', ProjectGraphView);
|
||||
|
||||
});
|
||||
|
||||
@@ -1,21 +1,18 @@
|
||||
odoo.define('project.task_kanban_examples', function (require) {
|
||||
'use strict';
|
||||
/** @odoo-module **/
|
||||
|
||||
var core = require('web.core');
|
||||
var kanbanExamplesRegistry = require('web.kanban_examples_registry');
|
||||
import { _lt } from 'web.core';
|
||||
import kanbanExamplesRegistry from 'web.kanban_examples_registry';
|
||||
|
||||
var _lt = core._lt;
|
||||
const greenBullet = '<span class="o_status o_status_green"></span>';
|
||||
const redBullet = '<span class="o_status o_status_red"></span>';
|
||||
const star = '<a style="color: gold;" class="fa fa-star"/>';
|
||||
const clock = '<a class="fa fa-clock-o" />';
|
||||
|
||||
var greenBullet = '<span class="o_status o_status_green"></span>';
|
||||
var redBullet = '<span class="o_status o_status_red"></span>';
|
||||
var star = '<a style="color: gold;" class="fa fa-star"/>';
|
||||
var clock = '<a class="fa fa-clock-o" />'
|
||||
|
||||
var description_activities = escFormat(_lt('%s Use the %s icon to organize your daily activities.'), '<br/>', clock);
|
||||
var description = escFormat(_lt('Prioritize Tasks by using the %s icon.'+
|
||||
'%s Use the %s button to signalize to your colleagues that a task is ready for the next stage.'+
|
||||
'%s Use the %s to signalize a problem or a need for discussion on a task.'+
|
||||
'%s'), star, '<br/>', greenBullet, '<br/>', redBullet, description_activities);
|
||||
const descriptionActivities = escFormat(_lt('%s Use the %s icon to organize your daily activities.'), '<br/>', clock);
|
||||
const description = escFormat(_lt('Prioritize Tasks by using the %s icon.' +
|
||||
'%s Use the %s button to signalize to your colleagues that a task is ready for the next stage.' +
|
||||
'%s Use the %s to signalize a problem or a need for discussion on a task.' +
|
||||
'%s'), star, '<br/>', greenBullet, '<br/>', redBullet, descriptionActivities);
|
||||
|
||||
/**
|
||||
* Helper function to escape a text before formatting it.
|
||||
@@ -28,7 +25,7 @@ var description = escFormat(_lt('Prioritize Tasks by using the %s icon.'+
|
||||
* @returns {string} the formatted and escaped string
|
||||
*/
|
||||
function escFormat() {
|
||||
var args = arguments;
|
||||
const args = arguments;
|
||||
return {
|
||||
toString: function () {
|
||||
args[0] = _.escape(args[0]);
|
||||
@@ -43,56 +40,56 @@ kanbanExamplesRegistry.add('project', {
|
||||
examples:[{
|
||||
name: _lt('Software Development'),
|
||||
columns: [_lt('Backlog'), _lt('Specifications'), _lt('Development'), _lt('Tests'), _lt('Delivered')],
|
||||
description: escFormat(_lt('Prioritize Tasks by using the %s icon.'+
|
||||
'%s Use the %s button to inform your colleagues that a task is ready for the next stage.'+
|
||||
'%s Use the %s to indicate a problem or a need for discussion on a task.'+
|
||||
'%s'), star, '<br/>', greenBullet, '<br/>', redBullet, description_activities),
|
||||
description: escFormat(_lt('Prioritize Tasks by using the %s icon.' +
|
||||
'%s Use the %s button to inform your colleagues that a task is ready for the next stage.' +
|
||||
'%s Use the %s to indicate a problem or a need for discussion on a task.' +
|
||||
'%s'), star, '<br/>', greenBullet, '<br/>', redBullet, descriptionActivities),
|
||||
bullets: [greenBullet, redBullet, star],
|
||||
}, {
|
||||
name: _lt('Agile Scrum'),
|
||||
columns: [_lt('Backlog'), _lt('Sprint Backlog'), _lt('Sprint in Progress'), _lt('Sprint Complete'), _lt('Old Completed Sprint')],
|
||||
description: escFormat(_lt('Waiting for the next stage: use %s and %s bullets. %s'), greenBullet, redBullet, description_activities),
|
||||
description: escFormat(_lt('Waiting for the next stage: use %s and %s bullets. %s'), greenBullet, redBullet, descriptionActivities),
|
||||
bullets: [greenBullet, redBullet],
|
||||
}, {
|
||||
name: _lt('Digital Marketing'),
|
||||
columns: [_lt('Ideas'), _lt('Researching'), _lt('Writing'), _lt('Editing'), _lt('Done')],
|
||||
description: escFormat(_lt('Everyone can propose ideas, and the Editor marks the best ones ' +
|
||||
'as %s. Attach all documents or links to the task directly, to have all information about ' +
|
||||
'a research centralized. %s'), greenBullet, description_activities),
|
||||
'a research centralized. %s'), greenBullet, descriptionActivities),
|
||||
bullets: [greenBullet, redBullet],
|
||||
}, {
|
||||
name: _lt('Customer Feedback'),
|
||||
columns: [_lt('New'), _lt('In development'), _lt('Done'), _lt('Refused')],
|
||||
description: escFormat(_lt('Customers propose feedbacks by email; Odoo creates tasks ' +
|
||||
'automatically, and you can communicate on the task directly. Your managers decide which ' +
|
||||
'feedback is accepted %s and which feedback is moved to the %s column. %s'), greenBullet, _lt('"Refused"'), description_activities),
|
||||
'feedback is accepted %s and which feedback is moved to the %s column. %s'), greenBullet, _lt('"Refused"'), descriptionActivities),
|
||||
bullets: [greenBullet, redBullet],
|
||||
}, {
|
||||
name: _lt('Getting Things Done (GTD)'),
|
||||
columns: [_lt('Inbox'), _lt('Today'), _lt('This Week'), _lt('This Month'), _lt('Long Term')],
|
||||
description: escFormat(_lt('Fill your Inbox easily with the email gateway. Periodically review your ' +
|
||||
'Inbox and schedule tasks by moving them to others columns. Every day, you review the ' +
|
||||
'%s column to move important tasks %s. Every Monday, you review the %s column. %s'), _lt('"This Week"'), _lt('"Today"'), _lt('"This Month"'), description_activities),
|
||||
'%s column to move important tasks %s. Every Monday, you review the %s column. %s'), _lt('"This Week"'), _lt('"Today"'), _lt('"This Month"'), descriptionActivities),
|
||||
}, {
|
||||
name: _lt('Consulting'),
|
||||
columns: [_lt('New Projects'), _lt('Resources Allocation'), _lt('In Progress'), _lt('Done')],
|
||||
description: escFormat(_lt('Manage the lifecycle of your project using the kanban view. Add newly acquired projects, assign them and use the %s and %s to define if the project is ready for the next step. %s'), greenBullet, redBullet, description_activities),
|
||||
description: escFormat(_lt('Manage the lifecycle of your project using the kanban view. Add newly acquired projects, assign them and use the %s and %s to define if the project is ready for the next step. %s'), greenBullet, redBullet, descriptionActivities),
|
||||
bullets: [greenBullet, redBullet],
|
||||
}, {
|
||||
name: _lt('Research Project'),
|
||||
columns: [_lt('Brainstorm'), _lt('Research'), _lt('Draft'), _lt('Final Document')],
|
||||
description: escFormat(_lt('Handle your idea gathering within Tasks of your new Project and discuss them in the chatter of the tasks. Use the %s and %s to signalize what is the current status of your Idea. %s'), greenBullet, redBullet, description_activities),
|
||||
description: escFormat(_lt('Handle your idea gathering within Tasks of your new Project and discuss them in the chatter of the tasks. Use the %s and %s to signalize what is the current status of your Idea. %s'), greenBullet, redBullet, descriptionActivities),
|
||||
bullets: [greenBullet, redBullet],
|
||||
}, {
|
||||
name: _lt('Website Redesign'),
|
||||
columns: [_lt('Page Ideas'), _lt('Copywriting'), _lt('Design'), _lt('Live')],
|
||||
description: escFormat(_lt('Handle your idea gathering within Tasks of your new Project and discuss them in the chatter of the tasks. Use the %s and %s to signalize what is the current status of your Idea. %s'), greenBullet, redBullet, description_activities),
|
||||
description: escFormat(_lt('Handle your idea gathering within Tasks of your new Project and discuss them in the chatter of the tasks. Use the %s and %s to signalize what is the current status of your Idea. %s'), greenBullet, redBullet, descriptionActivities),
|
||||
}, {
|
||||
name: _lt('T-shirt Printing'),
|
||||
columns: [_lt('New Orders'), _lt('Logo Design'), _lt('To Print'), _lt('Done')],
|
||||
description: escFormat(_lt('Communicate with customers on the task using the email gateway. ' +
|
||||
'Attach logo designs to the task, so that information flow from designers to the workers ' +
|
||||
'who print the t-shirt. Organize priorities amongst orders %s using the icon. %s'), star, description_activities),
|
||||
'who print the t-shirt. Organize priorities amongst orders %s using the icon. %s'), star, descriptionActivities),
|
||||
bullets: [star],
|
||||
}, {
|
||||
name: _lt('Design'),
|
||||
@@ -116,5 +113,3 @@ kanbanExamplesRegistry.add('project', {
|
||||
bullets: [greenBullet, redBullet, star, clock],
|
||||
}],
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user