a0e18ef963
Document Template import status and Device Enrolment status fixes. Attachment download fixes for SignalR foreverFrame transport. Database queries for Devices, Jobs and Users updated. Device attributes (model, profile, batch) now shown in various places.
323 lines
14 KiB
Plaintext
323 lines
14 KiB
Plaintext
@{
|
|
Authorization.Require(Claims.Config.DocumentTemplate.ShowStatus);
|
|
|
|
ViewBag.Title = Html.ToBreadcrumb("Configuration", MVC.Config.Config.Index(), "Document Templates", MVC.Config.DocumentTemplate.Index(), "Import Status");
|
|
Html.BundleDeferred("~/ClientScripts/Modules/Knockout");
|
|
Html.BundleDeferred("~/ClientScripts/Modules/jQuery-SignalR");
|
|
}
|
|
<h2>Documents Imported Today
|
|
</h2>
|
|
<div id="importStatus">
|
|
<div id="noSessions" data-bind="visible: noSessions">
|
|
<h3>No imported documents today</h3>
|
|
</div>
|
|
<div id="sessions" data-bind="visible: !noSessions(), foreach: { data: sessions, afterRender: sessionRendered }"
|
|
style="display: none">
|
|
<div class="session">
|
|
<div class="clearfix">
|
|
<div class="sessionLeftPane">
|
|
<h3>
|
|
<span data-bind="text: title"></span>
|
|
</h3>
|
|
</div>
|
|
<div class="sessionRightPane">
|
|
<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>
|
|
</div>
|
|
<div class="sessionPages clearfix" data-bind="foreach: { data: sessionPages }">
|
|
<div class="sessionPage" data-bind="style: { backgroundImage: thumbnailUrl }">
|
|
<div class="sessionPageDetails">
|
|
<h3 data-bind="text: title"></h3>
|
|
<div data-bind="visible: undetected">
|
|
Disco QR-Code not found<br />
|
|
<a target="_blank" data-bind="attr: { href: manuallyAssignUrl }, visible: $parent.sessionEnded">Manually Assign Page</a>
|
|
</div>
|
|
<div data-bind="visible: detected">
|
|
Document: <a target="_blank" data-bind="text: documentTemplate, attr: { href: documentTemplateUrl }"></a>
|
|
<br />
|
|
Target: <a target="_blank" data-bind="text: assignedData, attr: { href: assignedDataUrl }"></a>
|
|
</div>
|
|
<div data-bind="visible: !(detected() || undetected())">
|
|
<p class="sessionStatus" data-bind="text: progressStatus">
|
|
</p>
|
|
<div data-bind="progressValue: progressValue" class="sessionProgress">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="sessionInfoMessages">
|
|
<table class="logEventsViewport">
|
|
<thead>
|
|
<tr>
|
|
<th class="icon">
|
|
</th>
|
|
<th class="message">Message
|
|
</th>
|
|
</tr>
|
|
</thead>
|
|
</table>
|
|
<div class="logEventsViewportContainer">
|
|
<div class="logEventsViewportNoLogs" data-bind="visible: messages().length == 0"
|
|
style="display: none">
|
|
No logs
|
|
</div>
|
|
<table class="logEventsViewport" data-bind="visible: messages().length > 0" style="display: none">
|
|
<tbody data-bind="foreach: messages">
|
|
<tr>
|
|
<td class="icon"><i class="fa" data-bind="css: { 'fa-info-circle': EventTypeSeverity == 0, 'fa-exclamation-triangle': EventTypeSeverity == 1, 'fa-exclamation-circle': EventTypeSeverity == 2 }"></i></td>
|
|
<td class="message" data-bind="text: FormattedMessage, attr: { title: EventTypeName }"></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<script type="text/javascript">
|
|
ko.bindingHandlers.progressValue = {
|
|
update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
|
|
var v = ko.utils.unwrapObservable(valueAccessor());
|
|
var vInt = parseInt(v);
|
|
if (vInt >= 0) {
|
|
$element = $(element);
|
|
if (!$element.is('.ui-progressbar'))
|
|
$element.progressbar();
|
|
$(element).progressbar('option', 'value', vInt);
|
|
}
|
|
}
|
|
};
|
|
</script>
|
|
<script type="text/javascript">
|
|
$(function () {
|
|
var vm;
|
|
var host = $('#importStatus');
|
|
var hostSessions = $('#sessions');
|
|
var logHub = null;
|
|
var urlDeviceShow = '@(Url.Action(MVC.Device.Show()))/'
|
|
var urlJobShow = '@(Url.Action(MVC.Job.Show()))/'
|
|
var urlUserShow = '@(Url.Action(MVC.User.Show()))/'
|
|
var urlPageThumbnail = '@(Url.Action(MVC.API.DocumentTemplate.ImporterThumbnail()))/'
|
|
var urlDocumentTemplate = '@(Url.Action(MVC.Config.DocumentTemplate.Index()))/';
|
|
var urlManuallyAssign = '@(Url.Action(MVC.Config.DocumentTemplate.UndetectedPages()))';
|
|
var isLive = false;
|
|
|
|
function pageViewModel() {
|
|
var self = this;
|
|
|
|
self.noSessions = ko.observable(true);
|
|
self.sessions = ko.observableArray();
|
|
self.sessionIndex = {};
|
|
|
|
self.sessionRendered = function (e, d) {
|
|
if (!d.sessionEnded()) {
|
|
d.progressbar = $(e).find('.sessionProgress').progressbar();
|
|
}
|
|
};
|
|
}
|
|
function sessionViewModel(id) {
|
|
var self = this;
|
|
|
|
self.title = ko.observable(id);
|
|
self.messages = ko.observableArray();
|
|
self.progressStatus = ko.observable();
|
|
self.progressValue = ko.observable();
|
|
self.startTime = ko.observable();
|
|
self.sessionEnded = ko.observable(false);
|
|
|
|
self.sessionPages = ko.observableArray();
|
|
self.sessionPagesIndex = {};
|
|
self.addSessionPage = function (sessionPage) {
|
|
self.sessionPages.push(sessionPage);
|
|
self.sessionPagesIndex[sessionPage.pageNumber] = sessionPage;
|
|
}
|
|
}
|
|
function sessionPageViewModel(sessionId, pageNumber) {
|
|
var self = this;
|
|
|
|
self.sessionId = sessionId;
|
|
self.pageNumber = pageNumber;
|
|
self.title = 'Page ' + pageNumber;
|
|
self.progressStatus = ko.observable();
|
|
self.progressValue = ko.observable();
|
|
self.undetected = ko.observable(false);
|
|
self.detected = ko.observable(false);
|
|
self.documentTemplateId = ko.observable();
|
|
self.documentTemplate = ko.observable();
|
|
self.assignedDataType = ko.observable();
|
|
self.assignedDataId = ko.observable();
|
|
self.assignedData = ko.observable();
|
|
self.thumbnailEnabled = ko.observable(0);
|
|
self.updateThumbnail = function () {
|
|
self.thumbnailEnabled(self.thumbnailEnabled() + 1);
|
|
}
|
|
self.documentTemplateUrl = ko.computed(function () {
|
|
return urlDocumentTemplate + self.documentTemplateId();
|
|
});
|
|
self.manuallyAssignUrl = ko.computed(function () {
|
|
return urlManuallyAssign + '#' + self.sessionId + '_' + self.pageNumber;
|
|
});
|
|
self.assignedDataUrl = ko.computed(function () {
|
|
var t = self.assignedDataType();
|
|
var dId = self.assignedDataId();
|
|
if (dId !== undefined) {
|
|
switch (t) {
|
|
case 'Device':
|
|
return urlDeviceShow + dId;
|
|
case 'Job':
|
|
return urlJobShow + dId;
|
|
case 'User':
|
|
if (dId.indexOf('\\') < 0)
|
|
return urlUserShow + dId;
|
|
else
|
|
return urlUserShow + dId.substr(dId.indexOf('\\') + 1) + '?domain=' + dId.substr(0, dId.indexOf('\\'));
|
|
}
|
|
}
|
|
return null;
|
|
});
|
|
self.thumbnailUrl = ko.computed(function () {
|
|
var enabled = self.thumbnailEnabled();
|
|
if (enabled > 0) {
|
|
return 'url(' + urlPageThumbnail + '?SessionId=' + self.sessionId + '&PageNumber=' + self.pageNumber + '&NoCache=' + enabled + ')';
|
|
}
|
|
return null;
|
|
});
|
|
}
|
|
|
|
function parseLog(log) {
|
|
if (log.ModuleId === 40 && log.Arguments && log.Arguments.length > 0) {
|
|
// find session
|
|
var sessionId = log.Arguments[0];
|
|
var session = vm.sessionIndex[sessionId];
|
|
if (!session && log.EventTypeId === 10) { // Starting Session (Ignore 'partial' sessions)
|
|
session = new sessionViewModel(log.Arguments[1]);
|
|
vm.sessionIndex[sessionId] = session;
|
|
vm.sessions.unshift(session);
|
|
vm.noSessions(false);
|
|
}
|
|
if (session) {
|
|
switch (log.EventTypeId) {
|
|
case 10: // SessionStarting
|
|
session.startTime(log.FormattedTimestamp.substring(log.FormattedTimestamp.indexOf(' ') + 1));
|
|
break;
|
|
case 11: // SessionProgress
|
|
session.progressValue(log.Arguments[1]);
|
|
session.progressStatus(log.Arguments[2]);
|
|
break;
|
|
case 12: // SessionFinished
|
|
session.sessionEnded(true);
|
|
session.progressStatus('Import Finished');
|
|
break;
|
|
case 15: // SessionWarning
|
|
session.messages.unshift(log);
|
|
break;
|
|
case 16: // SessionError
|
|
session.messages.unshift(log);
|
|
break;
|
|
case 100: // ImportPageStarting
|
|
session.addSessionPage(new sessionPageViewModel(sessionId, log.Arguments[1]));
|
|
break;
|
|
case 104: // ImportPageImageUpdate
|
|
var p = session.sessionPagesIndex[log.Arguments[1]];
|
|
if (p) {
|
|
p.updateThumbnail();
|
|
}
|
|
break;
|
|
case 105: // ImportPageProgress
|
|
var p = session.sessionPagesIndex[log.Arguments[1]];
|
|
if (p) {
|
|
p.progressValue(log.Arguments[2]);
|
|
p.progressStatus(log.Arguments[3]);
|
|
}
|
|
break;
|
|
case 110: // ImportPageDetected
|
|
var p = session.sessionPagesIndex[log.Arguments[1]];
|
|
if (p) {
|
|
p.documentTemplateId(log.Arguments[2]);
|
|
p.documentTemplate(log.Arguments[3]);
|
|
p.assignedDataType(log.Arguments[4]);
|
|
p.assignedDataId(log.Arguments[5]);
|
|
p.assignedData(log.Arguments[6]);
|
|
p.detected(true);
|
|
if (!isLive) {
|
|
p.updateThumbnail();
|
|
}
|
|
}
|
|
session.messages.unshift(log);
|
|
break;
|
|
case 115: // ImportPageUndetected
|
|
var p = session.sessionPagesIndex[log.Arguments[1]];
|
|
if (p) {
|
|
p.undetected(true);
|
|
if (!isLive) {
|
|
p.updateThumbnail();
|
|
}
|
|
}
|
|
session.messages.unshift(log);
|
|
break;
|
|
case 150: // Ignore: ImportPageUndetectedStored
|
|
break;
|
|
default:
|
|
session.messages.unshift(log);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function init() {
|
|
// Create View Model
|
|
vm = new pageViewModel();
|
|
|
|
// Load Logs
|
|
var d = new Date();
|
|
var loadData = {
|
|
Format: "json",
|
|
Start: d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate(),
|
|
End: null,
|
|
ModuleId: 40,
|
|
Take: 2000
|
|
};
|
|
$.ajax({
|
|
url: '@(Url.Action(MVC.API.Logging.RetrieveEvents()))',
|
|
dataType: 'json',
|
|
type: 'POST',
|
|
traditional: true,
|
|
data: loadData,
|
|
success: init_loadedLogs,
|
|
error: function (jqXHR, textStatus, errorThrown) {
|
|
alert('Unable to retrieve logs: ' + errorThrown);
|
|
}
|
|
});
|
|
}
|
|
function init_loadedLogs(logs) {
|
|
logs.reverse();
|
|
for (var i = 0; i < logs.length; i++) {
|
|
parseLog(logs[i]);
|
|
}
|
|
// Bind
|
|
ko.applyBindings(vm);
|
|
|
|
// Init Persistent Connection
|
|
logHub = $.connection.logNotifications;
|
|
logHub.client.receiveLog = parseLog
|
|
|
|
$.connection.hub.qs = { LogModules: '@(Disco.BI.DocumentTemplateBI.Importer.DocumentImporterLog.Current.LiveLogGroupName)' };
|
|
$.connection.hub.error(function (error) {
|
|
alert('Live-Log Error: ' + error);
|
|
});
|
|
|
|
$.connection.hub.start()
|
|
.done(function () { isLive = true; })
|
|
.fail(function (error) {
|
|
alert('Live-Log Connection Error: ' + error);
|
|
});
|
|
}
|
|
init();
|
|
});
|
|
</script>
|