You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
11 KiB
152 lines
11 KiB
<?xml version="1.0" encoding="UTF-8" ?>
|
|
<odoo>
|
|
<!-- Project Task Kanban View Template -->
|
|
<template id="project_task_kanban_view_template" name="Kanban View">
|
|
<t t-if="viewtype =='kanban'">
|
|
<section class="section-Kanban-view w-100 float-left kanban-task-container ">
|
|
<div class="container">
|
|
<div class="row">
|
|
<div class="col-lg-12">
|
|
<div class="container-tasks">
|
|
<t t-foreach="grouped_tasks"
|
|
t-as="tasks">
|
|
<div class="container-section-tasks">
|
|
<h5>
|
|
<div t-if="not groupby == 'none'"
|
|
class="table-light">
|
|
<div t-if="groupby == 'project'"
|
|
t-attf-colspan="{{grouped_tasks_colspan}}">
|
|
<div name="project_name"
|
|
class="d-flex w-100 align-items-center">
|
|
<span t-field="tasks[0].sudo().project_id.name"/>
|
|
</div>
|
|
</div>
|
|
<div t-if="groupby == 'milestone'"
|
|
t-attf-colspan="{{grouped_tasks_colspan}}">
|
|
<span t-if="tasks[0].sudo().milestone_id and tasks[0].sudo().allow_milestones"
|
|
class="text-truncate"
|
|
t-field="tasks[0].sudo().milestone_id.name"/>
|
|
<span t-else="">No
|
|
Milestone
|
|
</span>
|
|
</div>
|
|
<div t-if="groupby == 'stage'"
|
|
t-attf-colspan="{{grouped_tasks_colspan}}">
|
|
<span class="text-truncate"
|
|
t-field="tasks[0].sudo().stage_id.name"/>
|
|
</div>
|
|
<div t-if="groupby == 'priority'"
|
|
t-attf-colspan="{{grouped_tasks_colspan}}">
|
|
<span class="text-truncate"
|
|
t-field="tasks[0].sudo().priority"/>
|
|
</div>
|
|
<div t-if="groupby == 'status'"
|
|
t-attf-colspan="{{grouped_tasks_colspan}}">
|
|
<span class="text-truncate"
|
|
t-field="tasks[0].sudo().state"/>
|
|
</div>
|
|
<div t-if="groupby == 'customer'"
|
|
t-attf-colspan="{{grouped_tasks_colspan}}">
|
|
<span class="text-truncate"
|
|
t-field="tasks[0].sudo().partner_id.name"/>
|
|
<t t-if="not tasks[0].sudo().partner_id">
|
|
No Customer
|
|
</t>
|
|
</div>
|
|
</div>
|
|
</h5>
|
|
<div class="container-progress-bar">
|
|
<t t-set="done_count" t-value="len(tasks.filtered(lambda t: t.state == '1_done'))"/>
|
|
<t t-set="blocked_count"
|
|
t-value="len(tasks.filtered(lambda t: t.state == '1_canceled'))"/>
|
|
<t t-set="changes_requested"
|
|
t-value="len(tasks.filtered(lambda t: t.state == '02_changes_requested'))"/>
|
|
<div style="display:flex">
|
|
<div class="progres-bar"
|
|
style="display:flex;">
|
|
<t t-set="total_count"
|
|
t-value="len(tasks)"/>
|
|
<t t-set="green_ratio"
|
|
t-value="done_count / total_count"/>
|
|
<t t-log="green_ratio"/>
|
|
<t t-set="red_ratio"
|
|
t-value="blocked_count / total_count"/>
|
|
<t t-set="yellow_ratio"
|
|
t-value="changes_requested / total_count"/>
|
|
<div class="progres-bar-green"
|
|
t-att-style="'width:' + str(green_ratio * 100) + '%'"/>
|
|
<div class="progres-bar-red"
|
|
t-att-style="'width:' + str(red_ratio * 100) + '%'"/>
|
|
<div class="progres-bar-yellow"
|
|
t-att-style="'width:' + str(yellow_ratio * 100) + '%'"/>
|
|
</div>
|
|
<div class="progress-number text-end"
|
|
style="padding-left: 3rem;">
|
|
<t t-esc="len(tasks)"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<t t-foreach="tasks" t-as="task">
|
|
<div class="task-box w-100 float-left p-2">
|
|
<div class="w-75 float-left">
|
|
<h6>
|
|
<a t-attf-href="/my/#{task_url}/#{task.id}?{{ keep_query() }}">
|
|
<strong>
|
|
<span t-field="task.name"/>
|
|
</strong>
|
|
</a>
|
|
</h6>
|
|
<span>
|
|
<span t-field="task.project_id.name"/>
|
|
</span>
|
|
<div class="clock">
|
|
<img src="/project_website_kanban_view/static/src/images/clock.png"/>
|
|
<span class="date-task-box">
|
|
<span t-field="task.date_deadline"/>
|
|
</span>
|
|
</div>
|
|
</div>
|
|
<div class="w-25 profile-pic-container float-left pt-4 d-flex ">
|
|
<span>
|
|
<t t-call="project.portal_my_tasks_state_widget_template">
|
|
<t t-set="path"
|
|
t-value="'tasks'"/>
|
|
</t>
|
|
</span>
|
|
<div class="img-task text-right d-flex">
|
|
<t t-set="assignees"
|
|
t-value="task.sudo().user_ids"/>
|
|
<t t-if="assignees">
|
|
<img class="rounded-circle o_portal_contact_img me-2"
|
|
t-attf-src="#{image_data_uri(assignees[:1].avatar_1024)}"
|
|
alt="User"
|
|
style="width: 20px; height: 20px;"
|
|
t-att-title="assignees[:1].name"/>
|
|
<span class="rounded-circle o_portal_contact_img me-2 text-center fw-bold"
|
|
t-if="len(assignees) > 1"
|
|
t-out="' + %s' % (len(assignees) - 1)"
|
|
t-att-title="'\n'.join(assignees[1:].mapped('name'))"/>
|
|
</t>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</t>
|
|
</div>
|
|
</t>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
</t>
|
|
</template>
|
|
<!-- Adding the Project Task Kanban Template before the List Table Template -->
|
|
<template id="kanban_task_view_template_inherit"
|
|
inherit_id="portal.portal_table">
|
|
<xpath expr="//table[hasclass('o_portal_my_doc_table')]"
|
|
position="before">
|
|
<t t-call="project_website_kanban_view.project_task_kanban_view_template"/>
|
|
</xpath>
|
|
</template>
|
|
</odoo>
|
|
|
|
|