From ccb484c7187e72d712d6b9ca340da59d9f2944f5 Mon Sep 17 00:00:00 2001 From: Paulo Vitor Magacho Date: Fri, 14 Jun 2024 16:08:33 -0300 Subject: [PATCH 1/6] Fix issue with max number --- src/datasource.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/datasource.ts b/src/datasource.ts index e9693a4..b0ed45c 100644 --- a/src/datasource.ts +++ b/src/datasource.ts @@ -247,12 +247,7 @@ export class PiWebAPIDatasource extends DataSourceWithBackend Date: Fri, 14 Jun 2024 16:08:44 -0300 Subject: [PATCH 2/6] Fix issue with max number --- dist/module.js | 2 +- dist/module.js.map | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/module.js b/dist/module.js index f0e85a6..6a365f8 100644 --- a/dist/module.js +++ b/dist/module.js @@ -1,2 +1,2 @@ -define(["@grafana/data","react","@grafana/ui","lodash","rxjs","@grafana/runtime"],((e,t,a,n,l,r)=>(()=>{"use strict";var i={781:t=>{t.exports=e},531:e=>{e.exports=r},7:e=>{e.exports=a},241:e=>{e.exports=n},959:e=>{e.exports=t},269:e=>{e.exports=l}},s={};function o(e){var t=s[e];if(void 0!==t)return t.exports;var a=s[e]={exports:{}};return i[e](a,a.exports,o),a.exports}o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var a in t)o.o(t,a)&&!o.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var u={};o.r(u),o.d(u,{plugin:()=>z});var m=o(781),h=o(959),c=o.n(h),d=o(7);function p(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function g(e){for(var t=1;tv(g({},e),{jsonData:v(g({},e.jsonData),{url:e.url})});class f extends h.PureComponent{render(){const{options:e}=this.props,t=y(e);return c().createElement("div",null,c().createElement(d.DataSourceHttpSettings,{defaultUrl:"https://server.name/piwebapi",dataSourceConfig:t,onChange:this.onHttpOptionsChange,showAccessOptions:!0}),c().createElement("h3",{className:"page-heading"},"Custom Configuration"),c().createElement("div",{className:"gf-form-group"},c().createElement("div",{className:"gf-form-inline"},c().createElement(d.InlineField,{label:"Enable PI Points in Query",labelWidth:24},c().createElement(d.InlineSwitch,{value:t.jsonData.pipoint,onChange:this.onPiPointChange}))),c().createElement("div",{className:"gf-form-inline"},c().createElement(d.InlineField,{label:"Enable New Data Format",labelWidth:24},c().createElement(d.InlineSwitch,{value:t.jsonData.newFormat,onChange:this.onNewFormatChange}))),c().createElement("div",{className:"gf-form-inline"},c().createElement(d.InlineField,{label:"Enable Unit in Data",labelWidth:24},c().createElement(d.InlineSwitch,{value:t.jsonData.useUnit,onChange:this.onUseUnitChange}))),c().createElement("div",{className:"gf-form-inline"},c().createElement(d.InlineField,{label:"Enable Experimental Features",labelWidth:24},c().createElement(d.InlineSwitch,{value:t.jsonData.useExperimental,onChange:this.onUseExperimentalChange}))),t.jsonData.useExperimental&&c().createElement("div",{className:"gf-form-inline"},c().createElement(d.InlineField,{label:"Enable Steaming Support",labelWidth:24},c().createElement(d.InlineSwitch,{value:t.jsonData.useStreaming,onChange:this.onUseStreamingChange})))),c().createElement("h3",{className:"page-heading"},"PI/AF Connection Details"),c().createElement("div",{className:"gf-form-group"},t.jsonData.pipoint&&c().createElement("div",{className:"gf-form"},c().createElement(b,{label:"PI Server",labelWidth:10,inputWidth:25,onChange:this.onPIServerChange,value:t.jsonData.piserver||"",placeholder:"Default PI Server to use for data requests"})),c().createElement("div",{className:"gf-form"},c().createElement(b,{label:"AF Server",labelWidth:10,inputWidth:25,onChange:this.onAFServerChange,value:t.jsonData.afserver||"",placeholder:"Default AF Server to use for data requests"})),c().createElement("div",{className:"gf-form"},c().createElement(b,{label:"AF Database",labelWidth:10,inputWidth:25,onChange:this.onAFDatabaseChange,value:t.jsonData.afdatabase||"",placeholder:"Default AF Database server for AF queries"}))))}constructor(...e){super(...e),p(this,"onPIServerChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=v(g({},a.jsonData),{piserver:e.target.value});t(v(g({},a),{jsonData:n}))})),p(this,"onAFServerChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=v(g({},a.jsonData),{afserver:e.target.value});t(v(g({},a),{jsonData:n}))})),p(this,"onAFDatabaseChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=v(g({},a.jsonData),{afdatabase:e.target.value});t(v(g({},a),{jsonData:n}))})),p(this,"onHttpOptionsChange",(e=>{const{onOptionsChange:t}=this.props;t(y(e))})),p(this,"onPiPointChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=v(g({},a.jsonData),{piserver:e.target.checked?a.jsonData.piserver:"",pipoint:e.target.checked});t(v(g({},a),{jsonData:n}))})),p(this,"onNewFormatChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=v(g({},a.jsonData),{newFormat:e.target.checked});t(v(g({},a),{jsonData:n}))})),p(this,"onUseUnitChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=v(g({},a.jsonData),{useUnit:e.target.checked});t(v(g({},a),{jsonData:n}))})),p(this,"onUseExperimentalChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=v(g({},a.jsonData),{useExperimental:e.target.checked,useStreaming:!!e.target.checked&&a.jsonData.useStreaming});t(v(g({},a),{jsonData:n}))})),p(this,"onUseStreamingChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=v(g({},a.jsonData),{useStreaming:e.target.checked});t(v(g({},a),{jsonData:n}))}))}}var E=o(241);function S(){return S=Object.assign||function(e){for(var t=1;tc().createElement(c().Fragment,null,c().createElement(d.InlineFormLabel,{width:t,tooltip:a},e),n),I=()=>c().createElement("div",{className:"gf-form gf-form--grow"},c().createElement("div",{className:"gf-form-label gf-form-label--grow"})),w=e=>{var t=S({},P(e));return c().createElement(O,null,c().createElement(C,t))},O=e=>c().createElement("div",{className:"gf-form-inline"},e.children,c().createElement(I,null)),x=e=>{var t=S({},P(e));return c().createElement(D,null,c().createElement(C,t))},D=e=>c().createElement(c().Fragment,null,e.children),F={target:";",attributes:[],segments:[],regex:{enable:!1},summary:{types:[],basis:"EventWeighted",interval:"",nodata:"Null"},expression:"",interpolate:{enable:!1},useLastValue:{enable:!1},recordedValues:{enable:!1},digitalStates:{enable:!1},enableStreaming:{enable:!1},useUnit:{enable:!1},isPiPoint:!1},j=({isRaw:e,onChange:t})=>{const[a,n]=(0,h.useState)(!1);return(0,h.useEffect)((()=>{n(!1)}),[e]),e?c().createElement(c().Fragment,null,c().createElement(d.Button,{"aria-label":"Switch to visual editor",icon:"pen",variant:"secondary",type:"button",onClick:()=>{n(!0)}}),c().createElement(d.ConfirmModal,{isOpen:a,title:"Switch to visual editor mode",body:"Are you sure to switch to visual editor mode? You will lose the changes done in raw query mode.",confirmText:"Yes, switch to editor mode",dismissText:"No, stay in raw query mode",onConfirm:()=>{t(!1)},onDismiss:()=>{n(!1)}})):c().createElement(d.Button,{"aria-label":"Switch to text editor",icon:"pen",variant:"secondary",type:"button",onClick:()=>{t(!0)}})};function A(e){return(0,E.map)(e,(e=>{var t,a;return{text:e.Name,expandable:void 0===e.HasChildren||!0===e.HasChildren||(null!==(t=e.Path)&&void 0!==t?t:"").split("\\").length<=3,HasChildren:e.HasChildren,Items:null!==(a=e.Items)&&void 0!==a?a:[],Path:e.Path,WebId:e.WebId}}))}function W(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function V(e){for(var t=1;t{var t;return e.value?c().createElement("div",{className:"gf-form-label "+("template"===e.value.type?"query-keyword":"")},null!==(t=e.label)&&void 0!==t?t:"--no label--"):c().createElement("a",{className:"gf-form-label query-part"},c().createElement(d.Icon,{name:"plus"}))};class R extends h.PureComponent{isValueEmpty(e){return!e||!e.value||!e.value.length||e.value===B}calcBasisValueChanged(e){const t=this.props.query,a=t.summary;var n;a&&(a.basis=null===(n=e.value)||void 0===n?void 0:n.value),this.onChange(N(V({},t),{summary:a}))}getCalcBasisSegments(){return(0,E.map)(this.calculationBasis,(e=>({label:e,value:{value:e,expandable:!0}})))}calcNoDataValueChanged(e){const t=this.props.query,a=t.summary;var n;a&&(a.nodata=null===(n=e.value)||void 0===n?void 0:n.value),this.onChange(N(V({},t),{summary:a}))}getNoDataSegments(){return(0,E.map)(this.noDataReplacement,(e=>({label:e,value:{value:e,expandable:!0}})))}onSummaryValueChanged(e,t){const a=this.state.summaries.slice(0);a[t]=e,this.isValueEmpty(e.value)&&a.splice(t,1),this.setState({summaries:a},this.stateCallback)}getSummarySegments(){const e=(0,E.filter)(this.summaryTypes,(e=>-1===this.state.summaries.map((e=>{var t;return null===(t=e.value)||void 0===t?void 0:t.value})).indexOf(e))),t=(0,E.map)(e,(e=>({label:e,value:{value:e,expandable:!0}})));return t.unshift({label:B,value:{value:B}}),t}removeSummary(e){const t=(0,E.filter)(this.state.summaries,(t=>t!==e));this.setState({summaries:t})}onSummaryAction(e){const t=this.state.summaries.slice(0);if(!this.isValueEmpty(e.value)){var a;let n={label:e.label,value:{value:null===(a=e.value)||void 0===a?void 0:a.value,expandable:!0}};t.push(n)}this.setState({summarySegment:{},summaries:t},this.stateCallback)}removeAttribute(e){const t=(0,E.filter)(this.state.attributes,(t=>t!==e));this.attributeChangeValue(t)}onAttributeAction(e){const{query:t}=this.props,a=this.state.attributes.slice(0);if(!this.isValueEmpty(e.value)){var n;let l={label:e.label,value:{value:null===(n=e.value)||void 0===n?void 0:n.value,expandable:!t.isPiPoint}};a.push(l)}this.attributeChangeValue(a)}getSegmentPathUpTo(e,t){const a=e.slice(0,t);return(0,E.reduce)(a,((e,t)=>{var a;return t.value?(null===(a=t.value.value)||void 0===a?void 0:a.startsWith("-Select"))?e:e?e+"\\"+t.value.value:t.value.value:""}),"")}checkAttributeSegments(e,t){var a;const{datasource:n,data:l}=this.props,r=this,i={path:this.getSegmentPathUpTo(t.slice(0),t.length),type:"attributes"};var s;return n.metricFindQuery(i,Object.assign(null!==(s=null==l||null===(a=l.request)||void 0===a?void 0:a.scopedVars)&&void 0!==s?s:{},{isPiPoint:!1})).then((t=>{const a={};(0,E.each)(t,(e=>{a[e.Path.substring(e.Path.indexOf("|")+1)]=e.WebId}));const l=(0,E.filter)(e,(e=>{var t;const l=n.templateSrv.replace(null===(t=e.value)||void 0===t?void 0:t.value);return void 0!==a[l]}));return r.availableAttributes=a,this.attributeChangeValue(l)})).catch((t=>(r.error=t.message||"Failed to issue metric query",this.attributeChangeValue(e))))}checkPiPointSegments(e,t){var a;const{datasource:n,data:l}=this.props,r=this,i={path:e.path,webId:r.getSelectedPIServer(),pointName:e.label,type:"pipoint"};var s;return n.metricFindQuery(i,Object.assign(null!==(s=null==l||null===(a=l.request)||void 0===a?void 0:a.scopedVars)&&void 0!==s?s:{},{isPiPoint:!0})).then((()=>r.attributeChangeValue(t))).catch((e=>(r.error=e.message||"Failed to issue metric query",r.attributeChangeValue([]))))}getSelectedPIServer(){var e;let t="";return this.piServer.forEach((e=>{const a=this.props.query.target.split(";");a.length>=2&&a[0]===e.text&&(t=e.WebId)})),this.piServer.length>0?null===(e=this.piServer[0].value)||void 0===e?void 0:e.webId:t}textEditorChanged(){const{query:e}=this.props,t=e.target.split(";"),a=t.length>0?t[0].split("\\"):[];let n=[],l=[];a.length>1||1===a.length&&""!==a[0]?(t.splice(0,1),(0,E.each)(a,((e,t)=>{n.push({label:e,value:{type:e.match(/\${\w+}/gi)?"template":void 0,value:e,expandable:!0}})})),(0,E.each)(t,(function(e,t){""!==e&&l.push({label:e,value:{value:e,expandable:!1}})})),this.getElementSegments(a.length+1,n).then((e=>{e.length>0&&n.push({label:"Select Element",value:{value:"-Select Element-"}})})).then((()=>{this.updateArray(n,l,this.state.summaries,e.isPiPoint,(()=>{this.onChange(N(V({},e),{query:void 0,rawQuery:!1,attributes:this.state.attributes,segments:this.state.segments}))}))}))):(n=this.checkAfServer(),this.updateArray(n,this.state.attributes,this.state.summaries,e.isPiPoint,(()=>{this.onChange(N(V({},e),{query:void 0,rawQuery:!1,attributes:this.state.attributes,segments:this.state.segments}))})))}render(){const{query:e,onChange:t,onRunQuery:a}=this.props,n=(0,E.defaults)(e,F),{useLastValue:l,useUnit:r,interpolate:i,query:s,rawQuery:o,digitalStates:u,enableStreaming:m,recordedValues:h,expression:p,isPiPoint:g,summary:v,display:b,regex:y}=n;return c().createElement(c().Fragment,null,this.props.datasource.piPointConfig&&c().createElement(d.InlineField,{label:"Is Pi Point?",labelWidth:T},c().createElement(d.InlineSwitch,{value:g,onChange:this.onIsPiPointChange})),!!o&&c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Raw Query",labelWidth:T,grow:!0},c().createElement(d.Input,{onBlur:this.stateCallback,value:s,onChange:e=>t(N(V({},n),{query:e.target.value})),placeholder:"enter query"})),c().createElement(j,{isRaw:!0,onChange:e=>this.textEditorChanged()})),!o&&c().createElement(c().Fragment,null,c().createElement("div",{className:"gf-form-inline"},c().createElement(x,{label:g?"PI Server":"AF Elements",tooltip:g?"Select PI server.":"Select AF Element."},this.state.segments.map(((e,t)=>c().createElement(d.SegmentAsync,{key:"element-"+t,Component:c().createElement(q,{value:e.value,label:e.label}),onChange:e=>this.onSegmentChange(e,t),loadOptions:e=>this.getElementSegments(t),allowCustomValue:!0,inputMinWidth:200}))),c().createElement(I,null),!g&&c().createElement(j,{isRaw:!1,onChange:e=>{t(N(V({},n),{query:n.target,rawQuery:e}))}}))),c().createElement(w,{label:g?"Pi Points":"Attributes"},this.state.attributes.map(((e,t)=>g?c().createElement(d.SegmentAsync,{key:"attributes-"+t,Component:c().createElement(q,{value:e.value,label:e.label}),disabled:0===this.piServer.length,onChange:e=>this.onPiPointChange(e,t),loadOptions:this.getAttributeSegmentsPI,reloadOptionsOnChange:!0,allowCustomValue:!0,inputMinWidth:k}):c().createElement(d.Segment,{key:"attributes-"+t,Component:c().createElement(q,{value:e.value,label:e.label}),disabled:this.state.segments.length<=2,onChange:e=>this.onAttributeChange(e,t),options:this.getAttributeSegmentsAF(),allowCustomValue:!0,inputMinWidth:k}))),g&&c().createElement(d.SegmentAsync,{Component:c().createElement(q,{value:this.state.attributeSegment.value,label:this.state.attributeSegment.label}),disabled:0===this.piServer.length,onChange:this.onAttributeAction,loadOptions:this.getAttributeSegmentsPI,reloadOptionsOnChange:!0,allowCustomValue:!0,inputMinWidth:k}),!g&&c().createElement(d.Segment,{Component:c().createElement(q,{value:this.state.attributeSegment.value,label:this.state.attributeSegment.label}),disabled:this.state.segments.length<=2,onChange:this.onAttributeAction,options:this.getAttributeSegmentsAF(),allowCustomValue:!0,inputMinWidth:k}))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Calculation",grow:!0,labelWidth:T,tooltip:"Modify all attributes by an equation. Use '.' for current item. Leave Attributes empty if you wish to perform element based calculations."},c().createElement(d.Input,{onBlur:a,value:p,onChange:e=>t(N(V({},n),{expression:e.target.value})),placeholder:"'.'*2"}))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Use Last Value",tooltip:"Fetch only last value from time range",labelWidth:T},c().createElement(d.InlineSwitch,{value:l.enable,onChange:()=>this.onChange(N(V({},n),{useLastValue:N(V({},l),{enable:!l.enable})}))})),c().createElement(d.InlineField,{label:"Digital States",labelWidth:T},c().createElement(d.InlineSwitch,{value:u.enable,onChange:()=>this.onChange(N(V({},n),{digitalStates:N(V({},u),{enable:!u.enable})}))})),c().createElement(d.InlineField,{label:"Replace Bad Data",labelWidth:T,tooltip:"Replacement for bad quality values."},c().createElement(d.Segment,{Component:c().createElement(q,{value:{value:null==v?void 0:v.nodata},label:null==v?void 0:v.nodata}),onChange:this.calcNoDataValueChanged,options:this.getNoDataSegments(),allowCustomValue:!0})),this.props.datasource.useUnitConfig&&c().createElement(d.InlineField,{label:"Use unit from datapoints",tooltip:"Use unit in label from PI tag or PI AF attribute",labelWidth:T},c().createElement(d.InlineSwitch,{value:r.enable,onChange:()=>this.onChange(N(V({},n),{useUnit:N(V({},r),{enable:!r.enable})}))})),this.props.datasource.useStreaming&&c().createElement(d.InlineField,{label:"Enable Streaming",labelWidth:T,tooltip:"Enable streaming data if it is supported for the point type."},c().createElement(d.InlineSwitch,{value:m.enable,onChange:()=>this.onChange(N(V({},n),{enableStreaming:N(V({},m),{enable:!m.enable})}))}))),c().createElement(d.InlineFieldRow,null,!l.enable&&c().createElement(d.InlineField,{label:"Max Recorded Values",labelWidth:T,tooltip:"Maximum number of recorded value to retrive from the data archive, without using interpolation."},c().createElement(d.Input,{onBlur:a,value:h.maxNumber,onChange:e=>t(N(V({},n),{recordedValues:N(V({},h),{maxNumber:parseInt(e.target.value,10)})})),type:"number",placeholder:"1000"})),c().createElement(d.InlineField,{label:"Recorded Values",labelWidth:T},c().createElement(d.InlineSwitch,{value:h.enable,onChange:()=>this.onChange(N(V({},n),{recordedValues:N(V({},h),{enable:!h.enable})}))}))),!l.enable&&c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:p?"Interval Period":"Interpolate Period",labelWidth:T,tooltip:"Override time between sampling, e.g. '30s'. Defaults to timespan/chart width."},c().createElement(d.Input,{onBlur:a,value:i.interval,onChange:e=>t(N(V({},n),{interpolate:N(V({},i),{interval:e.target.value})})),placeholder:"30s"})),c().createElement(d.InlineField,{label:p?"Interval Values":"Interpolate",labelWidth:T},c().createElement(d.InlineSwitch,{value:i.enable,onChange:()=>this.onChange(N(V({},n),{interpolate:N(V({},i),{enable:!i.enable})}))}))),!l.enable&&c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Summary Period",labelWidth:T,tooltip:"Define the summary period, e.g. '30s'."},c().createElement(d.Input,{onBlur:a,value:null==v?void 0:v.interval,onChange:e=>t(N(V({},n),{summary:N(V({},v),{interval:e.target.value})})),placeholder:"30s"})),c().createElement(d.InlineField,{label:"Basis",labelWidth:T,tooltip:"Defines the possible calculation options when performing summary calculations over time-series data."},c().createElement(d.Segment,{Component:c().createElement(q,{value:{value:null==v?void 0:v.basis},label:null==v?void 0:v.basis}),onChange:this.calcBasisValueChanged,options:this.getCalcBasisSegments(),allowCustomValue:!0})),c().createElement(d.InlineField,{label:"Summaries",labelWidth:T,tooltip:"PI Web API summary options."},c().createElement(d.InlineFieldRow,null,this.state.summaries.map(((e,t)=>c().createElement(d.Segment,{key:"summaries-"+t,Component:c().createElement(q,{value:e.value,label:e.label}),onChange:e=>this.onSummaryValueChanged(e,t),options:this.getSummarySegments(),allowCustomValue:!0}))),c().createElement(d.Segment,{Component:c().createElement(q,{value:this.state.summarySegment.value,label:this.state.summarySegment.label}),onChange:this.onSummaryAction,options:this.getSummarySegments(),allowCustomValue:!0})))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Display Name",labelWidth:T,tooltip:"If single attribute, modify display name. Otherwise use regex to modify display name."},c().createElement(d.Input,{onBlur:a,value:b,onChange:e=>t(N(V({},n),{display:e.target.value})),placeholder:"Display"})),c().createElement(d.InlineField,{label:"Enable Regex Replace",labelWidth:T},c().createElement(d.InlineSwitch,{value:y.enable,onChange:()=>{this.onChange(N(V({},n),{regex:N(V({},y),{enable:!y.enable})}))}})),c().createElement(d.InlineField,{label:"Search",labelWidth:16},c().createElement(d.Input,{onBlur:a,value:y.search,onChange:e=>t(N(V({},n),{regex:N(V({},y),{search:e.target.value})})),placeholder:"(.*)"})),c().createElement(d.InlineField,{label:"Replace",labelWidth:16},c().createElement(d.Input,{onBlur:a,value:y.replace,onChange:e=>t(N(V({},n),{regex:N(V({},y),{replace:e.target.value})})),placeholder:"$1"}))))}constructor(e){super(e),W(this,"error",void 0),W(this,"piServer",[]),W(this,"availableAttributes",{}),W(this,"summaryTypes",void 0),W(this,"calculationBasis",void 0),W(this,"noDataReplacement",void 0),W(this,"state",{isPiPoint:!1,segments:[],attributes:[],summaries:[],attributeSegment:{},summarySegment:{},calculationBasisSegment:{},noDataReplacementSegment:{}}),W(this,"segmentChangeValue",(e=>{const t=this.props.query;this.setState({segments:e},(()=>this.onChange(N(V({},t),{segments:e}))))})),W(this,"attributeChangeValue",(e=>{const t=this.props.query;return new Promise((a=>this.setState({attributes:e},(()=>{this.onChange(N(V({},t),{attributes:e})),a()}))))})),W(this,"onPiPointChange",((e,t)=>{let a=this.state.attributes.slice(0);e.label===B?(0,E.remove)(a,((e,a)=>a===t)):a[t]=e,this.checkPiPointSegments(e,a)})),W(this,"onAttributeChange",((e,t)=>{var a;let n=this.state.attributes.slice(0);n[t].label!==(null===(a=e.value)||void 0===a?void 0:a.value)&&(n[t]=e,this.checkAttributeSegments(n,this.state.segments))})),W(this,"onSegmentChange",((e,t)=>{var a;const{query:n}=this.props;let l=this.state.segments.slice(0);l[t].label!==(null===(a=e.value)||void 0===a?void 0:a.value)&&this.setState({attributes:[]},(()=>e.label===B?(l=(0,E.slice)(l,0,t),void this.checkAttributeSegments([],l).then((()=>{var e;0===l.length?l.push({label:""}):(null===(e=l[l.length-1].value)||void 0===e?void 0:e.expandable)&&l.push({label:"Select Element",value:{value:"-Select Element-"}}),n.isPiPoint&&(this.piServer=[]),this.segmentChangeValue(l)}))):(l[t]=e,n.isPiPoint?(this.piServer.push(e),void this.segmentChangeValue(l)):(t{var t,a;return"template"===(null===(t=e.value)||void 0===t?void 0:t.type)?this.getElementSegments(l.length+1,l).then((e=>(e.length>0&&l.push({label:"Select Element",value:{value:"-Select Element-"}}),this.segmentChangeValue(l),l))):((null===(a=e.value)||void 0===a?void 0:a.expandable)&&l.push({label:"Select Element",value:{value:"-Select Element-"}}),new Promise((e=>{this.segmentChangeValue(l),e(l)})))}))))))})),W(this,"getElementSegments",((e,t)=>{var a;const{datasource:n,query:l,data:r}=this.props,i=this,s=l.isPiPoint?{type:"dataserver"}:{path:this.getSegmentPathUpTo(null!=t?t:this.state.segments.slice(0),e),afServerWebId:this.state.segments.length>0&&this.state.segments[0].value?this.state.segments[0].value.webId:void 0};if(!l.isPiPoint){var o,u,m;if((null===(o=n.afserver)||void 0===o?void 0:o.name)&&0===e)return Promise.resolve([{label:n.afserver.name,value:{value:n.afserver.name,expandable:!0}}]);if((null===(u=n.afserver)||void 0===u?void 0:u.name)&&(null===(m=n.afdatabase)||void 0===m?void 0:m.name)&&1===e)return Promise.resolve([{label:n.afdatabase.name,value:{value:n.afdatabase.name,expandable:!0}}])}var h;return n.metricFindQuery(s,Object.assign(null!==(h=null==r||null===(a=r.request)||void 0===a?void 0:a.scopedVars)&&void 0!==h?h:{},{isPiPoint:l.isPiPoint})).then((e=>{const t=(0,E.map)(e,(e=>({label:e.text,value:{webId:e.WebId,value:e.text,expandable:!l.isPiPoint&&e.expandable}})));if(0===t.length)return t;const a=n.templateSrv.getVariables();return(0,E.each)(a,(e=>{let a={label:"${"+e.name+"}",value:{type:"template",value:"${"+e.name+"}",expandable:!l.isPiPoint}};t.unshift(a)})),t.unshift({label:B,value:{value:B}}),t})).catch((e=>(i.error=e.message||"Failed to issue metric query",[])))})),W(this,"getAttributeSegmentsPI",(e=>{var t;const{datasource:a,query:n,data:l}=this.props,r=this,i={path:"",webId:this.getSelectedPIServer(),pointName:(null!=e?e:"")+"*",type:"pipoint"};let s=[];var o;return a.metricFindQuery(i,Object.assign(null!==(o=null==l||null===(t=l.request)||void 0===t?void 0:t.scopedVars)&&void 0!==o?o:{},{isPiPoint:n.isPiPoint})).then((t=>{s=(0,E.map)(t,(e=>({path:e.Path,label:e.text,value:{value:e.text,expandable:!1}}))),e&&e.length>0&&s.unshift({label:e,value:{value:e,expandable:!1}});const l=a.templateSrv.getVariables();return(0,E.each)(l,(e=>{let t={label:"${"+e.name+"}",value:{type:"template",value:"${"+e.name+"}",expandable:!n.isPiPoint}};s.unshift(t)})),s.unshift({label:B,value:{value:B}}),s})).catch((e=>(r.error=e.message||"Failed to issue metric query",s)))})),W(this,"getAttributeSegmentsAF",(e=>{let t=[];return t.push({label:B,value:{value:B}}),(0,E.forOwn)(this.availableAttributes,((e,a)=>{let n={label:a,value:{value:a,expandable:!0}};t.push(n)})),t})),W(this,"buildFromTarget",((e,t,a)=>{const n=e.target.split(";"),l=n.length>0?n[0].split("\\"):[];return l.length>1||1===l.length&&""!==l[0]?(n.splice(0,1),(0,E.each)(l,((e,a)=>{t.push({label:e,value:{type:e.match(/\${\w+}/gi)?"template":void 0,value:e,expandable:!0}})})),(0,E.each)(n,((e,t)=>{""!==e&&a.push({label:e,value:{value:e,expandable:!1}})})),this.getElementSegments(l.length+1,t).then((e=>(e.length>0&&t.push({label:"Select Element",value:{value:"-Select Element-"}}),t)))):Promise.resolve(t)})),W(this,"checkAfServer",(()=>{var e;const{datasource:t}=this.props,a=[];var n;return(null===(e=t.afserver)||void 0===e?void 0:e.name)?(a.push({label:t.afserver.name,value:{value:t.afserver.name,expandable:!0}}),(null===(n=t.afdatabase)||void 0===n?void 0:n.name)&&a.push({label:t.afdatabase.name,value:{value:t.afdatabase.name,expandable:!0}}),a.push({label:"Select Element",value:{value:"-Select Element-"}})):a.push({label:""}),a})),W(this,"updateArray",((e,t,a,n,l)=>{this.setState({segments:e,attributes:t,summaries:a,isPiPoint:n},(()=>{n||this.checkAttributeSegments(t,this.state.segments).then((()=>{l&&l()}))}))})),W(this,"scopedVarsDone",!1),W(this,"componentDidMount",(()=>{this.initialLoad(!1)})),W(this,"componentDidUpdate",(()=>{var e,t,a;const{query:n}=this.props;"Done"===(null===(e=this.props.data)||void 0===e?void 0:e.state)&&(null===(a=this.props.data)||void 0===a||null===(t=a.request)||void 0===t?void 0:t.scopedVars)&&!this.scopedVarsDone&&(this.scopedVarsDone=!0,this.initialLoad(!n.isPiPoint))})),W(this,"initialLoad",(e=>{const{query:t}=this.props,a=(0,E.defaults)(t,F),{segments:n,attributes:l,summary:r,isPiPoint:i}=a;var s;let o=e?[]:null!==(s=null==n?void 0:n.slice(0))&&void 0!==s?s:[];var u;let m=e?[]:null!==(u=null==l?void 0:l.slice(0))&&void 0!==u?u:[];var h;let c=null!==(h=null==r?void 0:r.types)&&void 0!==h?h:[];if(i||0!==o.length)i&&o.length>0&&(this.piServer=o);else{if(t.target&&t.target.length>0&&";"!==t.target)return m=[],void this.buildFromTarget(t,o,m).then((e=>{this.updateArray(e,m,c,!1)})).catch((e=>console.error(e)));o=this.checkAfServer()}this.updateArray(o,m,c,!!i,(()=>{this.onChange(t)}))})),W(this,"onChange",(e=>{const{onChange:t,onRunQuery:a}=this.props;var n,l;if(e.rawQuery){if(e.target=null!==(n=e.query)&&void 0!==n?n:"",e.query){const{attributes:t,elementPath:a}=function(e){const t=e.split(";"),a=t[0].split("\\");t.splice(0,1);let n=[];if(a.length>1||1===a.length&&""!==a[0]){const e=a.join("\\");return(0,E.each)(t,(function(e,t){""!==e&&n.push({label:e,value:{value:e,expandable:!1}})})),{attributes:n,elementPath:e}}return{attributes:n,elementPath:null}}(e.target);e.attributes=t,e.elementPath=a}}else e.elementPath=this.getSegmentPathUpTo(this.state.segments,this.state.segments.length),e.target=e.elementPath+";"+(0,E.join)(null===(l=e.attributes)||void 0===l?void 0:l.map((e=>{var t;return null===(t=e.value)||void 0===t?void 0:t.value})),";");const r=e.summary;r&&(r.types=this.state.summaries),t(N(V({},e),{summary:r})),this.isValidQuery(e)&&a()})),W(this,"isValidQuery",(e=>{if(e.target&&e.target.length>0&&";"!==e.target){e.target=e.target.trim();const t=e.target.split(";",2);return 2===t.length&&t[0].length>0&&t[1].length>0}return!1})),W(this,"stateCallback",(()=>{const e=this.props.query;this.onChange(e)})),W(this,"onIsPiPointChange",(e=>{const{query:t}=this.props,a=!t.isPiPoint;this.setState({segments:a?[{label:""}]:this.checkAfServer(),attributes:[],isPiPoint:a},(()=>{this.onChange(N(V({},t),{expression:"",attributes:this.state.attributes,segments:this.state.segments,isPiPoint:a}))}))})),this.onSegmentChange=this.onSegmentChange.bind(this),this.calcBasisValueChanged=this.calcBasisValueChanged.bind(this),this.calcNoDataValueChanged=this.calcNoDataValueChanged.bind(this),this.onSummaryAction=this.onSummaryAction.bind(this),this.onSummaryValueChanged=this.onSummaryValueChanged.bind(this),this.onAttributeAction=this.onAttributeAction.bind(this),this.onAttributeChange=this.onAttributeChange.bind(this),this.summaryTypes=["Total","Average","Minimum","Maximum","Range","StdDev","PopulationStdDev","Count","PercentGood","All","AllForNonNumeric"],this.calculationBasis=["TimeWeighted","EventWeighted","TimeWeightedContinuous","TimeWeightedDiscrete","EventWeightedExcludeMostRecentEvent","EventWeightedExcludeEarliestEvent","EventWeightedIncludeBothEnds"],this.noDataReplacement=["Null","Drop","Previous","0","Keep"]}}var U=o(269),M=o(531);function Q(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function G(e){for(var t=1;t{const t=u.target;if(t&&t[e])return{label:t[e].Name,value:t[e]}};var S;return o.getAssetServer(o.afserver.name).then((e=>{v(e.WebId)})),c().createElement(c().Fragment,null,c().createElement("div",{className:"gf-form-group"},c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Database",labelWidth:$,grow:!0},c().createElement(d.AsyncSelect,{key:null!=g?g:"database-key",loadOptions:()=>o.getDatabases(g).then((e=>e.map((e=>({label:e.Name,value:e}))))),loadingMessage:"Loading",value:E("database"),onChange:e=>{f(e.value),m(L(G({},s),{database:e.value,template:void 0}))},defaultOptions:!0})),c().createElement(d.InlineField,{label:"Event Frames",labelWidth:$,grow:!0},c().createElement(d.AsyncSelect,{key:null!==(S=null==y?void 0:y.WebId)&&void 0!==S?S:"default-template-key",loadOptions:()=>o.getEventFrameTemplates(null==y?void 0:y.WebId).then((e=>e.map((e=>({label:e.Name,value:e}))))),loadingMessage:"Loading",value:E("template"),onChange:e=>m(L(G({},s),{template:e.value})),defaultOptions:!0})),c().createElement(d.InlineField,{label:"Show Start and End Time",labelWidth:$,grow:!0},c().createElement(d.InlineSwitch,{value:!!s.showEndTime,onChange:e=>m(L(G({},s),{showEndTime:e.currentTarget.checked}))}))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Category name",labelWidth:$,grow:!0},c().createElement(d.Input,{type:"text",value:s.categoryName,onBlur:e=>p(),onChange:e=>m(L(G({},s),{categoryName:e.currentTarget.value})),placeholder:"Enter category name"})),c().createElement(d.InlineField,{label:"Name Filter",labelWidth:$,grow:!0},c().createElement(d.Input,{type:"text",value:s.nameFilter,onBlur:e=>p(),onChange:e=>m(L(G({},s),{nameFilter:e.currentTarget.value})),placeholder:"Enter name filter"}))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Enable Name Regex Replacement",labelWidth:$,grow:!1},c().createElement(d.InlineSwitch,{value:null===(a=s.regex)||void 0===a?void 0:a.enable,onChange:e=>m(L(G({},s),{regex:L(G({},s.regex),{enable:e.currentTarget.checked})}))})),c().createElement(d.InlineField,{label:"Name Filter",labelWidth:20,grow:!1},c().createElement(d.Input,{type:"text",value:null===(n=s.regex)||void 0===n?void 0:n.search,onBlur:e=>p(),onChange:e=>m(L(G({},s),{regex:L(G({},s.regex),{search:e.currentTarget.value})})),placeholder:"(.*)",width:50})),c().createElement(d.InlineField,{label:"Replace",labelWidth:20,grow:!0},c().createElement(d.Input,{type:"text",value:null==s||null===(l=s.regex)||void 0===l?void 0:l.replace,onBlur:e=>p(),onChange:e=>m(L(G({},s),{regex:L(G({},s.regex),{replace:e.currentTarget.value})})),placeholder:"$1"}))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Enable Attribute Usage",labelWidth:$,grow:!1},c().createElement(d.InlineSwitch,{value:null===(r=s.attribute)||void 0===r?void 0:r.enable,onChange:e=>m(L(G({},s),{attribute:L(G({},s.attribute),{enable:e.currentTarget.checked})}))})),c().createElement(d.InlineField,{label:"Attribute Name",labelWidth:$,grow:!0},c().createElement(d.Input,{type:"text",value:null===(i=s.attribute)||void 0===i?void 0:i.name,onBlur:e=>p(),onChange:e=>m(L(G({},s),{attribute:L(G({},s.attribute),{name:e.currentTarget.value})})),placeholder:"Enter name"})))))}));function _(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function Y(e){for(var t=1;te.substring(1,e.length-2).split(",")[0]))),e.filter=null!==(l=e.filter)&&void 0!==l?l:"*",e.max=null!==(r=e.max)&&void 0!==r?r:1e4,"servers"===e.type?(null===(i=a.afserver)||void 0===i?void 0:i.name)?a.getAssetServer(a.afserver.name).then((e=>[e])).then(A):a.getAssetServers().then(A):"databases"===e.type&&e.afServerWebId?a.getDatabases(e.afServerWebId,{}).then(A):"databases"===e.type?a.getAssetServer(e.path).then((e=>{var t;return a.getDatabases(null!==(t=e.WebId)&&void 0!==t?t:"",{})})).then(A):"databaseElements"===e.type?a.getDatabase(e.path).then((e=>{var t;return a.getDatabaseElements(null!==(t=e.WebId)&&void 0!==t?t:"",{selectedFields:"Items.WebId%3BItems.Name%3BItems.Items%3BItems.Path%3BItems.HasChildren"})})).then(A):"elements"===e.type?a.getElement(e.path).then((t=>{var n;return a.getElements(null!==(n=t.WebId)&&void 0!==n?n:"",{selectedFields:"Items.Description%3BItems.WebId%3BItems.Name%3BItems.Items%3BItems.Path%3BItems.HasChildren",nameFilter:e.filter})})).then(A):"attributes"===e.type?a.getElement(e.path).then((t=>{var n;return a.getAttributes(null!==(n=t.WebId)&&void 0!==n?n:"",{searchFullHierarchy:"true",selectedFields:"Items.Type%3BItems.DefaultUnitsName%3BItems.Description%3BItems.WebId%3BItems.Name%3BItems.Path",nameFilter:e.filter,maxCount:e.max})})).then(A):"dataserver"===e.type?a.getDataServers().then(A):"pipoint"===e.type?a.piPointSearch(e.webId,e.pointName).then(A):Promise.reject("Bad type")}buildQueryParameters(e){return e.targets=(0,E.filter)(e.targets,(e=>{var t;return!(!e||!e.target||0===(null===(t=e.attributes)||void 0===t?void 0:t.length)||";"===e.target||e.hide||e.target.startsWith("Select AF"))})),e.maxDataPoints&&(e.maxDataPoints=e.maxDataPoints>3e4?3e4:e.maxDataPoints),e.targets=(0,E.map)(e.targets,(t=>{var a;const n={enableStreaming:t.enableStreaming,target:this.templateSrv.replace(t.target,e.scopedVars),elementPath:this.templateSrv.replace(t.elementPath,e.scopedVars),attributes:(0,E.map)(t.attributes,(t=>(t.value&&this.templateSrv.replace(t.value.value,e.scopedVars),t))),segments:(0,E.map)(t.segments,(t=>(t.value&&this.templateSrv.replace(t.value.value,e.scopedVars),t))),isAnnotation:!!t.isAnnotation,display:t.display?this.templateSrv.replace(t.display,e.scopedVars):void 0,refId:t.refId,hide:t.hide,interpolate:t.interpolate?J(Y({},t.interpolate),{interval:this.templateSrv.replace(t.interpolate.interval,e.scopedVars)}):{enable:!1},useLastValue:t.useLastValue||{enable:!1},useUnit:t.useUnit||{enable:!1},recordedValues:t.recordedValues?J(Y({},t.recordedValues),{interval:this.templateSrv.replace(t.recordedValues.maxNumber,e.scopedVars)}):{enable:!1},digitalStates:t.digitalStates||{enable:!1},webid:null!==(a=t.webid)&&void 0!==a?a:"",regex:t.regex||{enable:!1},expression:t.expression||"",summary:t.summary||{types:[]},startTime:e.range.from,endTime:e.range.to,isPiPoint:!!t.isPiPoint,scopedVars:e.scopedVars};return n.expression&&(n.expression=this.templateSrv.replace(n.expression,e.scopedVars)),void 0!==n.summary.types&&(n.summary.types=(0,E.filter)(n.summary.types,(e=>null!=e&&""!==e)),n.summary.interval=n.summary.interval?this.templateSrv.replace(n.summary.interval,e.scopedVars):n.summary.interval),n})),e}eventFrameToAnnotation(e,t){const a=e.target,n=[],l=Intl.DateTimeFormat().resolvedOptions().locale;return t.forEach((e=>{let t=this.transformDataFrameToMap(e);for(let e=0;eStart: "+new Date(t.time[e]).toLocaleString(l)+"
End: ",t.timeEnd[e]?i+=new Date(t.timeEnd[e]).toLocaleString(l):i+="Eventframe is open";const s={time:t.time[e],timeEnd:a.showEndTime?t.timeEnd[e]:void 0,title:r,id:t.id[e],text:i,tags:["OSISoft PI"]};n.push(s)}})),n}transformDataFrameToMap(e){const t={};return e.fields.forEach((e=>{t[e.name]=e.values.toArray()})),t}restGet(e){const t=this.backendSrv.fetch({url:`/api/datasources/${this.id}/resources${e}`,method:"GET",headers:{"Content-Type":"application/json"}});return(0,U.firstValueFrom)(t).then((e=>e))}getDataServers(){return this.restGet("/dataservers").then((e=>{var t;return null!==(t=e.data.Items)&&void 0!==t?t:[]}))}getDataServer(e){return e?this.restGet("/dataservers?name="+e).then((e=>e.data)):Promise.resolve({})}getAssetServers(){return this.restGet("/assetservers").then((e=>{var t;return null!==(t=e.data.Items)&&void 0!==t?t:[]}))}getAssetServer(e){return e?this.restGet("/assetservers?path=\\\\"+e).then((e=>e.data)):Promise.resolve({})}getDatabase(e){return e?this.restGet("/assetdatabases?path=\\\\"+e).then((e=>e.data)):Promise.resolve({})}getDatabases(e,t){return e?this.restGet("/assetservers/"+e+"/assetdatabases").then((e=>{var t;return null!==(t=e.data.Items)&&void 0!==t?t:[]})):Promise.resolve([])}getElement(e){return e?this.restGet("/elements?path=\\\\"+e).then((e=>e.data)):Promise.resolve({})}getEventFrameTemplates(e){return e?this.restGet("/assetdatabases/"+e+"/elementtemplates?selectedFields=Items.InstanceType%3BItems.Name%3BItems.WebId").then((e=>{var t;return(0,E.filter)(null!==(t=e.data.Items)&&void 0!==t?t:[],(e=>"EventFrame"===e.InstanceType))})):Promise.resolve([])}getElementTemplates(e){return e?this.restGet("/assetdatabases/"+e+"/elementtemplates?selectedFields=Items.InstanceType%3BItems.Name%3BItems.WebId").then((e=>{var t;return(0,E.filter)(null!==(t=e.data.Items)&&void 0!==t?t:[],(e=>"Element"===e.InstanceType))})):Promise.resolve([])}getAttributes(e,t){let a="?"+(0,E.map)(t,((e,t)=>t+"="+e)).join("&");return"?"===a&&(a=""),this.restGet("/elements/"+e+"/attributes"+a).then((e=>{var t;return null!==(t=e.data.Items)&&void 0!==t?t:[]}))}getDatabaseElements(e,t){let a="?"+(0,E.map)(t,((e,t)=>t+"="+e)).join("&");return"?"===a&&(a=""),this.restGet("/assetdatabases/"+e+"/elements"+a).then((e=>{var t;return null!==(t=e.data.Items)&&void 0!==t?t:[]}))}getElements(e,t){let a="?"+(0,E.map)(t,((e,t)=>t+"="+e)).join("&");return"?"===a&&(a=""),this.restGet("/elements/"+e+"/elements"+a).then((e=>{var t;return null!==(t=e.data.Items)&&void 0!==t?t:[]}))}piPointSearch(e,t){let a=this.templateSrv.replace(t),n=`${a}`,l=!1;if(a!==t){const e=RegExp("\\{(\\w|,)+\\}","gs");let t;for(;null!==(t=e.exec(a));)t.index===e.lastIndex&&e.lastIndex++,t.forEach(((e,t)=>{0===t&&(a=a.replace(e,e.replace("{","(").replace("}",")").replace(",","|")),n=n.replace(e,"*"),l=!0)}))}return this.restGet("/dataservers/"+e+"/points?maxCount=50&nameFilter="+n).then((e=>{var t;return e&&(null===(t=e.data)||void 0===t?void 0:t.Items)?l?e.data.Items.filter((e=>{var t;return null===(t=e.Name)||void 0===t?void 0:t.match(a)})):e.data.Items:[]}))}constructor(e,t=(0,M.getTemplateSrv)(),a=(0,M.getBackendSrv)()){super(e),_(this,"templateSrv",void 0),_(this,"backendSrv",void 0),_(this,"piserver",void 0),_(this,"afserver",void 0),_(this,"afdatabase",void 0),_(this,"piPointConfig",void 0),_(this,"newFormatConfig",void 0),_(this,"useUnitConfig",void 0),_(this,"useExperimental",void 0),_(this,"useStreaming",void 0),this.templateSrv=t,this.backendSrv=a,this.piserver={name:(e.jsonData||{}).piserver,webid:void 0},this.afserver={name:(e.jsonData||{}).afserver,webid:void 0},this.afdatabase={name:(e.jsonData||{}).afdatabase,webid:void 0},this.piPointConfig=e.jsonData.pipoint||!1,this.newFormatConfig=e.jsonData.newFormat||!1,this.useUnitConfig=e.jsonData.useUnit||!1,this.useExperimental=e.jsonData.useExperimental||!1,this.useStreaming=e.jsonData.useStreaming||!1,this.annotations={QueryEditor:H,prepareQuery:e=>(e.target&&(e.target.queryType="Annotation",e.target.isAnnotation=!0),e.target),processEvents:(e,t)=>(0,U.of)(this.eventFrameToAnnotation(e,t))},Promise.all([this.getDataServer(this.piserver.name).then((e=>this.piserver.webid=e.WebId)),this.getAssetServer(this.afserver.name).then((e=>this.afserver.webid=e.WebId)),this.getDatabase(this.afserver.name&&this.afdatabase.name?this.afserver.name+"\\"+this.afdatabase.name:void 0).then((e=>this.afdatabase.webid=e.WebId))])}}const z=new m.DataSourcePlugin(K).setQueryEditor(R).setConfigEditor(f);return u})())); +define(["@grafana/data","react","@grafana/ui","lodash","rxjs","@grafana/runtime"],((e,t,a,n,l,r)=>(()=>{"use strict";var i={781:t=>{t.exports=e},531:e=>{e.exports=r},7:e=>{e.exports=a},241:e=>{e.exports=n},959:e=>{e.exports=t},269:e=>{e.exports=l}},s={};function o(e){var t=s[e];if(void 0!==t)return t.exports;var a=s[e]={exports:{}};return i[e](a,a.exports,o),a.exports}o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var a in t)o.o(t,a)&&!o.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var u={};o.r(u),o.d(u,{plugin:()=>z});var m=o(781),h=o(959),c=o.n(h),d=o(7);function p(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function g(e){for(var t=1;tv(g({},e),{jsonData:v(g({},e.jsonData),{url:e.url})});class f extends h.PureComponent{render(){const{options:e}=this.props,t=y(e);return c().createElement("div",null,c().createElement(d.DataSourceHttpSettings,{defaultUrl:"https://server.name/piwebapi",dataSourceConfig:t,onChange:this.onHttpOptionsChange,showAccessOptions:!0}),c().createElement("h3",{className:"page-heading"},"Custom Configuration"),c().createElement("div",{className:"gf-form-group"},c().createElement("div",{className:"gf-form-inline"},c().createElement(d.InlineField,{label:"Enable PI Points in Query",labelWidth:24},c().createElement(d.InlineSwitch,{value:t.jsonData.pipoint,onChange:this.onPiPointChange}))),c().createElement("div",{className:"gf-form-inline"},c().createElement(d.InlineField,{label:"Enable New Data Format",labelWidth:24},c().createElement(d.InlineSwitch,{value:t.jsonData.newFormat,onChange:this.onNewFormatChange}))),c().createElement("div",{className:"gf-form-inline"},c().createElement(d.InlineField,{label:"Enable Unit in Data",labelWidth:24},c().createElement(d.InlineSwitch,{value:t.jsonData.useUnit,onChange:this.onUseUnitChange}))),c().createElement("div",{className:"gf-form-inline"},c().createElement(d.InlineField,{label:"Enable Experimental Features",labelWidth:24},c().createElement(d.InlineSwitch,{value:t.jsonData.useExperimental,onChange:this.onUseExperimentalChange}))),t.jsonData.useExperimental&&c().createElement("div",{className:"gf-form-inline"},c().createElement(d.InlineField,{label:"Enable Steaming Support",labelWidth:24},c().createElement(d.InlineSwitch,{value:t.jsonData.useStreaming,onChange:this.onUseStreamingChange})))),c().createElement("h3",{className:"page-heading"},"PI/AF Connection Details"),c().createElement("div",{className:"gf-form-group"},t.jsonData.pipoint&&c().createElement("div",{className:"gf-form"},c().createElement(b,{label:"PI Server",labelWidth:10,inputWidth:25,onChange:this.onPIServerChange,value:t.jsonData.piserver||"",placeholder:"Default PI Server to use for data requests"})),c().createElement("div",{className:"gf-form"},c().createElement(b,{label:"AF Server",labelWidth:10,inputWidth:25,onChange:this.onAFServerChange,value:t.jsonData.afserver||"",placeholder:"Default AF Server to use for data requests"})),c().createElement("div",{className:"gf-form"},c().createElement(b,{label:"AF Database",labelWidth:10,inputWidth:25,onChange:this.onAFDatabaseChange,value:t.jsonData.afdatabase||"",placeholder:"Default AF Database server for AF queries"}))))}constructor(...e){super(...e),p(this,"onPIServerChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=v(g({},a.jsonData),{piserver:e.target.value});t(v(g({},a),{jsonData:n}))})),p(this,"onAFServerChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=v(g({},a.jsonData),{afserver:e.target.value});t(v(g({},a),{jsonData:n}))})),p(this,"onAFDatabaseChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=v(g({},a.jsonData),{afdatabase:e.target.value});t(v(g({},a),{jsonData:n}))})),p(this,"onHttpOptionsChange",(e=>{const{onOptionsChange:t}=this.props;t(y(e))})),p(this,"onPiPointChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=v(g({},a.jsonData),{piserver:e.target.checked?a.jsonData.piserver:"",pipoint:e.target.checked});t(v(g({},a),{jsonData:n}))})),p(this,"onNewFormatChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=v(g({},a.jsonData),{newFormat:e.target.checked});t(v(g({},a),{jsonData:n}))})),p(this,"onUseUnitChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=v(g({},a.jsonData),{useUnit:e.target.checked});t(v(g({},a),{jsonData:n}))})),p(this,"onUseExperimentalChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=v(g({},a.jsonData),{useExperimental:e.target.checked,useStreaming:!!e.target.checked&&a.jsonData.useStreaming});t(v(g({},a),{jsonData:n}))})),p(this,"onUseStreamingChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=v(g({},a.jsonData),{useStreaming:e.target.checked});t(v(g({},a),{jsonData:n}))}))}}var E=o(241);function S(){return S=Object.assign||function(e){for(var t=1;tc().createElement(c().Fragment,null,c().createElement(d.InlineFormLabel,{width:t,tooltip:a},e),n),I=()=>c().createElement("div",{className:"gf-form gf-form--grow"},c().createElement("div",{className:"gf-form-label gf-form-label--grow"})),w=e=>{var t=S({},P(e));return c().createElement(O,null,c().createElement(C,t))},O=e=>c().createElement("div",{className:"gf-form-inline"},e.children,c().createElement(I,null)),x=e=>{var t=S({},P(e));return c().createElement(D,null,c().createElement(C,t))},D=e=>c().createElement(c().Fragment,null,e.children),F={target:";",attributes:[],segments:[],regex:{enable:!1},summary:{types:[],basis:"EventWeighted",interval:"",nodata:"Null"},expression:"",interpolate:{enable:!1},useLastValue:{enable:!1},recordedValues:{enable:!1},digitalStates:{enable:!1},enableStreaming:{enable:!1},useUnit:{enable:!1},isPiPoint:!1},j=({isRaw:e,onChange:t})=>{const[a,n]=(0,h.useState)(!1);return(0,h.useEffect)((()=>{n(!1)}),[e]),e?c().createElement(c().Fragment,null,c().createElement(d.Button,{"aria-label":"Switch to visual editor",icon:"pen",variant:"secondary",type:"button",onClick:()=>{n(!0)}}),c().createElement(d.ConfirmModal,{isOpen:a,title:"Switch to visual editor mode",body:"Are you sure to switch to visual editor mode? You will lose the changes done in raw query mode.",confirmText:"Yes, switch to editor mode",dismissText:"No, stay in raw query mode",onConfirm:()=>{t(!1)},onDismiss:()=>{n(!1)}})):c().createElement(d.Button,{"aria-label":"Switch to text editor",icon:"pen",variant:"secondary",type:"button",onClick:()=>{t(!0)}})};function A(e){return(0,E.map)(e,(e=>{var t,a;return{text:e.Name,expandable:void 0===e.HasChildren||!0===e.HasChildren||(null!==(t=e.Path)&&void 0!==t?t:"").split("\\").length<=3,HasChildren:e.HasChildren,Items:null!==(a=e.Items)&&void 0!==a?a:[],Path:e.Path,WebId:e.WebId}}))}function W(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function V(e){for(var t=1;t{var t;return e.value?c().createElement("div",{className:"gf-form-label "+("template"===e.value.type?"query-keyword":"")},null!==(t=e.label)&&void 0!==t?t:"--no label--"):c().createElement("a",{className:"gf-form-label query-part"},c().createElement(d.Icon,{name:"plus"}))};class R extends h.PureComponent{isValueEmpty(e){return!e||!e.value||!e.value.length||e.value===B}calcBasisValueChanged(e){const t=this.props.query,a=t.summary;var n;a&&(a.basis=null===(n=e.value)||void 0===n?void 0:n.value),this.onChange(N(V({},t),{summary:a}))}getCalcBasisSegments(){return(0,E.map)(this.calculationBasis,(e=>({label:e,value:{value:e,expandable:!0}})))}calcNoDataValueChanged(e){const t=this.props.query,a=t.summary;var n;a&&(a.nodata=null===(n=e.value)||void 0===n?void 0:n.value),this.onChange(N(V({},t),{summary:a}))}getNoDataSegments(){return(0,E.map)(this.noDataReplacement,(e=>({label:e,value:{value:e,expandable:!0}})))}onSummaryValueChanged(e,t){const a=this.state.summaries.slice(0);a[t]=e,this.isValueEmpty(e.value)&&a.splice(t,1),this.setState({summaries:a},this.stateCallback)}getSummarySegments(){const e=(0,E.filter)(this.summaryTypes,(e=>-1===this.state.summaries.map((e=>{var t;return null===(t=e.value)||void 0===t?void 0:t.value})).indexOf(e))),t=(0,E.map)(e,(e=>({label:e,value:{value:e,expandable:!0}})));return t.unshift({label:B,value:{value:B}}),t}removeSummary(e){const t=(0,E.filter)(this.state.summaries,(t=>t!==e));this.setState({summaries:t})}onSummaryAction(e){const t=this.state.summaries.slice(0);if(!this.isValueEmpty(e.value)){var a;let n={label:e.label,value:{value:null===(a=e.value)||void 0===a?void 0:a.value,expandable:!0}};t.push(n)}this.setState({summarySegment:{},summaries:t},this.stateCallback)}removeAttribute(e){const t=(0,E.filter)(this.state.attributes,(t=>t!==e));this.attributeChangeValue(t)}onAttributeAction(e){const{query:t}=this.props,a=this.state.attributes.slice(0);if(!this.isValueEmpty(e.value)){var n;let l={label:e.label,value:{value:null===(n=e.value)||void 0===n?void 0:n.value,expandable:!t.isPiPoint}};a.push(l)}this.attributeChangeValue(a)}getSegmentPathUpTo(e,t){const a=e.slice(0,t);return(0,E.reduce)(a,((e,t)=>{var a;return t.value?(null===(a=t.value.value)||void 0===a?void 0:a.startsWith("-Select"))?e:e?e+"\\"+t.value.value:t.value.value:""}),"")}checkAttributeSegments(e,t){var a;const{datasource:n,data:l}=this.props,r=this,i={path:this.getSegmentPathUpTo(t.slice(0),t.length),type:"attributes"};var s;return n.metricFindQuery(i,Object.assign(null!==(s=null==l||null===(a=l.request)||void 0===a?void 0:a.scopedVars)&&void 0!==s?s:{},{isPiPoint:!1})).then((t=>{const a={};(0,E.each)(t,(e=>{a[e.Path.substring(e.Path.indexOf("|")+1)]=e.WebId}));const l=(0,E.filter)(e,(e=>{var t;const l=n.templateSrv.replace(null===(t=e.value)||void 0===t?void 0:t.value);return void 0!==a[l]}));return r.availableAttributes=a,this.attributeChangeValue(l)})).catch((t=>(r.error=t.message||"Failed to issue metric query",this.attributeChangeValue(e))))}checkPiPointSegments(e,t){var a;const{datasource:n,data:l}=this.props,r=this,i={path:e.path,webId:r.getSelectedPIServer(),pointName:e.label,type:"pipoint"};var s;return n.metricFindQuery(i,Object.assign(null!==(s=null==l||null===(a=l.request)||void 0===a?void 0:a.scopedVars)&&void 0!==s?s:{},{isPiPoint:!0})).then((()=>r.attributeChangeValue(t))).catch((e=>(r.error=e.message||"Failed to issue metric query",r.attributeChangeValue([]))))}getSelectedPIServer(){var e;let t="";return this.piServer.forEach((e=>{const a=this.props.query.target.split(";");a.length>=2&&a[0]===e.text&&(t=e.WebId)})),this.piServer.length>0?null===(e=this.piServer[0].value)||void 0===e?void 0:e.webId:t}textEditorChanged(){const{query:e}=this.props,t=e.target.split(";"),a=t.length>0?t[0].split("\\"):[];let n=[],l=[];a.length>1||1===a.length&&""!==a[0]?(t.splice(0,1),(0,E.each)(a,((e,t)=>{n.push({label:e,value:{type:e.match(/\${\w+}/gi)?"template":void 0,value:e,expandable:!0}})})),(0,E.each)(t,(function(e,t){""!==e&&l.push({label:e,value:{value:e,expandable:!1}})})),this.getElementSegments(a.length+1,n).then((e=>{e.length>0&&n.push({label:"Select Element",value:{value:"-Select Element-"}})})).then((()=>{this.updateArray(n,l,this.state.summaries,e.isPiPoint,(()=>{this.onChange(N(V({},e),{query:void 0,rawQuery:!1,attributes:this.state.attributes,segments:this.state.segments}))}))}))):(n=this.checkAfServer(),this.updateArray(n,this.state.attributes,this.state.summaries,e.isPiPoint,(()=>{this.onChange(N(V({},e),{query:void 0,rawQuery:!1,attributes:this.state.attributes,segments:this.state.segments}))})))}render(){const{query:e,onChange:t,onRunQuery:a}=this.props,n=(0,E.defaults)(e,F),{useLastValue:l,useUnit:r,interpolate:i,query:s,rawQuery:o,digitalStates:u,enableStreaming:m,recordedValues:h,expression:p,isPiPoint:g,summary:v,display:b,regex:y}=n;return c().createElement(c().Fragment,null,this.props.datasource.piPointConfig&&c().createElement(d.InlineField,{label:"Is Pi Point?",labelWidth:T},c().createElement(d.InlineSwitch,{value:g,onChange:this.onIsPiPointChange})),!!o&&c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Raw Query",labelWidth:T,grow:!0},c().createElement(d.Input,{onBlur:this.stateCallback,value:s,onChange:e=>t(N(V({},n),{query:e.target.value})),placeholder:"enter query"})),c().createElement(j,{isRaw:!0,onChange:e=>this.textEditorChanged()})),!o&&c().createElement(c().Fragment,null,c().createElement("div",{className:"gf-form-inline"},c().createElement(x,{label:g?"PI Server":"AF Elements",tooltip:g?"Select PI server.":"Select AF Element."},this.state.segments.map(((e,t)=>c().createElement(d.SegmentAsync,{key:"element-"+t,Component:c().createElement(q,{value:e.value,label:e.label}),onChange:e=>this.onSegmentChange(e,t),loadOptions:e=>this.getElementSegments(t),allowCustomValue:!0,inputMinWidth:200}))),c().createElement(I,null),!g&&c().createElement(j,{isRaw:!1,onChange:e=>{t(N(V({},n),{query:n.target,rawQuery:e}))}}))),c().createElement(w,{label:g?"Pi Points":"Attributes"},this.state.attributes.map(((e,t)=>g?c().createElement(d.SegmentAsync,{key:"attributes-"+t,Component:c().createElement(q,{value:e.value,label:e.label}),disabled:0===this.piServer.length,onChange:e=>this.onPiPointChange(e,t),loadOptions:this.getAttributeSegmentsPI,reloadOptionsOnChange:!0,allowCustomValue:!0,inputMinWidth:k}):c().createElement(d.Segment,{key:"attributes-"+t,Component:c().createElement(q,{value:e.value,label:e.label}),disabled:this.state.segments.length<=2,onChange:e=>this.onAttributeChange(e,t),options:this.getAttributeSegmentsAF(),allowCustomValue:!0,inputMinWidth:k}))),g&&c().createElement(d.SegmentAsync,{Component:c().createElement(q,{value:this.state.attributeSegment.value,label:this.state.attributeSegment.label}),disabled:0===this.piServer.length,onChange:this.onAttributeAction,loadOptions:this.getAttributeSegmentsPI,reloadOptionsOnChange:!0,allowCustomValue:!0,inputMinWidth:k}),!g&&c().createElement(d.Segment,{Component:c().createElement(q,{value:this.state.attributeSegment.value,label:this.state.attributeSegment.label}),disabled:this.state.segments.length<=2,onChange:this.onAttributeAction,options:this.getAttributeSegmentsAF(),allowCustomValue:!0,inputMinWidth:k}))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Calculation",grow:!0,labelWidth:T,tooltip:"Modify all attributes by an equation. Use '.' for current item. Leave Attributes empty if you wish to perform element based calculations."},c().createElement(d.Input,{onBlur:a,value:p,onChange:e=>t(N(V({},n),{expression:e.target.value})),placeholder:"'.'*2"}))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Use Last Value",tooltip:"Fetch only last value from time range",labelWidth:T},c().createElement(d.InlineSwitch,{value:l.enable,onChange:()=>this.onChange(N(V({},n),{useLastValue:N(V({},l),{enable:!l.enable})}))})),c().createElement(d.InlineField,{label:"Digital States",labelWidth:T},c().createElement(d.InlineSwitch,{value:u.enable,onChange:()=>this.onChange(N(V({},n),{digitalStates:N(V({},u),{enable:!u.enable})}))})),c().createElement(d.InlineField,{label:"Replace Bad Data",labelWidth:T,tooltip:"Replacement for bad quality values."},c().createElement(d.Segment,{Component:c().createElement(q,{value:{value:null==v?void 0:v.nodata},label:null==v?void 0:v.nodata}),onChange:this.calcNoDataValueChanged,options:this.getNoDataSegments(),allowCustomValue:!0})),this.props.datasource.useUnitConfig&&c().createElement(d.InlineField,{label:"Use unit from datapoints",tooltip:"Use unit in label from PI tag or PI AF attribute",labelWidth:T},c().createElement(d.InlineSwitch,{value:r.enable,onChange:()=>this.onChange(N(V({},n),{useUnit:N(V({},r),{enable:!r.enable})}))})),this.props.datasource.useStreaming&&c().createElement(d.InlineField,{label:"Enable Streaming",labelWidth:T,tooltip:"Enable streaming data if it is supported for the point type."},c().createElement(d.InlineSwitch,{value:m.enable,onChange:()=>this.onChange(N(V({},n),{enableStreaming:N(V({},m),{enable:!m.enable})}))}))),c().createElement(d.InlineFieldRow,null,!l.enable&&c().createElement(d.InlineField,{label:"Max Recorded Values",labelWidth:T,tooltip:"Maximum number of recorded value to retrive from the data archive, without using interpolation."},c().createElement(d.Input,{onBlur:a,value:h.maxNumber,onChange:e=>t(N(V({},n),{recordedValues:N(V({},h),{maxNumber:parseInt(e.target.value,10)})})),type:"number",placeholder:"1000"})),c().createElement(d.InlineField,{label:"Recorded Values",labelWidth:T},c().createElement(d.InlineSwitch,{value:h.enable,onChange:()=>this.onChange(N(V({},n),{recordedValues:N(V({},h),{enable:!h.enable})}))}))),!l.enable&&c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:p?"Interval Period":"Interpolate Period",labelWidth:T,tooltip:"Override time between sampling, e.g. '30s'. Defaults to timespan/chart width."},c().createElement(d.Input,{onBlur:a,value:i.interval,onChange:e=>t(N(V({},n),{interpolate:N(V({},i),{interval:e.target.value})})),placeholder:"30s"})),c().createElement(d.InlineField,{label:p?"Interval Values":"Interpolate",labelWidth:T},c().createElement(d.InlineSwitch,{value:i.enable,onChange:()=>this.onChange(N(V({},n),{interpolate:N(V({},i),{enable:!i.enable})}))}))),!l.enable&&c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Summary Period",labelWidth:T,tooltip:"Define the summary period, e.g. '30s'."},c().createElement(d.Input,{onBlur:a,value:null==v?void 0:v.interval,onChange:e=>t(N(V({},n),{summary:N(V({},v),{interval:e.target.value})})),placeholder:"30s"})),c().createElement(d.InlineField,{label:"Basis",labelWidth:T,tooltip:"Defines the possible calculation options when performing summary calculations over time-series data."},c().createElement(d.Segment,{Component:c().createElement(q,{value:{value:null==v?void 0:v.basis},label:null==v?void 0:v.basis}),onChange:this.calcBasisValueChanged,options:this.getCalcBasisSegments(),allowCustomValue:!0})),c().createElement(d.InlineField,{label:"Summaries",labelWidth:T,tooltip:"PI Web API summary options."},c().createElement(d.InlineFieldRow,null,this.state.summaries.map(((e,t)=>c().createElement(d.Segment,{key:"summaries-"+t,Component:c().createElement(q,{value:e.value,label:e.label}),onChange:e=>this.onSummaryValueChanged(e,t),options:this.getSummarySegments(),allowCustomValue:!0}))),c().createElement(d.Segment,{Component:c().createElement(q,{value:this.state.summarySegment.value,label:this.state.summarySegment.label}),onChange:this.onSummaryAction,options:this.getSummarySegments(),allowCustomValue:!0})))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Display Name",labelWidth:T,tooltip:"If single attribute, modify display name. Otherwise use regex to modify display name."},c().createElement(d.Input,{onBlur:a,value:b,onChange:e=>t(N(V({},n),{display:e.target.value})),placeholder:"Display"})),c().createElement(d.InlineField,{label:"Enable Regex Replace",labelWidth:T},c().createElement(d.InlineSwitch,{value:y.enable,onChange:()=>{this.onChange(N(V({},n),{regex:N(V({},y),{enable:!y.enable})}))}})),c().createElement(d.InlineField,{label:"Search",labelWidth:16},c().createElement(d.Input,{onBlur:a,value:y.search,onChange:e=>t(N(V({},n),{regex:N(V({},y),{search:e.target.value})})),placeholder:"(.*)"})),c().createElement(d.InlineField,{label:"Replace",labelWidth:16},c().createElement(d.Input,{onBlur:a,value:y.replace,onChange:e=>t(N(V({},n),{regex:N(V({},y),{replace:e.target.value})})),placeholder:"$1"}))))}constructor(e){super(e),W(this,"error",void 0),W(this,"piServer",[]),W(this,"availableAttributes",{}),W(this,"summaryTypes",void 0),W(this,"calculationBasis",void 0),W(this,"noDataReplacement",void 0),W(this,"state",{isPiPoint:!1,segments:[],attributes:[],summaries:[],attributeSegment:{},summarySegment:{},calculationBasisSegment:{},noDataReplacementSegment:{}}),W(this,"segmentChangeValue",(e=>{const t=this.props.query;this.setState({segments:e},(()=>this.onChange(N(V({},t),{segments:e}))))})),W(this,"attributeChangeValue",(e=>{const t=this.props.query;return new Promise((a=>this.setState({attributes:e},(()=>{this.onChange(N(V({},t),{attributes:e})),a()}))))})),W(this,"onPiPointChange",((e,t)=>{let a=this.state.attributes.slice(0);e.label===B?(0,E.remove)(a,((e,a)=>a===t)):a[t]=e,this.checkPiPointSegments(e,a)})),W(this,"onAttributeChange",((e,t)=>{var a;let n=this.state.attributes.slice(0);n[t].label!==(null===(a=e.value)||void 0===a?void 0:a.value)&&(n[t]=e,this.checkAttributeSegments(n,this.state.segments))})),W(this,"onSegmentChange",((e,t)=>{var a;const{query:n}=this.props;let l=this.state.segments.slice(0);l[t].label!==(null===(a=e.value)||void 0===a?void 0:a.value)&&this.setState({attributes:[]},(()=>e.label===B?(l=(0,E.slice)(l,0,t),void this.checkAttributeSegments([],l).then((()=>{var e;0===l.length?l.push({label:""}):(null===(e=l[l.length-1].value)||void 0===e?void 0:e.expandable)&&l.push({label:"Select Element",value:{value:"-Select Element-"}}),n.isPiPoint&&(this.piServer=[]),this.segmentChangeValue(l)}))):(l[t]=e,n.isPiPoint?(this.piServer.push(e),void this.segmentChangeValue(l)):(t{var t,a;return"template"===(null===(t=e.value)||void 0===t?void 0:t.type)?this.getElementSegments(l.length+1,l).then((e=>(e.length>0&&l.push({label:"Select Element",value:{value:"-Select Element-"}}),this.segmentChangeValue(l),l))):((null===(a=e.value)||void 0===a?void 0:a.expandable)&&l.push({label:"Select Element",value:{value:"-Select Element-"}}),new Promise((e=>{this.segmentChangeValue(l),e(l)})))}))))))})),W(this,"getElementSegments",((e,t)=>{var a;const{datasource:n,query:l,data:r}=this.props,i=this,s=l.isPiPoint?{type:"dataserver"}:{path:this.getSegmentPathUpTo(null!=t?t:this.state.segments.slice(0),e),afServerWebId:this.state.segments.length>0&&this.state.segments[0].value?this.state.segments[0].value.webId:void 0};if(!l.isPiPoint){var o,u,m;if((null===(o=n.afserver)||void 0===o?void 0:o.name)&&0===e)return Promise.resolve([{label:n.afserver.name,value:{value:n.afserver.name,expandable:!0}}]);if((null===(u=n.afserver)||void 0===u?void 0:u.name)&&(null===(m=n.afdatabase)||void 0===m?void 0:m.name)&&1===e)return Promise.resolve([{label:n.afdatabase.name,value:{value:n.afdatabase.name,expandable:!0}}])}var h;return n.metricFindQuery(s,Object.assign(null!==(h=null==r||null===(a=r.request)||void 0===a?void 0:a.scopedVars)&&void 0!==h?h:{},{isPiPoint:l.isPiPoint})).then((e=>{const t=(0,E.map)(e,(e=>({label:e.text,value:{webId:e.WebId,value:e.text,expandable:!l.isPiPoint&&e.expandable}})));if(0===t.length)return t;const a=n.templateSrv.getVariables();return(0,E.each)(a,(e=>{let a={label:"${"+e.name+"}",value:{type:"template",value:"${"+e.name+"}",expandable:!l.isPiPoint}};t.unshift(a)})),t.unshift({label:B,value:{value:B}}),t})).catch((e=>(i.error=e.message||"Failed to issue metric query",[])))})),W(this,"getAttributeSegmentsPI",(e=>{var t;const{datasource:a,query:n,data:l}=this.props,r=this,i={path:"",webId:this.getSelectedPIServer(),pointName:(null!=e?e:"")+"*",type:"pipoint"};let s=[];var o;return a.metricFindQuery(i,Object.assign(null!==(o=null==l||null===(t=l.request)||void 0===t?void 0:t.scopedVars)&&void 0!==o?o:{},{isPiPoint:n.isPiPoint})).then((t=>{s=(0,E.map)(t,(e=>({path:e.Path,label:e.text,value:{value:e.text,expandable:!1}}))),e&&e.length>0&&s.unshift({label:e,value:{value:e,expandable:!1}});const l=a.templateSrv.getVariables();return(0,E.each)(l,(e=>{let t={label:"${"+e.name+"}",value:{type:"template",value:"${"+e.name+"}",expandable:!n.isPiPoint}};s.unshift(t)})),s.unshift({label:B,value:{value:B}}),s})).catch((e=>(r.error=e.message||"Failed to issue metric query",s)))})),W(this,"getAttributeSegmentsAF",(e=>{let t=[];return t.push({label:B,value:{value:B}}),(0,E.forOwn)(this.availableAttributes,((e,a)=>{let n={label:a,value:{value:a,expandable:!0}};t.push(n)})),t})),W(this,"buildFromTarget",((e,t,a)=>{const n=e.target.split(";"),l=n.length>0?n[0].split("\\"):[];return l.length>1||1===l.length&&""!==l[0]?(n.splice(0,1),(0,E.each)(l,((e,a)=>{t.push({label:e,value:{type:e.match(/\${\w+}/gi)?"template":void 0,value:e,expandable:!0}})})),(0,E.each)(n,((e,t)=>{""!==e&&a.push({label:e,value:{value:e,expandable:!1}})})),this.getElementSegments(l.length+1,t).then((e=>(e.length>0&&t.push({label:"Select Element",value:{value:"-Select Element-"}}),t)))):Promise.resolve(t)})),W(this,"checkAfServer",(()=>{var e;const{datasource:t}=this.props,a=[];var n;return(null===(e=t.afserver)||void 0===e?void 0:e.name)?(a.push({label:t.afserver.name,value:{value:t.afserver.name,expandable:!0}}),(null===(n=t.afdatabase)||void 0===n?void 0:n.name)&&a.push({label:t.afdatabase.name,value:{value:t.afdatabase.name,expandable:!0}}),a.push({label:"Select Element",value:{value:"-Select Element-"}})):a.push({label:""}),a})),W(this,"updateArray",((e,t,a,n,l)=>{this.setState({segments:e,attributes:t,summaries:a,isPiPoint:n},(()=>{n||this.checkAttributeSegments(t,this.state.segments).then((()=>{l&&l()}))}))})),W(this,"scopedVarsDone",!1),W(this,"componentDidMount",(()=>{this.initialLoad(!1)})),W(this,"componentDidUpdate",(()=>{var e,t,a;const{query:n}=this.props;"Done"===(null===(e=this.props.data)||void 0===e?void 0:e.state)&&(null===(a=this.props.data)||void 0===a||null===(t=a.request)||void 0===t?void 0:t.scopedVars)&&!this.scopedVarsDone&&(this.scopedVarsDone=!0,this.initialLoad(!n.isPiPoint))})),W(this,"initialLoad",(e=>{const{query:t}=this.props,a=(0,E.defaults)(t,F),{segments:n,attributes:l,summary:r,isPiPoint:i}=a;var s;let o=e?[]:null!==(s=null==n?void 0:n.slice(0))&&void 0!==s?s:[];var u;let m=e?[]:null!==(u=null==l?void 0:l.slice(0))&&void 0!==u?u:[];var h;let c=null!==(h=null==r?void 0:r.types)&&void 0!==h?h:[];if(i||0!==o.length)i&&o.length>0&&(this.piServer=o);else{if(t.target&&t.target.length>0&&";"!==t.target)return m=[],void this.buildFromTarget(t,o,m).then((e=>{this.updateArray(e,m,c,!1)})).catch((e=>console.error(e)));o=this.checkAfServer()}this.updateArray(o,m,c,!!i,(()=>{this.onChange(t)}))})),W(this,"onChange",(e=>{const{onChange:t,onRunQuery:a}=this.props;var n,l;if(e.rawQuery){if(e.target=null!==(n=e.query)&&void 0!==n?n:"",e.query){const{attributes:t,elementPath:a}=function(e){const t=e.split(";"),a=t[0].split("\\");t.splice(0,1);let n=[];if(a.length>1||1===a.length&&""!==a[0]){const e=a.join("\\");return(0,E.each)(t,(function(e,t){""!==e&&n.push({label:e,value:{value:e,expandable:!1}})})),{attributes:n,elementPath:e}}return{attributes:n,elementPath:null}}(e.target);e.attributes=t,e.elementPath=a}}else e.elementPath=this.getSegmentPathUpTo(this.state.segments,this.state.segments.length),e.target=e.elementPath+";"+(0,E.join)(null===(l=e.attributes)||void 0===l?void 0:l.map((e=>{var t;return null===(t=e.value)||void 0===t?void 0:t.value})),";");const r=e.summary;r&&(r.types=this.state.summaries),t(N(V({},e),{summary:r})),this.isValidQuery(e)&&a()})),W(this,"isValidQuery",(e=>{if(e.target&&e.target.length>0&&";"!==e.target){e.target=e.target.trim();const t=e.target.split(";",2);return 2===t.length&&t[0].length>0&&t[1].length>0}return!1})),W(this,"stateCallback",(()=>{const e=this.props.query;this.onChange(e)})),W(this,"onIsPiPointChange",(e=>{const{query:t}=this.props,a=!t.isPiPoint;this.setState({segments:a?[{label:""}]:this.checkAfServer(),attributes:[],isPiPoint:a},(()=>{this.onChange(N(V({},t),{expression:"",attributes:this.state.attributes,segments:this.state.segments,isPiPoint:a}))}))})),this.onSegmentChange=this.onSegmentChange.bind(this),this.calcBasisValueChanged=this.calcBasisValueChanged.bind(this),this.calcNoDataValueChanged=this.calcNoDataValueChanged.bind(this),this.onSummaryAction=this.onSummaryAction.bind(this),this.onSummaryValueChanged=this.onSummaryValueChanged.bind(this),this.onAttributeAction=this.onAttributeAction.bind(this),this.onAttributeChange=this.onAttributeChange.bind(this),this.summaryTypes=["Total","Average","Minimum","Maximum","Range","StdDev","PopulationStdDev","Count","PercentGood","All","AllForNonNumeric"],this.calculationBasis=["TimeWeighted","EventWeighted","TimeWeightedContinuous","TimeWeightedDiscrete","EventWeightedExcludeMostRecentEvent","EventWeightedExcludeEarliestEvent","EventWeightedIncludeBothEnds"],this.noDataReplacement=["Null","Drop","Previous","0","Keep"]}}var U=o(269),M=o(531);function Q(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function G(e){for(var t=1;t{const t=u.target;if(t&&t[e])return{label:t[e].Name,value:t[e]}};var S;return o.getAssetServer(o.afserver.name).then((e=>{v(e.WebId)})),c().createElement(c().Fragment,null,c().createElement("div",{className:"gf-form-group"},c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Database",labelWidth:$,grow:!0},c().createElement(d.AsyncSelect,{key:null!=g?g:"database-key",loadOptions:()=>o.getDatabases(g).then((e=>e.map((e=>({label:e.Name,value:e}))))),loadingMessage:"Loading",value:E("database"),onChange:e=>{f(e.value),m(L(G({},s),{database:e.value,template:void 0}))},defaultOptions:!0})),c().createElement(d.InlineField,{label:"Event Frames",labelWidth:$,grow:!0},c().createElement(d.AsyncSelect,{key:null!==(S=null==y?void 0:y.WebId)&&void 0!==S?S:"default-template-key",loadOptions:()=>o.getEventFrameTemplates(null==y?void 0:y.WebId).then((e=>e.map((e=>({label:e.Name,value:e}))))),loadingMessage:"Loading",value:E("template"),onChange:e=>m(L(G({},s),{template:e.value})),defaultOptions:!0})),c().createElement(d.InlineField,{label:"Show Start and End Time",labelWidth:$,grow:!0},c().createElement(d.InlineSwitch,{value:!!s.showEndTime,onChange:e=>m(L(G({},s),{showEndTime:e.currentTarget.checked}))}))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Category name",labelWidth:$,grow:!0},c().createElement(d.Input,{type:"text",value:s.categoryName,onBlur:e=>p(),onChange:e=>m(L(G({},s),{categoryName:e.currentTarget.value})),placeholder:"Enter category name"})),c().createElement(d.InlineField,{label:"Name Filter",labelWidth:$,grow:!0},c().createElement(d.Input,{type:"text",value:s.nameFilter,onBlur:e=>p(),onChange:e=>m(L(G({},s),{nameFilter:e.currentTarget.value})),placeholder:"Enter name filter"}))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Enable Name Regex Replacement",labelWidth:$,grow:!1},c().createElement(d.InlineSwitch,{value:null===(a=s.regex)||void 0===a?void 0:a.enable,onChange:e=>m(L(G({},s),{regex:L(G({},s.regex),{enable:e.currentTarget.checked})}))})),c().createElement(d.InlineField,{label:"Name Filter",labelWidth:20,grow:!1},c().createElement(d.Input,{type:"text",value:null===(n=s.regex)||void 0===n?void 0:n.search,onBlur:e=>p(),onChange:e=>m(L(G({},s),{regex:L(G({},s.regex),{search:e.currentTarget.value})})),placeholder:"(.*)",width:50})),c().createElement(d.InlineField,{label:"Replace",labelWidth:20,grow:!0},c().createElement(d.Input,{type:"text",value:null==s||null===(l=s.regex)||void 0===l?void 0:l.replace,onBlur:e=>p(),onChange:e=>m(L(G({},s),{regex:L(G({},s.regex),{replace:e.currentTarget.value})})),placeholder:"$1"}))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Enable Attribute Usage",labelWidth:$,grow:!1},c().createElement(d.InlineSwitch,{value:null===(r=s.attribute)||void 0===r?void 0:r.enable,onChange:e=>m(L(G({},s),{attribute:L(G({},s.attribute),{enable:e.currentTarget.checked})}))})),c().createElement(d.InlineField,{label:"Attribute Name",labelWidth:$,grow:!0},c().createElement(d.Input,{type:"text",value:null===(i=s.attribute)||void 0===i?void 0:i.name,onBlur:e=>p(),onChange:e=>m(L(G({},s),{attribute:L(G({},s.attribute),{name:e.currentTarget.value})})),placeholder:"Enter name"})))))}));function _(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function Y(e){for(var t=1;te.substring(1,e.length-2).split(",")[0]))),e.filter=null!==(l=e.filter)&&void 0!==l?l:"*",e.max=null!==(r=e.max)&&void 0!==r?r:1e4,"servers"===e.type?(null===(i=a.afserver)||void 0===i?void 0:i.name)?a.getAssetServer(a.afserver.name).then((e=>[e])).then(A):a.getAssetServers().then(A):"databases"===e.type&&e.afServerWebId?a.getDatabases(e.afServerWebId,{}).then(A):"databases"===e.type?a.getAssetServer(e.path).then((e=>{var t;return a.getDatabases(null!==(t=e.WebId)&&void 0!==t?t:"",{})})).then(A):"databaseElements"===e.type?a.getDatabase(e.path).then((e=>{var t;return a.getDatabaseElements(null!==(t=e.WebId)&&void 0!==t?t:"",{selectedFields:"Items.WebId%3BItems.Name%3BItems.Items%3BItems.Path%3BItems.HasChildren"})})).then(A):"elements"===e.type?a.getElement(e.path).then((t=>{var n;return a.getElements(null!==(n=t.WebId)&&void 0!==n?n:"",{selectedFields:"Items.Description%3BItems.WebId%3BItems.Name%3BItems.Items%3BItems.Path%3BItems.HasChildren",nameFilter:e.filter})})).then(A):"attributes"===e.type?a.getElement(e.path).then((t=>{var n;return a.getAttributes(null!==(n=t.WebId)&&void 0!==n?n:"",{searchFullHierarchy:"true",selectedFields:"Items.Type%3BItems.DefaultUnitsName%3BItems.Description%3BItems.WebId%3BItems.Name%3BItems.Path",nameFilter:e.filter,maxCount:e.max})})).then(A):"dataserver"===e.type?a.getDataServers().then(A):"pipoint"===e.type?a.piPointSearch(e.webId,e.pointName).then(A):Promise.reject("Bad type")}buildQueryParameters(e){return e.targets=(0,E.filter)(e.targets,(e=>{var t;return!(!e||!e.target||0===(null===(t=e.attributes)||void 0===t?void 0:t.length)||";"===e.target||e.hide||e.target.startsWith("Select AF"))})),e.maxDataPoints&&(e.maxDataPoints=e.maxDataPoints>3e4?3e4:e.maxDataPoints),e.targets=(0,E.map)(e.targets,(t=>{var a;const n={enableStreaming:t.enableStreaming,target:this.templateSrv.replace(t.target,e.scopedVars),elementPath:this.templateSrv.replace(t.elementPath,e.scopedVars),attributes:(0,E.map)(t.attributes,(t=>(t.value&&this.templateSrv.replace(t.value.value,e.scopedVars),t))),segments:(0,E.map)(t.segments,(t=>(t.value&&this.templateSrv.replace(t.value.value,e.scopedVars),t))),isAnnotation:!!t.isAnnotation,display:t.display?this.templateSrv.replace(t.display,e.scopedVars):void 0,refId:t.refId,hide:t.hide,interpolate:t.interpolate?J(Y({},t.interpolate),{interval:this.templateSrv.replace(t.interpolate.interval,e.scopedVars)}):{enable:!1},useLastValue:t.useLastValue||{enable:!1},useUnit:t.useUnit||{enable:!1},recordedValues:t.recordedValues||{enable:!1},digitalStates:t.digitalStates||{enable:!1},webid:null!==(a=t.webid)&&void 0!==a?a:"",regex:t.regex||{enable:!1},expression:t.expression||"",summary:t.summary||{types:[]},startTime:e.range.from,endTime:e.range.to,isPiPoint:!!t.isPiPoint,scopedVars:e.scopedVars};return n.expression&&(n.expression=this.templateSrv.replace(n.expression,e.scopedVars)),void 0!==n.summary.types&&(n.summary.types=(0,E.filter)(n.summary.types,(e=>null!=e&&""!==e)),n.summary.interval=n.summary.interval?this.templateSrv.replace(n.summary.interval,e.scopedVars):n.summary.interval),n})),e}eventFrameToAnnotation(e,t){const a=e.target,n=[],l=Intl.DateTimeFormat().resolvedOptions().locale;return t.forEach((e=>{let t=this.transformDataFrameToMap(e);for(let e=0;eStart: "+new Date(t.time[e]).toLocaleString(l)+"
End: ",t.timeEnd[e]?i+=new Date(t.timeEnd[e]).toLocaleString(l):i+="Eventframe is open";const s={time:t.time[e],timeEnd:a.showEndTime?t.timeEnd[e]:void 0,title:r,id:t.id[e],text:i,tags:["OSISoft PI"]};n.push(s)}})),n}transformDataFrameToMap(e){const t={};return e.fields.forEach((e=>{t[e.name]=e.values.toArray()})),t}restGet(e){const t=this.backendSrv.fetch({url:`/api/datasources/${this.id}/resources${e}`,method:"GET",headers:{"Content-Type":"application/json"}});return(0,U.firstValueFrom)(t).then((e=>e))}getDataServers(){return this.restGet("/dataservers").then((e=>{var t;return null!==(t=e.data.Items)&&void 0!==t?t:[]}))}getDataServer(e){return e?this.restGet("/dataservers?name="+e).then((e=>e.data)):Promise.resolve({})}getAssetServers(){return this.restGet("/assetservers").then((e=>{var t;return null!==(t=e.data.Items)&&void 0!==t?t:[]}))}getAssetServer(e){return e?this.restGet("/assetservers?path=\\\\"+e).then((e=>e.data)):Promise.resolve({})}getDatabase(e){return e?this.restGet("/assetdatabases?path=\\\\"+e).then((e=>e.data)):Promise.resolve({})}getDatabases(e,t){return e?this.restGet("/assetservers/"+e+"/assetdatabases").then((e=>{var t;return null!==(t=e.data.Items)&&void 0!==t?t:[]})):Promise.resolve([])}getElement(e){return e?this.restGet("/elements?path=\\\\"+e).then((e=>e.data)):Promise.resolve({})}getEventFrameTemplates(e){return e?this.restGet("/assetdatabases/"+e+"/elementtemplates?selectedFields=Items.InstanceType%3BItems.Name%3BItems.WebId").then((e=>{var t;return(0,E.filter)(null!==(t=e.data.Items)&&void 0!==t?t:[],(e=>"EventFrame"===e.InstanceType))})):Promise.resolve([])}getElementTemplates(e){return e?this.restGet("/assetdatabases/"+e+"/elementtemplates?selectedFields=Items.InstanceType%3BItems.Name%3BItems.WebId").then((e=>{var t;return(0,E.filter)(null!==(t=e.data.Items)&&void 0!==t?t:[],(e=>"Element"===e.InstanceType))})):Promise.resolve([])}getAttributes(e,t){let a="?"+(0,E.map)(t,((e,t)=>t+"="+e)).join("&");return"?"===a&&(a=""),this.restGet("/elements/"+e+"/attributes"+a).then((e=>{var t;return null!==(t=e.data.Items)&&void 0!==t?t:[]}))}getDatabaseElements(e,t){let a="?"+(0,E.map)(t,((e,t)=>t+"="+e)).join("&");return"?"===a&&(a=""),this.restGet("/assetdatabases/"+e+"/elements"+a).then((e=>{var t;return null!==(t=e.data.Items)&&void 0!==t?t:[]}))}getElements(e,t){let a="?"+(0,E.map)(t,((e,t)=>t+"="+e)).join("&");return"?"===a&&(a=""),this.restGet("/elements/"+e+"/elements"+a).then((e=>{var t;return null!==(t=e.data.Items)&&void 0!==t?t:[]}))}piPointSearch(e,t){let a=this.templateSrv.replace(t),n=`${a}`,l=!1;if(a!==t){const e=RegExp("\\{(\\w|,)+\\}","gs");let t;for(;null!==(t=e.exec(a));)t.index===e.lastIndex&&e.lastIndex++,t.forEach(((e,t)=>{0===t&&(a=a.replace(e,e.replace("{","(").replace("}",")").replace(",","|")),n=n.replace(e,"*"),l=!0)}))}return this.restGet("/dataservers/"+e+"/points?maxCount=50&nameFilter="+n).then((e=>{var t;return e&&(null===(t=e.data)||void 0===t?void 0:t.Items)?l?e.data.Items.filter((e=>{var t;return null===(t=e.Name)||void 0===t?void 0:t.match(a)})):e.data.Items:[]}))}constructor(e,t=(0,M.getTemplateSrv)(),a=(0,M.getBackendSrv)()){super(e),_(this,"templateSrv",void 0),_(this,"backendSrv",void 0),_(this,"piserver",void 0),_(this,"afserver",void 0),_(this,"afdatabase",void 0),_(this,"piPointConfig",void 0),_(this,"newFormatConfig",void 0),_(this,"useUnitConfig",void 0),_(this,"useExperimental",void 0),_(this,"useStreaming",void 0),this.templateSrv=t,this.backendSrv=a,this.piserver={name:(e.jsonData||{}).piserver,webid:void 0},this.afserver={name:(e.jsonData||{}).afserver,webid:void 0},this.afdatabase={name:(e.jsonData||{}).afdatabase,webid:void 0},this.piPointConfig=e.jsonData.pipoint||!1,this.newFormatConfig=e.jsonData.newFormat||!1,this.useUnitConfig=e.jsonData.useUnit||!1,this.useExperimental=e.jsonData.useExperimental||!1,this.useStreaming=e.jsonData.useStreaming||!1,this.annotations={QueryEditor:H,prepareQuery:e=>(e.target&&(e.target.queryType="Annotation",e.target.isAnnotation=!0),e.target),processEvents:(e,t)=>(0,U.of)(this.eventFrameToAnnotation(e,t))},Promise.all([this.getDataServer(this.piserver.name).then((e=>this.piserver.webid=e.WebId)),this.getAssetServer(this.afserver.name).then((e=>this.afserver.webid=e.WebId)),this.getDatabase(this.afserver.name&&this.afdatabase.name?this.afserver.name+"\\"+this.afdatabase.name:void 0).then((e=>this.afdatabase.webid=e.WebId))])}}const z=new m.DataSourcePlugin(K).setQueryEditor(R).setConfigEditor(f);return u})())); //# sourceMappingURL=module.js.map \ No newline at end of file diff --git a/dist/module.js.map b/dist/module.js.map index bf9cffb..93bf853 100644 --- a/dist/module.js.map +++ b/dist/module.js.map @@ -1 +1 @@ -{"version":3,"file":"module.js","mappings":"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","sources":["webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"@grafana/data\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"@grafana/runtime\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"@grafana/ui\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"lodash\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"react\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"rxjs\"","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/bootstrap","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/runtime/compat get default export","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/runtime/define property getters","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/runtime/hasOwnProperty shorthand","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/runtime/make namespace object","webpack://gridprotectionalliance-osisoftpi-datasource/./config/ConfigEditor.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./components/Forms.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./types.ts","webpack://gridprotectionalliance-osisoftpi-datasource/./components/QueryEditorModeSwitcher.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./helper.ts","webpack://gridprotectionalliance-osisoftpi-datasource/./query/QueryEditor.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./query/AnnotationsQueryEditor.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./datasource.ts","webpack://gridprotectionalliance-osisoftpi-datasource/./module.ts"],"sourcesContent":["module.exports = __WEBPACK_EXTERNAL_MODULE__781__;","module.exports = __WEBPACK_EXTERNAL_MODULE__531__;","module.exports = __WEBPACK_EXTERNAL_MODULE__7__;","module.exports = __WEBPACK_EXTERNAL_MODULE__241__;","module.exports = __WEBPACK_EXTERNAL_MODULE__959__;","module.exports = __WEBPACK_EXTERNAL_MODULE__269__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import React, { ChangeEvent, PureComponent } from 'react';\nimport { LegacyForms, DataSourceHttpSettings, InlineField, InlineSwitch } from '@grafana/ui';\nimport { DataSourcePluginOptionsEditorProps, DataSourceJsonData, DataSourceSettings } from '@grafana/data';\nimport { PIWebAPIDataSourceJsonData } from '../types';\n\nconst { FormField } = LegacyForms;\n\ninterface Props extends DataSourcePluginOptionsEditorProps {}\n\nconst coerceOptions = (\n options: DataSourceSettings\n): DataSourceSettings => {\n return {\n ...options,\n jsonData: {\n ...options.jsonData,\n url: options.url,\n },\n };\n};\n\ninterface State {}\n\nexport class PIWebAPIConfigEditor extends PureComponent {\n onPIServerChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n piserver: event.target.value,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onAFServerChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n afserver: event.target.value,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onAFDatabaseChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n afdatabase: event.target.value,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onHttpOptionsChange = (options: DataSourceSettings) => {\n const { onOptionsChange } = this.props;\n onOptionsChange(coerceOptions(options));\n };\n\n onPiPointChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n piserver: event.target.checked ? options.jsonData.piserver : '',\n pipoint: event.target.checked,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onNewFormatChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n newFormat: event.target.checked,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onUseUnitChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n useUnit: event.target.checked,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onUseExperimentalChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n useExperimental : event.target.checked,\n useStreaming : event.target.checked ? options.jsonData.useStreaming : false,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onUseStreamingChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n useStreaming: event.target.checked,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n render() {\n const { options: originalOptions } = this.props;\n const options = coerceOptions(originalOptions);\n\n return (\n
\n \n\n

Custom Configuration

\n\n
\n
\n \n \n \n
\n
\n \n \n \n
\n
\n \n \n \n
\n
\n \n \n \n
\n {options.jsonData.useExperimental && (\n
\n \n \n \n
\n )}\n
\n\n

PI/AF Connection Details

\n\n
\n {options.jsonData.pipoint && (\n
\n \n
\n )}\n
\n \n
\n
\n \n
\n
\n
\n );\n }\n}\n","import React, { InputHTMLAttributes, FunctionComponent } from 'react';\nimport { InlineFormLabel } from '@grafana/ui';\n\nexport interface Props extends InputHTMLAttributes {\n label: string;\n tooltip?: string;\n labelWidth?: number;\n children?: React.ReactNode;\n queryEditor?: JSX.Element;\n}\n\nexport const QueryField: FunctionComponent> = ({ label, labelWidth = 12, tooltip, children }) => (\n <>\n \n {label}\n \n {children}\n \n);\n\nexport const QueryRowTerminator = () => {\n return (\n
\n
\n
\n );\n};\n\nexport const QueryInlineField = ({ ...props }) => {\n return (\n \n \n \n );\n};\n\nexport const QueryEditorRow = (props: Partial) => {\n return (\n
\n {props.children}\n \n
\n );\n};\n\nexport const QueryRawInlineField = ({ ...props }) => {\n return (\n \n \n \n );\n};\n\nexport const QueryRawEditorRow = (props: Partial) => {\n return <>{props.children};\n};\n","import { DataQuery } from '@grafana/schema';\nimport { DataSourceJsonData, SelectableValue } from '@grafana/data';\n\nexport interface PiwebapiElementPath {\n path: string;\n variable: string;\n}\n\nexport interface PiwebapiInternalRsp {\n data: PiwebapiRsp;\n status: number;\n url: string;\n}\n\nexport interface PiwebapiRsp {\n Name?: string;\n InstanceType?: string;\n Items?: PiwebapiRsp[];\n WebId?: string;\n HasChildren?: boolean;\n Type?: string;\n DefaultUnitsName?: string;\n Description?: string;\n Path?: string;\n}\n\nexport interface PiDataServer {\n name: string | undefined;\n webid: string | undefined;\n}\n\nexport interface PIWebAPISelectableValue {\n webId?: string;\n value?: string;\n type?: string;\n expandable?: boolean;\n}\n\nexport interface PIWebAPIAnnotationsQuery extends DataQuery {\n target: string;\n}\n\nexport interface PIWebAPIQuery extends DataQuery {\n target?: string;\n elementPath?: string;\n attributes?: Array>;\n segments?: any[];\n isPiPoint?: boolean;\n isAnnotation?: boolean;\n webid?: string;\n display?: any;\n interpolate?: any;\n recordedValues?: any;\n digitalStates?: any;\n enableStreaming: any;\n useLastValue?: any;\n useUnit?: any;\n regex?: any;\n summary?: {nodata?: string, types?: any[], basis?: string, interval?: string};\n expression?: string;\n rawQuery?: boolean;\n query?: string;\n // annotations items\n database?: PiwebapiRsp;\n template?: PiwebapiRsp;\n showEndTime?: boolean;\n attribute?: any;\n nameFilter?: string;\n categoryName?: string;\n}\n\nexport const defaultQuery: Partial = {\n target: ';',\n attributes: [],\n segments: [],\n regex: { enable: false },\n summary: { types: [], basis: 'EventWeighted', interval: '', nodata: 'Null' },\n expression: '',\n interpolate: { enable: false },\n useLastValue: { enable: false },\n recordedValues: { enable: false },\n digitalStates: { enable: false },\n enableStreaming: { enable: false },\n useUnit: { enable: false },\n isPiPoint: false,\n};\n\n/**\n * These are options configured for each DataSource instance\n */\nexport interface PIWebAPIDataSourceJsonData extends DataSourceJsonData {\n url?: string;\n access?: string;\n piserver?: string;\n afserver?: string;\n afdatabase?: string;\n pipoint?: boolean;\n newFormat?: boolean;\n useUnit?: boolean;\n useExperimental?: boolean;\n useStreaming?: boolean;\n}\n\n/**\n * Value that is used in the backend, but never sent over HTTP to the frontend\n */\nexport interface PIWebAPISecureJsonData {\n apiKey?: string;\n}\n","import React, { useEffect, useState } from 'react';\nimport { Button, ConfirmModal } from '@grafana/ui';\n\ntype Props = {\n isRaw: boolean;\n onChange: (newIsRaw: boolean) => void;\n};\n\nexport const QueryEditorModeSwitcher = ({ isRaw, onChange }: Props): JSX.Element => {\n const [isModalOpen, setModalOpen] = useState(false);\n\n useEffect(() => {\n // if the isRaw changes, we hide the modal\n setModalOpen(false);\n }, [isRaw]);\n\n if (isRaw) {\n return (\n <>\n {\n // we show the are-you-sure modal\n setModalOpen(true);\n }}\n >\n {\n onChange(false);\n }}\n onDismiss={() => {\n setModalOpen(false);\n }}\n />\n \n );\n } else {\n return (\n {\n onChange(true);\n }}\n >\n );\n }\n};\n","import { each, map } from 'lodash';\r\n\r\nimport {\r\n AnnotationQuery,\r\n DataFrame,\r\n TableData,\r\n MetricFindValue,\r\n Field,\r\n toDataFrame,\r\n} from '@grafana/data';\r\n\r\nimport { PiwebapiElementPath, PiwebapiRsp, PIWebAPIQuery } from 'types';\r\n\r\nexport function parseRawQuery(tr: string): any {\r\n const splitAttributes = tr.split(';');\r\n const splitElements = splitAttributes[0].split('\\\\');\r\n\r\n // remove element hierarchy from attribute collection\r\n splitAttributes.splice(0, 1);\r\n\r\n let attributes: any[] = [];\r\n if (splitElements.length > 1 || (splitElements.length === 1 && splitElements[0] !== '')) {\r\n const elementPath: string = splitElements.join('\\\\');\r\n each(splitAttributes, function (item, index) {\r\n if (item !== '') {\r\n attributes.push({\r\n label: item,\r\n value: {\r\n value: item,\r\n expandable: false,\r\n },\r\n });\r\n }\r\n });\r\n\r\n return { attributes, elementPath };\r\n }\r\n\r\n return { attributes, elementPath: null };\r\n}\r\n\r\nexport function lowerCaseFirstLetter(string: string): string {\r\n return string.charAt(0).toLocaleLowerCase() + string.slice(1);\r\n}\r\n\r\n/**\r\n * Builds the Grafana metric segment for use on the query user interface.\r\n *\r\n * @param {any} response - response from PI Web API.\r\n * @returns - Grafana metric segment.\r\n *\r\n * @memberOf PiWebApiDatasource\r\n */\r\nexport function metricQueryTransform(response: PiwebapiRsp[]): MetricFindValue[] {\r\n return map(response, (item) => {\r\n return {\r\n text: item.Name,\r\n expandable:\r\n item.HasChildren === undefined || item.HasChildren === true || (item.Path ?? '').split('\\\\').length <= 3,\r\n HasChildren: item.HasChildren,\r\n Items: item.Items ?? [],\r\n Path: item.Path,\r\n WebId: item.WebId,\r\n } as MetricFindValue;\r\n });\r\n}\r\n\r\n/**\r\n * Check if all items are selected.\r\n *\r\n * @param {any} current the current variable selection\r\n * @return {boolean} true if all value is selected, false otherwise\r\n */\r\nexport function isAllSelected(current: any): boolean {\r\n if (!current) {\r\n return false;\r\n }\r\n if (Array.isArray(current.text)) {\r\n return current.text.indexOf('All') >= 0;\r\n }\r\n return current.text === 'All';\r\n}\r\n\r\nexport function processAnnotationQuery(annon: AnnotationQuery,data: DataFrame[]): DataFrame[] {\r\n let processedFrames: DataFrame[] = [];\r\n \r\n data.forEach((d: DataFrame) => {\r\n d.fields.forEach((f: Field) => {\r\n\r\n // check if the label has been set, if it hasn't been set then the eventframe annotation is not valid. \r\n if (!f.labels) { \r\n return \r\n }\r\n\r\n if (!('eventframe' in f.labels)) {\r\n return;\r\n }\r\n\r\n let attribute = 'attribute' in f.labels\r\n\r\n // Check whether f.values is an array or not to allow for each.\r\n // Check whether f.values is an array or not to allow for each.\r\n if (Array.isArray(f.values)) {\r\n f.values.forEach((value: any) => {\r\n\r\n if (attribute) {\r\n let annotation = value['1'].Content\r\n let valueData: any[] = []\r\n for (let i = 2; i in value; i++) {\r\n valueData.push(value[i].Content.Items)\r\n }\r\n\r\n const processedFrame = convertToTableData(annotation.Items!, valueData).map((r) => {\r\n return toDataFrame(r)});\r\n processedFrames = processedFrames.concat(processedFrame);\r\n } else {\r\n let annotation = value['1'].Content\r\n const processedFrame = convertToTableData(annotation.Items!).map((r) => {\r\n return toDataFrame(r)});\r\n processedFrames = processedFrames.concat(processedFrame);\r\n }\r\n });\r\n } \r\n });\r\n });\r\n return processedFrames;\r\n}\r\n\r\nexport function convertToTableData(items: any[], valueData?: any[]): TableData[] {\r\n const response: TableData[] = items.map((item: any, index: number) => {\r\n const columns = [{ text: 'StartTime' }, { text: 'EndTime' }];\r\n const rows = [item.StartTime, item.EndTime];\r\n if (valueData) {\r\n for (let attributeIndex = 0; attributeIndex < valueData.length; attributeIndex++) {\r\n let attributeData = valueData[attributeIndex]\r\n let eventframeAributeData = attributeData[index].Content.Items\r\n eventframeAributeData.forEach((attribute: any) => {\r\n columns.push({ text: attribute.Name });\r\n rows.push(String(attribute.Value.Value ? attribute.Value.Value.Name || attribute.Value.Value.Value || attribute.Value.Value : ''));\r\n });\r\n }\r\n }\r\n\r\n return {\r\n name: item.Name,\r\n columns,\r\n rows: [rows],\r\n };\r\n });\r\n return response;\r\n}\r\n\r\n/**\r\n * Resolve PIWebAPI response 'value' data to value - timestamp pairs.\r\n *\r\n * @param {any} item - 'Item' object from PIWebAPI\r\n * @param {any} noDataReplacementMode - String state of how to replace 'No Data'\r\n * @param {any} grafanaDataPoint - Single Grafana value pair (value, timestamp).\r\n * @returns grafanaDataPoint - Single Grafana value pair (value, timestamp).\r\n * @returns perviousValue - {any} Grafana value (value only).\r\n *\r\n */\r\nexport function noDataReplace(\r\n item: any,\r\n noDataReplacementMode: any,\r\n grafanaDataPoint: any[]\r\n): {\r\n grafanaDataPoint: any[];\r\n previousValue: any;\r\n drop: boolean;\r\n} {\r\n let previousValue = null;\r\n let drop = false;\r\n if (!item.Good || item.Value === 'No Data' || (item.Value?.Name && item.Value?.Name === 'No Data')) {\r\n if (noDataReplacementMode === 'Drop') {\r\n drop = true;\r\n } else if (noDataReplacementMode === '0') {\r\n grafanaDataPoint[0] = 0;\r\n } else if (noDataReplacementMode === 'Keep') {\r\n // Do nothing keep\r\n } else if (noDataReplacementMode === 'Null') {\r\n grafanaDataPoint[0] = null;\r\n } else if (noDataReplacementMode === 'Previous' && previousValue !== null) {\r\n grafanaDataPoint[0] = previousValue;\r\n }\r\n } else {\r\n previousValue = item.Value;\r\n }\r\n return { grafanaDataPoint, previousValue, drop };\r\n}\r\n\r\n/**\r\n * Check if the value is a number.\r\n *\r\n * @param {any} number the value to check\r\n * @returns {boolean} true if the value is a number, false otherwise\r\n */\r\nexport function checkNumber(number: any): boolean {\r\n return typeof number === 'number' && !Number.isNaN(number) && Number.isFinite(number);\r\n}\r\n\r\n/**\r\n * Returns the last item of the element path.\r\n *\r\n * @param {string} path element path\r\n * @returns {string} last item of the element path\r\n */\r\nexport function getLastPath(path: string): string {\r\n let splitPath = path.split('|');\r\n if (splitPath.length === 0) {\r\n return '';\r\n }\r\n splitPath = splitPath[0].split('\\\\');\r\n return splitPath.length === 0 ? '' : splitPath.pop() ?? '';\r\n}\r\n\r\n/**\r\n * Returns the last item of the element path plus variable.\r\n *\r\n * @param {PiwebapiElementPath[]} elementPathArray array of element paths\r\n * @param {string} path element path\r\n * @returns {string} last item of the element path\r\n */\r\nexport function getPath(elementPathArray: PiwebapiElementPath[], path: string): string {\r\n if (!path || elementPathArray.length === 0) {\r\n return '';\r\n }\r\n const splitStr = getLastPath(path);\r\n const foundElement = elementPathArray.find((e) => path.indexOf(e.path) >= 0)?.variable;\r\n return foundElement ? foundElement + '|' + splitStr : splitStr;\r\n}\r\n\r\n/**\r\n * Replace calculation dot in expression with PI point name.\r\n *\r\n * @param {boolean} replace - is pi point and calculation.\r\n * @param {PiwebapiRsp} webid - Pi web api response object.\r\n * @param {string} url - original url.\r\n * @returns Modified url\r\n */\r\nexport function getFinalUrl(replace: boolean, webid: PiwebapiRsp, url: string) {\r\n const newUrl = replace ? url.replace(/'\\.'/g, `'${webid.Name}'`) : url;\r\n return newUrl;\r\n}\r\n","import { each, filter, forOwn, join, reduce, map, slice, remove, defaults } from 'lodash';\n\nimport React, { PureComponent, ChangeEvent } from 'react';\nimport { Icon, InlineField, InlineFieldRow, InlineSwitch, Input, SegmentAsync, Segment } from '@grafana/ui';\nimport { QueryEditorProps, SelectableValue, TypedVariableModel } from '@grafana/data';\n\nimport { PiWebAPIDatasource } from '../datasource';\nimport { QueryInlineField, QueryRawInlineField, QueryRowTerminator } from '../components/Forms';\nimport { PIWebAPISelectableValue, PIWebAPIDataSourceJsonData, PIWebAPIQuery, defaultQuery } from '../types';\nimport { QueryEditorModeSwitcher } from 'components/QueryEditorModeSwitcher';\nimport { parseRawQuery } from 'helper';\n\nconst LABEL_WIDTH = 24;\nconst MIN_ELEM_INPUT_WIDTH = 200;\nconst MIN_ATTR_INPUT_WIDTH = 250;\n\ninterface State {\n isPiPoint: boolean;\n segments: Array>;\n attributes: Array>;\n summaries: Array>;\n attributeSegment: SelectableValue;\n summarySegment: SelectableValue;\n calculationBasisSegment: SelectableValue;\n noDataReplacementSegment: SelectableValue;\n}\n\ntype Props = QueryEditorProps;\n\nconst REMOVE_LABEL = '-REMOVE-';\n\nconst CustomLabelComponent = (props: any) => {\n if (props.value) {\n return (\n
\n {props.label ?? '--no label--'}\n
\n );\n }\n return (\n \n \n \n );\n};\n\nexport class PIWebAPIQueryEditor extends PureComponent {\n error: any;\n piServer: any[] = [];\n availableAttributes: any = {};\n summaryTypes: string[];\n calculationBasis: string[];\n noDataReplacement: string[];\n state: State = {\n isPiPoint: false,\n segments: [],\n attributes: [],\n summaries: [],\n attributeSegment: {},\n summarySegment: {},\n calculationBasisSegment: {},\n noDataReplacementSegment: {},\n };\n\n constructor(props: any) {\n super(props);\n this.onSegmentChange = this.onSegmentChange.bind(this);\n this.calcBasisValueChanged = this.calcBasisValueChanged.bind(this);\n this.calcNoDataValueChanged = this.calcNoDataValueChanged.bind(this);\n this.onSummaryAction = this.onSummaryAction.bind(this);\n this.onSummaryValueChanged = this.onSummaryValueChanged.bind(this);\n this.onAttributeAction = this.onAttributeAction.bind(this);\n this.onAttributeChange = this.onAttributeChange.bind(this);\n\n this.summaryTypes = [\n // 'None', // A summary type is not specified.\n 'Total', // A totalization over the time range.\n 'Average', // The average value over the time range.\n 'Minimum', // The minimum value over the time range.\n 'Maximum', // The maximum value over the time range.\n 'Range', // The range value over the time range (minimum-maximum).\n 'StdDev', // The standard deviation over the time range.\n 'PopulationStdDev', // The population standard deviation over the time range.\n 'Count', // The sum of event count over the time range when calculation basis is event weighted. The sum of event time duration over the time range when calculation basis is time weighted.\n 'PercentGood', // Percent of data with good value during the calculation period. For time weighted calculations, the percentage is based on time. For event weighted calculations, the percent is based on event count.\n 'All', // A convenience for requesting all available summary calculations.\n 'AllForNonNumeric', // A convenience for requesting all available summary calculations for non-numeric data.\n ];\n\n this.calculationBasis = [\n 'TimeWeighted', // Weight the values in the calculation by the time over which they apply. Interpolation is based on whether the attribute is stepped. Interpolated events are generated at the boundaries if necessary.\n 'EventWeighted', // Evaluate values with equal weighting for each event. No interpolation is done. There must be at least one event within the time range to perform a successful calculation. Two events are required for standard deviation. In handling events at the boundary of the calculation, the AFSDK uses following rules:\n 'TimeWeightedContinuous', // Apply weighting as in TimeWeighted, but do all interpolation between values as if they represent continuous data, (standard interpolation) regardless of whether the attribute is stepped.\n 'TimeWeightedDiscrete', // Apply weighting as in TimeWeighted but interpolation between values is performed as if they represent discrete, unrelated values (stair step plot) regardless of the attribute is stepped.\n 'EventWeightedExcludeMostRecentEvent', // The calculation behaves the same as _EventWeighted_, except in the handling of events at the boundary of summary intervals in a multiple intervals calculation. Use this option to prevent events at the intervals boundary from being double count at both intervals. With this option, events at the end time (most recent time) of an interval is not used in that interval.\n 'EventWeightedExcludeEarliestEvent', // Similar to the option _EventWeightedExcludeMostRecentEvent_. Events at the start time(earliest time) of an interval is not used in that interval.\n 'EventWeightedIncludeBothEnds', // Events at both ends of the interval boundaries are included in the event weighted calculation.\n ];\n\n this.noDataReplacement = [\n 'Null', // replace with nulls\n 'Drop', // drop items\n 'Previous', // use previous value if available\n '0', // replace with 0\n 'Keep', // Keep value\n ];\n }\n\n // is selected segment empty\n isValueEmpty(value: PIWebAPISelectableValue | undefined) {\n return !value || !value.value || !value.value.length || value.value === REMOVE_LABEL;\n }\n\n segmentChangeValue = (segments: Array>) => {\n const query = this.props.query;\n this.setState({ segments }, () => this.onChange({ ...query, segments }));\n };\n\n attributeChangeValue = (attributes: Array>): Promise => {\n const query = this.props.query;\n return new Promise((resolve) => this.setState({ attributes }, () => {\n this.onChange({ ...query, attributes })\n resolve();\n }));\n };\n\n // summary calculation basis change event\n calcBasisValueChanged(segment: SelectableValue) {\n const metricsQuery = this.props.query as PIWebAPIQuery;\n const summary = metricsQuery.summary;\n if (summary) {\n summary.basis = segment.value?.value;\n }\n this.onChange({ ...metricsQuery, summary });\n }\n // get summary calculation basis user interface segments\n getCalcBasisSegments() {\n const segments = map(this.calculationBasis, (item: string) => {\n let selectableValue: SelectableValue = {\n label: item,\n value: {\n value: item,\n expandable: true,\n },\n };\n return selectableValue;\n });\n return segments;\n }\n\n // no data change event\n calcNoDataValueChanged(segment: SelectableValue) {\n const metricsQuery = this.props.query as PIWebAPIQuery;\n const summary = metricsQuery.summary;\n if (summary) {\n summary.nodata = segment.value?.value;\n }\n this.onChange({ ...metricsQuery, summary });\n }\n // get no data user interface segments\n getNoDataSegments() {\n const segments = map(this.noDataReplacement, (item: string) => {\n let selectableValue: SelectableValue = {\n label: item,\n value: {\n value: item,\n expandable: true,\n },\n };\n return selectableValue;\n });\n return segments;\n }\n\n // summary query change event\n onSummaryValueChanged(item: SelectableValue, index: number) {\n const summaries = this.state.summaries.slice(0) as Array>;\n summaries[index] = item;\n if (this.isValueEmpty(item.value)) {\n summaries.splice(index, 1);\n }\n this.setState({ summaries }, this.stateCallback);\n }\n // get the list of summaries available\n getSummarySegments() {\n const summaryTypes = filter(this.summaryTypes, (type) => {\n return this.state.summaries.map((s) => s.value?.value).indexOf(type) === -1;\n });\n\n const segments = map(summaryTypes, (item: string) => {\n let selectableValue: SelectableValue = {\n label: item,\n value: {\n value: item,\n expandable: true,\n },\n };\n return selectableValue;\n });\n\n segments.unshift({\n label: REMOVE_LABEL,\n value: {\n value: REMOVE_LABEL,\n },\n });\n\n return segments;\n }\n\n // remove a summary from the user interface and the query\n removeSummary(part: SelectableValue) {\n const summaries = filter(this.state.summaries, (item: SelectableValue) => {\n return item !== part;\n });\n this.setState({ summaries });\n }\n // add a new summary to the query\n onSummaryAction(item: SelectableValue) {\n const summaries = this.state.summaries.slice(0) as Array>;\n // if value is not empty, add new attribute segment\n if (!this.isValueEmpty(item.value)) {\n let selectableValue: SelectableValue = {\n label: item.label,\n value: {\n value: item.value?.value,\n expandable: true,\n },\n };\n summaries.push(selectableValue);\n }\n this.setState({ summarySegment: {}, summaries }, this.stateCallback);\n }\n\n // remove an attribute from the query\n removeAttribute(part: SelectableValue) {\n const attributes = filter(this.state.attributes, (item: SelectableValue) => {\n return item !== part;\n });\n this.attributeChangeValue(attributes);\n }\n // add an attribute to the query\n onAttributeAction(item: SelectableValue) {\n const { query } = this.props;\n const attributes = this.state.attributes.slice(0);\n // if value is not empty, add new attribute segment\n if (!this.isValueEmpty(item.value)) {\n let selectableValue: SelectableValue = {\n label: item.label,\n value: {\n value: item.value?.value,\n expandable: !query.isPiPoint,\n },\n };\n attributes.push(selectableValue);\n }\n this.attributeChangeValue(attributes);\n }\n\n // pi point change event\n onPiPointChange = (item: SelectableValue, index: number) => {\n let attributes = this.state.attributes.slice(0);\n\n if (item.label === REMOVE_LABEL) {\n remove(attributes, (value, n) => n === index);\n } else {\n // set current value\n attributes[index] = item;\n }\n\n this.checkPiPointSegments(item, attributes);\n };\n // attribute change event\n onAttributeChange = (item: SelectableValue, index: number) => {\n let attributes = this.state.attributes.slice(0);\n\n // ignore if no change\n if (attributes[index].label === item.value?.value) {\n return;\n }\n\n // set current value\n attributes[index] = item;\n\n this.checkAttributeSegments(attributes, this.state.segments);\n };\n // segment change\n onSegmentChange = (item: SelectableValue, index: number) => {\n const { query } = this.props;\n let segments = this.state.segments.slice(0);\n\n // ignore if no change\n if (segments[index].label === item.value?.value) {\n return;\n }\n\n // reset attributes list\n this.setState({ attributes: [] }, () => {\n if (item.label === REMOVE_LABEL) {\n segments = slice(segments, 0, index);\n this.checkAttributeSegments([], segments).then(() => {\n if (segments.length === 0) {\n segments.push({\n label: '',\n });\n } else if (!!segments[segments.length - 1].value?.expandable) {\n segments.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n if (query.isPiPoint) {\n this.piServer = [];\n }\n this.segmentChangeValue(segments);\n });\n return;\n }\n\n // set current value\n segments[index] = item;\n\n // Accept only one PI server\n if (query.isPiPoint) {\n this.piServer.push(item);\n this.segmentChangeValue(segments);\n return;\n }\n\n // changed internal selection\n if (index < segments.length - 1) {\n segments = slice(segments, 0, index + 1);\n }\n this.checkAttributeSegments([], segments).then((): Promise>> => {\n // add new options\n if (item.value?.type === 'template') { // if it's a variable we need to check for new elements\\\n return this.getElementSegments(segments.length + 1, segments).then((elements) => {\n if (elements.length > 0) {\n segments.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n this.segmentChangeValue(segments);\n return segments;\n });\n } else if (!!item.value?.expandable) {\n segments.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n return new Promise((resolve) => {\n this.segmentChangeValue(segments);\n resolve(segments);\n });\n });\n });\n };\n\n // get a ui segment for the attributes\n getElementSegments = (\n index: number,\n currentSegment?: Array>\n ): Promise>> => {\n const { datasource, query, data } = this.props;\n const ctrl = this;\n const findQuery = query.isPiPoint\n ? { type: 'dataserver' }\n : {\n path: this.getSegmentPathUpTo(currentSegment ?? this.state.segments.slice(0), index),\n afServerWebId: this.state.segments.length > 0 && this.state.segments[0].value ? this.state.segments[0].value.webId : undefined,\n };\n\n if (!query.isPiPoint) {\n if (datasource.afserver?.name && index === 0) {\n return Promise.resolve([\n {\n label: datasource.afserver.name,\n value: {\n value: datasource.afserver.name,\n expandable: true,\n },\n },\n ]);\n }\n if (datasource.afserver?.name && datasource.afdatabase?.name && index === 1) {\n return Promise.resolve([\n {\n label: datasource.afdatabase.name,\n value: {\n value: datasource.afdatabase.name,\n expandable: true,\n },\n },\n ]);\n }\n }\n return datasource\n .metricFindQuery(findQuery, Object.assign(data?.request?.scopedVars ?? {}, { isPiPoint: query.isPiPoint }))\n .then((items: any[]) => {\n const altSegments = map(items, (item: any) => {\n let selectableValue: SelectableValue = {\n label: item.text,\n value: {\n webId: item.WebId,\n value: item.text,\n expandable: !query.isPiPoint && item.expandable,\n },\n };\n return selectableValue;\n });\n\n if (altSegments.length === 0) {\n return altSegments;\n }\n\n // add template variables\n const variables = datasource.templateSrv.getVariables();\n each(variables, (variable: TypedVariableModel) => {\n let selectableValue: SelectableValue = {\n label: '${' + variable.name + '}',\n value: {\n type: 'template',\n value: '${' + variable.name + '}',\n expandable: !query.isPiPoint,\n },\n };\n altSegments.unshift(selectableValue);\n });\n\n // add remove label\n altSegments.unshift({\n label: REMOVE_LABEL,\n value: {\n value: REMOVE_LABEL,\n },\n });\n\n return altSegments;\n })\n .catch((err: any) => {\n ctrl.error = err.message || 'Failed to issue metric query';\n return [];\n });\n };\n\n // get the list of attributes for the user interface - PI\n getAttributeSegmentsPI = (attributeText?: string): Promise>> => {\n const { datasource, query, data } = this.props;\n const ctrl = this;\n const findQuery = {\n path: '',\n webId: this.getSelectedPIServer(),\n pointName: (attributeText ?? '') + '*',\n type: 'pipoint',\n };\n let segments: Array> = [];\n return datasource\n .metricFindQuery(findQuery, Object.assign(data?.request?.scopedVars ?? {}, { isPiPoint: query.isPiPoint }))\n .then((items: any[]) => {\n segments = map(items, (item: any) => {\n let selectableValue: SelectableValue = {\n path: item.Path,\n label: item.text,\n value: {\n value: item.text,\n expandable: false,\n },\n };\n return selectableValue;\n });\n if (!!attributeText && attributeText.length > 0) {\n segments.unshift({\n label: attributeText,\n value: {\n value: attributeText,\n expandable: false,\n },\n });\n }\n // add template variables\n const variables = datasource.templateSrv.getVariables();\n each(variables, (variable: TypedVariableModel) => {\n let selectableValue: SelectableValue = {\n label: '${' + variable.name + '}',\n value: {\n type: 'template',\n value: '${' + variable.name + '}',\n expandable: !query.isPiPoint,\n },\n };\n segments.unshift(selectableValue);\n });\n\n // add remove label\n segments.unshift({\n label: REMOVE_LABEL,\n value: {\n value: REMOVE_LABEL,\n },\n });\n\n return segments;\n })\n .catch((err: any) => {\n ctrl.error = err.message || 'Failed to issue metric query';\n return segments;\n });\n };\n\n // get the list of attributes for the user interface - AF\n getAttributeSegmentsAF = (attributeText?: string): Array> => {\n const ctrl = this;\n let segments: Array> = [];\n\n segments.push({\n label: REMOVE_LABEL,\n value: {\n value: REMOVE_LABEL,\n },\n });\n\n forOwn(ctrl.availableAttributes, (val: any, key: string) => {\n let selectableValue: SelectableValue = {\n label: key,\n value: {\n value: key,\n expandable: true,\n },\n };\n segments.push(selectableValue);\n });\n\n return segments;\n };\n\n // build data from target string\n buildFromTarget = (\n query: PIWebAPIQuery,\n segmentsArray: Array>,\n attributesArray: Array>\n ) => {\n const splitAttributes = query.target!.split(';');\n const splitElements = splitAttributes.length > 0 ? splitAttributes[0].split('\\\\') : [];\n\n if (splitElements.length > 1 || (splitElements.length === 1 && splitElements[0] !== '')) {\n // remove element hierarchy from attribute collection\n splitAttributes.splice(0, 1);\n\n each(splitElements, (item, _) => {\n segmentsArray.push({\n label: item,\n value: {\n type: item.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: item,\n expandable: true,\n },\n });\n });\n each(splitAttributes, (item, _) => {\n if (item !== '') {\n // set current value\n attributesArray.push({\n label: item,\n value: {\n value: item,\n expandable: false,\n },\n });\n }\n });\n return this.getElementSegments(splitElements.length + 1, segmentsArray).then((elements) => {\n if (elements.length > 0) {\n segmentsArray.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n return segmentsArray;\n });\n }\n return Promise.resolve(segmentsArray);\n };\n\n /**\n * Gets the segment information and parses it to a string.\n *\n * @param {any} index - Last index of segment to use.\n * @returns - AF Path or PI Point name.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n getSegmentPathUpTo(segments: Array>, index: number): string {\n const arr = segments.slice(0, index);\n\n return reduce(\n arr,\n (result: any, segment: SelectableValue) => {\n if (!segment.value) {\n return '';\n }\n if (!segment.value.value?.startsWith('-Select')) {\n return result ? result + '\\\\' + segment.value.value : segment.value.value;\n }\n return result;\n },\n ''\n );\n }\n\n /**\n * Get the current AF Element's child attributes. Validates when the element selection changes.\n *\n * @returns - Collection of attributes.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n checkAttributeSegments(\n attributes: Array>,\n segments: Array>\n ): Promise {\n const { datasource, data } = this.props;\n const ctrl = this;\n const findQuery = {\n path: this.getSegmentPathUpTo(segments.slice(0), segments.length),\n type: 'attributes',\n };\n return datasource\n .metricFindQuery(findQuery, Object.assign(data?.request?.scopedVars ?? {}, { isPiPoint: false }))\n .then((attributesResponse: any) => {\n const validAttributes: any = {};\n\n each(attributesResponse, (attribute: any) => {\n validAttributes[attribute.Path.substring(attribute.Path.indexOf('|') + 1)] = attribute.WebId;\n });\n\n const filteredAttributes = filter(attributes, (attrib: SelectableValue) => {\n const changedValue = datasource.templateSrv.replace(attrib.value?.value);\n return validAttributes[changedValue] !== undefined;\n });\n\n ctrl.availableAttributes = validAttributes;\n return this.attributeChangeValue(filteredAttributes);\n })\n .catch((err: any) => {\n ctrl.error = err.message || 'Failed to issue metric query';\n return this.attributeChangeValue(attributes);\n });\n }\n\n /**\n * Get PI points from server.\n *\n * @returns - Collection of attributes.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n checkPiPointSegments(\n attribute: SelectableValue,\n attributes: Array>\n ) {\n const { datasource, data } = this.props;\n const ctrl = this;\n const findQuery = {\n path: attribute.path,\n webId: ctrl.getSelectedPIServer(),\n pointName: attribute.label,\n type: 'pipoint',\n };\n return datasource\n .metricFindQuery(findQuery, Object.assign(data?.request?.scopedVars ?? {}, { isPiPoint: true }))\n .then(() => {\n return ctrl.attributeChangeValue(attributes);\n })\n .catch((err: any) => {\n ctrl.error = err.message || 'Failed to issue metric query';\n return ctrl.attributeChangeValue([]);\n });\n }\n\n /**\n * Gets the webid of the current selected pi data server.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n getSelectedPIServer() {\n let webID = '';\n\n this.piServer.forEach((s) => {\n const parts = this.props.query.target!.split(';');\n if (parts.length >= 2) {\n if (parts[0] === s.text) {\n webID = s.WebId;\n return;\n }\n }\n });\n return this.piServer.length > 0 ? this.piServer[0].value?.webId : webID;\n }\n\n /**\n * Queries PI Web API for child elements and attributes when the raw query text editor is changed.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n textEditorChanged() {\n const { query } = this.props;\n const splitAttributes = query.target!.split(';');\n const splitElements = splitAttributes.length > 0 ? splitAttributes[0].split('\\\\') : [];\n\n let segments: Array> = [];\n let attributes: Array> = [];\n\n if (splitElements.length > 1 || (splitElements.length === 1 && splitElements[0] !== '')) {\n // remove element hierarchy from attribute collection\n splitAttributes.splice(0, 1);\n\n each(splitElements, (item, _) => {\n segments.push({\n label: item,\n value: {\n type: item.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: item,\n expandable: true,\n },\n });\n });\n each(splitAttributes, function (item, index) {\n if (item !== '') {\n attributes.push({\n label: item,\n value: {\n value: item,\n expandable: false,\n },\n });\n }\n });\n this.getElementSegments(splitElements.length + 1, segments)\n .then((elements) => {\n if (elements.length > 0) {\n segments.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n })\n .then(() => {\n this.updateArray(segments, attributes, this.state.summaries, query.isPiPoint!, () => {\n this.onChange({\n ...query,\n query: undefined,\n rawQuery: false,\n attributes: this.state.attributes,\n segments: this.state.segments,\n });\n });\n });\n } else {\n segments = this.checkAfServer();\n this.updateArray(segments, this.state.attributes, this.state.summaries, query.isPiPoint!, () => {\n this.onChange({\n ...query,\n query: undefined,\n rawQuery: false,\n attributes: this.state.attributes,\n segments: this.state.segments,\n });\n });\n }\n }\n\n /**\n * Check if the AF server and database are configured in the datasoure config.\n *\n * @returns the segments array\n *\n * @memberOf PIWebAPIQueryEditor\n */\n checkAfServer = () => {\n const { datasource } = this.props;\n const segmentsArray = [];\n if (datasource.afserver?.name) {\n segmentsArray.push({\n label: datasource.afserver.name,\n value: {\n value: datasource.afserver.name,\n expandable: true,\n },\n });\n if (datasource.afdatabase?.name) {\n segmentsArray.push({\n label: datasource.afdatabase.name,\n value: {\n value: datasource.afdatabase.name,\n expandable: true,\n },\n });\n }\n segmentsArray.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n } else {\n segmentsArray.push({\n label: '',\n });\n }\n return segmentsArray;\n };\n\n /**\n * Update the internal state of the datasource.\n *\n * @param segmentsArray the segments array to update\n * @param attributesArray the AF attributes array to update\n * @param summariesArray the summaries array to update\n * @param isPiPoint the is PI point flag\n * @param cb optional callback function\n *\n * @memberOf PIWebAPIQueryEditor\n */\n updateArray = (\n segmentsArray: Array>,\n attributesArray: Array>,\n summariesArray: Array>,\n isPiPoint: boolean,\n cb?: (() => void) | undefined\n ) => {\n this.setState(\n {\n segments: segmentsArray,\n attributes: attributesArray,\n summaries: summariesArray,\n isPiPoint,\n },\n () => {\n if (!isPiPoint) {\n this.checkAttributeSegments(attributesArray, this.state.segments).then(() => {\n if (cb) {\n cb();\n }\n });\n }\n }\n );\n };\n\n // React action when component is initialized/updated\n scopedVarsDone = false;\n componentDidMount = () => {\n this.initialLoad(false);\n };\n\n componentDidUpdate = () => {\n const { query } = this.props;\n if (this.props.data?.state === 'Done' && !!this.props.data?.request?.scopedVars && !this.scopedVarsDone) {\n this.scopedVarsDone = true;\n this.initialLoad(!query.isPiPoint);\n }\n };\n\n initialLoad = (force: boolean) => {\n const { query } = this.props;\n const metricsQuery = defaults(query, defaultQuery) as PIWebAPIQuery;\n const { segments, attributes, summary, isPiPoint } = metricsQuery;\n\n let segmentsArray: Array> = force ? [] : segments?.slice(0) ?? [];\n let attributesArray: Array> = force ? [] : attributes?.slice(0) ?? [];\n let summariesArray = summary?.types ?? [];\n\n if (!isPiPoint && segmentsArray.length === 0) {\n if (query.target && query.target.length > 0 && query.target !== ';') {\n attributesArray = [];\n // Build query from target\n this.buildFromTarget(query, segmentsArray, attributesArray)\n .then((_segmentsArray) => {\n this.updateArray(_segmentsArray, attributesArray, summariesArray, false);\n })\n .catch((e) => console.error(e));\n return;\n } else {\n segmentsArray = this.checkAfServer();\n }\n } else if (isPiPoint && segmentsArray.length > 0) {\n this.piServer = segmentsArray;\n }\n this.updateArray(segmentsArray, attributesArray, summariesArray, !!isPiPoint, () => {\n this.onChange(query);\n });\n };\n\n onChange = (query: PIWebAPIQuery) => {\n const { onChange, onRunQuery } = this.props;\n\n if (query.rawQuery) {\n query.target = query.query ?? '';\n if (!!query.query) {\n const { attributes, elementPath } = parseRawQuery(query.target);\n query.attributes = attributes;\n query.elementPath = elementPath;\n }\n } else {\n query.elementPath = this.getSegmentPathUpTo(this.state.segments, this.state.segments.length);\n query.target =\n query.elementPath +\n ';' +\n join(\n query.attributes?.map((s) => s.value?.value),\n ';'\n );\n }\n const summary = query.summary;\n if (summary) {\n summary.types = this.state.summaries;\n }\n\n onChange({...query, summary});\n\n if (this.isValidQuery(query)) {\n onRunQuery();\n }\n };\n\n isValidQuery = (query: PIWebAPIQuery): boolean => {\n if (query.target && query.target.length > 0 && query.target !== \";\") {\n query.target = query.target.trim();\n const targetSplit = query.target.split(\";\", 2);\n return targetSplit.length === 2 && targetSplit[0].length > 0 && targetSplit[1].length > 0;\n }\n return false;\n }\n\n stateCallback = () => {\n const query = this.props.query as PIWebAPIQuery;\n this.onChange(query);\n };\n\n onIsPiPointChange = (event: React.SyntheticEvent) => {\n const { query: queryChange } = this.props;\n const isPiPoint = !queryChange.isPiPoint;\n this.setState(\n {\n segments: isPiPoint ? [{ label: '' }] : this.checkAfServer(),\n attributes: [],\n isPiPoint,\n },\n () => {\n this.onChange({\n ...queryChange,\n expression: '',\n attributes: this.state.attributes,\n segments: this.state.segments,\n isPiPoint,\n });\n }\n );\n };\n\n render() {\n const { query: queryProps, onChange, onRunQuery } = this.props;\n const metricsQuery = defaults(queryProps, defaultQuery) as PIWebAPIQuery;\n const {\n useLastValue,\n useUnit,\n interpolate,\n query,\n rawQuery,\n digitalStates,\n enableStreaming,\n recordedValues,\n expression,\n isPiPoint,\n summary,\n display,\n regex,\n } = metricsQuery;\n\n return (\n <>\n {this.props.datasource.piPointConfig && (\n \n \n \n )}\n\n {!!rawQuery && (\n \n \n ) =>\n onChange({ ...metricsQuery, query: event.target.value })\n }\n placeholder=\"enter query\"\n />\n \n this.textEditorChanged()} />\n \n )}\n\n {!rawQuery && (\n <>\n
\n \n {this.state.segments.map((segment: SelectableValue, index: number) => {\n return (\n }\n onChange={(item) => this.onSegmentChange(item, index)}\n loadOptions={(query?: string | undefined) => {\n return this.getElementSegments(index);\n }}\n allowCustomValue\n inputMinWidth={MIN_ELEM_INPUT_WIDTH}\n />\n );\n })}\n \n {!isPiPoint && (\n {\n onChange({ ...metricsQuery, query: metricsQuery.target, rawQuery: value });\n }}\n />\n )}\n \n
\n\n \n {this.state.attributes.map((attribute: SelectableValue, index: number) => {\n if (isPiPoint) {\n return (\n }\n disabled={this.piServer.length === 0}\n onChange={(item) => this.onPiPointChange(item, index)}\n loadOptions={this.getAttributeSegmentsPI}\n reloadOptionsOnChange\n allowCustomValue\n inputMinWidth={MIN_ATTR_INPUT_WIDTH}\n />\n );\n }\n return (\n }\n disabled={this.state.segments.length <= 2}\n onChange={(item) => this.onAttributeChange(item, index)}\n options={this.getAttributeSegmentsAF()}\n allowCustomValue\n inputMinWidth={MIN_ATTR_INPUT_WIDTH}\n />\n );\n })}\n\n {isPiPoint && (\n \n }\n disabled={this.piServer.length === 0}\n onChange={this.onAttributeAction}\n loadOptions={this.getAttributeSegmentsPI}\n reloadOptionsOnChange\n allowCustomValue\n inputMinWidth={MIN_ATTR_INPUT_WIDTH}\n />\n )}\n {!isPiPoint && (\n \n }\n disabled={this.state.segments.length <= 2}\n onChange={this.onAttributeAction}\n options={this.getAttributeSegmentsAF()}\n allowCustomValue\n inputMinWidth={MIN_ATTR_INPUT_WIDTH}\n />\n )}\n \n \n )}\n\n \n \n ) =>\n onChange({ ...metricsQuery, expression: event.target.value })\n }\n placeholder=\"'.'*2\"\n />\n \n \n\n \n \n \n this.onChange({\n ...metricsQuery,\n useLastValue: { ...useLastValue, enable: !useLastValue.enable },\n })\n }\n />\n \n \n \n this.onChange({\n ...metricsQuery,\n digitalStates: { ...digitalStates, enable: !digitalStates.enable },\n })\n }\n />\n \n \n }\n onChange={this.calcNoDataValueChanged}\n options={this.getNoDataSegments()}\n allowCustomValue\n />\n \n {this.props.datasource.useUnitConfig && (\n \n \n this.onChange({\n ...metricsQuery,\n useUnit: { ...useUnit, enable: !useUnit.enable },\n })\n }\n />\n \n )}\n {this.props.datasource.useStreaming && (\n \n \n this.onChange({ ...metricsQuery, enableStreaming: { ...enableStreaming, enable: !enableStreaming.enable } })\n }\n />\n \n )}\n \n\n \n {!useLastValue.enable && (\n \n ) =>\n onChange({\n ...metricsQuery,\n recordedValues: { ...recordedValues, maxNumber: parseInt(event.target.value, 10) },\n })\n }\n type=\"number\"\n placeholder=\"1000\"\n />\n \n )}\n \n \n this.onChange({\n ...metricsQuery,\n recordedValues: { ...recordedValues, enable: !recordedValues.enable },\n })\n }\n />\n \n \n\n {!useLastValue.enable && (\n \n \n ) =>\n onChange({ ...metricsQuery, interpolate: { ...interpolate, interval: event.target.value } })\n }\n placeholder=\"30s\"\n />\n \n \n \n this.onChange({ ...metricsQuery, interpolate: { ...interpolate, enable: !interpolate.enable } })\n }\n />\n \n \n )}\n\n {!useLastValue.enable && (\n \n \n ) =>\n onChange({ ...metricsQuery, summary: { ...summary, interval: event.target.value } })\n }\n placeholder=\"30s\"\n />\n \n \n }\n onChange={this.calcBasisValueChanged}\n options={this.getCalcBasisSegments()}\n allowCustomValue\n />\n \n \n \n {this.state.summaries.map((s: SelectableValue, index: number) => {\n return (\n }\n onChange={(item) => this.onSummaryValueChanged(item, index)}\n options={this.getSummarySegments()}\n allowCustomValue\n />\n );\n })}\n \n }\n onChange={this.onSummaryAction}\n options={this.getSummarySegments()}\n allowCustomValue\n />\n \n \n \n )}\n\n \n \n ) =>\n onChange({ ...metricsQuery, display: event.target.value })\n }\n placeholder=\"Display\"\n />\n \n \n {\n this.onChange({ ...metricsQuery, regex: { ...regex, enable: !regex.enable } });\n }}\n />\n \n \n ) =>\n onChange({ ...metricsQuery, regex: { ...regex, search: event.target.value } })\n }\n placeholder=\"(.*)\"\n />\n \n \n ) =>\n onChange({ ...metricsQuery, regex: { ...regex, replace: event.target.value } })\n }\n placeholder=\"$1\"\n />\n \n \n \n );\n }\n}\n","import React, { memo, useState } from 'react';\n\nimport { AnnotationQuery, QueryEditorProps, SelectableValue } from '@grafana/data';\nimport { AsyncSelect, InlineField, InlineFieldRow, InlineSwitch, Input } from '@grafana/ui';\n\nimport { PiWebAPIDatasource } from 'datasource';\nimport { PIWebAPIDataSourceJsonData, PIWebAPIQuery, PiwebapiRsp } from 'types';\n\nconst SMALL_LABEL_WIDTH = 20;\nconst LABEL_WIDTH = 30;\nconst MIN_INPUT_WIDTH = 50;\n\ntype PiWebAPIQueryEditorProps = QueryEditorProps;\n\ntype Props = PiWebAPIQueryEditorProps & {\n annotation?: AnnotationQuery;\n onAnnotationChange?: (annotation: AnnotationQuery) => void;\n};\n\nexport const PiWebAPIAnnotationsQueryEditor = memo(function PiWebAPIAnnotationQueryEditor(props: Props) {\n const { query, datasource, annotation, onChange, onRunQuery } = props;\n\n const [afWebId, setAfWebId] = useState('');\n const [database, setDatabase] = useState(annotation?.target?.database ?? {});\n\n // this should never happen, but we want to keep typescript happy\n if (annotation === undefined) {\n return null;\n }\n\n const getEventFrames = (): Promise>> => {\n return datasource.getEventFrameTemplates(database?.WebId!).then((templ: PiwebapiRsp[]) => {\n return templ.map((d) => ({ label: d.Name, value: d }));\n });\n };\n\n const getDatabases = (): Promise>> => {\n return datasource.getDatabases(afWebId).then((dbs: PiwebapiRsp[]) => {\n return dbs.map((d) => ({ label: d.Name, value: d }));\n });\n };\n\n const getValue = (key: string) => {\n const query: any = annotation.target as any;\n if (!query || !query[key]) {\n return;\n }\n return { label: query[key].Name, value: query[key] };\n };\n\n datasource.getAssetServer(datasource.afserver.name).then((result) => {\n setAfWebId(result.WebId!);\n });\n\n return (\n <>\n
\n \n \n {\n setDatabase(e.value);\n onChange({ ...query, database: e.value, template: undefined });\n }}\n defaultOptions\n />\n \n \n onChange({ ...query, template: e.value })}\n defaultOptions\n />\n \n \n onChange({ ...query, showEndTime: e.currentTarget.checked })}\n />\n \n \n \n \n onRunQuery()}\n onChange={(e) => onChange({ ...query, categoryName: e.currentTarget.value })}\n placeholder=\"Enter category name\"\n />\n \n \n onRunQuery()}\n onChange={(e) => onChange({ ...query, nameFilter: e.currentTarget.value })}\n placeholder=\"Enter name filter\"\n />\n \n \n \n \n \n onChange({\n ...query,\n regex: { ...query.regex, enable: e.currentTarget.checked },\n })\n }\n />\n \n \n onRunQuery()}\n onChange={(e) =>\n onChange({\n ...query,\n regex: { ...query.regex, search: e.currentTarget.value },\n })\n }\n placeholder=\"(.*)\"\n width={MIN_INPUT_WIDTH}\n />\n \n \n onRunQuery()}\n onChange={(e) =>\n onChange({\n ...query,\n regex: { ...query.regex, replace: e.currentTarget.value },\n })\n }\n placeholder=\"$1\"\n />\n \n \n \n \n \n onChange({\n ...query!,\n attribute: { ...query.attribute, enable: e.currentTarget.checked },\n })\n }\n />\n \n \n onRunQuery()}\n onChange={(e) =>\n onChange({\n ...query!,\n attribute: { ...query.attribute, name: e.currentTarget.value },\n })\n }\n placeholder=\"Enter name\"\n />\n \n \n
\n \n );\n});\n","import { filter, map } from 'lodash';\n\nimport { Observable, of, firstValueFrom } from 'rxjs';\n\nimport {\n DataSourceInstanceSettings,\n MetricFindValue,\n AnnotationQuery,\n ScopedVars,\n AnnotationEvent,\n DataFrame,\n DataQueryRequest,\n DataQueryResponse,\n} from '@grafana/data';\nimport { BackendSrv, getBackendSrv, getTemplateSrv, TemplateSrv, DataSourceWithBackend } from '@grafana/runtime';\n\nimport { PIWebAPIQuery, PIWebAPIDataSourceJsonData, PiDataServer, PiwebapiInternalRsp, PiwebapiRsp } from './types';\nimport { metricQueryTransform } from 'helper';\n\nimport { PiWebAPIAnnotationsQueryEditor } from 'query/AnnotationsQueryEditor';\n\nexport class PiWebAPIDatasource extends DataSourceWithBackend {\n piserver: PiDataServer;\n afserver: PiDataServer;\n afdatabase: PiDataServer;\n piPointConfig: boolean;\n newFormatConfig: boolean;\n useUnitConfig: boolean;\n useExperimental: boolean;\n useStreaming: boolean;\n\n constructor(\n instanceSettings: DataSourceInstanceSettings,\n readonly templateSrv: TemplateSrv = getTemplateSrv(),\n private readonly backendSrv: BackendSrv = getBackendSrv()\n ) {\n super(instanceSettings);\n\n this.piserver = { name: (instanceSettings.jsonData || {}).piserver, webid: undefined };\n this.afserver = { name: (instanceSettings.jsonData || {}).afserver, webid: undefined };\n this.afdatabase = { name: (instanceSettings.jsonData || {}).afdatabase, webid: undefined };\n this.piPointConfig = instanceSettings.jsonData.pipoint || false;\n this.newFormatConfig = instanceSettings.jsonData.newFormat || false;\n this.useUnitConfig = instanceSettings.jsonData.useUnit || false;\n this.useExperimental = instanceSettings.jsonData.useExperimental || false;\n this.useStreaming = instanceSettings.jsonData.useStreaming || false;\n\n this.annotations = {\n QueryEditor: PiWebAPIAnnotationsQueryEditor,\n prepareQuery(anno: AnnotationQuery): PIWebAPIQuery | undefined {\n if (anno.target) {\n anno.target.queryType = 'Annotation';\n anno.target.isAnnotation = true;\n }\n return anno.target;\n },\n processEvents: (\n anno: AnnotationQuery,\n data: DataFrame[]\n ): Observable => {\n return of(this.eventFrameToAnnotation(anno, data));\n },\n };\n\n Promise.all([\n this.getDataServer(this.piserver.name).then((result: PiwebapiRsp) => (this.piserver.webid = result.WebId)),\n this.getAssetServer(this.afserver.name).then((result: PiwebapiRsp) => (this.afserver.webid = result.WebId)),\n this.getDatabase(\n this.afserver.name && this.afdatabase.name ? this.afserver.name + '\\\\' + this.afdatabase.name : undefined\n ).then((result: PiwebapiRsp) => (this.afdatabase.webid = result.WebId)),\n ]);\n }\n\n /**\n * This method overrides the applyTemplateVariables() method from the DataSourceWithBackend class.\n * It is responsible for replacing the template variables in the query configuration prior\n * to sending the query to the backend. Templated variables are not able to be used for alerts\n * or public facing dashboards.\n *\n * @param {PIWebAPIQuery} query - The raw query configuration from the frontend as defined in the query editor.\n * @param {ScopedVars} scopedVars - The template variables that are defined in the query editor and dashboard.\n * @returns - PIWebAPIQuery.\n *\n * @memberOf PiWebApiDatasource\n */\n applyTemplateVariables(query: PIWebAPIQuery, scopedVars: ScopedVars) {\n return {\n ...query,\n target: query.target ? this.templateSrv.replace(query.target, scopedVars) : '',\n };\n }\n\n /**\n * This method makes the query to the backend.\n *\n * @param {DataQueryRequest} options\n *\n * @memberOf PiWebApiDatasource\n */\n query(options: DataQueryRequest): Observable {\n if (options.targets.length === 1 && !!options.targets[0].isAnnotation) {\n return super.query(options);\n }\n\n const query = this.buildQueryParameters(options);\n if (query.targets.length <= 0) {\n return of({ data: [] });\n }\n\n return super.query(query);\n }\n\n /**\n * This method does the discovery of the AF Hierarchy and populates the query user interface segments.\n *\n * @param {any} query - Parses the query configuration and builds a PI Web API query.\n * @returns - Segment information.\n *\n * @memberOf PiWebApiDatasource\n */\n metricFindQuery(query: any, queryOptions: any): Promise {\n const ds = this;\n const querydepth = ['servers', 'databases', 'databaseElements', 'elements'];\n if (typeof query === 'string') {\n query = JSON.parse(query as string);\n }\n if (queryOptions.isPiPoint) {\n query.path = this.templateSrv.replace(query.path, queryOptions);\n } else {\n if (query.path === '') {\n query.type = querydepth[0];\n } else {\n query.path = this.templateSrv.replace(query.path, queryOptions); // replace variables in the path\n query.path = query.path.split(';')[0]; // if the attribute is in the path, let's remote it\n if (query.type !== 'attributes') {\n query.type = querydepth[Math.max(0, Math.min(query.path.split('\\\\').length, querydepth.length - 1))];\n }\n }\n query.path = query.path.replace(/\\{([^\\\\])*\\}/gi, (r: string) => r.substring(1, r.length - 2).split(',')[0]);\n }\n\n query.filter = query.filter ?? '*';\n query.max = query.max ?? 10000;\n\n if (query.type === 'servers') {\n return ds.afserver?.name\n ? ds\n .getAssetServer(ds.afserver.name)\n .then((result: PiwebapiRsp) => [result])\n .then(metricQueryTransform)\n : ds.getAssetServers().then(metricQueryTransform);\n } else if (query.type === 'databases' && !!query.afServerWebId) {\n return ds.getDatabases(query.afServerWebId, {}).then(metricQueryTransform);\n } else if (query.type === 'databases') {\n return ds\n .getAssetServer(query.path)\n .then((server) => ds.getDatabases(server.WebId ?? '', {}))\n .then(metricQueryTransform);\n } else if (query.type === 'databaseElements') {\n return ds\n .getDatabase(query.path)\n .then((db) =>\n ds.getDatabaseElements(db.WebId ?? '', {\n selectedFields: 'Items.WebId%3BItems.Name%3BItems.Items%3BItems.Path%3BItems.HasChildren',\n })\n )\n .then(metricQueryTransform);\n } else if (query.type === 'elements') {\n return ds\n .getElement(query.path)\n .then((element) =>\n ds.getElements(element.WebId ?? '', {\n selectedFields:\n 'Items.Description%3BItems.WebId%3BItems.Name%3BItems.Items%3BItems.Path%3BItems.HasChildren',\n nameFilter: query.filter,\n })\n )\n .then(metricQueryTransform);\n } else if (query.type === 'attributes') {\n return ds\n .getElement(query.path)\n .then((element) =>\n ds.getAttributes(element.WebId ?? '', {\n searchFullHierarchy: 'true',\n selectedFields:\n 'Items.Type%3BItems.DefaultUnitsName%3BItems.Description%3BItems.WebId%3BItems.Name%3BItems.Path',\n nameFilter: query.filter,\n maxCount: query.max,\n })\n )\n .then(metricQueryTransform);\n } else if (query.type === 'dataserver') {\n return ds.getDataServers().then(metricQueryTransform);\n } else if (query.type === 'pipoint') {\n return ds.piPointSearch(query.webId, query.pointName).then(metricQueryTransform);\n }\n return Promise.reject('Bad type');\n }\n\n /** PRIVATE SECTION */\n\n /**\n * Builds the PIWebAPI query parameters.\n *\n * @param {any} options - Grafana query and panel options.\n * @returns - PIWebAPI query parameters.\n *\n * @memberOf PiWebApiDatasource\n */\n private buildQueryParameters(options: DataQueryRequest) {\n options.targets = filter(options.targets, (target) => {\n if (!target || !target.target || target.attributes?.length === 0 || target.target === ';' || !!target.hide) {\n return false;\n }\n return !target.target.startsWith('Select AF');\n });\n\n if (options.maxDataPoints) {\n options.maxDataPoints = options.maxDataPoints > 30000 ? 30000 : options.maxDataPoints;\n }\n options.targets = map(options.targets, (target) => {\n const tar = {\n enableStreaming: target.enableStreaming,\n target: this.templateSrv.replace(target.target, options.scopedVars),\n elementPath: this.templateSrv.replace(target.elementPath, options.scopedVars),\n attributes: map(target.attributes, (att) => {\n if (att.value) {\n this.templateSrv.replace(att.value.value, options.scopedVars);\n }\n return att;\n }),\n segments: map(target.segments, (att) => {\n if (att.value) {\n this.templateSrv.replace(att.value.value, options.scopedVars);\n }\n return att;\n }),\n isAnnotation: !!target.isAnnotation,\n display: !!target.display ? this.templateSrv.replace(target.display, options.scopedVars) : undefined,\n refId: target.refId,\n hide: target.hide,\n interpolate: !!target.interpolate\n ? {\n ...target.interpolate,\n interval: this.templateSrv.replace(target.interpolate.interval, options.scopedVars),\n }\n : { enable: false },\n useLastValue: target.useLastValue || { enable: false },\n useUnit: target.useUnit || { enable: false },\n recordedValues: !!target.recordedValues\n ? {\n ...target.recordedValues,\n interval: this.templateSrv.replace(target.recordedValues.maxNumber, options.scopedVars),\n }\n : { enable: false },\n digitalStates: target.digitalStates || { enable: false },\n webid: target.webid ?? '',\n regex: target.regex || { enable: false },\n expression: target.expression || '',\n summary: target.summary || { types: [] },\n startTime: options.range.from,\n endTime: options.range.to,\n isPiPoint: !!target.isPiPoint,\n scopedVars: options.scopedVars,\n };\n\n if (tar.expression) {\n tar.expression = this.templateSrv.replace(tar.expression, options.scopedVars);\n }\n\n if (tar.summary.types !== undefined) {\n tar.summary.types = filter(tar.summary.types, (item) => {\n return item !== undefined && item !== null && item !== '';\n });\n tar.summary.interval = !!tar.summary.interval\n ? this.templateSrv.replace(tar.summary.interval, options.scopedVars)\n : tar.summary.interval;\n }\n\n return tar;\n });\n\n return options;\n }\n\n /**\n * Localize the eventFrame dataFrame records to Grafana Annotations.\n * @param {any} annon - The annotation object.\n * @param {any} data - The dataframe recrords.\n * @returns - Grafana Annotation\n *\n * @memberOf PiWebApiDatasource\n */\n private eventFrameToAnnotation(annon: AnnotationQuery, data: DataFrame[]): AnnotationEvent[] {\n const annotationOptions = annon.target!;\n const events: AnnotationEvent[] = [];\n const currentLocale = Intl.DateTimeFormat().resolvedOptions().locale;\n\n data.forEach((d: DataFrame) => {\n let values = this.transformDataFrameToMap(d);\n for (let i = 0; i < values['time'].length; i++) {\n // replace Dataframe name using Regex\n let title = values['title'][i];\n if (annotationOptions.regex && annotationOptions.regex.enable) {\n title = title.replace(new RegExp(annotationOptions.regex.search), annotationOptions.regex.replace);\n }\n\n // test if timeEnd is negative and if so, set it to null\n if (values['timeEnd'][i] < 0) {\n values['timeEnd'][i] = null;\n }\n\n // format the text and localize the dates to browser locale\n let text = 'Tag: ' + title;\n if (annotationOptions.attribute && annotationOptions.attribute.enable) {\n text += values['attributeText'][i];\n }\n text += '
Start: ' + new Date(values['time'][i]).toLocaleString(currentLocale) + '
End: ';\n\n if (values['timeEnd'][i]) {\n text += new Date(values['timeEnd'][i]).toLocaleString(currentLocale);\n } else {\n text += 'Eventframe is open';\n }\n\n const event: AnnotationEvent = {\n time: values['time'][i],\n timeEnd: !!annotationOptions.showEndTime ? values['timeEnd'][i] : undefined,\n title: title,\n id: values['id'][i],\n text: text,\n tags: ['OSISoft PI'],\n };\n\n events.push(event);\n }\n });\n return events;\n }\n\n /**\n *\n */\n private transformDataFrameToMap(dataFrame: DataFrame): Record {\n const map: Record = {};\n\n dataFrame.fields.forEach((field) => {\n map[field.name] = field.values.toArray();\n });\n\n return map;\n }\n\n /**\n * Abstraction for calling the PI Web API REST endpoint\n *\n * @param {any} path - the path to append to the base server URL.\n * @returns - The full URL.\n *\n * @memberOf PiWebApiDatasource\n */\n private restGet(path: string): Promise {\n const observable = this.backendSrv.fetch({\n url: `/api/datasources/${this.id}/resources${path}`,\n method: 'GET',\n headers: { 'Content-Type': 'application/json' },\n });\n\n return firstValueFrom(observable).then((response: any) => {\n return response as PiwebapiInternalRsp;\n });\n }\n\n // Get a list of all data (PI) servers\n private getDataServers(): Promise {\n return this.restGet('/dataservers').then((response) => response.data.Items ?? []);\n }\n private getDataServer(name: string | undefined): Promise {\n if (!name) {\n return Promise.resolve({});\n }\n return this.restGet('/dataservers?name=' + name).then((response) => response.data);\n }\n // Get a list of all asset (AF) servers\n private getAssetServers(): Promise {\n return this.restGet('/assetservers').then((response) => response.data.Items ?? []);\n }\n getAssetServer(name: string | undefined): Promise {\n if (!name) {\n return Promise.resolve({});\n }\n return this.restGet('/assetservers?path=\\\\\\\\' + name).then((response) => response.data);\n }\n getDatabase(path: string | undefined): Promise {\n if (!path) {\n return Promise.resolve({});\n }\n return this.restGet('/assetdatabases?path=\\\\\\\\' + path).then((response) => response.data);\n }\n getDatabases(serverId: string, options?: any): Promise {\n if (!serverId) {\n return Promise.resolve([]);\n }\n return this.restGet('/assetservers/' + serverId + '/assetdatabases').then((response) => response.data.Items ?? []);\n }\n getElement(path: string): Promise {\n if (!path) {\n return Promise.resolve({});\n }\n return this.restGet('/elements?path=\\\\\\\\' + path).then((response) => response.data);\n }\n getEventFrameTemplates(databaseId: string): Promise {\n if (!databaseId) {\n return Promise.resolve([]);\n }\n return this.restGet(\n '/assetdatabases/' + databaseId + '/elementtemplates?selectedFields=Items.InstanceType%3BItems.Name%3BItems.WebId'\n ).then((response) => {\n return filter(response.data.Items ?? [], (item) => item.InstanceType === 'EventFrame');\n });\n }\n getElementTemplates(databaseId: string): Promise {\n if (!databaseId) {\n return Promise.resolve([]);\n }\n return this.restGet(\n '/assetdatabases/' + databaseId + '/elementtemplates?selectedFields=Items.InstanceType%3BItems.Name%3BItems.WebId'\n ).then((response) => {\n return filter(response.data.Items ?? [], (item) => item.InstanceType === 'Element');\n });\n }\n\n /**\n * @description\n * Get the child attributes of the current resource.\n * GET attributes/{webId}/attributes\n * @param {string} elementId - The ID of the parent resource. See WebID for more information.\n * @param {Object} options - Query Options\n * @param {string} options.nameFilter - The name query string used for finding attributes. The default is no filter. See Query String for more information.\n * @param {string} options.categoryName - Specify that returned attributes must have this category. The default is no category filter.\n * @param {string} options.templateName - Specify that returned attributes must be members of this template. The default is no template filter.\n * @param {string} options.valueType - Specify that returned attributes' value type must be the given value type. The default is no value type filter.\n * @param {string} options.searchFullHierarchy - Specifies if the search should include attributes nested further than the immediate attributes of the searchRoot. The default is 'false'.\n * @param {string} options.sortField - The field or property of the object used to sort the returned collection. The default is 'Name'.\n * @param {string} options.sortOrder - The order that the returned collection is sorted. The default is 'Ascending'.\n * @param {string} options.startIndex - The starting index (zero based) of the items to be returned. The default is 0.\n * @param {string} options.showExcluded - Specified if the search should include attributes with the Excluded property set. The default is 'false'.\n * @param {string} options.showHidden - Specified if the search should include attributes with the Hidden property set. The default is 'false'.\n * @param {string} options.maxCount - The maximum number of objects to be returned per call (page size). The default is 1000.\n * @param {string} options.selectedFields - List of fields to be returned in the response, separated by semicolons (;). If this parameter is not specified, all available fields will be returned. See Selected Fields for more information.\n */\n private getAttributes(elementId: string, options: any): Promise {\n let querystring =\n '?' +\n map(options, (value, key) => {\n return key + '=' + value;\n }).join('&');\n\n if (querystring === '?') {\n querystring = '';\n }\n\n return this.restGet('/elements/' + elementId + '/attributes' + querystring).then(\n (response) => response.data.Items ?? []\n );\n }\n\n /**\n * @description\n * Retrieve elements based on the specified conditions. By default, this method selects immediate children of the current resource.\n * Users can search for the elements based on specific search parameters. If no parameters are specified in the search, the default values for each parameter will be used and will return the elements that match the default search.\n * GET assetdatabases/{webId}/elements\n * @param {string} databaseId - The ID of the parent resource. See WebID for more information.\n * @param {Object} options - Query Options\n * @param {string} options.webId - The ID of the resource to use as the root of the search. See WebID for more information.\n * @param {string} options.nameFilter - The name query string used for finding objects. The default is no filter. See Query String for more information.\n * @param {string} options.categoryName - Specify that returned elements must have this category. The default is no category filter.\n * @param {string} options.templateName - Specify that returned elements must have this template or a template derived from this template. The default is no template filter.\n * @param {string} options.elementType - Specify that returned elements must have this type. The default type is 'Any'. See Element Type for more information.\n * @param {string} options.searchFullHierarchy - Specifies if the search should include objects nested further than the immediate children of the searchRoot. The default is 'false'.\n * @param {string} options.sortField - The field or property of the object used to sort the returned collection. The default is 'Name'.\n * @param {string} options.sortOrder - The order that the returned collection is sorted. The default is 'Ascending'.\n * @param {number} options.startIndex - The starting index (zero based) of the items to be returned. The default is 0.\n * @param {number} options.maxCount - The maximum number of objects to be returned per call (page size). The default is 1000.\n * @param {string} options.selectedFields - List of fields to be returned in the response, separated by semicolons (;). If this parameter is not specified, all available fields will be returned. See Selected Fields for more information.\n */\n private getDatabaseElements(databaseId: string, options: any): Promise {\n let querystring =\n '?' +\n map(options, (value, key) => {\n return key + '=' + value;\n }).join('&');\n\n if (querystring === '?') {\n querystring = '';\n }\n\n return this.restGet('/assetdatabases/' + databaseId + '/elements' + querystring).then(\n (response) => response.data.Items ?? []\n );\n }\n\n /**\n * @description\n * Retrieve elements based on the specified conditions. By default, this method selects immediate children of the current resource.\n * Users can search for the elements based on specific search parameters. If no parameters are specified in the search, the default values for each parameter will be used and will return the elements that match the default search.\n * GET elements/{webId}/elements\n * @param {string} databaseId - The ID of the resource to use as the root of the search. See WebID for more information.\n * @param {Object} options - Query Options\n * @param {string} options.webId - The ID of the resource to use as the root of the search. See WebID for more information.\n * @param {string} options.nameFilter - The name query string used for finding objects. The default is no filter. See Query String for more information.\n * @param {string} options.categoryName - Specify that returned elements must have this category. The default is no category filter.\n * @param {string} options.templateName - Specify that returned elements must have this template or a template derived from this template. The default is no template filter.\n * @param {string} options.elementType - Specify that returned elements must have this type. The default type is 'Any'. See Element Type for more information.\n * @param {string} options.searchFullHierarchy - Specifies if the search should include objects nested further than the immediate children of the searchRoot. The default is 'false'.\n * @param {string} options.sortField - The field or property of the object used to sort the returned collection. The default is 'Name'.\n * @param {string} options.sortOrder - The order that the returned collection is sorted. The default is 'Ascending'.\n * @param {number} options.startIndex - The starting index (zero based) of the items to be returned. The default is 0.\n * @param {number} options.maxCount - The maximum number of objects to be returned per call (page size). The default is 1000.\n * @param {string} options.selectedFields - List of fields to be returned in the response, separated by semicolons (;). If this parameter is not specified, all available fields will be returned. See Selected Fields for more information.\n */\n private getElements(elementId: string, options: any): Promise {\n let querystring =\n '?' +\n map(options, (value, key) => {\n return key + '=' + value;\n }).join('&');\n\n if (querystring === '?') {\n querystring = '';\n }\n\n return this.restGet('/elements/' + elementId + '/elements' + querystring).then(\n (response) => response.data.Items ?? []\n );\n }\n\n /**\n * Retrieve a list of points on a specified Data Server.\n *\n * @param {string} serverId - The ID of the server. See WebID for more information.\n * @param {string} nameFilter - A query string for filtering by point name. The default is no filter. *, ?, [ab], [!ab]\n */\n private piPointSearch(serverId: string, nameFilter: string): Promise {\n let filter1 = this.templateSrv.replace(nameFilter);\n let filter2 = `${filter1}`;\n let doFilter = false;\n if (filter1 !== nameFilter) {\n const regex = /\\{(\\w|,)+\\}/gs;\n let m;\n while ((m = regex.exec(filter1)) !== null) {\n // This is necessary to avoid infinite loops with zero-width matches\n if (m.index === regex.lastIndex) {\n regex.lastIndex++;\n }\n\n // The result can be accessed through the `m`-variable.\n m.forEach((match, groupIndex) => {\n if (groupIndex === 0) {\n filter1 = filter1.replace(match, match.replace('{', '(').replace('}', ')').replace(',', '|'));\n filter2 = filter2.replace(match, '*');\n doFilter = true;\n }\n });\n }\n }\n return this.restGet('/dataservers/' + serverId + '/points?maxCount=50&nameFilter=' + filter2).then((results) => {\n if (!!results && !!results.data?.Items) {\n return doFilter ? results.data.Items.filter((item) => item.Name?.match(filter1)) : results.data.Items;\n }\n return [];\n });\n }\n}\n","import { DataSourcePlugin } from '@grafana/data';\nimport { PIWebAPIConfigEditor } from './config/ConfigEditor';\nimport { PIWebAPIQueryEditor } from './query/QueryEditor';\nimport { PiWebAPIDatasource } from './datasource';\nimport { PIWebAPIQuery, PIWebAPIDataSourceJsonData } from './types';\n\nexport const plugin = new DataSourcePlugin(\n PiWebAPIDatasource\n)\n .setQueryEditor(PIWebAPIQueryEditor)\n .setConfigEditor(PIWebAPIConfigEditor);\n"],"names":["module","exports","__WEBPACK_EXTERNAL_MODULE__781__","__WEBPACK_EXTERNAL_MODULE__531__","__WEBPACK_EXTERNAL_MODULE__7__","__WEBPACK_EXTERNAL_MODULE__241__","__WEBPACK_EXTERNAL_MODULE__959__","__WEBPACK_EXTERNAL_MODULE__269__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","FormField","LegacyForms","coerceOptions","options","jsonData","url","PIWebAPIConfigEditor","PureComponent","render","originalOptions","this","props","div","DataSourceHttpSettings","defaultUrl","dataSourceConfig","onChange","onHttpOptionsChange","showAccessOptions","h3","className","InlineField","label","labelWidth","InlineSwitch","pipoint","onPiPointChange","newFormat","onNewFormatChange","useUnit","onUseUnitChange","useExperimental","onUseExperimentalChange","useStreaming","onUseStreamingChange","inputWidth","onPIServerChange","piserver","placeholder","onAFServerChange","afserver","onAFDatabaseChange","afdatabase","event","onOptionsChange","target","checked","QueryField","tooltip","children","InlineFormLabel","width","QueryRowTerminator","QueryInlineField","QueryEditorRow","QueryRawInlineField","QueryRawEditorRow","defaultQuery","attributes","segments","regex","enable","summary","types","basis","interval","nodata","expression","interpolate","useLastValue","recordedValues","digitalStates","enableStreaming","isPiPoint","QueryEditorModeSwitcher","isRaw","isModalOpen","setModalOpen","useState","useEffect","Button","aria-label","icon","variant","type","onClick","ConfirmModal","isOpen","title","body","confirmText","dismissText","onConfirm","onDismiss","metricQueryTransform","response","map","item","text","Name","expandable","HasChildren","Path","split","length","Items","WebId","LABEL_WIDTH","MIN_ATTR_INPUT_WIDTH","REMOVE_LABEL","CustomLabelComponent","Icon","name","PIWebAPIQueryEditor","isValueEmpty","calcBasisValueChanged","segment","metricsQuery","query","getCalcBasisSegments","calculationBasis","calcNoDataValueChanged","getNoDataSegments","noDataReplacement","onSummaryValueChanged","index","summaries","state","slice","splice","setState","stateCallback","getSummarySegments","summaryTypes","filter","s","indexOf","unshift","removeSummary","part","onSummaryAction","selectableValue","push","summarySegment","removeAttribute","attributeChangeValue","onAttributeAction","getSegmentPathUpTo","arr","reduce","result","startsWith","checkAttributeSegments","data","datasource","ctrl","findQuery","path","metricFindQuery","assign","request","scopedVars","then","attributesResponse","validAttributes","each","attribute","substring","filteredAttributes","attrib","changedValue","templateSrv","replace","availableAttributes","catch","err","error","message","checkPiPointSegments","webId","getSelectedPIServer","pointName","webID","piServer","forEach","parts","textEditorChanged","splitAttributes","splitElements","_","match","getElementSegments","elements","updateArray","rawQuery","checkAfServer","queryProps","onRunQuery","defaults","display","piPointConfig","onIsPiPointChange","InlineFieldRow","grow","Input","onBlur","SegmentAsync","Component","onSegmentChange","loadOptions","allowCustomValue","inputMinWidth","disabled","getAttributeSegmentsPI","reloadOptionsOnChange","Segment","onAttributeChange","getAttributeSegmentsAF","attributeSegment","useUnitConfig","maxNumber","parseInt","search","constructor","super","calculationBasisSegment","noDataReplacementSegment","segmentChangeValue","Promise","resolve","remove","currentSegment","afServerWebId","items","altSegments","variables","getVariables","variable","attributeText","forOwn","val","buildFromTarget","segmentsArray","attributesArray","summariesArray","cb","scopedVarsDone","componentDidMount","initialLoad","componentDidUpdate","force","_segmentsArray","e","console","elementPath","tr","join","parseRawQuery","isValidQuery","trim","targetSplit","queryChange","bind","PiWebAPIAnnotationsQueryEditor","memo","annotation","afWebId","setAfWebId","database","setDatabase","getValue","getAssetServer","AsyncSelect","getDatabases","dbs","loadingMessage","template","defaultOptions","getEventFrameTemplates","templ","showEndTime","currentTarget","categoryName","nameFilter","PiWebAPIDatasource","DataSourceWithBackend","applyTemplateVariables","targets","isAnnotation","buildQueryParameters","of","queryOptions","ds","querydepth","JSON","parse","Math","max","min","getAssetServers","server","getDatabase","db","getDatabaseElements","selectedFields","getElement","element","getElements","getAttributes","searchFullHierarchy","maxCount","getDataServers","piPointSearch","reject","hide","maxDataPoints","tar","att","refId","webid","startTime","range","from","endTime","to","annon","annotationOptions","events","currentLocale","Intl","DateTimeFormat","resolvedOptions","locale","values","transformDataFrameToMap","i","RegExp","Date","toLocaleString","time","timeEnd","id","tags","dataFrame","fields","field","toArray","observable","backendSrv","fetch","method","headers","firstValueFrom","restGet","getDataServer","serverId","databaseId","InstanceType","getElementTemplates","elementId","querystring","filter1","filter2","doFilter","m","exec","lastIndex","groupIndex","results","instanceSettings","getTemplateSrv","getBackendSrv","newFormatConfig","annotations","QueryEditor","prepareQuery","anno","queryType","processEvents","eventFrameToAnnotation","all","plugin","DataSourcePlugin","setQueryEditor","setConfigEditor"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"module.js","mappings":"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","sources":["webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"@grafana/data\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"@grafana/runtime\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"@grafana/ui\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"lodash\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"react\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"rxjs\"","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/bootstrap","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/runtime/compat get default export","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/runtime/define property getters","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/runtime/hasOwnProperty shorthand","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/runtime/make namespace object","webpack://gridprotectionalliance-osisoftpi-datasource/./config/ConfigEditor.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./components/Forms.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./types.ts","webpack://gridprotectionalliance-osisoftpi-datasource/./components/QueryEditorModeSwitcher.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./helper.ts","webpack://gridprotectionalliance-osisoftpi-datasource/./query/QueryEditor.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./query/AnnotationsQueryEditor.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./datasource.ts","webpack://gridprotectionalliance-osisoftpi-datasource/./module.ts"],"sourcesContent":["module.exports = __WEBPACK_EXTERNAL_MODULE__781__;","module.exports = __WEBPACK_EXTERNAL_MODULE__531__;","module.exports = __WEBPACK_EXTERNAL_MODULE__7__;","module.exports = __WEBPACK_EXTERNAL_MODULE__241__;","module.exports = __WEBPACK_EXTERNAL_MODULE__959__;","module.exports = __WEBPACK_EXTERNAL_MODULE__269__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import React, { ChangeEvent, PureComponent } from 'react';\nimport { LegacyForms, DataSourceHttpSettings, InlineField, InlineSwitch } from '@grafana/ui';\nimport { DataSourcePluginOptionsEditorProps, DataSourceJsonData, DataSourceSettings } from '@grafana/data';\nimport { PIWebAPIDataSourceJsonData } from '../types';\n\nconst { FormField } = LegacyForms;\n\ninterface Props extends DataSourcePluginOptionsEditorProps {}\n\nconst coerceOptions = (\n options: DataSourceSettings\n): DataSourceSettings => {\n return {\n ...options,\n jsonData: {\n ...options.jsonData,\n url: options.url,\n },\n };\n};\n\ninterface State {}\n\nexport class PIWebAPIConfigEditor extends PureComponent {\n onPIServerChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n piserver: event.target.value,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onAFServerChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n afserver: event.target.value,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onAFDatabaseChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n afdatabase: event.target.value,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onHttpOptionsChange = (options: DataSourceSettings) => {\n const { onOptionsChange } = this.props;\n onOptionsChange(coerceOptions(options));\n };\n\n onPiPointChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n piserver: event.target.checked ? options.jsonData.piserver : '',\n pipoint: event.target.checked,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onNewFormatChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n newFormat: event.target.checked,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onUseUnitChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n useUnit: event.target.checked,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onUseExperimentalChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n useExperimental : event.target.checked,\n useStreaming : event.target.checked ? options.jsonData.useStreaming : false,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onUseStreamingChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n useStreaming: event.target.checked,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n render() {\n const { options: originalOptions } = this.props;\n const options = coerceOptions(originalOptions);\n\n return (\n
\n \n\n

Custom Configuration

\n\n
\n
\n \n \n \n
\n
\n \n \n \n
\n
\n \n \n \n
\n
\n \n \n \n
\n {options.jsonData.useExperimental && (\n
\n \n \n \n
\n )}\n
\n\n

PI/AF Connection Details

\n\n
\n {options.jsonData.pipoint && (\n
\n \n
\n )}\n
\n \n
\n
\n \n
\n
\n
\n );\n }\n}\n","import React, { InputHTMLAttributes, FunctionComponent } from 'react';\nimport { InlineFormLabel } from '@grafana/ui';\n\nexport interface Props extends InputHTMLAttributes {\n label: string;\n tooltip?: string;\n labelWidth?: number;\n children?: React.ReactNode;\n queryEditor?: JSX.Element;\n}\n\nexport const QueryField: FunctionComponent> = ({ label, labelWidth = 12, tooltip, children }) => (\n <>\n \n {label}\n \n {children}\n \n);\n\nexport const QueryRowTerminator = () => {\n return (\n
\n
\n
\n );\n};\n\nexport const QueryInlineField = ({ ...props }) => {\n return (\n \n \n \n );\n};\n\nexport const QueryEditorRow = (props: Partial) => {\n return (\n
\n {props.children}\n \n
\n );\n};\n\nexport const QueryRawInlineField = ({ ...props }) => {\n return (\n \n \n \n );\n};\n\nexport const QueryRawEditorRow = (props: Partial) => {\n return <>{props.children};\n};\n","import { DataQuery } from '@grafana/schema';\nimport { DataSourceJsonData, SelectableValue } from '@grafana/data';\n\nexport interface PiwebapiElementPath {\n path: string;\n variable: string;\n}\n\nexport interface PiwebapiInternalRsp {\n data: PiwebapiRsp;\n status: number;\n url: string;\n}\n\nexport interface PiwebapiRsp {\n Name?: string;\n InstanceType?: string;\n Items?: PiwebapiRsp[];\n WebId?: string;\n HasChildren?: boolean;\n Type?: string;\n DefaultUnitsName?: string;\n Description?: string;\n Path?: string;\n}\n\nexport interface PiDataServer {\n name: string | undefined;\n webid: string | undefined;\n}\n\nexport interface PIWebAPISelectableValue {\n webId?: string;\n value?: string;\n type?: string;\n expandable?: boolean;\n}\n\nexport interface PIWebAPIAnnotationsQuery extends DataQuery {\n target: string;\n}\n\nexport interface PIWebAPIQuery extends DataQuery {\n target?: string;\n elementPath?: string;\n attributes?: Array>;\n segments?: any[];\n isPiPoint?: boolean;\n isAnnotation?: boolean;\n webid?: string;\n display?: any;\n interpolate?: any;\n recordedValues?: any;\n digitalStates?: any;\n enableStreaming: any;\n useLastValue?: any;\n useUnit?: any;\n regex?: any;\n summary?: {nodata?: string, types?: any[], basis?: string, interval?: string};\n expression?: string;\n rawQuery?: boolean;\n query?: string;\n // annotations items\n database?: PiwebapiRsp;\n template?: PiwebapiRsp;\n showEndTime?: boolean;\n attribute?: any;\n nameFilter?: string;\n categoryName?: string;\n}\n\nexport const defaultQuery: Partial = {\n target: ';',\n attributes: [],\n segments: [],\n regex: { enable: false },\n summary: { types: [], basis: 'EventWeighted', interval: '', nodata: 'Null' },\n expression: '',\n interpolate: { enable: false },\n useLastValue: { enable: false },\n recordedValues: { enable: false },\n digitalStates: { enable: false },\n enableStreaming: { enable: false },\n useUnit: { enable: false },\n isPiPoint: false,\n};\n\n/**\n * These are options configured for each DataSource instance\n */\nexport interface PIWebAPIDataSourceJsonData extends DataSourceJsonData {\n url?: string;\n access?: string;\n piserver?: string;\n afserver?: string;\n afdatabase?: string;\n pipoint?: boolean;\n newFormat?: boolean;\n useUnit?: boolean;\n useExperimental?: boolean;\n useStreaming?: boolean;\n}\n\n/**\n * Value that is used in the backend, but never sent over HTTP to the frontend\n */\nexport interface PIWebAPISecureJsonData {\n apiKey?: string;\n}\n","import React, { useEffect, useState } from 'react';\nimport { Button, ConfirmModal } from '@grafana/ui';\n\ntype Props = {\n isRaw: boolean;\n onChange: (newIsRaw: boolean) => void;\n};\n\nexport const QueryEditorModeSwitcher = ({ isRaw, onChange }: Props): JSX.Element => {\n const [isModalOpen, setModalOpen] = useState(false);\n\n useEffect(() => {\n // if the isRaw changes, we hide the modal\n setModalOpen(false);\n }, [isRaw]);\n\n if (isRaw) {\n return (\n <>\n {\n // we show the are-you-sure modal\n setModalOpen(true);\n }}\n >\n {\n onChange(false);\n }}\n onDismiss={() => {\n setModalOpen(false);\n }}\n />\n \n );\n } else {\n return (\n {\n onChange(true);\n }}\n >\n );\n }\n};\n","import { each, map } from 'lodash';\r\n\r\nimport {\r\n AnnotationQuery,\r\n DataFrame,\r\n TableData,\r\n MetricFindValue,\r\n Field,\r\n toDataFrame,\r\n} from '@grafana/data';\r\n\r\nimport { PiwebapiElementPath, PiwebapiRsp, PIWebAPIQuery } from 'types';\r\n\r\nexport function parseRawQuery(tr: string): any {\r\n const splitAttributes = tr.split(';');\r\n const splitElements = splitAttributes[0].split('\\\\');\r\n\r\n // remove element hierarchy from attribute collection\r\n splitAttributes.splice(0, 1);\r\n\r\n let attributes: any[] = [];\r\n if (splitElements.length > 1 || (splitElements.length === 1 && splitElements[0] !== '')) {\r\n const elementPath: string = splitElements.join('\\\\');\r\n each(splitAttributes, function (item, index) {\r\n if (item !== '') {\r\n attributes.push({\r\n label: item,\r\n value: {\r\n value: item,\r\n expandable: false,\r\n },\r\n });\r\n }\r\n });\r\n\r\n return { attributes, elementPath };\r\n }\r\n\r\n return { attributes, elementPath: null };\r\n}\r\n\r\nexport function lowerCaseFirstLetter(string: string): string {\r\n return string.charAt(0).toLocaleLowerCase() + string.slice(1);\r\n}\r\n\r\n/**\r\n * Builds the Grafana metric segment for use on the query user interface.\r\n *\r\n * @param {any} response - response from PI Web API.\r\n * @returns - Grafana metric segment.\r\n *\r\n * @memberOf PiWebApiDatasource\r\n */\r\nexport function metricQueryTransform(response: PiwebapiRsp[]): MetricFindValue[] {\r\n return map(response, (item) => {\r\n return {\r\n text: item.Name,\r\n expandable:\r\n item.HasChildren === undefined || item.HasChildren === true || (item.Path ?? '').split('\\\\').length <= 3,\r\n HasChildren: item.HasChildren,\r\n Items: item.Items ?? [],\r\n Path: item.Path,\r\n WebId: item.WebId,\r\n } as MetricFindValue;\r\n });\r\n}\r\n\r\n/**\r\n * Check if all items are selected.\r\n *\r\n * @param {any} current the current variable selection\r\n * @return {boolean} true if all value is selected, false otherwise\r\n */\r\nexport function isAllSelected(current: any): boolean {\r\n if (!current) {\r\n return false;\r\n }\r\n if (Array.isArray(current.text)) {\r\n return current.text.indexOf('All') >= 0;\r\n }\r\n return current.text === 'All';\r\n}\r\n\r\nexport function processAnnotationQuery(annon: AnnotationQuery,data: DataFrame[]): DataFrame[] {\r\n let processedFrames: DataFrame[] = [];\r\n \r\n data.forEach((d: DataFrame) => {\r\n d.fields.forEach((f: Field) => {\r\n\r\n // check if the label has been set, if it hasn't been set then the eventframe annotation is not valid. \r\n if (!f.labels) { \r\n return \r\n }\r\n\r\n if (!('eventframe' in f.labels)) {\r\n return;\r\n }\r\n\r\n let attribute = 'attribute' in f.labels\r\n\r\n // Check whether f.values is an array or not to allow for each.\r\n // Check whether f.values is an array or not to allow for each.\r\n if (Array.isArray(f.values)) {\r\n f.values.forEach((value: any) => {\r\n\r\n if (attribute) {\r\n let annotation = value['1'].Content\r\n let valueData: any[] = []\r\n for (let i = 2; i in value; i++) {\r\n valueData.push(value[i].Content.Items)\r\n }\r\n\r\n const processedFrame = convertToTableData(annotation.Items!, valueData).map((r) => {\r\n return toDataFrame(r)});\r\n processedFrames = processedFrames.concat(processedFrame);\r\n } else {\r\n let annotation = value['1'].Content\r\n const processedFrame = convertToTableData(annotation.Items!).map((r) => {\r\n return toDataFrame(r)});\r\n processedFrames = processedFrames.concat(processedFrame);\r\n }\r\n });\r\n } \r\n });\r\n });\r\n return processedFrames;\r\n}\r\n\r\nexport function convertToTableData(items: any[], valueData?: any[]): TableData[] {\r\n const response: TableData[] = items.map((item: any, index: number) => {\r\n const columns = [{ text: 'StartTime' }, { text: 'EndTime' }];\r\n const rows = [item.StartTime, item.EndTime];\r\n if (valueData) {\r\n for (let attributeIndex = 0; attributeIndex < valueData.length; attributeIndex++) {\r\n let attributeData = valueData[attributeIndex]\r\n let eventframeAributeData = attributeData[index].Content.Items\r\n eventframeAributeData.forEach((attribute: any) => {\r\n columns.push({ text: attribute.Name });\r\n rows.push(String(attribute.Value.Value ? attribute.Value.Value.Name || attribute.Value.Value.Value || attribute.Value.Value : ''));\r\n });\r\n }\r\n }\r\n\r\n return {\r\n name: item.Name,\r\n columns,\r\n rows: [rows],\r\n };\r\n });\r\n return response;\r\n}\r\n\r\n/**\r\n * Resolve PIWebAPI response 'value' data to value - timestamp pairs.\r\n *\r\n * @param {any} item - 'Item' object from PIWebAPI\r\n * @param {any} noDataReplacementMode - String state of how to replace 'No Data'\r\n * @param {any} grafanaDataPoint - Single Grafana value pair (value, timestamp).\r\n * @returns grafanaDataPoint - Single Grafana value pair (value, timestamp).\r\n * @returns perviousValue - {any} Grafana value (value only).\r\n *\r\n */\r\nexport function noDataReplace(\r\n item: any,\r\n noDataReplacementMode: any,\r\n grafanaDataPoint: any[]\r\n): {\r\n grafanaDataPoint: any[];\r\n previousValue: any;\r\n drop: boolean;\r\n} {\r\n let previousValue = null;\r\n let drop = false;\r\n if (!item.Good || item.Value === 'No Data' || (item.Value?.Name && item.Value?.Name === 'No Data')) {\r\n if (noDataReplacementMode === 'Drop') {\r\n drop = true;\r\n } else if (noDataReplacementMode === '0') {\r\n grafanaDataPoint[0] = 0;\r\n } else if (noDataReplacementMode === 'Keep') {\r\n // Do nothing keep\r\n } else if (noDataReplacementMode === 'Null') {\r\n grafanaDataPoint[0] = null;\r\n } else if (noDataReplacementMode === 'Previous' && previousValue !== null) {\r\n grafanaDataPoint[0] = previousValue;\r\n }\r\n } else {\r\n previousValue = item.Value;\r\n }\r\n return { grafanaDataPoint, previousValue, drop };\r\n}\r\n\r\n/**\r\n * Check if the value is a number.\r\n *\r\n * @param {any} number the value to check\r\n * @returns {boolean} true if the value is a number, false otherwise\r\n */\r\nexport function checkNumber(number: any): boolean {\r\n return typeof number === 'number' && !Number.isNaN(number) && Number.isFinite(number);\r\n}\r\n\r\n/**\r\n * Returns the last item of the element path.\r\n *\r\n * @param {string} path element path\r\n * @returns {string} last item of the element path\r\n */\r\nexport function getLastPath(path: string): string {\r\n let splitPath = path.split('|');\r\n if (splitPath.length === 0) {\r\n return '';\r\n }\r\n splitPath = splitPath[0].split('\\\\');\r\n return splitPath.length === 0 ? '' : splitPath.pop() ?? '';\r\n}\r\n\r\n/**\r\n * Returns the last item of the element path plus variable.\r\n *\r\n * @param {PiwebapiElementPath[]} elementPathArray array of element paths\r\n * @param {string} path element path\r\n * @returns {string} last item of the element path\r\n */\r\nexport function getPath(elementPathArray: PiwebapiElementPath[], path: string): string {\r\n if (!path || elementPathArray.length === 0) {\r\n return '';\r\n }\r\n const splitStr = getLastPath(path);\r\n const foundElement = elementPathArray.find((e) => path.indexOf(e.path) >= 0)?.variable;\r\n return foundElement ? foundElement + '|' + splitStr : splitStr;\r\n}\r\n\r\n/**\r\n * Replace calculation dot in expression with PI point name.\r\n *\r\n * @param {boolean} replace - is pi point and calculation.\r\n * @param {PiwebapiRsp} webid - Pi web api response object.\r\n * @param {string} url - original url.\r\n * @returns Modified url\r\n */\r\nexport function getFinalUrl(replace: boolean, webid: PiwebapiRsp, url: string) {\r\n const newUrl = replace ? url.replace(/'\\.'/g, `'${webid.Name}'`) : url;\r\n return newUrl;\r\n}\r\n","import { each, filter, forOwn, join, reduce, map, slice, remove, defaults } from 'lodash';\n\nimport React, { PureComponent, ChangeEvent } from 'react';\nimport { Icon, InlineField, InlineFieldRow, InlineSwitch, Input, SegmentAsync, Segment } from '@grafana/ui';\nimport { QueryEditorProps, SelectableValue, TypedVariableModel } from '@grafana/data';\n\nimport { PiWebAPIDatasource } from '../datasource';\nimport { QueryInlineField, QueryRawInlineField, QueryRowTerminator } from '../components/Forms';\nimport { PIWebAPISelectableValue, PIWebAPIDataSourceJsonData, PIWebAPIQuery, defaultQuery } from '../types';\nimport { QueryEditorModeSwitcher } from 'components/QueryEditorModeSwitcher';\nimport { parseRawQuery } from 'helper';\n\nconst LABEL_WIDTH = 24;\nconst MIN_ELEM_INPUT_WIDTH = 200;\nconst MIN_ATTR_INPUT_WIDTH = 250;\n\ninterface State {\n isPiPoint: boolean;\n segments: Array>;\n attributes: Array>;\n summaries: Array>;\n attributeSegment: SelectableValue;\n summarySegment: SelectableValue;\n calculationBasisSegment: SelectableValue;\n noDataReplacementSegment: SelectableValue;\n}\n\ntype Props = QueryEditorProps;\n\nconst REMOVE_LABEL = '-REMOVE-';\n\nconst CustomLabelComponent = (props: any) => {\n if (props.value) {\n return (\n
\n {props.label ?? '--no label--'}\n
\n );\n }\n return (\n \n \n \n );\n};\n\nexport class PIWebAPIQueryEditor extends PureComponent {\n error: any;\n piServer: any[] = [];\n availableAttributes: any = {};\n summaryTypes: string[];\n calculationBasis: string[];\n noDataReplacement: string[];\n state: State = {\n isPiPoint: false,\n segments: [],\n attributes: [],\n summaries: [],\n attributeSegment: {},\n summarySegment: {},\n calculationBasisSegment: {},\n noDataReplacementSegment: {},\n };\n\n constructor(props: any) {\n super(props);\n this.onSegmentChange = this.onSegmentChange.bind(this);\n this.calcBasisValueChanged = this.calcBasisValueChanged.bind(this);\n this.calcNoDataValueChanged = this.calcNoDataValueChanged.bind(this);\n this.onSummaryAction = this.onSummaryAction.bind(this);\n this.onSummaryValueChanged = this.onSummaryValueChanged.bind(this);\n this.onAttributeAction = this.onAttributeAction.bind(this);\n this.onAttributeChange = this.onAttributeChange.bind(this);\n\n this.summaryTypes = [\n // 'None', // A summary type is not specified.\n 'Total', // A totalization over the time range.\n 'Average', // The average value over the time range.\n 'Minimum', // The minimum value over the time range.\n 'Maximum', // The maximum value over the time range.\n 'Range', // The range value over the time range (minimum-maximum).\n 'StdDev', // The standard deviation over the time range.\n 'PopulationStdDev', // The population standard deviation over the time range.\n 'Count', // The sum of event count over the time range when calculation basis is event weighted. The sum of event time duration over the time range when calculation basis is time weighted.\n 'PercentGood', // Percent of data with good value during the calculation period. For time weighted calculations, the percentage is based on time. For event weighted calculations, the percent is based on event count.\n 'All', // A convenience for requesting all available summary calculations.\n 'AllForNonNumeric', // A convenience for requesting all available summary calculations for non-numeric data.\n ];\n\n this.calculationBasis = [\n 'TimeWeighted', // Weight the values in the calculation by the time over which they apply. Interpolation is based on whether the attribute is stepped. Interpolated events are generated at the boundaries if necessary.\n 'EventWeighted', // Evaluate values with equal weighting for each event. No interpolation is done. There must be at least one event within the time range to perform a successful calculation. Two events are required for standard deviation. In handling events at the boundary of the calculation, the AFSDK uses following rules:\n 'TimeWeightedContinuous', // Apply weighting as in TimeWeighted, but do all interpolation between values as if they represent continuous data, (standard interpolation) regardless of whether the attribute is stepped.\n 'TimeWeightedDiscrete', // Apply weighting as in TimeWeighted but interpolation between values is performed as if they represent discrete, unrelated values (stair step plot) regardless of the attribute is stepped.\n 'EventWeightedExcludeMostRecentEvent', // The calculation behaves the same as _EventWeighted_, except in the handling of events at the boundary of summary intervals in a multiple intervals calculation. Use this option to prevent events at the intervals boundary from being double count at both intervals. With this option, events at the end time (most recent time) of an interval is not used in that interval.\n 'EventWeightedExcludeEarliestEvent', // Similar to the option _EventWeightedExcludeMostRecentEvent_. Events at the start time(earliest time) of an interval is not used in that interval.\n 'EventWeightedIncludeBothEnds', // Events at both ends of the interval boundaries are included in the event weighted calculation.\n ];\n\n this.noDataReplacement = [\n 'Null', // replace with nulls\n 'Drop', // drop items\n 'Previous', // use previous value if available\n '0', // replace with 0\n 'Keep', // Keep value\n ];\n }\n\n // is selected segment empty\n isValueEmpty(value: PIWebAPISelectableValue | undefined) {\n return !value || !value.value || !value.value.length || value.value === REMOVE_LABEL;\n }\n\n segmentChangeValue = (segments: Array>) => {\n const query = this.props.query;\n this.setState({ segments }, () => this.onChange({ ...query, segments }));\n };\n\n attributeChangeValue = (attributes: Array>): Promise => {\n const query = this.props.query;\n return new Promise((resolve) => this.setState({ attributes }, () => {\n this.onChange({ ...query, attributes })\n resolve();\n }));\n };\n\n // summary calculation basis change event\n calcBasisValueChanged(segment: SelectableValue) {\n const metricsQuery = this.props.query as PIWebAPIQuery;\n const summary = metricsQuery.summary;\n if (summary) {\n summary.basis = segment.value?.value;\n }\n this.onChange({ ...metricsQuery, summary });\n }\n // get summary calculation basis user interface segments\n getCalcBasisSegments() {\n const segments = map(this.calculationBasis, (item: string) => {\n let selectableValue: SelectableValue = {\n label: item,\n value: {\n value: item,\n expandable: true,\n },\n };\n return selectableValue;\n });\n return segments;\n }\n\n // no data change event\n calcNoDataValueChanged(segment: SelectableValue) {\n const metricsQuery = this.props.query as PIWebAPIQuery;\n const summary = metricsQuery.summary;\n if (summary) {\n summary.nodata = segment.value?.value;\n }\n this.onChange({ ...metricsQuery, summary });\n }\n // get no data user interface segments\n getNoDataSegments() {\n const segments = map(this.noDataReplacement, (item: string) => {\n let selectableValue: SelectableValue = {\n label: item,\n value: {\n value: item,\n expandable: true,\n },\n };\n return selectableValue;\n });\n return segments;\n }\n\n // summary query change event\n onSummaryValueChanged(item: SelectableValue, index: number) {\n const summaries = this.state.summaries.slice(0) as Array>;\n summaries[index] = item;\n if (this.isValueEmpty(item.value)) {\n summaries.splice(index, 1);\n }\n this.setState({ summaries }, this.stateCallback);\n }\n // get the list of summaries available\n getSummarySegments() {\n const summaryTypes = filter(this.summaryTypes, (type) => {\n return this.state.summaries.map((s) => s.value?.value).indexOf(type) === -1;\n });\n\n const segments = map(summaryTypes, (item: string) => {\n let selectableValue: SelectableValue = {\n label: item,\n value: {\n value: item,\n expandable: true,\n },\n };\n return selectableValue;\n });\n\n segments.unshift({\n label: REMOVE_LABEL,\n value: {\n value: REMOVE_LABEL,\n },\n });\n\n return segments;\n }\n\n // remove a summary from the user interface and the query\n removeSummary(part: SelectableValue) {\n const summaries = filter(this.state.summaries, (item: SelectableValue) => {\n return item !== part;\n });\n this.setState({ summaries });\n }\n // add a new summary to the query\n onSummaryAction(item: SelectableValue) {\n const summaries = this.state.summaries.slice(0) as Array>;\n // if value is not empty, add new attribute segment\n if (!this.isValueEmpty(item.value)) {\n let selectableValue: SelectableValue = {\n label: item.label,\n value: {\n value: item.value?.value,\n expandable: true,\n },\n };\n summaries.push(selectableValue);\n }\n this.setState({ summarySegment: {}, summaries }, this.stateCallback);\n }\n\n // remove an attribute from the query\n removeAttribute(part: SelectableValue) {\n const attributes = filter(this.state.attributes, (item: SelectableValue) => {\n return item !== part;\n });\n this.attributeChangeValue(attributes);\n }\n // add an attribute to the query\n onAttributeAction(item: SelectableValue) {\n const { query } = this.props;\n const attributes = this.state.attributes.slice(0);\n // if value is not empty, add new attribute segment\n if (!this.isValueEmpty(item.value)) {\n let selectableValue: SelectableValue = {\n label: item.label,\n value: {\n value: item.value?.value,\n expandable: !query.isPiPoint,\n },\n };\n attributes.push(selectableValue);\n }\n this.attributeChangeValue(attributes);\n }\n\n // pi point change event\n onPiPointChange = (item: SelectableValue, index: number) => {\n let attributes = this.state.attributes.slice(0);\n\n if (item.label === REMOVE_LABEL) {\n remove(attributes, (value, n) => n === index);\n } else {\n // set current value\n attributes[index] = item;\n }\n\n this.checkPiPointSegments(item, attributes);\n };\n // attribute change event\n onAttributeChange = (item: SelectableValue, index: number) => {\n let attributes = this.state.attributes.slice(0);\n\n // ignore if no change\n if (attributes[index].label === item.value?.value) {\n return;\n }\n\n // set current value\n attributes[index] = item;\n\n this.checkAttributeSegments(attributes, this.state.segments);\n };\n // segment change\n onSegmentChange = (item: SelectableValue, index: number) => {\n const { query } = this.props;\n let segments = this.state.segments.slice(0);\n\n // ignore if no change\n if (segments[index].label === item.value?.value) {\n return;\n }\n\n // reset attributes list\n this.setState({ attributes: [] }, () => {\n if (item.label === REMOVE_LABEL) {\n segments = slice(segments, 0, index);\n this.checkAttributeSegments([], segments).then(() => {\n if (segments.length === 0) {\n segments.push({\n label: '',\n });\n } else if (!!segments[segments.length - 1].value?.expandable) {\n segments.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n if (query.isPiPoint) {\n this.piServer = [];\n }\n this.segmentChangeValue(segments);\n });\n return;\n }\n\n // set current value\n segments[index] = item;\n\n // Accept only one PI server\n if (query.isPiPoint) {\n this.piServer.push(item);\n this.segmentChangeValue(segments);\n return;\n }\n\n // changed internal selection\n if (index < segments.length - 1) {\n segments = slice(segments, 0, index + 1);\n }\n this.checkAttributeSegments([], segments).then((): Promise>> => {\n // add new options\n if (item.value?.type === 'template') { // if it's a variable we need to check for new elements\\\n return this.getElementSegments(segments.length + 1, segments).then((elements) => {\n if (elements.length > 0) {\n segments.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n this.segmentChangeValue(segments);\n return segments;\n });\n } else if (!!item.value?.expandable) {\n segments.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n return new Promise((resolve) => {\n this.segmentChangeValue(segments);\n resolve(segments);\n });\n });\n });\n };\n\n // get a ui segment for the attributes\n getElementSegments = (\n index: number,\n currentSegment?: Array>\n ): Promise>> => {\n const { datasource, query, data } = this.props;\n const ctrl = this;\n const findQuery = query.isPiPoint\n ? { type: 'dataserver' }\n : {\n path: this.getSegmentPathUpTo(currentSegment ?? this.state.segments.slice(0), index),\n afServerWebId: this.state.segments.length > 0 && this.state.segments[0].value ? this.state.segments[0].value.webId : undefined,\n };\n\n if (!query.isPiPoint) {\n if (datasource.afserver?.name && index === 0) {\n return Promise.resolve([\n {\n label: datasource.afserver.name,\n value: {\n value: datasource.afserver.name,\n expandable: true,\n },\n },\n ]);\n }\n if (datasource.afserver?.name && datasource.afdatabase?.name && index === 1) {\n return Promise.resolve([\n {\n label: datasource.afdatabase.name,\n value: {\n value: datasource.afdatabase.name,\n expandable: true,\n },\n },\n ]);\n }\n }\n return datasource\n .metricFindQuery(findQuery, Object.assign(data?.request?.scopedVars ?? {}, { isPiPoint: query.isPiPoint }))\n .then((items: any[]) => {\n const altSegments = map(items, (item: any) => {\n let selectableValue: SelectableValue = {\n label: item.text,\n value: {\n webId: item.WebId,\n value: item.text,\n expandable: !query.isPiPoint && item.expandable,\n },\n };\n return selectableValue;\n });\n\n if (altSegments.length === 0) {\n return altSegments;\n }\n\n // add template variables\n const variables = datasource.templateSrv.getVariables();\n each(variables, (variable: TypedVariableModel) => {\n let selectableValue: SelectableValue = {\n label: '${' + variable.name + '}',\n value: {\n type: 'template',\n value: '${' + variable.name + '}',\n expandable: !query.isPiPoint,\n },\n };\n altSegments.unshift(selectableValue);\n });\n\n // add remove label\n altSegments.unshift({\n label: REMOVE_LABEL,\n value: {\n value: REMOVE_LABEL,\n },\n });\n\n return altSegments;\n })\n .catch((err: any) => {\n ctrl.error = err.message || 'Failed to issue metric query';\n return [];\n });\n };\n\n // get the list of attributes for the user interface - PI\n getAttributeSegmentsPI = (attributeText?: string): Promise>> => {\n const { datasource, query, data } = this.props;\n const ctrl = this;\n const findQuery = {\n path: '',\n webId: this.getSelectedPIServer(),\n pointName: (attributeText ?? '') + '*',\n type: 'pipoint',\n };\n let segments: Array> = [];\n return datasource\n .metricFindQuery(findQuery, Object.assign(data?.request?.scopedVars ?? {}, { isPiPoint: query.isPiPoint }))\n .then((items: any[]) => {\n segments = map(items, (item: any) => {\n let selectableValue: SelectableValue = {\n path: item.Path,\n label: item.text,\n value: {\n value: item.text,\n expandable: false,\n },\n };\n return selectableValue;\n });\n if (!!attributeText && attributeText.length > 0) {\n segments.unshift({\n label: attributeText,\n value: {\n value: attributeText,\n expandable: false,\n },\n });\n }\n // add template variables\n const variables = datasource.templateSrv.getVariables();\n each(variables, (variable: TypedVariableModel) => {\n let selectableValue: SelectableValue = {\n label: '${' + variable.name + '}',\n value: {\n type: 'template',\n value: '${' + variable.name + '}',\n expandable: !query.isPiPoint,\n },\n };\n segments.unshift(selectableValue);\n });\n\n // add remove label\n segments.unshift({\n label: REMOVE_LABEL,\n value: {\n value: REMOVE_LABEL,\n },\n });\n\n return segments;\n })\n .catch((err: any) => {\n ctrl.error = err.message || 'Failed to issue metric query';\n return segments;\n });\n };\n\n // get the list of attributes for the user interface - AF\n getAttributeSegmentsAF = (attributeText?: string): Array> => {\n const ctrl = this;\n let segments: Array> = [];\n\n segments.push({\n label: REMOVE_LABEL,\n value: {\n value: REMOVE_LABEL,\n },\n });\n\n forOwn(ctrl.availableAttributes, (val: any, key: string) => {\n let selectableValue: SelectableValue = {\n label: key,\n value: {\n value: key,\n expandable: true,\n },\n };\n segments.push(selectableValue);\n });\n\n return segments;\n };\n\n // build data from target string\n buildFromTarget = (\n query: PIWebAPIQuery,\n segmentsArray: Array>,\n attributesArray: Array>\n ) => {\n const splitAttributes = query.target!.split(';');\n const splitElements = splitAttributes.length > 0 ? splitAttributes[0].split('\\\\') : [];\n\n if (splitElements.length > 1 || (splitElements.length === 1 && splitElements[0] !== '')) {\n // remove element hierarchy from attribute collection\n splitAttributes.splice(0, 1);\n\n each(splitElements, (item, _) => {\n segmentsArray.push({\n label: item,\n value: {\n type: item.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: item,\n expandable: true,\n },\n });\n });\n each(splitAttributes, (item, _) => {\n if (item !== '') {\n // set current value\n attributesArray.push({\n label: item,\n value: {\n value: item,\n expandable: false,\n },\n });\n }\n });\n return this.getElementSegments(splitElements.length + 1, segmentsArray).then((elements) => {\n if (elements.length > 0) {\n segmentsArray.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n return segmentsArray;\n });\n }\n return Promise.resolve(segmentsArray);\n };\n\n /**\n * Gets the segment information and parses it to a string.\n *\n * @param {any} index - Last index of segment to use.\n * @returns - AF Path or PI Point name.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n getSegmentPathUpTo(segments: Array>, index: number): string {\n const arr = segments.slice(0, index);\n\n return reduce(\n arr,\n (result: any, segment: SelectableValue) => {\n if (!segment.value) {\n return '';\n }\n if (!segment.value.value?.startsWith('-Select')) {\n return result ? result + '\\\\' + segment.value.value : segment.value.value;\n }\n return result;\n },\n ''\n );\n }\n\n /**\n * Get the current AF Element's child attributes. Validates when the element selection changes.\n *\n * @returns - Collection of attributes.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n checkAttributeSegments(\n attributes: Array>,\n segments: Array>\n ): Promise {\n const { datasource, data } = this.props;\n const ctrl = this;\n const findQuery = {\n path: this.getSegmentPathUpTo(segments.slice(0), segments.length),\n type: 'attributes',\n };\n return datasource\n .metricFindQuery(findQuery, Object.assign(data?.request?.scopedVars ?? {}, { isPiPoint: false }))\n .then((attributesResponse: any) => {\n const validAttributes: any = {};\n\n each(attributesResponse, (attribute: any) => {\n validAttributes[attribute.Path.substring(attribute.Path.indexOf('|') + 1)] = attribute.WebId;\n });\n\n const filteredAttributes = filter(attributes, (attrib: SelectableValue) => {\n const changedValue = datasource.templateSrv.replace(attrib.value?.value);\n return validAttributes[changedValue] !== undefined;\n });\n\n ctrl.availableAttributes = validAttributes;\n return this.attributeChangeValue(filteredAttributes);\n })\n .catch((err: any) => {\n ctrl.error = err.message || 'Failed to issue metric query';\n return this.attributeChangeValue(attributes);\n });\n }\n\n /**\n * Get PI points from server.\n *\n * @returns - Collection of attributes.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n checkPiPointSegments(\n attribute: SelectableValue,\n attributes: Array>\n ) {\n const { datasource, data } = this.props;\n const ctrl = this;\n const findQuery = {\n path: attribute.path,\n webId: ctrl.getSelectedPIServer(),\n pointName: attribute.label,\n type: 'pipoint',\n };\n return datasource\n .metricFindQuery(findQuery, Object.assign(data?.request?.scopedVars ?? {}, { isPiPoint: true }))\n .then(() => {\n return ctrl.attributeChangeValue(attributes);\n })\n .catch((err: any) => {\n ctrl.error = err.message || 'Failed to issue metric query';\n return ctrl.attributeChangeValue([]);\n });\n }\n\n /**\n * Gets the webid of the current selected pi data server.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n getSelectedPIServer() {\n let webID = '';\n\n this.piServer.forEach((s) => {\n const parts = this.props.query.target!.split(';');\n if (parts.length >= 2) {\n if (parts[0] === s.text) {\n webID = s.WebId;\n return;\n }\n }\n });\n return this.piServer.length > 0 ? this.piServer[0].value?.webId : webID;\n }\n\n /**\n * Queries PI Web API for child elements and attributes when the raw query text editor is changed.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n textEditorChanged() {\n const { query } = this.props;\n const splitAttributes = query.target!.split(';');\n const splitElements = splitAttributes.length > 0 ? splitAttributes[0].split('\\\\') : [];\n\n let segments: Array> = [];\n let attributes: Array> = [];\n\n if (splitElements.length > 1 || (splitElements.length === 1 && splitElements[0] !== '')) {\n // remove element hierarchy from attribute collection\n splitAttributes.splice(0, 1);\n\n each(splitElements, (item, _) => {\n segments.push({\n label: item,\n value: {\n type: item.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: item,\n expandable: true,\n },\n });\n });\n each(splitAttributes, function (item, index) {\n if (item !== '') {\n attributes.push({\n label: item,\n value: {\n value: item,\n expandable: false,\n },\n });\n }\n });\n this.getElementSegments(splitElements.length + 1, segments)\n .then((elements) => {\n if (elements.length > 0) {\n segments.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n })\n .then(() => {\n this.updateArray(segments, attributes, this.state.summaries, query.isPiPoint!, () => {\n this.onChange({\n ...query,\n query: undefined,\n rawQuery: false,\n attributes: this.state.attributes,\n segments: this.state.segments,\n });\n });\n });\n } else {\n segments = this.checkAfServer();\n this.updateArray(segments, this.state.attributes, this.state.summaries, query.isPiPoint!, () => {\n this.onChange({\n ...query,\n query: undefined,\n rawQuery: false,\n attributes: this.state.attributes,\n segments: this.state.segments,\n });\n });\n }\n }\n\n /**\n * Check if the AF server and database are configured in the datasoure config.\n *\n * @returns the segments array\n *\n * @memberOf PIWebAPIQueryEditor\n */\n checkAfServer = () => {\n const { datasource } = this.props;\n const segmentsArray = [];\n if (datasource.afserver?.name) {\n segmentsArray.push({\n label: datasource.afserver.name,\n value: {\n value: datasource.afserver.name,\n expandable: true,\n },\n });\n if (datasource.afdatabase?.name) {\n segmentsArray.push({\n label: datasource.afdatabase.name,\n value: {\n value: datasource.afdatabase.name,\n expandable: true,\n },\n });\n }\n segmentsArray.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n } else {\n segmentsArray.push({\n label: '',\n });\n }\n return segmentsArray;\n };\n\n /**\n * Update the internal state of the datasource.\n *\n * @param segmentsArray the segments array to update\n * @param attributesArray the AF attributes array to update\n * @param summariesArray the summaries array to update\n * @param isPiPoint the is PI point flag\n * @param cb optional callback function\n *\n * @memberOf PIWebAPIQueryEditor\n */\n updateArray = (\n segmentsArray: Array>,\n attributesArray: Array>,\n summariesArray: Array>,\n isPiPoint: boolean,\n cb?: (() => void) | undefined\n ) => {\n this.setState(\n {\n segments: segmentsArray,\n attributes: attributesArray,\n summaries: summariesArray,\n isPiPoint,\n },\n () => {\n if (!isPiPoint) {\n this.checkAttributeSegments(attributesArray, this.state.segments).then(() => {\n if (cb) {\n cb();\n }\n });\n }\n }\n );\n };\n\n // React action when component is initialized/updated\n scopedVarsDone = false;\n componentDidMount = () => {\n this.initialLoad(false);\n };\n\n componentDidUpdate = () => {\n const { query } = this.props;\n if (this.props.data?.state === 'Done' && !!this.props.data?.request?.scopedVars && !this.scopedVarsDone) {\n this.scopedVarsDone = true;\n this.initialLoad(!query.isPiPoint);\n }\n };\n\n initialLoad = (force: boolean) => {\n const { query } = this.props;\n const metricsQuery = defaults(query, defaultQuery) as PIWebAPIQuery;\n const { segments, attributes, summary, isPiPoint } = metricsQuery;\n\n let segmentsArray: Array> = force ? [] : segments?.slice(0) ?? [];\n let attributesArray: Array> = force ? [] : attributes?.slice(0) ?? [];\n let summariesArray = summary?.types ?? [];\n\n if (!isPiPoint && segmentsArray.length === 0) {\n if (query.target && query.target.length > 0 && query.target !== ';') {\n attributesArray = [];\n // Build query from target\n this.buildFromTarget(query, segmentsArray, attributesArray)\n .then((_segmentsArray) => {\n this.updateArray(_segmentsArray, attributesArray, summariesArray, false);\n })\n .catch((e) => console.error(e));\n return;\n } else {\n segmentsArray = this.checkAfServer();\n }\n } else if (isPiPoint && segmentsArray.length > 0) {\n this.piServer = segmentsArray;\n }\n this.updateArray(segmentsArray, attributesArray, summariesArray, !!isPiPoint, () => {\n this.onChange(query);\n });\n };\n\n onChange = (query: PIWebAPIQuery) => {\n const { onChange, onRunQuery } = this.props;\n\n if (query.rawQuery) {\n query.target = query.query ?? '';\n if (!!query.query) {\n const { attributes, elementPath } = parseRawQuery(query.target);\n query.attributes = attributes;\n query.elementPath = elementPath;\n }\n } else {\n query.elementPath = this.getSegmentPathUpTo(this.state.segments, this.state.segments.length);\n query.target =\n query.elementPath +\n ';' +\n join(\n query.attributes?.map((s) => s.value?.value),\n ';'\n );\n }\n const summary = query.summary;\n if (summary) {\n summary.types = this.state.summaries;\n }\n\n onChange({...query, summary});\n\n if (this.isValidQuery(query)) {\n onRunQuery();\n }\n };\n\n isValidQuery = (query: PIWebAPIQuery): boolean => {\n if (query.target && query.target.length > 0 && query.target !== \";\") {\n query.target = query.target.trim();\n const targetSplit = query.target.split(\";\", 2);\n return targetSplit.length === 2 && targetSplit[0].length > 0 && targetSplit[1].length > 0;\n }\n return false;\n }\n\n stateCallback = () => {\n const query = this.props.query as PIWebAPIQuery;\n this.onChange(query);\n };\n\n onIsPiPointChange = (event: React.SyntheticEvent) => {\n const { query: queryChange } = this.props;\n const isPiPoint = !queryChange.isPiPoint;\n this.setState(\n {\n segments: isPiPoint ? [{ label: '' }] : this.checkAfServer(),\n attributes: [],\n isPiPoint,\n },\n () => {\n this.onChange({\n ...queryChange,\n expression: '',\n attributes: this.state.attributes,\n segments: this.state.segments,\n isPiPoint,\n });\n }\n );\n };\n\n render() {\n const { query: queryProps, onChange, onRunQuery } = this.props;\n const metricsQuery = defaults(queryProps, defaultQuery) as PIWebAPIQuery;\n const {\n useLastValue,\n useUnit,\n interpolate,\n query,\n rawQuery,\n digitalStates,\n enableStreaming,\n recordedValues,\n expression,\n isPiPoint,\n summary,\n display,\n regex,\n } = metricsQuery;\n\n return (\n <>\n {this.props.datasource.piPointConfig && (\n \n \n \n )}\n\n {!!rawQuery && (\n \n \n ) =>\n onChange({ ...metricsQuery, query: event.target.value })\n }\n placeholder=\"enter query\"\n />\n \n this.textEditorChanged()} />\n \n )}\n\n {!rawQuery && (\n <>\n
\n \n {this.state.segments.map((segment: SelectableValue, index: number) => {\n return (\n }\n onChange={(item) => this.onSegmentChange(item, index)}\n loadOptions={(query?: string | undefined) => {\n return this.getElementSegments(index);\n }}\n allowCustomValue\n inputMinWidth={MIN_ELEM_INPUT_WIDTH}\n />\n );\n })}\n \n {!isPiPoint && (\n {\n onChange({ ...metricsQuery, query: metricsQuery.target, rawQuery: value });\n }}\n />\n )}\n \n
\n\n \n {this.state.attributes.map((attribute: SelectableValue, index: number) => {\n if (isPiPoint) {\n return (\n }\n disabled={this.piServer.length === 0}\n onChange={(item) => this.onPiPointChange(item, index)}\n loadOptions={this.getAttributeSegmentsPI}\n reloadOptionsOnChange\n allowCustomValue\n inputMinWidth={MIN_ATTR_INPUT_WIDTH}\n />\n );\n }\n return (\n }\n disabled={this.state.segments.length <= 2}\n onChange={(item) => this.onAttributeChange(item, index)}\n options={this.getAttributeSegmentsAF()}\n allowCustomValue\n inputMinWidth={MIN_ATTR_INPUT_WIDTH}\n />\n );\n })}\n\n {isPiPoint && (\n \n }\n disabled={this.piServer.length === 0}\n onChange={this.onAttributeAction}\n loadOptions={this.getAttributeSegmentsPI}\n reloadOptionsOnChange\n allowCustomValue\n inputMinWidth={MIN_ATTR_INPUT_WIDTH}\n />\n )}\n {!isPiPoint && (\n \n }\n disabled={this.state.segments.length <= 2}\n onChange={this.onAttributeAction}\n options={this.getAttributeSegmentsAF()}\n allowCustomValue\n inputMinWidth={MIN_ATTR_INPUT_WIDTH}\n />\n )}\n \n \n )}\n\n \n \n ) =>\n onChange({ ...metricsQuery, expression: event.target.value })\n }\n placeholder=\"'.'*2\"\n />\n \n \n\n \n \n \n this.onChange({\n ...metricsQuery,\n useLastValue: { ...useLastValue, enable: !useLastValue.enable },\n })\n }\n />\n \n \n \n this.onChange({\n ...metricsQuery,\n digitalStates: { ...digitalStates, enable: !digitalStates.enable },\n })\n }\n />\n \n \n }\n onChange={this.calcNoDataValueChanged}\n options={this.getNoDataSegments()}\n allowCustomValue\n />\n \n {this.props.datasource.useUnitConfig && (\n \n \n this.onChange({\n ...metricsQuery,\n useUnit: { ...useUnit, enable: !useUnit.enable },\n })\n }\n />\n \n )}\n {this.props.datasource.useStreaming && (\n \n \n this.onChange({ ...metricsQuery, enableStreaming: { ...enableStreaming, enable: !enableStreaming.enable } })\n }\n />\n \n )}\n \n\n \n {!useLastValue.enable && (\n \n ) =>\n onChange({\n ...metricsQuery,\n recordedValues: { ...recordedValues, maxNumber: parseInt(event.target.value, 10) },\n })\n }\n type=\"number\"\n placeholder=\"1000\"\n />\n \n )}\n \n \n this.onChange({\n ...metricsQuery,\n recordedValues: { ...recordedValues, enable: !recordedValues.enable },\n })\n }\n />\n \n \n\n {!useLastValue.enable && (\n \n \n ) =>\n onChange({ ...metricsQuery, interpolate: { ...interpolate, interval: event.target.value } })\n }\n placeholder=\"30s\"\n />\n \n \n \n this.onChange({ ...metricsQuery, interpolate: { ...interpolate, enable: !interpolate.enable } })\n }\n />\n \n \n )}\n\n {!useLastValue.enable && (\n \n \n ) =>\n onChange({ ...metricsQuery, summary: { ...summary, interval: event.target.value } })\n }\n placeholder=\"30s\"\n />\n \n \n }\n onChange={this.calcBasisValueChanged}\n options={this.getCalcBasisSegments()}\n allowCustomValue\n />\n \n \n \n {this.state.summaries.map((s: SelectableValue, index: number) => {\n return (\n }\n onChange={(item) => this.onSummaryValueChanged(item, index)}\n options={this.getSummarySegments()}\n allowCustomValue\n />\n );\n })}\n \n }\n onChange={this.onSummaryAction}\n options={this.getSummarySegments()}\n allowCustomValue\n />\n \n \n \n )}\n\n \n \n ) =>\n onChange({ ...metricsQuery, display: event.target.value })\n }\n placeholder=\"Display\"\n />\n \n \n {\n this.onChange({ ...metricsQuery, regex: { ...regex, enable: !regex.enable } });\n }}\n />\n \n \n ) =>\n onChange({ ...metricsQuery, regex: { ...regex, search: event.target.value } })\n }\n placeholder=\"(.*)\"\n />\n \n \n ) =>\n onChange({ ...metricsQuery, regex: { ...regex, replace: event.target.value } })\n }\n placeholder=\"$1\"\n />\n \n \n \n );\n }\n}\n","import React, { memo, useState } from 'react';\n\nimport { AnnotationQuery, QueryEditorProps, SelectableValue } from '@grafana/data';\nimport { AsyncSelect, InlineField, InlineFieldRow, InlineSwitch, Input } from '@grafana/ui';\n\nimport { PiWebAPIDatasource } from 'datasource';\nimport { PIWebAPIDataSourceJsonData, PIWebAPIQuery, PiwebapiRsp } from 'types';\n\nconst SMALL_LABEL_WIDTH = 20;\nconst LABEL_WIDTH = 30;\nconst MIN_INPUT_WIDTH = 50;\n\ntype PiWebAPIQueryEditorProps = QueryEditorProps;\n\ntype Props = PiWebAPIQueryEditorProps & {\n annotation?: AnnotationQuery;\n onAnnotationChange?: (annotation: AnnotationQuery) => void;\n};\n\nexport const PiWebAPIAnnotationsQueryEditor = memo(function PiWebAPIAnnotationQueryEditor(props: Props) {\n const { query, datasource, annotation, onChange, onRunQuery } = props;\n\n const [afWebId, setAfWebId] = useState('');\n const [database, setDatabase] = useState(annotation?.target?.database ?? {});\n\n // this should never happen, but we want to keep typescript happy\n if (annotation === undefined) {\n return null;\n }\n\n const getEventFrames = (): Promise>> => {\n return datasource.getEventFrameTemplates(database?.WebId!).then((templ: PiwebapiRsp[]) => {\n return templ.map((d) => ({ label: d.Name, value: d }));\n });\n };\n\n const getDatabases = (): Promise>> => {\n return datasource.getDatabases(afWebId).then((dbs: PiwebapiRsp[]) => {\n return dbs.map((d) => ({ label: d.Name, value: d }));\n });\n };\n\n const getValue = (key: string) => {\n const query: any = annotation.target as any;\n if (!query || !query[key]) {\n return;\n }\n return { label: query[key].Name, value: query[key] };\n };\n\n datasource.getAssetServer(datasource.afserver.name).then((result) => {\n setAfWebId(result.WebId!);\n });\n\n return (\n <>\n
\n \n \n {\n setDatabase(e.value);\n onChange({ ...query, database: e.value, template: undefined });\n }}\n defaultOptions\n />\n \n \n onChange({ ...query, template: e.value })}\n defaultOptions\n />\n \n \n onChange({ ...query, showEndTime: e.currentTarget.checked })}\n />\n \n \n \n \n onRunQuery()}\n onChange={(e) => onChange({ ...query, categoryName: e.currentTarget.value })}\n placeholder=\"Enter category name\"\n />\n \n \n onRunQuery()}\n onChange={(e) => onChange({ ...query, nameFilter: e.currentTarget.value })}\n placeholder=\"Enter name filter\"\n />\n \n \n \n \n \n onChange({\n ...query,\n regex: { ...query.regex, enable: e.currentTarget.checked },\n })\n }\n />\n \n \n onRunQuery()}\n onChange={(e) =>\n onChange({\n ...query,\n regex: { ...query.regex, search: e.currentTarget.value },\n })\n }\n placeholder=\"(.*)\"\n width={MIN_INPUT_WIDTH}\n />\n \n \n onRunQuery()}\n onChange={(e) =>\n onChange({\n ...query,\n regex: { ...query.regex, replace: e.currentTarget.value },\n })\n }\n placeholder=\"$1\"\n />\n \n \n \n \n \n onChange({\n ...query!,\n attribute: { ...query.attribute, enable: e.currentTarget.checked },\n })\n }\n />\n \n \n onRunQuery()}\n onChange={(e) =>\n onChange({\n ...query!,\n attribute: { ...query.attribute, name: e.currentTarget.value },\n })\n }\n placeholder=\"Enter name\"\n />\n \n \n
\n \n );\n});\n","import { filter, map } from 'lodash';\n\nimport { Observable, of, firstValueFrom } from 'rxjs';\n\nimport {\n DataSourceInstanceSettings,\n MetricFindValue,\n AnnotationQuery,\n ScopedVars,\n AnnotationEvent,\n DataFrame,\n DataQueryRequest,\n DataQueryResponse,\n} from '@grafana/data';\nimport { BackendSrv, getBackendSrv, getTemplateSrv, TemplateSrv, DataSourceWithBackend } from '@grafana/runtime';\n\nimport { PIWebAPIQuery, PIWebAPIDataSourceJsonData, PiDataServer, PiwebapiInternalRsp, PiwebapiRsp } from './types';\nimport { metricQueryTransform } from 'helper';\n\nimport { PiWebAPIAnnotationsQueryEditor } from 'query/AnnotationsQueryEditor';\n\nexport class PiWebAPIDatasource extends DataSourceWithBackend {\n piserver: PiDataServer;\n afserver: PiDataServer;\n afdatabase: PiDataServer;\n piPointConfig: boolean;\n newFormatConfig: boolean;\n useUnitConfig: boolean;\n useExperimental: boolean;\n useStreaming: boolean;\n\n constructor(\n instanceSettings: DataSourceInstanceSettings,\n readonly templateSrv: TemplateSrv = getTemplateSrv(),\n private readonly backendSrv: BackendSrv = getBackendSrv()\n ) {\n super(instanceSettings);\n\n this.piserver = { name: (instanceSettings.jsonData || {}).piserver, webid: undefined };\n this.afserver = { name: (instanceSettings.jsonData || {}).afserver, webid: undefined };\n this.afdatabase = { name: (instanceSettings.jsonData || {}).afdatabase, webid: undefined };\n this.piPointConfig = instanceSettings.jsonData.pipoint || false;\n this.newFormatConfig = instanceSettings.jsonData.newFormat || false;\n this.useUnitConfig = instanceSettings.jsonData.useUnit || false;\n this.useExperimental = instanceSettings.jsonData.useExperimental || false;\n this.useStreaming = instanceSettings.jsonData.useStreaming || false;\n\n this.annotations = {\n QueryEditor: PiWebAPIAnnotationsQueryEditor,\n prepareQuery(anno: AnnotationQuery): PIWebAPIQuery | undefined {\n if (anno.target) {\n anno.target.queryType = 'Annotation';\n anno.target.isAnnotation = true;\n }\n return anno.target;\n },\n processEvents: (\n anno: AnnotationQuery,\n data: DataFrame[]\n ): Observable => {\n return of(this.eventFrameToAnnotation(anno, data));\n },\n };\n\n Promise.all([\n this.getDataServer(this.piserver.name).then((result: PiwebapiRsp) => (this.piserver.webid = result.WebId)),\n this.getAssetServer(this.afserver.name).then((result: PiwebapiRsp) => (this.afserver.webid = result.WebId)),\n this.getDatabase(\n this.afserver.name && this.afdatabase.name ? this.afserver.name + '\\\\' + this.afdatabase.name : undefined\n ).then((result: PiwebapiRsp) => (this.afdatabase.webid = result.WebId)),\n ]);\n }\n\n /**\n * This method overrides the applyTemplateVariables() method from the DataSourceWithBackend class.\n * It is responsible for replacing the template variables in the query configuration prior\n * to sending the query to the backend. Templated variables are not able to be used for alerts\n * or public facing dashboards.\n *\n * @param {PIWebAPIQuery} query - The raw query configuration from the frontend as defined in the query editor.\n * @param {ScopedVars} scopedVars - The template variables that are defined in the query editor and dashboard.\n * @returns - PIWebAPIQuery.\n *\n * @memberOf PiWebApiDatasource\n */\n applyTemplateVariables(query: PIWebAPIQuery, scopedVars: ScopedVars) {\n return {\n ...query,\n target: query.target ? this.templateSrv.replace(query.target, scopedVars) : '',\n };\n }\n\n /**\n * This method makes the query to the backend.\n *\n * @param {DataQueryRequest} options\n *\n * @memberOf PiWebApiDatasource\n */\n query(options: DataQueryRequest): Observable {\n if (options.targets.length === 1 && !!options.targets[0].isAnnotation) {\n return super.query(options);\n }\n\n const query = this.buildQueryParameters(options);\n if (query.targets.length <= 0) {\n return of({ data: [] });\n }\n\n return super.query(query);\n }\n\n /**\n * This method does the discovery of the AF Hierarchy and populates the query user interface segments.\n *\n * @param {any} query - Parses the query configuration and builds a PI Web API query.\n * @returns - Segment information.\n *\n * @memberOf PiWebApiDatasource\n */\n metricFindQuery(query: any, queryOptions: any): Promise {\n const ds = this;\n const querydepth = ['servers', 'databases', 'databaseElements', 'elements'];\n if (typeof query === 'string') {\n query = JSON.parse(query as string);\n }\n if (queryOptions.isPiPoint) {\n query.path = this.templateSrv.replace(query.path, queryOptions);\n } else {\n if (query.path === '') {\n query.type = querydepth[0];\n } else {\n query.path = this.templateSrv.replace(query.path, queryOptions); // replace variables in the path\n query.path = query.path.split(';')[0]; // if the attribute is in the path, let's remote it\n if (query.type !== 'attributes') {\n query.type = querydepth[Math.max(0, Math.min(query.path.split('\\\\').length, querydepth.length - 1))];\n }\n }\n query.path = query.path.replace(/\\{([^\\\\])*\\}/gi, (r: string) => r.substring(1, r.length - 2).split(',')[0]);\n }\n\n query.filter = query.filter ?? '*';\n query.max = query.max ?? 10000;\n\n if (query.type === 'servers') {\n return ds.afserver?.name\n ? ds\n .getAssetServer(ds.afserver.name)\n .then((result: PiwebapiRsp) => [result])\n .then(metricQueryTransform)\n : ds.getAssetServers().then(metricQueryTransform);\n } else if (query.type === 'databases' && !!query.afServerWebId) {\n return ds.getDatabases(query.afServerWebId, {}).then(metricQueryTransform);\n } else if (query.type === 'databases') {\n return ds\n .getAssetServer(query.path)\n .then((server) => ds.getDatabases(server.WebId ?? '', {}))\n .then(metricQueryTransform);\n } else if (query.type === 'databaseElements') {\n return ds\n .getDatabase(query.path)\n .then((db) =>\n ds.getDatabaseElements(db.WebId ?? '', {\n selectedFields: 'Items.WebId%3BItems.Name%3BItems.Items%3BItems.Path%3BItems.HasChildren',\n })\n )\n .then(metricQueryTransform);\n } else if (query.type === 'elements') {\n return ds\n .getElement(query.path)\n .then((element) =>\n ds.getElements(element.WebId ?? '', {\n selectedFields:\n 'Items.Description%3BItems.WebId%3BItems.Name%3BItems.Items%3BItems.Path%3BItems.HasChildren',\n nameFilter: query.filter,\n })\n )\n .then(metricQueryTransform);\n } else if (query.type === 'attributes') {\n return ds\n .getElement(query.path)\n .then((element) =>\n ds.getAttributes(element.WebId ?? '', {\n searchFullHierarchy: 'true',\n selectedFields:\n 'Items.Type%3BItems.DefaultUnitsName%3BItems.Description%3BItems.WebId%3BItems.Name%3BItems.Path',\n nameFilter: query.filter,\n maxCount: query.max,\n })\n )\n .then(metricQueryTransform);\n } else if (query.type === 'dataserver') {\n return ds.getDataServers().then(metricQueryTransform);\n } else if (query.type === 'pipoint') {\n return ds.piPointSearch(query.webId, query.pointName).then(metricQueryTransform);\n }\n return Promise.reject('Bad type');\n }\n\n /** PRIVATE SECTION */\n\n /**\n * Builds the PIWebAPI query parameters.\n *\n * @param {any} options - Grafana query and panel options.\n * @returns - PIWebAPI query parameters.\n *\n * @memberOf PiWebApiDatasource\n */\n private buildQueryParameters(options: DataQueryRequest) {\n options.targets = filter(options.targets, (target) => {\n if (!target || !target.target || target.attributes?.length === 0 || target.target === ';' || !!target.hide) {\n return false;\n }\n return !target.target.startsWith('Select AF');\n });\n\n if (options.maxDataPoints) {\n options.maxDataPoints = options.maxDataPoints > 30000 ? 30000 : options.maxDataPoints;\n }\n options.targets = map(options.targets, (target) => {\n const tar = {\n enableStreaming: target.enableStreaming,\n target: this.templateSrv.replace(target.target, options.scopedVars),\n elementPath: this.templateSrv.replace(target.elementPath, options.scopedVars),\n attributes: map(target.attributes, (att) => {\n if (att.value) {\n this.templateSrv.replace(att.value.value, options.scopedVars);\n }\n return att;\n }),\n segments: map(target.segments, (att) => {\n if (att.value) {\n this.templateSrv.replace(att.value.value, options.scopedVars);\n }\n return att;\n }),\n isAnnotation: !!target.isAnnotation,\n display: !!target.display ? this.templateSrv.replace(target.display, options.scopedVars) : undefined,\n refId: target.refId,\n hide: target.hide,\n interpolate: !!target.interpolate\n ? {\n ...target.interpolate,\n interval: this.templateSrv.replace(target.interpolate.interval, options.scopedVars),\n }\n : { enable: false },\n useLastValue: target.useLastValue || { enable: false },\n useUnit: target.useUnit || { enable: false },\n recordedValues: target.recordedValues || { enable: false },\n digitalStates: target.digitalStates || { enable: false },\n webid: target.webid ?? '',\n regex: target.regex || { enable: false },\n expression: target.expression || '',\n summary: target.summary || { types: [] },\n startTime: options.range.from,\n endTime: options.range.to,\n isPiPoint: !!target.isPiPoint,\n scopedVars: options.scopedVars,\n };\n\n if (tar.expression) {\n tar.expression = this.templateSrv.replace(tar.expression, options.scopedVars);\n }\n\n if (tar.summary.types !== undefined) {\n tar.summary.types = filter(tar.summary.types, (item) => {\n return item !== undefined && item !== null && item !== '';\n });\n tar.summary.interval = !!tar.summary.interval\n ? this.templateSrv.replace(tar.summary.interval, options.scopedVars)\n : tar.summary.interval;\n }\n\n return tar;\n });\n\n return options;\n }\n\n /**\n * Localize the eventFrame dataFrame records to Grafana Annotations.\n * @param {any} annon - The annotation object.\n * @param {any} data - The dataframe recrords.\n * @returns - Grafana Annotation\n *\n * @memberOf PiWebApiDatasource\n */\n private eventFrameToAnnotation(annon: AnnotationQuery, data: DataFrame[]): AnnotationEvent[] {\n const annotationOptions = annon.target!;\n const events: AnnotationEvent[] = [];\n const currentLocale = Intl.DateTimeFormat().resolvedOptions().locale;\n\n data.forEach((d: DataFrame) => {\n let values = this.transformDataFrameToMap(d);\n for (let i = 0; i < values['time'].length; i++) {\n // replace Dataframe name using Regex\n let title = values['title'][i];\n if (annotationOptions.regex && annotationOptions.regex.enable) {\n title = title.replace(new RegExp(annotationOptions.regex.search), annotationOptions.regex.replace);\n }\n\n // test if timeEnd is negative and if so, set it to null\n if (values['timeEnd'][i] < 0) {\n values['timeEnd'][i] = null;\n }\n\n // format the text and localize the dates to browser locale\n let text = 'Tag: ' + title;\n if (annotationOptions.attribute && annotationOptions.attribute.enable) {\n text += values['attributeText'][i];\n }\n text += '
Start: ' + new Date(values['time'][i]).toLocaleString(currentLocale) + '
End: ';\n\n if (values['timeEnd'][i]) {\n text += new Date(values['timeEnd'][i]).toLocaleString(currentLocale);\n } else {\n text += 'Eventframe is open';\n }\n\n const event: AnnotationEvent = {\n time: values['time'][i],\n timeEnd: !!annotationOptions.showEndTime ? values['timeEnd'][i] : undefined,\n title: title,\n id: values['id'][i],\n text: text,\n tags: ['OSISoft PI'],\n };\n\n events.push(event);\n }\n });\n return events;\n }\n\n /**\n *\n */\n private transformDataFrameToMap(dataFrame: DataFrame): Record {\n const map: Record = {};\n\n dataFrame.fields.forEach((field) => {\n map[field.name] = field.values.toArray();\n });\n\n return map;\n }\n\n /**\n * Abstraction for calling the PI Web API REST endpoint\n *\n * @param {any} path - the path to append to the base server URL.\n * @returns - The full URL.\n *\n * @memberOf PiWebApiDatasource\n */\n private restGet(path: string): Promise {\n const observable = this.backendSrv.fetch({\n url: `/api/datasources/${this.id}/resources${path}`,\n method: 'GET',\n headers: { 'Content-Type': 'application/json' },\n });\n\n return firstValueFrom(observable).then((response: any) => {\n return response as PiwebapiInternalRsp;\n });\n }\n\n // Get a list of all data (PI) servers\n private getDataServers(): Promise {\n return this.restGet('/dataservers').then((response) => response.data.Items ?? []);\n }\n private getDataServer(name: string | undefined): Promise {\n if (!name) {\n return Promise.resolve({});\n }\n return this.restGet('/dataservers?name=' + name).then((response) => response.data);\n }\n // Get a list of all asset (AF) servers\n private getAssetServers(): Promise {\n return this.restGet('/assetservers').then((response) => response.data.Items ?? []);\n }\n getAssetServer(name: string | undefined): Promise {\n if (!name) {\n return Promise.resolve({});\n }\n return this.restGet('/assetservers?path=\\\\\\\\' + name).then((response) => response.data);\n }\n getDatabase(path: string | undefined): Promise {\n if (!path) {\n return Promise.resolve({});\n }\n return this.restGet('/assetdatabases?path=\\\\\\\\' + path).then((response) => response.data);\n }\n getDatabases(serverId: string, options?: any): Promise {\n if (!serverId) {\n return Promise.resolve([]);\n }\n return this.restGet('/assetservers/' + serverId + '/assetdatabases').then((response) => response.data.Items ?? []);\n }\n getElement(path: string): Promise {\n if (!path) {\n return Promise.resolve({});\n }\n return this.restGet('/elements?path=\\\\\\\\' + path).then((response) => response.data);\n }\n getEventFrameTemplates(databaseId: string): Promise {\n if (!databaseId) {\n return Promise.resolve([]);\n }\n return this.restGet(\n '/assetdatabases/' + databaseId + '/elementtemplates?selectedFields=Items.InstanceType%3BItems.Name%3BItems.WebId'\n ).then((response) => {\n return filter(response.data.Items ?? [], (item) => item.InstanceType === 'EventFrame');\n });\n }\n getElementTemplates(databaseId: string): Promise {\n if (!databaseId) {\n return Promise.resolve([]);\n }\n return this.restGet(\n '/assetdatabases/' + databaseId + '/elementtemplates?selectedFields=Items.InstanceType%3BItems.Name%3BItems.WebId'\n ).then((response) => {\n return filter(response.data.Items ?? [], (item) => item.InstanceType === 'Element');\n });\n }\n\n /**\n * @description\n * Get the child attributes of the current resource.\n * GET attributes/{webId}/attributes\n * @param {string} elementId - The ID of the parent resource. See WebID for more information.\n * @param {Object} options - Query Options\n * @param {string} options.nameFilter - The name query string used for finding attributes. The default is no filter. See Query String for more information.\n * @param {string} options.categoryName - Specify that returned attributes must have this category. The default is no category filter.\n * @param {string} options.templateName - Specify that returned attributes must be members of this template. The default is no template filter.\n * @param {string} options.valueType - Specify that returned attributes' value type must be the given value type. The default is no value type filter.\n * @param {string} options.searchFullHierarchy - Specifies if the search should include attributes nested further than the immediate attributes of the searchRoot. The default is 'false'.\n * @param {string} options.sortField - The field or property of the object used to sort the returned collection. The default is 'Name'.\n * @param {string} options.sortOrder - The order that the returned collection is sorted. The default is 'Ascending'.\n * @param {string} options.startIndex - The starting index (zero based) of the items to be returned. The default is 0.\n * @param {string} options.showExcluded - Specified if the search should include attributes with the Excluded property set. The default is 'false'.\n * @param {string} options.showHidden - Specified if the search should include attributes with the Hidden property set. The default is 'false'.\n * @param {string} options.maxCount - The maximum number of objects to be returned per call (page size). The default is 1000.\n * @param {string} options.selectedFields - List of fields to be returned in the response, separated by semicolons (;). If this parameter is not specified, all available fields will be returned. See Selected Fields for more information.\n */\n private getAttributes(elementId: string, options: any): Promise {\n let querystring =\n '?' +\n map(options, (value, key) => {\n return key + '=' + value;\n }).join('&');\n\n if (querystring === '?') {\n querystring = '';\n }\n\n return this.restGet('/elements/' + elementId + '/attributes' + querystring).then(\n (response) => response.data.Items ?? []\n );\n }\n\n /**\n * @description\n * Retrieve elements based on the specified conditions. By default, this method selects immediate children of the current resource.\n * Users can search for the elements based on specific search parameters. If no parameters are specified in the search, the default values for each parameter will be used and will return the elements that match the default search.\n * GET assetdatabases/{webId}/elements\n * @param {string} databaseId - The ID of the parent resource. See WebID for more information.\n * @param {Object} options - Query Options\n * @param {string} options.webId - The ID of the resource to use as the root of the search. See WebID for more information.\n * @param {string} options.nameFilter - The name query string used for finding objects. The default is no filter. See Query String for more information.\n * @param {string} options.categoryName - Specify that returned elements must have this category. The default is no category filter.\n * @param {string} options.templateName - Specify that returned elements must have this template or a template derived from this template. The default is no template filter.\n * @param {string} options.elementType - Specify that returned elements must have this type. The default type is 'Any'. See Element Type for more information.\n * @param {string} options.searchFullHierarchy - Specifies if the search should include objects nested further than the immediate children of the searchRoot. The default is 'false'.\n * @param {string} options.sortField - The field or property of the object used to sort the returned collection. The default is 'Name'.\n * @param {string} options.sortOrder - The order that the returned collection is sorted. The default is 'Ascending'.\n * @param {number} options.startIndex - The starting index (zero based) of the items to be returned. The default is 0.\n * @param {number} options.maxCount - The maximum number of objects to be returned per call (page size). The default is 1000.\n * @param {string} options.selectedFields - List of fields to be returned in the response, separated by semicolons (;). If this parameter is not specified, all available fields will be returned. See Selected Fields for more information.\n */\n private getDatabaseElements(databaseId: string, options: any): Promise {\n let querystring =\n '?' +\n map(options, (value, key) => {\n return key + '=' + value;\n }).join('&');\n\n if (querystring === '?') {\n querystring = '';\n }\n\n return this.restGet('/assetdatabases/' + databaseId + '/elements' + querystring).then(\n (response) => response.data.Items ?? []\n );\n }\n\n /**\n * @description\n * Retrieve elements based on the specified conditions. By default, this method selects immediate children of the current resource.\n * Users can search for the elements based on specific search parameters. If no parameters are specified in the search, the default values for each parameter will be used and will return the elements that match the default search.\n * GET elements/{webId}/elements\n * @param {string} databaseId - The ID of the resource to use as the root of the search. See WebID for more information.\n * @param {Object} options - Query Options\n * @param {string} options.webId - The ID of the resource to use as the root of the search. See WebID for more information.\n * @param {string} options.nameFilter - The name query string used for finding objects. The default is no filter. See Query String for more information.\n * @param {string} options.categoryName - Specify that returned elements must have this category. The default is no category filter.\n * @param {string} options.templateName - Specify that returned elements must have this template or a template derived from this template. The default is no template filter.\n * @param {string} options.elementType - Specify that returned elements must have this type. The default type is 'Any'. See Element Type for more information.\n * @param {string} options.searchFullHierarchy - Specifies if the search should include objects nested further than the immediate children of the searchRoot. The default is 'false'.\n * @param {string} options.sortField - The field or property of the object used to sort the returned collection. The default is 'Name'.\n * @param {string} options.sortOrder - The order that the returned collection is sorted. The default is 'Ascending'.\n * @param {number} options.startIndex - The starting index (zero based) of the items to be returned. The default is 0.\n * @param {number} options.maxCount - The maximum number of objects to be returned per call (page size). The default is 1000.\n * @param {string} options.selectedFields - List of fields to be returned in the response, separated by semicolons (;). If this parameter is not specified, all available fields will be returned. See Selected Fields for more information.\n */\n private getElements(elementId: string, options: any): Promise {\n let querystring =\n '?' +\n map(options, (value, key) => {\n return key + '=' + value;\n }).join('&');\n\n if (querystring === '?') {\n querystring = '';\n }\n\n return this.restGet('/elements/' + elementId + '/elements' + querystring).then(\n (response) => response.data.Items ?? []\n );\n }\n\n /**\n * Retrieve a list of points on a specified Data Server.\n *\n * @param {string} serverId - The ID of the server. See WebID for more information.\n * @param {string} nameFilter - A query string for filtering by point name. The default is no filter. *, ?, [ab], [!ab]\n */\n private piPointSearch(serverId: string, nameFilter: string): Promise {\n let filter1 = this.templateSrv.replace(nameFilter);\n let filter2 = `${filter1}`;\n let doFilter = false;\n if (filter1 !== nameFilter) {\n const regex = /\\{(\\w|,)+\\}/gs;\n let m;\n while ((m = regex.exec(filter1)) !== null) {\n // This is necessary to avoid infinite loops with zero-width matches\n if (m.index === regex.lastIndex) {\n regex.lastIndex++;\n }\n\n // The result can be accessed through the `m`-variable.\n m.forEach((match, groupIndex) => {\n if (groupIndex === 0) {\n filter1 = filter1.replace(match, match.replace('{', '(').replace('}', ')').replace(',', '|'));\n filter2 = filter2.replace(match, '*');\n doFilter = true;\n }\n });\n }\n }\n return this.restGet('/dataservers/' + serverId + '/points?maxCount=50&nameFilter=' + filter2).then((results) => {\n if (!!results && !!results.data?.Items) {\n return doFilter ? results.data.Items.filter((item) => item.Name?.match(filter1)) : results.data.Items;\n }\n return [];\n });\n }\n}\n","import { DataSourcePlugin } from '@grafana/data';\nimport { PIWebAPIConfigEditor } from './config/ConfigEditor';\nimport { PIWebAPIQueryEditor } from './query/QueryEditor';\nimport { PiWebAPIDatasource } from './datasource';\nimport { PIWebAPIQuery, PIWebAPIDataSourceJsonData } from './types';\n\nexport const plugin = new DataSourcePlugin(\n PiWebAPIDatasource\n)\n .setQueryEditor(PIWebAPIQueryEditor)\n .setConfigEditor(PIWebAPIConfigEditor);\n"],"names":["module","exports","__WEBPACK_EXTERNAL_MODULE__781__","__WEBPACK_EXTERNAL_MODULE__531__","__WEBPACK_EXTERNAL_MODULE__7__","__WEBPACK_EXTERNAL_MODULE__241__","__WEBPACK_EXTERNAL_MODULE__959__","__WEBPACK_EXTERNAL_MODULE__269__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","FormField","LegacyForms","coerceOptions","options","jsonData","url","PIWebAPIConfigEditor","PureComponent","render","originalOptions","this","props","div","DataSourceHttpSettings","defaultUrl","dataSourceConfig","onChange","onHttpOptionsChange","showAccessOptions","h3","className","InlineField","label","labelWidth","InlineSwitch","pipoint","onPiPointChange","newFormat","onNewFormatChange","useUnit","onUseUnitChange","useExperimental","onUseExperimentalChange","useStreaming","onUseStreamingChange","inputWidth","onPIServerChange","piserver","placeholder","onAFServerChange","afserver","onAFDatabaseChange","afdatabase","event","onOptionsChange","target","checked","QueryField","tooltip","children","InlineFormLabel","width","QueryRowTerminator","QueryInlineField","QueryEditorRow","QueryRawInlineField","QueryRawEditorRow","defaultQuery","attributes","segments","regex","enable","summary","types","basis","interval","nodata","expression","interpolate","useLastValue","recordedValues","digitalStates","enableStreaming","isPiPoint","QueryEditorModeSwitcher","isRaw","isModalOpen","setModalOpen","useState","useEffect","Button","aria-label","icon","variant","type","onClick","ConfirmModal","isOpen","title","body","confirmText","dismissText","onConfirm","onDismiss","metricQueryTransform","response","map","item","text","Name","expandable","HasChildren","Path","split","length","Items","WebId","LABEL_WIDTH","MIN_ATTR_INPUT_WIDTH","REMOVE_LABEL","CustomLabelComponent","Icon","name","PIWebAPIQueryEditor","isValueEmpty","calcBasisValueChanged","segment","metricsQuery","query","getCalcBasisSegments","calculationBasis","calcNoDataValueChanged","getNoDataSegments","noDataReplacement","onSummaryValueChanged","index","summaries","state","slice","splice","setState","stateCallback","getSummarySegments","summaryTypes","filter","s","indexOf","unshift","removeSummary","part","onSummaryAction","selectableValue","push","summarySegment","removeAttribute","attributeChangeValue","onAttributeAction","getSegmentPathUpTo","arr","reduce","result","startsWith","checkAttributeSegments","data","datasource","ctrl","findQuery","path","metricFindQuery","assign","request","scopedVars","then","attributesResponse","validAttributes","each","attribute","substring","filteredAttributes","attrib","changedValue","templateSrv","replace","availableAttributes","catch","err","error","message","checkPiPointSegments","webId","getSelectedPIServer","pointName","webID","piServer","forEach","parts","textEditorChanged","splitAttributes","splitElements","_","match","getElementSegments","elements","updateArray","rawQuery","checkAfServer","queryProps","onRunQuery","defaults","display","piPointConfig","onIsPiPointChange","InlineFieldRow","grow","Input","onBlur","SegmentAsync","Component","onSegmentChange","loadOptions","allowCustomValue","inputMinWidth","disabled","getAttributeSegmentsPI","reloadOptionsOnChange","Segment","onAttributeChange","getAttributeSegmentsAF","attributeSegment","useUnitConfig","maxNumber","parseInt","search","constructor","super","calculationBasisSegment","noDataReplacementSegment","segmentChangeValue","Promise","resolve","remove","currentSegment","afServerWebId","items","altSegments","variables","getVariables","variable","attributeText","forOwn","val","buildFromTarget","segmentsArray","attributesArray","summariesArray","cb","scopedVarsDone","componentDidMount","initialLoad","componentDidUpdate","force","_segmentsArray","e","console","elementPath","tr","join","parseRawQuery","isValidQuery","trim","targetSplit","queryChange","bind","PiWebAPIAnnotationsQueryEditor","memo","annotation","afWebId","setAfWebId","database","setDatabase","getValue","getAssetServer","AsyncSelect","getDatabases","dbs","loadingMessage","template","defaultOptions","getEventFrameTemplates","templ","showEndTime","currentTarget","categoryName","nameFilter","PiWebAPIDatasource","DataSourceWithBackend","applyTemplateVariables","targets","isAnnotation","buildQueryParameters","of","queryOptions","ds","querydepth","JSON","parse","Math","max","min","getAssetServers","server","getDatabase","db","getDatabaseElements","selectedFields","getElement","element","getElements","getAttributes","searchFullHierarchy","maxCount","getDataServers","piPointSearch","reject","hide","maxDataPoints","tar","att","refId","webid","startTime","range","from","endTime","to","annon","annotationOptions","events","currentLocale","Intl","DateTimeFormat","resolvedOptions","locale","values","transformDataFrameToMap","i","RegExp","Date","toLocaleString","time","timeEnd","id","tags","dataFrame","fields","field","toArray","observable","backendSrv","fetch","method","headers","firstValueFrom","restGet","getDataServer","serverId","databaseId","InstanceType","getElementTemplates","elementId","querystring","filter1","filter2","doFilter","m","exec","lastIndex","groupIndex","results","instanceSettings","getTemplateSrv","getBackendSrv","newFormatConfig","annotations","QueryEditor","prepareQuery","anno","queryType","processEvents","eventFrameToAnnotation","all","plugin","DataSourcePlugin","setQueryEditor","setConfigEditor"],"sourceRoot":""} \ No newline at end of file From 9cf543f23bf2df398be8ea9b54c11bd0fb385202 Mon Sep 17 00:00:00 2001 From: Paulo Vitor Magacho Date: Tue, 13 Aug 2024 19:14:39 -0300 Subject: [PATCH 3/6] Prepartion for version 5.1.0 --- CHANGELOG.md | 8 + dist/module.js | 2 +- dist/module.js.map | 2 +- dist/plugin.json | 4 +- package.json | 2 +- pkg/plugin/datasource.go | 7 +- pkg/plugin/timeseries_query.go | 16 +- pkg/plugin/timeseries_query_models.go | 7 +- src/datasource.ts | 58 +++---- src/query/QueryEditor.tsx | 228 ++++++++++++++++++++------ src/types.ts | 10 +- 11 files changed, 252 insertions(+), 92 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a8c6e8a..b71654a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,3 +45,11 @@ - Changed the query editor layout - Support Grafana version 11 - Drop support for Grafana 8.x and 9.x + +## 5.1.0 + +- Fixed an error in recorded max number of points +- Updated the query editor layout +- Added boundary type support in recorded values +- Recognize partial usage of variables in elements +- Added configuration to hide API errors in panel diff --git a/dist/module.js b/dist/module.js index 6a365f8..3ed4e9e 100644 --- a/dist/module.js +++ b/dist/module.js @@ -1,2 +1,2 @@ -define(["@grafana/data","react","@grafana/ui","lodash","rxjs","@grafana/runtime"],((e,t,a,n,l,r)=>(()=>{"use strict";var i={781:t=>{t.exports=e},531:e=>{e.exports=r},7:e=>{e.exports=a},241:e=>{e.exports=n},959:e=>{e.exports=t},269:e=>{e.exports=l}},s={};function o(e){var t=s[e];if(void 0!==t)return t.exports;var a=s[e]={exports:{}};return i[e](a,a.exports,o),a.exports}o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var a in t)o.o(t,a)&&!o.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var u={};o.r(u),o.d(u,{plugin:()=>z});var m=o(781),h=o(959),c=o.n(h),d=o(7);function p(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function g(e){for(var t=1;tv(g({},e),{jsonData:v(g({},e.jsonData),{url:e.url})});class f extends h.PureComponent{render(){const{options:e}=this.props,t=y(e);return c().createElement("div",null,c().createElement(d.DataSourceHttpSettings,{defaultUrl:"https://server.name/piwebapi",dataSourceConfig:t,onChange:this.onHttpOptionsChange,showAccessOptions:!0}),c().createElement("h3",{className:"page-heading"},"Custom Configuration"),c().createElement("div",{className:"gf-form-group"},c().createElement("div",{className:"gf-form-inline"},c().createElement(d.InlineField,{label:"Enable PI Points in Query",labelWidth:24},c().createElement(d.InlineSwitch,{value:t.jsonData.pipoint,onChange:this.onPiPointChange}))),c().createElement("div",{className:"gf-form-inline"},c().createElement(d.InlineField,{label:"Enable New Data Format",labelWidth:24},c().createElement(d.InlineSwitch,{value:t.jsonData.newFormat,onChange:this.onNewFormatChange}))),c().createElement("div",{className:"gf-form-inline"},c().createElement(d.InlineField,{label:"Enable Unit in Data",labelWidth:24},c().createElement(d.InlineSwitch,{value:t.jsonData.useUnit,onChange:this.onUseUnitChange}))),c().createElement("div",{className:"gf-form-inline"},c().createElement(d.InlineField,{label:"Enable Experimental Features",labelWidth:24},c().createElement(d.InlineSwitch,{value:t.jsonData.useExperimental,onChange:this.onUseExperimentalChange}))),t.jsonData.useExperimental&&c().createElement("div",{className:"gf-form-inline"},c().createElement(d.InlineField,{label:"Enable Steaming Support",labelWidth:24},c().createElement(d.InlineSwitch,{value:t.jsonData.useStreaming,onChange:this.onUseStreamingChange})))),c().createElement("h3",{className:"page-heading"},"PI/AF Connection Details"),c().createElement("div",{className:"gf-form-group"},t.jsonData.pipoint&&c().createElement("div",{className:"gf-form"},c().createElement(b,{label:"PI Server",labelWidth:10,inputWidth:25,onChange:this.onPIServerChange,value:t.jsonData.piserver||"",placeholder:"Default PI Server to use for data requests"})),c().createElement("div",{className:"gf-form"},c().createElement(b,{label:"AF Server",labelWidth:10,inputWidth:25,onChange:this.onAFServerChange,value:t.jsonData.afserver||"",placeholder:"Default AF Server to use for data requests"})),c().createElement("div",{className:"gf-form"},c().createElement(b,{label:"AF Database",labelWidth:10,inputWidth:25,onChange:this.onAFDatabaseChange,value:t.jsonData.afdatabase||"",placeholder:"Default AF Database server for AF queries"}))))}constructor(...e){super(...e),p(this,"onPIServerChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=v(g({},a.jsonData),{piserver:e.target.value});t(v(g({},a),{jsonData:n}))})),p(this,"onAFServerChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=v(g({},a.jsonData),{afserver:e.target.value});t(v(g({},a),{jsonData:n}))})),p(this,"onAFDatabaseChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=v(g({},a.jsonData),{afdatabase:e.target.value});t(v(g({},a),{jsonData:n}))})),p(this,"onHttpOptionsChange",(e=>{const{onOptionsChange:t}=this.props;t(y(e))})),p(this,"onPiPointChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=v(g({},a.jsonData),{piserver:e.target.checked?a.jsonData.piserver:"",pipoint:e.target.checked});t(v(g({},a),{jsonData:n}))})),p(this,"onNewFormatChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=v(g({},a.jsonData),{newFormat:e.target.checked});t(v(g({},a),{jsonData:n}))})),p(this,"onUseUnitChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=v(g({},a.jsonData),{useUnit:e.target.checked});t(v(g({},a),{jsonData:n}))})),p(this,"onUseExperimentalChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=v(g({},a.jsonData),{useExperimental:e.target.checked,useStreaming:!!e.target.checked&&a.jsonData.useStreaming});t(v(g({},a),{jsonData:n}))})),p(this,"onUseStreamingChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=v(g({},a.jsonData),{useStreaming:e.target.checked});t(v(g({},a),{jsonData:n}))}))}}var E=o(241);function S(){return S=Object.assign||function(e){for(var t=1;tc().createElement(c().Fragment,null,c().createElement(d.InlineFormLabel,{width:t,tooltip:a},e),n),I=()=>c().createElement("div",{className:"gf-form gf-form--grow"},c().createElement("div",{className:"gf-form-label gf-form-label--grow"})),w=e=>{var t=S({},P(e));return c().createElement(O,null,c().createElement(C,t))},O=e=>c().createElement("div",{className:"gf-form-inline"},e.children,c().createElement(I,null)),x=e=>{var t=S({},P(e));return c().createElement(D,null,c().createElement(C,t))},D=e=>c().createElement(c().Fragment,null,e.children),F={target:";",attributes:[],segments:[],regex:{enable:!1},summary:{types:[],basis:"EventWeighted",interval:"",nodata:"Null"},expression:"",interpolate:{enable:!1},useLastValue:{enable:!1},recordedValues:{enable:!1},digitalStates:{enable:!1},enableStreaming:{enable:!1},useUnit:{enable:!1},isPiPoint:!1},j=({isRaw:e,onChange:t})=>{const[a,n]=(0,h.useState)(!1);return(0,h.useEffect)((()=>{n(!1)}),[e]),e?c().createElement(c().Fragment,null,c().createElement(d.Button,{"aria-label":"Switch to visual editor",icon:"pen",variant:"secondary",type:"button",onClick:()=>{n(!0)}}),c().createElement(d.ConfirmModal,{isOpen:a,title:"Switch to visual editor mode",body:"Are you sure to switch to visual editor mode? You will lose the changes done in raw query mode.",confirmText:"Yes, switch to editor mode",dismissText:"No, stay in raw query mode",onConfirm:()=>{t(!1)},onDismiss:()=>{n(!1)}})):c().createElement(d.Button,{"aria-label":"Switch to text editor",icon:"pen",variant:"secondary",type:"button",onClick:()=>{t(!0)}})};function A(e){return(0,E.map)(e,(e=>{var t,a;return{text:e.Name,expandable:void 0===e.HasChildren||!0===e.HasChildren||(null!==(t=e.Path)&&void 0!==t?t:"").split("\\").length<=3,HasChildren:e.HasChildren,Items:null!==(a=e.Items)&&void 0!==a?a:[],Path:e.Path,WebId:e.WebId}}))}function W(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function V(e){for(var t=1;t{var t;return e.value?c().createElement("div",{className:"gf-form-label "+("template"===e.value.type?"query-keyword":"")},null!==(t=e.label)&&void 0!==t?t:"--no label--"):c().createElement("a",{className:"gf-form-label query-part"},c().createElement(d.Icon,{name:"plus"}))};class R extends h.PureComponent{isValueEmpty(e){return!e||!e.value||!e.value.length||e.value===B}calcBasisValueChanged(e){const t=this.props.query,a=t.summary;var n;a&&(a.basis=null===(n=e.value)||void 0===n?void 0:n.value),this.onChange(N(V({},t),{summary:a}))}getCalcBasisSegments(){return(0,E.map)(this.calculationBasis,(e=>({label:e,value:{value:e,expandable:!0}})))}calcNoDataValueChanged(e){const t=this.props.query,a=t.summary;var n;a&&(a.nodata=null===(n=e.value)||void 0===n?void 0:n.value),this.onChange(N(V({},t),{summary:a}))}getNoDataSegments(){return(0,E.map)(this.noDataReplacement,(e=>({label:e,value:{value:e,expandable:!0}})))}onSummaryValueChanged(e,t){const a=this.state.summaries.slice(0);a[t]=e,this.isValueEmpty(e.value)&&a.splice(t,1),this.setState({summaries:a},this.stateCallback)}getSummarySegments(){const e=(0,E.filter)(this.summaryTypes,(e=>-1===this.state.summaries.map((e=>{var t;return null===(t=e.value)||void 0===t?void 0:t.value})).indexOf(e))),t=(0,E.map)(e,(e=>({label:e,value:{value:e,expandable:!0}})));return t.unshift({label:B,value:{value:B}}),t}removeSummary(e){const t=(0,E.filter)(this.state.summaries,(t=>t!==e));this.setState({summaries:t})}onSummaryAction(e){const t=this.state.summaries.slice(0);if(!this.isValueEmpty(e.value)){var a;let n={label:e.label,value:{value:null===(a=e.value)||void 0===a?void 0:a.value,expandable:!0}};t.push(n)}this.setState({summarySegment:{},summaries:t},this.stateCallback)}removeAttribute(e){const t=(0,E.filter)(this.state.attributes,(t=>t!==e));this.attributeChangeValue(t)}onAttributeAction(e){const{query:t}=this.props,a=this.state.attributes.slice(0);if(!this.isValueEmpty(e.value)){var n;let l={label:e.label,value:{value:null===(n=e.value)||void 0===n?void 0:n.value,expandable:!t.isPiPoint}};a.push(l)}this.attributeChangeValue(a)}getSegmentPathUpTo(e,t){const a=e.slice(0,t);return(0,E.reduce)(a,((e,t)=>{var a;return t.value?(null===(a=t.value.value)||void 0===a?void 0:a.startsWith("-Select"))?e:e?e+"\\"+t.value.value:t.value.value:""}),"")}checkAttributeSegments(e,t){var a;const{datasource:n,data:l}=this.props,r=this,i={path:this.getSegmentPathUpTo(t.slice(0),t.length),type:"attributes"};var s;return n.metricFindQuery(i,Object.assign(null!==(s=null==l||null===(a=l.request)||void 0===a?void 0:a.scopedVars)&&void 0!==s?s:{},{isPiPoint:!1})).then((t=>{const a={};(0,E.each)(t,(e=>{a[e.Path.substring(e.Path.indexOf("|")+1)]=e.WebId}));const l=(0,E.filter)(e,(e=>{var t;const l=n.templateSrv.replace(null===(t=e.value)||void 0===t?void 0:t.value);return void 0!==a[l]}));return r.availableAttributes=a,this.attributeChangeValue(l)})).catch((t=>(r.error=t.message||"Failed to issue metric query",this.attributeChangeValue(e))))}checkPiPointSegments(e,t){var a;const{datasource:n,data:l}=this.props,r=this,i={path:e.path,webId:r.getSelectedPIServer(),pointName:e.label,type:"pipoint"};var s;return n.metricFindQuery(i,Object.assign(null!==(s=null==l||null===(a=l.request)||void 0===a?void 0:a.scopedVars)&&void 0!==s?s:{},{isPiPoint:!0})).then((()=>r.attributeChangeValue(t))).catch((e=>(r.error=e.message||"Failed to issue metric query",r.attributeChangeValue([]))))}getSelectedPIServer(){var e;let t="";return this.piServer.forEach((e=>{const a=this.props.query.target.split(";");a.length>=2&&a[0]===e.text&&(t=e.WebId)})),this.piServer.length>0?null===(e=this.piServer[0].value)||void 0===e?void 0:e.webId:t}textEditorChanged(){const{query:e}=this.props,t=e.target.split(";"),a=t.length>0?t[0].split("\\"):[];let n=[],l=[];a.length>1||1===a.length&&""!==a[0]?(t.splice(0,1),(0,E.each)(a,((e,t)=>{n.push({label:e,value:{type:e.match(/\${\w+}/gi)?"template":void 0,value:e,expandable:!0}})})),(0,E.each)(t,(function(e,t){""!==e&&l.push({label:e,value:{value:e,expandable:!1}})})),this.getElementSegments(a.length+1,n).then((e=>{e.length>0&&n.push({label:"Select Element",value:{value:"-Select Element-"}})})).then((()=>{this.updateArray(n,l,this.state.summaries,e.isPiPoint,(()=>{this.onChange(N(V({},e),{query:void 0,rawQuery:!1,attributes:this.state.attributes,segments:this.state.segments}))}))}))):(n=this.checkAfServer(),this.updateArray(n,this.state.attributes,this.state.summaries,e.isPiPoint,(()=>{this.onChange(N(V({},e),{query:void 0,rawQuery:!1,attributes:this.state.attributes,segments:this.state.segments}))})))}render(){const{query:e,onChange:t,onRunQuery:a}=this.props,n=(0,E.defaults)(e,F),{useLastValue:l,useUnit:r,interpolate:i,query:s,rawQuery:o,digitalStates:u,enableStreaming:m,recordedValues:h,expression:p,isPiPoint:g,summary:v,display:b,regex:y}=n;return c().createElement(c().Fragment,null,this.props.datasource.piPointConfig&&c().createElement(d.InlineField,{label:"Is Pi Point?",labelWidth:T},c().createElement(d.InlineSwitch,{value:g,onChange:this.onIsPiPointChange})),!!o&&c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Raw Query",labelWidth:T,grow:!0},c().createElement(d.Input,{onBlur:this.stateCallback,value:s,onChange:e=>t(N(V({},n),{query:e.target.value})),placeholder:"enter query"})),c().createElement(j,{isRaw:!0,onChange:e=>this.textEditorChanged()})),!o&&c().createElement(c().Fragment,null,c().createElement("div",{className:"gf-form-inline"},c().createElement(x,{label:g?"PI Server":"AF Elements",tooltip:g?"Select PI server.":"Select AF Element."},this.state.segments.map(((e,t)=>c().createElement(d.SegmentAsync,{key:"element-"+t,Component:c().createElement(q,{value:e.value,label:e.label}),onChange:e=>this.onSegmentChange(e,t),loadOptions:e=>this.getElementSegments(t),allowCustomValue:!0,inputMinWidth:200}))),c().createElement(I,null),!g&&c().createElement(j,{isRaw:!1,onChange:e=>{t(N(V({},n),{query:n.target,rawQuery:e}))}}))),c().createElement(w,{label:g?"Pi Points":"Attributes"},this.state.attributes.map(((e,t)=>g?c().createElement(d.SegmentAsync,{key:"attributes-"+t,Component:c().createElement(q,{value:e.value,label:e.label}),disabled:0===this.piServer.length,onChange:e=>this.onPiPointChange(e,t),loadOptions:this.getAttributeSegmentsPI,reloadOptionsOnChange:!0,allowCustomValue:!0,inputMinWidth:k}):c().createElement(d.Segment,{key:"attributes-"+t,Component:c().createElement(q,{value:e.value,label:e.label}),disabled:this.state.segments.length<=2,onChange:e=>this.onAttributeChange(e,t),options:this.getAttributeSegmentsAF(),allowCustomValue:!0,inputMinWidth:k}))),g&&c().createElement(d.SegmentAsync,{Component:c().createElement(q,{value:this.state.attributeSegment.value,label:this.state.attributeSegment.label}),disabled:0===this.piServer.length,onChange:this.onAttributeAction,loadOptions:this.getAttributeSegmentsPI,reloadOptionsOnChange:!0,allowCustomValue:!0,inputMinWidth:k}),!g&&c().createElement(d.Segment,{Component:c().createElement(q,{value:this.state.attributeSegment.value,label:this.state.attributeSegment.label}),disabled:this.state.segments.length<=2,onChange:this.onAttributeAction,options:this.getAttributeSegmentsAF(),allowCustomValue:!0,inputMinWidth:k}))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Calculation",grow:!0,labelWidth:T,tooltip:"Modify all attributes by an equation. Use '.' for current item. Leave Attributes empty if you wish to perform element based calculations."},c().createElement(d.Input,{onBlur:a,value:p,onChange:e=>t(N(V({},n),{expression:e.target.value})),placeholder:"'.'*2"}))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Use Last Value",tooltip:"Fetch only last value from time range",labelWidth:T},c().createElement(d.InlineSwitch,{value:l.enable,onChange:()=>this.onChange(N(V({},n),{useLastValue:N(V({},l),{enable:!l.enable})}))})),c().createElement(d.InlineField,{label:"Digital States",labelWidth:T},c().createElement(d.InlineSwitch,{value:u.enable,onChange:()=>this.onChange(N(V({},n),{digitalStates:N(V({},u),{enable:!u.enable})}))})),c().createElement(d.InlineField,{label:"Replace Bad Data",labelWidth:T,tooltip:"Replacement for bad quality values."},c().createElement(d.Segment,{Component:c().createElement(q,{value:{value:null==v?void 0:v.nodata},label:null==v?void 0:v.nodata}),onChange:this.calcNoDataValueChanged,options:this.getNoDataSegments(),allowCustomValue:!0})),this.props.datasource.useUnitConfig&&c().createElement(d.InlineField,{label:"Use unit from datapoints",tooltip:"Use unit in label from PI tag or PI AF attribute",labelWidth:T},c().createElement(d.InlineSwitch,{value:r.enable,onChange:()=>this.onChange(N(V({},n),{useUnit:N(V({},r),{enable:!r.enable})}))})),this.props.datasource.useStreaming&&c().createElement(d.InlineField,{label:"Enable Streaming",labelWidth:T,tooltip:"Enable streaming data if it is supported for the point type."},c().createElement(d.InlineSwitch,{value:m.enable,onChange:()=>this.onChange(N(V({},n),{enableStreaming:N(V({},m),{enable:!m.enable})}))}))),c().createElement(d.InlineFieldRow,null,!l.enable&&c().createElement(d.InlineField,{label:"Max Recorded Values",labelWidth:T,tooltip:"Maximum number of recorded value to retrive from the data archive, without using interpolation."},c().createElement(d.Input,{onBlur:a,value:h.maxNumber,onChange:e=>t(N(V({},n),{recordedValues:N(V({},h),{maxNumber:parseInt(e.target.value,10)})})),type:"number",placeholder:"1000"})),c().createElement(d.InlineField,{label:"Recorded Values",labelWidth:T},c().createElement(d.InlineSwitch,{value:h.enable,onChange:()=>this.onChange(N(V({},n),{recordedValues:N(V({},h),{enable:!h.enable})}))}))),!l.enable&&c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:p?"Interval Period":"Interpolate Period",labelWidth:T,tooltip:"Override time between sampling, e.g. '30s'. Defaults to timespan/chart width."},c().createElement(d.Input,{onBlur:a,value:i.interval,onChange:e=>t(N(V({},n),{interpolate:N(V({},i),{interval:e.target.value})})),placeholder:"30s"})),c().createElement(d.InlineField,{label:p?"Interval Values":"Interpolate",labelWidth:T},c().createElement(d.InlineSwitch,{value:i.enable,onChange:()=>this.onChange(N(V({},n),{interpolate:N(V({},i),{enable:!i.enable})}))}))),!l.enable&&c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Summary Period",labelWidth:T,tooltip:"Define the summary period, e.g. '30s'."},c().createElement(d.Input,{onBlur:a,value:null==v?void 0:v.interval,onChange:e=>t(N(V({},n),{summary:N(V({},v),{interval:e.target.value})})),placeholder:"30s"})),c().createElement(d.InlineField,{label:"Basis",labelWidth:T,tooltip:"Defines the possible calculation options when performing summary calculations over time-series data."},c().createElement(d.Segment,{Component:c().createElement(q,{value:{value:null==v?void 0:v.basis},label:null==v?void 0:v.basis}),onChange:this.calcBasisValueChanged,options:this.getCalcBasisSegments(),allowCustomValue:!0})),c().createElement(d.InlineField,{label:"Summaries",labelWidth:T,tooltip:"PI Web API summary options."},c().createElement(d.InlineFieldRow,null,this.state.summaries.map(((e,t)=>c().createElement(d.Segment,{key:"summaries-"+t,Component:c().createElement(q,{value:e.value,label:e.label}),onChange:e=>this.onSummaryValueChanged(e,t),options:this.getSummarySegments(),allowCustomValue:!0}))),c().createElement(d.Segment,{Component:c().createElement(q,{value:this.state.summarySegment.value,label:this.state.summarySegment.label}),onChange:this.onSummaryAction,options:this.getSummarySegments(),allowCustomValue:!0})))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Display Name",labelWidth:T,tooltip:"If single attribute, modify display name. Otherwise use regex to modify display name."},c().createElement(d.Input,{onBlur:a,value:b,onChange:e=>t(N(V({},n),{display:e.target.value})),placeholder:"Display"})),c().createElement(d.InlineField,{label:"Enable Regex Replace",labelWidth:T},c().createElement(d.InlineSwitch,{value:y.enable,onChange:()=>{this.onChange(N(V({},n),{regex:N(V({},y),{enable:!y.enable})}))}})),c().createElement(d.InlineField,{label:"Search",labelWidth:16},c().createElement(d.Input,{onBlur:a,value:y.search,onChange:e=>t(N(V({},n),{regex:N(V({},y),{search:e.target.value})})),placeholder:"(.*)"})),c().createElement(d.InlineField,{label:"Replace",labelWidth:16},c().createElement(d.Input,{onBlur:a,value:y.replace,onChange:e=>t(N(V({},n),{regex:N(V({},y),{replace:e.target.value})})),placeholder:"$1"}))))}constructor(e){super(e),W(this,"error",void 0),W(this,"piServer",[]),W(this,"availableAttributes",{}),W(this,"summaryTypes",void 0),W(this,"calculationBasis",void 0),W(this,"noDataReplacement",void 0),W(this,"state",{isPiPoint:!1,segments:[],attributes:[],summaries:[],attributeSegment:{},summarySegment:{},calculationBasisSegment:{},noDataReplacementSegment:{}}),W(this,"segmentChangeValue",(e=>{const t=this.props.query;this.setState({segments:e},(()=>this.onChange(N(V({},t),{segments:e}))))})),W(this,"attributeChangeValue",(e=>{const t=this.props.query;return new Promise((a=>this.setState({attributes:e},(()=>{this.onChange(N(V({},t),{attributes:e})),a()}))))})),W(this,"onPiPointChange",((e,t)=>{let a=this.state.attributes.slice(0);e.label===B?(0,E.remove)(a,((e,a)=>a===t)):a[t]=e,this.checkPiPointSegments(e,a)})),W(this,"onAttributeChange",((e,t)=>{var a;let n=this.state.attributes.slice(0);n[t].label!==(null===(a=e.value)||void 0===a?void 0:a.value)&&(n[t]=e,this.checkAttributeSegments(n,this.state.segments))})),W(this,"onSegmentChange",((e,t)=>{var a;const{query:n}=this.props;let l=this.state.segments.slice(0);l[t].label!==(null===(a=e.value)||void 0===a?void 0:a.value)&&this.setState({attributes:[]},(()=>e.label===B?(l=(0,E.slice)(l,0,t),void this.checkAttributeSegments([],l).then((()=>{var e;0===l.length?l.push({label:""}):(null===(e=l[l.length-1].value)||void 0===e?void 0:e.expandable)&&l.push({label:"Select Element",value:{value:"-Select Element-"}}),n.isPiPoint&&(this.piServer=[]),this.segmentChangeValue(l)}))):(l[t]=e,n.isPiPoint?(this.piServer.push(e),void this.segmentChangeValue(l)):(t{var t,a;return"template"===(null===(t=e.value)||void 0===t?void 0:t.type)?this.getElementSegments(l.length+1,l).then((e=>(e.length>0&&l.push({label:"Select Element",value:{value:"-Select Element-"}}),this.segmentChangeValue(l),l))):((null===(a=e.value)||void 0===a?void 0:a.expandable)&&l.push({label:"Select Element",value:{value:"-Select Element-"}}),new Promise((e=>{this.segmentChangeValue(l),e(l)})))}))))))})),W(this,"getElementSegments",((e,t)=>{var a;const{datasource:n,query:l,data:r}=this.props,i=this,s=l.isPiPoint?{type:"dataserver"}:{path:this.getSegmentPathUpTo(null!=t?t:this.state.segments.slice(0),e),afServerWebId:this.state.segments.length>0&&this.state.segments[0].value?this.state.segments[0].value.webId:void 0};if(!l.isPiPoint){var o,u,m;if((null===(o=n.afserver)||void 0===o?void 0:o.name)&&0===e)return Promise.resolve([{label:n.afserver.name,value:{value:n.afserver.name,expandable:!0}}]);if((null===(u=n.afserver)||void 0===u?void 0:u.name)&&(null===(m=n.afdatabase)||void 0===m?void 0:m.name)&&1===e)return Promise.resolve([{label:n.afdatabase.name,value:{value:n.afdatabase.name,expandable:!0}}])}var h;return n.metricFindQuery(s,Object.assign(null!==(h=null==r||null===(a=r.request)||void 0===a?void 0:a.scopedVars)&&void 0!==h?h:{},{isPiPoint:l.isPiPoint})).then((e=>{const t=(0,E.map)(e,(e=>({label:e.text,value:{webId:e.WebId,value:e.text,expandable:!l.isPiPoint&&e.expandable}})));if(0===t.length)return t;const a=n.templateSrv.getVariables();return(0,E.each)(a,(e=>{let a={label:"${"+e.name+"}",value:{type:"template",value:"${"+e.name+"}",expandable:!l.isPiPoint}};t.unshift(a)})),t.unshift({label:B,value:{value:B}}),t})).catch((e=>(i.error=e.message||"Failed to issue metric query",[])))})),W(this,"getAttributeSegmentsPI",(e=>{var t;const{datasource:a,query:n,data:l}=this.props,r=this,i={path:"",webId:this.getSelectedPIServer(),pointName:(null!=e?e:"")+"*",type:"pipoint"};let s=[];var o;return a.metricFindQuery(i,Object.assign(null!==(o=null==l||null===(t=l.request)||void 0===t?void 0:t.scopedVars)&&void 0!==o?o:{},{isPiPoint:n.isPiPoint})).then((t=>{s=(0,E.map)(t,(e=>({path:e.Path,label:e.text,value:{value:e.text,expandable:!1}}))),e&&e.length>0&&s.unshift({label:e,value:{value:e,expandable:!1}});const l=a.templateSrv.getVariables();return(0,E.each)(l,(e=>{let t={label:"${"+e.name+"}",value:{type:"template",value:"${"+e.name+"}",expandable:!n.isPiPoint}};s.unshift(t)})),s.unshift({label:B,value:{value:B}}),s})).catch((e=>(r.error=e.message||"Failed to issue metric query",s)))})),W(this,"getAttributeSegmentsAF",(e=>{let t=[];return t.push({label:B,value:{value:B}}),(0,E.forOwn)(this.availableAttributes,((e,a)=>{let n={label:a,value:{value:a,expandable:!0}};t.push(n)})),t})),W(this,"buildFromTarget",((e,t,a)=>{const n=e.target.split(";"),l=n.length>0?n[0].split("\\"):[];return l.length>1||1===l.length&&""!==l[0]?(n.splice(0,1),(0,E.each)(l,((e,a)=>{t.push({label:e,value:{type:e.match(/\${\w+}/gi)?"template":void 0,value:e,expandable:!0}})})),(0,E.each)(n,((e,t)=>{""!==e&&a.push({label:e,value:{value:e,expandable:!1}})})),this.getElementSegments(l.length+1,t).then((e=>(e.length>0&&t.push({label:"Select Element",value:{value:"-Select Element-"}}),t)))):Promise.resolve(t)})),W(this,"checkAfServer",(()=>{var e;const{datasource:t}=this.props,a=[];var n;return(null===(e=t.afserver)||void 0===e?void 0:e.name)?(a.push({label:t.afserver.name,value:{value:t.afserver.name,expandable:!0}}),(null===(n=t.afdatabase)||void 0===n?void 0:n.name)&&a.push({label:t.afdatabase.name,value:{value:t.afdatabase.name,expandable:!0}}),a.push({label:"Select Element",value:{value:"-Select Element-"}})):a.push({label:""}),a})),W(this,"updateArray",((e,t,a,n,l)=>{this.setState({segments:e,attributes:t,summaries:a,isPiPoint:n},(()=>{n||this.checkAttributeSegments(t,this.state.segments).then((()=>{l&&l()}))}))})),W(this,"scopedVarsDone",!1),W(this,"componentDidMount",(()=>{this.initialLoad(!1)})),W(this,"componentDidUpdate",(()=>{var e,t,a;const{query:n}=this.props;"Done"===(null===(e=this.props.data)||void 0===e?void 0:e.state)&&(null===(a=this.props.data)||void 0===a||null===(t=a.request)||void 0===t?void 0:t.scopedVars)&&!this.scopedVarsDone&&(this.scopedVarsDone=!0,this.initialLoad(!n.isPiPoint))})),W(this,"initialLoad",(e=>{const{query:t}=this.props,a=(0,E.defaults)(t,F),{segments:n,attributes:l,summary:r,isPiPoint:i}=a;var s;let o=e?[]:null!==(s=null==n?void 0:n.slice(0))&&void 0!==s?s:[];var u;let m=e?[]:null!==(u=null==l?void 0:l.slice(0))&&void 0!==u?u:[];var h;let c=null!==(h=null==r?void 0:r.types)&&void 0!==h?h:[];if(i||0!==o.length)i&&o.length>0&&(this.piServer=o);else{if(t.target&&t.target.length>0&&";"!==t.target)return m=[],void this.buildFromTarget(t,o,m).then((e=>{this.updateArray(e,m,c,!1)})).catch((e=>console.error(e)));o=this.checkAfServer()}this.updateArray(o,m,c,!!i,(()=>{this.onChange(t)}))})),W(this,"onChange",(e=>{const{onChange:t,onRunQuery:a}=this.props;var n,l;if(e.rawQuery){if(e.target=null!==(n=e.query)&&void 0!==n?n:"",e.query){const{attributes:t,elementPath:a}=function(e){const t=e.split(";"),a=t[0].split("\\");t.splice(0,1);let n=[];if(a.length>1||1===a.length&&""!==a[0]){const e=a.join("\\");return(0,E.each)(t,(function(e,t){""!==e&&n.push({label:e,value:{value:e,expandable:!1}})})),{attributes:n,elementPath:e}}return{attributes:n,elementPath:null}}(e.target);e.attributes=t,e.elementPath=a}}else e.elementPath=this.getSegmentPathUpTo(this.state.segments,this.state.segments.length),e.target=e.elementPath+";"+(0,E.join)(null===(l=e.attributes)||void 0===l?void 0:l.map((e=>{var t;return null===(t=e.value)||void 0===t?void 0:t.value})),";");const r=e.summary;r&&(r.types=this.state.summaries),t(N(V({},e),{summary:r})),this.isValidQuery(e)&&a()})),W(this,"isValidQuery",(e=>{if(e.target&&e.target.length>0&&";"!==e.target){e.target=e.target.trim();const t=e.target.split(";",2);return 2===t.length&&t[0].length>0&&t[1].length>0}return!1})),W(this,"stateCallback",(()=>{const e=this.props.query;this.onChange(e)})),W(this,"onIsPiPointChange",(e=>{const{query:t}=this.props,a=!t.isPiPoint;this.setState({segments:a?[{label:""}]:this.checkAfServer(),attributes:[],isPiPoint:a},(()=>{this.onChange(N(V({},t),{expression:"",attributes:this.state.attributes,segments:this.state.segments,isPiPoint:a}))}))})),this.onSegmentChange=this.onSegmentChange.bind(this),this.calcBasisValueChanged=this.calcBasisValueChanged.bind(this),this.calcNoDataValueChanged=this.calcNoDataValueChanged.bind(this),this.onSummaryAction=this.onSummaryAction.bind(this),this.onSummaryValueChanged=this.onSummaryValueChanged.bind(this),this.onAttributeAction=this.onAttributeAction.bind(this),this.onAttributeChange=this.onAttributeChange.bind(this),this.summaryTypes=["Total","Average","Minimum","Maximum","Range","StdDev","PopulationStdDev","Count","PercentGood","All","AllForNonNumeric"],this.calculationBasis=["TimeWeighted","EventWeighted","TimeWeightedContinuous","TimeWeightedDiscrete","EventWeightedExcludeMostRecentEvent","EventWeightedExcludeEarliestEvent","EventWeightedIncludeBothEnds"],this.noDataReplacement=["Null","Drop","Previous","0","Keep"]}}var U=o(269),M=o(531);function Q(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function G(e){for(var t=1;t{const t=u.target;if(t&&t[e])return{label:t[e].Name,value:t[e]}};var S;return o.getAssetServer(o.afserver.name).then((e=>{v(e.WebId)})),c().createElement(c().Fragment,null,c().createElement("div",{className:"gf-form-group"},c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Database",labelWidth:$,grow:!0},c().createElement(d.AsyncSelect,{key:null!=g?g:"database-key",loadOptions:()=>o.getDatabases(g).then((e=>e.map((e=>({label:e.Name,value:e}))))),loadingMessage:"Loading",value:E("database"),onChange:e=>{f(e.value),m(L(G({},s),{database:e.value,template:void 0}))},defaultOptions:!0})),c().createElement(d.InlineField,{label:"Event Frames",labelWidth:$,grow:!0},c().createElement(d.AsyncSelect,{key:null!==(S=null==y?void 0:y.WebId)&&void 0!==S?S:"default-template-key",loadOptions:()=>o.getEventFrameTemplates(null==y?void 0:y.WebId).then((e=>e.map((e=>({label:e.Name,value:e}))))),loadingMessage:"Loading",value:E("template"),onChange:e=>m(L(G({},s),{template:e.value})),defaultOptions:!0})),c().createElement(d.InlineField,{label:"Show Start and End Time",labelWidth:$,grow:!0},c().createElement(d.InlineSwitch,{value:!!s.showEndTime,onChange:e=>m(L(G({},s),{showEndTime:e.currentTarget.checked}))}))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Category name",labelWidth:$,grow:!0},c().createElement(d.Input,{type:"text",value:s.categoryName,onBlur:e=>p(),onChange:e=>m(L(G({},s),{categoryName:e.currentTarget.value})),placeholder:"Enter category name"})),c().createElement(d.InlineField,{label:"Name Filter",labelWidth:$,grow:!0},c().createElement(d.Input,{type:"text",value:s.nameFilter,onBlur:e=>p(),onChange:e=>m(L(G({},s),{nameFilter:e.currentTarget.value})),placeholder:"Enter name filter"}))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Enable Name Regex Replacement",labelWidth:$,grow:!1},c().createElement(d.InlineSwitch,{value:null===(a=s.regex)||void 0===a?void 0:a.enable,onChange:e=>m(L(G({},s),{regex:L(G({},s.regex),{enable:e.currentTarget.checked})}))})),c().createElement(d.InlineField,{label:"Name Filter",labelWidth:20,grow:!1},c().createElement(d.Input,{type:"text",value:null===(n=s.regex)||void 0===n?void 0:n.search,onBlur:e=>p(),onChange:e=>m(L(G({},s),{regex:L(G({},s.regex),{search:e.currentTarget.value})})),placeholder:"(.*)",width:50})),c().createElement(d.InlineField,{label:"Replace",labelWidth:20,grow:!0},c().createElement(d.Input,{type:"text",value:null==s||null===(l=s.regex)||void 0===l?void 0:l.replace,onBlur:e=>p(),onChange:e=>m(L(G({},s),{regex:L(G({},s.regex),{replace:e.currentTarget.value})})),placeholder:"$1"}))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Enable Attribute Usage",labelWidth:$,grow:!1},c().createElement(d.InlineSwitch,{value:null===(r=s.attribute)||void 0===r?void 0:r.enable,onChange:e=>m(L(G({},s),{attribute:L(G({},s.attribute),{enable:e.currentTarget.checked})}))})),c().createElement(d.InlineField,{label:"Attribute Name",labelWidth:$,grow:!0},c().createElement(d.Input,{type:"text",value:null===(i=s.attribute)||void 0===i?void 0:i.name,onBlur:e=>p(),onChange:e=>m(L(G({},s),{attribute:L(G({},s.attribute),{name:e.currentTarget.value})})),placeholder:"Enter name"})))))}));function _(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function Y(e){for(var t=1;te.substring(1,e.length-2).split(",")[0]))),e.filter=null!==(l=e.filter)&&void 0!==l?l:"*",e.max=null!==(r=e.max)&&void 0!==r?r:1e4,"servers"===e.type?(null===(i=a.afserver)||void 0===i?void 0:i.name)?a.getAssetServer(a.afserver.name).then((e=>[e])).then(A):a.getAssetServers().then(A):"databases"===e.type&&e.afServerWebId?a.getDatabases(e.afServerWebId,{}).then(A):"databases"===e.type?a.getAssetServer(e.path).then((e=>{var t;return a.getDatabases(null!==(t=e.WebId)&&void 0!==t?t:"",{})})).then(A):"databaseElements"===e.type?a.getDatabase(e.path).then((e=>{var t;return a.getDatabaseElements(null!==(t=e.WebId)&&void 0!==t?t:"",{selectedFields:"Items.WebId%3BItems.Name%3BItems.Items%3BItems.Path%3BItems.HasChildren"})})).then(A):"elements"===e.type?a.getElement(e.path).then((t=>{var n;return a.getElements(null!==(n=t.WebId)&&void 0!==n?n:"",{selectedFields:"Items.Description%3BItems.WebId%3BItems.Name%3BItems.Items%3BItems.Path%3BItems.HasChildren",nameFilter:e.filter})})).then(A):"attributes"===e.type?a.getElement(e.path).then((t=>{var n;return a.getAttributes(null!==(n=t.WebId)&&void 0!==n?n:"",{searchFullHierarchy:"true",selectedFields:"Items.Type%3BItems.DefaultUnitsName%3BItems.Description%3BItems.WebId%3BItems.Name%3BItems.Path",nameFilter:e.filter,maxCount:e.max})})).then(A):"dataserver"===e.type?a.getDataServers().then(A):"pipoint"===e.type?a.piPointSearch(e.webId,e.pointName).then(A):Promise.reject("Bad type")}buildQueryParameters(e){return e.targets=(0,E.filter)(e.targets,(e=>{var t;return!(!e||!e.target||0===(null===(t=e.attributes)||void 0===t?void 0:t.length)||";"===e.target||e.hide||e.target.startsWith("Select AF"))})),e.maxDataPoints&&(e.maxDataPoints=e.maxDataPoints>3e4?3e4:e.maxDataPoints),e.targets=(0,E.map)(e.targets,(t=>{var a;const n={enableStreaming:t.enableStreaming,target:this.templateSrv.replace(t.target,e.scopedVars),elementPath:this.templateSrv.replace(t.elementPath,e.scopedVars),attributes:(0,E.map)(t.attributes,(t=>(t.value&&this.templateSrv.replace(t.value.value,e.scopedVars),t))),segments:(0,E.map)(t.segments,(t=>(t.value&&this.templateSrv.replace(t.value.value,e.scopedVars),t))),isAnnotation:!!t.isAnnotation,display:t.display?this.templateSrv.replace(t.display,e.scopedVars):void 0,refId:t.refId,hide:t.hide,interpolate:t.interpolate?J(Y({},t.interpolate),{interval:this.templateSrv.replace(t.interpolate.interval,e.scopedVars)}):{enable:!1},useLastValue:t.useLastValue||{enable:!1},useUnit:t.useUnit||{enable:!1},recordedValues:t.recordedValues||{enable:!1},digitalStates:t.digitalStates||{enable:!1},webid:null!==(a=t.webid)&&void 0!==a?a:"",regex:t.regex||{enable:!1},expression:t.expression||"",summary:t.summary||{types:[]},startTime:e.range.from,endTime:e.range.to,isPiPoint:!!t.isPiPoint,scopedVars:e.scopedVars};return n.expression&&(n.expression=this.templateSrv.replace(n.expression,e.scopedVars)),void 0!==n.summary.types&&(n.summary.types=(0,E.filter)(n.summary.types,(e=>null!=e&&""!==e)),n.summary.interval=n.summary.interval?this.templateSrv.replace(n.summary.interval,e.scopedVars):n.summary.interval),n})),e}eventFrameToAnnotation(e,t){const a=e.target,n=[],l=Intl.DateTimeFormat().resolvedOptions().locale;return t.forEach((e=>{let t=this.transformDataFrameToMap(e);for(let e=0;eStart: "+new Date(t.time[e]).toLocaleString(l)+"
End: ",t.timeEnd[e]?i+=new Date(t.timeEnd[e]).toLocaleString(l):i+="Eventframe is open";const s={time:t.time[e],timeEnd:a.showEndTime?t.timeEnd[e]:void 0,title:r,id:t.id[e],text:i,tags:["OSISoft PI"]};n.push(s)}})),n}transformDataFrameToMap(e){const t={};return e.fields.forEach((e=>{t[e.name]=e.values.toArray()})),t}restGet(e){const t=this.backendSrv.fetch({url:`/api/datasources/${this.id}/resources${e}`,method:"GET",headers:{"Content-Type":"application/json"}});return(0,U.firstValueFrom)(t).then((e=>e))}getDataServers(){return this.restGet("/dataservers").then((e=>{var t;return null!==(t=e.data.Items)&&void 0!==t?t:[]}))}getDataServer(e){return e?this.restGet("/dataservers?name="+e).then((e=>e.data)):Promise.resolve({})}getAssetServers(){return this.restGet("/assetservers").then((e=>{var t;return null!==(t=e.data.Items)&&void 0!==t?t:[]}))}getAssetServer(e){return e?this.restGet("/assetservers?path=\\\\"+e).then((e=>e.data)):Promise.resolve({})}getDatabase(e){return e?this.restGet("/assetdatabases?path=\\\\"+e).then((e=>e.data)):Promise.resolve({})}getDatabases(e,t){return e?this.restGet("/assetservers/"+e+"/assetdatabases").then((e=>{var t;return null!==(t=e.data.Items)&&void 0!==t?t:[]})):Promise.resolve([])}getElement(e){return e?this.restGet("/elements?path=\\\\"+e).then((e=>e.data)):Promise.resolve({})}getEventFrameTemplates(e){return e?this.restGet("/assetdatabases/"+e+"/elementtemplates?selectedFields=Items.InstanceType%3BItems.Name%3BItems.WebId").then((e=>{var t;return(0,E.filter)(null!==(t=e.data.Items)&&void 0!==t?t:[],(e=>"EventFrame"===e.InstanceType))})):Promise.resolve([])}getElementTemplates(e){return e?this.restGet("/assetdatabases/"+e+"/elementtemplates?selectedFields=Items.InstanceType%3BItems.Name%3BItems.WebId").then((e=>{var t;return(0,E.filter)(null!==(t=e.data.Items)&&void 0!==t?t:[],(e=>"Element"===e.InstanceType))})):Promise.resolve([])}getAttributes(e,t){let a="?"+(0,E.map)(t,((e,t)=>t+"="+e)).join("&");return"?"===a&&(a=""),this.restGet("/elements/"+e+"/attributes"+a).then((e=>{var t;return null!==(t=e.data.Items)&&void 0!==t?t:[]}))}getDatabaseElements(e,t){let a="?"+(0,E.map)(t,((e,t)=>t+"="+e)).join("&");return"?"===a&&(a=""),this.restGet("/assetdatabases/"+e+"/elements"+a).then((e=>{var t;return null!==(t=e.data.Items)&&void 0!==t?t:[]}))}getElements(e,t){let a="?"+(0,E.map)(t,((e,t)=>t+"="+e)).join("&");return"?"===a&&(a=""),this.restGet("/elements/"+e+"/elements"+a).then((e=>{var t;return null!==(t=e.data.Items)&&void 0!==t?t:[]}))}piPointSearch(e,t){let a=this.templateSrv.replace(t),n=`${a}`,l=!1;if(a!==t){const e=RegExp("\\{(\\w|,)+\\}","gs");let t;for(;null!==(t=e.exec(a));)t.index===e.lastIndex&&e.lastIndex++,t.forEach(((e,t)=>{0===t&&(a=a.replace(e,e.replace("{","(").replace("}",")").replace(",","|")),n=n.replace(e,"*"),l=!0)}))}return this.restGet("/dataservers/"+e+"/points?maxCount=50&nameFilter="+n).then((e=>{var t;return e&&(null===(t=e.data)||void 0===t?void 0:t.Items)?l?e.data.Items.filter((e=>{var t;return null===(t=e.Name)||void 0===t?void 0:t.match(a)})):e.data.Items:[]}))}constructor(e,t=(0,M.getTemplateSrv)(),a=(0,M.getBackendSrv)()){super(e),_(this,"templateSrv",void 0),_(this,"backendSrv",void 0),_(this,"piserver",void 0),_(this,"afserver",void 0),_(this,"afdatabase",void 0),_(this,"piPointConfig",void 0),_(this,"newFormatConfig",void 0),_(this,"useUnitConfig",void 0),_(this,"useExperimental",void 0),_(this,"useStreaming",void 0),this.templateSrv=t,this.backendSrv=a,this.piserver={name:(e.jsonData||{}).piserver,webid:void 0},this.afserver={name:(e.jsonData||{}).afserver,webid:void 0},this.afdatabase={name:(e.jsonData||{}).afdatabase,webid:void 0},this.piPointConfig=e.jsonData.pipoint||!1,this.newFormatConfig=e.jsonData.newFormat||!1,this.useUnitConfig=e.jsonData.useUnit||!1,this.useExperimental=e.jsonData.useExperimental||!1,this.useStreaming=e.jsonData.useStreaming||!1,this.annotations={QueryEditor:H,prepareQuery:e=>(e.target&&(e.target.queryType="Annotation",e.target.isAnnotation=!0),e.target),processEvents:(e,t)=>(0,U.of)(this.eventFrameToAnnotation(e,t))},Promise.all([this.getDataServer(this.piserver.name).then((e=>this.piserver.webid=e.WebId)),this.getAssetServer(this.afserver.name).then((e=>this.afserver.webid=e.WebId)),this.getDatabase(this.afserver.name&&this.afdatabase.name?this.afserver.name+"\\"+this.afdatabase.name:void 0).then((e=>this.afdatabase.webid=e.WebId))])}}const z=new m.DataSourcePlugin(K).setQueryEditor(R).setConfigEditor(f);return u})())); +define(["@grafana/data","react","@grafana/ui","lodash","rxjs","@grafana/runtime"],((e,t,a,n,l,r)=>(()=>{"use strict";var i={781:t=>{t.exports=e},531:e=>{e.exports=r},7:e=>{e.exports=a},241:e=>{e.exports=n},959:e=>{e.exports=t},269:e=>{e.exports=l}},s={};function o(e){var t=s[e];if(void 0!==t)return t.exports;var a=s[e]={exports:{}};return i[e](a,a.exports,o),a.exports}o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var a in t)o.o(t,a)&&!o.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var u={};o.r(u),o.d(u,{plugin:()=>z});var h=o(781),m=o(959),c=o.n(m),d=o(7);function p(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function v(e){for(var t=1;tg(v({},e),{jsonData:g(v({},e.jsonData),{url:e.url})});class f extends m.PureComponent{render(){const{options:e}=this.props,t=y(e);return c().createElement("div",null,c().createElement(d.DataSourceHttpSettings,{defaultUrl:"https://server.name/piwebapi",dataSourceConfig:t,onChange:this.onHttpOptionsChange,showAccessOptions:!0}),c().createElement("h3",{className:"page-heading"},"Custom Configuration"),c().createElement("div",{className:"gf-form-group"},c().createElement("div",{className:"gf-form-inline"},c().createElement(d.InlineField,{label:"Enable PI Points in Query",labelWidth:24},c().createElement(d.InlineSwitch,{value:t.jsonData.pipoint,onChange:this.onPiPointChange}))),c().createElement("div",{className:"gf-form-inline"},c().createElement(d.InlineField,{label:"Enable New Data Format",labelWidth:24},c().createElement(d.InlineSwitch,{value:t.jsonData.newFormat,onChange:this.onNewFormatChange}))),c().createElement("div",{className:"gf-form-inline"},c().createElement(d.InlineField,{label:"Enable Unit in Data",labelWidth:24},c().createElement(d.InlineSwitch,{value:t.jsonData.useUnit,onChange:this.onUseUnitChange}))),c().createElement("div",{className:"gf-form-inline"},c().createElement(d.InlineField,{label:"Enable Experimental Features",labelWidth:24},c().createElement(d.InlineSwitch,{value:t.jsonData.useExperimental,onChange:this.onUseExperimentalChange}))),t.jsonData.useExperimental&&c().createElement("div",{className:"gf-form-inline"},c().createElement(d.InlineField,{label:"Enable Steaming Support",labelWidth:24},c().createElement(d.InlineSwitch,{value:t.jsonData.useStreaming,onChange:this.onUseStreamingChange})))),c().createElement("h3",{className:"page-heading"},"PI/AF Connection Details"),c().createElement("div",{className:"gf-form-group"},t.jsonData.pipoint&&c().createElement("div",{className:"gf-form"},c().createElement(b,{label:"PI Server",labelWidth:10,inputWidth:25,onChange:this.onPIServerChange,value:t.jsonData.piserver||"",placeholder:"Default PI Server to use for data requests"})),c().createElement("div",{className:"gf-form"},c().createElement(b,{label:"AF Server",labelWidth:10,inputWidth:25,onChange:this.onAFServerChange,value:t.jsonData.afserver||"",placeholder:"Default AF Server to use for data requests"})),c().createElement("div",{className:"gf-form"},c().createElement(b,{label:"AF Database",labelWidth:10,inputWidth:25,onChange:this.onAFDatabaseChange,value:t.jsonData.afdatabase||"",placeholder:"Default AF Database server for AF queries"}))))}constructor(...e){super(...e),p(this,"onPIServerChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=g(v({},a.jsonData),{piserver:e.target.value});t(g(v({},a),{jsonData:n}))})),p(this,"onAFServerChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=g(v({},a.jsonData),{afserver:e.target.value});t(g(v({},a),{jsonData:n}))})),p(this,"onAFDatabaseChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=g(v({},a.jsonData),{afdatabase:e.target.value});t(g(v({},a),{jsonData:n}))})),p(this,"onHttpOptionsChange",(e=>{const{onOptionsChange:t}=this.props;t(y(e))})),p(this,"onPiPointChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=g(v({},a.jsonData),{piserver:e.target.checked?a.jsonData.piserver:"",pipoint:e.target.checked});t(g(v({},a),{jsonData:n}))})),p(this,"onNewFormatChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=g(v({},a.jsonData),{newFormat:e.target.checked});t(g(v({},a),{jsonData:n}))})),p(this,"onUseUnitChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=g(v({},a.jsonData),{useUnit:e.target.checked});t(g(v({},a),{jsonData:n}))})),p(this,"onUseExperimentalChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=g(v({},a.jsonData),{useExperimental:e.target.checked,useStreaming:!!e.target.checked&&a.jsonData.useStreaming});t(g(v({},a),{jsonData:n}))})),p(this,"onUseStreamingChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=g(v({},a.jsonData),{useStreaming:e.target.checked});t(g(v({},a),{jsonData:n}))}))}}var E=o(241);function S(){return S=Object.assign||function(e){for(var t=1;tc().createElement(c().Fragment,null,c().createElement(d.InlineFormLabel,{width:t,tooltip:a},e),n),I=()=>c().createElement("div",{className:"gf-form gf-form--grow"},c().createElement("div",{className:"gf-form-label gf-form-label--grow"})),w=e=>{var t=S({},C(e));return c().createElement(O,null,c().createElement(P,t))},O=e=>c().createElement("div",{className:"gf-form-inline"},e.children,c().createElement(I,null)),x=e=>{var t=S({},C(e));return c().createElement(D,null,c().createElement(P,t))},D=e=>c().createElement(c().Fragment,null,e.children),F={target:";",attributes:[],segments:[],regex:{enable:!1},summary:{types:[],basis:"EventWeighted",interval:"",nodata:"Null"},expression:"",interpolate:{enable:!1},useLastValue:{enable:!1},recordedValues:{enable:!1,boundaryType:"Inside"},digitalStates:{enable:!1},enableStreaming:{enable:!1},useUnit:{enable:!1},isPiPoint:!1},j=({isRaw:e,onChange:t})=>{const[a,n]=(0,m.useState)(!1);return(0,m.useEffect)((()=>{n(!1)}),[e]),e?c().createElement(c().Fragment,null,c().createElement(d.Button,{"aria-label":"Switch to visual editor",icon:"pen",variant:"secondary",type:"button",onClick:()=>{n(!0)}}),c().createElement(d.ConfirmModal,{isOpen:a,title:"Switch to visual editor mode",body:"Are you sure to switch to visual editor mode? You will lose the changes done in raw query mode.",confirmText:"Yes, switch to editor mode",dismissText:"No, stay in raw query mode",onConfirm:()=>{t(!1)},onDismiss:()=>{n(!1)}})):c().createElement(d.Button,{"aria-label":"Switch to text editor",icon:"pen",variant:"secondary",type:"button",onClick:()=>{t(!0)}})};function A(e){return(0,E.map)(e,(e=>{var t,a;return{text:e.Name,expandable:void 0===e.HasChildren||!0===e.HasChildren||(null!==(t=e.Path)&&void 0!==t?t:"").split("\\").length<=3,HasChildren:e.HasChildren,Items:null!==(a=e.Items)&&void 0!==a?a:[],Path:e.Path,WebId:e.WebId}}))}function V(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function W(e){for(var t=1;t{var t;return e.value?c().createElement("div",{style:{width:e.width,marginRight:e.marginRight},className:"gf-form-label "+("template"===e.value.type?"query-keyword":"")},null!==(t=e.label)&&void 0!==t?t:"--no label--"):c().createElement("a",{className:"gf-form-label query-part"},c().createElement(d.Icon,{name:"plus"}))};class R extends m.PureComponent{isValueEmpty(e){return!e||!e.value||!e.value.length||e.value===q}calcBasisValueChanged(e){const t=this.props.query,a=t.summary;var n;a&&(a.basis=null===(n=e.value)||void 0===n?void 0:n.value),this.onChange(T(W({},t),{summary:a}))}getCalcBasisSegments(){return(0,E.map)(this.calculationBasis,(e=>({label:e,value:{value:e,expandable:!0}})))}recordedBoundaryTypeValueChanged(e){const t=this.props.query,a=t.recordedValues;var n;a&&(a.boundaryType=null===(n=e.value)||void 0===n?void 0:n.value),this.onChange(T(W({},t),{recordedValues:a}))}getRecordedBoundaryTypeSegments(){return(0,E.map)(this.recordedBoundaryTypes,(e=>({label:e,value:{value:e,expandable:!0}})))}calcNoDataValueChanged(e){const t=this.props.query,a=t.summary;var n;a&&(a.nodata=null===(n=e.value)||void 0===n?void 0:n.value),this.onChange(T(W({},t),{summary:a}))}getNoDataSegments(){return(0,E.map)(this.noDataReplacement,(e=>({label:e,value:{value:e,expandable:!0}})))}onSummaryValueChanged(e,t){const a=this.state.summaries.slice(0);a[t]=e,this.isValueEmpty(e.value)&&a.splice(t,1),this.setState({summaries:a},this.stateCallback)}getSummarySegments(){const e=(0,E.filter)(this.summaryTypes,(e=>-1===this.state.summaries.map((e=>{var t;return null===(t=e.value)||void 0===t?void 0:t.value})).indexOf(e))),t=(0,E.map)(e,(e=>({label:e,value:{value:e,expandable:!0}})));return t.unshift({label:q,value:{value:q}}),t}removeSummary(e){const t=(0,E.filter)(this.state.summaries,(t=>t!==e));this.setState({summaries:t})}onSummaryAction(e){const t=this.state.summaries.slice(0);if(!this.isValueEmpty(e.value)){var a;let n={label:e.label,value:{value:null===(a=e.value)||void 0===a?void 0:a.value,expandable:!0}};t.push(n)}this.setState({summarySegment:{},summaries:t},this.stateCallback)}removeAttribute(e){const t=(0,E.filter)(this.state.attributes,(t=>t!==e));this.attributeChangeValue(t)}onAttributeAction(e){const{query:t}=this.props,a=this.state.attributes.slice(0);if(null!==e.value&&"object"!=typeof e.value&&!Array.isArray(e.value)){const t=String(e.value);e.value={type:t.match(/\${\w+}/gi)?"template":void 0,value:t}}if(!this.isValueEmpty(e.value)){var n,l,r;let i={label:e.label,value:{type:(null===(n=e.value)||void 0===n?void 0:n.value)&&(null===(l=e.value)||void 0===l?void 0:l.value.match(/\${\w+}/gi))?"template":void 0,value:null===(r=e.value)||void 0===r?void 0:r.value,expandable:!t.isPiPoint}};a.push(i)}this.attributeChangeValue(a)}getSegmentPathUpTo(e,t){const a=e.slice(0,t);return(0,E.reduce)(a,((e,t)=>{var a;return t.value?(null===(a=t.value.value)||void 0===a?void 0:a.startsWith("-Select"))?e:e?e+"\\"+t.value.value:t.value.value:""}),"")}checkAttributeSegments(e,t){var a;const{datasource:n,data:l}=this.props,r=this,i={path:this.getSegmentPathUpTo(t.slice(0),t.length),type:"attributes"};var s;return n.metricFindQuery(i,Object.assign(null!==(s=null==l||null===(a=l.request)||void 0===a?void 0:a.scopedVars)&&void 0!==s?s:{},{isPiPoint:!1})).then((t=>{const a={};(0,E.each)(t,(e=>{a[e.Path.substring(e.Path.indexOf("|")+1)]=e.WebId}));const l=(0,E.filter)(e,(e=>{var t;const l=n.templateSrv.replace(null===(t=e.value)||void 0===t?void 0:t.value);return void 0!==a[l]}));return r.availableAttributes=a,this.attributeChangeValue(l)})).catch((t=>(r.error=t.message||"Failed to issue metric query",this.attributeChangeValue(e))))}checkPiPointSegments(e,t){var a;const{datasource:n,data:l}=this.props,r=this,i={path:e.path,webId:r.getSelectedPIServer(),pointName:e.label,type:"pipoint"};var s;return n.metricFindQuery(i,Object.assign(null!==(s=null==l||null===(a=l.request)||void 0===a?void 0:a.scopedVars)&&void 0!==s?s:{},{isPiPoint:!0})).then((()=>r.attributeChangeValue(t))).catch((e=>(r.error=e.message||"Failed to issue metric query",r.attributeChangeValue([]))))}getSelectedPIServer(){var e;let t="";return this.piServer.forEach((e=>{const a=this.props.query.target.split(";");a.length>=2&&a[0]===e.text&&(t=e.WebId)})),this.piServer.length>0?null===(e=this.piServer[0].value)||void 0===e?void 0:e.webId:t}textEditorChanged(){const{query:e}=this.props,t=e.target.split(";"),a=t.length>0?t[0].split("\\"):[];let n=[],l=[];a.length>1||1===a.length&&""!==a[0]?(t.splice(0,1),(0,E.each)(a,((e,t)=>{n.push({label:e,value:{type:e.match(/\${\w+}/gi)?"template":void 0,value:e,expandable:!0}})})),(0,E.each)(t,(function(e,t){""!==e&&l.push({label:e,value:{type:e.match(/\${\w+}/gi)?"template":void 0,value:e,expandable:!1}})})),this.getElementSegments(a.length+1,n).then((e=>{e.length>0&&n.push({label:"Select Element",value:{value:"-Select Element-"}})})).then((()=>{this.updateArray(n,l,this.state.summaries,e.isPiPoint,(()=>{this.onChange(T(W({},e),{query:void 0,rawQuery:!1,attributes:this.state.attributes,segments:this.state.segments}))}))}))):(n=this.checkAfServer(),this.updateArray(n,this.state.attributes,this.state.summaries,e.isPiPoint,(()=>{this.onChange(T(W({},e),{query:void 0,rawQuery:!1,attributes:this.state.attributes,segments:this.state.segments}))})))}render(){const{query:e,onChange:t,onRunQuery:a}=this.props,n=(0,E.defaults)(e,F),{useLastValue:l,useUnit:r,interpolate:i,query:s,rawQuery:o,digitalStates:u,enableStreaming:h,recordedValues:m,expression:p,isPiPoint:v,hideError:g,summary:b,display:y,regex:f}=n;return c().createElement(c().Fragment,null,this.props.datasource.piPointConfig&&c().createElement(d.InlineField,{label:"Is Pi Point?",labelWidth:B},c().createElement(d.InlineSwitch,{value:v,onChange:this.onIsPiPointChange})),!!o&&c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Raw Query",labelWidth:B,grow:!0},c().createElement(d.Input,{onBlur:this.stateCallback,value:s,onChange:e=>t(T(W({},n),{query:e.target.value})),placeholder:"enter query"})),c().createElement(j,{isRaw:!0,onChange:e=>this.textEditorChanged()})),!o&&c().createElement(c().Fragment,null,c().createElement("div",{className:"gf-form-inline"},c().createElement(x,{label:v?"PI Server":"AF Elements",tooltip:v?"Select PI server.":"Select AF Element."},this.state.segments.map(((e,t)=>c().createElement(d.SegmentAsync,{key:"element-"+t,Component:c().createElement(k,{value:e.value,label:e.label}),onChange:e=>this.onSegmentChange(e,t),loadOptions:e=>this.getElementSegments(t),allowCustomValue:!0,inputMinWidth:200}))),c().createElement(I,null),!v&&c().createElement(j,{isRaw:!1,onChange:e=>{t(T(W({},n),{query:n.target,rawQuery:e}))}}))),c().createElement(w,{label:v?"Pi Points":"Attributes"},this.state.attributes.map(((e,t)=>v?c().createElement(d.SegmentAsync,{key:"attributes-"+t,Component:c().createElement(k,{value:e.value,label:e.label}),disabled:0===this.piServer.length,onChange:e=>this.onPiPointChange(e,t),loadOptions:this.getAttributeSegmentsPI,reloadOptionsOnChange:!0,allowCustomValue:!0,inputMinWidth:N}):c().createElement(d.Segment,{key:"attributes-"+t,Component:c().createElement(k,{value:e.value,label:e.label}),disabled:this.state.segments.length<=2,onChange:e=>this.onAttributeChange(e,t),options:this.getAttributeSegmentsAF(),allowCustomValue:!0,inputMinWidth:N}))),v&&c().createElement(d.SegmentAsync,{Component:c().createElement(k,{value:this.state.attributeSegment.value,label:this.state.attributeSegment.label}),disabled:0===this.piServer.length,onChange:this.onAttributeAction,loadOptions:this.getAttributeSegmentsPI,reloadOptionsOnChange:!0,allowCustomValue:!0,inputMinWidth:N}),!v&&c().createElement(d.Segment,{Component:c().createElement(k,{value:this.state.attributeSegment.value,label:this.state.attributeSegment.label}),disabled:this.state.segments.length<=2,onChange:this.onAttributeAction,options:this.getAttributeSegmentsAF(),allowCustomValue:!0,inputMinWidth:N}))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Calculation",grow:!0,labelWidth:B,tooltip:"Modify all attributes by an equation. Use '.' for current item. Leave Attributes empty if you wish to perform element based calculations."},c().createElement(d.Input,{onBlur:a,value:p,onChange:e=>t(T(W({},n),{expression:e.target.value})),placeholder:"'.'*2"}))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Use Last Value",tooltip:"Fetch only last value from time range",labelWidth:B},c().createElement(d.InlineSwitch,{value:l.enable,onChange:()=>this.onChange(T(W({},n),{useLastValue:T(W({},l),{enable:!l.enable})}))})),c().createElement(d.InlineField,{label:"Digital States",labelWidth:B},c().createElement(d.InlineSwitch,{value:u.enable,onChange:()=>this.onChange(T(W({},n),{digitalStates:T(W({},u),{enable:!u.enable})}))})),c().createElement(d.InlineField,{label:"Replace Bad Data",labelWidth:B,tooltip:"Replacement for bad quality values."},c().createElement(d.Segment,{Component:c().createElement(k,{width:96,value:{value:null==b?void 0:b.nodata},label:null==b?void 0:b.nodata}),onChange:this.calcNoDataValueChanged,options:this.getNoDataSegments(),allowCustomValue:!0})),c().createElement(d.InlineField,{label:"Ignore API Error?",labelWidth:B},c().createElement(d.InlineSwitch,{value:g,onChange:this.onHideErrorChange})),this.props.datasource.useUnitConfig&&c().createElement(d.InlineField,{label:"Use unit from datapoints",tooltip:"Use unit in label from PI tag or PI AF attribute",labelWidth:B},c().createElement(d.InlineSwitch,{value:r.enable,onChange:()=>this.onChange(T(W({},n),{useUnit:T(W({},r),{enable:!r.enable})}))})),this.props.datasource.useStreaming&&c().createElement(d.InlineField,{label:"Enable Streaming",labelWidth:B,tooltip:"Enable streaming data if it is supported for the point type."},c().createElement(d.InlineSwitch,{value:h.enable,onChange:()=>this.onChange(T(W({},n),{enableStreaming:T(W({},h),{enable:!h.enable})}))}))),!l.enable&&!m.enable&&c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:p?"Interval Values":"Interpolate",labelWidth:B},c().createElement(d.InlineSwitch,{value:i.enable,onChange:()=>this.onChange(T(W({},n),{interpolate:T(W({},i),{enable:!i.enable,interval:null})}))})),c().createElement(d.InlineField,{disabled:!i.enable,label:p?"Interval Period":"Interpolate Period",labelWidth:B,tooltip:"Override time between sampling, e.g. '30s'. Defaults to timespan/chart width."},c().createElement(d.Input,{onBlur:a,width:30.633375,value:i.interval,onChange:e=>t(T(W({},n),{interpolate:T(W({},i),{interval:e.target.value})})),placeholder:"30s"}))),!l.enable&&!i.enable&&c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Recorded Values",labelWidth:B},c().createElement(d.InlineSwitch,{value:m.enable,onChange:()=>this.onChange(T(W({},n),{recordedValues:T(W({},m),{enable:!m.enable,maxNumber:null,boundaryType:"Inside"})}))})),c().createElement(d.InlineField,{disabled:!(null==m?void 0:m.enable),label:"Max Recorded Values",labelWidth:B,tooltip:"Maximum number of recorded value to retrive from the data archive, without using interpolation."},c().createElement(d.Input,{onBlur:a,width:30.633375,value:m.maxNumber,onChange:e=>t(T(W({},n),{recordedValues:T(W({},m),{maxNumber:parseInt(e.target.value,10)})})),type:"number",placeholder:"1000"})),c().createElement(d.InlineField,{disabled:!(null==m?void 0:m.enable),label:"Boundary Type",labelWidth:B,tooltip:"Defines the behavior of data retrieval at the end points of a specified time range."},c().createElement(d.Segment,{Component:c().createElement(k,{width:96,value:{value:null==m?void 0:m.boundaryType},label:null==m?void 0:m.boundaryType}),onChange:this.recordedBoundaryTypeValueChanged,options:this.getRecordedBoundaryTypeSegments(),allowCustomValue:!0}))),!l.enable&&c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Summary Period",labelWidth:B,tooltip:"Define the summary period, e.g. '30s'."},c().createElement(d.Input,{onBlur:a,width:30.633375,value:null==b?void 0:b.interval,onChange:e=>t(T(W({},n),{summary:T(W({},b),{interval:e.target.value})})),placeholder:"30s"})),c().createElement(d.InlineField,{label:"Basis",labelWidth:30.633375,tooltip:"Defines the possible calculation options when performing summary calculations over time-series data."},c().createElement(d.Segment,{Component:c().createElement(k,{width:192,marginRight:"0",value:{value:null==b?void 0:b.basis},label:null==b?void 0:b.basis}),onChange:this.calcBasisValueChanged,options:this.getCalcBasisSegments(),allowCustomValue:!0})),c().createElement(d.InlineField,{label:"Summaries",labelWidth:B,tooltip:"PI Web API summary options."},c().createElement(d.InlineFieldRow,null,this.state.summaries.map(((e,t)=>c().createElement(d.Segment,{key:"summaries-"+t,Component:c().createElement(k,{value:e.value,label:e.label}),onChange:e=>this.onSummaryValueChanged(e,t),options:this.getSummarySegments(),allowCustomValue:!0}))),c().createElement(d.Segment,{Component:c().createElement(k,{value:this.state.summarySegment.value,label:this.state.summarySegment.label}),onChange:this.onSummaryAction,options:this.getSummarySegments(),allowCustomValue:!0})))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Display Name",labelWidth:B,tooltip:"If single attribute, modify display name. Otherwise use regex to modify display name."},c().createElement(d.Input,{onBlur:a,width:30.633375,value:y,onChange:e=>t(T(W({},n),{display:e.target.value})),placeholder:"Display"})),c().createElement(d.InlineField,{label:"Enable Regex Replace",labelWidth:B},c().createElement(d.InlineSwitch,{value:f.enable,onChange:()=>{this.onChange(T(W({},n),{regex:T(W({},f),{enable:!f.enable})}))}})),c().createElement(d.InlineField,{label:"Search",labelWidth:B},c().createElement(d.Input,{onBlur:a,width:B,value:f.search,onChange:e=>t(T(W({},n),{regex:T(W({},f),{search:e.target.value})})),placeholder:"(.*)"})),c().createElement(d.InlineField,{label:"Replace",labelWidth:B},c().createElement(d.Input,{onBlur:a,width:B,value:f.replace,onChange:e=>t(T(W({},n),{regex:T(W({},f),{replace:e.target.value})})),placeholder:"$1"}))))}constructor(e){super(e),V(this,"error",void 0),V(this,"piServer",[]),V(this,"availableAttributes",{}),V(this,"summaryTypes",void 0),V(this,"calculationBasis",void 0),V(this,"recordedBoundaryTypes",void 0),V(this,"noDataReplacement",void 0),V(this,"state",{isPiPoint:!1,hideError:!1,segments:[],attributes:[],summaries:[],attributeSegment:{},summarySegment:{},calculationBasisSegment:{},noDataReplacementSegment:{}}),V(this,"segmentChangeValue",(e=>{const t=this.props.query;this.setState({segments:e},(()=>this.onChange(T(W({},t),{segments:e}))))})),V(this,"attributeChangeValue",(e=>{const t=this.props.query;return new Promise((a=>this.setState({attributes:e},(()=>{this.onChange(T(W({},t),{attributes:e})),a()}))))})),V(this,"onPiPointChange",((e,t)=>{let a=this.state.attributes.slice(0);e.label===q?(0,E.remove)(a,((e,a)=>a===t)):a[t]=e,this.checkPiPointSegments(e,a)})),V(this,"onAttributeChange",((e,t)=>{var a;let n=this.state.attributes.slice(0);n[t].label!==(null===(a=e.value)||void 0===a?void 0:a.value)&&(n[t]=e,this.checkAttributeSegments(n,this.state.segments))})),V(this,"onSegmentChange",((e,t)=>{var a;const{query:n}=this.props;let l=this.state.segments.slice(0);if(null!==e.value&&"object"!=typeof e.value&&!Array.isArray(e.value)){const t=String(e.value);e.value={type:t.match(/\${\w+}/gi)?"template":void 0,value:t}}l[t].label!==(null===(a=e.value)||void 0===a?void 0:a.value)&&this.setState({attributes:[]},(()=>e.label===q?(l=(0,E.slice)(l,0,t),void this.checkAttributeSegments([],l).then((()=>{var e;0===l.length?l.push({label:""}):(null===(e=l[l.length-1].value)||void 0===e?void 0:e.expandable)&&l.push({label:"Select Element",value:{value:"-Select Element-"}}),n.isPiPoint&&(this.piServer=[]),this.segmentChangeValue(l)}))):(l[t]=e,n.isPiPoint?(this.piServer.push(e),void this.segmentChangeValue(l)):(t{var a,n;return"template"===(null===(a=e.value)||void 0===a?void 0:a.type)?this.getElementSegments(l.length+1,l).then((e=>(e.length>0&&(l[t].value.expandable=!0,l.push({label:"Select Element",value:{value:"-Select Element-"}})),this.segmentChangeValue(l),l))):((null===(n=e.value)||void 0===n?void 0:n.expandable)&&l.push({label:"Select Element",value:{value:"-Select Element-"}}),new Promise((e=>{this.segmentChangeValue(l),e(l)})))}))))))})),V(this,"getElementSegments",((e,t)=>{var a;const{datasource:n,query:l,data:r}=this.props,i=this,s=l.isPiPoint?{type:"dataserver"}:{path:this.getSegmentPathUpTo(null!=t?t:this.state.segments.slice(0),e),afServerWebId:this.state.segments.length>0&&this.state.segments[0].value?this.state.segments[0].value.webId:void 0};if(!l.isPiPoint){var o,u,h;if((null===(o=n.afserver)||void 0===o?void 0:o.name)&&0===e)return Promise.resolve([{label:n.afserver.name,value:{value:n.afserver.name,expandable:!0}}]);if((null===(u=n.afserver)||void 0===u?void 0:u.name)&&(null===(h=n.afdatabase)||void 0===h?void 0:h.name)&&1===e)return Promise.resolve([{label:n.afdatabase.name,value:{value:n.afdatabase.name,expandable:!0}}])}var m;return n.metricFindQuery(s,Object.assign(null!==(m=null==r||null===(a=r.request)||void 0===a?void 0:a.scopedVars)&&void 0!==m?m:{},{isPiPoint:l.isPiPoint})).then((e=>{const t=(0,E.map)(e,(e=>({label:e.text,value:{webId:e.WebId,value:e.text,expandable:!l.isPiPoint&&e.expandable}})));if(0===t.length)return t;const a=n.templateSrv.getVariables();return(0,E.each)(a,(e=>{let a={label:"${"+e.name+"}",value:{type:"template",value:"${"+e.name+"}",expandable:!l.isPiPoint}};t.unshift(a)})),t.unshift({label:q,value:{value:q}}),t})).catch((e=>(i.error=e.message||"Failed to issue metric query",[])))})),V(this,"getAttributeSegmentsPI",(e=>{var t;const{datasource:a,query:n,data:l}=this.props,r=this,i={path:"",webId:this.getSelectedPIServer(),pointName:(null!=e?e:"")+"*",type:"pipoint"};let s=[];var o;return a.metricFindQuery(i,Object.assign(null!==(o=null==l||null===(t=l.request)||void 0===t?void 0:t.scopedVars)&&void 0!==o?o:{},{isPiPoint:n.isPiPoint})).then((t=>{s=(0,E.map)(t,(e=>({path:e.Path,label:e.text,value:{value:e.text,expandable:!1}}))),e&&e.length>0&&s.unshift({label:e,value:{value:e,expandable:!1}});const l=a.templateSrv.getVariables();return(0,E.each)(l,(e=>{let t={label:"${"+e.name+"}",value:{type:"template",value:"${"+e.name+"}",expandable:!n.isPiPoint}};s.unshift(t)})),s.unshift({label:q,value:{value:q}}),s})).catch((e=>(r.error=e.message||"Failed to issue metric query",s)))})),V(this,"getAttributeSegmentsAF",(e=>{const{datasource:t}=this.props;let a=[];a.push({label:q,value:{value:q}});const n=t.templateSrv.getVariables();return(0,E.each)(n,(e=>{let t={label:"${"+e.name+"}",value:{type:"template",value:"${"+e.name+"}",expandable:!1}};a.push(t)})),(0,E.forOwn)(this.availableAttributes,((e,t)=>{let n={label:t,value:{value:t,expandable:!0}};a.push(n)})),a})),V(this,"buildFromTarget",((e,t,a)=>{const n=e.target.split(";"),l=n.length>0?n[0].split("\\"):[];return l.length>1||1===l.length&&""!==l[0]?(n.splice(0,1),(0,E.each)(l,((e,a)=>{t.push({label:e,value:{type:e.match(/\${\w+}/gi)?"template":void 0,value:e,expandable:!0}})})),(0,E.each)(n,((e,t)=>{""!==e&&a.push({label:e,value:{type:e.match(/\${\w+}/gi)?"template":void 0,value:e,expandable:!1}})})),this.getElementSegments(l.length+1,t).then((e=>(e.length>0&&t.push({label:"Select Element",value:{value:"-Select Element-"}}),t)))):Promise.resolve(t)})),V(this,"checkAfServer",(()=>{var e;const{datasource:t}=this.props,a=[];var n;return(null===(e=t.afserver)||void 0===e?void 0:e.name)?(a.push({label:t.afserver.name,value:{value:t.afserver.name,expandable:!0}}),(null===(n=t.afdatabase)||void 0===n?void 0:n.name)&&a.push({label:t.afdatabase.name,value:{value:t.afdatabase.name,expandable:!0}}),a.push({label:"Select Element",value:{value:"-Select Element-"}})):a.push({label:""}),a})),V(this,"updateArray",((e,t,a,n,l)=>{this.setState({segments:e,attributes:t,summaries:a,isPiPoint:n},(()=>{n||this.checkAttributeSegments(t,this.state.segments).then((()=>{l&&l()}))}))})),V(this,"scopedVarsDone",!1),V(this,"componentDidMount",(()=>{this.initialLoad(!1)})),V(this,"componentDidUpdate",(()=>{var e,t,a;const{query:n}=this.props;"Done"===(null===(e=this.props.data)||void 0===e?void 0:e.state)&&(null===(a=this.props.data)||void 0===a||null===(t=a.request)||void 0===t?void 0:t.scopedVars)&&!this.scopedVarsDone&&(this.scopedVarsDone=!0,this.initialLoad(!n.isPiPoint))})),V(this,"initialLoad",(e=>{const{query:t}=this.props,a=(0,E.defaults)(t,F),{segments:n,attributes:l,summary:r,isPiPoint:i}=a;var s;let o=e?[]:null!==(s=null==n?void 0:n.slice(0))&&void 0!==s?s:[];var u;let h=e?[]:null!==(u=null==l?void 0:l.slice(0))&&void 0!==u?u:[];var m;let c=null!==(m=null==r?void 0:r.types)&&void 0!==m?m:[];if(i||0!==o.length)i&&o.length>0&&(this.piServer=o);else{if(t.target&&t.target.length>0&&";"!==t.target)return h=[],void this.buildFromTarget(t,o,h).then((e=>{this.updateArray(e,h,c,!1)})).catch((e=>console.error(e)));o=this.checkAfServer()}this.updateArray(o,h,c,!!i,(()=>{this.onChange(t)}))})),V(this,"onChange",(e=>{const{onChange:t,onRunQuery:a}=this.props;var n,l;if(e.rawQuery){if(e.target=null!==(n=e.query)&&void 0!==n?n:"",e.query){const{attributes:t,elementPath:a}=function(e){const t=e.split(";"),a=t[0].split("\\");t.splice(0,1);let n=[];if(a.length>1||1===a.length&&""!==a[0]){const e=a.join("\\");return(0,E.each)(t,(function(e,t){""!==e&&n.push({label:e,value:{value:e,expandable:!1}})})),{attributes:n,elementPath:e}}return{attributes:n,elementPath:null}}(e.target);e.attributes=t,e.elementPath=a}}else e.elementPath=this.getSegmentPathUpTo(this.state.segments,this.state.segments.length),e.target=e.elementPath+";"+(0,E.join)(null===(l=e.attributes)||void 0===l?void 0:l.map((e=>{var t;return null===(t=e.value)||void 0===t?void 0:t.value})),";");const r=e.summary;r&&(r.types=this.state.summaries),t(T(W({},e),{summary:r})),this.isValidQuery(e)&&a()})),V(this,"isValidQuery",(e=>{if(e.target&&e.target.length>0&&";"!==e.target){e.target=e.target.trim();const t=e.target.split(";",2);return 2===t.length&&t[0].length>0&&t[1].length>0}return!1})),V(this,"stateCallback",(()=>{const e=this.props.query;this.onChange(e)})),V(this,"onIsPiPointChange",(e=>{const{query:t}=this.props,a=!t.isPiPoint;this.setState({segments:a?[{label:""}]:this.checkAfServer(),attributes:[],isPiPoint:a},(()=>{this.onChange(T(W({},t),{expression:"",attributes:this.state.attributes,segments:this.state.segments,isPiPoint:a}))}))})),V(this,"onHideErrorChange",(e=>{const{query:t}=this.props,a=!t.hideError;this.setState({hideError:a},(()=>{this.onChange(T(W({},t),{hideError:a}))}))})),this.onSegmentChange=this.onSegmentChange.bind(this),this.calcBasisValueChanged=this.calcBasisValueChanged.bind(this),this.recordedBoundaryTypeValueChanged=this.recordedBoundaryTypeValueChanged.bind(this),this.calcNoDataValueChanged=this.calcNoDataValueChanged.bind(this),this.onSummaryAction=this.onSummaryAction.bind(this),this.onSummaryValueChanged=this.onSummaryValueChanged.bind(this),this.onAttributeAction=this.onAttributeAction.bind(this),this.onAttributeChange=this.onAttributeChange.bind(this),this.summaryTypes=["Total","Average","Minimum","Maximum","Range","StdDev","PopulationStdDev","Count","PercentGood","All","AllForNonNumeric"],this.calculationBasis=["TimeWeighted","EventWeighted","TimeWeightedContinuous","TimeWeightedDiscrete","EventWeightedExcludeMostRecentEvent","EventWeightedExcludeEarliestEvent","EventWeightedIncludeBothEnds"],this.recordedBoundaryTypes=["Inside","Outside","Interpolated"],this.noDataReplacement=["Null","Drop","Previous","0","Keep"]}}var U=o(269),M=o(531);function Q(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function $(e){for(var t=1;t{const t=u.target;if(t&&t[e])return{label:t[e].Name,value:t[e]}};var S;return o.getAssetServer(o.afserver.name).then((e=>{g(e.WebId)})),c().createElement(c().Fragment,null,c().createElement("div",{className:"gf-form-group"},c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Database",labelWidth:G,grow:!0},c().createElement(d.AsyncSelect,{key:null!=v?v:"database-key",loadOptions:()=>o.getDatabases(v).then((e=>e.map((e=>({label:e.Name,value:e}))))),loadingMessage:"Loading",value:E("database"),onChange:e=>{f(e.value),h(L($({},s),{database:e.value,template:void 0}))},defaultOptions:!0})),c().createElement(d.InlineField,{label:"Event Frames",labelWidth:G,grow:!0},c().createElement(d.AsyncSelect,{key:null!==(S=null==y?void 0:y.WebId)&&void 0!==S?S:"default-template-key",loadOptions:()=>o.getEventFrameTemplates(null==y?void 0:y.WebId).then((e=>e.map((e=>({label:e.Name,value:e}))))),loadingMessage:"Loading",value:E("template"),onChange:e=>h(L($({},s),{template:e.value})),defaultOptions:!0})),c().createElement(d.InlineField,{label:"Show Start and End Time",labelWidth:G,grow:!0},c().createElement(d.InlineSwitch,{value:!!s.showEndTime,onChange:e=>h(L($({},s),{showEndTime:e.currentTarget.checked}))}))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Category name",labelWidth:G,grow:!0},c().createElement(d.Input,{type:"text",value:s.categoryName,onBlur:e=>p(),onChange:e=>h(L($({},s),{categoryName:e.currentTarget.value})),placeholder:"Enter category name"})),c().createElement(d.InlineField,{label:"Name Filter",labelWidth:G,grow:!0},c().createElement(d.Input,{type:"text",value:s.nameFilter,onBlur:e=>p(),onChange:e=>h(L($({},s),{nameFilter:e.currentTarget.value})),placeholder:"Enter name filter"}))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Enable Name Regex Replacement",labelWidth:G,grow:!1},c().createElement(d.InlineSwitch,{value:null===(a=s.regex)||void 0===a?void 0:a.enable,onChange:e=>h(L($({},s),{regex:L($({},s.regex),{enable:e.currentTarget.checked})}))})),c().createElement(d.InlineField,{label:"Name Filter",labelWidth:20,grow:!1},c().createElement(d.Input,{type:"text",value:null===(n=s.regex)||void 0===n?void 0:n.search,onBlur:e=>p(),onChange:e=>h(L($({},s),{regex:L($({},s.regex),{search:e.currentTarget.value})})),placeholder:"(.*)",width:50})),c().createElement(d.InlineField,{label:"Replace",labelWidth:20,grow:!0},c().createElement(d.Input,{type:"text",value:null==s||null===(l=s.regex)||void 0===l?void 0:l.replace,onBlur:e=>p(),onChange:e=>h(L($({},s),{regex:L($({},s.regex),{replace:e.currentTarget.value})})),placeholder:"$1"}))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Enable Attribute Usage",labelWidth:G,grow:!1},c().createElement(d.InlineSwitch,{value:null===(r=s.attribute)||void 0===r?void 0:r.enable,onChange:e=>h(L($({},s),{attribute:L($({},s.attribute),{enable:e.currentTarget.checked})}))})),c().createElement(d.InlineField,{label:"Attribute Name",labelWidth:G,grow:!0},c().createElement(d.Input,{type:"text",value:null===(i=s.attribute)||void 0===i?void 0:i.name,onBlur:e=>p(),onChange:e=>h(L($({},s),{attribute:L($({},s.attribute),{name:e.currentTarget.value})})),placeholder:"Enter name"})))))}));function _(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function Y(e){for(var t=1;te.substring(1,e.length-2).split(",")[0]))),e.filter=null!==(l=e.filter)&&void 0!==l?l:"*",e.max=null!==(r=e.max)&&void 0!==r?r:1e4,"servers"===e.type?(null===(i=a.afserver)||void 0===i?void 0:i.name)?a.getAssetServer(a.afserver.name).then((e=>[e])).then(A):a.getAssetServers().then(A):"databases"===e.type&&e.afServerWebId?a.getDatabases(e.afServerWebId,{}).then(A):"databases"===e.type?a.getAssetServer(e.path).then((e=>{var t;return a.getDatabases(null!==(t=e.WebId)&&void 0!==t?t:"",{})})).then(A):"databaseElements"===e.type?a.getDatabase(e.path).then((e=>{var t;return a.getDatabaseElements(null!==(t=e.WebId)&&void 0!==t?t:"",{selectedFields:"Items.WebId%3BItems.Name%3BItems.Items%3BItems.Path%3BItems.HasChildren"})})).then(A):"elements"===e.type?a.getElement(e.path).then((t=>{var n;return a.getElements(null!==(n=t.WebId)&&void 0!==n?n:"",{selectedFields:"Items.Description%3BItems.WebId%3BItems.Name%3BItems.Items%3BItems.Path%3BItems.HasChildren",nameFilter:e.filter})})).then(A):"attributes"===e.type?a.getElement(e.path).then((t=>{var n;return a.getAttributes(null!==(n=t.WebId)&&void 0!==n?n:"",{searchFullHierarchy:"true",selectedFields:"Items.Type%3BItems.DefaultUnitsName%3BItems.Description%3BItems.WebId%3BItems.Name%3BItems.Path",nameFilter:e.filter,maxCount:e.max})})).then(A):"dataserver"===e.type?a.getDataServers().then(A):"pipoint"===e.type?a.piPointSearch(e.webId,e.pointName).then(A):Promise.reject("Bad type")}buildQueryParameters(e){return e.targets=(0,E.filter)(e.targets,(e=>{var t;return!(!e||!e.target||0===(null===(t=e.attributes)||void 0===t?void 0:t.length)||";"===e.target||e.hide||e.target.startsWith("Select AF"))})),e.maxDataPoints&&(e.maxDataPoints=e.maxDataPoints>3e4?3e4:e.maxDataPoints),e.targets=(0,E.map)(e.targets,(t=>{var a;const n={enableStreaming:t.enableStreaming,target:this.templateSrv.replace(t.target,e.scopedVars),elementPath:this.templateSrv.replace(t.elementPath,e.scopedVars),attributes:(0,E.map)(t.attributes,(t=>(t.value&&(t.value.value=this.templateSrv.replace(t.value.value,e.scopedVars)),t))),segments:(0,E.map)(t.segments,(t=>(t.value&&(t.value.value=this.templateSrv.replace(t.value.value,e.scopedVars)),t))),isAnnotation:!!t.isAnnotation,display:t.display?this.templateSrv.replace(t.display,e.scopedVars):void 0,refId:t.refId,hide:t.hide,interpolate:t.interpolate?J(Y({},t.interpolate),{interval:this.templateSrv.replace(t.interpolate.interval,e.scopedVars)}):{enable:!1},useLastValue:t.useLastValue||{enable:!1},useUnit:t.useUnit||{enable:!1},recordedValues:t.recordedValues||{enable:!1},digitalStates:t.digitalStates||{enable:!1},webid:null!==(a=t.webid)&&void 0!==a?a:"",regex:t.regex||{enable:!1},expression:t.expression||"",summary:t.summary||{types:[]},startTime:e.range.from,endTime:e.range.to,isPiPoint:!!t.isPiPoint,hideError:!!t.hideError,scopedVars:e.scopedVars};return n.expression&&(n.expression=this.templateSrv.replace(n.expression,e.scopedVars)),void 0!==n.summary.types&&(n.summary.types=(0,E.filter)(n.summary.types,(e=>null!=e&&""!==e)),n.summary.interval=n.summary.interval?this.templateSrv.replace(n.summary.interval,e.scopedVars):n.summary.interval),n})),e}eventFrameToAnnotation(e,t){const a=e.target,n=[],l=Intl.DateTimeFormat().resolvedOptions().locale;return t.forEach((e=>{let t=this.transformDataFrameToMap(e);for(let e=0;eStart: "+new Date(t.time[e]).toLocaleString(l)+"
End: ",t.timeEnd[e]?i+=new Date(t.timeEnd[e]).toLocaleString(l):i+="Eventframe is open";const s={time:t.time[e],timeEnd:a.showEndTime?t.timeEnd[e]:void 0,title:r,id:t.id[e],text:i,tags:["OSISoft PI"]};n.push(s)}})),n}transformDataFrameToMap(e){const t={};return e.fields.forEach((e=>{t[e.name]=e.values.toArray()})),t}restGet(e){return this.getResource(`${e}`).then((e=>e))}getDataServers(){return this.restGet("/dataservers").then((e=>{var t;return null!==(t=e.Items)&&void 0!==t?t:[]}))}getDataServer(e){return e?this.restGet("/dataservers?name="+e).then((e=>e)):Promise.resolve({})}getAssetServers(){return this.restGet("/assetservers").then((e=>{var t;return null!==(t=e.Items)&&void 0!==t?t:[]}))}getAssetServer(e){return e?this.restGet("/assetservers?path=\\\\"+e).then((e=>e)):Promise.resolve({})}getDatabase(e){return e?this.restGet("/assetdatabases?path=\\\\"+e).then((e=>e)):Promise.resolve({})}getDatabases(e,t){return e?this.restGet("/assetservers/"+e+"/assetdatabases").then((e=>{var t;return null!==(t=e.Items)&&void 0!==t?t:[]})):Promise.resolve([])}getElement(e){return e?this.restGet("/elements?path=\\\\"+e).then((e=>e)):Promise.resolve({})}getEventFrameTemplates(e){return e?this.restGet("/assetdatabases/"+e+"/elementtemplates?selectedFields=Items.InstanceType%3BItems.Name%3BItems.WebId").then((e=>{var t;return(0,E.filter)(null!==(t=e.Items)&&void 0!==t?t:[],(e=>"EventFrame"===e.InstanceType))})):Promise.resolve([])}getElementTemplates(e){return e?this.restGet("/assetdatabases/"+e+"/elementtemplates?selectedFields=Items.InstanceType%3BItems.Name%3BItems.WebId").then((e=>{var t;return(0,E.filter)(null!==(t=e.Items)&&void 0!==t?t:[],(e=>"Element"===e.InstanceType))})):Promise.resolve([])}getAttributes(e,t){let a="?"+(0,E.map)(t,((e,t)=>t+"="+e)).join("&");return"?"===a&&(a=""),this.restGet("/elements/"+e+"/attributes"+a).then((e=>{var t;return null!==(t=e.Items)&&void 0!==t?t:[]}))}getDatabaseElements(e,t){let a="?"+(0,E.map)(t,((e,t)=>t+"="+e)).join("&");return"?"===a&&(a=""),this.restGet("/assetdatabases/"+e+"/elements"+a).then((e=>{var t;return null!==(t=e.Items)&&void 0!==t?t:[]}))}getElements(e,t){let a="?"+(0,E.map)(t,((e,t)=>t+"="+e)).join("&");return"?"===a&&(a=""),this.restGet("/elements/"+e+"/elements"+a).then((e=>{var t;return null!==(t=e.Items)&&void 0!==t?t:[]}))}piPointSearch(e,t){let a=this.templateSrv.replace(t),n=`${a}`,l=!1;if(a!==t){const e=/\{(\w|,)+\}/g;let t;for(;null!==(t=e.exec(a));)t.index===e.lastIndex&&e.lastIndex++,t.forEach(((e,t)=>{0===t&&(a=a.replace(e,e.replace("{","(").replace("}",")").replace(",","|")),n=n.replace(e,"*"),l=!0)}))}return this.restGet("/dataservers/"+e+"/points?maxCount=100&nameFilter="+n).then((e=>e&&(null==e?void 0:e.Items)?l?e.Items.filter((e=>{var t;return null===(t=e.Name)||void 0===t?void 0:t.match(a)})):e.Items:[]))}constructor(e,t=(0,M.getTemplateSrv)()){super(e),_(this,"templateSrv",void 0),_(this,"piserver",void 0),_(this,"afserver",void 0),_(this,"afdatabase",void 0),_(this,"piPointConfig",void 0),_(this,"newFormatConfig",void 0),_(this,"useUnitConfig",void 0),_(this,"useExperimental",void 0),_(this,"useStreaming",void 0),this.templateSrv=t,this.piserver={name:(e.jsonData||{}).piserver,webid:void 0},this.afserver={name:(e.jsonData||{}).afserver,webid:void 0},this.afdatabase={name:(e.jsonData||{}).afdatabase,webid:void 0},this.piPointConfig=e.jsonData.pipoint||!1,this.newFormatConfig=e.jsonData.newFormat||!1,this.useUnitConfig=e.jsonData.useUnit||!1,this.useExperimental=e.jsonData.useExperimental||!1,this.useStreaming=e.jsonData.useStreaming||!1,this.annotations={QueryEditor:H,prepareQuery:e=>(e.target&&(e.target.queryType="Annotation",e.target.isAnnotation=!0),e.target),processEvents:(e,t)=>(0,U.of)(this.eventFrameToAnnotation(e,t))},Promise.all([this.getDataServer(this.piserver.name).then((e=>this.piserver.webid=e.WebId)),this.getAssetServer(this.afserver.name).then((e=>this.afserver.webid=e.WebId)),this.getDatabase(this.afserver.name&&this.afdatabase.name?this.afserver.name+"\\"+this.afdatabase.name:void 0).then((e=>this.afdatabase.webid=e.WebId))])}}const z=new h.DataSourcePlugin(K).setQueryEditor(R).setConfigEditor(f);return u})())); //# sourceMappingURL=module.js.map \ No newline at end of file diff --git a/dist/module.js.map b/dist/module.js.map index 93bf853..82c3845 100644 --- a/dist/module.js.map +++ b/dist/module.js.map @@ -1 +1 @@ -{"version":3,"file":"module.js","mappings":"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","sources":["webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"@grafana/data\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"@grafana/runtime\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"@grafana/ui\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"lodash\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"react\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"rxjs\"","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/bootstrap","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/runtime/compat get default export","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/runtime/define property getters","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/runtime/hasOwnProperty shorthand","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/runtime/make namespace object","webpack://gridprotectionalliance-osisoftpi-datasource/./config/ConfigEditor.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./components/Forms.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./types.ts","webpack://gridprotectionalliance-osisoftpi-datasource/./components/QueryEditorModeSwitcher.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./helper.ts","webpack://gridprotectionalliance-osisoftpi-datasource/./query/QueryEditor.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./query/AnnotationsQueryEditor.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./datasource.ts","webpack://gridprotectionalliance-osisoftpi-datasource/./module.ts"],"sourcesContent":["module.exports = __WEBPACK_EXTERNAL_MODULE__781__;","module.exports = __WEBPACK_EXTERNAL_MODULE__531__;","module.exports = __WEBPACK_EXTERNAL_MODULE__7__;","module.exports = __WEBPACK_EXTERNAL_MODULE__241__;","module.exports = __WEBPACK_EXTERNAL_MODULE__959__;","module.exports = __WEBPACK_EXTERNAL_MODULE__269__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import React, { ChangeEvent, PureComponent } from 'react';\nimport { LegacyForms, DataSourceHttpSettings, InlineField, InlineSwitch } from '@grafana/ui';\nimport { DataSourcePluginOptionsEditorProps, DataSourceJsonData, DataSourceSettings } from '@grafana/data';\nimport { PIWebAPIDataSourceJsonData } from '../types';\n\nconst { FormField } = LegacyForms;\n\ninterface Props extends DataSourcePluginOptionsEditorProps {}\n\nconst coerceOptions = (\n options: DataSourceSettings\n): DataSourceSettings => {\n return {\n ...options,\n jsonData: {\n ...options.jsonData,\n url: options.url,\n },\n };\n};\n\ninterface State {}\n\nexport class PIWebAPIConfigEditor extends PureComponent {\n onPIServerChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n piserver: event.target.value,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onAFServerChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n afserver: event.target.value,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onAFDatabaseChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n afdatabase: event.target.value,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onHttpOptionsChange = (options: DataSourceSettings) => {\n const { onOptionsChange } = this.props;\n onOptionsChange(coerceOptions(options));\n };\n\n onPiPointChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n piserver: event.target.checked ? options.jsonData.piserver : '',\n pipoint: event.target.checked,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onNewFormatChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n newFormat: event.target.checked,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onUseUnitChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n useUnit: event.target.checked,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onUseExperimentalChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n useExperimental : event.target.checked,\n useStreaming : event.target.checked ? options.jsonData.useStreaming : false,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onUseStreamingChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n useStreaming: event.target.checked,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n render() {\n const { options: originalOptions } = this.props;\n const options = coerceOptions(originalOptions);\n\n return (\n
\n \n\n

Custom Configuration

\n\n
\n
\n \n \n \n
\n
\n \n \n \n
\n
\n \n \n \n
\n
\n \n \n \n
\n {options.jsonData.useExperimental && (\n
\n \n \n \n
\n )}\n
\n\n

PI/AF Connection Details

\n\n
\n {options.jsonData.pipoint && (\n
\n \n
\n )}\n
\n \n
\n
\n \n
\n
\n
\n );\n }\n}\n","import React, { InputHTMLAttributes, FunctionComponent } from 'react';\nimport { InlineFormLabel } from '@grafana/ui';\n\nexport interface Props extends InputHTMLAttributes {\n label: string;\n tooltip?: string;\n labelWidth?: number;\n children?: React.ReactNode;\n queryEditor?: JSX.Element;\n}\n\nexport const QueryField: FunctionComponent> = ({ label, labelWidth = 12, tooltip, children }) => (\n <>\n \n {label}\n \n {children}\n \n);\n\nexport const QueryRowTerminator = () => {\n return (\n
\n
\n
\n );\n};\n\nexport const QueryInlineField = ({ ...props }) => {\n return (\n \n \n \n );\n};\n\nexport const QueryEditorRow = (props: Partial) => {\n return (\n
\n {props.children}\n \n
\n );\n};\n\nexport const QueryRawInlineField = ({ ...props }) => {\n return (\n \n \n \n );\n};\n\nexport const QueryRawEditorRow = (props: Partial) => {\n return <>{props.children};\n};\n","import { DataQuery } from '@grafana/schema';\nimport { DataSourceJsonData, SelectableValue } from '@grafana/data';\n\nexport interface PiwebapiElementPath {\n path: string;\n variable: string;\n}\n\nexport interface PiwebapiInternalRsp {\n data: PiwebapiRsp;\n status: number;\n url: string;\n}\n\nexport interface PiwebapiRsp {\n Name?: string;\n InstanceType?: string;\n Items?: PiwebapiRsp[];\n WebId?: string;\n HasChildren?: boolean;\n Type?: string;\n DefaultUnitsName?: string;\n Description?: string;\n Path?: string;\n}\n\nexport interface PiDataServer {\n name: string | undefined;\n webid: string | undefined;\n}\n\nexport interface PIWebAPISelectableValue {\n webId?: string;\n value?: string;\n type?: string;\n expandable?: boolean;\n}\n\nexport interface PIWebAPIAnnotationsQuery extends DataQuery {\n target: string;\n}\n\nexport interface PIWebAPIQuery extends DataQuery {\n target?: string;\n elementPath?: string;\n attributes?: Array>;\n segments?: any[];\n isPiPoint?: boolean;\n isAnnotation?: boolean;\n webid?: string;\n display?: any;\n interpolate?: any;\n recordedValues?: any;\n digitalStates?: any;\n enableStreaming: any;\n useLastValue?: any;\n useUnit?: any;\n regex?: any;\n summary?: {nodata?: string, types?: any[], basis?: string, interval?: string};\n expression?: string;\n rawQuery?: boolean;\n query?: string;\n // annotations items\n database?: PiwebapiRsp;\n template?: PiwebapiRsp;\n showEndTime?: boolean;\n attribute?: any;\n nameFilter?: string;\n categoryName?: string;\n}\n\nexport const defaultQuery: Partial = {\n target: ';',\n attributes: [],\n segments: [],\n regex: { enable: false },\n summary: { types: [], basis: 'EventWeighted', interval: '', nodata: 'Null' },\n expression: '',\n interpolate: { enable: false },\n useLastValue: { enable: false },\n recordedValues: { enable: false },\n digitalStates: { enable: false },\n enableStreaming: { enable: false },\n useUnit: { enable: false },\n isPiPoint: false,\n};\n\n/**\n * These are options configured for each DataSource instance\n */\nexport interface PIWebAPIDataSourceJsonData extends DataSourceJsonData {\n url?: string;\n access?: string;\n piserver?: string;\n afserver?: string;\n afdatabase?: string;\n pipoint?: boolean;\n newFormat?: boolean;\n useUnit?: boolean;\n useExperimental?: boolean;\n useStreaming?: boolean;\n}\n\n/**\n * Value that is used in the backend, but never sent over HTTP to the frontend\n */\nexport interface PIWebAPISecureJsonData {\n apiKey?: string;\n}\n","import React, { useEffect, useState } from 'react';\nimport { Button, ConfirmModal } from '@grafana/ui';\n\ntype Props = {\n isRaw: boolean;\n onChange: (newIsRaw: boolean) => void;\n};\n\nexport const QueryEditorModeSwitcher = ({ isRaw, onChange }: Props): JSX.Element => {\n const [isModalOpen, setModalOpen] = useState(false);\n\n useEffect(() => {\n // if the isRaw changes, we hide the modal\n setModalOpen(false);\n }, [isRaw]);\n\n if (isRaw) {\n return (\n <>\n {\n // we show the are-you-sure modal\n setModalOpen(true);\n }}\n >\n {\n onChange(false);\n }}\n onDismiss={() => {\n setModalOpen(false);\n }}\n />\n \n );\n } else {\n return (\n {\n onChange(true);\n }}\n >\n );\n }\n};\n","import { each, map } from 'lodash';\r\n\r\nimport {\r\n AnnotationQuery,\r\n DataFrame,\r\n TableData,\r\n MetricFindValue,\r\n Field,\r\n toDataFrame,\r\n} from '@grafana/data';\r\n\r\nimport { PiwebapiElementPath, PiwebapiRsp, PIWebAPIQuery } from 'types';\r\n\r\nexport function parseRawQuery(tr: string): any {\r\n const splitAttributes = tr.split(';');\r\n const splitElements = splitAttributes[0].split('\\\\');\r\n\r\n // remove element hierarchy from attribute collection\r\n splitAttributes.splice(0, 1);\r\n\r\n let attributes: any[] = [];\r\n if (splitElements.length > 1 || (splitElements.length === 1 && splitElements[0] !== '')) {\r\n const elementPath: string = splitElements.join('\\\\');\r\n each(splitAttributes, function (item, index) {\r\n if (item !== '') {\r\n attributes.push({\r\n label: item,\r\n value: {\r\n value: item,\r\n expandable: false,\r\n },\r\n });\r\n }\r\n });\r\n\r\n return { attributes, elementPath };\r\n }\r\n\r\n return { attributes, elementPath: null };\r\n}\r\n\r\nexport function lowerCaseFirstLetter(string: string): string {\r\n return string.charAt(0).toLocaleLowerCase() + string.slice(1);\r\n}\r\n\r\n/**\r\n * Builds the Grafana metric segment for use on the query user interface.\r\n *\r\n * @param {any} response - response from PI Web API.\r\n * @returns - Grafana metric segment.\r\n *\r\n * @memberOf PiWebApiDatasource\r\n */\r\nexport function metricQueryTransform(response: PiwebapiRsp[]): MetricFindValue[] {\r\n return map(response, (item) => {\r\n return {\r\n text: item.Name,\r\n expandable:\r\n item.HasChildren === undefined || item.HasChildren === true || (item.Path ?? '').split('\\\\').length <= 3,\r\n HasChildren: item.HasChildren,\r\n Items: item.Items ?? [],\r\n Path: item.Path,\r\n WebId: item.WebId,\r\n } as MetricFindValue;\r\n });\r\n}\r\n\r\n/**\r\n * Check if all items are selected.\r\n *\r\n * @param {any} current the current variable selection\r\n * @return {boolean} true if all value is selected, false otherwise\r\n */\r\nexport function isAllSelected(current: any): boolean {\r\n if (!current) {\r\n return false;\r\n }\r\n if (Array.isArray(current.text)) {\r\n return current.text.indexOf('All') >= 0;\r\n }\r\n return current.text === 'All';\r\n}\r\n\r\nexport function processAnnotationQuery(annon: AnnotationQuery,data: DataFrame[]): DataFrame[] {\r\n let processedFrames: DataFrame[] = [];\r\n \r\n data.forEach((d: DataFrame) => {\r\n d.fields.forEach((f: Field) => {\r\n\r\n // check if the label has been set, if it hasn't been set then the eventframe annotation is not valid. \r\n if (!f.labels) { \r\n return \r\n }\r\n\r\n if (!('eventframe' in f.labels)) {\r\n return;\r\n }\r\n\r\n let attribute = 'attribute' in f.labels\r\n\r\n // Check whether f.values is an array or not to allow for each.\r\n // Check whether f.values is an array or not to allow for each.\r\n if (Array.isArray(f.values)) {\r\n f.values.forEach((value: any) => {\r\n\r\n if (attribute) {\r\n let annotation = value['1'].Content\r\n let valueData: any[] = []\r\n for (let i = 2; i in value; i++) {\r\n valueData.push(value[i].Content.Items)\r\n }\r\n\r\n const processedFrame = convertToTableData(annotation.Items!, valueData).map((r) => {\r\n return toDataFrame(r)});\r\n processedFrames = processedFrames.concat(processedFrame);\r\n } else {\r\n let annotation = value['1'].Content\r\n const processedFrame = convertToTableData(annotation.Items!).map((r) => {\r\n return toDataFrame(r)});\r\n processedFrames = processedFrames.concat(processedFrame);\r\n }\r\n });\r\n } \r\n });\r\n });\r\n return processedFrames;\r\n}\r\n\r\nexport function convertToTableData(items: any[], valueData?: any[]): TableData[] {\r\n const response: TableData[] = items.map((item: any, index: number) => {\r\n const columns = [{ text: 'StartTime' }, { text: 'EndTime' }];\r\n const rows = [item.StartTime, item.EndTime];\r\n if (valueData) {\r\n for (let attributeIndex = 0; attributeIndex < valueData.length; attributeIndex++) {\r\n let attributeData = valueData[attributeIndex]\r\n let eventframeAributeData = attributeData[index].Content.Items\r\n eventframeAributeData.forEach((attribute: any) => {\r\n columns.push({ text: attribute.Name });\r\n rows.push(String(attribute.Value.Value ? attribute.Value.Value.Name || attribute.Value.Value.Value || attribute.Value.Value : ''));\r\n });\r\n }\r\n }\r\n\r\n return {\r\n name: item.Name,\r\n columns,\r\n rows: [rows],\r\n };\r\n });\r\n return response;\r\n}\r\n\r\n/**\r\n * Resolve PIWebAPI response 'value' data to value - timestamp pairs.\r\n *\r\n * @param {any} item - 'Item' object from PIWebAPI\r\n * @param {any} noDataReplacementMode - String state of how to replace 'No Data'\r\n * @param {any} grafanaDataPoint - Single Grafana value pair (value, timestamp).\r\n * @returns grafanaDataPoint - Single Grafana value pair (value, timestamp).\r\n * @returns perviousValue - {any} Grafana value (value only).\r\n *\r\n */\r\nexport function noDataReplace(\r\n item: any,\r\n noDataReplacementMode: any,\r\n grafanaDataPoint: any[]\r\n): {\r\n grafanaDataPoint: any[];\r\n previousValue: any;\r\n drop: boolean;\r\n} {\r\n let previousValue = null;\r\n let drop = false;\r\n if (!item.Good || item.Value === 'No Data' || (item.Value?.Name && item.Value?.Name === 'No Data')) {\r\n if (noDataReplacementMode === 'Drop') {\r\n drop = true;\r\n } else if (noDataReplacementMode === '0') {\r\n grafanaDataPoint[0] = 0;\r\n } else if (noDataReplacementMode === 'Keep') {\r\n // Do nothing keep\r\n } else if (noDataReplacementMode === 'Null') {\r\n grafanaDataPoint[0] = null;\r\n } else if (noDataReplacementMode === 'Previous' && previousValue !== null) {\r\n grafanaDataPoint[0] = previousValue;\r\n }\r\n } else {\r\n previousValue = item.Value;\r\n }\r\n return { grafanaDataPoint, previousValue, drop };\r\n}\r\n\r\n/**\r\n * Check if the value is a number.\r\n *\r\n * @param {any} number the value to check\r\n * @returns {boolean} true if the value is a number, false otherwise\r\n */\r\nexport function checkNumber(number: any): boolean {\r\n return typeof number === 'number' && !Number.isNaN(number) && Number.isFinite(number);\r\n}\r\n\r\n/**\r\n * Returns the last item of the element path.\r\n *\r\n * @param {string} path element path\r\n * @returns {string} last item of the element path\r\n */\r\nexport function getLastPath(path: string): string {\r\n let splitPath = path.split('|');\r\n if (splitPath.length === 0) {\r\n return '';\r\n }\r\n splitPath = splitPath[0].split('\\\\');\r\n return splitPath.length === 0 ? '' : splitPath.pop() ?? '';\r\n}\r\n\r\n/**\r\n * Returns the last item of the element path plus variable.\r\n *\r\n * @param {PiwebapiElementPath[]} elementPathArray array of element paths\r\n * @param {string} path element path\r\n * @returns {string} last item of the element path\r\n */\r\nexport function getPath(elementPathArray: PiwebapiElementPath[], path: string): string {\r\n if (!path || elementPathArray.length === 0) {\r\n return '';\r\n }\r\n const splitStr = getLastPath(path);\r\n const foundElement = elementPathArray.find((e) => path.indexOf(e.path) >= 0)?.variable;\r\n return foundElement ? foundElement + '|' + splitStr : splitStr;\r\n}\r\n\r\n/**\r\n * Replace calculation dot in expression with PI point name.\r\n *\r\n * @param {boolean} replace - is pi point and calculation.\r\n * @param {PiwebapiRsp} webid - Pi web api response object.\r\n * @param {string} url - original url.\r\n * @returns Modified url\r\n */\r\nexport function getFinalUrl(replace: boolean, webid: PiwebapiRsp, url: string) {\r\n const newUrl = replace ? url.replace(/'\\.'/g, `'${webid.Name}'`) : url;\r\n return newUrl;\r\n}\r\n","import { each, filter, forOwn, join, reduce, map, slice, remove, defaults } from 'lodash';\n\nimport React, { PureComponent, ChangeEvent } from 'react';\nimport { Icon, InlineField, InlineFieldRow, InlineSwitch, Input, SegmentAsync, Segment } from '@grafana/ui';\nimport { QueryEditorProps, SelectableValue, TypedVariableModel } from '@grafana/data';\n\nimport { PiWebAPIDatasource } from '../datasource';\nimport { QueryInlineField, QueryRawInlineField, QueryRowTerminator } from '../components/Forms';\nimport { PIWebAPISelectableValue, PIWebAPIDataSourceJsonData, PIWebAPIQuery, defaultQuery } from '../types';\nimport { QueryEditorModeSwitcher } from 'components/QueryEditorModeSwitcher';\nimport { parseRawQuery } from 'helper';\n\nconst LABEL_WIDTH = 24;\nconst MIN_ELEM_INPUT_WIDTH = 200;\nconst MIN_ATTR_INPUT_WIDTH = 250;\n\ninterface State {\n isPiPoint: boolean;\n segments: Array>;\n attributes: Array>;\n summaries: Array>;\n attributeSegment: SelectableValue;\n summarySegment: SelectableValue;\n calculationBasisSegment: SelectableValue;\n noDataReplacementSegment: SelectableValue;\n}\n\ntype Props = QueryEditorProps;\n\nconst REMOVE_LABEL = '-REMOVE-';\n\nconst CustomLabelComponent = (props: any) => {\n if (props.value) {\n return (\n
\n {props.label ?? '--no label--'}\n
\n );\n }\n return (\n \n \n \n );\n};\n\nexport class PIWebAPIQueryEditor extends PureComponent {\n error: any;\n piServer: any[] = [];\n availableAttributes: any = {};\n summaryTypes: string[];\n calculationBasis: string[];\n noDataReplacement: string[];\n state: State = {\n isPiPoint: false,\n segments: [],\n attributes: [],\n summaries: [],\n attributeSegment: {},\n summarySegment: {},\n calculationBasisSegment: {},\n noDataReplacementSegment: {},\n };\n\n constructor(props: any) {\n super(props);\n this.onSegmentChange = this.onSegmentChange.bind(this);\n this.calcBasisValueChanged = this.calcBasisValueChanged.bind(this);\n this.calcNoDataValueChanged = this.calcNoDataValueChanged.bind(this);\n this.onSummaryAction = this.onSummaryAction.bind(this);\n this.onSummaryValueChanged = this.onSummaryValueChanged.bind(this);\n this.onAttributeAction = this.onAttributeAction.bind(this);\n this.onAttributeChange = this.onAttributeChange.bind(this);\n\n this.summaryTypes = [\n // 'None', // A summary type is not specified.\n 'Total', // A totalization over the time range.\n 'Average', // The average value over the time range.\n 'Minimum', // The minimum value over the time range.\n 'Maximum', // The maximum value over the time range.\n 'Range', // The range value over the time range (minimum-maximum).\n 'StdDev', // The standard deviation over the time range.\n 'PopulationStdDev', // The population standard deviation over the time range.\n 'Count', // The sum of event count over the time range when calculation basis is event weighted. The sum of event time duration over the time range when calculation basis is time weighted.\n 'PercentGood', // Percent of data with good value during the calculation period. For time weighted calculations, the percentage is based on time. For event weighted calculations, the percent is based on event count.\n 'All', // A convenience for requesting all available summary calculations.\n 'AllForNonNumeric', // A convenience for requesting all available summary calculations for non-numeric data.\n ];\n\n this.calculationBasis = [\n 'TimeWeighted', // Weight the values in the calculation by the time over which they apply. Interpolation is based on whether the attribute is stepped. Interpolated events are generated at the boundaries if necessary.\n 'EventWeighted', // Evaluate values with equal weighting for each event. No interpolation is done. There must be at least one event within the time range to perform a successful calculation. Two events are required for standard deviation. In handling events at the boundary of the calculation, the AFSDK uses following rules:\n 'TimeWeightedContinuous', // Apply weighting as in TimeWeighted, but do all interpolation between values as if they represent continuous data, (standard interpolation) regardless of whether the attribute is stepped.\n 'TimeWeightedDiscrete', // Apply weighting as in TimeWeighted but interpolation between values is performed as if they represent discrete, unrelated values (stair step plot) regardless of the attribute is stepped.\n 'EventWeightedExcludeMostRecentEvent', // The calculation behaves the same as _EventWeighted_, except in the handling of events at the boundary of summary intervals in a multiple intervals calculation. Use this option to prevent events at the intervals boundary from being double count at both intervals. With this option, events at the end time (most recent time) of an interval is not used in that interval.\n 'EventWeightedExcludeEarliestEvent', // Similar to the option _EventWeightedExcludeMostRecentEvent_. Events at the start time(earliest time) of an interval is not used in that interval.\n 'EventWeightedIncludeBothEnds', // Events at both ends of the interval boundaries are included in the event weighted calculation.\n ];\n\n this.noDataReplacement = [\n 'Null', // replace with nulls\n 'Drop', // drop items\n 'Previous', // use previous value if available\n '0', // replace with 0\n 'Keep', // Keep value\n ];\n }\n\n // is selected segment empty\n isValueEmpty(value: PIWebAPISelectableValue | undefined) {\n return !value || !value.value || !value.value.length || value.value === REMOVE_LABEL;\n }\n\n segmentChangeValue = (segments: Array>) => {\n const query = this.props.query;\n this.setState({ segments }, () => this.onChange({ ...query, segments }));\n };\n\n attributeChangeValue = (attributes: Array>): Promise => {\n const query = this.props.query;\n return new Promise((resolve) => this.setState({ attributes }, () => {\n this.onChange({ ...query, attributes })\n resolve();\n }));\n };\n\n // summary calculation basis change event\n calcBasisValueChanged(segment: SelectableValue) {\n const metricsQuery = this.props.query as PIWebAPIQuery;\n const summary = metricsQuery.summary;\n if (summary) {\n summary.basis = segment.value?.value;\n }\n this.onChange({ ...metricsQuery, summary });\n }\n // get summary calculation basis user interface segments\n getCalcBasisSegments() {\n const segments = map(this.calculationBasis, (item: string) => {\n let selectableValue: SelectableValue = {\n label: item,\n value: {\n value: item,\n expandable: true,\n },\n };\n return selectableValue;\n });\n return segments;\n }\n\n // no data change event\n calcNoDataValueChanged(segment: SelectableValue) {\n const metricsQuery = this.props.query as PIWebAPIQuery;\n const summary = metricsQuery.summary;\n if (summary) {\n summary.nodata = segment.value?.value;\n }\n this.onChange({ ...metricsQuery, summary });\n }\n // get no data user interface segments\n getNoDataSegments() {\n const segments = map(this.noDataReplacement, (item: string) => {\n let selectableValue: SelectableValue = {\n label: item,\n value: {\n value: item,\n expandable: true,\n },\n };\n return selectableValue;\n });\n return segments;\n }\n\n // summary query change event\n onSummaryValueChanged(item: SelectableValue, index: number) {\n const summaries = this.state.summaries.slice(0) as Array>;\n summaries[index] = item;\n if (this.isValueEmpty(item.value)) {\n summaries.splice(index, 1);\n }\n this.setState({ summaries }, this.stateCallback);\n }\n // get the list of summaries available\n getSummarySegments() {\n const summaryTypes = filter(this.summaryTypes, (type) => {\n return this.state.summaries.map((s) => s.value?.value).indexOf(type) === -1;\n });\n\n const segments = map(summaryTypes, (item: string) => {\n let selectableValue: SelectableValue = {\n label: item,\n value: {\n value: item,\n expandable: true,\n },\n };\n return selectableValue;\n });\n\n segments.unshift({\n label: REMOVE_LABEL,\n value: {\n value: REMOVE_LABEL,\n },\n });\n\n return segments;\n }\n\n // remove a summary from the user interface and the query\n removeSummary(part: SelectableValue) {\n const summaries = filter(this.state.summaries, (item: SelectableValue) => {\n return item !== part;\n });\n this.setState({ summaries });\n }\n // add a new summary to the query\n onSummaryAction(item: SelectableValue) {\n const summaries = this.state.summaries.slice(0) as Array>;\n // if value is not empty, add new attribute segment\n if (!this.isValueEmpty(item.value)) {\n let selectableValue: SelectableValue = {\n label: item.label,\n value: {\n value: item.value?.value,\n expandable: true,\n },\n };\n summaries.push(selectableValue);\n }\n this.setState({ summarySegment: {}, summaries }, this.stateCallback);\n }\n\n // remove an attribute from the query\n removeAttribute(part: SelectableValue) {\n const attributes = filter(this.state.attributes, (item: SelectableValue) => {\n return item !== part;\n });\n this.attributeChangeValue(attributes);\n }\n // add an attribute to the query\n onAttributeAction(item: SelectableValue) {\n const { query } = this.props;\n const attributes = this.state.attributes.slice(0);\n // if value is not empty, add new attribute segment\n if (!this.isValueEmpty(item.value)) {\n let selectableValue: SelectableValue = {\n label: item.label,\n value: {\n value: item.value?.value,\n expandable: !query.isPiPoint,\n },\n };\n attributes.push(selectableValue);\n }\n this.attributeChangeValue(attributes);\n }\n\n // pi point change event\n onPiPointChange = (item: SelectableValue, index: number) => {\n let attributes = this.state.attributes.slice(0);\n\n if (item.label === REMOVE_LABEL) {\n remove(attributes, (value, n) => n === index);\n } else {\n // set current value\n attributes[index] = item;\n }\n\n this.checkPiPointSegments(item, attributes);\n };\n // attribute change event\n onAttributeChange = (item: SelectableValue, index: number) => {\n let attributes = this.state.attributes.slice(0);\n\n // ignore if no change\n if (attributes[index].label === item.value?.value) {\n return;\n }\n\n // set current value\n attributes[index] = item;\n\n this.checkAttributeSegments(attributes, this.state.segments);\n };\n // segment change\n onSegmentChange = (item: SelectableValue, index: number) => {\n const { query } = this.props;\n let segments = this.state.segments.slice(0);\n\n // ignore if no change\n if (segments[index].label === item.value?.value) {\n return;\n }\n\n // reset attributes list\n this.setState({ attributes: [] }, () => {\n if (item.label === REMOVE_LABEL) {\n segments = slice(segments, 0, index);\n this.checkAttributeSegments([], segments).then(() => {\n if (segments.length === 0) {\n segments.push({\n label: '',\n });\n } else if (!!segments[segments.length - 1].value?.expandable) {\n segments.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n if (query.isPiPoint) {\n this.piServer = [];\n }\n this.segmentChangeValue(segments);\n });\n return;\n }\n\n // set current value\n segments[index] = item;\n\n // Accept only one PI server\n if (query.isPiPoint) {\n this.piServer.push(item);\n this.segmentChangeValue(segments);\n return;\n }\n\n // changed internal selection\n if (index < segments.length - 1) {\n segments = slice(segments, 0, index + 1);\n }\n this.checkAttributeSegments([], segments).then((): Promise>> => {\n // add new options\n if (item.value?.type === 'template') { // if it's a variable we need to check for new elements\\\n return this.getElementSegments(segments.length + 1, segments).then((elements) => {\n if (elements.length > 0) {\n segments.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n this.segmentChangeValue(segments);\n return segments;\n });\n } else if (!!item.value?.expandable) {\n segments.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n return new Promise((resolve) => {\n this.segmentChangeValue(segments);\n resolve(segments);\n });\n });\n });\n };\n\n // get a ui segment for the attributes\n getElementSegments = (\n index: number,\n currentSegment?: Array>\n ): Promise>> => {\n const { datasource, query, data } = this.props;\n const ctrl = this;\n const findQuery = query.isPiPoint\n ? { type: 'dataserver' }\n : {\n path: this.getSegmentPathUpTo(currentSegment ?? this.state.segments.slice(0), index),\n afServerWebId: this.state.segments.length > 0 && this.state.segments[0].value ? this.state.segments[0].value.webId : undefined,\n };\n\n if (!query.isPiPoint) {\n if (datasource.afserver?.name && index === 0) {\n return Promise.resolve([\n {\n label: datasource.afserver.name,\n value: {\n value: datasource.afserver.name,\n expandable: true,\n },\n },\n ]);\n }\n if (datasource.afserver?.name && datasource.afdatabase?.name && index === 1) {\n return Promise.resolve([\n {\n label: datasource.afdatabase.name,\n value: {\n value: datasource.afdatabase.name,\n expandable: true,\n },\n },\n ]);\n }\n }\n return datasource\n .metricFindQuery(findQuery, Object.assign(data?.request?.scopedVars ?? {}, { isPiPoint: query.isPiPoint }))\n .then((items: any[]) => {\n const altSegments = map(items, (item: any) => {\n let selectableValue: SelectableValue = {\n label: item.text,\n value: {\n webId: item.WebId,\n value: item.text,\n expandable: !query.isPiPoint && item.expandable,\n },\n };\n return selectableValue;\n });\n\n if (altSegments.length === 0) {\n return altSegments;\n }\n\n // add template variables\n const variables = datasource.templateSrv.getVariables();\n each(variables, (variable: TypedVariableModel) => {\n let selectableValue: SelectableValue = {\n label: '${' + variable.name + '}',\n value: {\n type: 'template',\n value: '${' + variable.name + '}',\n expandable: !query.isPiPoint,\n },\n };\n altSegments.unshift(selectableValue);\n });\n\n // add remove label\n altSegments.unshift({\n label: REMOVE_LABEL,\n value: {\n value: REMOVE_LABEL,\n },\n });\n\n return altSegments;\n })\n .catch((err: any) => {\n ctrl.error = err.message || 'Failed to issue metric query';\n return [];\n });\n };\n\n // get the list of attributes for the user interface - PI\n getAttributeSegmentsPI = (attributeText?: string): Promise>> => {\n const { datasource, query, data } = this.props;\n const ctrl = this;\n const findQuery = {\n path: '',\n webId: this.getSelectedPIServer(),\n pointName: (attributeText ?? '') + '*',\n type: 'pipoint',\n };\n let segments: Array> = [];\n return datasource\n .metricFindQuery(findQuery, Object.assign(data?.request?.scopedVars ?? {}, { isPiPoint: query.isPiPoint }))\n .then((items: any[]) => {\n segments = map(items, (item: any) => {\n let selectableValue: SelectableValue = {\n path: item.Path,\n label: item.text,\n value: {\n value: item.text,\n expandable: false,\n },\n };\n return selectableValue;\n });\n if (!!attributeText && attributeText.length > 0) {\n segments.unshift({\n label: attributeText,\n value: {\n value: attributeText,\n expandable: false,\n },\n });\n }\n // add template variables\n const variables = datasource.templateSrv.getVariables();\n each(variables, (variable: TypedVariableModel) => {\n let selectableValue: SelectableValue = {\n label: '${' + variable.name + '}',\n value: {\n type: 'template',\n value: '${' + variable.name + '}',\n expandable: !query.isPiPoint,\n },\n };\n segments.unshift(selectableValue);\n });\n\n // add remove label\n segments.unshift({\n label: REMOVE_LABEL,\n value: {\n value: REMOVE_LABEL,\n },\n });\n\n return segments;\n })\n .catch((err: any) => {\n ctrl.error = err.message || 'Failed to issue metric query';\n return segments;\n });\n };\n\n // get the list of attributes for the user interface - AF\n getAttributeSegmentsAF = (attributeText?: string): Array> => {\n const ctrl = this;\n let segments: Array> = [];\n\n segments.push({\n label: REMOVE_LABEL,\n value: {\n value: REMOVE_LABEL,\n },\n });\n\n forOwn(ctrl.availableAttributes, (val: any, key: string) => {\n let selectableValue: SelectableValue = {\n label: key,\n value: {\n value: key,\n expandable: true,\n },\n };\n segments.push(selectableValue);\n });\n\n return segments;\n };\n\n // build data from target string\n buildFromTarget = (\n query: PIWebAPIQuery,\n segmentsArray: Array>,\n attributesArray: Array>\n ) => {\n const splitAttributes = query.target!.split(';');\n const splitElements = splitAttributes.length > 0 ? splitAttributes[0].split('\\\\') : [];\n\n if (splitElements.length > 1 || (splitElements.length === 1 && splitElements[0] !== '')) {\n // remove element hierarchy from attribute collection\n splitAttributes.splice(0, 1);\n\n each(splitElements, (item, _) => {\n segmentsArray.push({\n label: item,\n value: {\n type: item.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: item,\n expandable: true,\n },\n });\n });\n each(splitAttributes, (item, _) => {\n if (item !== '') {\n // set current value\n attributesArray.push({\n label: item,\n value: {\n value: item,\n expandable: false,\n },\n });\n }\n });\n return this.getElementSegments(splitElements.length + 1, segmentsArray).then((elements) => {\n if (elements.length > 0) {\n segmentsArray.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n return segmentsArray;\n });\n }\n return Promise.resolve(segmentsArray);\n };\n\n /**\n * Gets the segment information and parses it to a string.\n *\n * @param {any} index - Last index of segment to use.\n * @returns - AF Path or PI Point name.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n getSegmentPathUpTo(segments: Array>, index: number): string {\n const arr = segments.slice(0, index);\n\n return reduce(\n arr,\n (result: any, segment: SelectableValue) => {\n if (!segment.value) {\n return '';\n }\n if (!segment.value.value?.startsWith('-Select')) {\n return result ? result + '\\\\' + segment.value.value : segment.value.value;\n }\n return result;\n },\n ''\n );\n }\n\n /**\n * Get the current AF Element's child attributes. Validates when the element selection changes.\n *\n * @returns - Collection of attributes.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n checkAttributeSegments(\n attributes: Array>,\n segments: Array>\n ): Promise {\n const { datasource, data } = this.props;\n const ctrl = this;\n const findQuery = {\n path: this.getSegmentPathUpTo(segments.slice(0), segments.length),\n type: 'attributes',\n };\n return datasource\n .metricFindQuery(findQuery, Object.assign(data?.request?.scopedVars ?? {}, { isPiPoint: false }))\n .then((attributesResponse: any) => {\n const validAttributes: any = {};\n\n each(attributesResponse, (attribute: any) => {\n validAttributes[attribute.Path.substring(attribute.Path.indexOf('|') + 1)] = attribute.WebId;\n });\n\n const filteredAttributes = filter(attributes, (attrib: SelectableValue) => {\n const changedValue = datasource.templateSrv.replace(attrib.value?.value);\n return validAttributes[changedValue] !== undefined;\n });\n\n ctrl.availableAttributes = validAttributes;\n return this.attributeChangeValue(filteredAttributes);\n })\n .catch((err: any) => {\n ctrl.error = err.message || 'Failed to issue metric query';\n return this.attributeChangeValue(attributes);\n });\n }\n\n /**\n * Get PI points from server.\n *\n * @returns - Collection of attributes.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n checkPiPointSegments(\n attribute: SelectableValue,\n attributes: Array>\n ) {\n const { datasource, data } = this.props;\n const ctrl = this;\n const findQuery = {\n path: attribute.path,\n webId: ctrl.getSelectedPIServer(),\n pointName: attribute.label,\n type: 'pipoint',\n };\n return datasource\n .metricFindQuery(findQuery, Object.assign(data?.request?.scopedVars ?? {}, { isPiPoint: true }))\n .then(() => {\n return ctrl.attributeChangeValue(attributes);\n })\n .catch((err: any) => {\n ctrl.error = err.message || 'Failed to issue metric query';\n return ctrl.attributeChangeValue([]);\n });\n }\n\n /**\n * Gets the webid of the current selected pi data server.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n getSelectedPIServer() {\n let webID = '';\n\n this.piServer.forEach((s) => {\n const parts = this.props.query.target!.split(';');\n if (parts.length >= 2) {\n if (parts[0] === s.text) {\n webID = s.WebId;\n return;\n }\n }\n });\n return this.piServer.length > 0 ? this.piServer[0].value?.webId : webID;\n }\n\n /**\n * Queries PI Web API for child elements and attributes when the raw query text editor is changed.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n textEditorChanged() {\n const { query } = this.props;\n const splitAttributes = query.target!.split(';');\n const splitElements = splitAttributes.length > 0 ? splitAttributes[0].split('\\\\') : [];\n\n let segments: Array> = [];\n let attributes: Array> = [];\n\n if (splitElements.length > 1 || (splitElements.length === 1 && splitElements[0] !== '')) {\n // remove element hierarchy from attribute collection\n splitAttributes.splice(0, 1);\n\n each(splitElements, (item, _) => {\n segments.push({\n label: item,\n value: {\n type: item.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: item,\n expandable: true,\n },\n });\n });\n each(splitAttributes, function (item, index) {\n if (item !== '') {\n attributes.push({\n label: item,\n value: {\n value: item,\n expandable: false,\n },\n });\n }\n });\n this.getElementSegments(splitElements.length + 1, segments)\n .then((elements) => {\n if (elements.length > 0) {\n segments.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n })\n .then(() => {\n this.updateArray(segments, attributes, this.state.summaries, query.isPiPoint!, () => {\n this.onChange({\n ...query,\n query: undefined,\n rawQuery: false,\n attributes: this.state.attributes,\n segments: this.state.segments,\n });\n });\n });\n } else {\n segments = this.checkAfServer();\n this.updateArray(segments, this.state.attributes, this.state.summaries, query.isPiPoint!, () => {\n this.onChange({\n ...query,\n query: undefined,\n rawQuery: false,\n attributes: this.state.attributes,\n segments: this.state.segments,\n });\n });\n }\n }\n\n /**\n * Check if the AF server and database are configured in the datasoure config.\n *\n * @returns the segments array\n *\n * @memberOf PIWebAPIQueryEditor\n */\n checkAfServer = () => {\n const { datasource } = this.props;\n const segmentsArray = [];\n if (datasource.afserver?.name) {\n segmentsArray.push({\n label: datasource.afserver.name,\n value: {\n value: datasource.afserver.name,\n expandable: true,\n },\n });\n if (datasource.afdatabase?.name) {\n segmentsArray.push({\n label: datasource.afdatabase.name,\n value: {\n value: datasource.afdatabase.name,\n expandable: true,\n },\n });\n }\n segmentsArray.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n } else {\n segmentsArray.push({\n label: '',\n });\n }\n return segmentsArray;\n };\n\n /**\n * Update the internal state of the datasource.\n *\n * @param segmentsArray the segments array to update\n * @param attributesArray the AF attributes array to update\n * @param summariesArray the summaries array to update\n * @param isPiPoint the is PI point flag\n * @param cb optional callback function\n *\n * @memberOf PIWebAPIQueryEditor\n */\n updateArray = (\n segmentsArray: Array>,\n attributesArray: Array>,\n summariesArray: Array>,\n isPiPoint: boolean,\n cb?: (() => void) | undefined\n ) => {\n this.setState(\n {\n segments: segmentsArray,\n attributes: attributesArray,\n summaries: summariesArray,\n isPiPoint,\n },\n () => {\n if (!isPiPoint) {\n this.checkAttributeSegments(attributesArray, this.state.segments).then(() => {\n if (cb) {\n cb();\n }\n });\n }\n }\n );\n };\n\n // React action when component is initialized/updated\n scopedVarsDone = false;\n componentDidMount = () => {\n this.initialLoad(false);\n };\n\n componentDidUpdate = () => {\n const { query } = this.props;\n if (this.props.data?.state === 'Done' && !!this.props.data?.request?.scopedVars && !this.scopedVarsDone) {\n this.scopedVarsDone = true;\n this.initialLoad(!query.isPiPoint);\n }\n };\n\n initialLoad = (force: boolean) => {\n const { query } = this.props;\n const metricsQuery = defaults(query, defaultQuery) as PIWebAPIQuery;\n const { segments, attributes, summary, isPiPoint } = metricsQuery;\n\n let segmentsArray: Array> = force ? [] : segments?.slice(0) ?? [];\n let attributesArray: Array> = force ? [] : attributes?.slice(0) ?? [];\n let summariesArray = summary?.types ?? [];\n\n if (!isPiPoint && segmentsArray.length === 0) {\n if (query.target && query.target.length > 0 && query.target !== ';') {\n attributesArray = [];\n // Build query from target\n this.buildFromTarget(query, segmentsArray, attributesArray)\n .then((_segmentsArray) => {\n this.updateArray(_segmentsArray, attributesArray, summariesArray, false);\n })\n .catch((e) => console.error(e));\n return;\n } else {\n segmentsArray = this.checkAfServer();\n }\n } else if (isPiPoint && segmentsArray.length > 0) {\n this.piServer = segmentsArray;\n }\n this.updateArray(segmentsArray, attributesArray, summariesArray, !!isPiPoint, () => {\n this.onChange(query);\n });\n };\n\n onChange = (query: PIWebAPIQuery) => {\n const { onChange, onRunQuery } = this.props;\n\n if (query.rawQuery) {\n query.target = query.query ?? '';\n if (!!query.query) {\n const { attributes, elementPath } = parseRawQuery(query.target);\n query.attributes = attributes;\n query.elementPath = elementPath;\n }\n } else {\n query.elementPath = this.getSegmentPathUpTo(this.state.segments, this.state.segments.length);\n query.target =\n query.elementPath +\n ';' +\n join(\n query.attributes?.map((s) => s.value?.value),\n ';'\n );\n }\n const summary = query.summary;\n if (summary) {\n summary.types = this.state.summaries;\n }\n\n onChange({...query, summary});\n\n if (this.isValidQuery(query)) {\n onRunQuery();\n }\n };\n\n isValidQuery = (query: PIWebAPIQuery): boolean => {\n if (query.target && query.target.length > 0 && query.target !== \";\") {\n query.target = query.target.trim();\n const targetSplit = query.target.split(\";\", 2);\n return targetSplit.length === 2 && targetSplit[0].length > 0 && targetSplit[1].length > 0;\n }\n return false;\n }\n\n stateCallback = () => {\n const query = this.props.query as PIWebAPIQuery;\n this.onChange(query);\n };\n\n onIsPiPointChange = (event: React.SyntheticEvent) => {\n const { query: queryChange } = this.props;\n const isPiPoint = !queryChange.isPiPoint;\n this.setState(\n {\n segments: isPiPoint ? [{ label: '' }] : this.checkAfServer(),\n attributes: [],\n isPiPoint,\n },\n () => {\n this.onChange({\n ...queryChange,\n expression: '',\n attributes: this.state.attributes,\n segments: this.state.segments,\n isPiPoint,\n });\n }\n );\n };\n\n render() {\n const { query: queryProps, onChange, onRunQuery } = this.props;\n const metricsQuery = defaults(queryProps, defaultQuery) as PIWebAPIQuery;\n const {\n useLastValue,\n useUnit,\n interpolate,\n query,\n rawQuery,\n digitalStates,\n enableStreaming,\n recordedValues,\n expression,\n isPiPoint,\n summary,\n display,\n regex,\n } = metricsQuery;\n\n return (\n <>\n {this.props.datasource.piPointConfig && (\n \n \n \n )}\n\n {!!rawQuery && (\n \n \n ) =>\n onChange({ ...metricsQuery, query: event.target.value })\n }\n placeholder=\"enter query\"\n />\n \n this.textEditorChanged()} />\n \n )}\n\n {!rawQuery && (\n <>\n
\n \n {this.state.segments.map((segment: SelectableValue, index: number) => {\n return (\n }\n onChange={(item) => this.onSegmentChange(item, index)}\n loadOptions={(query?: string | undefined) => {\n return this.getElementSegments(index);\n }}\n allowCustomValue\n inputMinWidth={MIN_ELEM_INPUT_WIDTH}\n />\n );\n })}\n \n {!isPiPoint && (\n {\n onChange({ ...metricsQuery, query: metricsQuery.target, rawQuery: value });\n }}\n />\n )}\n \n
\n\n \n {this.state.attributes.map((attribute: SelectableValue, index: number) => {\n if (isPiPoint) {\n return (\n }\n disabled={this.piServer.length === 0}\n onChange={(item) => this.onPiPointChange(item, index)}\n loadOptions={this.getAttributeSegmentsPI}\n reloadOptionsOnChange\n allowCustomValue\n inputMinWidth={MIN_ATTR_INPUT_WIDTH}\n />\n );\n }\n return (\n }\n disabled={this.state.segments.length <= 2}\n onChange={(item) => this.onAttributeChange(item, index)}\n options={this.getAttributeSegmentsAF()}\n allowCustomValue\n inputMinWidth={MIN_ATTR_INPUT_WIDTH}\n />\n );\n })}\n\n {isPiPoint && (\n \n }\n disabled={this.piServer.length === 0}\n onChange={this.onAttributeAction}\n loadOptions={this.getAttributeSegmentsPI}\n reloadOptionsOnChange\n allowCustomValue\n inputMinWidth={MIN_ATTR_INPUT_WIDTH}\n />\n )}\n {!isPiPoint && (\n \n }\n disabled={this.state.segments.length <= 2}\n onChange={this.onAttributeAction}\n options={this.getAttributeSegmentsAF()}\n allowCustomValue\n inputMinWidth={MIN_ATTR_INPUT_WIDTH}\n />\n )}\n \n \n )}\n\n \n \n ) =>\n onChange({ ...metricsQuery, expression: event.target.value })\n }\n placeholder=\"'.'*2\"\n />\n \n \n\n \n \n \n this.onChange({\n ...metricsQuery,\n useLastValue: { ...useLastValue, enable: !useLastValue.enable },\n })\n }\n />\n \n \n \n this.onChange({\n ...metricsQuery,\n digitalStates: { ...digitalStates, enable: !digitalStates.enable },\n })\n }\n />\n \n \n }\n onChange={this.calcNoDataValueChanged}\n options={this.getNoDataSegments()}\n allowCustomValue\n />\n \n {this.props.datasource.useUnitConfig && (\n \n \n this.onChange({\n ...metricsQuery,\n useUnit: { ...useUnit, enable: !useUnit.enable },\n })\n }\n />\n \n )}\n {this.props.datasource.useStreaming && (\n \n \n this.onChange({ ...metricsQuery, enableStreaming: { ...enableStreaming, enable: !enableStreaming.enable } })\n }\n />\n \n )}\n \n\n \n {!useLastValue.enable && (\n \n ) =>\n onChange({\n ...metricsQuery,\n recordedValues: { ...recordedValues, maxNumber: parseInt(event.target.value, 10) },\n })\n }\n type=\"number\"\n placeholder=\"1000\"\n />\n \n )}\n \n \n this.onChange({\n ...metricsQuery,\n recordedValues: { ...recordedValues, enable: !recordedValues.enable },\n })\n }\n />\n \n \n\n {!useLastValue.enable && (\n \n \n ) =>\n onChange({ ...metricsQuery, interpolate: { ...interpolate, interval: event.target.value } })\n }\n placeholder=\"30s\"\n />\n \n \n \n this.onChange({ ...metricsQuery, interpolate: { ...interpolate, enable: !interpolate.enable } })\n }\n />\n \n \n )}\n\n {!useLastValue.enable && (\n \n \n ) =>\n onChange({ ...metricsQuery, summary: { ...summary, interval: event.target.value } })\n }\n placeholder=\"30s\"\n />\n \n \n }\n onChange={this.calcBasisValueChanged}\n options={this.getCalcBasisSegments()}\n allowCustomValue\n />\n \n \n \n {this.state.summaries.map((s: SelectableValue, index: number) => {\n return (\n }\n onChange={(item) => this.onSummaryValueChanged(item, index)}\n options={this.getSummarySegments()}\n allowCustomValue\n />\n );\n })}\n \n }\n onChange={this.onSummaryAction}\n options={this.getSummarySegments()}\n allowCustomValue\n />\n \n \n \n )}\n\n \n \n ) =>\n onChange({ ...metricsQuery, display: event.target.value })\n }\n placeholder=\"Display\"\n />\n \n \n {\n this.onChange({ ...metricsQuery, regex: { ...regex, enable: !regex.enable } });\n }}\n />\n \n \n ) =>\n onChange({ ...metricsQuery, regex: { ...regex, search: event.target.value } })\n }\n placeholder=\"(.*)\"\n />\n \n \n ) =>\n onChange({ ...metricsQuery, regex: { ...regex, replace: event.target.value } })\n }\n placeholder=\"$1\"\n />\n \n \n \n );\n }\n}\n","import React, { memo, useState } from 'react';\n\nimport { AnnotationQuery, QueryEditorProps, SelectableValue } from '@grafana/data';\nimport { AsyncSelect, InlineField, InlineFieldRow, InlineSwitch, Input } from '@grafana/ui';\n\nimport { PiWebAPIDatasource } from 'datasource';\nimport { PIWebAPIDataSourceJsonData, PIWebAPIQuery, PiwebapiRsp } from 'types';\n\nconst SMALL_LABEL_WIDTH = 20;\nconst LABEL_WIDTH = 30;\nconst MIN_INPUT_WIDTH = 50;\n\ntype PiWebAPIQueryEditorProps = QueryEditorProps;\n\ntype Props = PiWebAPIQueryEditorProps & {\n annotation?: AnnotationQuery;\n onAnnotationChange?: (annotation: AnnotationQuery) => void;\n};\n\nexport const PiWebAPIAnnotationsQueryEditor = memo(function PiWebAPIAnnotationQueryEditor(props: Props) {\n const { query, datasource, annotation, onChange, onRunQuery } = props;\n\n const [afWebId, setAfWebId] = useState('');\n const [database, setDatabase] = useState(annotation?.target?.database ?? {});\n\n // this should never happen, but we want to keep typescript happy\n if (annotation === undefined) {\n return null;\n }\n\n const getEventFrames = (): Promise>> => {\n return datasource.getEventFrameTemplates(database?.WebId!).then((templ: PiwebapiRsp[]) => {\n return templ.map((d) => ({ label: d.Name, value: d }));\n });\n };\n\n const getDatabases = (): Promise>> => {\n return datasource.getDatabases(afWebId).then((dbs: PiwebapiRsp[]) => {\n return dbs.map((d) => ({ label: d.Name, value: d }));\n });\n };\n\n const getValue = (key: string) => {\n const query: any = annotation.target as any;\n if (!query || !query[key]) {\n return;\n }\n return { label: query[key].Name, value: query[key] };\n };\n\n datasource.getAssetServer(datasource.afserver.name).then((result) => {\n setAfWebId(result.WebId!);\n });\n\n return (\n <>\n
\n \n \n {\n setDatabase(e.value);\n onChange({ ...query, database: e.value, template: undefined });\n }}\n defaultOptions\n />\n \n \n onChange({ ...query, template: e.value })}\n defaultOptions\n />\n \n \n onChange({ ...query, showEndTime: e.currentTarget.checked })}\n />\n \n \n \n \n onRunQuery()}\n onChange={(e) => onChange({ ...query, categoryName: e.currentTarget.value })}\n placeholder=\"Enter category name\"\n />\n \n \n onRunQuery()}\n onChange={(e) => onChange({ ...query, nameFilter: e.currentTarget.value })}\n placeholder=\"Enter name filter\"\n />\n \n \n \n \n \n onChange({\n ...query,\n regex: { ...query.regex, enable: e.currentTarget.checked },\n })\n }\n />\n \n \n onRunQuery()}\n onChange={(e) =>\n onChange({\n ...query,\n regex: { ...query.regex, search: e.currentTarget.value },\n })\n }\n placeholder=\"(.*)\"\n width={MIN_INPUT_WIDTH}\n />\n \n \n onRunQuery()}\n onChange={(e) =>\n onChange({\n ...query,\n regex: { ...query.regex, replace: e.currentTarget.value },\n })\n }\n placeholder=\"$1\"\n />\n \n \n \n \n \n onChange({\n ...query!,\n attribute: { ...query.attribute, enable: e.currentTarget.checked },\n })\n }\n />\n \n \n onRunQuery()}\n onChange={(e) =>\n onChange({\n ...query!,\n attribute: { ...query.attribute, name: e.currentTarget.value },\n })\n }\n placeholder=\"Enter name\"\n />\n \n \n
\n \n );\n});\n","import { filter, map } from 'lodash';\n\nimport { Observable, of, firstValueFrom } from 'rxjs';\n\nimport {\n DataSourceInstanceSettings,\n MetricFindValue,\n AnnotationQuery,\n ScopedVars,\n AnnotationEvent,\n DataFrame,\n DataQueryRequest,\n DataQueryResponse,\n} from '@grafana/data';\nimport { BackendSrv, getBackendSrv, getTemplateSrv, TemplateSrv, DataSourceWithBackend } from '@grafana/runtime';\n\nimport { PIWebAPIQuery, PIWebAPIDataSourceJsonData, PiDataServer, PiwebapiInternalRsp, PiwebapiRsp } from './types';\nimport { metricQueryTransform } from 'helper';\n\nimport { PiWebAPIAnnotationsQueryEditor } from 'query/AnnotationsQueryEditor';\n\nexport class PiWebAPIDatasource extends DataSourceWithBackend {\n piserver: PiDataServer;\n afserver: PiDataServer;\n afdatabase: PiDataServer;\n piPointConfig: boolean;\n newFormatConfig: boolean;\n useUnitConfig: boolean;\n useExperimental: boolean;\n useStreaming: boolean;\n\n constructor(\n instanceSettings: DataSourceInstanceSettings,\n readonly templateSrv: TemplateSrv = getTemplateSrv(),\n private readonly backendSrv: BackendSrv = getBackendSrv()\n ) {\n super(instanceSettings);\n\n this.piserver = { name: (instanceSettings.jsonData || {}).piserver, webid: undefined };\n this.afserver = { name: (instanceSettings.jsonData || {}).afserver, webid: undefined };\n this.afdatabase = { name: (instanceSettings.jsonData || {}).afdatabase, webid: undefined };\n this.piPointConfig = instanceSettings.jsonData.pipoint || false;\n this.newFormatConfig = instanceSettings.jsonData.newFormat || false;\n this.useUnitConfig = instanceSettings.jsonData.useUnit || false;\n this.useExperimental = instanceSettings.jsonData.useExperimental || false;\n this.useStreaming = instanceSettings.jsonData.useStreaming || false;\n\n this.annotations = {\n QueryEditor: PiWebAPIAnnotationsQueryEditor,\n prepareQuery(anno: AnnotationQuery): PIWebAPIQuery | undefined {\n if (anno.target) {\n anno.target.queryType = 'Annotation';\n anno.target.isAnnotation = true;\n }\n return anno.target;\n },\n processEvents: (\n anno: AnnotationQuery,\n data: DataFrame[]\n ): Observable => {\n return of(this.eventFrameToAnnotation(anno, data));\n },\n };\n\n Promise.all([\n this.getDataServer(this.piserver.name).then((result: PiwebapiRsp) => (this.piserver.webid = result.WebId)),\n this.getAssetServer(this.afserver.name).then((result: PiwebapiRsp) => (this.afserver.webid = result.WebId)),\n this.getDatabase(\n this.afserver.name && this.afdatabase.name ? this.afserver.name + '\\\\' + this.afdatabase.name : undefined\n ).then((result: PiwebapiRsp) => (this.afdatabase.webid = result.WebId)),\n ]);\n }\n\n /**\n * This method overrides the applyTemplateVariables() method from the DataSourceWithBackend class.\n * It is responsible for replacing the template variables in the query configuration prior\n * to sending the query to the backend. Templated variables are not able to be used for alerts\n * or public facing dashboards.\n *\n * @param {PIWebAPIQuery} query - The raw query configuration from the frontend as defined in the query editor.\n * @param {ScopedVars} scopedVars - The template variables that are defined in the query editor and dashboard.\n * @returns - PIWebAPIQuery.\n *\n * @memberOf PiWebApiDatasource\n */\n applyTemplateVariables(query: PIWebAPIQuery, scopedVars: ScopedVars) {\n return {\n ...query,\n target: query.target ? this.templateSrv.replace(query.target, scopedVars) : '',\n };\n }\n\n /**\n * This method makes the query to the backend.\n *\n * @param {DataQueryRequest} options\n *\n * @memberOf PiWebApiDatasource\n */\n query(options: DataQueryRequest): Observable {\n if (options.targets.length === 1 && !!options.targets[0].isAnnotation) {\n return super.query(options);\n }\n\n const query = this.buildQueryParameters(options);\n if (query.targets.length <= 0) {\n return of({ data: [] });\n }\n\n return super.query(query);\n }\n\n /**\n * This method does the discovery of the AF Hierarchy and populates the query user interface segments.\n *\n * @param {any} query - Parses the query configuration and builds a PI Web API query.\n * @returns - Segment information.\n *\n * @memberOf PiWebApiDatasource\n */\n metricFindQuery(query: any, queryOptions: any): Promise {\n const ds = this;\n const querydepth = ['servers', 'databases', 'databaseElements', 'elements'];\n if (typeof query === 'string') {\n query = JSON.parse(query as string);\n }\n if (queryOptions.isPiPoint) {\n query.path = this.templateSrv.replace(query.path, queryOptions);\n } else {\n if (query.path === '') {\n query.type = querydepth[0];\n } else {\n query.path = this.templateSrv.replace(query.path, queryOptions); // replace variables in the path\n query.path = query.path.split(';')[0]; // if the attribute is in the path, let's remote it\n if (query.type !== 'attributes') {\n query.type = querydepth[Math.max(0, Math.min(query.path.split('\\\\').length, querydepth.length - 1))];\n }\n }\n query.path = query.path.replace(/\\{([^\\\\])*\\}/gi, (r: string) => r.substring(1, r.length - 2).split(',')[0]);\n }\n\n query.filter = query.filter ?? '*';\n query.max = query.max ?? 10000;\n\n if (query.type === 'servers') {\n return ds.afserver?.name\n ? ds\n .getAssetServer(ds.afserver.name)\n .then((result: PiwebapiRsp) => [result])\n .then(metricQueryTransform)\n : ds.getAssetServers().then(metricQueryTransform);\n } else if (query.type === 'databases' && !!query.afServerWebId) {\n return ds.getDatabases(query.afServerWebId, {}).then(metricQueryTransform);\n } else if (query.type === 'databases') {\n return ds\n .getAssetServer(query.path)\n .then((server) => ds.getDatabases(server.WebId ?? '', {}))\n .then(metricQueryTransform);\n } else if (query.type === 'databaseElements') {\n return ds\n .getDatabase(query.path)\n .then((db) =>\n ds.getDatabaseElements(db.WebId ?? '', {\n selectedFields: 'Items.WebId%3BItems.Name%3BItems.Items%3BItems.Path%3BItems.HasChildren',\n })\n )\n .then(metricQueryTransform);\n } else if (query.type === 'elements') {\n return ds\n .getElement(query.path)\n .then((element) =>\n ds.getElements(element.WebId ?? '', {\n selectedFields:\n 'Items.Description%3BItems.WebId%3BItems.Name%3BItems.Items%3BItems.Path%3BItems.HasChildren',\n nameFilter: query.filter,\n })\n )\n .then(metricQueryTransform);\n } else if (query.type === 'attributes') {\n return ds\n .getElement(query.path)\n .then((element) =>\n ds.getAttributes(element.WebId ?? '', {\n searchFullHierarchy: 'true',\n selectedFields:\n 'Items.Type%3BItems.DefaultUnitsName%3BItems.Description%3BItems.WebId%3BItems.Name%3BItems.Path',\n nameFilter: query.filter,\n maxCount: query.max,\n })\n )\n .then(metricQueryTransform);\n } else if (query.type === 'dataserver') {\n return ds.getDataServers().then(metricQueryTransform);\n } else if (query.type === 'pipoint') {\n return ds.piPointSearch(query.webId, query.pointName).then(metricQueryTransform);\n }\n return Promise.reject('Bad type');\n }\n\n /** PRIVATE SECTION */\n\n /**\n * Builds the PIWebAPI query parameters.\n *\n * @param {any} options - Grafana query and panel options.\n * @returns - PIWebAPI query parameters.\n *\n * @memberOf PiWebApiDatasource\n */\n private buildQueryParameters(options: DataQueryRequest) {\n options.targets = filter(options.targets, (target) => {\n if (!target || !target.target || target.attributes?.length === 0 || target.target === ';' || !!target.hide) {\n return false;\n }\n return !target.target.startsWith('Select AF');\n });\n\n if (options.maxDataPoints) {\n options.maxDataPoints = options.maxDataPoints > 30000 ? 30000 : options.maxDataPoints;\n }\n options.targets = map(options.targets, (target) => {\n const tar = {\n enableStreaming: target.enableStreaming,\n target: this.templateSrv.replace(target.target, options.scopedVars),\n elementPath: this.templateSrv.replace(target.elementPath, options.scopedVars),\n attributes: map(target.attributes, (att) => {\n if (att.value) {\n this.templateSrv.replace(att.value.value, options.scopedVars);\n }\n return att;\n }),\n segments: map(target.segments, (att) => {\n if (att.value) {\n this.templateSrv.replace(att.value.value, options.scopedVars);\n }\n return att;\n }),\n isAnnotation: !!target.isAnnotation,\n display: !!target.display ? this.templateSrv.replace(target.display, options.scopedVars) : undefined,\n refId: target.refId,\n hide: target.hide,\n interpolate: !!target.interpolate\n ? {\n ...target.interpolate,\n interval: this.templateSrv.replace(target.interpolate.interval, options.scopedVars),\n }\n : { enable: false },\n useLastValue: target.useLastValue || { enable: false },\n useUnit: target.useUnit || { enable: false },\n recordedValues: target.recordedValues || { enable: false },\n digitalStates: target.digitalStates || { enable: false },\n webid: target.webid ?? '',\n regex: target.regex || { enable: false },\n expression: target.expression || '',\n summary: target.summary || { types: [] },\n startTime: options.range.from,\n endTime: options.range.to,\n isPiPoint: !!target.isPiPoint,\n scopedVars: options.scopedVars,\n };\n\n if (tar.expression) {\n tar.expression = this.templateSrv.replace(tar.expression, options.scopedVars);\n }\n\n if (tar.summary.types !== undefined) {\n tar.summary.types = filter(tar.summary.types, (item) => {\n return item !== undefined && item !== null && item !== '';\n });\n tar.summary.interval = !!tar.summary.interval\n ? this.templateSrv.replace(tar.summary.interval, options.scopedVars)\n : tar.summary.interval;\n }\n\n return tar;\n });\n\n return options;\n }\n\n /**\n * Localize the eventFrame dataFrame records to Grafana Annotations.\n * @param {any} annon - The annotation object.\n * @param {any} data - The dataframe recrords.\n * @returns - Grafana Annotation\n *\n * @memberOf PiWebApiDatasource\n */\n private eventFrameToAnnotation(annon: AnnotationQuery, data: DataFrame[]): AnnotationEvent[] {\n const annotationOptions = annon.target!;\n const events: AnnotationEvent[] = [];\n const currentLocale = Intl.DateTimeFormat().resolvedOptions().locale;\n\n data.forEach((d: DataFrame) => {\n let values = this.transformDataFrameToMap(d);\n for (let i = 0; i < values['time'].length; i++) {\n // replace Dataframe name using Regex\n let title = values['title'][i];\n if (annotationOptions.regex && annotationOptions.regex.enable) {\n title = title.replace(new RegExp(annotationOptions.regex.search), annotationOptions.regex.replace);\n }\n\n // test if timeEnd is negative and if so, set it to null\n if (values['timeEnd'][i] < 0) {\n values['timeEnd'][i] = null;\n }\n\n // format the text and localize the dates to browser locale\n let text = 'Tag: ' + title;\n if (annotationOptions.attribute && annotationOptions.attribute.enable) {\n text += values['attributeText'][i];\n }\n text += '
Start: ' + new Date(values['time'][i]).toLocaleString(currentLocale) + '
End: ';\n\n if (values['timeEnd'][i]) {\n text += new Date(values['timeEnd'][i]).toLocaleString(currentLocale);\n } else {\n text += 'Eventframe is open';\n }\n\n const event: AnnotationEvent = {\n time: values['time'][i],\n timeEnd: !!annotationOptions.showEndTime ? values['timeEnd'][i] : undefined,\n title: title,\n id: values['id'][i],\n text: text,\n tags: ['OSISoft PI'],\n };\n\n events.push(event);\n }\n });\n return events;\n }\n\n /**\n *\n */\n private transformDataFrameToMap(dataFrame: DataFrame): Record {\n const map: Record = {};\n\n dataFrame.fields.forEach((field) => {\n map[field.name] = field.values.toArray();\n });\n\n return map;\n }\n\n /**\n * Abstraction for calling the PI Web API REST endpoint\n *\n * @param {any} path - the path to append to the base server URL.\n * @returns - The full URL.\n *\n * @memberOf PiWebApiDatasource\n */\n private restGet(path: string): Promise {\n const observable = this.backendSrv.fetch({\n url: `/api/datasources/${this.id}/resources${path}`,\n method: 'GET',\n headers: { 'Content-Type': 'application/json' },\n });\n\n return firstValueFrom(observable).then((response: any) => {\n return response as PiwebapiInternalRsp;\n });\n }\n\n // Get a list of all data (PI) servers\n private getDataServers(): Promise {\n return this.restGet('/dataservers').then((response) => response.data.Items ?? []);\n }\n private getDataServer(name: string | undefined): Promise {\n if (!name) {\n return Promise.resolve({});\n }\n return this.restGet('/dataservers?name=' + name).then((response) => response.data);\n }\n // Get a list of all asset (AF) servers\n private getAssetServers(): Promise {\n return this.restGet('/assetservers').then((response) => response.data.Items ?? []);\n }\n getAssetServer(name: string | undefined): Promise {\n if (!name) {\n return Promise.resolve({});\n }\n return this.restGet('/assetservers?path=\\\\\\\\' + name).then((response) => response.data);\n }\n getDatabase(path: string | undefined): Promise {\n if (!path) {\n return Promise.resolve({});\n }\n return this.restGet('/assetdatabases?path=\\\\\\\\' + path).then((response) => response.data);\n }\n getDatabases(serverId: string, options?: any): Promise {\n if (!serverId) {\n return Promise.resolve([]);\n }\n return this.restGet('/assetservers/' + serverId + '/assetdatabases').then((response) => response.data.Items ?? []);\n }\n getElement(path: string): Promise {\n if (!path) {\n return Promise.resolve({});\n }\n return this.restGet('/elements?path=\\\\\\\\' + path).then((response) => response.data);\n }\n getEventFrameTemplates(databaseId: string): Promise {\n if (!databaseId) {\n return Promise.resolve([]);\n }\n return this.restGet(\n '/assetdatabases/' + databaseId + '/elementtemplates?selectedFields=Items.InstanceType%3BItems.Name%3BItems.WebId'\n ).then((response) => {\n return filter(response.data.Items ?? [], (item) => item.InstanceType === 'EventFrame');\n });\n }\n getElementTemplates(databaseId: string): Promise {\n if (!databaseId) {\n return Promise.resolve([]);\n }\n return this.restGet(\n '/assetdatabases/' + databaseId + '/elementtemplates?selectedFields=Items.InstanceType%3BItems.Name%3BItems.WebId'\n ).then((response) => {\n return filter(response.data.Items ?? [], (item) => item.InstanceType === 'Element');\n });\n }\n\n /**\n * @description\n * Get the child attributes of the current resource.\n * GET attributes/{webId}/attributes\n * @param {string} elementId - The ID of the parent resource. See WebID for more information.\n * @param {Object} options - Query Options\n * @param {string} options.nameFilter - The name query string used for finding attributes. The default is no filter. See Query String for more information.\n * @param {string} options.categoryName - Specify that returned attributes must have this category. The default is no category filter.\n * @param {string} options.templateName - Specify that returned attributes must be members of this template. The default is no template filter.\n * @param {string} options.valueType - Specify that returned attributes' value type must be the given value type. The default is no value type filter.\n * @param {string} options.searchFullHierarchy - Specifies if the search should include attributes nested further than the immediate attributes of the searchRoot. The default is 'false'.\n * @param {string} options.sortField - The field or property of the object used to sort the returned collection. The default is 'Name'.\n * @param {string} options.sortOrder - The order that the returned collection is sorted. The default is 'Ascending'.\n * @param {string} options.startIndex - The starting index (zero based) of the items to be returned. The default is 0.\n * @param {string} options.showExcluded - Specified if the search should include attributes with the Excluded property set. The default is 'false'.\n * @param {string} options.showHidden - Specified if the search should include attributes with the Hidden property set. The default is 'false'.\n * @param {string} options.maxCount - The maximum number of objects to be returned per call (page size). The default is 1000.\n * @param {string} options.selectedFields - List of fields to be returned in the response, separated by semicolons (;). If this parameter is not specified, all available fields will be returned. See Selected Fields for more information.\n */\n private getAttributes(elementId: string, options: any): Promise {\n let querystring =\n '?' +\n map(options, (value, key) => {\n return key + '=' + value;\n }).join('&');\n\n if (querystring === '?') {\n querystring = '';\n }\n\n return this.restGet('/elements/' + elementId + '/attributes' + querystring).then(\n (response) => response.data.Items ?? []\n );\n }\n\n /**\n * @description\n * Retrieve elements based on the specified conditions. By default, this method selects immediate children of the current resource.\n * Users can search for the elements based on specific search parameters. If no parameters are specified in the search, the default values for each parameter will be used and will return the elements that match the default search.\n * GET assetdatabases/{webId}/elements\n * @param {string} databaseId - The ID of the parent resource. See WebID for more information.\n * @param {Object} options - Query Options\n * @param {string} options.webId - The ID of the resource to use as the root of the search. See WebID for more information.\n * @param {string} options.nameFilter - The name query string used for finding objects. The default is no filter. See Query String for more information.\n * @param {string} options.categoryName - Specify that returned elements must have this category. The default is no category filter.\n * @param {string} options.templateName - Specify that returned elements must have this template or a template derived from this template. The default is no template filter.\n * @param {string} options.elementType - Specify that returned elements must have this type. The default type is 'Any'. See Element Type for more information.\n * @param {string} options.searchFullHierarchy - Specifies if the search should include objects nested further than the immediate children of the searchRoot. The default is 'false'.\n * @param {string} options.sortField - The field or property of the object used to sort the returned collection. The default is 'Name'.\n * @param {string} options.sortOrder - The order that the returned collection is sorted. The default is 'Ascending'.\n * @param {number} options.startIndex - The starting index (zero based) of the items to be returned. The default is 0.\n * @param {number} options.maxCount - The maximum number of objects to be returned per call (page size). The default is 1000.\n * @param {string} options.selectedFields - List of fields to be returned in the response, separated by semicolons (;). If this parameter is not specified, all available fields will be returned. See Selected Fields for more information.\n */\n private getDatabaseElements(databaseId: string, options: any): Promise {\n let querystring =\n '?' +\n map(options, (value, key) => {\n return key + '=' + value;\n }).join('&');\n\n if (querystring === '?') {\n querystring = '';\n }\n\n return this.restGet('/assetdatabases/' + databaseId + '/elements' + querystring).then(\n (response) => response.data.Items ?? []\n );\n }\n\n /**\n * @description\n * Retrieve elements based on the specified conditions. By default, this method selects immediate children of the current resource.\n * Users can search for the elements based on specific search parameters. If no parameters are specified in the search, the default values for each parameter will be used and will return the elements that match the default search.\n * GET elements/{webId}/elements\n * @param {string} databaseId - The ID of the resource to use as the root of the search. See WebID for more information.\n * @param {Object} options - Query Options\n * @param {string} options.webId - The ID of the resource to use as the root of the search. See WebID for more information.\n * @param {string} options.nameFilter - The name query string used for finding objects. The default is no filter. See Query String for more information.\n * @param {string} options.categoryName - Specify that returned elements must have this category. The default is no category filter.\n * @param {string} options.templateName - Specify that returned elements must have this template or a template derived from this template. The default is no template filter.\n * @param {string} options.elementType - Specify that returned elements must have this type. The default type is 'Any'. See Element Type for more information.\n * @param {string} options.searchFullHierarchy - Specifies if the search should include objects nested further than the immediate children of the searchRoot. The default is 'false'.\n * @param {string} options.sortField - The field or property of the object used to sort the returned collection. The default is 'Name'.\n * @param {string} options.sortOrder - The order that the returned collection is sorted. The default is 'Ascending'.\n * @param {number} options.startIndex - The starting index (zero based) of the items to be returned. The default is 0.\n * @param {number} options.maxCount - The maximum number of objects to be returned per call (page size). The default is 1000.\n * @param {string} options.selectedFields - List of fields to be returned in the response, separated by semicolons (;). If this parameter is not specified, all available fields will be returned. See Selected Fields for more information.\n */\n private getElements(elementId: string, options: any): Promise {\n let querystring =\n '?' +\n map(options, (value, key) => {\n return key + '=' + value;\n }).join('&');\n\n if (querystring === '?') {\n querystring = '';\n }\n\n return this.restGet('/elements/' + elementId + '/elements' + querystring).then(\n (response) => response.data.Items ?? []\n );\n }\n\n /**\n * Retrieve a list of points on a specified Data Server.\n *\n * @param {string} serverId - The ID of the server. See WebID for more information.\n * @param {string} nameFilter - A query string for filtering by point name. The default is no filter. *, ?, [ab], [!ab]\n */\n private piPointSearch(serverId: string, nameFilter: string): Promise {\n let filter1 = this.templateSrv.replace(nameFilter);\n let filter2 = `${filter1}`;\n let doFilter = false;\n if (filter1 !== nameFilter) {\n const regex = /\\{(\\w|,)+\\}/gs;\n let m;\n while ((m = regex.exec(filter1)) !== null) {\n // This is necessary to avoid infinite loops with zero-width matches\n if (m.index === regex.lastIndex) {\n regex.lastIndex++;\n }\n\n // The result can be accessed through the `m`-variable.\n m.forEach((match, groupIndex) => {\n if (groupIndex === 0) {\n filter1 = filter1.replace(match, match.replace('{', '(').replace('}', ')').replace(',', '|'));\n filter2 = filter2.replace(match, '*');\n doFilter = true;\n }\n });\n }\n }\n return this.restGet('/dataservers/' + serverId + '/points?maxCount=50&nameFilter=' + filter2).then((results) => {\n if (!!results && !!results.data?.Items) {\n return doFilter ? results.data.Items.filter((item) => item.Name?.match(filter1)) : results.data.Items;\n }\n return [];\n });\n }\n}\n","import { DataSourcePlugin } from '@grafana/data';\nimport { PIWebAPIConfigEditor } from './config/ConfigEditor';\nimport { PIWebAPIQueryEditor } from './query/QueryEditor';\nimport { PiWebAPIDatasource } from './datasource';\nimport { PIWebAPIQuery, PIWebAPIDataSourceJsonData } from './types';\n\nexport const plugin = new DataSourcePlugin(\n PiWebAPIDatasource\n)\n .setQueryEditor(PIWebAPIQueryEditor)\n .setConfigEditor(PIWebAPIConfigEditor);\n"],"names":["module","exports","__WEBPACK_EXTERNAL_MODULE__781__","__WEBPACK_EXTERNAL_MODULE__531__","__WEBPACK_EXTERNAL_MODULE__7__","__WEBPACK_EXTERNAL_MODULE__241__","__WEBPACK_EXTERNAL_MODULE__959__","__WEBPACK_EXTERNAL_MODULE__269__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","FormField","LegacyForms","coerceOptions","options","jsonData","url","PIWebAPIConfigEditor","PureComponent","render","originalOptions","this","props","div","DataSourceHttpSettings","defaultUrl","dataSourceConfig","onChange","onHttpOptionsChange","showAccessOptions","h3","className","InlineField","label","labelWidth","InlineSwitch","pipoint","onPiPointChange","newFormat","onNewFormatChange","useUnit","onUseUnitChange","useExperimental","onUseExperimentalChange","useStreaming","onUseStreamingChange","inputWidth","onPIServerChange","piserver","placeholder","onAFServerChange","afserver","onAFDatabaseChange","afdatabase","event","onOptionsChange","target","checked","QueryField","tooltip","children","InlineFormLabel","width","QueryRowTerminator","QueryInlineField","QueryEditorRow","QueryRawInlineField","QueryRawEditorRow","defaultQuery","attributes","segments","regex","enable","summary","types","basis","interval","nodata","expression","interpolate","useLastValue","recordedValues","digitalStates","enableStreaming","isPiPoint","QueryEditorModeSwitcher","isRaw","isModalOpen","setModalOpen","useState","useEffect","Button","aria-label","icon","variant","type","onClick","ConfirmModal","isOpen","title","body","confirmText","dismissText","onConfirm","onDismiss","metricQueryTransform","response","map","item","text","Name","expandable","HasChildren","Path","split","length","Items","WebId","LABEL_WIDTH","MIN_ATTR_INPUT_WIDTH","REMOVE_LABEL","CustomLabelComponent","Icon","name","PIWebAPIQueryEditor","isValueEmpty","calcBasisValueChanged","segment","metricsQuery","query","getCalcBasisSegments","calculationBasis","calcNoDataValueChanged","getNoDataSegments","noDataReplacement","onSummaryValueChanged","index","summaries","state","slice","splice","setState","stateCallback","getSummarySegments","summaryTypes","filter","s","indexOf","unshift","removeSummary","part","onSummaryAction","selectableValue","push","summarySegment","removeAttribute","attributeChangeValue","onAttributeAction","getSegmentPathUpTo","arr","reduce","result","startsWith","checkAttributeSegments","data","datasource","ctrl","findQuery","path","metricFindQuery","assign","request","scopedVars","then","attributesResponse","validAttributes","each","attribute","substring","filteredAttributes","attrib","changedValue","templateSrv","replace","availableAttributes","catch","err","error","message","checkPiPointSegments","webId","getSelectedPIServer","pointName","webID","piServer","forEach","parts","textEditorChanged","splitAttributes","splitElements","_","match","getElementSegments","elements","updateArray","rawQuery","checkAfServer","queryProps","onRunQuery","defaults","display","piPointConfig","onIsPiPointChange","InlineFieldRow","grow","Input","onBlur","SegmentAsync","Component","onSegmentChange","loadOptions","allowCustomValue","inputMinWidth","disabled","getAttributeSegmentsPI","reloadOptionsOnChange","Segment","onAttributeChange","getAttributeSegmentsAF","attributeSegment","useUnitConfig","maxNumber","parseInt","search","constructor","super","calculationBasisSegment","noDataReplacementSegment","segmentChangeValue","Promise","resolve","remove","currentSegment","afServerWebId","items","altSegments","variables","getVariables","variable","attributeText","forOwn","val","buildFromTarget","segmentsArray","attributesArray","summariesArray","cb","scopedVarsDone","componentDidMount","initialLoad","componentDidUpdate","force","_segmentsArray","e","console","elementPath","tr","join","parseRawQuery","isValidQuery","trim","targetSplit","queryChange","bind","PiWebAPIAnnotationsQueryEditor","memo","annotation","afWebId","setAfWebId","database","setDatabase","getValue","getAssetServer","AsyncSelect","getDatabases","dbs","loadingMessage","template","defaultOptions","getEventFrameTemplates","templ","showEndTime","currentTarget","categoryName","nameFilter","PiWebAPIDatasource","DataSourceWithBackend","applyTemplateVariables","targets","isAnnotation","buildQueryParameters","of","queryOptions","ds","querydepth","JSON","parse","Math","max","min","getAssetServers","server","getDatabase","db","getDatabaseElements","selectedFields","getElement","element","getElements","getAttributes","searchFullHierarchy","maxCount","getDataServers","piPointSearch","reject","hide","maxDataPoints","tar","att","refId","webid","startTime","range","from","endTime","to","annon","annotationOptions","events","currentLocale","Intl","DateTimeFormat","resolvedOptions","locale","values","transformDataFrameToMap","i","RegExp","Date","toLocaleString","time","timeEnd","id","tags","dataFrame","fields","field","toArray","observable","backendSrv","fetch","method","headers","firstValueFrom","restGet","getDataServer","serverId","databaseId","InstanceType","getElementTemplates","elementId","querystring","filter1","filter2","doFilter","m","exec","lastIndex","groupIndex","results","instanceSettings","getTemplateSrv","getBackendSrv","newFormatConfig","annotations","QueryEditor","prepareQuery","anno","queryType","processEvents","eventFrameToAnnotation","all","plugin","DataSourcePlugin","setQueryEditor","setConfigEditor"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"module.js","mappings":"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","sources":["webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"@grafana/data\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"@grafana/runtime\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"@grafana/ui\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"lodash\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"react\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"rxjs\"","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/bootstrap","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/runtime/compat get default export","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/runtime/define property getters","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/runtime/hasOwnProperty shorthand","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/runtime/make namespace object","webpack://gridprotectionalliance-osisoftpi-datasource/./config/ConfigEditor.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./components/Forms.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./types.ts","webpack://gridprotectionalliance-osisoftpi-datasource/./components/QueryEditorModeSwitcher.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./helper.ts","webpack://gridprotectionalliance-osisoftpi-datasource/./query/QueryEditor.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./query/AnnotationsQueryEditor.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./datasource.ts","webpack://gridprotectionalliance-osisoftpi-datasource/./module.ts"],"sourcesContent":["module.exports = __WEBPACK_EXTERNAL_MODULE__781__;","module.exports = __WEBPACK_EXTERNAL_MODULE__531__;","module.exports = __WEBPACK_EXTERNAL_MODULE__7__;","module.exports = __WEBPACK_EXTERNAL_MODULE__241__;","module.exports = __WEBPACK_EXTERNAL_MODULE__959__;","module.exports = __WEBPACK_EXTERNAL_MODULE__269__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import React, { ChangeEvent, PureComponent } from 'react';\nimport { LegacyForms, DataSourceHttpSettings, InlineField, InlineSwitch } from '@grafana/ui';\nimport { DataSourcePluginOptionsEditorProps, DataSourceJsonData, DataSourceSettings } from '@grafana/data';\nimport { PIWebAPIDataSourceJsonData } from '../types';\n\nconst { FormField } = LegacyForms;\n\ninterface Props extends DataSourcePluginOptionsEditorProps {}\n\nconst coerceOptions = (\n options: DataSourceSettings\n): DataSourceSettings => {\n return {\n ...options,\n jsonData: {\n ...options.jsonData,\n url: options.url,\n },\n };\n};\n\ninterface State {}\n\nexport class PIWebAPIConfigEditor extends PureComponent {\n onPIServerChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n piserver: event.target.value,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onAFServerChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n afserver: event.target.value,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onAFDatabaseChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n afdatabase: event.target.value,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onHttpOptionsChange = (options: DataSourceSettings) => {\n const { onOptionsChange } = this.props;\n onOptionsChange(coerceOptions(options));\n };\n\n onPiPointChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n piserver: event.target.checked ? options.jsonData.piserver : '',\n pipoint: event.target.checked,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onNewFormatChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n newFormat: event.target.checked,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onUseUnitChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n useUnit: event.target.checked,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onUseExperimentalChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n useExperimental : event.target.checked,\n useStreaming : event.target.checked ? options.jsonData.useStreaming : false,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onUseStreamingChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n useStreaming: event.target.checked,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n render() {\n const { options: originalOptions } = this.props;\n const options = coerceOptions(originalOptions);\n\n return (\n
\n \n\n

Custom Configuration

\n\n
\n
\n \n \n \n
\n
\n \n \n \n
\n
\n \n \n \n
\n
\n \n \n \n
\n {options.jsonData.useExperimental && (\n
\n \n \n \n
\n )}\n
\n\n

PI/AF Connection Details

\n\n
\n {options.jsonData.pipoint && (\n
\n \n
\n )}\n
\n \n
\n
\n \n
\n
\n
\n );\n }\n}\n","import React, { InputHTMLAttributes, FunctionComponent } from 'react';\nimport { InlineFormLabel } from '@grafana/ui';\n\nexport interface Props extends InputHTMLAttributes {\n label: string;\n tooltip?: string;\n labelWidth?: number;\n children?: React.ReactNode;\n queryEditor?: JSX.Element;\n}\n\nexport const QueryField: FunctionComponent> = ({ label, labelWidth = 12, tooltip, children }) => (\n <>\n \n {label}\n \n {children}\n \n);\n\nexport const QueryRowTerminator = () => {\n return (\n
\n
\n
\n );\n};\n\nexport const QueryInlineField = ({ ...props }) => {\n return (\n \n \n \n );\n};\n\nexport const QueryEditorRow = (props: Partial) => {\n return (\n
\n {props.children}\n \n
\n );\n};\n\nexport const QueryRawInlineField = ({ ...props }) => {\n return (\n \n \n \n );\n};\n\nexport const QueryRawEditorRow = (props: Partial) => {\n return <>{props.children};\n};\n","import { DataQuery } from '@grafana/schema';\nimport { DataSourceJsonData, SelectableValue } from '@grafana/data';\n\nexport interface PiwebapiElementPath {\n path: string;\n variable: string;\n}\n\nexport interface PiwebapiInternalRsp {\n data: PiwebapiRsp;\n status: number;\n url: string;\n}\n\nexport interface PiwebapiRsp {\n Name?: string;\n InstanceType?: string;\n Items?: PiwebapiRsp[];\n WebId?: string;\n HasChildren?: boolean;\n Type?: string;\n DefaultUnitsName?: string;\n Description?: string;\n Path?: string;\n}\n\nexport interface PiDataServer {\n name: string | undefined;\n webid: string | undefined;\n}\n\nexport interface PIWebAPISelectableValue {\n webId?: string;\n value?: string;\n type?: string;\n expandable?: boolean;\n}\n\nexport interface PIWebAPIAnnotationsQuery extends DataQuery {\n target: string;\n}\n\nexport interface PIWebAPIQuery extends DataQuery {\n target?: string;\n elementPath?: string;\n attributes?: Array>;\n segments?: any[];\n isPiPoint?: boolean;\n hideError?: boolean;\n isAnnotation?: boolean;\n webid?: string;\n display?: any;\n interpolate?: any;\n recordedValues?: any;\n digitalStates?: any;\n enableStreaming: any;\n useLastValue?: any;\n useUnit?: any;\n regex?: any;\n summary?: {\n nodata?: string,\n types?: any[],\n basis?: string,\n interval?: string\n };\n expression?: string;\n rawQuery?: boolean;\n query?: string;\n // annotations items\n database?: PiwebapiRsp;\n template?: PiwebapiRsp;\n showEndTime?: boolean;\n attribute?: any;\n nameFilter?: string;\n categoryName?: string;\n}\n\nexport const defaultQuery: Partial = {\n target: ';',\n attributes: [],\n segments: [],\n regex: { enable: false },\n summary: { types: [], basis: 'EventWeighted', interval: '', nodata: 'Null' },\n expression: '',\n interpolate: { enable: false },\n useLastValue: { enable: false },\n recordedValues: { enable: false, boundaryType: 'Inside' },\n digitalStates: { enable: false },\n enableStreaming: { enable: false },\n useUnit: { enable: false },\n isPiPoint: false,\n};\n\n/**\n * These are options configured for each DataSource instance\n */\nexport interface PIWebAPIDataSourceJsonData extends DataSourceJsonData {\n url?: string;\n access?: string;\n piserver?: string;\n afserver?: string;\n afdatabase?: string;\n pipoint?: boolean;\n newFormat?: boolean;\n useUnit?: boolean;\n useExperimental?: boolean;\n useStreaming?: boolean;\n}\n\n/**\n * Value that is used in the backend, but never sent over HTTP to the frontend\n */\nexport interface PIWebAPISecureJsonData {\n apiKey?: string;\n}\n","import React, { useEffect, useState } from 'react';\nimport { Button, ConfirmModal } from '@grafana/ui';\n\ntype Props = {\n isRaw: boolean;\n onChange: (newIsRaw: boolean) => void;\n};\n\nexport const QueryEditorModeSwitcher = ({ isRaw, onChange }: Props): JSX.Element => {\n const [isModalOpen, setModalOpen] = useState(false);\n\n useEffect(() => {\n // if the isRaw changes, we hide the modal\n setModalOpen(false);\n }, [isRaw]);\n\n if (isRaw) {\n return (\n <>\n {\n // we show the are-you-sure modal\n setModalOpen(true);\n }}\n >\n {\n onChange(false);\n }}\n onDismiss={() => {\n setModalOpen(false);\n }}\n />\n \n );\n } else {\n return (\n {\n onChange(true);\n }}\n >\n );\n }\n};\n","import { each, map } from 'lodash';\r\n\r\nimport {\r\n AnnotationQuery,\r\n DataFrame,\r\n TableData,\r\n MetricFindValue,\r\n Field,\r\n toDataFrame,\r\n} from '@grafana/data';\r\n\r\nimport { PiwebapiElementPath, PiwebapiRsp, PIWebAPIQuery } from 'types';\r\n\r\nexport function parseRawQuery(tr: string): any {\r\n const splitAttributes = tr.split(';');\r\n const splitElements = splitAttributes[0].split('\\\\');\r\n\r\n // remove element hierarchy from attribute collection\r\n splitAttributes.splice(0, 1);\r\n\r\n let attributes: any[] = [];\r\n if (splitElements.length > 1 || (splitElements.length === 1 && splitElements[0] !== '')) {\r\n const elementPath: string = splitElements.join('\\\\');\r\n each(splitAttributes, function (item, index) {\r\n if (item !== '') {\r\n attributes.push({\r\n label: item,\r\n value: {\r\n value: item,\r\n expandable: false,\r\n },\r\n });\r\n }\r\n });\r\n\r\n return { attributes, elementPath };\r\n }\r\n\r\n return { attributes, elementPath: null };\r\n}\r\n\r\nexport function lowerCaseFirstLetter(string: string): string {\r\n return string.charAt(0).toLocaleLowerCase() + string.slice(1);\r\n}\r\n\r\n/**\r\n * Builds the Grafana metric segment for use on the query user interface.\r\n *\r\n * @param {any} response - response from PI Web API.\r\n * @returns - Grafana metric segment.\r\n *\r\n * @memberOf PiWebApiDatasource\r\n */\r\nexport function metricQueryTransform(response: PiwebapiRsp[]): MetricFindValue[] {\r\n return map(response, (item) => {\r\n return {\r\n text: item.Name,\r\n expandable:\r\n item.HasChildren === undefined || item.HasChildren === true || (item.Path ?? '').split('\\\\').length <= 3,\r\n HasChildren: item.HasChildren,\r\n Items: item.Items ?? [],\r\n Path: item.Path,\r\n WebId: item.WebId,\r\n } as MetricFindValue;\r\n });\r\n}\r\n\r\n/**\r\n * Check if all items are selected.\r\n *\r\n * @param {any} current the current variable selection\r\n * @return {boolean} true if all value is selected, false otherwise\r\n */\r\nexport function isAllSelected(current: any): boolean {\r\n if (!current) {\r\n return false;\r\n }\r\n if (Array.isArray(current.text)) {\r\n return current.text.indexOf('All') >= 0;\r\n }\r\n return current.text === 'All';\r\n}\r\n\r\nexport function processAnnotationQuery(annon: AnnotationQuery,data: DataFrame[]): DataFrame[] {\r\n let processedFrames: DataFrame[] = [];\r\n \r\n data.forEach((d: DataFrame) => {\r\n d.fields.forEach((f: Field) => {\r\n\r\n // check if the label has been set, if it hasn't been set then the eventframe annotation is not valid. \r\n if (!f.labels) { \r\n return \r\n }\r\n\r\n if (!('eventframe' in f.labels)) {\r\n return;\r\n }\r\n\r\n let attribute = 'attribute' in f.labels\r\n\r\n // Check whether f.values is an array or not to allow for each.\r\n // Check whether f.values is an array or not to allow for each.\r\n if (Array.isArray(f.values)) {\r\n f.values.forEach((value: any) => {\r\n\r\n if (attribute) {\r\n let annotation = value['1'].Content\r\n let valueData: any[] = []\r\n for (let i = 2; i in value; i++) {\r\n valueData.push(value[i].Content.Items)\r\n }\r\n\r\n const processedFrame = convertToTableData(annotation.Items!, valueData).map((r) => {\r\n return toDataFrame(r)});\r\n processedFrames = processedFrames.concat(processedFrame);\r\n } else {\r\n let annotation = value['1'].Content\r\n const processedFrame = convertToTableData(annotation.Items!).map((r) => {\r\n return toDataFrame(r)});\r\n processedFrames = processedFrames.concat(processedFrame);\r\n }\r\n });\r\n } \r\n });\r\n });\r\n return processedFrames;\r\n}\r\n\r\nexport function convertToTableData(items: any[], valueData?: any[]): TableData[] {\r\n const response: TableData[] = items.map((item: any, index: number) => {\r\n const columns = [{ text: 'StartTime' }, { text: 'EndTime' }];\r\n const rows = [item.StartTime, item.EndTime];\r\n if (valueData) {\r\n for (let attributeIndex = 0; attributeIndex < valueData.length; attributeIndex++) {\r\n let attributeData = valueData[attributeIndex]\r\n let eventframeAributeData = attributeData[index].Content.Items\r\n eventframeAributeData.forEach((attribute: any) => {\r\n columns.push({ text: attribute.Name });\r\n rows.push(String(attribute.Value.Value ? attribute.Value.Value.Name || attribute.Value.Value.Value || attribute.Value.Value : ''));\r\n });\r\n }\r\n }\r\n\r\n return {\r\n name: item.Name,\r\n columns,\r\n rows: [rows],\r\n };\r\n });\r\n return response;\r\n}\r\n\r\n/**\r\n * Resolve PIWebAPI response 'value' data to value - timestamp pairs.\r\n *\r\n * @param {any} item - 'Item' object from PIWebAPI\r\n * @param {any} noDataReplacementMode - String state of how to replace 'No Data'\r\n * @param {any} grafanaDataPoint - Single Grafana value pair (value, timestamp).\r\n * @returns grafanaDataPoint - Single Grafana value pair (value, timestamp).\r\n * @returns perviousValue - {any} Grafana value (value only).\r\n *\r\n */\r\nexport function noDataReplace(\r\n item: any,\r\n noDataReplacementMode: any,\r\n grafanaDataPoint: any[]\r\n): {\r\n grafanaDataPoint: any[];\r\n previousValue: any;\r\n drop: boolean;\r\n} {\r\n let previousValue = null;\r\n let drop = false;\r\n if (!item.Good || item.Value === 'No Data' || (item.Value?.Name && item.Value?.Name === 'No Data')) {\r\n if (noDataReplacementMode === 'Drop') {\r\n drop = true;\r\n } else if (noDataReplacementMode === '0') {\r\n grafanaDataPoint[0] = 0;\r\n } else if (noDataReplacementMode === 'Keep') {\r\n // Do nothing keep\r\n } else if (noDataReplacementMode === 'Null') {\r\n grafanaDataPoint[0] = null;\r\n } else if (noDataReplacementMode === 'Previous' && previousValue !== null) {\r\n grafanaDataPoint[0] = previousValue;\r\n }\r\n } else {\r\n previousValue = item.Value;\r\n }\r\n return { grafanaDataPoint, previousValue, drop };\r\n}\r\n\r\n/**\r\n * Check if the value is a number.\r\n *\r\n * @param {any} number the value to check\r\n * @returns {boolean} true if the value is a number, false otherwise\r\n */\r\nexport function checkNumber(number: any): boolean {\r\n return typeof number === 'number' && !Number.isNaN(number) && Number.isFinite(number);\r\n}\r\n\r\n/**\r\n * Returns the last item of the element path.\r\n *\r\n * @param {string} path element path\r\n * @returns {string} last item of the element path\r\n */\r\nexport function getLastPath(path: string): string {\r\n let splitPath = path.split('|');\r\n if (splitPath.length === 0) {\r\n return '';\r\n }\r\n splitPath = splitPath[0].split('\\\\');\r\n return splitPath.length === 0 ? '' : splitPath.pop() ?? '';\r\n}\r\n\r\n/**\r\n * Returns the last item of the element path plus variable.\r\n *\r\n * @param {PiwebapiElementPath[]} elementPathArray array of element paths\r\n * @param {string} path element path\r\n * @returns {string} last item of the element path\r\n */\r\nexport function getPath(elementPathArray: PiwebapiElementPath[], path: string): string {\r\n if (!path || elementPathArray.length === 0) {\r\n return '';\r\n }\r\n const splitStr = getLastPath(path);\r\n const foundElement = elementPathArray.find((e) => path.indexOf(e.path) >= 0)?.variable;\r\n return foundElement ? foundElement + '|' + splitStr : splitStr;\r\n}\r\n\r\n/**\r\n * Replace calculation dot in expression with PI point name.\r\n *\r\n * @param {boolean} replace - is pi point and calculation.\r\n * @param {PiwebapiRsp} webid - Pi web api response object.\r\n * @param {string} url - original url.\r\n * @returns Modified url\r\n */\r\nexport function getFinalUrl(replace: boolean, webid: PiwebapiRsp, url: string) {\r\n const newUrl = replace ? url.replace(/'\\.'/g, `'${webid.Name}'`) : url;\r\n return newUrl;\r\n}\r\n","import { each, filter, forOwn, join, reduce, map, slice, remove, defaults } from 'lodash';\n\nimport React, { PureComponent, ChangeEvent } from 'react';\nimport { Icon, InlineField, InlineFieldRow, InlineSwitch, Input, SegmentAsync, Segment } from '@grafana/ui';\nimport { QueryEditorProps, SelectableValue, TypedVariableModel } from '@grafana/data';\n\nimport { PiWebAPIDatasource } from '../datasource';\nimport { QueryInlineField, QueryRawInlineField, QueryRowTerminator } from '../components/Forms';\nimport { PIWebAPISelectableValue, PIWebAPIDataSourceJsonData, PIWebAPIQuery, defaultQuery } from '../types';\nimport { QueryEditorModeSwitcher } from 'components/QueryEditorModeSwitcher';\nimport { parseRawQuery } from 'helper';\n\nconst LABEL_WIDTH = 24;\nconst LABEL_SWITCH_WIDTH = 49.067 / 8.0;\nconst MIN_ELEM_INPUT_WIDTH = 200;\nconst MIN_ATTR_INPUT_WIDTH = 250;\n\ninterface State {\n isPiPoint: boolean;\n hideError: boolean;\n segments: Array>;\n attributes: Array>;\n summaries: Array>;\n attributeSegment: SelectableValue;\n summarySegment: SelectableValue;\n calculationBasisSegment: SelectableValue;\n noDataReplacementSegment: SelectableValue;\n}\n\ntype Props = QueryEditorProps;\n\nconst REMOVE_LABEL = '-REMOVE-';\n\nconst CustomLabelComponent = (props: any) => {\n if (props.value) {\n return (\n
\n {props.label ?? '--no label--'}\n
\n );\n }\n return (\n \n \n \n );\n};\n\nexport class PIWebAPIQueryEditor extends PureComponent {\n error: any;\n piServer: any[] = [];\n availableAttributes: any = {};\n summaryTypes: string[];\n calculationBasis: string[];\n recordedBoundaryTypes: string [];\n noDataReplacement: string[];\n state: State = {\n isPiPoint: false,\n hideError: false,\n segments: [],\n attributes: [],\n summaries: [],\n attributeSegment: {},\n summarySegment: {},\n calculationBasisSegment: {},\n noDataReplacementSegment: {},\n };\n\n constructor(props: any) {\n super(props);\n this.onSegmentChange = this.onSegmentChange.bind(this);\n this.calcBasisValueChanged = this.calcBasisValueChanged.bind(this);\n this.recordedBoundaryTypeValueChanged = this.recordedBoundaryTypeValueChanged.bind(this);\n this.calcNoDataValueChanged = this.calcNoDataValueChanged.bind(this);\n this.onSummaryAction = this.onSummaryAction.bind(this);\n this.onSummaryValueChanged = this.onSummaryValueChanged.bind(this);\n this.onAttributeAction = this.onAttributeAction.bind(this);\n this.onAttributeChange = this.onAttributeChange.bind(this);\n\n this.summaryTypes = [\n // 'None', // A summary type is not specified.\n 'Total', // A totalization over the time range.\n 'Average', // The average value over the time range.\n 'Minimum', // The minimum value over the time range.\n 'Maximum', // The maximum value over the time range.\n 'Range', // The range value over the time range (minimum-maximum).\n 'StdDev', // The standard deviation over the time range.\n 'PopulationStdDev', // The population standard deviation over the time range.\n 'Count', // The sum of event count over the time range when calculation basis is event weighted. The sum of event time duration over the time range when calculation basis is time weighted.\n 'PercentGood', // Percent of data with good value during the calculation period. For time weighted calculations, the percentage is based on time. For event weighted calculations, the percent is based on event count.\n 'All', // A convenience for requesting all available summary calculations.\n 'AllForNonNumeric', // A convenience for requesting all available summary calculations for non-numeric data.\n ];\n\n this.calculationBasis = [\n 'TimeWeighted', // Weight the values in the calculation by the time over which they apply. Interpolation is based on whether the attribute is stepped. Interpolated events are generated at the boundaries if necessary.\n 'EventWeighted', // Evaluate values with equal weighting for each event. No interpolation is done. There must be at least one event within the time range to perform a successful calculation. Two events are required for standard deviation. In handling events at the boundary of the calculation, the AFSDK uses following rules:\n 'TimeWeightedContinuous', // Apply weighting as in TimeWeighted, but do all interpolation between values as if they represent continuous data, (standard interpolation) regardless of whether the attribute is stepped.\n 'TimeWeightedDiscrete', // Apply weighting as in TimeWeighted but interpolation between values is performed as if they represent discrete, unrelated values (stair step plot) regardless of the attribute is stepped.\n 'EventWeightedExcludeMostRecentEvent', // The calculation behaves the same as _EventWeighted_, except in the handling of events at the boundary of summary intervals in a multiple intervals calculation. Use this option to prevent events at the intervals boundary from being double count at both intervals. With this option, events at the end time (most recent time) of an interval is not used in that interval.\n 'EventWeightedExcludeEarliestEvent', // Similar to the option _EventWeightedExcludeMostRecentEvent_. Events at the start time(earliest time) of an interval is not used in that interval.\n 'EventWeightedIncludeBothEnds', // Events at both ends of the interval boundaries are included in the event weighted calculation.\n ];\n\n this.recordedBoundaryTypes = [\n 'Inside', // Default. Specifies to return the recorded values on the inside of the requested time range as the first and last values. \n 'Outside', // Specifies to return the recorded values on the outside of the requested time range as the first and last values.\n 'Interpolated', //Specifies to create an interpolated value at the end points of the requested time range if a recorded value does not exist at that time.\n ]\n\n this.noDataReplacement = [\n 'Null', // replace with nulls\n 'Drop', // drop items\n 'Previous', // use previous value if available\n '0', // replace with 0\n 'Keep', // Keep value\n ];\n }\n\n // is selected segment empty\n isValueEmpty(value: PIWebAPISelectableValue | undefined) {\n return !value || !value.value || !value.value.length || value.value === REMOVE_LABEL;\n }\n\n segmentChangeValue = (segments: Array>) => {\n const query = this.props.query;\n this.setState({ segments }, () => this.onChange({ ...query, segments }));\n };\n\n attributeChangeValue = (attributes: Array>): Promise => {\n const query = this.props.query;\n return new Promise((resolve) => this.setState({ attributes }, () => {\n this.onChange({ ...query, attributes })\n resolve();\n }));\n };\n\n // summary calculation basis change event\n calcBasisValueChanged(segment: SelectableValue) {\n const metricsQuery = this.props.query as PIWebAPIQuery;\n const summary = metricsQuery.summary;\n if (summary) {\n summary.basis = segment.value?.value;\n }\n this.onChange({ ...metricsQuery, summary });\n }\n // get summary calculation basis user interface segments\n getCalcBasisSegments() {\n const segments = map(this.calculationBasis, (item: string) => {\n let selectableValue: SelectableValue = {\n label: item,\n value: {\n value: item,\n expandable: true,\n },\n };\n return selectableValue;\n });\n return segments;\n }\n\n // recorded boundary type change event\n recordedBoundaryTypeValueChanged(segment: SelectableValue) {\n const metricsQuery = this.props.query as PIWebAPIQuery;\n const recordedValues = metricsQuery.recordedValues;\n if (recordedValues) {\n recordedValues.boundaryType = segment.value?.value;\n }\n this.onChange({ ...metricsQuery, recordedValues });\n }\n // get recorded boundary type user interface segments\n getRecordedBoundaryTypeSegments() {\n const segments = map(this.recordedBoundaryTypes, (item: string) => {\n let selectableValue: SelectableValue = {\n label: item,\n value: {\n value: item,\n expandable: true,\n },\n };\n return selectableValue;\n });\n return segments;\n }\n\n // no data change event\n calcNoDataValueChanged(segment: SelectableValue) {\n const metricsQuery = this.props.query as PIWebAPIQuery;\n const summary = metricsQuery.summary;\n if (summary) {\n summary.nodata = segment.value?.value;\n }\n this.onChange({ ...metricsQuery, summary });\n }\n // get no data user interface segments\n getNoDataSegments() {\n const segments = map(this.noDataReplacement, (item: string) => {\n let selectableValue: SelectableValue = {\n label: item,\n value: {\n value: item,\n expandable: true,\n },\n };\n return selectableValue;\n });\n return segments;\n }\n\n // summary query change event\n onSummaryValueChanged(item: SelectableValue, index: number) {\n const summaries = this.state.summaries.slice(0) as Array>;\n summaries[index] = item;\n if (this.isValueEmpty(item.value)) {\n summaries.splice(index, 1);\n }\n this.setState({ summaries }, this.stateCallback);\n }\n // get the list of summaries available\n getSummarySegments() {\n const summaryTypes = filter(this.summaryTypes, (type) => {\n return this.state.summaries.map((s) => s.value?.value).indexOf(type) === -1;\n });\n\n const segments = map(summaryTypes, (item: string) => {\n let selectableValue: SelectableValue = {\n label: item,\n value: {\n value: item,\n expandable: true,\n },\n };\n return selectableValue;\n });\n\n segments.unshift({\n label: REMOVE_LABEL,\n value: {\n value: REMOVE_LABEL,\n },\n });\n\n return segments;\n }\n\n // remove a summary from the user interface and the query\n removeSummary(part: SelectableValue) {\n const summaries = filter(this.state.summaries, (item: SelectableValue) => {\n return item !== part;\n });\n this.setState({ summaries });\n }\n // add a new summary to the query\n onSummaryAction(item: SelectableValue) {\n const summaries = this.state.summaries.slice(0) as Array>;\n // if value is not empty, add new attribute segment\n if (!this.isValueEmpty(item.value)) {\n let selectableValue: SelectableValue = {\n label: item.label,\n value: {\n value: item.value?.value,\n expandable: true,\n },\n };\n summaries.push(selectableValue);\n }\n this.setState({ summarySegment: {}, summaries }, this.stateCallback);\n }\n\n // remove an attribute from the query\n removeAttribute(part: SelectableValue) {\n const attributes = filter(this.state.attributes, (item: SelectableValue) => {\n return item !== part;\n });\n this.attributeChangeValue(attributes);\n }\n // add an attribute to the query\n onAttributeAction(item: SelectableValue) {\n const { query } = this.props;\n const attributes = this.state.attributes.slice(0);\n // partial variable\n if (item.value !== null && typeof item.value !== 'object' && !Array.isArray(item.value)) {\n const value = String(item.value! as string);\n item.value = {\n type: value.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: value,\n }\n }\n\n // if value is not empty, add new attribute segment\n if (!this.isValueEmpty(item.value)) {\n let selectableValue: SelectableValue = {\n label: item.label,\n value: {\n type: item.value?.value && item.value?.value.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: item.value?.value,\n expandable: !query.isPiPoint,\n },\n };\n attributes.push(selectableValue);\n }\n this.attributeChangeValue(attributes);\n }\n\n // pi point change event\n onPiPointChange = (item: SelectableValue, index: number) => {\n let attributes = this.state.attributes.slice(0);\n\n if (item.label === REMOVE_LABEL) {\n remove(attributes, (_, n) => n === index);\n } else {\n // set current value\n attributes[index] = item;\n }\n\n this.checkPiPointSegments(item, attributes);\n };\n // attribute change event\n onAttributeChange = (item: SelectableValue, index: number) => {\n let attributes = this.state.attributes.slice(0);\n\n // ignore if no change\n if (attributes[index].label === item.value?.value) {\n return;\n }\n\n // set current value\n attributes[index] = item;\n\n this.checkAttributeSegments(attributes, this.state.segments);\n };\n // segment change\n onSegmentChange = (item: SelectableValue, index: number) => {\n const { query } = this.props;\n let segments = this.state.segments.slice(0);\n\n // partial variable\n if (item.value !== null && typeof item.value !== 'object' && !Array.isArray(item.value)) {\n const value = String(item.value! as string);\n item.value = {\n type: value.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: value,\n }\n }\n\n // ignore if no change\n if (segments[index].label === item.value?.value) {\n return;\n }\n\n // reset attributes list\n this.setState({ attributes: [] }, () => {\n if (item.label === REMOVE_LABEL) {\n segments = slice(segments, 0, index);\n this.checkAttributeSegments([], segments).then(() => {\n if (segments.length === 0) {\n segments.push({\n label: '',\n });\n } else if (!!segments[segments.length - 1].value?.expandable) {\n segments.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n if (query.isPiPoint) {\n this.piServer = [];\n }\n this.segmentChangeValue(segments);\n });\n return;\n }\n\n // set current value\n segments[index] = item;\n\n // Accept only one PI server\n if (query.isPiPoint) {\n this.piServer.push(item);\n this.segmentChangeValue(segments);\n return;\n }\n\n // changed internal selection\n if (index < segments.length - 1) {\n segments = slice(segments, 0, index + 1);\n }\n this.checkAttributeSegments([], segments).then((): Promise>> => {\n // add new options\n if (item.value?.type === 'template') { // if it's a variable we need to check for new elements\\\n return this.getElementSegments(segments.length + 1, segments).then((elements) => {\n if (elements.length > 0) {\n segments[index].value!.expandable = true;\n segments.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n this.segmentChangeValue(segments);\n return segments;\n });\n } else if (!!item.value?.expandable) {\n segments.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n return new Promise((resolve) => {\n this.segmentChangeValue(segments);\n resolve(segments);\n });\n });\n });\n };\n\n // get a ui segment for the attributes\n getElementSegments = (\n index: number,\n currentSegment?: Array>\n ): Promise>> => {\n const { datasource, query, data } = this.props;\n const ctrl = this;\n const findQuery = query.isPiPoint\n ? { type: 'dataserver' }\n : {\n path: this.getSegmentPathUpTo(currentSegment ?? this.state.segments.slice(0), index),\n afServerWebId: this.state.segments.length > 0 && this.state.segments[0].value ? this.state.segments[0].value.webId : undefined,\n };\n\n if (!query.isPiPoint) {\n if (datasource.afserver?.name && index === 0) {\n return Promise.resolve([\n {\n label: datasource.afserver.name,\n value: {\n value: datasource.afserver.name,\n expandable: true,\n },\n },\n ]);\n }\n if (datasource.afserver?.name && datasource.afdatabase?.name && index === 1) {\n return Promise.resolve([\n {\n label: datasource.afdatabase.name,\n value: {\n value: datasource.afdatabase.name,\n expandable: true,\n },\n },\n ]);\n }\n }\n return datasource\n .metricFindQuery(findQuery, Object.assign(data?.request?.scopedVars ?? {}, { isPiPoint: query.isPiPoint }))\n .then((items: any[]) => {\n const altSegments = map(items, (item: any) => {\n let selectableValue: SelectableValue = {\n label: item.text,\n value: {\n webId: item.WebId,\n value: item.text,\n expandable: !query.isPiPoint && item.expandable,\n },\n };\n return selectableValue;\n });\n\n if (altSegments.length === 0) {\n return altSegments;\n }\n\n // add template variables\n const variables = datasource.templateSrv.getVariables();\n each(variables, (variable: TypedVariableModel) => {\n let selectableValue: SelectableValue = {\n label: '${' + variable.name + '}',\n value: {\n type: 'template',\n value: '${' + variable.name + '}',\n expandable: !query.isPiPoint,\n },\n };\n altSegments.unshift(selectableValue);\n });\n\n // add remove label\n altSegments.unshift({\n label: REMOVE_LABEL,\n value: {\n value: REMOVE_LABEL,\n },\n });\n\n return altSegments;\n })\n .catch((err: any) => {\n ctrl.error = err.message || 'Failed to issue metric query';\n return [];\n });\n };\n\n // get the list of attributes for the user interface - PI\n getAttributeSegmentsPI = (attributeText?: string): Promise>> => {\n const { datasource, query, data } = this.props;\n const ctrl = this;\n const findQuery = {\n path: '',\n webId: this.getSelectedPIServer(),\n pointName: (attributeText ?? '') + '*',\n type: 'pipoint',\n };\n let segments: Array> = [];\n return datasource\n .metricFindQuery(findQuery, Object.assign(data?.request?.scopedVars ?? {}, { isPiPoint: query.isPiPoint }))\n .then((items: any[]) => {\n segments = map(items, (item: any) => {\n let selectableValue: SelectableValue = {\n path: item.Path,\n label: item.text,\n value: {\n value: item.text,\n expandable: false,\n },\n };\n return selectableValue;\n });\n if (!!attributeText && attributeText.length > 0) {\n segments.unshift({\n label: attributeText,\n value: {\n value: attributeText,\n expandable: false,\n },\n });\n }\n // add template variables\n const variables = datasource.templateSrv.getVariables();\n each(variables, (variable: TypedVariableModel) => {\n let selectableValue: SelectableValue = {\n label: '${' + variable.name + '}',\n value: {\n type: 'template',\n value: '${' + variable.name + '}',\n expandable: !query.isPiPoint,\n },\n };\n segments.unshift(selectableValue);\n });\n\n // add remove label\n segments.unshift({\n label: REMOVE_LABEL,\n value: {\n value: REMOVE_LABEL,\n },\n });\n\n return segments;\n })\n .catch((err: any) => {\n ctrl.error = err.message || 'Failed to issue metric query';\n return segments;\n });\n };\n\n // get the list of attributes for the user interface - AF\n getAttributeSegmentsAF = (attributeText?: string): Array> => {\n const { datasource } = this.props;\n const ctrl = this;\n let segments: Array> = [];\n\n segments.push({\n label: REMOVE_LABEL,\n value: {\n value: REMOVE_LABEL,\n },\n });\n\n // add template variables\n const variables = datasource.templateSrv.getVariables();\n each(variables, (variable: TypedVariableModel) => {\n let selectableValue: SelectableValue = {\n label: '${' + variable.name + '}',\n value: {\n type: 'template',\n value: '${' + variable.name + '}',\n expandable: false,\n },\n };\n segments.push(selectableValue);\n });\n\n forOwn(ctrl.availableAttributes, (val: any, key: string) => {\n let selectableValue: SelectableValue = {\n label: key,\n value: {\n value: key,\n expandable: true,\n },\n };\n segments.push(selectableValue);\n });\n\n return segments;\n };\n\n // build data from target string\n buildFromTarget = (\n query: PIWebAPIQuery,\n segmentsArray: Array>,\n attributesArray: Array>\n ) => {\n const splitAttributes = query.target!.split(';');\n const splitElements = splitAttributes.length > 0 ? splitAttributes[0].split('\\\\') : [];\n\n if (splitElements.length > 1 || (splitElements.length === 1 && splitElements[0] !== '')) {\n // remove element hierarchy from attribute collection\n splitAttributes.splice(0, 1);\n\n each(splitElements, (item, _) => {\n segmentsArray.push({\n label: item,\n value: {\n type: item.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: item,\n expandable: true,\n },\n });\n });\n each(splitAttributes, (item, _) => {\n if (item !== '') {\n // set current value\n attributesArray.push({\n label: item,\n value: {\n type: item.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: item,\n expandable: false,\n },\n });\n }\n });\n return this.getElementSegments(splitElements.length + 1, segmentsArray).then((elements) => {\n if (elements.length > 0) {\n segmentsArray.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n return segmentsArray;\n });\n }\n return Promise.resolve(segmentsArray);\n };\n\n /**\n * Gets the segment information and parses it to a string.\n *\n * @param {any} index - Last index of segment to use.\n * @returns - AF Path or PI Point name.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n getSegmentPathUpTo(segments: Array>, index: number): string {\n const arr = segments.slice(0, index);\n\n return reduce(\n arr,\n (result: any, segment: SelectableValue) => {\n if (!segment.value) {\n return '';\n }\n if (!segment.value.value?.startsWith('-Select')) {\n return result ? result + '\\\\' + segment.value.value : segment.value.value;\n }\n return result;\n },\n ''\n );\n }\n\n /**\n * Get the current AF Element's child attributes. Validates when the element selection changes.\n *\n * @returns - Collection of attributes.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n checkAttributeSegments(\n attributes: Array>,\n segments: Array>\n ): Promise {\n const { datasource, data } = this.props;\n const ctrl = this;\n const findQuery = {\n path: this.getSegmentPathUpTo(segments.slice(0), segments.length),\n type: 'attributes',\n };\n return datasource\n .metricFindQuery(findQuery, Object.assign(data?.request?.scopedVars ?? {}, { isPiPoint: false }))\n .then((attributesResponse: any) => {\n const validAttributes: any = {};\n\n each(attributesResponse, (attribute: any) => {\n validAttributes[attribute.Path.substring(attribute.Path.indexOf('|') + 1)] = attribute.WebId;\n });\n\n const filteredAttributes = filter(attributes, (attrib: SelectableValue) => {\n const changedValue = datasource.templateSrv.replace(attrib.value?.value);\n return validAttributes[changedValue] !== undefined;\n });\n\n ctrl.availableAttributes = validAttributes;\n return this.attributeChangeValue(filteredAttributes);\n })\n .catch((err: any) => {\n ctrl.error = err.message || 'Failed to issue metric query';\n return this.attributeChangeValue(attributes);\n });\n }\n\n /**\n * Get PI points from server.\n *\n * @returns - Collection of attributes.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n checkPiPointSegments(\n attribute: SelectableValue,\n attributes: Array>\n ) {\n const { datasource, data } = this.props;\n const ctrl = this;\n const findQuery = {\n path: attribute.path,\n webId: ctrl.getSelectedPIServer(),\n pointName: attribute.label,\n type: 'pipoint',\n };\n return datasource\n .metricFindQuery(findQuery, Object.assign(data?.request?.scopedVars ?? {}, { isPiPoint: true }))\n .then(() => {\n return ctrl.attributeChangeValue(attributes);\n })\n .catch((err: any) => {\n ctrl.error = err.message || 'Failed to issue metric query';\n return ctrl.attributeChangeValue([]);\n });\n }\n\n /**\n * Gets the webid of the current selected pi data server.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n getSelectedPIServer() {\n let webID = '';\n\n this.piServer.forEach((s) => {\n const parts = this.props.query.target!.split(';');\n if (parts.length >= 2) {\n if (parts[0] === s.text) {\n webID = s.WebId;\n return;\n }\n }\n });\n return this.piServer.length > 0 ? this.piServer[0].value?.webId : webID;\n }\n\n /**\n * Queries PI Web API for child elements and attributes when the raw query text editor is changed.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n textEditorChanged() {\n const { query } = this.props;\n const splitAttributes = query.target!.split(';');\n const splitElements = splitAttributes.length > 0 ? splitAttributes[0].split('\\\\') : [];\n\n let segments: Array> = [];\n let attributes: Array> = [];\n\n if (splitElements.length > 1 || (splitElements.length === 1 && splitElements[0] !== '')) {\n // remove element hierarchy from attribute collection\n splitAttributes.splice(0, 1);\n\n each(splitElements, (item, _) => {\n segments.push({\n label: item,\n value: {\n type: item.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: item,\n expandable: true,\n },\n });\n });\n each(splitAttributes, function (item, index) {\n if (item !== '') {\n attributes.push({\n label: item,\n value: {\n type: item.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: item,\n expandable: false,\n },\n });\n }\n });\n this.getElementSegments(splitElements.length + 1, segments)\n .then((elements) => {\n if (elements.length > 0) {\n segments.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n })\n .then(() => {\n this.updateArray(segments, attributes, this.state.summaries, query.isPiPoint!, () => {\n this.onChange({\n ...query,\n query: undefined,\n rawQuery: false,\n attributes: this.state.attributes,\n segments: this.state.segments,\n });\n });\n });\n } else {\n segments = this.checkAfServer();\n this.updateArray(segments, this.state.attributes, this.state.summaries, query.isPiPoint!, () => {\n this.onChange({\n ...query,\n query: undefined,\n rawQuery: false,\n attributes: this.state.attributes,\n segments: this.state.segments,\n });\n });\n }\n }\n\n /**\n * Check if the AF server and database are configured in the datasoure config.\n *\n * @returns the segments array\n *\n * @memberOf PIWebAPIQueryEditor\n */\n checkAfServer = () => {\n const { datasource } = this.props;\n const segmentsArray = [];\n if (datasource.afserver?.name) {\n segmentsArray.push({\n label: datasource.afserver.name,\n value: {\n value: datasource.afserver.name,\n expandable: true,\n },\n });\n if (datasource.afdatabase?.name) {\n segmentsArray.push({\n label: datasource.afdatabase.name,\n value: {\n value: datasource.afdatabase.name,\n expandable: true,\n },\n });\n }\n segmentsArray.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n } else {\n segmentsArray.push({\n label: '',\n });\n }\n return segmentsArray;\n };\n\n /**\n * Update the internal state of the datasource.\n *\n * @param segmentsArray the segments array to update\n * @param attributesArray the AF attributes array to update\n * @param summariesArray the summaries array to update\n * @param isPiPoint the is PI point flag\n * @param cb optional callback function\n *\n * @memberOf PIWebAPIQueryEditor\n */\n updateArray = (\n segmentsArray: Array>,\n attributesArray: Array>,\n summariesArray: Array>,\n isPiPoint: boolean,\n cb?: (() => void) | undefined\n ) => {\n this.setState(\n {\n segments: segmentsArray,\n attributes: attributesArray,\n summaries: summariesArray,\n isPiPoint,\n },\n () => {\n if (!isPiPoint) {\n this.checkAttributeSegments(attributesArray, this.state.segments).then(() => {\n if (cb) {\n cb();\n }\n });\n }\n }\n );\n };\n\n // React action when component is initialized/updated\n scopedVarsDone = false;\n componentDidMount = () => {\n this.initialLoad(false);\n };\n\n componentDidUpdate = () => {\n const { query } = this.props;\n if (this.props.data?.state === 'Done' && !!this.props.data?.request?.scopedVars && !this.scopedVarsDone) {\n this.scopedVarsDone = true;\n this.initialLoad(!query.isPiPoint);\n }\n };\n\n initialLoad = (force: boolean) => {\n const { query } = this.props;\n const metricsQuery = defaults(query, defaultQuery) as PIWebAPIQuery;\n const { segments, attributes, summary, isPiPoint } = metricsQuery;\n\n let segmentsArray: Array> = force ? [] : segments?.slice(0) ?? [];\n let attributesArray: Array> = force ? [] : attributes?.slice(0) ?? [];\n let summariesArray = summary?.types ?? [];\n\n if (!isPiPoint && segmentsArray.length === 0) {\n if (query.target && query.target.length > 0 && query.target !== ';') {\n attributesArray = [];\n // Build query from target\n this.buildFromTarget(query, segmentsArray, attributesArray)\n .then((_segmentsArray) => {\n this.updateArray(_segmentsArray, attributesArray, summariesArray, false);\n })\n .catch((e) => console.error(e));\n return;\n } else {\n segmentsArray = this.checkAfServer();\n }\n } else if (isPiPoint && segmentsArray.length > 0) {\n this.piServer = segmentsArray;\n }\n this.updateArray(segmentsArray, attributesArray, summariesArray, !!isPiPoint, () => {\n this.onChange(query);\n });\n };\n\n onChange = (query: PIWebAPIQuery) => {\n const { onChange, onRunQuery } = this.props;\n\n if (query.rawQuery) {\n query.target = query.query ?? '';\n if (!!query.query) {\n const { attributes, elementPath } = parseRawQuery(query.target);\n query.attributes = attributes;\n query.elementPath = elementPath;\n }\n } else {\n query.elementPath = this.getSegmentPathUpTo(this.state.segments, this.state.segments.length);\n query.target =\n query.elementPath +\n ';' +\n join(\n query.attributes?.map((s) => s.value?.value),\n ';'\n );\n }\n const summary = query.summary;\n if (summary) {\n summary.types = this.state.summaries;\n }\n\n onChange({...query, summary});\n\n if (this.isValidQuery(query)) {\n onRunQuery();\n }\n };\n\n isValidQuery = (query: PIWebAPIQuery): boolean => {\n if (query.target && query.target.length > 0 && query.target !== \";\") {\n query.target = query.target.trim();\n const targetSplit = query.target.split(\";\", 2);\n return targetSplit.length === 2 && targetSplit[0].length > 0 && targetSplit[1].length > 0;\n }\n return false;\n }\n\n stateCallback = () => {\n const query = this.props.query as PIWebAPIQuery;\n this.onChange(query);\n };\n\n onIsPiPointChange = (event: React.SyntheticEvent) => {\n const { query: queryChange } = this.props;\n const isPiPoint = !queryChange.isPiPoint;\n this.setState(\n {\n segments: isPiPoint ? [{ label: '' }] : this.checkAfServer(),\n attributes: [],\n isPiPoint,\n },\n () => {\n this.onChange({\n ...queryChange,\n expression: '',\n attributes: this.state.attributes,\n segments: this.state.segments,\n isPiPoint,\n });\n }\n );\n };\n\n onHideErrorChange = (event: React.SyntheticEvent) => {\n const { query: queryChange } = this.props;\n const hideError = !queryChange.hideError;\n this.setState(\n {\n hideError,\n },\n () => {\n this.onChange({\n ...queryChange,\n hideError,\n });\n }\n );\n };\n\n render() {\n const { query: queryProps, onChange, onRunQuery } = this.props;\n const metricsQuery = defaults(queryProps, defaultQuery) as PIWebAPIQuery;\n const {\n useLastValue,\n useUnit,\n interpolate,\n query,\n rawQuery,\n digitalStates,\n enableStreaming,\n recordedValues,\n expression,\n isPiPoint,\n hideError,\n summary,\n display,\n regex,\n } = metricsQuery;\n\n return (\n <>\n {this.props.datasource.piPointConfig && (\n \n \n \n )}\n\n {!!rawQuery && (\n \n \n ) =>\n onChange({ ...metricsQuery, query: event.target.value })\n }\n placeholder=\"enter query\"\n />\n \n this.textEditorChanged()} />\n \n )}\n\n {!rawQuery && (\n <>\n
\n \n {this.state.segments.map((segment: SelectableValue, index: number) => {\n return (\n }\n onChange={(item) => this.onSegmentChange(item, index)}\n loadOptions={(query?: string | undefined) => {\n return this.getElementSegments(index);\n }}\n allowCustomValue\n inputMinWidth={MIN_ELEM_INPUT_WIDTH}\n />\n );\n })}\n \n {!isPiPoint && (\n {\n onChange({ ...metricsQuery, query: metricsQuery.target, rawQuery: value });\n }}\n />\n )}\n \n
\n\n \n {this.state.attributes.map((attribute: SelectableValue, index: number) => {\n if (isPiPoint) {\n return (\n }\n disabled={this.piServer.length === 0}\n onChange={(item) => this.onPiPointChange(item, index)}\n loadOptions={this.getAttributeSegmentsPI}\n reloadOptionsOnChange\n allowCustomValue\n inputMinWidth={MIN_ATTR_INPUT_WIDTH}\n />\n );\n }\n return (\n }\n disabled={this.state.segments.length <= 2}\n onChange={(item) => this.onAttributeChange(item, index)}\n options={this.getAttributeSegmentsAF()}\n allowCustomValue\n inputMinWidth={MIN_ATTR_INPUT_WIDTH}\n />\n );\n })}\n\n {isPiPoint && (\n \n }\n disabled={this.piServer.length === 0}\n onChange={this.onAttributeAction}\n loadOptions={this.getAttributeSegmentsPI}\n reloadOptionsOnChange\n allowCustomValue\n inputMinWidth={MIN_ATTR_INPUT_WIDTH}\n />\n )}\n {!isPiPoint && (\n \n }\n disabled={this.state.segments.length <= 2}\n onChange={this.onAttributeAction}\n options={this.getAttributeSegmentsAF()}\n allowCustomValue\n inputMinWidth={MIN_ATTR_INPUT_WIDTH}\n />\n )}\n \n \n )}\n\n \n \n ) =>\n onChange({ ...metricsQuery, expression: event.target.value })\n }\n placeholder=\"'.'*2\"\n />\n \n \n\n \n \n \n this.onChange({\n ...metricsQuery,\n useLastValue: { ...useLastValue, enable: !useLastValue.enable },\n })\n }\n />\n \n \n \n this.onChange({\n ...metricsQuery,\n digitalStates: { ...digitalStates, enable: !digitalStates.enable },\n })\n }\n />\n \n \n \n }\n onChange={this.calcNoDataValueChanged}\n options={this.getNoDataSegments()}\n allowCustomValue\n />\n \n \n \n \n {this.props.datasource.useUnitConfig && (\n \n \n this.onChange({\n ...metricsQuery,\n useUnit: { ...useUnit, enable: !useUnit.enable },\n })\n }\n />\n \n )}\n {this.props.datasource.useStreaming && (\n \n \n this.onChange({ ...metricsQuery, enableStreaming: { ...enableStreaming, enable: !enableStreaming.enable } })\n }\n />\n \n )}\n \n \n {!useLastValue.enable && !recordedValues.enable && (\n \n \n \n this.onChange({ ...metricsQuery, interpolate: { ...interpolate, enable: !interpolate.enable, interval: null } })\n }\n />\n \n \n ) =>\n onChange({ ...metricsQuery, interpolate: { ...interpolate, interval: event.target.value } })\n }\n placeholder=\"30s\"\n />\n \n \n )}\n\n {!useLastValue.enable && !interpolate.enable && (\n \n \n \n this.onChange({\n ...metricsQuery,\n recordedValues: { ...recordedValues, enable: !recordedValues.enable, maxNumber: null, boundaryType: 'Inside' },\n })\n }\n />\n \n \n ) =>\n onChange({\n ...metricsQuery,\n recordedValues: { ...recordedValues, maxNumber: parseInt(event.target.value, 10) },\n })\n }\n type=\"number\"\n placeholder=\"1000\"\n />\n \n \n \n }\n onChange={this.recordedBoundaryTypeValueChanged}\n options={this.getRecordedBoundaryTypeSegments()}\n allowCustomValue\n />\n \n \n )}\n\n {!useLastValue.enable && (\n \n \n ) =>\n onChange({ ...metricsQuery, summary: { ...summary, interval: event.target.value } })\n }\n placeholder=\"30s\"\n />\n \n \n \n }\n onChange={this.calcBasisValueChanged}\n options={this.getCalcBasisSegments()}\n allowCustomValue\n />\n \n \n \n {this.state.summaries.map((s: SelectableValue, index: number) => {\n return (\n }\n onChange={(item) => this.onSummaryValueChanged(item, index)}\n options={this.getSummarySegments()}\n allowCustomValue\n />\n );\n })}\n \n }\n onChange={this.onSummaryAction}\n options={this.getSummarySegments()}\n allowCustomValue\n />\n \n \n \n )}\n\n \n \n ) =>\n onChange({ ...metricsQuery, display: event.target.value })\n }\n placeholder=\"Display\"\n />\n \n \n {\n this.onChange({ ...metricsQuery, regex: { ...regex, enable: !regex.enable } });\n }}\n />\n \n \n ) =>\n onChange({ ...metricsQuery, regex: { ...regex, search: event.target.value } })\n }\n placeholder=\"(.*)\"\n />\n \n \n ) =>\n onChange({ ...metricsQuery, regex: { ...regex, replace: event.target.value } })\n }\n placeholder=\"$1\"\n />\n \n \n \n );\n }\n}\n","import React, { memo, useState } from 'react';\n\nimport { AnnotationQuery, QueryEditorProps, SelectableValue } from '@grafana/data';\nimport { AsyncSelect, InlineField, InlineFieldRow, InlineSwitch, Input } from '@grafana/ui';\n\nimport { PiWebAPIDatasource } from 'datasource';\nimport { PIWebAPIDataSourceJsonData, PIWebAPIQuery, PiwebapiRsp } from 'types';\n\nconst SMALL_LABEL_WIDTH = 20;\nconst LABEL_WIDTH = 30;\nconst MIN_INPUT_WIDTH = 50;\n\ntype PiWebAPIQueryEditorProps = QueryEditorProps;\n\ntype Props = PiWebAPIQueryEditorProps & {\n annotation?: AnnotationQuery;\n onAnnotationChange?: (annotation: AnnotationQuery) => void;\n};\n\nexport const PiWebAPIAnnotationsQueryEditor = memo(function PiWebAPIAnnotationQueryEditor(props: Props) {\n const { query, datasource, annotation, onChange, onRunQuery } = props;\n\n const [afWebId, setAfWebId] = useState('');\n const [database, setDatabase] = useState(annotation?.target?.database ?? {});\n\n // this should never happen, but we want to keep typescript happy\n if (annotation === undefined) {\n return null;\n }\n\n const getEventFrames = (): Promise>> => {\n return datasource.getEventFrameTemplates(database?.WebId!).then((templ: PiwebapiRsp[]) => {\n return templ.map((d) => ({ label: d.Name, value: d }));\n });\n };\n\n const getDatabases = (): Promise>> => {\n return datasource.getDatabases(afWebId).then((dbs: PiwebapiRsp[]) => {\n return dbs.map((d) => ({ label: d.Name, value: d }));\n });\n };\n\n const getValue = (key: string) => {\n const query: any = annotation.target as any;\n if (!query || !query[key]) {\n return;\n }\n return { label: query[key].Name, value: query[key] };\n };\n\n datasource.getAssetServer(datasource.afserver.name).then((result) => {\n setAfWebId(result.WebId!);\n });\n\n return (\n <>\n
\n \n \n {\n setDatabase(e.value);\n onChange({ ...query, database: e.value, template: undefined });\n }}\n defaultOptions\n />\n \n \n onChange({ ...query, template: e.value })}\n defaultOptions\n />\n \n \n onChange({ ...query, showEndTime: e.currentTarget.checked })}\n />\n \n \n \n \n onRunQuery()}\n onChange={(e) => onChange({ ...query, categoryName: e.currentTarget.value })}\n placeholder=\"Enter category name\"\n />\n \n \n onRunQuery()}\n onChange={(e) => onChange({ ...query, nameFilter: e.currentTarget.value })}\n placeholder=\"Enter name filter\"\n />\n \n \n \n \n \n onChange({\n ...query,\n regex: { ...query.regex, enable: e.currentTarget.checked },\n })\n }\n />\n \n \n onRunQuery()}\n onChange={(e) =>\n onChange({\n ...query,\n regex: { ...query.regex, search: e.currentTarget.value },\n })\n }\n placeholder=\"(.*)\"\n width={MIN_INPUT_WIDTH}\n />\n \n \n onRunQuery()}\n onChange={(e) =>\n onChange({\n ...query,\n regex: { ...query.regex, replace: e.currentTarget.value },\n })\n }\n placeholder=\"$1\"\n />\n \n \n \n \n \n onChange({\n ...query!,\n attribute: { ...query.attribute, enable: e.currentTarget.checked },\n })\n }\n />\n \n \n onRunQuery()}\n onChange={(e) =>\n onChange({\n ...query!,\n attribute: { ...query.attribute, name: e.currentTarget.value },\n })\n }\n placeholder=\"Enter name\"\n />\n \n \n
\n \n );\n});\n","import { filter, map } from 'lodash';\n\nimport { Observable, of } from 'rxjs';\n\nimport {\n DataSourceInstanceSettings,\n MetricFindValue,\n AnnotationQuery,\n ScopedVars,\n AnnotationEvent,\n DataFrame,\n DataQueryRequest,\n DataQueryResponse,\n} from '@grafana/data';\nimport { getTemplateSrv, TemplateSrv, DataSourceWithBackend } from '@grafana/runtime';\n\nimport { PIWebAPIQuery, PIWebAPIDataSourceJsonData, PiDataServer, PiwebapiRsp } from './types';\nimport { metricQueryTransform } from 'helper';\n\nimport { PiWebAPIAnnotationsQueryEditor } from 'query/AnnotationsQueryEditor';\n\nexport class PiWebAPIDatasource extends DataSourceWithBackend {\n piserver: PiDataServer;\n afserver: PiDataServer;\n afdatabase: PiDataServer;\n piPointConfig: boolean;\n newFormatConfig: boolean;\n useUnitConfig: boolean;\n useExperimental: boolean;\n useStreaming: boolean;\n\n constructor(\n instanceSettings: DataSourceInstanceSettings,\n readonly templateSrv: TemplateSrv = getTemplateSrv()\n ) {\n super(instanceSettings);\n\n this.piserver = { name: (instanceSettings.jsonData || {}).piserver, webid: undefined };\n this.afserver = { name: (instanceSettings.jsonData || {}).afserver, webid: undefined };\n this.afdatabase = { name: (instanceSettings.jsonData || {}).afdatabase, webid: undefined };\n this.piPointConfig = instanceSettings.jsonData.pipoint || false;\n this.newFormatConfig = instanceSettings.jsonData.newFormat || false;\n this.useUnitConfig = instanceSettings.jsonData.useUnit || false;\n this.useExperimental = instanceSettings.jsonData.useExperimental || false;\n this.useStreaming = instanceSettings.jsonData.useStreaming || false;\n\n this.annotations = {\n QueryEditor: PiWebAPIAnnotationsQueryEditor,\n prepareQuery(anno: AnnotationQuery): PIWebAPIQuery | undefined {\n if (anno.target) {\n anno.target.queryType = 'Annotation';\n anno.target.isAnnotation = true;\n }\n return anno.target;\n },\n processEvents: (\n anno: AnnotationQuery,\n data: DataFrame[]\n ): Observable => {\n return of(this.eventFrameToAnnotation(anno, data));\n },\n };\n\n Promise.all([\n this.getDataServer(this.piserver.name).then((result: PiwebapiRsp) => (this.piserver.webid = result.WebId)),\n this.getAssetServer(this.afserver.name).then((result: PiwebapiRsp) => (this.afserver.webid = result.WebId)),\n this.getDatabase(\n this.afserver.name && this.afdatabase.name ? this.afserver.name + '\\\\' + this.afdatabase.name : undefined\n ).then((result: PiwebapiRsp) => (this.afdatabase.webid = result.WebId)),\n ]);\n }\n\n /**\n * This method overrides the applyTemplateVariables() method from the DataSourceWithBackend class.\n * It is responsible for replacing the template variables in the query configuration prior\n * to sending the query to the backend. Templated variables are not able to be used for alerts\n * or public facing dashboards.\n *\n * @param {PIWebAPIQuery} query - The raw query configuration from the frontend as defined in the query editor.\n * @param {ScopedVars} scopedVars - The template variables that are defined in the query editor and dashboard.\n * @returns - PIWebAPIQuery.\n *\n * @memberOf PiWebApiDatasource\n */\n applyTemplateVariables(query: PIWebAPIQuery, scopedVars: ScopedVars) {\n return {\n ...query,\n target: query.target ? this.templateSrv.replace(query.target, scopedVars) : '',\n };\n }\n\n /**\n * This method makes the query to the backend.\n *\n * @param {DataQueryRequest} options\n *\n * @memberOf PiWebApiDatasource\n */\n query(options: DataQueryRequest): Observable {\n if (options.targets.length === 1 && !!options.targets[0].isAnnotation) {\n return super.query(options);\n }\n\n const query = this.buildQueryParameters(options);\n if (query.targets.length <= 0) {\n return of({ data: [] });\n }\n\n return super.query(query);\n }\n\n /**\n * This method does the discovery of the AF Hierarchy and populates the query user interface segments.\n *\n * @param {any} query - Parses the query configuration and builds a PI Web API query.\n * @returns - Segment information.\n *\n * @memberOf PiWebApiDatasource\n */\n metricFindQuery(query: any, queryOptions: any): Promise {\n const ds = this;\n const querydepth = ['servers', 'databases', 'databaseElements', 'elements'];\n if (typeof query === 'string') {\n query = JSON.parse(query as string);\n }\n if (queryOptions.isPiPoint) {\n query.path = this.templateSrv.replace(query.path, queryOptions);\n } else {\n if (query.path === '') {\n query.type = querydepth[0];\n } else {\n query.path = this.templateSrv.replace(query.path, queryOptions); // replace variables in the path\n query.path = query.path.split(';')[0]; // if the attribute is in the path, let's remote it\n if (query.type !== 'attributes') {\n query.type = querydepth[Math.max(0, Math.min(query.path.split('\\\\').length, querydepth.length - 1))];\n }\n }\n query.path = query.path.replace(/\\{([^\\\\])*\\}/gi, (r: string) => r.substring(1, r.length - 2).split(',')[0]);\n }\n\n query.filter = query.filter ?? '*';\n query.max = query.max ?? 10000;\n\n if (query.type === 'servers') {\n return ds.afserver?.name\n ? ds\n .getAssetServer(ds.afserver.name)\n .then((result: PiwebapiRsp) => [result])\n .then(metricQueryTransform)\n : ds.getAssetServers().then(metricQueryTransform);\n } else if (query.type === 'databases' && !!query.afServerWebId) {\n return ds.getDatabases(query.afServerWebId, {}).then(metricQueryTransform);\n } else if (query.type === 'databases') {\n return ds\n .getAssetServer(query.path)\n .then((server) => ds.getDatabases(server.WebId ?? '', {}))\n .then(metricQueryTransform);\n } else if (query.type === 'databaseElements') {\n return ds\n .getDatabase(query.path)\n .then((db) =>\n ds.getDatabaseElements(db.WebId ?? '', {\n selectedFields: 'Items.WebId%3BItems.Name%3BItems.Items%3BItems.Path%3BItems.HasChildren',\n })\n )\n .then(metricQueryTransform);\n } else if (query.type === 'elements') {\n return ds\n .getElement(query.path)\n .then((element) =>\n ds.getElements(element.WebId ?? '', {\n selectedFields:\n 'Items.Description%3BItems.WebId%3BItems.Name%3BItems.Items%3BItems.Path%3BItems.HasChildren',\n nameFilter: query.filter,\n })\n )\n .then(metricQueryTransform);\n } else if (query.type === 'attributes') {\n return ds\n .getElement(query.path)\n .then((element) =>\n ds.getAttributes(element.WebId ?? '', {\n searchFullHierarchy: 'true',\n selectedFields:\n 'Items.Type%3BItems.DefaultUnitsName%3BItems.Description%3BItems.WebId%3BItems.Name%3BItems.Path',\n nameFilter: query.filter,\n maxCount: query.max,\n })\n )\n .then(metricQueryTransform);\n } else if (query.type === 'dataserver') {\n return ds.getDataServers().then(metricQueryTransform);\n } else if (query.type === 'pipoint') {\n return ds.piPointSearch(query.webId, query.pointName).then(metricQueryTransform);\n }\n return Promise.reject('Bad type');\n }\n\n /** PRIVATE SECTION */\n\n /**\n * Builds the PIWebAPI query parameters.\n *\n * @param {any} options - Grafana query and panel options.\n * @returns - PIWebAPI query parameters.\n *\n * @memberOf PiWebApiDatasource\n */\n private buildQueryParameters(options: DataQueryRequest) {\n options.targets = filter(options.targets, (target) => {\n if (!target || !target.target || target.attributes?.length === 0 || target.target === ';' || !!target.hide) {\n return false;\n }\n return !target.target.startsWith('Select AF');\n });\n\n if (options.maxDataPoints) {\n options.maxDataPoints = options.maxDataPoints > 30000 ? 30000 : options.maxDataPoints;\n }\n options.targets = map(options.targets, (target) => {\n const tar = {\n enableStreaming: target.enableStreaming,\n target: this.templateSrv.replace(target.target, options.scopedVars),\n elementPath: this.templateSrv.replace(target.elementPath, options.scopedVars),\n attributes: map(target.attributes, (att) => {\n if (att.value) {\n att.value.value = this.templateSrv.replace(att.value.value, options.scopedVars);\n }\n return att;\n }),\n segments: map(target.segments, (att) => {\n if (att.value) {\n att.value.value = this.templateSrv.replace(att.value.value, options.scopedVars);\n }\n return att;\n }),\n isAnnotation: !!target.isAnnotation,\n display: !!target.display ? this.templateSrv.replace(target.display, options.scopedVars) : undefined,\n refId: target.refId,\n hide: target.hide,\n interpolate: !!target.interpolate\n ? {\n ...target.interpolate,\n interval: this.templateSrv.replace(target.interpolate.interval, options.scopedVars),\n }\n : { enable: false },\n useLastValue: target.useLastValue || { enable: false },\n useUnit: target.useUnit || { enable: false },\n recordedValues: target.recordedValues || { enable: false },\n digitalStates: target.digitalStates || { enable: false },\n webid: target.webid ?? '',\n regex: target.regex || { enable: false },\n expression: target.expression || '',\n summary: target.summary || { types: [] },\n startTime: options.range.from,\n endTime: options.range.to,\n isPiPoint: !!target.isPiPoint,\n hideError: !!target.hideError,\n scopedVars: options.scopedVars,\n };\n\n if (tar.expression) {\n tar.expression = this.templateSrv.replace(tar.expression, options.scopedVars);\n }\n\n if (tar.summary.types !== undefined) {\n tar.summary.types = filter(tar.summary.types, (item) => {\n return item !== undefined && item !== null && item !== '';\n });\n tar.summary.interval = !!tar.summary.interval\n ? this.templateSrv.replace(tar.summary.interval, options.scopedVars)\n : tar.summary.interval;\n }\n\n return tar;\n });\n\n return options;\n }\n\n /**\n * Localize the eventFrame dataFrame records to Grafana Annotations.\n * @param {any} annon - The annotation object.\n * @param {any} data - The dataframe recrords.\n * @returns - Grafana Annotation\n *\n * @memberOf PiWebApiDatasource\n */\n private eventFrameToAnnotation(annon: AnnotationQuery, data: DataFrame[]): AnnotationEvent[] {\n const annotationOptions = annon.target!;\n const events: AnnotationEvent[] = [];\n const currentLocale = Intl.DateTimeFormat().resolvedOptions().locale;\n\n data.forEach((d: DataFrame) => {\n let values = this.transformDataFrameToMap(d);\n for (let i = 0; i < values['time'].length; i++) {\n // replace Dataframe name using Regex\n let title = values['title'][i];\n if (annotationOptions.regex && annotationOptions.regex.enable) {\n title = title.replace(new RegExp(annotationOptions.regex.search), annotationOptions.regex.replace);\n }\n\n // test if timeEnd is negative and if so, set it to null\n if (values['timeEnd'][i] < 0) {\n values['timeEnd'][i] = null;\n }\n\n // format the text and localize the dates to browser locale\n let text = 'Tag: ' + title;\n if (annotationOptions.attribute && annotationOptions.attribute.enable) {\n text += values['attributeText'][i];\n }\n text += '
Start: ' + new Date(values['time'][i]).toLocaleString(currentLocale) + '
End: ';\n\n if (values['timeEnd'][i]) {\n text += new Date(values['timeEnd'][i]).toLocaleString(currentLocale);\n } else {\n text += 'Eventframe is open';\n }\n\n const event: AnnotationEvent = {\n time: values['time'][i],\n timeEnd: !!annotationOptions.showEndTime ? values['timeEnd'][i] : undefined,\n title: title,\n id: values['id'][i],\n text: text,\n tags: ['OSISoft PI'],\n };\n\n events.push(event);\n }\n });\n return events;\n }\n\n /**\n *\n */\n private transformDataFrameToMap(dataFrame: DataFrame): Record {\n const map: Record = {};\n\n dataFrame.fields.forEach((field) => {\n map[field.name] = field.values.toArray();\n });\n\n return map;\n }\n\n /**\n * Abstraction for calling the PI Web API REST endpoint\n *\n * @param {any} path - the path to append to the base server URL.\n * @returns - The full URL.\n *\n * @memberOf PiWebApiDatasource\n */\n private restGet(path: string): Promise {\n return this.getResource(`${path}`).then((response: any) => {\n return response as PiwebapiRsp;\n });\n }\n\n // Get a list of all data (PI) servers\n private getDataServers(): Promise {\n return this.restGet('/dataservers').then((response) => response.Items ?? []);\n }\n private getDataServer(name: string | undefined): Promise {\n if (!name) {\n return Promise.resolve({});\n }\n return this.restGet('/dataservers?name=' + name).then((response) => response);\n }\n // Get a list of all asset (AF) servers\n private getAssetServers(): Promise {\n return this.restGet('/assetservers').then((response) => response.Items ?? []);\n }\n getAssetServer(name: string | undefined): Promise {\n if (!name) {\n return Promise.resolve({});\n }\n return this.restGet('/assetservers?path=\\\\\\\\' + name).then((response) => response);\n }\n getDatabase(path: string | undefined): Promise {\n if (!path) {\n return Promise.resolve({});\n }\n return this.restGet('/assetdatabases?path=\\\\\\\\' + path).then((response) => response);\n }\n getDatabases(serverId: string, options?: any): Promise {\n if (!serverId) {\n return Promise.resolve([]);\n }\n return this.restGet('/assetservers/' + serverId + '/assetdatabases').then((response) => response.Items ?? []);\n }\n getElement(path: string): Promise {\n if (!path) {\n return Promise.resolve({});\n }\n return this.restGet('/elements?path=\\\\\\\\' + path).then((response) => response);\n }\n getEventFrameTemplates(databaseId: string): Promise {\n if (!databaseId) {\n return Promise.resolve([]);\n }\n return this.restGet(\n '/assetdatabases/' + databaseId + '/elementtemplates?selectedFields=Items.InstanceType%3BItems.Name%3BItems.WebId'\n ).then((response) => {\n return filter(response.Items ?? [], (item) => item.InstanceType === 'EventFrame');\n });\n }\n getElementTemplates(databaseId: string): Promise {\n if (!databaseId) {\n return Promise.resolve([]);\n }\n return this.restGet(\n '/assetdatabases/' + databaseId + '/elementtemplates?selectedFields=Items.InstanceType%3BItems.Name%3BItems.WebId'\n ).then((response) => {\n return filter(response.Items ?? [], (item) => item.InstanceType === 'Element');\n });\n }\n\n /**\n * @description\n * Get the child attributes of the current resource.\n * GET attributes/{webId}/attributes\n * @param {string} elementId - The ID of the parent resource. See WebID for more information.\n * @param {Object} options - Query Options\n * @param {string} options.nameFilter - The name query string used for finding attributes. The default is no filter. See Query String for more information.\n * @param {string} options.categoryName - Specify that returned attributes must have this category. The default is no category filter.\n * @param {string} options.templateName - Specify that returned attributes must be members of this template. The default is no template filter.\n * @param {string} options.valueType - Specify that returned attributes' value type must be the given value type. The default is no value type filter.\n * @param {string} options.searchFullHierarchy - Specifies if the search should include attributes nested further than the immediate attributes of the searchRoot. The default is 'false'.\n * @param {string} options.sortField - The field or property of the object used to sort the returned collection. The default is 'Name'.\n * @param {string} options.sortOrder - The order that the returned collection is sorted. The default is 'Ascending'.\n * @param {string} options.startIndex - The starting index (zero based) of the items to be returned. The default is 0.\n * @param {string} options.showExcluded - Specified if the search should include attributes with the Excluded property set. The default is 'false'.\n * @param {string} options.showHidden - Specified if the search should include attributes with the Hidden property set. The default is 'false'.\n * @param {string} options.maxCount - The maximum number of objects to be returned per call (page size). The default is 1000.\n * @param {string} options.selectedFields - List of fields to be returned in the response, separated by semicolons (;). If this parameter is not specified, all available fields will be returned. See Selected Fields for more information.\n */\n private getAttributes(elementId: string, options: any): Promise {\n let querystring =\n '?' +\n map(options, (value, key) => {\n return key + '=' + value;\n }).join('&');\n\n if (querystring === '?') {\n querystring = '';\n }\n\n return this.restGet('/elements/' + elementId + '/attributes' + querystring).then(\n (response) => response.Items ?? []\n );\n }\n\n /**\n * @description\n * Retrieve elements based on the specified conditions. By default, this method selects immediate children of the current resource.\n * Users can search for the elements based on specific search parameters. If no parameters are specified in the search, the default values for each parameter will be used and will return the elements that match the default search.\n * GET assetdatabases/{webId}/elements\n * @param {string} databaseId - The ID of the parent resource. See WebID for more information.\n * @param {Object} options - Query Options\n * @param {string} options.webId - The ID of the resource to use as the root of the search. See WebID for more information.\n * @param {string} options.nameFilter - The name query string used for finding objects. The default is no filter. See Query String for more information.\n * @param {string} options.categoryName - Specify that returned elements must have this category. The default is no category filter.\n * @param {string} options.templateName - Specify that returned elements must have this template or a template derived from this template. The default is no template filter.\n * @param {string} options.elementType - Specify that returned elements must have this type. The default type is 'Any'. See Element Type for more information.\n * @param {string} options.searchFullHierarchy - Specifies if the search should include objects nested further than the immediate children of the searchRoot. The default is 'false'.\n * @param {string} options.sortField - The field or property of the object used to sort the returned collection. The default is 'Name'.\n * @param {string} options.sortOrder - The order that the returned collection is sorted. The default is 'Ascending'.\n * @param {number} options.startIndex - The starting index (zero based) of the items to be returned. The default is 0.\n * @param {number} options.maxCount - The maximum number of objects to be returned per call (page size). The default is 1000.\n * @param {string} options.selectedFields - List of fields to be returned in the response, separated by semicolons (;). If this parameter is not specified, all available fields will be returned. See Selected Fields for more information.\n */\n private getDatabaseElements(databaseId: string, options: any): Promise {\n let querystring =\n '?' +\n map(options, (value, key) => {\n return key + '=' + value;\n }).join('&');\n\n if (querystring === '?') {\n querystring = '';\n }\n\n return this.restGet('/assetdatabases/' + databaseId + '/elements' + querystring).then(\n (response) => response.Items ?? []\n );\n }\n\n /**\n * @description\n * Retrieve elements based on the specified conditions. By default, this method selects immediate children of the current resource.\n * Users can search for the elements based on specific search parameters. If no parameters are specified in the search, the default values for each parameter will be used and will return the elements that match the default search.\n * GET elements/{webId}/elements\n * @param {string} databaseId - The ID of the resource to use as the root of the search. See WebID for more information.\n * @param {Object} options - Query Options\n * @param {string} options.webId - The ID of the resource to use as the root of the search. See WebID for more information.\n * @param {string} options.nameFilter - The name query string used for finding objects. The default is no filter. See Query String for more information.\n * @param {string} options.categoryName - Specify that returned elements must have this category. The default is no category filter.\n * @param {string} options.templateName - Specify that returned elements must have this template or a template derived from this template. The default is no template filter.\n * @param {string} options.elementType - Specify that returned elements must have this type. The default type is 'Any'. See Element Type for more information.\n * @param {string} options.searchFullHierarchy - Specifies if the search should include objects nested further than the immediate children of the searchRoot. The default is 'false'.\n * @param {string} options.sortField - The field or property of the object used to sort the returned collection. The default is 'Name'.\n * @param {string} options.sortOrder - The order that the returned collection is sorted. The default is 'Ascending'.\n * @param {number} options.startIndex - The starting index (zero based) of the items to be returned. The default is 0.\n * @param {number} options.maxCount - The maximum number of objects to be returned per call (page size). The default is 1000.\n * @param {string} options.selectedFields - List of fields to be returned in the response, separated by semicolons (;). If this parameter is not specified, all available fields will be returned. See Selected Fields for more information.\n */\n private getElements(elementId: string, options: any): Promise {\n let querystring =\n '?' +\n map(options, (value, key) => {\n return key + '=' + value;\n }).join('&');\n\n if (querystring === '?') {\n querystring = '';\n }\n\n return this.restGet('/elements/' + elementId + '/elements' + querystring).then(\n (response) => response.Items ?? []\n );\n }\n\n /**\n * Retrieve a list of points on a specified Data Server.\n *\n * @param {string} serverId - The ID of the server. See WebID for more information.\n * @param {string} nameFilter - A query string for filtering by point name. The default is no filter. *, ?, [ab], [!ab]\n */\n private piPointSearch(serverId: string, nameFilter: string): Promise {\n let filter1 = this.templateSrv.replace(nameFilter);\n let filter2 = `${filter1}`;\n let doFilter = false;\n if (filter1 !== nameFilter) {\n const regex = /\\{(\\w|,)+\\}/g;\n let m;\n while ((m = regex.exec(filter1)) !== null) {\n // This is necessary to avoid infinite loops with zero-width matches\n if (m.index === regex.lastIndex) {\n regex.lastIndex++;\n }\n\n // The result can be accessed through the `m`-variable.\n m.forEach((match, groupIndex) => {\n if (groupIndex === 0) {\n filter1 = filter1.replace(match, match.replace('{', '(').replace('}', ')').replace(',', '|'));\n filter2 = filter2.replace(match, '*');\n doFilter = true;\n }\n });\n }\n }\n return this.restGet('/dataservers/' + serverId + '/points?maxCount=100&nameFilter=' + filter2).then((results) => {\n if (!!results && !!results?.Items) {\n return doFilter ? results.Items.filter((item) => item.Name?.match(filter1)) : results.Items;\n }\n return [];\n });\n }\n}\n","import { DataSourcePlugin } from '@grafana/data';\nimport { PIWebAPIConfigEditor } from './config/ConfigEditor';\nimport { PIWebAPIQueryEditor } from './query/QueryEditor';\nimport { PiWebAPIDatasource } from './datasource';\nimport { PIWebAPIQuery, PIWebAPIDataSourceJsonData } from './types';\n\nexport const plugin = new DataSourcePlugin(\n PiWebAPIDatasource\n)\n .setQueryEditor(PIWebAPIQueryEditor)\n .setConfigEditor(PIWebAPIConfigEditor);\n"],"names":["module","exports","__WEBPACK_EXTERNAL_MODULE__781__","__WEBPACK_EXTERNAL_MODULE__531__","__WEBPACK_EXTERNAL_MODULE__7__","__WEBPACK_EXTERNAL_MODULE__241__","__WEBPACK_EXTERNAL_MODULE__959__","__WEBPACK_EXTERNAL_MODULE__269__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","FormField","LegacyForms","coerceOptions","options","jsonData","url","PIWebAPIConfigEditor","PureComponent","render","originalOptions","this","props","div","DataSourceHttpSettings","defaultUrl","dataSourceConfig","onChange","onHttpOptionsChange","showAccessOptions","h3","className","InlineField","label","labelWidth","InlineSwitch","pipoint","onPiPointChange","newFormat","onNewFormatChange","useUnit","onUseUnitChange","useExperimental","onUseExperimentalChange","useStreaming","onUseStreamingChange","inputWidth","onPIServerChange","piserver","placeholder","onAFServerChange","afserver","onAFDatabaseChange","afdatabase","event","onOptionsChange","target","checked","QueryField","tooltip","children","InlineFormLabel","width","QueryRowTerminator","QueryInlineField","QueryEditorRow","QueryRawInlineField","QueryRawEditorRow","defaultQuery","attributes","segments","regex","enable","summary","types","basis","interval","nodata","expression","interpolate","useLastValue","recordedValues","boundaryType","digitalStates","enableStreaming","isPiPoint","QueryEditorModeSwitcher","isRaw","isModalOpen","setModalOpen","useState","useEffect","Button","aria-label","icon","variant","type","onClick","ConfirmModal","isOpen","title","body","confirmText","dismissText","onConfirm","onDismiss","metricQueryTransform","response","map","item","text","Name","expandable","HasChildren","Path","split","length","Items","WebId","LABEL_WIDTH","MIN_ATTR_INPUT_WIDTH","REMOVE_LABEL","CustomLabelComponent","style","marginRight","Icon","name","PIWebAPIQueryEditor","isValueEmpty","calcBasisValueChanged","segment","metricsQuery","query","getCalcBasisSegments","calculationBasis","recordedBoundaryTypeValueChanged","getRecordedBoundaryTypeSegments","recordedBoundaryTypes","calcNoDataValueChanged","getNoDataSegments","noDataReplacement","onSummaryValueChanged","index","summaries","state","slice","splice","setState","stateCallback","getSummarySegments","summaryTypes","filter","s","indexOf","unshift","removeSummary","part","onSummaryAction","selectableValue","push","summarySegment","removeAttribute","attributeChangeValue","onAttributeAction","Array","isArray","String","match","getSegmentPathUpTo","arr","reduce","result","startsWith","checkAttributeSegments","data","datasource","ctrl","findQuery","path","metricFindQuery","assign","request","scopedVars","then","attributesResponse","validAttributes","each","attribute","substring","filteredAttributes","attrib","changedValue","templateSrv","replace","availableAttributes","catch","err","error","message","checkPiPointSegments","webId","getSelectedPIServer","pointName","webID","piServer","forEach","parts","textEditorChanged","splitAttributes","splitElements","_","getElementSegments","elements","updateArray","rawQuery","checkAfServer","queryProps","onRunQuery","defaults","hideError","display","piPointConfig","onIsPiPointChange","InlineFieldRow","grow","Input","onBlur","SegmentAsync","Component","onSegmentChange","loadOptions","allowCustomValue","inputMinWidth","disabled","getAttributeSegmentsPI","reloadOptionsOnChange","Segment","onAttributeChange","getAttributeSegmentsAF","attributeSegment","onHideErrorChange","useUnitConfig","maxNumber","parseInt","search","constructor","super","calculationBasisSegment","noDataReplacementSegment","segmentChangeValue","Promise","resolve","remove","currentSegment","afServerWebId","items","altSegments","variables","getVariables","variable","attributeText","forOwn","val","buildFromTarget","segmentsArray","attributesArray","summariesArray","cb","scopedVarsDone","componentDidMount","initialLoad","componentDidUpdate","force","_segmentsArray","e","console","elementPath","tr","join","parseRawQuery","isValidQuery","trim","targetSplit","queryChange","bind","PiWebAPIAnnotationsQueryEditor","memo","annotation","afWebId","setAfWebId","database","setDatabase","getValue","getAssetServer","AsyncSelect","getDatabases","dbs","loadingMessage","template","defaultOptions","getEventFrameTemplates","templ","showEndTime","currentTarget","categoryName","nameFilter","PiWebAPIDatasource","DataSourceWithBackend","applyTemplateVariables","targets","isAnnotation","buildQueryParameters","of","queryOptions","ds","querydepth","JSON","parse","Math","max","min","getAssetServers","server","getDatabase","db","getDatabaseElements","selectedFields","getElement","element","getElements","getAttributes","searchFullHierarchy","maxCount","getDataServers","piPointSearch","reject","hide","maxDataPoints","tar","att","refId","webid","startTime","range","from","endTime","to","annon","annotationOptions","events","currentLocale","Intl","DateTimeFormat","resolvedOptions","locale","values","transformDataFrameToMap","i","RegExp","Date","toLocaleString","time","timeEnd","id","tags","dataFrame","fields","field","toArray","getResource","restGet","getDataServer","serverId","databaseId","InstanceType","getElementTemplates","elementId","querystring","filter1","filter2","doFilter","m","exec","lastIndex","groupIndex","results","instanceSettings","getTemplateSrv","newFormatConfig","annotations","QueryEditor","prepareQuery","anno","queryType","processEvents","eventFrameToAnnotation","all","plugin","DataSourcePlugin","setQueryEditor","setConfigEditor"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/plugin.json b/dist/plugin.json index 790b0aa..703d0ad 100644 --- a/dist/plugin.json +++ b/dist/plugin.json @@ -39,8 +39,8 @@ {"name": "Datasource Configuration", "path": "img/configuration.png"}, {"name": "Annotations Editor", "path": "img/annotations.png"} ], - "version": "5.0.0", - "updated": "2024-06-14" + "version": "5.1.0", + "updated": "2024-08-13" }, "dependencies": { "grafanaDependency": ">=10.1.0", diff --git a/package.json b/package.json index e89ed44..d0d1617 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-protection-alliance-osisoftpi-grafana", - "version": "5.0.0", + "version": "5.1.0", "description": "OSISoft PI Grafana Plugin", "scripts": { "build": "webpack -c ./.config/webpack/webpack.config.ts --env production", diff --git a/pkg/plugin/datasource.go b/pkg/plugin/datasource.go index 8e6599e..d39fa9b 100644 --- a/pkg/plugin/datasource.go +++ b/pkg/plugin/datasource.go @@ -232,7 +232,7 @@ func (d *Datasource) QueryAnnotations(ctx context.Context, req *backend.QueryDat return response, nil } -// This function provides a way to proxy requests to the PI Web API. It is used to limit access fromt he frontend to the PI Web API. +// This function provides a way to proxy requests to the PI Web API. It is used to limit access from the frontend to the PI Web API. // These endpoints are called by the front end while configuring the datasource, query, and annotations. func (d *Datasource) CallResource(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error { // Create spans for this function. @@ -275,7 +275,10 @@ func (d *Datasource) CallResource(ctx context.Context, req *backend.CallResource r, err := apiGet(ctx, d, req.URL) if err != nil { - return err + return sender.Send(&backend.CallResourceResponse{ + Status: http.StatusNotFound, + Body: []byte(`{}`), + }) } return sender.Send(&backend.CallResourceResponse{ Status: http.StatusOK, diff --git a/pkg/plugin/timeseries_query.go b/pkg/plugin/timeseries_query.go index 9d3b950..e12e6db 100644 --- a/pkg/plugin/timeseries_query.go +++ b/pkg/plugin/timeseries_query.go @@ -91,6 +91,7 @@ func (d *Datasource) processQuery(query backend.DataQuery, datasourceUID string) UID: datasourceUID, IntervalNanoSeconds: PiQuery.Interval, IsPIPoint: PiQuery.Pi.IsPiPoint, + HideError: PiQuery.Pi.HideError, Streamable: PiQuery.isStreamable() && *d.dataSourceOptions.UseExperimental && *d.dataSourceOptions.UseStreaming, FullTargetPath: fullTargetPath, TargetPath: targetBasePath, @@ -268,8 +269,10 @@ func (d *Datasource) processBatchtoFrames(processedQuery map[string][]PiProcesse for _, q := range query { // if there is an error in the query, we set the error in the subresponse and break out of the loop returning the error. if q.Error != nil { - backend.Logger.Error("Error processing query", "RefID", RefID, "query", q) - subResponse.Error = q.Error + backend.Logger.Error("Error processing query", "RefID", RefID, "query", q, "hide", q.HideError) + if !q.HideError && strings.Contains(q.Error.Error(), "api error") { + subResponse.Error = q.Error + } break } @@ -554,6 +557,13 @@ func (q *Query) getMaxDataPoints() int { return q.MaxDataPoints } +func (q *Query) getBoundaryType() string { + if q.Pi.RecordedValues.BoundaryType != nil { + return *q.Pi.RecordedValues.BoundaryType + } + return "Inside" +} + func (q Query) getQueryBaseURL() string { var uri string if q.Pi.isExpression() { @@ -592,7 +602,7 @@ func (q Query) getQueryBaseURL() string { } else if q.Pi.isInterpolated() { uri += "/interpolated" + q.getTimeRangeURIComponent() + fmt.Sprintf("&interval=%s", q.getIntervalTime()) } else if q.Pi.isRecordedValues() { - uri += "/recorded" + q.getTimeRangeURIComponent() + fmt.Sprintf("&maxCount=%d", q.getMaxDataPoints()) + "&boundaryType=Interpolated" + uri += "/recorded" + q.getTimeRangeURIComponent() + fmt.Sprintf("&maxCount=%d", q.getMaxDataPoints()) + "&boundaryType=" + q.getBoundaryType() } else { uri += "/plot" + q.getTimeRangeURIComponent() + fmt.Sprintf("&intervals=%d", q.getMaxDataPoints()) } diff --git a/pkg/plugin/timeseries_query_models.go b/pkg/plugin/timeseries_query_models.go index 2ba7e3f..e8fb7ee 100644 --- a/pkg/plugin/timeseries_query_models.go +++ b/pkg/plugin/timeseries_query_models.go @@ -123,10 +123,12 @@ type PIWebAPIQuery struct { Interval string `json:"interval"` } `json:"interpolate"` IsPiPoint bool `json:"isPiPoint"` + HideError bool `json:"hideError"` MaxDataPoints *int `json:"maxDataPoints"` RecordedValues *struct { - Enable *bool `json:"enable"` - MaxNumber *int `json:"maxNumber"` + Enable *bool `json:"enable"` + MaxNumber *int `json:"maxNumber"` + BoundaryType *string `json:"boundaryType"` } `json:"recordedValues"` RefID *string `json:"refId"` Regex *Regex `json:"regex"` @@ -186,6 +188,7 @@ type PiProcessedQuery struct { UID string `json:"-"` IntervalNanoSeconds int64 `json:"IntervalNanoSeconds"` IsPIPoint bool `json:"IsPiPoint"` + HideError bool `json:"HideError"` Streamable bool `json:"isStreamable"` FullTargetPath string `json:"FullTargetPath"` ResponseUnits string `json:"ResponseUnits"` diff --git a/src/datasource.ts b/src/datasource.ts index b0ed45c..e7abb08 100644 --- a/src/datasource.ts +++ b/src/datasource.ts @@ -1,6 +1,6 @@ import { filter, map } from 'lodash'; -import { Observable, of, firstValueFrom } from 'rxjs'; +import { Observable, of } from 'rxjs'; import { DataSourceInstanceSettings, @@ -12,9 +12,9 @@ import { DataQueryRequest, DataQueryResponse, } from '@grafana/data'; -import { BackendSrv, getBackendSrv, getTemplateSrv, TemplateSrv, DataSourceWithBackend } from '@grafana/runtime'; +import { getTemplateSrv, TemplateSrv, DataSourceWithBackend } from '@grafana/runtime'; -import { PIWebAPIQuery, PIWebAPIDataSourceJsonData, PiDataServer, PiwebapiInternalRsp, PiwebapiRsp } from './types'; +import { PIWebAPIQuery, PIWebAPIDataSourceJsonData, PiDataServer, PiwebapiRsp } from './types'; import { metricQueryTransform } from 'helper'; import { PiWebAPIAnnotationsQueryEditor } from 'query/AnnotationsQueryEditor'; @@ -31,8 +31,7 @@ export class PiWebAPIDatasource extends DataSourceWithBackend, - readonly templateSrv: TemplateSrv = getTemplateSrv(), - private readonly backendSrv: BackendSrv = getBackendSrv() + readonly templateSrv: TemplateSrv = getTemplateSrv() ) { super(instanceSettings); @@ -225,13 +224,13 @@ export class PiWebAPIDatasource extends DataSourceWithBackend { if (att.value) { - this.templateSrv.replace(att.value.value, options.scopedVars); + att.value.value = this.templateSrv.replace(att.value.value, options.scopedVars); } return att; }), segments: map(target.segments, (att) => { if (att.value) { - this.templateSrv.replace(att.value.value, options.scopedVars); + att.value.value = this.templateSrv.replace(att.value.value, options.scopedVars); } return att; }), @@ -256,6 +255,7 @@ export class PiWebAPIDatasource extends DataSourceWithBackend { - const observable = this.backendSrv.fetch({ - url: `/api/datasources/${this.id}/resources${path}`, - method: 'GET', - headers: { 'Content-Type': 'application/json' }, - }); - - return firstValueFrom(observable).then((response: any) => { - return response as PiwebapiInternalRsp; + private restGet(path: string): Promise { + return this.getResource(`${path}`).then((response: any) => { + return response as PiwebapiRsp; }); } // Get a list of all data (PI) servers private getDataServers(): Promise { - return this.restGet('/dataservers').then((response) => response.data.Items ?? []); + return this.restGet('/dataservers').then((response) => response.Items ?? []); } private getDataServer(name: string | undefined): Promise { if (!name) { return Promise.resolve({}); } - return this.restGet('/dataservers?name=' + name).then((response) => response.data); + return this.restGet('/dataservers?name=' + name).then((response) => response); } // Get a list of all asset (AF) servers private getAssetServers(): Promise { - return this.restGet('/assetservers').then((response) => response.data.Items ?? []); + return this.restGet('/assetservers').then((response) => response.Items ?? []); } getAssetServer(name: string | undefined): Promise { if (!name) { return Promise.resolve({}); } - return this.restGet('/assetservers?path=\\\\' + name).then((response) => response.data); + return this.restGet('/assetservers?path=\\\\' + name).then((response) => response); } getDatabase(path: string | undefined): Promise { if (!path) { return Promise.resolve({}); } - return this.restGet('/assetdatabases?path=\\\\' + path).then((response) => response.data); + return this.restGet('/assetdatabases?path=\\\\' + path).then((response) => response); } getDatabases(serverId: string, options?: any): Promise { if (!serverId) { return Promise.resolve([]); } - return this.restGet('/assetservers/' + serverId + '/assetdatabases').then((response) => response.data.Items ?? []); + return this.restGet('/assetservers/' + serverId + '/assetdatabases').then((response) => response.Items ?? []); } getElement(path: string): Promise { if (!path) { return Promise.resolve({}); } - return this.restGet('/elements?path=\\\\' + path).then((response) => response.data); + return this.restGet('/elements?path=\\\\' + path).then((response) => response); } getEventFrameTemplates(databaseId: string): Promise { if (!databaseId) { @@ -411,7 +405,7 @@ export class PiWebAPIDatasource extends DataSourceWithBackend { - return filter(response.data.Items ?? [], (item) => item.InstanceType === 'EventFrame'); + return filter(response.Items ?? [], (item) => item.InstanceType === 'EventFrame'); }); } getElementTemplates(databaseId: string): Promise { @@ -421,7 +415,7 @@ export class PiWebAPIDatasource extends DataSourceWithBackend { - return filter(response.data.Items ?? [], (item) => item.InstanceType === 'Element'); + return filter(response.Items ?? [], (item) => item.InstanceType === 'Element'); }); } @@ -456,7 +450,7 @@ export class PiWebAPIDatasource extends DataSourceWithBackend response.data.Items ?? [] + (response) => response.Items ?? [] ); } @@ -491,7 +485,7 @@ export class PiWebAPIDatasource extends DataSourceWithBackend response.data.Items ?? [] + (response) => response.Items ?? [] ); } @@ -526,7 +520,7 @@ export class PiWebAPIDatasource extends DataSourceWithBackend response.data.Items ?? [] + (response) => response.Items ?? [] ); } @@ -541,7 +535,7 @@ export class PiWebAPIDatasource extends DataSourceWithBackend { - if (!!results && !!results.data?.Items) { - return doFilter ? results.data.Items.filter((item) => item.Name?.match(filter1)) : results.data.Items; + return this.restGet('/dataservers/' + serverId + '/points?maxCount=100&nameFilter=' + filter2).then((results) => { + if (!!results && !!results?.Items) { + return doFilter ? results.Items.filter((item) => item.Name?.match(filter1)) : results.Items; } return []; }); diff --git a/src/query/QueryEditor.tsx b/src/query/QueryEditor.tsx index 2830798..f7b4fa8 100644 --- a/src/query/QueryEditor.tsx +++ b/src/query/QueryEditor.tsx @@ -11,11 +11,13 @@ import { QueryEditorModeSwitcher } from 'components/QueryEditorModeSwitcher'; import { parseRawQuery } from 'helper'; const LABEL_WIDTH = 24; +const LABEL_SWITCH_WIDTH = 49.067 / 8.0; const MIN_ELEM_INPUT_WIDTH = 200; const MIN_ATTR_INPUT_WIDTH = 250; interface State { isPiPoint: boolean; + hideError: boolean; segments: Array>; attributes: Array>; summaries: Array>; @@ -32,7 +34,9 @@ const REMOVE_LABEL = '-REMOVE-'; const CustomLabelComponent = (props: any) => { if (props.value) { return ( -
+
{props.label ?? '--no label--'}
); @@ -50,9 +54,11 @@ export class PIWebAPIQueryEditor extends PureComponent { availableAttributes: any = {}; summaryTypes: string[]; calculationBasis: string[]; + recordedBoundaryTypes: string []; noDataReplacement: string[]; state: State = { isPiPoint: false, + hideError: false, segments: [], attributes: [], summaries: [], @@ -66,6 +72,7 @@ export class PIWebAPIQueryEditor extends PureComponent { super(props); this.onSegmentChange = this.onSegmentChange.bind(this); this.calcBasisValueChanged = this.calcBasisValueChanged.bind(this); + this.recordedBoundaryTypeValueChanged = this.recordedBoundaryTypeValueChanged.bind(this); this.calcNoDataValueChanged = this.calcNoDataValueChanged.bind(this); this.onSummaryAction = this.onSummaryAction.bind(this); this.onSummaryValueChanged = this.onSummaryValueChanged.bind(this); @@ -97,6 +104,12 @@ export class PIWebAPIQueryEditor extends PureComponent { 'EventWeightedIncludeBothEnds', // Events at both ends of the interval boundaries are included in the event weighted calculation. ]; + this.recordedBoundaryTypes = [ + 'Inside', // Default. Specifies to return the recorded values on the inside of the requested time range as the first and last values. + 'Outside', // Specifies to return the recorded values on the outside of the requested time range as the first and last values. + 'Interpolated', //Specifies to create an interpolated value at the end points of the requested time range if a recorded value does not exist at that time. + ] + this.noDataReplacement = [ 'Null', // replace with nulls 'Drop', // drop items @@ -148,6 +161,30 @@ export class PIWebAPIQueryEditor extends PureComponent { return segments; } + // recorded boundary type change event + recordedBoundaryTypeValueChanged(segment: SelectableValue) { + const metricsQuery = this.props.query as PIWebAPIQuery; + const recordedValues = metricsQuery.recordedValues; + if (recordedValues) { + recordedValues.boundaryType = segment.value?.value; + } + this.onChange({ ...metricsQuery, recordedValues }); + } + // get recorded boundary type user interface segments + getRecordedBoundaryTypeSegments() { + const segments = map(this.recordedBoundaryTypes, (item: string) => { + let selectableValue: SelectableValue = { + label: item, + value: { + value: item, + expandable: true, + }, + }; + return selectableValue; + }); + return segments; + } + // no data change event calcNoDataValueChanged(segment: SelectableValue) { const metricsQuery = this.props.query as PIWebAPIQuery; @@ -243,11 +280,21 @@ export class PIWebAPIQueryEditor extends PureComponent { onAttributeAction(item: SelectableValue) { const { query } = this.props; const attributes = this.state.attributes.slice(0); + // partial variable + if (item.value !== null && typeof item.value !== 'object' && !Array.isArray(item.value)) { + const value = String(item.value! as string); + item.value = { + type: value.match(/\${\w+}/gi) ? 'template' : undefined, + value: value, + } + } + // if value is not empty, add new attribute segment if (!this.isValueEmpty(item.value)) { let selectableValue: SelectableValue = { label: item.label, value: { + type: item.value?.value && item.value?.value.match(/\${\w+}/gi) ? 'template' : undefined, value: item.value?.value, expandable: !query.isPiPoint, }, @@ -262,7 +309,7 @@ export class PIWebAPIQueryEditor extends PureComponent { let attributes = this.state.attributes.slice(0); if (item.label === REMOVE_LABEL) { - remove(attributes, (value, n) => n === index); + remove(attributes, (_, n) => n === index); } else { // set current value attributes[index] = item; @@ -289,6 +336,15 @@ export class PIWebAPIQueryEditor extends PureComponent { const { query } = this.props; let segments = this.state.segments.slice(0); + // partial variable + if (item.value !== null && typeof item.value !== 'object' && !Array.isArray(item.value)) { + const value = String(item.value! as string); + item.value = { + type: value.match(/\${\w+}/gi) ? 'template' : undefined, + value: value, + } + } + // ignore if no change if (segments[index].label === item.value?.value) { return; @@ -338,6 +394,7 @@ export class PIWebAPIQueryEditor extends PureComponent { if (item.value?.type === 'template') { // if it's a variable we need to check for new elements\ return this.getElementSegments(segments.length + 1, segments).then((elements) => { if (elements.length > 0) { + segments[index].value!.expandable = true; segments.push({ label: 'Select Element', value: { @@ -517,6 +574,7 @@ export class PIWebAPIQueryEditor extends PureComponent { // get the list of attributes for the user interface - AF getAttributeSegmentsAF = (attributeText?: string): Array> => { + const { datasource } = this.props; const ctrl = this; let segments: Array> = []; @@ -527,6 +585,20 @@ export class PIWebAPIQueryEditor extends PureComponent { }, }); + // add template variables + const variables = datasource.templateSrv.getVariables(); + each(variables, (variable: TypedVariableModel) => { + let selectableValue: SelectableValue = { + label: '${' + variable.name + '}', + value: { + type: 'template', + value: '${' + variable.name + '}', + expandable: false, + }, + }; + segments.push(selectableValue); + }); + forOwn(ctrl.availableAttributes, (val: any, key: string) => { let selectableValue: SelectableValue = { label: key, @@ -570,6 +642,7 @@ export class PIWebAPIQueryEditor extends PureComponent { attributesArray.push({ label: item, value: { + type: item.match(/\${\w+}/gi) ? 'template' : undefined, value: item, expandable: false, }, @@ -739,6 +812,7 @@ export class PIWebAPIQueryEditor extends PureComponent { attributes.push({ label: item, value: { + type: item.match(/\${\w+}/gi) ? 'template' : undefined, value: item, expandable: false, }, @@ -970,6 +1044,22 @@ export class PIWebAPIQueryEditor extends PureComponent { ); }; + onHideErrorChange = (event: React.SyntheticEvent) => { + const { query: queryChange } = this.props; + const hideError = !queryChange.hideError; + this.setState( + { + hideError, + }, + () => { + this.onChange({ + ...queryChange, + hideError, + }); + } + ); + }; + render() { const { query: queryProps, onChange, onRunQuery } = this.props; const metricsQuery = defaults(queryProps, defaultQuery) as PIWebAPIQuery; @@ -984,6 +1074,7 @@ export class PIWebAPIQueryEditor extends PureComponent { recordedValues, expression, isPiPoint, + hideError, summary, display, regex, @@ -1163,12 +1254,21 @@ export class PIWebAPIQueryEditor extends PureComponent { tooltip={'Replacement for bad quality values.'} > } + Component={ + + } onChange={this.calcNoDataValueChanged} options={this.getNoDataSegments()} allowCustomValue /> + + + {this.props.datasource.useUnitConfig && ( { )} - - - {!useLastValue.enable && ( - - ) => - onChange({ - ...metricsQuery, - recordedValues: { ...recordedValues, maxNumber: parseInt(event.target.value, 10) }, - }) + + {!useLastValue.enable && !recordedValues.enable && ( + + + + this.onChange({ ...metricsQuery, interpolate: { ...interpolate, enable: !interpolate.enable, interval: null } }) } - type="number" - placeholder="1000" /> - )} - - - this.onChange({ - ...metricsQuery, - recordedValues: { ...recordedValues, enable: !recordedValues.enable }, - }) - } - /> - - - - {!useLastValue.enable && ( - ) => onChange({ ...metricsQuery, interpolate: { ...interpolate, interval: event.target.value } }) @@ -1254,14 +1328,65 @@ export class PIWebAPIQueryEditor extends PureComponent { placeholder="30s" /> - + + )} + + {!useLastValue.enable && !interpolate.enable && ( + + - this.onChange({ ...metricsQuery, interpolate: { ...interpolate, enable: !interpolate.enable } }) + this.onChange({ + ...metricsQuery, + recordedValues: { ...recordedValues, enable: !recordedValues.enable, maxNumber: null, boundaryType: 'Inside' }, + }) } /> + + ) => + onChange({ + ...metricsQuery, + recordedValues: { ...recordedValues, maxNumber: parseInt(event.target.value, 10) }, + }) + } + type="number" + placeholder="1000" + /> + + + + } + onChange={this.recordedBoundaryTypeValueChanged} + options={this.getRecordedBoundaryTypeSegments()} + allowCustomValue + /> + )} @@ -1274,6 +1399,7 @@ export class PIWebAPIQueryEditor extends PureComponent { > ) => onChange({ ...metricsQuery, summary: { ...summary, interval: event.target.value } }) @@ -1283,13 +1409,20 @@ export class PIWebAPIQueryEditor extends PureComponent { } + Component={ + + } onChange={this.calcBasisValueChanged} options={this.getCalcBasisSegments()} allowCustomValue @@ -1332,6 +1465,7 @@ export class PIWebAPIQueryEditor extends PureComponent { > ) => onChange({ ...metricsQuery, display: event.target.value }) @@ -1347,9 +1481,10 @@ export class PIWebAPIQueryEditor extends PureComponent { }} /> - + ) => onChange({ ...metricsQuery, regex: { ...regex, search: event.target.value } }) @@ -1357,9 +1492,10 @@ export class PIWebAPIQueryEditor extends PureComponent { placeholder="(.*)" /> - + ) => onChange({ ...metricsQuery, regex: { ...regex, replace: event.target.value } }) diff --git a/src/types.ts b/src/types.ts index d68c3d7..c9c828f 100644 --- a/src/types.ts +++ b/src/types.ts @@ -46,6 +46,7 @@ export interface PIWebAPIQuery extends DataQuery { attributes?: Array>; segments?: any[]; isPiPoint?: boolean; + hideError?: boolean; isAnnotation?: boolean; webid?: string; display?: any; @@ -56,7 +57,12 @@ export interface PIWebAPIQuery extends DataQuery { useLastValue?: any; useUnit?: any; regex?: any; - summary?: {nodata?: string, types?: any[], basis?: string, interval?: string}; + summary?: { + nodata?: string, + types?: any[], + basis?: string, + interval?: string + }; expression?: string; rawQuery?: boolean; query?: string; @@ -78,7 +84,7 @@ export const defaultQuery: Partial = { expression: '', interpolate: { enable: false }, useLastValue: { enable: false }, - recordedValues: { enable: false }, + recordedValues: { enable: false, boundaryType: 'Inside' }, digitalStates: { enable: false }, enableStreaming: { enable: false }, useUnit: { enable: false }, From 67de00ecc789302af6756d9ce3e0200c3905d8e4 Mon Sep 17 00:00:00 2001 From: Paulo Vitor Magacho Date: Fri, 6 Sep 2024 11:56:17 -0300 Subject: [PATCH 4/6] Version 5.1.0 initial commit --- dist/module.js | 2 +- dist/module.js.map | 2 +- dist/plugin.json | 2 +- pkg/plugin/annotation_query.go | 3 +- pkg/plugin/datasource.go | 4 +- pkg/plugin/helpers.go | 5 +- pkg/plugin/timeseries_query.go | 43 ++++++++---- pkg/plugin/timeseries_query_models.go | 34 +++++----- src/datasource.ts | 15 ++-- src/query/QueryEditor.tsx | 98 ++++++++++++++++++++------- src/types.ts | 17 ++++- 11 files changed, 154 insertions(+), 71 deletions(-) diff --git a/dist/module.js b/dist/module.js index 3ed4e9e..25a5e29 100644 --- a/dist/module.js +++ b/dist/module.js @@ -1,2 +1,2 @@ -define(["@grafana/data","react","@grafana/ui","lodash","rxjs","@grafana/runtime"],((e,t,a,n,l,r)=>(()=>{"use strict";var i={781:t=>{t.exports=e},531:e=>{e.exports=r},7:e=>{e.exports=a},241:e=>{e.exports=n},959:e=>{e.exports=t},269:e=>{e.exports=l}},s={};function o(e){var t=s[e];if(void 0!==t)return t.exports;var a=s[e]={exports:{}};return i[e](a,a.exports,o),a.exports}o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var a in t)o.o(t,a)&&!o.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var u={};o.r(u),o.d(u,{plugin:()=>z});var h=o(781),m=o(959),c=o.n(m),d=o(7);function p(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function v(e){for(var t=1;tg(v({},e),{jsonData:g(v({},e.jsonData),{url:e.url})});class f extends m.PureComponent{render(){const{options:e}=this.props,t=y(e);return c().createElement("div",null,c().createElement(d.DataSourceHttpSettings,{defaultUrl:"https://server.name/piwebapi",dataSourceConfig:t,onChange:this.onHttpOptionsChange,showAccessOptions:!0}),c().createElement("h3",{className:"page-heading"},"Custom Configuration"),c().createElement("div",{className:"gf-form-group"},c().createElement("div",{className:"gf-form-inline"},c().createElement(d.InlineField,{label:"Enable PI Points in Query",labelWidth:24},c().createElement(d.InlineSwitch,{value:t.jsonData.pipoint,onChange:this.onPiPointChange}))),c().createElement("div",{className:"gf-form-inline"},c().createElement(d.InlineField,{label:"Enable New Data Format",labelWidth:24},c().createElement(d.InlineSwitch,{value:t.jsonData.newFormat,onChange:this.onNewFormatChange}))),c().createElement("div",{className:"gf-form-inline"},c().createElement(d.InlineField,{label:"Enable Unit in Data",labelWidth:24},c().createElement(d.InlineSwitch,{value:t.jsonData.useUnit,onChange:this.onUseUnitChange}))),c().createElement("div",{className:"gf-form-inline"},c().createElement(d.InlineField,{label:"Enable Experimental Features",labelWidth:24},c().createElement(d.InlineSwitch,{value:t.jsonData.useExperimental,onChange:this.onUseExperimentalChange}))),t.jsonData.useExperimental&&c().createElement("div",{className:"gf-form-inline"},c().createElement(d.InlineField,{label:"Enable Steaming Support",labelWidth:24},c().createElement(d.InlineSwitch,{value:t.jsonData.useStreaming,onChange:this.onUseStreamingChange})))),c().createElement("h3",{className:"page-heading"},"PI/AF Connection Details"),c().createElement("div",{className:"gf-form-group"},t.jsonData.pipoint&&c().createElement("div",{className:"gf-form"},c().createElement(b,{label:"PI Server",labelWidth:10,inputWidth:25,onChange:this.onPIServerChange,value:t.jsonData.piserver||"",placeholder:"Default PI Server to use for data requests"})),c().createElement("div",{className:"gf-form"},c().createElement(b,{label:"AF Server",labelWidth:10,inputWidth:25,onChange:this.onAFServerChange,value:t.jsonData.afserver||"",placeholder:"Default AF Server to use for data requests"})),c().createElement("div",{className:"gf-form"},c().createElement(b,{label:"AF Database",labelWidth:10,inputWidth:25,onChange:this.onAFDatabaseChange,value:t.jsonData.afdatabase||"",placeholder:"Default AF Database server for AF queries"}))))}constructor(...e){super(...e),p(this,"onPIServerChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=g(v({},a.jsonData),{piserver:e.target.value});t(g(v({},a),{jsonData:n}))})),p(this,"onAFServerChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=g(v({},a.jsonData),{afserver:e.target.value});t(g(v({},a),{jsonData:n}))})),p(this,"onAFDatabaseChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=g(v({},a.jsonData),{afdatabase:e.target.value});t(g(v({},a),{jsonData:n}))})),p(this,"onHttpOptionsChange",(e=>{const{onOptionsChange:t}=this.props;t(y(e))})),p(this,"onPiPointChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=g(v({},a.jsonData),{piserver:e.target.checked?a.jsonData.piserver:"",pipoint:e.target.checked});t(g(v({},a),{jsonData:n}))})),p(this,"onNewFormatChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=g(v({},a.jsonData),{newFormat:e.target.checked});t(g(v({},a),{jsonData:n}))})),p(this,"onUseUnitChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=g(v({},a.jsonData),{useUnit:e.target.checked});t(g(v({},a),{jsonData:n}))})),p(this,"onUseExperimentalChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=g(v({},a.jsonData),{useExperimental:e.target.checked,useStreaming:!!e.target.checked&&a.jsonData.useStreaming});t(g(v({},a),{jsonData:n}))})),p(this,"onUseStreamingChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=g(v({},a.jsonData),{useStreaming:e.target.checked});t(g(v({},a),{jsonData:n}))}))}}var E=o(241);function S(){return S=Object.assign||function(e){for(var t=1;tc().createElement(c().Fragment,null,c().createElement(d.InlineFormLabel,{width:t,tooltip:a},e),n),I=()=>c().createElement("div",{className:"gf-form gf-form--grow"},c().createElement("div",{className:"gf-form-label gf-form-label--grow"})),w=e=>{var t=S({},C(e));return c().createElement(O,null,c().createElement(P,t))},O=e=>c().createElement("div",{className:"gf-form-inline"},e.children,c().createElement(I,null)),x=e=>{var t=S({},C(e));return c().createElement(D,null,c().createElement(P,t))},D=e=>c().createElement(c().Fragment,null,e.children),F={target:";",attributes:[],segments:[],regex:{enable:!1},summary:{types:[],basis:"EventWeighted",interval:"",nodata:"Null"},expression:"",interpolate:{enable:!1},useLastValue:{enable:!1},recordedValues:{enable:!1,boundaryType:"Inside"},digitalStates:{enable:!1},enableStreaming:{enable:!1},useUnit:{enable:!1},isPiPoint:!1},j=({isRaw:e,onChange:t})=>{const[a,n]=(0,m.useState)(!1);return(0,m.useEffect)((()=>{n(!1)}),[e]),e?c().createElement(c().Fragment,null,c().createElement(d.Button,{"aria-label":"Switch to visual editor",icon:"pen",variant:"secondary",type:"button",onClick:()=>{n(!0)}}),c().createElement(d.ConfirmModal,{isOpen:a,title:"Switch to visual editor mode",body:"Are you sure to switch to visual editor mode? You will lose the changes done in raw query mode.",confirmText:"Yes, switch to editor mode",dismissText:"No, stay in raw query mode",onConfirm:()=>{t(!1)},onDismiss:()=>{n(!1)}})):c().createElement(d.Button,{"aria-label":"Switch to text editor",icon:"pen",variant:"secondary",type:"button",onClick:()=>{t(!0)}})};function A(e){return(0,E.map)(e,(e=>{var t,a;return{text:e.Name,expandable:void 0===e.HasChildren||!0===e.HasChildren||(null!==(t=e.Path)&&void 0!==t?t:"").split("\\").length<=3,HasChildren:e.HasChildren,Items:null!==(a=e.Items)&&void 0!==a?a:[],Path:e.Path,WebId:e.WebId}}))}function V(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function W(e){for(var t=1;t{var t;return e.value?c().createElement("div",{style:{width:e.width,marginRight:e.marginRight},className:"gf-form-label "+("template"===e.value.type?"query-keyword":"")},null!==(t=e.label)&&void 0!==t?t:"--no label--"):c().createElement("a",{className:"gf-form-label query-part"},c().createElement(d.Icon,{name:"plus"}))};class R extends m.PureComponent{isValueEmpty(e){return!e||!e.value||!e.value.length||e.value===q}calcBasisValueChanged(e){const t=this.props.query,a=t.summary;var n;a&&(a.basis=null===(n=e.value)||void 0===n?void 0:n.value),this.onChange(T(W({},t),{summary:a}))}getCalcBasisSegments(){return(0,E.map)(this.calculationBasis,(e=>({label:e,value:{value:e,expandable:!0}})))}recordedBoundaryTypeValueChanged(e){const t=this.props.query,a=t.recordedValues;var n;a&&(a.boundaryType=null===(n=e.value)||void 0===n?void 0:n.value),this.onChange(T(W({},t),{recordedValues:a}))}getRecordedBoundaryTypeSegments(){return(0,E.map)(this.recordedBoundaryTypes,(e=>({label:e,value:{value:e,expandable:!0}})))}calcNoDataValueChanged(e){const t=this.props.query,a=t.summary;var n;a&&(a.nodata=null===(n=e.value)||void 0===n?void 0:n.value),this.onChange(T(W({},t),{summary:a}))}getNoDataSegments(){return(0,E.map)(this.noDataReplacement,(e=>({label:e,value:{value:e,expandable:!0}})))}onSummaryValueChanged(e,t){const a=this.state.summaries.slice(0);a[t]=e,this.isValueEmpty(e.value)&&a.splice(t,1),this.setState({summaries:a},this.stateCallback)}getSummarySegments(){const e=(0,E.filter)(this.summaryTypes,(e=>-1===this.state.summaries.map((e=>{var t;return null===(t=e.value)||void 0===t?void 0:t.value})).indexOf(e))),t=(0,E.map)(e,(e=>({label:e,value:{value:e,expandable:!0}})));return t.unshift({label:q,value:{value:q}}),t}removeSummary(e){const t=(0,E.filter)(this.state.summaries,(t=>t!==e));this.setState({summaries:t})}onSummaryAction(e){const t=this.state.summaries.slice(0);if(!this.isValueEmpty(e.value)){var a;let n={label:e.label,value:{value:null===(a=e.value)||void 0===a?void 0:a.value,expandable:!0}};t.push(n)}this.setState({summarySegment:{},summaries:t},this.stateCallback)}removeAttribute(e){const t=(0,E.filter)(this.state.attributes,(t=>t!==e));this.attributeChangeValue(t)}onAttributeAction(e){const{query:t}=this.props,a=this.state.attributes.slice(0);if(null!==e.value&&"object"!=typeof e.value&&!Array.isArray(e.value)){const t=String(e.value);e.value={type:t.match(/\${\w+}/gi)?"template":void 0,value:t}}if(!this.isValueEmpty(e.value)){var n,l,r;let i={label:e.label,value:{type:(null===(n=e.value)||void 0===n?void 0:n.value)&&(null===(l=e.value)||void 0===l?void 0:l.value.match(/\${\w+}/gi))?"template":void 0,value:null===(r=e.value)||void 0===r?void 0:r.value,expandable:!t.isPiPoint}};a.push(i)}this.attributeChangeValue(a)}getSegmentPathUpTo(e,t){const a=e.slice(0,t);return(0,E.reduce)(a,((e,t)=>{var a;return t.value?(null===(a=t.value.value)||void 0===a?void 0:a.startsWith("-Select"))?e:e?e+"\\"+t.value.value:t.value.value:""}),"")}checkAttributeSegments(e,t){var a;const{datasource:n,data:l}=this.props,r=this,i={path:this.getSegmentPathUpTo(t.slice(0),t.length),type:"attributes"};var s;return n.metricFindQuery(i,Object.assign(null!==(s=null==l||null===(a=l.request)||void 0===a?void 0:a.scopedVars)&&void 0!==s?s:{},{isPiPoint:!1})).then((t=>{const a={};(0,E.each)(t,(e=>{a[e.Path.substring(e.Path.indexOf("|")+1)]=e.WebId}));const l=(0,E.filter)(e,(e=>{var t;const l=n.templateSrv.replace(null===(t=e.value)||void 0===t?void 0:t.value);return void 0!==a[l]}));return r.availableAttributes=a,this.attributeChangeValue(l)})).catch((t=>(r.error=t.message||"Failed to issue metric query",this.attributeChangeValue(e))))}checkPiPointSegments(e,t){var a;const{datasource:n,data:l}=this.props,r=this,i={path:e.path,webId:r.getSelectedPIServer(),pointName:e.label,type:"pipoint"};var s;return n.metricFindQuery(i,Object.assign(null!==(s=null==l||null===(a=l.request)||void 0===a?void 0:a.scopedVars)&&void 0!==s?s:{},{isPiPoint:!0})).then((()=>r.attributeChangeValue(t))).catch((e=>(r.error=e.message||"Failed to issue metric query",r.attributeChangeValue([]))))}getSelectedPIServer(){var e;let t="";return this.piServer.forEach((e=>{const a=this.props.query.target.split(";");a.length>=2&&a[0]===e.text&&(t=e.WebId)})),this.piServer.length>0?null===(e=this.piServer[0].value)||void 0===e?void 0:e.webId:t}textEditorChanged(){const{query:e}=this.props,t=e.target.split(";"),a=t.length>0?t[0].split("\\"):[];let n=[],l=[];a.length>1||1===a.length&&""!==a[0]?(t.splice(0,1),(0,E.each)(a,((e,t)=>{n.push({label:e,value:{type:e.match(/\${\w+}/gi)?"template":void 0,value:e,expandable:!0}})})),(0,E.each)(t,(function(e,t){""!==e&&l.push({label:e,value:{type:e.match(/\${\w+}/gi)?"template":void 0,value:e,expandable:!1}})})),this.getElementSegments(a.length+1,n).then((e=>{e.length>0&&n.push({label:"Select Element",value:{value:"-Select Element-"}})})).then((()=>{this.updateArray(n,l,this.state.summaries,e.isPiPoint,(()=>{this.onChange(T(W({},e),{query:void 0,rawQuery:!1,attributes:this.state.attributes,segments:this.state.segments}))}))}))):(n=this.checkAfServer(),this.updateArray(n,this.state.attributes,this.state.summaries,e.isPiPoint,(()=>{this.onChange(T(W({},e),{query:void 0,rawQuery:!1,attributes:this.state.attributes,segments:this.state.segments}))})))}render(){const{query:e,onChange:t,onRunQuery:a}=this.props,n=(0,E.defaults)(e,F),{useLastValue:l,useUnit:r,interpolate:i,query:s,rawQuery:o,digitalStates:u,enableStreaming:h,recordedValues:m,expression:p,isPiPoint:v,hideError:g,summary:b,display:y,regex:f}=n;return c().createElement(c().Fragment,null,this.props.datasource.piPointConfig&&c().createElement(d.InlineField,{label:"Is Pi Point?",labelWidth:B},c().createElement(d.InlineSwitch,{value:v,onChange:this.onIsPiPointChange})),!!o&&c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Raw Query",labelWidth:B,grow:!0},c().createElement(d.Input,{onBlur:this.stateCallback,value:s,onChange:e=>t(T(W({},n),{query:e.target.value})),placeholder:"enter query"})),c().createElement(j,{isRaw:!0,onChange:e=>this.textEditorChanged()})),!o&&c().createElement(c().Fragment,null,c().createElement("div",{className:"gf-form-inline"},c().createElement(x,{label:v?"PI Server":"AF Elements",tooltip:v?"Select PI server.":"Select AF Element."},this.state.segments.map(((e,t)=>c().createElement(d.SegmentAsync,{key:"element-"+t,Component:c().createElement(k,{value:e.value,label:e.label}),onChange:e=>this.onSegmentChange(e,t),loadOptions:e=>this.getElementSegments(t),allowCustomValue:!0,inputMinWidth:200}))),c().createElement(I,null),!v&&c().createElement(j,{isRaw:!1,onChange:e=>{t(T(W({},n),{query:n.target,rawQuery:e}))}}))),c().createElement(w,{label:v?"Pi Points":"Attributes"},this.state.attributes.map(((e,t)=>v?c().createElement(d.SegmentAsync,{key:"attributes-"+t,Component:c().createElement(k,{value:e.value,label:e.label}),disabled:0===this.piServer.length,onChange:e=>this.onPiPointChange(e,t),loadOptions:this.getAttributeSegmentsPI,reloadOptionsOnChange:!0,allowCustomValue:!0,inputMinWidth:N}):c().createElement(d.Segment,{key:"attributes-"+t,Component:c().createElement(k,{value:e.value,label:e.label}),disabled:this.state.segments.length<=2,onChange:e=>this.onAttributeChange(e,t),options:this.getAttributeSegmentsAF(),allowCustomValue:!0,inputMinWidth:N}))),v&&c().createElement(d.SegmentAsync,{Component:c().createElement(k,{value:this.state.attributeSegment.value,label:this.state.attributeSegment.label}),disabled:0===this.piServer.length,onChange:this.onAttributeAction,loadOptions:this.getAttributeSegmentsPI,reloadOptionsOnChange:!0,allowCustomValue:!0,inputMinWidth:N}),!v&&c().createElement(d.Segment,{Component:c().createElement(k,{value:this.state.attributeSegment.value,label:this.state.attributeSegment.label}),disabled:this.state.segments.length<=2,onChange:this.onAttributeAction,options:this.getAttributeSegmentsAF(),allowCustomValue:!0,inputMinWidth:N}))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Calculation",grow:!0,labelWidth:B,tooltip:"Modify all attributes by an equation. Use '.' for current item. Leave Attributes empty if you wish to perform element based calculations."},c().createElement(d.Input,{onBlur:a,value:p,onChange:e=>t(T(W({},n),{expression:e.target.value})),placeholder:"'.'*2"}))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Use Last Value",tooltip:"Fetch only last value from time range",labelWidth:B},c().createElement(d.InlineSwitch,{value:l.enable,onChange:()=>this.onChange(T(W({},n),{useLastValue:T(W({},l),{enable:!l.enable})}))})),c().createElement(d.InlineField,{label:"Digital States",labelWidth:B},c().createElement(d.InlineSwitch,{value:u.enable,onChange:()=>this.onChange(T(W({},n),{digitalStates:T(W({},u),{enable:!u.enable})}))})),c().createElement(d.InlineField,{label:"Replace Bad Data",labelWidth:B,tooltip:"Replacement for bad quality values."},c().createElement(d.Segment,{Component:c().createElement(k,{width:96,value:{value:null==b?void 0:b.nodata},label:null==b?void 0:b.nodata}),onChange:this.calcNoDataValueChanged,options:this.getNoDataSegments(),allowCustomValue:!0})),c().createElement(d.InlineField,{label:"Ignore API Error?",labelWidth:B},c().createElement(d.InlineSwitch,{value:g,onChange:this.onHideErrorChange})),this.props.datasource.useUnitConfig&&c().createElement(d.InlineField,{label:"Use unit from datapoints",tooltip:"Use unit in label from PI tag or PI AF attribute",labelWidth:B},c().createElement(d.InlineSwitch,{value:r.enable,onChange:()=>this.onChange(T(W({},n),{useUnit:T(W({},r),{enable:!r.enable})}))})),this.props.datasource.useStreaming&&c().createElement(d.InlineField,{label:"Enable Streaming",labelWidth:B,tooltip:"Enable streaming data if it is supported for the point type."},c().createElement(d.InlineSwitch,{value:h.enable,onChange:()=>this.onChange(T(W({},n),{enableStreaming:T(W({},h),{enable:!h.enable})}))}))),!l.enable&&!m.enable&&c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:p?"Interval Values":"Interpolate",labelWidth:B},c().createElement(d.InlineSwitch,{value:i.enable,onChange:()=>this.onChange(T(W({},n),{interpolate:T(W({},i),{enable:!i.enable,interval:null})}))})),c().createElement(d.InlineField,{disabled:!i.enable,label:p?"Interval Period":"Interpolate Period",labelWidth:B,tooltip:"Override time between sampling, e.g. '30s'. Defaults to timespan/chart width."},c().createElement(d.Input,{onBlur:a,width:30.633375,value:i.interval,onChange:e=>t(T(W({},n),{interpolate:T(W({},i),{interval:e.target.value})})),placeholder:"30s"}))),!l.enable&&!i.enable&&c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Recorded Values",labelWidth:B},c().createElement(d.InlineSwitch,{value:m.enable,onChange:()=>this.onChange(T(W({},n),{recordedValues:T(W({},m),{enable:!m.enable,maxNumber:null,boundaryType:"Inside"})}))})),c().createElement(d.InlineField,{disabled:!(null==m?void 0:m.enable),label:"Max Recorded Values",labelWidth:B,tooltip:"Maximum number of recorded value to retrive from the data archive, without using interpolation."},c().createElement(d.Input,{onBlur:a,width:30.633375,value:m.maxNumber,onChange:e=>t(T(W({},n),{recordedValues:T(W({},m),{maxNumber:parseInt(e.target.value,10)})})),type:"number",placeholder:"1000"})),c().createElement(d.InlineField,{disabled:!(null==m?void 0:m.enable),label:"Boundary Type",labelWidth:B,tooltip:"Defines the behavior of data retrieval at the end points of a specified time range."},c().createElement(d.Segment,{Component:c().createElement(k,{width:96,value:{value:null==m?void 0:m.boundaryType},label:null==m?void 0:m.boundaryType}),onChange:this.recordedBoundaryTypeValueChanged,options:this.getRecordedBoundaryTypeSegments(),allowCustomValue:!0}))),!l.enable&&c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Summary Period",labelWidth:B,tooltip:"Define the summary period, e.g. '30s'."},c().createElement(d.Input,{onBlur:a,width:30.633375,value:null==b?void 0:b.interval,onChange:e=>t(T(W({},n),{summary:T(W({},b),{interval:e.target.value})})),placeholder:"30s"})),c().createElement(d.InlineField,{label:"Basis",labelWidth:30.633375,tooltip:"Defines the possible calculation options when performing summary calculations over time-series data."},c().createElement(d.Segment,{Component:c().createElement(k,{width:192,marginRight:"0",value:{value:null==b?void 0:b.basis},label:null==b?void 0:b.basis}),onChange:this.calcBasisValueChanged,options:this.getCalcBasisSegments(),allowCustomValue:!0})),c().createElement(d.InlineField,{label:"Summaries",labelWidth:B,tooltip:"PI Web API summary options."},c().createElement(d.InlineFieldRow,null,this.state.summaries.map(((e,t)=>c().createElement(d.Segment,{key:"summaries-"+t,Component:c().createElement(k,{value:e.value,label:e.label}),onChange:e=>this.onSummaryValueChanged(e,t),options:this.getSummarySegments(),allowCustomValue:!0}))),c().createElement(d.Segment,{Component:c().createElement(k,{value:this.state.summarySegment.value,label:this.state.summarySegment.label}),onChange:this.onSummaryAction,options:this.getSummarySegments(),allowCustomValue:!0})))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Display Name",labelWidth:B,tooltip:"If single attribute, modify display name. Otherwise use regex to modify display name."},c().createElement(d.Input,{onBlur:a,width:30.633375,value:y,onChange:e=>t(T(W({},n),{display:e.target.value})),placeholder:"Display"})),c().createElement(d.InlineField,{label:"Enable Regex Replace",labelWidth:B},c().createElement(d.InlineSwitch,{value:f.enable,onChange:()=>{this.onChange(T(W({},n),{regex:T(W({},f),{enable:!f.enable})}))}})),c().createElement(d.InlineField,{label:"Search",labelWidth:B},c().createElement(d.Input,{onBlur:a,width:B,value:f.search,onChange:e=>t(T(W({},n),{regex:T(W({},f),{search:e.target.value})})),placeholder:"(.*)"})),c().createElement(d.InlineField,{label:"Replace",labelWidth:B},c().createElement(d.Input,{onBlur:a,width:B,value:f.replace,onChange:e=>t(T(W({},n),{regex:T(W({},f),{replace:e.target.value})})),placeholder:"$1"}))))}constructor(e){super(e),V(this,"error",void 0),V(this,"piServer",[]),V(this,"availableAttributes",{}),V(this,"summaryTypes",void 0),V(this,"calculationBasis",void 0),V(this,"recordedBoundaryTypes",void 0),V(this,"noDataReplacement",void 0),V(this,"state",{isPiPoint:!1,hideError:!1,segments:[],attributes:[],summaries:[],attributeSegment:{},summarySegment:{},calculationBasisSegment:{},noDataReplacementSegment:{}}),V(this,"segmentChangeValue",(e=>{const t=this.props.query;this.setState({segments:e},(()=>this.onChange(T(W({},t),{segments:e}))))})),V(this,"attributeChangeValue",(e=>{const t=this.props.query;return new Promise((a=>this.setState({attributes:e},(()=>{this.onChange(T(W({},t),{attributes:e})),a()}))))})),V(this,"onPiPointChange",((e,t)=>{let a=this.state.attributes.slice(0);e.label===q?(0,E.remove)(a,((e,a)=>a===t)):a[t]=e,this.checkPiPointSegments(e,a)})),V(this,"onAttributeChange",((e,t)=>{var a;let n=this.state.attributes.slice(0);n[t].label!==(null===(a=e.value)||void 0===a?void 0:a.value)&&(n[t]=e,this.checkAttributeSegments(n,this.state.segments))})),V(this,"onSegmentChange",((e,t)=>{var a;const{query:n}=this.props;let l=this.state.segments.slice(0);if(null!==e.value&&"object"!=typeof e.value&&!Array.isArray(e.value)){const t=String(e.value);e.value={type:t.match(/\${\w+}/gi)?"template":void 0,value:t}}l[t].label!==(null===(a=e.value)||void 0===a?void 0:a.value)&&this.setState({attributes:[]},(()=>e.label===q?(l=(0,E.slice)(l,0,t),void this.checkAttributeSegments([],l).then((()=>{var e;0===l.length?l.push({label:""}):(null===(e=l[l.length-1].value)||void 0===e?void 0:e.expandable)&&l.push({label:"Select Element",value:{value:"-Select Element-"}}),n.isPiPoint&&(this.piServer=[]),this.segmentChangeValue(l)}))):(l[t]=e,n.isPiPoint?(this.piServer.push(e),void this.segmentChangeValue(l)):(t{var a,n;return"template"===(null===(a=e.value)||void 0===a?void 0:a.type)?this.getElementSegments(l.length+1,l).then((e=>(e.length>0&&(l[t].value.expandable=!0,l.push({label:"Select Element",value:{value:"-Select Element-"}})),this.segmentChangeValue(l),l))):((null===(n=e.value)||void 0===n?void 0:n.expandable)&&l.push({label:"Select Element",value:{value:"-Select Element-"}}),new Promise((e=>{this.segmentChangeValue(l),e(l)})))}))))))})),V(this,"getElementSegments",((e,t)=>{var a;const{datasource:n,query:l,data:r}=this.props,i=this,s=l.isPiPoint?{type:"dataserver"}:{path:this.getSegmentPathUpTo(null!=t?t:this.state.segments.slice(0),e),afServerWebId:this.state.segments.length>0&&this.state.segments[0].value?this.state.segments[0].value.webId:void 0};if(!l.isPiPoint){var o,u,h;if((null===(o=n.afserver)||void 0===o?void 0:o.name)&&0===e)return Promise.resolve([{label:n.afserver.name,value:{value:n.afserver.name,expandable:!0}}]);if((null===(u=n.afserver)||void 0===u?void 0:u.name)&&(null===(h=n.afdatabase)||void 0===h?void 0:h.name)&&1===e)return Promise.resolve([{label:n.afdatabase.name,value:{value:n.afdatabase.name,expandable:!0}}])}var m;return n.metricFindQuery(s,Object.assign(null!==(m=null==r||null===(a=r.request)||void 0===a?void 0:a.scopedVars)&&void 0!==m?m:{},{isPiPoint:l.isPiPoint})).then((e=>{const t=(0,E.map)(e,(e=>({label:e.text,value:{webId:e.WebId,value:e.text,expandable:!l.isPiPoint&&e.expandable}})));if(0===t.length)return t;const a=n.templateSrv.getVariables();return(0,E.each)(a,(e=>{let a={label:"${"+e.name+"}",value:{type:"template",value:"${"+e.name+"}",expandable:!l.isPiPoint}};t.unshift(a)})),t.unshift({label:q,value:{value:q}}),t})).catch((e=>(i.error=e.message||"Failed to issue metric query",[])))})),V(this,"getAttributeSegmentsPI",(e=>{var t;const{datasource:a,query:n,data:l}=this.props,r=this,i={path:"",webId:this.getSelectedPIServer(),pointName:(null!=e?e:"")+"*",type:"pipoint"};let s=[];var o;return a.metricFindQuery(i,Object.assign(null!==(o=null==l||null===(t=l.request)||void 0===t?void 0:t.scopedVars)&&void 0!==o?o:{},{isPiPoint:n.isPiPoint})).then((t=>{s=(0,E.map)(t,(e=>({path:e.Path,label:e.text,value:{value:e.text,expandable:!1}}))),e&&e.length>0&&s.unshift({label:e,value:{value:e,expandable:!1}});const l=a.templateSrv.getVariables();return(0,E.each)(l,(e=>{let t={label:"${"+e.name+"}",value:{type:"template",value:"${"+e.name+"}",expandable:!n.isPiPoint}};s.unshift(t)})),s.unshift({label:q,value:{value:q}}),s})).catch((e=>(r.error=e.message||"Failed to issue metric query",s)))})),V(this,"getAttributeSegmentsAF",(e=>{const{datasource:t}=this.props;let a=[];a.push({label:q,value:{value:q}});const n=t.templateSrv.getVariables();return(0,E.each)(n,(e=>{let t={label:"${"+e.name+"}",value:{type:"template",value:"${"+e.name+"}",expandable:!1}};a.push(t)})),(0,E.forOwn)(this.availableAttributes,((e,t)=>{let n={label:t,value:{value:t,expandable:!0}};a.push(n)})),a})),V(this,"buildFromTarget",((e,t,a)=>{const n=e.target.split(";"),l=n.length>0?n[0].split("\\"):[];return l.length>1||1===l.length&&""!==l[0]?(n.splice(0,1),(0,E.each)(l,((e,a)=>{t.push({label:e,value:{type:e.match(/\${\w+}/gi)?"template":void 0,value:e,expandable:!0}})})),(0,E.each)(n,((e,t)=>{""!==e&&a.push({label:e,value:{type:e.match(/\${\w+}/gi)?"template":void 0,value:e,expandable:!1}})})),this.getElementSegments(l.length+1,t).then((e=>(e.length>0&&t.push({label:"Select Element",value:{value:"-Select Element-"}}),t)))):Promise.resolve(t)})),V(this,"checkAfServer",(()=>{var e;const{datasource:t}=this.props,a=[];var n;return(null===(e=t.afserver)||void 0===e?void 0:e.name)?(a.push({label:t.afserver.name,value:{value:t.afserver.name,expandable:!0}}),(null===(n=t.afdatabase)||void 0===n?void 0:n.name)&&a.push({label:t.afdatabase.name,value:{value:t.afdatabase.name,expandable:!0}}),a.push({label:"Select Element",value:{value:"-Select Element-"}})):a.push({label:""}),a})),V(this,"updateArray",((e,t,a,n,l)=>{this.setState({segments:e,attributes:t,summaries:a,isPiPoint:n},(()=>{n||this.checkAttributeSegments(t,this.state.segments).then((()=>{l&&l()}))}))})),V(this,"scopedVarsDone",!1),V(this,"componentDidMount",(()=>{this.initialLoad(!1)})),V(this,"componentDidUpdate",(()=>{var e,t,a;const{query:n}=this.props;"Done"===(null===(e=this.props.data)||void 0===e?void 0:e.state)&&(null===(a=this.props.data)||void 0===a||null===(t=a.request)||void 0===t?void 0:t.scopedVars)&&!this.scopedVarsDone&&(this.scopedVarsDone=!0,this.initialLoad(!n.isPiPoint))})),V(this,"initialLoad",(e=>{const{query:t}=this.props,a=(0,E.defaults)(t,F),{segments:n,attributes:l,summary:r,isPiPoint:i}=a;var s;let o=e?[]:null!==(s=null==n?void 0:n.slice(0))&&void 0!==s?s:[];var u;let h=e?[]:null!==(u=null==l?void 0:l.slice(0))&&void 0!==u?u:[];var m;let c=null!==(m=null==r?void 0:r.types)&&void 0!==m?m:[];if(i||0!==o.length)i&&o.length>0&&(this.piServer=o);else{if(t.target&&t.target.length>0&&";"!==t.target)return h=[],void this.buildFromTarget(t,o,h).then((e=>{this.updateArray(e,h,c,!1)})).catch((e=>console.error(e)));o=this.checkAfServer()}this.updateArray(o,h,c,!!i,(()=>{this.onChange(t)}))})),V(this,"onChange",(e=>{const{onChange:t,onRunQuery:a}=this.props;var n,l;if(e.rawQuery){if(e.target=null!==(n=e.query)&&void 0!==n?n:"",e.query){const{attributes:t,elementPath:a}=function(e){const t=e.split(";"),a=t[0].split("\\");t.splice(0,1);let n=[];if(a.length>1||1===a.length&&""!==a[0]){const e=a.join("\\");return(0,E.each)(t,(function(e,t){""!==e&&n.push({label:e,value:{value:e,expandable:!1}})})),{attributes:n,elementPath:e}}return{attributes:n,elementPath:null}}(e.target);e.attributes=t,e.elementPath=a}}else e.elementPath=this.getSegmentPathUpTo(this.state.segments,this.state.segments.length),e.target=e.elementPath+";"+(0,E.join)(null===(l=e.attributes)||void 0===l?void 0:l.map((e=>{var t;return null===(t=e.value)||void 0===t?void 0:t.value})),";");const r=e.summary;r&&(r.types=this.state.summaries),t(T(W({},e),{summary:r})),this.isValidQuery(e)&&a()})),V(this,"isValidQuery",(e=>{if(e.target&&e.target.length>0&&";"!==e.target){e.target=e.target.trim();const t=e.target.split(";",2);return 2===t.length&&t[0].length>0&&t[1].length>0}return!1})),V(this,"stateCallback",(()=>{const e=this.props.query;this.onChange(e)})),V(this,"onIsPiPointChange",(e=>{const{query:t}=this.props,a=!t.isPiPoint;this.setState({segments:a?[{label:""}]:this.checkAfServer(),attributes:[],isPiPoint:a},(()=>{this.onChange(T(W({},t),{expression:"",attributes:this.state.attributes,segments:this.state.segments,isPiPoint:a}))}))})),V(this,"onHideErrorChange",(e=>{const{query:t}=this.props,a=!t.hideError;this.setState({hideError:a},(()=>{this.onChange(T(W({},t),{hideError:a}))}))})),this.onSegmentChange=this.onSegmentChange.bind(this),this.calcBasisValueChanged=this.calcBasisValueChanged.bind(this),this.recordedBoundaryTypeValueChanged=this.recordedBoundaryTypeValueChanged.bind(this),this.calcNoDataValueChanged=this.calcNoDataValueChanged.bind(this),this.onSummaryAction=this.onSummaryAction.bind(this),this.onSummaryValueChanged=this.onSummaryValueChanged.bind(this),this.onAttributeAction=this.onAttributeAction.bind(this),this.onAttributeChange=this.onAttributeChange.bind(this),this.summaryTypes=["Total","Average","Minimum","Maximum","Range","StdDev","PopulationStdDev","Count","PercentGood","All","AllForNonNumeric"],this.calculationBasis=["TimeWeighted","EventWeighted","TimeWeightedContinuous","TimeWeightedDiscrete","EventWeightedExcludeMostRecentEvent","EventWeightedExcludeEarliestEvent","EventWeightedIncludeBothEnds"],this.recordedBoundaryTypes=["Inside","Outside","Interpolated"],this.noDataReplacement=["Null","Drop","Previous","0","Keep"]}}var U=o(269),M=o(531);function Q(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function $(e){for(var t=1;t{const t=u.target;if(t&&t[e])return{label:t[e].Name,value:t[e]}};var S;return o.getAssetServer(o.afserver.name).then((e=>{g(e.WebId)})),c().createElement(c().Fragment,null,c().createElement("div",{className:"gf-form-group"},c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Database",labelWidth:G,grow:!0},c().createElement(d.AsyncSelect,{key:null!=v?v:"database-key",loadOptions:()=>o.getDatabases(v).then((e=>e.map((e=>({label:e.Name,value:e}))))),loadingMessage:"Loading",value:E("database"),onChange:e=>{f(e.value),h(L($({},s),{database:e.value,template:void 0}))},defaultOptions:!0})),c().createElement(d.InlineField,{label:"Event Frames",labelWidth:G,grow:!0},c().createElement(d.AsyncSelect,{key:null!==(S=null==y?void 0:y.WebId)&&void 0!==S?S:"default-template-key",loadOptions:()=>o.getEventFrameTemplates(null==y?void 0:y.WebId).then((e=>e.map((e=>({label:e.Name,value:e}))))),loadingMessage:"Loading",value:E("template"),onChange:e=>h(L($({},s),{template:e.value})),defaultOptions:!0})),c().createElement(d.InlineField,{label:"Show Start and End Time",labelWidth:G,grow:!0},c().createElement(d.InlineSwitch,{value:!!s.showEndTime,onChange:e=>h(L($({},s),{showEndTime:e.currentTarget.checked}))}))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Category name",labelWidth:G,grow:!0},c().createElement(d.Input,{type:"text",value:s.categoryName,onBlur:e=>p(),onChange:e=>h(L($({},s),{categoryName:e.currentTarget.value})),placeholder:"Enter category name"})),c().createElement(d.InlineField,{label:"Name Filter",labelWidth:G,grow:!0},c().createElement(d.Input,{type:"text",value:s.nameFilter,onBlur:e=>p(),onChange:e=>h(L($({},s),{nameFilter:e.currentTarget.value})),placeholder:"Enter name filter"}))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Enable Name Regex Replacement",labelWidth:G,grow:!1},c().createElement(d.InlineSwitch,{value:null===(a=s.regex)||void 0===a?void 0:a.enable,onChange:e=>h(L($({},s),{regex:L($({},s.regex),{enable:e.currentTarget.checked})}))})),c().createElement(d.InlineField,{label:"Name Filter",labelWidth:20,grow:!1},c().createElement(d.Input,{type:"text",value:null===(n=s.regex)||void 0===n?void 0:n.search,onBlur:e=>p(),onChange:e=>h(L($({},s),{regex:L($({},s.regex),{search:e.currentTarget.value})})),placeholder:"(.*)",width:50})),c().createElement(d.InlineField,{label:"Replace",labelWidth:20,grow:!0},c().createElement(d.Input,{type:"text",value:null==s||null===(l=s.regex)||void 0===l?void 0:l.replace,onBlur:e=>p(),onChange:e=>h(L($({},s),{regex:L($({},s.regex),{replace:e.currentTarget.value})})),placeholder:"$1"}))),c().createElement(d.InlineFieldRow,null,c().createElement(d.InlineField,{label:"Enable Attribute Usage",labelWidth:G,grow:!1},c().createElement(d.InlineSwitch,{value:null===(r=s.attribute)||void 0===r?void 0:r.enable,onChange:e=>h(L($({},s),{attribute:L($({},s.attribute),{enable:e.currentTarget.checked})}))})),c().createElement(d.InlineField,{label:"Attribute Name",labelWidth:G,grow:!0},c().createElement(d.Input,{type:"text",value:null===(i=s.attribute)||void 0===i?void 0:i.name,onBlur:e=>p(),onChange:e=>h(L($({},s),{attribute:L($({},s.attribute),{name:e.currentTarget.value})})),placeholder:"Enter name"})))))}));function _(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function Y(e){for(var t=1;te.substring(1,e.length-2).split(",")[0]))),e.filter=null!==(l=e.filter)&&void 0!==l?l:"*",e.max=null!==(r=e.max)&&void 0!==r?r:1e4,"servers"===e.type?(null===(i=a.afserver)||void 0===i?void 0:i.name)?a.getAssetServer(a.afserver.name).then((e=>[e])).then(A):a.getAssetServers().then(A):"databases"===e.type&&e.afServerWebId?a.getDatabases(e.afServerWebId,{}).then(A):"databases"===e.type?a.getAssetServer(e.path).then((e=>{var t;return a.getDatabases(null!==(t=e.WebId)&&void 0!==t?t:"",{})})).then(A):"databaseElements"===e.type?a.getDatabase(e.path).then((e=>{var t;return a.getDatabaseElements(null!==(t=e.WebId)&&void 0!==t?t:"",{selectedFields:"Items.WebId%3BItems.Name%3BItems.Items%3BItems.Path%3BItems.HasChildren"})})).then(A):"elements"===e.type?a.getElement(e.path).then((t=>{var n;return a.getElements(null!==(n=t.WebId)&&void 0!==n?n:"",{selectedFields:"Items.Description%3BItems.WebId%3BItems.Name%3BItems.Items%3BItems.Path%3BItems.HasChildren",nameFilter:e.filter})})).then(A):"attributes"===e.type?a.getElement(e.path).then((t=>{var n;return a.getAttributes(null!==(n=t.WebId)&&void 0!==n?n:"",{searchFullHierarchy:"true",selectedFields:"Items.Type%3BItems.DefaultUnitsName%3BItems.Description%3BItems.WebId%3BItems.Name%3BItems.Path",nameFilter:e.filter,maxCount:e.max})})).then(A):"dataserver"===e.type?a.getDataServers().then(A):"pipoint"===e.type?a.piPointSearch(e.webId,e.pointName).then(A):Promise.reject("Bad type")}buildQueryParameters(e){return e.targets=(0,E.filter)(e.targets,(e=>{var t;return!(!e||!e.target||0===(null===(t=e.attributes)||void 0===t?void 0:t.length)||";"===e.target||e.hide||e.target.startsWith("Select AF"))})),e.maxDataPoints&&(e.maxDataPoints=e.maxDataPoints>3e4?3e4:e.maxDataPoints),e.targets=(0,E.map)(e.targets,(t=>{var a;const n={enableStreaming:t.enableStreaming,target:this.templateSrv.replace(t.target,e.scopedVars),elementPath:this.templateSrv.replace(t.elementPath,e.scopedVars),attributes:(0,E.map)(t.attributes,(t=>(t.value&&(t.value.value=this.templateSrv.replace(t.value.value,e.scopedVars)),t))),segments:(0,E.map)(t.segments,(t=>(t.value&&(t.value.value=this.templateSrv.replace(t.value.value,e.scopedVars)),t))),isAnnotation:!!t.isAnnotation,display:t.display?this.templateSrv.replace(t.display,e.scopedVars):void 0,refId:t.refId,hide:t.hide,interpolate:t.interpolate?J(Y({},t.interpolate),{interval:this.templateSrv.replace(t.interpolate.interval,e.scopedVars)}):{enable:!1},useLastValue:t.useLastValue||{enable:!1},useUnit:t.useUnit||{enable:!1},recordedValues:t.recordedValues||{enable:!1},digitalStates:t.digitalStates||{enable:!1},webid:null!==(a=t.webid)&&void 0!==a?a:"",regex:t.regex||{enable:!1},expression:t.expression||"",summary:t.summary||{types:[]},startTime:e.range.from,endTime:e.range.to,isPiPoint:!!t.isPiPoint,hideError:!!t.hideError,scopedVars:e.scopedVars};return n.expression&&(n.expression=this.templateSrv.replace(n.expression,e.scopedVars)),void 0!==n.summary.types&&(n.summary.types=(0,E.filter)(n.summary.types,(e=>null!=e&&""!==e)),n.summary.interval=n.summary.interval?this.templateSrv.replace(n.summary.interval,e.scopedVars):n.summary.interval),n})),e}eventFrameToAnnotation(e,t){const a=e.target,n=[],l=Intl.DateTimeFormat().resolvedOptions().locale;return t.forEach((e=>{let t=this.transformDataFrameToMap(e);for(let e=0;eStart: "+new Date(t.time[e]).toLocaleString(l)+"
End: ",t.timeEnd[e]?i+=new Date(t.timeEnd[e]).toLocaleString(l):i+="Eventframe is open";const s={time:t.time[e],timeEnd:a.showEndTime?t.timeEnd[e]:void 0,title:r,id:t.id[e],text:i,tags:["OSISoft PI"]};n.push(s)}})),n}transformDataFrameToMap(e){const t={};return e.fields.forEach((e=>{t[e.name]=e.values.toArray()})),t}restGet(e){return this.getResource(`${e}`).then((e=>e))}getDataServers(){return this.restGet("/dataservers").then((e=>{var t;return null!==(t=e.Items)&&void 0!==t?t:[]}))}getDataServer(e){return e?this.restGet("/dataservers?name="+e).then((e=>e)):Promise.resolve({})}getAssetServers(){return this.restGet("/assetservers").then((e=>{var t;return null!==(t=e.Items)&&void 0!==t?t:[]}))}getAssetServer(e){return e?this.restGet("/assetservers?path=\\\\"+e).then((e=>e)):Promise.resolve({})}getDatabase(e){return e?this.restGet("/assetdatabases?path=\\\\"+e).then((e=>e)):Promise.resolve({})}getDatabases(e,t){return e?this.restGet("/assetservers/"+e+"/assetdatabases").then((e=>{var t;return null!==(t=e.Items)&&void 0!==t?t:[]})):Promise.resolve([])}getElement(e){return e?this.restGet("/elements?path=\\\\"+e).then((e=>e)):Promise.resolve({})}getEventFrameTemplates(e){return e?this.restGet("/assetdatabases/"+e+"/elementtemplates?selectedFields=Items.InstanceType%3BItems.Name%3BItems.WebId").then((e=>{var t;return(0,E.filter)(null!==(t=e.Items)&&void 0!==t?t:[],(e=>"EventFrame"===e.InstanceType))})):Promise.resolve([])}getElementTemplates(e){return e?this.restGet("/assetdatabases/"+e+"/elementtemplates?selectedFields=Items.InstanceType%3BItems.Name%3BItems.WebId").then((e=>{var t;return(0,E.filter)(null!==(t=e.Items)&&void 0!==t?t:[],(e=>"Element"===e.InstanceType))})):Promise.resolve([])}getAttributes(e,t){let a="?"+(0,E.map)(t,((e,t)=>t+"="+e)).join("&");return"?"===a&&(a=""),this.restGet("/elements/"+e+"/attributes"+a).then((e=>{var t;return null!==(t=e.Items)&&void 0!==t?t:[]}))}getDatabaseElements(e,t){let a="?"+(0,E.map)(t,((e,t)=>t+"="+e)).join("&");return"?"===a&&(a=""),this.restGet("/assetdatabases/"+e+"/elements"+a).then((e=>{var t;return null!==(t=e.Items)&&void 0!==t?t:[]}))}getElements(e,t){let a="?"+(0,E.map)(t,((e,t)=>t+"="+e)).join("&");return"?"===a&&(a=""),this.restGet("/elements/"+e+"/elements"+a).then((e=>{var t;return null!==(t=e.Items)&&void 0!==t?t:[]}))}piPointSearch(e,t){let a=this.templateSrv.replace(t),n=`${a}`,l=!1;if(a!==t){const e=/\{(\w|,)+\}/g;let t;for(;null!==(t=e.exec(a));)t.index===e.lastIndex&&e.lastIndex++,t.forEach(((e,t)=>{0===t&&(a=a.replace(e,e.replace("{","(").replace("}",")").replace(",","|")),n=n.replace(e,"*"),l=!0)}))}return this.restGet("/dataservers/"+e+"/points?maxCount=100&nameFilter="+n).then((e=>e&&(null==e?void 0:e.Items)?l?e.Items.filter((e=>{var t;return null===(t=e.Name)||void 0===t?void 0:t.match(a)})):e.Items:[]))}constructor(e,t=(0,M.getTemplateSrv)()){super(e),_(this,"templateSrv",void 0),_(this,"piserver",void 0),_(this,"afserver",void 0),_(this,"afdatabase",void 0),_(this,"piPointConfig",void 0),_(this,"newFormatConfig",void 0),_(this,"useUnitConfig",void 0),_(this,"useExperimental",void 0),_(this,"useStreaming",void 0),this.templateSrv=t,this.piserver={name:(e.jsonData||{}).piserver,webid:void 0},this.afserver={name:(e.jsonData||{}).afserver,webid:void 0},this.afdatabase={name:(e.jsonData||{}).afdatabase,webid:void 0},this.piPointConfig=e.jsonData.pipoint||!1,this.newFormatConfig=e.jsonData.newFormat||!1,this.useUnitConfig=e.jsonData.useUnit||!1,this.useExperimental=e.jsonData.useExperimental||!1,this.useStreaming=e.jsonData.useStreaming||!1,this.annotations={QueryEditor:H,prepareQuery:e=>(e.target&&(e.target.queryType="Annotation",e.target.isAnnotation=!0),e.target),processEvents:(e,t)=>(0,U.of)(this.eventFrameToAnnotation(e,t))},Promise.all([this.getDataServer(this.piserver.name).then((e=>this.piserver.webid=e.WebId)),this.getAssetServer(this.afserver.name).then((e=>this.afserver.webid=e.WebId)),this.getDatabase(this.afserver.name&&this.afdatabase.name?this.afserver.name+"\\"+this.afdatabase.name:void 0).then((e=>this.afdatabase.webid=e.WebId))])}}const z=new h.DataSourcePlugin(K).setQueryEditor(R).setConfigEditor(f);return u})())); +define(["@grafana/data","react","@grafana/ui","lodash","rxjs","@grafana/runtime"],((e,t,a,n,l,r)=>(()=>{"use strict";var i={781:t=>{t.exports=e},531:e=>{e.exports=r},7:e=>{e.exports=a},241:e=>{e.exports=n},959:e=>{e.exports=t},269:e=>{e.exports=l}},s={};function o(e){var t=s[e];if(void 0!==t)return t.exports;var a=s[e]={exports:{}};return i[e](a,a.exports,o),a.exports}o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var a in t)o.o(t,a)&&!o.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var u={};o.r(u),o.d(u,{plugin:()=>z});var m=o(781),h=o(959),d=o.n(h),c=o(7);function p(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function v(e){for(var t=1;tg(v({},e),{jsonData:g(v({},e.jsonData),{url:e.url})});class f extends h.PureComponent{render(){const{options:e}=this.props,t=y(e);return d().createElement("div",null,d().createElement(c.DataSourceHttpSettings,{defaultUrl:"https://server.name/piwebapi",dataSourceConfig:t,onChange:this.onHttpOptionsChange,showAccessOptions:!0}),d().createElement("h3",{className:"page-heading"},"Custom Configuration"),d().createElement("div",{className:"gf-form-group"},d().createElement("div",{className:"gf-form-inline"},d().createElement(c.InlineField,{label:"Enable PI Points in Query",labelWidth:24},d().createElement(c.InlineSwitch,{value:t.jsonData.pipoint,onChange:this.onPiPointChange}))),d().createElement("div",{className:"gf-form-inline"},d().createElement(c.InlineField,{label:"Enable New Data Format",labelWidth:24},d().createElement(c.InlineSwitch,{value:t.jsonData.newFormat,onChange:this.onNewFormatChange}))),d().createElement("div",{className:"gf-form-inline"},d().createElement(c.InlineField,{label:"Enable Unit in Data",labelWidth:24},d().createElement(c.InlineSwitch,{value:t.jsonData.useUnit,onChange:this.onUseUnitChange}))),d().createElement("div",{className:"gf-form-inline"},d().createElement(c.InlineField,{label:"Enable Experimental Features",labelWidth:24},d().createElement(c.InlineSwitch,{value:t.jsonData.useExperimental,onChange:this.onUseExperimentalChange}))),t.jsonData.useExperimental&&d().createElement("div",{className:"gf-form-inline"},d().createElement(c.InlineField,{label:"Enable Steaming Support",labelWidth:24},d().createElement(c.InlineSwitch,{value:t.jsonData.useStreaming,onChange:this.onUseStreamingChange})))),d().createElement("h3",{className:"page-heading"},"PI/AF Connection Details"),d().createElement("div",{className:"gf-form-group"},t.jsonData.pipoint&&d().createElement("div",{className:"gf-form"},d().createElement(b,{label:"PI Server",labelWidth:10,inputWidth:25,onChange:this.onPIServerChange,value:t.jsonData.piserver||"",placeholder:"Default PI Server to use for data requests"})),d().createElement("div",{className:"gf-form"},d().createElement(b,{label:"AF Server",labelWidth:10,inputWidth:25,onChange:this.onAFServerChange,value:t.jsonData.afserver||"",placeholder:"Default AF Server to use for data requests"})),d().createElement("div",{className:"gf-form"},d().createElement(b,{label:"AF Database",labelWidth:10,inputWidth:25,onChange:this.onAFDatabaseChange,value:t.jsonData.afdatabase||"",placeholder:"Default AF Database server for AF queries"}))))}constructor(...e){super(...e),p(this,"onPIServerChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=g(v({},a.jsonData),{piserver:e.target.value});t(g(v({},a),{jsonData:n}))})),p(this,"onAFServerChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=g(v({},a.jsonData),{afserver:e.target.value});t(g(v({},a),{jsonData:n}))})),p(this,"onAFDatabaseChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=g(v({},a.jsonData),{afdatabase:e.target.value});t(g(v({},a),{jsonData:n}))})),p(this,"onHttpOptionsChange",(e=>{const{onOptionsChange:t}=this.props;t(y(e))})),p(this,"onPiPointChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=g(v({},a.jsonData),{piserver:e.target.checked?a.jsonData.piserver:"",pipoint:e.target.checked});t(g(v({},a),{jsonData:n}))})),p(this,"onNewFormatChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=g(v({},a.jsonData),{newFormat:e.target.checked});t(g(v({},a),{jsonData:n}))})),p(this,"onUseUnitChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=g(v({},a.jsonData),{useUnit:e.target.checked});t(g(v({},a),{jsonData:n}))})),p(this,"onUseExperimentalChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=g(v({},a.jsonData),{useExperimental:e.target.checked,useStreaming:!!e.target.checked&&a.jsonData.useStreaming});t(g(v({},a),{jsonData:n}))})),p(this,"onUseStreamingChange",(e=>{const{onOptionsChange:t,options:a}=this.props,n=g(v({},a.jsonData),{useStreaming:e.target.checked});t(g(v({},a),{jsonData:n}))}))}}var E=o(241);function S(){return S=Object.assign||function(e){for(var t=1;td().createElement(d().Fragment,null,d().createElement(c.InlineFormLabel,{width:t,tooltip:a},e),n),P=()=>d().createElement("div",{className:"gf-form gf-form--grow"},d().createElement("div",{className:"gf-form-label gf-form-label--grow"})),w=e=>{var t=S({},I(e));return d().createElement(O,null,d().createElement(C,t))},O=e=>d().createElement("div",{className:"gf-form-inline"},e.children,d().createElement(P,null)),x=e=>{var t=S({},I(e));return d().createElement(F,null,d().createElement(C,t))},F=e=>d().createElement(d().Fragment,null,e.children),D={target:";",attributes:[],segments:[],regex:{enable:!1},nodata:"Null",summary:{enable:!1,types:[],basis:"EventWeighted",duration:"",sampleTypeInterval:!1,sampleInterval:""},expression:"",interpolate:{enable:!1},useLastValue:{enable:!1},recordedValues:{enable:!1,boundaryType:"Inside"},digitalStates:{enable:!1},enableStreaming:{enable:!1},useUnit:{enable:!1},isPiPoint:!1},j=({isRaw:e,onChange:t})=>{const[a,n]=(0,h.useState)(!1);return(0,h.useEffect)((()=>{n(!1)}),[e]),e?d().createElement(d().Fragment,null,d().createElement(c.Button,{"aria-label":"Switch to visual editor",icon:"pen",variant:"secondary",type:"button",onClick:()=>{n(!0)}}),d().createElement(c.ConfirmModal,{isOpen:a,title:"Switch to visual editor mode",body:"Are you sure to switch to visual editor mode? You will lose the changes done in raw query mode.",confirmText:"Yes, switch to editor mode",dismissText:"No, stay in raw query mode",onConfirm:()=>{t(!1)},onDismiss:()=>{n(!1)}})):d().createElement(c.Button,{"aria-label":"Switch to text editor",icon:"pen",variant:"secondary",type:"button",onClick:()=>{t(!0)}})};function A(e){return(0,E.map)(e,(e=>{var t,a;return{text:e.Name,expandable:void 0===e.HasChildren||!0===e.HasChildren||(null!==(t=e.Path)&&void 0!==t?t:"").split("\\").length<=3,HasChildren:e.HasChildren,Items:null!==(a=e.Items)&&void 0!==a?a:[],Path:e.Path,WebId:e.WebId}}))}function W(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function V(e){for(var t=1;t{var t;return e.value?d().createElement("div",{style:{width:e.width,marginRight:e.marginRight},className:"gf-form-label "+("template"===e.value.type?"query-keyword":"")},null!==(t=e.label)&&void 0!==t?t:"--no label--"):d().createElement("a",{className:"gf-form-label query-part"},d().createElement(c.Icon,{name:"plus"}))};class R extends h.PureComponent{isValueEmpty(e){return!e||!e.value||!e.value.length||e.value===q}calcBasisValueChanged(e){const t=this.props.query,a=t.summary;var n;a&&(a.basis=null===(n=e.value)||void 0===n?void 0:n.value),this.onChange(T(V({},t),{summary:a}))}getCalcBasisSegments(){return(0,E.map)(this.calculationBasis,(e=>({label:e,value:{value:e,expandable:!0}})))}recordedBoundaryTypeValueChanged(e){const t=this.props.query,a=t.recordedValues;var n;a&&(a.boundaryType=null===(n=e.value)||void 0===n?void 0:n.value),this.onChange(T(V({},t),{recordedValues:a}))}getRecordedBoundaryTypeSegments(){return(0,E.map)(this.recordedBoundaryTypes,(e=>({label:e,value:{value:e,expandable:!0}})))}calcNoDataValueChanged(e){var t;const a=this.props.query,n=null===(t=e.value)||void 0===t?void 0:t.value;this.onChange(T(V({},a),{nodata:n}))}getNoDataSegments(){return(0,E.map)(this.noDataReplacement,(e=>({label:e,value:{value:e,expandable:!0}})))}onSummaryValueChanged(e,t){const a=this.state.summaries.slice(0);a[t]=e,this.isValueEmpty(e.value)&&a.splice(t,1),this.setState({summaries:a},this.stateCallback)}getSummarySegments(){const e=(0,E.filter)(this.summaryTypes,(e=>-1===this.state.summaries.map((e=>{var t;return null===(t=e.value)||void 0===t?void 0:t.value})).indexOf(e))),t=(0,E.map)(e,(e=>({label:e,value:{value:e,expandable:!0}})));return t.unshift({label:q,value:{value:q}}),t}removeSummary(e){const t=(0,E.filter)(this.state.summaries,(t=>t!==e));this.setState({summaries:t})}onSummaryAction(e){const t=this.state.summaries.slice(0);if(!this.isValueEmpty(e.value)){var a;let n={label:e.label,value:{value:null===(a=e.value)||void 0===a?void 0:a.value,expandable:!0}};t.push(n)}this.setState({summarySegment:{},summaries:t},this.stateCallback)}removeAttribute(e){const t=(0,E.filter)(this.state.attributes,(t=>t!==e));this.attributeChangeValue(t)}onAttributeAction(e){const{query:t}=this.props,a=this.state.attributes.slice(0);if(null!==e.value&&"object"!=typeof e.value&&!Array.isArray(e.value)){const t=String(e.value);e.value={type:t.match(/\${\w+}/gi)?"template":void 0,value:t}}if(!this.isValueEmpty(e.value)){var n,l,r;let i={label:e.label,value:{type:(null===(n=e.value)||void 0===n?void 0:n.value)&&(null===(l=e.value)||void 0===l?void 0:l.value.match(/\${\w+}/gi))?"template":void 0,value:null===(r=e.value)||void 0===r?void 0:r.value,expandable:!t.isPiPoint}};a.push(i)}this.attributeChangeValue(a)}getSegmentPathUpTo(e,t){const a=e.slice(0,t);return(0,E.reduce)(a,((e,t)=>{var a;return t.value?(null===(a=t.value.value)||void 0===a?void 0:a.startsWith("-Select"))?e:e?e+"\\"+t.value.value:t.value.value:""}),"")}checkAttributeSegments(e,t){var a;const{datasource:n,data:l}=this.props,r=this,i={path:this.getSegmentPathUpTo(t.slice(0),t.length),type:"attributes"};var s;return n.metricFindQuery(i,Object.assign(null!==(s=null==l||null===(a=l.request)||void 0===a?void 0:a.scopedVars)&&void 0!==s?s:{},{isPiPoint:!1})).then((t=>{const a={};(0,E.each)(t,(e=>{a[e.Path.substring(e.Path.indexOf("|")+1)]=e.WebId}));const l=(0,E.filter)(e,(e=>{var t;const l=n.templateSrv.replace(null===(t=e.value)||void 0===t?void 0:t.value);return void 0!==a[l]}));return r.availableAttributes=a,this.attributeChangeValue(l)})).catch((t=>(r.error=t.message||"Failed to issue metric query",this.attributeChangeValue(e))))}checkPiPointSegments(e,t){var a;const{datasource:n,data:l}=this.props,r=this,i={path:e.path,webId:r.getSelectedPIServer(),pointName:e.label,type:"pipoint"};var s;return n.metricFindQuery(i,Object.assign(null!==(s=null==l||null===(a=l.request)||void 0===a?void 0:a.scopedVars)&&void 0!==s?s:{},{isPiPoint:!0})).then((()=>r.attributeChangeValue(t))).catch((e=>(r.error=e.message||"Failed to issue metric query",r.attributeChangeValue([]))))}getSelectedPIServer(){var e;let t="";return this.piServer.forEach((e=>{const a=this.props.query.target.split(";");a.length>=2&&a[0]===e.text&&(t=e.WebId)})),this.piServer.length>0?null===(e=this.piServer[0].value)||void 0===e?void 0:e.webId:t}textEditorChanged(){const{query:e}=this.props,t=e.target.split(";"),a=t.length>0?t[0].split("\\"):[];let n=[],l=[];a.length>1||1===a.length&&""!==a[0]?(t.splice(0,1),(0,E.each)(a,((e,t)=>{n.push({label:e,value:{type:e.match(/\${\w+}/gi)?"template":void 0,value:e,expandable:!0}})})),(0,E.each)(t,(function(e,t){""!==e&&l.push({label:e,value:{type:e.match(/\${\w+}/gi)?"template":void 0,value:e,expandable:!1}})})),this.getElementSegments(a.length+1,n).then((e=>{e.length>0&&n.push({label:"Select Element",value:{value:"-Select Element-"}})})).then((()=>{this.updateArray(n,l,this.state.summaries,e.isPiPoint,(()=>{this.onChange(T(V({},e),{query:void 0,rawQuery:!1,attributes:this.state.attributes,segments:this.state.segments}))}))}))):(n=this.checkAfServer(),this.updateArray(n,this.state.attributes,this.state.summaries,e.isPiPoint,(()=>{this.onChange(T(V({},e),{query:void 0,rawQuery:!1,attributes:this.state.attributes,segments:this.state.segments}))})))}render(){const{query:e,onChange:t,onRunQuery:a}=this.props,n=(0,E.defaults)(e,D),{useLastValue:l,useUnit:r,interpolate:i,query:s,rawQuery:o,digitalStates:u,enableStreaming:m,recordedValues:h,expression:p,isPiPoint:v,hideError:g,summary:b,nodata:y,display:f,regex:S}=n;return d().createElement(d().Fragment,null,this.props.datasource.piPointConfig&&d().createElement(c.InlineField,{label:"Is Pi Point?",labelWidth:B},d().createElement(c.InlineSwitch,{value:v,onChange:this.onIsPiPointChange})),!!o&&d().createElement(c.InlineFieldRow,null,d().createElement(c.InlineField,{label:"Raw Query",labelWidth:B,grow:!0},d().createElement(c.Input,{onBlur:this.stateCallback,value:s,onChange:e=>t(T(V({},n),{query:e.target.value})),placeholder:"enter query"})),d().createElement(j,{isRaw:!0,onChange:e=>this.textEditorChanged()})),!o&&d().createElement(d().Fragment,null,d().createElement("div",{className:"gf-form-inline"},d().createElement(x,{label:v?"PI Server":"AF Elements",tooltip:v?"Select PI server.":"Select AF Element."},this.state.segments.map(((e,t)=>d().createElement(c.SegmentAsync,{key:"element-"+t,Component:d().createElement(k,{value:e.value,label:e.label}),onChange:e=>this.onSegmentChange(e,t),loadOptions:e=>this.getElementSegments(t),allowCustomValue:!0,inputMinWidth:200}))),d().createElement(P,null),!v&&d().createElement(j,{isRaw:!1,onChange:e=>{t(T(V({},n),{query:n.target,rawQuery:e}))}}))),d().createElement(w,{label:v?"Pi Points":"Attributes"},this.state.attributes.map(((e,t)=>v?d().createElement(c.SegmentAsync,{key:"attributes-"+t,Component:d().createElement(k,{value:e.value,label:e.label}),disabled:0===this.piServer.length,onChange:e=>this.onPiPointChange(e,t),loadOptions:this.getAttributeSegmentsPI,reloadOptionsOnChange:!0,allowCustomValue:!0,inputMinWidth:N}):d().createElement(c.Segment,{key:"attributes-"+t,Component:d().createElement(k,{value:e.value,label:e.label}),disabled:this.state.segments.length<=2,onChange:e=>this.onAttributeChange(e,t),options:this.getAttributeSegmentsAF(),allowCustomValue:!0,inputMinWidth:N}))),v&&d().createElement(c.SegmentAsync,{Component:d().createElement(k,{value:this.state.attributeSegment.value,label:this.state.attributeSegment.label}),disabled:0===this.piServer.length,onChange:this.onAttributeAction,loadOptions:this.getAttributeSegmentsPI,reloadOptionsOnChange:!0,allowCustomValue:!0,inputMinWidth:N}),!v&&d().createElement(c.Segment,{Component:d().createElement(k,{value:this.state.attributeSegment.value,label:this.state.attributeSegment.label}),disabled:this.state.segments.length<=2,onChange:this.onAttributeAction,options:this.getAttributeSegmentsAF(),allowCustomValue:!0,inputMinWidth:N}))),d().createElement(c.InlineFieldRow,null,d().createElement(c.InlineField,{label:"Calculation",grow:!0,labelWidth:B,tooltip:"Modify all attributes by an equation. Use '.' for current item. Leave Attributes empty if you wish to perform element based calculations."},d().createElement(c.Input,{onBlur:a,value:p,onChange:e=>t(T(V({},n),{expression:e.target.value})),placeholder:"'.'*2"}))),d().createElement(c.InlineFieldRow,null,d().createElement(c.InlineField,{label:"Use Last Value",tooltip:"Fetch only last value from time range",labelWidth:B},d().createElement(c.InlineSwitch,{value:l.enable,onChange:()=>this.onChange(T(V({},n),{useLastValue:T(V({},l),{enable:!l.enable})}))})),d().createElement(c.InlineField,{label:"Digital States",labelWidth:B},d().createElement(c.InlineSwitch,{value:u.enable,onChange:()=>this.onChange(T(V({},n),{digitalStates:T(V({},u),{enable:!u.enable})}))})),d().createElement(c.InlineField,{label:"Replace Bad Data",labelWidth:B,tooltip:"Replacement for bad quality values."},d().createElement(c.Segment,{Component:d().createElement(k,{width:96,value:{value:y},label:y}),onChange:this.calcNoDataValueChanged,options:this.getNoDataSegments(),allowCustomValue:!0})),d().createElement(c.InlineField,{label:"Ignore API Error?",labelWidth:B},d().createElement(c.InlineSwitch,{value:g,onChange:this.onHideErrorChange})),this.props.datasource.useUnitConfig&&d().createElement(c.InlineField,{label:"Use unit from datapoints",tooltip:"Use unit in label from PI tag or PI AF attribute",labelWidth:B},d().createElement(c.InlineSwitch,{value:r.enable,onChange:()=>this.onChange(T(V({},n),{useUnit:T(V({},r),{enable:!r.enable})}))})),this.props.datasource.useStreaming&&d().createElement(c.InlineField,{label:"Enable Streaming",labelWidth:B,tooltip:"Enable streaming data if it is supported for the point type."},d().createElement(c.InlineSwitch,{value:m.enable,onChange:()=>this.onChange(T(V({},n),{enableStreaming:T(V({},m),{enable:!m.enable})}))}))),(i.enable||!l.enable&&!h.enable)&&d().createElement(c.InlineFieldRow,null,d().createElement(c.InlineField,{label:p?"Interval Values":"Interpolate",labelWidth:B},d().createElement(c.InlineSwitch,{value:i.enable,onChange:()=>this.onChange(T(V({},n),{interpolate:T(V({},i),{enable:!i.enable,interval:null})}))})),d().createElement(c.InlineField,{disabled:!i.enable,label:p?"Interval Period":"Interpolate Period",labelWidth:B,tooltip:"Override time between sampling, e.g. '30s'. Defaults to timespan/chart width."},d().createElement(c.Input,{onBlur:a,width:30.633375,value:i.interval,onChange:e=>t(T(V({},n),{interpolate:T(V({},i),{interval:e.target.value})})),placeholder:"30s"}))),(h.enable||!l.enable&&!i.enable)&&d().createElement(c.InlineFieldRow,null,d().createElement(c.InlineField,{label:"Recorded Values",labelWidth:B},d().createElement(c.InlineSwitch,{value:h.enable,onChange:()=>this.onChange(T(V({},n),{recordedValues:T(V({},h),{enable:!h.enable,maxNumber:null,boundaryType:"Inside"})}))})),d().createElement(c.InlineField,{disabled:!(null==h?void 0:h.enable),label:"Max Recorded Values",labelWidth:B,tooltip:"Maximum number of recorded value to retrive from the data archive, without using interpolation."},d().createElement(c.Input,{onBlur:a,width:30.633375,value:h.maxNumber,onChange:e=>t(T(V({},n),{recordedValues:T(V({},h),{maxNumber:parseInt(e.target.value,10)})})),type:"number",placeholder:"1000"})),d().createElement(c.InlineField,{disabled:!(null==h?void 0:h.enable),label:"Boundary Type",labelWidth:B,tooltip:"Defines the behavior of data retrieval at the end points of a specified time range."},d().createElement(c.Segment,{Component:d().createElement(k,{width:96,value:{value:null==h?void 0:h.boundaryType},label:null==h?void 0:h.boundaryType}),onChange:this.recordedBoundaryTypeValueChanged,options:this.getRecordedBoundaryTypeSegments(),allowCustomValue:!0}))),!l.enable&&d().createElement(c.InlineFieldRow,null,d().createElement(c.InlineField,{label:"Summary Enable",labelWidth:B},d().createElement(c.InlineSwitch,{value:null==b?void 0:b.enable,onChange:()=>this.onChange(T(V({},n),{summary:T(V({},b),{enable:!(null==b?void 0:b.enable)})}))})),d().createElement(c.InlineField,{disabled:!(null==b?void 0:b.enable),label:"Summary Basis",labelWidth:B,tooltip:"Defines the possible calculation options when performing summary calculations over time-series data."},d().createElement(c.Segment,{Component:d().createElement(k,{width:245.067,marginRight:"0",value:{value:null==b?void 0:b.basis},label:null==b?void 0:b.basis}),onChange:this.calcBasisValueChanged,options:this.getCalcBasisSegments(),allowCustomValue:!0})),d().createElement(c.InlineField,{disabled:!(null==b?void 0:b.enable),label:"Summaries Types",labelWidth:B,tooltip:"PI Web API summary options."},d().createElement(c.InlineFieldRow,null,this.state.summaries.map(((e,t)=>d().createElement(c.Segment,{key:"summaries-"+t,Component:d().createElement(k,{value:e.value,label:e.label}),onChange:e=>this.onSummaryValueChanged(e,t),options:this.getSummarySegments(),allowCustomValue:!0}))),d().createElement(c.Segment,{Component:d().createElement(k,{value:this.state.summarySegment.value,label:this.state.summarySegment.label}),onChange:this.onSummaryAction,options:this.getSummarySegments(),allowCustomValue:!0})))),(null==b?void 0:b.enable)&&d().createElement(c.InlineFieldRow,null,d().createElement(c.InlineField,{label:"Enable interval",labelWidth:B,tooltip:"Enable summary type interval."},d().createElement(c.InlineSwitch,{value:!!(null==b?void 0:b.sampleTypeInterval),onChange:()=>this.onChange(T(V({},n),{summary:T(V({},b),{sampleTypeInterval:!(null==b?void 0:b.sampleTypeInterval)})}))})),d().createElement(c.InlineField,{disabled:!b.sampleTypeInterval,label:"Sample Interval",labelWidth:B,tooltip:"A time span specifies how often the filter expression is evaluated when computing the summary for an interval, if the sampleType is enable."},d().createElement(c.Input,{onBlur:a,width:30.633375,value:null==b?void 0:b.sampleInterval,onChange:e=>t(T(V({},n),{summary:T(V({},b),{sampleInterval:e.target.value})})),placeholder:"30s"})),d().createElement(c.InlineField,{label:"Summary Period",labelWidth:B,tooltip:"The duration of each summary interval, e.g. '30s'."},d().createElement(c.Input,{onBlur:a,width:30.633375,value:null==b?void 0:b.duration,onChange:e=>t(T(V({},n),{summary:T(V({},b),{duration:e.target.value})})),placeholder:"30s"}))),d().createElement(c.InlineFieldRow,null,d().createElement(c.InlineField,{label:"Display Name",labelWidth:B,tooltip:"If single attribute, modify display name. Otherwise use regex to modify display name."},d().createElement(c.Input,{onBlur:a,width:30.633375,value:f,onChange:e=>t(T(V({},n),{display:e.target.value})),placeholder:"Display"})),d().createElement(c.InlineField,{label:"Enable Regex Replace",labelWidth:B},d().createElement(c.InlineSwitch,{value:S.enable,onChange:()=>{this.onChange(T(V({},n),{regex:T(V({},S),{enable:!S.enable})}))}})),d().createElement(c.InlineField,{label:"Search",labelWidth:B},d().createElement(c.Input,{onBlur:a,width:B,value:S.search,onChange:e=>t(T(V({},n),{regex:T(V({},S),{search:e.target.value})})),placeholder:"(.*)"})),d().createElement(c.InlineField,{label:"Replace",labelWidth:B},d().createElement(c.Input,{onBlur:a,width:B,value:S.replace,onChange:e=>t(T(V({},n),{regex:T(V({},S),{replace:e.target.value})})),placeholder:"$1"}))))}constructor(e){super(e),W(this,"error",void 0),W(this,"piServer",[]),W(this,"availableAttributes",{}),W(this,"summaryTypes",void 0),W(this,"calculationBasis",void 0),W(this,"recordedBoundaryTypes",void 0),W(this,"noDataReplacement",void 0),W(this,"state",{isPiPoint:!1,hideError:!1,segments:[],attributes:[],summaries:[],attributeSegment:{},summarySegment:{},calculationBasisSegment:{},noDataReplacementSegment:{}}),W(this,"segmentChangeValue",(e=>{const t=this.props.query;this.setState({segments:e},(()=>this.onChange(T(V({},t),{segments:e}))))})),W(this,"attributeChangeValue",(e=>{const t=this.props.query;return new Promise((a=>this.setState({attributes:e},(()=>{this.onChange(T(V({},t),{attributes:e})),a()}))))})),W(this,"onPiPointChange",((e,t)=>{let a=this.state.attributes.slice(0);e.label===q?(0,E.remove)(a,((e,a)=>a===t)):a[t]=e,this.checkPiPointSegments(e,a)})),W(this,"onAttributeChange",((e,t)=>{var a;let n=this.state.attributes.slice(0);n[t].label!==(null===(a=e.value)||void 0===a?void 0:a.value)&&(n[t]=e,this.checkAttributeSegments(n,this.state.segments))})),W(this,"onSegmentChange",((e,t)=>{var a;const{query:n}=this.props;let l=this.state.segments.slice(0);if(null!==e.value&&"object"!=typeof e.value&&!Array.isArray(e.value)){const t=String(e.value);e.value={type:t.match(/\${\w+}/gi)?"template":void 0,value:t}}l[t].label!==(null===(a=e.value)||void 0===a?void 0:a.value)&&this.setState({attributes:[]},(()=>e.label===q?(l=(0,E.slice)(l,0,t),void this.checkAttributeSegments([],l).then((()=>{var e;0===l.length?l.push({label:""}):(null===(e=l[l.length-1].value)||void 0===e?void 0:e.expandable)&&l.push({label:"Select Element",value:{value:"-Select Element-"}}),n.isPiPoint&&(this.piServer=[]),this.segmentChangeValue(l)}))):(l[t]=e,n.isPiPoint?(this.piServer.push(e),void this.segmentChangeValue(l)):(t{var a,n;return"template"===(null===(a=e.value)||void 0===a?void 0:a.type)?this.getElementSegments(l.length+1,l).then((e=>(e.length>0&&(l[t].value.expandable=!0,l.push({label:"Select Element",value:{value:"-Select Element-"}})),this.segmentChangeValue(l),l))):((null===(n=e.value)||void 0===n?void 0:n.expandable)&&l.push({label:"Select Element",value:{value:"-Select Element-"}}),new Promise((e=>{this.segmentChangeValue(l),e(l)})))}))))))})),W(this,"getElementSegments",((e,t)=>{var a;const{datasource:n,query:l,data:r}=this.props,i=this,s=l.isPiPoint?{type:"dataserver"}:{path:this.getSegmentPathUpTo(null!=t?t:this.state.segments.slice(0),e),afServerWebId:this.state.segments.length>0&&this.state.segments[0].value?this.state.segments[0].value.webId:void 0};if(!l.isPiPoint){var o,u,m;if((null===(o=n.afserver)||void 0===o?void 0:o.name)&&0===e)return Promise.resolve([{label:n.afserver.name,value:{value:n.afserver.name,expandable:!0}}]);if((null===(u=n.afserver)||void 0===u?void 0:u.name)&&(null===(m=n.afdatabase)||void 0===m?void 0:m.name)&&1===e)return Promise.resolve([{label:n.afdatabase.name,value:{value:n.afdatabase.name,expandable:!0}}])}var h;return n.metricFindQuery(s,Object.assign(null!==(h=null==r||null===(a=r.request)||void 0===a?void 0:a.scopedVars)&&void 0!==h?h:{},{isPiPoint:l.isPiPoint})).then((e=>{const t=(0,E.map)(e,(e=>({label:e.text,value:{webId:e.WebId,value:e.text,expandable:!l.isPiPoint&&e.expandable}})));if(0===t.length)return t;const a=n.templateSrv.getVariables();return(0,E.each)(a,(e=>{let a={label:"${"+e.name+"}",value:{type:"template",value:"${"+e.name+"}",expandable:!l.isPiPoint}};t.unshift(a)})),t.unshift({label:q,value:{value:q}}),t})).catch((e=>(i.error=e.message||"Failed to issue metric query",[])))})),W(this,"getAttributeSegmentsPI",(e=>{var t;const{datasource:a,query:n,data:l}=this.props,r=this,i={path:"",webId:this.getSelectedPIServer(),pointName:(null!=e?e:"")+"*",type:"pipoint"};let s=[];var o;return a.metricFindQuery(i,Object.assign(null!==(o=null==l||null===(t=l.request)||void 0===t?void 0:t.scopedVars)&&void 0!==o?o:{},{isPiPoint:n.isPiPoint})).then((t=>{s=(0,E.map)(t,(e=>({path:e.Path,label:e.text,value:{value:e.text,expandable:!1}}))),e&&e.length>0&&s.unshift({label:e,value:{value:e,expandable:!1}});const l=a.templateSrv.getVariables();return(0,E.each)(l,(e=>{let t={label:"${"+e.name+"}",value:{type:"template",value:"${"+e.name+"}",expandable:!n.isPiPoint}};s.unshift(t)})),s.unshift({label:q,value:{value:q}}),s})).catch((e=>(r.error=e.message||"Failed to issue metric query",s)))})),W(this,"getAttributeSegmentsAF",(e=>{const{datasource:t}=this.props;let a=[];a.push({label:q,value:{value:q}});const n=t.templateSrv.getVariables();return(0,E.each)(n,(e=>{let t={label:"${"+e.name+"}",value:{type:"template",value:"${"+e.name+"}",expandable:!1}};a.push(t)})),(0,E.forOwn)(this.availableAttributes,((e,t)=>{let n={label:t,value:{value:t,expandable:!0}};a.push(n)})),a})),W(this,"buildFromTarget",((e,t,a)=>{const n=e.target.split(";"),l=n.length>0?n[0].split("\\"):[];return l.length>1||1===l.length&&""!==l[0]?(n.splice(0,1),(0,E.each)(l,((e,a)=>{t.push({label:e,value:{type:e.match(/\${\w+}/gi)?"template":void 0,value:e,expandable:!0}})})),(0,E.each)(n,((e,t)=>{""!==e&&a.push({label:e,value:{type:e.match(/\${\w+}/gi)?"template":void 0,value:e,expandable:!1}})})),this.getElementSegments(l.length+1,t).then((e=>(e.length>0&&t.push({label:"Select Element",value:{value:"-Select Element-"}}),t)))):Promise.resolve(t)})),W(this,"checkAfServer",(()=>{var e;const{datasource:t}=this.props,a=[];var n;return(null===(e=t.afserver)||void 0===e?void 0:e.name)?(a.push({label:t.afserver.name,value:{value:t.afserver.name,expandable:!0}}),(null===(n=t.afdatabase)||void 0===n?void 0:n.name)&&a.push({label:t.afdatabase.name,value:{value:t.afdatabase.name,expandable:!0}}),a.push({label:"Select Element",value:{value:"-Select Element-"}})):a.push({label:""}),a})),W(this,"updateArray",((e,t,a,n,l)=>{this.setState({segments:e,attributes:t,summaries:a,isPiPoint:n},(()=>{n||this.checkAttributeSegments(t,this.state.segments).then((()=>{l&&l()}))}))})),W(this,"scopedVarsDone",!1),W(this,"componentDidMount",(()=>{this.initialLoad(!1)})),W(this,"componentDidUpdate",(()=>{var e,t,a;const{query:n}=this.props;"Done"===(null===(e=this.props.data)||void 0===e?void 0:e.state)&&(null===(a=this.props.data)||void 0===a||null===(t=a.request)||void 0===t?void 0:t.scopedVars)&&!this.scopedVarsDone&&(this.scopedVarsDone=!0,this.initialLoad(!n.isPiPoint))})),W(this,"initialLoad",(e=>{const{query:t}=this.props,a=(0,E.defaults)(t,D),{segments:n,attributes:l,summary:r,isPiPoint:i}=a;var s;let o=e?[]:null!==(s=null==n?void 0:n.slice(0))&&void 0!==s?s:[];var u;let m=e?[]:null!==(u=null==l?void 0:l.slice(0))&&void 0!==u?u:[];var h;let d=null!==(h=null==r?void 0:r.types)&&void 0!==h?h:[];if(i||0!==o.length)i&&o.length>0&&(this.piServer=o);else{if(t.target&&t.target.length>0&&";"!==t.target)return m=[],void this.buildFromTarget(t,o,m).then((e=>{this.updateArray(e,m,d,!1)})).catch((e=>console.error(e)));o=this.checkAfServer()}this.updateArray(o,m,d,!!i,(()=>{this.onChange(t)}))})),W(this,"onChange",(e=>{const{onChange:t,onRunQuery:a}=this.props;var n,l;if(e.rawQuery){if(e.target=null!==(n=e.query)&&void 0!==n?n:"",e.query){const{attributes:t,elementPath:a}=function(e){const t=e.split(";"),a=t[0].split("\\");t.splice(0,1);let n=[];if(a.length>1||1===a.length&&""!==a[0]){const e=a.join("\\");return(0,E.each)(t,(function(e,t){""!==e&&n.push({label:e,value:{value:e,expandable:!1}})})),{attributes:n,elementPath:e}}return{attributes:n,elementPath:null}}(e.target);e.attributes=t,e.elementPath=a}}else e.elementPath=this.getSegmentPathUpTo(this.state.segments,this.state.segments.length),e.target=e.elementPath+";"+(0,E.join)(null===(l=e.attributes)||void 0===l?void 0:l.map((e=>{var t;return null===(t=e.value)||void 0===t?void 0:t.value})),";");const r=e.summary;r&&(r.types=this.state.summaries),t(T(V({},e),{summary:r})),this.isValidQuery(e)&&a()})),W(this,"isValidQuery",(e=>{if(e.target&&e.target.length>0&&";"!==e.target){e.target=e.target.trim();const t=e.target.split(";",2);return 2===t.length&&t[0].length>0&&t[1].length>0}return!1})),W(this,"stateCallback",(()=>{const e=this.props.query;this.onChange(e)})),W(this,"onIsPiPointChange",(e=>{const{query:t}=this.props,a=!t.isPiPoint;this.setState({segments:a?[{label:""}]:this.checkAfServer(),attributes:[],isPiPoint:a},(()=>{this.onChange(T(V({},t),{expression:"",attributes:this.state.attributes,segments:this.state.segments,isPiPoint:a}))}))})),W(this,"onHideErrorChange",(e=>{const{query:t}=this.props,a=!t.hideError;this.setState({hideError:a},(()=>{this.onChange(T(V({},t),{hideError:a}))}))})),this.onSegmentChange=this.onSegmentChange.bind(this),this.calcBasisValueChanged=this.calcBasisValueChanged.bind(this),this.recordedBoundaryTypeValueChanged=this.recordedBoundaryTypeValueChanged.bind(this),this.calcNoDataValueChanged=this.calcNoDataValueChanged.bind(this),this.onSummaryAction=this.onSummaryAction.bind(this),this.onSummaryValueChanged=this.onSummaryValueChanged.bind(this),this.onAttributeAction=this.onAttributeAction.bind(this),this.onAttributeChange=this.onAttributeChange.bind(this),this.summaryTypes=["Total","Average","Minimum","Maximum","Range","StdDev","PopulationStdDev","Count","PercentGood","All","AllForNonNumeric"],this.calculationBasis=["TimeWeighted","EventWeighted","TimeWeightedContinuous","TimeWeightedDiscrete","EventWeightedExcludeMostRecentEvent","EventWeightedExcludeEarliestEvent","EventWeightedIncludeBothEnds"],this.recordedBoundaryTypes=["Inside","Outside","Interpolated"],this.noDataReplacement=["Null","Drop","Previous","0","Keep"]}}var U=o(269),M=o(531);function Q(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function $(e){for(var t=1;t{const t=u.target;if(t&&t[e])return{label:t[e].Name,value:t[e]}};var S;return o.getAssetServer(o.afserver.name).then((e=>{g(e.WebId)})),d().createElement(d().Fragment,null,d().createElement("div",{className:"gf-form-group"},d().createElement(c.InlineFieldRow,null,d().createElement(c.InlineField,{label:"Database",labelWidth:G,grow:!0},d().createElement(c.AsyncSelect,{key:null!=v?v:"database-key",loadOptions:()=>o.getDatabases(v).then((e=>e.map((e=>({label:e.Name,value:e}))))),loadingMessage:"Loading",value:E("database"),onChange:e=>{f(e.value),m(L($({},s),{database:e.value,template:void 0}))},defaultOptions:!0})),d().createElement(c.InlineField,{label:"Event Frames",labelWidth:G,grow:!0},d().createElement(c.AsyncSelect,{key:null!==(S=null==y?void 0:y.WebId)&&void 0!==S?S:"default-template-key",loadOptions:()=>o.getEventFrameTemplates(null==y?void 0:y.WebId).then((e=>e.map((e=>({label:e.Name,value:e}))))),loadingMessage:"Loading",value:E("template"),onChange:e=>m(L($({},s),{template:e.value})),defaultOptions:!0})),d().createElement(c.InlineField,{label:"Show Start and End Time",labelWidth:G,grow:!0},d().createElement(c.InlineSwitch,{value:!!s.showEndTime,onChange:e=>m(L($({},s),{showEndTime:e.currentTarget.checked}))}))),d().createElement(c.InlineFieldRow,null,d().createElement(c.InlineField,{label:"Category name",labelWidth:G,grow:!0},d().createElement(c.Input,{type:"text",value:s.categoryName,onBlur:e=>p(),onChange:e=>m(L($({},s),{categoryName:e.currentTarget.value})),placeholder:"Enter category name"})),d().createElement(c.InlineField,{label:"Name Filter",labelWidth:G,grow:!0},d().createElement(c.Input,{type:"text",value:s.nameFilter,onBlur:e=>p(),onChange:e=>m(L($({},s),{nameFilter:e.currentTarget.value})),placeholder:"Enter name filter"}))),d().createElement(c.InlineFieldRow,null,d().createElement(c.InlineField,{label:"Enable Name Regex Replacement",labelWidth:G,grow:!1},d().createElement(c.InlineSwitch,{value:null===(a=s.regex)||void 0===a?void 0:a.enable,onChange:e=>m(L($({},s),{regex:L($({},s.regex),{enable:e.currentTarget.checked})}))})),d().createElement(c.InlineField,{label:"Name Filter",labelWidth:20,grow:!1},d().createElement(c.Input,{type:"text",value:null===(n=s.regex)||void 0===n?void 0:n.search,onBlur:e=>p(),onChange:e=>m(L($({},s),{regex:L($({},s.regex),{search:e.currentTarget.value})})),placeholder:"(.*)",width:50})),d().createElement(c.InlineField,{label:"Replace",labelWidth:20,grow:!0},d().createElement(c.Input,{type:"text",value:null==s||null===(l=s.regex)||void 0===l?void 0:l.replace,onBlur:e=>p(),onChange:e=>m(L($({},s),{regex:L($({},s.regex),{replace:e.currentTarget.value})})),placeholder:"$1"}))),d().createElement(c.InlineFieldRow,null,d().createElement(c.InlineField,{label:"Enable Attribute Usage",labelWidth:G,grow:!1},d().createElement(c.InlineSwitch,{value:null===(r=s.attribute)||void 0===r?void 0:r.enable,onChange:e=>m(L($({},s),{attribute:L($({},s.attribute),{enable:e.currentTarget.checked})}))})),d().createElement(c.InlineField,{label:"Attribute Name",labelWidth:G,grow:!0},d().createElement(c.Input,{type:"text",value:null===(i=s.attribute)||void 0===i?void 0:i.name,onBlur:e=>p(),onChange:e=>m(L($({},s),{attribute:L($({},s.attribute),{name:e.currentTarget.value})})),placeholder:"Enter name"})))))}));function _(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function Y(e){for(var t=1;te.substring(1,e.length-2).split(",")[0]))),e.filter=null!==(l=e.filter)&&void 0!==l?l:"*",e.max=null!==(r=e.max)&&void 0!==r?r:1e4,"servers"===e.type?(null===(i=a.afserver)||void 0===i?void 0:i.name)?a.getAssetServer(a.afserver.name).then((e=>[e])).then(A):a.getAssetServers().then(A):"databases"===e.type&&e.afServerWebId?a.getDatabases(e.afServerWebId,{}).then(A):"databases"===e.type?a.getAssetServer(e.path).then((e=>{var t;return a.getDatabases(null!==(t=e.WebId)&&void 0!==t?t:"",{})})).then(A):"databaseElements"===e.type?a.getDatabase(e.path).then((e=>{var t;return a.getDatabaseElements(null!==(t=e.WebId)&&void 0!==t?t:"",{selectedFields:"Items.WebId%3BItems.Name%3BItems.Items%3BItems.Path%3BItems.HasChildren"})})).then(A):"elements"===e.type?a.getElement(e.path).then((t=>{var n;return a.getElements(null!==(n=t.WebId)&&void 0!==n?n:"",{selectedFields:"Items.Description%3BItems.WebId%3BItems.Name%3BItems.Items%3BItems.Path%3BItems.HasChildren",nameFilter:e.filter})})).then(A):"attributes"===e.type?a.getElement(e.path).then((t=>{var n;return a.getAttributes(null!==(n=t.WebId)&&void 0!==n?n:"",{searchFullHierarchy:"true",selectedFields:"Items.Type%3BItems.DefaultUnitsName%3BItems.Description%3BItems.WebId%3BItems.Name%3BItems.Path",nameFilter:e.filter,maxCount:e.max})})).then(A):"dataserver"===e.type?a.getDataServers().then(A):"pipoint"===e.type?a.piPointSearch(e.webId,e.pointName).then(A):Promise.reject("Bad type")}buildQueryParameters(e){return e.targets=(0,E.filter)(e.targets,(e=>{var t;return!(!e||!e.target||0===(null===(t=e.attributes)||void 0===t?void 0:t.length)||";"===e.target||e.hide||e.target.startsWith("Select AF"))})),e.maxDataPoints&&(e.maxDataPoints=e.maxDataPoints>3e4?3e4:e.maxDataPoints),e.targets=(0,E.map)(e.targets,(t=>{var a;const n={enableStreaming:t.enableStreaming,target:this.templateSrv.replace(t.target,e.scopedVars),elementPath:this.templateSrv.replace(t.elementPath,e.scopedVars),attributes:(0,E.map)(t.attributes,(t=>(t.value&&(t.value.value=this.templateSrv.replace(t.value.value,e.scopedVars)),t))),segments:(0,E.map)(t.segments,(t=>(t.value&&(t.value.value=this.templateSrv.replace(t.value.value,e.scopedVars)),t))),isAnnotation:!!t.isAnnotation,display:t.display?this.templateSrv.replace(t.display,e.scopedVars):void 0,refId:t.refId,hide:t.hide,interpolate:t.interpolate?J(Y({},t.interpolate),{interval:this.templateSrv.replace(t.interpolate.interval,e.scopedVars)}):{enable:!1},useLastValue:t.useLastValue||{enable:!1},useUnit:t.useUnit||{enable:!1},recordedValues:t.recordedValues||{enable:!1},digitalStates:t.digitalStates||{enable:!1},webid:null!==(a=t.webid)&&void 0!==a?a:"",regex:t.regex||{enable:!1},expression:t.expression||"",summary:t.summary||{enable:!1,types:[]},nodata:t.nodata,startTime:e.range.from,endTime:e.range.to,isPiPoint:!!t.isPiPoint,hideError:!!t.hideError,scopedVars:e.scopedVars};return n.expression&&(n.expression=this.templateSrv.replace(n.expression,e.scopedVars)),n.summary.enable&&void 0!==n.summary.types&&(n.summary.types=(0,E.filter)(n.summary.types,(e=>null!=e&&""!==e)),n.summary.duration=n.summary.duration?this.templateSrv.replace(n.summary.duration,e.scopedVars):n.summary.duration,n.summary.sampleTypeInterval=!!n.summary.sampleTypeInterval,n.summary.sampleInterval=n.summary.sampleInterval?this.templateSrv.replace(n.summary.sampleInterval,e.scopedVars):n.summary.sampleInterval),n})),e}eventFrameToAnnotation(e,t){const a=e.target,n=[],l=Intl.DateTimeFormat().resolvedOptions().locale;return t.forEach((e=>{let t=this.transformDataFrameToMap(e);for(let e=0;eStart: "+new Date(t.time[e]).toLocaleString(l)+"
End: ",t.timeEnd[e]?i+=new Date(t.timeEnd[e]).toLocaleString(l):i+="Eventframe is open";const s={time:t.time[e],timeEnd:a.showEndTime?t.timeEnd[e]:void 0,title:r,id:t.id[e],text:i,tags:["OSISoft PI"]};n.push(s)}})),n}transformDataFrameToMap(e){const t={};return e.fields.forEach((e=>{t[e.name]=e.values.toArray()})),t}restGet(e){return this.getResource(`${e}`).then((e=>e))}getDataServers(){return this.restGet("/dataservers").then((e=>{var t;return null!==(t=e.Items)&&void 0!==t?t:[]}))}getDataServer(e){return e?this.restGet("/dataservers?name="+e).then((e=>e)):Promise.resolve({})}getAssetServers(){return this.restGet("/assetservers").then((e=>{var t;return null!==(t=e.Items)&&void 0!==t?t:[]}))}getAssetServer(e){return e?this.restGet("/assetservers?path=\\\\"+e).then((e=>e)):Promise.resolve({})}getDatabase(e){return e?this.restGet("/assetdatabases?path=\\\\"+e).then((e=>e)):Promise.resolve({})}getDatabases(e,t){return e?this.restGet("/assetservers/"+e+"/assetdatabases").then((e=>{var t;return null!==(t=e.Items)&&void 0!==t?t:[]})):Promise.resolve([])}getElement(e){return e?this.restGet("/elements?path=\\\\"+e).then((e=>e)):Promise.resolve({})}getEventFrameTemplates(e){return e?this.restGet("/assetdatabases/"+e+"/elementtemplates?selectedFields=Items.InstanceType%3BItems.Name%3BItems.WebId").then((e=>{var t;return(0,E.filter)(null!==(t=e.Items)&&void 0!==t?t:[],(e=>"EventFrame"===e.InstanceType))})):Promise.resolve([])}getElementTemplates(e){return e?this.restGet("/assetdatabases/"+e+"/elementtemplates?selectedFields=Items.InstanceType%3BItems.Name%3BItems.WebId").then((e=>{var t;return(0,E.filter)(null!==(t=e.Items)&&void 0!==t?t:[],(e=>"Element"===e.InstanceType))})):Promise.resolve([])}getAttributes(e,t){let a="?"+(0,E.map)(t,((e,t)=>t+"="+e)).join("&");return"?"===a&&(a=""),this.restGet("/elements/"+e+"/attributes"+a).then((e=>{var t;return null!==(t=e.Items)&&void 0!==t?t:[]}))}getDatabaseElements(e,t){let a="?"+(0,E.map)(t,((e,t)=>t+"="+e)).join("&");return"?"===a&&(a=""),this.restGet("/assetdatabases/"+e+"/elements"+a).then((e=>{var t;return null!==(t=e.Items)&&void 0!==t?t:[]}))}getElements(e,t){let a="?"+(0,E.map)(t,((e,t)=>t+"="+e)).join("&");return"?"===a&&(a=""),this.restGet("/elements/"+e+"/elements"+a).then((e=>{var t;return null!==(t=e.Items)&&void 0!==t?t:[]}))}piPointSearch(e,t){let a=this.templateSrv.replace(t),n=`${a}`,l=!1;if(a!==t){const e=/\{(\w|,)+\}/g;let t;for(;null!==(t=e.exec(a));)t.index===e.lastIndex&&e.lastIndex++,t.forEach(((e,t)=>{0===t&&(a=a.replace(e,e.replace("{","(").replace("}",")").replace(",","|")),n=n.replace(e,"*"),l=!0)}))}return this.restGet("/dataservers/"+e+"/points?maxCount=100&nameFilter="+n).then((e=>e&&(null==e?void 0:e.Items)?l?e.Items.filter((e=>{var t;return null===(t=e.Name)||void 0===t?void 0:t.match(a)})):e.Items:[]))}constructor(e,t=(0,M.getTemplateSrv)()){super(e),_(this,"templateSrv",void 0),_(this,"piserver",void 0),_(this,"afserver",void 0),_(this,"afdatabase",void 0),_(this,"piPointConfig",void 0),_(this,"newFormatConfig",void 0),_(this,"useUnitConfig",void 0),_(this,"useExperimental",void 0),_(this,"useStreaming",void 0),this.templateSrv=t,this.piserver={name:(e.jsonData||{}).piserver,webid:void 0},this.afserver={name:(e.jsonData||{}).afserver,webid:void 0},this.afdatabase={name:(e.jsonData||{}).afdatabase,webid:void 0},this.piPointConfig=e.jsonData.pipoint||!1,this.newFormatConfig=e.jsonData.newFormat||!1,this.useUnitConfig=e.jsonData.useUnit||!1,this.useExperimental=e.jsonData.useExperimental||!1,this.useStreaming=e.jsonData.useStreaming||!1,this.annotations={QueryEditor:H,prepareQuery:e=>(e.target&&(e.target.queryType="Annotation",e.target.isAnnotation=!0),e.target),processEvents:(e,t)=>(0,U.of)(this.eventFrameToAnnotation(e,t))},Promise.all([this.getDataServer(this.piserver.name).then((e=>this.piserver.webid=e.WebId)),this.getAssetServer(this.afserver.name).then((e=>this.afserver.webid=e.WebId)),this.getDatabase(this.afserver.name&&this.afdatabase.name?this.afserver.name+"\\"+this.afdatabase.name:void 0).then((e=>this.afdatabase.webid=e.WebId))])}}const z=new m.DataSourcePlugin(K).setQueryEditor(R).setConfigEditor(f);return u})())); //# sourceMappingURL=module.js.map \ No newline at end of file diff --git a/dist/module.js.map b/dist/module.js.map index 82c3845..1e8c839 100644 --- a/dist/module.js.map +++ b/dist/module.js.map @@ -1 +1 @@ -{"version":3,"file":"module.js","mappings":"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","sources":["webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"@grafana/data\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"@grafana/runtime\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"@grafana/ui\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"lodash\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"react\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"rxjs\"","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/bootstrap","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/runtime/compat get default export","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/runtime/define property getters","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/runtime/hasOwnProperty shorthand","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/runtime/make namespace object","webpack://gridprotectionalliance-osisoftpi-datasource/./config/ConfigEditor.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./components/Forms.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./types.ts","webpack://gridprotectionalliance-osisoftpi-datasource/./components/QueryEditorModeSwitcher.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./helper.ts","webpack://gridprotectionalliance-osisoftpi-datasource/./query/QueryEditor.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./query/AnnotationsQueryEditor.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./datasource.ts","webpack://gridprotectionalliance-osisoftpi-datasource/./module.ts"],"sourcesContent":["module.exports = __WEBPACK_EXTERNAL_MODULE__781__;","module.exports = __WEBPACK_EXTERNAL_MODULE__531__;","module.exports = __WEBPACK_EXTERNAL_MODULE__7__;","module.exports = __WEBPACK_EXTERNAL_MODULE__241__;","module.exports = __WEBPACK_EXTERNAL_MODULE__959__;","module.exports = __WEBPACK_EXTERNAL_MODULE__269__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import React, { ChangeEvent, PureComponent } from 'react';\nimport { LegacyForms, DataSourceHttpSettings, InlineField, InlineSwitch } from '@grafana/ui';\nimport { DataSourcePluginOptionsEditorProps, DataSourceJsonData, DataSourceSettings } from '@grafana/data';\nimport { PIWebAPIDataSourceJsonData } from '../types';\n\nconst { FormField } = LegacyForms;\n\ninterface Props extends DataSourcePluginOptionsEditorProps {}\n\nconst coerceOptions = (\n options: DataSourceSettings\n): DataSourceSettings => {\n return {\n ...options,\n jsonData: {\n ...options.jsonData,\n url: options.url,\n },\n };\n};\n\ninterface State {}\n\nexport class PIWebAPIConfigEditor extends PureComponent {\n onPIServerChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n piserver: event.target.value,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onAFServerChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n afserver: event.target.value,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onAFDatabaseChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n afdatabase: event.target.value,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onHttpOptionsChange = (options: DataSourceSettings) => {\n const { onOptionsChange } = this.props;\n onOptionsChange(coerceOptions(options));\n };\n\n onPiPointChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n piserver: event.target.checked ? options.jsonData.piserver : '',\n pipoint: event.target.checked,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onNewFormatChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n newFormat: event.target.checked,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onUseUnitChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n useUnit: event.target.checked,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onUseExperimentalChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n useExperimental : event.target.checked,\n useStreaming : event.target.checked ? options.jsonData.useStreaming : false,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onUseStreamingChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n useStreaming: event.target.checked,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n render() {\n const { options: originalOptions } = this.props;\n const options = coerceOptions(originalOptions);\n\n return (\n
\n \n\n

Custom Configuration

\n\n
\n
\n \n \n \n
\n
\n \n \n \n
\n
\n \n \n \n
\n
\n \n \n \n
\n {options.jsonData.useExperimental && (\n
\n \n \n \n
\n )}\n
\n\n

PI/AF Connection Details

\n\n
\n {options.jsonData.pipoint && (\n
\n \n
\n )}\n
\n \n
\n
\n \n
\n
\n
\n );\n }\n}\n","import React, { InputHTMLAttributes, FunctionComponent } from 'react';\nimport { InlineFormLabel } from '@grafana/ui';\n\nexport interface Props extends InputHTMLAttributes {\n label: string;\n tooltip?: string;\n labelWidth?: number;\n children?: React.ReactNode;\n queryEditor?: JSX.Element;\n}\n\nexport const QueryField: FunctionComponent> = ({ label, labelWidth = 12, tooltip, children }) => (\n <>\n \n {label}\n \n {children}\n \n);\n\nexport const QueryRowTerminator = () => {\n return (\n
\n
\n
\n );\n};\n\nexport const QueryInlineField = ({ ...props }) => {\n return (\n \n \n \n );\n};\n\nexport const QueryEditorRow = (props: Partial) => {\n return (\n
\n {props.children}\n \n
\n );\n};\n\nexport const QueryRawInlineField = ({ ...props }) => {\n return (\n \n \n \n );\n};\n\nexport const QueryRawEditorRow = (props: Partial) => {\n return <>{props.children};\n};\n","import { DataQuery } from '@grafana/schema';\nimport { DataSourceJsonData, SelectableValue } from '@grafana/data';\n\nexport interface PiwebapiElementPath {\n path: string;\n variable: string;\n}\n\nexport interface PiwebapiInternalRsp {\n data: PiwebapiRsp;\n status: number;\n url: string;\n}\n\nexport interface PiwebapiRsp {\n Name?: string;\n InstanceType?: string;\n Items?: PiwebapiRsp[];\n WebId?: string;\n HasChildren?: boolean;\n Type?: string;\n DefaultUnitsName?: string;\n Description?: string;\n Path?: string;\n}\n\nexport interface PiDataServer {\n name: string | undefined;\n webid: string | undefined;\n}\n\nexport interface PIWebAPISelectableValue {\n webId?: string;\n value?: string;\n type?: string;\n expandable?: boolean;\n}\n\nexport interface PIWebAPIAnnotationsQuery extends DataQuery {\n target: string;\n}\n\nexport interface PIWebAPIQuery extends DataQuery {\n target?: string;\n elementPath?: string;\n attributes?: Array>;\n segments?: any[];\n isPiPoint?: boolean;\n hideError?: boolean;\n isAnnotation?: boolean;\n webid?: string;\n display?: any;\n interpolate?: any;\n recordedValues?: any;\n digitalStates?: any;\n enableStreaming: any;\n useLastValue?: any;\n useUnit?: any;\n regex?: any;\n summary?: {\n nodata?: string,\n types?: any[],\n basis?: string,\n interval?: string\n };\n expression?: string;\n rawQuery?: boolean;\n query?: string;\n // annotations items\n database?: PiwebapiRsp;\n template?: PiwebapiRsp;\n showEndTime?: boolean;\n attribute?: any;\n nameFilter?: string;\n categoryName?: string;\n}\n\nexport const defaultQuery: Partial = {\n target: ';',\n attributes: [],\n segments: [],\n regex: { enable: false },\n summary: { types: [], basis: 'EventWeighted', interval: '', nodata: 'Null' },\n expression: '',\n interpolate: { enable: false },\n useLastValue: { enable: false },\n recordedValues: { enable: false, boundaryType: 'Inside' },\n digitalStates: { enable: false },\n enableStreaming: { enable: false },\n useUnit: { enable: false },\n isPiPoint: false,\n};\n\n/**\n * These are options configured for each DataSource instance\n */\nexport interface PIWebAPIDataSourceJsonData extends DataSourceJsonData {\n url?: string;\n access?: string;\n piserver?: string;\n afserver?: string;\n afdatabase?: string;\n pipoint?: boolean;\n newFormat?: boolean;\n useUnit?: boolean;\n useExperimental?: boolean;\n useStreaming?: boolean;\n}\n\n/**\n * Value that is used in the backend, but never sent over HTTP to the frontend\n */\nexport interface PIWebAPISecureJsonData {\n apiKey?: string;\n}\n","import React, { useEffect, useState } from 'react';\nimport { Button, ConfirmModal } from '@grafana/ui';\n\ntype Props = {\n isRaw: boolean;\n onChange: (newIsRaw: boolean) => void;\n};\n\nexport const QueryEditorModeSwitcher = ({ isRaw, onChange }: Props): JSX.Element => {\n const [isModalOpen, setModalOpen] = useState(false);\n\n useEffect(() => {\n // if the isRaw changes, we hide the modal\n setModalOpen(false);\n }, [isRaw]);\n\n if (isRaw) {\n return (\n <>\n {\n // we show the are-you-sure modal\n setModalOpen(true);\n }}\n >\n {\n onChange(false);\n }}\n onDismiss={() => {\n setModalOpen(false);\n }}\n />\n \n );\n } else {\n return (\n {\n onChange(true);\n }}\n >\n );\n }\n};\n","import { each, map } from 'lodash';\r\n\r\nimport {\r\n AnnotationQuery,\r\n DataFrame,\r\n TableData,\r\n MetricFindValue,\r\n Field,\r\n toDataFrame,\r\n} from '@grafana/data';\r\n\r\nimport { PiwebapiElementPath, PiwebapiRsp, PIWebAPIQuery } from 'types';\r\n\r\nexport function parseRawQuery(tr: string): any {\r\n const splitAttributes = tr.split(';');\r\n const splitElements = splitAttributes[0].split('\\\\');\r\n\r\n // remove element hierarchy from attribute collection\r\n splitAttributes.splice(0, 1);\r\n\r\n let attributes: any[] = [];\r\n if (splitElements.length > 1 || (splitElements.length === 1 && splitElements[0] !== '')) {\r\n const elementPath: string = splitElements.join('\\\\');\r\n each(splitAttributes, function (item, index) {\r\n if (item !== '') {\r\n attributes.push({\r\n label: item,\r\n value: {\r\n value: item,\r\n expandable: false,\r\n },\r\n });\r\n }\r\n });\r\n\r\n return { attributes, elementPath };\r\n }\r\n\r\n return { attributes, elementPath: null };\r\n}\r\n\r\nexport function lowerCaseFirstLetter(string: string): string {\r\n return string.charAt(0).toLocaleLowerCase() + string.slice(1);\r\n}\r\n\r\n/**\r\n * Builds the Grafana metric segment for use on the query user interface.\r\n *\r\n * @param {any} response - response from PI Web API.\r\n * @returns - Grafana metric segment.\r\n *\r\n * @memberOf PiWebApiDatasource\r\n */\r\nexport function metricQueryTransform(response: PiwebapiRsp[]): MetricFindValue[] {\r\n return map(response, (item) => {\r\n return {\r\n text: item.Name,\r\n expandable:\r\n item.HasChildren === undefined || item.HasChildren === true || (item.Path ?? '').split('\\\\').length <= 3,\r\n HasChildren: item.HasChildren,\r\n Items: item.Items ?? [],\r\n Path: item.Path,\r\n WebId: item.WebId,\r\n } as MetricFindValue;\r\n });\r\n}\r\n\r\n/**\r\n * Check if all items are selected.\r\n *\r\n * @param {any} current the current variable selection\r\n * @return {boolean} true if all value is selected, false otherwise\r\n */\r\nexport function isAllSelected(current: any): boolean {\r\n if (!current) {\r\n return false;\r\n }\r\n if (Array.isArray(current.text)) {\r\n return current.text.indexOf('All') >= 0;\r\n }\r\n return current.text === 'All';\r\n}\r\n\r\nexport function processAnnotationQuery(annon: AnnotationQuery,data: DataFrame[]): DataFrame[] {\r\n let processedFrames: DataFrame[] = [];\r\n \r\n data.forEach((d: DataFrame) => {\r\n d.fields.forEach((f: Field) => {\r\n\r\n // check if the label has been set, if it hasn't been set then the eventframe annotation is not valid. \r\n if (!f.labels) { \r\n return \r\n }\r\n\r\n if (!('eventframe' in f.labels)) {\r\n return;\r\n }\r\n\r\n let attribute = 'attribute' in f.labels\r\n\r\n // Check whether f.values is an array or not to allow for each.\r\n // Check whether f.values is an array or not to allow for each.\r\n if (Array.isArray(f.values)) {\r\n f.values.forEach((value: any) => {\r\n\r\n if (attribute) {\r\n let annotation = value['1'].Content\r\n let valueData: any[] = []\r\n for (let i = 2; i in value; i++) {\r\n valueData.push(value[i].Content.Items)\r\n }\r\n\r\n const processedFrame = convertToTableData(annotation.Items!, valueData).map((r) => {\r\n return toDataFrame(r)});\r\n processedFrames = processedFrames.concat(processedFrame);\r\n } else {\r\n let annotation = value['1'].Content\r\n const processedFrame = convertToTableData(annotation.Items!).map((r) => {\r\n return toDataFrame(r)});\r\n processedFrames = processedFrames.concat(processedFrame);\r\n }\r\n });\r\n } \r\n });\r\n });\r\n return processedFrames;\r\n}\r\n\r\nexport function convertToTableData(items: any[], valueData?: any[]): TableData[] {\r\n const response: TableData[] = items.map((item: any, index: number) => {\r\n const columns = [{ text: 'StartTime' }, { text: 'EndTime' }];\r\n const rows = [item.StartTime, item.EndTime];\r\n if (valueData) {\r\n for (let attributeIndex = 0; attributeIndex < valueData.length; attributeIndex++) {\r\n let attributeData = valueData[attributeIndex]\r\n let eventframeAributeData = attributeData[index].Content.Items\r\n eventframeAributeData.forEach((attribute: any) => {\r\n columns.push({ text: attribute.Name });\r\n rows.push(String(attribute.Value.Value ? attribute.Value.Value.Name || attribute.Value.Value.Value || attribute.Value.Value : ''));\r\n });\r\n }\r\n }\r\n\r\n return {\r\n name: item.Name,\r\n columns,\r\n rows: [rows],\r\n };\r\n });\r\n return response;\r\n}\r\n\r\n/**\r\n * Resolve PIWebAPI response 'value' data to value - timestamp pairs.\r\n *\r\n * @param {any} item - 'Item' object from PIWebAPI\r\n * @param {any} noDataReplacementMode - String state of how to replace 'No Data'\r\n * @param {any} grafanaDataPoint - Single Grafana value pair (value, timestamp).\r\n * @returns grafanaDataPoint - Single Grafana value pair (value, timestamp).\r\n * @returns perviousValue - {any} Grafana value (value only).\r\n *\r\n */\r\nexport function noDataReplace(\r\n item: any,\r\n noDataReplacementMode: any,\r\n grafanaDataPoint: any[]\r\n): {\r\n grafanaDataPoint: any[];\r\n previousValue: any;\r\n drop: boolean;\r\n} {\r\n let previousValue = null;\r\n let drop = false;\r\n if (!item.Good || item.Value === 'No Data' || (item.Value?.Name && item.Value?.Name === 'No Data')) {\r\n if (noDataReplacementMode === 'Drop') {\r\n drop = true;\r\n } else if (noDataReplacementMode === '0') {\r\n grafanaDataPoint[0] = 0;\r\n } else if (noDataReplacementMode === 'Keep') {\r\n // Do nothing keep\r\n } else if (noDataReplacementMode === 'Null') {\r\n grafanaDataPoint[0] = null;\r\n } else if (noDataReplacementMode === 'Previous' && previousValue !== null) {\r\n grafanaDataPoint[0] = previousValue;\r\n }\r\n } else {\r\n previousValue = item.Value;\r\n }\r\n return { grafanaDataPoint, previousValue, drop };\r\n}\r\n\r\n/**\r\n * Check if the value is a number.\r\n *\r\n * @param {any} number the value to check\r\n * @returns {boolean} true if the value is a number, false otherwise\r\n */\r\nexport function checkNumber(number: any): boolean {\r\n return typeof number === 'number' && !Number.isNaN(number) && Number.isFinite(number);\r\n}\r\n\r\n/**\r\n * Returns the last item of the element path.\r\n *\r\n * @param {string} path element path\r\n * @returns {string} last item of the element path\r\n */\r\nexport function getLastPath(path: string): string {\r\n let splitPath = path.split('|');\r\n if (splitPath.length === 0) {\r\n return '';\r\n }\r\n splitPath = splitPath[0].split('\\\\');\r\n return splitPath.length === 0 ? '' : splitPath.pop() ?? '';\r\n}\r\n\r\n/**\r\n * Returns the last item of the element path plus variable.\r\n *\r\n * @param {PiwebapiElementPath[]} elementPathArray array of element paths\r\n * @param {string} path element path\r\n * @returns {string} last item of the element path\r\n */\r\nexport function getPath(elementPathArray: PiwebapiElementPath[], path: string): string {\r\n if (!path || elementPathArray.length === 0) {\r\n return '';\r\n }\r\n const splitStr = getLastPath(path);\r\n const foundElement = elementPathArray.find((e) => path.indexOf(e.path) >= 0)?.variable;\r\n return foundElement ? foundElement + '|' + splitStr : splitStr;\r\n}\r\n\r\n/**\r\n * Replace calculation dot in expression with PI point name.\r\n *\r\n * @param {boolean} replace - is pi point and calculation.\r\n * @param {PiwebapiRsp} webid - Pi web api response object.\r\n * @param {string} url - original url.\r\n * @returns Modified url\r\n */\r\nexport function getFinalUrl(replace: boolean, webid: PiwebapiRsp, url: string) {\r\n const newUrl = replace ? url.replace(/'\\.'/g, `'${webid.Name}'`) : url;\r\n return newUrl;\r\n}\r\n","import { each, filter, forOwn, join, reduce, map, slice, remove, defaults } from 'lodash';\n\nimport React, { PureComponent, ChangeEvent } from 'react';\nimport { Icon, InlineField, InlineFieldRow, InlineSwitch, Input, SegmentAsync, Segment } from '@grafana/ui';\nimport { QueryEditorProps, SelectableValue, TypedVariableModel } from '@grafana/data';\n\nimport { PiWebAPIDatasource } from '../datasource';\nimport { QueryInlineField, QueryRawInlineField, QueryRowTerminator } from '../components/Forms';\nimport { PIWebAPISelectableValue, PIWebAPIDataSourceJsonData, PIWebAPIQuery, defaultQuery } from '../types';\nimport { QueryEditorModeSwitcher } from 'components/QueryEditorModeSwitcher';\nimport { parseRawQuery } from 'helper';\n\nconst LABEL_WIDTH = 24;\nconst LABEL_SWITCH_WIDTH = 49.067 / 8.0;\nconst MIN_ELEM_INPUT_WIDTH = 200;\nconst MIN_ATTR_INPUT_WIDTH = 250;\n\ninterface State {\n isPiPoint: boolean;\n hideError: boolean;\n segments: Array>;\n attributes: Array>;\n summaries: Array>;\n attributeSegment: SelectableValue;\n summarySegment: SelectableValue;\n calculationBasisSegment: SelectableValue;\n noDataReplacementSegment: SelectableValue;\n}\n\ntype Props = QueryEditorProps;\n\nconst REMOVE_LABEL = '-REMOVE-';\n\nconst CustomLabelComponent = (props: any) => {\n if (props.value) {\n return (\n
\n {props.label ?? '--no label--'}\n
\n );\n }\n return (\n \n \n \n );\n};\n\nexport class PIWebAPIQueryEditor extends PureComponent {\n error: any;\n piServer: any[] = [];\n availableAttributes: any = {};\n summaryTypes: string[];\n calculationBasis: string[];\n recordedBoundaryTypes: string [];\n noDataReplacement: string[];\n state: State = {\n isPiPoint: false,\n hideError: false,\n segments: [],\n attributes: [],\n summaries: [],\n attributeSegment: {},\n summarySegment: {},\n calculationBasisSegment: {},\n noDataReplacementSegment: {},\n };\n\n constructor(props: any) {\n super(props);\n this.onSegmentChange = this.onSegmentChange.bind(this);\n this.calcBasisValueChanged = this.calcBasisValueChanged.bind(this);\n this.recordedBoundaryTypeValueChanged = this.recordedBoundaryTypeValueChanged.bind(this);\n this.calcNoDataValueChanged = this.calcNoDataValueChanged.bind(this);\n this.onSummaryAction = this.onSummaryAction.bind(this);\n this.onSummaryValueChanged = this.onSummaryValueChanged.bind(this);\n this.onAttributeAction = this.onAttributeAction.bind(this);\n this.onAttributeChange = this.onAttributeChange.bind(this);\n\n this.summaryTypes = [\n // 'None', // A summary type is not specified.\n 'Total', // A totalization over the time range.\n 'Average', // The average value over the time range.\n 'Minimum', // The minimum value over the time range.\n 'Maximum', // The maximum value over the time range.\n 'Range', // The range value over the time range (minimum-maximum).\n 'StdDev', // The standard deviation over the time range.\n 'PopulationStdDev', // The population standard deviation over the time range.\n 'Count', // The sum of event count over the time range when calculation basis is event weighted. The sum of event time duration over the time range when calculation basis is time weighted.\n 'PercentGood', // Percent of data with good value during the calculation period. For time weighted calculations, the percentage is based on time. For event weighted calculations, the percent is based on event count.\n 'All', // A convenience for requesting all available summary calculations.\n 'AllForNonNumeric', // A convenience for requesting all available summary calculations for non-numeric data.\n ];\n\n this.calculationBasis = [\n 'TimeWeighted', // Weight the values in the calculation by the time over which they apply. Interpolation is based on whether the attribute is stepped. Interpolated events are generated at the boundaries if necessary.\n 'EventWeighted', // Evaluate values with equal weighting for each event. No interpolation is done. There must be at least one event within the time range to perform a successful calculation. Two events are required for standard deviation. In handling events at the boundary of the calculation, the AFSDK uses following rules:\n 'TimeWeightedContinuous', // Apply weighting as in TimeWeighted, but do all interpolation between values as if they represent continuous data, (standard interpolation) regardless of whether the attribute is stepped.\n 'TimeWeightedDiscrete', // Apply weighting as in TimeWeighted but interpolation between values is performed as if they represent discrete, unrelated values (stair step plot) regardless of the attribute is stepped.\n 'EventWeightedExcludeMostRecentEvent', // The calculation behaves the same as _EventWeighted_, except in the handling of events at the boundary of summary intervals in a multiple intervals calculation. Use this option to prevent events at the intervals boundary from being double count at both intervals. With this option, events at the end time (most recent time) of an interval is not used in that interval.\n 'EventWeightedExcludeEarliestEvent', // Similar to the option _EventWeightedExcludeMostRecentEvent_. Events at the start time(earliest time) of an interval is not used in that interval.\n 'EventWeightedIncludeBothEnds', // Events at both ends of the interval boundaries are included in the event weighted calculation.\n ];\n\n this.recordedBoundaryTypes = [\n 'Inside', // Default. Specifies to return the recorded values on the inside of the requested time range as the first and last values. \n 'Outside', // Specifies to return the recorded values on the outside of the requested time range as the first and last values.\n 'Interpolated', //Specifies to create an interpolated value at the end points of the requested time range if a recorded value does not exist at that time.\n ]\n\n this.noDataReplacement = [\n 'Null', // replace with nulls\n 'Drop', // drop items\n 'Previous', // use previous value if available\n '0', // replace with 0\n 'Keep', // Keep value\n ];\n }\n\n // is selected segment empty\n isValueEmpty(value: PIWebAPISelectableValue | undefined) {\n return !value || !value.value || !value.value.length || value.value === REMOVE_LABEL;\n }\n\n segmentChangeValue = (segments: Array>) => {\n const query = this.props.query;\n this.setState({ segments }, () => this.onChange({ ...query, segments }));\n };\n\n attributeChangeValue = (attributes: Array>): Promise => {\n const query = this.props.query;\n return new Promise((resolve) => this.setState({ attributes }, () => {\n this.onChange({ ...query, attributes })\n resolve();\n }));\n };\n\n // summary calculation basis change event\n calcBasisValueChanged(segment: SelectableValue) {\n const metricsQuery = this.props.query as PIWebAPIQuery;\n const summary = metricsQuery.summary;\n if (summary) {\n summary.basis = segment.value?.value;\n }\n this.onChange({ ...metricsQuery, summary });\n }\n // get summary calculation basis user interface segments\n getCalcBasisSegments() {\n const segments = map(this.calculationBasis, (item: string) => {\n let selectableValue: SelectableValue = {\n label: item,\n value: {\n value: item,\n expandable: true,\n },\n };\n return selectableValue;\n });\n return segments;\n }\n\n // recorded boundary type change event\n recordedBoundaryTypeValueChanged(segment: SelectableValue) {\n const metricsQuery = this.props.query as PIWebAPIQuery;\n const recordedValues = metricsQuery.recordedValues;\n if (recordedValues) {\n recordedValues.boundaryType = segment.value?.value;\n }\n this.onChange({ ...metricsQuery, recordedValues });\n }\n // get recorded boundary type user interface segments\n getRecordedBoundaryTypeSegments() {\n const segments = map(this.recordedBoundaryTypes, (item: string) => {\n let selectableValue: SelectableValue = {\n label: item,\n value: {\n value: item,\n expandable: true,\n },\n };\n return selectableValue;\n });\n return segments;\n }\n\n // no data change event\n calcNoDataValueChanged(segment: SelectableValue) {\n const metricsQuery = this.props.query as PIWebAPIQuery;\n const summary = metricsQuery.summary;\n if (summary) {\n summary.nodata = segment.value?.value;\n }\n this.onChange({ ...metricsQuery, summary });\n }\n // get no data user interface segments\n getNoDataSegments() {\n const segments = map(this.noDataReplacement, (item: string) => {\n let selectableValue: SelectableValue = {\n label: item,\n value: {\n value: item,\n expandable: true,\n },\n };\n return selectableValue;\n });\n return segments;\n }\n\n // summary query change event\n onSummaryValueChanged(item: SelectableValue, index: number) {\n const summaries = this.state.summaries.slice(0) as Array>;\n summaries[index] = item;\n if (this.isValueEmpty(item.value)) {\n summaries.splice(index, 1);\n }\n this.setState({ summaries }, this.stateCallback);\n }\n // get the list of summaries available\n getSummarySegments() {\n const summaryTypes = filter(this.summaryTypes, (type) => {\n return this.state.summaries.map((s) => s.value?.value).indexOf(type) === -1;\n });\n\n const segments = map(summaryTypes, (item: string) => {\n let selectableValue: SelectableValue = {\n label: item,\n value: {\n value: item,\n expandable: true,\n },\n };\n return selectableValue;\n });\n\n segments.unshift({\n label: REMOVE_LABEL,\n value: {\n value: REMOVE_LABEL,\n },\n });\n\n return segments;\n }\n\n // remove a summary from the user interface and the query\n removeSummary(part: SelectableValue) {\n const summaries = filter(this.state.summaries, (item: SelectableValue) => {\n return item !== part;\n });\n this.setState({ summaries });\n }\n // add a new summary to the query\n onSummaryAction(item: SelectableValue) {\n const summaries = this.state.summaries.slice(0) as Array>;\n // if value is not empty, add new attribute segment\n if (!this.isValueEmpty(item.value)) {\n let selectableValue: SelectableValue = {\n label: item.label,\n value: {\n value: item.value?.value,\n expandable: true,\n },\n };\n summaries.push(selectableValue);\n }\n this.setState({ summarySegment: {}, summaries }, this.stateCallback);\n }\n\n // remove an attribute from the query\n removeAttribute(part: SelectableValue) {\n const attributes = filter(this.state.attributes, (item: SelectableValue) => {\n return item !== part;\n });\n this.attributeChangeValue(attributes);\n }\n // add an attribute to the query\n onAttributeAction(item: SelectableValue) {\n const { query } = this.props;\n const attributes = this.state.attributes.slice(0);\n // partial variable\n if (item.value !== null && typeof item.value !== 'object' && !Array.isArray(item.value)) {\n const value = String(item.value! as string);\n item.value = {\n type: value.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: value,\n }\n }\n\n // if value is not empty, add new attribute segment\n if (!this.isValueEmpty(item.value)) {\n let selectableValue: SelectableValue = {\n label: item.label,\n value: {\n type: item.value?.value && item.value?.value.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: item.value?.value,\n expandable: !query.isPiPoint,\n },\n };\n attributes.push(selectableValue);\n }\n this.attributeChangeValue(attributes);\n }\n\n // pi point change event\n onPiPointChange = (item: SelectableValue, index: number) => {\n let attributes = this.state.attributes.slice(0);\n\n if (item.label === REMOVE_LABEL) {\n remove(attributes, (_, n) => n === index);\n } else {\n // set current value\n attributes[index] = item;\n }\n\n this.checkPiPointSegments(item, attributes);\n };\n // attribute change event\n onAttributeChange = (item: SelectableValue, index: number) => {\n let attributes = this.state.attributes.slice(0);\n\n // ignore if no change\n if (attributes[index].label === item.value?.value) {\n return;\n }\n\n // set current value\n attributes[index] = item;\n\n this.checkAttributeSegments(attributes, this.state.segments);\n };\n // segment change\n onSegmentChange = (item: SelectableValue, index: number) => {\n const { query } = this.props;\n let segments = this.state.segments.slice(0);\n\n // partial variable\n if (item.value !== null && typeof item.value !== 'object' && !Array.isArray(item.value)) {\n const value = String(item.value! as string);\n item.value = {\n type: value.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: value,\n }\n }\n\n // ignore if no change\n if (segments[index].label === item.value?.value) {\n return;\n }\n\n // reset attributes list\n this.setState({ attributes: [] }, () => {\n if (item.label === REMOVE_LABEL) {\n segments = slice(segments, 0, index);\n this.checkAttributeSegments([], segments).then(() => {\n if (segments.length === 0) {\n segments.push({\n label: '',\n });\n } else if (!!segments[segments.length - 1].value?.expandable) {\n segments.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n if (query.isPiPoint) {\n this.piServer = [];\n }\n this.segmentChangeValue(segments);\n });\n return;\n }\n\n // set current value\n segments[index] = item;\n\n // Accept only one PI server\n if (query.isPiPoint) {\n this.piServer.push(item);\n this.segmentChangeValue(segments);\n return;\n }\n\n // changed internal selection\n if (index < segments.length - 1) {\n segments = slice(segments, 0, index + 1);\n }\n this.checkAttributeSegments([], segments).then((): Promise>> => {\n // add new options\n if (item.value?.type === 'template') { // if it's a variable we need to check for new elements\\\n return this.getElementSegments(segments.length + 1, segments).then((elements) => {\n if (elements.length > 0) {\n segments[index].value!.expandable = true;\n segments.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n this.segmentChangeValue(segments);\n return segments;\n });\n } else if (!!item.value?.expandable) {\n segments.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n return new Promise((resolve) => {\n this.segmentChangeValue(segments);\n resolve(segments);\n });\n });\n });\n };\n\n // get a ui segment for the attributes\n getElementSegments = (\n index: number,\n currentSegment?: Array>\n ): Promise>> => {\n const { datasource, query, data } = this.props;\n const ctrl = this;\n const findQuery = query.isPiPoint\n ? { type: 'dataserver' }\n : {\n path: this.getSegmentPathUpTo(currentSegment ?? this.state.segments.slice(0), index),\n afServerWebId: this.state.segments.length > 0 && this.state.segments[0].value ? this.state.segments[0].value.webId : undefined,\n };\n\n if (!query.isPiPoint) {\n if (datasource.afserver?.name && index === 0) {\n return Promise.resolve([\n {\n label: datasource.afserver.name,\n value: {\n value: datasource.afserver.name,\n expandable: true,\n },\n },\n ]);\n }\n if (datasource.afserver?.name && datasource.afdatabase?.name && index === 1) {\n return Promise.resolve([\n {\n label: datasource.afdatabase.name,\n value: {\n value: datasource.afdatabase.name,\n expandable: true,\n },\n },\n ]);\n }\n }\n return datasource\n .metricFindQuery(findQuery, Object.assign(data?.request?.scopedVars ?? {}, { isPiPoint: query.isPiPoint }))\n .then((items: any[]) => {\n const altSegments = map(items, (item: any) => {\n let selectableValue: SelectableValue = {\n label: item.text,\n value: {\n webId: item.WebId,\n value: item.text,\n expandable: !query.isPiPoint && item.expandable,\n },\n };\n return selectableValue;\n });\n\n if (altSegments.length === 0) {\n return altSegments;\n }\n\n // add template variables\n const variables = datasource.templateSrv.getVariables();\n each(variables, (variable: TypedVariableModel) => {\n let selectableValue: SelectableValue = {\n label: '${' + variable.name + '}',\n value: {\n type: 'template',\n value: '${' + variable.name + '}',\n expandable: !query.isPiPoint,\n },\n };\n altSegments.unshift(selectableValue);\n });\n\n // add remove label\n altSegments.unshift({\n label: REMOVE_LABEL,\n value: {\n value: REMOVE_LABEL,\n },\n });\n\n return altSegments;\n })\n .catch((err: any) => {\n ctrl.error = err.message || 'Failed to issue metric query';\n return [];\n });\n };\n\n // get the list of attributes for the user interface - PI\n getAttributeSegmentsPI = (attributeText?: string): Promise>> => {\n const { datasource, query, data } = this.props;\n const ctrl = this;\n const findQuery = {\n path: '',\n webId: this.getSelectedPIServer(),\n pointName: (attributeText ?? '') + '*',\n type: 'pipoint',\n };\n let segments: Array> = [];\n return datasource\n .metricFindQuery(findQuery, Object.assign(data?.request?.scopedVars ?? {}, { isPiPoint: query.isPiPoint }))\n .then((items: any[]) => {\n segments = map(items, (item: any) => {\n let selectableValue: SelectableValue = {\n path: item.Path,\n label: item.text,\n value: {\n value: item.text,\n expandable: false,\n },\n };\n return selectableValue;\n });\n if (!!attributeText && attributeText.length > 0) {\n segments.unshift({\n label: attributeText,\n value: {\n value: attributeText,\n expandable: false,\n },\n });\n }\n // add template variables\n const variables = datasource.templateSrv.getVariables();\n each(variables, (variable: TypedVariableModel) => {\n let selectableValue: SelectableValue = {\n label: '${' + variable.name + '}',\n value: {\n type: 'template',\n value: '${' + variable.name + '}',\n expandable: !query.isPiPoint,\n },\n };\n segments.unshift(selectableValue);\n });\n\n // add remove label\n segments.unshift({\n label: REMOVE_LABEL,\n value: {\n value: REMOVE_LABEL,\n },\n });\n\n return segments;\n })\n .catch((err: any) => {\n ctrl.error = err.message || 'Failed to issue metric query';\n return segments;\n });\n };\n\n // get the list of attributes for the user interface - AF\n getAttributeSegmentsAF = (attributeText?: string): Array> => {\n const { datasource } = this.props;\n const ctrl = this;\n let segments: Array> = [];\n\n segments.push({\n label: REMOVE_LABEL,\n value: {\n value: REMOVE_LABEL,\n },\n });\n\n // add template variables\n const variables = datasource.templateSrv.getVariables();\n each(variables, (variable: TypedVariableModel) => {\n let selectableValue: SelectableValue = {\n label: '${' + variable.name + '}',\n value: {\n type: 'template',\n value: '${' + variable.name + '}',\n expandable: false,\n },\n };\n segments.push(selectableValue);\n });\n\n forOwn(ctrl.availableAttributes, (val: any, key: string) => {\n let selectableValue: SelectableValue = {\n label: key,\n value: {\n value: key,\n expandable: true,\n },\n };\n segments.push(selectableValue);\n });\n\n return segments;\n };\n\n // build data from target string\n buildFromTarget = (\n query: PIWebAPIQuery,\n segmentsArray: Array>,\n attributesArray: Array>\n ) => {\n const splitAttributes = query.target!.split(';');\n const splitElements = splitAttributes.length > 0 ? splitAttributes[0].split('\\\\') : [];\n\n if (splitElements.length > 1 || (splitElements.length === 1 && splitElements[0] !== '')) {\n // remove element hierarchy from attribute collection\n splitAttributes.splice(0, 1);\n\n each(splitElements, (item, _) => {\n segmentsArray.push({\n label: item,\n value: {\n type: item.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: item,\n expandable: true,\n },\n });\n });\n each(splitAttributes, (item, _) => {\n if (item !== '') {\n // set current value\n attributesArray.push({\n label: item,\n value: {\n type: item.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: item,\n expandable: false,\n },\n });\n }\n });\n return this.getElementSegments(splitElements.length + 1, segmentsArray).then((elements) => {\n if (elements.length > 0) {\n segmentsArray.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n return segmentsArray;\n });\n }\n return Promise.resolve(segmentsArray);\n };\n\n /**\n * Gets the segment information and parses it to a string.\n *\n * @param {any} index - Last index of segment to use.\n * @returns - AF Path or PI Point name.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n getSegmentPathUpTo(segments: Array>, index: number): string {\n const arr = segments.slice(0, index);\n\n return reduce(\n arr,\n (result: any, segment: SelectableValue) => {\n if (!segment.value) {\n return '';\n }\n if (!segment.value.value?.startsWith('-Select')) {\n return result ? result + '\\\\' + segment.value.value : segment.value.value;\n }\n return result;\n },\n ''\n );\n }\n\n /**\n * Get the current AF Element's child attributes. Validates when the element selection changes.\n *\n * @returns - Collection of attributes.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n checkAttributeSegments(\n attributes: Array>,\n segments: Array>\n ): Promise {\n const { datasource, data } = this.props;\n const ctrl = this;\n const findQuery = {\n path: this.getSegmentPathUpTo(segments.slice(0), segments.length),\n type: 'attributes',\n };\n return datasource\n .metricFindQuery(findQuery, Object.assign(data?.request?.scopedVars ?? {}, { isPiPoint: false }))\n .then((attributesResponse: any) => {\n const validAttributes: any = {};\n\n each(attributesResponse, (attribute: any) => {\n validAttributes[attribute.Path.substring(attribute.Path.indexOf('|') + 1)] = attribute.WebId;\n });\n\n const filteredAttributes = filter(attributes, (attrib: SelectableValue) => {\n const changedValue = datasource.templateSrv.replace(attrib.value?.value);\n return validAttributes[changedValue] !== undefined;\n });\n\n ctrl.availableAttributes = validAttributes;\n return this.attributeChangeValue(filteredAttributes);\n })\n .catch((err: any) => {\n ctrl.error = err.message || 'Failed to issue metric query';\n return this.attributeChangeValue(attributes);\n });\n }\n\n /**\n * Get PI points from server.\n *\n * @returns - Collection of attributes.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n checkPiPointSegments(\n attribute: SelectableValue,\n attributes: Array>\n ) {\n const { datasource, data } = this.props;\n const ctrl = this;\n const findQuery = {\n path: attribute.path,\n webId: ctrl.getSelectedPIServer(),\n pointName: attribute.label,\n type: 'pipoint',\n };\n return datasource\n .metricFindQuery(findQuery, Object.assign(data?.request?.scopedVars ?? {}, { isPiPoint: true }))\n .then(() => {\n return ctrl.attributeChangeValue(attributes);\n })\n .catch((err: any) => {\n ctrl.error = err.message || 'Failed to issue metric query';\n return ctrl.attributeChangeValue([]);\n });\n }\n\n /**\n * Gets the webid of the current selected pi data server.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n getSelectedPIServer() {\n let webID = '';\n\n this.piServer.forEach((s) => {\n const parts = this.props.query.target!.split(';');\n if (parts.length >= 2) {\n if (parts[0] === s.text) {\n webID = s.WebId;\n return;\n }\n }\n });\n return this.piServer.length > 0 ? this.piServer[0].value?.webId : webID;\n }\n\n /**\n * Queries PI Web API for child elements and attributes when the raw query text editor is changed.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n textEditorChanged() {\n const { query } = this.props;\n const splitAttributes = query.target!.split(';');\n const splitElements = splitAttributes.length > 0 ? splitAttributes[0].split('\\\\') : [];\n\n let segments: Array> = [];\n let attributes: Array> = [];\n\n if (splitElements.length > 1 || (splitElements.length === 1 && splitElements[0] !== '')) {\n // remove element hierarchy from attribute collection\n splitAttributes.splice(0, 1);\n\n each(splitElements, (item, _) => {\n segments.push({\n label: item,\n value: {\n type: item.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: item,\n expandable: true,\n },\n });\n });\n each(splitAttributes, function (item, index) {\n if (item !== '') {\n attributes.push({\n label: item,\n value: {\n type: item.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: item,\n expandable: false,\n },\n });\n }\n });\n this.getElementSegments(splitElements.length + 1, segments)\n .then((elements) => {\n if (elements.length > 0) {\n segments.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n })\n .then(() => {\n this.updateArray(segments, attributes, this.state.summaries, query.isPiPoint!, () => {\n this.onChange({\n ...query,\n query: undefined,\n rawQuery: false,\n attributes: this.state.attributes,\n segments: this.state.segments,\n });\n });\n });\n } else {\n segments = this.checkAfServer();\n this.updateArray(segments, this.state.attributes, this.state.summaries, query.isPiPoint!, () => {\n this.onChange({\n ...query,\n query: undefined,\n rawQuery: false,\n attributes: this.state.attributes,\n segments: this.state.segments,\n });\n });\n }\n }\n\n /**\n * Check if the AF server and database are configured in the datasoure config.\n *\n * @returns the segments array\n *\n * @memberOf PIWebAPIQueryEditor\n */\n checkAfServer = () => {\n const { datasource } = this.props;\n const segmentsArray = [];\n if (datasource.afserver?.name) {\n segmentsArray.push({\n label: datasource.afserver.name,\n value: {\n value: datasource.afserver.name,\n expandable: true,\n },\n });\n if (datasource.afdatabase?.name) {\n segmentsArray.push({\n label: datasource.afdatabase.name,\n value: {\n value: datasource.afdatabase.name,\n expandable: true,\n },\n });\n }\n segmentsArray.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n } else {\n segmentsArray.push({\n label: '',\n });\n }\n return segmentsArray;\n };\n\n /**\n * Update the internal state of the datasource.\n *\n * @param segmentsArray the segments array to update\n * @param attributesArray the AF attributes array to update\n * @param summariesArray the summaries array to update\n * @param isPiPoint the is PI point flag\n * @param cb optional callback function\n *\n * @memberOf PIWebAPIQueryEditor\n */\n updateArray = (\n segmentsArray: Array>,\n attributesArray: Array>,\n summariesArray: Array>,\n isPiPoint: boolean,\n cb?: (() => void) | undefined\n ) => {\n this.setState(\n {\n segments: segmentsArray,\n attributes: attributesArray,\n summaries: summariesArray,\n isPiPoint,\n },\n () => {\n if (!isPiPoint) {\n this.checkAttributeSegments(attributesArray, this.state.segments).then(() => {\n if (cb) {\n cb();\n }\n });\n }\n }\n );\n };\n\n // React action when component is initialized/updated\n scopedVarsDone = false;\n componentDidMount = () => {\n this.initialLoad(false);\n };\n\n componentDidUpdate = () => {\n const { query } = this.props;\n if (this.props.data?.state === 'Done' && !!this.props.data?.request?.scopedVars && !this.scopedVarsDone) {\n this.scopedVarsDone = true;\n this.initialLoad(!query.isPiPoint);\n }\n };\n\n initialLoad = (force: boolean) => {\n const { query } = this.props;\n const metricsQuery = defaults(query, defaultQuery) as PIWebAPIQuery;\n const { segments, attributes, summary, isPiPoint } = metricsQuery;\n\n let segmentsArray: Array> = force ? [] : segments?.slice(0) ?? [];\n let attributesArray: Array> = force ? [] : attributes?.slice(0) ?? [];\n let summariesArray = summary?.types ?? [];\n\n if (!isPiPoint && segmentsArray.length === 0) {\n if (query.target && query.target.length > 0 && query.target !== ';') {\n attributesArray = [];\n // Build query from target\n this.buildFromTarget(query, segmentsArray, attributesArray)\n .then((_segmentsArray) => {\n this.updateArray(_segmentsArray, attributesArray, summariesArray, false);\n })\n .catch((e) => console.error(e));\n return;\n } else {\n segmentsArray = this.checkAfServer();\n }\n } else if (isPiPoint && segmentsArray.length > 0) {\n this.piServer = segmentsArray;\n }\n this.updateArray(segmentsArray, attributesArray, summariesArray, !!isPiPoint, () => {\n this.onChange(query);\n });\n };\n\n onChange = (query: PIWebAPIQuery) => {\n const { onChange, onRunQuery } = this.props;\n\n if (query.rawQuery) {\n query.target = query.query ?? '';\n if (!!query.query) {\n const { attributes, elementPath } = parseRawQuery(query.target);\n query.attributes = attributes;\n query.elementPath = elementPath;\n }\n } else {\n query.elementPath = this.getSegmentPathUpTo(this.state.segments, this.state.segments.length);\n query.target =\n query.elementPath +\n ';' +\n join(\n query.attributes?.map((s) => s.value?.value),\n ';'\n );\n }\n const summary = query.summary;\n if (summary) {\n summary.types = this.state.summaries;\n }\n\n onChange({...query, summary});\n\n if (this.isValidQuery(query)) {\n onRunQuery();\n }\n };\n\n isValidQuery = (query: PIWebAPIQuery): boolean => {\n if (query.target && query.target.length > 0 && query.target !== \";\") {\n query.target = query.target.trim();\n const targetSplit = query.target.split(\";\", 2);\n return targetSplit.length === 2 && targetSplit[0].length > 0 && targetSplit[1].length > 0;\n }\n return false;\n }\n\n stateCallback = () => {\n const query = this.props.query as PIWebAPIQuery;\n this.onChange(query);\n };\n\n onIsPiPointChange = (event: React.SyntheticEvent) => {\n const { query: queryChange } = this.props;\n const isPiPoint = !queryChange.isPiPoint;\n this.setState(\n {\n segments: isPiPoint ? [{ label: '' }] : this.checkAfServer(),\n attributes: [],\n isPiPoint,\n },\n () => {\n this.onChange({\n ...queryChange,\n expression: '',\n attributes: this.state.attributes,\n segments: this.state.segments,\n isPiPoint,\n });\n }\n );\n };\n\n onHideErrorChange = (event: React.SyntheticEvent) => {\n const { query: queryChange } = this.props;\n const hideError = !queryChange.hideError;\n this.setState(\n {\n hideError,\n },\n () => {\n this.onChange({\n ...queryChange,\n hideError,\n });\n }\n );\n };\n\n render() {\n const { query: queryProps, onChange, onRunQuery } = this.props;\n const metricsQuery = defaults(queryProps, defaultQuery) as PIWebAPIQuery;\n const {\n useLastValue,\n useUnit,\n interpolate,\n query,\n rawQuery,\n digitalStates,\n enableStreaming,\n recordedValues,\n expression,\n isPiPoint,\n hideError,\n summary,\n display,\n regex,\n } = metricsQuery;\n\n return (\n <>\n {this.props.datasource.piPointConfig && (\n \n \n \n )}\n\n {!!rawQuery && (\n \n \n ) =>\n onChange({ ...metricsQuery, query: event.target.value })\n }\n placeholder=\"enter query\"\n />\n \n this.textEditorChanged()} />\n \n )}\n\n {!rawQuery && (\n <>\n
\n \n {this.state.segments.map((segment: SelectableValue, index: number) => {\n return (\n }\n onChange={(item) => this.onSegmentChange(item, index)}\n loadOptions={(query?: string | undefined) => {\n return this.getElementSegments(index);\n }}\n allowCustomValue\n inputMinWidth={MIN_ELEM_INPUT_WIDTH}\n />\n );\n })}\n \n {!isPiPoint && (\n {\n onChange({ ...metricsQuery, query: metricsQuery.target, rawQuery: value });\n }}\n />\n )}\n \n
\n\n \n {this.state.attributes.map((attribute: SelectableValue, index: number) => {\n if (isPiPoint) {\n return (\n }\n disabled={this.piServer.length === 0}\n onChange={(item) => this.onPiPointChange(item, index)}\n loadOptions={this.getAttributeSegmentsPI}\n reloadOptionsOnChange\n allowCustomValue\n inputMinWidth={MIN_ATTR_INPUT_WIDTH}\n />\n );\n }\n return (\n }\n disabled={this.state.segments.length <= 2}\n onChange={(item) => this.onAttributeChange(item, index)}\n options={this.getAttributeSegmentsAF()}\n allowCustomValue\n inputMinWidth={MIN_ATTR_INPUT_WIDTH}\n />\n );\n })}\n\n {isPiPoint && (\n \n }\n disabled={this.piServer.length === 0}\n onChange={this.onAttributeAction}\n loadOptions={this.getAttributeSegmentsPI}\n reloadOptionsOnChange\n allowCustomValue\n inputMinWidth={MIN_ATTR_INPUT_WIDTH}\n />\n )}\n {!isPiPoint && (\n \n }\n disabled={this.state.segments.length <= 2}\n onChange={this.onAttributeAction}\n options={this.getAttributeSegmentsAF()}\n allowCustomValue\n inputMinWidth={MIN_ATTR_INPUT_WIDTH}\n />\n )}\n \n \n )}\n\n \n \n ) =>\n onChange({ ...metricsQuery, expression: event.target.value })\n }\n placeholder=\"'.'*2\"\n />\n \n \n\n \n \n \n this.onChange({\n ...metricsQuery,\n useLastValue: { ...useLastValue, enable: !useLastValue.enable },\n })\n }\n />\n \n \n \n this.onChange({\n ...metricsQuery,\n digitalStates: { ...digitalStates, enable: !digitalStates.enable },\n })\n }\n />\n \n \n \n }\n onChange={this.calcNoDataValueChanged}\n options={this.getNoDataSegments()}\n allowCustomValue\n />\n \n \n \n \n {this.props.datasource.useUnitConfig && (\n \n \n this.onChange({\n ...metricsQuery,\n useUnit: { ...useUnit, enable: !useUnit.enable },\n })\n }\n />\n \n )}\n {this.props.datasource.useStreaming && (\n \n \n this.onChange({ ...metricsQuery, enableStreaming: { ...enableStreaming, enable: !enableStreaming.enable } })\n }\n />\n \n )}\n \n \n {!useLastValue.enable && !recordedValues.enable && (\n \n \n \n this.onChange({ ...metricsQuery, interpolate: { ...interpolate, enable: !interpolate.enable, interval: null } })\n }\n />\n \n \n ) =>\n onChange({ ...metricsQuery, interpolate: { ...interpolate, interval: event.target.value } })\n }\n placeholder=\"30s\"\n />\n \n \n )}\n\n {!useLastValue.enable && !interpolate.enable && (\n \n \n \n this.onChange({\n ...metricsQuery,\n recordedValues: { ...recordedValues, enable: !recordedValues.enable, maxNumber: null, boundaryType: 'Inside' },\n })\n }\n />\n \n \n ) =>\n onChange({\n ...metricsQuery,\n recordedValues: { ...recordedValues, maxNumber: parseInt(event.target.value, 10) },\n })\n }\n type=\"number\"\n placeholder=\"1000\"\n />\n \n \n \n }\n onChange={this.recordedBoundaryTypeValueChanged}\n options={this.getRecordedBoundaryTypeSegments()}\n allowCustomValue\n />\n \n \n )}\n\n {!useLastValue.enable && (\n \n \n ) =>\n onChange({ ...metricsQuery, summary: { ...summary, interval: event.target.value } })\n }\n placeholder=\"30s\"\n />\n \n \n \n }\n onChange={this.calcBasisValueChanged}\n options={this.getCalcBasisSegments()}\n allowCustomValue\n />\n \n \n \n {this.state.summaries.map((s: SelectableValue, index: number) => {\n return (\n }\n onChange={(item) => this.onSummaryValueChanged(item, index)}\n options={this.getSummarySegments()}\n allowCustomValue\n />\n );\n })}\n \n }\n onChange={this.onSummaryAction}\n options={this.getSummarySegments()}\n allowCustomValue\n />\n \n \n \n )}\n\n \n \n ) =>\n onChange({ ...metricsQuery, display: event.target.value })\n }\n placeholder=\"Display\"\n />\n \n \n {\n this.onChange({ ...metricsQuery, regex: { ...regex, enable: !regex.enable } });\n }}\n />\n \n \n ) =>\n onChange({ ...metricsQuery, regex: { ...regex, search: event.target.value } })\n }\n placeholder=\"(.*)\"\n />\n \n \n ) =>\n onChange({ ...metricsQuery, regex: { ...regex, replace: event.target.value } })\n }\n placeholder=\"$1\"\n />\n \n \n \n );\n }\n}\n","import React, { memo, useState } from 'react';\n\nimport { AnnotationQuery, QueryEditorProps, SelectableValue } from '@grafana/data';\nimport { AsyncSelect, InlineField, InlineFieldRow, InlineSwitch, Input } from '@grafana/ui';\n\nimport { PiWebAPIDatasource } from 'datasource';\nimport { PIWebAPIDataSourceJsonData, PIWebAPIQuery, PiwebapiRsp } from 'types';\n\nconst SMALL_LABEL_WIDTH = 20;\nconst LABEL_WIDTH = 30;\nconst MIN_INPUT_WIDTH = 50;\n\ntype PiWebAPIQueryEditorProps = QueryEditorProps;\n\ntype Props = PiWebAPIQueryEditorProps & {\n annotation?: AnnotationQuery;\n onAnnotationChange?: (annotation: AnnotationQuery) => void;\n};\n\nexport const PiWebAPIAnnotationsQueryEditor = memo(function PiWebAPIAnnotationQueryEditor(props: Props) {\n const { query, datasource, annotation, onChange, onRunQuery } = props;\n\n const [afWebId, setAfWebId] = useState('');\n const [database, setDatabase] = useState(annotation?.target?.database ?? {});\n\n // this should never happen, but we want to keep typescript happy\n if (annotation === undefined) {\n return null;\n }\n\n const getEventFrames = (): Promise>> => {\n return datasource.getEventFrameTemplates(database?.WebId!).then((templ: PiwebapiRsp[]) => {\n return templ.map((d) => ({ label: d.Name, value: d }));\n });\n };\n\n const getDatabases = (): Promise>> => {\n return datasource.getDatabases(afWebId).then((dbs: PiwebapiRsp[]) => {\n return dbs.map((d) => ({ label: d.Name, value: d }));\n });\n };\n\n const getValue = (key: string) => {\n const query: any = annotation.target as any;\n if (!query || !query[key]) {\n return;\n }\n return { label: query[key].Name, value: query[key] };\n };\n\n datasource.getAssetServer(datasource.afserver.name).then((result) => {\n setAfWebId(result.WebId!);\n });\n\n return (\n <>\n
\n \n \n {\n setDatabase(e.value);\n onChange({ ...query, database: e.value, template: undefined });\n }}\n defaultOptions\n />\n \n \n onChange({ ...query, template: e.value })}\n defaultOptions\n />\n \n \n onChange({ ...query, showEndTime: e.currentTarget.checked })}\n />\n \n \n \n \n onRunQuery()}\n onChange={(e) => onChange({ ...query, categoryName: e.currentTarget.value })}\n placeholder=\"Enter category name\"\n />\n \n \n onRunQuery()}\n onChange={(e) => onChange({ ...query, nameFilter: e.currentTarget.value })}\n placeholder=\"Enter name filter\"\n />\n \n \n \n \n \n onChange({\n ...query,\n regex: { ...query.regex, enable: e.currentTarget.checked },\n })\n }\n />\n \n \n onRunQuery()}\n onChange={(e) =>\n onChange({\n ...query,\n regex: { ...query.regex, search: e.currentTarget.value },\n })\n }\n placeholder=\"(.*)\"\n width={MIN_INPUT_WIDTH}\n />\n \n \n onRunQuery()}\n onChange={(e) =>\n onChange({\n ...query,\n regex: { ...query.regex, replace: e.currentTarget.value },\n })\n }\n placeholder=\"$1\"\n />\n \n \n \n \n \n onChange({\n ...query!,\n attribute: { ...query.attribute, enable: e.currentTarget.checked },\n })\n }\n />\n \n \n onRunQuery()}\n onChange={(e) =>\n onChange({\n ...query!,\n attribute: { ...query.attribute, name: e.currentTarget.value },\n })\n }\n placeholder=\"Enter name\"\n />\n \n \n
\n \n );\n});\n","import { filter, map } from 'lodash';\n\nimport { Observable, of } from 'rxjs';\n\nimport {\n DataSourceInstanceSettings,\n MetricFindValue,\n AnnotationQuery,\n ScopedVars,\n AnnotationEvent,\n DataFrame,\n DataQueryRequest,\n DataQueryResponse,\n} from '@grafana/data';\nimport { getTemplateSrv, TemplateSrv, DataSourceWithBackend } from '@grafana/runtime';\n\nimport { PIWebAPIQuery, PIWebAPIDataSourceJsonData, PiDataServer, PiwebapiRsp } from './types';\nimport { metricQueryTransform } from 'helper';\n\nimport { PiWebAPIAnnotationsQueryEditor } from 'query/AnnotationsQueryEditor';\n\nexport class PiWebAPIDatasource extends DataSourceWithBackend {\n piserver: PiDataServer;\n afserver: PiDataServer;\n afdatabase: PiDataServer;\n piPointConfig: boolean;\n newFormatConfig: boolean;\n useUnitConfig: boolean;\n useExperimental: boolean;\n useStreaming: boolean;\n\n constructor(\n instanceSettings: DataSourceInstanceSettings,\n readonly templateSrv: TemplateSrv = getTemplateSrv()\n ) {\n super(instanceSettings);\n\n this.piserver = { name: (instanceSettings.jsonData || {}).piserver, webid: undefined };\n this.afserver = { name: (instanceSettings.jsonData || {}).afserver, webid: undefined };\n this.afdatabase = { name: (instanceSettings.jsonData || {}).afdatabase, webid: undefined };\n this.piPointConfig = instanceSettings.jsonData.pipoint || false;\n this.newFormatConfig = instanceSettings.jsonData.newFormat || false;\n this.useUnitConfig = instanceSettings.jsonData.useUnit || false;\n this.useExperimental = instanceSettings.jsonData.useExperimental || false;\n this.useStreaming = instanceSettings.jsonData.useStreaming || false;\n\n this.annotations = {\n QueryEditor: PiWebAPIAnnotationsQueryEditor,\n prepareQuery(anno: AnnotationQuery): PIWebAPIQuery | undefined {\n if (anno.target) {\n anno.target.queryType = 'Annotation';\n anno.target.isAnnotation = true;\n }\n return anno.target;\n },\n processEvents: (\n anno: AnnotationQuery,\n data: DataFrame[]\n ): Observable => {\n return of(this.eventFrameToAnnotation(anno, data));\n },\n };\n\n Promise.all([\n this.getDataServer(this.piserver.name).then((result: PiwebapiRsp) => (this.piserver.webid = result.WebId)),\n this.getAssetServer(this.afserver.name).then((result: PiwebapiRsp) => (this.afserver.webid = result.WebId)),\n this.getDatabase(\n this.afserver.name && this.afdatabase.name ? this.afserver.name + '\\\\' + this.afdatabase.name : undefined\n ).then((result: PiwebapiRsp) => (this.afdatabase.webid = result.WebId)),\n ]);\n }\n\n /**\n * This method overrides the applyTemplateVariables() method from the DataSourceWithBackend class.\n * It is responsible for replacing the template variables in the query configuration prior\n * to sending the query to the backend. Templated variables are not able to be used for alerts\n * or public facing dashboards.\n *\n * @param {PIWebAPIQuery} query - The raw query configuration from the frontend as defined in the query editor.\n * @param {ScopedVars} scopedVars - The template variables that are defined in the query editor and dashboard.\n * @returns - PIWebAPIQuery.\n *\n * @memberOf PiWebApiDatasource\n */\n applyTemplateVariables(query: PIWebAPIQuery, scopedVars: ScopedVars) {\n return {\n ...query,\n target: query.target ? this.templateSrv.replace(query.target, scopedVars) : '',\n };\n }\n\n /**\n * This method makes the query to the backend.\n *\n * @param {DataQueryRequest} options\n *\n * @memberOf PiWebApiDatasource\n */\n query(options: DataQueryRequest): Observable {\n if (options.targets.length === 1 && !!options.targets[0].isAnnotation) {\n return super.query(options);\n }\n\n const query = this.buildQueryParameters(options);\n if (query.targets.length <= 0) {\n return of({ data: [] });\n }\n\n return super.query(query);\n }\n\n /**\n * This method does the discovery of the AF Hierarchy and populates the query user interface segments.\n *\n * @param {any} query - Parses the query configuration and builds a PI Web API query.\n * @returns - Segment information.\n *\n * @memberOf PiWebApiDatasource\n */\n metricFindQuery(query: any, queryOptions: any): Promise {\n const ds = this;\n const querydepth = ['servers', 'databases', 'databaseElements', 'elements'];\n if (typeof query === 'string') {\n query = JSON.parse(query as string);\n }\n if (queryOptions.isPiPoint) {\n query.path = this.templateSrv.replace(query.path, queryOptions);\n } else {\n if (query.path === '') {\n query.type = querydepth[0];\n } else {\n query.path = this.templateSrv.replace(query.path, queryOptions); // replace variables in the path\n query.path = query.path.split(';')[0]; // if the attribute is in the path, let's remote it\n if (query.type !== 'attributes') {\n query.type = querydepth[Math.max(0, Math.min(query.path.split('\\\\').length, querydepth.length - 1))];\n }\n }\n query.path = query.path.replace(/\\{([^\\\\])*\\}/gi, (r: string) => r.substring(1, r.length - 2).split(',')[0]);\n }\n\n query.filter = query.filter ?? '*';\n query.max = query.max ?? 10000;\n\n if (query.type === 'servers') {\n return ds.afserver?.name\n ? ds\n .getAssetServer(ds.afserver.name)\n .then((result: PiwebapiRsp) => [result])\n .then(metricQueryTransform)\n : ds.getAssetServers().then(metricQueryTransform);\n } else if (query.type === 'databases' && !!query.afServerWebId) {\n return ds.getDatabases(query.afServerWebId, {}).then(metricQueryTransform);\n } else if (query.type === 'databases') {\n return ds\n .getAssetServer(query.path)\n .then((server) => ds.getDatabases(server.WebId ?? '', {}))\n .then(metricQueryTransform);\n } else if (query.type === 'databaseElements') {\n return ds\n .getDatabase(query.path)\n .then((db) =>\n ds.getDatabaseElements(db.WebId ?? '', {\n selectedFields: 'Items.WebId%3BItems.Name%3BItems.Items%3BItems.Path%3BItems.HasChildren',\n })\n )\n .then(metricQueryTransform);\n } else if (query.type === 'elements') {\n return ds\n .getElement(query.path)\n .then((element) =>\n ds.getElements(element.WebId ?? '', {\n selectedFields:\n 'Items.Description%3BItems.WebId%3BItems.Name%3BItems.Items%3BItems.Path%3BItems.HasChildren',\n nameFilter: query.filter,\n })\n )\n .then(metricQueryTransform);\n } else if (query.type === 'attributes') {\n return ds\n .getElement(query.path)\n .then((element) =>\n ds.getAttributes(element.WebId ?? '', {\n searchFullHierarchy: 'true',\n selectedFields:\n 'Items.Type%3BItems.DefaultUnitsName%3BItems.Description%3BItems.WebId%3BItems.Name%3BItems.Path',\n nameFilter: query.filter,\n maxCount: query.max,\n })\n )\n .then(metricQueryTransform);\n } else if (query.type === 'dataserver') {\n return ds.getDataServers().then(metricQueryTransform);\n } else if (query.type === 'pipoint') {\n return ds.piPointSearch(query.webId, query.pointName).then(metricQueryTransform);\n }\n return Promise.reject('Bad type');\n }\n\n /** PRIVATE SECTION */\n\n /**\n * Builds the PIWebAPI query parameters.\n *\n * @param {any} options - Grafana query and panel options.\n * @returns - PIWebAPI query parameters.\n *\n * @memberOf PiWebApiDatasource\n */\n private buildQueryParameters(options: DataQueryRequest) {\n options.targets = filter(options.targets, (target) => {\n if (!target || !target.target || target.attributes?.length === 0 || target.target === ';' || !!target.hide) {\n return false;\n }\n return !target.target.startsWith('Select AF');\n });\n\n if (options.maxDataPoints) {\n options.maxDataPoints = options.maxDataPoints > 30000 ? 30000 : options.maxDataPoints;\n }\n options.targets = map(options.targets, (target) => {\n const tar = {\n enableStreaming: target.enableStreaming,\n target: this.templateSrv.replace(target.target, options.scopedVars),\n elementPath: this.templateSrv.replace(target.elementPath, options.scopedVars),\n attributes: map(target.attributes, (att) => {\n if (att.value) {\n att.value.value = this.templateSrv.replace(att.value.value, options.scopedVars);\n }\n return att;\n }),\n segments: map(target.segments, (att) => {\n if (att.value) {\n att.value.value = this.templateSrv.replace(att.value.value, options.scopedVars);\n }\n return att;\n }),\n isAnnotation: !!target.isAnnotation,\n display: !!target.display ? this.templateSrv.replace(target.display, options.scopedVars) : undefined,\n refId: target.refId,\n hide: target.hide,\n interpolate: !!target.interpolate\n ? {\n ...target.interpolate,\n interval: this.templateSrv.replace(target.interpolate.interval, options.scopedVars),\n }\n : { enable: false },\n useLastValue: target.useLastValue || { enable: false },\n useUnit: target.useUnit || { enable: false },\n recordedValues: target.recordedValues || { enable: false },\n digitalStates: target.digitalStates || { enable: false },\n webid: target.webid ?? '',\n regex: target.regex || { enable: false },\n expression: target.expression || '',\n summary: target.summary || { types: [] },\n startTime: options.range.from,\n endTime: options.range.to,\n isPiPoint: !!target.isPiPoint,\n hideError: !!target.hideError,\n scopedVars: options.scopedVars,\n };\n\n if (tar.expression) {\n tar.expression = this.templateSrv.replace(tar.expression, options.scopedVars);\n }\n\n if (tar.summary.types !== undefined) {\n tar.summary.types = filter(tar.summary.types, (item) => {\n return item !== undefined && item !== null && item !== '';\n });\n tar.summary.interval = !!tar.summary.interval\n ? this.templateSrv.replace(tar.summary.interval, options.scopedVars)\n : tar.summary.interval;\n }\n\n return tar;\n });\n\n return options;\n }\n\n /**\n * Localize the eventFrame dataFrame records to Grafana Annotations.\n * @param {any} annon - The annotation object.\n * @param {any} data - The dataframe recrords.\n * @returns - Grafana Annotation\n *\n * @memberOf PiWebApiDatasource\n */\n private eventFrameToAnnotation(annon: AnnotationQuery, data: DataFrame[]): AnnotationEvent[] {\n const annotationOptions = annon.target!;\n const events: AnnotationEvent[] = [];\n const currentLocale = Intl.DateTimeFormat().resolvedOptions().locale;\n\n data.forEach((d: DataFrame) => {\n let values = this.transformDataFrameToMap(d);\n for (let i = 0; i < values['time'].length; i++) {\n // replace Dataframe name using Regex\n let title = values['title'][i];\n if (annotationOptions.regex && annotationOptions.regex.enable) {\n title = title.replace(new RegExp(annotationOptions.regex.search), annotationOptions.regex.replace);\n }\n\n // test if timeEnd is negative and if so, set it to null\n if (values['timeEnd'][i] < 0) {\n values['timeEnd'][i] = null;\n }\n\n // format the text and localize the dates to browser locale\n let text = 'Tag: ' + title;\n if (annotationOptions.attribute && annotationOptions.attribute.enable) {\n text += values['attributeText'][i];\n }\n text += '
Start: ' + new Date(values['time'][i]).toLocaleString(currentLocale) + '
End: ';\n\n if (values['timeEnd'][i]) {\n text += new Date(values['timeEnd'][i]).toLocaleString(currentLocale);\n } else {\n text += 'Eventframe is open';\n }\n\n const event: AnnotationEvent = {\n time: values['time'][i],\n timeEnd: !!annotationOptions.showEndTime ? values['timeEnd'][i] : undefined,\n title: title,\n id: values['id'][i],\n text: text,\n tags: ['OSISoft PI'],\n };\n\n events.push(event);\n }\n });\n return events;\n }\n\n /**\n *\n */\n private transformDataFrameToMap(dataFrame: DataFrame): Record {\n const map: Record = {};\n\n dataFrame.fields.forEach((field) => {\n map[field.name] = field.values.toArray();\n });\n\n return map;\n }\n\n /**\n * Abstraction for calling the PI Web API REST endpoint\n *\n * @param {any} path - the path to append to the base server URL.\n * @returns - The full URL.\n *\n * @memberOf PiWebApiDatasource\n */\n private restGet(path: string): Promise {\n return this.getResource(`${path}`).then((response: any) => {\n return response as PiwebapiRsp;\n });\n }\n\n // Get a list of all data (PI) servers\n private getDataServers(): Promise {\n return this.restGet('/dataservers').then((response) => response.Items ?? []);\n }\n private getDataServer(name: string | undefined): Promise {\n if (!name) {\n return Promise.resolve({});\n }\n return this.restGet('/dataservers?name=' + name).then((response) => response);\n }\n // Get a list of all asset (AF) servers\n private getAssetServers(): Promise {\n return this.restGet('/assetservers').then((response) => response.Items ?? []);\n }\n getAssetServer(name: string | undefined): Promise {\n if (!name) {\n return Promise.resolve({});\n }\n return this.restGet('/assetservers?path=\\\\\\\\' + name).then((response) => response);\n }\n getDatabase(path: string | undefined): Promise {\n if (!path) {\n return Promise.resolve({});\n }\n return this.restGet('/assetdatabases?path=\\\\\\\\' + path).then((response) => response);\n }\n getDatabases(serverId: string, options?: any): Promise {\n if (!serverId) {\n return Promise.resolve([]);\n }\n return this.restGet('/assetservers/' + serverId + '/assetdatabases').then((response) => response.Items ?? []);\n }\n getElement(path: string): Promise {\n if (!path) {\n return Promise.resolve({});\n }\n return this.restGet('/elements?path=\\\\\\\\' + path).then((response) => response);\n }\n getEventFrameTemplates(databaseId: string): Promise {\n if (!databaseId) {\n return Promise.resolve([]);\n }\n return this.restGet(\n '/assetdatabases/' + databaseId + '/elementtemplates?selectedFields=Items.InstanceType%3BItems.Name%3BItems.WebId'\n ).then((response) => {\n return filter(response.Items ?? [], (item) => item.InstanceType === 'EventFrame');\n });\n }\n getElementTemplates(databaseId: string): Promise {\n if (!databaseId) {\n return Promise.resolve([]);\n }\n return this.restGet(\n '/assetdatabases/' + databaseId + '/elementtemplates?selectedFields=Items.InstanceType%3BItems.Name%3BItems.WebId'\n ).then((response) => {\n return filter(response.Items ?? [], (item) => item.InstanceType === 'Element');\n });\n }\n\n /**\n * @description\n * Get the child attributes of the current resource.\n * GET attributes/{webId}/attributes\n * @param {string} elementId - The ID of the parent resource. See WebID for more information.\n * @param {Object} options - Query Options\n * @param {string} options.nameFilter - The name query string used for finding attributes. The default is no filter. See Query String for more information.\n * @param {string} options.categoryName - Specify that returned attributes must have this category. The default is no category filter.\n * @param {string} options.templateName - Specify that returned attributes must be members of this template. The default is no template filter.\n * @param {string} options.valueType - Specify that returned attributes' value type must be the given value type. The default is no value type filter.\n * @param {string} options.searchFullHierarchy - Specifies if the search should include attributes nested further than the immediate attributes of the searchRoot. The default is 'false'.\n * @param {string} options.sortField - The field or property of the object used to sort the returned collection. The default is 'Name'.\n * @param {string} options.sortOrder - The order that the returned collection is sorted. The default is 'Ascending'.\n * @param {string} options.startIndex - The starting index (zero based) of the items to be returned. The default is 0.\n * @param {string} options.showExcluded - Specified if the search should include attributes with the Excluded property set. The default is 'false'.\n * @param {string} options.showHidden - Specified if the search should include attributes with the Hidden property set. The default is 'false'.\n * @param {string} options.maxCount - The maximum number of objects to be returned per call (page size). The default is 1000.\n * @param {string} options.selectedFields - List of fields to be returned in the response, separated by semicolons (;). If this parameter is not specified, all available fields will be returned. See Selected Fields for more information.\n */\n private getAttributes(elementId: string, options: any): Promise {\n let querystring =\n '?' +\n map(options, (value, key) => {\n return key + '=' + value;\n }).join('&');\n\n if (querystring === '?') {\n querystring = '';\n }\n\n return this.restGet('/elements/' + elementId + '/attributes' + querystring).then(\n (response) => response.Items ?? []\n );\n }\n\n /**\n * @description\n * Retrieve elements based on the specified conditions. By default, this method selects immediate children of the current resource.\n * Users can search for the elements based on specific search parameters. If no parameters are specified in the search, the default values for each parameter will be used and will return the elements that match the default search.\n * GET assetdatabases/{webId}/elements\n * @param {string} databaseId - The ID of the parent resource. See WebID for more information.\n * @param {Object} options - Query Options\n * @param {string} options.webId - The ID of the resource to use as the root of the search. See WebID for more information.\n * @param {string} options.nameFilter - The name query string used for finding objects. The default is no filter. See Query String for more information.\n * @param {string} options.categoryName - Specify that returned elements must have this category. The default is no category filter.\n * @param {string} options.templateName - Specify that returned elements must have this template or a template derived from this template. The default is no template filter.\n * @param {string} options.elementType - Specify that returned elements must have this type. The default type is 'Any'. See Element Type for more information.\n * @param {string} options.searchFullHierarchy - Specifies if the search should include objects nested further than the immediate children of the searchRoot. The default is 'false'.\n * @param {string} options.sortField - The field or property of the object used to sort the returned collection. The default is 'Name'.\n * @param {string} options.sortOrder - The order that the returned collection is sorted. The default is 'Ascending'.\n * @param {number} options.startIndex - The starting index (zero based) of the items to be returned. The default is 0.\n * @param {number} options.maxCount - The maximum number of objects to be returned per call (page size). The default is 1000.\n * @param {string} options.selectedFields - List of fields to be returned in the response, separated by semicolons (;). If this parameter is not specified, all available fields will be returned. See Selected Fields for more information.\n */\n private getDatabaseElements(databaseId: string, options: any): Promise {\n let querystring =\n '?' +\n map(options, (value, key) => {\n return key + '=' + value;\n }).join('&');\n\n if (querystring === '?') {\n querystring = '';\n }\n\n return this.restGet('/assetdatabases/' + databaseId + '/elements' + querystring).then(\n (response) => response.Items ?? []\n );\n }\n\n /**\n * @description\n * Retrieve elements based on the specified conditions. By default, this method selects immediate children of the current resource.\n * Users can search for the elements based on specific search parameters. If no parameters are specified in the search, the default values for each parameter will be used and will return the elements that match the default search.\n * GET elements/{webId}/elements\n * @param {string} databaseId - The ID of the resource to use as the root of the search. See WebID for more information.\n * @param {Object} options - Query Options\n * @param {string} options.webId - The ID of the resource to use as the root of the search. See WebID for more information.\n * @param {string} options.nameFilter - The name query string used for finding objects. The default is no filter. See Query String for more information.\n * @param {string} options.categoryName - Specify that returned elements must have this category. The default is no category filter.\n * @param {string} options.templateName - Specify that returned elements must have this template or a template derived from this template. The default is no template filter.\n * @param {string} options.elementType - Specify that returned elements must have this type. The default type is 'Any'. See Element Type for more information.\n * @param {string} options.searchFullHierarchy - Specifies if the search should include objects nested further than the immediate children of the searchRoot. The default is 'false'.\n * @param {string} options.sortField - The field or property of the object used to sort the returned collection. The default is 'Name'.\n * @param {string} options.sortOrder - The order that the returned collection is sorted. The default is 'Ascending'.\n * @param {number} options.startIndex - The starting index (zero based) of the items to be returned. The default is 0.\n * @param {number} options.maxCount - The maximum number of objects to be returned per call (page size). The default is 1000.\n * @param {string} options.selectedFields - List of fields to be returned in the response, separated by semicolons (;). If this parameter is not specified, all available fields will be returned. See Selected Fields for more information.\n */\n private getElements(elementId: string, options: any): Promise {\n let querystring =\n '?' +\n map(options, (value, key) => {\n return key + '=' + value;\n }).join('&');\n\n if (querystring === '?') {\n querystring = '';\n }\n\n return this.restGet('/elements/' + elementId + '/elements' + querystring).then(\n (response) => response.Items ?? []\n );\n }\n\n /**\n * Retrieve a list of points on a specified Data Server.\n *\n * @param {string} serverId - The ID of the server. See WebID for more information.\n * @param {string} nameFilter - A query string for filtering by point name. The default is no filter. *, ?, [ab], [!ab]\n */\n private piPointSearch(serverId: string, nameFilter: string): Promise {\n let filter1 = this.templateSrv.replace(nameFilter);\n let filter2 = `${filter1}`;\n let doFilter = false;\n if (filter1 !== nameFilter) {\n const regex = /\\{(\\w|,)+\\}/g;\n let m;\n while ((m = regex.exec(filter1)) !== null) {\n // This is necessary to avoid infinite loops with zero-width matches\n if (m.index === regex.lastIndex) {\n regex.lastIndex++;\n }\n\n // The result can be accessed through the `m`-variable.\n m.forEach((match, groupIndex) => {\n if (groupIndex === 0) {\n filter1 = filter1.replace(match, match.replace('{', '(').replace('}', ')').replace(',', '|'));\n filter2 = filter2.replace(match, '*');\n doFilter = true;\n }\n });\n }\n }\n return this.restGet('/dataservers/' + serverId + '/points?maxCount=100&nameFilter=' + filter2).then((results) => {\n if (!!results && !!results?.Items) {\n return doFilter ? results.Items.filter((item) => item.Name?.match(filter1)) : results.Items;\n }\n return [];\n });\n }\n}\n","import { DataSourcePlugin } from '@grafana/data';\nimport { PIWebAPIConfigEditor } from './config/ConfigEditor';\nimport { PIWebAPIQueryEditor } from './query/QueryEditor';\nimport { PiWebAPIDatasource } from './datasource';\nimport { PIWebAPIQuery, PIWebAPIDataSourceJsonData } from './types';\n\nexport const plugin = new DataSourcePlugin(\n PiWebAPIDatasource\n)\n .setQueryEditor(PIWebAPIQueryEditor)\n .setConfigEditor(PIWebAPIConfigEditor);\n"],"names":["module","exports","__WEBPACK_EXTERNAL_MODULE__781__","__WEBPACK_EXTERNAL_MODULE__531__","__WEBPACK_EXTERNAL_MODULE__7__","__WEBPACK_EXTERNAL_MODULE__241__","__WEBPACK_EXTERNAL_MODULE__959__","__WEBPACK_EXTERNAL_MODULE__269__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","FormField","LegacyForms","coerceOptions","options","jsonData","url","PIWebAPIConfigEditor","PureComponent","render","originalOptions","this","props","div","DataSourceHttpSettings","defaultUrl","dataSourceConfig","onChange","onHttpOptionsChange","showAccessOptions","h3","className","InlineField","label","labelWidth","InlineSwitch","pipoint","onPiPointChange","newFormat","onNewFormatChange","useUnit","onUseUnitChange","useExperimental","onUseExperimentalChange","useStreaming","onUseStreamingChange","inputWidth","onPIServerChange","piserver","placeholder","onAFServerChange","afserver","onAFDatabaseChange","afdatabase","event","onOptionsChange","target","checked","QueryField","tooltip","children","InlineFormLabel","width","QueryRowTerminator","QueryInlineField","QueryEditorRow","QueryRawInlineField","QueryRawEditorRow","defaultQuery","attributes","segments","regex","enable","summary","types","basis","interval","nodata","expression","interpolate","useLastValue","recordedValues","boundaryType","digitalStates","enableStreaming","isPiPoint","QueryEditorModeSwitcher","isRaw","isModalOpen","setModalOpen","useState","useEffect","Button","aria-label","icon","variant","type","onClick","ConfirmModal","isOpen","title","body","confirmText","dismissText","onConfirm","onDismiss","metricQueryTransform","response","map","item","text","Name","expandable","HasChildren","Path","split","length","Items","WebId","LABEL_WIDTH","MIN_ATTR_INPUT_WIDTH","REMOVE_LABEL","CustomLabelComponent","style","marginRight","Icon","name","PIWebAPIQueryEditor","isValueEmpty","calcBasisValueChanged","segment","metricsQuery","query","getCalcBasisSegments","calculationBasis","recordedBoundaryTypeValueChanged","getRecordedBoundaryTypeSegments","recordedBoundaryTypes","calcNoDataValueChanged","getNoDataSegments","noDataReplacement","onSummaryValueChanged","index","summaries","state","slice","splice","setState","stateCallback","getSummarySegments","summaryTypes","filter","s","indexOf","unshift","removeSummary","part","onSummaryAction","selectableValue","push","summarySegment","removeAttribute","attributeChangeValue","onAttributeAction","Array","isArray","String","match","getSegmentPathUpTo","arr","reduce","result","startsWith","checkAttributeSegments","data","datasource","ctrl","findQuery","path","metricFindQuery","assign","request","scopedVars","then","attributesResponse","validAttributes","each","attribute","substring","filteredAttributes","attrib","changedValue","templateSrv","replace","availableAttributes","catch","err","error","message","checkPiPointSegments","webId","getSelectedPIServer","pointName","webID","piServer","forEach","parts","textEditorChanged","splitAttributes","splitElements","_","getElementSegments","elements","updateArray","rawQuery","checkAfServer","queryProps","onRunQuery","defaults","hideError","display","piPointConfig","onIsPiPointChange","InlineFieldRow","grow","Input","onBlur","SegmentAsync","Component","onSegmentChange","loadOptions","allowCustomValue","inputMinWidth","disabled","getAttributeSegmentsPI","reloadOptionsOnChange","Segment","onAttributeChange","getAttributeSegmentsAF","attributeSegment","onHideErrorChange","useUnitConfig","maxNumber","parseInt","search","constructor","super","calculationBasisSegment","noDataReplacementSegment","segmentChangeValue","Promise","resolve","remove","currentSegment","afServerWebId","items","altSegments","variables","getVariables","variable","attributeText","forOwn","val","buildFromTarget","segmentsArray","attributesArray","summariesArray","cb","scopedVarsDone","componentDidMount","initialLoad","componentDidUpdate","force","_segmentsArray","e","console","elementPath","tr","join","parseRawQuery","isValidQuery","trim","targetSplit","queryChange","bind","PiWebAPIAnnotationsQueryEditor","memo","annotation","afWebId","setAfWebId","database","setDatabase","getValue","getAssetServer","AsyncSelect","getDatabases","dbs","loadingMessage","template","defaultOptions","getEventFrameTemplates","templ","showEndTime","currentTarget","categoryName","nameFilter","PiWebAPIDatasource","DataSourceWithBackend","applyTemplateVariables","targets","isAnnotation","buildQueryParameters","of","queryOptions","ds","querydepth","JSON","parse","Math","max","min","getAssetServers","server","getDatabase","db","getDatabaseElements","selectedFields","getElement","element","getElements","getAttributes","searchFullHierarchy","maxCount","getDataServers","piPointSearch","reject","hide","maxDataPoints","tar","att","refId","webid","startTime","range","from","endTime","to","annon","annotationOptions","events","currentLocale","Intl","DateTimeFormat","resolvedOptions","locale","values","transformDataFrameToMap","i","RegExp","Date","toLocaleString","time","timeEnd","id","tags","dataFrame","fields","field","toArray","getResource","restGet","getDataServer","serverId","databaseId","InstanceType","getElementTemplates","elementId","querystring","filter1","filter2","doFilter","m","exec","lastIndex","groupIndex","results","instanceSettings","getTemplateSrv","newFormatConfig","annotations","QueryEditor","prepareQuery","anno","queryType","processEvents","eventFrameToAnnotation","all","plugin","DataSourcePlugin","setQueryEditor","setConfigEditor"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"module.js","mappings":"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","sources":["webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"@grafana/data\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"@grafana/runtime\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"@grafana/ui\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"lodash\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"react\"","webpack://gridprotectionalliance-osisoftpi-datasource/external amd \"rxjs\"","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/bootstrap","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/runtime/compat get default export","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/runtime/define property getters","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/runtime/hasOwnProperty shorthand","webpack://gridprotectionalliance-osisoftpi-datasource/webpack/runtime/make namespace object","webpack://gridprotectionalliance-osisoftpi-datasource/./config/ConfigEditor.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./components/Forms.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./types.ts","webpack://gridprotectionalliance-osisoftpi-datasource/./components/QueryEditorModeSwitcher.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./helper.ts","webpack://gridprotectionalliance-osisoftpi-datasource/./query/QueryEditor.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./query/AnnotationsQueryEditor.tsx","webpack://gridprotectionalliance-osisoftpi-datasource/./datasource.ts","webpack://gridprotectionalliance-osisoftpi-datasource/./module.ts"],"sourcesContent":["module.exports = __WEBPACK_EXTERNAL_MODULE__781__;","module.exports = __WEBPACK_EXTERNAL_MODULE__531__;","module.exports = __WEBPACK_EXTERNAL_MODULE__7__;","module.exports = __WEBPACK_EXTERNAL_MODULE__241__;","module.exports = __WEBPACK_EXTERNAL_MODULE__959__;","module.exports = __WEBPACK_EXTERNAL_MODULE__269__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import React, { ChangeEvent, PureComponent } from 'react';\nimport { LegacyForms, DataSourceHttpSettings, InlineField, InlineSwitch } from '@grafana/ui';\nimport { DataSourcePluginOptionsEditorProps, DataSourceJsonData, DataSourceSettings } from '@grafana/data';\nimport { PIWebAPIDataSourceJsonData } from '../types';\n\nconst { FormField } = LegacyForms;\n\ninterface Props extends DataSourcePluginOptionsEditorProps {}\n\nconst coerceOptions = (\n options: DataSourceSettings\n): DataSourceSettings => {\n return {\n ...options,\n jsonData: {\n ...options.jsonData,\n url: options.url,\n },\n };\n};\n\ninterface State {}\n\nexport class PIWebAPIConfigEditor extends PureComponent {\n onPIServerChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n piserver: event.target.value,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onAFServerChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n afserver: event.target.value,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onAFDatabaseChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n afdatabase: event.target.value,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onHttpOptionsChange = (options: DataSourceSettings) => {\n const { onOptionsChange } = this.props;\n onOptionsChange(coerceOptions(options));\n };\n\n onPiPointChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n piserver: event.target.checked ? options.jsonData.piserver : '',\n pipoint: event.target.checked,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onNewFormatChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n newFormat: event.target.checked,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onUseUnitChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n useUnit: event.target.checked,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onUseExperimentalChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n useExperimental : event.target.checked,\n useStreaming : event.target.checked ? options.jsonData.useStreaming : false,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n onUseStreamingChange = (event: ChangeEvent) => {\n const { onOptionsChange, options } = this.props;\n const jsonData = {\n ...options.jsonData,\n useStreaming: event.target.checked,\n };\n onOptionsChange({ ...options, jsonData });\n };\n\n render() {\n const { options: originalOptions } = this.props;\n const options = coerceOptions(originalOptions);\n\n return (\n
\n \n\n

Custom Configuration

\n\n
\n
\n \n \n \n
\n
\n \n \n \n
\n
\n \n \n \n
\n
\n \n \n \n
\n {options.jsonData.useExperimental && (\n
\n \n \n \n
\n )}\n
\n\n

PI/AF Connection Details

\n\n
\n {options.jsonData.pipoint && (\n
\n \n
\n )}\n
\n \n
\n
\n \n
\n
\n
\n );\n }\n}\n","import React, { InputHTMLAttributes, FunctionComponent } from 'react';\nimport { InlineFormLabel } from '@grafana/ui';\n\nexport interface Props extends InputHTMLAttributes {\n label: string;\n tooltip?: string;\n labelWidth?: number;\n children?: React.ReactNode;\n queryEditor?: JSX.Element;\n}\n\nexport const QueryField: FunctionComponent> = ({ label, labelWidth = 12, tooltip, children }) => (\n <>\n \n {label}\n \n {children}\n \n);\n\nexport const QueryRowTerminator = () => {\n return (\n
\n
\n
\n );\n};\n\nexport const QueryInlineField = ({ ...props }) => {\n return (\n \n \n \n );\n};\n\nexport const QueryEditorRow = (props: Partial) => {\n return (\n
\n {props.children}\n \n
\n );\n};\n\nexport const QueryRawInlineField = ({ ...props }) => {\n return (\n \n \n \n );\n};\n\nexport const QueryRawEditorRow = (props: Partial) => {\n return <>{props.children};\n};\n","import { DataQuery } from '@grafana/schema';\nimport { DataSourceJsonData, SelectableValue } from '@grafana/data';\n\nexport interface PiwebapiElementPath {\n path: string;\n variable: string;\n}\n\nexport interface PiwebapiInternalRsp {\n data: PiwebapiRsp;\n status: number;\n url: string;\n}\n\nexport interface PiwebapiRsp {\n Name?: string;\n InstanceType?: string;\n Items?: PiwebapiRsp[];\n WebId?: string;\n HasChildren?: boolean;\n Type?: string;\n DefaultUnitsName?: string;\n Description?: string;\n Path?: string;\n}\n\nexport interface PiDataServer {\n name: string | undefined;\n webid: string | undefined;\n}\n\nexport interface PIWebAPISelectableValue {\n webId?: string;\n value?: string;\n type?: string;\n expandable?: boolean;\n}\n\nexport interface PIWebAPIAnnotationsQuery extends DataQuery {\n target: string;\n}\n\nexport interface PIWebAPIQuery extends DataQuery {\n target?: string;\n elementPath?: string;\n attributes?: Array>;\n segments?: any[];\n isPiPoint?: boolean;\n hideError?: boolean;\n isAnnotation?: boolean;\n webid?: string;\n display?: any;\n interpolate?: any;\n recordedValues?: any;\n digitalStates?: any;\n enableStreaming: any;\n useLastValue?: any;\n useUnit?: any;\n regex?: any;\n nodata?: string,\n summary?: {\n enable?: boolean,\n types?: any[],\n basis?: string,\n duration?: string,\n sampleTypeInterval?: boolean,\n sampleInterval?: string\n };\n expression?: string;\n rawQuery?: boolean;\n query?: string;\n // annotations items\n database?: PiwebapiRsp;\n template?: PiwebapiRsp;\n showEndTime?: boolean;\n attribute?: any;\n nameFilter?: string;\n categoryName?: string;\n}\n\nexport const defaultQuery: Partial = {\n target: ';',\n attributes: [],\n segments: [],\n regex: { enable: false },\n nodata: 'Null',\n summary: {\n enable: false,\n types: [],\n basis: 'EventWeighted',\n duration: '',\n sampleTypeInterval: false,\n sampleInterval: ''\n },\n expression: '',\n interpolate: { enable: false },\n useLastValue: { enable: false },\n recordedValues: { enable: false, boundaryType: 'Inside' },\n digitalStates: { enable: false },\n enableStreaming: { enable: false },\n useUnit: { enable: false },\n isPiPoint: false,\n};\n\n/**\n * These are options configured for each DataSource instance\n */\nexport interface PIWebAPIDataSourceJsonData extends DataSourceJsonData {\n url?: string;\n access?: string;\n piserver?: string;\n afserver?: string;\n afdatabase?: string;\n pipoint?: boolean;\n newFormat?: boolean;\n useUnit?: boolean;\n useExperimental?: boolean;\n useStreaming?: boolean;\n}\n\n/**\n * Value that is used in the backend, but never sent over HTTP to the frontend\n */\nexport interface PIWebAPISecureJsonData {\n apiKey?: string;\n}\n","import React, { useEffect, useState } from 'react';\nimport { Button, ConfirmModal } from '@grafana/ui';\n\ntype Props = {\n isRaw: boolean;\n onChange: (newIsRaw: boolean) => void;\n};\n\nexport const QueryEditorModeSwitcher = ({ isRaw, onChange }: Props): JSX.Element => {\n const [isModalOpen, setModalOpen] = useState(false);\n\n useEffect(() => {\n // if the isRaw changes, we hide the modal\n setModalOpen(false);\n }, [isRaw]);\n\n if (isRaw) {\n return (\n <>\n {\n // we show the are-you-sure modal\n setModalOpen(true);\n }}\n >\n {\n onChange(false);\n }}\n onDismiss={() => {\n setModalOpen(false);\n }}\n />\n \n );\n } else {\n return (\n {\n onChange(true);\n }}\n >\n );\n }\n};\n","import { each, map } from 'lodash';\r\n\r\nimport {\r\n AnnotationQuery,\r\n DataFrame,\r\n TableData,\r\n MetricFindValue,\r\n Field,\r\n toDataFrame,\r\n} from '@grafana/data';\r\n\r\nimport { PiwebapiElementPath, PiwebapiRsp, PIWebAPIQuery } from 'types';\r\n\r\nexport function parseRawQuery(tr: string): any {\r\n const splitAttributes = tr.split(';');\r\n const splitElements = splitAttributes[0].split('\\\\');\r\n\r\n // remove element hierarchy from attribute collection\r\n splitAttributes.splice(0, 1);\r\n\r\n let attributes: any[] = [];\r\n if (splitElements.length > 1 || (splitElements.length === 1 && splitElements[0] !== '')) {\r\n const elementPath: string = splitElements.join('\\\\');\r\n each(splitAttributes, function (item, index) {\r\n if (item !== '') {\r\n attributes.push({\r\n label: item,\r\n value: {\r\n value: item,\r\n expandable: false,\r\n },\r\n });\r\n }\r\n });\r\n\r\n return { attributes, elementPath };\r\n }\r\n\r\n return { attributes, elementPath: null };\r\n}\r\n\r\nexport function lowerCaseFirstLetter(string: string): string {\r\n return string.charAt(0).toLocaleLowerCase() + string.slice(1);\r\n}\r\n\r\n/**\r\n * Builds the Grafana metric segment for use on the query user interface.\r\n *\r\n * @param {any} response - response from PI Web API.\r\n * @returns - Grafana metric segment.\r\n *\r\n * @memberOf PiWebApiDatasource\r\n */\r\nexport function metricQueryTransform(response: PiwebapiRsp[]): MetricFindValue[] {\r\n return map(response, (item) => {\r\n return {\r\n text: item.Name,\r\n expandable:\r\n item.HasChildren === undefined || item.HasChildren === true || (item.Path ?? '').split('\\\\').length <= 3,\r\n HasChildren: item.HasChildren,\r\n Items: item.Items ?? [],\r\n Path: item.Path,\r\n WebId: item.WebId,\r\n } as MetricFindValue;\r\n });\r\n}\r\n\r\n/**\r\n * Check if all items are selected.\r\n *\r\n * @param {any} current the current variable selection\r\n * @return {boolean} true if all value is selected, false otherwise\r\n */\r\nexport function isAllSelected(current: any): boolean {\r\n if (!current) {\r\n return false;\r\n }\r\n if (Array.isArray(current.text)) {\r\n return current.text.indexOf('All') >= 0;\r\n }\r\n return current.text === 'All';\r\n}\r\n\r\nexport function processAnnotationQuery(annon: AnnotationQuery,data: DataFrame[]): DataFrame[] {\r\n let processedFrames: DataFrame[] = [];\r\n \r\n data.forEach((d: DataFrame) => {\r\n d.fields.forEach((f: Field) => {\r\n\r\n // check if the label has been set, if it hasn't been set then the eventframe annotation is not valid. \r\n if (!f.labels) { \r\n return \r\n }\r\n\r\n if (!('eventframe' in f.labels)) {\r\n return;\r\n }\r\n\r\n let attribute = 'attribute' in f.labels\r\n\r\n // Check whether f.values is an array or not to allow for each.\r\n // Check whether f.values is an array or not to allow for each.\r\n if (Array.isArray(f.values)) {\r\n f.values.forEach((value: any) => {\r\n\r\n if (attribute) {\r\n let annotation = value['1'].Content\r\n let valueData: any[] = []\r\n for (let i = 2; i in value; i++) {\r\n valueData.push(value[i].Content.Items)\r\n }\r\n\r\n const processedFrame = convertToTableData(annotation.Items!, valueData).map((r) => {\r\n return toDataFrame(r)});\r\n processedFrames = processedFrames.concat(processedFrame);\r\n } else {\r\n let annotation = value['1'].Content\r\n const processedFrame = convertToTableData(annotation.Items!).map((r) => {\r\n return toDataFrame(r)});\r\n processedFrames = processedFrames.concat(processedFrame);\r\n }\r\n });\r\n } \r\n });\r\n });\r\n return processedFrames;\r\n}\r\n\r\nexport function convertToTableData(items: any[], valueData?: any[]): TableData[] {\r\n const response: TableData[] = items.map((item: any, index: number) => {\r\n const columns = [{ text: 'StartTime' }, { text: 'EndTime' }];\r\n const rows = [item.StartTime, item.EndTime];\r\n if (valueData) {\r\n for (let attributeIndex = 0; attributeIndex < valueData.length; attributeIndex++) {\r\n let attributeData = valueData[attributeIndex]\r\n let eventframeAributeData = attributeData[index].Content.Items\r\n eventframeAributeData.forEach((attribute: any) => {\r\n columns.push({ text: attribute.Name });\r\n rows.push(String(attribute.Value.Value ? attribute.Value.Value.Name || attribute.Value.Value.Value || attribute.Value.Value : ''));\r\n });\r\n }\r\n }\r\n\r\n return {\r\n name: item.Name,\r\n columns,\r\n rows: [rows],\r\n };\r\n });\r\n return response;\r\n}\r\n\r\n/**\r\n * Resolve PIWebAPI response 'value' data to value - timestamp pairs.\r\n *\r\n * @param {any} item - 'Item' object from PIWebAPI\r\n * @param {any} noDataReplacementMode - String state of how to replace 'No Data'\r\n * @param {any} grafanaDataPoint - Single Grafana value pair (value, timestamp).\r\n * @returns grafanaDataPoint - Single Grafana value pair (value, timestamp).\r\n * @returns perviousValue - {any} Grafana value (value only).\r\n *\r\n */\r\nexport function noDataReplace(\r\n item: any,\r\n noDataReplacementMode: any,\r\n grafanaDataPoint: any[]\r\n): {\r\n grafanaDataPoint: any[];\r\n previousValue: any;\r\n drop: boolean;\r\n} {\r\n let previousValue = null;\r\n let drop = false;\r\n if (!item.Good || item.Value === 'No Data' || (item.Value?.Name && item.Value?.Name === 'No Data')) {\r\n if (noDataReplacementMode === 'Drop') {\r\n drop = true;\r\n } else if (noDataReplacementMode === '0') {\r\n grafanaDataPoint[0] = 0;\r\n } else if (noDataReplacementMode === 'Keep') {\r\n // Do nothing keep\r\n } else if (noDataReplacementMode === 'Null') {\r\n grafanaDataPoint[0] = null;\r\n } else if (noDataReplacementMode === 'Previous' && previousValue !== null) {\r\n grafanaDataPoint[0] = previousValue;\r\n }\r\n } else {\r\n previousValue = item.Value;\r\n }\r\n return { grafanaDataPoint, previousValue, drop };\r\n}\r\n\r\n/**\r\n * Check if the value is a number.\r\n *\r\n * @param {any} number the value to check\r\n * @returns {boolean} true if the value is a number, false otherwise\r\n */\r\nexport function checkNumber(number: any): boolean {\r\n return typeof number === 'number' && !Number.isNaN(number) && Number.isFinite(number);\r\n}\r\n\r\n/**\r\n * Returns the last item of the element path.\r\n *\r\n * @param {string} path element path\r\n * @returns {string} last item of the element path\r\n */\r\nexport function getLastPath(path: string): string {\r\n let splitPath = path.split('|');\r\n if (splitPath.length === 0) {\r\n return '';\r\n }\r\n splitPath = splitPath[0].split('\\\\');\r\n return splitPath.length === 0 ? '' : splitPath.pop() ?? '';\r\n}\r\n\r\n/**\r\n * Returns the last item of the element path plus variable.\r\n *\r\n * @param {PiwebapiElementPath[]} elementPathArray array of element paths\r\n * @param {string} path element path\r\n * @returns {string} last item of the element path\r\n */\r\nexport function getPath(elementPathArray: PiwebapiElementPath[], path: string): string {\r\n if (!path || elementPathArray.length === 0) {\r\n return '';\r\n }\r\n const splitStr = getLastPath(path);\r\n const foundElement = elementPathArray.find((e) => path.indexOf(e.path) >= 0)?.variable;\r\n return foundElement ? foundElement + '|' + splitStr : splitStr;\r\n}\r\n\r\n/**\r\n * Replace calculation dot in expression with PI point name.\r\n *\r\n * @param {boolean} replace - is pi point and calculation.\r\n * @param {PiwebapiRsp} webid - Pi web api response object.\r\n * @param {string} url - original url.\r\n * @returns Modified url\r\n */\r\nexport function getFinalUrl(replace: boolean, webid: PiwebapiRsp, url: string) {\r\n const newUrl = replace ? url.replace(/'\\.'/g, `'${webid.Name}'`) : url;\r\n return newUrl;\r\n}\r\n","import { each, filter, forOwn, join, reduce, map, slice, remove, defaults } from 'lodash';\n\nimport React, { PureComponent, ChangeEvent } from 'react';\nimport { Icon, InlineField, InlineFieldRow, InlineSwitch, Input, SegmentAsync, Segment } from '@grafana/ui';\nimport { QueryEditorProps, SelectableValue, TypedVariableModel } from '@grafana/data';\n\nimport { PiWebAPIDatasource } from '../datasource';\nimport { QueryInlineField, QueryRawInlineField, QueryRowTerminator } from '../components/Forms';\nimport { PIWebAPISelectableValue, PIWebAPIDataSourceJsonData, PIWebAPIQuery, defaultQuery } from '../types';\nimport { QueryEditorModeSwitcher } from 'components/QueryEditorModeSwitcher';\nimport { parseRawQuery } from 'helper';\nimport { types } from '@babel/core';\n\nconst LABEL_WIDTH = 24;\nconst LABEL_SWITCH_WIDTH = 49.067 / 8.0;\nconst MIN_ELEM_INPUT_WIDTH = 200;\nconst MIN_ATTR_INPUT_WIDTH = 250;\n\ninterface State {\n isPiPoint: boolean;\n hideError: boolean;\n segments: Array>;\n attributes: Array>;\n summaries: Array>;\n attributeSegment: SelectableValue;\n summarySegment: SelectableValue;\n calculationBasisSegment: SelectableValue;\n noDataReplacementSegment: SelectableValue;\n}\n\ntype Props = QueryEditorProps;\n\nconst REMOVE_LABEL = '-REMOVE-';\n\nconst CustomLabelComponent = (props: any) => {\n if (props.value) {\n return (\n
\n {props.label ?? '--no label--'}\n
\n );\n }\n return (\n \n \n \n );\n};\n\nexport class PIWebAPIQueryEditor extends PureComponent {\n error: any;\n piServer: any[] = [];\n availableAttributes: any = {};\n summaryTypes: string[];\n calculationBasis: string[];\n recordedBoundaryTypes: string [];\n noDataReplacement: string[];\n state: State = {\n isPiPoint: false,\n hideError: false,\n segments: [],\n attributes: [],\n summaries: [],\n attributeSegment: {},\n summarySegment: {},\n calculationBasisSegment: {},\n noDataReplacementSegment: {},\n };\n\n constructor(props: any) {\n super(props);\n this.onSegmentChange = this.onSegmentChange.bind(this);\n this.calcBasisValueChanged = this.calcBasisValueChanged.bind(this);\n this.recordedBoundaryTypeValueChanged = this.recordedBoundaryTypeValueChanged.bind(this);\n this.calcNoDataValueChanged = this.calcNoDataValueChanged.bind(this);\n this.onSummaryAction = this.onSummaryAction.bind(this);\n this.onSummaryValueChanged = this.onSummaryValueChanged.bind(this);\n this.onAttributeAction = this.onAttributeAction.bind(this);\n this.onAttributeChange = this.onAttributeChange.bind(this);\n\n this.summaryTypes = [\n // 'None', // A summary type is not specified.\n 'Total', // A totalization over the time range.\n 'Average', // The average value over the time range.\n 'Minimum', // The minimum value over the time range.\n 'Maximum', // The maximum value over the time range.\n 'Range', // The range value over the time range (minimum-maximum).\n 'StdDev', // The standard deviation over the time range.\n 'PopulationStdDev', // The population standard deviation over the time range.\n 'Count', // The sum of event count over the time range when calculation basis is event weighted. The sum of event time duration over the time range when calculation basis is time weighted.\n 'PercentGood', // Percent of data with good value during the calculation period. For time weighted calculations, the percentage is based on time. For event weighted calculations, the percent is based on event count.\n 'All', // A convenience for requesting all available summary calculations.\n 'AllForNonNumeric', // A convenience for requesting all available summary calculations for non-numeric data.\n ];\n\n this.calculationBasis = [\n 'TimeWeighted', // Weight the values in the calculation by the time over which they apply. Interpolation is based on whether the attribute is stepped. Interpolated events are generated at the boundaries if necessary.\n 'EventWeighted', // Evaluate values with equal weighting for each event. No interpolation is done. There must be at least one event within the time range to perform a successful calculation. Two events are required for standard deviation. In handling events at the boundary of the calculation, the AFSDK uses following rules:\n 'TimeWeightedContinuous', // Apply weighting as in TimeWeighted, but do all interpolation between values as if they represent continuous data, (standard interpolation) regardless of whether the attribute is stepped.\n 'TimeWeightedDiscrete', // Apply weighting as in TimeWeighted but interpolation between values is performed as if they represent discrete, unrelated values (stair step plot) regardless of the attribute is stepped.\n 'EventWeightedExcludeMostRecentEvent', // The calculation behaves the same as _EventWeighted_, except in the handling of events at the boundary of summary intervals in a multiple intervals calculation. Use this option to prevent events at the intervals boundary from being double count at both intervals. With this option, events at the end time (most recent time) of an interval is not used in that interval.\n 'EventWeightedExcludeEarliestEvent', // Similar to the option _EventWeightedExcludeMostRecentEvent_. Events at the start time(earliest time) of an interval is not used in that interval.\n 'EventWeightedIncludeBothEnds', // Events at both ends of the interval boundaries are included in the event weighted calculation.\n ];\n\n this.recordedBoundaryTypes = [\n 'Inside', // Default. Specifies to return the recorded values on the inside of the requested time range as the first and last values. \n 'Outside', // Specifies to return the recorded values on the outside of the requested time range as the first and last values.\n 'Interpolated', //Specifies to create an interpolated value at the end points of the requested time range if a recorded value does not exist at that time.\n ]\n\n this.noDataReplacement = [\n 'Null', // replace with nulls\n 'Drop', // drop items\n 'Previous', // use previous value if available\n '0', // replace with 0\n 'Keep', // Keep value\n ];\n }\n\n // is selected segment empty\n isValueEmpty(value: PIWebAPISelectableValue | undefined) {\n return !value || !value.value || !value.value.length || value.value === REMOVE_LABEL;\n }\n\n segmentChangeValue = (segments: Array>) => {\n const query = this.props.query;\n this.setState({ segments }, () => this.onChange({ ...query, segments }));\n };\n\n attributeChangeValue = (attributes: Array>): Promise => {\n const query = this.props.query;\n return new Promise((resolve) => this.setState({ attributes }, () => {\n this.onChange({ ...query, attributes })\n resolve();\n }));\n };\n\n // summary calculation basis change event\n calcBasisValueChanged(segment: SelectableValue) {\n const metricsQuery = this.props.query as PIWebAPIQuery;\n const summary = metricsQuery.summary;\n if (summary) {\n summary.basis = segment.value?.value;\n }\n this.onChange({ ...metricsQuery, summary });\n }\n // get summary calculation basis user interface segments\n getCalcBasisSegments() {\n const segments = map(this.calculationBasis, (item: string) => {\n let selectableValue: SelectableValue = {\n label: item,\n value: {\n value: item,\n expandable: true,\n },\n };\n return selectableValue;\n });\n return segments;\n }\n\n // recorded boundary type change event\n recordedBoundaryTypeValueChanged(segment: SelectableValue) {\n const metricsQuery = this.props.query as PIWebAPIQuery;\n const recordedValues = metricsQuery.recordedValues;\n if (recordedValues) {\n recordedValues.boundaryType = segment.value?.value;\n }\n this.onChange({ ...metricsQuery, recordedValues });\n }\n // get recorded boundary type user interface segments\n getRecordedBoundaryTypeSegments() {\n const segments = map(this.recordedBoundaryTypes, (item: string) => {\n let selectableValue: SelectableValue = {\n label: item,\n value: {\n value: item,\n expandable: true,\n },\n };\n return selectableValue;\n });\n return segments;\n }\n\n // no data change event\n calcNoDataValueChanged(segment: SelectableValue) {\n const metricsQuery = this.props.query as PIWebAPIQuery;\n const nodata = segment.value?.value;\n this.onChange({ ...metricsQuery, nodata });\n }\n // get no data user interface segments\n getNoDataSegments() {\n const segments = map(this.noDataReplacement, (item: string) => {\n let selectableValue: SelectableValue = {\n label: item,\n value: {\n value: item,\n expandable: true,\n },\n };\n return selectableValue;\n });\n return segments;\n }\n\n // summary query change event\n onSummaryValueChanged(item: SelectableValue, index: number) {\n const summaries = this.state.summaries.slice(0) as Array>;\n summaries[index] = item;\n if (this.isValueEmpty(item.value)) {\n summaries.splice(index, 1);\n }\n this.setState({ summaries }, this.stateCallback);\n }\n // get the list of summaries available\n getSummarySegments() {\n const summaryTypes = filter(this.summaryTypes, (type) => {\n return this.state.summaries.map((s) => s.value?.value).indexOf(type) === -1;\n });\n\n const segments = map(summaryTypes, (item: string) => {\n let selectableValue: SelectableValue = {\n label: item,\n value: {\n value: item,\n expandable: true,\n },\n };\n return selectableValue;\n });\n\n segments.unshift({\n label: REMOVE_LABEL,\n value: {\n value: REMOVE_LABEL,\n },\n });\n\n return segments;\n }\n\n // remove a summary from the user interface and the query\n removeSummary(part: SelectableValue) {\n const summaries = filter(this.state.summaries, (item: SelectableValue) => {\n return item !== part;\n });\n this.setState({ summaries });\n }\n // add a new summary to the query\n onSummaryAction(item: SelectableValue) {\n const summaries = this.state.summaries.slice(0) as Array>;\n // if value is not empty, add new attribute segment\n if (!this.isValueEmpty(item.value)) {\n let selectableValue: SelectableValue = {\n label: item.label,\n value: {\n value: item.value?.value,\n expandable: true,\n },\n };\n summaries.push(selectableValue);\n }\n this.setState({ summarySegment: {}, summaries }, this.stateCallback);\n }\n\n // remove an attribute from the query\n removeAttribute(part: SelectableValue) {\n const attributes = filter(this.state.attributes, (item: SelectableValue) => {\n return item !== part;\n });\n this.attributeChangeValue(attributes);\n }\n // add an attribute to the query\n onAttributeAction(item: SelectableValue) {\n const { query } = this.props;\n const attributes = this.state.attributes.slice(0);\n // partial variable\n if (item.value !== null && typeof item.value !== 'object' && !Array.isArray(item.value)) {\n const value = String(item.value! as string);\n item.value = {\n type: value.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: value,\n }\n }\n\n // if value is not empty, add new attribute segment\n if (!this.isValueEmpty(item.value)) {\n let selectableValue: SelectableValue = {\n label: item.label,\n value: {\n type: item.value?.value && item.value?.value.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: item.value?.value,\n expandable: !query.isPiPoint,\n },\n };\n attributes.push(selectableValue);\n }\n this.attributeChangeValue(attributes);\n }\n\n // pi point change event\n onPiPointChange = (item: SelectableValue, index: number) => {\n let attributes = this.state.attributes.slice(0);\n\n if (item.label === REMOVE_LABEL) {\n remove(attributes, (_, n) => n === index);\n } else {\n // set current value\n attributes[index] = item;\n }\n\n this.checkPiPointSegments(item, attributes);\n };\n // attribute change event\n onAttributeChange = (item: SelectableValue, index: number) => {\n let attributes = this.state.attributes.slice(0);\n\n // ignore if no change\n if (attributes[index].label === item.value?.value) {\n return;\n }\n\n // set current value\n attributes[index] = item;\n\n this.checkAttributeSegments(attributes, this.state.segments);\n };\n // segment change\n onSegmentChange = (item: SelectableValue, index: number) => {\n const { query } = this.props;\n let segments = this.state.segments.slice(0);\n\n // partial variable\n if (item.value !== null && typeof item.value !== 'object' && !Array.isArray(item.value)) {\n const value = String(item.value! as string);\n item.value = {\n type: value.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: value,\n }\n }\n\n // ignore if no change\n if (segments[index].label === item.value?.value) {\n return;\n }\n\n // reset attributes list\n this.setState({ attributes: [] }, () => {\n if (item.label === REMOVE_LABEL) {\n segments = slice(segments, 0, index);\n this.checkAttributeSegments([], segments).then(() => {\n if (segments.length === 0) {\n segments.push({\n label: '',\n });\n } else if (!!segments[segments.length - 1].value?.expandable) {\n segments.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n if (query.isPiPoint) {\n this.piServer = [];\n }\n this.segmentChangeValue(segments);\n });\n return;\n }\n\n // set current value\n segments[index] = item;\n\n // Accept only one PI server\n if (query.isPiPoint) {\n this.piServer.push(item);\n this.segmentChangeValue(segments);\n return;\n }\n\n // changed internal selection\n if (index < segments.length - 1) {\n segments = slice(segments, 0, index + 1);\n }\n this.checkAttributeSegments([], segments).then((): Promise>> => {\n // add new options\n if (item.value?.type === 'template') { // if it's a variable we need to check for new elements\\\n return this.getElementSegments(segments.length + 1, segments).then((elements) => {\n if (elements.length > 0) {\n segments[index].value!.expandable = true;\n segments.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n this.segmentChangeValue(segments);\n return segments;\n });\n } else if (!!item.value?.expandable) {\n segments.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n return new Promise((resolve) => {\n this.segmentChangeValue(segments);\n resolve(segments);\n });\n });\n });\n };\n\n // get a ui segment for the attributes\n getElementSegments = (\n index: number,\n currentSegment?: Array>\n ): Promise>> => {\n const { datasource, query, data } = this.props;\n const ctrl = this;\n const findQuery = query.isPiPoint\n ? { type: 'dataserver' }\n : {\n path: this.getSegmentPathUpTo(currentSegment ?? this.state.segments.slice(0), index),\n afServerWebId: this.state.segments.length > 0 && this.state.segments[0].value ? this.state.segments[0].value.webId : undefined,\n };\n\n if (!query.isPiPoint) {\n if (datasource.afserver?.name && index === 0) {\n return Promise.resolve([\n {\n label: datasource.afserver.name,\n value: {\n value: datasource.afserver.name,\n expandable: true,\n },\n },\n ]);\n }\n if (datasource.afserver?.name && datasource.afdatabase?.name && index === 1) {\n return Promise.resolve([\n {\n label: datasource.afdatabase.name,\n value: {\n value: datasource.afdatabase.name,\n expandable: true,\n },\n },\n ]);\n }\n }\n return datasource\n .metricFindQuery(findQuery, Object.assign(data?.request?.scopedVars ?? {}, { isPiPoint: query.isPiPoint }))\n .then((items: any[]) => {\n const altSegments = map(items, (item: any) => {\n let selectableValue: SelectableValue = {\n label: item.text,\n value: {\n webId: item.WebId,\n value: item.text,\n expandable: !query.isPiPoint && item.expandable,\n },\n };\n return selectableValue;\n });\n\n if (altSegments.length === 0) {\n return altSegments;\n }\n\n // add template variables\n const variables = datasource.templateSrv.getVariables();\n each(variables, (variable: TypedVariableModel) => {\n let selectableValue: SelectableValue = {\n label: '${' + variable.name + '}',\n value: {\n type: 'template',\n value: '${' + variable.name + '}',\n expandable: !query.isPiPoint,\n },\n };\n altSegments.unshift(selectableValue);\n });\n\n // add remove label\n altSegments.unshift({\n label: REMOVE_LABEL,\n value: {\n value: REMOVE_LABEL,\n },\n });\n\n return altSegments;\n })\n .catch((err: any) => {\n ctrl.error = err.message || 'Failed to issue metric query';\n return [];\n });\n };\n\n // get the list of attributes for the user interface - PI\n getAttributeSegmentsPI = (attributeText?: string): Promise>> => {\n const { datasource, query, data } = this.props;\n const ctrl = this;\n const findQuery = {\n path: '',\n webId: this.getSelectedPIServer(),\n pointName: (attributeText ?? '') + '*',\n type: 'pipoint',\n };\n let segments: Array> = [];\n return datasource\n .metricFindQuery(findQuery, Object.assign(data?.request?.scopedVars ?? {}, { isPiPoint: query.isPiPoint }))\n .then((items: any[]) => {\n segments = map(items, (item: any) => {\n let selectableValue: SelectableValue = {\n path: item.Path,\n label: item.text,\n value: {\n value: item.text,\n expandable: false,\n },\n };\n return selectableValue;\n });\n if (!!attributeText && attributeText.length > 0) {\n segments.unshift({\n label: attributeText,\n value: {\n value: attributeText,\n expandable: false,\n },\n });\n }\n // add template variables\n const variables = datasource.templateSrv.getVariables();\n each(variables, (variable: TypedVariableModel) => {\n let selectableValue: SelectableValue = {\n label: '${' + variable.name + '}',\n value: {\n type: 'template',\n value: '${' + variable.name + '}',\n expandable: !query.isPiPoint,\n },\n };\n segments.unshift(selectableValue);\n });\n\n // add remove label\n segments.unshift({\n label: REMOVE_LABEL,\n value: {\n value: REMOVE_LABEL,\n },\n });\n\n return segments;\n })\n .catch((err: any) => {\n ctrl.error = err.message || 'Failed to issue metric query';\n return segments;\n });\n };\n\n // get the list of attributes for the user interface - AF\n getAttributeSegmentsAF = (attributeText?: string): Array> => {\n const { datasource } = this.props;\n const ctrl = this;\n let segments: Array> = [];\n\n segments.push({\n label: REMOVE_LABEL,\n value: {\n value: REMOVE_LABEL,\n },\n });\n\n // add template variables\n const variables = datasource.templateSrv.getVariables();\n each(variables, (variable: TypedVariableModel) => {\n let selectableValue: SelectableValue = {\n label: '${' + variable.name + '}',\n value: {\n type: 'template',\n value: '${' + variable.name + '}',\n expandable: false,\n },\n };\n segments.push(selectableValue);\n });\n\n forOwn(ctrl.availableAttributes, (val: any, key: string) => {\n let selectableValue: SelectableValue = {\n label: key,\n value: {\n value: key,\n expandable: true,\n },\n };\n segments.push(selectableValue);\n });\n\n return segments;\n };\n\n // build data from target string\n buildFromTarget = (\n query: PIWebAPIQuery,\n segmentsArray: Array>,\n attributesArray: Array>\n ) => {\n const splitAttributes = query.target!.split(';');\n const splitElements = splitAttributes.length > 0 ? splitAttributes[0].split('\\\\') : [];\n\n if (splitElements.length > 1 || (splitElements.length === 1 && splitElements[0] !== '')) {\n // remove element hierarchy from attribute collection\n splitAttributes.splice(0, 1);\n\n each(splitElements, (item, _) => {\n segmentsArray.push({\n label: item,\n value: {\n type: item.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: item,\n expandable: true,\n },\n });\n });\n each(splitAttributes, (item, _) => {\n if (item !== '') {\n // set current value\n attributesArray.push({\n label: item,\n value: {\n type: item.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: item,\n expandable: false,\n },\n });\n }\n });\n return this.getElementSegments(splitElements.length + 1, segmentsArray).then((elements) => {\n if (elements.length > 0) {\n segmentsArray.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n return segmentsArray;\n });\n }\n return Promise.resolve(segmentsArray);\n };\n\n /**\n * Gets the segment information and parses it to a string.\n *\n * @param {any} index - Last index of segment to use.\n * @returns - AF Path or PI Point name.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n getSegmentPathUpTo(segments: Array>, index: number): string {\n const arr = segments.slice(0, index);\n\n return reduce(\n arr,\n (result: any, segment: SelectableValue) => {\n if (!segment.value) {\n return '';\n }\n if (!segment.value.value?.startsWith('-Select')) {\n return result ? result + '\\\\' + segment.value.value : segment.value.value;\n }\n return result;\n },\n ''\n );\n }\n\n /**\n * Get the current AF Element's child attributes. Validates when the element selection changes.\n *\n * @returns - Collection of attributes.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n checkAttributeSegments(\n attributes: Array>,\n segments: Array>\n ): Promise {\n const { datasource, data } = this.props;\n const ctrl = this;\n const findQuery = {\n path: this.getSegmentPathUpTo(segments.slice(0), segments.length),\n type: 'attributes',\n };\n return datasource\n .metricFindQuery(findQuery, Object.assign(data?.request?.scopedVars ?? {}, { isPiPoint: false }))\n .then((attributesResponse: any) => {\n const validAttributes: any = {};\n\n each(attributesResponse, (attribute: any) => {\n validAttributes[attribute.Path.substring(attribute.Path.indexOf('|') + 1)] = attribute.WebId;\n });\n\n const filteredAttributes = filter(attributes, (attrib: SelectableValue) => {\n const changedValue = datasource.templateSrv.replace(attrib.value?.value);\n return validAttributes[changedValue] !== undefined;\n });\n\n ctrl.availableAttributes = validAttributes;\n return this.attributeChangeValue(filteredAttributes);\n })\n .catch((err: any) => {\n ctrl.error = err.message || 'Failed to issue metric query';\n return this.attributeChangeValue(attributes);\n });\n }\n\n /**\n * Get PI points from server.\n *\n * @returns - Collection of attributes.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n checkPiPointSegments(\n attribute: SelectableValue,\n attributes: Array>\n ) {\n const { datasource, data } = this.props;\n const ctrl = this;\n const findQuery = {\n path: attribute.path,\n webId: ctrl.getSelectedPIServer(),\n pointName: attribute.label,\n type: 'pipoint',\n };\n return datasource\n .metricFindQuery(findQuery, Object.assign(data?.request?.scopedVars ?? {}, { isPiPoint: true }))\n .then(() => {\n return ctrl.attributeChangeValue(attributes);\n })\n .catch((err: any) => {\n ctrl.error = err.message || 'Failed to issue metric query';\n return ctrl.attributeChangeValue([]);\n });\n }\n\n /**\n * Gets the webid of the current selected pi data server.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n getSelectedPIServer() {\n let webID = '';\n\n this.piServer.forEach((s) => {\n const parts = this.props.query.target!.split(';');\n if (parts.length >= 2) {\n if (parts[0] === s.text) {\n webID = s.WebId;\n return;\n }\n }\n });\n return this.piServer.length > 0 ? this.piServer[0].value?.webId : webID;\n }\n\n /**\n * Queries PI Web API for child elements and attributes when the raw query text editor is changed.\n *\n * @memberOf PIWebAPIQueryEditor\n */\n textEditorChanged() {\n const { query } = this.props;\n const splitAttributes = query.target!.split(';');\n const splitElements = splitAttributes.length > 0 ? splitAttributes[0].split('\\\\') : [];\n\n let segments: Array> = [];\n let attributes: Array> = [];\n\n if (splitElements.length > 1 || (splitElements.length === 1 && splitElements[0] !== '')) {\n // remove element hierarchy from attribute collection\n splitAttributes.splice(0, 1);\n\n each(splitElements, (item, _) => {\n segments.push({\n label: item,\n value: {\n type: item.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: item,\n expandable: true,\n },\n });\n });\n each(splitAttributes, function (item, index) {\n if (item !== '') {\n attributes.push({\n label: item,\n value: {\n type: item.match(/\\${\\w+}/gi) ? 'template' : undefined,\n value: item,\n expandable: false,\n },\n });\n }\n });\n this.getElementSegments(splitElements.length + 1, segments)\n .then((elements) => {\n if (elements.length > 0) {\n segments.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n }\n })\n .then(() => {\n this.updateArray(segments, attributes, this.state.summaries, query.isPiPoint!, () => {\n this.onChange({\n ...query,\n query: undefined,\n rawQuery: false,\n attributes: this.state.attributes,\n segments: this.state.segments,\n });\n });\n });\n } else {\n segments = this.checkAfServer();\n this.updateArray(segments, this.state.attributes, this.state.summaries, query.isPiPoint!, () => {\n this.onChange({\n ...query,\n query: undefined,\n rawQuery: false,\n attributes: this.state.attributes,\n segments: this.state.segments,\n });\n });\n }\n }\n\n /**\n * Check if the AF server and database are configured in the datasoure config.\n *\n * @returns the segments array\n *\n * @memberOf PIWebAPIQueryEditor\n */\n checkAfServer = () => {\n const { datasource } = this.props;\n const segmentsArray = [];\n if (datasource.afserver?.name) {\n segmentsArray.push({\n label: datasource.afserver.name,\n value: {\n value: datasource.afserver.name,\n expandable: true,\n },\n });\n if (datasource.afdatabase?.name) {\n segmentsArray.push({\n label: datasource.afdatabase.name,\n value: {\n value: datasource.afdatabase.name,\n expandable: true,\n },\n });\n }\n segmentsArray.push({\n label: 'Select Element',\n value: {\n value: '-Select Element-',\n },\n });\n } else {\n segmentsArray.push({\n label: '',\n });\n }\n return segmentsArray;\n };\n\n /**\n * Update the internal state of the datasource.\n *\n * @param segmentsArray the segments array to update\n * @param attributesArray the AF attributes array to update\n * @param summariesArray the summaries array to update\n * @param isPiPoint the is PI point flag\n * @param cb optional callback function\n *\n * @memberOf PIWebAPIQueryEditor\n */\n updateArray = (\n segmentsArray: Array>,\n attributesArray: Array>,\n summariesArray: Array>,\n isPiPoint: boolean,\n cb?: (() => void) | undefined\n ) => {\n this.setState(\n {\n segments: segmentsArray,\n attributes: attributesArray,\n summaries: summariesArray,\n isPiPoint,\n },\n () => {\n if (!isPiPoint) {\n this.checkAttributeSegments(attributesArray, this.state.segments).then(() => {\n if (cb) {\n cb();\n }\n });\n }\n }\n );\n };\n\n // React action when component is initialized/updated\n scopedVarsDone = false;\n componentDidMount = () => {\n this.initialLoad(false);\n };\n\n componentDidUpdate = () => {\n const { query } = this.props;\n if (this.props.data?.state === 'Done' && !!this.props.data?.request?.scopedVars && !this.scopedVarsDone) {\n this.scopedVarsDone = true;\n this.initialLoad(!query.isPiPoint);\n }\n };\n\n initialLoad = (force: boolean) => {\n const { query } = this.props;\n const metricsQuery = defaults(query, defaultQuery) as PIWebAPIQuery;\n const { segments, attributes, summary, isPiPoint } = metricsQuery;\n\n let segmentsArray: Array> = force ? [] : segments?.slice(0) ?? [];\n let attributesArray: Array> = force ? [] : attributes?.slice(0) ?? [];\n let summariesArray = summary?.types ?? [];\n\n if (!isPiPoint && segmentsArray.length === 0) {\n if (query.target && query.target.length > 0 && query.target !== ';') {\n attributesArray = [];\n // Build query from target\n this.buildFromTarget(query, segmentsArray, attributesArray)\n .then((_segmentsArray) => {\n this.updateArray(_segmentsArray, attributesArray, summariesArray, false);\n })\n .catch((e) => console.error(e));\n return;\n } else {\n segmentsArray = this.checkAfServer();\n }\n } else if (isPiPoint && segmentsArray.length > 0) {\n this.piServer = segmentsArray;\n }\n this.updateArray(segmentsArray, attributesArray, summariesArray, !!isPiPoint, () => {\n this.onChange(query);\n });\n };\n\n onChange = (query: PIWebAPIQuery) => {\n const { onChange, onRunQuery } = this.props;\n\n if (query.rawQuery) {\n query.target = query.query ?? '';\n if (!!query.query) {\n const { attributes, elementPath } = parseRawQuery(query.target);\n query.attributes = attributes;\n query.elementPath = elementPath;\n }\n } else {\n query.elementPath = this.getSegmentPathUpTo(this.state.segments, this.state.segments.length);\n query.target =\n query.elementPath +\n ';' +\n join(\n query.attributes?.map((s) => s.value?.value),\n ';'\n );\n }\n const summary = query.summary;\n if (summary) {\n summary.types = this.state.summaries;\n }\n\n onChange({...query, summary});\n\n if (this.isValidQuery(query)) {\n onRunQuery();\n }\n };\n\n isValidQuery = (query: PIWebAPIQuery): boolean => {\n if (query.target && query.target.length > 0 && query.target !== \";\") {\n query.target = query.target.trim();\n const targetSplit = query.target.split(\";\", 2);\n return targetSplit.length === 2 && targetSplit[0].length > 0 && targetSplit[1].length > 0;\n }\n return false;\n }\n\n stateCallback = () => {\n const query = this.props.query as PIWebAPIQuery;\n this.onChange(query);\n };\n\n onIsPiPointChange = (event: React.SyntheticEvent) => {\n const { query: queryChange } = this.props;\n const isPiPoint = !queryChange.isPiPoint;\n this.setState(\n {\n segments: isPiPoint ? [{ label: '' }] : this.checkAfServer(),\n attributes: [],\n isPiPoint,\n },\n () => {\n this.onChange({\n ...queryChange,\n expression: '',\n attributes: this.state.attributes,\n segments: this.state.segments,\n isPiPoint,\n });\n }\n );\n };\n\n onHideErrorChange = (event: React.SyntheticEvent) => {\n const { query: queryChange } = this.props;\n const hideError = !queryChange.hideError;\n this.setState(\n {\n hideError,\n },\n () => {\n this.onChange({\n ...queryChange,\n hideError,\n });\n }\n );\n };\n\n render() {\n const { query: queryProps, onChange, onRunQuery } = this.props;\n const metricsQuery = defaults(queryProps, defaultQuery) as PIWebAPIQuery;\n const {\n useLastValue,\n useUnit,\n interpolate,\n query,\n rawQuery,\n digitalStates,\n enableStreaming,\n recordedValues,\n expression,\n isPiPoint,\n hideError,\n summary,\n nodata,\n display,\n regex,\n } = metricsQuery;\n\n return (\n <>\n {this.props.datasource.piPointConfig && (\n \n \n \n )}\n\n {!!rawQuery && (\n \n \n ) =>\n onChange({ ...metricsQuery, query: event.target.value })\n }\n placeholder=\"enter query\"\n />\n \n this.textEditorChanged()} />\n \n )}\n\n {!rawQuery && (\n <>\n
\n \n {this.state.segments.map((segment: SelectableValue, index: number) => {\n return (\n }\n onChange={(item) => this.onSegmentChange(item, index)}\n loadOptions={(query?: string | undefined) => {\n return this.getElementSegments(index);\n }}\n allowCustomValue\n inputMinWidth={MIN_ELEM_INPUT_WIDTH}\n />\n );\n })}\n \n {!isPiPoint && (\n {\n onChange({ ...metricsQuery, query: metricsQuery.target, rawQuery: value });\n }}\n />\n )}\n \n
\n\n \n {this.state.attributes.map((attribute: SelectableValue, index: number) => {\n if (isPiPoint) {\n return (\n }\n disabled={this.piServer.length === 0}\n onChange={(item) => this.onPiPointChange(item, index)}\n loadOptions={this.getAttributeSegmentsPI}\n reloadOptionsOnChange\n allowCustomValue\n inputMinWidth={MIN_ATTR_INPUT_WIDTH}\n />\n );\n }\n return (\n }\n disabled={this.state.segments.length <= 2}\n onChange={(item) => this.onAttributeChange(item, index)}\n options={this.getAttributeSegmentsAF()}\n allowCustomValue\n inputMinWidth={MIN_ATTR_INPUT_WIDTH}\n />\n );\n })}\n\n {isPiPoint && (\n \n }\n disabled={this.piServer.length === 0}\n onChange={this.onAttributeAction}\n loadOptions={this.getAttributeSegmentsPI}\n reloadOptionsOnChange\n allowCustomValue\n inputMinWidth={MIN_ATTR_INPUT_WIDTH}\n />\n )}\n {!isPiPoint && (\n \n }\n disabled={this.state.segments.length <= 2}\n onChange={this.onAttributeAction}\n options={this.getAttributeSegmentsAF()}\n allowCustomValue\n inputMinWidth={MIN_ATTR_INPUT_WIDTH}\n />\n )}\n \n \n )}\n\n \n \n ) =>\n onChange({ ...metricsQuery, expression: event.target.value })\n }\n placeholder=\"'.'*2\"\n />\n \n \n\n \n \n \n this.onChange({\n ...metricsQuery,\n useLastValue: { ...useLastValue, enable: !useLastValue.enable },\n })\n }\n />\n \n \n \n this.onChange({\n ...metricsQuery,\n digitalStates: { ...digitalStates, enable: !digitalStates.enable },\n })\n }\n />\n \n \n \n }\n onChange={this.calcNoDataValueChanged}\n options={this.getNoDataSegments()}\n allowCustomValue\n />\n \n \n \n \n {this.props.datasource.useUnitConfig && (\n \n \n this.onChange({\n ...metricsQuery,\n useUnit: { ...useUnit, enable: !useUnit.enable },\n })\n }\n />\n \n )}\n {this.props.datasource.useStreaming && (\n \n \n this.onChange({ ...metricsQuery, enableStreaming: { ...enableStreaming, enable: !enableStreaming.enable } })\n }\n />\n \n )}\n \n \n {(interpolate.enable || (!useLastValue.enable && !recordedValues.enable)) && (\n \n \n \n this.onChange({ ...metricsQuery, interpolate: { ...interpolate, enable: !interpolate.enable, interval: null } })\n }\n />\n \n \n ) =>\n onChange({ ...metricsQuery, interpolate: { ...interpolate, interval: event.target.value } })\n }\n placeholder=\"30s\"\n />\n \n \n )}\n\n {(recordedValues.enable || (!useLastValue.enable && !interpolate.enable)) && (\n \n \n \n this.onChange({\n ...metricsQuery,\n recordedValues: { ...recordedValues, enable: !recordedValues.enable, maxNumber: null, boundaryType: 'Inside' },\n })\n }\n />\n \n \n ) =>\n onChange({\n ...metricsQuery,\n recordedValues: { ...recordedValues, maxNumber: parseInt(event.target.value, 10) },\n })\n }\n type=\"number\"\n placeholder=\"1000\"\n />\n \n \n \n }\n onChange={this.recordedBoundaryTypeValueChanged}\n options={this.getRecordedBoundaryTypeSegments()}\n allowCustomValue\n />\n \n \n )}\n\n {!useLastValue.enable && (\n \n \n \n this.onChange({\n ...metricsQuery,\n summary: { ...summary, enable: !(summary?.enable) },\n })\n }\n />\n \n \n \n }\n onChange={this.calcBasisValueChanged}\n options={this.getCalcBasisSegments()}\n allowCustomValue\n />\n \n \n \n {this.state.summaries.map((s: SelectableValue, index: number) => {\n return (\n }\n onChange={(item) => this.onSummaryValueChanged(item, index)}\n options={this.getSummarySegments()}\n allowCustomValue\n />\n );\n })}\n \n }\n onChange={this.onSummaryAction}\n options={this.getSummarySegments()}\n allowCustomValue\n />\n \n \n \n )}\n {summary?.enable && (\n \n \n \n this.onChange({ ...metricsQuery, summary: { ...summary, sampleTypeInterval: !(summary?.sampleTypeInterval) } })\n }\n />\n \n \n ) =>\n onChange({ ...metricsQuery, summary: { ...summary, sampleInterval: event.target.value } })\n }\n placeholder=\"30s\"\n />\n \n \n ) =>\n onChange({ ...metricsQuery, summary: { ...summary, duration: event.target.value } })\n }\n placeholder=\"30s\"\n />\n \n \n )}\n\n \n \n ) =>\n onChange({ ...metricsQuery, display: event.target.value })\n }\n placeholder=\"Display\"\n />\n \n \n {\n this.onChange({ ...metricsQuery, regex: { ...regex, enable: !regex.enable } });\n }}\n />\n \n \n ) =>\n onChange({ ...metricsQuery, regex: { ...regex, search: event.target.value } })\n }\n placeholder=\"(.*)\"\n />\n \n \n ) =>\n onChange({ ...metricsQuery, regex: { ...regex, replace: event.target.value } })\n }\n placeholder=\"$1\"\n />\n \n \n \n );\n }\n}\n","import React, { memo, useState } from 'react';\n\nimport { AnnotationQuery, QueryEditorProps, SelectableValue } from '@grafana/data';\nimport { AsyncSelect, InlineField, InlineFieldRow, InlineSwitch, Input } from '@grafana/ui';\n\nimport { PiWebAPIDatasource } from 'datasource';\nimport { PIWebAPIDataSourceJsonData, PIWebAPIQuery, PiwebapiRsp } from 'types';\n\nconst SMALL_LABEL_WIDTH = 20;\nconst LABEL_WIDTH = 30;\nconst MIN_INPUT_WIDTH = 50;\n\ntype PiWebAPIQueryEditorProps = QueryEditorProps;\n\ntype Props = PiWebAPIQueryEditorProps & {\n annotation?: AnnotationQuery;\n onAnnotationChange?: (annotation: AnnotationQuery) => void;\n};\n\nexport const PiWebAPIAnnotationsQueryEditor = memo(function PiWebAPIAnnotationQueryEditor(props: Props) {\n const { query, datasource, annotation, onChange, onRunQuery } = props;\n\n const [afWebId, setAfWebId] = useState('');\n const [database, setDatabase] = useState(annotation?.target?.database ?? {});\n\n // this should never happen, but we want to keep typescript happy\n if (annotation === undefined) {\n return null;\n }\n\n const getEventFrames = (): Promise>> => {\n return datasource.getEventFrameTemplates(database?.WebId!).then((templ: PiwebapiRsp[]) => {\n return templ.map((d) => ({ label: d.Name, value: d }));\n });\n };\n\n const getDatabases = (): Promise>> => {\n return datasource.getDatabases(afWebId).then((dbs: PiwebapiRsp[]) => {\n return dbs.map((d) => ({ label: d.Name, value: d }));\n });\n };\n\n const getValue = (key: string) => {\n const query: any = annotation.target as any;\n if (!query || !query[key]) {\n return;\n }\n return { label: query[key].Name, value: query[key] };\n };\n\n datasource.getAssetServer(datasource.afserver.name).then((result) => {\n setAfWebId(result.WebId!);\n });\n\n return (\n <>\n
\n \n \n {\n setDatabase(e.value);\n onChange({ ...query, database: e.value, template: undefined });\n }}\n defaultOptions\n />\n \n \n onChange({ ...query, template: e.value })}\n defaultOptions\n />\n \n \n onChange({ ...query, showEndTime: e.currentTarget.checked })}\n />\n \n \n \n \n onRunQuery()}\n onChange={(e) => onChange({ ...query, categoryName: e.currentTarget.value })}\n placeholder=\"Enter category name\"\n />\n \n \n onRunQuery()}\n onChange={(e) => onChange({ ...query, nameFilter: e.currentTarget.value })}\n placeholder=\"Enter name filter\"\n />\n \n \n \n \n \n onChange({\n ...query,\n regex: { ...query.regex, enable: e.currentTarget.checked },\n })\n }\n />\n \n \n onRunQuery()}\n onChange={(e) =>\n onChange({\n ...query,\n regex: { ...query.regex, search: e.currentTarget.value },\n })\n }\n placeholder=\"(.*)\"\n width={MIN_INPUT_WIDTH}\n />\n \n \n onRunQuery()}\n onChange={(e) =>\n onChange({\n ...query,\n regex: { ...query.regex, replace: e.currentTarget.value },\n })\n }\n placeholder=\"$1\"\n />\n \n \n \n \n \n onChange({\n ...query!,\n attribute: { ...query.attribute, enable: e.currentTarget.checked },\n })\n }\n />\n \n \n onRunQuery()}\n onChange={(e) =>\n onChange({\n ...query!,\n attribute: { ...query.attribute, name: e.currentTarget.value },\n })\n }\n placeholder=\"Enter name\"\n />\n \n \n
\n \n );\n});\n","import { filter, map } from 'lodash';\n\nimport { Observable, of } from 'rxjs';\n\nimport {\n DataSourceInstanceSettings,\n MetricFindValue,\n AnnotationQuery,\n ScopedVars,\n AnnotationEvent,\n DataFrame,\n DataQueryRequest,\n DataQueryResponse,\n} from '@grafana/data';\nimport { getTemplateSrv, TemplateSrv, DataSourceWithBackend } from '@grafana/runtime';\n\nimport { PIWebAPIQuery, PIWebAPIDataSourceJsonData, PiDataServer, PiwebapiRsp } from './types';\nimport { metricQueryTransform } from 'helper';\n\nimport { PiWebAPIAnnotationsQueryEditor } from 'query/AnnotationsQueryEditor';\n\nexport class PiWebAPIDatasource extends DataSourceWithBackend {\n piserver: PiDataServer;\n afserver: PiDataServer;\n afdatabase: PiDataServer;\n piPointConfig: boolean;\n newFormatConfig: boolean;\n useUnitConfig: boolean;\n useExperimental: boolean;\n useStreaming: boolean;\n\n constructor(\n instanceSettings: DataSourceInstanceSettings,\n readonly templateSrv: TemplateSrv = getTemplateSrv()\n ) {\n super(instanceSettings);\n\n this.piserver = { name: (instanceSettings.jsonData || {}).piserver, webid: undefined };\n this.afserver = { name: (instanceSettings.jsonData || {}).afserver, webid: undefined };\n this.afdatabase = { name: (instanceSettings.jsonData || {}).afdatabase, webid: undefined };\n this.piPointConfig = instanceSettings.jsonData.pipoint || false;\n this.newFormatConfig = instanceSettings.jsonData.newFormat || false;\n this.useUnitConfig = instanceSettings.jsonData.useUnit || false;\n this.useExperimental = instanceSettings.jsonData.useExperimental || false;\n this.useStreaming = instanceSettings.jsonData.useStreaming || false;\n\n this.annotations = {\n QueryEditor: PiWebAPIAnnotationsQueryEditor,\n prepareQuery(anno: AnnotationQuery): PIWebAPIQuery | undefined {\n if (anno.target) {\n anno.target.queryType = 'Annotation';\n anno.target.isAnnotation = true;\n }\n return anno.target;\n },\n processEvents: (\n anno: AnnotationQuery,\n data: DataFrame[]\n ): Observable => {\n return of(this.eventFrameToAnnotation(anno, data));\n },\n };\n\n Promise.all([\n this.getDataServer(this.piserver.name).then((result: PiwebapiRsp) => (this.piserver.webid = result.WebId)),\n this.getAssetServer(this.afserver.name).then((result: PiwebapiRsp) => (this.afserver.webid = result.WebId)),\n this.getDatabase(\n this.afserver.name && this.afdatabase.name ? this.afserver.name + '\\\\' + this.afdatabase.name : undefined\n ).then((result: PiwebapiRsp) => (this.afdatabase.webid = result.WebId)),\n ]);\n }\n\n /**\n * This method overrides the applyTemplateVariables() method from the DataSourceWithBackend class.\n * It is responsible for replacing the template variables in the query configuration prior\n * to sending the query to the backend. Templated variables are not able to be used for alerts\n * or public facing dashboards.\n *\n * @param {PIWebAPIQuery} query - The raw query configuration from the frontend as defined in the query editor.\n * @param {ScopedVars} scopedVars - The template variables that are defined in the query editor and dashboard.\n * @returns - PIWebAPIQuery.\n *\n * @memberOf PiWebApiDatasource\n */\n applyTemplateVariables(query: PIWebAPIQuery, scopedVars: ScopedVars) {\n return {\n ...query,\n target: query.target ? this.templateSrv.replace(query.target, scopedVars) : '',\n };\n }\n\n /**\n * This method makes the query to the backend.\n *\n * @param {DataQueryRequest} options\n *\n * @memberOf PiWebApiDatasource\n */\n query(options: DataQueryRequest): Observable {\n if (options.targets.length === 1 && !!options.targets[0].isAnnotation) {\n return super.query(options);\n }\n\n const query = this.buildQueryParameters(options);\n if (query.targets.length <= 0) {\n return of({ data: [] });\n }\n\n return super.query(query);\n }\n\n /**\n * This method does the discovery of the AF Hierarchy and populates the query user interface segments.\n *\n * @param {any} query - Parses the query configuration and builds a PI Web API query.\n * @returns - Segment information.\n *\n * @memberOf PiWebApiDatasource\n */\n metricFindQuery(query: any, queryOptions: any): Promise {\n const ds = this;\n const querydepth = ['servers', 'databases', 'databaseElements', 'elements'];\n if (typeof query === 'string') {\n query = JSON.parse(query as string);\n }\n if (queryOptions.isPiPoint) {\n query.path = this.templateSrv.replace(query.path, queryOptions);\n } else {\n if (query.path === '') {\n query.type = querydepth[0];\n } else {\n query.path = this.templateSrv.replace(query.path, queryOptions); // replace variables in the path\n query.path = query.path.split(';')[0]; // if the attribute is in the path, let's remote it\n if (query.type !== 'attributes') {\n query.type = querydepth[Math.max(0, Math.min(query.path.split('\\\\').length, querydepth.length - 1))];\n }\n }\n query.path = query.path.replace(/\\{([^\\\\])*\\}/gi, (r: string) => r.substring(1, r.length - 2).split(',')[0]);\n }\n\n query.filter = query.filter ?? '*';\n query.max = query.max ?? 10000;\n\n if (query.type === 'servers') {\n return ds.afserver?.name\n ? ds\n .getAssetServer(ds.afserver.name)\n .then((result: PiwebapiRsp) => [result])\n .then(metricQueryTransform)\n : ds.getAssetServers().then(metricQueryTransform);\n } else if (query.type === 'databases' && !!query.afServerWebId) {\n return ds.getDatabases(query.afServerWebId, {}).then(metricQueryTransform);\n } else if (query.type === 'databases') {\n return ds\n .getAssetServer(query.path)\n .then((server) => ds.getDatabases(server.WebId ?? '', {}))\n .then(metricQueryTransform);\n } else if (query.type === 'databaseElements') {\n return ds\n .getDatabase(query.path)\n .then((db) =>\n ds.getDatabaseElements(db.WebId ?? '', {\n selectedFields: 'Items.WebId%3BItems.Name%3BItems.Items%3BItems.Path%3BItems.HasChildren',\n })\n )\n .then(metricQueryTransform);\n } else if (query.type === 'elements') {\n return ds\n .getElement(query.path)\n .then((element) =>\n ds.getElements(element.WebId ?? '', {\n selectedFields:\n 'Items.Description%3BItems.WebId%3BItems.Name%3BItems.Items%3BItems.Path%3BItems.HasChildren',\n nameFilter: query.filter,\n })\n )\n .then(metricQueryTransform);\n } else if (query.type === 'attributes') {\n return ds\n .getElement(query.path)\n .then((element) =>\n ds.getAttributes(element.WebId ?? '', {\n searchFullHierarchy: 'true',\n selectedFields:\n 'Items.Type%3BItems.DefaultUnitsName%3BItems.Description%3BItems.WebId%3BItems.Name%3BItems.Path',\n nameFilter: query.filter,\n maxCount: query.max,\n })\n )\n .then(metricQueryTransform);\n } else if (query.type === 'dataserver') {\n return ds.getDataServers().then(metricQueryTransform);\n } else if (query.type === 'pipoint') {\n return ds.piPointSearch(query.webId, query.pointName).then(metricQueryTransform);\n }\n return Promise.reject('Bad type');\n }\n\n /** PRIVATE SECTION */\n\n /**\n * Builds the PIWebAPI query parameters.\n *\n * @param {any} options - Grafana query and panel options.\n * @returns - PIWebAPI query parameters.\n *\n * @memberOf PiWebApiDatasource\n */\n private buildQueryParameters(options: DataQueryRequest) {\n options.targets = filter(options.targets, (target) => {\n if (!target || !target.target || target.attributes?.length === 0 || target.target === ';' || !!target.hide) {\n return false;\n }\n return !target.target.startsWith('Select AF');\n });\n\n if (options.maxDataPoints) {\n options.maxDataPoints = options.maxDataPoints > 30000 ? 30000 : options.maxDataPoints;\n }\n options.targets = map(options.targets, (target) => {\n const tar = {\n enableStreaming: target.enableStreaming,\n target: this.templateSrv.replace(target.target, options.scopedVars),\n elementPath: this.templateSrv.replace(target.elementPath, options.scopedVars),\n attributes: map(target.attributes, (att) => {\n if (att.value) {\n att.value.value = this.templateSrv.replace(att.value.value, options.scopedVars);\n }\n return att;\n }),\n segments: map(target.segments, (att) => {\n if (att.value) {\n att.value.value = this.templateSrv.replace(att.value.value, options.scopedVars);\n }\n return att;\n }),\n isAnnotation: !!target.isAnnotation,\n display: !!target.display ? this.templateSrv.replace(target.display, options.scopedVars) : undefined,\n refId: target.refId,\n hide: target.hide,\n interpolate: !!target.interpolate\n ? {\n ...target.interpolate,\n interval: this.templateSrv.replace(target.interpolate.interval, options.scopedVars),\n }\n : { enable: false },\n useLastValue: target.useLastValue || { enable: false },\n useUnit: target.useUnit || { enable: false },\n recordedValues: target.recordedValues || { enable: false },\n digitalStates: target.digitalStates || { enable: false },\n webid: target.webid ?? '',\n regex: target.regex || { enable: false },\n expression: target.expression || '',\n summary: target.summary || { enable: false, types: [] },\n nodata: target.nodata,\n startTime: options.range.from,\n endTime: options.range.to,\n isPiPoint: !!target.isPiPoint,\n hideError: !!target.hideError,\n scopedVars: options.scopedVars,\n };\n\n if (tar.expression) {\n tar.expression = this.templateSrv.replace(tar.expression, options.scopedVars);\n }\n\n if (tar.summary.enable && tar.summary.types !== undefined) {\n tar.summary.types = filter(tar.summary.types, (item) => {\n return item !== undefined && item !== null && item !== '';\n });\n tar.summary.duration = !!tar.summary.duration\n ? this.templateSrv.replace(tar.summary.duration, options.scopedVars)\n : tar.summary.duration;\n tar.summary.sampleTypeInterval = !!tar.summary.sampleTypeInterval;\n tar.summary.sampleInterval = !!tar.summary.sampleInterval\n ? this.templateSrv.replace(tar.summary.sampleInterval, options.scopedVars)\n : tar.summary.sampleInterval;\n }\n\n return tar;\n });\n\n return options;\n }\n\n /**\n * Localize the eventFrame dataFrame records to Grafana Annotations.\n * @param {any} annon - The annotation object.\n * @param {any} data - The dataframe recrords.\n * @returns - Grafana Annotation\n *\n * @memberOf PiWebApiDatasource\n */\n private eventFrameToAnnotation(annon: AnnotationQuery, data: DataFrame[]): AnnotationEvent[] {\n const annotationOptions = annon.target!;\n const events: AnnotationEvent[] = [];\n const currentLocale = Intl.DateTimeFormat().resolvedOptions().locale;\n\n data.forEach((d: DataFrame) => {\n let values = this.transformDataFrameToMap(d);\n for (let i = 0; i < values['time'].length; i++) {\n // replace Dataframe name using Regex\n let title = values['title'][i];\n if (annotationOptions.regex && annotationOptions.regex.enable) {\n title = title.replace(new RegExp(annotationOptions.regex.search), annotationOptions.regex.replace);\n }\n\n // test if timeEnd is negative and if so, set it to null\n if (values['timeEnd'][i] < 0) {\n values['timeEnd'][i] = null;\n }\n\n // format the text and localize the dates to browser locale\n let text = 'Tag: ' + title;\n if (annotationOptions.attribute && annotationOptions.attribute.enable) {\n text += values['attributeText'][i];\n }\n text += '
Start: ' + new Date(values['time'][i]).toLocaleString(currentLocale) + '
End: ';\n\n if (values['timeEnd'][i]) {\n text += new Date(values['timeEnd'][i]).toLocaleString(currentLocale);\n } else {\n text += 'Eventframe is open';\n }\n\n const event: AnnotationEvent = {\n time: values['time'][i],\n timeEnd: !!annotationOptions.showEndTime ? values['timeEnd'][i] : undefined,\n title: title,\n id: values['id'][i],\n text: text,\n tags: ['OSISoft PI'],\n };\n\n events.push(event);\n }\n });\n return events;\n }\n\n /**\n *\n */\n private transformDataFrameToMap(dataFrame: DataFrame): Record {\n const map: Record = {};\n\n dataFrame.fields.forEach((field) => {\n map[field.name] = field.values.toArray();\n });\n\n return map;\n }\n\n /**\n * Abstraction for calling the PI Web API REST endpoint\n *\n * @param {any} path - the path to append to the base server URL.\n * @returns - The full URL.\n *\n * @memberOf PiWebApiDatasource\n */\n private restGet(path: string): Promise {\n return this.getResource(`${path}`).then((response: any) => {\n return response as PiwebapiRsp;\n });\n }\n\n // Get a list of all data (PI) servers\n private getDataServers(): Promise {\n return this.restGet('/dataservers').then((response) => response.Items ?? []);\n }\n private getDataServer(name: string | undefined): Promise {\n if (!name) {\n return Promise.resolve({});\n }\n return this.restGet('/dataservers?name=' + name).then((response) => response);\n }\n // Get a list of all asset (AF) servers\n private getAssetServers(): Promise {\n return this.restGet('/assetservers').then((response) => response.Items ?? []);\n }\n getAssetServer(name: string | undefined): Promise {\n if (!name) {\n return Promise.resolve({});\n }\n return this.restGet('/assetservers?path=\\\\\\\\' + name).then((response) => response);\n }\n getDatabase(path: string | undefined): Promise {\n if (!path) {\n return Promise.resolve({});\n }\n return this.restGet('/assetdatabases?path=\\\\\\\\' + path).then((response) => response);\n }\n getDatabases(serverId: string, options?: any): Promise {\n if (!serverId) {\n return Promise.resolve([]);\n }\n return this.restGet('/assetservers/' + serverId + '/assetdatabases').then((response) => response.Items ?? []);\n }\n getElement(path: string): Promise {\n if (!path) {\n return Promise.resolve({});\n }\n return this.restGet('/elements?path=\\\\\\\\' + path).then((response) => response);\n }\n getEventFrameTemplates(databaseId: string): Promise {\n if (!databaseId) {\n return Promise.resolve([]);\n }\n return this.restGet(\n '/assetdatabases/' + databaseId + '/elementtemplates?selectedFields=Items.InstanceType%3BItems.Name%3BItems.WebId'\n ).then((response) => {\n return filter(response.Items ?? [], (item) => item.InstanceType === 'EventFrame');\n });\n }\n getElementTemplates(databaseId: string): Promise {\n if (!databaseId) {\n return Promise.resolve([]);\n }\n return this.restGet(\n '/assetdatabases/' + databaseId + '/elementtemplates?selectedFields=Items.InstanceType%3BItems.Name%3BItems.WebId'\n ).then((response) => {\n return filter(response.Items ?? [], (item) => item.InstanceType === 'Element');\n });\n }\n\n /**\n * @description\n * Get the child attributes of the current resource.\n * GET attributes/{webId}/attributes\n * @param {string} elementId - The ID of the parent resource. See WebID for more information.\n * @param {Object} options - Query Options\n * @param {string} options.nameFilter - The name query string used for finding attributes. The default is no filter. See Query String for more information.\n * @param {string} options.categoryName - Specify that returned attributes must have this category. The default is no category filter.\n * @param {string} options.templateName - Specify that returned attributes must be members of this template. The default is no template filter.\n * @param {string} options.valueType - Specify that returned attributes' value type must be the given value type. The default is no value type filter.\n * @param {string} options.searchFullHierarchy - Specifies if the search should include attributes nested further than the immediate attributes of the searchRoot. The default is 'false'.\n * @param {string} options.sortField - The field or property of the object used to sort the returned collection. The default is 'Name'.\n * @param {string} options.sortOrder - The order that the returned collection is sorted. The default is 'Ascending'.\n * @param {string} options.startIndex - The starting index (zero based) of the items to be returned. The default is 0.\n * @param {string} options.showExcluded - Specified if the search should include attributes with the Excluded property set. The default is 'false'.\n * @param {string} options.showHidden - Specified if the search should include attributes with the Hidden property set. The default is 'false'.\n * @param {string} options.maxCount - The maximum number of objects to be returned per call (page size). The default is 1000.\n * @param {string} options.selectedFields - List of fields to be returned in the response, separated by semicolons (;). If this parameter is not specified, all available fields will be returned. See Selected Fields for more information.\n */\n private getAttributes(elementId: string, options: any): Promise {\n let querystring =\n '?' +\n map(options, (value, key) => {\n return key + '=' + value;\n }).join('&');\n\n if (querystring === '?') {\n querystring = '';\n }\n\n return this.restGet('/elements/' + elementId + '/attributes' + querystring).then(\n (response) => response.Items ?? []\n );\n }\n\n /**\n * @description\n * Retrieve elements based on the specified conditions. By default, this method selects immediate children of the current resource.\n * Users can search for the elements based on specific search parameters. If no parameters are specified in the search, the default values for each parameter will be used and will return the elements that match the default search.\n * GET assetdatabases/{webId}/elements\n * @param {string} databaseId - The ID of the parent resource. See WebID for more information.\n * @param {Object} options - Query Options\n * @param {string} options.webId - The ID of the resource to use as the root of the search. See WebID for more information.\n * @param {string} options.nameFilter - The name query string used for finding objects. The default is no filter. See Query String for more information.\n * @param {string} options.categoryName - Specify that returned elements must have this category. The default is no category filter.\n * @param {string} options.templateName - Specify that returned elements must have this template or a template derived from this template. The default is no template filter.\n * @param {string} options.elementType - Specify that returned elements must have this type. The default type is 'Any'. See Element Type for more information.\n * @param {string} options.searchFullHierarchy - Specifies if the search should include objects nested further than the immediate children of the searchRoot. The default is 'false'.\n * @param {string} options.sortField - The field or property of the object used to sort the returned collection. The default is 'Name'.\n * @param {string} options.sortOrder - The order that the returned collection is sorted. The default is 'Ascending'.\n * @param {number} options.startIndex - The starting index (zero based) of the items to be returned. The default is 0.\n * @param {number} options.maxCount - The maximum number of objects to be returned per call (page size). The default is 1000.\n * @param {string} options.selectedFields - List of fields to be returned in the response, separated by semicolons (;). If this parameter is not specified, all available fields will be returned. See Selected Fields for more information.\n */\n private getDatabaseElements(databaseId: string, options: any): Promise {\n let querystring =\n '?' +\n map(options, (value, key) => {\n return key + '=' + value;\n }).join('&');\n\n if (querystring === '?') {\n querystring = '';\n }\n\n return this.restGet('/assetdatabases/' + databaseId + '/elements' + querystring).then(\n (response) => response.Items ?? []\n );\n }\n\n /**\n * @description\n * Retrieve elements based on the specified conditions. By default, this method selects immediate children of the current resource.\n * Users can search for the elements based on specific search parameters. If no parameters are specified in the search, the default values for each parameter will be used and will return the elements that match the default search.\n * GET elements/{webId}/elements\n * @param {string} databaseId - The ID of the resource to use as the root of the search. See WebID for more information.\n * @param {Object} options - Query Options\n * @param {string} options.webId - The ID of the resource to use as the root of the search. See WebID for more information.\n * @param {string} options.nameFilter - The name query string used for finding objects. The default is no filter. See Query String for more information.\n * @param {string} options.categoryName - Specify that returned elements must have this category. The default is no category filter.\n * @param {string} options.templateName - Specify that returned elements must have this template or a template derived from this template. The default is no template filter.\n * @param {string} options.elementType - Specify that returned elements must have this type. The default type is 'Any'. See Element Type for more information.\n * @param {string} options.searchFullHierarchy - Specifies if the search should include objects nested further than the immediate children of the searchRoot. The default is 'false'.\n * @param {string} options.sortField - The field or property of the object used to sort the returned collection. The default is 'Name'.\n * @param {string} options.sortOrder - The order that the returned collection is sorted. The default is 'Ascending'.\n * @param {number} options.startIndex - The starting index (zero based) of the items to be returned. The default is 0.\n * @param {number} options.maxCount - The maximum number of objects to be returned per call (page size). The default is 1000.\n * @param {string} options.selectedFields - List of fields to be returned in the response, separated by semicolons (;). If this parameter is not specified, all available fields will be returned. See Selected Fields for more information.\n */\n private getElements(elementId: string, options: any): Promise {\n let querystring =\n '?' +\n map(options, (value, key) => {\n return key + '=' + value;\n }).join('&');\n\n if (querystring === '?') {\n querystring = '';\n }\n\n return this.restGet('/elements/' + elementId + '/elements' + querystring).then(\n (response) => response.Items ?? []\n );\n }\n\n /**\n * Retrieve a list of points on a specified Data Server.\n *\n * @param {string} serverId - The ID of the server. See WebID for more information.\n * @param {string} nameFilter - A query string for filtering by point name. The default is no filter. *, ?, [ab], [!ab]\n */\n private piPointSearch(serverId: string, nameFilter: string): Promise {\n let filter1 = this.templateSrv.replace(nameFilter);\n let filter2 = `${filter1}`;\n let doFilter = false;\n if (filter1 !== nameFilter) {\n const regex = /\\{(\\w|,)+\\}/g;\n let m;\n while ((m = regex.exec(filter1)) !== null) {\n // This is necessary to avoid infinite loops with zero-width matches\n if (m.index === regex.lastIndex) {\n regex.lastIndex++;\n }\n\n // The result can be accessed through the `m`-variable.\n m.forEach((match, groupIndex) => {\n if (groupIndex === 0) {\n filter1 = filter1.replace(match, match.replace('{', '(').replace('}', ')').replace(',', '|'));\n filter2 = filter2.replace(match, '*');\n doFilter = true;\n }\n });\n }\n }\n return this.restGet('/dataservers/' + serverId + '/points?maxCount=100&nameFilter=' + filter2).then((results) => {\n if (!!results && !!results?.Items) {\n return doFilter ? results.Items.filter((item) => item.Name?.match(filter1)) : results.Items;\n }\n return [];\n });\n }\n}\n","import { DataSourcePlugin } from '@grafana/data';\nimport { PIWebAPIConfigEditor } from './config/ConfigEditor';\nimport { PIWebAPIQueryEditor } from './query/QueryEditor';\nimport { PiWebAPIDatasource } from './datasource';\nimport { PIWebAPIQuery, PIWebAPIDataSourceJsonData } from './types';\n\nexport const plugin = new DataSourcePlugin(\n PiWebAPIDatasource\n)\n .setQueryEditor(PIWebAPIQueryEditor)\n .setConfigEditor(PIWebAPIConfigEditor);\n"],"names":["module","exports","__WEBPACK_EXTERNAL_MODULE__781__","__WEBPACK_EXTERNAL_MODULE__531__","__WEBPACK_EXTERNAL_MODULE__7__","__WEBPACK_EXTERNAL_MODULE__241__","__WEBPACK_EXTERNAL_MODULE__959__","__WEBPACK_EXTERNAL_MODULE__269__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","FormField","LegacyForms","coerceOptions","options","jsonData","url","PIWebAPIConfigEditor","PureComponent","render","originalOptions","this","props","div","DataSourceHttpSettings","defaultUrl","dataSourceConfig","onChange","onHttpOptionsChange","showAccessOptions","h3","className","InlineField","label","labelWidth","InlineSwitch","pipoint","onPiPointChange","newFormat","onNewFormatChange","useUnit","onUseUnitChange","useExperimental","onUseExperimentalChange","useStreaming","onUseStreamingChange","inputWidth","onPIServerChange","piserver","placeholder","onAFServerChange","afserver","onAFDatabaseChange","afdatabase","event","onOptionsChange","target","checked","QueryField","tooltip","children","InlineFormLabel","width","QueryRowTerminator","QueryInlineField","QueryEditorRow","QueryRawInlineField","QueryRawEditorRow","defaultQuery","attributes","segments","regex","enable","nodata","summary","types","basis","duration","sampleTypeInterval","sampleInterval","expression","interpolate","useLastValue","recordedValues","boundaryType","digitalStates","enableStreaming","isPiPoint","QueryEditorModeSwitcher","isRaw","isModalOpen","setModalOpen","useState","useEffect","Button","aria-label","icon","variant","type","onClick","ConfirmModal","isOpen","title","body","confirmText","dismissText","onConfirm","onDismiss","metricQueryTransform","response","map","item","text","Name","expandable","HasChildren","Path","split","length","Items","WebId","LABEL_WIDTH","MIN_ATTR_INPUT_WIDTH","REMOVE_LABEL","CustomLabelComponent","style","marginRight","Icon","name","PIWebAPIQueryEditor","isValueEmpty","calcBasisValueChanged","segment","metricsQuery","query","getCalcBasisSegments","calculationBasis","recordedBoundaryTypeValueChanged","getRecordedBoundaryTypeSegments","recordedBoundaryTypes","calcNoDataValueChanged","getNoDataSegments","noDataReplacement","onSummaryValueChanged","index","summaries","state","slice","splice","setState","stateCallback","getSummarySegments","summaryTypes","filter","s","indexOf","unshift","removeSummary","part","onSummaryAction","selectableValue","push","summarySegment","removeAttribute","attributeChangeValue","onAttributeAction","Array","isArray","String","match","getSegmentPathUpTo","arr","reduce","result","startsWith","checkAttributeSegments","data","datasource","ctrl","findQuery","path","metricFindQuery","assign","request","scopedVars","then","attributesResponse","validAttributes","each","attribute","substring","filteredAttributes","attrib","changedValue","templateSrv","replace","availableAttributes","catch","err","error","message","checkPiPointSegments","webId","getSelectedPIServer","pointName","webID","piServer","forEach","parts","textEditorChanged","splitAttributes","splitElements","_","getElementSegments","elements","updateArray","rawQuery","checkAfServer","queryProps","onRunQuery","defaults","hideError","display","piPointConfig","onIsPiPointChange","InlineFieldRow","grow","Input","onBlur","SegmentAsync","Component","onSegmentChange","loadOptions","allowCustomValue","inputMinWidth","disabled","getAttributeSegmentsPI","reloadOptionsOnChange","Segment","onAttributeChange","getAttributeSegmentsAF","attributeSegment","onHideErrorChange","useUnitConfig","interval","maxNumber","parseInt","search","constructor","super","calculationBasisSegment","noDataReplacementSegment","segmentChangeValue","Promise","resolve","remove","currentSegment","afServerWebId","items","altSegments","variables","getVariables","variable","attributeText","forOwn","val","buildFromTarget","segmentsArray","attributesArray","summariesArray","cb","scopedVarsDone","componentDidMount","initialLoad","componentDidUpdate","force","_segmentsArray","e","console","elementPath","tr","join","parseRawQuery","isValidQuery","trim","targetSplit","queryChange","bind","PiWebAPIAnnotationsQueryEditor","memo","annotation","afWebId","setAfWebId","database","setDatabase","getValue","getAssetServer","AsyncSelect","getDatabases","dbs","loadingMessage","template","defaultOptions","getEventFrameTemplates","templ","showEndTime","currentTarget","categoryName","nameFilter","PiWebAPIDatasource","DataSourceWithBackend","applyTemplateVariables","targets","isAnnotation","buildQueryParameters","of","queryOptions","ds","querydepth","JSON","parse","Math","max","min","getAssetServers","server","getDatabase","db","getDatabaseElements","selectedFields","getElement","element","getElements","getAttributes","searchFullHierarchy","maxCount","getDataServers","piPointSearch","reject","hide","maxDataPoints","tar","att","refId","webid","startTime","range","from","endTime","to","annon","annotationOptions","events","currentLocale","Intl","DateTimeFormat","resolvedOptions","locale","values","transformDataFrameToMap","i","RegExp","Date","toLocaleString","time","timeEnd","id","tags","dataFrame","fields","field","toArray","getResource","restGet","getDataServer","serverId","databaseId","InstanceType","getElementTemplates","elementId","querystring","filter1","filter2","doFilter","m","exec","lastIndex","groupIndex","results","instanceSettings","getTemplateSrv","newFormatConfig","annotations","QueryEditor","prepareQuery","anno","queryType","processEvents","eventFrameToAnnotation","all","plugin","DataSourcePlugin","setQueryEditor","setConfigEditor"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/plugin.json b/dist/plugin.json index 703d0ad..4679431 100644 --- a/dist/plugin.json +++ b/dist/plugin.json @@ -40,7 +40,7 @@ {"name": "Annotations Editor", "path": "img/annotations.png"} ], "version": "5.1.0", - "updated": "2024-08-13" + "updated": "2024-09-06" }, "dependencies": { "grafanaDependency": ">=10.1.0", diff --git a/pkg/plugin/annotation_query.go b/pkg/plugin/annotation_query.go index d40c3fb..c700d71 100644 --- a/pkg/plugin/annotation_query.go +++ b/pkg/plugin/annotation_query.go @@ -80,7 +80,8 @@ func (d *Datasource) processAnnotationQuery(ctx context.Context, query backend.D } func (q PiProcessedAnnotationQuery) getTimeRangeURIComponent() string { - return "&startTime=" + q.TimeRange.From.UTC().Format(time.RFC3339) + "&endTime=" + q.TimeRange.To.UTC().Format(time.RFC3339) + return "&startTime=" + q.TimeRange.From.UTC().Truncate(time.Second).Format(time.RFC3339) + + "&endTime=" + q.TimeRange.To.UTC().Truncate(time.Second).Format(time.RFC3339) } // getEventFrameQueryURL returns the URI for the event frame query diff --git a/pkg/plugin/datasource.go b/pkg/plugin/datasource.go index d39fa9b..cce726e 100644 --- a/pkg/plugin/datasource.go +++ b/pkg/plugin/datasource.go @@ -183,8 +183,8 @@ func (d *Datasource) QueryAnnotations(ctx context.Context, req *backend.QueryDat trace.WithAttributes( attribute.String("query.ref_id", q.RefID), attribute.String("query.type", q.QueryType), - attribute.Int64("query.time_range.from", q.TimeRange.From.Unix()), - attribute.Int64("query.time_range.to", q.TimeRange.To.Unix()), + attribute.Int64("query.time_range.from", q.TimeRange.From.Truncate(time.Second).Unix()), + attribute.Int64("query.time_range.to", q.TimeRange.To.Truncate(time.Second).Unix()), ), ) diff --git a/pkg/plugin/helpers.go b/pkg/plugin/helpers.go index 577e320..e1b0af6 100644 --- a/pkg/plugin/helpers.go +++ b/pkg/plugin/helpers.go @@ -373,6 +373,7 @@ func getDataLabels(useNewFormat bool, q *PiProcessedQuery, pointType string, sum } else { label = targetParts[len(targetParts)-1] } + label += summaryLabel } if q.IsPIPoint { @@ -413,7 +414,7 @@ func convertItemsToDataFrame(processedQuery *PiProcessedQuery, d *Datasource, Su webID := processedQuery.WebID includeMetaData := processedQuery.UseUnit digitalStates := processedQuery.DigitalStates - noDataReplace := processedQuery.getSummaryNoDataReplace() + noDataReplace := processedQuery.getNoDataReplace() digitalStateValues := make([]string, 0) sliceType := d.getTypeForWebID(webID) @@ -518,7 +519,7 @@ func convertItemsToDataFrame(processedQuery *PiProcessedQuery, d *Datasource, Su // in the slice type, or values that are not "good" valuepointers := convertSliceToPointers(fP.values, fP.badValues) - timeField := data.NewField("time", nil, fP.timestamps) + timeField := data.NewField("Time", nil, fP.timestamps) if !digitalState || !digitalStates { valueField := data.NewField(frameLabel["name"], labels, valuepointers) frame.Fields = append(frame.Fields, diff --git a/pkg/plugin/timeseries_query.go b/pkg/plugin/timeseries_query.go index e12e6db..04a0a47 100644 --- a/pkg/plugin/timeseries_query.go +++ b/pkg/plugin/timeseries_query.go @@ -99,6 +99,7 @@ func (d *Datasource) processQuery(query backend.DataQuery, datasourceUID string) DigitalStates: DigitalStates, Display: PiQuery.Pi.Display, Regex: PiQuery.Pi.Regex, + Nodata: PiQuery.Pi.Nodata, Summary: PiQuery.Pi.Summary, Variable: PiQuery.Pi.getVariable(i), Index: (j + 1) + 100*(i+1), @@ -321,10 +322,10 @@ func (q *PIWebAPIQuery) isSummary() bool { if q.Summary == nil { return false } - if q.Summary.Types == nil { + if q.Summary.Enable == nil { return false } - return *q.Summary.Basis != "" && len(*q.Summary.Types) > 0 + return *q.Summary.Enable && *q.Summary.Basis != "" && len(*q.Summary.Types) > 0 } // PiProcessedQuery isRegex returns true if the query is a regex query and is enabled @@ -364,17 +365,28 @@ func (q *PiProcessedQuery) isRegexQuery() bool { // A default of 30s is returned if the summary duration is not provided by the frontend // or if the format is invalid func (q *PIWebAPIQuery) getSummaryDuration() string { + backend.Logger.Debug("Summary duration", "summary", q.Summary) // Return the default value if the summary is not provided by the frontend - if q.Summary == nil || *q.Summary.Interval == "" { + if q.Summary == nil || q.Summary.Duration == nil || *q.Summary.Duration == "" { return "30s" } + return _getDurationBase(*q.Summary.Duration) +} - // If the summary duration is provided, then validate the format piwebapi expects +func (q *PIWebAPIQuery) getSampleInterval() string { + // Return the default value if the summary is not provided by the frontend + if q.Summary == nil || q.Summary.SampleInterval == nil || *q.Summary.SampleInterval == "" { + return "30s" + } + return _getDurationBase(*q.Summary.SampleInterval) +} +func _getDurationBase(duration string) string { + // If the summary duration is provided, then validate the format piwebapi expects // Regular expression to match the format: pattern := `^(\d+(\.\d+)?)\s*(ms|s|m|h|d|mo|w|wd|yd)$` re := regexp.MustCompile(pattern) - matches := re.FindStringSubmatch(*q.Summary.Interval) + matches := re.FindStringSubmatch(duration) if len(matches) != 4 { return "30s" // Return the default value if the format is invalid @@ -394,11 +406,11 @@ func (q *PIWebAPIQuery) getSummaryDuration() string { switch shortName { case "ms", "s", "m", "h": // Fractions allowed for millisecond, second, minute, and hour - return *q.Summary.Interval + return duration case "d", "mo", "w", "wd", "yd": // No fractions allowed for day, month, week, weekday, yearday if numericPart == float64(int64(numericPart)) { - return *q.Summary.Interval + return duration } default: return "30s" // Return the default value if the short name or fractions are not allowed @@ -413,7 +425,13 @@ func (q *PIWebAPIQuery) getSummaryURIComponent() string { uri += "&summaryType=" + t.Value.Value } uri += "&summaryBasis=" + *q.Summary.Basis - uri += "&summaryDuration=" + q.getSummaryDuration() + if q.Summary.Duration != nil && *q.Summary.Duration != "" { + uri += "&summaryDuration=" + q.getSummaryDuration() + } + if q.Summary.SampleTypeInterval != nil && *q.Summary.SampleTypeInterval && + q.Summary.SampleInterval != nil && *q.Summary.SampleInterval != "" { + uri += "&sampleType=Interval&sampleInterval=" + q.getSampleInterval() + } return uri } @@ -572,10 +590,7 @@ func (q Query) getQueryBaseURL() string { uri += "/times?time=" + q.getTimeRangeURIToComponent() } else { if q.Pi.isSummary() { - uri += "/summary" + q.getTimeRangeURIComponent() - if q.Pi.isInterpolated() { - uri += fmt.Sprintf("&sampleType=Interval&sampleInterval=%s", q.getIntervalTime()) - } + uri += "/summary" + q.getTimeRangeURIComponent() + q.Pi.getSummaryURIComponent() } else if q.Pi.isInterpolated() { uri += "/intervals" + q.getTimeRangeURIComponent() uri += fmt.Sprintf("&sampleInterval=%s", q.getIntervalTime()) @@ -597,8 +612,7 @@ func (q Query) getQueryBaseURL() string { } } else { if q.Pi.isSummary() { - uri += "/summary" + q.getTimeRangeURIComponent() + fmt.Sprintf("&intervals=%d", q.getMaxDataPoints()) - uri += q.Pi.getSummaryURIComponent() + uri += "/summary" + q.getTimeRangeURIComponent() + q.Pi.getSummaryURIComponent() } else if q.Pi.isInterpolated() { uri += "/interpolated" + q.getTimeRangeURIComponent() + fmt.Sprintf("&interval=%s", q.getIntervalTime()) } else if q.Pi.isRecordedValues() { @@ -609,5 +623,6 @@ func (q Query) getQueryBaseURL() string { uri += "&webId=" } } + backend.Logger.Debug("Base url", "uri", uri) return uri } diff --git a/pkg/plugin/timeseries_query_models.go b/pkg/plugin/timeseries_query_models.go index e8fb7ee..6fdc560 100644 --- a/pkg/plugin/timeseries_query_models.go +++ b/pkg/plugin/timeseries_query_models.go @@ -43,8 +43,8 @@ func (q *Query) getIntervalTime() string { func (q *Query) getWindowedTimeStampURI() string { // Potential Improvement: Make windowWidth a user input windowWidth := q.getMaxDataPoints() - fromTime := q.TimeRange.From - toTime := q.TimeRange.To + fromTime := q.TimeRange.From.Truncate(time.Second) + toTime := q.TimeRange.To.Truncate(time.Second) diff := toTime.Sub(fromTime).Nanoseconds() / int64(windowWidth) timeQuery := "time=" + fromTime.Format(time.RFC3339) @@ -60,11 +60,12 @@ func (q *Query) getWindowedTimeStampURI() string { } func (q *Query) getTimeRangeURIComponent() string { - return "?startTime=" + q.TimeRange.From.UTC().Format(time.RFC3339) + "&endTime=" + q.TimeRange.To.UTC().Format(time.RFC3339) + return "?startTime=" + q.TimeRange.From.UTC().Truncate(time.Second).Format(time.RFC3339) + + "&endTime=" + q.TimeRange.To.UTC().Truncate(time.Second).Format(time.RFC3339) } func (q *Query) getTimeRangeURIToComponent() string { - return q.TimeRange.To.UTC().Format(time.RFC3339) + return q.TimeRange.To.UTC().Truncate(time.Second).Format(time.RFC3339) } func (q *Query) isstreamingEnabled() bool { @@ -89,14 +90,11 @@ func (q *Query) isStreamable() bool { // return *q.Summary.Basis != "" && len(*q.Summary.Types) > 0 // } -func (q *PiProcessedQuery) getSummaryNoDataReplace() string { - if q.Summary == nil { +func (q *PiProcessedQuery) getNoDataReplace() string { + if q.Nodata == nil { return "" } - if q.Summary.Nodata == nil { - return "" - } - return *q.Summary.Nodata + return *q.Nodata } type PIWebAPIQuery struct { @@ -130,8 +128,9 @@ type PIWebAPIQuery struct { MaxNumber *int `json:"maxNumber"` BoundaryType *string `json:"boundaryType"` } `json:"recordedValues"` - RefID *string `json:"refId"` - Regex *Regex `json:"regex"` + RefID *string `json:"refId"` + Regex *Regex `json:"regex"` + Nodata *string `json:"nodata"` // Segments *[]string `json:"segments"` Summary *QuerySummary `json:"summary"` Target *string `json:"target"` @@ -142,10 +141,12 @@ type PIWebAPIQuery struct { } type QuerySummary struct { - Basis *string `json:"basis"` - Interval *string `json:"interval"` - Nodata *string `json:"nodata"` - Types *[]SummaryType `json:"types"` + Enable *bool `json:"enable"` + Basis *string `json:"basis"` + Duration *string `json:"duration"` + Types *[]SummaryType `json:"types"` + SampleTypeInterval *bool `json:"sampleTypeInterval"` + SampleInterval *string `json:"sampleInterval"` } type QueryPropertiesValue struct { @@ -197,6 +198,7 @@ type PiProcessedQuery struct { UseUnit bool `json:"UseUnit"` DigitalStates bool `json:"DigitalStates"` Display *string `json:"Display"` + Nodata *string `json:"Nodata"` Error error Index int Resource string diff --git a/src/datasource.ts b/src/datasource.ts index e7abb08..d23f5f8 100644 --- a/src/datasource.ts +++ b/src/datasource.ts @@ -251,7 +251,8 @@ export class PiWebAPIDatasource extends DataSourceWithBackend { return item !== undefined && item !== null && item !== ''; }); - tar.summary.interval = !!tar.summary.interval - ? this.templateSrv.replace(tar.summary.interval, options.scopedVars) - : tar.summary.interval; + tar.summary.duration = !!tar.summary.duration + ? this.templateSrv.replace(tar.summary.duration, options.scopedVars) + : tar.summary.duration; + tar.summary.sampleTypeInterval = !!tar.summary.sampleTypeInterval; + tar.summary.sampleInterval = !!tar.summary.sampleInterval + ? this.templateSrv.replace(tar.summary.sampleInterval, options.scopedVars) + : tar.summary.sampleInterval; } return tar; diff --git a/src/query/QueryEditor.tsx b/src/query/QueryEditor.tsx index f7b4fa8..40906f6 100644 --- a/src/query/QueryEditor.tsx +++ b/src/query/QueryEditor.tsx @@ -9,6 +9,7 @@ import { QueryInlineField, QueryRawInlineField, QueryRowTerminator } from '../co import { PIWebAPISelectableValue, PIWebAPIDataSourceJsonData, PIWebAPIQuery, defaultQuery } from '../types'; import { QueryEditorModeSwitcher } from 'components/QueryEditorModeSwitcher'; import { parseRawQuery } from 'helper'; +import { types } from '@babel/core'; const LABEL_WIDTH = 24; const LABEL_SWITCH_WIDTH = 49.067 / 8.0; @@ -188,11 +189,8 @@ export class PIWebAPIQueryEditor extends PureComponent { // no data change event calcNoDataValueChanged(segment: SelectableValue) { const metricsQuery = this.props.query as PIWebAPIQuery; - const summary = metricsQuery.summary; - if (summary) { - summary.nodata = segment.value?.value; - } - this.onChange({ ...metricsQuery, summary }); + const nodata = segment.value?.value; + this.onChange({ ...metricsQuery, nodata }); } // get no data user interface segments getNoDataSegments() { @@ -1076,6 +1074,7 @@ export class PIWebAPIQueryEditor extends PureComponent { isPiPoint, hideError, summary, + nodata, display, regex, } = metricsQuery; @@ -1257,8 +1256,8 @@ export class PIWebAPIQueryEditor extends PureComponent { Component={ } onChange={this.calcNoDataValueChanged} @@ -1302,7 +1301,7 @@ export class PIWebAPIQueryEditor extends PureComponent { )} - {!useLastValue.enable && !recordedValues.enable && ( + {(interpolate.enable || (!useLastValue.enable && !recordedValues.enable)) && ( { )} - {!useLastValue.enable && !interpolate.enable && ( + {(recordedValues.enable || (!useLastValue.enable && !interpolate.enable)) && ( { {!useLastValue.enable && ( - - ) => - onChange({ ...metricsQuery, summary: { ...summary, interval: event.target.value } }) + + + this.onChange({ + ...metricsQuery, + summary: { ...summary, enable: !(summary?.enable) }, + }) } - placeholder="30s" /> { { allowCustomValue /> - + {this.state.summaries.map((s: SelectableValue, index: number) => { return ( @@ -1456,6 +1457,53 @@ export class PIWebAPIQueryEditor extends PureComponent { )} + {summary?.enable && ( + + + + this.onChange({ ...metricsQuery, summary: { ...summary, sampleTypeInterval: !(summary?.sampleTypeInterval) } }) + } + /> + + + ) => + onChange({ ...metricsQuery, summary: { ...summary, sampleInterval: event.target.value } }) + } + placeholder="30s" + /> + + + ) => + onChange({ ...metricsQuery, summary: { ...summary, duration: event.target.value } }) + } + placeholder="30s" + /> + + + )} = { attributes: [], segments: [], regex: { enable: false }, - summary: { types: [], basis: 'EventWeighted', interval: '', nodata: 'Null' }, + nodata: 'Null', + summary: { + enable: false, + types: [], + basis: 'EventWeighted', + duration: '', + sampleTypeInterval: false, + sampleInterval: '' + }, expression: '', interpolate: { enable: false }, useLastValue: { enable: false }, From 2bbf59aaa7b8985674bfb521a041a0cf5efb1b00 Mon Sep 17 00:00:00 2001 From: Paulo Vitor Magacho Date: Thu, 19 Sep 2024 15:19:27 -0300 Subject: [PATCH 5/6] Fix remaining issues --- CHANGELOG.md | 7 ++++++- dist/plugin.json | 2 +- pkg/plugin/helpers.go | 33 ++++++++++++++++++--------------- pkg/plugin/timeseries_query.go | 1 - pkg/plugin/webidcache.go | 10 ++++++++++ 5 files changed, 35 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b71654a..64eaf64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,8 +48,13 @@ ## 5.1.0 -- Fixed an error in recorded max number of points +- Add units and description to new format - issue #154 +- Fixed digital state - issue #159 +- Fixed summary data - issue #160 +- Fixed an error in recorded max number of points - issue #162 + - Updated the query editor layout - Added boundary type support in recorded values - Recognize partial usage of variables in elements - Added configuration to hide API errors in panel +- Truncate time from grafana date time picker to seconds diff --git a/dist/plugin.json b/dist/plugin.json index 4679431..cf2fca9 100644 --- a/dist/plugin.json +++ b/dist/plugin.json @@ -40,7 +40,7 @@ {"name": "Annotations Editor", "path": "img/annotations.png"} ], "version": "5.1.0", - "updated": "2024-09-06" + "updated": "2024-09-19" }, "dependencies": { "grafanaDependency": ">=10.1.0", diff --git a/pkg/plugin/helpers.go b/pkg/plugin/helpers.go index e1b0af6..0c1f923 100644 --- a/pkg/plugin/helpers.go +++ b/pkg/plugin/helpers.go @@ -352,7 +352,8 @@ func compatible(actual reflect.Type, expected reflect.Type) bool { a == reflect.Float64) } -func getDataLabels(useNewFormat bool, q *PiProcessedQuery, pointType string, summaryLabel string) map[string]string { +func getDataLabels(useNewFormat bool, q *PiProcessedQuery, pointType string, description string, + units string, summaryLabel string) map[string]string { var frameLabel map[string]string summaryNewFormat := "" @@ -381,9 +382,11 @@ func getDataLabels(useNewFormat bool, q *PiProcessedQuery, pointType string, sum // PiPoint {element="PISERVER", name="Attribute", type="Float32"} targetParts := strings.Split(q.FullTargetPath, `\`) frameLabel = map[string]string{ - "element": targetParts[0], - "name": label, - "type": pointType + summaryNewFormat, + "element": targetParts[0], + "name": label, + "type": pointType + summaryNewFormat, + "description": description, + "units": units, } } else { // New format returns the full path with metadata @@ -391,9 +394,11 @@ func getDataLabels(useNewFormat bool, q *PiProcessedQuery, pointType string, sum targetParts := strings.Split(q.FullTargetPath, `\`) labelParts := strings.SplitN(targetParts[len(targetParts)-1], "|", 2) frameLabel = map[string]string{ - "element": labelParts[0], - "name": label, - "type": pointType + summaryNewFormat, + "element": labelParts[0], + "name": label, + "type": pointType + summaryNewFormat, + "description": description, + "units": units, } } @@ -428,7 +433,8 @@ func convertItemsToDataFrame(processedQuery *PiProcessedQuery, d *Datasource, Su } // get frame name - frameLabel := getDataLabels(d.isUsingNewFormat(), processedQuery, d.getPointTypeForWebID(webID), SummaryType) + frameLabel := getDataLabels(d.isUsingNewFormat(), processedQuery, d.getPointTypeForWebID(webID), + d.getDescriptionForWebID(webID), d.getUnitsForWebID(webID), SummaryType) var labels map[string]string var digitalState = d.getDigitalStateForWebID(webID) @@ -470,13 +476,10 @@ func convertItemsToDataFrame(processedQuery *PiProcessedQuery, d *Datasource, Su } } - // if the value isn't good, or is not the same type as the slice, - // add it to the list of bad values and nullify later - //TODO we should make this pattern match the query options - _, digitalState := item.Value.(map[string]interface{}) + _, digitalState = item.Value.(map[string]interface{}) if !item.isGood() { fP = updateBadData(i, fP, item.Timestamp, noDataReplace) - } else if digitalState { + } else if digitalState { // digital state var pds PointDigitalState if b, err := json.Marshal(item.Value); err == nil { if err := json.Unmarshal(b, &pds); err == nil { @@ -496,7 +499,7 @@ func convertItemsToDataFrame(processedQuery *PiProcessedQuery, d *Datasource, Su backend.Logger.Error("Error unmarshalling digital state", err) fP = updateBadData(i, fP, item.Timestamp, noDataReplace) } - } else if fP.val.Type().Kind() != fP.sliceType.Elem().Kind() { + } else if fP.val.Type().Kind() != fP.sliceType.Elem().Kind() { // mismatch - try conversion backend.Logger.Warn("Mismatch type", "ValKind", fP.val.Type().String(), "Val", fP.val.Interface(), "SliceKind", fP.sliceType.Elem().String(), "item", item) if compatible(fP.val.Type(), fP.sliceType.Elem()) { // try to convert if numeric values @@ -506,7 +509,7 @@ func convertItemsToDataFrame(processedQuery *PiProcessedQuery, d *Datasource, Su } else { fP = updateBadData(i, fP, item.Timestamp, noDataReplace) } - } else { + } else { // normal fP.timestamps = append(fP.timestamps, item.Timestamp) fP.values = reflect.Append(reflect.ValueOf(fP.values), fP.val).Interface() fP.prevVal = fP.val diff --git a/pkg/plugin/timeseries_query.go b/pkg/plugin/timeseries_query.go index 04a0a47..016bc29 100644 --- a/pkg/plugin/timeseries_query.go +++ b/pkg/plugin/timeseries_query.go @@ -623,6 +623,5 @@ func (q Query) getQueryBaseURL() string { uri += "&webId=" } } - backend.Logger.Debug("Base url", "uri", uri) return uri } diff --git a/pkg/plugin/webidcache.go b/pkg/plugin/webidcache.go index 84c3a69..17c08c5 100644 --- a/pkg/plugin/webidcache.go +++ b/pkg/plugin/webidcache.go @@ -66,6 +66,10 @@ func (w *WebIDResponsePiPoint) getUnits() string { return w.EngieeringUnits } +func (w *WebIDResponsePiPoint) getDescription() string { + return w.Description +} + // WebIDResponseAttribute is the response from the PI Web API when requesting an attribute. type WebIDResponseAttribute struct { WebID string `json:"WebId"` @@ -93,12 +97,17 @@ func (w *WebIDResponseAttribute) getUnits() string { return w.DefaultUnitsName } +func (w *WebIDResponseAttribute) getDescription() string { + return w.Description +} + // WebIDResponse is an interface for the WebID responses. type WebIDResponse interface { getType() string getWebID() string getDigitalSetName() string getUnits() string + getDescription() string } func (d *Datasource) getCachedWebID(path string) *WebIDCacheEntry { @@ -166,6 +175,7 @@ func (d *Datasource) _saveWebID(data interface{}, path string, isPiPoint bool) s ExpTime: time.Now().Add(d.webIDCache.duration), PointType: response.getType(), Units: response.getUnits(), + Description: response.getDescription(), } d.webIDCache.webIDCache[path] = entry From 76fc2b627cae14e06a713c9b8bb02264e74adfa2 Mon Sep 17 00:00:00 2001 From: Paulo Vitor Magacho Date: Sun, 22 Sep 2024 12:04:53 -0300 Subject: [PATCH 6/6] Use data frame time field name --- pkg/plugin/helpers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/plugin/helpers.go b/pkg/plugin/helpers.go index 0c1f923..43b1787 100644 --- a/pkg/plugin/helpers.go +++ b/pkg/plugin/helpers.go @@ -522,7 +522,7 @@ func convertItemsToDataFrame(processedQuery *PiProcessedQuery, d *Datasource, Su // in the slice type, or values that are not "good" valuepointers := convertSliceToPointers(fP.values, fP.badValues) - timeField := data.NewField("Time", nil, fP.timestamps) + timeField := data.NewField(data.TimeSeriesTimeFieldName, nil, fP.timestamps) if !digitalState || !digitalStates { valueField := data.NewField(frameLabel["name"], labels, valuepointers) frame.Fields = append(frame.Fields,