Updated vendor API to correct issues - Implement new UI
This commit is contained in:
@@ -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",
|
||||||
|
|||||||
18
client/src/pages/vendors/create.tsx
vendored
18
client/src/pages/vendors/create.tsx
vendored
@@ -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} />
|
||||||
|
|||||||
18
client/src/pages/vendors/edit.tsx
vendored
18
client/src/pages/vendors/edit.tsx
vendored
@@ -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} />
|
||||||
|
|||||||
13
client/src/pages/vendors/list.tsx
vendored
13
client/src/pages/vendors/list.tsx
vendored
@@ -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({
|
||||||
|
|||||||
1
client/src/pages/vendors/model.tsx
vendored
1
client/src/pages/vendors/model.tsx
vendored
@@ -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 };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
2
client/src/pages/vendors/show.tsx
vendored
2
client/src/pages/vendors/show.tsx
vendored
@@ -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]} />
|
||||||
|
|||||||
@@ -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},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user