19.0 vanilla

This commit is contained in:
Ernad Husremovic 2026-03-09 09:31:00 +01:00
parent a1137a1456
commit e1d89e11e3
2789 changed files with 1093187 additions and 605897 deletions

View file

@ -0,0 +1,16 @@
import { hrModels } from "@hr/../tests/hr_test_helpers";
import { defineModels } from "@web/../tests/web_test_helpers";
import { HrEmployeeSkill } from "./mock_server/mock_models/hr_employee_skill";
import { HrSkill } from "./mock_server/mock_models/hr_skill";
import { M2oAvatarEmployee } from "./mock_server/mock_models/m2o_avatar_employee";
export function defineHrSkillModels() {
return defineModels(hrSkillModels);
}
export const hrSkillModels = {
...hrModels,
HrEmployeeSkill,
HrSkill,
M2oAvatarEmployee,
};

View file

@ -0,0 +1,64 @@
import { click, contains, start, startServer } from "@mail/../tests/mail_test_helpers";
import { mountView, onRpc } from "@web/../tests/web_test_helpers";
import { describe, expect, test } from "@odoo/hoot";
import { queryAttribute } from "@odoo/hoot-dom";
import { defineHrSkillModels } from "@hr_skills/../tests/hr_skills_test_helpers";
describe.current.tags("desktop");
defineHrSkillModels();
test("many2one_avatar_employee widget in kanban view with skills on avatar card", async () => {
const pyEnv = await startServer();
const [java, tigrinya] = pyEnv["hr.skill"].create([{ name: "Java" }, { name: "Tigrinya" }]);
const pierrePid = pyEnv["res.partner"].create({ name: "Pierre" });
const pierreUid = pyEnv["res.users"].create({ name: "Pierre", partner_id: pierrePid });
const pierreEid = pyEnv["hr.employee"].create({
name: "Pierre",
user_id: pierreUid,
user_partner_id: pierrePid,
});
const [javaForPierre, tigrinyaForPierre] = pyEnv["hr.employee.skill"].create([
{ employee_id: pierreEid, skill_id: java },
{ employee_id: pierreEid, skill_id: tigrinya },
]);
pyEnv["hr.employee.public"].create({
name: "Pierre",
employee_skill_ids: [javaForPierre, tigrinyaForPierre],
});
pyEnv["m2o.avatar.employee"].create([{ employee_id: pierreEid }]);
await start();
onRpc("hr.employee", "get_avatar_card_data", (params) => {
const resourceIdArray = params.args[0];
const resourceId = resourceIdArray[0];
const resources = pyEnv['hr.employee.public'].read([resourceId]);
const result = resources.map(resource => ({
name: resource.name,
role_ids: resource.role_ids,
email:resource.email,
phone: resource.phone,
user_id: resource.user_id,
employee_skill_ids: resource.employee_skill_ids
}));
return result;
});
await mountView({
type: "kanban",
resModel: "m2o.avatar.employee",
arch: `<kanban>
<templates>
<t t-name="card">
<field name="employee_id" widget="many2one_avatar_employee"/>
</t>
</templates>
</kanban>`,
});
await contains(".o_m2o_avatar", { count: 1 });
await contains(".o_field_many2one_avatar_employee img", { count: 1 });
expect(
queryAttribute(".o_kanban_record .o_field_many2one_avatar_employee img", "data-src")
).toBe(`/web/image/hr.employee/${pierreEid}/avatar_128`);
await click(".o_kanban_record .o_m2o_avatar > img");
await contains(".o_avatar_card");
await contains(".o_avatar_card .o_employee_skills_tags > .o_tag", { count: 2 });
});

View file

@ -0,0 +1,5 @@
import { models } from "@web/../tests/web_test_helpers";
export class HrEmployeeSkill extends models.ServerModel {
_name = "hr.employee.skill";
}

View file

@ -0,0 +1,5 @@
import { models } from "@web/../tests/web_test_helpers";
export class HrSkill extends models.ServerModel {
_name = "hr.skill";
}

View file

@ -0,0 +1,7 @@
import { fields, models } from "@web/../tests/web_test_helpers";
export class M2oAvatarEmployee extends models.Model {
_name = "m2o.avatar.employee";
employee_id = fields.Many2one({ string: "Employee", relation: "hr.employee" });
}

View file

