Commit 7439d626 by Vladislav Lagunov

[fields] Исправления в ~/Form.ts

parent 5870a612
......@@ -23,7 +23,7 @@ export type Props<A=any> = StandardProps<React.HTMLProps<HTMLDivElement>, string
pending?: boolean;
dontMove?: boolean;
// callbacks
// Callbacks
onSelect?(a: A): void;
onVisibilityChange?(open: boolean): void;
}
......@@ -192,7 +192,7 @@ class Suggestions<A> extends React.Component<Props<A>, State> {
}
}
export default withStyles(styles)(withGettext(require('./i18n.yml'))(Suggestions));
export default withStyles(styles)(withGettext(require('./i18n.po.yml'))(Suggestions));
// Styles
......
......@@ -10,7 +10,7 @@ const eyeSlash = require('./eye-slash.svg');
// Props
export type Props = StandardProps<React.HTMLProps<HTMLDivElement>, ClassKey, 'ref'|'onKeyDown'|'disabled'> & FieldProps<string> & {
export type Props = StandardProps<React.HTMLProps<HTMLInputElement>, ClassKey, 'ref'|'disabled'> & FieldProps<string> & {
__: Gettext;
ctx?: LocaleCtx;
type?: React.HTMLProps<HTMLInputElement>['type'];
......@@ -115,7 +115,7 @@ export class TextField extends React.Component<Props, State> {
}
}
export default withGettext(require('./i18n.yml'))(TextField);
export default withGettext(require('./i18n.po.yml'))(TextField);
// CSS классы
......
import * as React from 'react';
import { AuthCtx as Ctx } from '~/context';
import { I18nString } from '~/gettext';
import { ObjectPath } from '~/functions/get-at';
export const { Provider, Consumer } = React.createContext<FieldProps>(void 0 as any);
// Контекст поля
export interface FieldProps<Value=any> {
export interface FieldProps<T = any> {
ctx?: Ctx;
value: Value;
value: T;
disabled?: Disabled;
error?: Error|Validation<any>;
onValueChange?(value: Value): void;
// Здесь должен передавться результат `validate` те `Validation<A>`
error?: Error;
onValueChange?(value: T): void;
onValueChange?(value: any, at?: ObjectPath): void;
onFocus?(e?: React.SyntheticEvent): void;
onBlur?(e?: React.SyntheticEvent): void;
onClick?(e?: React.SyntheticEvent): void;
onKeyDown?(e: React.KeyboardEvent): void;
}
// Флаги активности
export interface DisabledRecord {
[K: string]: Disabled;
}
export type Disabled = boolean|DisabledRecord;
export type Disabled = boolean|object;
// Ошибки в форме
export interface ErrorRecord {
[K: string]: Error;
}
export type Error = boolean|string|ErrorRecord|I18nString;
// Ошибки в поле
export type Error = boolean|string|object|I18nString;
// Валидация формы
export type Validation<A> = Partial<Record<keyof A, Error>>;
......@@ -4,6 +4,7 @@ import { FieldProps } from './';
// import { StandardProps } from '@material-ui/core';
import memoize from '~/functions/memoize';
import { ObjectKey, ObjectPath } from '~/functions/get-at';
import { isEqual } from 'lodash';
// Props
......@@ -18,24 +19,18 @@ export type CardProps<T> = {
//
export type Any<T=any> = React.ReactType<FieldProps<T>>;
export type AnyC<T=any> = React.ReactElement<FieldProps<T>>;
export type GetProps<T extends Any> = T extends React.ReactType<infer Props> ? Props : never;
// Props
export type ZoomComponentProps<C extends Any> = {
Component: C;
} & GetProps<C>;
export type CreateZoomOptions<T> = {
export type CreateFormOptions<T> = {
validate?(value: T): any;
disabled?(value: T): any;
};
export default function createForm<O extends CreateZoomOptions<any>>(options: O) {
type T = O extends CreateZoomOptions<infer T> ? T : never;
export default function createForm<O extends CreateFormOptions<any>>(options: O) {
type T = O extends CreateFormOptions<infer T> ? T : never;
function bindZoom(self: React.Component<CardProps<T>>) {
function Zoom<K1 extends keyof T, C extends Any<T[K1]>>(...keys: [K1]): (Component: C, props?: GetProps<C>) => JSX.Element;
function Zoom<K1 extends keyof T, K2 extends keyof T[K1], C extends Any<T[K1][K2]>>(...keys: [K1, K2]): (Component: C, props?: GetProps<C>) => JSX.Element;
......@@ -62,8 +57,22 @@ export default function createForm<O extends CreateZoomOptions<any>>(options: O)
return Zoom;
}
function set<M extends CardProps<T>['model']>(model: M, form: T): M {
// @ts-ignore
return isEqual(model.initial, form) ? { ...model, modified: null } : { ...model, modified: form };
}
function get<M extends CardProps<T>['model']>(model: M): T {
// @ts-ignore
return model.modified || model.initial;
}
function modify<M extends CardProps<T>['model']>(model: M, f: (form: T) => T): M {
return set(model, f(get(model)));
}
// @ts-ignore
return { ...options, bindZoom } as { bindZoom: typeof bindZoom } & O;
return { ...options, bindZoom, set, get, modify } as { bindZoom: typeof bindZoom, set: typeof set, get: typeof get, modify: typeof modify } & O;
}
......
# https://git.bitmaster.ru/npm/common/tree/master/gettext#%D0%A4%D0%BE%D1%80%D0%BC%D0%B0%D1%82-poyml
- "":
locale: "ru-RU"
"Fill out this field": "Заполните это поле"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment