lms/bootstrap/ssr/assets/lesson-form-J2VOck2C.js
2025-12-15 12:26:23 +01:00

341 lines
15 KiB
JavaScript

import { jsxs, jsx, Fragment } 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 { T as Tabs } from "./tabs-DgXFE6Gu.js";
import { B as Button } from "./button-CdJZJLGw.js";
import { D as Dialog, a as DialogTrigger, b as DialogContent, c as DialogHeader, d as DialogTitle, e as DialogFooter, f as DialogClose } from "./dialog-DGP_3dPQ.js";
import { I as Input } from "./input-BsvJqbcd.js";
import { L as Label } from "./label-0rIIfpX0.js";
import { R as RadioGroup, a as RadioGroupItem } from "./radio-group-Wf8uu9ZY.js";
import { S as ScrollArea } from "./scroll-area-CDdrLubh.js";
import { S as Select, a as SelectTrigger, b as SelectValue, c as SelectContent, d as SelectItem } from "./select-BYx0MCUK.js";
import { b as TabsContent, T as TabsList, a as TabsTrigger } from "./tabs-DmCK9qzK.js";
import { T as Textarea } from "./textarea-Z0d4V-ti.js";
import { g as getFileMetadata } from "./file-metadata-CvVo69cP.js";
import { o as onHandleChange } from "./inertia-BtwbgBI3.js";
import { c as cn } from "./utils-DLCPGU0v.js";
import { usePage, useForm } from "@inertiajs/react";
import { useState, useEffect } from "react";
import { Editor } from "richtor";
/* empty css */
import "axios";
import "lucide-react";
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-radio-group";
import "@radix-ui/react-scroll-area";
import "@radix-ui/react-select";
import "@radix-ui/react-tabs";
import "clsx";
import "tailwind-merge";
const getLessonTypes = (translate) => [
// { value: 'vimeo', label: 'Vimeo Video', flag: true },
// { value: 'drive', label: 'Google drive video', flag: true },
{ value: "video", label: translate.dashboard.video_file, flag: false },
{ value: "video_url", label: translate.dashboard.video_url, flag: false },
{ value: "document", label: translate.dashboard.document_file, flag: false },
{ value: "image", label: translate.dashboard.image_file, flag: false },
{ value: "text", label: translate.dashboard.text_content, flag: false },
{ value: "embed", label: translate.dashboard.embed_source, flag: false }
];
const LessonForm = ({ title, handler, lesson, sectionId }) => {
const [open, setOpen] = useState(false);
const [isSubmit, setIsSubmit] = useState(false);
const [lessonType, setLessonType] = useState("type");
const [isFileSelected, setIsFileSelected] = useState(false);
const [isFileUploaded, setIsFileUploaded] = useState(false);
const { props } = usePage();
const { translate } = props;
const { dashboard, input, button } = translate;
const lessonTypes = getLessonTypes(translate);
const { data, setData, post, put, reset, processing, errors, clearErrors } = useForm({
title: lesson ? lesson.title : "",
status: lesson ? lesson.status : "",
is_free: lesson ? lesson.is_free : 0,
description: lesson ? lesson.description : "",
sort: lesson ? lesson.sort : props.lastLessonSort + 1,
lesson_type: lesson ? lesson.lesson_type : "video",
lesson_provider: lesson ? lesson.lesson_provider : "",
lesson_src: lesson ? lesson.lesson_src : "",
lesson_src_new: null,
embed_source: lesson ? lesson.embed_source : "",
duration: lesson ? lesson.duration : "00:00:00",
summary: lesson ? lesson.summary : "",
course_id: lesson ? lesson.course_id : props.course.id,
course_section_id: sectionId
});
const isFileUpload = ["video", "document", "image"].includes(data.lesson_type);
const handleSubmit = async (e) => {
e.preventDefault();
if (isFileUpload && isFileSelected) {
setIsSubmit(true);
return;
}
submitForm();
};
const submitForm = () => {
clearErrors();
if (lesson) {
put(route("lesson.update", { id: lesson.id }), {
preserveScroll: true,
onSuccess: () => {
reset();
setOpen(false);
setIsSubmit(false);
}
});
} else {
post(route("lesson.store"), {
preserveScroll: true,
onSuccess: () => {
reset();
setOpen(false);
setIsSubmit(false);
}
});
}
};
useEffect(() => {
if (data.lesson_src_new && isFileUploaded) {
submitForm();
reset("lesson_src_new");
setIsFileUploaded(false);
}
}, [data.lesson_src_new]);
useEffect(() => {
if (!open) {
reset();
setLessonType("type");
}
}, [open]);
const onDurationChange = (e) => {
const value = e.target.value;
const formattedTime = value.match(/^([0-2]?[0-9]):([0-5]?[0-9]):([0-5]?[0-9])$/);
if (formattedTime) {
setData("duration", value);
}
};
return /* @__PURE__ */ jsxs(Dialog, { open, onOpenChange: () => isSubmit ? setOpen(true) : setOpen((prev) => !prev), children: [
/* @__PURE__ */ jsx(DialogTrigger, { children: handler }),
/* @__PURE__ */ jsx(DialogContent, { className: "p-0", children: /* @__PURE__ */ jsxs(ScrollArea, { className: "max-h-[90vh] p-6", children: [
/* @__PURE__ */ jsx(DialogHeader, { className: "mb-6", children: /* @__PURE__ */ jsx(DialogTitle, { children: title }) }),
/* @__PURE__ */ jsx("form", { onSubmit: handleSubmit, children: /* @__PURE__ */ jsxs(Tabs, { value: lesson ? "form" : lessonType, onValueChange: setLessonType, children: [
/* @__PURE__ */ jsx(TabsContent, { value: "type", children: /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
/* @__PURE__ */ jsx(Label, { className: "font-semibold", children: input.lesson_type }),
/* @__PURE__ */ jsx(
RadioGroup,
{
value: data.lesson_type,
onValueChange: (lesson2) => setData("lesson_type", lesson2),
className: "grid grid-cols-2 gap-3",
children: lessonTypes.map((type) => /* @__PURE__ */ jsxs(
Label,
{
className: cn(
"flex items-center space-x-2 rounded-lg border p-2",
type.flag ? "cursor-not-allowed" : "cursor-pointer"
),
children: [
/* @__PURE__ */ jsx(RadioGroupItem, { className: "cursor-pointer", value: type.value, disabled: type.flag }),
/* @__PURE__ */ jsx("span", { children: type.label })
]
},
type.value
))
}
)
] }) }),
/* @__PURE__ */ jsxs(TabsContent, { value: "form", className: "space-y-4 p-0.5", children: [
/* @__PURE__ */ jsxs("div", { children: [
/* @__PURE__ */ jsxs(Label, { children: [
input.title,
" *"
] }),
/* @__PURE__ */ jsx(Input, { required: true, name: "title", value: data.title, placeholder: input.title, onChange: (e) => onHandleChange(e, setData) }),
/* @__PURE__ */ jsx(InputError, { message: errors.title })
] }),
["video_url"].includes(data.lesson_type) && /* @__PURE__ */ jsxs(Fragment, { children: [
/* @__PURE__ */ jsxs("div", { children: [
/* @__PURE__ */ jsx(Label, { htmlFor: "lesson_provider", children: input.video_url_provider }),
/* @__PURE__ */ jsxs(
Select,
{
required: true,
name: "lesson_provider",
value: data.lesson_provider,
onValueChange: (provider) => setData("lesson_provider", provider),
children: [
/* @__PURE__ */ jsx(SelectTrigger, { className: "w-full", children: /* @__PURE__ */ jsx(SelectValue, { placeholder: input.provider_placeholder }) }),
/* @__PURE__ */ jsx(SelectContent, { children: /* @__PURE__ */ jsx(SelectItem, { value: "youtube", children: "YouTube" }) })
]
}
)
] }),
/* @__PURE__ */ jsxs("div", { children: [
/* @__PURE__ */ jsxs(Label, { children: [
"Video URL",
/* @__PURE__ */ jsx("span", { className: "text-xs text-gray-500", children: "(Provide the shareable url only)" })
] }),
/* @__PURE__ */ jsx(
Input,
{
required: true,
name: "lesson_src",
value: data.lesson_src || "",
placeholder: `Type your ${data.lesson_provider} video url`,
onChange: (e) => onHandleChange(e, setData)
}
),
/* @__PURE__ */ jsx(InputError, { message: errors.lesson_src })
] })
] }),
["video", "document", "image"].includes(data.lesson_type) && /* @__PURE__ */ jsxs("div", { children: [
/* @__PURE__ */ jsxs(Label, { children: [
input.select,
" ",
data.lesson_type
] }),
/* @__PURE__ */ jsx(
ChunkedUploaderInput,
{
isSubmit,
courseId: data.course_id || "",
sectionId: data.course_section_id || "",
filetype: data.lesson_type,
delayUpload: true,
onFileSelected: (file) => {
setIsFileSelected(true);
getFileMetadata(file).then((metadata) => {
setData("title", metadata.name);
setData("duration", metadata.duration || "00:00:00");
});
},
onFileUploaded: (fileData) => {
setIsFileUploaded(true);
setData("lesson_src_new", fileData.file_url);
},
onError: (errors2) => {
setIsSubmit(false);
},
onCancelUpload: () => {
setIsSubmit(false);
}
}
)
] }),
data.lesson_type === "embed" && /* @__PURE__ */ jsxs("div", { children: [
/* @__PURE__ */ jsxs(Label, { children: [
"Embed source",
/* @__PURE__ */ jsx("span", { className: "text-xs text-gray-500", children: "(Provide the source url only)" })
] }),
/* @__PURE__ */ jsx(
Textarea,
{
required: true,
name: "embed_source",
placeholder: input.embed_source_placeholder,
value: data.embed_source,
rows: 4,
onChange: (e) => onHandleChange(e, setData)
}
),
/* @__PURE__ */ jsx(InputError, { message: errors.embed_source })
] }),
data.lesson_type === "text" && /* @__PURE__ */ jsxs("div", { children: [
/* @__PURE__ */ jsx(Label, { children: input.your_text }),
/* @__PURE__ */ jsx(
Editor,
{
ssr: true,
output: "html",
placeholder: {
paragraph: "Type your content here...",
imageCaption: "Type caption for image (optional)"
},
contentMinHeight: 256,
contentMaxHeight: 640,
initialContent: data.lesson_src,
onContentChange: (value) => setData((prev) => ({
...prev,
lesson_src: value
}))
}
),
/* @__PURE__ */ jsx(InputError, { message: errors.lesson_src })
] }),
["video_url", "video"].includes(data.lesson_type) && /* @__PURE__ */ jsxs("div", { children: [
/* @__PURE__ */ jsx(Label, { htmlFor: "duration", children: input.duration }),
/* @__PURE__ */ jsx(
Input,
{
required: true,
maxLength: 8,
type: "text",
name: "duration",
value: data.duration,
placeholder: "00:00:00",
onChange: onDurationChange,
readOnly: data.lesson_type === "video"
}
),
/* @__PURE__ */ jsx(InputError, { message: errors.duration })
] }),
/* @__PURE__ */ jsxs("div", { children: [
/* @__PURE__ */ jsx(Label, { htmlFor: "summary", children: "Summary" }),
/* @__PURE__ */ jsx(
Editor,
{
ssr: true,
output: "html",
placeholder: {
paragraph: "Type your content here...",
imageCaption: "Type caption for image (optional)"
},
contentMinHeight: 256,
contentMaxHeight: 640,
initialContent: data.summary,
onContentChange: (value) => setData("summary", value)
}
),
/* @__PURE__ */ jsx(InputError, { message: errors.summary })
] }),
/* @__PURE__ */ jsxs("div", { children: [
/* @__PURE__ */ jsx(Label, { children: "Lesson type" }),
/* @__PURE__ */ jsx(
RadioGroup,
{
required: true,
defaultValue: data.is_free ? "free" : "paid",
className: "flex items-center space-x-4 pt-2 pb-1",
onValueChange: (value) => setData("is_free", value === "free" ? 1 : 0),
children: props.prices.map((price) => /* @__PURE__ */ jsxs("div", { className: "flex items-center space-x-2", children: [
/* @__PURE__ */ jsx(RadioGroupItem, { className: "cursor-pointer", id: price, value: price }),
/* @__PURE__ */ jsx(Label, { htmlFor: price, className: "capitalize", children: price })
] }, price))
}
),
/* @__PURE__ */ jsx(InputError, { message: errors.is_free })
] })
] }),
/* @__PURE__ */ jsxs(DialogFooter, { className: "w-full justify-between space-x-2 pt-8", children: [
/* @__PURE__ */ jsxs("div", { className: "flex w-full items-center gap-4", children: [
/* @__PURE__ */ jsx(DialogClose, { asChild: true, children: /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", children: button.close }) }),
!lesson && /* @__PURE__ */ jsxs(TabsList, { className: "p-0", children: [
/* @__PURE__ */ jsx(TabsTrigger, { asChild: true, value: "form", className: cn(lessonType === "form" ? "hidden" : "block"), children: /* @__PURE__ */ jsx(Button, { children: button.next }) }),
/* @__PURE__ */ jsx(TabsTrigger, { asChild: true, value: "type", className: cn(lessonType === "type" ? "hidden" : "block"), children: /* @__PURE__ */ jsx(Button, { children: button.back }) })
] })
] }),
(lesson || lessonType === "form") && /* @__PURE__ */ jsx(LoadingButton, { loading: processing || isSubmit, disabled: processing || isSubmit, children: isSubmit ? "Uploading..." : button.submit })
] })
] }) })
] }) })
] });
};
export {
LessonForm as default
};