lms/bootstrap/ssr/assets/application-update-5R1lRVH7.js
2025-12-15 12:26:23 +01:00

290 lines
14 KiB
JavaScript

import { jsxs, Fragment, jsx } from "react/jsx-runtime";
import { C as ChunkedUploaderInput } from "./chunked-uploader-input-CZfv7yqS.js";
import { I as InputError } from "./input-error-D1JIzedA.js";
import { L as LoadingButton } from "./loading-button-CCIxhJrY.js";
import { B as Button } from "./button-CdJZJLGw.js";
import { C as Card, a as CardHeader, b as CardContent } from "./card-B-gBwpxd.js";
import { D as Dialog, a as DialogTrigger, b as DialogContent, d as DialogTitle, g as DialogDescription, e as DialogFooter, f as DialogClose, c as DialogHeader } from "./dialog-DGP_3dPQ.js";
import { L as Label } from "./label-0rIIfpX0.js";
import { S as ScrollArea } from "./scroll-area-CDdrLubh.js";
import { useForm, router } from "@inertiajs/react";
import { Upload, AlertTriangle, RefreshCw, CheckCircle } from "lucide-react";
import { useState, useEffect } from "react";
import "./input-BsvJqbcd.js";
import "./utils-DLCPGU0v.js";
import "clsx";
import "tailwind-merge";
import "axios";
import "sonner";
import "@radix-ui/react-slot";
import "class-variance-authority";
import "@radix-ui/react-dialog";
import "@radix-ui/react-label";
import "@radix-ui/react-scroll-area";
const ApplicationUpdate = ({ version }) => {
const [open, setOpen] = useState(false);
const [seeding, setSeeding] = useState(false);
const [isSubmit, setIsSubmit] = useState(false);
const [isFileSelected, setIsFileSelected] = useState(false);
const [selectedFileName, setSelectedFileName] = useState("");
const { data, setData, post, errors, processing, reset } = useForm({
update_file_url: ""
});
const refreshForm = useForm({});
const handleRefreshServer = () => {
refreshForm.post(route("system.refresh"));
};
const handleSubmit = async (e) => {
e.preventDefault();
if (isFileSelected) {
setIsSubmit(true);
return;
}
};
const onResetHandler = () => {
setIsSubmit(false);
setIsFileSelected(false);
setSelectedFileName("");
reset("update_file_url");
};
useEffect(() => {
if (data.update_file_url && isSubmit) {
post(route("system.update"), {
onSuccess: () => {
setOpen(false);
onResetHandler();
},
onError: () => {
onResetHandler();
}
});
}
}, [data.update_file_url]);
const handleOpenChange = (open2) => {
if (isSubmit) {
setOpen(true);
} else {
setOpen(open2);
if (!open2) {
onResetHandler();
}
}
};
const seedHandler = () => {
setSeeding(true);
router.get(route("system.update.seeder"), {}, { onFinish: () => setSeeding(false) });
};
return /* @__PURE__ */ jsxs(Fragment, { children: [
/* @__PURE__ */ jsxs(Card, { className: "border-2", children: [
/* @__PURE__ */ jsxs(CardHeader, { className: "p-4 sm:p-6", children: [
/* @__PURE__ */ jsxs("h2", { className: "flex items-center gap-2 text-xl font-semibold", children: [
/* @__PURE__ */ jsx(Upload, { className: "text-warning h-5 w-5" }),
"Application Update"
] }),
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground mt-1 text-sm", children: "Upload and install the latest version of your application" })
] }),
/* @__PURE__ */ jsxs(CardContent, { className: "space-y-6 p-4 pt-0 sm:p-6 sm:pt-0", children: [
/* @__PURE__ */ jsx("div", { className: "dark:bg-secondary dark:border-border rounded-lg border border-amber-200 bg-amber-50 p-4", children: /* @__PURE__ */ jsxs("div", { className: "flex items-start", children: [
/* @__PURE__ */ jsx("div", { className: "flex-shrink-0", children: /* @__PURE__ */ jsx(AlertTriangle, { className: "h-5 w-5 text-amber-600" }) }),
/* @__PURE__ */ jsxs("div", { className: "ml-3", children: [
/* @__PURE__ */ jsx("h3", { className: "text-sm font-medium text-amber-800", children: "Important Update Guidelines" }),
/* @__PURE__ */ jsx("div", { className: "mt-2 text-sm text-amber-700", children: /* @__PURE__ */ jsxs("ul", { className: "list-inside list-disc space-y-1", children: [
/* @__PURE__ */ jsxs("li", { children: [
/* @__PURE__ */ jsx("strong", { children: "Refresh Server:" }),
" Every time refresh server before updating"
] }),
/* @__PURE__ */ jsxs("li", { children: [
/* @__PURE__ */ jsx("strong", { children: "Backup First:" }),
" Always create a backup before updating"
] }),
/* @__PURE__ */ jsxs("li", { children: [
/* @__PURE__ */ jsx("strong", { children: "File Format:" }),
" Upload must be a valid ZIP file"
] }),
/* @__PURE__ */ jsxs("li", { children: [
/* @__PURE__ */ jsx("strong", { children: "Maintenance Mode:" }),
" Site will be temporarily unavailable during update"
] }),
/* @__PURE__ */ jsxs("li", { children: [
/* @__PURE__ */ jsx("strong", { children: "Migrations:" }),
" Database migrations will be automatically applied"
] }),
/* @__PURE__ */ jsxs("li", { children: [
/* @__PURE__ */ jsx("strong", { children: "Downtime:" }),
" Update process may take several minutes"
] }),
/* @__PURE__ */ jsxs("li", { children: [
/* @__PURE__ */ jsx("strong", { children: "Browser:" }),
" Do not refresh or close browser during update"
] }),
/* @__PURE__ */ jsxs("li", { children: [
/* @__PURE__ */ jsx("strong", { children: "Seeder:" }),
" Run seeder only after updating the application version"
] })
] }) })
] })
] }) }),
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 sm:flex-row", children: [
/* @__PURE__ */ jsx(
LoadingButton,
{
type: "button",
variant: "secondary",
onClick: handleRefreshServer,
loading: refreshForm.processing,
disabled: processing || isSubmit,
children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
/* @__PURE__ */ jsx(RefreshCw, { className: "h-4 w-4" }),
/* @__PURE__ */ jsx("span", { children: "Refresh Server" })
] })
}
),
/* @__PURE__ */ jsxs(Button, { type: "button", onClick: () => setOpen(true), children: [
/* @__PURE__ */ jsx(Upload, { className: "h-4 w-4" }),
/* @__PURE__ */ jsx("span", { children: isSubmit ? "Uploading..." : processing ? "Updating Application..." : "Update Application" })
] }),
/* @__PURE__ */ jsxs(Dialog, { children: [
/* @__PURE__ */ jsx(DialogTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { variant: "ghost", className: "bg-destructive/8 hover:bg-destructive/6 text-destructive hover:text-destructive", children: [
"Run ",
version,
" Version Seeder"
] }) }),
/* @__PURE__ */ jsxs(DialogContent, { children: [
/* @__PURE__ */ jsxs(DialogTitle, { children: [
"Run Version ",
version,
" Seeder"
] }),
/* @__PURE__ */ jsxs(DialogDescription, { className: "space-y-2", children: [
/* @__PURE__ */ jsxs("p", { children: [
"This will run the database seeder for version ",
version,
"."
] }),
/* @__PURE__ */ jsxs("div", { className: "rounded-md bg-yellow-50 p-3 text-sm text-yellow-700", children: [
/* @__PURE__ */ jsx("p", { className: "font-medium", children: "Important Notes:" }),
/* @__PURE__ */ jsxs("ul", { className: "mt-1 list-inside list-disc space-y-1", children: [
/* @__PURE__ */ jsxs("li", { children: [
"Run this seeder only once after updating to version ",
version
] }),
/* @__PURE__ */ jsx("li", { children: "Running this multiple times will overwrite existing data" }),
/* @__PURE__ */ jsx("li", { children: "Do not run this seeder after you have added your own content to the website" })
] })
] })
] }),
/* @__PURE__ */ jsxs(DialogFooter, { className: "gap-2", children: [
/* @__PURE__ */ jsx(DialogClose, { asChild: true, children: /* @__PURE__ */ jsx(Button, { type: "button", variant: "secondary", children: "Cancel" }) }),
/* @__PURE__ */ jsx(
LoadingButton,
{
variant: "destructive",
loading: seeding,
disabled: seeding,
className: "text-primary-foreground",
onClick: seedHandler,
children: "Run Seeder"
}
)
] })
] })
] })
] })
] })
] }),
/* @__PURE__ */ jsx(Dialog, { open, onOpenChange: handleOpenChange, children: /* @__PURE__ */ jsxs(DialogContent, { className: "sm:max-w-[500px]", children: [
processing && /* @__PURE__ */ jsx("div", { className: "bg-background/80 absolute inset-0 z-50 flex items-center justify-center rounded-lg backdrop-blur-sm", children: /* @__PURE__ */ jsxs("div", { className: "text-center", children: [
/* @__PURE__ */ jsx("div", { className: "border-primary mx-auto mb-4 h-8 w-8 animate-spin rounded-full border-4 border-t-transparent" }),
/* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: "Updating application..." }),
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground mt-1 text-xs", children: "Please do not close this window" })
] }) }),
/* @__PURE__ */ jsxs(ScrollArea, { className: "max-h-[90vh]", children: [
/* @__PURE__ */ jsxs(DialogHeader, { children: [
/* @__PURE__ */ jsxs(DialogTitle, { className: "flex items-center gap-2", children: [
/* @__PURE__ */ jsx(AlertTriangle, { className: "h-5 w-5 text-orange-600" }),
"Confirm Application Update"
] }),
/* @__PURE__ */ jsxs(DialogDescription, { className: "space-y-4 text-left", children: [
/* @__PURE__ */ jsxs("p", { children: [
"Are you sure you want to update the application with ",
/* @__PURE__ */ jsxs("strong", { children: [
'"',
selectedFileName,
'"'
] }),
"?"
] }),
/* @__PURE__ */ jsxs("div", { className: "rounded-lg border border-orange-200 bg-orange-50 p-4", children: [
/* @__PURE__ */ jsx("p", { className: "mb-2 font-medium text-orange-800", children: "This update will:" }),
/* @__PURE__ */ jsxs("ul", { className: "list-inside list-disc space-y-1 text-sm text-orange-700", children: [
/* @__PURE__ */ jsx("li", { children: "Put the site in maintenance mode" }),
/* @__PURE__ */ jsx("li", { children: "Replace all application files" }),
/* @__PURE__ */ jsx("li", { children: "Run database migrations" }),
/* @__PURE__ */ jsx("li", { children: "Process may take several minutes" })
] })
] }),
/* @__PURE__ */ jsxs("div", { className: "rounded-lg border border-red-200 bg-red-50 p-4", children: [
/* @__PURE__ */ jsx("p", { className: "mb-1 font-medium text-red-800", children: "⚠️ Important:" }),
/* @__PURE__ */ jsx("p", { className: "text-sm text-red-700", children: "Make sure you have created a backup first! This action cannot be undone." })
] })
] })
] }),
/* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: "space-y-4 pt-4", children: [
/* @__PURE__ */ jsxs("div", { children: [
/* @__PURE__ */ jsx(Label, { children: "Select File (.zip only)" }),
/* @__PURE__ */ jsx(
ChunkedUploaderInput,
{
isSubmit,
storage: "local",
filetype: "zip",
delayUpload: false,
onFileSelected: (file) => {
setIsFileSelected(true);
setSelectedFileName(file.name);
},
onFileUploaded: (fileData) => {
setData("update_file_url", fileData.file_url);
},
onError: (errors2) => {
onResetHandler();
},
onCancelUpload: () => {
onResetHandler();
}
}
),
/* @__PURE__ */ jsx(InputError, { message: String(errors.update_file_url || "") })
] }),
isFileSelected && selectedFileName && /* @__PURE__ */ jsx("div", { className: "rounded-lg border border-green-200 bg-green-50 p-3", children: /* @__PURE__ */ jsxs("div", { className: "flex items-start", children: [
/* @__PURE__ */ jsx(CheckCircle, { className: "mt-0.5 h-4 w-4 text-green-600" }),
/* @__PURE__ */ jsxs("div", { className: "ml-2", children: [
/* @__PURE__ */ jsxs("p", { className: "text-sm text-green-800", children: [
/* @__PURE__ */ jsx("strong", { children: "Selected file:" }),
" ",
selectedFileName
] }),
/* @__PURE__ */ jsx("p", { className: "mt-1 text-xs text-blue-600", children: 'File selected successfully. Click "Update Application" to proceed.' })
] })
] }) }),
/* @__PURE__ */ jsxs(DialogFooter, { className: "w-full justify-between space-x-2 pt-8", children: [
/* @__PURE__ */ jsx(DialogClose, { asChild: true, children: /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", children: "Close" }) }),
/* @__PURE__ */ jsx(
LoadingButton,
{
type: !isFileSelected ? "button" : "submit",
disabled: processing || isSubmit || !isFileSelected,
loading: processing || isSubmit,
children: isSubmit ? "Uploading..." : "Update Application"
}
)
] })
] })
] })
] }) })
] });
};
export {
ApplicationUpdate as default
};