Browse Source

Add Calendar View Doctype

- get_events method
- show dropdown in list view
- save last calendar view
version-14
Faris Ansari 7 years ago
parent
commit
29e72a92f1
7 changed files with 328 additions and 9 deletions
  1. +17
    -0
      frappe/desk/calendar.py
  2. +0
    -0
      frappe/desk/doctype/calendar_view/__init__.py
  3. +29
    -0
      frappe/desk/doctype/calendar_view/calendar_view.js
  4. +184
    -0
      frappe/desk/doctype/calendar_view/calendar_view.json
  5. +10
    -0
      frappe/desk/doctype/calendar_view/calendar_view.py
  6. +40
    -0
      frappe/public/js/frappe/list/list_sidebar.js
  7. +48
    -9
      frappe/public/js/frappe/views/calendar/calendar.js

+ 17
- 0
frappe/desk/calendar.py View File

@@ -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
frappe/desk/doctype/calendar_view/__init__.py View File


+ 29
- 0
frappe/desk/doctype/calendar_view/calendar_view.js View File

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

+ 184
- 0
frappe/desk/doctype/calendar_view/calendar_view.json View File

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

+ 10
- 0
frappe/desk/doctype/calendar_view/calendar_view.py View File

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

+ 40
- 0
frappe/public/js/frappe/list/list_sidebar.js View File

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


+ 48
- 9
frappe/public/js/frappe/views/calendar/calendar.js View File

@@ -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;
}, },


Loading…
Cancel
Save