- get_events method - show dropdown in list view - save last calendar viewversion-14
@@ -24,3 +24,20 @@ def get_event_conditions(doctype, filters=None): | |||||
frappe.throw(_("Not Permitted"), frappe.PermissionError) | frappe.throw(_("Not Permitted"), frappe.PermissionError) | ||||
return get_filters_cond(doctype, filters, [], with_match_conditions = True) | return get_filters_cond(doctype, filters, [], with_match_conditions = True) | ||||
@frappe.whitelist() | |||||
def get_events(doctype, start, end, field_map, filters=None, fields=None): | |||||
field_map = frappe._dict(json.loads(field_map)) | |||||
if filters: | |||||
filters = json.loads(filters or '') | |||||
if not fields: | |||||
fields = [field_map.start, field_map.end, field_map.title, 'name'] | |||||
filters += [ | |||||
[doctype, field_map.start, '<=', end], | |||||
[doctype, field_map.end, '>=', start], | |||||
] | |||||
return frappe.get_list(doctype, fields=fields, filters=filters) |
@@ -0,0 +1,29 @@ | |||||
// Copyright (c) 2017, Frappe Technologies and contributors | |||||
// For license information, please see license.txt | |||||
frappe.ui.form.on('Calendar View', { | |||||
onload: function(frm) { | |||||
frm.trigger('reference_doctype'); | |||||
}, | |||||
reference_doctype: function(frm) { | |||||
const { reference_doctype } = frm.doc; | |||||
if (!reference_doctype) return; | |||||
frappe.model.with_doctype(reference_doctype, () => { | |||||
const meta = frappe.get_meta(reference_doctype); | |||||
const subject_options = meta.fields.filter( | |||||
df => !frappe.model.no_value_type.includes(df.fieldtype) | |||||
).map(df => df.fieldname); | |||||
const date_options = meta.fields.filter( | |||||
df => ['Date', 'Datetime'].includes(df.fieldtype) | |||||
).map(df => df.fieldname) | |||||
frm.set_df_property('subject_field', 'options', subject_options); | |||||
frm.set_df_property('start_date_field', 'options', date_options); | |||||
frm.set_df_property('end_date_field', 'options', date_options); | |||||
frm.refresh(); | |||||
}); | |||||
} | |||||
}); |
@@ -0,0 +1,184 @@ | |||||
{ | |||||
"allow_copy": 0, | |||||
"allow_guest_to_view": 0, | |||||
"allow_import": 0, | |||||
"allow_rename": 0, | |||||
"autoname": "Prompt", | |||||
"beta": 0, | |||||
"creation": "2017-10-23 13:02:10.295824", | |||||
"custom": 0, | |||||
"docstatus": 0, | |||||
"doctype": "DocType", | |||||
"document_type": "", | |||||
"editable_grid": 1, | |||||
"engine": "InnoDB", | |||||
"fields": [ | |||||
{ | |||||
"allow_bulk_edit": 0, | |||||
"allow_on_submit": 0, | |||||
"bold": 0, | |||||
"collapsible": 0, | |||||
"columns": 0, | |||||
"fieldname": "reference_doctype", | |||||
"fieldtype": "Link", | |||||
"hidden": 0, | |||||
"ignore_user_permissions": 0, | |||||
"ignore_xss_filter": 0, | |||||
"in_filter": 0, | |||||
"in_global_search": 0, | |||||
"in_list_view": 1, | |||||
"in_standard_filter": 0, | |||||
"label": "Reference DocType", | |||||
"length": 0, | |||||
"no_copy": 0, | |||||
"options": "DocType", | |||||
"permlevel": 0, | |||||
"precision": "", | |||||
"print_hide": 0, | |||||
"print_hide_if_no_value": 0, | |||||
"read_only": 0, | |||||
"remember_last_selected_value": 0, | |||||
"report_hide": 0, | |||||
"reqd": 1, | |||||
"search_index": 0, | |||||
"set_only_once": 0, | |||||
"unique": 0 | |||||
}, | |||||
{ | |||||
"allow_bulk_edit": 0, | |||||
"allow_on_submit": 0, | |||||
"bold": 0, | |||||
"collapsible": 0, | |||||
"columns": 0, | |||||
"fieldname": "subject_field", | |||||
"fieldtype": "Select", | |||||
"hidden": 0, | |||||
"ignore_user_permissions": 0, | |||||
"ignore_xss_filter": 0, | |||||
"in_filter": 0, | |||||
"in_global_search": 0, | |||||
"in_list_view": 1, | |||||
"in_standard_filter": 0, | |||||
"label": "Subject Field", | |||||
"length": 0, | |||||
"no_copy": 0, | |||||
"permlevel": 0, | |||||
"precision": "", | |||||
"print_hide": 0, | |||||
"print_hide_if_no_value": 0, | |||||
"read_only": 0, | |||||
"remember_last_selected_value": 0, | |||||
"report_hide": 0, | |||||
"reqd": 1, | |||||
"search_index": 0, | |||||
"set_only_once": 0, | |||||
"unique": 0 | |||||
}, | |||||
{ | |||||
"allow_bulk_edit": 0, | |||||
"allow_on_submit": 0, | |||||
"bold": 0, | |||||
"collapsible": 0, | |||||
"columns": 0, | |||||
"fieldname": "start_date_field", | |||||
"fieldtype": "Select", | |||||
"hidden": 0, | |||||
"ignore_user_permissions": 0, | |||||
"ignore_xss_filter": 0, | |||||
"in_filter": 0, | |||||
"in_global_search": 0, | |||||
"in_list_view": 0, | |||||
"in_standard_filter": 0, | |||||
"label": "Start Date Field", | |||||
"length": 0, | |||||
"no_copy": 0, | |||||
"permlevel": 0, | |||||
"precision": "", | |||||
"print_hide": 0, | |||||
"print_hide_if_no_value": 0, | |||||
"read_only": 0, | |||||
"remember_last_selected_value": 0, | |||||
"report_hide": 0, | |||||
"reqd": 0, | |||||
"search_index": 0, | |||||
"set_only_once": 0, | |||||
"unique": 0 | |||||
}, | |||||
{ | |||||
"allow_bulk_edit": 0, | |||||
"allow_on_submit": 0, | |||||
"bold": 0, | |||||
"collapsible": 0, | |||||
"columns": 0, | |||||
"fieldname": "end_date_field", | |||||
"fieldtype": "Select", | |||||
"hidden": 0, | |||||
"ignore_user_permissions": 0, | |||||
"ignore_xss_filter": 0, | |||||
"in_filter": 0, | |||||
"in_global_search": 0, | |||||
"in_list_view": 0, | |||||
"in_standard_filter": 0, | |||||
"label": "End Date Field", | |||||
"length": 0, | |||||
"no_copy": 0, | |||||
"permlevel": 0, | |||||
"precision": "", | |||||
"print_hide": 0, | |||||
"print_hide_if_no_value": 0, | |||||
"read_only": 0, | |||||
"remember_last_selected_value": 0, | |||||
"report_hide": 0, | |||||
"reqd": 0, | |||||
"search_index": 0, | |||||
"set_only_once": 0, | |||||
"unique": 0 | |||||
} | |||||
], | |||||
"has_web_view": 0, | |||||
"hide_heading": 0, | |||||
"hide_toolbar": 0, | |||||
"idx": 0, | |||||
"image_view": 0, | |||||
"in_create": 0, | |||||
"is_submittable": 0, | |||||
"issingle": 0, | |||||
"istable": 0, | |||||
"max_attachments": 0, | |||||
"modified": "2017-10-23 13:32:33.994308", | |||||
"modified_by": "Administrator", | |||||
"module": "Desk", | |||||
"name": "Calendar View", | |||||
"name_case": "", | |||||
"owner": "faris@erpnext.com", | |||||
"permissions": [ | |||||
{ | |||||
"amend": 0, | |||||
"apply_user_permissions": 0, | |||||
"cancel": 0, | |||||
"create": 1, | |||||
"delete": 1, | |||||
"email": 1, | |||||
"export": 1, | |||||
"if_owner": 0, | |||||
"import": 0, | |||||
"permlevel": 0, | |||||
"print": 1, | |||||
"read": 1, | |||||
"report": 1, | |||||
"role": "System Manager", | |||||
"set_user_permissions": 0, | |||||
"share": 1, | |||||
"submit": 0, | |||||
"write": 1 | |||||
} | |||||
], | |||||
"quick_entry": 0, | |||||
"read_only": 0, | |||||
"read_only_onload": 0, | |||||
"show_name_in_global_search": 0, | |||||
"sort_field": "modified", | |||||
"sort_order": "DESC", | |||||
"track_changes": 0, | |||||
"track_seen": 0 | |||||
} |
@@ -0,0 +1,10 @@ | |||||
# -*- coding: utf-8 -*- | |||||
# Copyright (c) 2017, Frappe Technologies and contributors | |||||
# For license information, please see license.txt | |||||
from __future__ import unicode_literals | |||||
import frappe | |||||
from frappe.model.document import Document | |||||
class CalendarView(Document): | |||||
pass |
@@ -27,6 +27,7 @@ frappe.views.ListSidebar = Class.extend({ | |||||
this.setup_assigned_to_me(); | this.setup_assigned_to_me(); | ||||
this.setup_views(); | this.setup_views(); | ||||
this.setup_kanban_boards(); | this.setup_kanban_boards(); | ||||
this.setup_calendar_view(); | |||||
this.setup_email_inbox(); | this.setup_email_inbox(); | ||||
let limits = frappe.boot.limits; | let limits = frappe.boot.limits; | ||||
@@ -271,6 +272,45 @@ frappe.views.ListSidebar = Class.extend({ | |||||
} | } | ||||
}); | }); | ||||
}, | }, | ||||
setup_calendar_view: function() { | |||||
const doctype = this.doctype; | |||||
frappe.db.get_list('Calendar View', { | |||||
filters: { | |||||
reference_doctype: doctype | |||||
} | |||||
}) | |||||
.then(result => { | |||||
if (!result) return; | |||||
const calendar_views = result; | |||||
const $link_calendar = this.sidebar.find('.list-link[data-view="Calendar"]'); | |||||
let default_link = ''; | |||||
if (frappe.views.calendar[this.doctype]) { | |||||
// has standard calendar view | |||||
default_link = `<li><a href="#List/${doctype}/Calendar">${ __("Default") }</a></li>` | |||||
} | |||||
const other_links = calendar_views.map( | |||||
calendar_view => `<li><a href="#List/${doctype}/Calendar/${calendar_view.name}"> | |||||
${ __(calendar_view.name) }</a> | |||||
</li>` | |||||
).join(''); | |||||
const dropdown_html = ` | |||||
<div class="btn-group"> | |||||
<a class="dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | |||||
${ __("Calendar") } <span class="caret"></span> | |||||
</a> | |||||
<ul class="dropdown-menu calendar-dropdown" style="max-height: 300px; overflow-y: auto;"> | |||||
${default_link} | |||||
${other_links} | |||||
</ul> | |||||
</div> | |||||
`; | |||||
$link_calendar.html(dropdown_html); | |||||
}); | |||||
}, | |||||
setup_email_inbox: function() { | setup_email_inbox: function() { | ||||
// get active email account for the user and add in dropdown | // get active email account for the user and add in dropdown | ||||
if(this.doctype != "Communication") | if(this.doctype != "Communication") | ||||
@@ -8,14 +8,10 @@ frappe.views.CalendarView = frappe.views.ListRenderer.extend({ | |||||
name: 'Calendar', | name: 'Calendar', | ||||
render_view: function() { | render_view: function() { | ||||
var me = this; | var me = this; | ||||
var options = { | |||||
doctype: this.doctype, | |||||
parent: this.wrapper, | |||||
page: this.list_view.page, | |||||
list_view: this.list_view | |||||
} | |||||
$.extend(options, frappe.views.calendar[this.doctype]); | |||||
this.calendar = new frappe.views.Calendar(options); | |||||
this.get_calendar_options() | |||||
.then(options => { | |||||
this.calendar = new frappe.views.Calendar(options); | |||||
}); | |||||
}, | }, | ||||
set_defaults: function() { | set_defaults: function() { | ||||
this._super(); | this._super(); | ||||
@@ -27,6 +23,47 @@ frappe.views.CalendarView = frappe.views.ListRenderer.extend({ | |||||
get_header_html: function() { | get_header_html: function() { | ||||
return null; | return null; | ||||
}, | }, | ||||
get_calendar_options: function() { | |||||
let calendar_view = this.user_settings.last_calendar_view; | |||||
if (!calendar_view) { | |||||
calendar_view = frappe.get_route()[3] || 'Default'; | |||||
} | |||||
// save in user_settings | |||||
frappe.model.user_settings.save(this.doctype, 'Calendar', { | |||||
last_calendar_view: calendar_view | |||||
}); | |||||
const options = { | |||||
doctype: this.doctype, | |||||
parent: this.wrapper, | |||||
page: this.list_view.page, | |||||
list_view: this.list_view | |||||
} | |||||
return new Promise(resolve => { | |||||
if (calendar_view === 'Default') { | |||||
Object.assign(options, frappe.views.calendar[this.doctype]) | |||||
resolve(options); | |||||
} else { | |||||
frappe.model.with_doc('Calendar View', calendar_view, (name, r) => { | |||||
const doc = frappe.get_doc('Calendar View', calendar_view); | |||||
Object.assign(options, { | |||||
field_map: { | |||||
id: "name", | |||||
start: doc.start_date_field, | |||||
end: doc.end_date_field, | |||||
title: doc.subject_field | |||||
} | |||||
}); | |||||
resolve(options); | |||||
}); | |||||
} | |||||
}) | |||||
}, | |||||
required_libs: [ | required_libs: [ | ||||
'assets/frappe/js/lib/fullcalendar/fullcalendar.min.css', | 'assets/frappe/js/lib/fullcalendar/fullcalendar.min.css', | ||||
'assets/frappe/js/lib/fullcalendar/fullcalendar.min.js', | 'assets/frappe/js/lib/fullcalendar/fullcalendar.min.js', | ||||
@@ -127,6 +164,7 @@ frappe.views.Calendar = Class.extend({ | |||||
args: me.get_args(start, end), | args: me.get_args(start, end), | ||||
callback: function(r) { | callback: function(r) { | ||||
var events = r.message; | var events = r.message; | ||||
console.log(events); | |||||
events = me.prepare_events(events); | events = me.prepare_events(events); | ||||
callback(events); | callback(events); | ||||
} | } | ||||
@@ -202,7 +240,8 @@ frappe.views.Calendar = Class.extend({ | |||||
doctype: this.doctype, | doctype: this.doctype, | ||||
start: this.get_system_datetime(start), | start: this.get_system_datetime(start), | ||||
end: this.get_system_datetime(end), | end: this.get_system_datetime(end), | ||||
filters: this.list_view.filter_list.get_filters() | |||||
filters: this.list_view.filter_list.get_filters(), | |||||
field_map: this.field_map | |||||
}; | }; | ||||
return args; | return args; | ||||
}, | }, | ||||