[IMP] mail, *: Rename component to match model (step 1)

*: calendar, website_slides

[IMP] mail, *: rename component Activity to ActivityView
*: calendar, website_slides
Task-3045361

Task-3046089

closes odoo/odoo#104261

Related: odoo/enterprise#33300
Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com>
This commit is contained in:
Alexandre Kühn
2022-10-27 14:41:19 +02:00
parent c412f11c02
commit a820570abc
10 changed files with 164 additions and 164 deletions
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates id="template" xml:space="preserve">
<t t-inherit="mail.Activity" t-inherit-mode="extension">
<xpath expr="//button[hasclass('o_Activity_editButton')]" position="attributes">
<t t-inherit="mail.ActivityView" t-inherit-mode="extension">
<xpath expr="//button[hasclass('o_ActivityView_editButton')]" position="attributes">
<attribute name="t-if">!activityView.activity.calendar_event_id</attribute>
</xpath>
<xpath expr="//button[hasclass('o_Activity_editButton')]" position="after">
<xpath expr="//button[hasclass('o_ActivityView_editButton')]" position="after">
<t t-if="activityView.activity.calendar_event_id">
<button class="o_Activity_toolButton o_Activity_editButton btn btn-link pt-0" t-on-click="activityView.onClickEdit">
<button class="o_ActivityView_toolButton o_ActivityView_editButton btn btn-link pt-0" t-on-click="activityView.onClickEdit">
<i class="fa fa-calendar"/> Reschedule
</button>
</t>
@@ -37,7 +37,7 @@ QUnit.test('activity click on Reschedule', async function (assert) {
},
);
await click('.o_Activity_editButton');
await click('.o_ActivityView_editButton');
assert.containsOnce(
document.body,
'.o_calendar_view',
@@ -7,7 +7,7 @@ import Popover from "web.Popover";
const { Component } = owl;
export class Activity extends Component {
export class ActivityView extends Component {
/**
* @override
@@ -26,10 +26,10 @@ export class Activity extends Component {
}
Object.assign(Activity, {
Object.assign(ActivityView, {
props: { record: Object },
template: 'mail.Activity',
template: 'mail.ActivityView',
components: { Popover },
});
registerMessagingComponent(Activity);
registerMessagingComponent(ActivityView);
@@ -2,25 +2,25 @@
// Layout
// ------------------------------------------------------------------
.o_Activity_core {
.o_ActivityView_core {
min-width: 0;
}
.o_Activity_detailsUserAvatar {
.o_ActivityView_detailsUserAvatar {
object-fit: cover;
height: 18px;
width: 18px;
}
.o_Activity_iconContainer {
.o_ActivityView_iconContainer {
@include o-position-absolute($top: auto, $left: auto, $bottom: -16%, $right: -5%);
}
.o_Activity_note p {
.o_ActivityView_note p {
margin-bottom: map-get($spacers, 0);
}
.o_Activity_sidebar {
.o_ActivityView_sidebar {
width: $o-mail-thread-avatar-size;
min-width: $o-mail-thread-avatar-size;
height: $o-mail-thread-avatar-size;
@@ -39,10 +39,10 @@
// Style
// ------------------------------------------------------------------
.o_Activity_detailsButton {
.o_ActivityView_detailsButton {
@include o-hover-text-color($default-color: $o-main-color-muted);
}
.o_Activity_iconContainer {
.o_ActivityView_iconContainer {
box-shadow: 0 0 0 2px $o-view-background-color;
}
@@ -1,28 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates xml:space="preserve">
<t t-name="mail.Activity" owl="1">
<t t-name="mail.ActivityView" owl="1">
<t t-if="activityView">
<div class="o_Activity d-flex py-2 px-3" t-attf-class="{{ className }}" t-on-click="activityView.onClickActivity" t-ref="root">
<div class="o_Activity_sidebar me-3">
<div class="o_Activity_user position-relative h-100 w-100">
<div class="o_ActivityView d-flex py-2 px-3" t-attf-class="{{ className }}" t-on-click="activityView.onClickActivity" t-ref="root">
<div class="o_ActivityView_sidebar me-3">
<div class="o_ActivityView_user position-relative h-100 w-100">
<t t-if="activityView.activity.assignee">
<img class="o_Activity_userAvatar rounded-circle h-100 w-100 o_object_fit_cover" t-attf-src="/web/image/res.users/{{ activityView.activity.assignee.id }}/avatar_128" t-att-alt="activityView.activity.assignee.nameOrDisplayName"/>
<img class="o_ActivityView_userAvatar rounded-circle h-100 w-100 o_object_fit_cover" t-attf-src="/web/image/res.users/{{ activityView.activity.assignee.id }}/avatar_128" t-att-alt="activityView.activity.assignee.nameOrDisplayName"/>
</t>
<div class="o_Activity_iconContainer d-flex align-items-center justify-content-center rounded-circle w-50 h-50"
<div class="o_ActivityView_iconContainer d-flex align-items-center justify-content-center rounded-circle w-50 h-50"
t-att-class="{
'text-bg-success': activityView.activity.state === 'planned',
'text-bg-warning': activityView.activity.state === 'today',
'text-bg-danger': activityView.activity.state === 'overdue',
}"
>
<i class="o_Activity_icon fa small" t-attf-class="{{ activityView.activity.icon }}"/>
<i class="o_ActivityView_icon fa small" t-attf-class="{{ activityView.activity.icon }}"/>
</div>
</div>
</div>
<div class="o_Activity_core">
<div class="o_Activity_info d-flex align-items-baseline">
<div class="o_Activity_dueDateText me-2"
<div class="o_ActivityView_core">
<div class="o_ActivityView_info d-flex align-items-baseline">
<div class="o_ActivityView_dueDateText me-2"
t-att-class="{
'text-danger': activityView.activity.state === 'overdue',
'text-success': activityView.activity.state === 'planned',
@@ -32,23 +32,23 @@
<b t-esc="activityView.delayLabel"/>
</div>
<t t-if="activityView.activity.summary">
<b class="o_Activity_summary text-900 me-2">
<b class="o_ActivityView_summary text-900 me-2">
<t t-esc="activityView.summary"/>
</b>
</t>
<t t-elif="activityView.activity.type">
<b class="o_Activity_summary o_Activity_type text-900 me-2">
<b class="o_ActivityView_summary o_ActivityView_type text-900 me-2">
<t t-esc="activityView.activity.type.displayName"/>
</b>
</t>
<t t-if="activityView.activity.assignee">
<div class="o_Activity_userName">
<div class="o_ActivityView_userName">
<t t-esc="activityView.assignedUserText"/>
</div>
</t>
<a
href="#"
class="o_Activity_detailsButton btn py-0"
class="o_ActivityView_detailsButton btn py-0"
t-att-class="activityView.areDetailsVisible ? 'text-primary' : 'btn-link btn-primary'"
t-att-aria-expanded="activityView.areDetailsVisible ? 'true' : 'false'"
t-on-click="activityView.onClickDetailsButton"
@@ -59,35 +59,35 @@
</div>
<t t-if="activityView.areDetailsVisible">
<div class="o_Activity_details">
<div class="o_ActivityView_details">
<div class="d-md-table table table-sm mt-2 mb-3">
<div t-if="activityView.activity.type" class="d-md-table-row mb-3">
<div class="d-md-table-cell fw-bold text-md-end m-0 py-md-1 px-md-4">Activity type</div>
<div class="o_Activity_type d-md-table-cell py-md-1 pe-4">
<div class="o_ActivityView_type d-md-table-cell py-md-1 pe-4">
<t t-esc="activityView.activity.type.displayName"/>
</div>
</div>
<div t-if="activityView.activity.creator" class="d-md-table-row mb-3">
<div class="d-md-table-cell fw-bold text-md-end m-0 py-md-1 px-md-4">Created</div>
<div class="o_Activity_detailsCreation d-md-table-cell py-md-1 pe-4">
<div class="o_ActivityView_detailsCreation d-md-table-cell py-md-1 pe-4">
<t t-esc="activityView.formattedCreateDatetime"/>, <br t-if="messaging.device.isSmall"/>by
<img class="o_Activity_detailsUserAvatar o_Activity_detailsCreatorAvatar ms-1 me-1 rounded-circle align-text-bottom" t-attf-src="/web/image/res.users/{{ activityView.activity.creator.id }}/avatar_128" t-att-title="activityView.activity.creator.nameOrDisplayName" t-att-alt="activityView.activity.creator.nameOrDisplayName"/>
<b class="o_Activity_detailsCreator">
<img class="o_ActivityView_detailsUserAvatar o_ActivityView_detailsCreatorAvatar ms-1 me-1 rounded-circle align-text-bottom" t-attf-src="/web/image/res.users/{{ activityView.activity.creator.id }}/avatar_128" t-att-title="activityView.activity.creator.nameOrDisplayName" t-att-alt="activityView.activity.creator.nameOrDisplayName"/>
<b class="o_ActivityView_detailsCreator">
<t t-esc="activityView.activity.creator.nameOrDisplayName"/>
</b>
</div>
</div>
<div t-if="activityView.activity.assignee" class="d-md-table-row mb-3">
<div class="d-md-table-cell fw-bold text-md-end m-0 py-md-1 px-md-4">Assigned to</div>
<div class="o_Activity_detailsAssignation d-md-table-cell py-md-1 pe-4">
<img class="o_Activity_detailsUserAvatar o_Activity_detailsAssignationUserAvatar me-1 rounded-circle align-text-bottom" t-attf-src="/web/image/res.users/{{ activityView.activity.assignee.id }}/avatar_128" t-att-title="activityView.activity.assignee.nameOrDisplayName" t-att-alt="activityView.activity.assignee.nameOrDisplayName"/>
<div class="o_ActivityView_detailsAssignation d-md-table-cell py-md-1 pe-4">
<img class="o_ActivityView_detailsUserAvatar o_ActivityView_detailsAssignationUserAvatar me-1 rounded-circle align-text-bottom" t-attf-src="/web/image/res.users/{{ activityView.activity.assignee.id }}/avatar_128" t-att-title="activityView.activity.assignee.nameOrDisplayName" t-att-alt="activityView.activity.assignee.nameOrDisplayName"/>
<b t-esc="activityView.activity.assignee.nameOrDisplayName"/>
</div>
</div>
<div class="d-md-table-row">
<div class="d-md-table-cell fw-bold text-md-end m-0 py-md-1 px-md-4">Due on</div>
<div class="o_Activity_detailsDueDate d-md-table-cell py-md-1 pe-4">
<span class="o_Activity_deadlineDateText"
<div class="o_ActivityView_detailsDueDate d-md-table-cell py-md-1 pe-4">
<span class="o_ActivityView_deadlineDateText"
t-att-class="{
'text-danger': activityView.activity.state === 'overdue',
'text-success': activityView.activity.state === 'planned',
@@ -103,16 +103,16 @@
</t>
<t t-if="activityView.activity.note">
<div class="o_Activity_note">
<div class="o_ActivityView_note">
<t t-out="activityView.activity.noteAsMarkup"/>
</div>
</t>
<t t-if="activityView.mailTemplateViews.length > 0">
<div class="o_Activity_mailTemplates">
<div class="o_ActivityView_mailTemplates">
<t t-foreach="activityView.mailTemplateViews" t-as="mailTemplateView" t-key="mailTemplateView.localId">
<MailTemplate
className="'o_Activity_mailTemplate'"
className="'o_ActivityView_mailTemplate'"
record="mailTemplateView"
/>
</t>
@@ -120,19 +120,19 @@
</t>
<t t-if="activityView.activity.canWrite">
<div name="tools" class="o_Activity_tools d-flex">
<button class="o_Activity_toolButton o_Activity_markDoneButton btn btn-link btn-primary pt-0 ps-0" t-att-title="activityView.markDoneText" t-ref="markDoneButton" t-on-click="activityView.onClickMarkDoneButton">
<div name="tools" class="o_ActivityView_tools d-flex">
<button class="o_ActivityView_toolButton o_ActivityView_markDoneButton btn btn-link btn-primary pt-0 ps-0" t-att-title="activityView.markDoneText" t-ref="markDoneButton" t-on-click="activityView.onClickMarkDoneButton">
<i class="fa fa-check"/> Mark Done
</button>
<t t-if="activityView.fileUploader">
<button class="o_Activity_toolButton o_Activity_uploadButton btn btn-link btn-primary pt-0 ps-0" t-on-click="activityView.onClickUploadDocument">
<button class="o_ActivityView_toolButton o_ActivityView_uploadButton btn btn-link btn-primary pt-0 ps-0" t-on-click="activityView.onClickUploadDocument">
<i class="fa fa-upload"/> Upload Document
</button>
</t>
<button class="o_Activity_toolButton o_Activity_editButton btn btn-link btn-primary pt-0" t-on-click="activityView.onClickEdit">
<button class="o_ActivityView_toolButton o_ActivityView_editButton btn btn-link btn-primary pt-0" t-on-click="activityView.onClickEdit">
<i class="fa fa-pencil"/> Edit
</button>
<button class="o_Activity_toolButton o_Activity_cancelButton btn btn-link btn-primary pt-0" t-on-click="activityView.onClickCancel" >
<button class="o_ActivityView_toolButton o_ActivityView_cancelButton btn btn-link btn-primary pt-0" t-on-click="activityView.onClickCancel" >
<i class="fa fa-times"/> Cancel
</button>
</div>
@@ -34,7 +34,7 @@
<t t-if="activityBoxView.isActivityListVisible">
<div class="o_ActivityBox_activityList">
<t t-foreach="activityBoxView.activityViews" t-as="activityView" t-key="activityView.localId">
<Activity className="'o_ActivityBox_activity'" record="activityView"/>
<ActivityView className="'o_ActivityBox_activity'" record="activityView"/>
</t>
</div>
</t>
@@ -25,7 +25,7 @@ QUnit.test('activity mark done popover simplest layout', async function (assert)
res_id: resPartnerId1,
views: [[false, 'form']],
});
await click('.o_Activity_markDoneButton');
await click('.o_ActivityView_markDoneButton');
assert.containsOnce(
document.body,
@@ -77,7 +77,7 @@ QUnit.test('activity with force next mark done popover simplest layout', async f
res_id: resPartnerId1,
views: [[false, 'form']],
});
await click('.o_Activity_markDoneButton');
await click('.o_ActivityView_markDoneButton');
assert.containsOnce(
document.body,
@@ -145,7 +145,7 @@ QUnit.test('activity mark done popover mark done without feedback', async functi
res_id: resPartnerId1,
views: [[false, 'form']],
});
await click('.o_Activity_markDoneButton');
await click('.o_ActivityView_markDoneButton');
await click('.o_ActivityMarkDonePopoverContent_doneButton');
assert.verifySteps(
['action_feedback'],
@@ -187,7 +187,7 @@ QUnit.test('activity mark done popover mark done with feedback', async function
res_id: resPartnerId1,
views: [[false, 'form']],
});
await click('.o_Activity_markDoneButton');
await click('.o_ActivityView_markDoneButton');
let feedbackTextarea = document.querySelector('.o_ActivityMarkDonePopoverContent_feedback');
feedbackTextarea.focus();
@@ -237,7 +237,7 @@ QUnit.test('activity mark done popover mark done and schedule next', async funct
throw new Error("The do-action event should not be triggered when the route doesn't return an action");
},
});
await click('.o_Activity_markDoneButton');
await click('.o_ActivityView_markDoneButton');
let feedbackTextarea = document.querySelector('.o_ActivityMarkDonePopoverContent_feedback');
feedbackTextarea.focus();
@@ -282,7 +282,7 @@ QUnit.test('[technical] activity mark done & schedule next with new action', asy
);
},
});
await click('.o_Activity_markDoneButton');
await click('.o_ActivityView_markDoneButton');
await click('.o_ActivityMarkDonePopoverContent_doneScheduleNextButton');
assert.verifySteps(
@@ -25,62 +25,62 @@ QUnit.test('activity simplest layout', async function (assert) {
views: [[false, 'form']],
});
assert.strictEqual(
document.querySelectorAll('.o_Activity').length,
document.querySelectorAll('.o_ActivityView').length,
1,
"should have activity component"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_sidebar').length,
document.querySelectorAll('.o_ActivityView_sidebar').length,
1,
"should have activity sidebar"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_core').length,
document.querySelectorAll('.o_ActivityView_core').length,
1,
"should have activity core"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_user').length,
document.querySelectorAll('.o_ActivityView_user').length,
1,
"should have activity user"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_info').length,
document.querySelectorAll('.o_ActivityView_info').length,
1,
"should have activity info"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_note').length,
document.querySelectorAll('.o_ActivityView_note').length,
0,
"should not have activity note"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_details').length,
document.querySelectorAll('.o_ActivityView_details').length,
0,
"should not have activity details"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_mailTemplates').length,
document.querySelectorAll('.o_ActivityView_mailTemplates').length,
0,
"should not have activity mail templates"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_editButton').length,
document.querySelectorAll('.o_ActivityView_editButton').length,
0,
"should not have activity Edit button"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_cancelButton').length,
document.querySelectorAll('.o_ActivityView_cancelButton').length,
0,
"should not have activity Cancel button"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_markDoneButton').length,
document.querySelectorAll('.o_ActivityView_markDoneButton').length,
0,
"should not have activity Mark as Done button"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_uploadButton').length,
document.querySelectorAll('.o_ActivityView_uploadButton').length,
0,
"should not have activity Upload button"
);
@@ -103,17 +103,17 @@ QUnit.test('activity with note layout', async function (assert) {
views: [[false, 'form']],
});
assert.strictEqual(
document.querySelectorAll('.o_Activity').length,
document.querySelectorAll('.o_ActivityView').length,
1,
"should have activity component"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_note').length,
document.querySelectorAll('.o_ActivityView_note').length,
1,
"should have activity note"
);
assert.strictEqual(
document.querySelector('.o_Activity_note').textContent,
document.querySelector('.o_ActivityView_note').textContent,
"There is no good or bad note",
"activity note should be 'There is no good or bad note'"
);
@@ -140,21 +140,21 @@ QUnit.test('activity info layout when planned after tomorrow', async function (a
views: [[false, 'form']],
});
assert.strictEqual(
document.querySelectorAll('.o_Activity').length,
document.querySelectorAll('.o_ActivityView').length,
1,
"should have activity component"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_dueDateText').length,
document.querySelectorAll('.o_ActivityView_dueDateText').length,
1,
"should have activity delay"
);
assert.ok(
document.querySelector('.o_Activity_dueDateText').classList.contains('text-success'),
document.querySelector('.o_ActivityView_dueDateText').classList.contains('text-success'),
"activity delay should have the right color modifier class (text-success)"
);
assert.strictEqual(
document.querySelector('.o_Activity_dueDateText').textContent,
document.querySelector('.o_ActivityView_dueDateText').textContent,
"Due in 5 days:",
"activity delay should have 'Due in 5 days:' as label"
);
@@ -181,21 +181,21 @@ QUnit.test('activity info layout when planned tomorrow', async function (assert)
views: [[false, 'form']],
});
assert.strictEqual(
document.querySelectorAll('.o_Activity').length,
document.querySelectorAll('.o_ActivityView').length,
1,
"should have activity component"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_dueDateText').length,
document.querySelectorAll('.o_ActivityView_dueDateText').length,
1,
"should have activity delay"
);
assert.ok(
document.querySelector('.o_Activity_dueDateText').classList.contains('text-success'),
document.querySelector('.o_ActivityView_dueDateText').classList.contains('text-success'),
"activity delay should have the right color modifier class (text-success)"
);
assert.strictEqual(
document.querySelector('.o_Activity_dueDateText').textContent,
document.querySelector('.o_ActivityView_dueDateText').textContent,
'Tomorrow:',
"activity delay should have 'Tomorrow:' as label"
);
@@ -219,21 +219,21 @@ QUnit.test('activity info layout when planned today', async function (assert) {
views: [[false, 'form']],
});
assert.strictEqual(
document.querySelectorAll('.o_Activity').length,
document.querySelectorAll('.o_ActivityView').length,
1,
"should have activity component"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_dueDateText').length,
document.querySelectorAll('.o_ActivityView_dueDateText').length,
1,
"should have activity delay"
);
assert.ok(
document.querySelector('.o_Activity_dueDateText').classList.contains('text-warning'),
document.querySelector('.o_ActivityView_dueDateText').classList.contains('text-warning'),
"activity delay should have the right color modifier class (text-warning)"
);
assert.strictEqual(
document.querySelector('.o_Activity_dueDateText').textContent,
document.querySelector('.o_ActivityView_dueDateText').textContent,
"Today:",
"activity delay should have 'Today:' as label"
);
@@ -260,21 +260,21 @@ QUnit.test('activity info layout when planned yesterday', async function (assert
views: [[false, 'form']],
});
assert.strictEqual(
document.querySelectorAll('.o_Activity').length,
document.querySelectorAll('.o_ActivityView').length,
1,
"should have activity component"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_dueDateText').length,
document.querySelectorAll('.o_ActivityView_dueDateText').length,
1,
"should have activity delay"
);
assert.ok(
document.querySelector('.o_Activity_dueDateText').classList.contains('text-danger'),
document.querySelector('.o_ActivityView_dueDateText').classList.contains('text-danger'),
"activity delay should have the right color modifier class (text-danger)"
);
assert.strictEqual(
document.querySelector('.o_Activity_dueDateText').textContent,
document.querySelector('.o_ActivityView_dueDateText').textContent,
"Yesterday:",
"activity delay should have 'Yesterday:' as label"
);
@@ -301,21 +301,21 @@ QUnit.test('activity info layout when planned before yesterday', async function
views: [[false, 'form']],
});
assert.strictEqual(
document.querySelectorAll('.o_Activity').length,
document.querySelectorAll('.o_ActivityView').length,
1,
"should have activity component"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_dueDateText').length,
document.querySelectorAll('.o_ActivityView_dueDateText').length,
1,
"should have activity delay"
);
assert.ok(
document.querySelector('.o_Activity_dueDateText').classList.contains('text-danger'),
document.querySelector('.o_ActivityView_dueDateText').classList.contains('text-danger'),
"activity delay should have the right color modifier class (text-danger)"
);
assert.strictEqual(
document.querySelector('.o_Activity_dueDateText').textContent,
document.querySelector('.o_ActivityView_dueDateText').textContent,
"5 days overdue:",
"activity delay should have '5 days overdue:' as label"
);
@@ -338,22 +338,22 @@ QUnit.test('activity with a summary layout', async function (assert) {
views: [[false, 'form']],
});
assert.strictEqual(
document.querySelectorAll('.o_Activity').length,
document.querySelectorAll('.o_ActivityView').length,
1,
"should have activity component"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_summary').length,
document.querySelectorAll('.o_ActivityView_summary').length,
1,
"should have activity summary"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_type').length,
document.querySelectorAll('.o_ActivityView_type').length,
0,
"should not have the activity type as summary"
);
assert.strictEqual(
document.querySelector('.o_Activity_summary').textContent.trim(),
document.querySelector('.o_ActivityView_summary').textContent.trim(),
"“test summary”",
"should have the specific activity summary in activity summary"
);
@@ -376,27 +376,27 @@ QUnit.test('activity without summary layout', async function (assert) {
views: [[false, 'form']],
});
assert.strictEqual(
document.querySelectorAll('.o_Activity').length,
document.querySelectorAll('.o_ActivityView').length,
1,
"should have activity component"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_type').length,
document.querySelectorAll('.o_ActivityView_type').length,
1,
"activity details should have an activity type section"
);
assert.strictEqual(
document.querySelector('.o_Activity_type').textContent.trim(),
document.querySelector('.o_ActivityView_type').textContent.trim(),
"Email",
"activity details should have the activity type display name in type section"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_summary.o_Activity_type').length,
document.querySelectorAll('.o_ActivityView_summary.o_ActivityView_type').length,
1,
"should have activity type as summary"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_summary:not(.o_Activity_type)').length,
document.querySelectorAll('.o_ActivityView_summary:not(.o_ActivityView_type)').length,
0,
"should not have a specific summary"
);
@@ -425,31 +425,31 @@ QUnit.test('activity details toggle', async function (assert) {
views: [[false, 'form']],
});
assert.strictEqual(
document.querySelectorAll('.o_Activity').length,
document.querySelectorAll('.o_ActivityView').length,
1,
"should have activity component"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_details').length,
document.querySelectorAll('.o_ActivityView_details').length,
0,
"activity details should not be visible by default"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_detailsButton').length,
document.querySelectorAll('.o_ActivityView_detailsButton').length,
1,
"activity should have a details button"
);
await click('.o_Activity_detailsButton');
await click('.o_ActivityView_detailsButton');
assert.strictEqual(
document.querySelectorAll('.o_Activity_details').length,
document.querySelectorAll('.o_ActivityView_details').length,
1,
"activity details should be visible after clicking on details button"
);
await click('.o_Activity_detailsButton');
await click('.o_ActivityView_detailsButton');
assert.strictEqual(
document.querySelectorAll('.o_Activity_details').length,
document.querySelectorAll('.o_ActivityView_details').length,
0,
"activity details should no longer be visible after clicking again on details button"
);
@@ -482,59 +482,59 @@ QUnit.test('activity details layout', async function (assert) {
views: [[false, 'form']],
});
assert.strictEqual(
document.querySelectorAll('.o_Activity').length,
document.querySelectorAll('.o_ActivityView').length,
1,
"should have activity component"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_userAvatar').length,
document.querySelectorAll('.o_ActivityView_userAvatar').length,
1,
"should have activity user avatar"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_detailsButton').length,
document.querySelectorAll('.o_ActivityView_detailsButton').length,
1,
"activity should have a details button"
);
await click('.o_Activity_detailsButton');
await click('.o_ActivityView_detailsButton');
assert.strictEqual(
document.querySelectorAll('.o_Activity_details').length,
document.querySelectorAll('.o_ActivityView_details').length,
1,
"activity details should be visible after clicking on details button"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_details .o_Activity_type').length,
document.querySelectorAll('.o_ActivityView_details .o_ActivityView_type').length,
1,
"activity details should have type"
);
assert.strictEqual(
document.querySelector('.o_Activity_details .o_Activity_type').textContent,
document.querySelector('.o_ActivityView_details .o_ActivityView_type').textContent,
"Email",
"activity details type should be 'Email'"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_detailsCreation').length,
document.querySelectorAll('.o_ActivityView_detailsCreation').length,
1,
"activity details should have creation date "
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_detailsCreator').length,
document.querySelectorAll('.o_ActivityView_detailsCreator').length,
1,
"activity details should have creator"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_detailsAssignation').length,
document.querySelectorAll('.o_ActivityView_detailsAssignation').length,
1,
"activity details should have assignation information"
);
assert.strictEqual(
document.querySelector('.o_Activity_detailsAssignation').textContent.indexOf('Pauvre pomme'),
document.querySelector('.o_ActivityView_detailsAssignation').textContent.indexOf('Pauvre pomme'),
0,
"activity details assignation information should contain creator display name"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_detailsAssignationUserAvatar').length,
document.querySelectorAll('.o_ActivityView_detailsAssignationUserAvatar').length,
1,
"activity details should have user avatar"
);
@@ -560,22 +560,22 @@ QUnit.test('activity with mail template layout', async function (assert) {
views: [[false, 'form']],
});
assert.strictEqual(
document.querySelectorAll('.o_Activity').length,
document.querySelectorAll('.o_ActivityView').length,
1,
"should have activity component"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_sidebar').length,
document.querySelectorAll('.o_ActivityView_sidebar').length,
1,
"should have activity sidebar"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_mailTemplates').length,
document.querySelectorAll('.o_ActivityView_mailTemplates').length,
1,
"should have activity mail templates"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_mailTemplate').length,
document.querySelectorAll('.o_ActivityView_mailTemplate').length,
1,
"should have activity mail template"
);
@@ -655,7 +655,7 @@ QUnit.test('activity with mail template: preview mail', async function (assert)
},
});
assert.strictEqual(
document.querySelectorAll('.o_Activity').length,
document.querySelectorAll('.o_ActivityView').length,
1,
"should have activity component"
);
@@ -703,7 +703,7 @@ QUnit.test('activity with mail template: send mail', async function (assert) {
views: [[false, 'form']],
});
assert.strictEqual(
document.querySelectorAll('.o_Activity').length,
document.querySelectorAll('.o_ActivityView').length,
1,
"should have activity component"
);
@@ -740,12 +740,12 @@ QUnit.test('activity upload document is available', async function (assert) {
views: [[false, 'form']],
});
assert.strictEqual(
document.querySelectorAll('.o_Activity').length,
document.querySelectorAll('.o_ActivityView').length,
1,
"should have activity component"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_uploadButton').length,
document.querySelectorAll('.o_ActivityView_uploadButton').length,
1,
"should have activity upload button"
);
@@ -775,24 +775,24 @@ QUnit.test('activity click on mark as done', async function (assert) {
views: [[false, 'form']],
});
assert.strictEqual(
document.querySelectorAll('.o_Activity').length,
document.querySelectorAll('.o_ActivityView').length,
1,
"should have activity component"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_markDoneButton').length,
document.querySelectorAll('.o_ActivityView_markDoneButton').length,
1,
"should have activity Mark as Done button"
);
await click('.o_Activity_markDoneButton');
await click('.o_ActivityView_markDoneButton');
assert.strictEqual(
document.querySelectorAll('.o_ActivityMarkDonePopoverContent').length,
1,
"should have opened the mark done popover"
);
await click('.o_Activity_markDoneButton');
await click('.o_ActivityView_markDoneButton');
assert.strictEqual(
document.querySelectorAll('.o_ActivityMarkDonePopoverContent').length,
0,
@@ -821,16 +821,16 @@ QUnit.test('activity mark as done popover should focus feedback input on open [R
});
assert.containsOnce(
document.body,
'.o_Activity',
'.o_ActivityView',
"should have activity component"
);
assert.containsOnce(
document.body,
'.o_Activity_markDoneButton',
'.o_ActivityView_markDoneButton',
"should have activity Mark as Done button"
);
await click('.o_Activity_markDoneButton');
await click('.o_ActivityView_markDoneButton');
assert.strictEqual(
document.querySelector('.o_ActivityMarkDonePopoverContent_feedback'),
document.activeElement,
@@ -890,17 +890,17 @@ QUnit.test('activity click on edit', async function (assert) {
},
});
assert.strictEqual(
document.querySelectorAll('.o_Activity').length,
document.querySelectorAll('.o_ActivityView').length,
1,
"should have activity component"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_editButton').length,
document.querySelectorAll('.o_ActivityView_editButton').length,
1,
"should have activity edit button"
);
await click('.o_Activity_editButton');
await click('.o_ActivityView_editButton');
assert.verifySteps(
['do_action'],
"should have called 'schedule activity' action correctly"
@@ -958,43 +958,43 @@ QUnit.test('activity edition', async function (assert) {
});
assert.containsOnce(
document.body,
'.o_Activity',
'.o_ActivityView',
"should have activity component"
);
assert.containsOnce(
document.body,
'.o_Activity_editButton',
'.o_ActivityView_editButton',
"should have activity edit button"
);
assert.containsOnce(
document.body,
'.o_Activity_icon',
'.o_ActivityView_icon',
"should have activity icon"
);
assert.containsOnce(
document.body,
'.o_Activity_icon.fa-times',
'.o_ActivityView_icon.fa-times',
"should have initial activity icon"
);
assert.containsNone(
document.body,
'.o_Activity_icon.fa-check',
'.o_ActivityView_icon.fa-check',
"should not have new activity icon when not edited yet"
);
await click('.o_Activity_editButton');
await click('.o_ActivityView_editButton');
assert.verifySteps(
['do_action'],
"should have called 'schedule activity' action correctly"
);
assert.containsNone(
document.body,
'.o_Activity_icon.fa-times',
'.o_ActivityView_icon.fa-times',
"should no more have initial activity icon once edited"
);
assert.containsOnce(
document.body,
'.o_Activity_icon.fa-check',
'.o_ActivityView_icon.fa-check',
"should now have new activity icon once edited"
);
});
@@ -1026,23 +1026,23 @@ QUnit.test('activity click on cancel', async function (assert) {
views: [[false, 'form']],
});
assert.strictEqual(
document.querySelectorAll('.o_Activity').length,
document.querySelectorAll('.o_ActivityView').length,
1,
"should have activity component"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity_cancelButton').length,
document.querySelectorAll('.o_ActivityView_cancelButton').length,
1,
"should have activity cancel button"
);
await click('.o_Activity_cancelButton');
await click('.o_ActivityView_cancelButton');
assert.verifySteps(
['unlink'],
"should have called unlink rpc after clicking on cancel"
);
assert.strictEqual(
document.querySelectorAll('.o_Activity').length,
document.querySelectorAll('.o_ActivityView').length,
0,
"should no longer display activity after clicking on cancel"
);
@@ -1069,7 +1069,7 @@ QUnit.test('activity mark done popover close on ESCAPE', async function (assert)
views: [[false, 'form']],
});
await click('.o_Activity_markDoneButton');
await click('.o_ActivityView_markDoneButton');
assert.containsOnce(
document.body,
'.o_ActivityMarkDonePopoverContent',
@@ -1109,7 +1109,7 @@ QUnit.test('activity mark done popover click on discard', async function (assert
views: [[false, 'form']],
});
await click('.o_Activity_markDoneButton');
await click('.o_ActivityView_markDoneButton');
assert.containsOnce(
document.body,
'.o_ActivityMarkDonePopoverContent',
@@ -1170,16 +1170,16 @@ QUnit.test('data-oe-id & data-oe-model link redirection on click', async functio
});
assert.containsOnce(
document.body,
'.o_Activity_note',
'.o_ActivityView_note',
"activity should have a note"
);
assert.containsOnce(
document.querySelector('.o_Activity_note'),
document.querySelector('.o_ActivityView_note'),
'a',
"activity note should have a link"
);
document.querySelector(`.o_Activity_note a`).click();
document.querySelector(`.o_ActivityView_note a`).click();
assert.verifySteps(
['do-action:openFormView_some.model_250'],
"should have open form view on related record after click on link"
@@ -1219,12 +1219,12 @@ QUnit.test('button related to file uploading is replaced when updating activity
});
assert.containsOnce(
document.body,
'.o_Activity_markDoneButton',
'.o_ActivityView_markDoneButton',
"should have a mark done button when changing activity type from 'Upload Document' to 'Email'"
);
assert.containsNone(
document.body,
'.o_Activity_uploadButton',
'.o_ActivityView_uploadButton',
"should not have an upload button after changing the activity type from 'Upload Document' to 'Email'"
);
});
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="UTF-8" ?>
<templates xml:space="preserve">
<t t-inherit="mail.Activity" t-inherit-mode="extension">
<t t-inherit="mail.ActivityView" t-inherit-mode="extension">
<xpath expr="//*[@name='tools']" position="replace">
<t t-if="activityView.activity.requestingPartner and activityView.activity.thread.model === 'slide.channel'">
<div class="o_Activity_tools">
<button class="o_Activity_toolButton o_Activity_grantAccessButton btn btn-link" t-on-click="activityView.onGrantAccess">
<div class="o_ActivityView_tools">
<button class="o_ActivityView_toolButton o_ActivityView_grantAccessButton btn btn-link" t-on-click="activityView.onGrantAccess">
<i class="fa fa-check"/> Grant Access
</button>
<button class="o_Activity_toolButton o_Activity_refuseAccessButton btn btn-link" t-on-click="activityView.onRefuseAccess">
<button class="o_ActivityView_toolButton o_ActivityView_refuseAccessButton btn btn-link" t-on-click="activityView.onRefuseAccess">
<i class="fa fa-times"/> Refuse Access
</button>
</div>
@@ -37,10 +37,10 @@ QUnit.test('grant course access', async function (assert) {
views: [[false, 'form']],
});
assert.containsOnce(document.body, '.o_Activity', "should have activity component");
assert.containsOnce(document.body, '.o_Activity_grantAccessButton', "should have grant access button");
assert.containsOnce(document.body, '.o_ActivityView', "should have activity component");
assert.containsOnce(document.body, '.o_ActivityView_grantAccessButton', "should have grant access button");
document.querySelector('.o_Activity_grantAccessButton').click();
document.querySelector('.o_ActivityView_grantAccessButton').click();
assert.verifySteps(['access_grant'], "Grant button should trigger the right rpc call");
});
@@ -75,10 +75,10 @@ QUnit.test('refuse course access', async function (assert) {
views: [[false, 'form']],
});
assert.containsOnce(document.body, '.o_Activity', "should have activity component");
assert.containsOnce(document.body, '.o_Activity_refuseAccessButton', "should have refuse access button");
assert.containsOnce(document.body, '.o_ActivityView', "should have activity component");
assert.containsOnce(document.body, '.o_ActivityView_refuseAccessButton', "should have refuse access button");
document.querySelector('.o_Activity_refuseAccessButton').click();
document.querySelector('.o_ActivityView_refuseAccessButton').click();
assert.verifySteps(['access_refuse'], "refuse button should trigger the right rpc call");
});