Skip to content

Commit

Permalink
Merge branch 'develop' into import-time-field
Browse files Browse the repository at this point in the history
  • Loading branch information
shariquerik committed Jul 29, 2022
2 parents 6987582 + 88ad1c9 commit 12cd367
Show file tree
Hide file tree
Showing 11 changed files with 74 additions and 59 deletions.
4 changes: 1 addition & 3 deletions .github/helper/install_dependencies.sh
Expand Up @@ -9,8 +9,6 @@ install_wkhtmltopdf() {
}
install_wkhtmltopdf &

curl -LsS -O https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
sudo bash mariadb_repo_setup --mariadb-server-version=10.6

sudo apt update
sudo apt install libcups2-dev redis-server libmariadb3 libmariadb-dev mariadb-client
sudo apt install libcups2-dev redis-server mariadb-client-10.3
1 change: 0 additions & 1 deletion frappe/boot.py
Expand Up @@ -391,7 +391,6 @@ def get_notification_settings():
return frappe.get_cached_doc("Notification Settings", frappe.session.user)


@frappe.whitelist()
def get_link_title_doctypes():
dts = frappe.get_all("DocType", {"show_title_field_in_link": 1})
custom_dts = frappe.get_all(
Expand Down
2 changes: 0 additions & 2 deletions frappe/database/query.py
Expand Up @@ -187,8 +187,6 @@ class Engine:

@cached_property
def OPERATOR_MAP(self):
from frappe.boot import get_additional_filters_from_hooks

# default operators
all_operators = OPERATOR_MAP.copy()

Expand Down
13 changes: 11 additions & 2 deletions frappe/desk/doctype/dashboard_chart/dashboard_chart.json
Expand Up @@ -42,7 +42,8 @@
"column_break_2",
"color",
"section_break_10",
"last_synced_on"
"last_synced_on",
"roles"
],
"fields": [
{
Expand Down Expand Up @@ -277,13 +278,20 @@
"fieldtype": "Link",
"label": "Parent Document Type",
"options": "DocType"
},
{
"fieldname": "roles",
"fieldtype": "Table",
"label": "Roles",
"options": "Has Role"
}
],
"links": [],
"modified": "2021-11-09 17:18:11.456145",
"modified": "2022-07-27 11:09:09.203236",
"modified_by": "Administrator",
"module": "Desk",
"name": "Dashboard Chart",
"naming_rule": "By fieldname",
"owner": "Administrator",
"permissions": [
{
Expand Down Expand Up @@ -323,5 +331,6 @@
],
"sort_field": "modified",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}
7 changes: 6 additions & 1 deletion frappe/desk/doctype/dashboard_chart/dashboard_chart.py
Expand Up @@ -11,7 +11,7 @@
from frappe.model.document import Document
from frappe.model.naming import append_number_if_name_exists
from frappe.modules.export_file import export_to_files
from frappe.utils import cint, get_datetime, getdate, now_datetime, nowdate
from frappe.utils import cint, get_datetime, getdate, has_common, now_datetime, nowdate
from frappe.utils.dashboard import cache_source
from frappe.utils.data import format_date
from frappe.utils.dateutils import (
Expand Down Expand Up @@ -87,6 +87,11 @@ def has_permission(doc, ptype, user):
if doc.document_type in allowed_doctypes:
return True

if doc.roles:
allowed = [d.role for d in doc.roles]
if has_common(roles, allowed):
return True

return False


Expand Down
2 changes: 1 addition & 1 deletion frappe/desk/form/document_follow.py
Expand Up @@ -163,7 +163,7 @@ def get_version(doctype, doc_name, frequency, user):
timeline = []
filters = get_filters("docname", doc_name, frequency, user)
version = frappe.get_all(
"Version", filters=filters, fields=["ref_doctype", "data", "modified", "modified", "modified_by"]
"Version", filters=filters, fields=["ref_doctype", "data", "modified", "modified_by"]
)
if version:
for v in version:
Expand Down
14 changes: 13 additions & 1 deletion frappe/public/js/frappe/form/controls/text_editor.js
Expand Up @@ -195,7 +195,9 @@ frappe.ui.form.ControlTextEditor = class ControlTextEditor extends frappe.ui.for
let values = await frappe.xcall(method, {
search_term
});
renderList(values, search_term);

let sorted_values = me.prioritize_involved_users_in_mention(values);
renderList(sorted_values, search_term);
}, 300),
renderItem(item) {
let value = item.value;
Expand All @@ -204,6 +206,16 @@ frappe.ui.form.ControlTextEditor = class ControlTextEditor extends frappe.ui.for
};
}

prioritize_involved_users_in_mention(values) {
const involved_users = this.frm?.get_involved_users() // input on form
|| cur_frm?.get_involved_users() // comment box / dialog on active form
|| [];

return values
.filter(val => involved_users.includes(val.id))
.concat(values.filter(val => !involved_users.includes(val.id)));
}