@ -1,147 +1,169 @@
/** @odoo-module **/
import { registry } from "@web/core/registry";
import { stepUtils } from "@web_tour/tour_utils";
import tour from 'web_tour.tour';
tour.register('hr_skills_tour', {
test: true,
url: '/web',
}, [
tour.stepUtils.showAppsMenuItem(),
{
content: "Open Employees app",
trigger: ".o_app[data-menu-xmlid='hr.menu_hr_root']",
},
{
content: "Create a new employee",
trigger: ".o-kanban-button-new",
},
{
content: "Pick a name",
trigger: ".o_field_widget[name='name'] input",
run: "text Jony McHallyFace",
},
{
content: "Save",
trigger: ".o_form_button_save",
},
{
content: "Add a new Resume experience",
trigger: ".o_field_resume_one2many tr.o_resume_group_header button.btn-secondary",
},
{
content: "Enter some company name",
trigger: ".modal-body .o_field_widget[name='name'] input",
run: "text Mamie Rock",
},
{
content: "Set start date",
trigger: ".o_field_widget[name='date_start'] input",
run: "text 12/05/2017",
},
{
content: "Give some description",
trigger: ".o_field_widget[name='description'] textarea",
run: "text Sang some songs and played some music",
},
{
content: "Save it",
trigger: ".o_form_button_save",
in_modal: true,
run: "click",
},
{
content: "Edit newly created experience",
trigger: ".o_resume_line_title:contains('Mamie Rock')",
run: "click",
},
{
content: "Change type",
trigger: ".o_field_widget[name='line_type_id'] input",
run: "text Experience",
},
{
content: "Choose experience",
trigger: '.ui-autocomplete .ui-menu-item a:contains("Experience")',
run: "click",
},
{
content: "Save experience change",
trigger: ".o_form_button_save",
in_modal: true,
run: "click",
},
{
content: "Add a new Skill",
trigger: ".o_field_skills_one2many button:contains('Create a new entry')",
},
{
content: "Select Music",
trigger: ".o_field_widget[name='skill_type_id'] label:contains('Best Music')",
run: "click",
},
{
content: "Select a song",
trigger: ".o_field_widget[name='skill_id'] input",
run: "text Fortun",
},
{
content: "Choose the song",
trigger: '.ui-autocomplete .ui-menu-item a:contains("Fortunate Son")',
run: "click",
},
{
content: "Select a level",
trigger: ".o_field_widget[name='skill_level_id'] input",
run: "text Level",
},
{
content: "Choose the level",
trigger: '.ui-autocomplete .ui-menu-item a:contains("Level 2")',
run: "click",
},
{
content: "Save new skill",
trigger: ".o_form_button_save",
in_modal: true,
run: "click",
},
{
content: "Add a new Skill",
trigger: ".o_field_skills_one2many button:contains('ADD')",
},
{
content: "Select a song", // "Music" should be already selected
trigger: ".o_field_widget[name='skill_id'] input",
run: "text Mary",
},
{
content: "Choose the song",
trigger: '.ui-autocomplete .ui-menu-item a:contains("Oh Mary")',
run: "click",
},
{
content: "Select a level",
trigger: ".o_field_widget[name='skill_level_id'] input",
run: "text Level 7",
},
{
content: "Choose the level",
trigger: '.ui-autocomplete .ui-menu-item a:contains("Level 7")',
run: "click",
},
{
content: "Save new skill",
trigger: ".o_form_button_save",
in_modal: true,
run: "click",
},
...tour.stepUtils.saveForm({
content: "save Form",
extra_trigger: 'td:containsExact("Oh Mary")',
}),
{
content: "Go back to employees",
trigger: 'a[data-menu-xmlid="hr.menu_hr_root"]',
run: "click",
}
]);
registry.category("web_tour.tours").add("hr_skills_tour", {
url: "/odoo",
steps: () => [
stepUtils.showAppsMenuItem(),
{
content: "Open Employees app",
trigger: ".o_app[data-menu-xmlid='hr.menu_hr_root']",
run: "click",
},
{
content: "Create a new employee",
trigger: ".o-kanban-button-new",
run: "click",
},
{
content: "Pick a name",
trigger: ".o_field_widget[name='name'] input",
run: "edit Jony McHallyFace",
},
{
content: "Save",
trigger: ".o_form_button_save",
run: "click",
},
{
content: "Add Experience",
trigger: ".nav-link:contains('Resume')",
run: "click",
},
{
content: "Add a new Resume experience",
trigger: ".o_field_resume_one2many button.btn-secondary",
run: "click",
},
{
content: "Enter some company name",
trigger:
".modal:contains(new resume line) .modal-body .o_field_widget[name='name'] input",
run: "edit Mamie Rock",
},
{
trigger: ".modal:contains(new resume line) .o_field_widget[name='date_start'] button",
content: "open date picker",
run: "click",
},
{
content: "Set start date",
trigger: ".modal:contains(new resume line) .o_field_widget[name='date_start'] input",
run: "edit 12/05/2017",
},
{
content: "Give some description",
trigger: `.modal:contains(new resume line) .o_field_html[name='description'] div.o-paragraph`,
run: "editor Sang some songs and played some music",
},
{
content: "Save it",
trigger: ".modal:contains(new resume line) .o_form_button_save:contains(save)",
run: "click",
},
{
trigger: "body:not(:has(.modal:contains(new resume line)))",
},
{
content: "Edit newly created experience",
trigger: ".o_resume_line_title:contains(Mamie Rock)",
run: "click",
},
{
content: "Change type",
trigger: ".modal:contains(new resume line) .o_field_widget[name='line_type_id'] .o_selection_badge:contains(Other Experience)",
run: "click",
},
{
content: "Save experience change",
trigger: ".modal:contains(new resume line) .o_form_button_save:contains(save)",
run: "click",
},
{
trigger: "body:not(:has(.modal:contains(new resume line)))",
},
{
content: "Add a new Skill",
trigger: ".o_field_skills_one2many button:contains('Pick a skill from the list')",
run: "click",
},
{
content: "Select Music",
trigger: ".o_field_widget[name='skill_type_id'] span:contains('Best Music')",
run: "click",
},
{
content: "Choose the song",
trigger: ".o_field_widget[name='skill_id'] span:contains('Fortunate Son')",
run: "click",
},
{
content: "Choose the level",
trigger: ".o_field_widget[name='skill_level_id'] span:contains('Level 2')",
run: "click",
},
{
content: "Save new skill",
trigger: ".modal:contains(update skills) .o_form_button_save:contains(save & close)",
run: "click",
},
{
content:
"Wait the new skill is completely saved. Ensure also the modal is closed before open a new one.",
trigger: "body:not(:has(.modal))",
},
{
content: "Check if item is added",
trigger: ".o_data_row td.o_data_cell:contains('Fortunate Son')",
},
{
content: "Add a new Skill",
trigger: ".o_field_skills_one2many button:contains('ADD')",
run: "click",
},
{
content: "Select Certification",
trigger: ".o_field_widget[name='skill_type_id'] span:contains('Music Certification')",
run: "click",
},
{
content: "Choose the instrument",
trigger: ".o_field_widget[name='skill_id'] span:contains('Piano')",
run: "click",
},
{
content: "Choose the level",
trigger: "div[name='valid_from'] button",
run: "click",
},
{
content: "Choose the level",
trigger: ".o_field_widget[name='valid_from'] input",
run: "edit 02/03/2025",
},
{
content: "Choose the level",
trigger: ".o_field_widget[name='valid_to']",
run: "click",
},
{
content: "Choose the level",
trigger: ".o_field_widget[name='valid_to'] input",
run: "edit 03/04/2025",
},
{
content: "Save new skill",
trigger: ".modal:contains(update skills) .o_form_button_save:contains(save & close)",
run: "click",
},
{
content: "Wait the new skill is completely saved",
trigger: "body:not(:has(.modal))",
},
{
content: "Check if item is added",
trigger: ".o_data_row td.o_data_cell:contains('Piano')",
},
...stepUtils.saveForm(),
],
});

