import type { Meta, StoryObj } from "@storybook/react";
import {
AutocompleteInput,
ReferenceInput,
required,
SimpleForm,
useRecordContext,
} from "react-admin";
import { ResourceContextHelper } from "../../../../utils";
import { attributeName, resourceName } from "../../../../ideExtension";
import { replaceOnGenerate, topLevel } from "@amplicode/storybook-extensions";
import { useFormContext } from "react-hook-form";
import React, { useEffect } from "react";
import {
adminContextDecorator,
listDecorator,
shadowArgsDecorator,
} from "../inputDecorators";
const resourceContextHeleprDecorator = (Story: () => React.JSX.Element) => {
return (
<>{Story()}>
);
};
const meta = {
title: "Inputs/ReferenceInput",
component: ReferenceInput,
parameters: {
// layout: "centered",
controls: {
exclude: [
"source",
"reference",
"filter",
"label",
"page",
"perPage",
"queryOptions",
"sort",
],
},
},
decorators: [
listDecorator,
resourceContextHeleprDecorator,
adminContextDecorator,
shadowArgsDecorator,
],
args: {
source: "department_id",
reference: "departments",
},
argTypes: {
source: {
control: "text",
},
reference: {
control: "text",
},
filter: {
control: "text",
},
label: {
control: "text",
},
page: {
control: "number",
},
perPage: {
control: "number",
},
queryOptions: {
control: "text",
},
sort: {
control: "text",
},
},
} satisfies Meta;
export default meta;
type Story = StoryObj;
export const Default: Story = {
render: () => {
return (
);
},
};
export const Readonly: Story = {
render: () => {
return (
);
},
};
export const Validated: Story = {
render: () => {
return (
);
},
};
export const ReadonlyForPredefinedValue: Story = {
name: "Readonly for predefined attribute",
render: ({ subresourceName, subresourceBackReference }) => {
const ReadonlyReferenceInput = topLevel(() => {
const record = useRecordContext();
const readOnly =
record != null &&
subresourceBackReference in record &&
record[subresourceBackReference] != null;
return (
);
});
return ;
},
args: {
subresourceName: resourceName("departments", {
title: "Child Resource",
resourceId: "subresource",
allowContext: false,
}),
subresourceBackReference: attributeName("department_id", {
resourceId: "resource",
attributeSelectTitle: "Child Resource Reference Attribute",
}),
},
};
export const FiltrationByParentField: Story = {
render: ({ parentId, attributeId }) => {
const DependentInput = topLevel(() => {
const { watch, resetField } = useFormContext();
const parentIdValue = watch(parentId, null);
const filter = parentIdValue
? replaceOnGenerate(
{ user_id: parentIdValue },
{ parentId: parentIdValue }
)
: {};
useEffect(() => {
resetField(attributeId);
}, [parentIdValue, resetField]);
return (
);
});
return ;
},
args: {
parentId: replaceOnGenerate("user_id", "parentId"),
attributeId: replaceOnGenerate("task_id", "childId"),
},
decorators: [
(Story) => {
return (
{
// alert("Task id: " + data.task_id);
// }}
toolbar={false}
>
);
},
],
};