mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-01 04:28:27 +00:00
Merge pull request #46774 from cogk/feat-past-events-and-todos-in-crm-activities
feat: Show past events and todos in crm_activities
This commit is contained in:
@@ -147,14 +147,37 @@ def link_open_events(ref_doctype, ref_docname, doc):
|
||||
def get_open_activities(ref_doctype, ref_docname):
|
||||
tasks = get_open_todos(ref_doctype, ref_docname)
|
||||
events = get_open_events(ref_doctype, ref_docname)
|
||||
tasks_history = get_closed_todos(ref_doctype, ref_docname)
|
||||
events_history = get_closed_events(ref_doctype, ref_docname)
|
||||
|
||||
return {"tasks": tasks, "events": events}
|
||||
return {
|
||||
"tasks": tasks,
|
||||
"events": events,
|
||||
"tasks_history": tasks_history,
|
||||
"events_history": events_history,
|
||||
}
|
||||
|
||||
|
||||
def get_closed_todos(ref_doctype, ref_docname):
|
||||
return get_filtered_todos(ref_doctype, ref_docname, status=("!=", "Open"))
|
||||
|
||||
|
||||
def get_open_todos(ref_doctype, ref_docname):
|
||||
return get_filtered_todos(ref_doctype, ref_docname, status="Open")
|
||||
|
||||
|
||||
def get_open_events(ref_doctype, ref_docname):
|
||||
return get_filtered_events(ref_doctype, ref_docname, open=True)
|
||||
|
||||
|
||||
def get_closed_events(ref_doctype, ref_docname):
|
||||
return get_filtered_events(ref_doctype, ref_docname, open=False)
|
||||
|
||||
|
||||
def get_filtered_todos(ref_doctype, ref_docname, status: str | tuple[str, str]):
|
||||
return frappe.get_all(
|
||||
"ToDo",
|
||||
filters={"reference_type": ref_doctype, "reference_name": ref_docname, "status": "Open"},
|
||||
filters={"reference_type": ref_doctype, "reference_name": ref_docname, "status": status},
|
||||
fields=[
|
||||
"name",
|
||||
"description",
|
||||
@@ -164,10 +187,15 @@ def get_open_todos(ref_doctype, ref_docname):
|
||||
)
|
||||
|
||||
|
||||
def get_open_events(ref_doctype, ref_docname):
|
||||
def get_filtered_events(ref_doctype, ref_docname, open: bool):
|
||||
event = frappe.qb.DocType("Event")
|
||||
event_link = frappe.qb.DocType("Event Participants")
|
||||
|
||||
if open:
|
||||
event_status_filter = event.status == "Open"
|
||||
else:
|
||||
event_status_filter = event.status != "Open"
|
||||
|
||||
query = (
|
||||
frappe.qb.from_(event)
|
||||
.join(event_link)
|
||||
@@ -183,7 +211,7 @@ def get_open_events(ref_doctype, ref_docname):
|
||||
.where(
|
||||
(event_link.reference_doctype == ref_doctype)
|
||||
& (event_link.reference_docname == ref_docname)
|
||||
& (event.status == "Open")
|
||||
& (event_status_filter)
|
||||
)
|
||||
)
|
||||
data = query.run(as_dict=True)
|
||||
|
||||
@@ -57,6 +57,47 @@
|
||||
{{ __("No open task") }}
|
||||
</div>
|
||||
{% } %}
|
||||
|
||||
{% if (typeof tasks_history == "object" && tasks_history?.length) { %}
|
||||
<div class="mt-4" style="opacity: 0.8;">
|
||||
<div class="open-section-head">
|
||||
<span>{{ __("Completed Tasks") }}</span>
|
||||
</div>
|
||||
{% for (const t of tasks_history) { %}
|
||||
<div class="single-activity">
|
||||
{% if(t.date || t.allocated_to) { %}
|
||||
<div class="text-muted small flex align-items-center">
|
||||
<div>
|
||||
{% if(t.allocated_to) { %}
|
||||
{%= frappe.avatar(t.allocated_to) %}
|
||||
{% } %}
|
||||
</div>
|
||||
<div class="ml-2">
|
||||
<div class="indicator-pill no-indicator-dot whitespace-nowrap red">
|
||||
{{ __("Done") }}
|
||||
</div>
|
||||
</div>
|
||||
{% if (t.date) { %}
|
||||
<div class="ml-auto">
|
||||
{%= frappe.datetime.global_date_format(t.date) %}
|
||||
</div>
|
||||
{% } %}
|
||||
<div class="checkbox {% if(!t.date) { %}ml-auto{% } else { %}ml-2{% } %}">
|
||||
<input type="checkbox" class="completion-checkbox" checked disabled>
|
||||
</div>
|
||||
</div>
|
||||
{% } %}
|
||||
<div class="pl-2 mb-2 mt-2">
|
||||
<div class="label-area font-md">
|
||||
<a href="/app/todo/{{ t.name }}" title="{{ __('Open Task') }}">
|
||||
{%= t.description %}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% } %}
|
||||
</div>
|
||||
{% } %}
|
||||
</div>
|
||||
<div class="open-events pl-1">
|
||||
<div class="open-section-head">
|
||||
@@ -104,6 +145,49 @@
|
||||
{{ __("No open event") }}
|
||||
</div>
|
||||
{% } %}
|
||||
|
||||
{% if (typeof events_history == "object" && events_history?.length) { %}
|
||||
<div class="mt-4" style="opacity: 0.8;">
|
||||
<div class="open-section-head">
|
||||
<span>{{ __("Past Events") }}</span>
|
||||
</div>
|
||||
{% let icon_set = {"Sent/Received Email": "mail", "Call": "call", "Meeting": "share-people"}; %}
|
||||
{% for(const event of events_history) { %}
|
||||
<div class="single-activity">
|
||||
<div class="flex justify-between mb-2">
|
||||
<div class="row label-area font-md ml-1 title">
|
||||
<span class="mr-2">
|
||||
<svg class="icon icon-sm">
|
||||
<use href="#icon-{{ icon_set[event.event_category] || 'calendar' }}"></use>
|
||||
</svg>
|
||||
</span>
|
||||
<a href="/app/event/{{ event.name }}" title="{{ __('Open Event') }}">
|
||||
{%= event.subject %}
|
||||
</a>
|
||||
</div>
|
||||
<div class="checkbox">
|
||||
<input type="checkbox" class="completion-checkbox" checked disabled>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-muted ml-1">
|
||||
{%= frappe.datetime.global_date_format(event.starts_on) %}
|
||||
|
||||
{% if (event.ends_on) { %}
|
||||
{% if (frappe.datetime.obj_to_user(event.starts_on) != frappe.datetime.obj_to_user(event.ends_on)) %}
|
||||
-
|
||||
{%= frappe.datetime.global_date_format(frappe.datetime.obj_to_user(event.ends_on)) %}
|
||||
{%= frappe.datetime.get_time(event.ends_on) %}
|
||||
{% } else if (event.ends_on) { %}
|
||||
-
|
||||
{%= frappe.datetime.get_time(event.ends_on) %}
|
||||
{% } %}
|
||||
{% } %}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{% } %}
|
||||
</div>
|
||||
{% } %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -35,6 +35,8 @@ erpnext.utils.CRMActivities = class CRMActivities {
|
||||
var activities_html = frappe.render_template("crm_activities", {
|
||||
tasks: r.message.tasks,
|
||||
events: r.message.events,
|
||||
tasks_history: r.message.tasks_history,
|
||||
events_history: r.message.events_history,
|
||||
});
|
||||
|
||||
$(activities_html).appendTo(me.open_activities_wrapper);
|
||||
|
||||
Reference in New Issue
Block a user