瀏覽代碼

Raw commit

version-14
Achilles Rasquinha 7 年之前
父節點
當前提交
474e219e97
共有 12 個文件被更改,包括 430 次插入362 次删除
  1. +297
    -289
      frappe/chat/doctype/chat_room/chat_room.json
  2. +10
    -6
      frappe/chat/doctype/chat_room/chat_room.py
  3. +7
    -2
      frappe/chat/website/__init__.py
  4. +101
    -17
      frappe/public/js/frappe/chat.js
  5. +2
    -9
      frappe/public/js/frappe/form/layout.js
  6. +6
    -6
      frappe/public/js/frappe/socketio_client.js
  7. +1
    -2
      frappe/public/js/frappe/ui/dialog.js
  8. +1
    -2
      frappe/public/js/frappe/ui/field_group.js
  9. +1
    -0
      frappe/public/less/chat.less
  10. +1
    -0
      frappe/templates/base.html
  11. +3
    -2
      frappe/website/doctype/website_settings/website_settings.json
  12. +0
    -27
      socketio.js

+ 297
- 289
frappe/chat/doctype/chat_room/chat_room.json 查看文件

@@ -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": [
{
"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
},
},
{
"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
},
},
{
"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
},
},
{
"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
},
},
{
"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
},
},
{
"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
},
},
{
"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
},
},
{
"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
}
],
"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": [
{
"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
}
],
"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
}

+ 10
- 6
frappe/chat/doctype/chat_room/chat_room.py 查看文件

@@ -157,17 +157,21 @@ def get(user, rooms = None, fields = None, filters = None):
return rooms

@frappe.whitelist()
@frappe.whitelist(allow_guest = True)
def create(kind, owner, users = None, name = None):
authenticate(owner)
if kind != 'Visitor':
authenticate(owner)

users = safe_json_loads(users)

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 = [ ]

if users:


+ 7
- 2
frappe/chat/website/__init__.py 查看文件

@@ -7,11 +7,16 @@ def settings():
socketio = dict(
port = frappe.conf.socketio_port
),
enable_chat = dsettings.chat_enable,
enable_chat = bool(dsettings.chat_enable),
welcome_message = dsettings.chat_welcome_message,
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

+ 101
- 17
frappe/public/js/frappe/chat.js 查看文件

@@ -441,17 +441,38 @@ frappe.ui.Uploader.TEMPLATE =
frappe.provide('frappe.ui.keycode')
frappe.ui.keycode = { RETURN: 13 }

// frappe.stores - A registry for frappe stores.
frappe.provide('frappe.stores')
/**
* @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.
@@ -481,9 +502,9 @@ frappe.Logger = class {

if ( !this.level ) {
if ( frappe.boot.developer_mode )
this.level = frappe.Logger.ERROR
this.level = frappe.Logger.ERROR
else
this.level = frappe.Logger.NOTSET
this.level = frappe.Logger.NOTSET
}
this.format = frappe.Logger.FORMAT
}
@@ -528,7 +549,7 @@ frappe.Logger.FORMAT = '{time} {name}'
// 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.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

// frappe.components
@@ -1197,6 +1253,11 @@ class {

// Load Emojis.
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 ( ) {
const dialog = new frappe.ui.Dialog({
title: __("New Chat"),
fields: [ {
fields: [
{
label: __("Chat Type"),
fieldname: "type",
fieldtype: "Select",
@@ -1493,19 +1555,22 @@ class extends Component {
dialog.set_df_property("group_name", "reqd", is_group)
dialog.set_df_property("user", "reqd", !is_group)
}
}, {
},
{
label: __("Group Name"),
fieldname: "group_name",
fieldtype: "Data",
reqd: true,
depends_on: "eval:doc.type == 'Group'"
}, {
},
{
label: __("Users"),
fieldname: "users",
fieldtype: "MultiSelect",
options: frappe.user.get_emails(),
depends_on: "eval:doc.type == 'Group'"
}, {
},
{
label: __("User"),
fieldname: "user",
fieldtype: "Link",
@@ -2460,6 +2525,26 @@ frappe.chat.render = (render = true, force = false) =>
frappe.chatter = new frappe.Chat({
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()
}
}
@@ -2470,16 +2555,14 @@ frappe.chat.setup = () =>
frappe.log.info('Setting up frappe.chat')
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
frappe.log.info('Creating a Chat Profile.')
frappe.chat.profile.create('enable_chat').then(({ enable_chat }) => {
frappe.log.info(`Chat Profile created for User ${frappe.session.user}.`)
if ( 'desk' in frappe ) {
const should_render = frappe.sys_defaults.enable_chat && enable_chat
frappe.chat.render(should_render)
}
})
@@ -2493,6 +2576,7 @@ frappe.chat.setup = () =>
frappe.chat.render(should_render)
}
})
} else {
// Website Settings.
frappe.log.info('Retrieving Chat Website Settings.')


+ 2
- 9
frappe/public/js/frappe/form/layout.js 查看文件

@@ -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({
init: function(opts) {
this.views = {};


+ 6
- 6
frappe/public/js/frappe/socketio_client.js 查看文件

@@ -2,7 +2,7 @@ frappe.socketio = {
open_tasks: {},
open_docs: [],
emit_queue: [],
init: function() {
init: function(port = 3000) {
if (frappe.boot.disable_async) {
return;
}
@@ -13,17 +13,17 @@ frappe.socketio = {

//Enable secure option when using 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:") {
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:") {
frappe.socketio.socket = io.connect(window.localStorage.server);
}

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

@@ -96,11 +96,11 @@ frappe.socketio = {
}
}
},
get_host: function() {
get_host: function(port = 3000) {
var host = window.location.origin;
if(window.dev_server) {
var parts = host.split(":");
var port = frappe.boot.socketio_port || '3000';
var port = frappe.boot.socketio_port || port.toString() || '3000';
if(parts.length > 2) {
host = parts[0] + ":" + parts[1];
}


+ 1
- 2
frappe/public/js/frappe/ui/dialog.js 查看文件

@@ -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');



+ 1
- 2
frappe/public/js/frappe/ui/field_group.js 查看文件

@@ -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');



+ 1
- 0
frappe/public/less/chat.less 查看文件

@@ -3,6 +3,7 @@
// http://codeguide.co - @mdo (Author of Bootstrap)

@import "common.less";
@import "flex.less";

// Typography
@font-weight-bold: 700;


+ 1
- 0
frappe/templates/base.html 查看文件

@@ -78,6 +78,7 @@
<!-- js should be loaded in body! -->
<script type="text/javascript"
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"
src="/assets/js/frappe-web.min.js"></script>
{% endblock %}


+ 3
- 2
frappe/website/doctype/website_settings/website_settings.json 查看文件

@@ -1127,8 +1127,9 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "Hi, how may I help you?",
"fieldname": "chat_welcome_message",
"fieldtype": "Check",
"fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
@@ -1227,7 +1228,7 @@
"issingle": 1,
"istable": 0,
"max_attachments": 10,
"modified": "2018-03-22 14:45:30.300804",
"modified": "2018-03-22 14:48:38.970117",
"modified_by": "Administrator",
"module": "Website",
"name": "Website Settings",


+ 0
- 27
socketio.js 查看文件

@@ -49,33 +49,6 @@ io.on('connection', function (socket) {
socket.user = cookie.parse(socket.request.headers.cookie).user_id;
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
socket.on("frappe.chat.room:subscribe", function (rooms) {
if (!Array.isArray(rooms)) {


Loading…
取消
儲存