> ## Documentation Index
> Fetch the complete documentation index at: https://quill.co/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# ReportBuilder

> A UI component for creating and editing Quill Reports

```tsx App.tsx theme={null}
import { QuillProvider, ReportBuilder } from "@quillsql/react";

function App() {
  return (
    <QuillProvider
      tenants={[{ tenantField: "customer_id", tenantIds: [2] }]}
      publicKey={process.env.QUILL_PUBLIC_KEY}
    >
      <ReportBuilder initialTableName="transactions" />
    </QuillProvider>
  );
}
```

Allows non-technical users to build SQL queries using either UI or AI and
then edit them on the fly. Once users have constructed a query they like,
they can click a button and add that report to their dashboard or export it
as a CSV.

<Info>
  Make sure `QuillProvider` is a parent of the `ReportBuilder` component.
</Info>

## Examples

<Tabs>
  <Tab title="Ant Design">
    [![Edit \[Ant Design\] Quill React Components](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/p/devbox/ant-design-quill-react-components-9qcs8k?embed=1)

    ```tsx Ant Design theme={null}
    import { ReportBuilder } from "@quillsql/react";

    import {
      AntButton,
      AntDeleteButton,
      AntSecondaryButton,
    } from "./ui/ant/Button";
    import { AntCard } from "./ui/ant/Card";
    import { AntCheckbox } from "./ui/ant/Checkbox";
    import {
      AntSelectColumn,
      AntDraggableColumn,
      AntColumnSearchEmptyState,
    } from "./ui/ant/Column";
    import { AntTextInput } from "./ui/ant/Input";
    import {
      AntChartBuilderFormContainer,
      AntChartBuilderInputColumnContainer,
      AntChartBuilderInputRowContainer,
      AntContainer,
      AntErrorMessageComponent,
      AntLoadingComponent,
      AntPivotColumnContainer,
      AntPivotRowContainer,
      AntSidebar,
    } from "./ui/ant/Layout";
    import { AntModal } from "./ui/ant/Modal";
    import {
      AntPopover,
      AntFilterPopover,
      AntSortPopover,
      AntLimitPopover,
    } from "./ui/ant/Popover";
    import { AntSelect } from "./ui/ant/Select";
    import { AntTable } from "./ui/ant/Table";
    import { AntTabs } from "./ui/ant/Tabs";
    import {
      AntSidebarHeading,
      AntLabel,
      AntHeader,
      AntText,
      AntSubHeader,
    } from "./ui/ant/Typography";

    export function AntReportBuilder() {
      return (
        <ReportBuilder
          destinationDashboard="Transactions"
          TableComponent={AntTable}
          SidebarComponent={AntSidebar}
          ContainerComponent={AntContainer}
          PopoverComponent={AntPopover}
          CardComponent={AntCard}
          ButtonComponent={AntButton}
          ModalComponent={AntModal}
          SecondaryButtonComponent={AntSecondaryButton}
          TextInputComponent={AntTextInput}
          SelectComponent={AntSelect}
          TabsComponent={AntTabs}
          CheckboxComponent={AntCheckbox}
          SelectColumnComponent={AntSelectColumn}
          DraggableColumnComponent={AntDraggableColumn}
          SidebarHeadingComponent={AntSidebarHeading}
          FilterPopoverComponent={AntFilterPopover}
          SortPopoverComponent={AntSortPopover}
          LimitPopoverComponent={AntLimitPopover}
          LabelComponent={AntLabel}
          HeaderComponent={AntHeader}
          SubHeaderComponent={AntSubHeader}
          TextComponent={AntText}
          DeleteButtonComponent={AntDeleteButton}
          ErrorMessageComponent={AntErrorMessageComponent}
          ChartBuilderInputRowContainer={AntChartBuilderInputRowContainer}
          ChartBuilderInputColumnContainer={AntChartBuilderInputColumnContainer}
          PivotRowContainer={AntPivotRowContainer}
          PivotColumnContainer={AntPivotColumnContainer}
          LoadingComponent={AntLoadingComponent}
          ColumnSearchEmptyState={AntColumnSearchEmptyState}
          ChartBuilderFormContainer={AntChartBuilderFormContainer}
        />
      );
    }
    ```
  </Tab>

  <Tab title="Material Design">
    [![Edit \[Material Design\] Quill React Components](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/p/devbox/material-design-quill-react-components-d862dk?embed=1)

    ```tsx Material Design theme={null}
    import { ReportBuilder } from "@quillsql/react";

    import {
      MaterialButton,
      MaterialDeleteButton,
      MaterialSecondaryButton,
    } from "./ui/material/Button";
    import { MaterialCard } from "./ui/material/Card";
    import { MaterialCheckbox } from "./ui/material/Checkbox";
    import {
      MaterialSelectColumn,
      MaterialDraggableColumn,
      MaterialColumnSearchEmptyState,
    } from "./ui/material/Column";
    import { MaterialTextInput } from "./ui/material/Input";
    import {
      MaterialChartBuilderFormContainer,
      MaterialChartBuilderInputColumnContainer,
      MaterialChartBuilderInputRowContainer,
      MaterialContainer,
      MaterialErrorMessageComponent,
      MaterialPivotColumnContainer,
      MaterialPivotRowContainer,
      MaterialSidebar,
    } from "./ui/material/Layout";
    import { MaterialModal } from "./ui/material/Modal";
    import {
      MaterialPopover,
      MaterialFilterPopover,
      MaterialSortPopover,
      MaterialLimitPopover,
    } from "./ui/material/Popover";
    import { MaterialSelect } from "./ui/material/Select";
    import { MaterialTable } from "./ui/material/Table";
    import { MaterialTabs } from "./ui/material/Tabs";
    import {
      MaterialSidebarHeading,
      MaterialLabel,
      MaterialHeader,
      MaterialText,
      MaterialSubHeader,
    } from "./ui/material/Typography";

    export function MaterialReportBuilder() {
      return (
        <ReportBuilder
          destinationDashboard="Transactions"
          TableComponent={MaterialTable}
          SidebarComponent={MaterialSidebar}
          ContainerComponent={MaterialContainer}
          PopoverComponent={MaterialPopover}
          CardComponent={MaterialCard}
          ButtonComponent={MaterialButton}
          ModalComponent={MaterialModal}
          SecondaryButtonComponent={MaterialSecondaryButton}
          TextInputComponent={MaterialTextInput}
          SelectComponent={MaterialSelect}
          TabsComponent={MaterialTabs}
          CheckboxComponent={MaterialCheckbox}
          SelectColumnComponent={MaterialSelectColumn}
          DraggableColumnComponent={MaterialDraggableColumn}
          SidebarHeadingComponent={MaterialSidebarHeading}
          FilterPopoverComponent={MaterialFilterPopover}
          SortPopoverComponent={MaterialSortPopover}
          LimitPopoverComponent={MaterialLimitPopover}
          LabelComponent={MaterialLabel}
          HeaderComponent={MaterialHeader}
          SubHeaderComponent={MaterialSubHeader}
          TextComponent={MaterialText}
          DeleteButtonComponent={MaterialDeleteButton}
          ErrorMessageComponent={MaterialErrorMessageComponent}
          ChartBuilderInputRowContainer={MaterialChartBuilderInputRowContainer}
          ChartBuilderInputColumnContainer={
            MaterialChartBuilderInputColumnContainer
          }
          PivotRowContainer={MaterialPivotRowContainer}
          PivotColumnContainer={MaterialPivotColumnContainer}
          ColumnSearchEmptyState={MaterialColumnSearchEmptyState}
          ChartBuilderFormContainer={MaterialChartBuilderFormContainer}
        />
      );
    }
    ```
  </Tab>
</Tabs>

### Prefetch data from a particular table

You can pass an `initialTableName` to have the report builder automatically load
data from a particular table in your schema.

```tsx App.tsx theme={null}
import { QuillProvider, ReportBuilder } from "@quillsql/react";

function App() {
  return (
    <QuillProvider
      tenants={[{ tenantField: "customer_id", tenantIds: [2] }]}
      publicKey={process.env.QUILL_PUBLIC_KEY}
    >
      <ReportBuilder initialTableName="transactions" />
    </QuillProvider>
  );
}
```

### Edit an existing report

You can pass a `reportId` to have the report builder load the metadata for a
pre-existing report. This might be useful if you want to allow your end
users to edit the reports they created.

```tsx App.tsx theme={null}
import { QuillProvider, ReportBuilder } from "@quillsql/react";

function App() {
  return (
    <QuillProvider
      tenants={[{ tenantField: "customer_id", tenantIds: [2] }]}
      publicKey={process.env.QUILL_PUBLIC_KEY}
    >
      <ReportBuilder reportId="664283fb4db8ad000bfe54d7" />
    </QuillProvider>
  );
}
```

### Query all views in your Quill schema

By default, the Quill Report Builder will query all tables in your schema and
new reports will be created upon completion.

```tsx App.tsx theme={null}
import { QuillProvider, ReportBuilder } from "@quillsql/react";

function App() {
  return (
    <QuillProvider
      tenants={[{ tenantField: "customer_id", tenantIds: [2] }]}
      publicKey={process.env.QUILL_PUBLIC_KEY}
    >
      <ReportBuilder />
    </QuillProvider>
  );
}
```

## Props

<ParamField path="initialTableName" type="string">
  The default table name to show when first loading the ReportBuilder.

  <Tip>See the [prefetch data example](/docs/components/report-builder#prefetch-data-from-a-particular-table) to see an example of how this is used.</Tip>
</ParamField>

<ParamField path="destinationDashboard" type="string">
  Sets the dashboard of a report created in the report builder.

  <Tip>Checkout our [UI examples](/docs/components/examples) to see how this is used.</Tip>
</ParamField>

<ParamField path="destinationSection" type="string">
  Sets the dashboard section of a report created in the report builder.

  <Tip>Checkout our [UI examples](/docs/components/examples) to see how this is used.</Tip>
</ParamField>

<ParamField path="ButtonComponent" type="(props: ButtonComponentProps) => JSX.Element">
  A primary button component.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/uJxYp0QfD2nyydTi/images/button.png?fit=max&auto=format&n=uJxYp0QfD2nyydTi&q=85&s=52fbf69428285e29cac939579f5d9d95" width="171" height="60" data-path="images/button.png" />

    ```jsx Example theme={null}
    export function ButtonComponent({ onClick, label, disabled, icon }) {
    	return (
    		<button onClick={onClick} disabled={disabled}>
    			{icon}
    			{label}
    		</button>
    	);
    }
    ```

    <ParamField path="ButtonComponentProps" type="object">
      <Expandable title="properties" defaultOpen={true}>
        <ResponseField name="onClick" type="() => void" required>
          A callback fired when the button is clicked.
        </ResponseField>

        <ResponseField name="label" type="string" required>
          The text content of the button.
        </ResponseField>

        <ResponseField name="disabled" type="boolean">
          Whether the button is disabled.
        </ResponseField>

        <ResponseField name="icon" type="ReactNode">
          An icon to put in front of the label.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="SecondaryButtonComponent" type="(props: ButtonComponentProps) => JSX.Element">
  A secondary button component.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/1rz9Mp2lIcxgjYLT/images/secondary_button.png?fit=max&auto=format&n=1rz9Mp2lIcxgjYLT&q=85&s=660918ab9c6e35d45c2dfc293d8c4127" width="139" height="49" data-path="images/secondary_button.png" />

    ```jsx Example theme={null}
    export function SecondaryButtonComponent({ onClick, label, disabled, icon }) {
    	return (
    		<button onClick={onClick} disabled={disabled}>
    			{icon}
    			{label}
    		</button>
    	);
    }
    ```

    <ParamField path="ButtonComponentProps" type="object">
      <Expandable title="properties" defaultOpen={true}>
        <ResponseField name="onClick" type="() => void" required>
          A callback fired when the button is clicked.
        </ResponseField>

        <ResponseField name="label" type="string" required>
          The text content of the button.
        </ResponseField>

        <ResponseField name="disabled" type="boolean">
          Whether the button is disabled.
        </ResponseField>

        <ResponseField name="icon" type="ReactNode">
          An icon to put in front of the label.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="DeleteButtonComponent" type="(props: DeleteButtonComponentProps) => JSX.Element">
  A small delete button used to click out of things. Usually an "X" icon.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/uJxYp0QfD2nyydTi/images/delete_button.png?fit=max&auto=format&n=uJxYp0QfD2nyydTi&q=85&s=a7e30ed316ef21b4ab4e3b79c7f56500" width="46" height="48" data-path="images/delete_button.png" />

    ```jsx Example theme={null}
    import { deleteSVG } from "./ui/icons";
    export function DeleteButtonComponent({ onClick }) {
    	return <button onClick={onClick}>{deleteSVG}</button>;
    }
    ```

    <ParamField path="DeleteButtonComponentProps" type="object">
      <Expandable title="properties" defaultOpen={true}>
        <ResponseField name="onClick" type="() => void" required>
          A callback fired when the button is clicked.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="TextInputComponent" type="(props: TextInputComponentProps) => JSX.Element">
  A input element for getting text from the user.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/1rz9Mp2lIcxgjYLT/images/text_input.png?fit=max&auto=format&n=1rz9Mp2lIcxgjYLT&q=85&s=f28dce23e5a61fea79731431eb51a576" width="210" height="76" data-path="images/text_input.png" />

    ```jsx Example theme={null}
    export function TextInputComponent({ id, width, value, label, placeholder, onChange }) {
    	return (
    		<label>
    			{label}
    			<input
    				id={id}
    				style={{ width }}
    				value={value}
    				placeholder={placeholder}
    				onChange={onChange}
    			/>
    		</label>
    	);
    }
    ```

    <ParamField path="TextInputComponentProps" type="object">
      <Expandable title="properties" defaultOpen={true}>
        <ResponseField name="id" type="string" required>
          The id of the input element.
        </ResponseField>

        <ResponseField name="width" type="number" required>
          The width of the input element in pixels.
        </ResponseField>

        <ResponseField name="value" type="string" required>
          The width of the input element in pixels.
        </ResponseField>

        <ResponseField name="label" type="string">
          The label of the text input component.
        </ResponseField>

        <ResponseField name="placeholder" type="string">
          The placeholder for the input element.
        </ResponseField>

        <ResponseField name="onChange" type="(event: ChangeEvent<HTMLInputElement>) => void" required>
          An event callback that is fired when the input value changes.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="ModalComponent" type="(props: ModalComponentProps) => JSX.Element">
  A modal component.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/uJxYp0QfD2nyydTi/images/modal.png?fit=max&auto=format&n=uJxYp0QfD2nyydTi&q=85&s=a707312ef388177a79a05f75089ae0d2" width="493" height="525" data-path="images/modal.png" />

    ```jsx Example theme={null}
    import { Modal } from "./ui/modal";
    export function ModalComponent({ isOpen, setIsOpen, title, children, width, height }) {
    	return (
    		<Modal
    			isOpen={isOpen}
    			setIsOpen={setIsOpen}
    			title={title}
    			style={{ width, height }}
    		>
    			{children}
    		</Modal>
    	);
    }
    ```

    <ParamField path="ModalComponentProps" type="object">
      <Expandable title="properties" defaultOpen={true}>
        <ResponseField name="isOpen" type="boolean" required>
          Whether the modal is open.
        </ResponseField>

        <ResponseField name="setIsOpen" type="(isOpen: boolean) => void" required>
          A callback to set whether the modal is open.
        </ResponseField>

        <ResponseField name="title" type="string">
          The title of the modal, if any.
        </ResponseField>

        <ResponseField name="children" type="ReactNode" required>
          The body of the modal.
        </ResponseField>

        <ResponseField name="width" type="number">
          The width of the modal, in pixels.
        </ResponseField>

        <ResponseField name="height" type="number">
          The height of the modal, in pixels.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="ChartBuilderModalComponent" type="(props: ModalComponentProps) => JSX.Element">
  A modal component.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/uJxYp0QfD2nyydTi/images/chart_builder_modal.png?fit=max&auto=format&n=uJxYp0QfD2nyydTi&q=85&s=a8753a10f015faa4d45790ff75e41631" width="1394" height="887" data-path="images/chart_builder_modal.png" />

    ```jsx Example theme={null}
    import { Modal } from "./ui/modal";
    export function ChartBuilderModalComponent({ isOpen, setIsOpen, title, children, width, height }) {
    	return (
    		<Modal
    			isOpen={isOpen}
    			setIsOpen={setIsOpen}
    			title={title}
    			style={{ width, height }}
    		>
    			{children}
    		</Modal>
    	);
    }
    ```

    <ParamField path="ModalComponentProps" type="object">
      <Expandable title="properties" defaultOpen={true}>
        <ResponseField name="isOpen" type="boolean" required>
          Whether the modal is open.
        </ResponseField>

        <ResponseField name="setIsOpen" type="(isOpen: boolean) => void" required>
          A callback to set whether the modal is open.
        </ResponseField>

        <ResponseField name="title" type="string">
          The title of the modal, if any.
        </ResponseField>

        <ResponseField name="children" type="ReactNode" required>
          The body of the modal.
        </ResponseField>

        <ResponseField name="width" type="number">
          The width of the modal, in pixels.
        </ResponseField>

        <ResponseField name="height" type="number">
          The height of the modal, in pixels.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="SelectComponent" type="(props: SelectComponentProps) => JSX.Element">
  A select component.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/1rz9Mp2lIcxgjYLT/images/select.png?fit=max&auto=format&n=1rz9Mp2lIcxgjYLT&q=85&s=0ed6bb7d4ad645485e7e0451bf0f8e7c" width="213" height="76" data-path="images/select.png" />

    ```jsx Example theme={null}
    export function SelectComponent({ value, label, width, onChange, options }) {
    	return (
    		<label>
    			{label}
    			<select value={value} onChange={onChange} style={{ width }}>
    				{options.map(({ value, label }) => <option value={value}>{label}</option>)}
    			</select>
    		</label>
    	);
    }
    ```

    <ParamField path="SelectComponentProps" type="object">
      <Expandable title="properties" defaultOpen={true}>
        <ResponseField name="value" type="string" required>
          The value of the select element.
        </ResponseField>

        <ResponseField name="label" type="string">
          The label above the select element.
        </ResponseField>

        <ResponseField name="width" type="number" required>
          The width of the select element, in pixels.
        </ResponseField>

        <ResponseField name="onChange" type="(event: ChangeEvent<HTMLSelectElement>) => void" required>
          An event callback that is fired when the select value changes.
        </ResponseField>

        <ResponseField name="options" type="{ value: string; label: string; }[]" required>
          An array of value, label pairs which represent the select options.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="TableComponent" type="(props: TableComponentProps) => JSX.Element">
  A table component.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/1rz9Mp2lIcxgjYLT/images/table.png?fit=max&auto=format&n=1rz9Mp2lIcxgjYLT&q=85&s=3d34b61e118813ac78870ad5a98eb336" width="760" height="457" data-path="images/table.png" />

    ```jsx Example theme={null}
    import { Table } from "./ui/table";
    import { LoadingSkeleton } from "./ui/loading";

    export function TableComponent({ rows, columns, isLoading }) {
    	if (isLoading) return <LoadingSkeleton />
    	return <Table rows={rows} columns={columns} />;
    }
    ```

    <ParamField path="TableComponentProps" type="object">
      <Expandable title="properties" defaultOpen={true}>
        <ResponseField name="rows" type="{ [key: string]: any }[]" required>
          The rows of the table are an array of objects.
        </ResponseField>

        <ResponseField name="columns" type="{ label: string; field: string; }[]" required>
          The columns of the table are an array of label, field pairs.
        </ResponseField>

        <ResponseField name="isLoading" type="boolean">
          Whether the table is loading.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="PopoverComponent" type="(props: PopoverComponentProps) => JSX.Element">
  A popover component.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/uJxYp0QfD2nyydTi/images/pivot_popover.png?fit=max&auto=format&n=uJxYp0QfD2nyydTi&q=85&s=5f1d1373307f31f1c7d8fa186bdf286b" width="468" height="295" data-path="images/pivot_popover.png" />

    ```jsx Example theme={null}
    import { Popover } from "./ui/popover";

    export function PopoverComponent({ isOpen, setIsOpen, popoverTitle, popoverChildren }) {
    	return (
    		<Popover isOpen={isOpen} setIsOpen={setIsOpen} title={popoverTitle}>
    			{popoverChildren}
    		</Popover>
    	);
    }
    ```

    <ParamField path="PopoverComponentProps" type="object">
      <Expandable title="properties" defaultOpen={true}>
        <ResponseField name="isOpen" type="boolean" required>
          Whether the popover is open.
        </ResponseField>

        <ResponseField name="setIsOpen" type="(isOpen: boolean) => void" required>
          A callback to set whether the popover is open.
        </ResponseField>

        <ResponseField name="triggerLabel" type="string">
          The label of the popover trigger, if any.
        </ResponseField>

        <ResponseField name="popoverTitle" type="string">
          The title of the popover, if any.
        </ResponseField>

        <ResponseField name="popoverChildren" type="ReactNode" required>
          The body of the popover.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField
  path="FilterPopoverComponent"
  type="(props: FilterPopoverComponentProps) =>
JSX.Element"
>
  A popover component for filters created in the report builder.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/uJxYp0QfD2nyydTi/images/filter_popover.png?fit=max&auto=format&n=uJxYp0QfD2nyydTi&q=85&s=7cb84febbee4df3d8058236d2b7be354" width="613" height="190" data-path="images/filter_popover.png" />

    ```jsx Example theme={null}
    import { Popover } from "./ui/popover";

    export function FilterPopoverComponent({ isOpen, setIsOpen, popoverTitle, popoverChildren }) {
    	return (
    		<Popover isOpen={isOpen} setIsOpen={setIsOpen} title={popoverTitle}>
    			{popoverChildren}
    		</Popover>
    	);
    }
    ```

    <ParamField path="FilterPopoverComponentProps" type="object">
      <Expandable title="properties" defaultOpen={true}>
        <ResponseField name="isOpen" type="boolean" required>
          Whether the popover is open.
        </ResponseField>

        <ResponseField name="setIsOpen" type="(isOpen: boolean) => void" required>
          A callback to set whether the popover is open.
        </ResponseField>

        <ResponseField name="popoverTitle" type="string">
          The title of the popover, if any.
        </ResponseField>

        <ResponseField name="popoverChildren" type="ReactNode" required>
          The body of the popover.
        </ResponseField>

        <ResponseField name="filterLabel" type="string" required>
          The text contents of the filter item.
        </ResponseField>

        <ResponseField name="onClickDelete" type="(event: MouseEvent<HTMLElement>) => void" required>
          An event callback fired when the user clicks the delete button on the
          filter.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="SortPopoverComponent" type="(props: SortPopoverComponentProps) => JSX.Element">
  A popover component for sort items created in the report builder.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/1rz9Mp2lIcxgjYLT/images/sort_popover.png?fit=max&auto=format&n=1rz9Mp2lIcxgjYLT&q=85&s=52f8d9d8d9b2e407b8cf54038c7dcdd0" width="463" height="215" data-path="images/sort_popover.png" />

    ```jsx Example theme={null}
    import { Popover } from "./ui/popover";

    export function SortPopoverComponent({ isOpen, setIsOpen, popoverTitle, popoverChildren }) {
    	return (
    		<Popover isOpen={isOpen} setIsOpen={setIsOpen} title={popoverTitle}>
    			{popoverChildren}
    		</Popover>
    	);
    }
    ```

    <ParamField path="SortPopoverComponentProps" type="object">
      <Expandable title="properties" defaultOpen={true}>
        <ResponseField name="isOpen" type="boolean" required>
          Whether the popover is open.
        </ResponseField>

        <ResponseField name="setIsOpen" type="(isOpen: boolean) => void" required>
          A callback to set whether the popover is open.
        </ResponseField>

        <ResponseField name="popoverTitle" type="string">
          The title of the popover, if any.
        </ResponseField>

        <ResponseField name="popoverChildren" type="ReactNode" required>
          The body of the popover.
        </ResponseField>

        <ResponseField name="sortLabel" type="string" required>
          The text contents of the sort item.
        </ResponseField>

        <ResponseField name="onClickDelete" type="(event: MouseEvent<HTMLElement>) => void" required>
          An event callback fired when the user clicks the delete button on the
          sort item.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="LimitPopoverComponent" type="(props: LimitPopoverComponentProps) => JSX.Element">
  A popover component for limits created in the report builder.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/uJxYp0QfD2nyydTi/images/limit_popover.png?fit=max&auto=format&n=uJxYp0QfD2nyydTi&q=85&s=e1ca763d0561a4e68c172f1ed4b7c782" width="250" height="213" data-path="images/limit_popover.png" />

    ```jsx Example theme={null}
    import { Popover } from "./ui/popover";

    export function LimitPopoverComponent({ isOpen, setIsOpen, popoverTitle, popoverChildren }) {
    	return (
    		<Popover isOpen={isOpen} setIsOpen={setIsOpen} title={popoverTitle}>
    			{popoverChildren}
    		</Popover>
    	);
    }
    ```

    <ParamField path="LimitPopoverComponentProps" type="object">
      <Expandable title="properties" defaultOpen={true}>
        <ResponseField name="isOpen" type="boolean" required>
          Whether the popover is open.
        </ResponseField>

        <ResponseField name="setIsOpen" type="(isOpen: boolean) => void" required>
          A callback to set whether the popover is open.
        </ResponseField>

        <ResponseField name="popoverTitle" type="string">
          The title of the popover, if any.
        </ResponseField>

        <ResponseField name="popoverChildren" type="ReactNode" required>
          The body of the popover.
        </ResponseField>

        <ResponseField name="limitLabel" type="string" required>
          The text contents of the limit.
        </ResponseField>

        <ResponseField name="onClickDelete" type="(event: MouseEvent<HTMLElement>) => void" required>
          An event callback fired when the user clicks the delete button on the
          limit.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="TabsComponent" type="(props: TabsComponentProps) => JSX.Element">
  A small navigation menu used to switch between two or more states.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/1rz9Mp2lIcxgjYLT/images/tabs.png?fit=max&auto=format&n=1rz9Mp2lIcxgjYLT&q=85&s=d8736cc044bcffad6dc36f02132cf7b3" width="105" height="48" data-path="images/tabs.png" />

    ```jsx Example theme={null}
    import { Tabs, Tab } from "./ui/tabs";
    export function TabsComponent({ value, onChange, options }) {
    	return (
    		<Tabs value={value} onChange={onChange}>
    			{options.map(({ value, label }) => <Tab value={value}>{label}</Tab>)}
    		</Tabs>
    	);
    }
    ```

    <ParamField path="TabsComponentProps" type="object">
      <Expandable title="properties" defaultOpen={true}>
        <ResponseField name="value" type="string" required>
          The value of the currently selected tab.
        </ResponseField>

        <ResponseField name="onChange" type="(event: ChangeEvent<HTMLSelectElement>) => void" required>
          An event callback fired when the selected tab changes.
        </ResponseField>

        <ResponseField name="options" type="{ label: string; value: string; }[]" required>
          An array of value, label pairs which represent the tabs to display.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="CheckboxComponent" type="(props: CheckboxComponentProps) => JSX.Element">
  A checkbox component.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/uJxYp0QfD2nyydTi/images/checkbox.png?fit=max&auto=format&n=uJxYp0QfD2nyydTi&q=85&s=46b696f581ee277839ba7844522cfc2b" width="125" height="32" data-path="images/checkbox.png" />

    ```jsx Example theme={null}
    export function CheckboxComponent({ isChecked, label, onChange }) {
    	return (
    		<label>
    			<input type="checkbox" checked={isChecked} onChange={onChange} />
    			{label}
    		</label>
    	);
    }
    ```

    <ParamField path="CheckboxComponentProps" type="object">
      <Expandable title="properties">
        <ResponseField name="isChecked" type="boolean" required>
          Whether the checkbox is checked.
        </ResponseField>

        <ResponseField name="label" type="string" required>
          A label for the checkbox component.
        </ResponseField>

        <ResponseField name="onChange" type="(event: React.ChangeEvent<HTMLInputElement>) => void" required>
          An event callback fired when the checkbox's value changes.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="SidebarComponent" type="(props: SidebarComponentProps) => JSX.Element">
  A container for the left sidebar.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/1rz9Mp2lIcxgjYLT/images/sidebar_component.png?fit=max&auto=format&n=1rz9Mp2lIcxgjYLT&q=85&s=12e656145e2aee06083ba6e01e044b41" width="851" height="556" data-path="images/sidebar_component.png" />

    ```jsx Example theme={null}
    export function SidebarComponent({ children }) {
    	const style = {
    		display: "flex",
    		flexDirection: "column",
    		gap: 24,
    	}
    	return <aside style={style}>{children}</aside>
    }
    ```

    <ParamField path="SidebarComponentProps" type="object">
      <Expandable title="properties">
        <ResponseField name="children" type="ReactNode" required>
          The children of the sidebar container.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="ContainerComponent" type="(props: ContainerComponentProps) => JSX.Element">
  A container for the main content (everything right of the sidebar).

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/uJxYp0QfD2nyydTi/images/container.png?fit=max&auto=format&n=uJxYp0QfD2nyydTi&q=85&s=53cfd4fb80451141ce9bb92c1ea440f5" width="1836" height="1192" data-path="images/container.png" />

    ```jsx Example theme={null}
    export function ContainerComponent({ children }) {
    	const style = {
    		display: "flex",
    		flexDirection: "column",
    		gap: 24,
    	}
    	return <main style={style}>{children}</main>
    }
    ```

    <ParamField path="ContainerComponentProps" type="object">
      <Expandable title="properties" defaultOpen={true}>
        <ResponseField name="children" type="ReactNode" required>
          The children of the main container.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="LoadingComponent" type="() => JSX.Element">
  A component to show while the query results are loading.
</ParamField>

<ParamField
  path="SelectColumnComponent"
  type="(props: SelectColumnComponentProps) =>
JSX.Element"
>
  A component to show selected columns.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/1rz9Mp2lIcxgjYLT/images/select_column.png?fit=max&auto=format&n=1rz9Mp2lIcxgjYLT&q=85&s=e48d1424876e7ff9137e16ba667f8c17" width="407" height="49" data-path="images/select_column.png" />

    ```jsx Example theme={null}
    export function SelectColumnComponent({ label, isSelected, setSelected, DragHandle }) {
    	return (
    		<div>
    			<DragHandle/>
    			<input type="checkbox" isChecked={isSelected} onClick={setSelected} />
    			{label}
    		</div>
    	);
    }
    ```

    <ParamField path="SelectColumnComponentProps" type="object">
      <Expandable title="properties" defaultOpen={true}>
        <ResponseField name="label" type="string" required>
          The label of the selected column.
        </ResponseField>

        <ResponseField name="isSelected" type="boolean" required>
          Whether this column has been selected.
        </ResponseField>

        <ResponseField name="setSelected" type="() => void" required>
          A callback that is fired when the user checks this columns' checkbox.
        </ResponseField>

        <ResponseField name="DragHandle" type="({ dragIcon }: { dragIcon: () => JSX.Element }) => JSX.Element">
          The handle the user drags this column by.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="DraggableColumnComponent" type="(props: DraggableColumnComponentProps) => JSX.Element">
  A draggable component used to reorder columns.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/uJxYp0QfD2nyydTi/images/drag_column.png?fit=max&auto=format&n=uJxYp0QfD2nyydTi&q=85&s=5554475df2344d401d8f30d9a875a8ac" width="281" height="38" data-path="images/drag_column.png" />

    ```jsx Example theme={null}
    import { DeleteSVG } from "./ui/icons";
    export function DraggableColumnComponent({ label, onDelete, DragHandle }) {
    	return (
    		<div>
    			<DragHandle/>
    			{label}
    			<button onClick={onDelete}>
    				<DeleteSVG />
    			</button>
    		</div>
    	);
    }
    ```

    <ParamField path="DraggableColumnComponentProps" type="object">
      <Expandable title="properties">
        <ResponseField name="label" type="string" required>
          The label of the draggable column.
        </ResponseField>

        <ResponseField name="onDelete" type="() => void" required>
          A callback that is fired when this column is removed from the query.
        </ResponseField>

        <ResponseField name="DragHandle" type="({ dragIcon }: { dragIcon: () => JSX.Element }) => JSX.Element">
          The handle the user drags this column by.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="SidebarHeadingComponent" type="(props: SidebarHeadingComponentProps) => JSX.Element">
  A heading element for the sidebar.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/1rz9Mp2lIcxgjYLT/images/sidebar_heading.png?fit=max&auto=format&n=1rz9Mp2lIcxgjYLT&q=85&s=c7742566fc67cf475e156394161a1f7b" width="299" height="80" data-path="images/sidebar_heading.png" />

    ```jsx Example theme={null}
    export function SidebarHeadingComponent({ label }) {
    	return <h2>{label}</h2>;
    }
    ```

    <ParamField path="SidebarHeadingComponentProps" type="object">
      <Expandable title="properties" defaultOpen={true}>
        <ResponseField name="label" type="string" required>
          The text content of the sidebar heading.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="CardComponent" type="(props: CardComponentProps) => JSX.Element">
  A card component used as a dismissable container of pivot information.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/uJxYp0QfD2nyydTi/images/card.png?fit=max&auto=format&n=uJxYp0QfD2nyydTi&q=85&s=eb8cb10e24c7426ce15a05c4574659db" width="430" height="229" data-path="images/card.png" />

    ```jsx Example theme={null}
    import { Card } from "./ui/card";
    export function CardComponent({ onClick, onDelete, children }) {
    	const style = { position: 'absolute', top: 0, right: 0 };
    	return (
    		<Card onClick={onClick} style={{ position: 'relative' }}>
    			{onDelete && <DeleteButton style={style} onClick={onDelete} />}
    			{children}
    		</Card>
    	);
    }
    ```

    <ParamField path="CardComponentProps" type="object">
      <Expandable title="properties" defaultOpen={true}>
        <ResponseField name="children" type="ReactNode" required>
          The children of the container.
        </ResponseField>

        <ResponseField name="onClick" type="() => void">
          A callback that is fired when the card is clicked.
        </ResponseField>

        <ResponseField name="onDelete" type="() => void">
          A callback that is fired the card is deleted.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="LabelComponent" type="(props: LabelComponentProps) => JSX.Element">
  A label component.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/uJxYp0QfD2nyydTi/images/label.png?fit=max&auto=format&n=uJxYp0QfD2nyydTi&q=85&s=c175dc6dfb111586265bfc7155b4374f" width="77" height="94" data-path="images/label.png" />

    ```jsx Example theme={null}
    export function LabelComponent({ label }) {
    	return <h4>{label}</h4>;
    }
    ```

    <ParamField path="LabelComponentProps" type="object">
      <Expandable title="properties" defaultOpen={true}>
        <ResponseField name="label" type="string" required>
          The text content of the element.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="HeaderComponent" type="(props: HeaderComponentProps) => JSX.Element">
  A header component.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/uJxYp0QfD2nyydTi/images/header.png?fit=max&auto=format&n=uJxYp0QfD2nyydTi&q=85&s=53760745ec4a6512038fe022c1c64ec2" width="429" height="100" data-path="images/header.png" />

    ```jsx Example theme={null}
    export function HeaderComponent({ label }) {
    	return <h2>{label}</h2>;
    }
    ```

    <ParamField path="HeaderComponentProps" type="object">
      <Expandable title="properties" defaultOpen={true}>
        <ResponseField name="label" type="string" required>
          The text content of the element.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="TextComponent" type="(props: TextComponentProps) => JSX.Element">
  A simple text component.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/1rz9Mp2lIcxgjYLT/images/text.png?fit=max&auto=format&n=1rz9Mp2lIcxgjYLT&q=85&s=5f25ed46ab555dbb6c3b3f0a7d8d5d3c" width="93" height="95" data-path="images/text.png" />

    ```jsx Example theme={null}
    export function TextComponent({ label }) {
    	return <p>{label}</p>;
    }
    ```

    <ParamField path="TextComponentProps" type="object">
      <Expandable title="properties" defaultOpen={true}>
        <ResponseField name="label" type="string" required>
          The text content of the element.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="SubHeaderComponent" type="(props: { label: string }) => JSX.Element">
  A sub-header component describes a group of inputs.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/1rz9Mp2lIcxgjYLT/images/subheader.png?fit=max&auto=format&n=1rz9Mp2lIcxgjYLT&q=85&s=dbf2ce79d05e9f11ff8a6c343b45f73e" width="636" height="75" data-path="images/subheader.png" />

    ```jsx Example theme={null}
    export function SubHeaderComponent({ label }) {
    	return <h3>{label}</h3>;
    }
    ```

    <ParamField path="SubHeaderComponentProps" type="object">
      <Expandable title="properties" defaultOpen={true}>
        <ResponseField name="label" type="() => void" required>
          The label of the sub-header component.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="ChartBuilderInputRowContainer" type="(props: { children: ReactNode }) => JSX.Element">
  A container for each row of inputs for the ChartBuilder form.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/uJxYp0QfD2nyydTi/images/chart_builder_input_row_container.png?fit=max&auto=format&n=uJxYp0QfD2nyydTi&q=85&s=ba098d436528a38be885871ebf262d2a" width="1437" height="1258" data-path="images/chart_builder_input_row_container.png" />

    ```jsx Example theme={null}
    export function ChartBuilderInputRowContainer({ children }) {
    	const style = {
    		display: "flex",
    		flexDirection: "row",
    		gap: 12,
    	}
    	return <div style={style}>{children}</div>
    }
    ```

    <ParamField path="ChartBuilderInputRowContainerProps" type="object">
      <Expandable title="properties">
        <ResponseField name="children" type="ReactNode" required>
          The children of the container.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="ChartBuilderInputColumnContainer" type="(props: { children: ReactNode }) => JSX.Element">
  A container for vertically-stacked rows of inputs for the ChartBuilder form.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/uJxYp0QfD2nyydTi/images/chart_builder_input_column_container.png?fit=max&auto=format&n=uJxYp0QfD2nyydTi&q=85&s=f3a045b127d5ccd37c123a538aeb46e4" width="1435" height="1256" data-path="images/chart_builder_input_column_container.png" />

    ```jsx Example theme={null}
    export function ChartBuilderInputColumnContainer({ children }) {
    	const style = {
    		display: "flex",
    		flexDirection: "column",
    		gap: 12,
    	}
    	return <div style={style}>{children}</div>
    }
    ```

    <ParamField path="ChartBuilderInputColumnContainerProps" type="object">
      <Expandable title="properties">
        <ResponseField name="children" type="ReactNode" required>
          The children of the container.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="PivotRowContainer" type="(props: { children: ReactNode }) => JSX.Element">
  A container for each row of inputs for the pivot form.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/uJxYp0QfD2nyydTi/images/pivot_row_container.png?fit=max&auto=format&n=uJxYp0QfD2nyydTi&q=85&s=84b7c750344d4d0c2e65f7f8926db068" width="460" height="493" data-path="images/pivot_row_container.png" />

    ```jsx Example theme={null}
    export function PivotRowContainer({ children }) {
    	const style = {
    		display: "flex",
    		flexDirection: "row",
    		gap: 12,
    	}
    	return <div style={style}>{children}</div>
    }
    ```

    <ParamField path="PivotRowContainerProps" type="object">
      <Expandable title="properties">
        <ResponseField name="children" type="ReactNode" required>
          The children of the container.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="PivotColumnContainer" type="(props: { children: ReactNode }) => JSX.Element">
  A container for vertically-stacked rows of inputs for the pivot form.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/uJxYp0QfD2nyydTi/images/pivot_column_container.png?fit=max&auto=format&n=uJxYp0QfD2nyydTi&q=85&s=8c122f8234d1b288c85aaa79e8ceae4d" width="459" height="492" data-path="images/pivot_column_container.png" />

    ```jsx Example theme={null}
    export function PivotColumnContainer({ children }) {
    	const style = {
    		display: "flex",
    		flexDirection: "column",
    		gap: 12,
    	}
    	return <div style={style}>{children}</div>
    }
    ```

    <ParamField path="PivotColumnContainerProps" type="object">
      <Expandable title="properties">
        <ResponseField name="children" type="ReactNode" required>
          The children of the container.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="ChartBuilderFormContainer" type="(props: { children: ReactNode }) => JSX.Element">
  A container for vertically-stacked sections of the chart builder form.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/uJxYp0QfD2nyydTi/images/chart_builder_form_container.png?fit=max&auto=format&n=uJxYp0QfD2nyydTi&q=85&s=822863cd6e22421c2ea7360fa3b3a799" width="1611" height="1254" data-path="images/chart_builder_form_container.png" />

    ```jsx Example theme={null}
    export function ChartBuilderFormContainer({ children }) {
    	const style = {
    		display: "flex",
    		flexDirection: "column",
    		gap: 18,
    	}
    	return <div style={style}>{children}</div>
    }
    ```

    <ParamField path="ChartBuilderFormContainerProps" type="object">
      <Expandable title="properties" defaultOpen={true}>
        <ResponseField name="children" type="ReactNode" required>
          The children of the container.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="ErrorMessageComponent" type="(props: { children: ReactNode }) => JSX.Element">
  A component that displays error messages.

  <Expandable defaultOpen={false} title="props">
    <img src="https://mintcdn.com/quill/uJxYp0QfD2nyydTi/images/error_message.png?fit=max&auto=format&n=uJxYp0QfD2nyydTi&q=85&s=0a9dfde75d489dff2fb964ccc200cb45" width="421" height="36" data-path="images/error_message.png" />

    ```jsx Example theme={null}
    export function ErrorMessageComponent({ errorMessage }) {
    	return <div>{errorMessage}</div>
    }
    ```

    <ParamField path="ErrorMessageComponentProps" type="object">
      <Expandable title="properties" defaultOpen={true}>
        <ResponseField name="errorMessage" type="ReactNode" required>
          The error message.
        </ResponseField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="ColumnSearchEmptyState" type="() => JSX.Element">
  A component to show when no columns match the user's query.
</ParamField>

<ParamField path="isAdminEnabled" type="boolean" default={false}>
  Whether the ReportBuilder is in admin mode (default: `false`).
</ParamField>

<ParamField path="isAIEnabled" type="boolean" default={true}>
  Whether the ReportBuilder's AI features are enabled (default: `true`).
</ParamField>

<ParamField path="pivotRecommendationsEnabled" type="boolean">
  Whether the PivotModal's AI features are enabled.
</ParamField>

<ParamField path="showChartBuilderTableFormatOptions" type="boolean">
  Whether to show the table format options on the ChartBuilder form.
</ParamField>

<ParamField path="className" type="CSSProperties">
  Applies the following classes to the ReportBuilder.

  This can be useful for TailwindCSS-style classname strings.
</ParamField>

<ParamField path="containerStyle" type="CSSProperties">
  Custom styling properties for the ReportBuilder's top-level container.
</ParamField>

<ParamField path="reportId" type="string">
  A report id that the Report Builder will query from and modify.

  <Tip>See the [report id example](#edit-an-existing-report) to see an example of how this is used.</Tip>
</ParamField>

<ParamField path="onSubmitCreateReport" type="(report: QuillReport) => void">
  A callback function that will trigger when a new report is created.
</ParamField>

<ParamField path="onSubmitEditReport" type="(report: QuillReport) => void">
  A callback function that will trigger when a existing report is edited.
</ParamField>

<ParamField path="hideCopySQL" type="boolean" default={true}>
  Whether to hide the copy SQL button.
</ParamField>

<ParamField path="isChartBuilderHorizontalView" type="boolean" default={true}>
  Whether the chart builder is in horizontal view mode.

  Horizontal view mode is where the chart and table are displayed on the left
  and the editing form is displayed on the right, rather than being stacked
  vertically.
</ParamField>
