Skip to content

Files

Latest commit

 

History

History
143 lines (120 loc) · 3.65 KB

Shared.md

File metadata and controls

143 lines (120 loc) · 3.65 KB

Shared APIs

Inputs

interface InputBase {
  isDisabled?: boolean,
  isRequired?: boolean,
  validationState?: 'valid' | 'invalid',
  isReadOnly?: boolean,
  autoFocus?: boolean
}

interface ValueBase<T> {
  value?: T,
  defaultValue?: T,
  onChange?: (value: T, e?: Event) => void,
}

interface TextInputBase {
  placeholder?: string
}

interface RangeValue<T> {
  start: T,
  end: T
}

interface RangeInputBase<T> {
  minValue?: T,
  maxValue?: T,
  step?: T // ??
}

type LabelPosition = 'top' | 'side';
type Alignment = 'start' | 'end';
type NecessityIndicator = 'icon' | 'label';

interface Labelable {
  label?: ReactNode,
  isRequired?: boolean,
  labelPosition?: LabelPosition,
  labelAlign?: Alignment,
  necessityIndicator?: NecessityIndicator
}

Selection

interface SelectionOptions {
  allowsSelection?: boolean,
  allowsMultipleSelection?: boolean,
  allowsEmptySelection?: boolean,
  typeToSelect?: boolean // ???
}

interface MultipleSelectionBase extends SelectionOptions {
  selectedItems?: Array<any>,
  defaultSelectedItems?: Array<any>,
  onSelectionChange?: (selectedItems: Array<any>) => void
}

interface SingleSelectionBase {
  selectedItem?: any,
  defaultSelectedItem?: any,
  onSelectionChange?: (selectedItem: any) => void,
  typeToSelect?: boolean // or is it really typeToFocus?
}

Drag and Drop

interface DndBase {
  dragDelegate?: DragDelegate,
  dropDelegate?: DropDelegate
};

enum DropOperation {
  NONE = 0,
  MOVE = 1 << 0,
  COPY = 1 << 1,
  LINK = 1 << 2,
  ALL = MOVE | COPY | LINK
};

enum DropPosition {
  ON = 1 << 0,
  BETWEEN = 1 << 1,
  ANY = ON | BETWEEN
};

interface DragTarget {
  value: any
}

interface DropTarget {
  value: null | any, // if null, represents the entire tree/table
  index: number, // todo: figure out tableview sections
  dropPosition: DropPosition
}

// drag and drop + copy/paste
interface DataTransferDelegate {
  write?(dataTransfer: DataTransfer, items: any[]): void,
  read?(dataTransfer: DataTransfer): any[]
}

interface ClipboardDelegate {
  copy?(dataTransfer: DataTransfer, items: any[]): void,
  cut?(dataTransfer: DataTransfer, items: any[],
  paste?(dataTransfer: DataTransfer): void
}

interface DragDelegate {
  shouldAllowDrag?(target: DragTarget): boolean,
  prepareDragData(target: DragTarget, dataTransfer: DataTransfer): void,
  getAllowedDropOperations?(target: DropTarget): DropOperation,
  renderDragView(items: any[]) => ReactNode,
  onDragEnd?(target: DropTarget, dropOperation: DropOperation): void
}

interface DropDelegate {
  shouldAcceptDrop?(target: DropTarget, types: Set<string>): boolean,
  getAllowedDropPositions?(target: DropTarget): DropPosition, // NEW
  overrideDropTarget?(target: DropTarget): DropTarget,
  getDropOperation?(target: DropTarget, allowedOperations: DropOperation): DropOperation,
  onDropTargetChange?(target: DropTarget): void,
  onDrop(target: DropTarget, dataTransfer: DataTransfer, dropOperation: DropOperation): void,

  // TODO: what to do about this??
  onReorder?(items: any[], dropTarget: DropTarget, dropOperation: DropOperation): void
}