113 lines
4.1 KiB
JavaScript
113 lines
4.1 KiB
JavaScript
const statestore = require('../store/state.js')
|
|
const { appendTopic } = require('../utils/index.js')
|
|
|
|
module.exports = function (RED) {
|
|
function ButtonNode (config) {
|
|
// create node in Node-RED
|
|
RED.nodes.createNode(this, config)
|
|
const node = this
|
|
|
|
// which group are we rendering this widget
|
|
const group = RED.nodes.getNode(config.group)
|
|
|
|
const beforeSend = async function (msg) {
|
|
let error = null
|
|
|
|
// retrieve the payload we're sending from this button
|
|
let payloadType = config.payloadType
|
|
let payload = config.payload
|
|
|
|
if (payloadType === 'flow' || payloadType === 'global') {
|
|
try {
|
|
const parts = RED.util.normalisePropertyExpression(payload)
|
|
if (parts.length === 0) {
|
|
throw new Error()
|
|
}
|
|
payload = RED.util.evaluateNodeProperty(payload, payloadType, node)
|
|
} catch (err) {
|
|
node.warn('Invalid payload property expression - defaulting to node id')
|
|
payload = node.id
|
|
payloadType = 'str'
|
|
}
|
|
} else if (payloadType === 'date') {
|
|
payload = Date.now()
|
|
} else {
|
|
try {
|
|
payload = RED.util.evaluateNodeProperty(payload, payloadType, node)
|
|
} catch (err) {
|
|
error = err
|
|
if (payloadType === 'bin') {
|
|
node.error('Badly formatted buffer')
|
|
} else {
|
|
node.error(err, payload)
|
|
}
|
|
}
|
|
}
|
|
|
|
msg.payload = payload
|
|
|
|
const updates = msg.ui_update
|
|
|
|
if (updates) {
|
|
// dynamic properties
|
|
if (typeof updates.label !== 'undefined') {
|
|
// dynamically set "label" property
|
|
statestore.set(group.getBase(), node, msg, 'label', updates.label)
|
|
}
|
|
if (typeof updates.icon !== 'undefined') {
|
|
// dynamically set "icon" property
|
|
statestore.set(group.getBase(), node, msg, 'icon', updates.icon)
|
|
}
|
|
if (typeof updates.iconPosition !== 'undefined') {
|
|
// dynamically set "iconPosition" property
|
|
statestore.set(group.getBase(), node, msg, 'iconPosition', updates.iconPosition)
|
|
}
|
|
if (typeof updates.buttonColor !== 'undefined') {
|
|
// dynamically set "buttonColor" property
|
|
statestore.set(group.getBase(), node, msg, 'buttonColor', updates.buttonColor)
|
|
}
|
|
if (typeof updates.textColor !== 'undefined') {
|
|
// dynamically set "textColor" property
|
|
statestore.set(group.getBase(), node, msg, 'textColor', updates.textColor)
|
|
}
|
|
if (typeof updates.iconColor !== 'undefined') {
|
|
// dynamically set "iconColor" property
|
|
statestore.set(group.getBase(), node, msg, 'iconColor', updates.iconColor)
|
|
}
|
|
}
|
|
|
|
if (!error) {
|
|
return msg
|
|
} else {
|
|
node.error(error)
|
|
return null
|
|
}
|
|
}
|
|
|
|
const evts = {
|
|
onAction: true,
|
|
beforeSend,
|
|
onInput: async function (msg) {
|
|
if (config.emulateClick) {
|
|
msg = await beforeSend(msg)
|
|
|
|
if (config.topic || config.topicType) {
|
|
msg = await appendTopic(RED, config, node, msg)
|
|
}
|
|
|
|
node.send(msg)
|
|
}
|
|
}
|
|
}
|
|
|
|
// inform the dashboard UI that we are adding this node
|
|
if (group) {
|
|
group.register(node, config, evts)
|
|
} else {
|
|
node.error('No group configured')
|
|
}
|
|
}
|
|
|
|
RED.nodes.registerType('ui-button', ButtonNode)
|
|
}
|