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:
ruthra kumar
2025-04-28 09:36:57 +05:30
committed by GitHub
3 changed files with 118 additions and 4 deletions

View File

@@ -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)

View File

@@ -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>

View File

@@ -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);