Skip to content

Commit ee2edd7

Browse files
committed
Add frontend routing to the various instance sub views
1 parent 83ef6d3 commit ee2edd7

11 files changed

Lines changed: 272 additions & 160 deletions

src/views/boxes/boxComponents/instance/containerBackups.html

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -113,14 +113,19 @@ <h4>
113113
});
114114
}
115115

116-
$("#containerBox").on("click", "#goToBackups", function() {
117-
if($(this).hasClass("disabled")){
118-
return false;
119-
}
120-
loadContainerBackups();
116+
117+
function loadContainerBackupsReq(req){
118+
currentContainerDetails = {hostId: req.data.hostId, container: req.data.instance, alias: hostsAliasesLookupTable[req.data.hostId]};
119+
createDashboardSidebar()
120+
loadInstanceView(currentContainerDetails, true, false);
121121
$(".instanceViewBox").hide();
122122
$("#containerBackups").show();
123-
});
123+
124+
$("#containerBoxNav").find(".active").removeClass("active");
125+
$("#containerBoxNav .nav-item[data-view='containerBackups'] > .nav-link").addClass("active");
126+
127+
loadContainerBackups();
128+
}
124129

125130
$("#containerBox").on("click", "#createBackup", function(){
126131
backupContainerConfirm(

src/views/boxes/boxComponents/instance/containerDetails.html

Lines changed: 43 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -137,10 +137,6 @@ <h5 class="text-white">
137137
</div>
138138
</div>
139139
<script>
140-
$("#containerBox").on("click", "#goToDetails", function(){
141-
$(".instanceViewBox").hide();
142-
$("#containerDetails").show();
143-
});
144140

145141
function openShell(shell = null, imageOsString = ""){
146142
if(consoleSocket !== undefined && currentTerminalProcessId !== null){
@@ -692,17 +688,32 @@ <h5 class="text-white">
692688
loadInstanceView(currentContainerDetails)
693689

694690
}
691+
692+
function loadContainerDetailsReq(req){
693+
currentContainerDetails = {hostId: req.data.hostId, container: req.data.instance, alias: hostsAliasesLookupTable[req.data.hostId]};
694+
createDashboardSidebar()
695+
696+
$(".instanceViewBox").hide();
697+
$("#containerDetails").show();
698+
699+
$("#containerBoxNav").find(".active").removeClass("active");
700+
$("#containerBoxNav .nav-item[data-view='containerDetails'] > .nav-link").addClass("active");
701+
702+
if(currentTerminalProcessId !== null){
703+
// Terminal session already active — refresh data without touching terminal
704+
loadInstanceView(currentContainerDetails, true, false);
705+
}else{
706+
loadInstanceView(currentContainerDetails);
707+
}
708+
}
695709
function loadInstanceView(data, skipTerminalReset = false, forceNavigation = true)
696710
{
697711
if(forceNavigation){
698712
$(".instanceViewBox").hide();
699713
$("#containerDetails").show();
700-
$("#goToDetails").trigger("click");
701-
}
702-
if(!skipTerminalReset && consoleSocket !== undefined && currentTerminalProcessId !== null){
703-
consoleSocket.onclose = function(){}
704-
consoleSocket.close();
705-
currentTerminalProcessId = null;
714+
715+
$("#containerBoxNav").find(".active").removeClass("active");
716+
$("#containerBoxNav .nav-item[data-view='containerDetails'] > .nav-link").addClass("active");
706717
}
707718
currentContainerDetails = data
708719

@@ -793,36 +804,36 @@ <h5 class="text-white">
793804
}
794805

795806
if(x.mosaicExtensions.audit){
796-
$("#goToEvents").removeClass("disabled")
797-
$("#goToEvents").find(".nav-link").removeClass("disabled").attr("style" , "cursor: pointer;");
807+
$("#goToEvents").removeClass("disabled").attr("style" , "cursor: pointer;");
808+
$("#goToEvents").parents(".nav-item:first").removeClass("disabled");
798809
}else{
799-
$("#goToEvents").addClass("disabled")
800-
$("#goToEvents").find(".nav-link").addClass("disabled").attr("style" , "cursor: not-allowed; color: grey !important");
810+
$("#goToEvents").addClass("disabled").attr("style" , "cursor: not-allowed; color: grey !important");
811+
$("#goToEvents").parents(".nav-item:first").addClass("disabled");
801812
}
802813

803814

804815
if(x.mosaicExtensions.packages){
805-
$("#goToPackages").removeClass("disabled")
806-
$("#goToPackages").find(".nav-link").removeClass("disabled").attr("style" , "cursor: pointer;");
816+
$("#goToPackages").removeClass("disabled").attr("style" , "cursor: pointer;");
817+
$("#goToPackages").parents(".nav-item:first").removeClass("disabled");
807818
}else{
808-
$("#goToPackages").addClass("disabled")
809-
$("#goToPackages").find(".nav-link").addClass("disabled").attr("style" , "cursor: not-allowed; color: grey !important");
819+
$("#goToPackages").addClass("disabled").attr("style" , "cursor: not-allowed; color: grey !important");
820+
$("#goToPackages").parents(".nav-item:first").addClass("disabled");
810821
}
811822
if(x.mosaicExtensions.timers){
812-
$("#goToTimers").removeClass("disabled")
813-
$("#goToTimers").find(".nav-link").removeClass("disabled").attr("style" , "cursor: pointer;");
823+
$("#goToTimers").removeClass("disabled").attr("style" , "cursor: pointer;");
824+
$("#goToTimers").parents(".nav-item:first").removeClass("disabled");
814825
}else{
815-
$("#goToTimers").addClass("disabled")
816-
$("#goToTimers").find(".nav-link").addClass("disabled").attr("style" , "cursor: not-allowed; color: grey !important");
826+
$("#goToTimers").addClass("disabled").attr("style" , "cursor: not-allowed; color: grey !important");
827+
$("#goToTimers").parents(".nav-item:first").addClass("disabled");
817828
}
818829

819830

820831
if(x.details.expanded_config.hasOwnProperty("environment.lxdMosaicPullMetrics") || x.mosaicExtensions.haveMetrics){
821-
$("#goToMetrics").removeClass("disabled")
822-
$("#goToMetrics").find(".nav-link").removeClass("disabled").attr("style" , "cursor: pointer;");
832+
$("#goToMetrics").removeClass("disabled").attr("style" , "cursor: pointer;");
833+
$("#goToMetrics").parents(".nav-item:first").removeClass("disabled");
823834
}else{
824-
$("#goToMetrics").addClass("disabled")
825-
$("#goToMetrics").find(".nav-link").addClass("disabled").attr("style" , "cursor: not-allowed; color: grey !important");
835+
$("#goToMetrics").addClass("disabled").attr("style" , "cursor: not-allowed; color: grey !important");
836+
$("#goToMetrics").parents(".nav-item:first").addClass("disabled");
826837
}
827838

828839
$(".renameContainer").attr("disabled", disableActions);
@@ -831,11 +842,11 @@ <h5 class="text-white">
831842
$("#container-currentState").html(`<i class="` + statusCodeIconMap[x.state.status_code] +`"></i>`);
832843

833844
if(x.mosaicExtensions.backups){
834-
$("#goToBackups").removeClass("disabled")
835-
$("#goToBackups").find(".nav-link").removeClass("disabled").attr("style" , "cursor: pointer;");
845+
$("#goToBackups").removeClass("disabled").attr("style" , "cursor: pointer;");
846+
$("#goToBackups").parents(".nav-item:first").removeClass("disabled");
836847
}else{
837-
$("#goToBackups").addClass("disabled")
838-
$("#goToBackups").find(".nav-link").addClass("disabled").attr("style" , "cursor: not-allowed; color: grey !important");
848+
$("#goToBackups").addClass("disabled").attr("style" , "cursor: not-allowed; color: grey !important");
849+
$("#goToBackups").parents(".nav-item:first").addClass("disabled");
839850
}
840851

841852
//NOTE Read more here https://github.com/lxc/pylxd/issues/242
@@ -1108,4 +1119,6 @@ <h5 class="text-white">
11081119
loadInstanceView(currentContainerDetails);
11091120
});
11101121
});
1122+
1123+
11111124
</script>