get_toolbar_options() {
return [
[{ header: [1, 2, 3, false] }],
Expand Down
23 changes: 23 additions & 0 deletions frappe/public/js/frappe/form/form.js
Expand Up @@ -1873,6 +1873,29 @@ frappe.ui.form.Form = class FrappeForm {
get_active_tab() {
return this.active_tab_map && this.active_tab_map[this.docname];
}

get_involved_users() {
let user_fields = this.meta.fields
.filter(d => d.fieldtype === 'Link' && d.options === 'User')
.map(d => d.fieldname);

user_fields = [...user_fields, "owner", "modified_by"];
let involved_users = user_fields.map(field => this.doc[field]);

const docinfo = this.get_docinfo();

involved_users = involved_users.concat(
docinfo.communications.map(d => d.sender && d.delivery_status === 'sent'),
docinfo.comments.map(d => d.owner),
docinfo.versions.map(d => d.owner),
docinfo.assignments.map(d => d.owner)
);

return involved_users
.uniqBy(u => u)
.filter(user => !['Administrator', frappe.session.user].includes(user))
.filter(Boolean);
}
};

frappe.validated = 0;
Expand Down
23 changes: 1 addition & 22 deletions frappe/public/js/frappe/form/sidebar/review.js
Expand Up @@ -38,30 +38,9 @@ frappe.ui.form.Review = class Review {
review_button.click(() => this.show_review_dialog());
}
}
get_involved_users() {
const user_fields = this.frm.meta.fields
.filter(d => d.fieldtype === 'Link' && d.options === 'User')
.map(d => d.fieldname);

user_fields.push('owner');
let involved_users = user_fields.map(field => this.frm.doc[field]);

const docinfo = this.frm.get_docinfo();

involved_users = involved_users.concat(
docinfo.communications.map(d => d.sender && d.delivery_status === 'sent'),
docinfo.comments.map(d => d.owner),
docinfo.versions.map(d => d.owner),
docinfo.assignments.map(d => d.owner)
);

return involved_users
.uniqBy(u => u)
.filter(user => !['Administrator', frappe.session.user].includes(user))
.filter(Boolean);
}
show_review_dialog() {
const user_options = this.get_involved_users();
const user_options = this.frm.get_involved_users();
const review_dialog = new frappe.ui.Dialog({
'title': __('Add Review'),
'fields': [{
Expand Down
27 changes: 13 additions & 14 deletions frappe/public/js/frappe/ui/tree.js
Expand Up @@ -134,7 +134,7 @@ frappe.ui.Tree = class {
}

reload_node(node) {
this.load_children(node);
return this.load_children(node);
}

toggle() {
Expand All @@ -150,21 +150,20 @@ frappe.ui.Tree = class {
}

load_children(node, deep=false) {
let lab = node.label, value = node.data.value, is_root = node.is_root;

if(!deep) {
frappe.run_serially([
const value = node.data.value,
is_root = node.is_root;

return deep
? frappe.run_serially([
() => this.get_all_nodes(value, is_root, node.label),
data_list => this.render_children_of_all_nodes(data_list),
() => this.set_selected_node(node),
])
: frappe.run_serially([
() => this.get_nodes(value, is_root),
(data_set) => this.render_node_children(node, data_set),
() => this.set_selected_node(node)
]);
} else {
frappe.run_serially([
() => this.get_all_nodes(value, is_root, lab),
(data_list) => this.render_children_of_all_nodes(data_list),
() => this.set_selected_node(node)
data_set => this.render_node_children(node, data_set),
() => this.set_selected_node(node),
]);
}
}

render_children_of_all_nodes(data_list) {
Expand Down
17 changes: 5 additions & 12 deletions socketio.js
Expand Up @@ -292,21 +292,14 @@ function send_users(args, action) {

const room = action == 'view' ? open_doc_room: get_typing_room(args.socket, args.doctype, args.docname);

const socketio_room = io.sockets.adapter.rooms[room] || {};
// for compatibility with both v1.3.7 and 1.4.4
const clients_dict = ('sockets' in socketio_room) ? socketio_room.sockets : socketio_room;

// socket ids connected to this room
const clients = Object.keys(clients_dict || {});
const clients = Array.from(io.sockets.adapter.rooms.get(room) || []);

let users = [];
for (let i in io.sockets.sockets) {
const s = io.sockets.sockets[i];
if (clients.indexOf(s.id) !== -1) {
// this socket is connected to the room
users.push(s.user);
io.sockets.sockets.forEach((sock) => {
if (clients.includes(sock.id)) {
users.push(sock.user);
}
}
})

const emit_event = action == 'view' ? 'doc_viewers' : 'doc_typers';

Expand Down

0 comments on commit 12cd367

Please sign in to comment.