node-red-contrib-web-push
Version:
Web Push notifications for Node-RED
184 lines (158 loc) • 6.58 kB
HTML
<script type="text/javascript">
RED.nodes.registerType('web-push-notification', {
category: 'PWA',
color: '#CCB2FF',
defaults: {
name: { value: "" },
title: { value: "" },
body: { value: "" },
sound: { value: "" },
payload: { value: "" }
},
inputs: 1,
outputs: 1,
icon: "pwa_icon.png",
label: function () {
return this.name || "web push notification";
},
oneditprepare: function () {
var that = this;
function setupPayload() {
// create the editable list
$("#node-input-payload-container").css('min-height', '150px').editableList({
addItem: function (container, i, opt) {
if (!opt.hasOwnProperty("key")) {
opt.key = "";
}
if (!opt.hasOwnProperty("value")) {
opt.value = "";
}
if (!opt.hasOwnProperty("type")) {
opt.type = "str";
}
// create row div
var row = $('<div/>').appendTo(container);
// create the key/value fields
var keyField = $('<input/>', {
class: "node-input-payload-key",
type: "text",
style: "margin-left: 5px; width: 30%"
}).appendTo(row).typedInput({
default: 'str',
types: ['str']
});
var valueField = $('<input/>', {
class: "node-input-payload-value",
type: "text",
style: "margin-left: 5px; width: 65%;"
}).appendTo(row).typedInput({
default: opt.type,
types: ['str', 'num', 'bool', 'json']
});
// set the value
keyField.typedInput("value", opt.key)
valueField.typedInput("value", opt.value)
},
sortable: true,
removable: true
})
// show/hide the payload editable list
function updatePayloadOptions() {
if ($("#use-payload").is(':checked')) {
$("#node-row-payload").show();
} else {
$("#node-row-payload").hide();
}
}
$("#use-payload").prop("checked", that.payload.length > 0);
updatePayloadOptions();
// show/hide on checkbox click
$("#use-payload").on("click", function () {
updatePayloadOptions();
});
// add existing values
try {
var payload = JSON.parse(that.payload);
for (var i = 0; i < payload.length; i++) {
var opt = payload[i];
$("#node-input-payload-container").editableList('addItem', opt);
}
} catch (err) { }
} // -- setupPayload
setupPayload()
},
oneditsave: function () {
// save the payload
var payload = [];
if ($("#use-payload").is(':checked')) {
var payloadItems = $("#node-input-payload-container").editableList('items');
payloadItems.each(function (i) {
var key = $(this).find(".node-input-payload-key").typedInput("value");
var value = $(this).find(".node-input-payload-value").typedInput("value");
var type = $(this).find(".node-input-payload-value").typedInput("type");
var opt = {
key: key,
value: value,
type: type
}
payload.push(opt);
})
}
if (payload.length > 0) {
$("#node-input-payload").val(JSON.stringify(payload));
} else {
$("#node-input-payload").val(null);
}
}
});
</script>
<script type="text/x-red" data-template-name="web-push-notification">
<!--Title-->
<div class="form-row">
<label for="node-input-title"><i class="fa fa-header"></i> Title</label>
<input type="text" id="node-input-title">
</div>
<!--Message text-->
<div class="form-row">
<label for="node-input-body"><i class="fa fa-comment"></i> Text</label>
<input type="text" id="node-input-body">
</div>
<!--Sound-->
<div class="form-row">
<label for="node-input-sound"><i class="fa fa-volume-up"></i> Sound</label>
<select type="text" id="node-input-sound">
<option value="">Disabled</option>
<option value="default">Enabled</option>
</select>
</div>
<!--Payload-->
<div class="form-row">
<input type="checkbox" id="use-payload" class="checkbox-input">
<label for="use-payload" style="width: auto"> Payload</label>
<input type="hidden" id="node-input-payload">
<div id="node-row-payload" class="form-row node-input-payload-container-row hide">
<ol id="node-input-payload-container"></ol>
</div>
</div>
<!--Name-->
<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>
</script>
<style>
#node-input-sound {
width: 100px;
}
.checkbox-input {
display: inline-block ;
width: auto ;
vertical-align: top ;
}
.checkbox-label {
width: auto ;
}
</style>
<script type="text/x-red" data-help-name="web-push-notification">
<p>A notification node which holds all the Web Push notification properties.</p>
</script>