This commit is contained in:
parent
4e7fdb046d
commit
2055484a87
@ -18,6 +18,7 @@ const CourseCard1 = ({ course, viewType = 'grid', className, wishlists }: Props)
|
|||||||
const { user } = props.auth;
|
const { user } = props.auth;
|
||||||
const { translate } = props;
|
const { translate } = props;
|
||||||
const { button, frontend, common } = translate;
|
const { button, frontend, common } = translate;
|
||||||
|
const showWishlist = props.system.fields?.show_student_wishlist !== false;
|
||||||
|
|
||||||
const isWishlisted = wishlists?.find((wishlist) => wishlist.course_id === course.id);
|
const isWishlisted = wishlists?.find((wishlist) => wishlist.course_id === course.id);
|
||||||
const currency = systemCurrency(props.system.fields['selling_currency']);
|
const currency = systemCurrency(props.system.fields['selling_currency']);
|
||||||
@ -55,7 +56,7 @@ const CourseCard1 = ({ course, viewType = 'grid', className, wishlists }: Props)
|
|||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{wishlists && (
|
{wishlists && showWishlist && (
|
||||||
<TooltipProvider delayDuration={0}>
|
<TooltipProvider delayDuration={0}>
|
||||||
<Tooltip>
|
<Tooltip>
|
||||||
<TooltipTrigger className="absolute top-3 right-3 z-10 opacity-0 group-hover:opacity-100">
|
<TooltipTrigger className="absolute top-3 right-3 z-10 opacity-0 group-hover:opacity-100">
|
||||||
|
|||||||
@ -17,6 +17,7 @@ const CourseCard2 = ({ course, className, wishlists }: Props) => {
|
|||||||
const { props } = usePage<SharedData>();
|
const { props } = usePage<SharedData>();
|
||||||
const { user } = props.auth;
|
const { user } = props.auth;
|
||||||
const { button, common, frontend } = props.translate;
|
const { button, common, frontend } = props.translate;
|
||||||
|
const showWishlist = props.system.fields?.show_student_wishlist !== false;
|
||||||
|
|
||||||
const isWishlisted = wishlists?.find((wishlist) => wishlist.course_id === course.id);
|
const isWishlisted = wishlists?.find((wishlist) => wishlist.course_id === course.id);
|
||||||
const currency = systemCurrency(props.system.fields['selling_currency']);
|
const currency = systemCurrency(props.system.fields['selling_currency']);
|
||||||
@ -52,7 +53,7 @@ const CourseCard2 = ({ course, className, wishlists }: Props) => {
|
|||||||
</div>
|
</div>
|
||||||
</Link>
|
</Link>
|
||||||
|
|
||||||
{wishlists && (
|
{wishlists && showWishlist && (
|
||||||
<TooltipProvider delayDuration={0}>
|
<TooltipProvider delayDuration={0}>
|
||||||
<Tooltip>
|
<Tooltip>
|
||||||
<TooltipTrigger className="absolute top-2 right-2 z-10">
|
<TooltipTrigger className="absolute top-2 right-2 z-10">
|
||||||
|
|||||||
@ -17,6 +17,7 @@ const CourseCard6 = ({ course, type = 'grid', className, wishlists }: Props) =>
|
|||||||
const { props } = usePage<SharedData>();
|
const { props } = usePage<SharedData>();
|
||||||
const { user } = props.auth;
|
const { user } = props.auth;
|
||||||
const { button, common, frontend } = props.translate;
|
const { button, common, frontend } = props.translate;
|
||||||
|
const showWishlist = props.system.fields?.show_student_wishlist !== false;
|
||||||
|
|
||||||
const isWishlisted = wishlists?.find((wishlist) => wishlist.course_id === course.id);
|
const isWishlisted = wishlists?.find((wishlist) => wishlist.course_id === course.id);
|
||||||
const currency = systemCurrency(props.system.fields['selling_currency']);
|
const currency = systemCurrency(props.system.fields['selling_currency']);
|
||||||
@ -54,7 +55,7 @@ const CourseCard6 = ({ course, type = 'grid', className, wishlists }: Props) =>
|
|||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{wishlists && (
|
{wishlists && showWishlist && (
|
||||||
<TooltipProvider delayDuration={0}>
|
<TooltipProvider delayDuration={0}>
|
||||||
<Tooltip>
|
<Tooltip>
|
||||||
<TooltipTrigger className="absolute top-2 right-2 z-10">
|
<TooltipTrigger className="absolute top-2 right-2 z-10">
|
||||||
|
|||||||
@ -20,6 +20,7 @@ const ExamCard1 = ({ exam, variant = 'default', viewType = 'grid', onAddToCart,
|
|||||||
const { props } = usePage<SharedData>();
|
const { props } = usePage<SharedData>();
|
||||||
const { translate } = props;
|
const { translate } = props;
|
||||||
const { common } = translate;
|
const { common } = translate;
|
||||||
|
const showWishlist = props.system.fields?.show_student_wishlist !== false;
|
||||||
|
|
||||||
const isCompact = variant === 'compact';
|
const isCompact = variant === 'compact';
|
||||||
const examUrl = route('exams.details', { slug: exam.slug, id: exam.id });
|
const examUrl = route('exams.details', { slug: exam.slug, id: exam.id });
|
||||||
@ -97,7 +98,7 @@ const ExamCard1 = ({ exam, variant = 'default', viewType = 'grid', onAddToCart,
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
{onAddToWishlist && (
|
{showWishlist && onAddToWishlist && (
|
||||||
<Button
|
<Button
|
||||||
variant="outline"
|
variant="outline"
|
||||||
size="icon"
|
size="icon"
|
||||||
|
|||||||
@ -21,6 +21,7 @@ const IntroNavbar = () => {
|
|||||||
const navbar = getPageSection(page, 'navbar');
|
const navbar = getPageSection(page, 'navbar');
|
||||||
|
|
||||||
const user = auth.user;
|
const user = auth.user;
|
||||||
|
const showWishlist = props.system.fields?.show_student_wishlist !== false;
|
||||||
const [isSticky, setIsSticky] = useState(false);
|
const [isSticky, setIsSticky] = useState(false);
|
||||||
const [isMenuOpen, setIsMenuOpen] = useState(false);
|
const [isMenuOpen, setIsMenuOpen] = useState(false);
|
||||||
|
|
||||||
@ -105,7 +106,7 @@ const IntroNavbar = () => {
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
{(user.role === 'student' || user.role === 'instructor') &&
|
{(user.role === 'student' || user.role === 'instructor') &&
|
||||||
studentMenuItems.map(({ id, name, Icon, slug }) => (
|
getStudentMenuItems(showWishlist).map(({ id, name, Icon, slug }) => (
|
||||||
<DropdownMenuItem
|
<DropdownMenuItem
|
||||||
key={id}
|
key={id}
|
||||||
className="cursor-pointer px-3"
|
className="cursor-pointer px-3"
|
||||||
@ -216,19 +217,23 @@ const IntroNavbar = () => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const studentMenuItems = [
|
const getStudentMenuItems = (showWishlist: boolean) => [
|
||||||
{
|
{
|
||||||
id: nanoid(),
|
id: nanoid(),
|
||||||
name: 'My Courses',
|
name: 'My Courses',
|
||||||
slug: 'courses',
|
slug: 'courses',
|
||||||
Icon: GraduationCap,
|
Icon: GraduationCap,
|
||||||
},
|
},
|
||||||
{
|
...(showWishlist
|
||||||
id: nanoid(),
|
? [
|
||||||
name: 'Wishlist',
|
{
|
||||||
slug: 'wishlist',
|
id: nanoid(),
|
||||||
Icon: Heart,
|
name: 'Wishlist',
|
||||||
},
|
slug: 'wishlist',
|
||||||
|
Icon: Heart,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
: []),
|
||||||
{
|
{
|
||||||
id: nanoid(),
|
id: nanoid(),
|
||||||
name: 'My Profile',
|
name: 'My Profile',
|
||||||
|
|||||||
@ -21,6 +21,7 @@ const LandingNavbar = () => {
|
|||||||
const navbar = getPageSection(page, 'navbar');
|
const navbar = getPageSection(page, 'navbar');
|
||||||
|
|
||||||
const user = auth.user;
|
const user = auth.user;
|
||||||
|
const showWishlist = props.system.fields?.show_student_wishlist !== false;
|
||||||
const [isSticky, setIsSticky] = useState(false);
|
const [isSticky, setIsSticky] = useState(false);
|
||||||
const [isMenuOpen, setIsMenuOpen] = useState(false);
|
const [isMenuOpen, setIsMenuOpen] = useState(false);
|
||||||
|
|
||||||
@ -97,7 +98,7 @@ const LandingNavbar = () => {
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
{(user.role === 'student' || user.role === 'instructor') &&
|
{(user.role === 'student' || user.role === 'instructor') &&
|
||||||
studentMenuItems.map(({ id, name, Icon, slug }) => (
|
getStudentMenuItems(showWishlist).map(({ id, name, Icon, slug }) => (
|
||||||
<DropdownMenuItem
|
<DropdownMenuItem
|
||||||
key={id}
|
key={id}
|
||||||
className="cursor-pointer px-3"
|
className="cursor-pointer px-3"
|
||||||
@ -205,19 +206,23 @@ const LandingNavbar = () => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const studentMenuItems = [
|
const getStudentMenuItems = (showWishlist: boolean) => [
|
||||||
{
|
{
|
||||||
id: nanoid(),
|
id: nanoid(),
|
||||||
name: 'My Courses',
|
name: 'My Courses',
|
||||||
slug: 'courses',
|
slug: 'courses',
|
||||||
Icon: GraduationCap,
|
Icon: GraduationCap,
|
||||||
},
|
},
|
||||||
{
|
...(showWishlist
|
||||||
id: nanoid(),
|
? [
|
||||||
name: 'Wishlist',
|
{
|
||||||
slug: 'wishlist',
|
id: nanoid(),
|
||||||
Icon: Heart,
|
name: 'Wishlist',
|
||||||
},
|
slug: 'wishlist',
|
||||||
|
Icon: Heart,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
: []),
|
||||||
{
|
{
|
||||||
id: nanoid(),
|
id: nanoid(),
|
||||||
name: 'My Profile',
|
name: 'My Profile',
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group';
|
|||||||
import { CoursePlayerProps } from '@/types/page';
|
import { CoursePlayerProps } from '@/types/page';
|
||||||
import { usePage } from '@inertiajs/react';
|
import { usePage } from '@inertiajs/react';
|
||||||
import { format, parseISO } from 'date-fns';
|
import { format, parseISO } from 'date-fns';
|
||||||
|
import { de } from 'date-fns/locale';
|
||||||
import jsPDF from 'jspdf';
|
import jsPDF from 'jspdf';
|
||||||
import { Award, Calendar, Download, FileImage, FileText } from 'lucide-react';
|
import { Award, Calendar, Download, FileImage, FileText } from 'lucide-react';
|
||||||
import { useRef, useState } from 'react';
|
import { useRef, useState } from 'react';
|
||||||
@ -17,7 +18,9 @@ const Certificate = () => {
|
|||||||
|
|
||||||
const courseName = props.course.title;
|
const courseName = props.course.title;
|
||||||
const studentName = props.auth.user.name;
|
const studentName = props.auth.user.name;
|
||||||
const completionDate = format(parseISO(props.watchHistory.completion_date), 'MMM d, yyyy');
|
const completionDate = props.watchHistory?.completion_date
|
||||||
|
? format(parseISO(props.watchHistory.completion_date), 'dd. MMMM yyyy', { locale: de })
|
||||||
|
: '';
|
||||||
const [downloadFormat, setDownloadFormat] = useState('png');
|
const [downloadFormat, setDownloadFormat] = useState('png');
|
||||||
const certificateRef = useRef<HTMLDivElement>(null);
|
const certificateRef = useRef<HTMLDivElement>(null);
|
||||||
const dimensions = { width: 900, height: 600 }; // Standard
|
const dimensions = { width: 900, height: 600 }; // Standard
|
||||||
|
|||||||
@ -17,6 +17,7 @@ const Navbar = () => {
|
|||||||
const { translate } = props;
|
const { translate } = props;
|
||||||
const { button } = translate;
|
const { button } = translate;
|
||||||
const user = props.auth.user;
|
const user = props.auth.user;
|
||||||
|
const showWishlist = props.system.fields?.show_student_wishlist !== false;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<header className="bg-primary dark:bg-primary-dark text-primary-foreground dark:text-primary sticky top-0 z-50 h-[60px]">
|
<header className="bg-primary dark:bg-primary-dark text-primary-foreground dark:text-primary sticky top-0 z-50 h-[60px]">
|
||||||
@ -61,7 +62,7 @@ const Navbar = () => {
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
{(user.role === 'student' || user.role === 'instructor') &&
|
{(user.role === 'student' || user.role === 'instructor') &&
|
||||||
getStudentMenuItems(button).map(({ id, name, Icon, slug }) => (
|
getStudentMenuItems(button, showWishlist).map(({ id, name, Icon, slug }) => (
|
||||||
<DropdownMenuItem
|
<DropdownMenuItem
|
||||||
key={id}
|
key={id}
|
||||||
className="cursor-pointer px-3"
|
className="cursor-pointer px-3"
|
||||||
@ -95,19 +96,23 @@ const Navbar = () => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const getStudentMenuItems = (button: any) => [
|
const getStudentMenuItems = (button: any, showWishlist: boolean) => [
|
||||||
{
|
{
|
||||||
id: nanoid(),
|
id: nanoid(),
|
||||||
name: button.my_courses,
|
name: button.my_courses,
|
||||||
slug: 'courses',
|
slug: 'courses',
|
||||||
Icon: GraduationCap,
|
Icon: GraduationCap,
|
||||||
},
|
},
|
||||||
{
|
...(showWishlist
|
||||||
id: nanoid(),
|
? [
|
||||||
name: button.wishlist,
|
{
|
||||||
slug: 'wishlist',
|
id: nanoid(),
|
||||||
Icon: Heart,
|
name: button.wishlist,
|
||||||
},
|
slug: 'wishlist',
|
||||||
|
Icon: Heart,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
: []),
|
||||||
{
|
{
|
||||||
id: nanoid(),
|
id: nanoid(),
|
||||||
name: button.profile,
|
name: button.profile,
|
||||||
|
|||||||
@ -70,8 +70,9 @@ const EnrollmentButton = ({ auth, course }: { auth: Auth; course: Course }) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const EnrollOrPlayerButton = () => {
|
const EnrollOrPlayerButton = () => {
|
||||||
const { auth, course, enrollment, watchHistory, approvalStatus, wishlists, translate } = usePage<CourseDetailsProps>().props;
|
const { auth, course, enrollment, watchHistory, approvalStatus, wishlists, translate, system } = usePage<CourseDetailsProps>().props;
|
||||||
const { frontend } = translate;
|
const { frontend } = translate;
|
||||||
|
const showWishlist = system.fields?.show_student_wishlist !== false;
|
||||||
|
|
||||||
// Compute access conditions - improves readability
|
// Compute access conditions - improves readability
|
||||||
const isEnrolled = !!enrollment;
|
const isEnrolled = !!enrollment;
|
||||||
@ -97,9 +98,11 @@ const EnrollOrPlayerButton = () => {
|
|||||||
} else {
|
} else {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Button className="w-full px-1 sm:px-3" variant="outline" size="lg" onClick={handleWishlist}>
|
{showWishlist && (
|
||||||
{isWishlisted ? frontend.remove_from_wishlist : frontend.add_to_wishlist}
|
<Button className="w-full px-1 sm:px-3" variant="outline" size="lg" onClick={handleWishlist}>
|
||||||
</Button>
|
{isWishlisted ? frontend.remove_from_wishlist : frontend.add_to_wishlist}
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
|
|
||||||
<EnrollmentButton auth={auth} course={course} />
|
<EnrollmentButton auth={auth} course={course} />
|
||||||
</>
|
</>
|
||||||
|
|||||||
@ -10,6 +10,7 @@ const CoursePreview = () => {
|
|||||||
const { auth, exam, system, wishlist, enrollment, translate } = usePage<ExamPreviewProps>().props;
|
const { auth, exam, system, wishlist, enrollment, translate } = usePage<ExamPreviewProps>().props;
|
||||||
const { frontend } = translate;
|
const { frontend } = translate;
|
||||||
const currency = systemCurrency(system.fields['selling_currency']);
|
const currency = systemCurrency(system.fields['selling_currency']);
|
||||||
|
const showWishlist = system.fields?.show_student_wishlist !== false;
|
||||||
|
|
||||||
const handleWishlist = () => {
|
const handleWishlist = () => {
|
||||||
if (wishlist) {
|
if (wishlist) {
|
||||||
@ -75,9 +76,11 @@ const CoursePreview = () => {
|
|||||||
)}
|
)}
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<Button className="w-full px-1 sm:px-3" variant="outline" size="lg" onClick={handleWishlist}>
|
{showWishlist && (
|
||||||
{wishlist ? frontend.remove_from_wishlist : frontend.add_to_wishlist}
|
<Button className="w-full px-1 sm:px-3" variant="outline" size="lg" onClick={handleWishlist}>
|
||||||
</Button>
|
{wishlist ? frontend.remove_from_wishlist : frontend.add_to_wishlist}
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
|
|
||||||
{exam.pricing_type === 'free' ? (
|
{exam.pricing_type === 'free' ? (
|
||||||
<Button size="lg" className="w-full" onClick={() => enrollmentHandler(exam)}>
|
<Button size="lg" className="w-full" onClick={() => enrollmentHandler(exam)}>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user