UNPKG

datacake-nodes

Version:

a collection of datacake nodes for node-red

287 lines (266 loc) 11.9 kB
<script type="text/javascript"> function disableSelects(choice = false) { if (!choice) { $('#node-input-field_id').val(''); $('#node-input-field_id_select').val(''); $('#node-input-field_id_select').empty(); $('#node-input-field_id_select').attr('disabled', 'disabled'); $('#node-input-device_id').val(''); $('#node-input-device_id_select').val(''); $('#node-input-device_id_select').empty(); $('#node-input-device_id_select').attr('disabled', 'disabled'); } else if (choice == "field") { $('#node-input-field_id').val(''); $('#node-input-field_id_select').val(''); $('#node-input-field_id_select').empty(); $('#node-input-field_id_select').attr('disabled', 'disabled'); } else if (choice == "device") { $('#node-input-device_id').val(''); $('#node-input-device_id_select').val(''); $('#node-input-device_id_select').empty(); $('#node-input-device_id_select').attr('disabled', 'disabled'); } } function enableSelects(choice = false) { if (!choice) { $('#node-input-field_id_select').prop("disabled", false); $('#node-input-device_id_select').prop("disabled", false); } else if (choice == "field") { $('#node-input-field_id_select').prop("disabled", false); } else if (choice == "device") { $('#node-input-device_id_select').prop("disabled", false); } } function fillFieldSelects(api_token, workspace_id) { let currentDeviceId = $('#node-input-device_id_select').val(); $('#node-input-device_id').val(currentDeviceId); if (typeof (currentDeviceId) !== 'undefined' && currentDeviceId != null && currentDeviceId != "") { let actualId = currentDeviceId.split("#")[0]; buildFieldSelects(actualId, api_token, workspace_id) } else { disableSelects('field'); } } function fillDeviceSelects(api_token, workspace_id) { $('#node-input-device_id_select').val(''); $('#node-input-device_id_select').empty(); let datacake_api_graphql = 'https://api.datacake.co/graphql/'; $.ajax({ method: "POST", url: datacake_api_graphql, contentType: "application/json", headers: { Authorization: "Token " + api_token }, data: JSON.stringify({ query: `query { workspace(id:"${workspace_id}") { id products { id slug name measurementFields { id verboseFieldName fieldName } } } allDevices(inWorkspace:"${workspace_id}") { id verboseName product { id slug measurementFields { id verboseFieldName fieldName } } } }`, variables: { "entry": $('#entry').val() } }), success: function (result) { if (result.data.allDevices.length) { $('#node-input-device_id_select').empty(); // build device select $('#node-input-device_id_select').append( $('<option>', { value: false, text: "-- Device auswählen --", selected: true, }) ); $.each(result.data.allDevices, function (i, item) { $('#node-input-device_id_select').append( $('<option>', { value: item.id + '#' + item.product.slug, text: item.verboseName, }) ); }); if ($('#node-input-device_id').val()) { // select init $('#node-input-device_id_select').val($('#node-input-device_id').val()); } // fill fields fillFieldSelects(api_token, workspace_id); $('#node-input-device_id_select').change(function (e) { fillFieldSelects(api_token, workspace_id); }); enableSelects('device'); } else { disableSelects(); } } }); } function buildFieldSelects(currentDeviceId, api_token, workspace_id) { $('#node-input-field_id_select').val(''); $('#node-input-field_id_select').empty(); let datacake_api_graphql = 'https://api.datacake.co/graphql/'; $.ajax({ method: "POST", url: datacake_api_graphql, contentType: "application/json", headers: { Authorization: "Token " + api_token }, data: JSON.stringify({ query: `query { workspace(id:"${workspace_id}") { id products { id slug name measurementFields { id verboseFieldName fieldName } } } allDevices(inWorkspace:"${workspace_id}") { id verboseName product { id slug measurementFields { id verboseFieldName fieldName } } } }`, variables: { "entry": $('#entry').val() } }), success: function (result) { //currentDeviceId if (result.data.allDevices.length) { $('#node-input-field_id_select').empty(); var result = $.grep(result.data.allDevices, function (e) { return e.id == currentDeviceId; }); // build device select if (result.length !== 0) { $('#node-input-field_id_select').append( $('<option>', { value: '+', text: 'All Fields', selected: true, }) ); $.each(result[0].product.measurementFields, function (i, item) { $('#node-input-field_id_select').append( $('<option>', { value: item.fieldName, text: item.verboseFieldName }) ); }); } if ($('#node-input-field_id').val()) { $('#node-input-field_id_select').val($('#node-input-field_id').val()); } $('#node-input-field_id_select').change(function (e) { $('#node-input-field_id').val($('#node-input-field_id_select').val()); }); enableSelects('field'); } else { disableSelects('field'); } } }); } RED.nodes.registerType('datacake-device-input', { category: 'datacake', color: '#F29D00', defaults: { name: { value: "" }, datacake_configuration: { value: "", type: "datacake-configuration", required: true }, device_id: { value: "", required: true }, field_id: { value: "", required: true }, product_slug: { value: "", required: false } }, inputs: 0, outputs: 1, icon: "datacake.svg", label: function () { return this.name || "Datacake Input"; }, oneditprepare: function () { $('#node-input-datacake_configuration').on('change', function () { var hasConfiguration = false; let thisConfig = $(this).val(); if (thisConfig != "") { var datacake_configuration = RED.nodes.node(thisConfig); if (datacake_configuration && datacake_configuration.api_token && datacake_configuration.workspace_id) { hasConfiguration = true; } } if (!hasConfiguration) { // disable inputs disableSelects(); // show error message } else { fillDeviceSelects(datacake_configuration.api_token, datacake_configuration.workspace_id); } }); } }); </script> <script type="text/x-red" data-template-name="datacake-device-input"> <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-datacake_configuration"><i class="icon-tag"></i> Datacake Configuration</label> <input type="text" id="node-input-datacake_configuration" placeholder="Datacake Configuration"> </div> <div class="form-row"> <label for="node-input-device_id"><i class="icon-tag"></i> Device</label> <input type="hidden" id="node-input-device_id" placeholder="Device ID" required> <select id="node-input-device_id_select"> <option value=""></option> </select> </div> <div class="form-row"> <label for="node-input-field_id"><i class="icon-tag"></i> Field</label> <input type="hidden" id="node-input-field_id" placeholder="Field ID" required> <select id="node-input-field_id_select"> <option value=""></option> </select> </div> </script> <script type="text/x-red" data-help-name="datacake-device-input"> <p>A datacake input node to access device inputs</p> </script>