Orders Scheduling - Multiple times a day

This commit is contained in:
Johnny Gear 2026-03-07 14:27:18 -06:00
parent 14bd8e117b
commit ae3fb600b2
3 changed files with 46 additions and 7 deletions

View file

@ -48,7 +48,7 @@ class OrderScheduler():
if orders_pool.scheduled:
self.scheduled_pools[orders_pool.id] = self.scheduler.daily(
order_time(orders_pool.time),
[order_time(t) for t in orders_pool.time.split(",")],
self.scheduled_order,
args=(orders_pool.id,)
)

View file

@ -69,8 +69,9 @@ type FormOrderSetOrder = Omit<OrderSetOrder, "id" | "add_ons"> & {
add_ons: FormOrderSetOrderAddOn[];
};
type FormOrderSet = Omit<OrderSet, "orders" | "punishment_pool_id"> & {
type FormOrderSet = Omit<OrderSet, "orders" | "time" | "punishment_pool_id"> & {
orders: FormOrderSetOrder[];
time: string[] | string;
punishment_pool_id?: string | number;
};
@ -98,9 +99,14 @@ export const OrderSet: React.FC = () => {
const form = useForm<Partial<FormOrderSet>>({
mode: "uncontrolled",
cascadeUpdates: true,
initialValues: orderSet
? {
...orderSet,
time:
orderSet.scheduled && orderSet.time.indexOf(",") != -1
? [...orderSet.time.split(","), ""]
: [orderSet.time, ""],
punishment_pool_id: orderSet.punishment_pool_id
? `${orderSet.punishment_pool_id}`
: undefined,
@ -113,7 +119,7 @@ export const OrderSet: React.FC = () => {
name: (value: string) =>
value.length < 1 ? "Please enter a name" : null,
time: (value: string, values: FormOrderSet) =>
values.scheduled && (!value || value.length < 1)
values.scheduled && (!value || value.length < 1 || !value[0])
? "Please set a time"
: null,
probability: (value: number, values: FormOrderSet) =>
@ -140,12 +146,27 @@ export const OrderSet: React.FC = () => {
},
transformValues: (values) => ({
...values,
time:
values.scheduled && values.time && values.time.length > 0
? (values.time as string[]).filter((time) => !!time).join(",")
: values.time,
punishment_pool_id: values.punishment_pool_id
? Number(values.punishment_pool_id)
: undefined,
}),
});
form.watch("time", ({ previousValue, value }) => {
let newValue = [...(value as string[]).filter((time) => !!time), ""];
for (let i = 0; i < Math.min(previousValue.length, newValue.length); i++) {
if (previousValue[i] !== newValue[i]) {
form.setFieldValue("time", newValue);
break;
}
}
});
const handleSubmit = React.useCallback(
form.onSubmit((values) => {
fetch(`/api/orders/${username}/sets/${set_id || ""}`, {
@ -256,7 +277,20 @@ export const OrderSet: React.FC = () => {
Weekends
</Chip>
</Flex>
<TimeInput {...form.getInputProps("time")} label="Time" />
<Input.Wrapper
label="Time"
error={form.getInputProps("time").error}
>
{(form.getValues().time as string[]).map((time, idx) => (
<Flex key={idx} gap="xs">
<TimeInput
key={time}
{...form.getInputProps(`time.${idx}`)}
w="10rem"
/>
</Flex>
))}
</Input.Wrapper>
<NumberInput
{...form.getInputProps("confirm_delay")}
label="Confirmation Due After"

View file

@ -83,9 +83,14 @@ export const OrderSets: React.FC<OrderSetProps> = ({
<Title order={4}>{name}</Title>
{scheduled ? (
<>
<Text>
Scheduled: <TimeValue value={time} format="12h" />
</Text>
<Flex gap="xs">
<Text>Scheduled:</Text>
{time.split(",").map((time) => (
<div key={time}>
<TimeValue key={time} value={time} format="12h" />
</div>
))}
</Flex>
<Flex gap="md" align="center">
{weekdays ? (
<Badge color="blue">Weekdays</Badge>