d70d81ebdf
OneDrive Backup
188 lines
6.9 KiB
Plaintext
188 lines
6.9 KiB
Plaintext
@using hassio_onedrive_backup;
|
|
@using hassio_onedrive_backup.Contracts;
|
|
@using onedrive_backup.Extensions;
|
|
@using onedrive_backup.Hass;
|
|
@using onedrive_backup.Models;
|
|
@inject Orchestrator Orchestrator;
|
|
@inject AddonOptions AddonOptions;
|
|
@inject IJSRuntime JS
|
|
|
|
<div class="card text-white bg-light mb-3 w-100 h-100" style="min-width: 16rem">
|
|
<div class="card-header text-dark">
|
|
<div class="row">
|
|
<div class="col-8">
|
|
@**************Add Badges*****************@
|
|
@if (Backup.Type != null)
|
|
{
|
|
<span class="badge rounded-pill m-1 @BackupTypeColor" data-bs-toggle="tooltip" data-bs-title="Backup is @Backup.Type">@Backup.Type</span>
|
|
}
|
|
@if (Backup.Location == BackupModel.BackupLocation.OneDrive || Backup.Location == BackupModel.BackupLocation.Both)
|
|
{
|
|
<span class="badge rounded-pill m-1 bg-primary" data-bs-toggle="tooltip" data-bs-title="Backup is in OneDrive">OneDrive</span>
|
|
}
|
|
@if (Backup.Location == BackupModel.BackupLocation.Local || Backup.Location == BackupModel.BackupLocation.Both)
|
|
{
|
|
<span class="badge rounded-pill m-1 bg-dark" data-bs-toggle="tooltip" data-bs-title="Backup is in Home Assistant">Local</span>
|
|
}
|
|
@if (Backup.IsProtected)
|
|
{
|
|
<span class="badge rounded-pill m-1 bg-dark" data-bs-toggle="tooltip" data-bs-title="Backup is password protected">Protected</span>
|
|
}
|
|
@***************@
|
|
</div>
|
|
<div class="col text-end">
|
|
<span class="small">@timeAgoText</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="card-body bg-light text-body">
|
|
<h6 class="card-title">@Backup.DisplayName</h6>
|
|
<h7 class="card-subtitle text-muted">@(Backup.Date)</h7>
|
|
@if (Backup.Size > 0)
|
|
{
|
|
<div class="card-text">@Backup.Size MB</div>
|
|
}
|
|
<div class="collapse" id="details-@Backup.Slug">
|
|
@if (Backup.Folders != null && Backup.Folders.Any())
|
|
{
|
|
<div class="card-text">
|
|
<p><strong>Folders:</strong>@string.Join(", ", Backup.Folders)</p>
|
|
</div>
|
|
}
|
|
</div>
|
|
</div>
|
|
<div class="card-footer d-flex">
|
|
|
|
@*Upload Button*@
|
|
@if (@Backup.Location == BackupModel.BackupLocation.Local)
|
|
{
|
|
<button type="button" @onclick="UploadBackup" class="btn btn-sm m-1 btn-outline-primary" data-bs-toggle="tooltip" data-bs-title="Upload backup to OneDrive" disabled="@uploading">
|
|
@if (uploading)
|
|
{
|
|
<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>
|
|
<span class="oi oi-cloud-upload">Uploading @uploadPercent%</span>
|
|
}
|
|
else
|
|
{
|
|
<span class="oi oi-cloud-upload">Upload</span>
|
|
}
|
|
</button>
|
|
}
|
|
|
|
@*Download Button*@
|
|
@if (@Backup.Location == BackupModel.BackupLocation.OneDrive)
|
|
{
|
|
<button type="button" @onclick="DownloadBackup" class="btn btn-sm m-1 btn-outline-primary" data-bs-toggle="tooltip" data-bs-title="Download Backup to Home Assistant" disabled="@downloading">
|
|
@if (downloading)
|
|
{
|
|
<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>
|
|
<span class="oi oi-cloud-download">Downloading @downloadPercent%</span>
|
|
}
|
|
else
|
|
{
|
|
<span class="oi oi-cloud-download">Download</span>
|
|
}
|
|
</button>
|
|
}
|
|
|
|
@*Details Button*@
|
|
<button type="button" class="btn btn-sm m-1 btn-outline-primary" data-bs-toggle="collapse" data-bs-target="#details-@Backup.Slug" disabled="@detailsDisabled"><span class="oi oi-expand-down" title="Backup details">Details</span></button>
|
|
|
|
@if (transferSpeed > 0)
|
|
{
|
|
<span class="text-end ms-auto my-auto text-dark">@TransferSpeedText</span>
|
|
}
|
|
</div>
|
|
</div>
|
|
|
|
|
|
@code {
|
|
private bool uploading = false;
|
|
private bool downloading = false;
|
|
private int uploadPercent = 0;
|
|
private int downloadPercent = 0;
|
|
private int transferSpeed = 0;
|
|
|
|
[Parameter]
|
|
public BackupModel Backup { get; set; }
|
|
|
|
public string BackupTypeColor => Backup.Type.Equals("full", StringComparison.OrdinalIgnoreCase) ? "bg-info" : "bg-secondary";
|
|
|
|
private bool detailsDisabled => (Backup.Addons?.Count() > 0 || Backup.Folders?.Count() > 0) ? false : true;
|
|
|
|
private string timeAgoText => CalculateTimeAgoText();
|
|
|
|
private string TransferSpeedText => ViewHelpers.GetSpeedDisplayText(transferSpeed / 1000);
|
|
|
|
private string CalculateTimeAgoText()
|
|
{
|
|
TimeSpan timeAgo = DateTimeHelper.Instance.Now - Backup.Date;
|
|
if (timeAgo.TotalDays > 1)
|
|
{
|
|
return $"{timeAgo.Days} days ago";
|
|
}
|
|
else if (timeAgo.TotalHours > 1)
|
|
{
|
|
return $"{timeAgo.Hours} hours ago";
|
|
}
|
|
else if (timeAgo.TotalMinutes > 1)
|
|
{
|
|
return $"{timeAgo.Minutes} minutes ago";
|
|
}
|
|
else
|
|
{
|
|
return "Now";
|
|
}
|
|
}
|
|
|
|
protected override async Task OnAfterRenderAsync(bool firstRender)
|
|
{
|
|
if (firstRender)
|
|
{
|
|
await JS.InvokeVoidAsync("addTooltips");
|
|
}
|
|
}
|
|
|
|
private async void UploadBackup()
|
|
{
|
|
uploading = true;
|
|
uploadPercent = 0;
|
|
var backup = Backup.ToBackup();
|
|
await Orchestrator.BackupManager.UploadLocalBackupToOneDrive(backup, updateHassEntityState: false, progressCallback: (prog, speed) =>
|
|
{
|
|
uploadPercent = prog ?? 0;
|
|
transferSpeed = speed ?? 0;
|
|
TriggerStateChanged();
|
|
|
|
});
|
|
uploading = false;
|
|
transferSpeed = 0;
|
|
await Orchestrator.BackupManager.GetOnlineBackupsAsync(AddonOptions.InstanceName);
|
|
}
|
|
|
|
|
|
private async void DownloadBackup()
|
|
{
|
|
downloading = true;
|
|
downloadPercent = 0;
|
|
var onedriveBackup = Backup.ToOneDriveBackup();
|
|
await Orchestrator.BackupManager.DownloadBackupFromOneDrive(onedriveBackup, updateHassEntityState: false, progressCallback: (prog) =>
|
|
{
|
|
downloadPercent = prog ?? 0;
|
|
TriggerStateChanged();
|
|
});
|
|
|
|
downloading = false;
|
|
await Orchestrator.BackupManager.GetLocalBackups();
|
|
}
|
|
|
|
private async void TriggerStateChanged()
|
|
{
|
|
await InvokeAsync(() =>
|
|
{
|
|
StateHasChanged();
|
|
});
|
|
|
|
}
|
|
}
|