feat: meta pin

This commit is contained in:
ss707494
2024-03-08 12:20:42 +08:00
parent f70950647e
commit da74f715f6
5 changed files with 108 additions and 10 deletions
@@ -10,13 +10,18 @@ import {
import { FormItemComponent } from "../FormItem/FormItemComponent.tsx";
import { MetaData } from "../../utils.ts";
import { FormItem } from "../FormItem/types.ts";
import { isInTopField, TopFieldType } from "../MetaBox/MetaBox.tsx";
export default function AllPromptForm({
metaData,
updateMetaData,
topFields,
updateTopField,
}: {
metaData: MetaData;
topFields: TopFieldType[];
updateMetaData: FormItem["updateMetaData"];
updateTopField?: (field: TopFieldType) => void;
}) {
const prompt = metaData.prompt;
return (
@@ -25,7 +30,12 @@ export default function AllPromptForm({
const promptElement = prompt[promptKey];
const promptInputs = promptElement.inputs;
const inputsKeyList = Object.keys(promptInputs).filter(
(v) => !Array.isArray(promptInputs[v]),
(v) =>
!Array.isArray(promptInputs[v]) &&
!isInTopField(topFields, {
name: v,
promptKey: promptKey,
}),
);
if (inputsKeyList.length === 0) return null;
return (
@@ -45,6 +55,14 @@ export default function AllPromptForm({
<Flex px={2} gap={1} direction={"column"}>
{inputsKeyList?.map((inputsKey) => {
const value = promptInputs[inputsKey];
if (
isInTopField(topFields, {
name: inputsKey,
promptKey,
})
) {
return null;
}
return (
<FormItemComponent
key={`form${inputsKey}`}
@@ -53,6 +71,8 @@ export default function AllPromptForm({
value={value}
name={inputsKey}
updateMetaData={updateMetaData}
updateTopField={updateTopField}
topFields={topFields}
metaData={metaData}
/>
);
@@ -7,6 +7,9 @@ import { FormItem, FormItemType } from "./types.ts";
import { getNodesInfo } from "../../utils.ts";
import { NoSupport } from "./NoSupport.tsx";
import { CheckboxBase } from "./CheckboxBase.tsx";
import { Flex, Grid, IconButton } from "@chakra-ui/react";
import { IconPin, IconPinFilled } from "@tabler/icons-react";
import { isInTopField } from "../MetaBox/MetaBox.tsx";
const INPUT_TYPE_COMPONENT_MAPPING = {
[FormItemType.Input]: InputBase,
@@ -69,5 +72,32 @@ function getInputConfigByInfo(props: FormItem): Partial<FormItem> {
export const FormItemComponent: FC<FormItem> = (props) => {
const configByNodeInfo = getInputConfigByInfo(props);
const Com = INPUT_TYPE_COMPONENT_MAPPING[configByNodeInfo.type ?? "Input"];
return <Com {...props} {...configByNodeInfo} />;
return (
<Grid templateColumns={"max-content 1fr"} gap={1}>
<Flex>
<IconButton
onClick={() =>
props?.updateTopField?.({
name: props.name,
promptKey: props.promptKey,
class_type: props.classType,
})
}
variant={"text"}
icon={
isInTopField(props.topFields, {
name: props.name,
promptKey: props.promptKey,
}) ? (
<IconPinFilled />
) : (
<IconPin />
)
}
aria-label={"pin"}
/>
</Flex>
<Com {...props} {...configByNodeInfo} />
</Grid>
);
};
+5 -1
View File
@@ -1,3 +1,5 @@
import { TopFieldType } from "../MetaBox/MetaBox.tsx";
export enum FormItemType {
Input = "Input",
InputSlider = "InputSlider",
@@ -14,7 +16,9 @@ export type FormItem = {
value: string | number;
onChange?: (val: any) => void;
classType: string;
promptKey: string;
promptKey: string | number;
topFields: TopFieldType[];
updateTopField?: (field: TopFieldType) => void;
updateMetaData?: (data: {
promptKey: string;
name: string;
+42 -4
View File
@@ -4,12 +4,14 @@ import { Media } from "../../../types/dbTypes.ts";
import TopForm from "../TopForm/TopForm.tsx";
import AllPromptForm from "../AllPromptForm/AllPromptForm.tsx";
import { useState } from "react";
import { FormItem } from "../FormItem/types.ts";
export const DEFAULT_TOP_FIELDS: {
export type TopFieldType = {
promptKey: string | number;
class_type?: string;
name: string;
}[] = [
};
export const DEFAULT_TOP_FIELDS: TopFieldType[] = [
{
promptKey: "4",
name: "ckpt_name",
@@ -43,6 +45,14 @@ export const DEFAULT_TOP_FIELDS: {
name: "cfg",
},
];
export const isInTopField = (
topFields: TopFieldType[],
item: Pick<FormItem, "name" | "promptKey">,
) => {
return topFields?.some(
(top) => top.promptKey === item?.promptKey && top.name === item?.name,
);
};
export default function MetaBox({
metaData: oriMetaData,
@@ -50,6 +60,7 @@ export default function MetaBox({
metaData: MetaData;
media: Media;
}) {
const [topFields, setTopFields] = useState(DEFAULT_TOP_FIELDS);
const [metaData, setMetaData] = useState<MetaData>(
JSON.parse(JSON.stringify(oriMetaData)),
);
@@ -77,10 +88,37 @@ export default function MetaBox({
}));
};
const updateTopField = (field: TopFieldType) => {
if (
isInTopField(topFields, {
name: field.name,
promptKey: field?.promptKey,
})
) {
setTopFields((pre) =>
pre.filter(
(v) => v.name !== field.name || v.promptKey !== field.promptKey,
),
);
} else {
setTopFields((pre) => [...pre, field]);
}
};
return (
<Flex direction={"column"} align={"stretch"}>
<TopForm metaData={metaData} updateMetaData={updateMetaData} />
<AllPromptForm metaData={metaData} updateMetaData={updateMetaData} />
<TopForm
topFields={topFields}
metaData={metaData}
updateMetaData={updateMetaData}
updateTopField={updateTopField}
/>
<AllPromptForm
topFields={topFields}
metaData={metaData}
updateMetaData={updateMetaData}
updateTopField={updateTopField}
/>
</Flex>
);
}
@@ -1,5 +1,5 @@
import { MetaData } from "../../utils.ts";
import { DEFAULT_TOP_FIELDS } from "../MetaBox/MetaBox.tsx";
import { TopFieldType } from "../MetaBox/MetaBox.tsx";
import { Flex } from "@chakra-ui/react";
import { FormItemComponent } from "../FormItem/FormItemComponent.tsx";
import { FormItem } from "../FormItem/types.ts";
@@ -7,16 +7,20 @@ import { FormItem } from "../FormItem/types.ts";
export default function TopForm({
metaData,
updateMetaData,
topFields,
updateTopField,
}: {
metaData: MetaData;
topFields: TopFieldType[];
updateMetaData: FormItem["updateMetaData"];
updateTopField?: (field: TopFieldType) => void;
}) {
const prompt = metaData.prompt;
return (
<>
{DEFAULT_TOP_FIELDS?.length > 0 && (
{topFields?.length > 0 && (
<Flex px={2} gap={2} direction={"column"}>
{DEFAULT_TOP_FIELDS?.map((field) => {
{topFields?.map((field) => {
if (!prompt?.[field.promptKey]?.inputs) return null;
const promptValue = prompt?.[field.promptKey]?.inputs?.[field.name];
return (
@@ -27,6 +31,8 @@ export default function TopForm({
name={field.name}
value={promptValue}
updateMetaData={updateMetaData}
updateTopField={updateTopField}
topFields={topFields}
/>
);
})}