Merge branch 'bcrooker-features/show-estimated-time2'
This commit is contained in:
commit
f6169ab27e
6 changed files with 27 additions and 12 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -41,3 +41,4 @@ openapi-ts-error-*.log
|
||||||
tmp/
|
tmp/
|
||||||
qa-output
|
qa-output
|
||||||
|
|
||||||
|
.worktrees/
|
||||||
|
|
|
||||||
|
|
@ -204,8 +204,8 @@ export type GetPublicSsoProvidersResponses = {
|
||||||
*/
|
*/
|
||||||
200: {
|
200: {
|
||||||
providers: Array<{
|
providers: Array<{
|
||||||
organizationSlug: string;
|
|
||||||
providerId: string;
|
providerId: string;
|
||||||
|
organizationSlug: string;
|
||||||
}>;
|
}>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
@ -224,20 +224,20 @@ export type GetSsoSettingsResponses = {
|
||||||
* SSO settings for the active organization
|
* SSO settings for the active organization
|
||||||
*/
|
*/
|
||||||
200: {
|
200: {
|
||||||
invitations: Array<{
|
|
||||||
email: string;
|
|
||||||
expiresAt: string;
|
|
||||||
id: string;
|
|
||||||
role: string;
|
|
||||||
status: string;
|
|
||||||
}>;
|
|
||||||
providers: Array<{
|
providers: Array<{
|
||||||
autoLinkMatchingEmails: boolean;
|
|
||||||
domain: string;
|
|
||||||
issuer: string;
|
|
||||||
organizationId: string | null;
|
|
||||||
providerId: string;
|
providerId: string;
|
||||||
type: string;
|
type: string;
|
||||||
|
issuer: string;
|
||||||
|
domain: string;
|
||||||
|
autoLinkMatchingEmails: boolean;
|
||||||
|
organizationId: string | null;
|
||||||
|
}>;
|
||||||
|
invitations: Array<{
|
||||||
|
id: string;
|
||||||
|
email: string;
|
||||||
|
role: string;
|
||||||
|
status: string;
|
||||||
|
expiresAt: string;
|
||||||
}>;
|
}>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,7 @@ export const BackupProgressCard = ({ scheduleShortId, initialProgress }: Props)
|
||||||
const currentFile = progress?.current_files?.[0] || "";
|
const currentFile = progress?.current_files?.[0] || "";
|
||||||
const fileName = currentFile.split("/").pop() || currentFile;
|
const fileName = currentFile.split("/").pop() || currentFile;
|
||||||
const speed = progress ? formatBytes(progress.bytes_done / progress.seconds_elapsed) : null;
|
const speed = progress ? formatBytes(progress.bytes_done / progress.seconds_elapsed) : null;
|
||||||
|
const eta = progress?.seconds_remaining ? formatDuration(progress.seconds_remaining) : null;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Card className="p-4">
|
<Card className="p-4">
|
||||||
|
|
@ -96,6 +97,10 @@ export const BackupProgressCard = ({ scheduleShortId, initialProgress }: Props)
|
||||||
{progress ? (progress.seconds_elapsed > 0 ? `${speed?.text} ${speed?.unit}/s` : "Calculating...") : "—"}
|
{progress ? (progress.seconds_elapsed > 0 ? `${speed?.text} ${speed?.unit}/s` : "Calculating...") : "—"}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
<div>
|
||||||
|
<p className="text-xs uppercase text-muted-foreground">ETA</p>
|
||||||
|
<p className="font-medium">{progress ? (eta ?? "Calculating...") : "—"}</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="pt-2 border-t border-border">
|
<div className="pt-2 border-t border-border">
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ export const resticBackupOutputSchema = resticBackupRunSummarySchema.extend({
|
||||||
|
|
||||||
export const resticBackupProgressMetricsSchema = z.object({
|
export const resticBackupProgressMetricsSchema = z.object({
|
||||||
seconds_elapsed: z.number(),
|
seconds_elapsed: z.number(),
|
||||||
|
seconds_remaining: z.number().default(0),
|
||||||
percent_done: z.number(),
|
percent_done: z.number(),
|
||||||
total_files: z.number(),
|
total_files: z.number(),
|
||||||
files_done: z.number(),
|
files_done: z.number(),
|
||||||
|
|
|
||||||
|
|
@ -107,6 +107,10 @@ export const backup = async (
|
||||||
if (options.onProgress) {
|
if (options.onProgress) {
|
||||||
try {
|
try {
|
||||||
const jsonData = JSON.parse(data);
|
const jsonData = JSON.parse(data);
|
||||||
|
if (jsonData.message_type !== "status") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const progressResult = resticBackupProgressSchema.safeParse(jsonData);
|
const progressResult = resticBackupProgressSchema.safeParse(jsonData);
|
||||||
if (progressResult.success) {
|
if (progressResult.success) {
|
||||||
options.onProgress(progressResult.data);
|
options.onProgress(progressResult.data);
|
||||||
|
|
|
||||||
|
|
@ -100,6 +100,10 @@ export const restore = async (
|
||||||
if (options.onProgress) {
|
if (options.onProgress) {
|
||||||
try {
|
try {
|
||||||
const jsonData = JSON.parse(data);
|
const jsonData = JSON.parse(data);
|
||||||
|
if (jsonData.message_type !== "status") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const progress = restoreProgressSchema.safeParse(jsonData);
|
const progress = restoreProgressSchema.safeParse(jsonData);
|
||||||
if (progress.success) {
|
if (progress.success) {
|
||||||
options.onProgress(progress.data);
|
options.onProgress(progress.data);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue