import { FieldSchema, StructureSchema, ValueType } from '@ephox/boulder'; import type { Optional, Result } from '@ephox/katamari'; import * as ComponentSchema from '../../core/ComponentSchema'; import type { CardMenuItemSpec } from '../menu/CardMenuItem'; import { type SeparatorMenuItem, separatorMenuItemSchema, type SeparatorMenuItemSpec } from '../menu/SeparatorMenuItem'; export type ColumnTypes = number | 'auto'; export type SeparatorItemSpec = SeparatorMenuItemSpec; export interface AutocompleterItemSpec { type?: 'autocompleteitem'; value: string; text?: string; icon?: string; meta?: Record; } export type AutocompleterContents = SeparatorItemSpec | AutocompleterItemSpec | CardMenuItemSpec; export type SeparatorItem = SeparatorMenuItem; export interface AutocompleterItem { type: 'autocompleteitem'; value: string; text: Optional; icon: Optional; active: boolean; enabled: boolean; meta: Record; } export interface AutocompleterSpec { type?: 'autocompleter'; trigger: string; minChars?: number; columns?: ColumnTypes; matches?: (rng: Range, text: string, pattern: string) => boolean; fetch: (pattern: string, maxResults: number, fetchOptions: Record) => Promise; onAction: (autocompleterApi: AutocompleterInstanceApi, rng: Range, value: string, meta: Record) => void; maxResults?: number; highlightOn?: string[]; } export interface AutocompleterInstanceApi { hide: () => void; reload: (fetchOptions: Record) => void; } export interface Autocompleter { type: 'autocompleter'; trigger: string; minChars: number; columns: ColumnTypes; matches: Optional<(rng: Range, text: string, pattern: string) => boolean>; fetch: (pattern: string, maxResults: number, fetchOptions: Record) => Promise; onAction: (autocompleterApi: AutocompleterInstanceApi, rng: Range, value: string, meta: Record) => void; maxResults: number; highlightOn: string[]; } const autocompleterItemSchema = StructureSchema.objOf([ // Currently, autocomplete items don't support configuring type, active, disabled, meta ComponentSchema.defaultedType('autocompleteitem'), ComponentSchema.active, ComponentSchema.enabled, ComponentSchema.defaultedMeta, ComponentSchema.value, ComponentSchema.optionalText, ComponentSchema.optionalIcon ]); const autocompleterSchema = StructureSchema.objOf([ ComponentSchema.type, FieldSchema.requiredString('trigger'), FieldSchema.defaultedNumber('minChars', 1), ComponentSchema.defaultedColumns(1), FieldSchema.defaultedNumber('maxResults', 10), FieldSchema.optionFunction('matches'), ComponentSchema.fetch, ComponentSchema.onAction, FieldSchema.defaultedArrayOf('highlightOn', [], ValueType.string) ]); export const createSeparatorItem = (spec: SeparatorItemSpec): Result> => StructureSchema.asRaw('Autocompleter.Separator', separatorMenuItemSchema, spec); export const createAutocompleterItem = (spec: AutocompleterItemSpec): Result> => StructureSchema.asRaw('Autocompleter.Item', autocompleterItemSchema, spec); export const createAutocompleter = (spec: AutocompleterSpec): Result> => StructureSchema.asRaw('Autocompleter', autocompleterSchema, spec );