diff --git a/client/public/locales/en/common.json b/client/public/locales/en/common.json index 5ca7d7bf7..99e224543 100644 --- a/client/public/locales/en/common.json +++ b/client/public/locales/en/common.json @@ -9,6 +9,7 @@ "buttons": { "create": "Create", "save": "Save", + "saveAndAdd": "Save and Add", "logout": "Log out", "delete": "Delete", "edit": "Edit", @@ -190,7 +191,8 @@ "comment": "Comment", "settings_extruder_temp": "Extruder Temp", "settings_bed_temp": "Bed Temp", - "color_hex": "Color" + "color_hex": "Color", + "spools": "Show Spools" }, "fields_help": { "name": "Filament name, to distinguish this filament type among others from the same vendor. Should contain the color for example.", diff --git a/client/src/pages/filaments/create.tsx b/client/src/pages/filaments/create.tsx index 894c4fc50..dac6bb02f 100644 --- a/client/src/pages/filaments/create.tsx +++ b/client/src/pages/filaments/create.tsx @@ -1,7 +1,7 @@ import React from "react"; import { IResourceComponentsProps, useTranslate } from "@refinedev/core"; import { Create, useForm, useSelect } from "@refinedev/antd"; -import { Form, Input, Select, InputNumber, ColorPicker } from "antd"; +import { Form, Input, Select, InputNumber, ColorPicker, Button } from "antd"; import TextArea from "antd/es/input/TextArea"; import { numberFormatter, numberParser } from "../../utils/parsing"; import { IVendor } from "../vendors/model"; @@ -14,7 +14,7 @@ interface CreateOrCloneProps { export const FilamentCreate: React.FC = (props) => { const t = useTranslate(); - const { formProps, saveButtonProps, formLoading } = useForm(); + const { form, formProps, saveButtonProps, formLoading, onFinish, redirect } = useForm(); if (props.mode === "clone" && formProps.initialValues) { // Fix the vendor_id @@ -23,6 +23,12 @@ export const FilamentCreate: React.FC { + let values = await form.validateFields(); + await onFinish(values); + redirect(redirectTo, (values as IFilament).id); + } + const { selectProps } = useSelect({ resource: "vendor", optionLabel: "name", @@ -32,7 +38,12 @@ export const FilamentCreate: React.FC ( + <> + + + + )} >
= () => { const t = useTranslate(); - + const navigate = useNavigate(); const { queryResult } = useShow({ liveMode: "auto", }); @@ -31,17 +31,24 @@ export const FilamentShow: React.FC = () => { return t("filament.titles.show_title", { id: item.id, name: vendorPrefix + item.name }); }; - const formatVendor = (item: IVendor) => { - const URL = `/vendor/show/${item.id}`; - return {item.name}; - }; + const gotoVendor = (): undefined => { + const URL = `/vendor/show/${record?.vendor?.id}`; + navigate(URL); + } + + const gotoSpools = (): undefined => { + const URL = `/spool#filters=[{"field":"filament.id","operator":"in","value":[${record?.id}]}]` + navigate(URL); + } return ( {t("filament.fields.id")} {t("filament.fields.vendor")} - + {t("filament.fields.registered")} = () => { {t("filament.fields.comment")} - + {t("filament.fields.spools")} + + ); }; diff --git a/client/src/pages/spools/create.tsx b/client/src/pages/spools/create.tsx index 79e169029..c905e2855 100644 --- a/client/src/pages/spools/create.tsx +++ b/client/src/pages/spools/create.tsx @@ -1,13 +1,15 @@ -import React, { useState } from "react"; +import React, { useEffect, useState } from "react"; import { IResourceComponentsProps, useTranslate } from "@refinedev/core"; import { Create, useForm, useSelect } from "@refinedev/antd"; -import { Form, Input, DatePicker, Select, InputNumber, Radio, Divider } from "antd"; +import { Form, Input, DatePicker, Select, InputNumber, Radio, Divider, Button } from "antd"; import dayjs from "dayjs"; import TextArea from "antd/es/input/TextArea"; import { IFilament } from "../filaments/model"; import { ISpool } from "./model"; import { numberFormatter, numberParser } from "../../utils/parsing"; import { useSpoolmanLocations } from "../../components/otherModels"; +import { MinusOutlined, PlusOutlined } from "@ant-design/icons"; +import '../../utils/overrides.css' interface CreateOrCloneProps { mode: "create" | "clone"; @@ -16,7 +18,10 @@ interface CreateOrCloneProps { export const SpoolCreate: React.FC = (props) => { const t = useTranslate(); - const { form, formProps, saveButtonProps, formLoading } = useForm(); + const { form, formProps, formLoading, onFinish, redirect } = useForm({ + redirect: false, + warnWhenUnsavedChanges: false + }); if (props.mode === "clone" && formProps.initialValues) { // Clear out the values that we don't want to clone @@ -28,6 +33,18 @@ export const SpoolCreate: React.FC { + let values = await form.validateFields(); + if (quantity > 1) { + let submit = Array(quantity).fill(values); + // queue multiple creates this way for now Refine doesn't seem to map Arrays to createMany or multiple creates like it says it does + submit.forEach(async r => await onFinish(r)); + } else { + await onFinish(values); + } + redirect(redirectTo, (values as ISpool).id); + } + const { queryResult } = useSelect({ resource: "filament", }); @@ -100,11 +117,42 @@ export const SpoolCreate: React.FC { + setQuantity(quantity + 1); + } + + const decrementQty = () => { + setQuantity(quantity - 1); + } + return ( ( + <> +
+ + + + +
+ + + + ) + } > -
+ ); }; diff --git a/client/src/pages/vendors/create.tsx b/client/src/pages/vendors/create.tsx index 3a5de6a36..37caf9f80 100644 --- a/client/src/pages/vendors/create.tsx +++ b/client/src/pages/vendors/create.tsx @@ -1,7 +1,7 @@ import React from "react"; import { IResourceComponentsProps, useTranslate } from "@refinedev/core"; import { Create, useForm } from "@refinedev/antd"; -import { Form, Input } from "antd"; +import { Button, Form, Input } from "antd"; import TextArea from "antd/es/input/TextArea"; import { IVendor } from "./model"; @@ -12,13 +12,24 @@ interface CreateOrCloneProps { export const VendorCreate: React.FC = (props) => { const t = useTranslate(); - const { formProps, saveButtonProps, formLoading } = useForm(); + const { form, formProps, saveButtonProps, formLoading, onFinish, redirect } = useForm(); + + const handleSubmit = async (redirectTo: "list" | "edit" | "create") => { + let values = await form.validateFields(); + await onFinish(values); + redirect(redirectTo, (values as IVendor).id); + } return ( ( + <> + + + + )} >
0) { if (isLocalStorageAvailable) { localStorage.setItem(`${tableId}-filters`, JSON.stringify(filters)); - setURLHash("filters", JSON.stringify(state.filters)); + setURLHash("filters", JSON.stringify(filters)); } } else { localStorage.removeItem(`${tableId}-filters`);