290 lines
14 KiB
JavaScript
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
|
|
};
|