Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
111 commits
Select commit Hold shift + click to select a range
88d3c38
Installer: remove SC and Monitoring URLs settings
mauroservienti Mar 4, 2019
844d13d
Add View Connection Details when Monitoring connection fails
mauroservienti Mar 5, 2019
3a89584
Add configuration tab for connections
mauroservienti Mar 5, 2019
48d9f40
ServiceControl connection status templates
mauroservienti Mar 7, 2019
3f8b7e3
empty Configuration/Connections tab
mauroservienti Mar 7, 2019
e7d0db6
configuration module knows about connection section
mauroservienti Mar 7, 2019
f52d867
Configuration/Connections tab template
mauroservienti Mar 7, 2019
77d5fc5
bootstrapper always inject licence + boot app
mauroservienti Mar 7, 2019
0eb6d77
Index page: Remove "Connection failed" element
mauroservienti Mar 5, 2019
d3dac6a
Add new views to csproj
mauroservienti Mar 7, 2019
5659841
ServiceControl connection status on all pages
mauroservienti Mar 7, 2019
bd8d1b0
Attempt to make the loading behavior uniform
mauroservienti Mar 12, 2019
9910f9f
note about no monitoring data
mauroservienti Mar 12, 2019
14c3107
Attempt to make connectivity behave similarly to Monitoring
mauroservienti Mar 12, 2019
1a096b7
ConnectionsFactory service
mauroservienti Mar 15, 2019
37d7e5f
support to inject urls into client query string
mauroservienti Mar 19, 2019
360b546
searc for urls in local storage
mauroservienti Mar 19, 2019
789fa96
remove service double registration
mauroservienti Mar 20, 2019
d337c5d
drop support for multiple Monitoring URLs
mauroservienti Mar 20, 2019
811b23b
drop not used scConfig parameter(s)
mauroservienti Mar 20, 2019
80038f1
Add to footer currently connected URLs
mauroservienti Mar 19, 2019
314c521
pluralize class name
mauroservienti Mar 20, 2019
dbb169f
All SC URLs managed by connectionsFactory
mauroservienti Mar 20, 2019
dca527e
wrong query string kvp separator
mauroservienti Mar 20, 2019
285b465
All Monitoring URLs managed by connectionsFactory
mauroservienti Mar 20, 2019
f4ca728
rename connectionsFactory to connectionsManager
mauroservienti Mar 20, 2019
4025ae8
refactor connectionsManager to use query string and not hash
mauroservienti Mar 20, 2019
c1136ef
display current connections details
mauroservienti Mar 20, 2019
7fed679
WIP UI to change connections
mauroservienti Mar 20, 2019
9c05916
URLSearchParams polyfill to support IE11
mauroservienti Mar 21, 2019
f5aa34e
WIP Initial support for connections testing
mauroservienti Mar 21, 2019
3942bf8
Check for bootstrap
WilliamBZA Apr 2, 2019
bb3c3c8
Rename scu to serviceControlUrl
WilliamBZA Apr 3, 2019
3158ef1
Change connectionsManager to class
WilliamBZA Apr 3, 2019
9314062
Remove unused injections
WilliamBZA Apr 3, 2019
b0dfa40
Remove unnecessary wrapping
WilliamBZA Apr 3, 2019
47fef5b
Add ability to test URLs
WilliamBZA Apr 3, 2019
5f7366e
junk file. Weback is creating it somewhere else
mauroservienti Apr 4, 2019
ef9ab5b
moves default config to connections manager
mauroservienti Apr 4, 2019
df218a7
wrong variable
mauroservienti Apr 4, 2019
2c20d36
redirect configuration tabs if not connected
mauroservienti Apr 4, 2019
6402585
no check if monitoring is connected to redirect
mauroservienti Apr 4, 2019
2bffce5
disable config tabs when SC not connected (draft)
mauroservienti Apr 4, 2019
cd9e404
remove h3
sergioc Apr 4, 2019
03bc6e2
Add space before SC.Monitoring URL
sergioc Apr 4, 2019
6001909
Fix style
sergioc Apr 4, 2019
b7e8a9f
Style test buttons
sergioc Apr 4, 2019
59a93ba
Fix run all
WilliamBZA Apr 5, 2019
9acf9de
Remove port
WilliamBZA Apr 5, 2019
296e680
hide not used connection saved
mauroservienti Apr 9, 2019
c9a270a
fix event property name
mauroservienti Apr 9, 2019
38d42c4
manages connections status in a central place
mauroservienti Apr 9, 2019
fa04652
Restore nav in IE < 1440px
sergioc Apr 9, 2019
f64fde2
dedup ConnectionsStatusChanged notifications
mauroservienti Apr 11, 2019
7c35895
simplify cnnection status handling in config tabs
mauroservienti Apr 11, 2019
7194a58
warning triangle on connections tab
mauroservienti Apr 11, 2019
7053cc6
display warning sign for each connection
mauroservienti Apr 11, 2019
c72536d
better handling of failed connections and support for disabled monito…
mauroservienti Apr 11, 2019
b9be726
Add link to connnection screen on fail
WilliamBZA Apr 15, 2019
0836ee3
Remove toast on reconnect
WilliamBZA Apr 15, 2019
8d3b529
Fix js tests
WilliamBZA Apr 15, 2019
b543ae9
mark Monitoring URL as optional
mauroservienti Apr 15, 2019
045a45f
autostart ConnectionsStatus & augment notification
mauroservienti Apr 16, 2019
d31476f
restore notifier notification
mauroservienti Apr 16, 2019
d27d690
Add connection warning on navbar
mauroservienti Apr 16, 2019
faec65b
Fix exclamation span wrapper margins
mauroservienti Apr 16, 2019
c9ee040
simplify directive multiple instance usage
mauroservienti Apr 17, 2019
5fd94bb
not needed console output
mauroservienti Apr 17, 2019
9dc4229
remove invalid selector
sergioc Apr 17, 2019
d5be1cc
remove empty selector
sergioc Apr 17, 2019
403ef1a
turn link into button in connection failed toast
sergioc Apr 17, 2019
cf3c701
Add button link to connection settings in monitoring failed toast
sergioc Apr 17, 2019
d2feb0c
Fix validation error styles
sergioc Apr 17, 2019
15d25e0
fix button styles
sergioc Apr 17, 2019
3a86dbb
tweak disabled secondary btn
sergioc Apr 17, 2019
b52d2c5
Ignoring broken tests
HEskandari Apr 26, 2019
89fd297
fix toolbar btn colors
sergioc Apr 29, 2019
8ad1efe
fix dropdown menu alignment
sergioc Apr 29, 2019
4aa814e
IE11 input fix
sergioc May 2, 2019
a4da5e7
connecting/connected behavior when status changes
mauroservienti May 7, 2019
332c404
isConnecting status added to Monitoring
mauroservienti May 7, 2019
9c61b8f
test a CORS enabled URL
mauroservienti May 7, 2019
4899289
Dedup Monitoring connectivity status reports
mauroservienti May 8, 2019
a84d5cb
make sure user configured url has a scheme
mauroservienti May 9, 2019
3224cbe
Remove whitespace
WilliamBZA May 21, 2019
03bc027
Whitespace cleanup
WilliamBZA May 21, 2019
b1fa362
Tweak whitespace
WilliamBZA May 21, 2019
05ab185
Tweak whitespace
WilliamBZA May 21, 2019
2ebd42d
Tweak whitespace
WilliamBZA May 21, 2019
2308a1e
Tweak whitespace
WilliamBZA May 21, 2019
3e4dcff
Tweak whitespace
WilliamBZA May 21, 2019
d9d8e69
Tweak whitespace
WilliamBZA May 21, 2019
b8048d7
Tweak whitespace
WilliamBZA May 21, 2019
aee915e
Tweak whitespace
WilliamBZA May 21, 2019
5b63882
Tweak whitespace
WilliamBZA May 21, 2019
bd4606b
Tweak whitespace
WilliamBZA May 21, 2019
9c1389b
Allow to set default URLs at install time
mauroservienti May 21, 2019
baa6bcf
Revert "Installer: remove SC and Monitoring URLs settings"
mauroservienti May 21, 2019
9050c6b
move evalConnectionsStatus after all declarations
mauroservienti May 23, 2019
6f7dbf2
move evalConnectionsStatus after all declarations
mauroservienti May 23, 2019
8c439a1
restoring tests till a decision is made on #747
mauroservienti May 23, 2019
88205a4
uhm...
mauroservienti May 24, 2019
4f0f160
Merge pull request #747 from Particular/existing-config-migration
mauroservienti May 24, 2019
58836f9
improve note text on URIs configuration page
mauroservienti May 30, 2019
7ef6c58
Increment minor version
mauroservienti May 31, 2019
790a9d6
simplify note text
mauroservienti May 31, 2019
54d7551
use window.defaultConfig instead of the not anymore available scConfig
mauroservienti Jun 4, 2019
bbf868b
Update approvals with new app.constants.js format
mauroservienti Jun 5, 2019
699a996
because new lines
mauroservienti Jun 5, 2019
060f0e2
fix regex tests to support new version
mauroservienti Jun 5, 2019
d81774a
Solving issues with the tests due to change in the dependencies
WojcikMike Jun 12, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion GitVersion.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
assembly-versioning-scheme: Major
next-version: 1.19
next-version: 1.20
branches:
release:
tag: rc
Original file line number Diff line number Diff line change
@@ -1,14 +1,6 @@
;(function (window, angular, undefined) { 'use strict';

window.config = {
default_route: '/dashboard',
service_control_url: 'http://localhost:33333/api/',
monitoring_urls: ['http://localhost:33633/']
};

angular.module('sc')
.constant('version', '1.2.0')
.constant('showPendingRetry', false)
.constant('scConfig', window.config);

}(window, window.angular));
window.defaultConfig = {
default_route: '/dashboard',
version: '1.2.0',
service_control_url: 'http://localhost:33333/api/',
monitoring_urls: ['http://localhost:33633/']
};
1 change: 1 addition & 0 deletions src/ServicePulse.Host.Tests/ServicePulse.Host.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
<PackageReference Include="NUnit" Version="3.11.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.13.0" />
<PackageReference Include="Particular.Approvals" Version="0.2.0" />
<PackageReference Include="System.ValueTuple" Version="4.5.0" />
</ItemGroup>

