This commit is a significant rewriting of client-side discuss, chatter, chat window, and messaging menu using OWL. The behavior should be broadly the same, with some slight functional changes here and there. From a technical standpoint, the code of messaging is mainly organized in 2 main groups of modules: - models, which are logical entities that depict the client-side state of messaging as a whole. - components, which are in charge of displaying information from models. This refactoring also introduces new JS guidelines regarding folder structure (/static) and naming rules for JS modules. Community PR: https://github.com/odoo/odoo/pull/39023 Enterprise PR: https://github.com/odoo/enterprise/pull/6249 Task-1914207 This PR is a collaborative work by Alexandre, Julien, Sébastien and Xavier, with the precious help of Lucas to speed it up towards the end. closes odoo/odoo#39023 Related: odoo/enterprise#6249 Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com> Co-authored-by: Alexandre Kühn <aku@odoo.com> Co-authored-by: Julien Giannone <jgi@odoo.com> Co-authored-by: Lucas Perais <lpe@odoo.com> Co-authored-by: Sébastien Theys <seb@odoo.com> Co-authored-by: Xavier Dubuc <xdu@odoo.com>
125 lines
5.2 KiB
JavaScript
125 lines
5.2 KiB
JavaScript
odoo.define('note.systray.ActivityMenuTests', function (require) {
|
|
"use strict";
|
|
|
|
const { start } = require('mail/static/src/utils/test_utils.js');
|
|
var ActivityMenu = require('mail.systray.ActivityMenu');
|
|
|
|
var testUtils = require('web.test_utils');
|
|
|
|
QUnit.module('note', {}, function () {
|
|
|
|
QUnit.module("ActivityMenu", {
|
|
beforeEach: function () {
|
|
this.data = {
|
|
'mail.activity.menu': {
|
|
fields: {
|
|
name: { type: "char" },
|
|
model: { type: "char" },
|
|
type: { type: "char" },
|
|
planned_count: { type: "integer"},
|
|
today_count: { type: "integer"},
|
|
overdue_count: { type: "integer"},
|
|
total_count: { type: "integer"}
|
|
},
|
|
records: [],
|
|
},
|
|
'note.note': {
|
|
fields: {
|
|
memo: { type: 'char' },
|
|
},
|
|
records: [],
|
|
}
|
|
};
|
|
},
|
|
});
|
|
|
|
QUnit.test('note activity menu widget: create note from activity menu', async function (assert) {
|
|
assert.expect(15);
|
|
var self = this;
|
|
|
|
const { widget } = await start({
|
|
mockRPC: function (route, args) {
|
|
if (args.method === 'systray_get_activities') {
|
|
return Promise.resolve(self.data['mail.activity.menu'].records);
|
|
}
|
|
if (route === '/note/new') {
|
|
if (args.date_deadline) {
|
|
var note = {
|
|
id: 1,
|
|
memo: args.note,
|
|
date_deadline: args.date_deadline
|
|
};
|
|
self.data['note.note'].records.push(note);
|
|
if (_.isEmpty(self.data['mail.activity.menu'].records)) {
|
|
self.data['mail.activity.menu'].records.push({
|
|
name: "Note",
|
|
model: "note.note",
|
|
type: "activity",
|
|
planned_count: 0,
|
|
today_count: 0,
|
|
overdue_count: 0,
|
|
total_count: 0,
|
|
});
|
|
}
|
|
self.data['mail.activity.menu'].records[0].today_count++;
|
|
self.data['mail.activity.menu'].records[0].total_count++;
|
|
}
|
|
return Promise.resolve();
|
|
}
|
|
return this._super(route, args);
|
|
},
|
|
});
|
|
|
|
const activityMenu = new ActivityMenu(widget);
|
|
await activityMenu.appendTo($('#qunit-fixture'));
|
|
assert.hasClass(activityMenu.$el,'o_mail_systray_item',
|
|
'should be the instance of widget');
|
|
assert.strictEqual(activityMenu.$('.o_notification_counter').text(), '0',
|
|
"should not have any activity notification initially");
|
|
|
|
// toggle quick create for note
|
|
await testUtils.dom.click(activityMenu.$('.dropdown-toggle'));
|
|
assert.containsOnce(activityMenu, '.o_no_activity',
|
|
"should not have any activity preview");
|
|
assert.doesNotHaveClass(activityMenu.$('.o_note_show'), 'd-none',
|
|
'ActivityMenu should have Add new note CTA');
|
|
await testUtils.dom.click(activityMenu.$('.o_note_show'));
|
|
assert.hasClass(activityMenu.$('.o_note_show'), 'd-none',
|
|
'ActivityMenu should hide CTA when entering a new note');
|
|
assert.doesNotHaveClass(activityMenu.$('.o_note'), 'd-none',
|
|
'ActivityMenu should display input for new note');
|
|
|
|
// creating quick note without date
|
|
await testUtils.fields.editInput(activityMenu.$("input.o_note_input"), "New Note");
|
|
await testUtils.dom.click(activityMenu.$(".o_note_save"));
|
|
assert.strictEqual(activityMenu.$('.o_notification_counter').text(), '1',
|
|
"should increment activity notification counter after creating a note");
|
|
assert.containsOnce(activityMenu, '.o_mail_preview[data-res_model="note.note"]',
|
|
"should have an activity preview that is a note");
|
|
assert.strictEqual(activityMenu.$('.o_activity_filter_button[data-filter="today"]').text().trim(),
|
|
"1 Today",
|
|
"should display one note for today");
|
|
|
|
assert.doesNotHaveClass(activityMenu.$('.o_note_show'), 'd-none',
|
|
'ActivityMenu add note button should be displayed');
|
|
assert.hasClass(activityMenu.$('.o_note'), 'd-none',
|
|
'ActivityMenu add note input should be hidden');
|
|
|
|
// creating quick note with date
|
|
await testUtils.dom.click(activityMenu.$('.o_note_show'));
|
|
activityMenu.$('input.o_note_input').val("New Note");
|
|
await testUtils.dom.click(activityMenu.$(".o_note_save"));
|
|
assert.strictEqual(activityMenu.$('.o_notification_counter').text(), '2',
|
|
"should increment activity notification counter after creating a second note");
|
|
assert.strictEqual(activityMenu.$('.o_activity_filter_button[data-filter="today"]').text().trim(),
|
|
"2 Today",
|
|
"should display 2 notes for today");
|
|
assert.doesNotHaveClass(activityMenu.$('.o_note_show'), 'd-none',
|
|
'ActivityMenu add note button should be displayed');
|
|
assert.hasClass(activityMenu.$('.o_note'), 'd-none',
|
|
'ActivityMenu add note input should be hidden');
|
|
widget.destroy();
|
|
});
|
|
});
|
|
});
|