@@ -1,314 +1,322 @@ | |||||
{ | { | ||||
"allow_copy": 0, | |||||
"allow_guest_to_view": 0, | |||||
"allow_import": 0, | |||||
"allow_rename": 0, | |||||
"autoname": "CR.#####", | |||||
"beta": 1, | |||||
"creation": "2017-11-08 15:27:21.156667", | |||||
"custom": 0, | |||||
"docstatus": 0, | |||||
"doctype": "DocType", | |||||
"document_type": "", | |||||
"editable_grid": 1, | |||||
"engine": "InnoDB", | |||||
"allow_copy": 0, | |||||
"allow_guest_to_view": 0, | |||||
"allow_import": 0, | |||||
"allow_rename": 0, | |||||
"autoname": "CR.#####", | |||||
"beta": 1, | |||||
"creation": "2017-11-08 15:27:21.156667", | |||||
"custom": 0, | |||||
"docstatus": 0, | |||||
"doctype": "DocType", | |||||
"document_type": "", | |||||
"editable_grid": 1, | |||||
"engine": "InnoDB", | |||||
"fields": [ | "fields": [ | ||||
{ | { | ||||
"allow_bulk_edit": 0, | |||||
"allow_on_submit": 0, | |||||
"bold": 0, | |||||
"collapsible": 0, | |||||
"columns": 0, | |||||
"default": "Direct", | |||||
"fieldname": "type", | |||||
"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": "Type", | |||||
"length": 0, | |||||
"no_copy": 0, | |||||
"options": "Direct\nGroup\nVisitor", | |||||
"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": 1, | |||||
"allow_bulk_edit": 0, | |||||
"allow_on_submit": 0, | |||||
"bold": 0, | |||||
"collapsible": 0, | |||||
"columns": 0, | |||||
"default": "Direct", | |||||
"fieldname": "type", | |||||
"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": "Type", | |||||
"length": 0, | |||||
"no_copy": 0, | |||||
"options": "Direct\nGroup\nVisitor", | |||||
"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": 1, | |||||
"translatable": 0, | |||||
"unique": 0 | "unique": 0 | ||||
}, | |||||
}, | |||||
{ | { | ||||
"allow_bulk_edit": 0, | |||||
"allow_on_submit": 0, | |||||
"bold": 0, | |||||
"collapsible": 0, | |||||
"columns": 0, | |||||
"depends_on": "eval:doc.type==\"Group\"", | |||||
"fieldname": "room_name", | |||||
"fieldtype": "Data", | |||||
"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": "Name", | |||||
"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, | |||||
"allow_bulk_edit": 0, | |||||
"allow_on_submit": 0, | |||||
"bold": 0, | |||||
"collapsible": 0, | |||||
"columns": 0, | |||||
"depends_on": "eval:doc.type==\"Group\"", | |||||
"fieldname": "room_name", | |||||
"fieldtype": "Data", | |||||
"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": "Name", | |||||
"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, | |||||
"translatable": 0, | |||||
"unique": 0 | "unique": 0 | ||||
}, | |||||
}, | |||||
{ | { | ||||
"allow_bulk_edit": 0, | |||||
"allow_on_submit": 0, | |||||
"bold": 0, | |||||
"collapsible": 0, | |||||
"columns": 0, | |||||
"depends_on": "eval:doc.type==\"Group\"", | |||||
"fieldname": "avatar", | |||||
"fieldtype": "Attach Image", | |||||
"hidden": 1, | |||||
"ignore_user_permissions": 0, | |||||
"ignore_xss_filter": 0, | |||||
"in_filter": 0, | |||||
"in_global_search": 0, | |||||
"in_list_view": 0, | |||||
"in_standard_filter": 0, | |||||
"label": "Avatar", | |||||
"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, | |||||
"allow_bulk_edit": 0, | |||||
"allow_on_submit": 0, | |||||
"bold": 0, | |||||
"collapsible": 0, | |||||
"columns": 0, | |||||
"depends_on": "eval:doc.type==\"Group\"", | |||||
"fieldname": "avatar", | |||||
"fieldtype": "Attach Image", | |||||
"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": "Avatar", | |||||
"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, | |||||
"translatable": 0, | |||||
"unique": 0 | "unique": 0 | ||||
}, | |||||
}, | |||||
{ | { | ||||
"allow_bulk_edit": 0, | |||||
"allow_on_submit": 0, | |||||
"bold": 0, | |||||
"collapsible": 0, | |||||
"columns": 0, | |||||
"fieldname": "last_message", | |||||
"fieldtype": "Data", | |||||
"hidden": 1, | |||||
"ignore_user_permissions": 0, | |||||
"ignore_xss_filter": 0, | |||||
"in_filter": 0, | |||||
"in_global_search": 0, | |||||
"in_list_view": 0, | |||||
"in_standard_filter": 0, | |||||
"label": "Last Message", | |||||
"length": 0, | |||||
"no_copy": 0, | |||||
"options": "", | |||||
"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, | |||||
"allow_bulk_edit": 0, | |||||
"allow_on_submit": 0, | |||||
"bold": 0, | |||||
"collapsible": 0, | |||||
"columns": 0, | |||||
"fieldname": "last_message", | |||||
"fieldtype": "Data", | |||||
"hidden": 1, | |||||
"ignore_user_permissions": 0, | |||||
"ignore_xss_filter": 0, | |||||
"in_filter": 0, | |||||
"in_global_search": 0, | |||||
"in_list_view": 0, | |||||
"in_standard_filter": 0, | |||||
"label": "Last Message", | |||||
"length": 0, | |||||
"no_copy": 0, | |||||
"options": "", | |||||
"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, | |||||
"translatable": 0, | |||||
"unique": 0 | "unique": 0 | ||||
}, | |||||
}, | |||||
{ | { | ||||
"allow_bulk_edit": 0, | |||||
"allow_on_submit": 0, | |||||
"bold": 0, | |||||
"collapsible": 0, | |||||
"columns": 0, | |||||
"fieldname": "message_count", | |||||
"fieldtype": "Int", | |||||
"hidden": 1, | |||||
"ignore_user_permissions": 0, | |||||
"ignore_xss_filter": 0, | |||||
"in_filter": 0, | |||||
"in_global_search": 0, | |||||
"in_list_view": 0, | |||||
"in_standard_filter": 0, | |||||
"label": "Message Count", | |||||
"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, | |||||
"allow_bulk_edit": 0, | |||||
"allow_on_submit": 0, | |||||
"bold": 0, | |||||
"collapsible": 0, | |||||
"columns": 0, | |||||
"fieldname": "message_count", | |||||
"fieldtype": "Int", | |||||
"hidden": 1, | |||||
"ignore_user_permissions": 0, | |||||
"ignore_xss_filter": 0, | |||||
"in_filter": 0, | |||||
"in_global_search": 0, | |||||
"in_list_view": 0, | |||||
"in_standard_filter": 0, | |||||
"label": "Message Count", | |||||
"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, | |||||
"translatable": 0, | |||||
"unique": 0 | "unique": 0 | ||||
}, | |||||
}, | |||||
{ | { | ||||
"allow_bulk_edit": 0, | |||||
"allow_on_submit": 0, | |||||
"bold": 0, | |||||
"collapsible": 0, | |||||
"columns": 0, | |||||
"default": "", | |||||
"fieldname": "owner", | |||||
"fieldtype": "Link", | |||||
"hidden": 1, | |||||
"ignore_user_permissions": 0, | |||||
"ignore_xss_filter": 0, | |||||
"in_filter": 0, | |||||
"in_global_search": 0, | |||||
"in_list_view": 0, | |||||
"in_standard_filter": 0, | |||||
"label": "Owner", | |||||
"length": 0, | |||||
"no_copy": 0, | |||||
"options": "User", | |||||
"permlevel": 0, | |||||
"precision": "", | |||||
"print_hide": 0, | |||||
"print_hide_if_no_value": 0, | |||||
"read_only": 1, | |||||
"remember_last_selected_value": 0, | |||||
"report_hide": 0, | |||||
"reqd": 0, | |||||
"search_index": 0, | |||||
"set_only_once": 0, | |||||
"allow_bulk_edit": 0, | |||||
"allow_on_submit": 0, | |||||
"bold": 0, | |||||
"collapsible": 0, | |||||
"columns": 0, | |||||
"default": "", | |||||
"fieldname": "owner", | |||||
"fieldtype": "Link", | |||||
"hidden": 1, | |||||
"ignore_user_permissions": 0, | |||||
"ignore_xss_filter": 0, | |||||
"in_filter": 0, | |||||
"in_global_search": 0, | |||||
"in_list_view": 0, | |||||
"in_standard_filter": 0, | |||||
"label": "Owner", | |||||
"length": 0, | |||||
"no_copy": 0, | |||||
"options": "User", | |||||
"permlevel": 0, | |||||
"precision": "", | |||||
"print_hide": 0, | |||||
"print_hide_if_no_value": 0, | |||||
"read_only": 1, | |||||
"remember_last_selected_value": 0, | |||||
"report_hide": 0, | |||||
"reqd": 0, | |||||
"search_index": 0, | |||||
"set_only_once": 0, | |||||
"translatable": 0, | |||||
"unique": 0 | "unique": 0 | ||||
}, | |||||
}, | |||||
{ | { | ||||
"allow_bulk_edit": 0, | |||||
"allow_on_submit": 0, | |||||
"bold": 0, | |||||
"collapsible": 0, | |||||
"columns": 0, | |||||
"fieldname": "user_list", | |||||
"fieldtype": "Section Break", | |||||
"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": "Users", | |||||
"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, | |||||
"allow_bulk_edit": 0, | |||||
"allow_on_submit": 0, | |||||
"bold": 0, | |||||
"collapsible": 0, | |||||
"columns": 0, | |||||
"fieldname": "user_list", | |||||
"fieldtype": "Section Break", | |||||
"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": "Users", | |||||
"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, | |||||
"translatable": 0, | |||||
"unique": 0 | "unique": 0 | ||||
}, | |||||
}, | |||||
{ | { | ||||
"allow_bulk_edit": 0, | |||||
"allow_on_submit": 0, | |||||
"bold": 0, | |||||
"collapsible": 0, | |||||
"columns": 0, | |||||
"fieldname": "users", | |||||
"fieldtype": "Table", | |||||
"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": "Users", | |||||
"length": 0, | |||||
"no_copy": 0, | |||||
"options": "Chat Room User", | |||||
"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, | |||||
"allow_bulk_edit": 0, | |||||
"allow_on_submit": 0, | |||||
"bold": 0, | |||||
"collapsible": 0, | |||||
"columns": 0, | |||||
"fieldname": "users", | |||||
"fieldtype": "Table", | |||||
"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": "Users", | |||||
"length": 0, | |||||
"no_copy": 0, | |||||
"options": "Chat Room User", | |||||
"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, | |||||
"translatable": 0, | |||||
"unique": 0 | "unique": 0 | ||||
} | } | ||||
], | |||||
"has_web_view": 0, | |||||
"hide_heading": 0, | |||||
"hide_toolbar": 0, | |||||
"idx": 0, | |||||
"image_field": "avatar", | |||||
"image_view": 0, | |||||
"in_create": 0, | |||||
"is_submittable": 0, | |||||
"issingle": 0, | |||||
"istable": 0, | |||||
"max_attachments": 0, | |||||
"modified": "2018-01-20 18:14:02.384039", | |||||
"modified_by": "faris@erpnext.com", | |||||
"module": "Chat", | |||||
"name": "Chat Room", | |||||
"name_case": "", | |||||
"owner": "Administrator", | |||||
], | |||||
"has_web_view": 0, | |||||
"hide_heading": 0, | |||||
"hide_toolbar": 0, | |||||
"idx": 0, | |||||
"image_field": "avatar", | |||||
"image_view": 0, | |||||
"in_create": 0, | |||||
"is_submittable": 0, | |||||
"issingle": 0, | |||||
"istable": 0, | |||||
"max_attachments": 0, | |||||
"modified": "2018-03-22 16:35:06.987209", | |||||
"modified_by": "Administrator", | |||||
"module": "Chat", | |||||
"name": "Chat Room", | |||||
"name_case": "", | |||||
"owner": "Administrator", | |||||
"permissions": [ | "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": 1, | |||||
"share": 1, | |||||
"submit": 0, | |||||
"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": 1, | |||||
"share": 1, | |||||
"submit": 0, | |||||
"write": 1 | "write": 1 | ||||
} | } | ||||
], | |||||
"quick_entry": 0, | |||||
"read_only": 0, | |||||
"read_only_onload": 0, | |||||
"search_fields": "room_name", | |||||
"show_name_in_global_search": 1, | |||||
"sort_field": "modified", | |||||
"sort_order": "DESC", | |||||
"title_field": "room_name", | |||||
"track_changes": 1, | |||||
], | |||||
"quick_entry": 0, | |||||
"read_only": 0, | |||||
"read_only_onload": 0, | |||||
"search_fields": "room_name", | |||||
"show_name_in_global_search": 1, | |||||
"sort_field": "modified", | |||||
"sort_order": "DESC", | |||||
"title_field": "room_name", | |||||
"track_changes": 1, | |||||
"track_seen": 0 | "track_seen": 0 | ||||
} | } |
@@ -157,17 +157,21 @@ def get(user, rooms = None, fields = None, filters = None): | |||||
return rooms | return rooms | ||||
@frappe.whitelist() | |||||
@frappe.whitelist(allow_guest = True) | |||||
def create(kind, owner, users = None, name = None): | def create(kind, owner, users = None, name = None): | ||||
authenticate(owner) | |||||
if kind != 'Visitor': | |||||
authenticate(owner) | |||||
users = safe_json_loads(users) | users = safe_json_loads(users) | ||||
room = frappe.new_doc('Chat Room') | room = frappe.new_doc('Chat Room') | ||||
room.type = kind | |||||
room.owner = owner | |||||
room.room_name = name | |||||
if kind != 'Visitor': | |||||
room.type = kind | |||||
room.owner = owner | |||||
room.room_name = name | |||||
else: | |||||
pass | |||||
dusers = [ ] | dusers = [ ] | ||||
if users: | if users: | ||||
@@ -7,11 +7,16 @@ def settings(): | |||||
socketio = dict( | socketio = dict( | ||||
port = frappe.conf.socketio_port | port = frappe.conf.socketio_port | ||||
), | ), | ||||
enable_chat = dsettings.chat_enable, | |||||
enable_chat = bool(dsettings.chat_enable), | |||||
welcome_message = dsettings.chat_welcome_message, | welcome_message = dsettings.chat_welcome_message, | ||||
operators = [ | operators = [ | ||||
duser.user for duser in dsettings.chat_operators | duser.user for duser in dsettings.chat_operators | ||||
] | ] | ||||
) | ) | ||||
return response | |||||
return response | |||||
@frappe.whitelist(allow_guest = True) | |||||
def token(): | |||||
token = frappe.generate_hash() | |||||
return token |
@@ -441,17 +441,38 @@ frappe.ui.Uploader.TEMPLATE = | |||||
frappe.provide('frappe.ui.keycode') | frappe.provide('frappe.ui.keycode') | ||||
frappe.ui.keycode = { RETURN: 13 } | frappe.ui.keycode = { RETURN: 13 } | ||||
// frappe.stores - A registry for frappe stores. | |||||
frappe.provide('frappe.stores') | |||||
/** | /** | ||||
* @description Frappe's Store Class | * @description Frappe's Store Class | ||||
* | |||||
* @todo Under Development | |||||
*/ | */ | ||||
frappe.Store = class { | |||||
constructor ( ) { | |||||
// frappe.stores - A registry for frappe stores. | |||||
frappe.provide('frappe.stores') | |||||
frappe.stores = [ ] | |||||
frappe.Store = class | |||||
{ | |||||
/** | |||||
* @description Frappe's Store Class's constructor. | |||||
* | |||||
* @param {string} name - Name of the logger. | |||||
*/ | |||||
constructor (name) { | |||||
if ( typeof name !== 'string' ) | |||||
throw new frappe.TypeError(`Expected string for name, got ${typeof name} instead.`) | |||||
this.name = name | |||||
} | |||||
/** | |||||
* @description Get instance of frappe.Store (return registered one if declared). | |||||
* | |||||
* @param {string} name - Name of the store. | |||||
*/ | |||||
static get (name) { | |||||
if ( !(name in frappe.stores) ) | |||||
frappe.stores[name] = new frappe.Store(name) | |||||
return frappe.stores[name] | |||||
} | } | ||||
set (key, value) { localStorage.setItem(`${this.name}:${key}`, value) } | |||||
get (key, value) { return localStorage.getItem(`${this.name}:${key}`) } | |||||
} | } | ||||
// frappe.loggers - A registry for frappe loggers. | // frappe.loggers - A registry for frappe loggers. | ||||
@@ -481,9 +502,9 @@ frappe.Logger = class { | |||||
if ( !this.level ) { | if ( !this.level ) { | ||||
if ( frappe.boot.developer_mode ) | if ( frappe.boot.developer_mode ) | ||||
this.level = frappe.Logger.ERROR | |||||
this.level = frappe.Logger.ERROR | |||||
else | else | ||||
this.level = frappe.Logger.NOTSET | |||||
this.level = frappe.Logger.NOTSET | |||||
} | } | ||||
this.format = frappe.Logger.FORMAT | this.format = frappe.Logger.FORMAT | ||||
} | } | ||||
@@ -528,7 +549,7 @@ frappe.Logger.FORMAT = '{time} {name}' | |||||
// frappe.chat | // frappe.chat | ||||
frappe.provide('frappe.chat') | frappe.provide('frappe.chat') | ||||
frappe.log = frappe.Logger.get('frappe.chat', frappe.Logger.NOTSET) | |||||
frappe.log = frappe.Logger.get('frappe.chat', frappe.Logger.ERROR) | |||||
// frappe.chat.profile | // frappe.chat.profile | ||||
frappe.provide('frappe.chat.profile') | frappe.provide('frappe.chat.profile') | ||||
@@ -988,6 +1009,41 @@ frappe.chat.emoji = function (fn) { | |||||
}) | }) | ||||
} | } | ||||
// Website Settings | |||||
frappe.provide('frappe.chat.website.settings') | |||||
frappe.chat.website.settings = (fields, fn) => | |||||
{ | |||||
if ( typeof fields === "function" ) { | |||||
fn = fields | |||||
fields = null | |||||
} else | |||||
if ( typeof fields === "string" ) | |||||
fields = frappe._.as_array(fields) | |||||
return new Promise(resolve => { | |||||
frappe.call("frappe.chat.website.settings") | |||||
.then(response => { | |||||
if ( fn ) | |||||
fn(response.message) | |||||
resolve(response.message) | |||||
}) | |||||
}) | |||||
} | |||||
frappe.chat.website.token = (fn) => | |||||
{ | |||||
return new Promise(resolve => { | |||||
frappe.call("frappe.chat.website.token") | |||||
.then(response => { | |||||
if ( fn ) | |||||
fn(response.message) | |||||
resolve(response.message) | |||||
}) | |||||
}) | |||||
} | |||||
const { h, Component } = hyper | const { h, Component } = hyper | ||||
// frappe.components | // frappe.components | ||||
@@ -1197,6 +1253,11 @@ class { | |||||
// Load Emojis. | // Load Emojis. | ||||
frappe.chat.emoji() | frappe.chat.emoji() | ||||
frappe.log.info('Initializing Socket.IO') | |||||
frappe.chat.website.settings("socketio").then(({ socketio }) => { | |||||
frappe.socketio.init(socketio.port) | |||||
}) | |||||
} | } | ||||
/** | /** | ||||
@@ -1480,7 +1541,8 @@ class extends Component { | |||||
onclick: function ( ) { | onclick: function ( ) { | ||||
const dialog = new frappe.ui.Dialog({ | const dialog = new frappe.ui.Dialog({ | ||||
title: __("New Chat"), | title: __("New Chat"), | ||||
fields: [ { | |||||
fields: [ | |||||
{ | |||||
label: __("Chat Type"), | label: __("Chat Type"), | ||||
fieldname: "type", | fieldname: "type", | ||||
fieldtype: "Select", | fieldtype: "Select", | ||||
@@ -1493,19 +1555,22 @@ class extends Component { | |||||
dialog.set_df_property("group_name", "reqd", is_group) | dialog.set_df_property("group_name", "reqd", is_group) | ||||
dialog.set_df_property("user", "reqd", !is_group) | dialog.set_df_property("user", "reqd", !is_group) | ||||
} | } | ||||
}, { | |||||
}, | |||||
{ | |||||
label: __("Group Name"), | label: __("Group Name"), | ||||
fieldname: "group_name", | fieldname: "group_name", | ||||
fieldtype: "Data", | fieldtype: "Data", | ||||
reqd: true, | reqd: true, | ||||
depends_on: "eval:doc.type == 'Group'" | depends_on: "eval:doc.type == 'Group'" | ||||
}, { | |||||
}, | |||||
{ | |||||
label: __("Users"), | label: __("Users"), | ||||
fieldname: "users", | fieldname: "users", | ||||
fieldtype: "MultiSelect", | fieldtype: "MultiSelect", | ||||
options: frappe.user.get_emails(), | options: frappe.user.get_emails(), | ||||
depends_on: "eval:doc.type == 'Group'" | depends_on: "eval:doc.type == 'Group'" | ||||
}, { | |||||
}, | |||||
{ | |||||
label: __("User"), | label: __("User"), | ||||
fieldname: "user", | fieldname: "user", | ||||
fieldtype: "Link", | fieldtype: "Link", | ||||
@@ -2460,6 +2525,26 @@ frappe.chat.render = (render = true, force = false) => | |||||
frappe.chatter = new frappe.Chat({ | frappe.chatter = new frappe.Chat({ | ||||
target: desk ? '.navbar .frappe-chat-toggle' : null | target: desk ? '.navbar .frappe-chat-toggle' : null | ||||
}) | }) | ||||
if ( !desk ) { | |||||
frappe.store = frappe.Store.get('frappe.chat') | |||||
var token = frappe.store.get('guest_token') | |||||
frappe.log.info(`Local Guest Token - ${token}`) | |||||
if ( !token ) { | |||||
frappe.chat.website.token().then(token => { | |||||
frappe.log.info(`Generated Guest Token - ${token}`) | |||||
frappe.store.set('guest_token', token) | |||||
}) | |||||
} | |||||
frappe.chat.room.create("Visitor", token).then(room => { | |||||
}) | |||||
} | |||||
frappe.chatter.render() | frappe.chatter.render() | ||||
} | } | ||||
} | } | ||||
@@ -2470,16 +2555,14 @@ frappe.chat.setup = () => | |||||
frappe.log.info('Setting up frappe.chat') | frappe.log.info('Setting up frappe.chat') | ||||
frappe.log.warn('TODO: frappe.chat.<object> requires a storage.') | frappe.log.warn('TODO: frappe.chat.<object> requires a storage.') | ||||
const desk = 'desk' in frappe | |||||
if ( desk ) { | |||||
if ( frappe.session.user !== 'Guest' ) { | |||||
// Create/Get Chat Profile for session User, retrieve enable_chat | // Create/Get Chat Profile for session User, retrieve enable_chat | ||||
frappe.log.info('Creating a Chat Profile.') | frappe.log.info('Creating a Chat Profile.') | ||||
frappe.chat.profile.create('enable_chat').then(({ enable_chat }) => { | frappe.chat.profile.create('enable_chat').then(({ enable_chat }) => { | ||||
frappe.log.info(`Chat Profile created for User ${frappe.session.user}.`) | frappe.log.info(`Chat Profile created for User ${frappe.session.user}.`) | ||||
if ( 'desk' in frappe ) { | if ( 'desk' in frappe ) { | ||||
const should_render = frappe.sys_defaults.enable_chat && enable_chat | const should_render = frappe.sys_defaults.enable_chat && enable_chat | ||||
frappe.chat.render(should_render) | frappe.chat.render(should_render) | ||||
} | } | ||||
}) | }) | ||||
@@ -2493,6 +2576,7 @@ frappe.chat.setup = () => | |||||
frappe.chat.render(should_render) | frappe.chat.render(should_render) | ||||
} | } | ||||
}) | }) | ||||
} else { | } else { | ||||
// Website Settings. | // Website Settings. | ||||
frappe.log.info('Retrieving Chat Website Settings.') | frappe.log.info('Retrieving Chat Website Settings.') | ||||
@@ -1,13 +1,6 @@ | |||||
// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors | |||||
// MIT License. See license.txt | |||||
frappe.provide("frappe.ui.form"); | |||||
// - page | |||||
// - section | |||||
// - column | |||||
// - section | |||||
import '../class' | |||||
frappe.provide("frappe.ui.form"); | |||||
frappe.ui.form.Layout = Class.extend({ | frappe.ui.form.Layout = Class.extend({ | ||||
init: function(opts) { | init: function(opts) { | ||||
this.views = {}; | this.views = {}; | ||||
@@ -2,7 +2,7 @@ frappe.socketio = { | |||||
open_tasks: {}, | open_tasks: {}, | ||||
open_docs: [], | open_docs: [], | ||||
emit_queue: [], | emit_queue: [], | ||||
init: function() { | |||||
init: function(port = 3000) { | |||||
if (frappe.boot.disable_async) { | if (frappe.boot.disable_async) { | ||||
return; | return; | ||||
} | } | ||||
@@ -13,17 +13,17 @@ frappe.socketio = { | |||||
//Enable secure option when using HTTPS | //Enable secure option when using HTTPS | ||||
if (window.location.protocol == "https:") { | if (window.location.protocol == "https:") { | ||||
frappe.socketio.socket = io.connect(frappe.socketio.get_host(), {secure: true}); | |||||
frappe.socketio.socket = io.connect(frappe.socketio.get_host(port), {secure: true}); | |||||
} | } | ||||
else if (window.location.protocol == "http:") { | else if (window.location.protocol == "http:") { | ||||
frappe.socketio.socket = io.connect(frappe.socketio.get_host()); | |||||
frappe.socketio.socket = io.connect(frappe.socketio.get_host(port)); | |||||
} | } | ||||
else if (window.location.protocol == "file:") { | else if (window.location.protocol == "file:") { | ||||
frappe.socketio.socket = io.connect(window.localStorage.server); | frappe.socketio.socket = io.connect(window.localStorage.server); | ||||
} | } | ||||
if (!frappe.socketio.socket) { | if (!frappe.socketio.socket) { | ||||
console.log("Unable to connect to " + frappe.socketio.get_host()); | |||||
console.log("Unable to connect to " + frappe.socketio.get_host(port)); | |||||
return; | return; | ||||
} | } | ||||
@@ -96,11 +96,11 @@ frappe.socketio = { | |||||
} | } | ||||
} | } | ||||
}, | }, | ||||
get_host: function() { | |||||
get_host: function(port = 3000) { | |||||
var host = window.location.origin; | var host = window.location.origin; | ||||
if(window.dev_server) { | if(window.dev_server) { | ||||
var parts = host.split(":"); | var parts = host.split(":"); | ||||
var port = frappe.boot.socketio_port || '3000'; | |||||
var port = frappe.boot.socketio_port || port.toString() || '3000'; | |||||
if(parts.length > 2) { | if(parts.length > 2) { | ||||
host = parts[0] + ":" + parts[1]; | host = parts[0] + ":" + parts[1]; | ||||
} | } | ||||
@@ -1,5 +1,4 @@ | |||||
// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors | |||||
// MIT License. See license.txt | |||||
import './field_group' | |||||
frappe.provide('frappe.ui'); | frappe.provide('frappe.ui'); | ||||
@@ -1,5 +1,4 @@ | |||||
// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors | |||||
// MIT License. See license.txt | |||||
import '../form/layout' | |||||
frappe.provide('frappe.ui'); | frappe.provide('frappe.ui'); | ||||
@@ -3,6 +3,7 @@ | |||||
// http://codeguide.co - @mdo (Author of Bootstrap) | // http://codeguide.co - @mdo (Author of Bootstrap) | ||||
@import "common.less"; | @import "common.less"; | ||||
@import "flex.less"; | |||||
// Typography | // Typography | ||||
@font-weight-bold: 700; | @font-weight-bold: 700; | ||||
@@ -78,6 +78,7 @@ | |||||
<!-- js should be loaded in body! --> | <!-- js should be loaded in body! --> | ||||
<script type="text/javascript" | <script type="text/javascript" | ||||
src="/assets/frappe/js/lib/jquery/jquery.min.js"></script> | src="/assets/frappe/js/lib/jquery/jquery.min.js"></script> | ||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.4/socket.io.slim.js"></script> | |||||
<script type="text/javascript" | <script type="text/javascript" | ||||
src="/assets/js/frappe-web.min.js"></script> | src="/assets/js/frappe-web.min.js"></script> | ||||
{% endblock %} | {% endblock %} | ||||
@@ -1127,8 +1127,9 @@ | |||||
"bold": 0, | "bold": 0, | ||||
"collapsible": 0, | "collapsible": 0, | ||||
"columns": 0, | "columns": 0, | ||||
"default": "Hi, how may I help you?", | |||||
"fieldname": "chat_welcome_message", | "fieldname": "chat_welcome_message", | ||||
"fieldtype": "Check", | |||||
"fieldtype": "Data", | |||||
"hidden": 0, | "hidden": 0, | ||||
"ignore_user_permissions": 0, | "ignore_user_permissions": 0, | ||||
"ignore_xss_filter": 0, | "ignore_xss_filter": 0, | ||||
@@ -1227,7 +1228,7 @@ | |||||
"issingle": 1, | "issingle": 1, | ||||
"istable": 0, | "istable": 0, | ||||
"max_attachments": 10, | "max_attachments": 10, | ||||
"modified": "2018-03-22 14:45:30.300804", | |||||
"modified": "2018-03-22 14:48:38.970117", | |||||
"modified_by": "Administrator", | "modified_by": "Administrator", | ||||
"module": "Website", | "module": "Website", | ||||
"name": "Website Settings", | "name": "Website Settings", | ||||
@@ -49,33 +49,6 @@ io.on('connection', function (socket) { | |||||
socket.user = cookie.parse(socket.request.headers.cookie).user_id; | socket.user = cookie.parse(socket.request.headers.cookie).user_id; | ||||
socket.files = {}; | socket.files = {}; | ||||
// frappe namespace (temporary till webpack comes in, we can then reuse). | |||||
const frappe = { }; | |||||
frappe._ = { }; | |||||
frappe._.compact = function (arr) { return arr.filter(Boolean) } | |||||
// frappe.model | |||||
// Realtime Database Updates FTW! | |||||
function get_model_room (doctype, name, field) { | |||||
const site = get_site_name(socket) | |||||
const room = frappe._.compact([site, doctype, name, field]).join(":") | |||||
return room | |||||
} | |||||
socket.on('frappe.model:subscribe', function (params) { | |||||
const doctype = params.doctype | |||||
const name = params.name | |||||
const field = params.field | |||||
const room = get_model_room(doctype, name, field) | |||||
console.log('frappe.model: Subscribing ' + socket.user + ' to room ' + room); | |||||
socket.join(room); | |||||
}) | |||||
// end frappe.model | |||||
// frappe.chat | // frappe.chat | ||||
socket.on("frappe.chat.room:subscribe", function (rooms) { | socket.on("frappe.chat.room:subscribe", function (rooms) { | ||||
if (!Array.isArray(rooms)) { | if (!Array.isArray(rooms)) { | ||||