import { StoryObj } from '@storybook/react-vite';
import { MantineThemeDecorator } from '../../docs/MantineThemeDecorator';
import { ArrayOptions } from './ArrayWidget';
import { UseEditorOptions, useEditor, Widget } from '@sagold/react-json-editor';
import { expect } from 'storybook/test';
type WidgetProps = ArrayOptions & { editorProps: UseEditorOptions };
function WidgetForm({ editorProps, ...props }: WidgetProps) {
const editor = useEditor(editorProps);
return ;
}
export default {
title: 'packages/rje-mantine-widgets/widgets/ArrayWidget',
component: WidgetForm,
decorators: [MantineThemeDecorator]
};
type Story = StoryObj;
export const Options: Story = {
argTypes: {
collapsed: {
control: 'radio',
options: [null, true, false]
}
},
args: {
// ----------------
// DEFAULT OPTIONS
// ----------------
/** additional classnames the ui should add to the root of this data point */
classNames: ['my-array'],
/** description of this data point */
description:
'Options from these control settings can be passed to options-object in `{ type: "array", options: {} }`',
/** set to true to inline description */
descriptionInline: false,
/** if changes to this data point are disabled */
disabled: false,
/** title of this data point */
title: 'Array Widget Options',
/** disable edit of form, but allow selection and copy of value */
readOnly: false,
/** flag titel as required */
required: false,
// ----------------
// ARRAY OPTIONS
// ----------------
/** set to { enabled: true } for dragndrop */
sortable: {
enabled: true
},
/** set to true to show inline button at the end of the array to add another item */
showInlineAddAction: true,
/** set to false to deactivate header menu */
showHeaderMenu: true,
/** set to false to deactivate array item-controls */
showItemControls: true,
/** if set, will add an accordion in the given toggle state */
collapsed: false,
/** if set, will add an edit-json action to edit, copy and paste json-data for this location */
showEditJsonAction: true,
/** if true will add a separator line to the header */
showTitleDivider: true,
/** mantine Title props */
titleProps: {
order: 3
},
dividerProps: {
labelPosition: 'left'
},
editorProps: {
validate: true,
data: [{ title: 'Overview of array options' }],
schema: {
$schema: 'draft-2020-12',
title: 'Array Widget Options',
type: 'array',
items: {
oneOf: [
{
title: 'Header',
type: 'object',
required: ['title'],
options: { showEditJsonAction: true },
properties: {
title: { type: 'string' }
}
},
{
title: 'Paragraph',
type: 'object',
required: ['paragraph'],
options: { showEditJsonAction: true },
properties: {
paragraph: { type: 'string', 'x-widget': 'textarea' }
}
},
{
title: 'Quote',
type: 'string'
},
{
title: 'Number',
options: { showHeader: false },
type: 'number'
}
]
}
}
}
}
};
export const MinItems: Story = {
args: {
editorProps: {
schema: {
$schema: 'draft-2020-12',
type: 'array',
minItems: 1,
prefixItems: [
{
title: 'title-label',
type: 'string',
default: 'default title'
},
{
title: 'description-label',
type: 'string',
default: 'default description'
}
]
}
}
},
play: async function TestArrayWidget({ canvas /*, userEvent*/ }) {
const first = await canvas.findByLabelText('title-label');
expect(first, 'should have initially rendered first element').toBeInTheDocument();
const second = await canvas.findByLabelText('description-label');
expect(second, 'should have initially rendered second element').toBeInTheDocument();
// const arrayMenu = await canvas.findByRole('button', { name: 'array-menu' });
// expect(arrayMenu, 'should have actions disabled').toBeDisabled();
}
};