prisme-flow
Version:
prisme platform flow engine
328 lines (300 loc) • 14.3 kB
HTML
<!--
Created by prisme.io on 09/06/2017.
@author <a href="mailto:hello@prisme.io">savane vamara</a> (prisme.io)
-->
<script type="text/javascript">
RED.nodes.registerType('bot-inline-buttons', {
category: 'bot',
color: '#FFCC66',
defaults: {
name: {
value: ''
},
answers: {
value: [],
validate: function(answers) {
var valid = true;
var idx;
for(idx = 0; idx < answers.length; idx++) {
// label button must be always present
if ($.trim(answers[idx].label) === '') {
valid = false;
}
// check url
if ($.trim(answers[idx].url) != '' && !answers[idx].url.match(/[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi)) {
valid = false;
}
}
return valid;
}
},
message: {
value: ''
}
},
inputs: 1,
outputs: 1,
paletteLabel: 'buttons',
icon: 'inlinebutton.png',
label: function() {
return this.name || 'buttons';
},
oneditsave: function() {
var answers = $("#node-input-answers-container").editableList('items');
var node = this;
node.answers = [];
var idx;
for(idx = 0; idx < answers.length; idx++) {
var answer = {
value: answers[idx].find('input[name=button-value]').val(),
label: answers[idx].find('input[name=button-label]').val(),
answer: answers[idx].find('input[name=button-answer]').val(),
url: answers[idx].find('input[name=button-url]').val(),
image_url: answers[idx].find('input[name=button-image-url]').val(),
alert: answers[idx].find('input[name=button-alert]').is(':checked'),
newLine: answers[idx].find('input[name=new-line]').is(':checked')
};
if ($.trim(answer.answer) == '') {
answer.answer = null;
}
node.answers.push(answer);
}
},
oneditprepare: function() {
function resizeRule(rule) {}
$('#node-input-answers-container').css('min-height','300px').css('min-width','450px').editableList({
addItem: function(container, i, item) {
var label = item.label != null ? item.label : '';
var value = item.value != null ? item.value : '';
var answer = item.answer != null ? item.answer : '';
var url = item.url != null ? item.url : '';
var image_url = item.image_url != null ? item.image_url : '';
var row1 = $('<div/>').appendTo(container);
var row2 = $('<div/>').css('marginTop','5px').appendTo(container);
var row3 = $('<div/>').css('marginTop','5px').appendTo(container);
var row4 = $('<div/>').css('marginTop','5px').appendTo(container);
var row5 = $('<div/>').css('marginTop','5px').appendTo(container);
var inputLabel = $('<input class="node-input-rule-type" type="text" name="button-label" value="' + label + '" placeholder="Button label"/>')
.css({
width: '45%'
})
.appendTo(row1);
var inputValue = $('<input class="node-input-rule-type" type="text" name="button-value" value="' + value + '" placeholder="Button value (optional)"/>')
.css({
width: '45%',
marginLeft: '2%'
})
.attr('disabled', $.trim(url) !== '')
.on('keyup', function() {
var current = $(this).val();
inputUrl.attr('disabled', $.trim(current) !== '');
})
.appendTo(row1);
var inputUrl = $('<input class="node-input-rule-type platform-smooch-telegram" type="text" name="button-url" value="' + url + '" placeholder="Redirect URL (optional)"/>')
.css({
width: '92%'
})
.attr('disabled', $.trim(answer) !== '' || $.trim(value) !== '')
.on('keyup', function() {
var current = $(this).val();
inputValue.attr('disabled', $.trim(current) !== '');
inputAnswer.attr('disabled', $.trim(current) !== '');
})
.appendTo(row2);
var inputImageUrl = $('<input class="node-input-rule-type platform-smooch-facebook" type="text" name="button-image-url" value="' + image_url + '" placeholder="Image URL (optional)"/>')
.css({
width: '92%'
})
.appendTo(row3);
var inputAnswer = $('<input class="node-input-rule-type platform-telegram" type="text" name="button-answer" value="' + answer + '" placeholder="Button feedback (optional)"/>')
.css({
width: '92%'
})
.attr('disabled', $.trim(url) !== '')
.on('keyup', function() {
var current = $(this).val();
inputAlert.attr('disabled', $.trim(current) === '');
inputUrl.attr('disabled', $.trim(current) !== '');
})
.appendTo(row4);
var inputAlert = $('<input type="checkbox" name="button-alert" value="on"/>')
.css({
width: 'auto',
marginRight: '10px',
marginBottom: '5px'
})
.prop('checked', item.alert)
.attr('disabled', $.trim(answer) === '')
.appendTo(row5);
$('<span>Alert</span><span class="icon-platform-telegram"></span>').appendTo(row5);
var inputNewLine = $('<input type="checkbox" name="new-line" value="on"/>')
.css({
width: 'auto',
marginRight: '10px',
marginLeft: '10px',
marginBottom: '5px'
})
.prop('checked', item.newLine)
.appendTo(row5);
$('<span>New line</span><span class="icon-platform-telegram"></span>').appendTo(row5);
resizeRule(container);
},
resizeItem: resizeRule,
removable: true,
sortable: true
});
var answers = this.answers;
var idx;
for (idx = 0; idx < answers.length; idx++) {
var answer = answers[idx];
$("#node-input-answers-container").editableList('addItem', answer);
}
}
});
</script>
<script type="text/x-red" data-template-name="bot-inline-buttons">
<div class="form-row">
<label for="node-input-name"><i class="icon-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
<div class="form-row">
<label for="node-input-message"><i class="icon-envelope"></i> Message</label>
<textarea id="node-input-message" placeholder="Message" style="width:93%;height:100px;"></textarea>
<div style="max-width: 460px;font-size: 12px;color: #999999;line-height: 14px;clear:both;margin-top:5px;">
Supports handlebars-like variables for chat context like {{firstName}}, {{lastName}}, etc. and emoticons (:smile:, etc.)
</div>
</div>
<div class="form-row" style="margin-bottom:0;">
<label><i class="fa fa-list"></i> <span>Buttons</span></label>
</div>
<div class="form-row node-input-rule-container-row">
<ol id="node-input-answers-container"></ol>
</div>
<div style="max-width: 460px;font-size: 12px;color: #999999;line-height: 14px;clear:both;margin-top:5px;margin-bottom:10px;">
Some attributes apply for specific platform:<br>
<span class="icon-platform-facebook"></span> = <span style="font-size:10px">Facebook</span>
<span class="icon-platform-telegram"></span> = <span style="font-size:10px">Telegram</span>
<span class="icon-platform-smooch"></span> = <span style="font-size:10px">Smooch</span>
<span class="icon-platform-slack"></span> = <span style="font-size:10px">Slack</span>
</div>
</script>
<script type="text/x-red" data-help-name="bot-inline-buttons">
<p>Present quick alternatives to the users through inline buttons (and optionally show feedback for Telegram)<em>[Telegram, Facebook, Smooch]</em>.</p>
<p>For each button:
<ul>
<li><em>label</em>: The label of the button</li>
<li><em>value (optional)</em>: The value of the button, max 64 bytes, this is the response that will re-routed the the flow
like a normal message (will not be shown in the chat history of the client)</li>
<li><em>Button feedback (optional)</em>: Show a button feedback when the user clicks the button</li>
<li><em>Button URL (optional)</em>: Open the browser to the specified URL (url and value cannot be used with the same button).
Only for Telegram.
</li>
<li><em>Image URL (optional)</em>: Show image inside the button. Only for Facebook.
</li>
<li><em>Alert (optional)</em>: Show the feedback with a modal alert in the client. Only for Telegram.</li>
<li><em>New Line (optional)</em>: Starts a new row of buttons after this. Only for Telegram.</li>
</ul>
</p>
<p>The button can be passed through the payload by the upstream node:</p>
<br/>
<pre>
// todo add here image_url and newLine
msg.payload = {
message: 'The message with the buttons',
buttons: [
{
value: 'text 1',
label: 'label of the button 1',
answer: 'this is the answer',
alert: true,
newLine: true
},
{
value: 'text 2',
label: 'another label',
answer: 'this is the answer 2',
alert: false
}
]
}
return msg;
</pre>
</script>
<style>
.icon-platform-telegram {
display: inline-block;
width: 9px;
height: 9px;
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAAXNSR0IArs4c6QAAADRJREFUGBlj1F764D8DAcACk78SJQ9jwmmdZQ/BbLgimABIMYwNU80EY+Cjh4QidJ+BPAQAUcEMK/ZfXe8AAAAASUVORK5CYII=);
margin-left: 3px;
margin-right: 3px;
vertical-align: middle;
}
.icon-platform-facebook {
display: inline-block;
width: 9px;
height: 9px;
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAAXNSR0IArs4c6QAAAEJJREFUGBljtIqc8Z+BAGCByR9dlg5jwmnrqJlgNlwRiAcThKuCMpjQBbDxUUxCthLZVBRFyBLIJhJlHVGKGIkJJwAbVQzJXzC/gwAAAABJRU5ErkJggg==);
margin-left: 3px;
margin-right: 3px;
vertical-align: middle;
}
.icon-platform-smooch {
display: inline-block;
width: 9px;
height: 9px;
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAAXNSR0IArs4c6QAAAENJREFUGBljXOyx/T8DAcAEk4/Z7gFjgmlkPlwRSAYmAaNhulAULfHcAVYIopEBiiKQBLoCkBiGIpAgOqCeIkZiwgkAEPoRCUXTyWoAAAAASUVORK5CYII=);
margin-left: 3px;
margin-right: 3px;
vertical-align: middle;
}
.icon-platform-slack {
display: inline-block;
width: 9px;
height: 9px;
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAAXNSR0IArs4c6QAAAEtJREFUGBljDNvW/Z+BAGBBll/pWYLMZQjf3gPmwxWBFMAEUVQCOUzoAtj4cJNApiBbh2wqXBHIBGQJZOtJsw7ZKnRT4dYhW4XueACZqRaCOTsvfwAAAABJRU5ErkJggg==);
margin-left: 3px;
margin-right: 3px;
vertical-align: middle;
}
.platform-facebook {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAAXNSR0IArs4c6QAAAEJJREFUGBljtIqc8Z+BAGCByR9dlg5jwmnrqJlgNlwRiAcThKuCMpjQBbDxUUxCthLZVBRFyBLIJhJlHVGKGIkJJwAbVQzJXzC/gwAAAABJRU5ErkJggg==);
background-position: right 2px top 2px;
background-repeat: no-repeat;
}
.platform-telegram {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAAXNSR0IArs4c6QAAADRJREFUGBlj1F764D8DAcACk78SJQ9jwmmdZQ/BbLgimABIMYwNU80EY+Cjh4QidJ+BPAQAUcEMK/ZfXe8AAAAASUVORK5CYII=);
background-position: right 2px top 2px;
background-repeat: no-repeat;
}
.platform-smooch {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAAXNSR0IArs4c6QAAAENJREFUGBljXOyx/T8DAcAEk4/Z7gFjgmlkPlwRSAYmAaNhulAULfHcAVYIopEBiiKQBLoCkBiGIpAgOqCeIkZiwgkAEPoRCUXTyWoAAAAASUVORK5CYII=);
background-position: right 2px top 2px;
background-repeat: no-repeat;
}
.platform-telegram-facebook {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAAXNSR0IArs4c6QAAADRJREFUGBlj1F764D8DAcACk78SJQ9jwmmdZQ/BbLgimABIMYwNU80EY+Cjh4QidJ+BPAQAUcEMK/ZfXe8AAAAASUVORK5CYII=),
url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAAXNSR0IArs4c6QAAAEJJREFUGBljtIqc8Z+BAGCByR9dlg5jwmnrqJlgNlwRiAcThKuCMpjQBbDxUUxCthLZVBRFyBLIJhJlHVGKGIkJJwAbVQzJXzC/gwAAAABJRU5ErkJggg==);
background-position: right 2px top 2px, right 12px top 2px;
background-repeat: no-repeat, no-repeat;
}
.platform-smooch-facebook {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAAXNSR0IArs4c6QAAAENJREFUGBljXOyx/T8DAcAEk4/Z7gFjgmlkPlwRSAYmAaNhulAULfHcAVYIopEBiiKQBLoCkBiGIpAgOqCeIkZiwgkAEPoRCUXTyWoAAAAASUVORK5CYII=),
url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAAXNSR0IArs4c6QAAAEJJREFUGBljtIqc8Z+BAGCByR9dlg5jwmnrqJlgNlwRiAcThKuCMpjQBbDxUUxCthLZVBRFyBLIJhJlHVGKGIkJJwAbVQzJXzC/gwAAAABJRU5ErkJggg==);
background-position: right 2px top 2px, right 12px top 2px;
background-repeat: no-repeat, no-repeat;
}
.platform-smooch-telegram {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAAXNSR0IArs4c6QAAAENJREFUGBljXOyx/T8DAcAEk4/Z7gFjgmlkPlwRSAYmAaNhulAULfHcAVYIopEBiiKQBLoCkBiGIpAgOqCeIkZiwgkAEPoRCUXTyWoAAAAASUVORK5CYII=),
url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAAXNSR0IArs4c6QAAADRJREFUGBlj1F764D8DAcACk78SJQ9jwmmdZQ/BbLgimABIMYwNU80EY+Cjh4QidJ+BPAQAUcEMK/ZfXe8AAAAASUVORK5CYII=);
background-position: right 2px top 2px, right 12px top 2px;
background-repeat: no-repeat, no-repeat;
}
.platform-telegram-facebook-smooch {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAAXNSR0IArs4c6QAAADRJREFUGBlj1F764D8DAcACk78SJQ9jwmmdZQ/BbLgimABIMYwNU80EY+Cjh4QidJ+BPAQAUcEMK/ZfXe8AAAAASUVORK5CYII=),
url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAAXNSR0IArs4c6QAAAEJJREFUGBljtIqc8Z+BAGCByR9dlg5jwmnrqJlgNlwRiAcThKuCMpjQBbDxUUxCthLZVBRFyBLIJhJlHVGKGIkJJwAbVQzJXzC/gwAAAABJRU5ErkJggg==),
url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAAXNSR0IArs4c6QAAAENJREFUGBljXOyx/T8DAcAEk4/Z7gFjgmlkPlwRSAYmAaNhulAULfHcAVYIopEBiiKQBLoCkBiGIpAgOqCeIkZiwgkAEPoRCUXTyWoAAAAASUVORK5CYII=);
background-position: right 2px top 2px, right 12px top 2px, right 22px top 2px;
background-repeat: no-repeat, no-repeat, no-repeat;
}
</style>