wix-style-react
Version:
312 lines (287 loc) • 8.68 kB
JavaScript
export const _size = `
<StorybookComponents.Stack flexDirection="column">
<Search size="large" placeholder="Large"/>
<Search size="medium" placeholder="Medium"/>
<Search size="small" placeholder="Small"/>
</StorybookComponents.Stack>
`;
export const _border = `
<StorybookComponents.Stack flexDirection="column">
<Search border="round" placeholder="Search..." />
<Search border="standard" placeholder="Search..." />
<Search border="bottomLine" placeholder="Search..." />
</StorybookComponents.Stack>;
`;
export const _status = `
<StorybookComponents.Stack flexDirection="column">
<Search status="loading" placeholder="Search..." />
<Search status="error" placeholder="Search..." />
<Search status="warning" placeholder="Search..." />
</StorybookComponents.Stack>;
`;
export const _statusMessage = `
<Search
status="loading"
placeholder="Hover the mouse on the loader..."
statusMessage="Message explaining the status"
/>;
`;
export const _readOnlyAndDisabled = `
<StorybookComponents.Stack flexDirection="column">
<Search readOnly value="Read only"/>
<Search disabled value="Disabled"/>
</StorybookComponents.Stack>
`;
export const _clearButton = `
() => {
const [inputText, setInputText] = React.useState(
'Click clear button to erase this value',
);
return (
<Search
value={inputText}
clearButton
onChange={e => setInputText(e.target.value)}
onClear={() => setInputText('')}
/>
);
};
`;
export const _options = `() => {
const [text, setText] = React.useState('');
const options = [
{ value: 'Option 1', id: 0 },
{ value: 'Option 2', id: 1 },
{ value: 'Option 3', id: 2 },
{ value: 'Option 4', id: 3 },
{ value: 'Option 5', id: 4 },
];
return (
<Search
value={text}
onChange={e => setText(e.target.value)}
onClear={() => setText('')}
options={options}
predicate={option => option.value.indexOf(text) !== -1}
/>
);
};
`;
export const _optionsContainerDimensions = `
() => {
const [text, setText] = React.useState('');
const options = [
{ value: 'Option 1', id: 0 },
{ value: 'Option 2', id: 1 },
{ value: 'Option 3', id: 2 },
{ value: 'Option 4', id: 3 },
{ value: 'Option 5', id: 4 },
];
return (
<StorybookComponents.Stack>
<Search
value={text}
clearButton={true}
onChange={e => setText(e.target.value)}
onClear={() => setText('')}
options={options}
maxHeightPixels="160px"
minWidthPixels="300px"
dropdownWidth="auto"
popoverProps={{
placement: 'bottom-start',
}}
/>
</StorybookComponents.Stack>
);
};
`;
export const _expandable = `
<StorybookComponents.Stack flexDirection="column">
<Search expandable />
<Search expandable expandWidth="400px" />
</StorybookComponents.Stack>;
`;
export const _debounce = `() => {
const [textInstant, setTextInstant] = React.useState('');
const [textDelayed, setTextDelayed] = React.useState('');
return (
<StorybookComponents.Stack flexDirection="column">
<StorybookComponents.Stack flexDirection="column" gap="12px">
<Search
placeholder="Search for instant results..."
value={textInstant}
onChange={e => setTextInstant(e.target.value)}
onClear={() => setTextInstant('')}
/>
<StorybookComponents.Stack>
Results for:
<Text size="tiny" weight="bold" skin="primary">
{textInstant}
</Text>
</StorybookComponents.Stack>
</StorybookComponents.Stack>
<StorybookComponents.Stack flexDirection="column" gap="12px">
<Search
placeholder="Search for delayed results..."
debounceMs={250}
value={textDelayed}
onChange={e => setTextDelayed(e.target.value)}
onClear={() => setTextDelayed('')}
/>
<StorybookComponents.Stack>
Results for:
<Text size="tiny" weight="bold" skin="primary">
{textDelayed}
</Text>
</StorybookComponents.Stack>
</StorybookComponents.Stack>
</StorybookComponents.Stack>
);
};
`;
export const _filteringTheList = `
() => {
const [filterBy, setFilterBy] = React.useState('');
const [activeSearch, setActiveSearch] = React.useState('');
const records = [
{
name: 'Red Slippers',
sku: 25232564,
status: 'In Stock',
price: '$14.00',
},
{ name: 'Velvet Hat', sku: 35246432, status: 'In Stock', price: '$29.00' },
{
name: 'Silver Jeans',
sku: 4864310,
status: 'Out Of Stock',
price: '$69.00',
},
{
name: 'Orange Socks',
sku: 125156422,
status: 'In Stock',
price: '$7.00',
},
];
const columns = [
{ title: 'Name', render: row => row.name },
{ title: 'SKU', render: row => row.sku },
{ title: 'Status', render: row => row.status },
{ title: 'Status', render: row => row.price },
];
const filterOptions = [
{ id: '', value: 'All Statuses' },
{ id: 'In Stock', value: 'In Stock' },
{ id: 'Out Of Stock', value: 'Out Of Stock' },
];
const getFilteredData = () =>
records.filter(({ name, sku, status, price }) => {
if (filterBy && status !== filterBy) {
return false;
}
const searchData = [name, sku, status, price].join(' ').toLowerCase();
const searchQuery = activeSearch.trim().toLowerCase();
if (searchQuery && searchData.indexOf(searchQuery) === -1) {
return false;
}
return true;
});
const MainToolbar = () => {
return (
<TableToolbar>
<TableToolbar.ItemGroup position="start">
<TableToolbar.Item>
<TableToolbar.Title>My Table</TableToolbar.Title>
</TableToolbar.Item>
</TableToolbar.ItemGroup>
<TableToolbar.ItemGroup position="end">
<TableToolbar.Item>
<TableToolbar.Label>
Filter by
<Box width="175">
<Dropdown
options={filterOptions}
selectedId={filterBy}
roundInput
onSelect={({ id }) => setFilterBy(id)}
/>
</Box>
</TableToolbar.Label>
</TableToolbar.Item>
<TableToolbar.Item>
<Box width="200">
<Search
value={activeSearch}
onChange={e => setActiveSearch(e.target.value)}
onClear={() => setActiveSearch('')}
/>
</Box>
</TableToolbar.Item>
</TableToolbar.ItemGroup>
</TableToolbar>
);
};
const ActionsToolbar = ({ selectedCount, getSelectedIds }) => (
<TableToolbar>
<TableToolbar.ItemGroup position="start">
<TableToolbar.Item>
<TableToolbar.SelectedCount>{\`\${selectedCount} Selected\`}</TableToolbar.SelectedCount>
</TableToolbar.Item>
</TableToolbar.ItemGroup>
<TableToolbar.ItemGroup position="end">
<TableToolbar.Item layout="button">
<Button skin="light" prefixIcon={<Icons.Upload />}>
Export
</Button>
</TableToolbar.Item>
<TableToolbar.Item layout="button">
<Button skin="light" prefixIcon={<Icons.Duplicate />}>
Duplicate
</Button>
</TableToolbar.Item>
<TableToolbar.Item layout="button">
<Button skin="light" prefixIcon={<Icons.Edit />}>
Edit
</Button>
</TableToolbar.Item>
<TableToolbar.Divider />
<TableToolbar.Item>
<Search
expandable
value={activeSearch}
onChange={e => setActiveSearch(e.target.value)}
/>
</TableToolbar.Item>
</TableToolbar.ItemGroup>
</TableToolbar>
);
return (
<Card>
<Table showSelection data={getFilteredData()} columns={columns}>
<Table.ToolbarContainer>
{selectionContext =>
selectionContext.selectedCount === 0
? MainToolbar()
: ActionsToolbar({ ...selectionContext })
}
</Table.ToolbarContainer>
<Box minHeight="282px">
<Table.Content />
{!records.length && (
<Table.EmptyState
subtitle={
<Text>
{'There are no search results matching '}
<Text weight="normal">{\`"\${activeSearch}"\`}</Text>
</Text>
}
/>
)}
</Box>
</Table>
</Card>
);
};
`;