${i18n.t(
+ ? DOMPurify.sanitize(`
+
${i18n.t(
messageType.message,
messageType.data
? { ...messageType.data(message), interpolation: { escapeValue: false } }
: { interpolation: { escapeValue: false } },
- )}`
- : message.msg;
+ )}`)
+ : escapeHtml(message.msg);
let filesHTML = '';
if (message.attachments && message.attachments?.length > 0) {
messageContent = message.attachments[0].description || '';
+ escapeHtml(messageContent);
for await (const attachment of message.attachments) {
if (!isFileAttachment(attachment)) {
- // ignore other types of attachments
continue;
}
if (!isFileImageAttachment(attachment)) {
- filesHTML += `
${attachment.title || ''}${InvalidFileMessage}
`;
- continue;
- }
-
- if (!attachment.image_type || !acceptableImageMimeTypes.includes(attachment.image_type)) {
- filesHTML += `
${attachment.title || ''}${InvalidFileMessage}
`;
+ filesHTML += `
${escapeHtml(attachment.title || '')}${InvalidFileMessage}
`;
continue;
}
- // Image attachment can be rendered in email body
const file = message.files?.find((file) => file.name === attachment.title);
if (!file) {
- filesHTML += `
${attachment.title || ''}${InvalidFileMessage}
`;
+ filesHTML += `
${escapeHtml(attachment.title || '')}${InvalidFileMessage}
`;
continue;
}
const uploadedFile = await Uploads.findOneById(file._id);
if (!uploadedFile) {
- filesHTML += `
${file.name}${InvalidFileMessage}
`;
+ filesHTML += `
${escapeHtml(file.name)}${InvalidFileMessage}
`;
continue;
}
const uploadedFileBuffer = await FileUpload.getBuffer(uploadedFile);
- filesHTML += `
${file.name}
})
`;
+ filesHTML += `
+
${escapeHtml(file.name)}
+
})
+
`;
}
}
const datetime = moment.tz(message.ts, timezone).locale(userLanguage).format('LLL');
const singleMessage = `
-
${author} ${datetime}
+
${escapeHtml(author)} ${escapeHtml(datetime)}
${messageContent}
${filesHTML}
`;
diff --git a/apps/meteor/app/livechat/server/lib/service-status.ts b/apps/meteor/app/livechat/server/lib/service-status.ts
index 65b9b606d6713..fc57ff7817323 100644
--- a/apps/meteor/app/livechat/server/lib/service-status.ts
+++ b/apps/meteor/app/livechat/server/lib/service-status.ts
@@ -2,6 +2,7 @@ import type { ILivechatAgent, ILivechatDepartment, SelectedAgent } from '@rocket
import { Users, LivechatDepartmentAgents, LivechatDepartment } from '@rocket.chat/models';
import type { FindCursor } from 'mongodb';
+import { checkOnlineForDepartment, getOnlineForDepartment } from './departmentsLib';
import { livechatLogger } from './logger';
import { settings } from '../../../settings/server';
@@ -11,17 +12,7 @@ export async function getOnlineAgents(department?: string, agent?: SelectedAgent
}
if (department) {
- const departmentAgents = await LivechatDepartmentAgents.getOnlineForDepartment(department);
- if (!departmentAgents) {
- return;
- }
-
- const agentIds = await departmentAgents.map(({ agentId }) => agentId).toArray();
- if (!agentIds.length) {
- return;
- }
-
- return Users.findByIds
([...new Set(agentIds)]);
+ return getOnlineForDepartment(department);
}
return Users.findOnlineAgents(undefined, settings.get('Livechat_enabled_when_agent_idle'));
}
@@ -56,16 +47,16 @@ export async function checkOnlineAgents(department?: string, agent?: { agentId:
}
if (department) {
- const onlineForDep = await LivechatDepartmentAgents.checkOnlineForDepartment(department);
+ const onlineForDep = await checkOnlineForDepartment(department);
if (onlineForDep || skipFallbackCheck) {
- return onlineForDep;
+ return !!onlineForDep;
}
const dep = await LivechatDepartment.findOneById>(department, {
projection: { fallbackForwardDepartment: 1 },
});
if (!dep?.fallbackForwardDepartment) {
- return onlineForDep;
+ return !!onlineForDep;
}
return checkOnlineAgents(dep?.fallbackForwardDepartment);
diff --git a/apps/meteor/app/livechat/server/methods/getAnalyticsChartData.ts b/apps/meteor/app/livechat/server/methods/getAnalyticsChartData.ts
index 2ff682c1c39c2..aed8799943ef7 100644
--- a/apps/meteor/app/livechat/server/methods/getAnalyticsChartData.ts
+++ b/apps/meteor/app/livechat/server/methods/getAnalyticsChartData.ts
@@ -32,6 +32,6 @@ Meteor.methods({
return;
}
- return OmnichannelAnalytics.getAnalyticsChartData({ ...options, utcOffset: user?.utcOffset });
+ return OmnichannelAnalytics.getAnalyticsChartData({ ...options, utcOffset: user?.utcOffset, executedBy: userId });
},
});
diff --git a/apps/meteor/app/livechat/server/methods/removeAllClosedRooms.ts b/apps/meteor/app/livechat/server/methods/removeAllClosedRooms.ts
index e154667c3c188..a0efb13f3070b 100644
--- a/apps/meteor/app/livechat/server/methods/removeAllClosedRooms.ts
+++ b/apps/meteor/app/livechat/server/methods/removeAllClosedRooms.ts
@@ -29,7 +29,7 @@ Meteor.methods({
// These are not debug logs since we want to know when the action is performed
logger.info(`User ${Meteor.userId()} is removing all closed rooms`);
- const extraQuery = await callbacks.run('livechat.applyRoomRestrictions', {});
+ const extraQuery = await callbacks.run('livechat.applyRoomRestrictions', {}, { userId: user });
const promises: Promise[] = [];
await LivechatRooms.findClosedRooms(departmentIds, {}, extraQuery).forEach(({ _id }: IOmnichannelRoom) => {
promises.push(removeOmnichannelRoom(_id));
diff --git a/apps/meteor/app/livechat/server/methods/saveAgentInfo.ts b/apps/meteor/app/livechat/server/methods/saveAgentInfo.ts
index 215cb2b891a45..e48f396d5c300 100644
--- a/apps/meteor/app/livechat/server/methods/saveAgentInfo.ts
+++ b/apps/meteor/app/livechat/server/methods/saveAgentInfo.ts
@@ -1,5 +1,4 @@
import type { ServerMethods } from '@rocket.chat/ddp-client';
-import { Users } from '@rocket.chat/models';
import { Meteor } from 'meteor/meteor';
import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission';
@@ -15,15 +14,18 @@ declare module '@rocket.chat/ddp-client' {
Meteor.methods({
async 'livechat:saveAgentInfo'(_id, agentData, agentDepartments) {
- const uid = Meteor.userId();
- if (!uid || !(await hasPermissionAsync(uid, 'manage-livechat-agents'))) {
+ check(_id, String);
+ check(agentData, Object);
+ check(agentDepartments, [String]);
+
+ const user = await Meteor.userAsync();
+ if (!user || !(await hasPermissionAsync(user._id, 'manage-livechat-agents'))) {
throw new Meteor.Error('error-not-allowed', 'Not allowed', {
method: 'livechat:saveAgentInfo',
});
}
- const user = await Users.findOneById(_id);
- if (!user || !(await hasRoleAsync(_id, 'livechat-agent'))) {
+ if (!(await hasRoleAsync(_id, 'livechat-agent'))) {
throw new Meteor.Error('error-user-is-not-agent', 'User is not a livechat agent', {
method: 'livechat:saveAgentInfo',
});
diff --git a/apps/meteor/app/markdown/lib/hljs.js b/apps/meteor/app/markdown/lib/hljs.js
index 2ddfc675646d4..1acac1409f38b 100644
--- a/apps/meteor/app/markdown/lib/hljs.js
+++ b/apps/meteor/app/markdown/lib/hljs.js
@@ -1,7 +1,7 @@
-import hljs from 'hljs9/lib/highlight';
-import clean from 'hljs9/lib/languages/clean';
-import javascript from 'hljs9/lib/languages/javascript';
-import markdown from 'hljs9/lib/languages/markdown';
+import hljs from 'highlight.js/lib/core';
+import clean from 'highlight.js/lib/languages/clean';
+import javascript from 'highlight.js/lib/languages/javascript';
+import markdown from 'highlight.js/lib/languages/markdown';
hljs.registerLanguage('markdown', markdown);
hljs.registerLanguage('clean', clean);
@@ -10,351 +10,343 @@ hljs.registerLanguage('javascript', javascript);
export const register = async (lang) => {
switch (lang) {
case 'onec':
- return hljs.registerLanguage('onec', (await import('hljs9/lib/languages/1c')).default);
+ return hljs.registerLanguage('onec', (await import('highlight.js/lib/languages/1c')).default);
case 'abnf':
- return hljs.registerLanguage('abnf', (await import('hljs9/lib/languages/abnf')).default);
+ return hljs.registerLanguage('abnf', (await import('highlight.js/lib/languages/abnf')).default);
case 'accesslog':
- return hljs.registerLanguage('accesslog', (await import('hljs9/lib/languages/accesslog')).default);
+ return hljs.registerLanguage('accesslog', (await import('highlight.js/lib/languages/accesslog')).default);
case 'actionscript':
- return hljs.registerLanguage('actionscript', (await import('hljs9/lib/languages/actionscript')).default);
+ return hljs.registerLanguage('actionscript', (await import('highlight.js/lib/languages/actionscript')).default);
case 'ada':
- return hljs.registerLanguage('ada', (await import('hljs9/lib/languages/ada')).default);
+ return hljs.registerLanguage('ada', (await import('highlight.js/lib/languages/ada')).default);
case 'apache':
- return hljs.registerLanguage('apache', (await import('hljs9/lib/languages/apache')).default);
+ return hljs.registerLanguage('apache', (await import('highlight.js/lib/languages/apache')).default);
case 'applescript':
- return hljs.registerLanguage('applescript', (await import('hljs9/lib/languages/applescript')).default);
+ return hljs.registerLanguage('applescript', (await import('highlight.js/lib/languages/applescript')).default);
case 'arduino':
- return hljs.registerLanguage('arduino', (await import('hljs9/lib/languages/arduino')).default);
+ return hljs.registerLanguage('arduino', (await import('highlight.js/lib/languages/arduino')).default);
case 'armasm':
- return hljs.registerLanguage('armasm', (await import('hljs9/lib/languages/armasm')).default);
+ return hljs.registerLanguage('armasm', (await import('highlight.js/lib/languages/armasm')).default);
case 'asciidoc':
- return hljs.registerLanguage('asciidoc', (await import('hljs9/lib/languages/asciidoc')).default);
+ return hljs.registerLanguage('asciidoc', (await import('highlight.js/lib/languages/asciidoc')).default);
case 'aspectj':
- return hljs.registerLanguage('aspectj', (await import('hljs9/lib/languages/aspectj')).default);
+ return hljs.registerLanguage('aspectj', (await import('highlight.js/lib/languages/aspectj')).default);
case 'autohotkey':
- return hljs.registerLanguage('autohotkey', (await import('hljs9/lib/languages/autohotkey')).default);
+ return hljs.registerLanguage('autohotkey', (await import('highlight.js/lib/languages/autohotkey')).default);
case 'autoit':
- return hljs.registerLanguage('autoit', (await import('hljs9/lib/languages/autoit')).default);
+ return hljs.registerLanguage('autoit', (await import('highlight.js/lib/languages/autoit')).default);
case 'avrasm':
- return hljs.registerLanguage('avrasm', (await import('hljs9/lib/languages/avrasm')).default);
+ return hljs.registerLanguage('avrasm', (await import('highlight.js/lib/languages/avrasm')).default);
case 'awk':
- return hljs.registerLanguage('awk', (await import('hljs9/lib/languages/awk')).default);
+ return hljs.registerLanguage('awk', (await import('highlight.js/lib/languages/awk')).default);
case 'axapta':
- return hljs.registerLanguage('axapta', (await import('hljs9/lib/languages/axapta')).default);
+ return hljs.registerLanguage('axapta', (await import('highlight.js/lib/languages/axapta')).default);
case 'bash':
- return hljs.registerLanguage('bash', (await import('hljs9/lib/languages/bash')).default);
+ return hljs.registerLanguage('bash', (await import('highlight.js/lib/languages/bash')).default);
case 'basic':
- return hljs.registerLanguage('basic', (await import('hljs9/lib/languages/basic')).default);
+ return hljs.registerLanguage('basic', (await import('highlight.js/lib/languages/basic')).default);
case 'bnf':
- return hljs.registerLanguage('bnf', (await import('hljs9/lib/languages/bnf')).default);
+ return hljs.registerLanguage('bnf', (await import('highlight.js/lib/languages/bnf')).default);
case 'brainfuck':
- return hljs.registerLanguage('brainfuck', (await import('hljs9/lib/languages/brainfuck')).default);
+ return hljs.registerLanguage('brainfuck', (await import('highlight.js/lib/languages/brainfuck')).default);
case 'cal':
- return hljs.registerLanguage('cal', (await import('hljs9/lib/languages/cal')).default);
+ return hljs.registerLanguage('cal', (await import('highlight.js/lib/languages/cal')).default);
case 'capnproto':
- return hljs.registerLanguage('capnproto', (await import('hljs9/lib/languages/capnproto')).default);
+ return hljs.registerLanguage('capnproto', (await import('highlight.js/lib/languages/capnproto')).default);
case 'ceylon':
- return hljs.registerLanguage('ceylon', (await import('hljs9/lib/languages/ceylon')).default);
+ return hljs.registerLanguage('ceylon', (await import('highlight.js/lib/languages/ceylon')).default);
case 'clean':
- return hljs.registerLanguage('clean', (await import('hljs9/lib/languages/clean')).default);
+ return hljs.registerLanguage('clean', (await import('highlight.js/lib/languages/clean')).default);
case 'clojure':
- return hljs.registerLanguage('clojure', (await import('hljs9/lib/languages/clojure')).default);
+ return hljs.registerLanguage('clojure', (await import('highlight.js/lib/languages/clojure')).default);
case 'clojure-repl':
- return hljs.registerLanguage('clojure-repl', (await import('hljs9/lib/languages/clojure-repl')).default);
+ return hljs.registerLanguage('clojure-repl', (await import('highlight.js/lib/languages/clojure-repl')).default);
case 'cmake':
- return hljs.registerLanguage('cmake', (await import('hljs9/lib/languages/cmake')).default);
+ return hljs.registerLanguage('cmake', (await import('highlight.js/lib/languages/cmake')).default);
case 'coffeescript':
- return hljs.registerLanguage('coffeescript', (await import('hljs9/lib/languages/coffeescript')).default);
+ return hljs.registerLanguage('coffeescript', (await import('highlight.js/lib/languages/coffeescript')).default);
case 'coq':
- return hljs.registerLanguage('coq', (await import('hljs9/lib/languages/coq')).default);
+ return hljs.registerLanguage('coq', (await import('highlight.js/lib/languages/coq')).default);
case 'cos':
- return hljs.registerLanguage('cos', (await import('hljs9/lib/languages/cos')).default);
+ return hljs.registerLanguage('cos', (await import('highlight.js/lib/languages/cos')).default);
case 'cpp':
- return hljs.registerLanguage('cpp', (await import('hljs9/lib/languages/cpp')).default);
+ return hljs.registerLanguage('cpp', (await import('highlight.js/lib/languages/cpp')).default);
case 'crmsh':
- return hljs.registerLanguage('crmsh', (await import('hljs9/lib/languages/crmsh')).default);
+ return hljs.registerLanguage('crmsh', (await import('highlight.js/lib/languages/crmsh')).default);
case 'crystal':
- return hljs.registerLanguage('crystal', (await import('hljs9/lib/languages/crystal')).default);
- case 'cs':
- return hljs.registerLanguage('cs', (await import('hljs9/lib/languages/cs')).default);
+ return hljs.registerLanguage('crystal', (await import('highlight.js/lib/languages/crystal')).default);
case 'csp':
- return hljs.registerLanguage('csp', (await import('hljs9/lib/languages/csp')).default);
+ return hljs.registerLanguage('csp', (await import('highlight.js/lib/languages/csp')).default);
case 'css':
- return hljs.registerLanguage('css', (await import('hljs9/lib/languages/css')).default);
+ return hljs.registerLanguage('css', (await import('highlight.js/lib/languages/css')).default);
case 'd':
- return hljs.registerLanguage('d', (await import('hljs9/lib/languages/d')).default);
+ return hljs.registerLanguage('d', (await import('highlight.js/lib/languages/d')).default);
case 'dart':
- return hljs.registerLanguage('dart', (await import('hljs9/lib/languages/dart')).default);
+ return hljs.registerLanguage('dart', (await import('highlight.js/lib/languages/dart')).default);
case 'delphi':
- return hljs.registerLanguage('delphi', (await import('hljs9/lib/languages/delphi')).default);
+ return hljs.registerLanguage('delphi', (await import('highlight.js/lib/languages/delphi')).default);
case 'diff':
- return hljs.registerLanguage('diff', (await import('hljs9/lib/languages/diff')).default);
+ return hljs.registerLanguage('diff', (await import('highlight.js/lib/languages/diff')).default);
case 'django':
- return hljs.registerLanguage('django', (await import('hljs9/lib/languages/django')).default);
+ return hljs.registerLanguage('django', (await import('highlight.js/lib/languages/django')).default);
case 'dns':
- return hljs.registerLanguage('dns', (await import('hljs9/lib/languages/dns')).default);
+ return hljs.registerLanguage('dns', (await import('highlight.js/lib/languages/dns')).default);
case 'dockerfile':
- return hljs.registerLanguage('dockerfile', (await import('hljs9/lib/languages/dockerfile')).default);
+ return hljs.registerLanguage('dockerfile', (await import('highlight.js/lib/languages/dockerfile')).default);
case 'dos':
- return hljs.registerLanguage('dos', (await import('hljs9/lib/languages/dos')).default);
+ return hljs.registerLanguage('dos', (await import('highlight.js/lib/languages/dos')).default);
case 'dsconfig':
- return hljs.registerLanguage('dsconfig', (await import('hljs9/lib/languages/dsconfig')).default);
+ return hljs.registerLanguage('dsconfig', (await import('highlight.js/lib/languages/dsconfig')).default);
case 'dts':
- return hljs.registerLanguage('dts', (await import('hljs9/lib/languages/dts')).default);
+ return hljs.registerLanguage('dts', (await import('highlight.js/lib/languages/dts')).default);
case 'dust':
- return hljs.registerLanguage('dust', (await import('hljs9/lib/languages/dust')).default);
+ return hljs.registerLanguage('dust', (await import('highlight.js/lib/languages/dust')).default);
case 'ebnf':
- return hljs.registerLanguage('ebnf', (await import('hljs9/lib/languages/ebnf')).default);
+ return hljs.registerLanguage('ebnf', (await import('highlight.js/lib/languages/ebnf')).default);
case 'elixir':
- return hljs.registerLanguage('elixir', (await import('hljs9/lib/languages/elixir')).default);
+ return hljs.registerLanguage('elixir', (await import('highlight.js/lib/languages/elixir')).default);
case 'elm':
- return hljs.registerLanguage('elm', (await import('hljs9/lib/languages/elm')).default);
+ return hljs.registerLanguage('elm', (await import('highlight.js/lib/languages/elm')).default);
case 'erb':
- return hljs.registerLanguage('erb', (await import('hljs9/lib/languages/erb')).default);
+ return hljs.registerLanguage('erb', (await import('highlight.js/lib/languages/erb')).default);
case 'erlang':
- return hljs.registerLanguage('erlang', (await import('hljs9/lib/languages/erlang')).default);
+ return hljs.registerLanguage('erlang', (await import('highlight.js/lib/languages/erlang')).default);
case 'excel':
- return hljs.registerLanguage('excel', (await import('hljs9/lib/languages/excel')).default);
+ return hljs.registerLanguage('excel', (await import('highlight.js/lib/languages/excel')).default);
case 'fix':
- return hljs.registerLanguage('fix', (await import('hljs9/lib/languages/fix')).default);
+ return hljs.registerLanguage('fix', (await import('highlight.js/lib/languages/fix')).default);
case 'flix':
- return hljs.registerLanguage('flix', (await import('hljs9/lib/languages/flix')).default);
+ return hljs.registerLanguage('flix', (await import('highlight.js/lib/languages/flix')).default);
case 'fortran':
- return hljs.registerLanguage('fortran', (await import('hljs9/lib/languages/fortran')).default);
+ return hljs.registerLanguage('fortran', (await import('highlight.js/lib/languages/fortran')).default);
case 'fsharp':
- return hljs.registerLanguage('fsharp', (await import('hljs9/lib/languages/fsharp')).default);
+ return hljs.registerLanguage('fsharp', (await import('highlight.js/lib/languages/fsharp')).default);
case 'gams':
- return hljs.registerLanguage('gams', (await import('hljs9/lib/languages/gams')).default);
+ return hljs.registerLanguage('gams', (await import('highlight.js/lib/languages/gams')).default);
case 'gauss':
- return hljs.registerLanguage('gauss', (await import('hljs9/lib/languages/gauss')).default);
+ return hljs.registerLanguage('gauss', (await import('highlight.js/lib/languages/gauss')).default);
case 'gcode':
- return hljs.registerLanguage('gcode', (await import('hljs9/lib/languages/gcode')).default);
+ return hljs.registerLanguage('gcode', (await import('highlight.js/lib/languages/gcode')).default);
case 'gherkin':
- return hljs.registerLanguage('gherkin', (await import('hljs9/lib/languages/gherkin')).default);
+ return hljs.registerLanguage('gherkin', (await import('highlight.js/lib/languages/gherkin')).default);
case 'glsl':
- return hljs.registerLanguage('glsl', (await import('hljs9/lib/languages/glsl')).default);
+ return hljs.registerLanguage('glsl', (await import('highlight.js/lib/languages/glsl')).default);
case 'go':
- return hljs.registerLanguage('go', (await import('hljs9/lib/languages/go')).default);
+ return hljs.registerLanguage('go', (await import('highlight.js/lib/languages/go')).default);
case 'golo':
- return hljs.registerLanguage('golo', (await import('hljs9/lib/languages/golo')).default);
+ return hljs.registerLanguage('golo', (await import('highlight.js/lib/languages/golo')).default);
case 'gradle':
- return hljs.registerLanguage('gradle', (await import('hljs9/lib/languages/gradle')).default);
+ return hljs.registerLanguage('gradle', (await import('highlight.js/lib/languages/gradle')).default);
case 'groovy':
- return hljs.registerLanguage('groovy', (await import('hljs9/lib/languages/groovy')).default);
+ return hljs.registerLanguage('groovy', (await import('highlight.js/lib/languages/groovy')).default);
case 'haml':
- return hljs.registerLanguage('haml', (await import('hljs9/lib/languages/haml')).default);
+ return hljs.registerLanguage('haml', (await import('highlight.js/lib/languages/haml')).default);
case 'handlebars':
- return hljs.registerLanguage('handlebars', (await import('hljs9/lib/languages/handlebars')).default);
+ return hljs.registerLanguage('handlebars', (await import('highlight.js/lib/languages/handlebars')).default);
case 'haskell':
- return hljs.registerLanguage('haskell', (await import('hljs9/lib/languages/haskell')).default);
+ return hljs.registerLanguage('haskell', (await import('highlight.js/lib/languages/haskell')).default);
case 'haxe':
- return hljs.registerLanguage('haxe', (await import('hljs9/lib/languages/haxe')).default);
+ return hljs.registerLanguage('haxe', (await import('highlight.js/lib/languages/haxe')).default);
case 'hsp':
- return hljs.registerLanguage('hsp', (await import('hljs9/lib/languages/hsp')).default);
- case 'htmlbars':
- return hljs.registerLanguage('htmlbars', (await import('hljs9/lib/languages/htmlbars')).default);
+ return hljs.registerLanguage('hsp', (await import('highlight.js/lib/languages/hsp')).default);
case 'http':
- return hljs.registerLanguage('http', (await import('hljs9/lib/languages/http')).default);
+ return hljs.registerLanguage('http', (await import('highlight.js/lib/languages/http')).default);
case 'hy':
- return hljs.registerLanguage('hy', (await import('hljs9/lib/languages/hy')).default);
+ return hljs.registerLanguage('hy', (await import('highlight.js/lib/languages/hy')).default);
case 'inform7':
- return hljs.registerLanguage('inform7', (await import('hljs9/lib/languages/inform7')).default);
+ return hljs.registerLanguage('inform7', (await import('highlight.js/lib/languages/inform7')).default);
case 'ini':
- return hljs.registerLanguage('ini', (await import('hljs9/lib/languages/ini')).default);
+ return hljs.registerLanguage('ini', (await import('highlight.js/lib/languages/ini')).default);
case 'irpf90':
- return hljs.registerLanguage('irpf90', (await import('hljs9/lib/languages/irpf90')).default);
+ return hljs.registerLanguage('irpf90', (await import('highlight.js/lib/languages/irpf90')).default);
case 'java':
- return hljs.registerLanguage('java', (await import('hljs9/lib/languages/java')).default);
+ return hljs.registerLanguage('java', (await import('highlight.js/lib/languages/java')).default);
case 'javascript':
- return hljs.registerLanguage('javascript', (await import('hljs9/lib/languages/javascript')).default);
+ return hljs.registerLanguage('javascript', (await import('highlight.js/lib/languages/javascript')).default);
case 'jboss-cli':
- return hljs.registerLanguage('jboss-cli', (await import('hljs9/lib/languages/jboss-cli')).default);
+ return hljs.registerLanguage('jboss-cli', (await import('highlight.js/lib/languages/jboss-cli')).default);
case 'json':
- return hljs.registerLanguage('json', (await import('hljs9/lib/languages/json')).default);
+ return hljs.registerLanguage('json', (await import('highlight.js/lib/languages/json')).default);
case 'julia':
- return hljs.registerLanguage('julia', (await import('hljs9/lib/languages/julia')).default);
+ return hljs.registerLanguage('julia', (await import('highlight.js/lib/languages/julia')).default);
case 'julia-repl':
- return hljs.registerLanguage('julia-repl', (await import('hljs9/lib/languages/julia-repl')).default);
+ return hljs.registerLanguage('julia-repl', (await import('highlight.js/lib/languages/julia-repl')).default);
case 'kotlin':
- return hljs.registerLanguage('kotlin', (await import('hljs9/lib/languages/kotlin')).default);
+ return hljs.registerLanguage('kotlin', (await import('highlight.js/lib/languages/kotlin')).default);
case 'lasso':
- return hljs.registerLanguage('lasso', (await import('hljs9/lib/languages/lasso')).default);
+ return hljs.registerLanguage('lasso', (await import('highlight.js/lib/languages/lasso')).default);
case 'ldif':
- return hljs.registerLanguage('ldif', (await import('hljs9/lib/languages/ldif')).default);
+ return hljs.registerLanguage('ldif', (await import('highlight.js/lib/languages/ldif')).default);
case 'leaf':
- return hljs.registerLanguage('leaf', (await import('hljs9/lib/languages/leaf')).default);
+ return hljs.registerLanguage('leaf', (await import('highlight.js/lib/languages/leaf')).default);
case 'less':
- return hljs.registerLanguage('less', (await import('hljs9/lib/languages/less')).default);
+ return hljs.registerLanguage('less', (await import('highlight.js/lib/languages/less')).default);
case 'lisp':
- return hljs.registerLanguage('lisp', (await import('hljs9/lib/languages/lisp')).default);
+ return hljs.registerLanguage('lisp', (await import('highlight.js/lib/languages/lisp')).default);
case 'livecodeserver':
- return hljs.registerLanguage('livecodeserver', (await import('hljs9/lib/languages/livecodeserver')).default);
+ return hljs.registerLanguage('livecodeserver', (await import('highlight.js/lib/languages/livecodeserver')).default);
case 'livescript':
- return hljs.registerLanguage('livescript', (await import('hljs9/lib/languages/livescript')).default);
+ return hljs.registerLanguage('livescript', (await import('highlight.js/lib/languages/livescript')).default);
case 'llvm':
- return hljs.registerLanguage('llvm', (await import('hljs9/lib/languages/llvm')).default);
+ return hljs.registerLanguage('llvm', (await import('highlight.js/lib/languages/llvm')).default);
case 'lsl':
- return hljs.registerLanguage('lsl', (await import('hljs9/lib/languages/lsl')).default);
+ return hljs.registerLanguage('lsl', (await import('highlight.js/lib/languages/lsl')).default);
case 'lua':
- return hljs.registerLanguage('lua', (await import('hljs9/lib/languages/lua')).default);
+ return hljs.registerLanguage('lua', (await import('highlight.js/lib/languages/lua')).default);
case 'makefile':
- return hljs.registerLanguage('makefile', (await import('hljs9/lib/languages/makefile')).default);
+ return hljs.registerLanguage('makefile', (await import('highlight.js/lib/languages/makefile')).default);
case 'markdown':
- return hljs.registerLanguage('markdown', (await import('hljs9/lib/languages/markdown')).default);
+ return hljs.registerLanguage('markdown', (await import('highlight.js/lib/languages/markdown')).default);
case 'mathematica':
- return hljs.registerLanguage('mathematica', (await import('hljs9/lib/languages/mathematica')).default);
+ return hljs.registerLanguage('mathematica', (await import('highlight.js/lib/languages/mathematica')).default);
case 'matlab':
- return hljs.registerLanguage('matlab', (await import('hljs9/lib/languages/matlab')).default);
+ return hljs.registerLanguage('matlab', (await import('highlight.js/lib/languages/matlab')).default);
case 'maxima':
- return hljs.registerLanguage('maxima', (await import('hljs9/lib/languages/maxima')).default);
+ return hljs.registerLanguage('maxima', (await import('highlight.js/lib/languages/maxima')).default);
case 'mel':
- return hljs.registerLanguage('mel', (await import('hljs9/lib/languages/mel')).default);
+ return hljs.registerLanguage('mel', (await import('highlight.js/lib/languages/mel')).default);
case 'mercury':
- return hljs.registerLanguage('mercury', (await import('hljs9/lib/languages/mercury')).default);
+ return hljs.registerLanguage('mercury', (await import('highlight.js/lib/languages/mercury')).default);
case 'mipsasm':
- return hljs.registerLanguage('mipsasm', (await import('hljs9/lib/languages/mipsasm')).default);
+ return hljs.registerLanguage('mipsasm', (await import('highlight.js/lib/languages/mipsasm')).default);
case 'mizar':
- return hljs.registerLanguage('mizar', (await import('hljs9/lib/languages/mizar')).default);
+ return hljs.registerLanguage('mizar', (await import('highlight.js/lib/languages/mizar')).default);
case 'perl':
- return hljs.registerLanguage('perl', (await import('hljs9/lib/languages/perl')).default);
+ return hljs.registerLanguage('perl', (await import('highlight.js/lib/languages/perl')).default);
case 'mojolicious':
- return hljs.registerLanguage('mojolicious', (await import('hljs9/lib/languages/mojolicious')).default);
+ return hljs.registerLanguage('mojolicious', (await import('highlight.js/lib/languages/mojolicious')).default);
case 'monkey':
- return hljs.registerLanguage('monkey', (await import('hljs9/lib/languages/monkey')).default);
+ return hljs.registerLanguage('monkey', (await import('highlight.js/lib/languages/monkey')).default);
case 'moonscript':
- return hljs.registerLanguage('moonscript', (await import('hljs9/lib/languages/moonscript')).default);
+ return hljs.registerLanguage('moonscript', (await import('highlight.js/lib/languages/moonscript')).default);
case 'n1ql':
- return hljs.registerLanguage('n1ql', (await import('hljs9/lib/languages/n1ql')).default);
+ return hljs.registerLanguage('n1ql', (await import('highlight.js/lib/languages/n1ql')).default);
case 'nginx':
- return hljs.registerLanguage('nginx', (await import('hljs9/lib/languages/nginx')).default);
- case 'nimrod':
- return hljs.registerLanguage('nimrod', (await import('hljs9/lib/languages/nimrod')).default);
+ return hljs.registerLanguage('nginx', (await import('highlight.js/lib/languages/nginx')).default);
case 'nix':
- return hljs.registerLanguage('nix', (await import('hljs9/lib/languages/nix')).default);
+ return hljs.registerLanguage('nix', (await import('highlight.js/lib/languages/nix')).default);
case 'nsis':
- return hljs.registerLanguage('nsis', (await import('hljs9/lib/languages/nsis')).default);
+ return hljs.registerLanguage('nsis', (await import('highlight.js/lib/languages/nsis')).default);
case 'objectivec':
- return hljs.registerLanguage('objectivec', (await import('hljs9/lib/languages/objectivec')).default);
+ return hljs.registerLanguage('objectivec', (await import('highlight.js/lib/languages/objectivec')).default);
case 'ocaml':
- return hljs.registerLanguage('ocaml', (await import('hljs9/lib/languages/ocaml')).default);
+ return hljs.registerLanguage('ocaml', (await import('highlight.js/lib/languages/ocaml')).default);
case 'openscad':
- return hljs.registerLanguage('openscad', (await import('hljs9/lib/languages/openscad')).default);
+ return hljs.registerLanguage('openscad', (await import('highlight.js/lib/languages/openscad')).default);
case 'oxygene':
- return hljs.registerLanguage('oxygene', (await import('hljs9/lib/languages/oxygene')).default);
+ return hljs.registerLanguage('oxygene', (await import('highlight.js/lib/languages/oxygene')).default);
case 'parser3':
- return hljs.registerLanguage('parser3', (await import('hljs9/lib/languages/parser3')).default);
+ return hljs.registerLanguage('parser3', (await import('highlight.js/lib/languages/parser3')).default);
case 'pf':
- return hljs.registerLanguage('pf', (await import('hljs9/lib/languages/pf')).default);
+ return hljs.registerLanguage('pf', (await import('highlight.js/lib/languages/pf')).default);
case 'php':
- return hljs.registerLanguage('php', (await import('hljs9/lib/languages/php')).default);
+ return hljs.registerLanguage('php', (await import('highlight.js/lib/languages/php')).default);
case 'pony':
- return hljs.registerLanguage('pony', (await import('hljs9/lib/languages/pony')).default);
+ return hljs.registerLanguage('pony', (await import('highlight.js/lib/languages/pony')).default);
case 'powershell':
- return hljs.registerLanguage('powershell', (await import('hljs9/lib/languages/powershell')).default);
+ return hljs.registerLanguage('powershell', (await import('highlight.js/lib/languages/powershell')).default);
case 'processing':
- return hljs.registerLanguage('processing', (await import('hljs9/lib/languages/processing')).default);
+ return hljs.registerLanguage('processing', (await import('highlight.js/lib/languages/processing')).default);
case 'profile':
- return hljs.registerLanguage('profile', (await import('hljs9/lib/languages/profile')).default);
+ return hljs.registerLanguage('profile', (await import('highlight.js/lib/languages/profile')).default);
case 'prolog':
- return hljs.registerLanguage('prolog', (await import('hljs9/lib/languages/prolog')).default);
+ return hljs.registerLanguage('prolog', (await import('highlight.js/lib/languages/prolog')).default);
case 'protobuf':
- return hljs.registerLanguage('protobuf', (await import('hljs9/lib/languages/protobuf')).default);
+ return hljs.registerLanguage('protobuf', (await import('highlight.js/lib/languages/protobuf')).default);
case 'puppet':
- return hljs.registerLanguage('puppet', (await import('hljs9/lib/languages/puppet')).default);
+ return hljs.registerLanguage('puppet', (await import('highlight.js/lib/languages/puppet')).default);
case 'purebasic':
- return hljs.registerLanguage('purebasic', (await import('hljs9/lib/languages/purebasic')).default);
+ return hljs.registerLanguage('purebasic', (await import('highlight.js/lib/languages/purebasic')).default);
case 'python':
- return hljs.registerLanguage('python', (await import('hljs9/lib/languages/python')).default);
+ return hljs.registerLanguage('python', (await import('highlight.js/lib/languages/python')).default);
case 'q':
- return hljs.registerLanguage('q', (await import('hljs9/lib/languages/q')).default);
+ return hljs.registerLanguage('q', (await import('highlight.js/lib/languages/q')).default);
case 'qml':
- return hljs.registerLanguage('qml', (await import('hljs9/lib/languages/qml')).default);
+ return hljs.registerLanguage('qml', (await import('highlight.js/lib/languages/qml')).default);
case 'r':
- return hljs.registerLanguage('r', (await import('hljs9/lib/languages/r')).default);
+ return hljs.registerLanguage('r', (await import('highlight.js/lib/languages/r')).default);
case 'rib':
- return hljs.registerLanguage('rib', (await import('hljs9/lib/languages/rib')).default);
+ return hljs.registerLanguage('rib', (await import('highlight.js/lib/languages/rib')).default);
case 'roboconf':
- return hljs.registerLanguage('roboconf', (await import('hljs9/lib/languages/roboconf')).default);
+ return hljs.registerLanguage('roboconf', (await import('highlight.js/lib/languages/roboconf')).default);
case 'rsl':
- return hljs.registerLanguage('rsl', (await import('hljs9/lib/languages/rsl')).default);
+ return hljs.registerLanguage('rsl', (await import('highlight.js/lib/languages/rsl')).default);
case 'ruleslanguage':
- return hljs.registerLanguage('ruleslanguage', (await import('hljs9/lib/languages/ruleslanguage')).default);
+ return hljs.registerLanguage('ruleslanguage', (await import('highlight.js/lib/languages/ruleslanguage')).default);
case 'rust':
- return hljs.registerLanguage('rust', (await import('hljs9/lib/languages/rust')).default);
+ return hljs.registerLanguage('rust', (await import('highlight.js/lib/languages/rust')).default);
case 'scala':
- return hljs.registerLanguage('scala', (await import('hljs9/lib/languages/scala')).default);
+ return hljs.registerLanguage('scala', (await import('highlight.js/lib/languages/scala')).default);
case 'scheme':
- return hljs.registerLanguage('scheme', (await import('hljs9/lib/languages/scheme')).default);
+ return hljs.registerLanguage('scheme', (await import('highlight.js/lib/languages/scheme')).default);
case 'scilab':
- return hljs.registerLanguage('scilab', (await import('hljs9/lib/languages/scilab')).default);
+ return hljs.registerLanguage('scilab', (await import('highlight.js/lib/languages/scilab')).default);
case 'scss':
- return hljs.registerLanguage('scss', (await import('hljs9/lib/languages/scss')).default);
+ return hljs.registerLanguage('scss', (await import('highlight.js/lib/languages/scss')).default);
case 'shell':
- return hljs.registerLanguage('shell', (await import('hljs9/lib/languages/shell')).default);
+ return hljs.registerLanguage('shell', (await import('highlight.js/lib/languages/shell')).default);
case 'smali':
- return hljs.registerLanguage('smali', (await import('hljs9/lib/languages/smali')).default);
+ return hljs.registerLanguage('smali', (await import('highlight.js/lib/languages/smali')).default);
case 'smalltalk':
- return hljs.registerLanguage('smalltalk', (await import('hljs9/lib/languages/smalltalk')).default);
+ return hljs.registerLanguage('smalltalk', (await import('highlight.js/lib/languages/smalltalk')).default);
case 'sml':
- return hljs.registerLanguage('sml', (await import('hljs9/lib/languages/sml')).default);
+ return hljs.registerLanguage('sml', (await import('highlight.js/lib/languages/sml')).default);
case 'sqf':
- return hljs.registerLanguage('sqf', (await import('hljs9/lib/languages/sqf')).default);
+ return hljs.registerLanguage('sqf', (await import('highlight.js/lib/languages/sqf')).default);
case 'sql':
- return hljs.registerLanguage('sql', (await import('hljs9/lib/languages/sql')).default);
+ return hljs.registerLanguage('sql', (await import('highlight.js/lib/languages/sql')).default);
case 'stan':
- return hljs.registerLanguage('stan', (await import('hljs9/lib/languages/stan')).default);
+ return hljs.registerLanguage('stan', (await import('highlight.js/lib/languages/stan')).default);
case 'stata':
- return hljs.registerLanguage('stata', (await import('hljs9/lib/languages/stata')).default);
+ return hljs.registerLanguage('stata', (await import('highlight.js/lib/languages/stata')).default);
case 'step21':
- return hljs.registerLanguage('step21', (await import('hljs9/lib/languages/step21')).default);
+ return hljs.registerLanguage('step21', (await import('highlight.js/lib/languages/step21')).default);
case 'stylus':
- return hljs.registerLanguage('stylus', (await import('hljs9/lib/languages/stylus')).default);
+ return hljs.registerLanguage('stylus', (await import('highlight.js/lib/languages/stylus')).default);
case 'subunit':
- return hljs.registerLanguage('subunit', (await import('hljs9/lib/languages/subunit')).default);
+ return hljs.registerLanguage('subunit', (await import('highlight.js/lib/languages/subunit')).default);
case 'swift':
- return hljs.registerLanguage('swift', (await import('hljs9/lib/languages/swift')).default);
+ return hljs.registerLanguage('swift', (await import('highlight.js/lib/languages/swift')).default);
case 'taggerscript':
- return hljs.registerLanguage('taggerscript', (await import('hljs9/lib/languages/taggerscript')).default);
+ return hljs.registerLanguage('taggerscript', (await import('highlight.js/lib/languages/taggerscript')).default);
case 'yaml':
- return hljs.registerLanguage('yaml', (await import('hljs9/lib/languages/yaml')).default);
+ return hljs.registerLanguage('yaml', (await import('highlight.js/lib/languages/yaml')).default);
case 'tap':
- return hljs.registerLanguage('tap', (await import('hljs9/lib/languages/tap')).default);
+ return hljs.registerLanguage('tap', (await import('highlight.js/lib/languages/tap')).default);
case 'tcl':
- return hljs.registerLanguage('tcl', (await import('hljs9/lib/languages/tcl')).default);
- case 'tex':
- return hljs.registerLanguage('tex', (await import('hljs9/lib/languages/tex')).default);
+ return hljs.registerLanguage('tcl', (await import('highlight.js/lib/languages/tcl')).default);
case 'thrift':
- return hljs.registerLanguage('thrift', (await import('hljs9/lib/languages/thrift')).default);
+ return hljs.registerLanguage('thrift', (await import('highlight.js/lib/languages/thrift')).default);
case 'tp':
- return hljs.registerLanguage('tp', (await import('hljs9/lib/languages/tp')).default);
+ return hljs.registerLanguage('tp', (await import('highlight.js/lib/languages/tp')).default);
case 'twig':
- return hljs.registerLanguage('twig', (await import('hljs9/lib/languages/twig')).default);
+ return hljs.registerLanguage('twig', (await import('highlight.js/lib/languages/twig')).default);
case 'typescript':
- return hljs.registerLanguage('typescript', (await import('hljs9/lib/languages/typescript')).default);
+ return hljs.registerLanguage('typescript', (await import('highlight.js/lib/languages/typescript')).default);
case 'vala':
- return hljs.registerLanguage('vala', (await import('hljs9/lib/languages/vala')).default);
+ return hljs.registerLanguage('vala', (await import('highlight.js/lib/languages/vala')).default);
case 'vbnet':
- return hljs.registerLanguage('vbnet', (await import('hljs9/lib/languages/vbnet')).default);
+ return hljs.registerLanguage('vbnet', (await import('highlight.js/lib/languages/vbnet')).default);
case 'vbscript':
- return hljs.registerLanguage('vbscript', (await import('hljs9/lib/languages/vbscript')).default);
+ return hljs.registerLanguage('vbscript', (await import('highlight.js/lib/languages/vbscript')).default);
case 'vbscript-html':
- return hljs.registerLanguage('vbscript-html(', (await import('hljs9/lib/languages/vbscript-html')).default);
+ return hljs.registerLanguage('vbscript-html(', (await import('highlight.js/lib/languages/vbscript-html')).default);
case 'verilog':
- return hljs.registerLanguage('verilog', (await import('hljs9/lib/languages/verilog')).default);
+ return hljs.registerLanguage('verilog', (await import('highlight.js/lib/languages/verilog')).default);
case 'vhdl':
- return hljs.registerLanguage('vhdl', (await import('hljs9/lib/languages/vhdl')).default);
+ return hljs.registerLanguage('vhdl', (await import('highlight.js/lib/languages/vhdl')).default);
case 'vim':
- return hljs.registerLanguage('vim', (await import('hljs9/lib/languages/vim')).default);
+ return hljs.registerLanguage('vim', (await import('highlight.js/lib/languages/vim')).default);
case 'x86asm':
- return hljs.registerLanguage('x86asm', (await import('hljs9/lib/languages/x86asm')).default);
+ return hljs.registerLanguage('x86asm', (await import('highlight.js/lib/languages/x86asm')).default);
case 'xl':
- return hljs.registerLanguage('xl', (await import('hljs9/lib/languages/xl')).default);
+ return hljs.registerLanguage('xl', (await import('highlight.js/lib/languages/xl')).default);
case 'xquery':
- return hljs.registerLanguage('xquery', (await import('hljs9/lib/languages/xquery')).default);
+ return hljs.registerLanguage('xquery', (await import('highlight.js/lib/languages/xquery')).default);
case 'zephir':
- return hljs.registerLanguage('zephir', (await import('hljs9/lib/languages/zephir')).default);
+ return hljs.registerLanguage('zephir', (await import('highlight.js/lib/languages/zephir')).default);
default:
- return hljs.registerLanguage('plaintext', (await import('hljs9/lib/languages/plaintext')).default);
+ return hljs.registerLanguage('plaintext', (await import('highlight.js/lib/languages/plaintext')).default);
}
};
diff --git a/apps/meteor/app/statistics/server/lib/getEEStatistics.ts b/apps/meteor/app/statistics/server/lib/getEEStatistics.ts
index 6511feeabb77c..0e04a4fab57b7 100644
--- a/apps/meteor/app/statistics/server/lib/getEEStatistics.ts
+++ b/apps/meteor/app/statistics/server/lib/getEEStatistics.ts
@@ -93,13 +93,8 @@ async function getEEStatistics(): Promise {
}),
);
- // Number of PDF transcript requested
- statsPms.push(
- LivechatRooms.countRoomsWithPdfTranscriptRequested().then((count) => {
- statistics.omnichannelPdfTranscriptRequested = count;
- }),
- );
-
+ // NOTE: keeping this for compatibility with current stats. Will be removed next major
+ statistics.omnichannelPdfTranscriptRequested = 0;
// Number of PDF transcript that succeeded
statsPms.push(
LivechatRooms.countRoomsWithTranscriptSent().then((count) => {
diff --git a/apps/meteor/app/theme/client/imports/general/theme_old.css b/apps/meteor/app/theme/client/imports/general/theme_old.css
index a5af0c58dc2d4..1cedb5d0e1f0d 100644
--- a/apps/meteor/app/theme/client/imports/general/theme_old.css
+++ b/apps/meteor/app/theme/client/imports/general/theme_old.css
@@ -4,7 +4,7 @@
&::-webkit-scrollbar {
width: 6px;
height: 6px;
- background: var(--transparent-dark);
+ background: transparent;
}
&::-webkit-scrollbar-thumb {
@@ -13,7 +13,7 @@
}
&::-webkit-scrollbar-corner {
- background-color: var(--transparent-dark);
+ background-color: transparent;
}
}
diff --git a/apps/meteor/app/theme/client/imports/general/variables.css b/apps/meteor/app/theme/client/imports/general/variables.css
index 60f2a558be80e..b4d2562315cfe 100644
--- a/apps/meteor/app/theme/client/imports/general/variables.css
+++ b/apps/meteor/app/theme/client/imports/general/variables.css
@@ -76,6 +76,11 @@
--page-loading-background-dark: var(--rcx-color-surface-tint, #1f2329);
--loading-bounce-color-light: var(--rcx-color-font-default, #2f343d);
--loading-bounce-color-dark: var(--rcx-color-font-default, #e4e7ea);
+
+ /*
+ * Scrollbar
+ */
+ --custom-scrollbar-color: var(--rcx-color-stroke-dark, #6C737A);
}
.rcx-sidebar {
diff --git a/apps/meteor/app/ui-utils/client/lib/RoomHistoryManager.ts b/apps/meteor/app/ui-utils/client/lib/RoomHistoryManager.ts
index cd19f954ed534..1839fcd994507 100644
--- a/apps/meteor/app/ui-utils/client/lib/RoomHistoryManager.ts
+++ b/apps/meteor/app/ui-utils/client/lib/RoomHistoryManager.ts
@@ -135,82 +135,84 @@ class RoomHistoryManagerClass extends Emitter {
this.run(() => this.emit(requestId));
}
- public async getMore(rid: IRoom['_id'], limit = defaultLimit): Promise {
+ public async getMore(rid: IRoom['_id'], { limit = defaultLimit }: { limit?: number } = {}): Promise {
const room = this.getRoom(rid);
if (Tracker.nonreactive(() => room.hasMore.get()) !== true) {
return;
}
- room.isLoading.set(true);
+ try {
+ room.isLoading.set(true);
- await this.queue();
+ await this.queue();
- let ls = undefined;
+ let ls = undefined;
- const subscription = Subscriptions.findOne({ rid });
- if (subscription) {
- ({ ls } = subscription);
- }
+ const subscription = Subscriptions.findOne({ rid });
+ if (subscription) {
+ ({ ls } = subscription);
+ }
- const showThreadsInMainChannel = getUserPreference(Meteor.userId(), 'showThreadsInMainChannel', false);
- const result = await callWithErrorHandling(
- 'loadHistory',
- rid,
- room.oldestTs,
- limit,
- ls ? String(ls) : undefined,
- showThreadsInMainChannel,
- );
+ const showThreadsInMainChannel = getUserPreference(Meteor.userId(), 'showThreadsInMainChannel', false);
+ const result = await callWithErrorHandling(
+ 'loadHistory',
+ rid,
+ room.oldestTs,
+ limit,
+ ls ? String(ls) : undefined,
+ showThreadsInMainChannel,
+ );
+
+ if (!result) {
+ throw new Error('loadHistory returned nothing');
+ }
- if (!result) {
- throw new Error('loadHistory returned nothing');
- }
+ this.unqueue();
- this.unqueue();
+ const { messages = [] } = result;
+ room.unreadNotLoaded.set(result.unreadNotLoaded);
+ room.firstUnread.set(result.firstUnread);
- const { messages = [] } = result;
- room.unreadNotLoaded.set(result.unreadNotLoaded);
- room.firstUnread.set(result.firstUnread);
+ if (messages.length > 0) {
+ room.oldestTs = messages[messages.length - 1].ts;
+ }
- if (messages.length > 0) {
- room.oldestTs = messages[messages.length - 1].ts;
- }
+ const wrapper = await waitForElement('.messages-box .wrapper [data-overlayscrollbars-viewport]');
- const wrapper = await waitForElement('.messages-box .wrapper [data-overlayscrollbars-viewport]');
+ room.scroll = {
+ scrollHeight: wrapper.scrollHeight,
+ scrollTop: wrapper.scrollTop,
+ };
- room.scroll = {
- scrollHeight: wrapper.scrollHeight,
- scrollTop: wrapper.scrollTop,
- };
+ await upsertMessageBulk({
+ msgs: messages.filter((msg) => msg.t !== 'command'),
+ subscription,
+ });
- await upsertMessageBulk({
- msgs: messages.filter((msg) => msg.t !== 'command'),
- subscription,
- });
+ this.emit('loaded-messages');
- this.emit('loaded-messages');
+ if (!room.loaded) {
+ room.loaded = 0;
+ }
- if (!room.loaded) {
- room.loaded = 0;
- }
+ const visibleMessages = messages.filter((msg) => !msg.tmid || showThreadsInMainChannel || msg.tshow);
- const visibleMessages = messages.filter((msg) => !msg.tmid || showThreadsInMainChannel || msg.tshow);
+ room.loaded += visibleMessages.length;
- room.loaded += visibleMessages.length;
+ if (messages.length < limit) {
+ room.hasMore.set(false);
+ }
- if (messages.length < limit) {
- room.hasMore.set(false);
- }
+ if (room.hasMore.get() && (visibleMessages.length === 0 || room.loaded < limit)) {
+ return this.getMore(rid);
+ }
- if (room.hasMore.get() && (visibleMessages.length === 0 || room.loaded < limit)) {
- return this.getMore(rid);
+ this.emit('loaded-messages');
+ } finally {
+ room.isLoading.set(false);
+ await waitAfterFlush();
}
-
- this.emit('loaded-messages');
-
- room.isLoading.set(false);
- await waitAfterFlush();
}
public restoreScroll(rid: IRoom['_id']) {
diff --git a/apps/meteor/app/ui/client/lib/ChatMessages.ts b/apps/meteor/app/ui/client/lib/ChatMessages.ts
index 3745864061f42..a675c413fe18f 100644
--- a/apps/meteor/app/ui/client/lib/ChatMessages.ts
+++ b/apps/meteor/app/ui/client/lib/ChatMessages.ts
@@ -64,7 +64,7 @@ export class ChatMessages implements ChatAPI {
}
if (!this.currentEditing) {
- let lastMessage = await this.data.findLastOwnMessage();
+ let lastMessage = await this.data.findPreviousOwnMessage();
// Videoconf messages should not be edited
if (lastMessage && isVideoConfMessage(lastMessage)) {
diff --git a/apps/meteor/app/utils/lib/i18n.ts b/apps/meteor/app/utils/lib/i18n.ts
index 57cc34225d8af..b4ff15531b319 100644
--- a/apps/meteor/app/utils/lib/i18n.ts
+++ b/apps/meteor/app/utils/lib/i18n.ts
@@ -1,155 +1,6 @@
-import type { RocketchatI18nKeys } from '@rocket.chat/i18n';
-import type { TOptions } from 'i18next';
+import { addSprinfToI18n } from '@rocket.chat/i18n';
import i18next from 'i18next';
import sprintf from 'i18next-sprintf-postprocessor';
-import { isObject } from '../../../lib/utils/isObject';
-
-declare module 'i18next' {
- // eslint-disable-next-line @typescript-eslint/naming-convention
- interface TFunction {
- (key: RocketchatI18nKeys): string;
- (key: RocketchatI18nKeys, options: TOptions): string;
- }
-}
-
export const i18n = i18next.use(sprintf);
-
-export const addSprinfToI18n = function (t: (typeof i18n)['t']) {
- return function (key: string, ...replaces: any): string {
- if (replaces[0] === undefined) {
- return t(key);
- }
-
- if (isObject(replaces[0]) && !Array.isArray(replaces[0])) {
- return t(key, replaces[0]);
- }
-
- return t(key, {
- postProcess: 'sprintf',
- sprintf: replaces,
- });
- };
-};
-
export const t = addSprinfToI18n(i18n.t.bind(i18n));
-
-/**
- * Extract the translation keys from a flat object and group them by namespace
- *
- * Example:
- *
- * ```js
- * const source = {
- * 'core.key1': 'value1',
- * 'core.key2': 'value2',
- * 'onboarding.key1': 'value1',
- * 'onboarding.key2': 'value2',
- * 'registration.key1': 'value1',
- * 'registration.key2': 'value2',
- * 'cloud.key1': 'value1',
- * 'cloud.key2': 'value2',
- * 'subscription.key1': 'value1',
- * 'subscription.key2': 'value2',
- * };
- *
- * const result = extractTranslationNamespaces(source);
- *
- * console.log(result);
- *
- * // {
- * // core: {
- * // key1: 'value1',
- * // key2: 'value2'
- * // },
- * // onboarding: {
- * // key1: 'value1',
- * // key2: 'value2'
- * // },
- * // registration: {
- * // key1: 'value1',
- * // key2: 'value2'
- * // },
- * // cloud: {
- * // key1: 'value1',
- * // key2: 'value2'
- * // },
- * // subscription: {
- * // key1: 'value1',
- * // key2: 'value2'
- * // }
- * // }
- * ```
- *
- * @param source the flat object with the translation keys
- */
-export const extractTranslationNamespaces = (source: Record): Record> => {
- const result: Record> = {
- core: {},
- onboarding: {},
- registration: {},
- cloud: {},
- subscription: {},
- };
-
- for (const [key, value] of Object.entries(source)) {
- const prefix = availableTranslationNamespaces.find((namespace) => key.startsWith(`${namespace}.`));
- const keyWithoutNamespace = prefix ? key.slice(prefix.length + 1) : key;
- const ns = prefix ?? defaultTranslationNamespace;
- result[ns][keyWithoutNamespace] = value;
- }
-
- return result;
-};
-
-/**
- * Extract only the translation keys that match the given namespaces
- *
- * @param source the flat object with the translation keys
- * @param namespaces the namespaces to extract
- */
-export const extractTranslationKeys = (source: Record, namespaces: string | string[] = []): { [key: string]: any } => {
- const all = extractTranslationNamespaces(source);
- return Array.isArray(namespaces)
- ? (namespaces as TranslationNamespace[]).reduce((result, namespace) => ({ ...result, ...all[namespace] }), {})
- : all[namespaces as TranslationNamespace];
-};
-
-export type TranslationNamespace =
- | (Extract extends `${infer T}.${string}` ? (T extends Lowercase ? T : never) : never)
- | 'core';
-
-const namespacesMap: Record = {
- core: true,
- onboarding: true,
- registration: true,
- cloud: true,
- subscription: true,
-};
-
-export const availableTranslationNamespaces = Object.keys(namespacesMap) as TranslationNamespace[];
-export const defaultTranslationNamespace: TranslationNamespace = 'core';
-
-export const applyCustomTranslations = (
- i18n: typeof i18next,
- parsedCustomTranslations: Record>,
- { namespaces, languages }: { namespaces?: string[]; languages?: string[] } = {},
-) => {
- for (const [lng, translations] of Object.entries(parsedCustomTranslations)) {
- if (languages && !languages.includes(lng)) {
- continue;
- }
-
- for (const [key, value] of Object.entries(translations)) {
- const prefix = availableTranslationNamespaces.find((namespace) => key.startsWith(`${namespace}.`));
- const keyWithoutNamespace = prefix ? key.slice(prefix.length + 1) : key;
- const ns = prefix ?? defaultTranslationNamespace;
-
- if (namespaces && !namespaces.includes(ns)) {
- continue;
- }
-
- i18n.addResourceBundle(lng, ns, { [keyWithoutNamespace]: value }, true, true);
- }
- }
-};
diff --git a/apps/meteor/app/utils/rocketchat.info b/apps/meteor/app/utils/rocketchat.info
index be9da17b321b6..54902f9124749 100644
--- a/apps/meteor/app/utils/rocketchat.info
+++ b/apps/meteor/app/utils/rocketchat.info
@@ -1,3 +1,3 @@
{
- "version": "7.6.2"
+ "version": "7.7.0-rc.6"
}
diff --git a/apps/meteor/client/components/AppLayoutThemeWrapper.tsx b/apps/meteor/client/components/AppLayoutThemeWrapper.tsx
new file mode 100644
index 0000000000000..a16108504dfca
--- /dev/null
+++ b/apps/meteor/client/components/AppLayoutThemeWrapper.tsx
@@ -0,0 +1,15 @@
+import { PaletteStyleTag } from '@rocket.chat/fuselage';
+import { useDarkMode } from '@rocket.chat/fuselage-hooks';
+import type { ReactNode } from 'react';
+
+const AppLayoutThemeWrapper = ({ children }: { children: ReactNode }) => {
+ const dark = useDarkMode();
+ return (
+ <>
+
+ {children}
+ >
+ );
+};
+
+export default AppLayoutThemeWrapper;
diff --git a/apps/meteor/client/components/AutoCompleteAgent.tsx b/apps/meteor/client/components/AutoCompleteAgent.tsx
index f20c688ef169f..5cbf876b3b654 100644
--- a/apps/meteor/client/components/AutoCompleteAgent.tsx
+++ b/apps/meteor/client/components/AutoCompleteAgent.tsx
@@ -1,67 +1,56 @@
import { PaginatedSelectFiltered } from '@rocket.chat/fuselage';
import { useDebouncedValue } from '@rocket.chat/fuselage-hooks';
-import type { AriaAttributes, ReactElement } from 'react';
-import { memo, useMemo, useState } from 'react';
+import type { ComponentProps, ReactElement } from 'react';
+import { memo, useState } from 'react';
-import { useRecordList } from '../hooks/lists/useRecordList';
-import { AsyncStatePhase } from '../lib/asyncState';
import { useAgentsList } from './Omnichannel/hooks/useAgentsList';
-type AutoCompleteAgentProps = Pick & {
+type AutoCompleteAgentProps = Omit<
+ ComponentProps,
+ 'filter' | 'setFilter' | 'options' | 'endReached' | 'renderItem'
+> & {
value: string;
- error?: string;
- placeholder?: string;
haveAll?: boolean;
haveNoAgentsSelectedOption?: boolean;
excludeId?: string;
showIdleAgents?: boolean;
onlyAvailable?: boolean;
- withTitle?: boolean;
onChange: (value: string) => void;
};
const AutoCompleteAgent = ({
value,
- error,
- placeholder,
haveAll = false,
haveNoAgentsSelectedOption = false,
excludeId,
showIdleAgents = true,
onlyAvailable = false,
- withTitle = false,
onChange,
- 'aria-labelledby': ariaLabelledBy,
+ ...props
}: AutoCompleteAgentProps): ReactElement => {
const [agentsFilter, setAgentsFilter] = useState('');
-
const debouncedAgentsFilter = useDebouncedValue(agentsFilter, 500);
- const { itemsList: AgentsList, loadMoreItems: loadMoreAgents } = useAgentsList(
- useMemo(
- () => ({ text: debouncedAgentsFilter, onlyAvailable, haveAll, haveNoAgentsSelectedOption, excludeId, showIdleAgents }),
- [debouncedAgentsFilter, excludeId, haveAll, haveNoAgentsSelectedOption, onlyAvailable, showIdleAgents],
- ),
- );
-
- const { phase: agentsPhase, itemCount: agentsTotal, items: agentsItems } = useRecordList(AgentsList);
+ const { data: agentsItems, fetchNextPage } = useAgentsList({
+ filter: debouncedAgentsFilter,
+ onlyAvailable,
+ haveAll,
+ haveNoAgentsSelectedOption,
+ excludeId,
+ showIdleAgents,
+ });
return (
void}
options={agentsItems}
data-qa='autocomplete-agent'
- aria-labelledby={ariaLabelledBy}
- endReached={
- agentsPhase === AsyncStatePhase.LOADING ? (): void => undefined : (start): void => loadMoreAgents(start, Math.min(50, agentsTotal))
- }
+ onChange={onChange}
+ endReached={() => fetchNextPage()}
/>
);
};
diff --git a/apps/meteor/client/components/AutoCompleteAgentWithoutExtension.tsx b/apps/meteor/client/components/AutoCompleteAgentWithoutExtension.tsx
index 5cb69abf95980..bcf792561be78 100644
--- a/apps/meteor/client/components/AutoCompleteAgentWithoutExtension.tsx
+++ b/apps/meteor/client/components/AutoCompleteAgentWithoutExtension.tsx
@@ -1,64 +1,36 @@
-import type { ILivechatAgent } from '@rocket.chat/core-typings';
import { PaginatedSelectFiltered } from '@rocket.chat/fuselage';
import { useDebouncedValue } from '@rocket.chat/fuselage-hooks';
-import { memo, useMemo, useState } from 'react';
+import { memo, useState } from 'react';
-import { useRecordList } from '../hooks/lists/useRecordList';
-import { AsyncStatePhase } from '../lib/asyncState';
import { useAvailableAgentsList } from './Omnichannel/hooks/useAvailableAgentsList';
type AutoCompleteAgentProps = {
- onChange: (value: string) => void;
+ value: string;
haveAll?: boolean;
- value?: string;
currentExtension?: string;
+ onChange: (value: string) => void;
};
-const AutoCompleteAgentWithoutExtension = (props: AutoCompleteAgentProps) => {
- const { value, currentExtension, onChange = (): void => undefined, haveAll = false } = props;
+const AutoCompleteAgentWithoutExtension = ({ value, currentExtension, onChange, ...props }: AutoCompleteAgentProps) => {
const [agentsFilter, setAgentsFilter] = useState('');
const debouncedAgentsFilter = useDebouncedValue(agentsFilter as string, 500);
- const { itemsList: AgentsList, loadMoreItems: loadMoreAgents } = useAvailableAgentsList(
- useMemo(
- () => ({ text: debouncedAgentsFilter, includeExtension: currentExtension, haveAll }),
- [currentExtension, debouncedAgentsFilter, haveAll],
- ),
- );
- const { phase: agentsPhase, items: agentsItems, itemCount: agentsTotal } = useRecordList(AgentsList);
- const sortedByName = agentsItems
- .sort((a, b) => {
- if (value === 'all') {
- return -1;
- }
-
- if (a?.username?.localeCompare(b?.username || '')) {
- return 1;
- }
- if (b?.username?.localeCompare(b?.username || '')) {
- return -1;
- }
-
- return 0;
- })
- .map((agent): ILivechatAgent & { label: string; value: string } => ({
- ...agent,
- label: agent?.username || '',
- value: agent?.username || '',
- }));
+ const { data: agentsItems, fetchNextPage } = useAvailableAgentsList({
+ filter: debouncedAgentsFilter,
+ includeExtension: currentExtension,
+ });
return (
undefined : (start): void => loadMoreAgents(start, Math.min(50, agentsTotal))
- }
+ options={agentsItems}
+ endReached={() => fetchNextPage()}
/>
);
};
diff --git a/apps/meteor/client/components/AutoCompleteDepartment.tsx b/apps/meteor/client/components/AutoCompleteDepartment.tsx
index 1e9b399f89863..967a4197f974d 100644
--- a/apps/meteor/client/components/AutoCompleteDepartment.tsx
+++ b/apps/meteor/client/components/AutoCompleteDepartment.tsx
@@ -1,27 +1,27 @@
-import { PaginatedSelectFiltered } from '@rocket.chat/fuselage';
+import { Option, PaginatedSelectFiltered } from '@rocket.chat/fuselage';
import { useDebouncedValue } from '@rocket.chat/fuselage-hooks';
import type { ComponentProps, ReactElement } from 'react';
-import { memo, useMemo, useState } from 'react';
+import { memo, useState } from 'react';
import { useTranslation } from 'react-i18next';
-import { useRecordList } from '../hooks/lists/useRecordList';
-import { AsyncStatePhase } from '../hooks/useAsyncState';
import { useDepartmentsList } from './Omnichannel/hooks/useDepartmentsList';
type AutoCompleteDepartmentProps = {
value?: string;
onChange: (value: string) => void;
- excludeDepartmentId?: string;
+ excludeId?: string;
onlyMyDepartments?: boolean;
haveAll?: boolean;
haveNone?: boolean;
showArchived?: boolean;
+ unitId?: string;
} & Omit, 'options' | 'setFilter'>;
const AutoCompleteDepartment = ({
value,
- excludeDepartmentId,
+ excludeId,
onlyMyDepartments,
+ unitId,
onChange,
haveAll,
haveNone,
@@ -33,22 +33,16 @@ const AutoCompleteDepartment = ({
const debouncedDepartmentsFilter = useDebouncedValue(departmentsFilter, 500);
- const { itemsList: departmentsList, loadMoreItems: loadMoreDepartments } = useDepartmentsList(
- useMemo(
- () => ({
- filter: debouncedDepartmentsFilter,
- onlyMyDepartments,
- haveAll,
- haveNone,
- excludeDepartmentId,
- showArchived,
- selectedDepartment: value,
- }),
- [debouncedDepartmentsFilter, onlyMyDepartments, haveAll, haveNone, excludeDepartmentId, showArchived, value],
- ),
- );
-
- const { phase: departmentsPhase, items: departmentsItems, itemCount: departmentsTotal } = useRecordList(departmentsList);
+ const { data: departmentsItems, fetchNextPage } = useDepartmentsList({
+ filter: debouncedDepartmentsFilter,
+ onlyMyDepartments,
+ haveAll,
+ haveNone,
+ excludeId,
+ showArchived,
+ selectedDepartmentId: value,
+ unitId,
+ });
return (
undefined
- : (start): void => loadMoreDepartments(start, Math.min(50, departmentsTotal))
- }
+ endReached={() => fetchNextPage()}
+ renderItem={({ label, ...props }) =>