diff --git a/frappe/public/css/chat.css b/frappe/public/css/chat.css index 8e198daa55..607faee3e9 100644 --- a/frappe/public/css/chat.css +++ b/frappe/public/css/chat.css @@ -380,7 +380,7 @@ a.no-decoration:active { resize: none; padding-left: 0px; padding-right: 0px; - overflow: auto; + overflow: hidden; } .chat-room-footer .chat-form .fa { font-size: 14px; diff --git a/frappe/public/js/frappe/chat.js b/frappe/public/js/frappe/chat.js index 5e9b28eaee..9024221ae4 100644 --- a/frappe/public/js/frappe/chat.js +++ b/frappe/public/js/frappe/chat.js @@ -32,7 +32,7 @@ frappe.provide('frappe.model') * @todo Under Development */ frappe.model.subscribe = (doctype, name, field) => - frappe.realtime.publish('frappe.model:subscribe', { doctype: doctype, name: name, field: field }) + frappe.realtime.publish('frappe.model:subscribe', { doctype: doctype, name: name, field: field }) /** * @description The base class for all Frappe Errors. @@ -48,49 +48,49 @@ frappe.model.subscribe = (doctype, name, field) => * @todo Requires "transform-builtin-extend" for Babel 6 */ frappe.Error = class extends Error { - constructor (message) { - super (message) + constructor (message) { + super (message) - this.name = 'FrappeError' + this.name = 'FrappeError' - if ( typeof Error.captureStackTrace === 'function' ) - Error.captureStackTrace(this, this.constructor) - else - this.stack = (new Error(message)).stack - } + if ( typeof Error.captureStackTrace === 'function' ) + Error.captureStackTrace(this, this.constructor) + else + this.stack = (new Error(message)).stack + } } /** * @description TypeError */ frappe.TypeError = class extends frappe.Error { - constructor (message) { - super (message) + constructor (message) { + super (message) - this.name = this.constructor.name - } + this.name = this.constructor.name + } } /** * @description ValueError */ frappe.ValueError = class extends frappe.Error { - constructor (message) { - super (message) + constructor (message) { + super (message) - this.name = this.constructor.name - } + this.name = this.constructor.name + } } /** * @description ImportError */ frappe.ImportError = class extends frappe.Error { - constructor (message) { - super (message) + constructor (message) { + super (message) - this.name = this.constructor.name - } + this.name = this.constructor.name + } } // frappe.datetime @@ -103,23 +103,23 @@ frappe.provide('frappe.datetime') * const datetime = new frappe.datetime.datetime() */ frappe.datetime.datetime = class { - /** - * @description Frappe's datetime Class's constructor. - */ - constructor (instance) { - if ( typeof moment === undefined ) - throw new frappe.ImportError(`Moment.js not installed.`) + /** + * @description Frappe's datetime Class's constructor. + */ + constructor (instance) { + if ( typeof moment === undefined ) + throw new frappe.ImportError(`Moment.js not installed.`) - this.moment = instance ? moment(instance) : moment() - } + this.moment = instance ? moment(instance) : moment() + } - /** - * @description Returns a formatted string of the datetime object. - */ - format (format) { - const formatted = this.moment.format(format) - return formatted - } + /** + * @description Returns a formatted string of the datetime object. + */ + format (format) { + const formatted = this.moment.format(format) + return formatted + } } /** @@ -131,12 +131,12 @@ frappe.datetime.datetime = class { frappe.datetime.now = () => new frappe.datetime.datetime() frappe.datetime.equal = (a, b, type) => { - a = a.moment - b = b.moment + a = a.moment + b = b.moment - const equal = a.isSame(b, type) + const equal = a.isSame(b, type) - return equal + return equal } /** @@ -156,16 +156,16 @@ frappe.datetime.equal = (a, b, type) => { * // returns 1 */ frappe.datetime.compare = (a, b) => { - a = a.moment - b = b.moment + a = a.moment + b = b.moment - if ( a.isBefore(b) ) - return 1 - else - if ( b.isBefore(a) ) - return -1 - else - return 0 + if ( a.isBefore(b) ) + return 1 + else + if ( b.isBefore(a) ) + return -1 + else + return 0 } // frappe._ @@ -187,10 +187,10 @@ frappe.provide('frappe._') * // returns "bar foo" */ frappe._.format = (string, object) => { - for (const key in object) - string = string.replace(`{${key}}`, object[key]) + for (const key in object) + string = string.replace(`{${key}}`, object[key]) - return string + return string } /** @@ -209,20 +209,20 @@ frappe._.format = (string, object) => { * @see http://fusejs.io */ frappe._.fuzzy_search = (query, dataset, options) => { - const DEFAULT = { - shouldSort: true, - threshold: 0.6, - location: 0, - distance: 100, - minMatchCharLength: 1, - maxPatternLength: 32 - } - options = { ...DEFAULT, ...options } + const DEFAULT = { + shouldSort: true, + threshold: 0.6, + location: 0, + distance: 100, + minMatchCharLength: 1, + maxPatternLength: 32 + } + options = { ...DEFAULT, ...options } - const fuse = new Fuse(dataset, options) - const result = fuse.search(query) + const fuse = new Fuse(dataset, options) + const result = fuse.search(query) - return result + return result } /** @@ -287,10 +287,10 @@ frappe._.head = arr => frappe._.is_empty(arr) ? undefined : arr[0] * @todo Add optional deep copy. */ frappe._.copy_array = array => { - if ( Array.isArray(array) ) - return array.slice() - else - throw frappe.TypeError(`Expected Array, recieved ${typeof array} instead.`) + if ( Array.isArray(array) ) + return array.slice() + else + throw frappe.TypeError(`Expected Array, recieved ${typeof array} instead.`) } /** @@ -315,18 +315,18 @@ frappe._.copy_array = array => { * @todo Handle other cases. */ frappe._.is_empty = value => { - let empty = false + let empty = false - if ( value === undefined || value === null ) - empty = true - else - if ( Array.isArray(value) || typeof value === 'string' || value instanceof $ ) - empty = value.length === 0 - else - if ( typeof value === 'object' ) - empty = Object.keys(value).length === 0 + if ( value === undefined || value === null ) + empty = true + else + if ( Array.isArray(value) || typeof value === 'string' || value instanceof $ ) + empty = value.length === 0 + else + if ( typeof value === 'object' ) + empty = Object.keys(value).length === 0 - return empty + return empty } /** @@ -371,11 +371,11 @@ frappe._.squash = list => Array.isArray(list) && list.length === 1 ? list[0] : l * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent */ frappe._.is_mobile = () => { - const regex = new RegExp("Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini", "i") - const agent = navigator.userAgent - const mobile = regex.test(agent) + const regex = new RegExp("Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini", "i") + const agent = navigator.userAgent + const mobile = regex.test(agent) - return mobile + return mobile } /** @@ -417,37 +417,37 @@ frappe.provide('frappe.ui') * @todo Under Development */ frappe.ui.Uploader = class { - constructor (wrapper, options = { }) { - this.options = frappe.ui.Uploader.OPTIONS - this.set_wrapper(wrapper) - this.set_options(options) - } + constructor (wrapper, options = { }) { + this.options = frappe.ui.Uploader.OPTIONS + this.set_wrapper(wrapper) + this.set_options(options) + } - set_wrapper (wrapper) { - this.$wrapper = $(wrapper) + set_wrapper (wrapper) { + this.$wrapper = $(wrapper) - return this - } + return this + } - set_options (options) { - this.options = { ...this.options, ...options } + set_options (options) { + this.options = { ...this.options, ...options } - return this - } + return this + } - render ( ) { - const $template = $(frappe.ui.Uploader.TEMPLATE) - this.$wrapper.html($template) - } + render ( ) { + const $template = $(frappe.ui.Uploader.TEMPLATE) + this.$wrapper.html($template) + } } frappe.ui.Uploader.Layout = { DIALOG: 'DIALOG' } frappe.ui.Uploader.OPTIONS = { - layout: frappe.ui.Uploader.Layout.DIALOG + layout: frappe.ui.Uploader.Layout.DIALOG } frappe.ui.Uploader.TEMPLATE = `
- FooBar + FooBar
` @@ -462,9 +462,9 @@ frappe.provide('frappe.stores') * @todo Under Development */ frappe.Store = class { - constructor ( ) { + constructor ( ) { - } + } } // frappe.loggers - A registry for frappe loggers. @@ -480,50 +480,50 @@ frappe.provide('frappe.loggers') * // prints '[timestamp] foobar: foobar' */ frappe.Logger = class { - /** - * @description Frappe's Logger 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.`) + /** + * @description Frappe's Logger 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 - if ( frappe.boot.developer_mode ) - this.level = frappe.Logger.ERROR - else - this.level = frappe.Logger.NOTSET - this.format = frappe.Logger.FORMAT - } + this.name = name + if ( frappe.boot.developer_mode ) + this.level = frappe.Logger.ERROR + else + this.level = frappe.Logger.NOTSET + this.format = frappe.Logger.FORMAT + } - /** - * @description Get instance of frappe.Logger (return registered one if declared). - * - * @param {string} name - Name of the logger. - */ - static get (name) { - if ( !(name in frappe.loggers) ) - frappe.loggers[name] = new frappe.Logger(name) - return frappe.loggers[name] - } + /** + * @description Get instance of frappe.Logger (return registered one if declared). + * + * @param {string} name - Name of the logger. + */ + static get (name) { + if ( !(name in frappe.loggers) ) + frappe.loggers[name] = new frappe.Logger(name) + return frappe.loggers[name] + } - debug (message) { this.log(message, frappe.Logger.DEBUG) } - info (message) { this.log(message, frappe.Logger.INFO) } - warn (message) { this.log(message, frappe.Logger.WARN) } - error (message) { this.log(message, frappe.Logger.ERROR) } + debug (message) { this.log(message, frappe.Logger.DEBUG) } + info (message) { this.log(message, frappe.Logger.INFO) } + warn (message) { this.log(message, frappe.Logger.WARN) } + error (message) { this.log(message, frappe.Logger.ERROR) } - log (message, level) { - const timestamp = frappe.datetime.now() + log (message, level) { + const timestamp = frappe.datetime.now() - if ( level.value <= this.level.value ) { - const format = frappe._.format(this.format, { - time: timestamp.format('HH:mm:ss'), - name: this.name - }) - console.log(`%c ${format}:`, `color: ${level.color}`, message) - } - } + if ( level.value <= this.level.value ) { + const format = frappe._.format(this.format, { + time: timestamp.format('HH:mm:ss'), + name: this.name + }) + console.log(`%c ${format}:`, `color: ${level.color}`, message) + } + } } frappe.Logger.DEBUG = { value: 10, color: '#616161', name: 'DEBUG' } @@ -556,23 +556,23 @@ frappe.provide('frappe.chat.profile') * frappe.chat.profile.create("status").then(console.log) // { status: "Online" } */ frappe.chat.profile.create = (fields, fn) => { - if ( typeof fields === "function" ) { - fn = fields - fields = null - } else - if ( typeof fields === "string" ) - fields = frappe._.as_array(fields) + 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.doctype.chat_profile.chat_profile.create", - { user: frappe.session.user, exists_ok: true, fields: fields }, - response => { - if ( fn ) - fn(response.message) - - resolve(response.message) - }) - }) + return new Promise(resolve => { + frappe.call("frappe.chat.doctype.chat_profile.chat_profile.create", + { user: frappe.session.user, exists_ok: true, fields: fields }, + response => { + if ( fn ) + fn(response.message) + + resolve(response.message) + }) + }) } /** @@ -585,16 +585,16 @@ frappe.chat.profile.create = (fields, fn) => { * frappe.chat.profile.update(frappe.session.user, { "status": "Offline" }) */ frappe.chat.profile.update = (user, update, fn) => { - return new Promise(resolve => { - frappe.call("frappe.chat.doctype.chat_profile.chat_profile.update", - { user: user || frappe.session.user, data: update }, - response => { - if ( fn ) - fn(response.message) - - resolve(response.message) - }) - }) + return new Promise(resolve => { + frappe.call("frappe.chat.doctype.chat_profile.chat_profile.update", + { user: user || frappe.session.user, data: update }, + response => { + if ( fn ) + fn(response.message) + + resolve(response.message) + }) + }) } // frappe.chat.profile.on @@ -614,23 +614,23 @@ frappe.provide('frappe.chat.profile.on') * }) */ frappe.chat.profile.on.update = function (fn) { - frappe.realtime.on("frappe.chat.profile:update", r => fn(r.user, r.data)) + frappe.realtime.on("frappe.chat.profile:update", r => fn(r.user, r.data)) } frappe.chat.profile.STATUSES = [ { - name: "Online", - color: "green" - }, { - name: "Away", - color: "yellow" - }, { - name: "Busy", - color: "red" - }, { - name: "Offline", - color: "darkgrey" - } + name: "Online", + color: "green" + }, { + name: "Away", + color: "yellow" + }, { + name: "Busy", + color: "red" + }, { + name: "Offline", + color: "darkgrey" + } ] // frappe.chat.room @@ -656,26 +656,26 @@ frappe.provide('frappe.chat.room') * }) */ frappe.chat.room.create = function (kind, owner, users, name, fn) { - if ( typeof name === "function" ) { - fn = name - name = null - } + if ( typeof name === "function" ) { + fn = name + name = null + } - users = frappe._.as_array(users) - - return new Promise(resolve => { - frappe.call("frappe.chat.doctype.chat_room.chat_room.create", - { kind: kind, owner: owner || frappe.session.user, users: users, name: name }, - r => { - let room = r.message - room = { ...room, creation: new frappe.datetime.datetime(room.creation) } + users = frappe._.as_array(users) + + return new Promise(resolve => { + frappe.call("frappe.chat.doctype.chat_room.chat_room.create", + { kind: kind, owner: owner || frappe.session.user, users: users, name: name }, + r => { + let room = r.message + room = { ...room, creation: new frappe.datetime.datetime(room.creation) } - if ( fn ) - fn(room) + if ( fn ) + fn(room) - resolve(room) - }) - }) + resolve(room) + }) + }) } /** @@ -708,48 +708,48 @@ frappe.chat.room.create = function (kind, owner, users, name, fn) { * }) */ frappe.chat.room.get = function (names, fields, fn) { - if ( typeof names === "function" ) { - fn = names - names = null - fields = null - } - else - if ( typeof names === "string" ) { - names = frappe._.as_array(names) + if ( typeof names === "function" ) { + fn = names + names = null + fields = null + } + else + if ( typeof names === "string" ) { + names = frappe._.as_array(names) - if ( typeof fields === "function" ) { - fn = fields - fields = null - } - else - if ( typeof fields === "string" ) - fields = frappe._.as_array(fields) - } + if ( typeof fields === "function" ) { + fn = fields + fields = null + } + else + if ( typeof fields === "string" ) + fields = frappe._.as_array(fields) + } - return new Promise(resolve => { + return new Promise(resolve => { - frappe.call("frappe.chat.doctype.chat_room.chat_room.get", - { user: frappe.session.user, rooms: names, fields: fields }, - response => { - let rooms = response.message - if ( rooms ) { // frappe.api BOGZ! (emtpy arrays are falsified, not good design). - rooms = frappe._.as_array(rooms) - rooms = rooms.map(room => { - return { ...room, creation: new frappe.datetime.datetime(room.creation), - last_message: room.last_message ? { ...room.last_message, creation: new frappe.datetime.datetime(room.last_message.creation) } : null - } - }) - rooms = frappe._.squash(rooms) - } - else - rooms = [ ] + frappe.call("frappe.chat.doctype.chat_room.chat_room.get", + { user: frappe.session.user, rooms: names, fields: fields }, + response => { + let rooms = response.message + if ( rooms ) { // frappe.api BOGZ! (emtpy arrays are falsified, not good design). + rooms = frappe._.as_array(rooms) + rooms = rooms.map(room => { + return { ...room, creation: new frappe.datetime.datetime(room.creation), + last_message: room.last_message ? { ...room.last_message, creation: new frappe.datetime.datetime(room.last_message.creation) } : null + } + }) + rooms = frappe._.squash(rooms) + } + else + rooms = [ ] - if ( fn ) - fn(rooms) + if ( fn ) + fn(rooms) - resolve(rooms) - }) - }) + resolve(rooms) + }) + }) } /** @@ -761,7 +761,7 @@ frappe.chat.room.get = function (names, fields, fn) { * frappe.chat.room.subscribe("CR00001") */ frappe.chat.room.subscribe = function (rooms) { - frappe.realtime.publish("frappe.chat.room:subscribe", rooms) + frappe.realtime.publish("frappe.chat.room:subscribe", rooms) } /** @@ -778,19 +778,19 @@ frappe.chat.room.subscribe = function (rooms) { * }) */ frappe.chat.room.history = function (name, fn) { - return new Promise(resolve => { - frappe.call("frappe.chat.doctype.chat_room.chat_room.history", - { room: name, user: frappe.session.user }, - r => { - let messages = r.message ? frappe._.as_array(r.message) : [ ] // frappe.api BOGZ! (emtpy arrays are falsified, not good design). - messages = messages.map(m => { return { ...m, creation: new frappe.datetime.datetime(m.creation) } }) + return new Promise(resolve => { + frappe.call("frappe.chat.doctype.chat_room.chat_room.history", + { room: name, user: frappe.session.user }, + r => { + let messages = r.message ? frappe._.as_array(r.message) : [ ] // frappe.api BOGZ! (emtpy arrays are falsified, not good design). + messages = messages.map(m => { return { ...m, creation: new frappe.datetime.datetime(m.creation) } }) - if ( fn ) - fn(messages) - - resolve(messages) - }) - }) + if ( fn ) + fn(messages) + + resolve(messages) + }) + }) } /** @@ -802,19 +802,19 @@ frappe.chat.room.history = function (name, fn) { * @returns {array} - A fuzzy searched list of rooms. */ frappe.chat.room.search = function (query, rooms) { - const dataset = rooms.map(r => { - if ( r.room_name ) - return r.room_name - else - if ( r.owner === frappe.session.user ) - return frappe.user.full_name(frappe._.squash(r.users)) - else - return frappe.user.full_name(r.owner) - }) - const results = frappe._.fuzzy_search(query, dataset) - rooms = results.map(i => rooms[i]) + const dataset = rooms.map(r => { + if ( r.room_name ) + return r.room_name + else + if ( r.owner === frappe.session.user ) + return frappe.user.full_name(frappe._.squash(r.users)) + else + return frappe.user.full_name(r.owner) + }) + const results = frappe._.fuzzy_search(query, dataset) + rooms = results.map(i => rooms[i]) - return rooms + return rooms } /** @@ -824,21 +824,21 @@ frappe.chat.room.search = function (query, rooms) { * @param {compare} - (Optional) a comparision function. */ frappe.chat.room.sort = function (rooms, compare = null) { - compare = compare || function (a, b) { - if ( a.last_message && b.last_message ) - return frappe.datetime.compare(a.last_message.creation, b.last_message.creation) - else - if ( a.last_message ) - return frappe.datetime.compare(a.last_message.creation, b.creation) - else - if ( b.last_message ) - return frappe.datetime.compare(a.creation, b.last_message.creation) - else - return frappe.datetime.compare(a.creation, b.creation) - } - rooms.sort(compare) + compare = compare || function (a, b) { + if ( a.last_message && b.last_message ) + return frappe.datetime.compare(a.last_message.creation, b.last_message.creation) + else + if ( a.last_message ) + return frappe.datetime.compare(a.last_message.creation, b.creation) + else + if ( b.last_message ) + return frappe.datetime.compare(a.creation, b.last_message.creation) + else + return frappe.datetime.compare(a.creation, b.creation) + } + rooms.sort(compare) - return rooms + return rooms } // frappe.chat.room.on @@ -850,13 +850,13 @@ frappe.provide('frappe.chat.room.on') * @param {function} fn - callback with the Chat Room and Update. */ frappe.chat.room.on.update = function (fn) { - frappe.realtime.on("frappe.chat.room:update", r => { - if ( r.data.last_message ) - // creation to frappe.datetime.datetime (easier to manipulate). - r.data = { ...r.data, last_message: { ...r.data.last_message, creation: new frappe.datetime.datetime(r.data.last_message.creation) } } - - fn(r.room, r.data) - }) + frappe.realtime.on("frappe.chat.room:update", r => { + if ( r.data.last_message ) + // creation to frappe.datetime.datetime (easier to manipulate). + r.data = { ...r.data, last_message: { ...r.data.last_message, creation: new frappe.datetime.datetime(r.data.last_message.creation) } } + + fn(r.room, r.data) + }) } /** @@ -865,7 +865,7 @@ frappe.chat.room.on.update = function (fn) { * @param {function} fn - callback with the created Chat Room. */ frappe.chat.room.on.create = function (fn) { - frappe.realtime.on("frappe.chat.room:create", r => fn({ ...r, creation: new frappe.datetime.datetime(r.creation) })) + frappe.realtime.on("frappe.chat.room:create", r => fn({ ...r, creation: new frappe.datetime.datetime(r.creation) })) } /** @@ -874,70 +874,70 @@ frappe.chat.room.on.create = function (fn) { * @param {function} fn - callback with the typing User within the Chat Room. */ frappe.chat.room.on.typing = function (fn) { - frappe.realtime.on("frappe.chat.room:typing", r => fn(r.room, r.user)) + frappe.realtime.on("frappe.chat.room:typing", r => fn(r.room, r.user)) } // frappe.chat.message frappe.provide('frappe.chat.message') frappe.chat.message.typing = function (room, user) { - frappe.realtime.publish("frappe.chat.message:typing", { user: user || frappe.session.user, room: room }) + frappe.realtime.publish("frappe.chat.message:typing", { user: user || frappe.session.user, room: room }) } frappe.chat.message.send = function (room, message) { - frappe.call("frappe.chat.doctype.chat_message.chat_message.send", - { user: frappe.session.user, room: room, content: message }) + frappe.call("frappe.chat.doctype.chat_message.chat_message.send", + { user: frappe.session.user, room: room, content: message }) } frappe.chat.message.update = function (message, update, fn) { - return new Promise(resolve => { - frappe.call('frappe.chat.doctype.chat_message.chat_message.update', - { user: frappe.session.user, message: message, update: update }, - r => { - if ( fn ) - fn(response.message) + return new Promise(resolve => { + frappe.call('frappe.chat.doctype.chat_message.chat_message.update', + { user: frappe.session.user, message: message, update: update }, + r => { + if ( fn ) + fn(response.message) - resolve(response.message) - }) - }) + resolve(response.message) + }) + }) } frappe.chat.message.sort = (messages) => { - if ( !frappe._.is_empty(messages) ) - messages.sort((a, b) => frappe.datetime.compare(b.creation, a.creation)) + if ( !frappe._.is_empty(messages) ) + messages.sort((a, b) => frappe.datetime.compare(b.creation, a.creation)) - return messages + return messages } /** * @description Add user to seen (defaults to session.user) */ frappe.chat.message.seen = (mess, user) => { - frappe.call('frappe.chat.doctype.chat_message.chat_message.seen', - { message: mess, user: user || frappe.session.user }) + frappe.call('frappe.chat.doctype.chat_message.chat_message.seen', + { message: mess, user: user || frappe.session.user }) } frappe.provide('frappe.chat.message.on') frappe.chat.message.on.create = function (fn) { - frappe.realtime.on("frappe.chat.message:create", r => fn({ ...r, creation: new frappe.datetime.datetime(r.creation) })) + frappe.realtime.on("frappe.chat.message:create", r => fn({ ...r, creation: new frappe.datetime.datetime(r.creation) })) } frappe.chat.message.on.update = function (fn) { - frappe.realtime.on("frappe.chat.message:update", r => fn(r.message, r.data)) + frappe.realtime.on("frappe.chat.message:update", r => fn(r.message, r.data)) } frappe.chat.pretty_datetime = function (date) { - const today = moment() - const instance = date.moment - - if ( today.isSame(instance, "d") ) - return instance.format("hh:mm A") - else - if ( today.isSame(instance, "week") ) - return instance.format("dddd") - else - return instance.format("DD/MM/YYYY") + const today = moment() + const instance = date.moment + + if ( today.isSame(instance, "d") ) + return instance.format("hh:mm A") + else + if ( today.isSame(instance, "week") ) + return instance.format("dddd") + else + return instance.format("DD/MM/YYYY") } // frappe.chat.sound @@ -952,45 +952,45 @@ frappe.provide('frappe.chat.sound') * frappe.chat.sound.play("message") */ frappe.chat.sound.play = function (name, volume = 0.1) { - // frappe._.play_sound(`chat-${name}`) - const $audio = $(`