├── .config
└── dotnet-tools.json
├── .dockerignore
├── .github
└── workflows
│ └── docker-publish.yml
├── .gitignore
├── Controllers
└── DashboardController.cs
├── Dockerfile
├── Encoding
├── DataSet.cs
├── DataSetDecodeErrorEventArgs.cs
├── Enums.cs
├── Field.cs
├── JsonDataSetMessage.cs
├── JsonNetworkMessage.cs
├── UaDataSetMessage.cs
├── UaNetworkMessage.cs
├── UadpDataSetMessage.cs
└── UadpNetworkMessage.cs
├── Interfaces
├── IMessageProcessor.cs
└── ISubscriber.cs
├── KafkaSubscriber.cs
├── LICENSE
├── MQTTSubscriber.cs
├── Models
└── ErrorViewModel.cs
├── Program.cs
├── Properties
├── ServiceDependencies
│ ├── connected-factory-showcase - Web Deploy
│ │ └── profile.arm.json
│ └── connected-factory-showcase-achema-opcua-dashboard - Web Deploy
│ │ └── profile.arm.json
└── launchSettings.json
├── README.md
├── Startup.cs
├── StatusHub.cs
├── UACloudDashboard.csproj
├── UACloudDashboard.sln
├── UAPubSubMessageProcessor.cs
├── Views
├── Dashboard
│ ├── Graph.cshtml
│ ├── Index.cshtml
│ └── Privacy.cshtml
├── Shared
│ ├── Error.cshtml
│ ├── _Layout.cshtml
│ └── _ValidationScriptsPartial.cshtml
├── _ViewImports.cshtml
└── _ViewStart.cshtml
├── appsettings.Development.json
├── appsettings.json
├── libman.json
└── wwwroot
├── 2mag_logo.png
├── Agilent_Logo.png
├── Beckhoff_Logo.png
├── Berthold.jpg
├── Byonoy_Logo.png
├── FHI.png
├── Gefran.png
├── INTEGRIS LIMS_Logo.png
├── JAIMA.png
├── JULABO_LOGO_bei_Einsatz_mit_weisem_Hintergrund.png
├── KUKA.png
├── Logoeslogan.jpg
├── OPCUA.png
├── SPECTARIS_Dachmarke_CMYK.jpg
├── amensio.png
├── brand.png
├── css
├── 32px.png
├── 40px.png
├── site.css
├── style.min.css
└── throbber.gif
├── essentim.png
├── favicon.ico
├── gambica_logo.png
├── inforsht.png
├── infoteam_2x_4c_rgb_Logo.png
├── inray.png
├── js
├── aspnet-signalr
│ ├── signalr.js
│ └── signalr.min.js
└── site.js
├── labforward.png
├── labmas.png
├── lads.png
├── lib
├── Chart.js
│ ├── chart.esm.js
│ ├── chart.esm.min.js
│ ├── chart.js
│ ├── chart.min.js
│ ├── helpers.esm.js
│ ├── helpers.esm.min.js
│ └── utils.js
├── bootstrap-table
│ ├── bootstrap-table-locale-all.js
│ ├── bootstrap-table-locale-all.min.js
│ ├── bootstrap-table-vue.esm.js
│ ├── bootstrap-table-vue.esm.min.js
│ ├── bootstrap-table-vue.js
│ ├── bootstrap-table-vue.min.js
│ ├── bootstrap-table.css
│ ├── bootstrap-table.js
│ ├── bootstrap-table.min.css
│ ├── bootstrap-table.min.js
│ ├── extensions
│ │ ├── addrbar
│ │ │ ├── bootstrap-table-addrbar.js
│ │ │ └── bootstrap-table-addrbar.min.js
│ │ ├── auto-refresh
│ │ │ ├── bootstrap-table-auto-refresh.js
│ │ │ └── bootstrap-table-auto-refresh.min.js
│ │ ├── cookie
│ │ │ ├── bootstrap-table-cookie.js
│ │ │ └── bootstrap-table-cookie.min.js
│ │ ├── copy-rows
│ │ │ ├── bootstrap-table-copy-rows.js
│ │ │ └── bootstrap-table-copy-rows.min.js
│ │ ├── custom-view
│ │ │ ├── bootstrap-table-custom-view.js
│ │ │ └── bootstrap-table-custom-view.min.js
│ │ ├── defer-url
│ │ │ ├── bootstrap-table-defer-url.js
│ │ │ └── bootstrap-table-defer-url.min.js
│ │ ├── editable
│ │ │ ├── bootstrap-table-editable.js
│ │ │ └── bootstrap-table-editable.min.js
│ │ ├── export
│ │ │ ├── bootstrap-table-export.js
│ │ │ └── bootstrap-table-export.min.js
│ │ ├── filter-control
│ │ │ ├── bootstrap-table-filter-control.css
│ │ │ ├── bootstrap-table-filter-control.js
│ │ │ ├── bootstrap-table-filter-control.min.css
│ │ │ ├── bootstrap-table-filter-control.min.js
│ │ │ ├── utils.js
│ │ │ └── utils.min.js
│ │ ├── fixed-columns
│ │ │ ├── bootstrap-table-fixed-columns.css
│ │ │ ├── bootstrap-table-fixed-columns.js
│ │ │ ├── bootstrap-table-fixed-columns.min.css
│ │ │ └── bootstrap-table-fixed-columns.min.js
│ │ ├── group-by-v2
│ │ │ ├── bootstrap-table-group-by.css
│ │ │ ├── bootstrap-table-group-by.js
│ │ │ ├── bootstrap-table-group-by.min.css
│ │ │ └── bootstrap-table-group-by.min.js
│ │ ├── i18n-enhance
│ │ │ ├── bootstrap-table-i18n-enhance.js
│ │ │ └── bootstrap-table-i18n-enhance.min.js
│ │ ├── key-events
│ │ │ ├── bootstrap-table-key-events.js
│ │ │ └── bootstrap-table-key-events.min.js
│ │ ├── mobile
│ │ │ ├── bootstrap-table-mobile.js
│ │ │ └── bootstrap-table-mobile.min.js
│ │ ├── multiple-sort
│ │ │ ├── bootstrap-table-multiple-sort.js
│ │ │ └── bootstrap-table-multiple-sort.min.js
│ │ ├── page-jump-to
│ │ │ ├── bootstrap-table-page-jump-to.css
│ │ │ ├── bootstrap-table-page-jump-to.js
│ │ │ ├── bootstrap-table-page-jump-to.min.css
│ │ │ └── bootstrap-table-page-jump-to.min.js
│ │ ├── pipeline
│ │ │ ├── bootstrap-table-pipeline.js
│ │ │ └── bootstrap-table-pipeline.min.js
│ │ ├── print
│ │ │ ├── bootstrap-table-print.js
│ │ │ └── bootstrap-table-print.min.js
│ │ ├── reorder-columns
│ │ │ ├── bootstrap-table-reorder-columns.js
│ │ │ └── bootstrap-table-reorder-columns.min.js
│ │ ├── reorder-rows
│ │ │ ├── bootstrap-table-reorder-rows.css
│ │ │ ├── bootstrap-table-reorder-rows.js
│ │ │ ├── bootstrap-table-reorder-rows.min.css
│ │ │ └── bootstrap-table-reorder-rows.min.js
│ │ ├── resizable
│ │ │ ├── bootstrap-table-resizable.js
│ │ │ └── bootstrap-table-resizable.min.js
│ │ ├── sticky-header
│ │ │ ├── bootstrap-table-sticky-header.css
│ │ │ ├── bootstrap-table-sticky-header.js
│ │ │ ├── bootstrap-table-sticky-header.min.css
│ │ │ └── bootstrap-table-sticky-header.min.js
│ │ ├── toolbar
│ │ │ ├── bootstrap-table-toolbar.js
│ │ │ └── bootstrap-table-toolbar.min.js
│ │ └── treegrid
│ │ │ ├── bootstrap-table-treegrid.js
│ │ │ └── bootstrap-table-treegrid.min.js
│ ├── locale
│ │ ├── bootstrap-table-af-ZA.js
│ │ ├── bootstrap-table-af-ZA.min.js
│ │ ├── bootstrap-table-ar-SA.js
│ │ ├── bootstrap-table-ar-SA.min.js
│ │ ├── bootstrap-table-bg-BG.js
│ │ ├── bootstrap-table-bg-BG.min.js
│ │ ├── bootstrap-table-ca-ES.js
│ │ ├── bootstrap-table-ca-ES.min.js
│ │ ├── bootstrap-table-cs-CZ.js
│ │ ├── bootstrap-table-cs-CZ.min.js
│ │ ├── bootstrap-table-da-DK.js
│ │ ├── bootstrap-table-da-DK.min.js
│ │ ├── bootstrap-table-de-DE.js
│ │ ├── bootstrap-table-de-DE.min.js
│ │ ├── bootstrap-table-el-GR.js
│ │ ├── bootstrap-table-el-GR.min.js
│ │ ├── bootstrap-table-en-US.js
│ │ ├── bootstrap-table-en-US.min.js
│ │ ├── bootstrap-table-es-AR.js
│ │ ├── bootstrap-table-es-AR.min.js
│ │ ├── bootstrap-table-es-CL.js
│ │ ├── bootstrap-table-es-CL.min.js
│ │ ├── bootstrap-table-es-CR.js
│ │ ├── bootstrap-table-es-CR.min.js
│ │ ├── bootstrap-table-es-ES.js
│ │ ├── bootstrap-table-es-ES.min.js
│ │ ├── bootstrap-table-es-MX.js
│ │ ├── bootstrap-table-es-MX.min.js
│ │ ├── bootstrap-table-es-NI.js
│ │ ├── bootstrap-table-es-NI.min.js
│ │ ├── bootstrap-table-es-SP.js
│ │ ├── bootstrap-table-es-SP.min.js
│ │ ├── bootstrap-table-et-EE.js
│ │ ├── bootstrap-table-et-EE.min.js
│ │ ├── bootstrap-table-eu-EU.js
│ │ ├── bootstrap-table-eu-EU.min.js
│ │ ├── bootstrap-table-fa-IR.js
│ │ ├── bootstrap-table-fa-IR.min.js
│ │ ├── bootstrap-table-fi-FI.js
│ │ ├── bootstrap-table-fi-FI.min.js
│ │ ├── bootstrap-table-fr-BE.js
│ │ ├── bootstrap-table-fr-BE.min.js
│ │ ├── bootstrap-table-fr-CH.js
│ │ ├── bootstrap-table-fr-CH.min.js
│ │ ├── bootstrap-table-fr-FR.js
│ │ ├── bootstrap-table-fr-FR.min.js
│ │ ├── bootstrap-table-fr-LU.js
│ │ ├── bootstrap-table-fr-LU.min.js
│ │ ├── bootstrap-table-he-IL.js
│ │ ├── bootstrap-table-he-IL.min.js
│ │ ├── bootstrap-table-hr-HR.js
│ │ ├── bootstrap-table-hr-HR.min.js
│ │ ├── bootstrap-table-hu-HU.js
│ │ ├── bootstrap-table-hu-HU.min.js
│ │ ├── bootstrap-table-id-ID.js
│ │ ├── bootstrap-table-id-ID.min.js
│ │ ├── bootstrap-table-it-IT.js
│ │ ├── bootstrap-table-it-IT.min.js
│ │ ├── bootstrap-table-ja-JP.js
│ │ ├── bootstrap-table-ja-JP.min.js
│ │ ├── bootstrap-table-ka-GE.js
│ │ ├── bootstrap-table-ka-GE.min.js
│ │ ├── bootstrap-table-ko-KR.js
│ │ ├── bootstrap-table-ko-KR.min.js
│ │ ├── bootstrap-table-ms-MY.js
│ │ ├── bootstrap-table-ms-MY.min.js
│ │ ├── bootstrap-table-nb-NO.js
│ │ ├── bootstrap-table-nb-NO.min.js
│ │ ├── bootstrap-table-nl-BE.js
│ │ ├── bootstrap-table-nl-BE.min.js
│ │ ├── bootstrap-table-nl-NL.js
│ │ ├── bootstrap-table-nl-NL.min.js
│ │ ├── bootstrap-table-pl-PL.js
│ │ ├── bootstrap-table-pl-PL.min.js
│ │ ├── bootstrap-table-pt-BR.js
│ │ ├── bootstrap-table-pt-BR.min.js
│ │ ├── bootstrap-table-pt-PT.js
│ │ ├── bootstrap-table-pt-PT.min.js
│ │ ├── bootstrap-table-ro-RO.js
│ │ ├── bootstrap-table-ro-RO.min.js
│ │ ├── bootstrap-table-ru-RU.js
│ │ ├── bootstrap-table-ru-RU.min.js
│ │ ├── bootstrap-table-sk-SK.js
│ │ ├── bootstrap-table-sk-SK.min.js
│ │ ├── bootstrap-table-sr-Cyrl-RS.js
│ │ ├── bootstrap-table-sr-Cyrl-RS.min.js
│ │ ├── bootstrap-table-sr-Latn-RS.js
│ │ ├── bootstrap-table-sr-Latn-RS.min.js
│ │ ├── bootstrap-table-sv-SE.js
│ │ ├── bootstrap-table-sv-SE.min.js
│ │ ├── bootstrap-table-th-TH.js
│ │ ├── bootstrap-table-th-TH.min.js
│ │ ├── bootstrap-table-tr-TR.js
│ │ ├── bootstrap-table-tr-TR.min.js
│ │ ├── bootstrap-table-uk-UA.js
│ │ ├── bootstrap-table-uk-UA.min.js
│ │ ├── bootstrap-table-ur-PK.js
│ │ ├── bootstrap-table-ur-PK.min.js
│ │ ├── bootstrap-table-uz-Latn-UZ.js
│ │ ├── bootstrap-table-uz-Latn-UZ.min.js
│ │ ├── bootstrap-table-vi-VN.js
│ │ ├── bootstrap-table-vi-VN.min.js
│ │ ├── bootstrap-table-zh-CN.js
│ │ ├── bootstrap-table-zh-CN.min.js
│ │ ├── bootstrap-table-zh-TW.js
│ │ └── bootstrap-table-zh-TW.min.js
│ └── themes
│ │ ├── bootstrap-table
│ │ ├── bootstrap-table.css
│ │ ├── bootstrap-table.js
│ │ ├── bootstrap-table.min.css
│ │ ├── bootstrap-table.min.js
│ │ └── fonts
│ │ │ ├── bootstrap-table.eot
│ │ │ ├── bootstrap-table.svg
│ │ │ ├── bootstrap-table.ttf
│ │ │ └── bootstrap-table.woff
│ │ ├── bulma
│ │ ├── bootstrap-table-bulma.css
│ │ ├── bootstrap-table-bulma.js
│ │ ├── bootstrap-table-bulma.min.css
│ │ └── bootstrap-table-bulma.min.js
│ │ ├── foundation
│ │ ├── bootstrap-table-foundation.css
│ │ ├── bootstrap-table-foundation.js
│ │ ├── bootstrap-table-foundation.min.css
│ │ └── bootstrap-table-foundation.min.js
│ │ ├── materialize
│ │ ├── bootstrap-table-materialize.css
│ │ ├── bootstrap-table-materialize.js
│ │ ├── bootstrap-table-materialize.min.css
│ │ └── bootstrap-table-materialize.min.js
│ │ └── semantic
│ │ ├── bootstrap-table-semantic.css
│ │ ├── bootstrap-table-semantic.js
│ │ ├── bootstrap-table-semantic.min.css
│ │ └── bootstrap-table-semantic.min.js
├── bootstrap
│ ├── LICENSE
│ └── dist
│ │ ├── css
│ │ ├── bootstrap-grid.css
│ │ ├── bootstrap-grid.css.map
│ │ ├── bootstrap-grid.min.css
│ │ ├── bootstrap-grid.min.css.map
│ │ ├── bootstrap-reboot.css
│ │ ├── bootstrap-reboot.css.map
│ │ ├── bootstrap-reboot.min.css
│ │ ├── bootstrap-reboot.min.css.map
│ │ ├── bootstrap.css
│ │ ├── bootstrap.css.map
│ │ ├── bootstrap.min.css
│ │ └── bootstrap.min.css.map
│ │ └── js
│ │ ├── bootstrap.bundle.js
│ │ ├── bootstrap.bundle.js.map
│ │ ├── bootstrap.bundle.min.js
│ │ ├── bootstrap.bundle.min.js.map
│ │ ├── bootstrap.js
│ │ ├── bootstrap.js.map
│ │ ├── bootstrap.min.js
│ │ └── bootstrap.min.js.map
├── jquery-ajax-unobtrusive
│ ├── jquery.unobtrusive-ajax.js
│ └── jquery.unobtrusive-ajax.min.js
├── jquery-validation-unobtrusive
│ ├── LICENSE.txt
│ ├── jquery.validate.unobtrusive.js
│ └── jquery.validate.unobtrusive.min.js
├── jquery-validation
│ ├── LICENSE.md
│ └── dist
│ │ ├── additional-methods.js
│ │ ├── additional-methods.min.js
│ │ ├── jquery.validate.js
│ │ └── jquery.validate.min.js
└── jquery
│ ├── LICENSE.txt
│ └── dist
│ ├── jquery.js
│ ├── jquery.min.js
│ └── jquery.min.map
├── matrikon.png
├── mettlertoledo.png
├── microsoft.png
├── opcf.jpg
├── phoenix-contact.png
├── pilz.jpg
├── prosys.png
├── samson.png
├── schneider.png
├── siemens.png
├── trumpf.jpg
├── ualogo.png
├── vdw.png
└── wago.jpg
/.config/dotnet-tools.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": 1,
3 | "isRoot": true,
4 | "tools": {
5 | "dotnet-ef": {
6 | "version": "5.0.7",
7 | "commands": [
8 | "dotnet-ef"
9 | ]
10 | }
11 | }
12 | }
--------------------------------------------------------------------------------
/.dockerignore:
--------------------------------------------------------------------------------
1 | **/.classpath
2 | **/.dockerignore
3 | **/.env
4 | **/.git
5 | **/.gitignore
6 | **/.project
7 | **/.settings
8 | **/.toolstarget
9 | **/.vs
10 | **/.vscode
11 | **/*.*proj.user
12 | **/*.dbmdl
13 | **/*.jfm
14 | **/azds.yaml
15 | **/bin
16 | **/charts
17 | **/docker-compose*
18 | **/Dockerfile*
19 | **/node_modules
20 | **/npm-debug.log
21 | **/obj
22 | **/secrets.dev.yaml
23 | **/values.dev.yaml
24 | LICENSE
25 | README.md
--------------------------------------------------------------------------------
/.github/workflows/docker-publish.yml:
--------------------------------------------------------------------------------
1 | name: Docker
2 |
3 | # This workflow uses actions that are not certified by GitHub.
4 | # They are provided by a third-party and are governed by
5 | # separate terms of service, privacy policy, and support
6 | # documentation.
7 |
8 | on:
9 | schedule:
10 | - cron: '23 9 * * *'
11 | push:
12 | branches: [ main ]
13 | # Publish semver tags as releases.
14 | tags: [ 'v*.*.*' ]
15 | pull_request:
16 | branches: [ main ]
17 |
18 | env:
19 | # Use docker.io for Docker Hub if empty
20 | REGISTRY: ghcr.io
21 | # github.repository as /
22 | IMAGE_NAME: ${{ github.repository }}
23 |
24 |
25 | jobs:
26 | build:
27 |
28 | runs-on: ubuntu-latest
29 | permissions:
30 | contents: read
31 | packages: write
32 |
33 | steps:
34 | - name: Checkout repository
35 | uses: actions/checkout@v2
36 |
37 | # Login against a Docker registry except on PR
38 | # https://github.com/docker/login-action
39 | - name: Log into registry ${{ env.REGISTRY }}
40 | if: github.event_name != 'pull_request'
41 | uses: docker/login-action@28218f9b04b4f3f62068d7b6ce6ca5b26e35336c
42 | with:
43 | registry: ${{ env.REGISTRY }}
44 | username: ${{ github.actor }}
45 | password: ${{ secrets.GITHUB_TOKEN }}
46 |
47 | # Extract metadata (tags, labels) for Docker
48 | # https://github.com/docker/metadata-action
49 | - name: Extract Docker metadata
50 | id: meta
51 | uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
52 | with:
53 | images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
54 |
55 | # Build and push Docker image with Buildx (don't push on PR)
56 | # https://github.com/docker/build-push-action
57 | - name: Build and push Docker image
58 | uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
59 | with:
60 | context: .
61 | push: ${{ github.event_name != 'pull_request' }}
62 | tags: ${{ steps.meta.outputs.tags }}
63 | labels: ${{ steps.meta.outputs.labels }}
64 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 | ##
4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
5 |
6 | # User-specific files
7 | *.rsuser
8 | *.suo
9 | *.user
10 | *.userosscache
11 | *.sln.docstates
12 |
13 | # User-specific files (MonoDevelop/Xamarin Studio)
14 | *.userprefs
15 |
16 | # Mono auto generated files
17 | mono_crash.*
18 |
19 | # Build results
20 | [Dd]ebug/
21 | [Dd]ebugPublic/
22 | [Rr]elease/
23 | [Rr]eleases/
24 | x64/
25 | x86/
26 | [Aa][Rr][Mm]/
27 | [Aa][Rr][Mm]64/
28 | bld/
29 | [Bb]in/
30 | [Oo]bj/
31 | [Ll]og/
32 | [Ll]ogs/
33 |
34 | # Visual Studio 2015/2017 cache/options directory
35 | .vs/
36 | # Uncomment if you have tasks that create the project's static files in wwwroot
37 | #wwwroot/
38 |
39 | # Visual Studio 2017 auto generated files
40 | Generated\ Files/
41 |
42 | # MSTest test Results
43 | [Tt]est[Rr]esult*/
44 | [Bb]uild[Ll]og.*
45 |
46 | # NUnit
47 | *.VisualState.xml
48 | TestResult.xml
49 | nunit-*.xml
50 |
51 | # Build Results of an ATL Project
52 | [Dd]ebugPS/
53 | [Rr]eleasePS/
54 | dlldata.c
55 |
56 | # Benchmark Results
57 | BenchmarkDotNet.Artifacts/
58 |
59 | # .NET Core
60 | project.lock.json
61 | project.fragment.lock.json
62 | artifacts/
63 |
64 | # StyleCop
65 | StyleCopReport.xml
66 |
67 | # Files built by Visual Studio
68 | *_i.c
69 | *_p.c
70 | *_h.h
71 | *.ilk
72 | *.meta
73 | *.obj
74 | *.iobj
75 | *.pch
76 | *.pdb
77 | *.ipdb
78 | *.pgc
79 | *.pgd
80 | *.rsp
81 | *.sbr
82 | *.tlb
83 | *.tli
84 | *.tlh
85 | *.tmp
86 | *.tmp_proj
87 | *_wpftmp.csproj
88 | *.log
89 | *.vspscc
90 | *.vssscc
91 | .builds
92 | *.pidb
93 | *.svclog
94 | *.scc
95 |
96 | # Chutzpah Test files
97 | _Chutzpah*
98 |
99 | # Visual C++ cache files
100 | ipch/
101 | *.aps
102 | *.ncb
103 | *.opendb
104 | *.opensdf
105 | *.sdf
106 | *.cachefile
107 | *.VC.db
108 | *.VC.VC.opendb
109 |
110 | # Visual Studio profiler
111 | *.psess
112 | *.vsp
113 | *.vspx
114 | *.sap
115 |
116 | # Visual Studio Trace Files
117 | *.e2e
118 |
119 | # TFS 2012 Local Workspace
120 | $tf/
121 |
122 | # Guidance Automation Toolkit
123 | *.gpState
124 |
125 | # ReSharper is a .NET coding add-in
126 | _ReSharper*/
127 | *.[Rr]e[Ss]harper
128 | *.DotSettings.user
129 |
130 | # TeamCity is a build add-in
131 | _TeamCity*
132 |
133 | # DotCover is a Code Coverage Tool
134 | *.dotCover
135 |
136 | # AxoCover is a Code Coverage Tool
137 | .axoCover/*
138 | !.axoCover/settings.json
139 |
140 | # Visual Studio code coverage results
141 | *.coverage
142 | *.coveragexml
143 |
144 | # NCrunch
145 | _NCrunch_*
146 | .*crunch*.local.xml
147 | nCrunchTemp_*
148 |
149 | # MightyMoose
150 | *.mm.*
151 | AutoTest.Net/
152 |
153 | # Web workbench (sass)
154 | .sass-cache/
155 |
156 | # Installshield output folder
157 | [Ee]xpress/
158 |
159 | # DocProject is a documentation generator add-in
160 | DocProject/buildhelp/
161 | DocProject/Help/*.HxT
162 | DocProject/Help/*.HxC
163 | DocProject/Help/*.hhc
164 | DocProject/Help/*.hhk
165 | DocProject/Help/*.hhp
166 | DocProject/Help/Html2
167 | DocProject/Help/html
168 |
169 | # Click-Once directory
170 | publish/
171 |
172 | # Publish Web Output
173 | *.[Pp]ublish.xml
174 | *.azurePubxml
175 | # Note: Comment the next line if you want to checkin your web deploy settings,
176 | # but database connection strings (with potential passwords) will be unencrypted
177 | *.pubxml
178 | *.publishproj
179 |
180 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
181 | # checkin your Azure Web App publish settings, but sensitive information contained
182 | # in these scripts will be unencrypted
183 | PublishScripts/
184 |
185 | # NuGet Packages
186 | *.nupkg
187 | # NuGet Symbol Packages
188 | *.snupkg
189 | # The packages folder can be ignored because of Package Restore
190 | **/[Pp]ackages/*
191 | # except build/, which is used as an MSBuild target.
192 | !**/[Pp]ackages/build/
193 | # Uncomment if necessary however generally it will be regenerated when needed
194 | #!**/[Pp]ackages/repositories.config
195 | # NuGet v3's project.json files produces more ignorable files
196 | *.nuget.props
197 | *.nuget.targets
198 |
199 | # Microsoft Azure Build Output
200 | csx/
201 | *.build.csdef
202 |
203 | # Microsoft Azure Emulator
204 | ecf/
205 | rcf/
206 |
207 | # Windows Store app package directories and files
208 | AppPackages/
209 | BundleArtifacts/
210 | Package.StoreAssociation.xml
211 | _pkginfo.txt
212 | *.appx
213 | *.appxbundle
214 | *.appxupload
215 |
216 | # Visual Studio cache files
217 | # files ending in .cache can be ignored
218 | *.[Cc]ache
219 | # but keep track of directories ending in .cache
220 | !?*.[Cc]ache/
221 |
222 | # Others
223 | ClientBin/
224 | ~$*
225 | *~
226 | *.dbmdl
227 | *.dbproj.schemaview
228 | *.jfm
229 | *.pfx
230 | *.publishsettings
231 | orleans.codegen.cs
232 |
233 | # Including strong name files can present a security risk
234 | # (https://github.com/github/gitignore/pull/2483#issue-259490424)
235 | #*.snk
236 |
237 | # Since there are multiple workflows, uncomment next line to ignore bower_components
238 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
239 | #bower_components/
240 |
241 | # RIA/Silverlight projects
242 | Generated_Code/
243 |
244 | # Backup & report files from converting an old project file
245 | # to a newer Visual Studio version. Backup files are not needed,
246 | # because we have git ;-)
247 | _UpgradeReport_Files/
248 | Backup*/
249 | UpgradeLog*.XML
250 | UpgradeLog*.htm
251 | ServiceFabricBackup/
252 | *.rptproj.bak
253 |
254 | # SQL Server files
255 | *.mdf
256 | *.ldf
257 | *.ndf
258 |
259 | # Business Intelligence projects
260 | *.rdl.data
261 | *.bim.layout
262 | *.bim_*.settings
263 | *.rptproj.rsuser
264 | *- [Bb]ackup.rdl
265 | *- [Bb]ackup ([0-9]).rdl
266 | *- [Bb]ackup ([0-9][0-9]).rdl
267 |
268 | # Microsoft Fakes
269 | FakesAssemblies/
270 |
271 | # GhostDoc plugin setting file
272 | *.GhostDoc.xml
273 |
274 | # Node.js Tools for Visual Studio
275 | .ntvs_analysis.dat
276 | node_modules/
277 |
278 | # Visual Studio 6 build log
279 | *.plg
280 |
281 | # Visual Studio 6 workspace options file
282 | *.opt
283 |
284 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
285 | *.vbw
286 |
287 | # Visual Studio LightSwitch build output
288 | **/*.HTMLClient/GeneratedArtifacts
289 | **/*.DesktopClient/GeneratedArtifacts
290 | **/*.DesktopClient/ModelManifest.xml
291 | **/*.Server/GeneratedArtifacts
292 | **/*.Server/ModelManifest.xml
293 | _Pvt_Extensions
294 |
295 | # Paket dependency manager
296 | .paket/paket.exe
297 | paket-files/
298 |
299 | # FAKE - F# Make
300 | .fake/
301 |
302 | # CodeRush personal settings
303 | .cr/personal
304 |
305 | # Python Tools for Visual Studio (PTVS)
306 | __pycache__/
307 | *.pyc
308 |
309 | # Cake - Uncomment if you are using it
310 | # tools/**
311 | # !tools/packages.config
312 |
313 | # Tabs Studio
314 | *.tss
315 |
316 | # Telerik's JustMock configuration file
317 | *.jmconfig
318 |
319 | # BizTalk build output
320 | *.btp.cs
321 | *.btm.cs
322 | *.odx.cs
323 | *.xsd.cs
324 |
325 | # OpenCover UI analysis results
326 | OpenCover/
327 |
328 | # Azure Stream Analytics local run output
329 | ASALocalRun/
330 |
331 | # MSBuild Binary and Structured Log
332 | *.binlog
333 |
334 | # NVidia Nsight GPU debugger configuration file
335 | *.nvuser
336 |
337 | # MFractors (Xamarin productivity tool) working folder
338 | .mfractor/
339 |
340 | # Local History for Visual Studio
341 | .localhistory/
342 |
343 | # BeatPulse healthcheck temp database
344 | healthchecksdb
345 |
346 | # Backup folder for Package Reference Convert tool in Visual Studio 2017
347 | MigrationBackup/
348 |
349 | # Ionide (cross platform F# VS Code tools) working folder
350 | .ionide/
351 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | #See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
2 |
3 | FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base
4 | WORKDIR /app
5 | EXPOSE 8080
6 | EXPOSE 443
7 |
8 | FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
9 | WORKDIR /src
10 | COPY ["UACloudDashboard.csproj", "."]
11 | RUN dotnet restore "./UACloudDashboard.csproj"
12 | COPY . .
13 | WORKDIR "/src/."
14 | RUN dotnet build "UACloudDashboard.csproj" -c Release -o /app/build
15 |
16 | FROM build AS publish
17 | RUN dotnet publish "UACloudDashboard.csproj" -c Release -o /app/publish
18 |
19 | FROM base AS final
20 | WORKDIR /app
21 | COPY --from=publish /app/publish .
22 | ENTRYPOINT ["dotnet", "UACloudDashboard.dll"]
--------------------------------------------------------------------------------
/Encoding/DataSet.cs:
--------------------------------------------------------------------------------
1 | /* ========================================================================
2 | * Copyright (c) 2005-2021 The OPC Foundation, Inc. All rights reserved.
3 | *
4 | * OPC Foundation MIT License 1.00
5 | *
6 | * Permission is hereby granted, free of charge, to any person
7 | * obtaining a copy of this software and associated documentation
8 | * files (the "Software"), to deal in the Software without
9 | * restriction, including without limitation the rights to use,
10 | * copy, modify, merge, publish, distribute, sublicense, and/or sell
11 | * copies of the Software, and to permit persons to whom the
12 | * Software is furnished to do so, subject to the following
13 | * conditions:
14 | *
15 | * The above copyright notice and this permission notice shall be
16 | * included in all copies or substantial portions of the Software.
17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
19 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24 | * OTHER DEALINGS IN THE SOFTWARE.
25 | *
26 | * The complete license agreement can be found here:
27 | * http://opcfoundation.org/License/MIT/1.00/
28 | * ======================================================================*/
29 |
30 | namespace Opc.Ua.PubSub.PublishedData
31 | {
32 | ///
33 | /// Entity that holds DataSet structure that is published/received bu the PubSub
34 | ///
35 | public class DataSet
36 | {
37 | #region Constructor
38 | ///
39 | /// Create new instance of
40 | ///
41 | ///
42 | public DataSet(string name = null)
43 | {
44 | Name = name;
45 | }
46 | #endregion
47 |
48 | #region Properties
49 | ///
50 | /// Get/Set data set name
51 | ///
52 | public string Name { get; set; }
53 |
54 | ///
55 | /// Get/Set flag that indicates if DataSet is delta frame
56 | ///
57 | public bool IsDeltaFrame { get; set; }
58 |
59 | ///
60 | /// Get/Set the DataSetWriterId that produced this DataSet
61 | ///
62 | public int DataSetWriterId { get; set; }
63 |
64 | ///
65 | /// Gets SequenceNumber - a strictly monotonically increasing sequence number assigned by the publisher to each DataSetMessage sent.
66 | ///
67 | public uint SequenceNumber { get; internal set; }
68 |
69 | ///
70 | /// Gets DataSetMetaData for this DataSet
71 | ///
72 | public DataSetMetaDataType DataSetMetaData { get; set; }
73 |
74 | ///
75 | /// Get/Set data set fields for this data set
76 | ///
77 | public Field[] Fields { get; set; }
78 | #endregion
79 |
80 | #region MemberwiseClone method
81 | ///
82 | /// Create a deep copy of current DataSet
83 | ///
84 | public new object MemberwiseClone()
85 | {
86 | DataSet copy = base.MemberwiseClone() as DataSet;
87 | if (DataSetMetaData != null)
88 | {
89 | if (copy != null)
90 | {
91 | copy.DataSetMetaData = DataSetMetaData.MemberwiseClone() as DataSetMetaDataType;
92 | }
93 | }
94 |
95 | if (Fields != null)
96 | {
97 | if (copy != null)
98 | {
99 | copy.Fields = new Field[Fields.Length];
100 | for (int i = 0; i < Fields.Length; i++)
101 | {
102 | copy.Fields[i] = Fields[i].MemberwiseClone() as Field;
103 | }
104 | }
105 | }
106 | return copy;
107 | }
108 | #endregion
109 | }
110 | }
111 |
--------------------------------------------------------------------------------
/Encoding/DataSetDecodeErrorEventArgs.cs:
--------------------------------------------------------------------------------
1 | /* ========================================================================
2 | * Copyright (c) 2005-2021 The OPC Foundation, Inc. All rights reserved.
3 | *
4 | * OPC Foundation MIT License 1.00
5 | *
6 | * Permission is hereby granted, free of charge, to any person
7 | * obtaining a copy of this software and associated documentation
8 | * files (the "Software"), to deal in the Software without
9 | * restriction, including without limitation the rights to use,
10 | * copy, modify, merge, publish, distribute, sublicense, and/or sell
11 | * copies of the Software, and to permit persons to whom the
12 | * Software is furnished to do so, subject to the following
13 | * conditions:
14 | *
15 | * The above copyright notice and this permission notice shall be
16 | * included in all copies or substantial portions of the Software.
17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
19 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24 | * OTHER DEALINGS IN THE SOFTWARE.
25 | *
26 | * The complete license agreement can be found here:
27 | * http://opcfoundation.org/License/MIT/1.00/
28 | * ======================================================================*/
29 |
30 | using System;
31 | using Opc.Ua.PubSub.Encoding;
32 |
33 | namespace Opc.Ua.PubSub
34 | {
35 | ///
36 | /// Class that contains data related to DataSetDecodeErrorOccurred event
37 | ///
38 | public class DataSetDecodeErrorEventArgs : EventArgs
39 | {
40 | #region Private members
41 | private DataSetDecodeErrorReason m_dataSetDecodeErrorReason;
42 | private UaNetworkMessage m_networkMessage;
43 | private DataSetReaderDataType m_dataSetReader;
44 | #endregion
45 |
46 | #region Constructor
47 | ///
48 | /// Constructor
49 | ///
50 | ///
51 | ///
52 | ///
53 | public DataSetDecodeErrorEventArgs(DataSetDecodeErrorReason dataSetDecodeErrorReason, UaNetworkMessage networkMessage, DataSetReaderDataType dataSetReader)
54 | {
55 | m_dataSetDecodeErrorReason = dataSetDecodeErrorReason;
56 | m_networkMessage = networkMessage;
57 | m_dataSetReader = dataSetReader;
58 | }
59 | #endregion
60 |
61 | #region Public Properties
62 | ///
63 | /// The reason for triggering the DataSetDecodeErrorOccurred event
64 | ///
65 | public DataSetDecodeErrorReason DecodeErrorReason
66 | {
67 | get
68 | {
69 | return m_dataSetDecodeErrorReason;
70 | }
71 | set
72 | {
73 | m_dataSetDecodeErrorReason = value;
74 | }
75 | }
76 |
77 | ///
78 | /// The DataSetMessage on which the decoding operated
79 | ///
80 | public UaNetworkMessage UaNetworkMessage
81 | {
82 | get
83 | {
84 | return m_networkMessage;
85 | }
86 | set
87 | {
88 | m_networkMessage = value;
89 | }
90 | }
91 | ///
92 | /// The DataSetReader used by the decoding operation
93 | ///
94 | public DataSetReaderDataType DataSetReader
95 | {
96 | get
97 | {
98 | return m_dataSetReader;
99 | }
100 | set
101 | {
102 | m_dataSetReader = value;
103 | }
104 | }
105 | #endregion
106 | }
107 | }
108 |
--------------------------------------------------------------------------------
/Encoding/Field.cs:
--------------------------------------------------------------------------------
1 | /* ========================================================================
2 | * Copyright (c) 2005-2021 The OPC Foundation, Inc. All rights reserved.
3 | *
4 | * OPC Foundation MIT License 1.00
5 | *
6 | * Permission is hereby granted, free of charge, to any person
7 | * obtaining a copy of this software and associated documentation
8 | * files (the "Software"), to deal in the Software without
9 | * restriction, including without limitation the rights to use,
10 | * copy, modify, merge, publish, distribute, sublicense, and/or sell
11 | * copies of the Software, and to permit persons to whom the
12 | * Software is furnished to do so, subject to the following
13 | * conditions:
14 | *
15 | * The above copyright notice and this permission notice shall be
16 | * included in all copies or substantial portions of the Software.
17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
19 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24 | * OTHER DEALINGS IN THE SOFTWARE.
25 | *
26 | * The complete license agreement can be found here:
27 | * http://opcfoundation.org/License/MIT/1.00/
28 | * ======================================================================*/
29 |
30 | namespace Opc.Ua.PubSub.PublishedData
31 | {
32 | ///
33 | /// Base class for a DataSet field
34 | ///
35 | public class Field
36 | {
37 | ///
38 | /// Get/Set Value
39 | ///
40 | public DataValue Value { get; set; }
41 |
42 | ///
43 | /// Get/Set Target NodeId
44 | ///
45 | public NodeId TargetNodeId { get; set; }
46 |
47 | ///
48 | /// Get/Set target attribute
49 | ///
50 | public uint TargetAttribute { get; set; }
51 |
52 | ///
53 | /// Get configured object for this instance.
54 | ///
55 | public FieldMetaData FieldMetaData { get; internal set; }
56 |
57 | #region MemberwiseClone method
58 | ///
59 | /// Create a deep copy of current DataSet
60 | ///
61 | public new object MemberwiseClone()
62 | {
63 | Field copy = base.MemberwiseClone() as Field;
64 | if (Value != null)
65 | {
66 | if (copy != null)
67 | {
68 | copy.Value = Value.MemberwiseClone() as DataValue;
69 | }
70 | }
71 |
72 | if (FieldMetaData != null)
73 | {
74 | if (copy != null)
75 | {
76 | copy.FieldMetaData = FieldMetaData.MemberwiseClone() as FieldMetaData;
77 | }
78 | }
79 | return copy;
80 | }
81 | #endregion
82 | }
83 | }
84 |
--------------------------------------------------------------------------------
/Encoding/UaDataSetMessage.cs:
--------------------------------------------------------------------------------
1 | /* ========================================================================
2 | * Copyright (c) 2005-2021 The OPC Foundation, Inc. All rights reserved.
3 | *
4 | * OPC Foundation MIT License 1.00
5 | *
6 | * Permission is hereby granted, free of charge, to any person
7 | * obtaining a copy of this software and associated documentation
8 | * files (the "Software"), to deal in the Software without
9 | * restriction, including without limitation the rights to use,
10 | * copy, modify, merge, publish, distribute, sublicense, and/or sell
11 | * copies of the Software, and to permit persons to whom the
12 | * Software is furnished to do so, subject to the following
13 | * conditions:
14 | *
15 | * The above copyright notice and this permission notice shall be
16 | * included in all copies or substantial portions of the Software.
17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
19 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24 | * OTHER DEALINGS IN THE SOFTWARE.
25 | *
26 | * The complete license agreement can be found here:
27 | * http://opcfoundation.org/License/MIT/1.00/
28 | * ======================================================================*/
29 |
30 | using Opc.Ua.PubSub.PublishedData;
31 | using System;
32 |
33 | namespace Opc.Ua.PubSub
34 | {
35 | ///
36 | /// Base class for a DataSet message implementation
37 | ///
38 | public abstract class UaDataSetMessage
39 | {
40 | #region Fields
41 | // Configuration Major and Major current version (VersionTime)
42 | ///
43 | /// Default value for Configured MetaDataVersion.MajorVersion
44 | ///
45 | protected const UInt32 kDefaultConfigMajorVersion = 0;
46 | ///
47 | /// Default value for Configured MetaDataVersion.MinorVersion
48 | ///
49 | protected const UInt32 kDefaultConfigMinorVersion = 0;
50 | #endregion
51 |
52 | #region Constructor
53 | ///
54 | /// Create new instance of
55 | ///
56 | public UaDataSetMessage()
57 | {
58 | DecodeErrorReason = DataSetDecodeErrorReason.NoError;
59 | Timestamp = DateTime.UtcNow;
60 | MetaDataVersion = new ConfigurationVersionDataType() {
61 | MajorVersion = kDefaultConfigMajorVersion,
62 | MinorVersion = kDefaultConfigMinorVersion
63 | };
64 | }
65 | #endregion
66 |
67 | #region Properties
68 | ///
69 | /// Get DataSet
70 | ///
71 | public DataSet DataSet { get; internal set; }
72 |
73 | ///
74 | /// Get and Set corresponding DataSetWriterId
75 | ///
76 | public ushort DataSetWriterId { get; set; }
77 |
78 | ///
79 | /// Get DataSetFieldContentMask
80 | /// This DataType defines flags to include DataSet field related information like status and
81 | /// timestamp in addition to the value in the DataSetMessage.
82 | ///
83 | public DataSetFieldContentMask FieldContentMask { get; protected set; }
84 |
85 | ///
86 | /// The version of the DataSetMetaData which describes the contents of the Payload.
87 | ///
88 | public ConfigurationVersionDataType MetaDataVersion { get; set; }
89 |
90 | ///
91 | /// Get and Set SequenceNumber
92 | /// A strictly monotonically increasing sequence number assigned by the publisher to each DataSetMessage sent.
93 | ///
94 | public uint SequenceNumber { get; set; }
95 |
96 | ///
97 | /// Get and Set Timestamp
98 | ///
99 | public DateTime Timestamp { get; set; }
100 |
101 | ///
102 | /// Get and Set Status
103 | ///
104 | public StatusCode Status { get; set; }
105 |
106 | ///
107 | /// Get and Set the reason that an error encountered while decoding occurred
108 | ///
109 | public DataSetDecodeErrorReason DecodeErrorReason { get; set; }
110 |
111 | ///
112 | /// Checks if the MetadataMajorVersion has changed depending on the value of DataSetDecodeErrorReason
113 | ///
114 | public bool IsMetadataMajorVersionChange
115 | {
116 | get
117 | {
118 | return DecodeErrorReason == DataSetDecodeErrorReason.MetadataMajorVersion;
119 | }
120 | }
121 | #endregion
122 |
123 | #region Methods
124 | ///
125 | /// Set DataSetFieldContentMask
126 | ///
127 | /// The new for this dataset
128 | public abstract void SetFieldContentMask(DataSetFieldContentMask fieldContentMask);
129 | #endregion
130 |
131 | ///
132 | /// Validates the MetadataVersion against a given ConfigurationVersionDataType
133 | ///
134 | /// The value to validate MetadataVersion against
135 | /// NoError if validation passes or the cause of the failure
136 | protected DataSetDecodeErrorReason ValidateMetadataVersion(ConfigurationVersionDataType configurationVersionDataType)
137 | {
138 | if (MetaDataVersion.MajorVersion != kDefaultConfigMajorVersion)
139 | {
140 | if (MetaDataVersion.MajorVersion != configurationVersionDataType.MajorVersion)
141 | {
142 | return DataSetDecodeErrorReason.MetadataMajorVersion;
143 | }
144 | }
145 |
146 | return DataSetDecodeErrorReason.NoError;
147 | }
148 | }
149 | }
150 |
--------------------------------------------------------------------------------
/Encoding/UaNetworkMessage.cs:
--------------------------------------------------------------------------------
1 | /* ========================================================================
2 | * Copyright (c) 2005-2021 The OPC Foundation, Inc. All rights reserved.
3 | *
4 | * OPC Foundation MIT License 1.00
5 | *
6 | * Permission is hereby granted, free of charge, to any person
7 | * obtaining a copy of this software and associated documentation
8 | * files (the "Software"), to deal in the Software without
9 | * restriction, including without limitation the rights to use,
10 | * copy, modify, merge, publish, distribute, sublicense, and/or sell
11 | * copies of the Software, and to permit persons to whom the
12 | * Software is furnished to do so, subject to the following
13 | * conditions:
14 | *
15 | * The above copyright notice and this permission notice shall be
16 | * included in all copies or substantial portions of the Software.
17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
19 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24 | * OTHER DEALINGS IN THE SOFTWARE.
25 | *
26 | * The complete license agreement can be found here:
27 | * http://opcfoundation.org/License/MIT/1.00/
28 | * ======================================================================*/
29 |
30 | using System;
31 | using System.Collections.Generic;
32 | using System.IO;
33 |
34 | namespace Opc.Ua.PubSub
35 | {
36 | ///
37 | /// Abstract class for an UA network message
38 | ///
39 | public abstract class UaNetworkMessage
40 | {
41 | private ushort m_dataSetWriterId;
42 |
43 | #region Public Events
44 |
45 | ///
46 | /// The Default event for an error encountered during decoding the dataset messages
47 | ///
48 | public event EventHandler DataSetDecodeErrorOccurred;
49 |
50 | #endregion
51 |
52 | #region Protected Fields
53 | ///
54 | /// The DataSetMetaData
55 | ///
56 | protected DataSetMetaDataType m_metadata;
57 |
58 | ///
59 | /// List of DataSet messages
60 | ///
61 | protected List m_uaDataSetMessages;
62 | #endregion
63 |
64 | #region Constructor
65 | ///
66 | /// Create instance of .
67 | ///
68 | /// The confguration object that produced this message.
69 | /// The containing data set messages.
70 | protected UaNetworkMessage(WriterGroupDataType writerGroupConfiguration, List uaDataSetMessages)
71 | {
72 | WriterGroupConfiguration = writerGroupConfiguration;
73 | m_uaDataSetMessages = uaDataSetMessages;
74 | m_metadata = null;
75 | }
76 |
77 | ///
78 | /// Create instance of .
79 | ///
80 | protected UaNetworkMessage(WriterGroupDataType writerGroupConfiguration, DataSetMetaDataType metadata)
81 | {
82 | WriterGroupConfiguration = writerGroupConfiguration;
83 | m_uaDataSetMessages = new List();
84 | m_metadata = metadata;
85 | }
86 | #endregion
87 |
88 | #region Properties
89 | ///
90 | /// Get and Set WriterGroupId
91 | ///
92 | public UInt16 WriterGroupId { get; set; }
93 |
94 | ///
95 | /// Get and Set DataSetWriterId if a single value exists for the message.
96 | ///
97 | public UInt16 DataSetWriterId
98 | {
99 | get
100 | {
101 | if (m_dataSetWriterId == 0)
102 | {
103 | if (m_uaDataSetMessages != null && m_uaDataSetMessages.Count == 1)
104 | {
105 | return m_uaDataSetMessages[0].DataSetWriterId;
106 | }
107 | else
108 | {
109 | return m_dataSetWriterId;
110 | }
111 | }
112 | else
113 | {
114 | return m_dataSetWriterId;
115 | }
116 | }
117 |
118 | set
119 | {
120 | m_dataSetWriterId = value;
121 | }
122 | }
123 |
124 | ///
125 | /// DataSet messages
126 | ///
127 | public List DataSetMessages
128 | {
129 | get
130 | {
131 | return m_uaDataSetMessages;
132 | }
133 | }
134 |
135 | ///
136 | /// DataSetMetaData messages
137 | ///
138 | public DataSetMetaDataType DataSetMetaData
139 | {
140 | get
141 | {
142 | return m_metadata;
143 | }
144 | }
145 |
146 | ///
147 | /// TRUE if it is a metadata message.
148 | ///
149 | public bool IsMetaDataMessage
150 | {
151 | get { return m_metadata != null; }
152 | }
153 |
154 | ///
155 | /// Get the writer group configuration for this network message
156 | ///
157 | internal WriterGroupDataType WriterGroupConfiguration { get; set; }
158 | #endregion
159 |
160 | #region Public Methods
161 | ///
162 | /// Encodes the object and returns the resulting byte array.
163 | ///
164 | /// The context.
165 | public abstract byte[] Encode(IServiceMessageContext messageContext);
166 |
167 | ///
168 | /// Encodes the object in the specified stream.
169 | ///
170 | /// The context.
171 | /// The stream to use.
172 | public abstract void Encode(IServiceMessageContext messageContext, Stream stream);
173 |
174 | ///
175 | /// Decodes the message
176 | ///
177 | ///
178 | ///
179 | ///
180 | public abstract void Decode(IServiceMessageContext messageContext, byte[] message, IList dataSetReaders);
181 | #endregion
182 |
183 | #region Protected Methods
184 | ///
185 | /// The DataSetDecodeErrorOccurred event handler
186 | ///
187 | ///
188 | protected virtual void OnDataSetDecodeErrorOccurred(DataSetDecodeErrorEventArgs e)
189 | {
190 | DataSetDecodeErrorOccurred?.Invoke(this, e);
191 | }
192 | #endregion
193 |
194 | }
195 | }
196 |
--------------------------------------------------------------------------------
/Interfaces/IMessageProcessor.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace UACloudDashboard.Interfaces
3 | {
4 | using System;
5 |
6 | public interface IMessageProcessor
7 | {
8 | void Clear();
9 |
10 | void ProcessMessage(byte[] payload, DateTime receivedTime, string contentType);
11 | }
12 | }
--------------------------------------------------------------------------------
/Interfaces/ISubscriber.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace UACloudDashboard.Interfaces
3 | {
4 | public interface ISubscriber
5 | {
6 | public void Run();
7 |
8 | public void Stop();
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/KafkaSubscriber.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace Opc.Ua.Cloud.Dashboard
3 | {
4 | using Confluent.Kafka;
5 | using Microsoft.Extensions.Logging;
6 | using System;
7 | using System.Collections.Generic;
8 | using System.Text;
9 | using System.Threading;
10 | using UACloudDashboard.Interfaces;
11 |
12 | public class KafkaSubscriber : ISubscriber
13 | {
14 | private IConsumer _consumer = null;
15 |
16 | private readonly ILogger _logger;
17 | private readonly IMessageProcessor _uaMessageProcessor;
18 |
19 | public KafkaSubscriber(IMessageProcessor uaMessageProcessor, ILogger logger)
20 | {
21 | _logger = logger;
22 | _uaMessageProcessor = uaMessageProcessor;
23 | }
24 |
25 | public void Run()
26 | {
27 | while (true)
28 | {
29 | try
30 | {
31 | if ((_consumer == null) || (_consumer.Subscription == null))
32 | {
33 | // we're not connected yet, try to (re)-connect in 5 seconds
34 | Thread.Sleep(5000);
35 |
36 | Connect();
37 |
38 | continue;
39 | }
40 |
41 | ConsumeResult result = _consumer.Consume();
42 |
43 | if (result.Message != null)
44 | {
45 | string contentType = "application/json";
46 | if (result.Message.Headers != null && result.Message.Headers.Count > 0)
47 | {
48 | foreach (var header in result.Message.Headers)
49 | {
50 | if (header.Key.Equals("Content-Type"))
51 | {
52 | contentType = Encoding.UTF8.GetString(header.GetValueBytes());
53 | }
54 | }
55 | }
56 |
57 | _uaMessageProcessor.ProcessMessage(result.Message.Value, result.Message.Timestamp.UtcDateTime, contentType);
58 | }
59 | }
60 | catch (Exception ex)
61 | {
62 | _logger.LogError(ex.Message);
63 | Stop();
64 | }
65 | }
66 | }
67 |
68 | public void Stop()
69 | {
70 | try
71 | {
72 | // disconnect if still connected
73 | if (_consumer != null)
74 | {
75 | _consumer.Close();
76 | _consumer.Dispose();
77 | _consumer = null;
78 | }
79 | }
80 | catch (Exception)
81 | {
82 | // do nothing
83 | }
84 | }
85 |
86 | public void Connect()
87 | {
88 | try
89 | {
90 | // disconnect if still connected
91 | if (_consumer != null)
92 | {
93 | _consumer.Close();
94 | _consumer.Dispose();
95 | _consumer = null;
96 | }
97 |
98 | // create Kafka client
99 | var conf = new ConsumerConfig
100 | {
101 | GroupId = Environment.GetEnvironmentVariable("CLIENT_NAME"),
102 | BootstrapServers = Environment.GetEnvironmentVariable("BROKER_NAME") + ":" + Environment.GetEnvironmentVariable("BROKER_PORT"),
103 | AutoOffsetReset = AutoOffsetReset.Earliest,
104 | SecurityProtocol = SecurityProtocol.SaslSsl,
105 | SaslMechanism = SaslMechanism.Plain,
106 | SaslUsername = Environment.GetEnvironmentVariable("BROKER_USERNAME"),
107 | SaslPassword = Environment.GetEnvironmentVariable("BROKER_PASSWORD")
108 | };
109 |
110 | _consumer = new ConsumerBuilder(conf).Build();
111 |
112 | _consumer.Subscribe(Environment.GetEnvironmentVariable("TOPIC"));
113 |
114 | if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("METADATA_TOPIC")))
115 | {
116 | _consumer.Subscribe(new List() {
117 | Environment.GetEnvironmentVariable("TOPIC"),
118 | Environment.GetEnvironmentVariable("METADATA_TOPIC")
119 | });
120 | }
121 |
122 | _logger.LogInformation("Connected to Kafka broker.");
123 | }
124 | catch (Exception ex)
125 | {
126 | _logger.LogError(ex.Message);
127 | }
128 | }
129 | }
130 | }
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 Erich Barnstedt
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/MQTTSubscriber.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace Opc.Ua.Cloud.Dashboard
3 | {
4 | using Microsoft.Extensions.Logging;
5 | using MQTTnet;
6 | using MQTTnet.Exceptions;
7 | using MQTTnet.Packets;
8 | using MQTTnet.Protocol;
9 | using System;
10 | using System.Buffers;
11 | using System.Collections.Generic;
12 | using System.Globalization;
13 | using System.Linq;
14 | using System.Text;
15 | using System.Threading;
16 | using System.Threading.Tasks;
17 | using UACloudDashboard.Interfaces;
18 |
19 | public class MQTTSubscriber : ISubscriber
20 | {
21 | private IMqttClient _client = null;
22 | private readonly ILogger _logger;
23 | private IMessageProcessor _uaMessageProcessor;
24 |
25 | public MQTTSubscriber(IMessageProcessor uaMessageProcessor, ILogger logger)
26 | {
27 | _logger = logger;
28 | _uaMessageProcessor = uaMessageProcessor;
29 | }
30 |
31 | public void Run()
32 | {
33 | // try to connect every 5 seconds
34 | while (!Connect())
35 | {
36 | Thread.Sleep(5000);
37 | }
38 | }
39 |
40 | public void Stop()
41 | {
42 | try
43 | {
44 | // disconnect if still connected
45 | if ((_client != null) && _client.IsConnected)
46 | {
47 | _client.DisconnectAsync().GetAwaiter().GetResult();
48 | _client.Dispose();
49 | _client = null;
50 | }
51 | }
52 | catch (Exception)
53 | {
54 | // do nothing
55 | }
56 | }
57 |
58 | private bool Connect()
59 | {
60 | try
61 | {
62 | // disconnect if still connected
63 | if ((_client != null) && _client.IsConnected)
64 | {
65 | _client.DisconnectAsync().GetAwaiter().GetResult();
66 | _client.Dispose();
67 | _client = null;
68 |
69 | Thread.Sleep(3000);
70 | }
71 |
72 | // create MQTT client
73 | _client = new MqttClientFactory().CreateMqttClient();
74 | _client.ApplicationMessageReceivedAsync += msg => HandleMessageAsync(msg);
75 | var clientOptions = new MqttClientOptionsBuilder()
76 | .WithTcpServer(opt => opt.NoDelay = true)
77 | .WithClientId(Environment.GetEnvironmentVariable("CLIENT_NAME"))
78 | .WithTcpServer(Environment.GetEnvironmentVariable("BROKER_NAME"), int.Parse(Environment.GetEnvironmentVariable("BROKER_PORT")))
79 | .WithTlsOptions(new MqttClientTlsOptions { UseTls = !string.IsNullOrEmpty(Environment.GetEnvironmentVariable("USE_TLS")) })
80 | .WithProtocolVersion(MQTTnet.Formatter.MqttProtocolVersion.V311)
81 | .WithTimeout(TimeSpan.FromSeconds(10))
82 | .WithKeepAlivePeriod(TimeSpan.FromSeconds(100))
83 | .WithCleanSession(true) // clear existing subscriptions
84 | .WithCredentials(Environment.GetEnvironmentVariable("BROKER_USERNAME"), Environment.GetEnvironmentVariable("BROKER_PASSWORD"));
85 |
86 | // setup disconnection handling
87 | _client.DisconnectedAsync += disconnectArgs =>
88 | {
89 | _logger.LogInformation($"Disconnected from MQTT broker: {disconnectArgs.Reason}");
90 |
91 | // wait a 5 seconds, then simply reconnect again, if needed
92 | Thread.Sleep(5000);
93 |
94 | if ((_client == null) || !_client.IsConnected)
95 | {
96 | Connect();
97 | }
98 |
99 | return Task.CompletedTask;
100 | };
101 |
102 | try
103 | {
104 | var connectResult = _client.ConnectAsync(clientOptions.Build(), CancellationToken.None).GetAwaiter().GetResult();
105 | if (connectResult.ResultCode != MqttClientConnectResultCode.Success)
106 | {
107 | var status = GetStatus(connectResult.UserProperties)?.ToString("x4");
108 | throw new Exception($"Connection to MQTT broker failed. Status: {connectResult.ResultCode}; status: {status}");
109 | }
110 |
111 | var subscribeResult = _client.SubscribeAsync(
112 | new MqttTopicFilter
113 | {
114 | Topic = Environment.GetEnvironmentVariable("TOPIC"),
115 | QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce
116 | }).GetAwaiter().GetResult();
117 |
118 | // make sure subscriptions were successful
119 | if (subscribeResult.Items.Count != 1 || subscribeResult.Items.ElementAt(0).ResultCode != MqttClientSubscribeResultCode.GrantedQoS0)
120 | {
121 | throw new ApplicationException("Failed to subscribe");
122 | }
123 |
124 | _logger.LogInformation("Connected to MQTT broker.");
125 |
126 | return true;
127 | }
128 | catch (MqttCommunicationException ex)
129 | {
130 | _logger.LogError($"Failed to connect with reason {ex.HResult} and message: {ex.Message}");
131 | if ((ex.Data != null) && (ex.Data.Count > 0))
132 | {
133 | foreach (var prop in ex.Data)
134 | {
135 | _logger.LogError($"{prop.ToString()}");
136 | }
137 | }
138 |
139 | return false;
140 | }
141 | }
142 | catch (Exception ex)
143 | {
144 | _logger.LogError("Failed to connect to MQTT broker: " + ex.Message);
145 |
146 | return false;
147 | }
148 | }
149 |
150 | private MqttApplicationMessage BuildResponse(string status, string id, string responseTopic, byte[] payload)
151 | {
152 | return new MqttApplicationMessageBuilder()
153 | .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtLeastOnce)
154 | .WithTopic($"{responseTopic}/{status}/{id}")
155 | .WithPayload(payload)
156 | .Build();
157 | }
158 |
159 | // parses status from packet properties
160 | private int? GetStatus(List properties)
161 | {
162 | var status = properties.FirstOrDefault(up => up.Name == "status");
163 | if (status == null)
164 | {
165 | return null;
166 | }
167 |
168 | return int.Parse(status.Value, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
169 | }
170 |
171 | // handles all incoming messages
172 | private async Task HandleMessageAsync(MqttApplicationMessageReceivedEventArgs args)
173 | {
174 | try
175 | {
176 | _uaMessageProcessor.ProcessMessage(args.ApplicationMessage.Payload.ToArray(), DateTime.UtcNow, args.ApplicationMessage.ContentType);
177 |
178 | // send reponse to MQTT broker, if required
179 | if (args.ApplicationMessage.ResponseTopic != null)
180 | {
181 | byte[] responsePayload = Encoding.UTF8.GetBytes("Success");
182 | await _client.PublishAsync(BuildResponse("200", string.Empty, args.ApplicationMessage.ResponseTopic, responsePayload)).ConfigureAwait(false);
183 | }
184 | }
185 | catch (Exception ex)
186 | {
187 | _logger.LogError(ex.Message);
188 |
189 | // send error to MQTT broker, if required
190 | if (args.ApplicationMessage.ResponseTopic != null)
191 | {
192 | await _client.PublishAsync(BuildResponse("500", string.Empty, args.ApplicationMessage.ResponseTopic, Encoding.UTF8.GetBytes(ex.Message))).ConfigureAwait(false);
193 | }
194 | }
195 | }
196 | }
197 | }
--------------------------------------------------------------------------------
/Models/ErrorViewModel.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace Opc.Ua.Cloud.Dashboard.Models
3 | {
4 | public class ErrorViewModel
5 | {
6 | public string RequestId { get; set; }
7 |
8 | public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Program.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace Opc.Ua.Cloud.Dashboard
3 | {
4 | using Microsoft.AspNetCore.Hosting;
5 | using Microsoft.Extensions.Hosting;
6 |
7 | public class Program
8 | {
9 | public static void Main(string[] args)
10 | {
11 | CreateHostBuilder(args).Build().Run();
12 | }
13 |
14 | public static IHostBuilder CreateHostBuilder(string[] args) =>
15 | Host.CreateDefaultBuilder(args)
16 | .ConfigureWebHostDefaults(webBuilder =>
17 | {
18 | webBuilder.UseStartup();
19 | });
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Properties/ServiceDependencies/connected-factory-showcase - Web Deploy/profile.arm.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
3 | "contentVersion": "1.0.0.0",
4 | "metadata": {
5 | "_dependencyType": "appService.windows"
6 | },
7 | "parameters": {
8 | "resourceGroupName": {
9 | "type": "string",
10 | "defaultValue": "connected-factory-showcase",
11 | "metadata": {
12 | "description": "Name of the resource group for the resource. It is recommended to put resources under same resource group for better tracking."
13 | }
14 | },
15 | "resourceGroupLocation": {
16 | "type": "string",
17 | "defaultValue": "westeurope",
18 | "metadata": {
19 | "description": "Location of the resource group. Resource groups could have different location than resources, however by default we use API versions from latest hybrid profile which support all locations for resource types we support."
20 | }
21 | },
22 | "resourceName": {
23 | "type": "string",
24 | "defaultValue": "connected-factory-showcase",
25 | "metadata": {
26 | "description": "Name of the main resource to be created by this template."
27 | }
28 | },
29 | "resourceLocation": {
30 | "type": "string",
31 | "defaultValue": "[parameters('resourceGroupLocation')]",
32 | "metadata": {
33 | "description": "Location of the resource. By default use resource group's location, unless the resource provider is not supported there."
34 | }
35 | }
36 | },
37 | "variables": {
38 | "appServicePlan_name": "[concat('Plan', uniqueString(concat(parameters('resourceName'), subscription().subscriptionId)))]",
39 | "appServicePlan_ResourceId": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', parameters('resourceGroupName'), '/providers/Microsoft.Web/serverFarms/', variables('appServicePlan_name'))]"
40 | },
41 | "resources": [
42 | {
43 | "type": "Microsoft.Resources/resourceGroups",
44 | "name": "[parameters('resourceGroupName')]",
45 | "location": "[parameters('resourceGroupLocation')]",
46 | "apiVersion": "2019-10-01"
47 | },
48 | {
49 | "type": "Microsoft.Resources/deployments",
50 | "name": "[concat(parameters('resourceGroupName'), 'Deployment', uniqueString(concat(parameters('resourceName'), subscription().subscriptionId)))]",
51 | "resourceGroup": "[parameters('resourceGroupName')]",
52 | "apiVersion": "2019-10-01",
53 | "dependsOn": [
54 | "[parameters('resourceGroupName')]"
55 | ],
56 | "properties": {
57 | "mode": "Incremental",
58 | "template": {
59 | "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
60 | "contentVersion": "1.0.0.0",
61 | "resources": [
62 | {
63 | "location": "[parameters('resourceLocation')]",
64 | "name": "[parameters('resourceName')]",
65 | "type": "Microsoft.Web/sites",
66 | "apiVersion": "2015-08-01",
67 | "tags": {
68 | "[concat('hidden-related:', variables('appServicePlan_ResourceId'))]": "empty"
69 | },
70 | "dependsOn": [
71 | "[variables('appServicePlan_ResourceId')]"
72 | ],
73 | "kind": "app",
74 | "properties": {
75 | "name": "[parameters('resourceName')]",
76 | "kind": "app",
77 | "httpsOnly": true,
78 | "reserved": false,
79 | "serverFarmId": "[variables('appServicePlan_ResourceId')]",
80 | "siteConfig": {
81 | "metadata": [
82 | {
83 | "name": "CURRENT_STACK",
84 | "value": "dotnetcore"
85 | }
86 | ]
87 | }
88 | },
89 | "identity": {
90 | "type": "SystemAssigned"
91 | }
92 | },
93 | {
94 | "location": "[parameters('resourceLocation')]",
95 | "name": "[variables('appServicePlan_name')]",
96 | "type": "Microsoft.Web/serverFarms",
97 | "apiVersion": "2015-08-01",
98 | "sku": {
99 | "name": "S1",
100 | "tier": "Standard",
101 | "family": "S",
102 | "size": "S1"
103 | },
104 | "properties": {
105 | "name": "[variables('appServicePlan_name')]"
106 | }
107 | }
108 | ]
109 | }
110 | }
111 | }
112 | ]
113 | }
--------------------------------------------------------------------------------
/Properties/ServiceDependencies/connected-factory-showcase-achema-opcua-dashboard - Web Deploy/profile.arm.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
3 | "contentVersion": "1.0.0.0",
4 | "metadata": {
5 | "_dependencyType": "appService.windows"
6 | },
7 | "parameters": {
8 | "resourceGroupName": {
9 | "type": "string",
10 | "defaultValue": "connected-factory-showcase",
11 | "metadata": {
12 | "description": "Name of the resource group for the resource. It is recommended to put resources under same resource group for better tracking."
13 | }
14 | },
15 | "resourceGroupLocation": {
16 | "type": "string",
17 | "defaultValue": "",
18 | "metadata": {
19 | "description": "Location of the resource group. Resource groups could have different location than resources, however by default we use API versions from latest hybrid profile which support all locations for resource types we support."
20 | }
21 | },
22 | "resourceName": {
23 | "type": "string",
24 | "defaultValue": "achema-opcua-dashboard",
25 | "metadata": {
26 | "description": "Name of the main resource to be created by this template."
27 | }
28 | },
29 | "resourceLocation": {
30 | "type": "string",
31 | "defaultValue": "[parameters('resourceGroupLocation')]",
32 | "metadata": {
33 | "description": "Location of the resource. By default use resource group's location, unless the resource provider is not supported there."
34 | }
35 | }
36 | },
37 | "variables": {
38 | "appServicePlan_name": "[concat('Plan', uniqueString(concat(parameters('resourceName'), subscription().subscriptionId)))]",
39 | "appServicePlan_ResourceId": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', parameters('resourceGroupName'), '/providers/Microsoft.Web/serverFarms/', variables('appServicePlan_name'))]"
40 | },
41 | "resources": [
42 | {
43 | "type": "Microsoft.Resources/resourceGroups",
44 | "name": "[parameters('resourceGroupName')]",
45 | "location": "[parameters('resourceGroupLocation')]",
46 | "apiVersion": "2019-10-01"
47 | },
48 | {
49 | "type": "Microsoft.Resources/deployments",
50 | "name": "[concat(parameters('resourceGroupName'), 'Deployment', uniqueString(concat(parameters('resourceName'), subscription().subscriptionId)))]",
51 | "resourceGroup": "[parameters('resourceGroupName')]",
52 | "apiVersion": "2019-10-01",
53 | "dependsOn": [
54 | "[parameters('resourceGroupName')]"
55 | ],
56 | "properties": {
57 | "mode": "Incremental",
58 | "template": {
59 | "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
60 | "contentVersion": "1.0.0.0",
61 | "resources": [
62 | {
63 | "location": "[parameters('resourceLocation')]",
64 | "name": "[parameters('resourceName')]",
65 | "type": "Microsoft.Web/sites",
66 | "apiVersion": "2015-08-01",
67 | "tags": {
68 | "[concat('hidden-related:', variables('appServicePlan_ResourceId'))]": "empty"
69 | },
70 | "dependsOn": [
71 | "[variables('appServicePlan_ResourceId')]"
72 | ],
73 | "kind": "app",
74 | "properties": {
75 | "name": "[parameters('resourceName')]",
76 | "kind": "app",
77 | "httpsOnly": true,
78 | "reserved": false,
79 | "serverFarmId": "[variables('appServicePlan_ResourceId')]",
80 | "siteConfig": {
81 | "metadata": [
82 | {
83 | "name": "CURRENT_STACK",
84 | "value": "dotnetcore"
85 | }
86 | ]
87 | }
88 | },
89 | "identity": {
90 | "type": "SystemAssigned"
91 | }
92 | },
93 | {
94 | "location": "[parameters('resourceLocation')]",
95 | "name": "[variables('appServicePlan_name')]",
96 | "type": "Microsoft.Web/serverFarms",
97 | "apiVersion": "2015-08-01",
98 | "sku": {
99 | "name": "S1",
100 | "tier": "Standard",
101 | "family": "S",
102 | "size": "S1"
103 | },
104 | "properties": {
105 | "name": "[variables('appServicePlan_name')]"
106 | }
107 | }
108 | ]
109 | }
110 | }
111 | }
112 | ]
113 | }
--------------------------------------------------------------------------------
/Properties/launchSettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "iisSettings": {
3 | "windowsAuthentication": false,
4 | "anonymousAuthentication": true,
5 | "iisExpress": {
6 | "applicationUrl": "http://localhost:38829",
7 | "sslPort": 44358
8 | }
9 | },
10 | "profiles": {
11 | "IIS Express": {
12 | "commandName": "IISExpress",
13 | "launchBrowser": true,
14 | "environmentVariables": {
15 | "ASPNETCORE_ENVIRONMENT": "Development"
16 | }
17 | },
18 | "UANodesetWebViewer": {
19 | "commandName": "Project",
20 | "launchBrowser": true,
21 | "environmentVariables": {
22 | "ASPNETCORE_ENVIRONMENT": "Development"
23 | },
24 | "applicationUrl": "https://localhost:5001;http://localhost:5000"
25 | },
26 | "Docker": {
27 | "commandName": "Docker",
28 | "launchBrowser": true,
29 | "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}",
30 | "publishAllPorts": true,
31 | "useSSL": true
32 | }
33 | }
34 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # UA Cloud Dashboard
2 | A cross-platform OPC UA cloud dashboard reference implementation leveraging Kafka and MQTT. It runs in a Docker container and displays OPC UA PubSub telemetry data, read directly from a Kafka broker or an MQTT broker. It supports both JSON and binary payloads as well as OPC UA Complex Types decoding.
3 |
4 | ## Installation
5 |
6 | The following environment variables must be defined:
7 |
8 | * BROKER_NAME - the name of the broker to use
9 | * BROKER_PORT - the port number of the broker
10 | * CLIENT_NAME - the client name to use with the broker
11 | * BROKER_USERNAME - the username to use with the broker
12 | * BROKER_PASSWORD - the password to use with the broker
13 | * TOPIC - the broker topic to read messages from
14 | * METADATA_TOPIC - (optional) the broker metadata topic to read messages from
15 | * USE_MQTT - (optional) Read OPC UA PubSub telementry messages from an MQTT borker instead of a Kafka broker
16 | * USE_TLS - (optional) set to 1 to use Transport Layer Security
17 | * IGNORE_MISSING_METADATA - (optional) set to 1 to parse messages even if no metadata was sent for the messages
18 |
19 | ## Usage
20 |
21 | Run it on a Docker-enabled computer via:
22 |
23 | `docker run -e anEnvironmentVariableFromAbove="yourSetting" -p 80:8080 ghcr.io/barnstee/ua-clouddashboard:main`
24 |
25 | Then point your web browser to
26 |
27 | ## Build Status
28 |
29 | [](https://github.com/barnstee/UA-CloudDashboard/actions/workflows/docker-publish.yml)
30 |
31 |
--------------------------------------------------------------------------------
/Startup.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace Opc.Ua.Cloud.Dashboard
3 | {
4 | using Microsoft.AspNetCore.Builder;
5 | using Microsoft.AspNetCore.Hosting;
6 | using Microsoft.Extensions.Configuration;
7 | using Microsoft.Extensions.DependencyInjection;
8 | using Microsoft.Extensions.Hosting;
9 | using System.Diagnostics;
10 | using System;
11 | using UACloudDashboard.Interfaces;
12 |
13 | public class Startup
14 | {
15 | public Startup(IConfiguration configuration)
16 | {
17 | Configuration = configuration;
18 | }
19 |
20 | public IConfiguration Configuration { get; }
21 |
22 | // This method gets called by the runtime. Use this method to add services to the container.
23 | public void ConfigureServices(IServiceCollection services)
24 | {
25 | services.AddControllersWithViews();
26 |
27 | services.AddSignalR();
28 |
29 | services.AddSingleton();
30 |
31 | if (!string.IsNullOrEmpty(Configuration["USE_MQTT"]))
32 | {
33 | services.AddSingleton();
34 | }
35 | else
36 | {
37 | services.AddSingleton();
38 | }
39 | }
40 |
41 | // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
42 | public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
43 | {
44 | if (env.IsDevelopment())
45 | {
46 | app.UseDeveloperExceptionPage();
47 | }
48 | else
49 | {
50 | app.UseExceptionHandler("/DashboardController/Error");
51 |
52 | // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
53 | app.UseHsts();
54 | }
55 |
56 | app.UseHttpsRedirection();
57 |
58 | app.UseStaticFiles();
59 |
60 | app.UseRouting();
61 |
62 | app.UseAuthorization();
63 |
64 | app.UseEndpoints(endpoints =>
65 | {
66 | endpoints.MapControllerRoute(
67 | name: "default",
68 | pattern: "{controller=Dashboard}/{action=Index}/{id?}");
69 |
70 | endpoints.MapHub("/statushub");
71 | });
72 | }
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/StatusHub.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace Opc.Ua.Cloud.Dashboard
3 | {
4 | using Microsoft.AspNetCore.SignalR;
5 | using System;
6 | using System.Collections.Generic;
7 | using System.Collections.Immutable;
8 | using System.Text;
9 | using System.Threading.Tasks;
10 |
11 | public class StatusHub : Hub
12 | {
13 | // this is our SignalR Status Hub
14 | }
15 |
16 | public class StatusHubClient
17 | {
18 | public Dictionary> TableEntries { get; set; } = new Dictionary>();
19 |
20 | public Dictionary ChartEntries { get; set; } = new Dictionary();
21 |
22 | private readonly IHubContext _hubContext;
23 |
24 | public StatusHubClient(IHubContext hubContext)
25 | {
26 | _hubContext = hubContext;
27 |
28 | _ = Task.Run(() => SendMessageViaSignalR());
29 | }
30 |
31 | private async Task SendMessageViaSignalR()
32 | {
33 | while (true)
34 | {
35 | await Task.Delay(3000).ConfigureAwait(false);
36 |
37 | lock (TableEntries)
38 | {
39 | foreach (string displayName in TableEntries.Keys)
40 | {
41 | _hubContext.Clients.All.SendAsync("addDatasetToChart", displayName).GetAwaiter().GetResult();
42 | }
43 |
44 | foreach (KeyValuePair entry in ChartEntries)
45 | {
46 | _hubContext.Clients.All.SendAsync("addDataToChart", entry.Key, entry.Value).GetAwaiter().GetResult();
47 | }
48 |
49 | ChartEntries.Clear();
50 |
51 | CreateAndSendTelemetryTable();
52 | }
53 | }
54 | }
55 |
56 | private void CreateAndSendTelemetryTable()
57 | {
58 | // create HTML table
59 | StringBuilder sb = new StringBuilder();
60 | sb.Append("");
61 |
62 | // header
63 | sb.Append("");
64 | sb.Append("Name ");
65 | sb.Append("Latest Value ");
66 | sb.Append("Time Stamp ");
67 | sb.Append(" ");
68 |
69 | // rows
70 | foreach (KeyValuePair> item in TableEntries.ToImmutableSortedDictionary())
71 | {
72 | sb.Append("");
73 | sb.Append("" + item.Key + " ");
74 | sb.Append("" + item.Value.Item1 + " ");
75 | sb.Append("" + item.Value.Item2 + " ");
76 | sb.Append(" ");
77 | }
78 |
79 | sb.Append("
");
80 |
81 | _hubContext.Clients.All.SendAsync("addTable", sb.ToString()).GetAwaiter().GetResult();
82 | }
83 | }
84 | }
85 |
--------------------------------------------------------------------------------
/UACloudDashboard.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | net9.0
5 | b2d0ab73-8f42-4b3f-9415-ab542610a5f8
6 | Linux
7 | .
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 | PreserveNewest
32 |
33 |
34 | PreserveNewest
35 |
36 |
37 | PreserveNewest
38 |
39 |
40 | PreserveNewest
41 |
42 |
43 | PreserveNewest
44 |
45 |
46 | PreserveNewest
47 |
48 |
49 | PreserveNewest
50 |
51 |
52 | PreserveNewest
53 |
54 |
55 | PreserveNewest
56 |
57 |
58 | PreserveNewest
59 |
60 |
61 | PreserveNewest
62 |
63 |
64 | PreserveNewest
65 |
66 |
67 | PreserveNewest
68 |
69 |
70 | PreserveNewest
71 |
72 |
73 | PreserveNewest
74 |
75 |
76 | PreserveNewest
77 |
78 |
79 | PreserveNewest
80 |
81 |
82 | PreserveNewest
83 |
84 |
85 | PreserveNewest
86 |
87 |
88 | PreserveNewest
89 |
90 |
91 | PreserveNewest
92 |
93 |
94 | PreserveNewest
95 |
96 |
97 | PreserveNewest
98 |
99 |
100 | PreserveNewest
101 |
102 |
103 | PreserveNewest
104 |
105 |
106 | PreserveNewest
107 |
108 |
109 | PreserveNewest
110 |
111 |
112 | PreserveNewest
113 |
114 |
115 | PreserveNewest
116 |
117 |
118 | PreserveNewest
119 |
120 |
121 | PreserveNewest
122 |
123 |
124 | PreserveNewest
125 |
126 |
127 | PreserveNewest
128 |
129 |
130 | PreserveNewest
131 |
132 |
133 | PreserveNewest
134 |
135 |
136 | PreserveNewest
137 |
138 |
139 | PreserveNewest
140 |
141 |
142 | PreserveNewest
143 |
144 |
145 | PreserveNewest
146 |
147 |
148 |
149 |
150 |
--------------------------------------------------------------------------------
/UACloudDashboard.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 17
4 | VisualStudioVersion = 17.1.32328.378
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UACloudDashboard", "UACloudDashboard.csproj", "{59CBA7AE-C0F3-446C-9DF6-650CF3559696}"
7 | EndProject
8 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{00E3378F-0599-4195-9AE8-A56F81EE2645}"
9 | ProjectSection(SolutionItems) = preProject
10 | .github\workflows\docker-publish.yml = .github\workflows\docker-publish.yml
11 | EndProjectSection
12 | EndProject
13 | Global
14 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
15 | Debug|Any CPU = Debug|Any CPU
16 | Release|Any CPU = Release|Any CPU
17 | EndGlobalSection
18 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
19 | {59CBA7AE-C0F3-446C-9DF6-650CF3559696}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
20 | {59CBA7AE-C0F3-446C-9DF6-650CF3559696}.Debug|Any CPU.Build.0 = Debug|Any CPU
21 | {59CBA7AE-C0F3-446C-9DF6-650CF3559696}.Release|Any CPU.ActiveCfg = Release|Any CPU
22 | {59CBA7AE-C0F3-446C-9DF6-650CF3559696}.Release|Any CPU.Build.0 = Release|Any CPU
23 | EndGlobalSection
24 | GlobalSection(SolutionProperties) = preSolution
25 | HideSolutionNode = FALSE
26 | EndGlobalSection
27 | GlobalSection(ExtensibilityGlobals) = postSolution
28 | SolutionGuid = {D9D5366C-0DB7-4312-AC86-CD41A0CC08B8}
29 | EndGlobalSection
30 | EndGlobal
31 |
--------------------------------------------------------------------------------
/Views/Dashboard/Graph.cshtml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
Please wait while we collect telemetry data...
9 |
10 |
11 | @section scripts {
12 |
13 |
167 | }
168 |
--------------------------------------------------------------------------------
/Views/Dashboard/Privacy.cshtml:
--------------------------------------------------------------------------------
1 | @{
2 | ViewData["Title"] = "Privacy Policy";
3 | }
4 | @ViewData["Title"]
5 |
6 | This app does not collect any user data.
7 |
--------------------------------------------------------------------------------
/Views/Shared/Error.cshtml:
--------------------------------------------------------------------------------
1 | @using Opc.Ua.Cloud.Dashboard.Models
2 |
3 | @model ErrorViewModel
4 | @{
5 | ViewData["Title"] = "Error";
6 | }
7 |
8 | Error.
9 | An error occurred while processing your request.
10 |
11 | @if (Model.ShowRequestId)
12 | {
13 |
14 | Request ID: @Model.RequestId
15 |
16 | }
17 |
18 | Development Mode
19 |
20 | Swapping to Development environment will display more detailed information about the error that occurred.
21 |
22 |
23 | The Development environment shouldn't be enabled for deployed applications.
24 | It can result in displaying sensitive information from exceptions to end users.
25 | For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development
26 | and restarting the app.
27 |
28 |
--------------------------------------------------------------------------------
/Views/Shared/_Layout.cshtml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | UA Cloud Dashboard
7 |
8 |
9 |
10 |
11 |
12 |
27 |
28 |
29 | @RenderBody()
30 |
31 |
32 |
33 |
38 |
39 |
40 |
41 |
42 |
43 |
44 | @RenderSection("Scripts", required: false)
45 |
46 |
47 |
--------------------------------------------------------------------------------
/Views/Shared/_ValidationScriptsPartial.cshtml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/Views/_ViewImports.cshtml:
--------------------------------------------------------------------------------
1 | @using Opc.Ua.Cloud.Dashboard
2 |
3 | @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
4 | @addTagHelper *, Opc.Ua.Cloud.Dashboard
5 |
6 |
--------------------------------------------------------------------------------
/Views/_ViewStart.cshtml:
--------------------------------------------------------------------------------
1 | @{
2 | Layout = "_Layout";
3 | }
4 |
--------------------------------------------------------------------------------
/appsettings.Development.json:
--------------------------------------------------------------------------------
1 | {
2 | "Logging": {
3 | "LogLevel": {
4 | "Default": "Information",
5 | "Microsoft": "Warning",
6 | "Microsoft.Hosting.Lifetime": "Information"
7 | }
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/appsettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "Logging": {
3 | "LogLevel": {
4 | "Default": "Information",
5 | "Microsoft": "Warning",
6 | "Microsoft.Hosting.Lifetime": "Information"
7 | }
8 | },
9 | "AllowedHosts": "*"
10 | }
11 |
--------------------------------------------------------------------------------
/libman.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "1.0",
3 | "defaultProvider": "cdnjs",
4 | "libraries": [
5 | {
6 | "library": "aspnet-signalr@1.0.27",
7 | "destination": "wwwroot/js/aspnet-signalr/"
8 | },
9 | {
10 | "library": "jstree@3.3.11",
11 | "destination": "wwwroot/lib/jstree/"
12 | },
13 | {
14 | "library": "jquery-ajax-unobtrusive@3.2.6",
15 | "destination": "wwwroot/lib/jquery-ajax-unobtrusive/"
16 | },
17 | {
18 | "library": "bootstrap-table@1.18.3",
19 | "destination": "wwwroot/lib/bootstrap-table/"
20 | },
21 | {
22 | "library": "Chart.js@3.2.1",
23 | "destination": "wwwroot/lib/Chart.js/"
24 | }
25 | ]
26 | }
--------------------------------------------------------------------------------
/wwwroot/2mag_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/2mag_logo.png
--------------------------------------------------------------------------------
/wwwroot/Agilent_Logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/Agilent_Logo.png
--------------------------------------------------------------------------------
/wwwroot/Beckhoff_Logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/Beckhoff_Logo.png
--------------------------------------------------------------------------------
/wwwroot/Berthold.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/Berthold.jpg
--------------------------------------------------------------------------------
/wwwroot/Byonoy_Logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/Byonoy_Logo.png
--------------------------------------------------------------------------------
/wwwroot/FHI.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/FHI.png
--------------------------------------------------------------------------------
/wwwroot/Gefran.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/Gefran.png
--------------------------------------------------------------------------------
/wwwroot/INTEGRIS LIMS_Logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/INTEGRIS LIMS_Logo.png
--------------------------------------------------------------------------------
/wwwroot/JAIMA.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/JAIMA.png
--------------------------------------------------------------------------------
/wwwroot/JULABO_LOGO_bei_Einsatz_mit_weisem_Hintergrund.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/JULABO_LOGO_bei_Einsatz_mit_weisem_Hintergrund.png
--------------------------------------------------------------------------------
/wwwroot/KUKA.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/KUKA.png
--------------------------------------------------------------------------------
/wwwroot/Logoeslogan.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/Logoeslogan.jpg
--------------------------------------------------------------------------------
/wwwroot/OPCUA.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/OPCUA.png
--------------------------------------------------------------------------------
/wwwroot/SPECTARIS_Dachmarke_CMYK.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/SPECTARIS_Dachmarke_CMYK.jpg
--------------------------------------------------------------------------------
/wwwroot/amensio.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/amensio.png
--------------------------------------------------------------------------------
/wwwroot/brand.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/brand.png
--------------------------------------------------------------------------------
/wwwroot/css/32px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/css/32px.png
--------------------------------------------------------------------------------
/wwwroot/css/40px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/css/40px.png
--------------------------------------------------------------------------------
/wwwroot/css/throbber.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/css/throbber.gif
--------------------------------------------------------------------------------
/wwwroot/essentim.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/essentim.png
--------------------------------------------------------------------------------
/wwwroot/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/favicon.ico
--------------------------------------------------------------------------------
/wwwroot/gambica_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/gambica_logo.png
--------------------------------------------------------------------------------
/wwwroot/inforsht.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/inforsht.png
--------------------------------------------------------------------------------
/wwwroot/infoteam_2x_4c_rgb_Logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/infoteam_2x_4c_rgb_Logo.png
--------------------------------------------------------------------------------
/wwwroot/inray.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/inray.png
--------------------------------------------------------------------------------
/wwwroot/js/site.js:
--------------------------------------------------------------------------------
1 | // Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification
2 | // for details on configuring this project to bundle and minify static web assets.
3 |
4 | // Write your JavaScript code.
5 |
--------------------------------------------------------------------------------
/wwwroot/labforward.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/labforward.png
--------------------------------------------------------------------------------
/wwwroot/labmas.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/labmas.png
--------------------------------------------------------------------------------
/wwwroot/lads.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/lads.png
--------------------------------------------------------------------------------
/wwwroot/lib/Chart.js/helpers.esm.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Chart.js v3.2.1
3 | * https://www.chartjs.org
4 | * (c) 2021 Chart.js Contributors
5 | * Released under the MIT License
6 | */
7 | export { H as HALF_PI, aT as INFINITY, P as PI, aS as PITAU, aV as QUARTER_PI, aU as RAD_PER_DEG, T as TAU, aW as TWO_THIRDS_PI, O as _addGrace, U as _alignPixel, Y as _alignStartEnd, q as _angleBetween, aX as _angleDiff, _ as _arrayUnique, a3 as _attachContext, am as _bezierCurveTo, aj as _bezierInterpolation, ar as _boundSegment, ah as _boundSegments, a0 as _capitalize, ag as _computeSegments, a4 as _createResolver, aD as _decimalPlaces, aL as _deprecated, a5 as _descriptors, ac as _elementsEqual, L as _factorize, aF as _filterBetween, F as _getParentNode, S as _int16Range, A as _isPointInArea, x as _limitValue, aE as _longestText, aG as _lookup, y as _lookupByKey, R as _measureText, aJ as _merger, aK as _mergerIf, as as _normalizeAngle, ak as _pointInLine, ae as _readValueToProps, B as _rlookupByKey, az as _setMinAndMaxByKey, ai as _steppedInterpolation, al as _steppedLineTo, av as _textX, X as _toLeftRightCenter, af as _updateBezierControlPoints, ao as addRoundedRectPath, aC as almostEquals, aB as almostWhole, N as callback, aa as clearCanvas, k as clipArea, aI as clone, c as color, a8 as debounce, h as defined, ay as distanceBetweenPoints, an as drawPoint, D as each, e as easingEffects, M as finiteOrDefault, aQ as fontString, p as formatNumber, ad as getAngleFromPoint, aH as getHoverColor, E as getMaximumSize, z as getRelativePosition, at as getRtlAdapter, aP as getStyle, b as isArray, g as isFinite, a2 as isFunction, j as isNullOrUndef, w as isNumber, i as isObject, l as listenArrayEvents, K as log10, $ as merge, a6 as mergeIf, aA as niceNum, ax as noop, au as overrideTextDirection, G as readUsedSize, V as renderText, r as requestAnimFrame, a as resolve, f as resolveObjectKey, aw as restoreTextDirection, a9 as retinaScale, ab as setsEqual, s as sign, aN as splineCurve, aO as splineCurveMonotone, J as supportsEventListenerOptions, I as throttled, Q as toDegrees, o as toDimension, W as toFont, aM as toFontString, aR as toLineHeight, C as toPadding, n as toPercentage, t as toRadians, ap as toTRBL, aq as toTRBLCorners, a7 as uid, m as unclipArea, u as unlistenArrayEvents, v as valueOrDefault } from './chunks/helpers.segment.js';
8 |
--------------------------------------------------------------------------------
/wwwroot/lib/Chart.js/helpers.esm.min.js:
--------------------------------------------------------------------------------
1 | export{H as HALF_PI,aT as INFINITY,P as PI,aS as PITAU,aV as QUARTER_PI,aU as RAD_PER_DEG,T as TAU,aW as TWO_THIRDS_PI,O as _addGrace,U as _alignPixel,Y as _alignStartEnd,q as _angleBetween,aX as _angleDiff,_ as _arrayUnique,a3 as _attachContext,am as _bezierCurveTo,aj as _bezierInterpolation,ar as _boundSegment,ah as _boundSegments,a0 as _capitalize,ag as _computeSegments,a4 as _createResolver,aD as _decimalPlaces,aL as _deprecated,a5 as _descriptors,ac as _elementsEqual,L as _factorize,aF as _filterBetween,F as _getParentNode,S as _int16Range,A as _isPointInArea,x as _limitValue,aE as _longestText,aG as _lookup,y as _lookupByKey,R as _measureText,aJ as _merger,aK as _mergerIf,as as _normalizeAngle,ak as _pointInLine,ae as _readValueToProps,B as _rlookupByKey,az as _setMinAndMaxByKey,ai as _steppedInterpolation,al as _steppedLineTo,av as _textX,X as _toLeftRightCenter,af as _updateBezierControlPoints,ao as addRoundedRectPath,aC as almostEquals,aB as almostWhole,N as callback,aa as clearCanvas,k as clipArea,aI as clone,c as color,a8 as debounce,h as defined,ay as distanceBetweenPoints,an as drawPoint,D as each,e as easingEffects,M as finiteOrDefault,aQ as fontString,p as formatNumber,ad as getAngleFromPoint,aH as getHoverColor,E as getMaximumSize,z as getRelativePosition,at as getRtlAdapter,aP as getStyle,b as isArray,g as isFinite,a2 as isFunction,j as isNullOrUndef,w as isNumber,i as isObject,l as listenArrayEvents,K as log10,$ as merge,a6 as mergeIf,aA as niceNum,ax as noop,au as overrideTextDirection,G as readUsedSize,V as renderText,r as requestAnimFrame,a as resolve,f as resolveObjectKey,aw as restoreTextDirection,a9 as retinaScale,ab as setsEqual,s as sign,aN as splineCurve,aO as splineCurveMonotone,J as supportsEventListenerOptions,I as throttled,Q as toDegrees,o as toDimension,W as toFont,aM as toFontString,aR as toLineHeight,C as toPadding,n as toPercentage,t as toRadians,ap as toTRBL,aq as toTRBLCorners,a7 as uid,m as unclipArea,u as unlistenArrayEvents,v as valueOrDefault}from"./chunks/helpers.segment.js";
--------------------------------------------------------------------------------
/wwwroot/lib/Chart.js/utils.js:
--------------------------------------------------------------------------------
1 | import colorLib from '@kurkle/color';
2 | import { DateTime } from 'luxon';
3 | import 'chartjs-adapter-luxon';
4 | import { valueOrDefault } from '../../dist/helpers.esm';
5 |
6 | // Adapted from http://indiegamr.com/generate-repeatable-random-numbers-in-js/
7 | var _seed = Date.now();
8 |
9 | export function srand(seed) {
10 | _seed = seed;
11 | }
12 |
13 | export function rand(min, max) {
14 | min = valueOrDefault(min, 0);
15 | max = valueOrDefault(max, 0);
16 | _seed = (_seed * 9301 + 49297) % 233280;
17 | return min + (_seed / 233280) * (max - min);
18 | }
19 |
20 | export function numbers(config) {
21 | var cfg = config || {};
22 | var min = valueOrDefault(cfg.min, 0);
23 | var max = valueOrDefault(cfg.max, 100);
24 | var from = valueOrDefault(cfg.from, []);
25 | var count = valueOrDefault(cfg.count, 8);
26 | var decimals = valueOrDefault(cfg.decimals, 8);
27 | var continuity = valueOrDefault(cfg.continuity, 1);
28 | var dfactor = Math.pow(10, decimals) || 0;
29 | var data = [];
30 | var i, value;
31 |
32 | for (i = 0; i < count; ++i) {
33 | value = (from[i] || 0) + this.rand(min, max);
34 | if (this.rand() <= continuity) {
35 | data.push(Math.round(dfactor * value) / dfactor);
36 | } else {
37 | data.push(null);
38 | }
39 | }
40 |
41 | return data;
42 | }
43 |
44 | export function points(config) {
45 | const xs = this.numbers(config);
46 | const ys = this.numbers(config);
47 | return xs.map((x, i) => ({ x, y: ys[i] }));
48 | }
49 |
50 | export function bubbles(config) {
51 | return this.points(config).map(pt => {
52 | pt.r = this.rand(config.rmin, config.rmax);
53 | return pt;
54 | });
55 | }
56 |
57 | export function labels(config) {
58 | var cfg = config || {};
59 | var min = cfg.min || 0;
60 | var max = cfg.max || 100;
61 | var count = cfg.count || 8;
62 | var step = (max - min) / count;
63 | var decimals = cfg.decimals || 8;
64 | var dfactor = Math.pow(10, decimals) || 0;
65 | var prefix = cfg.prefix || '';
66 | var values = [];
67 | var i;
68 |
69 | for (i = min; i < max; i += step) {
70 | values.push(prefix + Math.round(dfactor * i) / dfactor);
71 | }
72 |
73 | return values;
74 | }
75 |
76 | const MONTHS = [
77 | 'January',
78 | 'February',
79 | 'March',
80 | 'April',
81 | 'May',
82 | 'June',
83 | 'July',
84 | 'August',
85 | 'September',
86 | 'October',
87 | 'November',
88 | 'December'
89 | ];
90 |
91 | export function months(config) {
92 | var cfg = config || {};
93 | var count = cfg.count || 12;
94 | var section = cfg.section;
95 | var values = [];
96 | var i, value;
97 |
98 | for (i = 0; i < count; ++i) {
99 | value = MONTHS[Math.ceil(i) % 12];
100 | values.push(value.substring(0, section));
101 | }
102 |
103 | return values;
104 | }
105 |
106 | const COLORS = [
107 | '#4dc9f6',
108 | '#f67019',
109 | '#f53794',
110 | '#537bc4',
111 | '#acc236',
112 | '#166a8f',
113 | '#00a950',
114 | '#58595b',
115 | '#8549ba'
116 | ];
117 |
118 | export function color(index) {
119 | return COLORS[index % COLORS.length];
120 | }
121 |
122 | export function transparentize(value, opacity) {
123 | var alpha = opacity === undefined ? 0.5 : 1 - opacity;
124 | return colorLib(value).alpha(alpha).rgbString();
125 | }
126 |
127 | export const CHART_COLORS = {
128 | red: 'rgb(255, 99, 132)',
129 | orange: 'rgb(255, 159, 64)',
130 | yellow: 'rgb(255, 205, 86)',
131 | green: 'rgb(75, 192, 192)',
132 | blue: 'rgb(54, 162, 235)',
133 | purple: 'rgb(153, 102, 255)',
134 | grey: 'rgb(201, 203, 207)'
135 | };
136 |
137 | const NAMED_COLORS = [
138 | CHART_COLORS.red,
139 | CHART_COLORS.orange,
140 | CHART_COLORS.yellow,
141 | CHART_COLORS.green,
142 | CHART_COLORS.blue,
143 | CHART_COLORS.purple,
144 | CHART_COLORS.grey,
145 | ];
146 |
147 | export function namedColor(index) {
148 | return NAMED_COLORS[index % NAMED_COLORS.length];
149 | }
150 |
151 | export function newDate(days) {
152 | return DateTime.now().plus({ days }).toJSDate();
153 | }
154 |
155 | export function newDateString(days) {
156 | return DateTime.now().plus({ days }).toISO();
157 | }
158 |
159 | export function parseISODate(str) {
160 | return DateTime.fromISO(str);
161 | }
--------------------------------------------------------------------------------
/wwwroot/lib/bootstrap-table/bootstrap-table.min.css:
--------------------------------------------------------------------------------
1 | /**
2 | * bootstrap-table - An extended table to integration with some of the most widely used CSS frameworks. (Supports Bootstrap, Semantic UI, Bulma, Material Design, Foundation)
3 | *
4 | * @version v1.18.3
5 | * @homepage https://bootstrap-table.com
6 | * @author wenzhixin (http://wenzhixin.net.cn/)
7 | * @license MIT
8 | */
9 |
10 | .bootstrap-table .fixed-table-toolbar::after{content:"";display:block;clear:both}.bootstrap-table .fixed-table-toolbar .bs-bars,.bootstrap-table .fixed-table-toolbar .columns,.bootstrap-table .fixed-table-toolbar .search{position:relative;margin-top:10px;margin-bottom:10px}.bootstrap-table .fixed-table-toolbar .columns .btn-group>.btn-group{display:inline-block;margin-left:-1px!important}.bootstrap-table .fixed-table-toolbar .columns .btn-group>.btn-group>.btn{border-radius:0}.bootstrap-table .fixed-table-toolbar .columns .btn-group>.btn-group:first-child>.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.bootstrap-table .fixed-table-toolbar .columns .btn-group>.btn-group:last-child>.btn{border-top-right-radius:4px;border-bottom-right-radius:4px}.bootstrap-table .fixed-table-toolbar .columns .dropdown-menu{text-align:left;max-height:300px;overflow:auto;-ms-overflow-style:scrollbar;z-index:1001}.bootstrap-table .fixed-table-toolbar .columns label{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.428571429}.bootstrap-table .fixed-table-toolbar .columns-left{margin-right:5px}.bootstrap-table .fixed-table-toolbar .columns-right{margin-left:5px}.bootstrap-table .fixed-table-toolbar .pull-right .dropdown-menu{right:0;left:auto}.bootstrap-table .fixed-table-container{position:relative;clear:both}.bootstrap-table .fixed-table-container .table{width:100%;margin-bottom:0!important}.bootstrap-table .fixed-table-container .table td,.bootstrap-table .fixed-table-container .table th{vertical-align:middle;box-sizing:border-box}.bootstrap-table .fixed-table-container .table thead th{vertical-align:bottom;padding:0;margin:0}.bootstrap-table .fixed-table-container .table thead th:focus{outline:0 solid transparent}.bootstrap-table .fixed-table-container .table thead th.detail{width:30px}.bootstrap-table .fixed-table-container .table thead th .th-inner{padding:.75rem;vertical-align:bottom;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bootstrap-table .fixed-table-container .table thead th .sortable{cursor:pointer;background-position:right;background-repeat:no-repeat;padding-right:30px!important}.bootstrap-table .fixed-table-container .table thead th .both{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7X QMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC")}.bootstrap-table .fixed-table-container .table thead th .asc{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==")}.bootstrap-table .fixed-table-container .table thead th .desc{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII= ")}.bootstrap-table .fixed-table-container .table tbody tr.selected td{background-color:rgba(0,0,0,.075)}.bootstrap-table .fixed-table-container .table tbody tr.no-records-found td{text-align:center}.bootstrap-table .fixed-table-container .table tbody tr .card-view{display:flex}.bootstrap-table .fixed-table-container .table tbody tr .card-view .card-view-title{font-weight:700;display:inline-block;min-width:30%;width:auto!important;text-align:left!important}.bootstrap-table .fixed-table-container .table tbody tr .card-view .card-view-value{width:100%!important}.bootstrap-table .fixed-table-container .table .bs-checkbox{text-align:center}.bootstrap-table .fixed-table-container .table .bs-checkbox label{margin-bottom:0}.bootstrap-table .fixed-table-container .table .bs-checkbox label input[type=checkbox],.bootstrap-table .fixed-table-container .table .bs-checkbox label input[type=radio]{margin:0 auto!important}.bootstrap-table .fixed-table-container .table.table-sm .th-inner{padding:.3rem}.bootstrap-table .fixed-table-container.fixed-height:not(.has-footer){border-bottom:1px solid #dee2e6}.bootstrap-table .fixed-table-container.fixed-height.has-card-view{border-top:1px solid #dee2e6;border-bottom:1px solid #dee2e6}.bootstrap-table .fixed-table-container.fixed-height .fixed-table-border{border-left:1px solid #dee2e6;border-right:1px solid #dee2e6}.bootstrap-table .fixed-table-container.fixed-height .table thead th{border-bottom:1px solid #dee2e6}.bootstrap-table .fixed-table-container.fixed-height .table-dark thead th{border-bottom:1px solid #32383e}.bootstrap-table .fixed-table-container .fixed-table-header{overflow:hidden}.bootstrap-table .fixed-table-container .fixed-table-body{overflow-x:auto;overflow-y:auto;height:100%}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading{align-items:center;background:#fff;display:flex;justify-content:center;position:absolute;bottom:0;width:100%;z-index:1000;transition:visibility 0s,opacity .15s ease-in-out;opacity:0;visibility:hidden}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.open{visibility:visible;opacity:1}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap{align-items:baseline;display:flex;justify-content:center}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .loading-text{margin-right:6px}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-wrap{align-items:center;display:flex;justify-content:center}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-dot,.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-wrap::after,.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-wrap::before{content:"";animation-duration:1.5s;animation-iteration-count:infinite;animation-name:LOADING;background:#212529;border-radius:50%;display:block;height:5px;margin:0 4px;opacity:0;width:5px}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-dot{animation-delay:.3s}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading .loading-wrap .animation-wrap::after{animation-delay:.6s}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.table-dark{background:#212529}.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.table-dark .animation-dot,.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.table-dark .animation-wrap::after,.bootstrap-table .fixed-table-container .fixed-table-body .fixed-table-loading.table-dark .animation-wrap::before{background:#fff}.bootstrap-table .fixed-table-container .fixed-table-footer{overflow:hidden}.bootstrap-table .fixed-table-pagination::after{content:"";display:block;clear:both}.bootstrap-table .fixed-table-pagination>.pagination,.bootstrap-table .fixed-table-pagination>.pagination-detail{margin-top:10px;margin-bottom:10px}.bootstrap-table .fixed-table-pagination>.pagination-detail .pagination-info{line-height:34px;margin-right:5px}.bootstrap-table .fixed-table-pagination>.pagination-detail .page-list{display:inline-block}.bootstrap-table .fixed-table-pagination>.pagination-detail .page-list .btn-group{position:relative;display:inline-block;vertical-align:middle}.bootstrap-table .fixed-table-pagination>.pagination-detail .page-list .btn-group .dropdown-menu{margin-bottom:0}.bootstrap-table .fixed-table-pagination>.pagination ul.pagination{margin:0}.bootstrap-table .fixed-table-pagination>.pagination ul.pagination li.page-intermediate a{color:#c8c8c8}.bootstrap-table .fixed-table-pagination>.pagination ul.pagination li.page-intermediate a::before{content:'\2B05'}.bootstrap-table .fixed-table-pagination>.pagination ul.pagination li.page-intermediate a::after{content:'\27A1'}.bootstrap-table .fixed-table-pagination>.pagination ul.pagination li.disabled a{pointer-events:none;cursor:default}.bootstrap-table.fullscreen{position:fixed;top:0;left:0;z-index:1050;width:100%!important;background:#fff;height:calc(100vh);overflow-y:scroll}.bootstrap-table.bootstrap4 .pagination-lg .page-link,.bootstrap-table.bootstrap5 .pagination-lg .page-link{padding:.5rem 1rem}.bootstrap-table.bootstrap5 .float-left{float:left}.bootstrap-table.bootstrap5 .float-right{float:right}div.fixed-table-scroll-inner{width:100%;height:200px}div.fixed-table-scroll-outer{top:0;left:0;visibility:hidden;width:200px;height:150px;overflow:hidden}@keyframes LOADING{0%{opacity:0}50%{opacity:1}to{opacity:0}}
--------------------------------------------------------------------------------
/wwwroot/lib/bootstrap-table/extensions/filter-control/bootstrap-table-filter-control.css:
--------------------------------------------------------------------------------
1 | @charset "UTF-8";
2 | /**
3 | * @author: Dennis Hernández
4 | * @webSite: http://djhvscf.github.io/Blog
5 | * @version: v2.1.1
6 | */
7 | .no-filter-control {
8 | height: 34px;
9 | }
10 |
11 | .filter-control {
12 | margin: 0 2px 2px 2px;
13 | }
14 |
--------------------------------------------------------------------------------
/wwwroot/lib/bootstrap-table/extensions/filter-control/bootstrap-table-filter-control.min.css:
--------------------------------------------------------------------------------
1 | /**
2 | * bootstrap-table - An extended table to integration with some of the most widely used CSS frameworks. (Supports Bootstrap, Semantic UI, Bulma, Material Design, Foundation)
3 | *
4 | * @version v1.18.3
5 | * @homepage https://bootstrap-table.com
6 | * @author wenzhixin (http://wenzhixin.net.cn/)
7 | * @license MIT
8 | */
9 |
10 | @charset "UTF-8";.no-filter-control{height:34px}.filter-control{margin:0 2px 2px 2px}
--------------------------------------------------------------------------------
/wwwroot/lib/bootstrap-table/extensions/fixed-columns/bootstrap-table-fixed-columns.css:
--------------------------------------------------------------------------------
1 | .fixed-columns,
2 | .fixed-columns-right {
3 | position: absolute;
4 | top: 0;
5 | height: 100%;
6 | background-color: #fff;
7 | box-sizing: border-box;
8 | z-index: 1;
9 | }
10 |
11 | .fixed-columns {
12 | left: 0;
13 | }
14 |
15 | .fixed-columns .fixed-table-body {
16 | overflow: hidden !important;
17 | }
18 |
19 | .fixed-columns-right {
20 | right: 0;
21 | }
22 |
23 | .fixed-columns-right .fixed-table-body {
24 | overflow-x: hidden !important;
25 | }
26 |
--------------------------------------------------------------------------------
/wwwroot/lib/bootstrap-table/extensions/fixed-columns/bootstrap-table-fixed-columns.min.css:
--------------------------------------------------------------------------------
1 | /**
2 | * bootstrap-table - An extended table to integration with some of the most widely used CSS frameworks. (Supports Bootstrap, Semantic UI, Bulma, Material Design, Foundation)
3 | *
4 | * @version v1.18.3
5 | * @homepage https://bootstrap-table.com
6 | * @author wenzhixin (http://wenzhixin.net.cn/)
7 | * @license MIT
8 | */
9 |
10 | .fixed-columns,.fixed-columns-right{position:absolute;top:0;height:100%;background-color:#fff;box-sizing:border-box;z-index:1}.fixed-columns{left:0}.fixed-columns .fixed-table-body{overflow:hidden!important}.fixed-columns-right{right:0}.fixed-columns-right .fixed-table-body{overflow-x:hidden!important}
--------------------------------------------------------------------------------
/wwwroot/lib/bootstrap-table/extensions/group-by-v2/bootstrap-table-group-by.css:
--------------------------------------------------------------------------------
1 | .bootstrap-table .table > tbody > tr.groupBy.expanded,
2 | .bootstrap-table .table > tbody > tr.groupBy.collapsed {
3 | cursor: pointer;
4 | }
5 |
6 | .bootstrap-table .table > tbody > tr.hidden {
7 | display: none;
8 | }
9 |
--------------------------------------------------------------------------------
/wwwroot/lib/bootstrap-table/extensions/group-by-v2/bootstrap-table-group-by.min.css:
--------------------------------------------------------------------------------
1 | /**
2 | * bootstrap-table - An extended table to integration with some of the most widely used CSS frameworks. (Supports Bootstrap, Semantic UI, Bulma, Material Design, Foundation)
3 | *
4 | * @version v1.18.3
5 | * @homepage https://bootstrap-table.com
6 | * @author wenzhixin (http://wenzhixin.net.cn/)
7 | * @license MIT
8 | */
9 |
10 | .bootstrap-table .table>tbody>tr.groupBy.collapsed,.bootstrap-table .table>tbody>tr.groupBy.expanded{cursor:pointer}.bootstrap-table .table>tbody>tr.hidden{display:none}
--------------------------------------------------------------------------------
/wwwroot/lib/bootstrap-table/extensions/i18n-enhance/bootstrap-table-i18n-enhance.js:
--------------------------------------------------------------------------------
1 | (function (global, factory) {
2 | typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('jquery')) :
3 | typeof define === 'function' && define.amd ? define(['jquery'], factory) :
4 | (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.jQuery));
5 | }(this, (function ($) { 'use strict';
6 |
7 | function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8 |
9 | var $__default = /*#__PURE__*/_interopDefaultLegacy($);
10 |
11 | function _classCallCheck(instance, Constructor) {
12 | if (!(instance instanceof Constructor)) {
13 | throw new TypeError("Cannot call a class as a function");
14 | }
15 | }
16 |
17 | function _defineProperties(target, props) {
18 | for (var i = 0; i < props.length; i++) {
19 | var descriptor = props[i];
20 | descriptor.enumerable = descriptor.enumerable || false;
21 | descriptor.configurable = true;
22 | if ("value" in descriptor) descriptor.writable = true;
23 | Object.defineProperty(target, descriptor.key, descriptor);
24 | }
25 | }
26 |
27 | function _createClass(Constructor, protoProps, staticProps) {
28 | if (protoProps) _defineProperties(Constructor.prototype, protoProps);
29 | if (staticProps) _defineProperties(Constructor, staticProps);
30 | return Constructor;
31 | }
32 |
33 | function _inherits(subClass, superClass) {
34 | if (typeof superClass !== "function" && superClass !== null) {
35 | throw new TypeError("Super expression must either be null or a function");
36 | }
37 |
38 | subClass.prototype = Object.create(superClass && superClass.prototype, {
39 | constructor: {
40 | value: subClass,
41 | writable: true,
42 | configurable: true
43 | }
44 | });
45 | if (superClass) _setPrototypeOf(subClass, superClass);
46 | }
47 |
48 | function _getPrototypeOf(o) {
49 | _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
50 | return o.__proto__ || Object.getPrototypeOf(o);
51 | };
52 | return _getPrototypeOf(o);
53 | }
54 |
55 | function _setPrototypeOf(o, p) {
56 | _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
57 | o.__proto__ = p;
58 | return o;
59 | };
60 |
61 | return _setPrototypeOf(o, p);
62 | }
63 |
64 | function _isNativeReflectConstruct() {
65 | if (typeof Reflect === "undefined" || !Reflect.construct) return false;
66 | if (Reflect.construct.sham) return false;
67 | if (typeof Proxy === "function") return true;
68 |
69 | try {
70 | Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
71 | return true;
72 | } catch (e) {
73 | return false;
74 | }
75 | }
76 |
77 | function _assertThisInitialized(self) {
78 | if (self === void 0) {
79 | throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
80 | }
81 |
82 | return self;
83 | }
84 |
85 | function _possibleConstructorReturn(self, call) {
86 | if (call && (typeof call === "object" || typeof call === "function")) {
87 | return call;
88 | }
89 |
90 | return _assertThisInitialized(self);
91 | }
92 |
93 | function _createSuper(Derived) {
94 | var hasNativeReflectConstruct = _isNativeReflectConstruct();
95 |
96 | return function _createSuperInternal() {
97 | var Super = _getPrototypeOf(Derived),
98 | result;
99 |
100 | if (hasNativeReflectConstruct) {
101 | var NewTarget = _getPrototypeOf(this).constructor;
102 |
103 | result = Reflect.construct(Super, arguments, NewTarget);
104 | } else {
105 | result = Super.apply(this, arguments);
106 | }
107 |
108 | return _possibleConstructorReturn(this, result);
109 | };
110 | }
111 |
112 | /**
113 | * @author: Jewway
114 | * @update zhixin wen
115 | */
116 |
117 | $__default['default'].fn.bootstrapTable.methods.push('changeTitle');
118 | $__default['default'].fn.bootstrapTable.methods.push('changeLocale');
119 |
120 | $__default['default'].BootstrapTable = /*#__PURE__*/function (_$$BootstrapTable) {
121 | _inherits(_class, _$$BootstrapTable);
122 |
123 | var _super = _createSuper(_class);
124 |
125 | function _class() {
126 | _classCallCheck(this, _class);
127 |
128 | return _super.apply(this, arguments);
129 | }
130 |
131 | _createClass(_class, [{
132 | key: "changeTitle",
133 | value: function changeTitle(locale) {
134 | $__default['default'].each(this.options.columns, function (idx, columnList) {
135 | $__default['default'].each(columnList, function (idx, column) {
136 | if (column.field) {
137 | column.title = locale[column.field];
138 | }
139 | });
140 | });
141 | this.initHeader();
142 | this.initBody();
143 | this.initToolbar();
144 | }
145 | }, {
146 | key: "changeLocale",
147 | value: function changeLocale(localeId) {
148 | this.options.locale = localeId;
149 | this.initLocale();
150 | this.initPagination();
151 | this.initBody();
152 | this.initToolbar();
153 | }
154 | }]);
155 |
156 | return _class;
157 | }($__default['default'].BootstrapTable);
158 |
159 | })));
160 |
--------------------------------------------------------------------------------
/wwwroot/lib/bootstrap-table/extensions/i18n-enhance/bootstrap-table-i18n-enhance.min.js:
--------------------------------------------------------------------------------
1 | /**
2 | * bootstrap-table - An extended table to integration with some of the most widely used CSS frameworks. (Supports Bootstrap, Semantic UI, Bulma, Material Design, Foundation)
3 | *
4 | * @version v1.18.3
5 | * @homepage https://bootstrap-table.com
6 | * @author wenzhixin (http://wenzhixin.net.cn/)
7 | * @license MIT
8 | */
9 |
10 | !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).jQuery)}(this,(function(t){"use strict";function e(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var n=e(t);function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){for(var n=0;n .pagination ul.pagination,
2 | .bootstrap-table.bootstrap3 .fixed-table-pagination > .pagination .page-jump-to {
3 | display: inline;
4 | }
5 |
6 | .bootstrap-table .fixed-table-pagination > .pagination .page-jump-to input {
7 | width: 70px;
8 | margin-left: 5px;
9 | text-align: center;
10 | float: left;
11 | }
12 |
--------------------------------------------------------------------------------
/wwwroot/lib/bootstrap-table/extensions/page-jump-to/bootstrap-table-page-jump-to.min.css:
--------------------------------------------------------------------------------
1 | /**
2 | * bootstrap-table - An extended table to integration with some of the most widely used CSS frameworks. (Supports Bootstrap, Semantic UI, Bulma, Material Design, Foundation)
3 | *
4 | * @version v1.18.3
5 | * @homepage https://bootstrap-table.com
6 | * @author wenzhixin (http://wenzhixin.net.cn/)
7 | * @license MIT
8 | */
9 |
10 | .bootstrap-table.bootstrap3 .fixed-table-pagination>.pagination .page-jump-to,.bootstrap-table.bootstrap3 .fixed-table-pagination>.pagination ul.pagination{display:inline}.bootstrap-table .fixed-table-pagination>.pagination .page-jump-to input{width:70px;margin-left:5px;text-align:center;float:left}
--------------------------------------------------------------------------------
/wwwroot/lib/bootstrap-table/extensions/reorder-rows/bootstrap-table-reorder-rows.css:
--------------------------------------------------------------------------------
1 | .reorder_rows_onDragClass td {
2 | background-color: #eee;
3 | -webkit-box-shadow: 11px 5px 12px 2px #333, 0 1px 0 #ccc inset, 0 -1px 0 #ccc inset;
4 | -webkit-box-shadow: 6px 3px 5px #555, 0 1px 0 #ccc inset, 0 -1px 0 #ccc inset;
5 | -moz-box-shadow: 6px 4px 5px 1px #555, 0 1px 0 #ccc inset, 0 -1px 0 #ccc inset;
6 | -box-shadow: 6px 4px 5px 1px #555, 0 1px 0 #ccc inset, 0 -1px 0 #ccc inset;
7 | }
8 |
9 | .reorder_rows_onDragClass td:last-child {
10 | -webkit-box-shadow: 8px 7px 12px 0 #333, 0 1px 0 #ccc inset, 0 -1px 0 #ccc inset;
11 | -webkit-box-shadow: 1px 8px 6px -4px #555, 0 1px 0 #ccc inset, 0 -1px 0 #ccc inset;
12 | -moz-box-shadow: 0 9px 4px -4px #555, 0 1px 0 #ccc inset, 0 -1px 0 #ccc inset, -1px 0 0 #ccc inset;
13 | -box-shadow: 0 9px 4px -4px #555, 0 1px 0 #ccc inset, 0 -1px 0 #ccc inset, -1px 0 0 #ccc inset;
14 | }
15 |
--------------------------------------------------------------------------------
/wwwroot/lib/bootstrap-table/extensions/reorder-rows/bootstrap-table-reorder-rows.min.css:
--------------------------------------------------------------------------------
1 | /**
2 | * bootstrap-table - An extended table to integration with some of the most widely used CSS frameworks. (Supports Bootstrap, Semantic UI, Bulma, Material Design, Foundation)
3 | *
4 | * @version v1.18.3
5 | * @homepage https://bootstrap-table.com
6 | * @author wenzhixin (http://wenzhixin.net.cn/)
7 | * @license MIT
8 | */
9 |
10 | .reorder_rows_onDragClass td{background-color:#eee;-webkit-box-shadow:11px 5px 12px 2px #333,0 1px 0 #ccc inset,0 -1px 0 #ccc inset;-webkit-box-shadow:6px 3px 5px #555,0 1px 0 #ccc inset,0 -1px 0 #ccc inset;-moz-box-shadow:6px 4px 5px 1px #555,0 1px 0 #ccc inset,0 -1px 0 #ccc inset;-box-shadow:6px 4px 5px 1px #555,0 1px 0 #ccc inset,0 -1px 0 #ccc inset}.reorder_rows_onDragClass td:last-child{-webkit-box-shadow:8px 7px 12px 0 #333,0 1px 0 #ccc inset,0 -1px 0 #ccc inset;-webkit-box-shadow:1px 8px 6px -4px #555,0 1px 0 #ccc inset,0 -1px 0 #ccc inset;-moz-box-shadow:0 9px 4px -4px #555,0 1px 0 #ccc inset,0 -1px 0 #ccc inset,-1px 0 0 #ccc inset;-box-shadow:0 9px 4px -4px #555,0 1px 0 #ccc inset,0 -1px 0 #ccc inset,-1px 0 0 #ccc inset}
--------------------------------------------------------------------------------
/wwwroot/lib/bootstrap-table/extensions/sticky-header/bootstrap-table-sticky-header.css:
--------------------------------------------------------------------------------
1 | /**
2 | * @author vincent loh
3 | * @update zhixin wen
4 | */
5 | .fix-sticky {
6 | position: fixed !important;
7 | overflow: hidden;
8 | z-index: 100;
9 | }
10 |
11 | .fix-sticky table thead {
12 | background: #fff;
13 | }
14 |
15 | .fix-sticky table thead.thead-light {
16 | background: #e9ecef;
17 | }
18 |
19 | .fix-sticky table thead.thead-dark {
20 | background: #212529;
21 | }
22 |
--------------------------------------------------------------------------------
/wwwroot/lib/bootstrap-table/extensions/sticky-header/bootstrap-table-sticky-header.min.css:
--------------------------------------------------------------------------------
1 | /**
2 | * bootstrap-table - An extended table to integration with some of the most widely used CSS frameworks. (Supports Bootstrap, Semantic UI, Bulma, Material Design, Foundation)
3 | *
4 | * @version v1.18.3
5 | * @homepage https://bootstrap-table.com
6 | * @author wenzhixin (http://wenzhixin.net.cn/)
7 | * @license MIT
8 | */
9 |
10 | .fix-sticky{position:fixed!important;overflow:hidden;z-index:100}.fix-sticky table thead{background:#fff}.fix-sticky table thead.thead-light{background:#e9ecef}.fix-sticky table thead.thead-dark{background:#212529}
--------------------------------------------------------------------------------
/wwwroot/lib/bootstrap-table/locale/bootstrap-table-he-IL.min.js:
--------------------------------------------------------------------------------
1 | /**
2 | * bootstrap-table - An extended table to integration with some of the most widely used CSS frameworks. (Supports Bootstrap, Semantic UI, Bulma, Material Design, Foundation)
3 | *
4 | * @version v1.18.3
5 | * @homepage https://bootstrap-table.com
6 | * @author wenzhixin (http://wenzhixin.net.cn/)
7 | * @license MIT
8 | */
9 |
10 | !function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],n):n((t="undefined"!=typeof globalThis?globalThis:t||self).jQuery)}(this,(function(t){"use strict";function n(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var r=n(t),e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function o(t,n){return t(n={exports:{}},n.exports),n.exports}var i=function(t){return t&&t.Math==Math&&t},u=i("object"==typeof globalThis&&globalThis)||i("object"==typeof window&&window)||i("object"==typeof self&&self)||i("object"==typeof e&&e)||function(){return this}()||Function("return this")(),f=function(t){try{return!!t()}catch(t){return!0}},c=!f((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),a={}.propertyIsEnumerable,l=Object.getOwnPropertyDescriptor,s={f:l&&!a.call({1:2},1)?function(t){var n=l(this,t);return!!n&&n.enumerable}:a},p=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}},h={}.toString,g=function(t){return h.call(t).slice(8,-1)},y="".split,d=f((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==g(t)?y.call(t,""):Object(t)}:Object,m=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t},v=function(t){return d(m(t))},b=function(t){return"object"==typeof t?null!==t:"function"==typeof t},w=function(t,n){if(!b(t))return t;var r,e;if(n&&"function"==typeof(r=t.toString)&&!b(e=r.call(t)))return e;if("function"==typeof(r=t.valueOf)&&!b(e=r.call(t)))return e;if(!n&&"function"==typeof(r=t.toString)&&!b(e=r.call(t)))return e;throw TypeError("Can't convert object to primitive value")},S={}.hasOwnProperty,T=function(t,n){return S.call(t,n)},O=u.document,P=b(O)&&b(O.createElement),j=!c&&!f((function(){return 7!=Object.defineProperty((t="div",P?O.createElement(t):{}),"a",{get:function(){return 7}}).a;var t})),x=Object.getOwnPropertyDescriptor,A={f:c?x:function(t,n){if(t=v(t),n=w(n,!0),j)try{return x(t,n)}catch(t){}if(T(t,n))return p(!s.f.call(t,n),t[n])}},C=function(t){if(!b(t))throw TypeError(String(t)+" is not an object");return t},E=Object.defineProperty,M={f:c?E:function(t,n,r){if(C(t),n=w(n,!0),C(r),j)try{return E(t,n,r)}catch(t){}if("get"in r||"set"in r)throw TypeError("Accessors not supported");return"value"in r&&(t[n]=r.value),t}},R=c?function(t,n,r){return M.f(t,n,p(1,r))}:function(t,n,r){return t[n]=r,t},F=function(t,n){try{R(u,t,n)}catch(r){u[t]=n}return n},I="__core-js_shared__",L=u[I]||F(I,{}),N=Function.toString;"function"!=typeof L.inspectSource&&(L.inspectSource=function(t){return N.call(t)});var k,_,D,H,q=L.inspectSource,z=u.WeakMap,G="function"==typeof z&&/native code/.test(q(z)),B=o((function(t){(t.exports=function(t,n){return L[t]||(L[t]=void 0!==n?n:{})})("versions",[]).push({version:"3.9.1",mode:"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})})),W=0,J=Math.random(),K=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++W+J).toString(36)},Q=B("keys"),U={},V=u.WeakMap;if(G){var Y=L.state||(L.state=new V),X=Y.get,Z=Y.has,$=Y.set;k=function(t,n){return n.facade=t,$.call(Y,t,n),n},_=function(t){return X.call(Y,t)||{}},D=function(t){return Z.call(Y,t)}}else{var tt=Q[H="state"]||(Q[H]=K(H));U[tt]=!0,k=function(t,n){return n.facade=t,R(t,tt,n),n},_=function(t){return T(t,tt)?t[tt]:{}},D=function(t){return T(t,tt)}}var nt,rt,et={set:k,get:_,has:D,enforce:function(t){return D(t)?_(t):k(t,{})},getterFor:function(t){return function(n){var r;if(!b(n)||(r=_(n)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return r}}},ot=o((function(t){var n=et.get,r=et.enforce,e=String(String).split("String");(t.exports=function(t,n,o,i){var f,c=!!i&&!!i.unsafe,a=!!i&&!!i.enumerable,l=!!i&&!!i.noTargetGet;"function"==typeof o&&("string"!=typeof n||T(o,"name")||R(o,"name",n),(f=r(o)).source||(f.source=e.join("string"==typeof n?n:""))),t!==u?(c?!l&&t[n]&&(a=!0):delete t[n],a?t[n]=o:R(t,n,o)):a?t[n]=o:F(n,o)})(Function.prototype,"toString",(function(){return"function"==typeof this&&n(this).source||q(this)}))})),it=u,ut=function(t){return"function"==typeof t?t:void 0},ft=function(t,n){return arguments.length<2?ut(it[t])||ut(u[t]):it[t]&&it[t][n]||u[t]&&u[t][n]},ct=Math.ceil,at=Math.floor,lt=function(t){return isNaN(t=+t)?0:(t>0?at:ct)(t)},st=Math.min,pt=function(t){return t>0?st(lt(t),9007199254740991):0},ht=Math.max,gt=Math.min,yt=function(t){return function(n,r,e){var o,i=v(n),u=pt(i.length),f=function(t,n){var r=lt(t);return r<0?ht(r+n,0):gt(r,n)}(e,u);if(t&&r!=r){for(;u>f;)if((o=i[f++])!=o)return!0}else for(;u>f;f++)if((t||f in i)&&i[f]===r)return t||f||0;return!t&&-1}},dt={includes:yt(!0),indexOf:yt(!1)}.indexOf,mt=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"].concat("length","prototype"),vt={f:Object.getOwnPropertyNames||function(t){return function(t,n){var r,e=v(t),o=0,i=[];for(r in e)!T(U,r)&&T(e,r)&&i.push(r);for(;n.length>o;)T(e,r=n[o++])&&(~dt(i,r)||i.push(r));return i}(t,mt)}},bt={f:Object.getOwnPropertySymbols},wt=ft("Reflect","ownKeys")||function(t){var n=vt.f(C(t)),r=bt.f;return r?n.concat(r(t)):n},St=function(t,n){for(var r=wt(n),e=M.f,o=A.f,i=0;i=74)&&(nt=Lt.match(/Chrome\/(\d+)/))&&(rt=nt[1]);var Dt,Ht=rt&&+rt,qt=!!Object.getOwnPropertySymbols&&!f((function(){return!Symbol.sham&&(It?38===Ht:Ht>37&&Ht<41)})),zt=qt&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,Gt=B("wks"),Bt=u.Symbol,Wt=zt?Bt:Bt&&Bt.withoutSetter||K,Jt=function(t){return T(Gt,t)&&(qt||"string"==typeof Gt[t])||(qt&&T(Bt,t)?Gt[t]=Bt[t]:Gt[t]=Wt("Symbol."+t)),Gt[t]},Kt=Jt("species"),Qt=function(t,n){var r;return Mt(t)&&("function"!=typeof(r=t.constructor)||r!==Array&&!Mt(r.prototype)?b(r)&&null===(r=r[Kt])&&(r=void 0):r=void 0),new(void 0===r?Array:r)(0===n?0:n)},Ut=Jt("species"),Vt=Jt("isConcatSpreadable"),Yt=9007199254740991,Xt="Maximum allowed index exceeded",Zt=Ht>=51||!f((function(){var t=[];return t[Vt]=!1,t.concat()[0]!==t})),$t=(Dt="concat",Ht>=51||!f((function(){var t=[];return(t.constructor={})[Ut]=function(){return{foo:1}},1!==t[Dt](Boolean).foo}))),tn=function(t){if(!b(t))return!1;var n=t[Vt];return void 0!==n?!!n:Mt(t)};!function(t,n){var r,e,o,i,f,c=t.target,a=t.global,l=t.stat;if(r=a?u:l?u[c]||F(c,{}):(u[c]||{}).prototype)for(e in n){if(i=n[e],o=t.noTargetGet?(f=Et(r,e))&&f.value:r[e],!Ct(a?e:c+(l?".":"#")+e,t.forced)&&void 0!==o){if(typeof i==typeof o)continue;St(i,o)}(t.sham||o&&o.sham)&&R(i,"sham",!0),ot(r,e,i,t)}}({target:"Array",proto:!0,forced:!Zt||!$t},{concat:function(t){var n,r,e,o,i,u=Rt(this),f=Qt(u,0),c=0;for(n=-1,e=arguments.length;nYt)throw TypeError(Xt);for(r=0;r=Yt)throw TypeError(Xt);Ft(f,c++,i)}return f.length=c,f}}),r.default.fn.bootstrapTable.locales["he-IL"]=r.default.fn.bootstrapTable.locales.he={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"טוען, נא להמתין"},formatRecordsPerPage:function(t){return"".concat(t," שורות בעמוד")},formatShowingRows:function(t,n,r,e){return void 0!==e&&e>0&&e>r?"מציג ".concat(t," עד ").concat(n," מ-").concat(r,"שורות").concat(e," total rows)"):"מציג ".concat(t," עד ").concat(n," מ-").concat(r," שורות")},formatSRPaginationPreText:function(){return"previous page"},formatSRPaginationPageText:function(t){return"to page ".concat(t)},formatSRPaginationNextText:function(){return"next page"},formatDetailPagination:function(t){return"Showing ".concat(t," rows")},formatClearSearch:function(){return"Clear Search"},formatSearch:function(){return"חיפוש"},formatNoMatches:function(){return"לא נמצאו רשומות תואמות"},formatPaginationSwitch:function(){return"הסתר/הצג מספור דפים"},formatPaginationSwitchDown:function(){return"Show pagination"},formatPaginationSwitchUp:function(){return"Hide pagination"},formatRefresh:function(){return"רענן"},formatToggle:function(){return"החלף תצוגה"},formatToggleOn:function(){return"Show card view"},formatToggleOff:function(){return"Hide card view"},formatColumns:function(){return"עמודות"},formatColumnsToggleAll:function(){return"Toggle all"},formatFullscreen:function(){return"Fullscreen"},formatAllRows:function(){return"הכל"},formatAutoRefresh:function(){return"Auto Refresh"},formatExport:function(){return"Export data"},formatJumpTo:function(){return"GO"},formatAdvancedSearch:function(){return"Advanced search"},formatAdvancedCloseButton:function(){return"Close"},formatFilterControlSwitch:function(){return"Hide/Show controls"},formatFilterControlSwitchHide:function(){return"Hide controls"},formatFilterControlSwitchShow:function(){return"Show controls"}},r.default.extend(r.default.fn.bootstrapTable.defaults,r.default.fn.bootstrapTable.locales["he-IL"])}));
11 |
--------------------------------------------------------------------------------
/wwwroot/lib/bootstrap-table/locale/bootstrap-table-ja-JP.min.js:
--------------------------------------------------------------------------------
1 | /**
2 | * bootstrap-table - An extended table to integration with some of the most widely used CSS frameworks. (Supports Bootstrap, Semantic UI, Bulma, Material Design, Foundation)
3 | *
4 | * @version v1.18.3
5 | * @homepage https://bootstrap-table.com
6 | * @author wenzhixin (http://wenzhixin.net.cn/)
7 | * @license MIT
8 | */
9 |
10 | !function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],n):n((t="undefined"!=typeof globalThis?globalThis:t||self).jQuery)}(this,(function(t){"use strict";function n(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var r=n(t),e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function o(t,n){return t(n={exports:{}},n.exports),n.exports}var i=function(t){return t&&t.Math==Math&&t},u=i("object"==typeof globalThis&&globalThis)||i("object"==typeof window&&window)||i("object"==typeof self&&self)||i("object"==typeof e&&e)||function(){return this}()||Function("return this")(),f=function(t){try{return!!t()}catch(t){return!0}},c=!f((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),a={}.propertyIsEnumerable,l=Object.getOwnPropertyDescriptor,s={f:l&&!a.call({1:2},1)?function(t){var n=l(this,t);return!!n&&n.enumerable}:a},p=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}},d={}.toString,g=function(t){return d.call(t).slice(8,-1)},y="".split,h=f((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==g(t)?y.call(t,""):Object(t)}:Object,m=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t},v=function(t){return h(m(t))},b=function(t){return"object"==typeof t?null!==t:"function"==typeof t},w=function(t,n){if(!b(t))return t;var r,e;if(n&&"function"==typeof(r=t.toString)&&!b(e=r.call(t)))return e;if("function"==typeof(r=t.valueOf)&&!b(e=r.call(t)))return e;if(!n&&"function"==typeof(r=t.toString)&&!b(e=r.call(t)))return e;throw TypeError("Can't convert object to primitive value")},S={}.hasOwnProperty,j=function(t,n){return S.call(t,n)},P=u.document,T=b(P)&&b(P.createElement),O=!c&&!f((function(){return 7!=Object.defineProperty((t="div",T?P.createElement(t):{}),"a",{get:function(){return 7}}).a;var t})),x=Object.getOwnPropertyDescriptor,A={f:c?x:function(t,n){if(t=v(t),n=w(n,!0),O)try{return x(t,n)}catch(t){}if(j(t,n))return p(!s.f.call(t,n),t[n])}},C=function(t){if(!b(t))throw TypeError(String(t)+" is not an object");return t},E=Object.defineProperty,M={f:c?E:function(t,n,r){if(C(t),n=w(n,!0),C(r),O)try{return E(t,n,r)}catch(t){}if("get"in r||"set"in r)throw TypeError("Accessors not supported");return"value"in r&&(t[n]=r.value),t}},R=c?function(t,n,r){return M.f(t,n,p(1,r))}:function(t,n,r){return t[n]=r,t},F=function(t,n){try{R(u,t,n)}catch(r){u[t]=n}return n},N="__core-js_shared__",k=u[N]||F(N,{}),I=Function.toString;"function"!=typeof k.inspectSource&&(k.inspectSource=function(t){return I.call(t)});var L,_,D,H,q=k.inspectSource,z=u.WeakMap,G="function"==typeof z&&/native code/.test(q(z)),J=o((function(t){(t.exports=function(t,n){return k[t]||(k[t]=void 0!==n?n:{})})("versions",[]).push({version:"3.9.1",mode:"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})})),B=0,W=Math.random(),K=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++B+W).toString(36)},Q=J("keys"),U={},V=u.WeakMap;if(G){var Y=k.state||(k.state=new V),X=Y.get,Z=Y.has,$=Y.set;L=function(t,n){return n.facade=t,$.call(Y,t,n),n},_=function(t){return X.call(Y,t)||{}},D=function(t){return Z.call(Y,t)}}else{var tt=Q[H="state"]||(Q[H]=K(H));U[tt]=!0,L=function(t,n){return n.facade=t,R(t,tt,n),n},_=function(t){return j(t,tt)?t[tt]:{}},D=function(t){return j(t,tt)}}var nt,rt,et={set:L,get:_,has:D,enforce:function(t){return D(t)?_(t):L(t,{})},getterFor:function(t){return function(n){var r;if(!b(n)||(r=_(n)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return r}}},ot=o((function(t){var n=et.get,r=et.enforce,e=String(String).split("String");(t.exports=function(t,n,o,i){var f,c=!!i&&!!i.unsafe,a=!!i&&!!i.enumerable,l=!!i&&!!i.noTargetGet;"function"==typeof o&&("string"!=typeof n||j(o,"name")||R(o,"name",n),(f=r(o)).source||(f.source=e.join("string"==typeof n?n:""))),t!==u?(c?!l&&t[n]&&(a=!0):delete t[n],a?t[n]=o:R(t,n,o)):a?t[n]=o:F(n,o)})(Function.prototype,"toString",(function(){return"function"==typeof this&&n(this).source||q(this)}))})),it=u,ut=function(t){return"function"==typeof t?t:void 0},ft=function(t,n){return arguments.length<2?ut(it[t])||ut(u[t]):it[t]&&it[t][n]||u[t]&&u[t][n]},ct=Math.ceil,at=Math.floor,lt=function(t){return isNaN(t=+t)?0:(t>0?at:ct)(t)},st=Math.min,pt=function(t){return t>0?st(lt(t),9007199254740991):0},dt=Math.max,gt=Math.min,yt=function(t){return function(n,r,e){var o,i=v(n),u=pt(i.length),f=function(t,n){var r=lt(t);return r<0?dt(r+n,0):gt(r,n)}(e,u);if(t&&r!=r){for(;u>f;)if((o=i[f++])!=o)return!0}else for(;u>f;f++)if((t||f in i)&&i[f]===r)return t||f||0;return!t&&-1}},ht={includes:yt(!0),indexOf:yt(!1)}.indexOf,mt=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"].concat("length","prototype"),vt={f:Object.getOwnPropertyNames||function(t){return function(t,n){var r,e=v(t),o=0,i=[];for(r in e)!j(U,r)&&j(e,r)&&i.push(r);for(;n.length>o;)j(e,r=n[o++])&&(~ht(i,r)||i.push(r));return i}(t,mt)}},bt={f:Object.getOwnPropertySymbols},wt=ft("Reflect","ownKeys")||function(t){var n=vt.f(C(t)),r=bt.f;return r?n.concat(r(t)):n},St=function(t,n){for(var r=wt(n),e=M.f,o=A.f,i=0;i=74)&&(nt=kt.match(/Chrome\/(\d+)/))&&(rt=nt[1]);var Dt,Ht=rt&&+rt,qt=!!Object.getOwnPropertySymbols&&!f((function(){return!Symbol.sham&&(Nt?38===Ht:Ht>37&&Ht<41)})),zt=qt&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,Gt=J("wks"),Jt=u.Symbol,Bt=zt?Jt:Jt&&Jt.withoutSetter||K,Wt=function(t){return j(Gt,t)&&(qt||"string"==typeof Gt[t])||(qt&&j(Jt,t)?Gt[t]=Jt[t]:Gt[t]=Bt("Symbol."+t)),Gt[t]},Kt=Wt("species"),Qt=function(t,n){var r;return Mt(t)&&("function"!=typeof(r=t.constructor)||r!==Array&&!Mt(r.prototype)?b(r)&&null===(r=r[Kt])&&(r=void 0):r=void 0),new(void 0===r?Array:r)(0===n?0:n)},Ut=Wt("species"),Vt=Wt("isConcatSpreadable"),Yt=9007199254740991,Xt="Maximum allowed index exceeded",Zt=Ht>=51||!f((function(){var t=[];return t[Vt]=!1,t.concat()[0]!==t})),$t=(Dt="concat",Ht>=51||!f((function(){var t=[];return(t.constructor={})[Ut]=function(){return{foo:1}},1!==t[Dt](Boolean).foo}))),tn=function(t){if(!b(t))return!1;var n=t[Vt];return void 0!==n?!!n:Mt(t)};!function(t,n){var r,e,o,i,f,c=t.target,a=t.global,l=t.stat;if(r=a?u:l?u[c]||F(c,{}):(u[c]||{}).prototype)for(e in n){if(i=n[e],o=t.noTargetGet?(f=Et(r,e))&&f.value:r[e],!Ct(a?e:c+(l?".":"#")+e,t.forced)&&void 0!==o){if(typeof i==typeof o)continue;St(i,o)}(t.sham||o&&o.sham)&&R(i,"sham",!0),ot(r,e,i,t)}}({target:"Array",proto:!0,forced:!Zt||!$t},{concat:function(t){var n,r,e,o,i,u=Rt(this),f=Qt(u,0),c=0;for(n=-1,e=arguments.length;nYt)throw TypeError(Xt);for(r=0;r=Yt)throw TypeError(Xt);Ft(f,c++,i)}return f.length=c,f}}),r.default.fn.bootstrapTable.locales["ja-JP"]=r.default.fn.bootstrapTable.locales.ja={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"読み込み中です。少々お待ちください。"},formatRecordsPerPage:function(t){return"ページ当たり最大".concat(t,"件")},formatShowingRows:function(t,n,r,e){return void 0!==e&&e>0&&e>r?"全".concat(r,"件から、").concat(t,"から").concat(n,"件目まで表示しています (filtered from ").concat(e," total rows)"):"全".concat(r,"件から、").concat(t,"から").concat(n,"件目まで表示しています")},formatSRPaginationPreText:function(){return"previous page"},formatSRPaginationPageText:function(t){return"to page ".concat(t)},formatSRPaginationNextText:function(){return"next page"},formatDetailPagination:function(t){return"Showing ".concat(t," rows")},formatClearSearch:function(){return"Clear Search"},formatSearch:function(){return"検索"},formatNoMatches:function(){return"該当するレコードが見つかりません"},formatPaginationSwitch:function(){return"ページ数を表示・非表示"},formatPaginationSwitchDown:function(){return"Show pagination"},formatPaginationSwitchUp:function(){return"Hide pagination"},formatRefresh:function(){return"更新"},formatToggle:function(){return"トグル"},formatToggleOn:function(){return"Show card view"},formatToggleOff:function(){return"Hide card view"},formatColumns:function(){return"列"},formatColumnsToggleAll:function(){return"Toggle all"},formatFullscreen:function(){return"Fullscreen"},formatAllRows:function(){return"すべて"},formatAutoRefresh:function(){return"Auto Refresh"},formatExport:function(){return"Export data"},formatJumpTo:function(){return"GO"},formatAdvancedSearch:function(){return"Advanced search"},formatAdvancedCloseButton:function(){return"Close"},formatFilterControlSwitch:function(){return"Hide/Show controls"},formatFilterControlSwitchHide:function(){return"Hide controls"},formatFilterControlSwitchShow:function(){return"Show controls"}},r.default.extend(r.default.fn.bootstrapTable.defaults,r.default.fn.bootstrapTable.locales["ja-JP"])}));
11 |
--------------------------------------------------------------------------------
/wwwroot/lib/bootstrap-table/locale/bootstrap-table-ko-KR.min.js:
--------------------------------------------------------------------------------
1 | /**
2 | * bootstrap-table - An extended table to integration with some of the most widely used CSS frameworks. (Supports Bootstrap, Semantic UI, Bulma, Material Design, Foundation)
3 | *
4 | * @version v1.18.3
5 | * @homepage https://bootstrap-table.com
6 | * @author wenzhixin (http://wenzhixin.net.cn/)
7 | * @license MIT
8 | */
9 |
10 | !function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],n):n((t="undefined"!=typeof globalThis?globalThis:t||self).jQuery)}(this,(function(t){"use strict";function n(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var r=n(t),e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function o(t,n){return t(n={exports:{}},n.exports),n.exports}var i=function(t){return t&&t.Math==Math&&t},u=i("object"==typeof globalThis&&globalThis)||i("object"==typeof window&&window)||i("object"==typeof self&&self)||i("object"==typeof e&&e)||function(){return this}()||Function("return this")(),f=function(t){try{return!!t()}catch(t){return!0}},c=!f((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),a={}.propertyIsEnumerable,l=Object.getOwnPropertyDescriptor,s={f:l&&!a.call({1:2},1)?function(t){var n=l(this,t);return!!n&&n.enumerable}:a},p=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}},d={}.toString,g=function(t){return d.call(t).slice(8,-1)},y="".split,h=f((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==g(t)?y.call(t,""):Object(t)}:Object,m=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t},v=function(t){return h(m(t))},b=function(t){return"object"==typeof t?null!==t:"function"==typeof t},w=function(t,n){if(!b(t))return t;var r,e;if(n&&"function"==typeof(r=t.toString)&&!b(e=r.call(t)))return e;if("function"==typeof(r=t.valueOf)&&!b(e=r.call(t)))return e;if(!n&&"function"==typeof(r=t.toString)&&!b(e=r.call(t)))return e;throw TypeError("Can't convert object to primitive value")},S={}.hasOwnProperty,T=function(t,n){return S.call(t,n)},O=u.document,P=b(O)&&b(O.createElement),j=!c&&!f((function(){return 7!=Object.defineProperty((t="div",P?O.createElement(t):{}),"a",{get:function(){return 7}}).a;var t})),x=Object.getOwnPropertyDescriptor,A={f:c?x:function(t,n){if(t=v(t),n=w(n,!0),j)try{return x(t,n)}catch(t){}if(T(t,n))return p(!s.f.call(t,n),t[n])}},C=function(t){if(!b(t))throw TypeError(String(t)+" is not an object");return t},E=Object.defineProperty,R={f:c?E:function(t,n,r){if(C(t),n=w(n,!0),C(r),j)try{return E(t,n,r)}catch(t){}if("get"in r||"set"in r)throw TypeError("Accessors not supported");return"value"in r&&(t[n]=r.value),t}},M=c?function(t,n,r){return R.f(t,n,p(1,r))}:function(t,n,r){return t[n]=r,t},F=function(t,n){try{M(u,t,n)}catch(r){u[t]=n}return n},k="__core-js_shared__",N=u[k]||F(k,{}),H=Function.toString;"function"!=typeof N.inspectSource&&(N.inspectSource=function(t){return H.call(t)});var I,L,_,D,q=N.inspectSource,z=u.WeakMap,G="function"==typeof z&&/native code/.test(q(z)),K=o((function(t){(t.exports=function(t,n){return N[t]||(N[t]=void 0!==n?n:{})})("versions",[]).push({version:"3.9.1",mode:"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})})),B=0,W=Math.random(),J=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++B+W).toString(36)},Q=K("keys"),U={},V=u.WeakMap;if(G){var Y=N.state||(N.state=new V),X=Y.get,Z=Y.has,$=Y.set;I=function(t,n){return n.facade=t,$.call(Y,t,n),n},L=function(t){return X.call(Y,t)||{}},_=function(t){return Z.call(Y,t)}}else{var tt=Q[D="state"]||(Q[D]=J(D));U[tt]=!0,I=function(t,n){return n.facade=t,M(t,tt,n),n},L=function(t){return T(t,tt)?t[tt]:{}},_=function(t){return T(t,tt)}}var nt,rt,et={set:I,get:L,has:_,enforce:function(t){return _(t)?L(t):I(t,{})},getterFor:function(t){return function(n){var r;if(!b(n)||(r=L(n)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return r}}},ot=o((function(t){var n=et.get,r=et.enforce,e=String(String).split("String");(t.exports=function(t,n,o,i){var f,c=!!i&&!!i.unsafe,a=!!i&&!!i.enumerable,l=!!i&&!!i.noTargetGet;"function"==typeof o&&("string"!=typeof n||T(o,"name")||M(o,"name",n),(f=r(o)).source||(f.source=e.join("string"==typeof n?n:""))),t!==u?(c?!l&&t[n]&&(a=!0):delete t[n],a?t[n]=o:M(t,n,o)):a?t[n]=o:F(n,o)})(Function.prototype,"toString",(function(){return"function"==typeof this&&n(this).source||q(this)}))})),it=u,ut=function(t){return"function"==typeof t?t:void 0},ft=function(t,n){return arguments.length<2?ut(it[t])||ut(u[t]):it[t]&&it[t][n]||u[t]&&u[t][n]},ct=Math.ceil,at=Math.floor,lt=function(t){return isNaN(t=+t)?0:(t>0?at:ct)(t)},st=Math.min,pt=function(t){return t>0?st(lt(t),9007199254740991):0},dt=Math.max,gt=Math.min,yt=function(t){return function(n,r,e){var o,i=v(n),u=pt(i.length),f=function(t,n){var r=lt(t);return r<0?dt(r+n,0):gt(r,n)}(e,u);if(t&&r!=r){for(;u>f;)if((o=i[f++])!=o)return!0}else for(;u>f;f++)if((t||f in i)&&i[f]===r)return t||f||0;return!t&&-1}},ht={includes:yt(!0),indexOf:yt(!1)}.indexOf,mt=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"].concat("length","prototype"),vt={f:Object.getOwnPropertyNames||function(t){return function(t,n){var r,e=v(t),o=0,i=[];for(r in e)!T(U,r)&&T(e,r)&&i.push(r);for(;n.length>o;)T(e,r=n[o++])&&(~ht(i,r)||i.push(r));return i}(t,mt)}},bt={f:Object.getOwnPropertySymbols},wt=ft("Reflect","ownKeys")||function(t){var n=vt.f(C(t)),r=bt.f;return r?n.concat(r(t)):n},St=function(t,n){for(var r=wt(n),e=R.f,o=A.f,i=0;i=74)&&(nt=Nt.match(/Chrome\/(\d+)/))&&(rt=nt[1]);var _t,Dt=rt&&+rt,qt=!!Object.getOwnPropertySymbols&&!f((function(){return!Symbol.sham&&(kt?38===Dt:Dt>37&&Dt<41)})),zt=qt&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,Gt=K("wks"),Kt=u.Symbol,Bt=zt?Kt:Kt&&Kt.withoutSetter||J,Wt=function(t){return T(Gt,t)&&(qt||"string"==typeof Gt[t])||(qt&&T(Kt,t)?Gt[t]=Kt[t]:Gt[t]=Bt("Symbol."+t)),Gt[t]},Jt=Wt("species"),Qt=function(t,n){var r;return Rt(t)&&("function"!=typeof(r=t.constructor)||r!==Array&&!Rt(r.prototype)?b(r)&&null===(r=r[Jt])&&(r=void 0):r=void 0),new(void 0===r?Array:r)(0===n?0:n)},Ut=Wt("species"),Vt=Wt("isConcatSpreadable"),Yt=9007199254740991,Xt="Maximum allowed index exceeded",Zt=Dt>=51||!f((function(){var t=[];return t[Vt]=!1,t.concat()[0]!==t})),$t=(_t="concat",Dt>=51||!f((function(){var t=[];return(t.constructor={})[Ut]=function(){return{foo:1}},1!==t[_t](Boolean).foo}))),tn=function(t){if(!b(t))return!1;var n=t[Vt];return void 0!==n?!!n:Rt(t)};!function(t,n){var r,e,o,i,f,c=t.target,a=t.global,l=t.stat;if(r=a?u:l?u[c]||F(c,{}):(u[c]||{}).prototype)for(e in n){if(i=n[e],o=t.noTargetGet?(f=Et(r,e))&&f.value:r[e],!Ct(a?e:c+(l?".":"#")+e,t.forced)&&void 0!==o){if(typeof i==typeof o)continue;St(i,o)}(t.sham||o&&o.sham)&&M(i,"sham",!0),ot(r,e,i,t)}}({target:"Array",proto:!0,forced:!Zt||!$t},{concat:function(t){var n,r,e,o,i,u=Mt(this),f=Qt(u,0),c=0;for(n=-1,e=arguments.length;nYt)throw TypeError(Xt);for(r=0;r=Yt)throw TypeError(Xt);Ft(f,c++,i)}return f.length=c,f}}),r.default.fn.bootstrapTable.locales["ko-KR"]=r.default.fn.bootstrapTable.locales.ko={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"데이터를 불러오는 중입니다"},formatRecordsPerPage:function(t){return"페이지 당 ".concat(t,"개 데이터 출력")},formatShowingRows:function(t,n,r,e){return void 0!==e&&e>0&&e>r?"전체 ".concat(r,"개 중 ").concat(t,"~").concat(n,"번째 데이터 출력, (filtered from ").concat(e," total rows)"):"전체 ".concat(r,"개 중 ").concat(t,"~").concat(n,"번째 데이터 출력,")},formatSRPaginationPreText:function(){return"previous page"},formatSRPaginationPageText:function(t){return"to page ".concat(t)},formatSRPaginationNextText:function(){return"next page"},formatDetailPagination:function(t){return"Showing ".concat(t," rows")},formatClearSearch:function(){return"Clear Search"},formatSearch:function(){return"검색"},formatNoMatches:function(){return"조회된 데이터가 없습니다."},formatPaginationSwitch:function(){return"Hide/Show pagination"},formatPaginationSwitchDown:function(){return"Show pagination"},formatPaginationSwitchUp:function(){return"Hide pagination"},formatRefresh:function(){return"새로 고침"},formatToggle:function(){return"전환"},formatToggleOn:function(){return"Show card view"},formatToggleOff:function(){return"Hide card view"},formatColumns:function(){return"컬럼 필터링"},formatColumnsToggleAll:function(){return"Toggle all"},formatFullscreen:function(){return"Fullscreen"},formatAllRows:function(){return"All"},formatAutoRefresh:function(){return"Auto Refresh"},formatExport:function(){return"Export data"},formatJumpTo:function(){return"GO"},formatAdvancedSearch:function(){return"Advanced search"},formatAdvancedCloseButton:function(){return"Close"},formatFilterControlSwitch:function(){return"Hide/Show controls"},formatFilterControlSwitchHide:function(){return"Hide controls"},formatFilterControlSwitchShow:function(){return"Show controls"}},r.default.extend(r.default.fn.bootstrapTable.defaults,r.default.fn.bootstrapTable.locales["ko-KR"])}));
11 |
--------------------------------------------------------------------------------
/wwwroot/lib/bootstrap-table/locale/bootstrap-table-zh-CN.min.js:
--------------------------------------------------------------------------------
1 | /**
2 | * bootstrap-table - An extended table to integration with some of the most widely used CSS frameworks. (Supports Bootstrap, Semantic UI, Bulma, Material Design, Foundation)
3 | *
4 | * @version v1.18.3
5 | * @homepage https://bootstrap-table.com
6 | * @author wenzhixin (http://wenzhixin.net.cn/)
7 | * @license MIT
8 | */
9 |
10 | !function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],n):n((t="undefined"!=typeof globalThis?globalThis:t||self).jQuery)}(this,(function(t){"use strict";function n(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var r=n(t),e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function o(t,n){return t(n={exports:{}},n.exports),n.exports}var u=function(t){return t&&t.Math==Math&&t},i=u("object"==typeof globalThis&&globalThis)||u("object"==typeof window&&window)||u("object"==typeof self&&self)||u("object"==typeof e&&e)||function(){return this}()||Function("return this")(),f=function(t){try{return!!t()}catch(t){return!0}},c=!f((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),a={}.propertyIsEnumerable,l=Object.getOwnPropertyDescriptor,s={f:l&&!a.call({1:2},1)?function(t){var n=l(this,t);return!!n&&n.enumerable}:a},p=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}},y={}.toString,h=function(t){return y.call(t).slice(8,-1)},g="".split,m=f((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==h(t)?g.call(t,""):Object(t)}:Object,d=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t},b=function(t){return m(d(t))},v=function(t){return"object"==typeof t?null!==t:"function"==typeof t},w=function(t,n){if(!v(t))return t;var r,e;if(n&&"function"==typeof(r=t.toString)&&!v(e=r.call(t)))return e;if("function"==typeof(r=t.valueOf)&&!v(e=r.call(t)))return e;if(!n&&"function"==typeof(r=t.toString)&&!v(e=r.call(t)))return e;throw TypeError("Can't convert object to primitive value")},S={}.hasOwnProperty,T=function(t,n){return S.call(t,n)},O=i.document,P=v(O)&&v(O.createElement),j=!c&&!f((function(){return 7!=Object.defineProperty((t="div",P?O.createElement(t):{}),"a",{get:function(){return 7}}).a;var t})),x=Object.getOwnPropertyDescriptor,C={f:c?x:function(t,n){if(t=b(t),n=w(n,!0),j)try{return x(t,n)}catch(t){}if(T(t,n))return p(!s.f.call(t,n),t[n])}},E=function(t){if(!v(t))throw TypeError(String(t)+" is not an object");return t},A=Object.defineProperty,M={f:c?A:function(t,n,r){if(E(t),n=w(n,!0),E(r),j)try{return A(t,n,r)}catch(t){}if("get"in r||"set"in r)throw TypeError("Accessors not supported");return"value"in r&&(t[n]=r.value),t}},R=c?function(t,n,r){return M.f(t,n,p(1,r))}:function(t,n,r){return t[n]=r,t},F=function(t,n){try{R(i,t,n)}catch(r){i[t]=n}return n},N="__core-js_shared__",k=i[N]||F(N,{}),z=Function.toString;"function"!=typeof k.inspectSource&&(k.inspectSource=function(t){return z.call(t)});var I,L,_,D,q=k.inspectSource,B=i.WeakMap,G="function"==typeof B&&/native code/.test(q(B)),W=o((function(t){(t.exports=function(t,n){return k[t]||(k[t]=void 0!==n?n:{})})("versions",[]).push({version:"3.9.1",mode:"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})})),H=0,J=Math.random(),K=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++H+J).toString(36)},Q=W("keys"),U={},V=i.WeakMap;if(G){var Y=k.state||(k.state=new V),X=Y.get,Z=Y.has,$=Y.set;I=function(t,n){return n.facade=t,$.call(Y,t,n),n},L=function(t){return X.call(Y,t)||{}},_=function(t){return Z.call(Y,t)}}else{var tt=Q[D="state"]||(Q[D]=K(D));U[tt]=!0,I=function(t,n){return n.facade=t,R(t,tt,n),n},L=function(t){return T(t,tt)?t[tt]:{}},_=function(t){return T(t,tt)}}var nt,rt,et={set:I,get:L,has:_,enforce:function(t){return _(t)?L(t):I(t,{})},getterFor:function(t){return function(n){var r;if(!v(n)||(r=L(n)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return r}}},ot=o((function(t){var n=et.get,r=et.enforce,e=String(String).split("String");(t.exports=function(t,n,o,u){var f,c=!!u&&!!u.unsafe,a=!!u&&!!u.enumerable,l=!!u&&!!u.noTargetGet;"function"==typeof o&&("string"!=typeof n||T(o,"name")||R(o,"name",n),(f=r(o)).source||(f.source=e.join("string"==typeof n?n:""))),t!==i?(c?!l&&t[n]&&(a=!0):delete t[n],a?t[n]=o:R(t,n,o)):a?t[n]=o:F(n,o)})(Function.prototype,"toString",(function(){return"function"==typeof this&&n(this).source||q(this)}))})),ut=i,it=function(t){return"function"==typeof t?t:void 0},ft=function(t,n){return arguments.length<2?it(ut[t])||it(i[t]):ut[t]&&ut[t][n]||i[t]&&i[t][n]},ct=Math.ceil,at=Math.floor,lt=function(t){return isNaN(t=+t)?0:(t>0?at:ct)(t)},st=Math.min,pt=function(t){return t>0?st(lt(t),9007199254740991):0},yt=Math.max,ht=Math.min,gt=function(t){return function(n,r,e){var o,u=b(n),i=pt(u.length),f=function(t,n){var r=lt(t);return r<0?yt(r+n,0):ht(r,n)}(e,i);if(t&&r!=r){for(;i>f;)if((o=u[f++])!=o)return!0}else for(;i>f;f++)if((t||f in u)&&u[f]===r)return t||f||0;return!t&&-1}},mt={includes:gt(!0),indexOf:gt(!1)}.indexOf,dt=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"].concat("length","prototype"),bt={f:Object.getOwnPropertyNames||function(t){return function(t,n){var r,e=b(t),o=0,u=[];for(r in e)!T(U,r)&&T(e,r)&&u.push(r);for(;n.length>o;)T(e,r=n[o++])&&(~mt(u,r)||u.push(r));return u}(t,dt)}},vt={f:Object.getOwnPropertySymbols},wt=ft("Reflect","ownKeys")||function(t){var n=bt.f(E(t)),r=vt.f;return r?n.concat(r(t)):n},St=function(t,n){for(var r=wt(n),e=M.f,o=C.f,u=0;u=74)&&(nt=kt.match(/Chrome\/(\d+)/))&&(rt=nt[1]);var _t,Dt=rt&&+rt,qt=!!Object.getOwnPropertySymbols&&!f((function(){return!Symbol.sham&&(Nt?38===Dt:Dt>37&&Dt<41)})),Bt=qt&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,Gt=W("wks"),Wt=i.Symbol,Ht=Bt?Wt:Wt&&Wt.withoutSetter||K,Jt=function(t){return T(Gt,t)&&(qt||"string"==typeof Gt[t])||(qt&&T(Wt,t)?Gt[t]=Wt[t]:Gt[t]=Ht("Symbol."+t)),Gt[t]},Kt=Jt("species"),Qt=function(t,n){var r;return Mt(t)&&("function"!=typeof(r=t.constructor)||r!==Array&&!Mt(r.prototype)?v(r)&&null===(r=r[Kt])&&(r=void 0):r=void 0),new(void 0===r?Array:r)(0===n?0:n)},Ut=Jt("species"),Vt=Jt("isConcatSpreadable"),Yt=9007199254740991,Xt="Maximum allowed index exceeded",Zt=Dt>=51||!f((function(){var t=[];return t[Vt]=!1,t.concat()[0]!==t})),$t=(_t="concat",Dt>=51||!f((function(){var t=[];return(t.constructor={})[Ut]=function(){return{foo:1}},1!==t[_t](Boolean).foo}))),tn=function(t){if(!v(t))return!1;var n=t[Vt];return void 0!==n?!!n:Mt(t)};!function(t,n){var r,e,o,u,f,c=t.target,a=t.global,l=t.stat;if(r=a?i:l?i[c]||F(c,{}):(i[c]||{}).prototype)for(e in n){if(u=n[e],o=t.noTargetGet?(f=At(r,e))&&f.value:r[e],!Et(a?e:c+(l?".":"#")+e,t.forced)&&void 0!==o){if(typeof u==typeof o)continue;St(u,o)}(t.sham||o&&o.sham)&&R(u,"sham",!0),ot(r,e,u,t)}}({target:"Array",proto:!0,forced:!Zt||!$t},{concat:function(t){var n,r,e,o,u,i=Rt(this),f=Qt(i,0),c=0;for(n=-1,e=arguments.length;nYt)throw TypeError(Xt);for(r=0;r=Yt)throw TypeError(Xt);Ft(f,c++,u)}return f.length=c,f}}),r.default.fn.bootstrapTable.locales["zh-CN"]=r.default.fn.bootstrapTable.locales.zh={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"正在努力地加载数据中,请稍候"},formatRecordsPerPage:function(t){return"每页显示 ".concat(t," 条记录")},formatShowingRows:function(t,n,r,e){return void 0!==e&&e>0&&e>r?"显示第 ".concat(t," 到第 ").concat(n," 条记录,总共 ").concat(r," 条记录(从 ").concat(e," 总记录中过滤)"):"显示第 ".concat(t," 到第 ").concat(n," 条记录,总共 ").concat(r," 条记录")},formatSRPaginationPreText:function(){return"上一页"},formatSRPaginationPageText:function(t){return"第".concat(t,"页")},formatSRPaginationNextText:function(){return"下一页"},formatDetailPagination:function(t){return"总共 ".concat(t," 条记录")},formatClearSearch:function(){return"清空过滤"},formatSearch:function(){return"搜索"},formatNoMatches:function(){return"没有找到匹配的记录"},formatPaginationSwitch:function(){return"隐藏/显示分页"},formatPaginationSwitchDown:function(){return"显示分页"},formatPaginationSwitchUp:function(){return"隐藏分页"},formatRefresh:function(){return"刷新"},formatToggle:function(){return"切换"},formatToggleOn:function(){return"显示卡片视图"},formatToggleOff:function(){return"隐藏卡片视图"},formatColumns:function(){return"列"},formatColumnsToggleAll:function(){return"切换所有"},formatFullscreen:function(){return"全屏"},formatAllRows:function(){return"所有"},formatAutoRefresh:function(){return"自动刷新"},formatExport:function(){return"导出数据"},formatJumpTo:function(){return"跳转"},formatAdvancedSearch:function(){return"高级搜索"},formatAdvancedCloseButton:function(){return"关闭"},formatFilterControlSwitch:function(){return"隐藏/显示过滤控制"},formatFilterControlSwitchHide:function(){return"隐藏过滤控制"},formatFilterControlSwitchShow:function(){return"显示过滤控制"}},r.default.extend(r.default.fn.bootstrapTable.defaults,r.default.fn.bootstrapTable.locales["zh-CN"])}));
11 |
--------------------------------------------------------------------------------
/wwwroot/lib/bootstrap-table/locale/bootstrap-table-zh-TW.min.js:
--------------------------------------------------------------------------------
1 | /**
2 | * bootstrap-table - An extended table to integration with some of the most widely used CSS frameworks. (Supports Bootstrap, Semantic UI, Bulma, Material Design, Foundation)
3 | *
4 | * @version v1.18.3
5 | * @homepage https://bootstrap-table.com
6 | * @author wenzhixin (http://wenzhixin.net.cn/)
7 | * @license MIT
8 | */
9 |
10 | !function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],n):n((t="undefined"!=typeof globalThis?globalThis:t||self).jQuery)}(this,(function(t){"use strict";function n(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var r=n(t),e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function o(t,n){return t(n={exports:{}},n.exports),n.exports}var u=function(t){return t&&t.Math==Math&&t},i=u("object"==typeof globalThis&&globalThis)||u("object"==typeof window&&window)||u("object"==typeof self&&self)||u("object"==typeof e&&e)||function(){return this}()||Function("return this")(),f=function(t){try{return!!t()}catch(t){return!0}},c=!f((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),a={}.propertyIsEnumerable,l=Object.getOwnPropertyDescriptor,s={f:l&&!a.call({1:2},1)?function(t){var n=l(this,t);return!!n&&n.enumerable}:a},p=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}},y={}.toString,g=function(t){return y.call(t).slice(8,-1)},h="".split,m=f((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==g(t)?h.call(t,""):Object(t)}:Object,d=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t},b=function(t){return m(d(t))},v=function(t){return"object"==typeof t?null!==t:"function"==typeof t},w=function(t,n){if(!v(t))return t;var r,e;if(n&&"function"==typeof(r=t.toString)&&!v(e=r.call(t)))return e;if("function"==typeof(r=t.valueOf)&&!v(e=r.call(t)))return e;if(!n&&"function"==typeof(r=t.toString)&&!v(e=r.call(t)))return e;throw TypeError("Can't convert object to primitive value")},S={}.hasOwnProperty,T=function(t,n){return S.call(t,n)},O=i.document,P=v(O)&&v(O.createElement),j=!c&&!f((function(){return 7!=Object.defineProperty((t="div",P?O.createElement(t):{}),"a",{get:function(){return 7}}).a;var t})),x=Object.getOwnPropertyDescriptor,E={f:c?x:function(t,n){if(t=b(t),n=w(n,!0),j)try{return x(t,n)}catch(t){}if(T(t,n))return p(!s.f.call(t,n),t[n])}},A=function(t){if(!v(t))throw TypeError(String(t)+" is not an object");return t},C=Object.defineProperty,M={f:c?C:function(t,n,r){if(A(t),n=w(n,!0),A(r),j)try{return C(t,n,r)}catch(t){}if("get"in r||"set"in r)throw TypeError("Accessors not supported");return"value"in r&&(t[n]=r.value),t}},R=c?function(t,n,r){return M.f(t,n,p(1,r))}:function(t,n,r){return t[n]=r,t},F=function(t,n){try{R(i,t,n)}catch(r){i[t]=n}return n},N="__core-js_shared__",k=i[N]||F(N,{}),I=Function.toString;"function"!=typeof k.inspectSource&&(k.inspectSource=function(t){return I.call(t)});var L,_,z,D,q=k.inspectSource,W=i.WeakMap,B="function"==typeof W&&/native code/.test(q(W)),G=o((function(t){(t.exports=function(t,n){return k[t]||(k[t]=void 0!==n?n:{})})("versions",[]).push({version:"3.9.1",mode:"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})})),H=0,J=Math.random(),K=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++H+J).toString(36)},Q=G("keys"),U={},V=i.WeakMap;if(B){var Y=k.state||(k.state=new V),X=Y.get,Z=Y.has,$=Y.set;L=function(t,n){return n.facade=t,$.call(Y,t,n),n},_=function(t){return X.call(Y,t)||{}},z=function(t){return Z.call(Y,t)}}else{var tt=Q[D="state"]||(Q[D]=K(D));U[tt]=!0,L=function(t,n){return n.facade=t,R(t,tt,n),n},_=function(t){return T(t,tt)?t[tt]:{}},z=function(t){return T(t,tt)}}var nt,rt,et={set:L,get:_,has:z,enforce:function(t){return z(t)?_(t):L(t,{})},getterFor:function(t){return function(n){var r;if(!v(n)||(r=_(n)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return r}}},ot=o((function(t){var n=et.get,r=et.enforce,e=String(String).split("String");(t.exports=function(t,n,o,u){var f,c=!!u&&!!u.unsafe,a=!!u&&!!u.enumerable,l=!!u&&!!u.noTargetGet;"function"==typeof o&&("string"!=typeof n||T(o,"name")||R(o,"name",n),(f=r(o)).source||(f.source=e.join("string"==typeof n?n:""))),t!==i?(c?!l&&t[n]&&(a=!0):delete t[n],a?t[n]=o:R(t,n,o)):a?t[n]=o:F(n,o)})(Function.prototype,"toString",(function(){return"function"==typeof this&&n(this).source||q(this)}))})),ut=i,it=function(t){return"function"==typeof t?t:void 0},ft=function(t,n){return arguments.length<2?it(ut[t])||it(i[t]):ut[t]&&ut[t][n]||i[t]&&i[t][n]},ct=Math.ceil,at=Math.floor,lt=function(t){return isNaN(t=+t)?0:(t>0?at:ct)(t)},st=Math.min,pt=function(t){return t>0?st(lt(t),9007199254740991):0},yt=Math.max,gt=Math.min,ht=function(t){return function(n,r,e){var o,u=b(n),i=pt(u.length),f=function(t,n){var r=lt(t);return r<0?yt(r+n,0):gt(r,n)}(e,i);if(t&&r!=r){for(;i>f;)if((o=u[f++])!=o)return!0}else for(;i>f;f++)if((t||f in u)&&u[f]===r)return t||f||0;return!t&&-1}},mt={includes:ht(!0),indexOf:ht(!1)}.indexOf,dt=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"].concat("length","prototype"),bt={f:Object.getOwnPropertyNames||function(t){return function(t,n){var r,e=b(t),o=0,u=[];for(r in e)!T(U,r)&&T(e,r)&&u.push(r);for(;n.length>o;)T(e,r=n[o++])&&(~mt(u,r)||u.push(r));return u}(t,dt)}},vt={f:Object.getOwnPropertySymbols},wt=ft("Reflect","ownKeys")||function(t){var n=bt.f(A(t)),r=vt.f;return r?n.concat(r(t)):n},St=function(t,n){for(var r=wt(n),e=M.f,o=E.f,u=0;u=74)&&(nt=kt.match(/Chrome\/(\d+)/))&&(rt=nt[1]);var zt,Dt=rt&&+rt,qt=!!Object.getOwnPropertySymbols&&!f((function(){return!Symbol.sham&&(Nt?38===Dt:Dt>37&&Dt<41)})),Wt=qt&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,Bt=G("wks"),Gt=i.Symbol,Ht=Wt?Gt:Gt&&Gt.withoutSetter||K,Jt=function(t){return T(Bt,t)&&(qt||"string"==typeof Bt[t])||(qt&&T(Gt,t)?Bt[t]=Gt[t]:Bt[t]=Ht("Symbol."+t)),Bt[t]},Kt=Jt("species"),Qt=function(t,n){var r;return Mt(t)&&("function"!=typeof(r=t.constructor)||r!==Array&&!Mt(r.prototype)?v(r)&&null===(r=r[Kt])&&(r=void 0):r=void 0),new(void 0===r?Array:r)(0===n?0:n)},Ut=Jt("species"),Vt=Jt("isConcatSpreadable"),Yt=9007199254740991,Xt="Maximum allowed index exceeded",Zt=Dt>=51||!f((function(){var t=[];return t[Vt]=!1,t.concat()[0]!==t})),$t=(zt="concat",Dt>=51||!f((function(){var t=[];return(t.constructor={})[Ut]=function(){return{foo:1}},1!==t[zt](Boolean).foo}))),tn=function(t){if(!v(t))return!1;var n=t[Vt];return void 0!==n?!!n:Mt(t)};!function(t,n){var r,e,o,u,f,c=t.target,a=t.global,l=t.stat;if(r=a?i:l?i[c]||F(c,{}):(i[c]||{}).prototype)for(e in n){if(u=n[e],o=t.noTargetGet?(f=Ct(r,e))&&f.value:r[e],!At(a?e:c+(l?".":"#")+e,t.forced)&&void 0!==o){if(typeof u==typeof o)continue;St(u,o)}(t.sham||o&&o.sham)&&R(u,"sham",!0),ot(r,e,u,t)}}({target:"Array",proto:!0,forced:!Zt||!$t},{concat:function(t){var n,r,e,o,u,i=Rt(this),f=Qt(i,0),c=0;for(n=-1,e=arguments.length;nYt)throw TypeError(Xt);for(r=0;r=Yt)throw TypeError(Xt);Ft(f,c++,u)}return f.length=c,f}}),r.default.fn.bootstrapTable.locales["zh-TW"]={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"正在努力地載入資料,請稍候"},formatRecordsPerPage:function(t){return"每頁顯示 ".concat(t," 項記錄")},formatShowingRows:function(t,n,r,e){return void 0!==e&&e>0&&e>r?"顯示第 ".concat(t," 到第 ").concat(n," 項記錄,總共 ").concat(r," 項記錄(從 ").concat(e," 總記錄中過濾)"):"顯示第 ".concat(t," 到第 ").concat(n," 項記錄,總共 ").concat(r," 項記錄")},formatSRPaginationPreText:function(){return"上一頁"},formatSRPaginationPageText:function(t){return"第".concat(t,"頁")},formatSRPaginationNextText:function(){return"下一頁"},formatDetailPagination:function(t){return"總共 ".concat(t," 項記錄")},formatClearSearch:function(){return"清空過濾"},formatSearch:function(){return"搜尋"},formatNoMatches:function(){return"沒有找到符合的結果"},formatPaginationSwitch:function(){return"隱藏/顯示分頁"},formatPaginationSwitchDown:function(){return"顯示分頁"},formatPaginationSwitchUp:function(){return"隱藏分頁"},formatRefresh:function(){return"重新整理"},formatToggle:function(){return"切換"},formatToggleOn:function(){return"顯示卡片視圖"},formatToggleOff:function(){return"隱藏卡片視圖"},formatColumns:function(){return"列"},formatColumnsToggleAll:function(){return"切換所有"},formatFullscreen:function(){return"全屏"},formatAllRows:function(){return"所有"},formatAutoRefresh:function(){return"自動刷新"},formatExport:function(){return"導出數據"},formatJumpTo:function(){return"跳轉"},formatAdvancedSearch:function(){return"高級搜尋"},formatAdvancedCloseButton:function(){return"關閉"},formatFilterControlSwitch:function(){return"隱藏/顯示過濾控制"},formatFilterControlSwitchHide:function(){return"隱藏過濾控制"},formatFilterControlSwitchShow:function(){return"顯示過濾控制"}},r.default.extend(r.default.fn.bootstrapTable.defaults,r.default.fn.bootstrapTable.locales["zh-TW"])}));
11 |
--------------------------------------------------------------------------------
/wwwroot/lib/bootstrap-table/themes/bootstrap-table/fonts/bootstrap-table.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/lib/bootstrap-table/themes/bootstrap-table/fonts/bootstrap-table.eot
--------------------------------------------------------------------------------
/wwwroot/lib/bootstrap-table/themes/bootstrap-table/fonts/bootstrap-table.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/lib/bootstrap-table/themes/bootstrap-table/fonts/bootstrap-table.ttf
--------------------------------------------------------------------------------
/wwwroot/lib/bootstrap-table/themes/bootstrap-table/fonts/bootstrap-table.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/lib/bootstrap-table/themes/bootstrap-table/fonts/bootstrap-table.woff
--------------------------------------------------------------------------------
/wwwroot/lib/bootstrap/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2011-2018 Twitter, Inc.
4 | Copyright (c) 2011-2018 The Bootstrap Authors
5 |
6 | Permission is hereby granted, free of charge, to any person obtaining a copy
7 | of this software and associated documentation files (the "Software"), to deal
8 | in the Software without restriction, including without limitation the rights
9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | copies of the Software, and to permit persons to whom the Software is
11 | furnished to do so, subject to the following conditions:
12 |
13 | The above copyright notice and this permission notice shall be included in
14 | all copies or substantial portions of the Software.
15 |
16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | THE SOFTWARE.
23 |
--------------------------------------------------------------------------------
/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)
3 | * Copyright 2011-2019 The Bootstrap Authors
4 | * Copyright 2011-2019 Twitter, Inc.
5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
6 | * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
7 | */
8 | *,
9 | *::before,
10 | *::after {
11 | box-sizing: border-box;
12 | }
13 |
14 | html {
15 | font-family: sans-serif;
16 | line-height: 1.15;
17 | -webkit-text-size-adjust: 100%;
18 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
19 | }
20 |
21 | article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
22 | display: block;
23 | }
24 |
25 | body {
26 | margin: 0;
27 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
28 | font-size: 1rem;
29 | font-weight: 400;
30 | line-height: 1.5;
31 | color: #212529;
32 | text-align: left;
33 | background-color: #fff;
34 | }
35 |
36 | [tabindex="-1"]:focus {
37 | outline: 0 !important;
38 | }
39 |
40 | hr {
41 | box-sizing: content-box;
42 | height: 0;
43 | overflow: visible;
44 | }
45 |
46 | h1, h2, h3, h4, h5, h6 {
47 | margin-top: 0;
48 | margin-bottom: 0.5rem;
49 | }
50 |
51 | p {
52 | margin-top: 0;
53 | margin-bottom: 1rem;
54 | }
55 |
56 | abbr[title],
57 | abbr[data-original-title] {
58 | text-decoration: underline;
59 | -webkit-text-decoration: underline dotted;
60 | text-decoration: underline dotted;
61 | cursor: help;
62 | border-bottom: 0;
63 | -webkit-text-decoration-skip-ink: none;
64 | text-decoration-skip-ink: none;
65 | }
66 |
67 | address {
68 | margin-bottom: 1rem;
69 | font-style: normal;
70 | line-height: inherit;
71 | }
72 |
73 | ol,
74 | ul,
75 | dl {
76 | margin-top: 0;
77 | margin-bottom: 1rem;
78 | }
79 |
80 | ol ol,
81 | ul ul,
82 | ol ul,
83 | ul ol {
84 | margin-bottom: 0;
85 | }
86 |
87 | dt {
88 | font-weight: 700;
89 | }
90 |
91 | dd {
92 | margin-bottom: .5rem;
93 | margin-left: 0;
94 | }
95 |
96 | blockquote {
97 | margin: 0 0 1rem;
98 | }
99 |
100 | b,
101 | strong {
102 | font-weight: bolder;
103 | }
104 |
105 | small {
106 | font-size: 80%;
107 | }
108 |
109 | sub,
110 | sup {
111 | position: relative;
112 | font-size: 75%;
113 | line-height: 0;
114 | vertical-align: baseline;
115 | }
116 |
117 | sub {
118 | bottom: -.25em;
119 | }
120 |
121 | sup {
122 | top: -.5em;
123 | }
124 |
125 | a {
126 | color: #007bff;
127 | text-decoration: none;
128 | background-color: transparent;
129 | }
130 |
131 | a:hover {
132 | color: #0056b3;
133 | text-decoration: underline;
134 | }
135 |
136 | a:not([href]):not([tabindex]) {
137 | color: inherit;
138 | text-decoration: none;
139 | }
140 |
141 | a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {
142 | color: inherit;
143 | text-decoration: none;
144 | }
145 |
146 | a:not([href]):not([tabindex]):focus {
147 | outline: 0;
148 | }
149 |
150 | pre,
151 | code,
152 | kbd,
153 | samp {
154 | font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
155 | font-size: 1em;
156 | }
157 |
158 | pre {
159 | margin-top: 0;
160 | margin-bottom: 1rem;
161 | overflow: auto;
162 | }
163 |
164 | figure {
165 | margin: 0 0 1rem;
166 | }
167 |
168 | img {
169 | vertical-align: middle;
170 | border-style: none;
171 | }
172 |
173 | svg {
174 | overflow: hidden;
175 | vertical-align: middle;
176 | }
177 |
178 | table {
179 | border-collapse: collapse;
180 | }
181 |
182 | caption {
183 | padding-top: 0.75rem;
184 | padding-bottom: 0.75rem;
185 | color: #6c757d;
186 | text-align: left;
187 | caption-side: bottom;
188 | }
189 |
190 | th {
191 | text-align: inherit;
192 | }
193 |
194 | label {
195 | display: inline-block;
196 | margin-bottom: 0.5rem;
197 | }
198 |
199 | button {
200 | border-radius: 0;
201 | }
202 |
203 | button:focus {
204 | outline: 1px dotted;
205 | outline: 5px auto -webkit-focus-ring-color;
206 | }
207 |
208 | input,
209 | button,
210 | select,
211 | optgroup,
212 | textarea {
213 | margin: 0;
214 | font-family: inherit;
215 | font-size: inherit;
216 | line-height: inherit;
217 | }
218 |
219 | button,
220 | input {
221 | overflow: visible;
222 | }
223 |
224 | button,
225 | select {
226 | text-transform: none;
227 | }
228 |
229 | select {
230 | word-wrap: normal;
231 | }
232 |
233 | button,
234 | [type="button"],
235 | [type="reset"],
236 | [type="submit"] {
237 | -webkit-appearance: button;
238 | }
239 |
240 | button:not(:disabled),
241 | [type="button"]:not(:disabled),
242 | [type="reset"]:not(:disabled),
243 | [type="submit"]:not(:disabled) {
244 | cursor: pointer;
245 | }
246 |
247 | button::-moz-focus-inner,
248 | [type="button"]::-moz-focus-inner,
249 | [type="reset"]::-moz-focus-inner,
250 | [type="submit"]::-moz-focus-inner {
251 | padding: 0;
252 | border-style: none;
253 | }
254 |
255 | input[type="radio"],
256 | input[type="checkbox"] {
257 | box-sizing: border-box;
258 | padding: 0;
259 | }
260 |
261 | input[type="date"],
262 | input[type="time"],
263 | input[type="datetime-local"],
264 | input[type="month"] {
265 | -webkit-appearance: listbox;
266 | }
267 |
268 | textarea {
269 | overflow: auto;
270 | resize: vertical;
271 | }
272 |
273 | fieldset {
274 | min-width: 0;
275 | padding: 0;
276 | margin: 0;
277 | border: 0;
278 | }
279 |
280 | legend {
281 | display: block;
282 | width: 100%;
283 | max-width: 100%;
284 | padding: 0;
285 | margin-bottom: .5rem;
286 | font-size: 1.5rem;
287 | line-height: inherit;
288 | color: inherit;
289 | white-space: normal;
290 | }
291 |
292 | progress {
293 | vertical-align: baseline;
294 | }
295 |
296 | [type="number"]::-webkit-inner-spin-button,
297 | [type="number"]::-webkit-outer-spin-button {
298 | height: auto;
299 | }
300 |
301 | [type="search"] {
302 | outline-offset: -2px;
303 | -webkit-appearance: none;
304 | }
305 |
306 | [type="search"]::-webkit-search-decoration {
307 | -webkit-appearance: none;
308 | }
309 |
310 | ::-webkit-file-upload-button {
311 | font: inherit;
312 | -webkit-appearance: button;
313 | }
314 |
315 | output {
316 | display: inline-block;
317 | }
318 |
319 | summary {
320 | display: list-item;
321 | cursor: pointer;
322 | }
323 |
324 | template {
325 | display: none;
326 | }
327 |
328 | [hidden] {
329 | display: none !important;
330 | }
331 | /*# sourceMappingURL=bootstrap-reboot.css.map */
--------------------------------------------------------------------------------
/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)
3 | * Copyright 2011-2019 The Bootstrap Authors
4 | * Copyright 2011-2019 Twitter, Inc.
5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
6 | * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
7 | */*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}
8 | /*# sourceMappingURL=bootstrap-reboot.min.css.map */
--------------------------------------------------------------------------------
/wwwroot/lib/jquery-ajax-unobtrusive/jquery.unobtrusive-ajax.js:
--------------------------------------------------------------------------------
1 | // Unobtrusive Ajax support library for jQuery
2 | // Copyright (c) .NET Foundation. All rights reserved.
3 | // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
4 | // @version v3.2.6
5 | //
6 | // Microsoft grants you the right to use these script files for the sole
7 | // purpose of either: (i) interacting through your browser with the Microsoft
8 | // website or online service, subject to the applicable licensing or use
9 | // terms; or (ii) using the files as included with a Microsoft product subject
10 | // to that product's license terms. Microsoft reserves all other rights to the
11 | // files not expressly granted by Microsoft, whether by implication, estoppel
12 | // or otherwise. Insofar as a script file is dual licensed under GPL,
13 | // Microsoft neither took the code under GPL nor distributes it thereunder but
14 | // under the terms set out in this paragraph. All notices and licenses
15 | // below are for informational purposes only.
16 |
17 | /*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
18 | /*global window: false, jQuery: false */
19 |
20 | (function ($) {
21 | var data_click = "unobtrusiveAjaxClick",
22 | data_target = "unobtrusiveAjaxClickTarget",
23 | data_validation = "unobtrusiveValidation";
24 |
25 | function getFunction(code, argNames) {
26 | var fn = window, parts = (code || "").split(".");
27 | while (fn && parts.length) {
28 | fn = fn[parts.shift()];
29 | }
30 | if (typeof (fn) === "function") {
31 | return fn;
32 | }
33 | argNames.push(code);
34 | return Function.constructor.apply(null, argNames);
35 | }
36 |
37 | function isMethodProxySafe(method) {
38 | return method === "GET" || method === "POST";
39 | }
40 |
41 | function asyncOnBeforeSend(xhr, method) {
42 | if (!isMethodProxySafe(method)) {
43 | xhr.setRequestHeader("X-HTTP-Method-Override", method);
44 | }
45 | }
46 |
47 | function asyncOnSuccess(element, data, contentType) {
48 | var mode;
49 |
50 | if (contentType.indexOf("application/x-javascript") !== -1) { // jQuery already executes JavaScript for us
51 | return;
52 | }
53 |
54 | mode = (element.getAttribute("data-ajax-mode") || "").toUpperCase();
55 | $(element.getAttribute("data-ajax-update")).each(function (i, update) {
56 | var top;
57 |
58 | switch (mode) {
59 | case "BEFORE":
60 | $(update).prepend(data);
61 | break;
62 | case "AFTER":
63 | $(update).append(data);
64 | break;
65 | case "REPLACE-WITH":
66 | $(update).replaceWith(data);
67 | break;
68 | default:
69 | $(update).html(data);
70 | break;
71 | }
72 | });
73 | }
74 |
75 | function asyncRequest(element, options) {
76 | var confirm, loading, method, duration;
77 |
78 | confirm = element.getAttribute("data-ajax-confirm");
79 | if (confirm && !window.confirm(confirm)) {
80 | return;
81 | }
82 |
83 | loading = $(element.getAttribute("data-ajax-loading"));
84 | duration = parseInt(element.getAttribute("data-ajax-loading-duration"), 10) || 0;
85 |
86 | $.extend(options, {
87 | type: element.getAttribute("data-ajax-method") || undefined,
88 | url: element.getAttribute("data-ajax-url") || undefined,
89 | cache: (element.getAttribute("data-ajax-cache") || "").toLowerCase() === "true",
90 | beforeSend: function (xhr) {
91 | var result;
92 | asyncOnBeforeSend(xhr, method);
93 | result = getFunction(element.getAttribute("data-ajax-begin"), ["xhr"]).apply(element, arguments);
94 | if (result !== false) {
95 | loading.show(duration);
96 | }
97 | return result;
98 | },
99 | complete: function () {
100 | loading.hide(duration);
101 | getFunction(element.getAttribute("data-ajax-complete"), ["xhr", "status"]).apply(element, arguments);
102 | },
103 | success: function (data, status, xhr) {
104 | asyncOnSuccess(element, data, xhr.getResponseHeader("Content-Type") || "text/html");
105 | getFunction(element.getAttribute("data-ajax-success"), ["data", "status", "xhr"]).apply(element, arguments);
106 | },
107 | error: function () {
108 | getFunction(element.getAttribute("data-ajax-failure"), ["xhr", "status", "error"]).apply(element, arguments);
109 | }
110 | });
111 |
112 | options.data.push({ name: "X-Requested-With", value: "XMLHttpRequest" });
113 |
114 | method = options.type.toUpperCase();
115 | if (!isMethodProxySafe(method)) {
116 | options.type = "POST";
117 | options.data.push({ name: "X-HTTP-Method-Override", value: method });
118 | }
119 |
120 | // change here:
121 | // Check for a Form POST with enctype=multipart/form-data
122 | // add the input file that were not previously included in the serializeArray()
123 | // set processData and contentType to false
124 | var $element = $(element);
125 | if ($element.is("form") && $element.attr("enctype") == "multipart/form-data") {
126 | var formdata = new FormData();
127 | $.each(options.data, function (i, v) {
128 | formdata.append(v.name, v.value);
129 | });
130 | $("input[type=file]", $element).each(function () {
131 | var file = this;
132 | $.each(file.files, function (n, v) {
133 | formdata.append(file.name, v);
134 | });
135 | });
136 | $.extend(options, {
137 | processData: false,
138 | contentType: false,
139 | data: formdata
140 | });
141 | }
142 | // end change
143 |
144 | $.ajax(options);
145 | }
146 |
147 | function validate(form) {
148 | var validationInfo = $(form).data(data_validation);
149 | return !validationInfo || !validationInfo.validate || validationInfo.validate();
150 | }
151 |
152 | $(document).on("click", "a[data-ajax=true]", function (evt) {
153 | evt.preventDefault();
154 | asyncRequest(this, {
155 | url: this.href,
156 | type: "GET",
157 | data: []
158 | });
159 | });
160 |
161 | $(document).on("click", "form[data-ajax=true] input[type=image]", function (evt) {
162 | var name = evt.target.name,
163 | target = $(evt.target),
164 | form = $(target.parents("form")[0]),
165 | offset = target.offset();
166 |
167 | form.data(data_click, [
168 | { name: name + ".x", value: Math.round(evt.pageX - offset.left) },
169 | { name: name + ".y", value: Math.round(evt.pageY - offset.top) }
170 | ]);
171 |
172 | setTimeout(function () {
173 | form.removeData(data_click);
174 | }, 0);
175 | });
176 |
177 | $(document).on("click", "form[data-ajax=true] :submit", function (evt) {
178 | var name = evt.currentTarget.name,
179 | target = $(evt.target),
180 | form = $(target.parents("form")[0]);
181 |
182 | form.data(data_click, name ? [{ name: name, value: evt.currentTarget.value }] : []);
183 | form.data(data_target, target);
184 |
185 | setTimeout(function () {
186 | form.removeData(data_click);
187 | form.removeData(data_target);
188 | }, 0);
189 | });
190 |
191 | $(document).on("submit", "form[data-ajax=true]", function (evt) {
192 | var clickInfo = $(this).data(data_click) || [],
193 | clickTarget = $(this).data(data_target),
194 | isCancel = clickTarget && (clickTarget.hasClass("cancel") || clickTarget.attr('formnovalidate') !== undefined);
195 | evt.preventDefault();
196 | if (!isCancel && !validate(this)) {
197 | return;
198 | }
199 | asyncRequest(this, {
200 | url: this.action,
201 | type: this.method || "GET",
202 | data: clickInfo.concat($(this).serializeArray())
203 | });
204 | });
205 | }(jQuery));
206 |
--------------------------------------------------------------------------------
/wwwroot/lib/jquery-ajax-unobtrusive/jquery.unobtrusive-ajax.min.js:
--------------------------------------------------------------------------------
1 | // Unobtrusive Ajax support library for jQuery
2 | // Copyright (c) .NET Foundation. All rights reserved.
3 | // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
4 | // @version v3.2.6
5 | //
6 | // Microsoft grants you the right to use these script files for the sole
7 | // purpose of either: (i) interacting through your browser with the Microsoft
8 | // website or online service, subject to the applicable licensing or use
9 | // terms; or (ii) using the files as included with a Microsoft product subject
10 | // to that product's license terms. Microsoft reserves all other rights to the
11 | // files not expressly granted by Microsoft, whether by implication, estoppel
12 | // or otherwise. Insofar as a script file is dual licensed under GPL,
13 | // Microsoft neither took the code under GPL nor distributes it thereunder but
14 | // under the terms set out in this paragraph. All notices and licenses
15 | // below are for informational purposes only.
16 | !function(t){function a(t,a){for(var e=window,r=(t||"").split(".");e&&r.length;)e=e[r.shift()];return"function"==typeof e?e:(a.push(t),Function.constructor.apply(null,a))}function e(t){return"GET"===t||"POST"===t}function r(t,a){e(a)||t.setRequestHeader("X-HTTP-Method-Override",a)}function n(a,e,r){var n;r.indexOf("application/x-javascript")===-1&&(n=(a.getAttribute("data-ajax-mode")||"").toUpperCase(),t(a.getAttribute("data-ajax-update")).each(function(a,r){switch(n){case"BEFORE":t(r).prepend(e);break;case"AFTER":t(r).append(e);break;case"REPLACE-WITH":t(r).replaceWith(e);break;default:t(r).html(e)}}))}function i(i,u){var o,c,d,s;if(o=i.getAttribute("data-ajax-confirm"),!o||window.confirm(o)){c=t(i.getAttribute("data-ajax-loading")),s=parseInt(i.getAttribute("data-ajax-loading-duration"),10)||0,t.extend(u,{type:i.getAttribute("data-ajax-method")||void 0,url:i.getAttribute("data-ajax-url")||void 0,cache:"true"===(i.getAttribute("data-ajax-cache")||"").toLowerCase(),beforeSend:function(t){var e;return r(t,d),e=a(i.getAttribute("data-ajax-begin"),["xhr"]).apply(i,arguments),e!==!1&&c.show(s),e},complete:function(){c.hide(s),a(i.getAttribute("data-ajax-complete"),["xhr","status"]).apply(i,arguments)},success:function(t,e,r){n(i,t,r.getResponseHeader("Content-Type")||"text/html"),a(i.getAttribute("data-ajax-success"),["data","status","xhr"]).apply(i,arguments)},error:function(){a(i.getAttribute("data-ajax-failure"),["xhr","status","error"]).apply(i,arguments)}}),u.data.push({name:"X-Requested-With",value:"XMLHttpRequest"}),d=u.type.toUpperCase(),e(d)||(u.type="POST",u.data.push({name:"X-HTTP-Method-Override",value:d}));var p=t(i);if(p.is("form")&&"multipart/form-data"==p.attr("enctype")){var f=new FormData;t.each(u.data,function(t,a){f.append(a.name,a.value)}),t("input[type=file]",p).each(function(){var a=this;t.each(a.files,function(t,e){f.append(a.name,e)})}),t.extend(u,{processData:!1,contentType:!1,data:f})}t.ajax(u)}}function u(a){var e=t(a).data(d);return!e||!e.validate||e.validate()}var o="unobtrusiveAjaxClick",c="unobtrusiveAjaxClickTarget",d="unobtrusiveValidation";t(document).on("click","a[data-ajax=true]",function(t){t.preventDefault(),i(this,{url:this.href,type:"GET",data:[]})}),t(document).on("click","form[data-ajax=true] input[type=image]",function(a){var e=a.target.name,r=t(a.target),n=t(r.parents("form")[0]),i=r.offset();n.data(o,[{name:e+".x",value:Math.round(a.pageX-i.left)},{name:e+".y",value:Math.round(a.pageY-i.top)}]),setTimeout(function(){n.removeData(o)},0)}),t(document).on("click","form[data-ajax=true] :submit",function(a){var e=a.currentTarget.name,r=t(a.target),n=t(r.parents("form")[0]);n.data(o,e?[{name:e,value:a.currentTarget.value}]:[]),n.data(c,r),setTimeout(function(){n.removeData(o),n.removeData(c)},0)}),t(document).on("submit","form[data-ajax=true]",function(a){var e=t(this).data(o)||[],r=t(this).data(c),n=r&&(r.hasClass("cancel")||void 0!==r.attr("formnovalidate"));a.preventDefault(),(n||u(this))&&i(this,{url:this.action,type:this.method||"GET",data:e.concat(t(this).serializeArray())})})}(jQuery);
--------------------------------------------------------------------------------
/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt:
--------------------------------------------------------------------------------
1 | Copyright (c) .NET Foundation. All rights reserved.
2 |
3 | Licensed under the Apache License, Version 2.0 (the "License"); you may not use
4 | these files except in compliance with the License. You may obtain a copy of the
5 | License at
6 |
7 | http://www.apache.org/licenses/LICENSE-2.0
8 |
9 | Unless required by applicable law or agreed to in writing, software distributed
10 | under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
11 | CONDITIONS OF ANY KIND, either express or implied. See the License for the
12 | specific language governing permissions and limitations under the License.
13 |
--------------------------------------------------------------------------------
/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js:
--------------------------------------------------------------------------------
1 | // Unobtrusive validation support library for jQuery and jQuery Validate
2 | // Copyright (c) .NET Foundation. All rights reserved.
3 | // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
4 | // @version v3.2.11
5 | !function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(a){function e(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function n(a){return a.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g)}function t(a){return a.replace(/([!"#$%&'()*+,.\/:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function r(a){return a.substr(0,a.lastIndexOf(".")+1)}function i(a,e){return 0===a.indexOf("*.")&&(a=a.replace("*.",e)),a}function o(e,n){var r=a(this).find("[data-valmsg-for='"+t(n[0].name)+"']"),i=r.attr("data-valmsg-replace"),o=i?a.parseJSON(i)!==!1:null;r.removeClass("field-validation-valid").addClass("field-validation-error"),e.data("unobtrusiveContainer",r),o?(r.empty(),e.removeClass("input-validation-error").appendTo(r)):e.hide()}function d(e,n){var t=a(this).find("[data-valmsg-summary=true]"),r=t.find("ul");r&&r.length&&n.errorList.length&&(r.empty(),t.addClass("validation-summary-errors").removeClass("validation-summary-valid"),a.each(n.errorList,function(){a(" ").html(this.message).appendTo(r)}))}function s(e){var n=e.data("unobtrusiveContainer");if(n){var t=n.attr("data-valmsg-replace"),r=t?a.parseJSON(t):null;n.addClass("field-validation-valid").removeClass("field-validation-error"),e.removeData("unobtrusiveContainer"),r&&n.empty()}}function l(e){var n=a(this),t="__jquery_unobtrusive_validation_form_reset";if(!n.data(t)){n.data(t,!0);try{n.data("validator").resetForm()}finally{n.removeData(t)}n.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),n.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function u(e){var n=a(e),t=n.data(v),r=a.proxy(l,e),i=f.unobtrusive.options||{},u=function(n,t){var r=i[n];r&&a.isFunction(r)&&r.apply(e,t)};return t||(t={options:{errorClass:i.errorClass||"input-validation-error",errorElement:i.errorElement||"span",errorPlacement:function(){o.apply(e,arguments),u("errorPlacement",arguments)},invalidHandler:function(){d.apply(e,arguments),u("invalidHandler",arguments)},messages:{},rules:{},success:function(){s.apply(e,arguments),u("success",arguments)}},attachValidation:function(){n.off("reset."+v,r).on("reset."+v,r).validate(this.options)},validate:function(){return n.validate(),n.valid()}},n.data(v,t)),t}var m,f=a.validator,v="unobtrusiveValidation";return f.unobtrusive={adapters:[],parseElement:function(e,n){var t,r,i,o=a(e),d=o.parents("form")[0];d&&(t=u(d),t.options.rules[e.name]=r={},t.options.messages[e.name]=i={},a.each(this.adapters,function(){var n="data-val-"+this.name,t=o.attr(n),s={};void 0!==t&&(n+="-",a.each(this.params,function(){s[this]=o.attr(n+this)}),this.adapt({element:e,form:d,message:t,params:s,rules:r,messages:i}))}),a.extend(r,{__dummy__:!0}),n||t.attachValidation())},parse:function(e){var n=a(e),t=n.parents().addBack().filter("form").add(n.find("form")).has("[data-val=true]");n.find("[data-val=true]").each(function(){f.unobtrusive.parseElement(this,!0)}),t.each(function(){var a=u(this);a&&a.attachValidation()})}},m=f.unobtrusive.adapters,m.add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},m.addBool=function(a,n){return this.add(a,function(t){e(t,n||a,!0)})},m.addMinMax=function(a,n,t,r,i,o){return this.add(a,[i||"min",o||"max"],function(a){var i=a.params.min,o=a.params.max;i&&o?e(a,r,[i,o]):i?e(a,n,i):o&&e(a,t,o)})},m.addSingleVal=function(a,n,t){return this.add(a,[n||"val"],function(r){e(r,t||a,r.params[n])})},f.addMethod("__dummy__",function(a,e,n){return!0}),f.addMethod("regex",function(a,e,n){var t;return!!this.optional(e)||(t=new RegExp(n).exec(a),t&&0===t.index&&t[0].length===a.length)}),f.addMethod("nonalphamin",function(a,e,n){var t;return n&&(t=a.match(/\W/g),t=t&&t.length>=n),t}),f.methods.extension?(m.addSingleVal("accept","mimtype"),m.addSingleVal("extension","extension")):m.addSingleVal("extension","extension","accept"),m.addSingleVal("regex","pattern"),m.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),m.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),m.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),m.add("equalto",["other"],function(n){var o=r(n.element.name),d=n.params.other,s=i(d,o),l=a(n.form).find(":input").filter("[name='"+t(s)+"']")[0];e(n,"equalTo",l)}),m.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||e(a,"required",!0)}),m.add("remote",["url","type","additionalfields"],function(o){var d={url:o.params.url,type:o.params.type||"GET",data:{}},s=r(o.element.name);a.each(n(o.params.additionalfields||o.element.name),function(e,n){var r=i(n,s);d.data[r]=function(){var e=a(o.form).find(":input").filter("[name='"+t(r)+"']");return e.is(":checkbox")?e.filter(":checked").val()||e.filter(":hidden").val()||"":e.is(":radio")?e.filter(":checked").val()||"":e.val()}}),e(o,"remote",d)}),m.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&e(a,"minlength",a.params.min),a.params.nonalphamin&&e(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&e(a,"regex",a.params.regex)}),m.add("fileextensions",["extensions"],function(a){e(a,"extension",a.params.extensions)}),a(function(){f.unobtrusive.parse(document)}),f.unobtrusive});
--------------------------------------------------------------------------------
/wwwroot/lib/jquery-validation/LICENSE.md:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 | =====================
3 |
4 | Copyright Jörn Zaefferer
5 |
6 | Permission is hereby granted, free of charge, to any person obtaining a copy
7 | of this software and associated documentation files (the "Software"), to deal
8 | in the Software without restriction, including without limitation the rights
9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | copies of the Software, and to permit persons to whom the Software is
11 | furnished to do so, subject to the following conditions:
12 |
13 | The above copyright notice and this permission notice shall be included in
14 | all copies or substantial portions of the Software.
15 |
16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | THE SOFTWARE.
23 |
--------------------------------------------------------------------------------
/wwwroot/lib/jquery/LICENSE.txt:
--------------------------------------------------------------------------------
1 | Copyright JS Foundation and other contributors, https://js.foundation/
2 |
3 | This software consists of voluntary contributions made by many
4 | individuals. For exact contribution history, see the revision history
5 | available at https://github.com/jquery/jquery
6 |
7 | The following license applies to all parts of this software except as
8 | documented below:
9 |
10 | ====
11 |
12 | Permission is hereby granted, free of charge, to any person obtaining
13 | a copy of this software and associated documentation files (the
14 | "Software"), to deal in the Software without restriction, including
15 | without limitation the rights to use, copy, modify, merge, publish,
16 | distribute, sublicense, and/or sell copies of the Software, and to
17 | permit persons to whom the Software is furnished to do so, subject to
18 | the following conditions:
19 |
20 | The above copyright notice and this permission notice shall be
21 | included in all copies or substantial portions of the Software.
22 |
23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 |
31 | ====
32 |
33 | All files located in the node_modules and external directories are
34 | externally maintained libraries used by this software which have their
35 | own licenses; we recommend you read them, as their terms may differ from
36 | the terms above.
37 |
--------------------------------------------------------------------------------
/wwwroot/matrikon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/matrikon.png
--------------------------------------------------------------------------------
/wwwroot/mettlertoledo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/mettlertoledo.png
--------------------------------------------------------------------------------
/wwwroot/microsoft.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/microsoft.png
--------------------------------------------------------------------------------
/wwwroot/opcf.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/opcf.jpg
--------------------------------------------------------------------------------
/wwwroot/phoenix-contact.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/phoenix-contact.png
--------------------------------------------------------------------------------
/wwwroot/pilz.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/pilz.jpg
--------------------------------------------------------------------------------
/wwwroot/prosys.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/prosys.png
--------------------------------------------------------------------------------
/wwwroot/samson.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/samson.png
--------------------------------------------------------------------------------
/wwwroot/schneider.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/schneider.png
--------------------------------------------------------------------------------
/wwwroot/siemens.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/siemens.png
--------------------------------------------------------------------------------
/wwwroot/trumpf.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/trumpf.jpg
--------------------------------------------------------------------------------
/wwwroot/ualogo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/ualogo.png
--------------------------------------------------------------------------------
/wwwroot/vdw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/vdw.png
--------------------------------------------------------------------------------
/wwwroot/wago.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OPCFoundation/UA-CloudDashboard/2301a3a88bd24acc684a723004c471a69fcdae0a/wwwroot/wago.jpg
--------------------------------------------------------------------------------