When the alias had been set, if the user wanted to disable it he had to erase the email first. Otherwise unchecking the check box didn't work. Task-2299286 closes odoo/odoo#58634 X-original-commit: 45cd13e14fef0bab6921a1fff79335df9015cbf0 Related: odoo/enterprise#13613 Signed-off-by: Yannick Tivisse (yti) <yti@odoo.com>
274 lines
16 KiB
XML
274 lines
16 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<odoo>
|
|
<template id="portal_layout" name="Portal layout: project menu entry" inherit_id="portal.portal_breadcrumbs" priority="40">
|
|
<xpath expr="//ol[hasclass('o_portal_submenu')]" position="inside">
|
|
<li t-if="page_name == 'project' or project" class="col-lg-2" t-attf-class="breadcrumb-item #{'active ' if not project else ''}">
|
|
<a t-if="project" t-attf-href="/my/projects?{{ keep_query() }}">Projects</a>
|
|
<t t-else="">Projects</t>
|
|
</li>
|
|
<li t-if="project" class="breadcrumb-item active text-truncate col-8 col-lg-10">
|
|
<t t-esc="project.name"/>
|
|
</li>
|
|
<li t-if="page_name == 'task' or task" t-attf-class="breadcrumb-item #{'active ' if not task else ''}">
|
|
<a t-if="task" t-attf-href="/my/tasks?{{ keep_query() }}">Tasks</a>
|
|
<t t-else="">Tasks</t>
|
|
</li>
|
|
<li t-if="task" class="breadcrumb-item active col-8 col-lg-10 text-truncate">
|
|
<span t-field="task.name"/>
|
|
</li>
|
|
</xpath>
|
|
</template>
|
|
|
|
<template id="portal_my_home" name="Show Projects / Tasks" customize_show="True" inherit_id="portal.portal_my_home" priority="40">
|
|
<xpath expr="//div[hasclass('o_portal_docs')]" position="inside">
|
|
<t t-call="portal.portal_docs_entry">
|
|
<t t-set="title">Projects</t>
|
|
<t t-set="url" t-value="'/my/projects'"/>
|
|
<t t-set="placeholder_count" t-value="'project_count'"/>
|
|
</t>
|
|
<t t-call="portal.portal_docs_entry">
|
|
<t t-set="title">Tasks</t>
|
|
<t t-set="url" t-value="'/my/tasks'"/>
|
|
<t t-set="placeholder_count" t-value="'task_count'"/>
|
|
</t>
|
|
</xpath>
|
|
</template>
|
|
|
|
<template id="portal_my_projects" name="My Projects">
|
|
<t t-call="portal.portal_layout">
|
|
<t t-set="breadcrumbs_searchbar" t-value="True"/>
|
|
|
|
<t t-call="portal.portal_searchbar">
|
|
<t t-set="title">Projects</t>
|
|
</t>
|
|
<t t-if="not projects">
|
|
<div class="alert alert-warning mt8" role="alert">
|
|
There are no projects.
|
|
</div>
|
|
</t>
|
|
<t t-if="projects" t-call="portal.portal_table">
|
|
<tbody>
|
|
<tr t-foreach="projects" t-as="project">
|
|
<td>
|
|
<a t-attf-href="/my/project/#{project.id}?{{ keep_query() }}"><span t-field="project.name"/></a>
|
|
</td>
|
|
<td class="text-right">
|
|
<a t-attf-href="/my/tasks?{{keep_query(filterby=project.id)}}">
|
|
<t t-esc="project.task_count" />
|
|
<t t-esc="project.label_tasks" />
|
|
</a>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</t>
|
|
</t>
|
|
</template>
|
|
|
|
<template id="portal_my_project" name="My Project">
|
|
<t t-call="portal.portal_layout">
|
|
<t t-set="o_portal_fullwidth_alert" groups="project.group_project_user">
|
|
<t t-call="portal.portal_back_in_edit_mode">
|
|
<t t-set="backend_url" t-value="'/web#model=project.project&id=%s&view_type=form' % (project.id)"/>
|
|
</t>
|
|
</t>
|
|
|
|
<t t-call="portal.portal_record_layout">
|
|
<t t-set="card_header">
|
|
<h5 class="mb-0">
|
|
<span t-field="project.name" class="text-truncate"/>
|
|
<span class="float-right">
|
|
<a role="button" t-attf-href="/my/tasks?filterby=#{project.id}" class="btn btn-sm btn-secondary">
|
|
<span class="fa fa-tasks" role="img" aria-label="Tasks" title="Tasks"/>
|
|
<span t-esc="project.task_count" />
|
|
<span t-field="project.label_tasks" />
|
|
</a>
|
|
</span>
|
|
</h5>
|
|
</t>
|
|
<t t-set="card_body">
|
|
<div class="row">
|
|
<div t-if="project.partner_id" class="col-12 col-md-6 mb-2 mb-md-0">
|
|
<h6>Customer</h6>
|
|
<div class="row">
|
|
<div class="col flex-grow-0 pr-3">
|
|
<img t-if="project.partner_id.image_1024" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(project.partner_id.image_1024)" alt="Contact"/>
|
|
<img t-else="" class="rounded-circle mt-1 o_portal_contact_img" src="/web/static/src/img/user_menu_avatar.png" alt="Contact"/>
|
|
</div>
|
|
<div class="col pl-sm-0">
|
|
<address t-field="project.partner_id" t-options='{"widget": "contact", "fields": ["name", "email", "phone"]}'/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div t-if="project.user_id" class="col-12 col-md-6">
|
|
<h6>Project Manager</h6>
|
|
<div class="row">
|
|
<div class="col flex-grow-0 pr-3">
|
|
<img t-if="project.user_id.image_1024" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(project.user_id.image_1024)" alt="Contact"/>
|
|
<img t-else="" class="rounded-circle mt-1 o_portal_contact_img" src="/web/static/src/img/user_menu_avatar.png" alt="Contact"/>
|
|
</div>
|
|
<div class="col pl-sm-0">
|
|
<address t-field="project.user_id" t-options='{"widget": "contact", "fields": ["name", "email", "phone"]}'/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</t>
|
|
</t>
|
|
</t>
|
|
</template>
|
|
|
|
<template id="portal_my_tasks" name="My Tasks">
|
|
<t t-call="portal.portal_layout">
|
|
<t t-set="breadcrumbs_searchbar" t-value="True"/>
|
|
|
|
<t t-call="portal.portal_searchbar">
|
|
<t t-set="title">Tasks</t>
|
|
</t>
|
|
<t t-if="not grouped_tasks">
|
|
<div class="alert alert-warning mt8" role="alert">
|
|
There are no tasks.
|
|
</div>
|
|
</t>
|
|
<t t-if="grouped_tasks">
|
|
<t t-call="portal.portal_table">
|
|
<t t-foreach="grouped_tasks" t-as="tasks">
|
|
<thead>
|
|
<tr t-attf-class="{{'thead-light' if not groupby == 'none' else ''}}">
|
|
<th class="text-left">Ref</th>
|
|
<th t-if="groupby == 'none'">Name</th>
|
|
<th t-if="groupby == 'project'">
|
|
<em class="font-weight-normal text-muted"><span t-field="tasks[0].sudo().project_id.label_tasks"/> for project:</em>
|
|
<span t-field="tasks[0].sudo().project_id.name"/></th>
|
|
<th t-if="groupby == 'stage'">
|
|
<em class="font-weight-normal text-muted"><span t-field="tasks[0].sudo().project_id.label_tasks"/> in stage:</em>
|
|
<span class="text-truncate" t-field="tasks[0].sudo().stage_id.name"/></th>
|
|
<th t-if="groupby != 'project'" class="text-center">Project</th>
|
|
<th t-if="groupby != 'stage'" class="text-center">Stage</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<t t-foreach="tasks" t-as="task">
|
|
<tr>
|
|
<td class="text-left">
|
|
#<span t-esc="task.id"/>
|
|
</td>
|
|
<td>
|
|
<a t-attf-href="/my/task/#{task.id}?{{ keep_query() }}"><span t-field="task.name"/></a>
|
|
</td>
|
|
<td t-if="groupby != 'project'" class="text-center">
|
|
<span class="badge badge-pill badge-info" title="Current project of the task" t-esc="task.project_id.name" />
|
|
</td>
|
|
<td t-if="groupby != 'stage'" class="text-center">
|
|
<span class="badge badge-pill badge-info" title="Current stage of the task" t-esc="task.stage_id.name" />
|
|
</td>
|
|
</tr>
|
|
</t>
|
|
</tbody>
|
|
</t>
|
|
</t>
|
|
</t>
|
|
</t>
|
|
</template>
|
|
|
|
<template id="portal_my_task" name="My Task">
|
|
<t t-call="portal.portal_layout">
|
|
<t t-set="o_portal_fullwidth_alert" groups="project.group_project_user">
|
|
<t t-call="portal.portal_back_in_edit_mode">
|
|
<t t-set="backend_url" t-value="'/web#model=project.task&id=%s&view_type=form' % (task.id)"/>
|
|
</t>
|
|
</t>
|
|
|
|
<t t-call="portal.portal_record_layout">
|
|
<t t-set="card_header">
|
|
<div class="row no-gutters">
|
|
<div class="col-12">
|
|
<h5 class="d-flex mb-1 mb-md-0 row">
|
|
<span t-field="task.name" class="col-9 text-truncate"/>
|
|
<small class="text-muted d-none d-md-inline"> (#<span t-field="task.id"/>)</small>
|
|
<div class="col-3 col-md-2 text-right">
|
|
<small class="text-right">Status:</small>
|
|
<span t-field="task.stage_id.name" class=" badge badge-pill badge-info" title="Current stage of this task"/>
|
|
</div>
|
|
</h5>
|
|
</div>
|
|
</div>
|
|
</t>
|
|
<t t-set="card_body">
|
|
<div class="mb-1" t-if="user in task.sudo().project_id.allowed_user_ids">
|
|
<strong>Project:</strong> <a t-attf-href="/my/project/#{task.project_id.id}" t-field="task.project_id.name"/>
|
|
</div>
|
|
|
|
<div class="row mb-4">
|
|
<div class="col-12 col-md-6 mb-1">
|
|
<strong>Date:</strong> <span t-field="task.create_date" t-options='{"widget": "date"}'/>
|
|
</div>
|
|
<div class="col-12 col-md-6" t-if="task.date_deadline">
|
|
<strong>Deadline:</strong> <span t-field="task.date_deadline" t-options='{"widget": "date"}'/>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row mb-4" t-if="task.user_id or task.partner_id">
|
|
<div class="col-12 col-md-6 pb-2" t-if="task.user_id">
|
|
<strong>Assigned to</strong>
|
|
<div class="row">
|
|
<div class="col flex-grow-0 pr-3">
|
|
<img t-if="task.user_id.image_1024" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(task.user_id.image_1024)" alt="Contact"/>
|
|
<img t-else="" class="rounded-circle mt-1 o_portal_contact_img" src="/web/static/src/img/user_menu_avatar.png" alt="Contact"/>
|
|
</div>
|
|
<div class="col pl-md-0">
|
|
<div t-field="task.user_id" t-options='{"widget": "contact", "fields": ["name", "email", "phone"]}'/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="coll-12 col-md-6 pb-2" t-if="task.partner_id">
|
|
<strong>Reported by</strong>
|
|
<div class="row">
|
|
<div class="col flex-grow-0 pr-3">
|
|
<img t-if="task.partner_id.image_1024" class="rounded-circle mt-1 o_portal_contact_img" t-att-src="image_data_uri(task.partner_id.image_1024)" alt="Contact"/>
|
|
<img t-else="" class="rounded-circle mt-1 o_portal_contact_img" src="/web/static/src/img/user_menu_avatar.png" alt="Contact"/>
|
|
</div>
|
|
<div class="col pl-md-0">
|
|
<div t-field="task.partner_id" t-options='{"widget": "contact", "fields": ["name", "email", "phone"]}'/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="row" t-if="task.description or task.attachment_ids">
|
|
<div t-if="task.description" t-attf-class="col-12 col-lg-7 mb-4 mb-md-0 {{'col-lg-7' if task.attachment_ids else 'col-lg-12'}}">
|
|
<hr class="mb-1"/>
|
|
<div class="d-flex my-2">
|
|
<strong>Description</strong>
|
|
</div>
|
|
<div class="py-1 px-2 bg-100 small" t-field="task.description"/>
|
|
</div>
|
|
<div t-if="task.attachment_ids" t-attf-class="col-12 col-lg-5 o_project_portal_attachments {{'col-lg-5' if task.description else 'col-lg-12'}}">
|
|
<hr class="mb-1 d-none d-lg-block"/>
|
|
<strong class="d-block mb-2">Attachments</strong>
|
|
<div class="row">
|
|
<div t-attf-class="col {{'col-lg-6' if not task.description else 'col-lg-12'}}">
|
|
<ul class="list-group">
|
|
<a class="list-group-item list-group-item-action d-flex align-items-center oe_attachments py-1 px-2" t-foreach='task.attachment_ids' t-as='attachment' t-attf-href="/web/content/#{attachment.id}?download=true&access_token=#{attachment.access_token}" target="_blank" data-no-post-process="">
|
|
<div class='oe_attachment_embedded o_image o_image_small mr-2 mr-lg-3' t-att-title="attachment.name" t-att-data-mimetype="attachment.mimetype" t-attf-data-src="/web/image/#{attachment.id}/50x40?access_token=#{attachment.access_token}"/>
|
|
<div class='oe_attachment_name text-truncate'><t t-esc='attachment.name'/></div>
|
|
</a>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</t>
|
|
</t>
|
|
|
|
<div class="mt32">
|
|
<h4><strong>Message and communication history</strong></h4>
|
|
<t t-call="portal.message_thread">
|
|
<t t-set="object" t-value="task"/>
|
|
<t t-set="token" t-value="task.access_token"/>
|
|
<t t-set="pid" t-value="pid"/>
|
|
<t t-set="hash" t-value="hash"/>
|
|
</t>
|
|
</div>
|
|
</t>
|
|
</template>
|
|
</odoo>
|