diff --git a/app/livechat/client/views/app/tabbar/visitorEdit.html b/app/livechat/client/views/app/tabbar/visitorEdit.html
index 9f8510b53bf..0d3afb3118b 100644
--- a/app/livechat/client/views/app/tabbar/visitorEdit.html
+++ b/app/livechat/client/views/app/tabbar/visitorEdit.html
@@ -30,6 +30,17 @@
+
+ {{#each visitorCustomFields}}
+
diff --git a/app/livechat/client/views/app/tabbar/visitorEdit.js b/app/livechat/client/views/app/tabbar/visitorEdit.js
index 79c9dc1886d..bb8439bb3f6 100644
--- a/app/livechat/client/views/app/tabbar/visitorEdit.js
+++ b/app/livechat/client/views/app/tabbar/visitorEdit.js
@@ -7,16 +7,61 @@ import { t } from '../../../../../utils';
import { hasRole } from '../../../../../authorization';
import './visitorEdit.html';
import { APIClient } from '../../../../../utils/client';
+import { LivechatCustomField } from '../../../collections/LivechatCustomField';
Template.visitorEdit.helpers({
visitor() {
return Template.instance().visitor.get();
},
+ visitorCustomFields() {
+ const fields = [];
+ const visitor = Template.instance().visitor.get();
+ const customFields = Template.instance().customFields.get();
+
+ if (!customFields) {
+ return fields;
+ }
+
+ customFields.forEach((field) => {
+ if (field.visibility !== 'hidden' && field.scope === 'visitor') {
+ const value = visitor.hasOwnProperty('livechatData') && visitor.livechatData.hasOwnProperty(field._id)
+ ? visitor.livechatData[field._id]
+ : '';
+
+ fields.push({ name: field._id, label: field.label, value });
+ }
+ });
+
+ return fields;
+ },
+
room() {
return Template.instance().room.get();
},
+ roomCustomFields() {
+ const fields = [];
+ const room = Template.instance().room.get();
+ const customFields = Template.instance().customFields.get();
+
+ if (!customFields) {
+ return fields;
+ }
+
+ customFields.forEach((field) => {
+ if (field.visibility !== 'hidden' && field.scope === 'room') {
+ const value = room.hasOwnProperty('livechatData') && room.livechatData.hasOwnProperty(field._id)
+ ? room.livechatData[field._id]
+ : '';
+
+ fields.push({ name: field._id, label: field.label, value });
+ }
+ });
+
+ return fields;
+ },
+
email() {
const visitor = Template.instance().visitor.get();
if (visitor.visitorEmails && visitor.visitorEmails.length > 0) {
@@ -61,6 +106,7 @@ Template.visitorEdit.onCreated(async function() {
this.availableTags = new ReactiveVar([]);
this.agentDepartments = new ReactiveVar([]);
this.availableUserTags = new ReactiveVar([]);
+ this.customFields = new ReactiveVar([]);
this.autorun(async () => {
const { visitorId } = Template.currentData();
@@ -72,10 +118,13 @@ Template.visitorEdit.onCreated(async function() {
const rid = Template.currentData().roomId;
+ this.subscribe('livechat:customFields');
this.autorun(async () => {
const { room } = await APIClient.v1.get(`rooms.info?roomId=${ rid }`);
+ const customFields = LivechatCustomField.find().fetch();
this.room.set(room);
this.tags.set((room && room.tags) || []);
+ this.customFields.set(customFields || []);
});
const uid = Meteor.userId();
@@ -106,9 +155,17 @@ Template.visitorEdit.events({
userData.name = event.currentTarget.elements.name.value;
userData.email = event.currentTarget.elements.email.value;
userData.phone = event.currentTarget.elements.phone.value;
+ userData.livechatData = {};
+ $('[data-visitorLivechatData=true]').each(function() {
+ userData.livechatData[this.name] = $(this).val() || '';
+ });
roomData.topic = event.currentTarget.elements.topic.value;
roomData.tags = instance.tags.get();
+ roomData.livechatData = {};
+ $('[data-roomLivechatData=true]').each(function() {
+ roomData.livechatData[this.name] = $(this).val() || '';
+ });
if (sms) {
delete userData.phone;
diff --git a/app/livechat/client/views/app/tabbar/visitorInfo.html b/app/livechat/client/views/app/tabbar/visitorInfo.html
index 4e0f029df5d..b9c5cfd4b65 100644
--- a/app/livechat/client/views/app/tabbar/visitorInfo.html
+++ b/app/livechat/client/views/app/tabbar/visitorInfo.html
@@ -10,42 +10,45 @@
{{#with user}}
{{#if name}}
-
{{name}}
+
{{name}}
{{username}}
{{else}}
-
{{username}}
+
{{username}}
{{/if}}
{{#if utc}}- {{userTime}} (UTC {{utc}})
{{/if}}
- {{#each visitorEmails}} - {{address}}{{#if verified}} {{/if}}
{{/each}}
- {{#each phone}} - {{phoneNumber}}
{{/each}}
- {{#if lastLogin}} - {{_ "Created_at"}}: {{createdAt}}
{{/if}}
- {{#if lastLogin}} - {{_ "Last_login"}}: {{lastLogin}}
{{/if}}
+ {{#each visitorEmails}}- {{address}}{{#if verified}} {{/if}}
{{/each}}
+ {{#each phone}}- {{phoneNumber}}
{{/each}}
+ {{#if lastLogin}}- {{_ "Created_at"}}: {{createdAt}}
{{/if}}
+ {{#if lastLogin}}- {{_ "Last_login"}}: {{lastLogin}}
{{/if}}
{{#if ip}}- {{ip}}
{{/if}}
{{#if os}}- {{os}}
{{/if}}
{{#if browser}}- {{browser}}
{{/if}}
+ {{#if customVisitorFields}}
+ {{#each customVisitorFields}}- {{label}}: {{value}}
{{/each}}
+ {{/if}}
{{/with}}
- {{#with room}}
-
-
- {{#if facebook}} - {{_ "Facebook_Page"}}: {{facebook.page.name}}
{{/if}}
- {{#if sms}} - {{_ "SMS_Enabled"}}
{{/if}}
- {{#if topic}} - {{_ "Topic"}}: {{{RocketChatMarkdown topic}}}
{{/if}}
- {{#if tags}} - {{_ "Tags"}}: {{joinTags}}
{{/if}}
-
-
- {{/with}}
-
- {{#with department}}
-
-
- {{#if name}} - {{_ "Department"}}: {{name}}
{{/if}}
-
-
- {{/with}}
+
+
{{_ "Conversation"}}
+
+ {{#with room}}
+ - {{_ "Agent"}}: {{servedBy.username}}
+ {{#if facebook}}- {{_ "Facebook_Page"}}: {{facebook.page.name}}
{{/if}}
+ {{#if sms}}- {{_ "SMS_Enabled"}}
{{/if}}
+ {{#if topic}}- {{_ "Topic"}}: {{{RocketChatMarkdown topic}}}
{{/if}}
+ {{#if tags}}- {{_ "Tags"}}: {{joinTags}}
{{/if}}
+ {{/with}}
+ {{#with department}}
+ {{#if name}}- {{_ "Department"}}: {{name}}
{{/if}}
+ {{/with}}
+ {{#if customRoomFields}}
+ {{#each customRoomFields}}- {{label}}: {{value}}
{{/each}}
+ {{/if}}
+
+
{{#if canSeeButtons}}
@@ -68,20 +71,6 @@
{{/if}}
- {{#if customFields}}
-