+
{formatFullDateTime(lookups.nextPostDates[0])}
) : (
-
No next post date available.
+
No next post date available.
)}
{lookups?.nextPost ? (
-
+
) : (
-
No upcoming posts.
+
No upcoming posts.
)}
- >
+
)
}
diff --git a/src/components/schedules/ScheduleEditForm.tsx b/src/components/schedules/ScheduleEditForm.tsx
index 38b98b1..2e6cb2f 100644
--- a/src/components/schedules/ScheduleEditForm.tsx
+++ b/src/components/schedules/ScheduleEditForm.tsx
@@ -1,30 +1,29 @@
-import React from "react";
-import { Schedule, CreateScheduleRequest } from "@/types/scheduler";
-import { useScheduleContext } from "@/providers/ScheduleProvider";
-import FrequencyInput from "./FrequencyInput";
-import { Input, Label, Checkbox, Button } from "../ui/forms";
-import TimezoneSelect from "./TimezoneSelect";
-import { GroupSelect } from "../GroupSelect";
+import React from 'react'
+import { Schedule, CreateScheduleRequest } from '@/types/scheduler'
+import { useScheduleContext } from '@/providers/ScheduleProvider'
+import FrequencyInput from './FrequencyInput'
+import { Input, Label, Checkbox, Button } from '../ui/forms'
+import { GroupSelect } from '../GroupSelect'
export default function ScheduleEditForm({
schedule,
editForm,
setEditForm,
onSave,
- setIsEditing,
+ onCancel,
}: {
- schedule: Schedule | null;
- editForm: Partial
;
- setEditForm: React.Dispatch>>;
- onSave: () => void;
- setIsEditing: React.Dispatch>;
+ schedule: Schedule | null
+ editForm: Partial
+ setEditForm: React.Dispatch>>
+ onSave: () => void
+ onCancel: React.Dispatch>
}) {
- const { createSchedule, updateSchedule } = useScheduleContext();
+ const { createSchedule, updateSchedule } = useScheduleContext()
const handleSave = async () => {
if (!editForm.name || !editForm.frequency) {
- alert("Name and Frequency are required");
- return;
+ alert('Name and Frequency are required')
+ return
}
if (schedule && editForm.id) {
@@ -35,31 +34,31 @@ export default function ScheduleEditForm({
isActive: editForm.isActive || false,
frequency: editForm.frequency,
platforms: editForm.platforms || [],
- group: editForm.group || "default",
- };
- await updateSchedule(updatedSchedule);
+ group: editForm.group || 'default',
+ }
+ await updateSchedule(updatedSchedule)
} else {
// Create new schedule
const newSchedule: CreateScheduleRequest = {
- name: editForm.name || "",
+ name: editForm.name || '',
isActive: editForm.isActive || false,
frequency: editForm.frequency,
platforms: editForm.platforms || [],
- group: editForm.group || "default",
- };
- await createSchedule(newSchedule);
+ group: editForm.group || 'default',
+ }
+ await createSchedule(newSchedule)
}
- await onSave();
- };
+ await onSave()
+ }
return (
- <>
+
-
+
{
setEditForm((prev) => ({
...prev,
frequency,
- }));
+ }))
}}
/>
@@ -116,8 +115,8 @@ export default function ScheduleEditForm({
- >
- );
+
+ )
}
diff --git a/src/components/schedules/ScheduleList.tsx b/src/components/schedules/ScheduleList.tsx
index 51ee85f..28f13d8 100644
--- a/src/components/schedules/ScheduleList.tsx
+++ b/src/components/schedules/ScheduleList.tsx
@@ -20,7 +20,7 @@ export default function ScheduleList({
}) {
const { schedules } = useScheduleContext()
return (
-
+ <>
@@ -36,6 +36,11 @@ export default function ScheduleList({
+ {schedules.length === 0 && (
+
+ No schedules found.
+
+ )}
{schedules
.sort((a, b) => a.name.localeCompare(b.name))
.map((schedule) => (
@@ -65,6 +70,6 @@ export default function ScheduleList({
))}
-
+ >
)
}
diff --git a/src/components/ui/TwoColumn.tsx b/src/components/ui/TwoColumn.tsx
new file mode 100644
index 0000000..1a7154c
--- /dev/null
+++ b/src/components/ui/TwoColumn.tsx
@@ -0,0 +1,184 @@
+/** biome-ignore-all lint/suspicious/noArrayIndexKey: Need it for columns */
+import clsx from 'clsx'
+import { cloneElement } from 'react'
+
+interface TwoColumnProps {
+ reverseStack?: boolean
+ stackPoint?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'
+ children?: React.ReactNode
+}
+
+interface ColumnProps {
+ children?: React.ReactNode
+ stackPoint?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'
+ className?: string
+}
+
+export default function TwoColumn({
+ reverseStack = false,
+ stackPoint = 'md',
+ children,
+}: TwoColumnProps) {
+ const setChildProps = (children: React.ReactNode) => {
+ if (!children) return
+ if (!Array.isArray(children)) return children
+
+ return children.map((child, index) => {
+ if (
+ child &&
+ typeof child === 'object' &&
+ 'type' in child &&
+ ((child as any).type === Main ||
+ (child as any).type === Side ||
+ (child as any).type === Column)
+ ) {
+ const clone = cloneElement(child, {
+ stackPoint,
+ key: `two-column-child-${index}`,
+ })
+ return clone
+ }
+ return child
+ })
+ }
+
+ let stackClasses = null
+ switch (stackPoint) {
+ case 'xs':
+ stackClasses = 'w-full'
+ break
+ case 'sm':
+ stackClasses = 'sm:flex-row'
+ break
+ case 'md':
+ stackClasses = 'md:flex-row'
+ break
+ case 'lg':
+ stackClasses = 'lg:flex-row'
+ break
+ case 'xl':
+ stackClasses = 'xl:flex-row'
+ break
+ case '2xl':
+ stackClasses = '2xl:flex-row'
+ break
+ default:
+ stackClasses = 'md:flex-row'
+ break
+ }
+
+ return (
+
+ {setChildProps(children)}
+
+ )
+}
+
+function Column({ children, stackPoint = 'md', className }: ColumnProps) {
+ let stackClasses = null
+ switch (stackPoint) {
+ case 'xs':
+ stackClasses = 'w-full'
+ break
+ case 'sm':
+ stackClasses = 'sm:w-1/2'
+ break
+ case 'md':
+ stackClasses = 'md:w-1/2'
+ break
+ case 'lg':
+ stackClasses = 'lg:w-1/2'
+ break
+ case 'xl':
+ stackClasses = 'xl:w-1/2'
+ break
+ case '2xl':
+ stackClasses = '2xl:w-1/2'
+ break
+ default:
+ stackClasses = 'md:w-1/2'
+ break
+ }
+
+ return (
+
+ {children}
+
+ )
+}
+
+function Main({ children, stackPoint = 'md', className }: ColumnProps) {
+ let stackClasses = null
+ switch (stackPoint) {
+ case 'xs':
+ stackClasses = 'w-full'
+ break
+ case 'sm':
+ stackClasses = 'sm:w-2/3 xl:w-1/2'
+ break
+ case 'md':
+ stackClasses = 'md:w-2/3 xl:w-1/2'
+ break
+ case 'lg':
+ stackClasses = 'lg:w-2/3 xl:w-1/2'
+ break
+ case 'xl':
+ stackClasses = 'xl:w-2/3 2xl:w-1/2'
+ break
+ case '2xl':
+ stackClasses = '2xl:w-2/3'
+ break
+ default:
+ stackClasses = 'md:w-2/3'
+ break
+ }
+
+ return (
+
+ {children}
+
+ )
+}
+
+function Side({ children, stackPoint = 'md', className }: ColumnProps) {
+ let stackClasses = null
+ switch (stackPoint) {
+ case 'xs':
+ stackClasses = 'w-full'
+ break
+ case 'sm':
+ stackClasses = 'sm:w-1/3 xl:w-1/2'
+ break
+ case 'md':
+ stackClasses = 'md:w-1/3 xl:w-1/2'
+ break
+ case 'lg':
+ stackClasses = 'lg:w-1/3 xl:w-1/2'
+ break
+ case 'xl':
+ stackClasses = 'xl:w-1/3 2xl:w-1/2'
+ break
+ case '2xl':
+ stackClasses = '2xl:w-1/3'
+ break
+ default:
+ stackClasses = 'md:w-1/3'
+ break
+ }
+
+ return (
+
+ )
+}
+
+TwoColumn.Main = Main
+TwoColumn.Side = Side
+TwoColumn.Column = Column