|
20 | 20 |
|
21 | 21 | <!-- Brand -->
|
22 | 22 | <div class="fs-3 text-light navbar-brand">
|
23 |
| - <a class="navbar-brand" href="#" onclick="refreshPage()">Device Monitoring</a> |
| 23 | + <img src="~/img/favicon.png" alt="sparse-logo" width="65px" height="75px"> |
| 24 | + <a class="navbar-brand custom-navbar-brand" href="#" onclick="refreshPage()">Device Monitoring</a> |
24 | 25 | </div>
|
25 | 26 |
|
26 | 27 | <!-- Device Status Navbar -->
|
27 | 28 | <div class="d-flex flex-row text-light justify-content-end align-items-center flex-wrap">
|
28 | 29 | <div class="fs-5 me-4 mb-2">
|
29 |
| - <span class="text-success fw-bold">Online: </span> |
| 30 | + <span class="text-success fw-bold">Available: </span> |
30 | 31 | <span class="badge bg-success">@Model.Devices.Count(d => d.DeviceActiveStatus == Models.DeviceActiveStatus.ONLINE)</span>
|
31 | 32 | </div>
|
32 | 33 |
|
33 | 34 | <div class="fs-5 me-4 mb-2">
|
34 |
| - <span class="text-danger fw-bold">Offline: </span> |
| 35 | + <span class="text-danger fw-bold">Unavailable: </span> |
35 | 36 | <span class="badge bg-danger">@Model.Devices.Count(d => d.DeviceActiveStatus == Models.DeviceActiveStatus.OFFLINE)</span>
|
36 | 37 | </div>
|
37 | 38 |
|
38 | 39 | <div class="fs-5 me-4 mb-2">
|
39 |
| - <span class="text-warning fw-bold">Unknown: </span> |
| 40 | + <span class="text-warning fw-bold">In Progress: </span> |
40 | 41 | <span class="badge bg-warning">@Model.Devices.Count(d => d.DeviceActiveStatus == Models.DeviceActiveStatus.UNKNOWN)</span>
|
41 | 42 | </div>
|
42 | 43 |
|
|
49 | 50 | </nav>
|
50 | 51 | </div>
|
51 | 52 |
|
52 |
| -<div id="streamNotif">Stream is copied.</div> |
| 53 | +<div id="streamNotif">Copied</div> |
53 | 54 |
|
54 | 55 | <div data-simplebar>
|
55 | 56 | <div class="d-flex flex-row justify-content-between p-2 ms-2 me-2">
|
|
62 | 63 | onkeyup="filterPageTagify" />
|
63 | 64 | <button class="btn btn-outline-warning bg-gray p-2" onclick="checkVisibleFilteredDevices()">
|
64 | 65 | <i class="fa-regular fa-square-check fa-lg"></i>
|
65 |
| - Check Visible Devices |
| 66 | + Select All |
66 | 67 | </button>
|
67 | 68 | <button class="btn btn-outline-warning bg-gray p-2" onclick="resetCameras()">
|
68 | 69 | <i class="fa-regular fa-square-minus fa-lg"></i>
|
69 |
| - Uncheck Visible Devices |
| 70 | + Unselect All |
70 | 71 | </button>
|
71 | 72 | </div>
|
72 | 73 | <div>
|
|
282 | 283 | @* Getting Model.Devices *@
|
283 | 284 | @foreach (var dev in @Model.Devices.OrderBy(d => d.DeviceActiveStatus))
|
284 | 285 | {
|
285 |
| - @* Creating Container as a row double cam *@ |
| 286 | + @* Creating Container as a row cam *@ |
286 | 287 | <div class="col-sm-12 col-md-9 col-lg-6 col-xl-4 p-1" data-card="container">
|
287 | 288 |
|
288 | 289 | @* Creating a CameraCard*@
|
289 | 290 | <div class="card d-flex flex-row justify-content-between" data-card="cameraContainer">
|
290 | 291 | <div class="card-body">
|
291 | 292 | <div>
|
292 | 293 | @* Thumbnail *@
|
293 |
| - <div class="d-flex flex- justify-content-between"> |
| 294 | + <div class="d-flex justify-content-between"> |
294 | 295 | @{
|
295 | 296 | var imagePathRelative = $"./thumbnails/{dev.UUID}/stream_0__1.jpeg";
|
296 | 297 | }
|
|
300 | 301 | style='width:270px !important; height:152px !important;'>
|
301 | 302 |
|
302 | 303 | @* Creating Camera Image in a Column*@
|
303 |
| - <div class="d-flex flex-column justify-content-between align-items-end"> |
| 304 | + <div class="d-flex flex-column "> |
304 | 305 | <div class="form-check align-self-end">
|
305 | 306 | <input type="checkbox" class="btn-check" id="checkbox_@dev.UUID">
|
306 | 307 | <label class="form-check-label font-weight-bold text-dark btn btn-outline-warning" for="checkbox_@dev.UUID">
|
|
412 | 413 | <div class="col-lg-4 fw-semibold text-muted">Date Time Type</div>
|
413 | 414 | <div class="col-lg-8" dataFilter>@dev.DateTimeType</div>
|
414 | 415 | </div>
|
415 |
| - } |
416 | 416 |
|
417 |
| - @*DaylightSavings*@ |
418 |
| - <div class="row"> |
419 |
| - <div class="col-lg-4 fw-semibold text-muted">Daylight Savings</div> |
420 |
| - <div class="col-lg-8" dataFilter>@dev.DaylightSavings</div> |
421 |
| - </div> |
| 417 | + @if (dev.DateTimeType == "NTP") |
| 418 | + { |
| 419 | + @*DaylightSavings*@ |
| 420 | + <div class="row"> |
| 421 | + <div class="col-lg-4 fw-semibold text-muted">Daylight Savings</div> |
| 422 | + <div class="col-lg-8" dataFilter>@dev.DaylightSavings</div> |
| 423 | + </div> |
422 | 424 |
|
423 |
| - @*TimeZone*@ |
424 |
| - @if (!string.IsNullOrEmpty(dev.TimeZone)) |
425 |
| - { |
426 |
| - <div class="row"> |
427 |
| - <div class="col-lg-4 fw-semibold text-muted">Time Zone</div> |
428 |
| - <div class="col-lg-8" dataFilter>@dev.TimeZone</div> |
429 |
| - </div> |
430 |
| - } |
| 425 | + @*TimeZone*@ |
| 426 | + @if (!string.IsNullOrEmpty(dev.TimeZone)) |
| 427 | + { |
| 428 | + <div class="row"> |
| 429 | + <div class="col-lg-4 fw-semibold text-muted">Time Zone</div> |
| 430 | + <div class="col-lg-8" dataFilter>@dev.TimeZone</div> |
| 431 | + </div> |
| 432 | + } |
431 | 433 |
|
432 |
| - @*UTCDateTime*@ |
433 |
| - @if (dev.UTCDateTime > 0) |
434 |
| - { |
435 |
| - <div class="row"> |
436 |
| - <div class="col-lg-4 fw-semibold text-muted">UTC Date Time</div> |
437 |
| - <div class="col-lg-8" dataFilter>@DateTimeOffset.FromUnixTimeMilliseconds(dev.UTCDateTime)</div> |
438 |
| - </div> |
439 |
| - } |
| 434 | + @*UTCDateTime*@ |
| 435 | + @if (dev.UTCDateTime > 0) |
| 436 | + { |
| 437 | + <div class="row"> |
| 438 | + <div class="col-lg-4 fw-semibold text-muted">UTC Date Time</div> |
| 439 | + <div class="col-lg-8" dataFilter>@DateTimeOffset.FromUnixTimeMilliseconds(dev.UTCDateTime)</div> |
| 440 | + </div> |
| 441 | + } |
440 | 442 |
|
441 |
| - @*LocalDateTime*@ |
442 |
| - @if (dev.LocalDateTime > 0) |
443 |
| - { |
444 |
| - <div class="row"> |
445 |
| - <div class="col-lg-4 fw-semibold text-muted">LocalDateTime</div> |
446 |
| - <div class="col-lg-8" dataFilter>@DateTimeOffset.FromUnixTimeMilliseconds(dev.LocalDateTime)</div> |
447 |
| - </div> |
| 443 | + @*LocalDateTime*@ |
| 444 | + @if (dev.LocalDateTime > 0) |
| 445 | + { |
| 446 | + <div class="row"> |
| 447 | + <div class="col-lg-4 fw-semibold text-muted">LocalDateTime</div> |
| 448 | + <div class="col-lg-8" dataFilter>@DateTimeOffset.FromUnixTimeMilliseconds(dev.LocalDateTime)</div> |
| 449 | + </div> |
| 450 | + } |
| 451 | + } |
448 | 452 | }
|
449 | 453 |
|
450 | 454 | @*Notes*@
|
|
482 | 486 | @*DeviceStreams*@
|
483 | 487 | @if (dev.Streams.Count > 0)
|
484 | 488 | {
|
485 |
| - <hr class="m-0" /> |
| 489 | + <hr class="m-0 mb-1 mt-1" /> |
486 | 490 | <div class="container">
|
487 | 491 | @for (int i = 0; i < dev.Streams.Count; i++)
|
488 | 492 | {
|
489 | 493 | <div class="row">
|
490 | 494 | <div class="row">
|
491 |
| - <div class="col-lg-2 fw-bold text-muted">Stream@(i)</div> |
492 |
| - <div class="col-lg-10">@(dev.Streams[i]?.Name ?? "")</div> |
| 495 | + <div class="col-lg-4 fw-bold text-muted">Stream@(i)</div> |
| 496 | + <div class="col-lg-8 fw-bold text-muted text-decoration-underline">@(dev.Streams[i]?.Name ?? "")</div> |
493 | 497 | </div>
|
494 | 498 | <div class="row">
|
495 |
| - <div class="col-lg-2">CodecType</div> |
496 |
| - <div class="col-lg-10">@(dev.Streams[i]?.CodecType ?? "")</div> |
| 499 | + <div class="col-lg-4">CodecType</div> |
| 500 | + <div class="col-lg-8">@(dev.Streams[i]?.CodecType ?? "")</div> |
497 | 501 | </div>
|
498 | 502 | <div class="row">
|
499 |
| - <div class="col-lg-2">Resolution</div> |
500 |
| - <div class="col-lg-10">[@(dev.Streams[i]?.Resolution.Width ?? 0) x @(dev.Streams[i]?.Resolution.Height ?? 0)]</div> |
| 503 | + <div class="col-lg-4">Resolution</div> |
| 504 | + <div class="col-lg-8">[@(dev.Streams[i]?.Resolution.Width ?? 0) x @(dev.Streams[i]?.Resolution.Height ?? 0)]</div> |
501 | 505 | </div>
|
502 | 506 | <div class="row">
|
503 |
| - <div class="col-lg-2">URI</div> |
| 507 | + <div class="col-lg-4">URI</div> |
504 | 508 | @try
|
505 | 509 | {
|
506 | 510 | @switch (dev.Streams[i].Status)
|
507 | 511 | {
|
508 | 512 | case Models.StreamStatus.OK:
|
509 |
| - <div class="col-lg-10"> |
| 513 | + <div class="col-lg-8"> |
510 | 514 | <a class="btn btn-sm badge bg-success" onclick="myFunction()" data-stream="@dev.Streams[i].URI" style="white-space: unset !important;"
|
511 | 515 | data-toggle="tooltip" title="<img src='./thumbnails/@(dev.UUID)/stream_@(i)__1.jpeg' class='img-thumbnail' style='width:100% !important; height:auto !important;'>">
|
512 | 516 | @dev.Streams[i].URI
|
513 | 517 | </a>
|
514 | 518 | </div>
|
515 | 519 | break;
|
516 | 520 | case Models.StreamStatus.ERROR:
|
517 |
| - <div class="col-lg-10"> |
| 521 | + <div class="col-lg-8"> |
518 | 522 | <a class="btn btn-sm badge bg-danger" onclick="myFunction()" data-stream="@dev.Streams[i].URI" style="white-space: unset !important;">
|
519 | 523 | @dev.Streams[i].URI
|
520 | 524 | </a>
|
521 | 525 | </div>
|
522 | 526 | break;
|
523 | 527 | default:
|
524 |
| - <div class="col-lg-10"> |
| 528 | + <div class="col-lg-8"> |
525 | 529 | <a class="btn btn-sm badge bg-warning" onclick="myFunction()" data-stream="@dev.Streams[i].URI" style="white-space: unset !important;">
|
526 | 530 | @dev.Streams[i].URI
|
527 | 531 | </a>
|
|
0 commit comments