<ItemGroup>
Expand Down
75 changes: 54 additions & 21 deletions src/ServicePulse.Host.Tests/VerifyAppConstantsJSTextReplacement.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
using System.Reflection;

namespace ServicePulse.Host.Tests
namespace ServicePulse.Host.Tests
{
using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.IO;

using System.Text.RegularExpressions;
using NUnit.Framework;

[TestFixture]
public class VerifyAppConstantsJSTextReplacement
Expand All @@ -16,14 +13,14 @@ public class VerifyAppConstantsJSTextReplacement
// this both user configurable and updated during installation

Regex sc_url_regex = new Regex(@"(service_control_url\s*\:\s*['""])(.*?)(['""])");
Regex version_regex = new Regex(@"(constant\s*\(\s*'version'\s*,\s*['""])(.*?)(['""])");
Regex version_regex = new Regex(@"(version\s*\:\s*['""])(.*?)(['""])");

[Test]
public void app_constants_js_validation()
{
var pathToConfig = Path.Combine(TestContext.CurrentContext.TestDirectory, "app.constants.js");
Assert.IsTrue(File.Exists(pathToConfig), "app.constants.js does not exist - this will break installation code");

var config = File.ReadAllText(pathToConfig);
var matchUrl = sc_url_regex.Match(config);
Assert.IsTrue(matchUrl.Success, "regex failed to match app.constant.js for SC URI update");
Expand All @@ -37,35 +34,71 @@ public void app_constants_js_validation()
[Test]
public void replace_version_regex_tests()
{
var configSnippets = new Dictionary<string, string>
var configSnippets = new Dictionary<string, (string ConfigSnippet, Regex VersionRegex)>()
{
{"1.3.0", @"angular.module('sc')
.constant('version', '1.3.0')
.constant('scConfig';"},
{"1.3.0-beta1", @"angular.module('sc')
.constant ( 'version' , '1.3.0-beta1')
.constant('scConfig';"},
{"", @"angular.module('sc')
.constant('version' , '' )
.constant('scConfig';"}
{
"1.3.0",
(
ConfigSnippet: @"angular.module('sc')
.constant('version', '1.3.0')
.constant('scConfig';",
VersionRegex: new Regex(@"(constant\s*\(\s*'version'\s*,\s*['""])(.*?)(['""])")
)
},
{
"1.3.0-beta1",
(
ConfigSnippet: @"angular.module('sc')
.constant ( 'version' , '1.3.0-beta1')
.constant('scConfig';",
VersionRegex: new Regex(@"(constant\s*\(\s*'version'\s*,\s*['""])(.*?)(['""])")
)
},
{
"",
(
ConfigSnippet: @"angular.module('sc')
.constant('version' , '' )
.constant('scConfig';",
VersionRegex: new Regex(@"(constant\s*\(\s*'version'\s*,\s*['""])(.*?)(['""])")
)
},
{
"1.20.0",
(
ConfigSnippet: @"window.defaultConfig = {
version: '1.20.0',
service_control_url: '
};",
VersionRegex: new Regex(@"(version\s*\:\s*['""])(.*?)(['""])")
)
},
};

foreach (var config in configSnippets)
{
var expectedResult = config.Key;
var text = config.Value;
var text = config.Value.ConfigSnippet;

var match = version_regex.Match(text);
var match = config.Value.VersionRegex.Match(text);
Assert.IsTrue(match.Success, "regex failed to match version string");
Assert.IsTrue(match.Groups[2].Value.Equals(expectedResult), string.Format("Version regex did not return expected value which was {0}", expectedResult));
}
}

[Test]
public void test_regex_match_against_config_variants ()
public void test_regex_match_against_config_variants()
{
var configVariations = new[]
{
// Standard 1.20.0 config
@"window.defaultConfig = {
default_route: '/dashboard',
version: '1.20.0',
service_control_url: 'http://localhost:33333/api/',
monitoring_urls: ['http://localhost:33633/']
};
",
// Standard 1.3 config
@"angular.module('sc')
.constant('version', '1.3.0')
Expand Down
22 changes: 13 additions & 9 deletions src/ServicePulse.Host.Tests/karma.conf.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,21 @@ module.exports = function(config) {
browsers: ['PhantomJS', 'PhantomJS_custom', 'Chrome'],
basePath: '../ServicePulse.Host/app',
files: [
'./modules/dist/shell.dist.js',
'../../ServicePulse.Host.Tests/tests/js/angular-mocks.js',
'./js/app.js',
'./modules/dist/shell.dist.js',
'../../ServicePulse.Host.Tests/tests/js/angular-mocks.js',
'./js/**/*.html',
'./js/app.constants.js',
'./modules/dist/configuration.dist.js',
'./js/app.js',
'./js/app.bootstrap.js',
'./js/**/*.module.js',
'./js/**/*.tabset.js',
'./js/**/*.js',
'./modules/dist/configuration.dist.js',
'./modules/dist/monitoring.dist.js',
'../../ServicePulse.Host.Tests/tests/**/*.spec.js'],
'./js/directives/**/*.js',
'./js/polyfill/**/*.js',
'./js/services/**/*.js',
'./js/views/**/*.js',
'./modules/dist/monitoring.dist.js',
'../../ServicePulse.Host.Tests/tests/**/*.spec.js'],
frameworks: ['jasmine'],
// you can define custom flags
customLaunchers: {
Expand All @@ -36,12 +40,12 @@ module.exports = function(config) {
},

proxies: {
'/js/views/dashboard/dashboard.html': '/base/js/views/dashboard/dashboard.html'
'/js/views/dashboard/dashboard.html': '/base/js/views/dashboard/dashboard.html'
},

phantomjsLauncher: {
// Have phantomjs exit if a ResourceError is encountered (useful if karma exits without killing phantom)
exitOnResourceError: true
}
}
})
}
4 changes: 1 addition & 3 deletions src/ServicePulse.Host.Tests/package.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
{
"name": "ServicePulse.Host.Tests",
"version": "1.0.0",
"dependencies": {

},
"dependencies": {},
"devDependencies": {
"karma-chrome-launcher": "^2.2.0",
"karma-firefox-launcher": "^1.1.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,22 +22,22 @@

var monitoringService, $httpBackend, scConfig;

beforeEach(inject(function (_monitoringService_, _$httpBackend_, _scConfig_) {
beforeEach(inject(function (_monitoringService_, _$httpBackend_) {
monitoringService = _monitoringService_;
$httpBackend = _$httpBackend_;
scConfig = _scConfig_;
scConfig = window.defaultConfig;
}));

it('should push endpoints retrieved from monitoring server', function (done) {
scConfig.monitoring_urls = ['http://localhost:33633/'];
window.defaultConfig.monitoring_urls = ['http://localhost:33633/'];

$httpBackend.whenGET('http://localhost:33633/monitored-endpoints?history=5').respond(monitoredEndpointWithData);

var monitoredEndpoints = [];
var subscription = monitoringService.createEndpointsSource(5).subscribe(function (response) {
monitoredEndpoints.push(response);

if (monitoredEndpoints.length == 2) {
if (monitoredEndpoints.length === 2) {
expect(monitoredEndpoints[0].name).toEqual("Samples.Metrics.Tracing.Endpoint1");
expect(monitoredEndpoints[0].data.timestamps).toEqual([]);
expect(monitoredEndpoints[0].data.criticalTime).toEqual([]);
Expand All @@ -56,26 +56,4 @@
$httpBackend.flush();
}, 0);
});

it('should push endpoints retrieved from multiple monitoring servers', function (done) {
$httpBackend.whenGET('http://localhost:1234/monitored-endpoints?history=5').respond(monitoredEndpointWithData);
$httpBackend.whenGET('http://localhost:5678/monitored-endpoints?history=5').respond(monitoredEndpointWithData);

scConfig.monitoring_urls = ['http://localhost:1234/', 'http://localhost:5678/'];

var monitoredEndpoints = [];
var subscription = monitoringService.createEndpointsSource(5).subscribe(function (response) {
monitoredEndpoints.push(response);

if (monitoredEndpoints.length == 4) {
expect(monitoredEndpoints.length).toEqual(4);
subscription.dispose();
done();
}
});

setTimeout(function () {
$httpBackend.flush();
}, 0);
});
});
28 changes: 14 additions & 14 deletions src/ServicePulse.Host.Tests/tests/js/services/services.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
describe("Unit: Uri Service ", function() {

it('should load angular', function() {
expect(typeof (angular) == typeof (undefined)).toEqual(false);
expect(typeof (angular) === typeof (undefined)).toEqual(false);
});

describe("Uri Joins:", function() {
Expand All @@ -12,7 +12,7 @@ describe("Unit: Uri Service ", function() {

it('should contain a uri service',
inject(function(uri) {
expect(typeof (uri) == typeof(undefined)).toEqual(false);
expect(typeof (uri) === typeof(undefined)).toEqual(false);
}));

it('should prevent double slashes for leading and trailing slashes', inject(function (uri) {
Expand All @@ -25,39 +25,39 @@ describe("Unit: Uri Service ", function() {
expect(url).toEqual('http://localhost:33333/api/eventlogitems');
}));

it('should make a url for get Failed Messages For Exception Group', inject(function (uri, scConfig) {
it('should make a url for get Failed Messages For Exception Group', inject(function (uri) {
var groupId = '85147b12-458c-431d-a389-35ea53abc9e1';
var page = 1;
var sortBy = 'time_of_failure';
var url = uri.join(scConfig.service_control_url, 'recoverability', 'groups', groupId, 'errors?page=' + page + '&sort=' + sortBy + '&status=unresolved');
var url = uri.join(window.defaultConfig.service_control_url, 'recoverability', 'groups', groupId, 'errors?page=' + page + '&sort=' + sortBy + '&status=unresolved');
expect(url).toEqual('http://localhost:33333/api/recoverability/groups/85147b12-458c-431d-a389-35ea53abc9e1/errors?page=1&sort=time_of_failure&status=unresolved');
}));

it('should make a url for get Failed Messages For Exception Group', inject(function (uri, scConfig) {
it('should make a url for get Failed Messages For Exception Group', inject(function (uri) {
var messageId = '85147b12-458c-431d-a389-35ea53abc9e1';
var url = uri.join(scConfig.service_control_url, 'messages', messageId, 'body');
var url = uri.join(window.defaultConfig.service_control_url, 'messages', messageId, 'body');
expect(url).toEqual('http://localhost:33333/api/messages/85147b12-458c-431d-a389-35ea53abc9e1/body');
}));

it('should make a url for getMessageBody', inject(function (uri, scConfig) {
it('should make a url for getMessageBody', inject(function (uri) {
var messageId = '85147b12-458c-431d-a389-35ea53abc9e1';
var url = uri.join(scConfig.service_control_url, 'messages', messageId, 'body');
var url = uri.join(window.defaultConfig.service_control_url, 'messages', messageId, 'body');
expect(url).toEqual('http://localhost:33333/api/messages/85147b12-458c-431d-a389-35ea53abc9e1/body');
}));

it('should make a url for getMessageHeaders', inject(function (uri, scConfig) {
it('should make a url for getMessageHeaders', inject(function (uri) {
var messageId = '85147b12-458c-431d-a389-35ea53abc9e1';
var url = uri.join(scConfig.service_control_url, 'messages', 'search', messageId);
var url = uri.join(window.defaultConfig.service_control_url, 'messages', 'search', messageId);
expect(url).toEqual('http://localhost:33333/api/messages/search/85147b12-458c-431d-a389-35ea53abc9e1');
}));

it('should make a url for getTotalFailedMessages', inject(function (uri, scConfig) {
var url = uri.join(scConfig.service_control_url, 'errors?status=unresolved');
it('should make a url for getTotalFailedMessages', inject(function (uri) {
var url = uri.join(window.defaultConfig.service_control_url, 'errors?status=unresolved');
expect(url).toEqual('http://localhost:33333/api/errors?status=unresolved');
}));

it('should make a url for retry errors', inject(function (uri, scConfig) {
var url = uri.join(scConfig.service_control_url, 'errors', 'retry');
it('should make a url for retry errors', inject(function (uri) {
var url = uri.join(window.defaultConfig.service_control_url, 'errors', 'retry');
expect(url).toEqual('http://localhost:33333/api/errors/retry');
}));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public static void UpdateVersion(string directoryPath)
{
var appJsPath = Path.Combine(directoryPath, "js/app.constants.js");
var appJsCode = File.ReadAllText(appJsPath);
var updatedContent = Regex.Replace(appJsCode, @"(constant\(\s*'version'\s*,\s*')(.*?)(')", "${1}" + GetFileVersion() + "$3");
var updatedContent = Regex.Replace(appJsCode, @"(version\s*\:\s*['""])(.*?)(['""])", "${1}" + GetFileVersion() + "$3");
File.WriteAllText(appJsPath, updatedContent);
}

Expand All @@ -79,4 +79,4 @@ static string GetFileVersion()
return typeof(AbstractCommand).Assembly.GetName().Version.ToString(4);
}
}
}
}
6 changes: 6 additions & 0 deletions src/ServicePulse.Host/ServicePulse.Host.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,12 @@
<ItemGroup>
<PackageReference Include="GitVersionTask" Version="4.0.0-beta0012" PrivateAssets="All" />
<PackageReference Include="Nancy.Hosting.Self" Version="1.4.1" />
<Content Include="app\modules\configuration\connectionsManager.js" />
<Content Include="app\js\views\sc_not_available.html" />
<Content Include="app\modules\configuration\js\connections\connections.controller.js" />
<Content Include="app\modules\configuration\js\connections\connections.module.js" />
<Content Include="app\modules\configuration\js\connections\connections.route.js" />
<Content Include="app\modules\configuration\views\connections.html" />
</ItemGroup>

<ItemGroup>
Expand Down
Loading