import { AvatarNetwork } from '@agorapulse/ui-components/avatar';
import { Locale, FirstDayOfWeek, Period } from '@agorapulse/ui-components/datepicker';
import dayjs from 'dayjs';
import { SelectLabelSingleDisplayType } from '@agorapulse/ui-components/select';
import { TagColor } from '@agorapulse/ui-components/tag';
import * as _angular_core from '@angular/core';
import { TemplateRef } from '@angular/core';
import { DropdownOverlay } from '@agorapulse/ui-components/dropdown-base';
import { ActionDropdownItem } from '@agorapulse/ui-components/action-dropdown';

type FilterDropdownType = 'checkbox' | 'radio' | 'toggle' | 'select' | 'date-range';
interface FilterDropdownItemCheckbox {
    label: string;
    name: string;
    disabled?: boolean;
}
interface FilterDropdownItemRadio {
    label: string;
    radioId: string;
    value: unknown;
    disabled?: boolean;
}
interface FilterDropdownItemToggle {
    label: string;
    name: string;
    disabled?: boolean;
}
interface FilterDropdownItemSelect {
    label: string;
    value: unknown;
    featureLocked?: boolean;
    caption?: string;
    avatarUrl?: string;
    symbolId?: string;
    disabled?: boolean;
    badgeText?: string;
    network?: AvatarNetwork;
    dividerEnabled?: boolean;
    tagColor?: TagColor;
}
interface FilterDropdownValueCheckbox {
    filterType: 'checkbox';
    /** Names of the checked items */
    selected: string[];
}
interface FilterDropdownValueRadio {
    filterType: 'radio';
    selected: unknown;
}
interface FilterDropdownValueToggle {
    filterType: 'toggle';
    checked: boolean;
}
interface FilterDropdownValueSingleSelect {
    filterType: 'select';
    selectionType: 'single';
    selected: unknown;
}
interface FilterDropdownValueMultipleSelect {
    filterType: 'select';
    selectionType: 'multiple';
    selected: unknown[];
}
interface FilterDropdownValueDateRange {
    filterType: 'date-range';
    selectedPeriod?: Period;
}
type FilterDropdownValue = FilterDropdownValueCheckbox | FilterDropdownValueRadio | FilterDropdownValueToggle | FilterDropdownValueSingleSelect | FilterDropdownValueMultipleSelect | FilterDropdownValueDateRange;
/** The output emitted by filter-dropdown on apply: a map of filter key → value */
type FilterDropdownOutput = Record<string, FilterDropdownValue>;
/** A single user edit reported up by a leaf: the fully-formed value for one filter key. */
interface FilterValueEdit {
    key: string;
    value: FilterDropdownValue;
}
interface FilterDropdownGroupBase {
    /** Unique key to identify this filter in the output */
    key: string;
    /** The title of the filter group to display in the UI */
    title: string;
    /**
     * The *initial* expanded (open) / collapsed state of the filter group. Only applicable if `closable` is true.
     * This seeds the state on the first render; afterwards the live expand/collapse state is owned by the component
     * and is never written back to this config. Use the dropdown's `expandOnOpen` input to re-derive it on each open.
     */
    expanded?: boolean;
    /** An optional label to display under the filter group title */
    label?: string;
    /** An optional tooltip text that if presents has the symbol "info" next to the title and shows the tooltip on hover. */
    tooltipText?: string;
    /** An optional placeholder in the input value */
    placeholder?: string;
    /** Whether the group is feature locked */
    featureLocked?: boolean;
    /** Whether the group is feature locked */
    featureLockTooltipText?: string;
}
interface FilterDropdownGroupCheckbox extends FilterDropdownGroupBase {
    /** The type of the FilterDropdownGroupBase */
    filterType: 'checkbox';
    items: FilterDropdownItemCheckbox[];
}
interface FilterDropdownGroupRadio extends FilterDropdownGroupBase {
    /** The type of the FilterDropdownGroupBase */
    filterType: 'radio';
    items: FilterDropdownItemRadio[];
}
interface FilterDropdownGroupToggle extends FilterDropdownGroupBase {
    /** The type of the FilterDropdownGroupBase */
    filterType: 'toggle';
    item: FilterDropdownItemToggle;
}
interface FilterDropdownGroupSelectSingle extends FilterDropdownGroupBase {
    /** An optional label to display next to each filter item (e.g. "and", "or"). Only applicable for checkbox, radio and toggle filter groups. */
    inlineLabel?: string;
    /** The type of the FilterDropdownGroupBase */
    filterType: 'select';
    /** Whether the select allows single selection */
    selectionType: 'single';
    /** An optional type to determine the icon/avatar/symbol to display for each item. Only applicable for select filter groups. */
    displayType: SelectLabelSingleDisplayType;
    /** An optional text to display when all items are selected. Only applicable for select filter groups with multiple selection. */
    onlyText?: string;
    items: FilterDropdownItemSelect[];
}
interface FilterDropdownGroupSelectMultiple extends FilterDropdownGroupBase {
    /** An optional label to display next to each filter item (e.g. "and", "or"). Only applicable for checkbox, radio and toggle filter groups. */
    inlineLabel?: string;
    /** The type of the FilterDropdownGroupBase */
    filterType: 'select';
    /** Whether the select allows single or multiple selection */
    selectionType: 'multiple';
    /** An optional type to determine the icon/avatar/symbol to display for each item. Only applicable for select filter groups. */
    displayType: SelectLabelSingleDisplayType;
    /** An optional text to display when all items are selected. Only applicable for select filter groups with multiple selection. */
    onlyText?: string;
    items: FilterDropdownItemSelect[];
}
interface FilterDropdownGroupDateRange extends FilterDropdownGroupBase {
    /** The type of the FilterDropdownGroupBase */
    filterType: 'date-range';
    minDate?: dayjs.Dayjs;
    maxDate?: dayjs.Dayjs;
    locale?: Locale;
    firstDayOfWeek?: FirstDayOfWeek;
    dateFormat?: string;
}
type FilterDropdownGroup = FilterDropdownGroupCheckbox | FilterDropdownGroupRadio | FilterDropdownGroupToggle | FilterDropdownGroupSelectSingle | FilterDropdownGroupSelectMultiple | FilterDropdownGroupDateRange;
/**
 * Policy deciding which groups start expanded each time the dropdown opens.
 * - `'collapse-empty'`: expand groups that currently have a selection, collapse the empty ones.
 * - a predicate: evaluated per group against its current draft value.
 * When omitted on the component, the expand/collapse state persists across opens.
 */
