import type { Meta, StoryObj } from '@storybook/html'; import { DataView, type DataViewOptions, DATA_VIEW_ROW_ACTION_EVENT } from '@42/core/data-view'; import '@42/styles/data-view.css'; const PEOPLE = [ { name: 'Charlie', age: 30 }, { name: 'Alice', age: 25 }, { name: 'Bob', age: 40 }, { name: 'Dave', age: 20 }, { name: 'Eve', age: 35 }, { name: 'Frank', age: 28 }, ]; const meta: Meta = { title: 'Core/Data & Collections/DataView', tags: ['autodocs'], argTypes: { pageSize: { control: { type: 'number', min: 1, max: 10 } }, defaultSort: { control: 'text' }, defaultQuery: { control: 'text' }, }, args: { pageSize: 3 }, render: (args) => { const root = document.createElement('div'); root.dataset.c42Dataview = ''; const rows = PEOPLE.map( (p) => ` ${p.name} ${p.age} `, ).join(''); root.innerHTML = `
${rows}
Actions
/
`; const dv = new DataView(root, args); dv.on(DATA_VIEW_ROW_ACTION_EVENT, (e: Event) => { const { action, rowIndex } = (e as CustomEvent).detail; // eslint-disable-next-line no-console console.log(`Action "${action}" on row ${rowIndex}`); }); return root; }, }; export default meta; type Story = StoryObj; export const Default: Story = {}; export const SortedByAge: Story = { args: { defaultSort: 'age:asc' } }; /** Simulates async data loading with a 1.5s delay. */ export const AsyncLoading: Story = { render: (args) => { const root = document.createElement('div'); root.dataset.c42Dataview = ''; root.innerHTML = `
Loading data...
NameAge
/
`; const dv = new DataView(root, { ...args, loading: true }); // Simulate async load setTimeout(() => { const tbody = root.querySelector('[data-c42-dataview-rows]')!; tbody.innerHTML = PEOPLE.map( (p) => ` ${p.name}${p.age} `, ).join(''); dv.setLoading(false); }, 1500); return root; }, };