improved triggers settings

pull/1665/head
Diego Sampaio 11 years ago
parent 0c0cbc0cb3
commit dfed59ad25
  1. 76
      packages/rocketchat-livechat/app/client/lib/triggers.js
  2. 4
      packages/rocketchat-livechat/assets/rocket-livechat.js
  3. 19
      packages/rocketchat-livechat/client/stylesheets/livechat.less
  4. 30
      packages/rocketchat-livechat/client/views/app/livechatTriggers.html
  5. 87
      packages/rocketchat-livechat/client/views/app/livechatTriggers.js
  6. 15
      packages/rocketchat-livechat/client/views/app/triggers/livechatTriggerAction.html
  7. 23
      packages/rocketchat-livechat/client/views/app/triggers/livechatTriggerAction.js
  8. 18
      packages/rocketchat-livechat/client/views/app/triggers/livechatTriggerCondition.html
  9. 33
      packages/rocketchat-livechat/client/views/app/triggers/livechatTriggerCondition.js
  10. 10
      packages/rocketchat-livechat/i18n/en.i18n.json
  11. 9
      packages/rocketchat-livechat/package.js
  12. 11
      packages/rocketchat-livechat/server/methods/removeTrigger.js
  13. 4
      packages/rocketchat-livechat/server/models/LivechatTrigger.js