type ExpandOnOpenPolicy = 'collapse-empty' | ((group: FilterDropdownGroup, value: FilterDropdownValue) => boolean);

/**
 * Working state for a single filter-dropdown instance. Component-scoped (provided on
 * `FilterDropdownComponent`), never `providedIn: 'root'`.
 *
 * This is a PURE state container: every method here only reads or writes signals — none of them
 * emit anything. The apply→value→apply loop is impossible because the ONLY code that emits
 * `applyFilters` lives inside the component's user-gesture handlers (see FilterDropdownComponent),
 * and seeding an input never runs a gesture handler. Re-seeding `value`/`savedValue` therefore
 * updates the draft and stops there — there is no emit path to loop through.
 *
 * The internal `_baseline` is the dirty-tracking reference: seeded from the `savedValue` input
 * (falling back to `value`), and moved locally by `commit()` on Apply/Save/Update.
 */
declare class FilterState {
    private readonly _groups;
    private readonly _draft;
    private readonly _baseline;
    private readonly _expanded;
    readonly groups: _angular_core.Signal<FilterDropdownGroup[]>;
    readonly draft: _angular_core.Signal<FilterDropdownOutput>;
    readonly expanded: _angular_core.Signal<Record<string, boolean>>;
    readonly activeFilterCount: _angular_core.Signal<number>;
    readonly isFilterCountActive: _angular_core.Signal<boolean>;
    readonly hasChanges: _angular_core.Signal<boolean>;
    /** Save / Update / Reset / Apply are gated on dirty state. */
    readonly buttonsDisabled: _angular_core.Signal<boolean>;
    /** Clear is gated on "is there anything to clear", not on dirty state. */
    readonly clearDisabled: _angular_core.Signal<boolean>;
    /** Refresh the structural schema and reconcile the value keyspace (add empty / drop removed). */
    setSchema(groups: FilterDropdownGroup[]): void;
    /** Seed the draft from an external value, projected onto the current keyspace. Echo-gated, silent. */
    seedDraft(value: FilterDropdownOutput): void;
    /** Seed the baseline (the saved reference for dirty tracking / reset) from an external value. Silent. */
    seedBaseline(value: FilterDropdownOutput): void;
    /** Adopt the current draft as the baseline (Apply / Save / Update). */
    commit(): void;
    /** Revert the draft to the committed baseline (user action). */
    reset(): void;
    /** Clear all draft values to their empty states (user action). */
    clear(): void;
    /** Get the draft value for a specific filter key. */
    getValue(key: string): FilterDropdownValue | undefined;
    /** Return the current draft snapshot (used on Apply / Save). */
    getSnapshot(): FilterDropdownOutput;
    /**
     * Apply a single filter's fully-formed draft value (user action). The value is built by the
     * leaf that owns the widget; this state only stores it, keeping the type-specific shaping at
     * the edge where the DOM event happens.
     */
    updateValue(key: string, value: FilterDropdownValue): void;
    /** Whether a group is currently expanded. Defaults to collapsed for unknown keys. */
    isExpanded(key: string): boolean;
    /** Toggle a group's expand/collapse state. Updates internal state only — the config is never mutated. */
    collapseHeader(key: string): void;
    /**
     * On open, optionally re-derive each group's expanded state from a policy. `'collapse-empty'` expands
     * groups that currently have a selection; a custom predicate is evaluated against the current draft.
     * When no policy is given the state is left untouched, so it persists across opens.
     */
    applyExpandOnOpen(policy?: ExpandOnOpenPolicy): void;
    /** Seed the live expanded state from config, preserving any key that already has a live value. */
    private seedExpanded;
    /** Keep only keys present in `groups`; fill missing keys with their empty value, preserve existing ones. */
    private reconcileKeyspace;
    /** Project an external value onto the current keyspace: matching entries kept, others empty, extras dropped. */
    private projectValues;
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<FilterState, never>;
    static ɵprov: _angular_core.ɵɵInjectableDeclaration<FilterState>;
}