View file

@ -0,0 +1,87 @@
import { registry } from "@web/core/registry";
import { stepUtils } from "@web_tour/tour_utils";
registry.category("web_tour.tours").add("hr_skills_type_tour", {
url: "/odoo",
steps: () => [
stepUtils.showAppsMenuItem(),
{
content: "Open Employees app",
trigger: ".o_app[data-menu-xmlid='hr.menu_hr_root']",
run: "click",
},
{
content: "Open skill type menu",
trigger: "[data-menu-xmlid='hr.menu_human_resources_configuration']",
run: "click",
},
{
content: "Open skill type menu",
trigger: "[data-menu-xmlid='hr_skills.hr_skill_type_menu']",
run: "click",
},
{
content: "Create a skill type",
trigger: ".o_list_button_add",
run: "click",
},
{
content: "Write skill type name",
trigger: ".o_field_widget[name='name'] input",
run: "edit Cooking Skill",
},
{
trigger: "div[name=skill_ids] .o_field_x2many_list_row_add a",
run: "click",
},
{
trigger: "div[name=skill_ids] div[name=name] input",
run: "edit Macaroon",
},
{
trigger: "div[name=skill_level_ids] .o_field_x2many_list_row_add a",
run: "click",
},
{
trigger: "div[name=skill_level_ids] div[name=name] input",
run: "edit Beginner",
},
{
trigger: "div[name=skill_level_ids] div[name=default_level] input[type='checkbox']",
run: "click",
},
{
trigger: "div[name=skill_level_ids] .o_field_x2many_list_row_add a",
run: "click",
},
{
trigger: "tr:nth-child(2).o_selected_row div[name=name] input",
run: "edit Intermediate",
},
{
trigger: "tr:nth-child(2).o_selected_row [name=default_level] input[type='checkbox']",
run: "click",
},
{
trigger: "div[name=skill_level_ids] .o_field_x2many_list_row_add a",
run: "click",
},
{
trigger: "tr:nth-child(3).o_selected_row div[name=name] input",
run: "edit Expert",
},
{
trigger: "tr:nth-child(3).o_selected_row [name=default_level] input[type='checkbox']",
run: "click",
},
{
trigger: "tr:nth-child(1) [name=default_level] input[type='checkbox']",
run: "click",
},
{
trigger: "tr:nth-child(2) [name=default_level] input[type='checkbox']",
run: "click",
},
...stepUtils.saveForm(),
],
});