seitime-frappe/frappe/desk/page/activity/activity.js
Faris Ansari 7595fb75ba
New ListView 💥 + DataTable (#4577)
* first cut

* Code refactoring, styling

* Added Sorting

* Revert query_report to use slickgrid

* cleanup

* Edit cell working

* Add regrid, remove datatable

* Add clusterize

* Update lib, fix get_checked_items

* New ReportView

* wip

* Enable editing, fix styles

* update lib

* wip

* fix refresh rows and editable cells

* Refresh list_view every 3s, decouple refreshing logic

* Report editing fixes

* Cleanup loading fields, add column then refresh list

* [wip] New List View

* [working] Render results

* ListView is now BaseList, add new ListView and GanttView

* Create new page for each ListView

* GanttView working

* CalendarView working

* KanbanView working

* Cache list_view based on page_name

* Gantt view buttons on mobile

* Add ReportView

* Refresh datatable on render

* Setup like

* [start][filters] clean up FilterList

* [filters] refactor FilterList

* [filters] minor fix

* [filters] fix remove filter

* filter utils

* more utils, remove apply

* rewrite as class, remove 'me' references

* [filter] implement on_change to decouple parent functions

* Integrate new filters with new BaseList

* Setup freeze area for ListView

* Set breadcrumbs on setup_page

* Trigger list update from events

* Setup footnote area

* Fix Kanban Board filters

* Add filters to standard filters, then filter_list

* Remove old files

* Fix ImageView

* Some more fixes for BaseList.init

* Fix order_by on load

* Report View: remember columns

* Fix for hidden filters

* Fix for delete items

* InboxView

* Shift select checkboxes

* Fix ESLint errors

* More refactoring

- Move ListMenu to Listview
- New FileView
- Ability to add custom breadcrumbs

* FileManager working

* Tags, set filters from route options

* Custom Reports Working

* List Sidebar reports

* Report Name as title

* Fix ESLint errors

* Fix UI tests

* Fix Kanban test

* Format ID column

* [fix] Kanban cards title

* Checkbox fix

* Fix Activity Page

* Update rows in Report in place

* Child Table columns in Report View
2017-12-27 11:24:25 +05:30

210 lines
5.5 KiB
JavaScript

// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
// License: See license.txt
frappe.provide("frappe.activity");
frappe.pages['activity'].on_page_load = function(wrapper) {
var me = this;
frappe.ui.make_app_page({
parent: wrapper,
single_column: true
});
me.page = wrapper.page;
me.page.set_title(__("Activity"));
frappe.model.with_doctype("Communication", function() {
me.page.list = new frappe.views.Activity({
doctype: 'Communication',
parent: wrapper
});
});
frappe.activity.render_heatmap(me.page);
me.page.main.on("click", ".activity-message", function() {
var link_doctype = $(this).attr("data-link-doctype"),
link_name = $(this).attr("data-link-name"),
doctype = $(this).attr("data-doctype"),
docname = $(this).attr("data-docname");
if (doctype && docname) {
if (link_doctype && link_name) {
frappe.route_options = {
scroll_to: { "doctype": doctype, "name": docname }
}
}
frappe.set_route(["Form", link_doctype || doctype, link_name || docname]);
}
});
// Build Report Button
if(frappe.boot.user.can_get_report.indexOf("Feed")!=-1) {
this.page.add_menu_item(__('Build Report'), function() {
frappe.set_route('Report', "Feed");
}, 'fa fa-th')
}
this.page.add_menu_item(__('Activity Log'), function() {
frappe.route_options = {
"user": frappe.session.user
}
frappe.set_route('Report', "Activity Log");
}, 'fa fa-th')
this.page.add_menu_item(__('Show Likes'), function() {
frappe.route_options = {
show_likes: true
};
me.page.list.refresh();
}, 'octicon octicon-heart');
};
frappe.pages['activity'].on_page_show = function() {
frappe.breadcrumbs.add("Desk");
}
frappe.activity.last_feed_date = false;
frappe.activity.Feed = Class.extend({
init: function(row, data) {
this.scrub_data(data);
this.add_date_separator(row, data);
if(!data.add_class)
data.add_class = "label-default";
data.link = "";
if (data.link_doctype && data.link_name) {
data.link = frappe.format(data.link_name, {fieldtype: "Link", options: data.link_doctype},
{label: __(data.link_doctype) + " " + __(data.link_name)});
} else if (data.feed_type==="Comment" && data.comment_type==="Comment") {
// hack for backward compatiblity
data.link_doctype = data.reference_doctype;
data.link_name = data.reference_name;
data.reference_doctype = "Communication";
data.reference_name = data.name;
data.link = frappe.format(data.link_name, {fieldtype: "Link", options: data.link_doctype},
{label: __(data.link_doctype) + " " + __(data.link_name)});
} else if (data.reference_doctype && data.reference_name) {
data.link = frappe.format(data.reference_name, {fieldtype: "Link", options: data.reference_doctype},
{label: __(data.reference_doctype) + " " + __(data.reference_name)});
}
$(row)
.append(frappe.render_template("activity_row", data))
.find("a").addClass("grey");
},
scrub_data: function(data) {
data.by = frappe.user.full_name(data.owner);
data.avatar = frappe.avatar(data.owner);
data.icon = "fa fa-flag";
// color for comment
data.add_class = {
"Comment": "label-danger",
"Assignment": "label-warning",
"Login": "label-default"
}[data.comment_type || data.communication_medium] || "label-info"
data.when = comment_when(data.creation);
data.feed_type = data.comment_type || data.communication_medium;
},
add_date_separator: function(row, data) {
var date = frappe.datetime.str_to_obj(data.creation);
var last = frappe.activity.last_feed_date;
if((last && frappe.datetime.obj_to_str(last) != frappe.datetime.obj_to_str(date)) || (!last)) {
var diff = frappe.datetime.get_day_diff(frappe.datetime.get_today(), frappe.datetime.obj_to_str(date));
var pdate;
if(diff < 1) {
pdate = 'Today';
} else if(diff < 2) {
pdate = 'Yesterday';
} else {
pdate = frappe.datetime.global_date_format(date);
}
data.date_sep = pdate;
data.date_class = pdate=='Today' ? "date-indicator blue" : "date-indicator";
} else {
data.date_sep = null;
data.date_class = "";
}
frappe.activity.last_feed_date = date;
}
});
frappe.activity.render_heatmap = function(page) {
var me = this;
$('<div class="heatmap-container" style="text-align:center">\
<div class="heatmap" style="display:inline-block;"></div></div>\
<hr style="margin-bottom: 0px;">').prependTo(page.main);
frappe.call({
method: "frappe.desk.page.activity.activity.get_heatmap_data",
callback: function(r) {
if(r.message) {
var heatmap = new Chart({
parent: ".heatmap",
type: 'heatmap',
height: 100,
start: new Date(moment().subtract(1, 'year').toDate()),
count_label: "actions",
discrete_domains: 0,
data: {}
});
heatmap.update(r.message);
}
}
})
}
frappe.views.Activity = class Activity extends frappe.views.BaseList {
setup_defaults() {
super.setup_defaults();
this.doctype = 'Communication';
this.method = 'frappe.desk.page.activity.activity.get_feed';
}
setup_filter_area() {
//
}
setup_sort_selector() {
}
get_args() {
return {
start: this.start,
page_length: this.page_length,
show_likes: (frappe.route_options || {}).show_likes || 0
};
}
update_data(r) {
let data = r.message || [];
if (this.start === 0) {
this.data = data;
} else {
this.data = this.data.concat(data);
}
}
render() {
this.data.map(value => {
const row = $('<div class="list-row">').data("data", value).appendTo(this.$result).get(0);
new frappe.activity.Feed(row, value);
});
}
};