src/views/boxes/boxComponents/instance/containerEvents.html

Lines changed: 90 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -28,90 +28,102 @@ <h4>Event Logs</h4>
2828
</div>
2929
</div>
3030
<script>
31-
$("#containerBox").on("click", "#goToEvents", function() {
32-
$(".instanceViewBox").hide();
33-
$("#containerEvents").show();
34-
ajaxRequest('/api/Instances/RecordedActions/GetHostInstanceEventsController/get', currentContainerDetails, (data)=>{
35-
data = makeToastr(data);
36-
let trs = "";
37-
let filterEventOptions = [];
38-
let filterEventUsers = [];
39-
if(data.length > 0){
40-
$.each(data, (_, instanceEvent)=>{
41-
let eName = instanceEvent.controllerName == "" ? instanceEvent.controller : instanceEvent.controllerName;
31+
function _renderContainerEvents(data) {
32+
data = makeToastr(data);
33+
let trs = "";
34+
let filterEventOptions = [];
35+
let filterEventUsers = [];
36+
if(data.length > 0){
37+
$.each(data, (_, instanceEvent)=>{
38+
let eName = instanceEvent.controllerName == "" ? instanceEvent.controller : instanceEvent.controllerName;
4239

43-
let params = "-";
44-
let userParams = instanceEvent.params;
45-
let userKeys = Object.keys(instanceEvent.params);
46-
if(userKeys.length > 0){
47-
params = ""
48-
$.each(userKeys, (_, key)=>{
49-
if(userParams[key] == null){
50-
return true;
51-
}
52-
let t = typeof userParams[key]
53-
if(t !== "array" && t !== "object"){
54-
params += `<div class="mb-1">
55-
${key}: ${userParams[key]}
56-
</div>`
57-
// NOTE 1 level recursion not traversing whole tree's
58-
} else if(t === "object"){
59-
let pKeys = Object.keys(userParams[key]);
60-
params += `<div class="mb-1">
61-
${key}:
40+
let params = "-";
41+
let userParams = instanceEvent.params;
42+
let userKeys = Object.keys(instanceEvent.params);
43+
if(userKeys.length > 0){
44+
params = ""
45+
$.each(userKeys, (_, key)=>{
46+
if(userParams[key] == null){
47+
return true;
48+
}
49+
let t = typeof userParams[key]
50+
if(t !== "array" && t !== "object"){
51+
params += `<div class="mb-1">
52+
${key}: ${userParams[key]}
53+
</div>`
54+
} else if(t === "object"){
55+
let pKeys = Object.keys(userParams[key]);
56+
params += `<div class="mb-1">
57+
${key}:
58+
</div>`
59+
$.each(pKeys, (_, k)=>{
60+
params += `<div class="mb-1 ps-2">
61+
${k}: ${userParams[key][k]}
6262
</div>`
63-
$.each(pKeys, (_, k)=>{
64-
params += `<div class="mb-1 ps-2">
65-
${k}: ${userParams[key][k]}
66-
</div>`
67-
});
68-
}
69-
});
70-
}
63+
});
64+
}
65+
});
66+
}
7167

72-
trs += `<tr data-user-name="${instanceEvent.userName}" data-event-name="${eName}">
73-
<td>${instanceEvent.userName}</td>
74-
<td>${moment.utc(instanceEvent.date).local().format("llll")}</td>
75-
<td>${eName}</td>
76-
<td>${params}</td>
77-
</tr>`
78-
if(!filterEventUsers.includes(instanceEvent.userName)){
79-
filterEventUsers.push(instanceEvent.userName);
80-
}
81-
if(!filterEventOptions.includes(eName)){
82-
filterEventOptions.push(eName);
83-
}
84-
});
85-
}else{
86-
trs = "<tr><td colspan='999' class='text-center'>No Logs</td></tr>"
87-
}
88-
let filters = '<li><h6 class="dropdown-header p-0"><i class="fas fa-filter me-2"></i>Users</h6></li>';
89-
$.each(filterEventUsers, (i, userName)=>{
90-
filters += `<div class="ps-3">
91-
<div class="form-check">
92-
<input type="checkbox" class="form-check-input userFilter" data-user-name="${userName}" id="${i}UserFilter" checked>
93-
<label class="form-check-label" for="${i}UserFilter">
94-
${userName}
95-
</label>
96-
</div>
97-
</div>`
98-
});
99-
filters += '<li><h6 class="dropdown-header p-0"><i class="fas fa-filter me-2"></i>Events</h6></li>';
100-
$.each(filterEventOptions, (i, option)=>{
101-
filters += `<div class="ps-3">
102-
<div class="form-check">
103-
<input type="checkbox" class="form-check-input eventFilter" data-event-name="${option}" id="${i}EventFilter" checked>
104-
<label class="form-check-label" for="${i}EventFilter">
105-
${option}
106-
</label>
107-
</div>
108-
</div>`
68+
trs += `<tr data-user-name="${instanceEvent.userName}" data-event-name="${eName}">
69+
<td>${instanceEvent.userName}</td>
70+
<td>${moment.utc(instanceEvent.date).local().format("llll")}</td>
71+
<td>${eName}</td>
72+
<td>${params}</td>
73+
</tr>`
74+
if(!filterEventUsers.includes(instanceEvent.userName)){
75+
filterEventUsers.push(instanceEvent.userName);
76+
}
77+
if(!filterEventOptions.includes(eName)){
78+
filterEventOptions.push(eName);
79+
}
10980
});
81+
}else{
82+
trs = "<tr><td colspan='999' class='text-center'>No Logs</td></tr>"
83+
}
84+
let filters = '<li><h6 class="dropdown-header p-0"><i class="fas fa-filter me-2"></i>Users</h6></li>';
85+
$.each(filterEventUsers, (i, userName)=>{
86+
filters += `<div class="ps-3">
87+
<div class="form-check">
88+
<input type="checkbox" class="form-check-input userFilter" data-user-name="${userName}" id="${i}UserFilter" checked>
89+
<label class="form-check-label" for="${i}UserFilter">
90+
${userName}
91+
</label>
92+
</div>
93+
</div>`
94+
});
95+
filters += '<li><h6 class="dropdown-header p-0"><i class="fas fa-filter me-2"></i>Events</h6></li>';
96+
$.each(filterEventOptions, (i, option)=>{
97+
filters += `<div class="ps-3">
98+
<div class="form-check">
99+
<input type="checkbox" class="form-check-input eventFilter" data-event-name="${option}" id="${i}EventFilter" checked>
100+
<label class="form-check-label" for="${i}EventFilter">
101+
${option}
102+
</label>
103+
</div>
104+
</div>`
105+
});
106+
107+
$("#filterEventsUl").empty().append(filters);
108+
$("#containerEventsTable > tbody").empty().append(trs);
109+
}
110+
110111

111-
$("#filterEventsUl").empty().append(filters);
112-
$("#containerEventsTable > tbody").empty().append(trs);
112+
function loadContainerEventsReq(req){
113+
currentContainerDetails = {hostId: req.data.hostId, container: req.data.instance, alias: hostsAliasesLookupTable[req.data.hostId]};
114+
createDashboardSidebar()
115+
loadInstanceView(currentContainerDetails, true, false);
116+
117+
$(".instanceViewBox").hide();
118+
$("#containerEvents").show();
119+
120+
$("#containerBoxNav").find(".active").removeClass("active");
121+
$("#containerBoxNav .nav-item[data-view='containerEvents'] > .nav-link").addClass("active");
122+
123+
ajaxRequest('/api/Instances/RecordedActions/GetHostInstanceEventsController/get', currentContainerDetails, (data)=>{
124+
_renderContainerEvents(data);
113125
});
114-
});
126+
}
115127

116128
$("#filterEventsUl").on("click", ".userFilter, .eventFilter", function(){
117129
let users = $("#filterEventsUl").find(".userFilter").map(function(){

src/views/boxes/boxComponents/instance/containerFiles.html

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,15 @@ <h4>${item.name}</h4>
143143
});
144144
}
145145

146-
$("#containerBox").on("click", "#goToFiles", function(){
146+
$(document).on("click", ".filesystemObject", function(){
147+
loadFileSystemPath($(this).data("path"));
148+
});
149+
150+
function loadContainerFilesReq(req){
151+
currentContainerDetails = {hostId: req.data.hostId, container: req.data.instance, alias: hostsAliasesLookupTable[req.data.hostId]};
152+
createDashboardSidebar()
153+
loadInstanceView(currentContainerDetails, true, false);
154+
147155
$.confirm({
148156
title: 'DONT USE ON METERED CONNECTIONS!',
149157
content: `<i class="fas fa-info-circle text-danger me-2"></i>Do not use this over a metered internet connection.
@@ -155,24 +163,24 @@ <h4>${item.name}</h4>
155163
type: 'red',
156164
buttons: {
157165
back: function(){
158-
$("#goToDetails").trigger("click");
166+
router.navigate(`/instance/${currentContainerDetails.alias}/${currentContainerDetails.container}/details`);
159167
},
160168
goLarge: {
161169
text: "View Files",
162170
btnClass: "btn-primary",
163171
action: function(){
164172
$(".instanceViewBox").hide();
165173
$("#containerFiles").show();
174+
175+
$("#containerBoxNav").find(".active").removeClass("active");
176+
$("#containerBoxNav .nav-item[data-view='containerFiles'] > .nav-link").addClass("active");
177+
166178
loadFileSystemPath("/");
167179
}
168180
}
169181
}
170182
});
171-
});
172-
173-
$(document).on("click", ".filesystemObject", function(){
174-
loadFileSystemPath($(this).data("path"));
175-
});
183+
}
176184

177185
$(document).on("click", ".goUpDirectory", function(){
178186
let parts = currentPath.split("/").filter(word => word.length > 0);

0 commit comments

Comments
 (0)