Skip to content
Snippets Groups Projects
Commit dfed59ad authored by Diego Sampaio's avatar Diego Sampaio
Browse files

improved triggers settings

parent 0c0cbc0c
No related merge requests found
Showing
with 266 additions and 73 deletions
this.Triggers = (function() { this.Triggers = (function() {
var urlRegex = null; var triggers = [];
var time = null;
var message = 'Default trigger message';
var timeout = null;
var init = function() { var init = function() {
console.log('init!!');
Tracker.autorun(function() { Tracker.autorun(function() {
var trigger = Trigger.findOne(); triggers = Trigger.find().fetch();
console.log('trigger found ->',trigger);
if (trigger) {
urlRegex = trigger.urlRegex;
time = trigger.time;
message = trigger.message;
}
}); });
}; };
var fire = function() { var fire = function(actions) {
if (Meteor.userId()) { if (Meteor.userId()) {
console.log('already logged user - does nothing'); console.log('already logged user - does nothing');
return; return;
} }
parentCall('triggerMessage', message); actions.forEach(function(action) {
if (action.name === 'send-message') {
var room = Random.id(); var room = Random.id();
visitor.setRoom(room); visitor.setRoom(room);
Session.set('triggered', true); Session.set('triggered', true);
ChatMessage.insert({ ChatMessage.insert({
msg: message, msg: action.params.msg,
rid: room, rid: room,
u: { u: {
username: 'random-agent' username: action.params.name
}
});
parentCall('openWidget');
} }
}); });
}; };
var processRequest = function(request) { var processRequest = function(request) {
if (urlRegex && urlRegex !== '') { triggers.forEach(function(trigger) {
if (request.href.match(urlRegex)) { trigger.conditions.forEach(function(condition) {
fire(); switch (condition.name) {
} case 'page-url':
} if (request.href.match(new RegExp(urlRegex))) {
fire(trigger.actions);
if (time) { }
console.log('registerTimeout ->',time); break;
clearTimeout(timeout);
timeout = setTimeout(function() { case 'time-on-site':
fire(); if (trigger.timeout) {
}, time * 1000); clearTimeout(trigger.timeout);
} }
trigger.timeout = setTimeout(function() {
fire(trigger.actions);
}, parseInt(condition.value) * 1000);
break;
}
});
});
}; };
return { return {
......
...@@ -49,9 +49,7 @@ ...@@ -49,9 +49,7 @@
var popup = window.open(config.url + '?mode=popout', 'livechat-popout', 'width=400, height=450, toolbars=no'); var popup = window.open(config.url + '?mode=popout', 'livechat-popout', 'width=400, height=450, toolbars=no');
popup.focus(); popup.focus();
}, },
triggerMessage: function(msg) { openWidget: function() {
console.log('trigger fired!!!! ->',msg);
openWidget(); openWidget();
} }
}; };
......
.trigger-option, .trigger-value {
float: left;
display: inline-block;
}
.trigger-option {
width: 30%;
max-width: 300px;
padding-right: 4px;
}
.trigger-value {
width: 70%;
input {
display: inline-block !important;
width: auto !important;
}
}
...@@ -2,21 +2,29 @@ ...@@ -2,21 +2,29 @@
<form id="trigger-form"> <form id="trigger-form">
<div class="rocket-form"> <div class="rocket-form">
<fieldset> <fieldset>
<div class="input-line"> <legend>{{_ "Condition"}}</legend>
<label>{{_ "Trigger_by_URL"}}</label> <div class="conditions">
<input type="text" name="url-regex" placeholder="{{_ "Enter_a_regex"}}" value="{{urlRegex}}"> {{#each conditions}}
{{> livechatTriggerCondition}}
{{/each}}
{{#unless conditions}}
{{> livechatTriggerCondition}}
{{/unless}}
</div> </div>
<div class="input-line"> </fieldset>
<label>{{_ "Trigger_by_time"}}</label> <fieldset>
<input type="number" name="trigger-time" placeholder="{{_ "Time_in_seconds_at_the_same_page"}}" value="{{time}}"> <legend>{{_ "Action"}}</legend>
</div> <div class="actions">
<div class="input-line"> {{#each actions}}
<label>{{_ "Trigger_message"}}</label> {{> livechatTriggerAction}}
<input type="text" name="trigger-message" placeholder="{{_ "Enter_a_message_to_your_customer"}}" value="{{message}}"> {{/each}}
{{#unless actions}}
{{> livechatTriggerAction}}
{{/unless}}
</div> </div>
</fieldset> </fieldset>
<div class="submit"> <div class="submit">
<button type="reset" class="button secondary reset"><i class="icon-ccw"></i><span>{{_ "Reset"}}</span></button> <button type="button" class="button red delete-trigger">{{_ "Delete"}}</button>
<button class="button save"><i class="icon-floppy"></i><span>{{_ "Save"}}</span></button> <button class="button save"><i class="icon-floppy"></i><span>{{_ "Save"}}</span></button>
</div> </div>
</div> </div>
......
Template.livechatTriggers.helpers({ Template.livechatTriggers.helpers({
urlRegex() { conditions() {
return Template.instance().trigger.get().urlRegex; var trigger = Template.instance().trigger.get();
}, if (!trigger) return [];
time() {
return Template.instance().trigger.get().time; return trigger.conditions;
},
message() {
return Template.instance().trigger.get().message;
}, },
actions() {
var trigger = Template.instance().trigger.get();
if (!trigger) return [];
return trigger.actions;
}
}); });
Template.livechatTriggers.events({ Template.livechatTriggers.events({
...@@ -19,11 +22,34 @@ Template.livechatTriggers.events({ ...@@ -19,11 +22,34 @@ Template.livechatTriggers.events({
$btn.html(t('Saving')); $btn.html(t('Saving'));
var data = { var data = {
urlRegex: instance.$('input[name=url-regex]').val(), conditions: [],
time: instance.$('input[name=trigger-time]').val(), actions: []
message: instance.$('input[name=trigger-message]').val()
}; };
$('.each-condition').each(function() {
data.conditions.push({
name: $('.trigger-condition', this).val(),
value: $('.' + $('.trigger-condition', this).val() + '-value').val()
});
});
$('.each-action').each(function() {
if ($('.trigger-action', this).val() === 'send-message') {
data.actions.push({
name: $('.trigger-action', this).val(),
params: {
name: $('[name=send-message-name]', this).val(),
msg: $('[name=send-message-msg]', this).val()
}
});
} else {
data.actions.push({
name: $('.trigger-action', this).val(),
value: $('.' + $('.trigger-action', this).val() + '-value').val()
});
}
});
Meteor.call('livechat:saveTrigger', data, function(error, result) { Meteor.call('livechat:saveTrigger', data, function(error, result) {
$btn.html(oldBtnValue); $btn.html(oldBtnValue);
if (error) { if (error) {
...@@ -33,19 +59,40 @@ Template.livechatTriggers.events({ ...@@ -33,19 +59,40 @@ Template.livechatTriggers.events({
toastr.success(t('Saved')); toastr.success(t('Saved'));
}); });
}, },
'click .delete-trigger' (e, instance) {
e.preventDefault()
swal({
title: t('Are_you_sure'),
type: 'warning',
showCancelButton: true,
confirmButtonColor: '#DD6B55',
confirmButtonText: t('Yes'),
cancelButtonText: t('Cancel'),
closeOnConfirm: false,
html: false,
}, () => {
Meteor.call('livechat:removeTrigger', function(error, result) {
if (error) {
return toastr.error(t(error.reason || error.error));
}
swal({
title: t('Removed'),
text: t('Trigger_removed'),
type: 'success',
timer: 1000,
showConfirmButton: false,
});
});
});
}
}); });
Template.livechatTriggers.onCreated(function() { Template.livechatTriggers.onCreated(function() {
this.subscribe('livechat:trigger'); this.subscribe('livechat:trigger');
this.trigger = new ReactiveVar({ this.trigger = new ReactiveVar(null);
urlRegex: '',
time: '',
message: '',
});
this.autorun(() => { this.autorun(() => {
trigger = LivechatTrigger.findOne(); this.trigger.set(LivechatTrigger.findOne());
if (trigger) {
this.trigger.set(trigger);
}
}); });
}); });
<template name="livechatTriggerAction">
<div class="input-line each-action">
<div class="trigger-option">
<select name="action" class="trigger-action">
<option value="send-message">{{_ "Send_a_message"}}</option>
</select>
</div>
<div class="trigger-value">
<div class="send-message {{hiddenValue 'send-message'}}">
<input type="text" name="send-message-name" placeholder="{{_ "Name_of_agent"}}" value="{{params.name}}" size="15">
<input type="text" name="send-message-msg" placeholder="{{_ "Message"}}" value="{{params.msg}}">
</div>
</div>
</div>
</template>
Template.livechatTriggerAction.helpers({
hiddenValue (current) {
if (this.name === undefined && Template.instance().firstAction) {
Template.instance().firstAction = false;
return '';
} else {
if (this.name !== current) {
return 'hidden';
}
}
}
});
Template.livechatTriggerAction.events({
'change .trigger-action' (e, instance) {
instance.$('.trigger-action-value ').addClass('hidden');
instance.$('.' + e.currentTarget.value).removeClass('hidden');
}
});
Template.livechatTriggerAction.onCreated(function() {
this.firstAction = true;
});
<template name="livechatTriggerCondition">
<div class="input-line each-condition">
<div class="trigger-option">
<select name="condition" class="trigger-condition">
<option value="page-url" selected="{{conditionSelected 'page-url'}}">{{_ "Visitor_page_URL"}}</option>
<option value="time-on-site" selected="{{conditionSelected 'time-on-site'}}">{{_ "Visitor_time_on_site"}}</option>
</select>
</div>
<div class="trigger-value">
<div class="page-url trigger-condition-value {{hiddenValue 'page-url'}}">
<input type="text" name="page-url-value" class="page-url-value" placeholder="{{_ "Enter_a_regex"}}" value="{{valueFor 'page-url'}}">
</div>
<div class="time-on-site trigger-condition-value {{hiddenValue 'time-on-site'}}">
<input type="number" name="time-on-site-value" class="time-on-site-value" placeholder="{{_ "Time_in_seconds"}}" value="{{valueFor 'time-on-site'}}">
</div>
</div>
</div>
</template>
Template.livechatTriggerCondition.helpers({
hiddenValue (current) {
if (this.name === undefined && Template.instance().firstCondition) {
Template.instance().firstCondition = false;
return '';
} else {
if (this.name !== current) {
return 'hidden';
}
}
},
conditionSelected (current) {
if (this.name === current) {
return 'selected';
}
},
valueFor (condition) {
if (this.name === condition) {
return this.value;
}
}
});
Template.livechatTriggerCondition.events({
'change .trigger-condition' (e, instance) {
instance.$('.trigger-condition-value ').addClass('hidden');
instance.$('.' + e.currentTarget.value).removeClass('hidden');
}
});
Template.livechatTriggerCondition.onCreated(function() {
this.firstCondition = true;
})
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
"Edit_Department" : "Edit Department", "Edit_Department" : "Edit Department",
"Enable" : "Enable", "Enable" : "Enable",
"Enabled" : "Enabled", "Enabled" : "Enabled",
"Enter_a_regex": "Enter a regex",
"Enter_a_username" : "Enter a username", "Enter_a_username" : "Enter a username",
"Integrations" : "Integrations", "Integrations" : "Integrations",
"Live_sessions" : "Live sessions", "Live_sessions" : "Live sessions",
...@@ -23,16 +24,23 @@ ...@@ -23,16 +24,23 @@
"Livechat_title_color" : "Livechat Title Background Color", "Livechat_title_color" : "Livechat Title Background Color",
"Manager_added" : "Manager added", "Manager_added" : "Manager added",
"Manager_removed" : "Manager removed", "Manager_removed" : "Manager removed",
"Message": "Message",
"Name" : "Name", "Name" : "Name",
"Name_of_agent": "Name of agent",
"New_Department" : "New Department", "New_Department" : "New Department",
"Num_Agents" : "# Agents", "Num_Agents" : "# Agents",
"Please_fill_a_name" : "Please fill a name", "Please_fill_a_name" : "Please fill a name",
"Please_fill_a_username" : "Please fill a username", "Please_fill_a_username" : "Please fill a username",
"Please_select_enabled_yes_or_no" : "Please select an option for Enabled", "Please_select_enabled_yes_or_no" : "Please select an option for Enabled",
"Saved" : "Saved", "Saved" : "Saved",
"Send_a_message": "Send a message",
"Theme" : "Theme", "Theme" : "Theme",
"There_are_no_agents_added_to_this_department_yet" : "There are no agents added to this department yet.", "There_are_no_agents_added_to_this_department_yet" : "There are no agents added to this department yet.",
"Time_in_seconds": "Time in seconds",
"Triggers": "Triggers", "Triggers": "Triggers",
"Trigger_removed": "Trigger removed",
"User_management" : "User Management", "User_management" : "User Management",
"Username_not_found" : "Username not found" "Username_not_found" : "Username not found",
"Visitor_page_URL": "Visitor page URL",
"Visitor_time_on_site": "Visitor time on site"
} }
...@@ -25,6 +25,7 @@ Package.onUse(function(api) { ...@@ -25,6 +25,7 @@ Package.onUse(function(api) {
api.use('kadira:flow-router', 'client'); api.use('kadira:flow-router', 'client');
api.use('templating', 'client'); api.use('templating', 'client');
api.use('mongo'); api.use('mongo');
api.use('less@2.5.1');
api.addFiles('livechat.js', 'server'); api.addFiles('livechat.js', 'server');
api.addFiles('server/methods.js', 'server'); api.addFiles('server/methods.js', 'server');
...@@ -36,6 +37,8 @@ Package.onUse(function(api) { ...@@ -36,6 +37,8 @@ Package.onUse(function(api) {
api.addFiles('client/ui.js', 'client'); api.addFiles('client/ui.js', 'client');
api.addFiles('client/route.js', 'client'); api.addFiles('client/route.js', 'client');
api.addFiles('client/stylesheets/livechat.less', 'client');
// client views // client views
api.addFiles('client/views/app/livechatManager.html', 'client'); api.addFiles('client/views/app/livechatManager.html', 'client');
api.addFiles('client/views/app/livechatManager.js', 'client'); api.addFiles('client/views/app/livechatManager.js', 'client');
...@@ -50,6 +53,11 @@ Package.onUse(function(api) { ...@@ -50,6 +53,11 @@ Package.onUse(function(api) {
api.addFiles('client/views/sideNav/livechatFlex.html', 'client'); api.addFiles('client/views/sideNav/livechatFlex.html', 'client');
api.addFiles('client/views/sideNav/livechatFlex.js', 'client'); api.addFiles('client/views/sideNav/livechatFlex.js', 'client');
api.addFiles('client/views/app/triggers/livechatTriggerAction.html', 'client');
api.addFiles('client/views/app/triggers/livechatTriggerAction.js', 'client');
api.addFiles('client/views/app/triggers/livechatTriggerCondition.html', 'client');
api.addFiles('client/views/app/triggers/livechatTriggerCondition.js', 'client');
// methods // methods
api.addFiles('server/methods/addAgent.js', 'server'); api.addFiles('server/methods/addAgent.js', 'server');
api.addFiles('server/methods/addManager.js', 'server'); api.addFiles('server/methods/addManager.js', 'server');
...@@ -59,6 +67,7 @@ Package.onUse(function(api) { ...@@ -59,6 +67,7 @@ Package.onUse(function(api) {
api.addFiles('server/methods/removeManager.js', 'server'); api.addFiles('server/methods/removeManager.js', 'server');
api.addFiles('server/methods/removeDepartment.js', 'server'); api.addFiles('server/methods/removeDepartment.js', 'server');
api.addFiles('server/methods/saveTrigger.js', 'server'); api.addFiles('server/methods/saveTrigger.js', 'server');
api.addFiles('server/methods/removeTrigger.js', 'server');
// models // models
api.addFiles('server/models/Users.js', 'server'); api.addFiles('server/models/Users.js', 'server');
......
Meteor.methods({
'livechat:removeTrigger' (trigger) {
console.log('[methods] livechat:removeTrigger -> '.green, 'arguments:', arguments);
if (!Meteor.userId() || !RocketChat.authz.hasPermission(Meteor.userId(), 'view-livechat-manager')) {
throw new Meteor.Error("not-authorized");
}
return RocketChat.models.LivechatTrigger.removeAll();
}
});
...@@ -17,6 +17,10 @@ class LivechatTrigger extends RocketChat.models._Base { ...@@ -17,6 +17,10 @@ class LivechatTrigger extends RocketChat.models._Base {
return this.insert(data); return this.insert(data);
} }
} }
removeAll() {
this.remove({});
}
} }
RocketChat.models.LivechatTrigger = new LivechatTrigger(); RocketChat.models.LivechatTrigger = new LivechatTrigger();
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment