fox-block-builder
Version:
Maintainable code for loop slack-block-kit-like modal builder
135 lines (134 loc) • 5.46 kB
TypeScript
import type { ButtonBuilder, ChannelMultiSelectBuilder, ChannelSelectBuilder, CheckboxesBuilder, DatePickerBuilder, DateTimePickerBuilder, ExternalMultiSelectBuilder, ExternalSelectBuilder, FileInputBuilder, RadioButtonsBuilder, StaticMultiSelectBuilder, StaticSelectBuilder, TextInputBuilder, TimePickerBuilder, UserMultiSelectBuilder, UserSelectBuilder } from '../../elements';
import type { DividerBuilder, HeaderBuilder, InputBuilder, SectionBuilder } from '../../blocks';
import { EmailInputBuilder, NumberInputBuilder, URLInputBuilder } from '../../elements';
import { DirectorySelectBuilder } from '../../elements/directory-select';
import { OneSSelectBuilder } from '../../elements/one-s-select';
import { IPluginModalMeta } from '../../plugin/modal/plugin-modal-meta.builder';
import { ImageSelectBuilder } from '../../elements/image-select';
import { DateRangePickerBuilder } from '../../elements/date-range-picker';
import { DirectoryName } from '../../directory';
import { AddableInputBuilder } from '../../elements/addable-input';
import { Prop } from '../constants';
export * from './modal.types';
export * from './plugin.types';
export type SectionElementBuilder = ButtonBuilder;
export type InputElementBuilder = ChannelMultiSelectBuilder | ChannelSelectBuilder | CheckboxesBuilder | DatePickerBuilder | DateTimePickerBuilder | EmailInputBuilder | ExternalMultiSelectBuilder | ExternalSelectBuilder | NumberInputBuilder | RadioButtonsBuilder | StaticMultiSelectBuilder | StaticSelectBuilder | TextInputBuilder | TimePickerBuilder | URLInputBuilder | UserMultiSelectBuilder | UserSelectBuilder | FileInputBuilder
/** Новые виды */
| DirectorySelectBuilder | OneSSelectBuilder | ImageSelectBuilder | DateRangePickerBuilder | AddableInputBuilder;
export type BlockBuilder = DividerBuilder | HeaderBuilder | InputBuilder | SectionBuilder;
export type ViewBlockBuilder = BlockBuilder;
export type FilterString = 'im' | 'mpim' | 'private' | 'public';
export type OneSSelectType = 'position' | 'depts';
export type YearSinceType = 'single' | 'double';
export interface ObjectLiteral {
[key: string]: any;
}
export type Ctor<T = Record<string, unknown>> = new (...args: any[]) => T;
export type AbstractCtor<T> = {
prototype: T;
};
export type Undefinable<T> = T | undefined;
export type Nullable<T> = T | null;
export type Settable<T> = Undefinable<T>;
export type UndefinableArray<T> = Undefinable<T>[];
export type Appendable<T> = UndefinableArray<T | UndefinableArray<T>>;
export type Fn<T, R> = (arg: T) => R;
export type BlockBuilderReturnableFn<T> = Fn<T, Appendable<BlockBuilder>>;
export type StringReturnableFn<T> = Fn<T, string>;
export type YearSinceParams = {
/** Год, с которого начать */
since: number;
/** флажок заполнения одним числом (2020) или двумя (2020-2021) */
type?: 'single' | 'double';
};
export type DirectoryParams = {
type: 'name';
name: DirectoryName;
[Prop.HintField]?: number;
} | {
type: 'api';
key: number;
parentKeys?: number[] | 'all';
[Prop.HintField]?: number;
};
export type OffsetParams = {
/** Оффсет относительно сегодня */
offset: number;
/** Учитывать только рабочие дни */
business?: boolean;
};
export type AnalyticsParams = {
/** ID аналитики */
analyticId: number;
/** ID поля аналитики */
fieldId: number;
/** ID лейбла аналитики */
labelId?: number;
/** Значения по значениям другого блока */
refs?: {
blockId: string;
value: string;
field?: number;
}[];
};
export type OnChangeNavigate = {
type: 'url';
url: string;
} | {
type: 'modal';
name: string;
};
export type OnChangeModal = {
/** Заголовок */
title?: string;
/** markdown */
text?: string;
okText?: string;
closeText?: string;
/** Отправка при сабмите */
submit: boolean;
/** Отправка на произвольный эндпоинт */
external?: {
data?: any;
url: string;
};
};
export type OnChangeSubmitParams = {
type: 'submit';
submit: boolean;
navigate?: OnChangeNavigate;
clearHistory?: boolean;
metadata?: IPluginModalMeta;
};
export type OnChangeModalParams = {
type: 'modal';
navigate?: OnChangeNavigate;
clearHistory?: boolean;
url?: string;
metadata?: IPluginModalMeta;
modal: OnChangeModal;
};
export type OnChangeParams = OnChangeSubmitParams | OnChangeModalParams;
export type OnSelectParams = OnChangeParams;
export type TImageSelectVariant = 'select' | 'popover';
export type TRegExpParams = {
regExp: RegExp;
message?: string;
};
export type OffsetRangeParams = {
/** Оффсет относительно сегодня */
offsetMin: number;
/** Оффсет относительно сегодня */
offsetMax: number;
/** Учитывать только рабочие дни */
business?: boolean;
};
export type MultiBlockParams = {
blocks: BlockBuilder[];
/** Оффсет относительно сегодня */
offsetMin: number;
/** Оффсет относительно сегодня */
offsetMax: number;
/** Учитывать только рабочие дни */
business?: boolean;
};