fox-block-builder
Version:
Maintainable code for loop slack-block-kit-like modal builder
199 lines (198 loc) • 7.14 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';
import { AxiosRequestConfig } from 'axios';
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 ElementTeamParams = {
type: 'current';
} | {
type: 'all';
} | {
type: 'id';
id: string;
};
export type FetchValuesParams = {
url: string;
config?: AxiosRequestConfig;
};
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 InitialUserEmail = {
type: 'email';
email: string;
};
export type InitialUserId = {
type: 'id';
id: string;
};
export type InitialUserUsername = {
type: 'username';
username: string;
};
export type InitialUserParams = InitialUserEmail | InitialUserId | InitialUserUsername;
export type DirectoryNameParams = {
type: 'name';
name: DirectoryName;
[Prop.HintField]?: number;
/** Включить в ответ подразделы с key */
includeKeys?: number[];
/** Не включать в ответ подразделы с key */
removeKeys?: number[];
};
export type DirectoryApiParams = {
type: 'api';
id: number;
parentKey?: number;
/** Включить в ответ подразделы с key */
includeKeys?: number[];
/** Не включать в ответ подразделы с key */
removeKeys?: number[];
onlyEntries?: boolean;
/** Взять parentKey из другого блока */
parentKeyBlockId?: string;
[Prop.HintField]?: number;
};
export type DirectoryParams = DirectoryNameParams | DirectoryApiParams;
export type OffsetParams = {
/** Оффсет относительно сегодня */
offset: number;
/** Учитывать только рабочие дни */
business?: boolean;
};
export type DatePickerPickerParams = {
type: 'date';
/** DD.MM.YYYY */
start?: string;
/** DD.MM.YYYY */
end?: string;
multi?: boolean;
} | {
type: 'year';
/** Показать как {год} - {год + 1} */
double?: boolean;
/** YYYY */
start?: string;
/** YYYY */
end?: string;
/** Флаг, что можно выбирать год в будущем */
allowFuture?: boolean;
multi?: boolean;
} | {
type: 'month';
/** Показать как {месяц} - {след. месяц} */
double?: boolean;
/** '0'-'11' */
start?: string;
/** '0'-'11' */
end?: string;
multi?: 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;
};
export type MaxDateRangeParams = {
type: 'days' | 'months' | 'years' | 'ms';
length: number;
};