declare class FilterDropdownComponent implements DropdownOverlay {
    private readonly overlay;
    readonly filterState: FilterState;
    /**
     * Seed the component state from its inputs. This is the ONLY reactive path and it is silent:
     * it just copies inputs into `FilterState`. It never emits — emitting lives exclusively in the
     * user-gesture handlers below — so feeding an applied `value` back here cannot start a loop.
     * `savedValue` falls back to `value` when omitted (non-preset consumers).
     */
    syncFromInputs: _angular_core.EffectRef;
    filterGroupTemplate: _angular_core.Signal<TemplateRef<unknown> | undefined>;
    /**
     * The filter groups to display: STRUCTURE only (keys, titles, options, locks, display type, and the
     * optional initial `expanded` seed). Not a value binding — selection lives in `value`, never here.
     */
    groups: _angular_core.InputSignal<FilterDropdownGroup[]>;
    /** The current / applied selection. Seeds the editable draft; re-seeding is silent (never emits). */
    value: _angular_core.InputSignal<FilterDropdownOutput>;
    /**
     * The consumer's saved value (e.g. the active preset's filter) that the dirty state and Reset compare
     * against. Falls back to `value` when omitted. Kept distinct from `value` so an auto-applied edit stays
     * dirty vs the preset.
     */
    savedValue: _angular_core.InputSignal<FilterDropdownOutput | undefined>;
    /** Whether the filter needs the apply button to be clicked for applyFilters to emit  */
    needApplyButton: _angular_core.InputSignal<boolean>;
    /** Whether the filter group can be closed (collapsed) by the user. If false, the group will always be expanded and the user won't see a toggle button. */
    closable: _angular_core.InputSignal<boolean>;
    /**
     * Policy deciding which groups start expanded each time the dropdown opens. `'collapse-empty'` expands
     * groups that currently have a selection; a predicate is evaluated per group against its draft value.
     * Omitted → the expand/collapse state persists across opens.
     */
    expandOnOpen: _angular_core.InputSignal<ExpandOnOpenPolicy | undefined>;
    /** whether the feature to save presets is locked for the org */
    presetsFeatureLocked: _angular_core.InputSignal<boolean>;
    /** whether the mode is in preset mode */
    savePresetsMode: _angular_core.InputSignal<boolean>;
    /** whether the user is currently editing presets. Only necessary if savePresetsMode is at true */
    editingPresetsMode: _angular_core.InputSignal<boolean>;
    /** Whether to show a backdrop that closes the dropdown when clicked */
    showBackdrop: _angular_core.InputSignal<boolean>;
    /** Default position for the dropdown relative to the trigger element */
    defaultPosition: _angular_core.InputSignal<"left" | "right">;
    saveNewPresetsText: _angular_core.InputSignal<string>;
    saveAsNewPresetText: _angular_core.InputSignal<string>;
    savePresetText: _angular_core.InputSignal<string>;
    updateExistingPresetText: _angular_core.InputSignal<string>;
    resetFilterText: _angular_core.InputSignal<string>;
    applyFiltersText: _angular_core.InputSignal<string>;
    clearFilterText: _angular_core.InputSignal<string>;
    /** Emits when the dropdown menu is opened */
    opened: _angular_core.OutputEmitterRef<void>;
    /** Emits when the dropdown menu is closed */
    closed: _angular_core.OutputEmitterRef<void>;
    /** Emits when save presets is clicked but is feature locked */
    presetsLockedClicked: _angular_core.OutputEmitterRef<void>;
    /** Emits when save presets is clicked */
    saveNewPresets: _angular_core.OutputEmitterRef<FilterDropdownOutput>;
    /** Emits when save presets is clicked */
    updatePresets: _angular_core.OutputEmitterRef<FilterDropdownOutput>;
    /** Emits when filters are applied */
    applyFilters: _angular_core.OutputEmitterRef<FilterDropdownOutput>;
    /** Emits when user clicks on clear filter */
    clearFilters: _angular_core.OutputEmitterRef<void>;
    /** Emits when user clicks on reset filter */
    resetFilters: _angular_core.OutputEmitterRef<void>;
    /** Event emitted when a select item feature locked is clicked */
    lockedFeatureClicked: _angular_core.OutputEmitterRef<FilterDropdownItemSelect>;
    /** Event emitted when a group with locked feature is clicked */
    filterDropdownGroupLockedClicked: _angular_core.OutputEmitterRef<FilterDropdownGroup>;
    readonly isOpen: _angular_core.Signal<boolean>;
    savePresetsDropdownItems: _angular_core.Signal<ActionDropdownItem[]>;
    /** Opens the dropdown menu at the specified trigger element */
    open(triggerElement?: HTMLElement): void;
    /** Closes the dropdown menu and cleans up overlay resources */
    close(): void;
    /** Toggles the dropdown menu open or closed state */
    toggle(triggerElement?: HTMLElement): void;
    /**
     * A leaf reported a user edit. Store it, then — in auto-apply mode — emit the new snapshot
     * immediately. This is the whole auto-apply mechanism: an edit is a gesture, so it emits here;
     * seeding an input never runs this handler, so an echoed value can never loop.
     */
    onLeafEdit(edit: FilterValueEdit): void;
    /** Manual-apply commit (Apply button; only rendered when `needApplyButton`). */
    onApplyFilters(): void;
    onClearFilters(): void;
    onResetFilters(): void;
    /** In auto-apply mode, push the current draft to the consumer. The single place clear/reset/leaf-edit funnel through. */
    private emitIfAuto;
    onSavePresets(): void;
    onUpdatePresets(): void;
    protected onActionDropdownItemClick(item: ActionDropdownItem): void;
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<FilterDropdownComponent, never>;
    static ɵcmp: _angular_core.ɵɵComponentDeclaration<FilterDropdownComponent, "ap-filter-dropdown", never, { "groups": { "alias": "groups"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "savedValue": { "alias": "savedValue"; "required": false; "isSignal": true; }; "needApplyButton": { "alias": "needApplyButton"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; "expandOnOpen": { "alias": "expandOnOpen"; "required": false; "isSignal": true; }; "presetsFeatureLocked": { "alias": "presetsFeatureLocked"; "required": false; "isSignal": true; }; "savePresetsMode": { "alias": "savePresetsMode"; "required": false; "isSignal": true; }; "editingPresetsMode": { "alias": "editingPresetsMode"; "required": false; "isSignal": true; }; "showBackdrop": { "alias": "showBackdrop"; "required": false; "isSignal": true; }; "defaultPosition": { "alias": "defaultPosition"; "required": false; "isSignal": true; }; "saveNewPresetsText": { "alias": "saveNewPresetsText"; "required": false; "isSignal": true; }; "saveAsNewPresetText": { "alias": "saveAsNewPresetText"; "required": false; "isSignal": true; }; "savePresetText": { "alias": "savePresetText"; "required": false; "isSignal": true; }; "updateExistingPresetText": { "alias": "updateExistingPresetText"; "required": false; "isSignal": true; }; "resetFilterText": { "alias": "resetFilterText"; "required": false; "isSignal": true; }; "applyFiltersText": { "alias": "applyFiltersText"; "required": false; "isSignal": true; }; "clearFilterText": { "alias": "clearFilterText"; "required": false; "isSignal": true; }; }, { "opened": "opened"; "closed": "closed"; "presetsLockedClicked": "presetsLockedClicked"; "saveNewPresets": "saveNewPresets"; "updatePresets": "updatePresets"; "applyFilters": "applyFilters"; "clearFilters": "clearFilters"; "resetFilters": "resetFilters"; "lockedFeatureClicked": "lockedFeatureClicked"; "filterDropdownGroupLockedClicked": "filterDropdownGroupLockedClicked"; }, never, never, true, never>;
}

declare class FilterDropdownButtonComponent {
    private readonly filterDropdown;
    isFilterCountActive: _angular_core.Signal<boolean>;
    activeFilterCount: _angular_core.Signal<number>;
    /** text of the button, input specific to the button */
    buttonFilterText: _angular_core.InputSignal<string>;
    /** input specific to the filter-dropdown */
    /** The filter groups to display: STRUCTURE only (keys, titles, options, locks, display type, expand seed). */
    groups: _angular_core.InputSignal<FilterDropdownGroup[]>;
    /** The current / applied selection. Seeds the editable draft; re-seeding is silent (never emits). */
    value: _angular_core.InputSignal<FilterDropdownOutput>;
    /** The consumer's saved value (e.g. the active preset's filter) that dirty state / Reset compare against. Falls back to `value`. */
    savedValue: _angular_core.InputSignal<FilterDropdownOutput | undefined>;
    /** Whether the filter needs the apply button to be clicked for applyFilters to emit  */
    needApplyButton: _angular_core.InputSignal<boolean>;
    /** Whether the filter group can be closed (collapsed) by the user. If false, the group will always be expanded and the user won't see a toggle button. */
    closable: _angular_core.InputSignal<boolean>;
    /** Policy deciding which groups start expanded on each open ('collapse-empty' | predicate). Omitted → persist. */
    expandOnOpen: _angular_core.InputSignal<ExpandOnOpenPolicy | undefined>;
    /** whether the feature to save presets is locked for the org */
    presetsFeatureLocked: _angular_core.InputSignal<boolean>;
    /** whether the mode is in preset mode */
    savePresetsMode: _angular_core.InputSignal<boolean>;
    /** whether the user is currently editing presets. Only necessary if savePresetsMode is at true */
    editingPresetsMode: _angular_core.InputSignal<boolean>;
    /** Whether to show a backdrop that closes the dropdown when clicked */
    showBackdrop: _angular_core.InputSignal<boolean>;
    /** Whether the dropdown is disabled and cannot be opened */
    disabled: _angular_core.InputSignal<boolean>;
    /** Default position for the dropdown relative to the trigger element */
    defaultPosition: _angular_core.InputSignal<"left" | "right">;
    saveNewPresetsText: _angular_core.InputSignal<string>;
    saveAsNewPresetText: _angular_core.InputSignal<string>;
    savePresetText: _angular_core.InputSignal<string>;
    updateExistingPresetText: _angular_core.InputSignal<string>;
    resetFilterText: _angular_core.InputSignal<string>;
    applyFiltersText: _angular_core.InputSignal<string>;
    clearFilterText: _angular_core.InputSignal<string>;
    /** Emits when the dropdown menu is opened */
    opened: _angular_core.OutputEmitterRef<void>;
    /** Emits when the dropdown menu is closed */
    closed: _angular_core.OutputEmitterRef<void>;
    /** Emits when save presets is clicked but is feature locked */
    presetsLockedClicked: _angular_core.OutputEmitterRef<void>;
    /** Emits when save presets is clicked */
    saveNewPresets: _angular_core.OutputEmitterRef<FilterDropdownOutput>;
    /** Emits when save presets is clicked */
    updatePresets: _angular_core.OutputEmitterRef<FilterDropdownOutput>;
    /** Emits when filters are applied */
    applyFilters: _angular_core.OutputEmitterRef<FilterDropdownOutput>;
    /** Emits when user clicks on clear filter */
    clearFilters: _angular_core.OutputEmitterRef<void>;
    /** Emits when user clicks on reset filter */
    resetFilters: _angular_core.OutputEmitterRef<void>;
    /** Event emitted when a select item feature locked is clicked */
    lockedFeatureClicked: _angular_core.OutputEmitterRef<FilterDropdownItemSelect>;
    /** Event emitted when a group with locked feature is clicked */
    filterDropdownGroupLockedClicked: _angular_core.OutputEmitterRef<FilterDropdownGroup>;
    static ɵfac: _angular_core.ɵɵFactoryDeclaration<FilterDropdownButtonComponent, never>;
    static ɵcmp: _angular_core.ɵɵComponentDeclaration<FilterDropdownButtonComponent, "ap-filter-dropdown-button", never, { "buttonFilterText": { "alias": "buttonFilterText"; "required": false; "isSignal": true; }; "groups": { "alias": "groups"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "savedValue": { "alias": "savedValue"; "required": false; "isSignal": true; }; "needApplyButton": { "alias": "needApplyButton"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; "expandOnOpen": { "alias": "expandOnOpen"; "required": false; "isSignal": true; }; "presetsFeatureLocked": { "alias": "presetsFeatureLocked"; "required": false; "isSignal": true; }; "savePresetsMode": { "alias": "savePresetsMode"; "required": false; "isSignal": true; }; "editingPresetsMode": { "alias": "editingPresetsMode"; "required": false; "isSignal": true; }; "showBackdrop": { "alias": "showBackdrop"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "defaultPosition": { "alias": "defaultPosition"; "required": false; "isSignal": true; }; "saveNewPresetsText": { "alias": "saveNewPresetsText"; "required": false; "isSignal": true; }; "saveAsNewPresetText": { "alias": "saveAsNewPresetText"; "required": false; "isSignal": true; }; "savePresetText": { "alias": "savePresetText"; "required": false; "isSignal": true; }; "updateExistingPresetText": { "alias": "updateExistingPresetText"; "required": false; "isSignal": true; }; "resetFilterText": { "alias": "resetFilterText"; "required": false; "isSignal": true; }; "applyFiltersText": { "alias": "applyFiltersText"; "required": false; "isSignal": true; }; "clearFilterText": { "alias": "clearFilterText"; "required": false; "isSignal": true; }; }, { "opened": "opened"; "closed": "closed"; "presetsLockedClicked": "presetsLockedClicked"; "saveNewPresets": "saveNewPresets"; "updatePresets": "updatePresets"; "applyFilters": "applyFilters"; "clearFilters": "clearFilters"; "resetFilters": "resetFilters"; "lockedFeatureClicked": "lockedFeatureClicked"; "filterDropdownGroupLockedClicked": "filterDropdownGroupLockedClicked"; }, never, never, true, never>;
}

export { FilterDropdownButtonComponent, FilterDropdownComponent };
export type { ExpandOnOpenPolicy, FilterDropdownGroup, FilterDropdownGroupCheckbox, FilterDropdownGroupDateRange, FilterDropdownGroupRadio, FilterDropdownGroupSelectMultiple, FilterDropdownGroupSelectSingle, FilterDropdownGroupToggle, FilterDropdownItemCheckbox, FilterDropdownItemRadio, FilterDropdownItemSelect, FilterDropdownItemToggle, FilterDropdownOutput, FilterDropdownType, FilterDropdownValue, FilterDropdownValueCheckbox, FilterDropdownValueDateRange, FilterDropdownValueMultipleSelect, FilterDropdownValueRadio, FilterDropdownValueSingleSelect, FilterDropdownValueToggle, FilterValueEdit };