@ -1,57 +1,57 @@
this.Triggers = (function() {
var urlRegex = null;
var time = null;
var message = 'Default trigger message';
var timeout = null;
var triggers = [];
var init = function() {
console.log('init!!');
Tracker.autorun(function() {
var trigger = Trigger.findOne();
console.log('trigger found ->',trigger);
if (trigger) {
urlRegex = trigger.urlRegex;
time = trigger.time;
message = trigger.message;
}
triggers = Trigger.find().fetch();
});
};
var fire = function() {
var fire = function(actions) {
if (Meteor.userId()) {
console.log('already logged user - does nothing');
return;
}
parentCall('triggerMessage', message);
var room = Random.id();
visitor.setRoom(room);
Session.set('triggered', true);
ChatMessage.insert({
msg: message,
rid: room,
u: {
username: 'random-agent'
actions.forEach(function(action) {
if (action.name === 'send-message') {
var room = Random.id();
visitor.setRoom(room);
Session.set('triggered', true);
ChatMessage.insert({
msg: action.params.msg,
rid: room,
u: {
username: action.params.name
}
});
parentCall('openWidget');
}
});
};
var processRequest = function(request) {
if (urlRegex && urlRegex !== '') {
if (request.href.match(urlRegex)) {
fire();
}
}
if (time) {
console.log('registerTimeout ->',time);
clearTimeout(timeout);
timeout = setTimeout(function() {
fire();
}, time * 1000);
}
triggers.forEach(function(trigger) {
trigger.conditions.forEach(function(condition) {
switch (condition.name) {
case 'page-url':
if (request.href.match(new RegExp(urlRegex))) {
fire(trigger.actions);
}
break;
case 'time-on-site':
if (trigger.timeout) {
clearTimeout(trigger.timeout);
}
trigger.timeout = setTimeout(function() {
fire(trigger.actions);
}, parseInt(condition.value) * 1000);
break;
}
});
});
};
return {

@ -49,9 +49,7 @@
var popup = window.open(config.url + '?mode=popout', 'livechat-popout', 'width=400, height=450, toolbars=no');
popup.focus();
},
triggerMessage: function(msg) {
console.log('trigger fired!!!! ->',msg);
openWidget: function() {
openWidget();
}
};

@ -0,0 +1,19 @@
.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 @@
<form id="trigger-form">
<div class="rocket-form">
<fieldset>
<div class="input-line">
<label>{{_ "Trigger_by_URL"}}</label>
<input type="text" name="url-regex" placeholder="{{_ "Enter_a_regex"}}" value="{{urlRegex}}">
<legend>{{_ "Condition"}}</legend>
<div class="conditions">
{{#each conditions}}
{{> livechatTriggerCondition}}
{{/each}}
{{#unless conditions}}
{{> livechatTriggerCondition}}
{{/unless}}
</div>
<div class="input-line">
<label>{{_ "Trigger_by_time"}}</label>
<input type="number" name="trigger-time" placeholder="{{_ "Time_in_seconds_at_the_same_page"}}" value="{{time}}">
</div>
<div class="input-line">
<label>{{_ "Trigger_message"}}</label>
<input type="text" name="trigger-message" placeholder="{{_ "Enter_a_message_to_your_customer"}}" value="{{message}}">
</fieldset>
<fieldset>
<legend>{{_ "Action"}}</legend>
<div class="actions">
{{#each actions}}
{{> livechatTriggerAction}}
{{/each}}
{{#unless actions}}
{{> livechatTriggerAction}}
{{/unless}}
</div>
</fieldset>
<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>
</div>
</div>

@ -1,13 +1,16 @@
Template.livechatTriggers.helpers({
urlRegex() {
return Template.instance().trigger.get().urlRegex;
},
time() {
return Template.instance().trigger.get().time;
},
message() {
return Template.instance().trigger.get().message;
conditions() {
var trigger = Template.instance().trigger.get();
if (!trigger) return [];
return trigger.conditions;
},
actions() {
var trigger = Template.instance().trigger.get();
if (!trigger) return [];
return trigger.actions;
}
});
Template.livechatTriggers.events({
@ -19,11 +22,34 @@ Template.livechatTriggers.events({
$btn.html(t('Saving'));
var data = {
urlRegex: instance.$('input[name=url-regex]').val(),
time: instance.$('input[name=trigger-time]').val(),
message: instance.$('input[name=trigger-message]').val()
conditions: [],
actions: []
};
$('.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) {
$btn.html(oldBtnValue);
if (error) {
@ -33,19 +59,40 @@ Template.livechatTriggers.events({
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() {
this.subscribe('livechat:trigger');
this.trigger = new ReactiveVar({
urlRegex: '',
time: '',
message: '',
});
this.trigger = new ReactiveVar(null);
this.autorun(() => {
trigger = LivechatTrigger.findOne();
if (trigger) {
this.trigger.set(trigger);
}
this.trigger.set(LivechatTrigger.findOne());
});
});

@ -0,0 +1,15 @@
<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>

@ -0,0 +1,23 @@
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;
});

@ -0,0 +1,18 @@
<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>

@ -0,0 +1,33 @@
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 @@
"Edit_Department" : "Edit Department",
"Enable" : "Enable",
"Enabled" : "Enabled",
"Enter_a_regex": "Enter a regex",
"Enter_a_username" : "Enter a username",
"Integrations" : "Integrations",
"Live_sessions" : "Live sessions",
@ -23,16 +24,23 @@
"Livechat_title_color" : "Livechat Title Background Color",
"Manager_added" : "Manager added",
"Manager_removed" : "Manager removed",
"Message": "Message",
"Name" : "Name",
"Name_of_agent": "Name of agent",
"New_Department" : "New Department",
"Num_Agents" : "# Agents",
"Please_fill_a_name" : "Please fill a name",
"Please_fill_a_username" : "Please fill a username",
"Please_select_enabled_yes_or_no" : "Please select an option for Enabled",
"Saved" : "Saved",
"Send_a_message": "Send a message",
"Theme" : "Theme",
"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",
"Trigger_removed": "Trigger removed",
"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) {
api.use('kadira:flow-router', 'client');
api.use('templating', 'client');
api.use('mongo');
api.use('less@2.5.1');
api.addFiles('livechat.js', 'server');
api.addFiles('server/methods.js', 'server');
@ -36,6 +37,8 @@ Package.onUse(function(api) {
api.addFiles('client/ui.js', 'client');
api.addFiles('client/route.js', 'client');
api.addFiles('client/stylesheets/livechat.less', 'client');
// client views
api.addFiles('client/views/app/livechatManager.html', 'client');
api.addFiles('client/views/app/livechatManager.js', 'client');
@ -50,6 +53,11 @@ Package.onUse(function(api) {
api.addFiles('client/views/sideNav/livechatFlex.html', '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
api.addFiles('server/methods/addAgent.js', 'server');
api.addFiles('server/methods/addManager.js', 'server');
@ -59,6 +67,7 @@ Package.onUse(function(api) {
api.addFiles('server/methods/removeManager.js', 'server');
api.addFiles('server/methods/removeDepartment.js', 'server');
api.addFiles('server/methods/saveTrigger.js', 'server');
api.addFiles('server/methods/removeTrigger.js', 'server');
// models
api.addFiles('server/models/Users.js', 'server');

@ -0,0 +1,11 @@
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 {
return this.insert(data);
}
}
removeAll() {
this.remove({});
}
}
RocketChat.models.LivechatTrigger = new LivechatTrigger();

Loading…
Cancel
Save