Updated vendor API to correct issues - Implement new UI

This commit is contained in:
Matt Gerega
2024-03-26 21:26:41 -04:00
parent e68f88da2a
commit 3aed735cea
9 changed files with 62 additions and 9 deletions

View File

@@ -227,9 +227,13 @@
"fields": { "fields": {
"id": "ID", "id": "ID",
"name": "Name", "name": "Name",
"empty_spool_weight": "Empty Spool Weight",
"registered": "Registered", "registered": "Registered",
"comment": "Comment" "comment": "Comment"
}, },
"fields_help": {
"empty_spool_weight": "The weight of an empty spool from this vendor."
},
"titles": { "titles": {
"create": "Create Vendor", "create": "Create Vendor",
"clone": "Clone Vendor", "clone": "Clone Vendor",

View File

@@ -1,7 +1,7 @@
import React from "react"; import React from "react";
import { HttpError, IResourceComponentsProps, useTranslate } from "@refinedev/core"; import { HttpError, IResourceComponentsProps, useTranslate } from "@refinedev/core";
import { Create, useForm } from "@refinedev/antd"; import { Create, useForm } from "@refinedev/antd";
import { Button, Form, Input, Typography } from "antd"; import { Button, Form, Input, Typography, InputNumber } from "antd";
import TextArea from "antd/es/input/TextArea"; import TextArea from "antd/es/input/TextArea";
import { IVendor, IVendorParsedExtras } from "./model"; import { IVendor, IVendorParsedExtras } from "./model";
import { EntityType, useGetFields } from "../../utils/queryFields"; import { EntityType, useGetFields } from "../../utils/queryFields";
@@ -85,6 +85,22 @@ export const VendorCreate: React.FC<IResourceComponentsProps & CreateOrCloneProp
> >
<TextArea maxLength={1024} /> <TextArea maxLength={1024} />
</Form.Item> </Form.Item>
<Form.Item
label={t("vendor.fields.empty_spool_weight")}
help={t("vendor.fields_help.empty_spool_weight")}
name={["empty_spool_weight"]}
rules={[
{
required: false,
type: "number",
min: 0,
},
]}
>
<InputNumber
addonAfter="g"
precision={1}/>
</Form.Item>
<Typography.Title level={5}>{t("settings.extra_fields.tab")}</Typography.Title> <Typography.Title level={5}>{t("settings.extra_fields.tab")}</Typography.Title>
{extraFields.data?.map((field, index) => ( {extraFields.data?.map((field, index) => (
<ExtraFieldFormItem key={index} field={field} /> <ExtraFieldFormItem key={index} field={field} />

View File

@@ -1,7 +1,7 @@
import React, { useState } from "react"; import React, { useState } from "react";
import { HttpError, IResourceComponentsProps, useTranslate } from "@refinedev/core"; import { HttpError, IResourceComponentsProps, useTranslate } from "@refinedev/core";
import { Edit, useForm } from "@refinedev/antd"; import { Edit, useForm } from "@refinedev/antd";
import { Form, Input, DatePicker, message, Alert, Typography } from "antd"; import { Form, Input, DatePicker, message, Alert, Typography, InputNumber } from "antd";
import dayjs from "dayjs"; import dayjs from "dayjs";
import TextArea from "antd/es/input/TextArea"; import TextArea from "antd/es/input/TextArea";
import { IVendor, IVendorParsedExtras } from "./model"; import { IVendor, IVendorParsedExtras } from "./model";
@@ -100,6 +100,22 @@ export const VendorEdit: React.FC<IResourceComponentsProps> = () => {
> >
<TextArea maxLength={1024} /> <TextArea maxLength={1024} />
</Form.Item> </Form.Item>
<Form.Item
label={t("vendor.fields.empty_spool_weight")}
help={t("vendor.fields_help.empty_spool_weight")}
name={["empty_spool_weight"]}
rules={[
{
required: false,
type: "number",
min: 0,
},
]}
>
<InputNumber
addonAfter="g"
precision={1}/>
</Form.Item>
<Typography.Title level={5}>{t("settings.extra_fields.tab")}</Typography.Title> <Typography.Title level={5}>{t("settings.extra_fields.tab")}</Typography.Title>
{extraFields.data?.map((field, index) => ( {extraFields.data?.map((field, index) => (
<ExtraFieldFormItem key={index} field={field} /> <ExtraFieldFormItem key={index} field={field} />

View File

@@ -7,7 +7,7 @@ import utc from "dayjs/plugin/utc";
import { IVendor } from "./model"; import { IVendor } from "./model";
import { TableState, useInitialTableState, useStoreInitialState } from "../../utils/saveload"; import { TableState, useInitialTableState, useStoreInitialState } from "../../utils/saveload";
import { EditOutlined, EyeOutlined, FilterOutlined, PlusSquareOutlined } from "@ant-design/icons"; import { EditOutlined, EyeOutlined, FilterOutlined, PlusSquareOutlined } from "@ant-design/icons";
import { DateColumn, RichColumn, SortedColumn, ActionsColumn, CustomFieldColumn } from "../../components/column"; import { DateColumn, RichColumn, SortedColumn, ActionsColumn, CustomFieldColumn, NumberColumn } from "../../components/column";
import { useLiveify } from "../../components/liveify"; import { useLiveify } from "../../components/liveify";
import { removeUndefined } from "../../utils/filtering"; import { removeUndefined } from "../../utils/filtering";
import { EntityType, useGetFields } from "../../utils/queryFields"; import { EntityType, useGetFields } from "../../utils/queryFields";
@@ -17,7 +17,7 @@ dayjs.extend(utc);
const namespace = "vendorList-v2"; const namespace = "vendorList-v2";
const allColumns: (keyof IVendor & string)[] = ["id", "name", "registered", "comment"]; const allColumns: (keyof IVendor & string)[] = ["id", "name", "registered", "comment", "empty_spool_weight"];
export const VendorList: React.FC<IResourceComponentsProps> = () => { export const VendorList: React.FC<IResourceComponentsProps> = () => {
const t = useTranslate(); const t = useTranslate();
@@ -171,6 +171,15 @@ export const VendorList: React.FC<IResourceComponentsProps> = () => {
...commonProps, ...commonProps,
id: "registered", id: "registered",
i18ncat: "vendor", i18ncat: "vendor",
width: 200,
}),
NumberColumn({
...commonProps,
id: "empty_spool_weight",
i18ncat: "vendor",
unit: "g",
maxDecimals: 0,
width: 200,
}), }),
...(extraFields.data?.map((field) => { ...(extraFields.data?.map((field) => {
return CustomFieldColumn({ return CustomFieldColumn({

View File

@@ -3,6 +3,7 @@ export interface IVendor {
registered: string; registered: string;
name: string; name: string;
comment?: string; comment?: string;
empty_spool_weight?: number;
extra: { [key: string]: string }; extra: { [key: string]: string };
} }

View File

@@ -42,6 +42,8 @@ export const VendorShow: React.FC<IResourceComponentsProps> = () => {
<TextField value={record?.name} /> <TextField value={record?.name} />
<Title level={5}>{t("vendor.fields.comment")}</Title> <Title level={5}>{t("vendor.fields.comment")}</Title>
<TextField value={enrichText(record?.comment)} /> <TextField value={enrichText(record?.comment)} />
<Title level={5}>{t("vendor.fields.empty_spool_weight")}</Title>
<TextField value={record?.empty_spool_weight} />
<Title level={4}>{t("settings.extra_fields.tab")}</Title> <Title level={4}>{t("settings.extra_fields.tab")}</Title>
{extraFields?.data?.map((field, index) => ( {extraFields?.data?.map((field, index) => (
<ExtraFieldDisplay key={index} field={field} value={record?.extra[field.key]} /> <ExtraFieldDisplay key={index} field={field} value={record?.extra[field.key]} />

View File

@@ -60,6 +60,7 @@ class Vendor(BaseModel):
registered: datetime = Field(description="When the vendor was registered in the database. UTC Timezone.") registered: datetime = Field(description="When the vendor was registered in the database. UTC Timezone.")
name: str = Field(max_length=64, description="Vendor name.", example="Polymaker") name: str = Field(max_length=64, description="Vendor name.", example="Polymaker")
comment: Optional[str] = Field(max_length=1024, description="Free text comment about this vendor.", example="") comment: Optional[str] = Field(max_length=1024, description="Free text comment about this vendor.", example="")
empty_spool_weight: Optional[float] = Field(gt=0, description="The empty spool weight, in grams.", example=140)
extra: dict[str, str] = Field( extra: dict[str, str] = Field(
description=( description=(
"Extra fields for this vendor. All values are JSON-encoded data. " "Extra fields for this vendor. All values are JSON-encoded data. "
@@ -75,6 +76,7 @@ class Vendor(BaseModel):
registered=item.registered, registered=item.registered,
name=item.name, name=item.name,
comment=item.comment, comment=item.comment,
empty_spool_weight=item.empty_spool_weight,
extra={field.key: field.value for field in item.extra}, extra={field.key: field.value for field in item.extra},
) )

View File

@@ -33,6 +33,11 @@ class VendorParameters(BaseModel):
description="Free text comment about this vendor.", description="Free text comment about this vendor.",
example="", example="",
) )
empty_spool_weight: Optional[float] = Field(
ge=0,
description="The weight of an empty spool.",
example=200,
)
extra: Optional[dict[str, str]] = Field( extra: Optional[dict[str, str]] = Field(
None, None,
description="Extra fields for this vendor.", description="Extra fields for this vendor.",
@@ -41,11 +46,6 @@ class VendorParameters(BaseModel):
class VendorUpdateParameters(VendorParameters): class VendorUpdateParameters(VendorParameters):
name: Optional[str] = Field(max_length=64, description="Vendor name.", example="Polymaker") name: Optional[str] = Field(max_length=64, description="Vendor name.", example="Polymaker")
comment: Optional[str] = Field(
max_length=1024,
description="Free text comment about this vendor.",
example="",
)
@router.get( @router.get(
@@ -190,6 +190,7 @@ async def create( # noqa: ANN201
db=db, db=db,
name=body.name, name=body.name,
comment=body.comment, comment=body.comment,
empty_spool_weight=body.empty_spool_weight,
extra=body.extra, extra=body.extra,
) )

View File

@@ -19,6 +19,7 @@ async def create(
db: AsyncSession, db: AsyncSession,
name: Optional[str] = None, name: Optional[str] = None,
comment: Optional[str] = None, comment: Optional[str] = None,
empty_spool_weight: Optional[float] = None,
extra: Optional[dict[str, str]] = None, extra: Optional[dict[str, str]] = None,
) -> models.Vendor: ) -> models.Vendor:
"""Add a new vendor to the database.""" """Add a new vendor to the database."""
@@ -26,6 +27,7 @@ async def create(
name=name, name=name,
registered=datetime.utcnow().replace(microsecond=0), registered=datetime.utcnow().replace(microsecond=0),
comment=comment, comment=comment,
empty_spool_weight=empty_spool_weight,
extra=[models.VendorField(key=k, value=v) for k, v in (extra or {}).items()], extra=[models.VendorField(key=k, value=v) for k, v in (extra or {}).items()],
) )
db.add(vendor) db.add(vendor)