feature: pending device enrollment approval

This commit is contained in:
Gary Sharp
2024-01-21 14:06:11 +11:00
parent 6af83cbdb2
commit 37e2e5a08c
33 changed files with 1379 additions and 344 deletions
@@ -1,27 +1,47 @@
@{
Authorization.Require(Claims.Config.Enrolment.ShowStatus);
ViewBag.Title = Html.ToBreadcrumb("Configuration", MVC.Config.Config.Index(), "Enrolment", MVC.Config.Enrolment.Index(), "Status");
ViewBag.Title = Html.ToBreadcrumb("Configuration", MVC.Config.Config.Index(), "Enrollment", MVC.Config.Enrolment.Index(), "Status");
Html.BundleDeferred("~/ClientScripts/Modules/Knockout");
Html.BundleDeferred("~/ClientScripts/Modules/jQuery-SignalR");
Html.BundleDeferred("~/ClientScripts/Modules/jQuery-Isotope");
}
<div id="enrolStatus">
<div id="noSessions" data-bind="visible: noSessions">
<h2>No enrolment sessions today</h2>
<h2>No enrollment sessions today</h2>
</div>
<div id="sessions" data-bind="visible: !noSessions(), foreach: { data: sessions, afterRender: sessionRendered, afterAdd: sessionAdded }" style="display: none">
<div class="session" data-bind="style: { backgroundImage: deviceModelImageUrl }, click: select">
<h3>
<span data-bind="text: title"></span>
<span class="details" data-bind="text: '(' + deviceModelDescription() + ')'"></span>
<i class="fa fa-exclamation-circle" data-bind="visible: isPending"></i>
</h3>
<p class="sessionStart" data-bind="text: startTime"></p>
<p class="sessionStatus" data-bind="text: progressStatus"></p>
<div data-bind="visible: !sessionEnded(), progressValue: progressValue" class="sessionProgress"></div>
<div data-bind="visible: !sessionEnded() && progressValue >= 0, progressValue: progressValue" class="sessionProgress"></div>
</div>
</div>
<div id="dialogSession" data-bind="with: currentSession">
<div class="sessionProgress clearfix">
<p class="sessionStart" data-bind="text: startTime"></p>
<p class="sessionStatus" data-bind="text: progressStatus"></p>
<div data-bind="visible: !sessionEnded() && progressValue >= 0, progressValue: progressValue"></div>
<div id="formResolveSessionPending" data-bind="visible: isPending">
@using (Html.BeginForm(MVC.API.Enrollment.ResolveSessionPending(), FormMethod.Post))
{
@Html.AntiForgeryToken();
<input type="hidden" name="sessionId" data-bind="value: id" />
<div class="reason">
<input type="text" name="reason" placeholder="Reason (optional)" />
</div>
<div class="buttons">
<button type="button" value="True" class="button">Approve</button>
<button type="button" value="False" class="button">Reject</button>
</div>
}
</div>
</div>
<div class="sessionHeader clearfix" data-bind="style: { backgroundImage: deviceModelImageUrl }">
<h2><a href="" target="_blank" data-bind="text: title, attr: { href: deviceUrl }"></a></h2>
<h3 data-bind="text: deviceModelDescription"></h3>
@@ -48,11 +68,6 @@
</tr>
</table>
</div>
<div class="sessionProgress clearfix">
<p class="sessionStart" data-bind="text: startTime"></p>
<p class="sessionStatus" data-bind="text: progressStatus"></p>
<div data-bind="visible: !sessionEnded(), progressValue: progressValue"></div>
</div>
<div class="sessionInfoContainer clearfix">
<div class="sessionInfoMessages">
<table class="logEventsViewport">
@@ -134,7 +149,9 @@
function sessionViewModel(id) {
var self = this;
self.id = id;
self.title = ko.observable(id);
self.isPending = ko.observable(false);
self.messages = ko.observableArray();
self.console = ko.observableArray();
self.serialNumber = ko.observable();
@@ -187,7 +204,7 @@
self.select = function (e, d) {
vm.currentSession(self);
hostDialogSessions.dialog('open');
hostDialogSessions.dialog('option', 'title', 'Device Enrolment: ' + self.title());
hostDialogSessions.dialog('option', 'title', 'Device Enrollment: ' + self.title());
}
}
@@ -228,15 +245,38 @@
if (log.Arguments.length >= 10 && log.Arguments[9])
session.deviceModelId(log.Arguments[9]);
break;
case 14: // SessionPending
session.isPending(true);
session.messages.unshift(log);
session.progressValue(-1);
session.progressStatus('Pending enrollment approval');
break;
case 15: // SessionPendingApproved
session.isPending(false);
session.messages.unshift(log);
session.progressValue(-1);
session.progressStatus('Enrollment approval, waiting for client');
break;
case 16: // SessionPendingRejected
session.isPending(false);
session.messages.unshift(log);
session.progressValue(-1);
session.progressStatus('Enrollment rejected, waiting for client');
break;
case 17: // SessionContinuing
session.isPending(false);
session.messages.unshift(log);
break;
case 20: // SessionFinished
session.sessionEnded(true);
session.isPending(false);
if (session.hasError())
session.progressStatus('Enrolment Finished with an Error');
session.progressStatus('Enrollment Finished with an Error');
else
if (session.hasWarning())
session.progressStatus('Enrolment Finished with a Warning');
session.progressStatus('Enrollment Finished with a Warning');
else
session.progressStatus('Enrolment Finished Successfully');
session.progressStatus('Enrollment Finished Successfully');
session.messages.unshift(log);
break;
case 21: // SessionDiagnosticInformation
@@ -357,6 +397,20 @@
}
}
}
$('#dialogSession').on('click', '#formResolveSessionPending button', function (e) {
const $button = $(this);
const $form = $button.closest('form');
const body = new FormData($form[0]);
body.append('approve', $button.val());
fetch($form.attr('action'), {
method: 'POST',
body: body
}).then(function (response) {
if (!response.ok) {
alert('Failed to resolve pending session: ' + response.statusText);
}
});
});
init();
});
</script>