├── .config ├── .eslintrc ├── .prettierrc.js ├── Dockerfile ├── README.md ├── jest-setup.js ├── jest.config.js ├── jest │ ├── mocks │ │ └── react-inlinesvg.tsx │ └── utils.js ├── tsconfig.json ├── types │ └── custom.d.ts └── webpack │ ├── constants.ts │ ├── utils.ts │ └── webpack.config.ts ├── .eslintrc ├── .github.rem └── workflows │ ├── ci.yml │ ├── release darwin.yml │ ├── release linux.yml │ ├── release windows.yml │ └── release.yml ├── .gitignore ├── .nvmrc ├── .prettierrc.js ├── CHANGELOG.md ├── LICENSE ├── Makefile ├── README.md ├── appveyor.yml ├── azure-pipelines.yml ├── backend ├── .gitignore ├── .linux.build.csproj ├── .osx.build.csproj ├── .win.build.csproj ├── Alias.cs ├── ApplicationConfigurationFactory.cs ├── Converters.cs ├── DashboardData.cs ├── DashboardMappingData.cs ├── DashboardResolver.cs ├── DataFrame.cs ├── DataService.cs ├── DataValueSubscription.cs ├── Datasource.cs ├── DiagnosticsService.cs ├── EventDataResponse.cs ├── EventSubscription.cs ├── Interfaces │ └── IDashboardDb.cs ├── NanoTimestampArray.cs ├── OpcUAConnection.cs ├── Plugin.cs ├── Properties │ └── PublishProfiles │ │ ├── SetupProfile.pubxml │ │ └── SetupProfile.pubxml.user ├── Proto │ ├── Backend.cs │ └── BackendGrpc.cs ├── README.md ├── ReadRawKey.cs ├── ResourceService.cs ├── Sqlite.cs ├── StreamService.cs ├── SubscriptionReaper.cs ├── TraceLogConverter.cs ├── UaConstants.cs ├── ValueDataResponse.cs ├── appsettings.json ├── models │ └── settings.cs ├── plugin-dotnet.csproj └── plugin-dotnet.sln ├── cspell.config.json ├── docker-compose.yaml ├── docs └── sources │ └── _index.md ├── jest-setup.js ├── jest.config.js ├── omnisharp.json ├── package.json ├── proto ├── backend.orig ├── backend.proto └── generate.sh ├── scripts ├── ci-build-linux.sh ├── ci-build-plugin.sh ├── ci-build-windows.sh └── ci-package-plugin.sh ├── src ├── ConfigEditor.tsx ├── DataSource.ts ├── QueryEditor.tsx ├── components │ ├── AddEventFieldForm.tsx │ ├── AddEventFilter.tsx │ ├── BrowsePathEditor.tsx │ ├── BrowsePathTextEditor.tsx │ ├── BrowserDialog.tsx │ ├── BrowserTable.tsx │ ├── BrowserTree.tsx │ ├── ButtonCascader │ │ └── ButtonCascader.tsx │ ├── Cascader │ │ ├── Cascader.mdx │ │ ├── Cascader.tsx │ │ └── optionMappings.ts │ ├── EventFieldTable.tsx │ ├── EventFilterTable.tsx │ ├── EventQueryEditor.tsx │ ├── NodeEditor.tsx │ ├── NodeQueryEditor.tsx │ ├── NodeTextEditor.tsx │ ├── QualifiedNameEditor.tsx │ ├── SegmentFrame.tsx │ ├── SelectOptionGroup.tsx │ ├── ThemesGetter.tsx │ ├── TreeEditor.css │ ├── TreeEditor.tsx │ ├── TreeEditorDark.less │ ├── TreeEditorLight.less │ └── TreeNode.tsx ├── img │ ├── PrediktorLogo_thumb.png │ ├── dashboard1.png │ ├── dashboard2.png │ ├── logo.svg │ └── opc_logo.png ├── module.test.ts ├── module.ts ├── plugin.json ├── types.ts └── utils │ ├── CascaderOption.tsx │ ├── ConvertRemToPixels.tsx │ ├── EventColumn.ts │ ├── EventFilter.ts │ ├── NodeId.tsx │ ├── Nodeclass.ts │ ├── Operands.ts │ ├── Overlay.tsx │ └── QualifiedName.ts ├── tsconfig.json └── yarn.lock /.config/.eslintrc: -------------------------------------------------------------------------------- 1 | /* 2 | * ⚠️⚠️⚠️ THIS FILE WAS SCAFFOLDED BY `@grafana/create-plugin`. DO NOT EDIT THIS FILE DIRECTLY. ⚠️⚠️⚠️ 3 | * 4 | * In order to extend the configuration follow the steps in 5 | * https://grafana.com/developers/plugin-tools/create-a-plugin/extend-a-plugin/extend-configurations#extend-the-eslint-config 6 | */ 7 | { 8 | "extends": ["@grafana/eslint-config"], 9 | "root": true, 10 | "rules": { 11 | "react/prop-types": "off" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /.config/.prettierrc.js: -------------------------------------------------------------------------------- 1 | /* 2 | * ⚠️⚠️⚠️ THIS FILE WAS SCAFFOLDED BY `@grafana/create-plugin`. DO NOT EDIT THIS FILE DIRECTLY. ⚠️⚠️⚠️ 3 | * 4 | * In order to extend the configuration follow the steps in .config/README.md 5 | */ 6 | 7 | module.exports = { 8 | "endOfLine": "auto", 9 | "printWidth": 120, 10 | "trailingComma": "es5", 11 | "semi": true, 12 | "jsxSingleQuote": false, 13 | "singleQuote": true, 14 | "useTabs": false, 15 | "tabWidth": 2 16 | }; -------------------------------------------------------------------------------- /.config/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG grafana_version=latest 2 | ARG grafana_image=grafana-enterprise 3 | 4 | FROM grafana/${grafana_image}:${grafana_version} 5 | 6 | # Make it as simple as possible to access the grafana instance for development purposes 7 | # Do NOT enable these settings in a public facing / production grafana instance 8 | ENV GF_AUTH_ANONYMOUS_ORG_ROLE "Admin" 9 | ENV GF_AUTH_ANONYMOUS_ENABLED "true" 10 | ENV GF_AUTH_BASIC_ENABLED "false" 11 | # Set development mode so plugins can be loaded without the need to sign 12 | ENV GF_DEFAULT_APP_MODE "development" 13 | 14 | # Inject livereload script into grafana index.html 15 | USER root 16 | RUN sed -i 's/<\/body><\/html>/