Skip to content

Latest commit

 

History

History
3973 lines (2493 loc) · 101 KB

api.md

File metadata and controls

3973 lines (2493 loc) · 101 KB

Table of Contents

Runners

Освновные расширяемые класс по управлению клиентом и сервером

AbstractClientRunner

Абстракный класс для точечной настройки процесса запуска клиентской (браузерной) части приложения

Parameters

  • runnerOptions (optional, default {})
  • htmlContainerId id дива, в котором будет разворачиваться реатовское приложение

getReducers

для hot reload необходимо загружать через require

Returns {}

getModuleToRoutePrefixMap

Маппинг модуля на путь

getApiClientClass

место для переопределения и инициализации инстанса BaseApiClient

CoreClientRunner

Extends AbstractClientRunner

Расширение для установки core зависимостей по redux и импорт данных, пришедших с сервера при отрисовки

loadCommonSubModulesContexts

нужно выделить отдельный метод с контекстами, для hot reload (чтобы там id их использовать)

Returns [any]

getReducers

Возвращаем мапу редьюсеров

Returns any

AbstractServerRunner

Абстрактный класс для серверного ранера, икапсулирующий логику запуска node js сервера hapi

Parameters

  • runnerOptions (optional, default {})

CoreServerRunner

Extends AbstractServerRunner

Расширение для установки core зависимостей

getPreLoader

Returns any string || (reduxStore, i18n) => string

Navigation

остальное

createStatusesReducer

Parameters

  • typesArray ...any один или несколько массивов, в каждом по три types. Первый - fetch, второй - success, третий - fail

createTablesModule

Parameters

  • tableModuleName
  • ReduxTableClass
  • api

getBindActions

В зависимости есть ли нужный api:

  • apiFindRecords(newMeta, newFilters) -> actionLoadRecords(tableUuid, meta = undefined, filters = undefined, forceUpdate = false)
  • apiUpdateRecord -> actionEditRecord(tableUuid, recordId, patchOperations)
  • apiBulkChangeStatus -> actionBulkChangeStatus(tableUuid, meta, selectedIds, isSelectedAll, newStatus, oldStatus)

Остальные синхронные методы:

  • actionClearFilters(tableUuid)

  • actionChangeRecordsSelected(tableUuid, recordIds, selected)

  • actionChangeRecordsSelectedAll(tableUuid, isSelectedAll)

  • actionClearRecordSelection(tableUuid)

TYPES - типа который будут посылаться при событиях localDataList - лист объектов или (globalState, newMeta, newFilters) => лист объектов

Parameters

  • api (optional, default {})
  • TYPES (optional, default this.getTypes(this.getPrefix()))
  • localDataList (optional, default undefined)

apiFindRecords

апи который возвращает { meta, records }, либо массив, когда мультипейджинг не нужен

apiLoadRecords

Meta

  • deprecated: use apiFindRecords

apiEditRecord

Meta

  • deprecated: use apiUpdateRecord

actionLoadRecords

Parameters

  • tableUuid
  • meta мержится к текушей
  • filters полностью заменяется (чтобы можно было очистить)
  • forceUpdate
  • isReplaceLocation
  • syncWithUrlParameters синхронизировать с url query (но делается scroll to top и не подходит для load more и нескольких таблиц на странице)
  • searchFieldObjects
  • isLoadMore

Returns function (any, any)

getLogLevel

Get log level string based on supplied params

Parameters

Returns string level

createLogger

Creates logger with following options

Parameters

  • options object options for logger (optional, default {})
    • options.level (string | function | object) console[level]
    • options.duration boolean print duration of each action?
    • options.timestamp boolean print timestamp with each action?
    • options.colors object custom colors
    • options.logger object implementation of the console API
    • options.logErrors boolean should errors in action execution be caught, logged, and re-thrown?
    • options.collapsed boolean is group collapsed?
    • options.predicate boolean condition which resolves logger behavior
    • options.stateTransformer function transform state before print
    • options.actionTransformer function transform action before print
    • options.errorTransformer function transform error before print

Returns function logger middleware

getBindActions

Сама мапа таблиц уже добавлена в рутовый редьюсер под именем tables. Поэтому от этого файла достаточно только actions

Нужно в контейнере инициализровать таблицу через метод с уникальным TABLE_ID actionModuleItemInit(TABLE_ID) и можно пользоваться всеми экщенами либо просто обернуть в декоратор - \src\common\utils\decorators\react-class\redux-table.jsx

Экшены actionModuleItemInit(tableUuid, data = undefined) actionModuleItemUpdate(tableUuid, data) actionModuleItemRemove(tableUuid)

Если meta=null|false или filters=null|false - это сбрасывает значения actionLoadRecords(tableUuid, meta = undefined, filters = undefined, forceUpdate = false) actionEditRecord(tableUuid, recordId, patchOperations) actionBulkChangeStatus(tableUuid, meta, selectedIds, isSelectedAll, newStatus, oldStatus)

actionClearFilters(tableUuid)

actionChangeRecordsSelected(tableUuid, recordIds, selected) actionChangeRecordsSelectedAll(tableUuid, isSelectedAll) actionClearRecordSelection(tableUuid)

getTableInfo

Parameters

  • globalState
  • tableUuid

Returns any { records: [], meta: { search: null, startPage: 0, itemsPerPage: 10, sortBy: null, sortDesc: true, total: null, }, filters: { // field: value }, selected: [], isSelectedAll: false,actionLoadRecordsStatus: undefined, actionBulkChangeStatusStatus: undefined, actionEditRecordStatusMap: {} }

createFilteredReducer

Проверяет по action

Parameters

  • reducerFunction
  • reducerPredicate

Returns function (any?, any?)

createReducer

Удобное создание редьюсеров (без лишних switch-case условий)

Parameters

  • initialState
  • handlers key - action type, value - caseReducer
  • fieldsHandlers
  • defaultHandler

Returns reducer

createAllTypesMapCollectionReducer

Parameters

  • TYPES
  • reducer
  • actionIdField
  • createIfNotExist bool | (initialState, action) => {}

Returns any

mergeWithConcatArrays

!!! mutable

Parameters

  • source
  • newObj

Returns any

clientConfig

Располагается в common, так как используется для инициализации и на серверной части тоже для компонентов

initConfig

Конфиги для клиента - это только лишь часть общих конфигов, которые поставляются на клиент вместе с initialState для стора при формировании html страницы

Parameters

  • inputConfig

Returns {}

Info404

Meta

  • deprecated: чтобы не подгружались все лишние компоненты, нужно не импортить index.js а писать полный путь

ThemeProvider

Meta

  • deprecated: чтобы не подгружались все лишние компоненты, нужно не импортить index.js а писать полный путь

ThemeProvider

Extends Component

Компонент задающий тему для своих дочерних компонентов. Важно! Может содержать в себе строго один дочерний компонент.

UniError

Meta

  • deprecated: чтобы не подгружались все лишние компоненты, нужно не импортить index.js а писать полный путь

ListItem

Meta

  • deprecated: чтобы не подгружались все лишние компоненты, нужно не импортить index.js а писать полный путь

Notifications

Meta

  • deprecated: чтобы не подгружались все лишние компоненты, нужно не импортить index.js а писать полный путь

Loading

Meta

  • deprecated: чтобы не подгружались все лишние компоненты, нужно не импортить index.js а писать полный путь

Link

Meta

  • deprecated: чтобы не подгружались все лишние компоненты, нужно не импортить index.js а писать полный путь

MediaQuery

Meta

  • deprecated: чтобы не подгружались все лишние компоненты, нужно не импортить index.js а писать полный путь

ReadMore

Meta

  • deprecated: чтобы не подгружались все лишние компоненты, нужно не импортить index.js а писать полный путь

theme

Тема компонента

className

Дополнительный класс

default

Meta

  • deprecated: user src/common/all-permissions.js

default

Meta

  • deprecated: use feature-ui-form/common/subModule/model-attachment

default

Meta

  • deprecated: use feature-ui-form/common/subModule/model-attachment

Meta

  • deprecated: use src/routes-pathes.js

decoratorContextModules

Декорирует компонент и добавляет в него:

  • getFullPath(location, moduleName)
  • getRoutePath(location, moduleName)
  • onGoTo(location, moduleName)
  • onReplaceLocation(location, moduleName)
  • match
  • location
  • moduleToRoutePrefixMap

location - LocationDescriptor (see \src\common\models\model-location.js)

rootAppComponentProps

themeProviderProps: {}, modulesProviderProps: { moduleToRoutePrefixMap: {} }

appUrl

осторожно!!! contextPath (basename) уже учитывается во всех роутингах, дополнительно в path его задавать не нужно. Поэтому пользуйтесь аккуратно учитывает contextPath (basepath) приложения

Parameters

  • pathname
  • otherPaths ...any

getModuleFullPath

Полный путь до ресурса с учетом префикса различных модулей и contextPath

Parameters

  • relativeLocation LocationDescription - @see model-location.js
  • moduleName
  • modulesPrefixes мапа: moduleName => prefix
  • queryParams

Returns any

initApiClientClass

берется из AbstractClientRunner getApiClientClass

Parameters

  • NewApiClientClass

Returns BaseApiClientClass

initApiClient

Проставляется в AbstractClientRunner

Parameters

  • newApiClient

Returns any

MAP

Meta

  • deprecated: use model-action-status

MAP

Meta

  • deprecated: use UNI_ERROR_PROP_TYPE_MAP

MAP

Meta

  • deprecated: use model-user-info

STATUS_PROP

Meta

  • deprecated: use model-action-status

action-status

Meta

  • deprecated: use model-action-status

ACTION_STATUS_PROPS

Meta

  • deprecated: use ACTION_STATUS_PROP_TYPE

UNI_ERROR_PROPS

Meta

  • deprecated: use UNI_ERROR_PROP_TYPE

USER_INFO_PROPS

Meta

  • deprecated: use USER_INFO_PROP_TYPE

CONSTRAINTS_PROP_TYPE

Meta

  • deprecated: use src/modules/feature-ui-form/common/subModule/model-constraints

FIELD_PROP_TYPE

Meta

  • deprecated: use src/modules/feature-ui-form/common/subModule/model-field

Meta

  • deprecated: use src/modules/feature-ui-form/common/subModule/model-constraints.js

Meta

  • deprecated: use src/modules/feature-ui-form/common/subModule/model-field.js

META_PROP

Type: shim

Meta

  • deprecated: use META_PROP_TYPE

getMeta

Формат ЗАПРОСА от фронта к бэку:

GET http://dev.reagentum.ru:8098/api/projects?search=&sortBy=releaseDate&sortDesc=false&startPage=0&itemsPerPage=20&filters%5BprojectType%5D=START&filters%5Bsupervisor%5D=1&filters%5Bsupervisor%5D=2&filters%5BproductIds%5D=3&filters%5BproductIds%5D=4&groupBy=name

Вот так это выглядит search: sortBy: releaseDate sortDesc: false startPage: 0 itemsPerPage: 20 filters[projectType]: START filters[supervisor]: 1 filters[supervisor]: 2 filters[productIds]: 3 filters[productIds]: 4 groupBy: name

Формат ОТВЕТА от back на front { "meta":{ "search":"", "sortBy":"releaseDate", "sortDesc":false, "startPage":0, "itemsPerPage":20, "groupBy": "name", "total":0 }, "records":[ { ... }, ... ], }

В records и писать ваш иерархичный лист сущностей В принципе можете не группировать ответ, главное чтобы группировка учитывалась при пагинации и сортировки, а мы на фронте уже сгруппируем

Parameters

  • query
  • defaultMeta

filterAndSortDb

Parameters

  • mockDb
  • query search sortBy sortDesc itemsPerPage если false - отменяет разбивку на страницы - выдает все разультаты startPage itemsPerPage
  • searchFieldObjects
  • withPagination
  • isGetAllNotMutable

Returns {records, meta}

USER

Meta

  • deprecated: use /src/modules/module-auth/common/subModule/model-user.js

FROM_BOOM

https://github.com/hapijs/boom

FROM_BOOM_RESPONSE

Meta

  • deprecated: старый формат

FROM_BOOM_ERROR

Meta

  • deprecated: старый формат

clientErrorMessage

Meta

  • deprecated: use clientErrorMessages

uniMessage

Meta

  • deprecated: use uniMessages

parseFromBoom

https://github.com/hapijs/boom

  • isBoom - if true, indicates this is a Boom object instance. Note that this boolean should only be used if the error is an instance of Error. If it is not certain, use Boom.isBoom() instead.
  • isServer - convenience bool indicating status code >= 500.
  • output - the formatted response. Can be directly manipulated after object construction to return a custom error response. Allowed root keys:
  • statusCode - the HTTP status code (typically 4xx or 5xx).
  • headers - an object containing any HTTP headers where each key is a header name and value is the header content.
  • payload - the formatted object used as the response payload (stringified). Can be directly manipulated but any changes will be lost if reformat() is called. Any content allowed and by default includes the following content:
  • statusCode - the HTTP status code, derived from error.output.statusCode.
  • error - the HTTP status message (e.g. 'Bad Request', 'Internal Server Error') derived from statusCode.
  • message - the error message derived from error.message. // - message - the error message. // - typeof - the constructor used to create the error (e.g. Boom.badRequest).
  • inherited Error properties (message, stack)

Parameters

  • errorOrResponse
  • uniErrorData (optional, default {})

parseFromBoomResponse

Parameters

  • errorOrResponse
  • uniErrorData (optional, default {})

Meta

  • deprecated: старый формат

parseFromBoomError

Parameters

  • boomError
  • uniErrorData (optional, default {})

Meta

  • deprecated: старый формат

DEFAULT_VALUES

Meta

  • deprecated: use model-user-info

user-info

Meta

  • deprecated: use model-user-info

PATH_INDEX

Type: string

Meta

  • deprecated: use PATH_MAIN_INDEX

createJsonPatchOperation

по умолчанию не добавляет в конец, нужно обязательно указывать позицию createJsonPatchOperation('/field2', 'newValue4', PATCH_OPERATIONS.ADD),

Parameters

  • path
  • value
  • operationType
  • itemIds

Returns {path: string, value: any, op: string}

createCrudApi

Parameters

  • API_PREFIX
  • sendApiFn
  • options

Returns {API_PREFIX: any, API_CONFIGS: {loadRecords: ({method, path, payload} | any), createRecord: ({method, path, payload} | any), readRecord: ({method, path, payload} | any), updateRecord: ({method, path, payload} | any), patchRecord: ({method, path, payload} | any), deleteRecord: ({method, path, payload} | any)}, apiLoadRecords: (function (any?, any?): any), apiCreateRecord: (function (any?, any?): any), apiReadRecord: (function (any): any), apiUpdateRecord: (function (any, any?): any), apiPatchRecord: (function (any, any?): any), apiDeleteRecord: (function (any): any)}

loadRecords

Meta

  • deprecated: use findRecords

apiCreateRecord

Parameters

  • data
  • filesMap может быть File, массивом File, либо мапой <имя поля>: File|[...File]

Returns any

BaseApiClientClass

Класс для отсылки запросов на сервер

Parameters

  • apiClientOptions (optional, default {})

getUserInfo

Parameters

  • args ...any

Returns any

Meta

  • deprecated: use getUser

ajaxGet

Используется для загрузки НЕ АПИ методов при настроенном на один хост клиент апи (для апи использовать client.post \ client.get)

Parameters

  • absoluteUrl
  • params
  • options

Returns any

ajaxPost

Используется для загрузки НЕ АПИ методов при настроенном на один хост клиент апи

Parameters

  • absoluteUrl
  • data
  • options

Returns any

proceedRequest

object of that fields

Parameters

  • requestOptions
  • url
  • method
  • urlRelative
  • params
  • data
  • pathParams
  • serializer
  • deSerializer
  • type
  • contentType
  • headers
  • timeout
  • mock boolean - use mock on demand, function(requestOptions, error, response){} - execute for result other - result
  • mockFilter function(requestOptions, error, response) {}

Returns Promise

valueFromRange

Примеры valueFromRange( 0, [0, 5, 8, 15, 20], ['a', 'b', 'c', 'd'], 'Y') => 'a' valueFromRange(13, [0, 5, 8, 15, 20], ['a', 'b', 'c', 'd'], 'Y') => 'c' valueFromRange(20, [0, 5, 8, 15, 20], ['a', 'b', 'c', 'd'], 'Y') => 'd' valueFromRange(25, [0, 5, 8, 15, 20], ['a', 'b', 'c', 'd'], 'Y') => 'Y'

Parameters

  • inputValue
  • inputValueRanges
  • outputValueRanges кол-во на одно меньше чем inputValueRanges
  • outRangeValue

removeFirstBy

Parameters

  • array
  • predicate либо значение \ либо (arrayItem, index)

Returns any

findInTree

Parameters

  • tree
  • id
  • config (optional, default {})
  • deep (optional, default 0)
  • path (optional, default [])
  • pathStr (optional, default '')

Meta

  • deprecated: user tree-utils.js::findInTree

findInTree

Ищет первое вхождение в дереве

Parameters

  • tree
  • filter либо искомый id либо функция (treeItem, config)
  • options { fieldChildren = 'children', fieldSearch = 'id', - если не задано поле filter как функция equalConstraint = EQUAL_CONSTRAINTS.EQUAL, }
  • deep (optional, default 0)
  • path (optional, default [])
  • pathStr (optional, default '')

Returns {result: any, isRoot: boolean, pathStr: string}

arrayToTree

Parameters

  • array
  • options (optional, default {})
  • parent (optional, default null)
  • level (optional, default 0)

Meta

  • deprecated: use tree-utils.js arrayToTree

aggregation

https://stackoverflow.com/a/45332959/344172

Parameters

  • BaseClass
  • Mixins ...any

Returns base class Person{ constructor(n){ this.name=n; } } class Male{ constructor(s='male'){ this.sex=s; } } class Child{ constructor(a=12){ this.age=a; } tellAge(){console.log(this.name+' is '+this.age+' years old.');} } class Boy extends aggregation(Person,Male,Child){} var m = new Boy('Mike'); m.tellAge(); // Mike is 12 years old.

emitProcessing

Метод который, который на время исполнения промиса, проставляет через setState значение переменной processingStateVariable (по умолчанию, isProcessing)

Многие промисы - это обычные Promise.resolve и выполняются моментально Поэтому, проверка необходимости этих действий идет через 10 секунд, и если proimse до сих пор в pending тогда запускается setState, чтобы лишний раз не нагружать перерендеринг реакта

Parameters

  • handlerPromise
  • componentWithSetState
  • processingStateVariable
  • immediately выполняет setState сразу же, без задержки в 15 милисекунд

Returns any

createApiConfig

Создание настроек для клиенской части и их роутинг через плагину на серверной

Parameters

  • path
  • method
  • payload

Returns ({method, path, payload} | any)

createApiConfig

Создание настроек для клиенской части и их роутинг через плагину на серверной

Parameters

  • path
  • method
  • payload

Returns ({method, path, payload} | any)

TIMESTAMP

Meta

  • deprecated: use TIMESTAMP_MILLISECONDS or UNIX_TIMESTAMP_SECONDS

reduxSimpleFormDecorator

Декорирует компонент для отображения формы с данными. Упрощенная версия redux-form

Автоматически инициализирует в redux store под forms свои данные и при выходе их очищает

Parameters

  • formId айди форма, или функция (props) => id
  • defaultValues дефолтные значенияПлюс в пропертях можно передать initValues - дефолтные значения из значенийВозвращает компонент с доп пропертями:- form - текущие данные формы
    • formId - id формы
    • getFormId - (props = this.props) => {}
    • onUpdateForm - метод обновления данных

reduxTableDecorator

Декорирует компонент для отображения таблицы с данными Автоматически инициализирует в redux store под tables свои данные и при выходе их очищает

Parameters

  • tableId айди таблицы, или функция (props) => id. !!! Если зависит от table meta или filters то не используйте actionLoadRecords со старым id (вместо этого используйте onUpdateTableFilters и onUpdateTableMeta)Options:
  • $1 Object (optional, default {})
    • $1.loadOnMount (optional, default true)
    • $1.loadOnChange (optional, default true)
    • $1.clearOnUnmount (optional, default true)
    • $1.initMeta (optional, default {})
    • $1.initFilters (optional, default {})
    • $1.tableActions
    • $1.useLoading (optional, default true)
    • $1.urlFilterValueNormalizers
    • $1.syncWithUrlParameters (optional, default false)
    • $1.autoSaveState (optional, default false)
  • loadOnMount запускать загрузку данных при маунте (componentWillMount)
  • loadOnChange если изменилась мета или фильтры - запускает загрузку в componentWillReceiveProps
  • clearOnUnmount очищать ли данные, когда компонент unmount (componentWillUnmount)
  • initMeta (объект или функция от props) - начальная мета, которая будет перезаписана из урл параметров
  • initFilters (объект или функция от props) - начальный фильтры
  • tableActions actions чтобы можно было запускать тут load \ они все передадуться в пропсы (можно в @connect не передавать
  • useLoading использовать лоадинг для первоначальной загрузки
  • urlFilterValueNormalizers мапа : (urlValue)=>normalizedValue - для правильного парсинга из урла значений
  • syncWithUrlParameters синхронизировать с url query (но делается scroll to top и не подходит для load more и нескольких таблиц на странице)Возвращает компонент с доп пропертями:- table - текущая данные таблицы
    • tableId - id таблицы
    • getTableId - (props = this.props) => {} id таблицы, удобно если он зависит от пропсов
    • initMeta - начальная мета из options и урла
    • initFilters - начальный фильтры из options и урла
    • onUpdateTableFilters - (newFilters, replaceAll = false) => {} укороченная записть для actionLoadRecords. Фильтры тут не замекняеются, а мержатся
    • onUpdateTableMeta - (newMeta, replaceAll = false) начальный фильтры из options и урла

titledDecorator

Декорирует компонент, проставляя указанные данные в заголовок и в хедар документа

Parameters

  • id
  • title не более 50 символов (Если title длинный, поисковая система сама выберет, какие 70 символов показать пользователю в соответствии с введенным запросом. И этот выбор непредсказуем)(50–57 символов для Google; 65–70 символов для Яндекс)
  • metas html head meta tags for current page [description, keywords, author, robots, googlebot, google and e.t.] (для CEO, используется в Server Side Rendering, отдачавая поисковым ботам инфу о конкретной странице) - description - не более 150 символов, в 60% случаев Google формирует сниппет из мета-тега description. - keywords (optional, ignored by Google)- robots (optional, used by Google)
  • otherInfo

Returns function (any) import { getCurrentPage } from '../../../app-redux/selectors';

updatePathIfChange

Parameters

  • path
  • deepEqual
  • singleRun
  • handler
  • context
  • newProps
  • oldProps
  • isInit

Returns any возвращает true - если нужно прервать последующие обработчики, либо false если продолжать

onPropsUpdate

Таргет метод для обновления данных, если меняются пропсы наденные по пути propertyPath Срабатывает как при инициализации (componentWillMount), так и в будущем при componentWillReceiveProps

Большая проблема была в том, что зависимость от redux данных проявляется как при старте приложения так и при обновлении пропсов. Но в реакте сделано так что componentWillReceiveProps не дергается при инициализации, поэтому постоянно приходилось писать 2 метода для одних и техже частей пропсов Поэтому создал декоратор, тарнет метод которого автоматически срабатывает и при componentWillMount и при componentWillReceiveProps

Parameters

  • propertyPath - если пусто - то target метод срабатывает если props компонента
    • если function - функция вызывается дважды, один раз для newProps второй раз для oldProps - на вход который подаются пропсы, вернуть должна часть props по которой будет deep equals
    • если string - путь в props для объектов которые будут сравниваться
    • если string array - если больше 1 то singleRun по умолчанию true
  • $1 Object (optional, default {})
    • $1.deepEqual (optional, default true)
    • $1.singleRun (optional, default true)
    • $1.oldPropsNotNull (optional, default true)
    • $1.afterCustomFilter
  • deepEqual (default true)- true - глубокое сравнение
    • false - мутабельные (массивы, объекты) - по ссылкам, инмутабельные (стринги, числа) - по контенту
  • singleRun (по умолчанию true если propertyPath - это массив и больше 1 элемента)- true - выполнять вызов не для каждого отдельно, а один раз для всех, при этом newObj \ oldObj меняются на массив, соотвественно порядку в path (часто возникающая ситуация при инициализации когда все пасы считаются новыми и происходит дублирование вызовов)
  • oldPropsNotNull
  • afterCustomFilter

Returns function (newProps, {newProps, oldProps, newObj, oldObj, path, isInit}) newObj \ oldObj \ path - меняются на массив, если singleRun - true- если вернуть true, то все последующие методы не будут запущены. Обычно true возвращается тогда, когда идет явно изменение state и нужно чтобы react-redux прошел новый цикл и подставил в последующие методы уже обновленную информациюПример, export default class AccountAndSite extends Component { static propTypes = { accountId: PropTypes.number, ... } ...

onStatusPropUpdate

Метод для работы со статусами - см \src\stub\app-redux\helpers\create-status-reducer.js

Parameters

  • statusPropPath

Returns function

deepDiff

Arguments

  1. lhs - the left-hand operand; the origin object.
  2. rhs - the right-hand operand; the object being compared structurally with the origin object.
  3. options - a) object - A configuration object that can have the following properties: prefilter: (path, key) => bool - function that determines whether difference analysis should continue down the object graph. This function can also replace the options object in the parameters for backward compatibility. normalize: (path, key, lhs, rhs) => [lhs, rhs] - function that pre-processes every leaf of the tree. b) function - prefilter
  4. acc - an optional accumulator/array (requirement is that it have a push function). Each difference is pushed to the specified accumulator.

Returns either an array of change

Parameters

  • lhs
  • rhs
  • prefilter
  • accum

deep-diff

Arguments

  1. lhs - the left-hand operand; the origin object.
  2. rhs - the right-hand operand; the object being compared structurally with the origin object.
  3. options - a) object - A configuration object that can have the following properties:
  • prefilter: (path, key) => bool - function that determines whether difference analysis should continue down the object graph. This function can also replace the options object in the parameters for backward compatibility.
  • normalize: (path, key, lhs, rhs) => [lhs, rhs] - function that pre-processes every leaf of the tree.
  • showEditLinks: bool - add not equal link result b) function - prefilter 4) acc - an optional accumulator/array (requirement is that it have a push function). Each difference is pushed to the specified accumulator.

Returns either an array of change

postFormToUrl

Parameters

  • url
  • data
  • encoding
  • newWindow при банк эквейринге (оплате через банк) нужно открывать

formatDate

Переводит дату из формата '2016-01-26' в формат '26 января 2016' или 26.1.2016.

Parameters

  • date String Строка даты в формате YYYY-MM-DD
  • options Object? Список опций
    • options.fullMonth Boolean Если true, то название месяца, иначе номер (optional, default true)
    • options.cutCurrentYear Boolean Если true, то дата без указания года (optional, default true)

Returns String Cтрока даты в формате DD month YYYY или DD.MM.YYYY

formatStringInner

Parameters

  • addNextNonWordCharacters
  • str
  • args ...any либо один параметр - мапа с параметрами ключ:значение- либо остальные стринги \ намбер - последовательно добавляются
    • последний параметр может быть функция реплейсмент (path, значение из мапы если есть, type, mask, nextNonWordCharacters, position, allString)

Returns any

formatString

Parameters

  • str
  • args ...any либо один параметр - мапа с параметрами ключ:значение- либо остальные стринги \ намбер - последовательно добавляются
    • последний параметр может быть функция реплейсмент (path, значение из мапы если есть, type, mask, nextNonWordCharacters, position, allString) важно использовать nonWordSeparator (пустое место до следующего элемента), ибо по умолчанию для функции оно не подставляется. Это нужно чтобы иметь возможность менять его в функции

Returns any

formatStringWithoutAutoSpaces

автоматически не добавляет nextNonWordCharacters

Parameters

  • str
  • args ...any либо один параметр - мапа с параметрами ключ:значение- либо остальные стринги \ намбер - последовательно добавляются
    • последний параметр может быть функция реплейсмент (path, значение из мапы если есть, type, mask, nextNonWordCharacters, position, allString) важно использовать nextNonWordCharacters (пустое место до следующего элемента), ибо по умолчанию для функции оно не подставляется. Это нужно чтобы иметь возможность менять его в функции

Returns any

generateId

Returns string

Meta

  • deprecated: use common/utils/common.js::generateId

init

Метод инициализации настроек Используется отдельно на клиенте и отдельно на сервере

Parameters

  • newI18nInstance

translateDefault

Translate - see \static\i18n\ru\core.js

Parameters

  • key
  • mapParams ( defaultValue props include )
  • namespace
  • defaultValue

Examples

:
{
"key": "The current date is {{date, MM/DD/YYYY}}", // mommentjs для форматирования
"key2": "{{text, uppercase}} just uppercased"
}
: как передать html в пропсу:
key:
submitSuccessMessage: 'На вашу почту {{email}} отослано сообщение с ссылкой для смены пароля',

textSuccess={
<div
dangerouslySetInnerHTML={{
__html: i18n(
'core:pages.ForgotPage.submitSuccessMessage',
{
email: `<b className="${this.bem('email-text')}">${email}</b>`,
// interpolation: {escapeValue: false},
},
),
}}
/>
}

Returns any

i18nContextProvider

чтобы каждый раз не писать префиксы для конкретного компонента

Пример: import {i18nContextProvider} const i18n = i18nContextProvider('components.MyComponent'); console.log(i18n('core:keyForMyComponent')); //components.MyComponent.keyForMyComponent

Parameters

  • context

Returns Function

ImageTools

from https://gist.github.com/dcollien/312bce1270a5f511bf4a

ImageTools.resize(this.files[0], { width: 320, // maximum width height: 240 // maximum height }, function(blob, didItResize) { // didItResize will be true if it managed to resize it, otherwise false (and will return the original file as 'blob') document.getElementById('preview').src = window.URL.createObjectURL(blob); // you can also now upload this blob using an XHR. });

apiClient

Meta

  • deprecated: используйте helpers/get-api-client.js

isEmpty

Parameters

  • value
  • objectChecker (optional, default null)

Meta

  • deprecated: use common.js::isEmpty // todo @ANKU @LOW - удалить когда удалим методы дерева из common.js (чтобы взаимных ссылок не было) и оттуда будем пользоваться

parseUrlParameters

Parameters

  • url либо объект location, либо мапа параметров, либо стринга
  • defaultValues
  • customNormalizersMap мапа : (urlValue)=>normalizedValue - для правильного парсинга из урла значений

Returns {}

formatUrlParameters

// todo @ANKU @LOW - не работают с "bracket" (когда multiple test[]=value1&test[]=value2)

Parameters

  • params
  • url если '' пустая строка - то это сигнал вернуть c символом начала query параметров (знаком вопроса): ?test=testValue
  • hash

Returns string

joinPath

Конкатинация кусков path (в переди всегда проставляется '/')

Parameters

  • paths ...any пути, который нужно объединить Последним параметром может быть мапа queryParams которая преобразуется в строку

Returns any

joinPathSimple

в отличии от joinPath не добавляет в начало / и не парсит параметры, просто конкатинирует части path

Parameters

  • paths ...any

Returns string

joinUri

Parameters

  • paths ...any

Returns any

Meta

  • deprecated: renaming - use joinPath

updateUrl

Parameters

  • url
  • newQueryParams
  • merge по умолчанию реплейс массивов и объектов

Returns string

getModuleRoutePath

Путь до ресурса с учетом префикса различных модулей для роутинг (без учета contextPath)

Parameters

  • relativeLocation LocationDescription - @see model-location.js
  • moduleName
  • modulesPrefixes мапа: moduleName => prefix
  • queryParams (optional, default undefined)

Returns any

connect

класс который поддерживает мгновенную загрузку аттачментов и хранение инфы об этом в редуксе

connect

По ключу userId обновляет все, то если если пользователь сменится - все обновится

onChangeStatus

(isSummaryFetching) => {} - если один из атачей всего контрола имеет процесс

updateValues

Наполняем результаты из рудекса (сколько загружено)

Returns any

replace

Meta

  • deprecated: InstanceAttachment - use InstantlyAttachment

replace

Meta

  • deprecated: TextArea - use Input with type = 'textarea'

getAttachmentsByFieldId

Parameters

  • globalState
  • fieldId undefined - то найдет все у которых еще id нет

Returns {}

getAttachmentInfosByUuids

(globalState, attachments) => { [uuid]: objectInfo }

getAttachmentIsSummaryFetching

(globalState, attachments) => boolean

uploadFile

Parameters

  • filename
  • contentType
  • readStream

Returns Promise attachmentContentId

downloadFile

Parameters

  • contentId

Returns any stream

deleteFile

Parameters

  • contentId

Returns Promise

uploadFile

Parameters

  • filename
  • contentType
  • readStream

Returns Promise attachmentContentId

downloadFile

Parameters

  • attachmentContentId

Returns any stream

deleteFile

Parameters

  • attachmentContentId

Returns Promise

ServiceAttachments

Extends CoreService

Обычно аттачи хранят в виде двух сущностей информации об аттаче (Attachment) и его контент (AttachmentContent) причем бывают на разных серверах

Но, по умолчанию, мы будем считать, что аттачи хранятся в базе и Attachment = AttachmentContent, весь процесс управляется через ServiceAttachmentContents поэтому тут ничего не нунжно делать

Если необходимо разбить сущности, то этот класс нужно переопределить

link

если какой-то объект использует этот аттач то link проставляется этому объекту удобно чтобы удалять темповые не используемые фотография

Parameters

  • id
  • linkByObjectId
  • objectModel

Returns Promise

link

если какой-то объект использует этот аттач то link проставляется этому объекту удобно чтобы удалять темповые не используемые фотография

Parameters

  • id
  • linkByObjectId
  • objectModel

Returns Promise

type

default "button" (not "submit")

notNaturalButton

Эмуляция кнопки (к примеру, выглядит label оборачивает input type="file" и выглядит как кнопка)

asyncIsLoading

(default: true) показывать лоадинг если onClick возвращает promise

bemDecorator

Компонент для того, чтобы не писать bind функции c ключом В основном используется, чтобы улучшить производительность - не биндить фунции внутри render каждый раз при перерисовки (а она оооочень частая) См. https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md#lists-of-items

render

(cellValue, column, record, rowIndex) => {}

linkTo

Оборачивает значение колонки в линку если функция - (record, column, rowIndex) => {}

type

MENU_ITEM_TYPE = { NORMAL: 'normal', DELIMITER: 'delimiter', HEADER: 'header', }

image

url аватарки либо будет использована icon

content

либо name будет рисоваться

mobile

true - показывать только для мобильных false - показывать только для не мобильных undefined \ null - показывать везде

onClick

либо path будет использован для перехода

isLink

по умолчанию, если есть path или onClick то считается линкой, но это можно исправить с помощью этого параметра

parseValueToString

Parameters

  • type
  • value
  • customMask
  • props если LIST - то нужно records, componentProps: fieldLabel \ fieldId - если они отличаются от стандартных

Returns any

options

Meta

  • deprecated: use controlProps.records

touched

Meta

  • deprecated: в CoreField--touched есть

children

Если функция - (openUploadDialogFn, props) => Node

accept

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#Limiting_accepted_file_types accept="image/png" or accept=".png" — Accepts PNG files. accept="image/png, image/jpeg" or accept=".png, .jpg, .jpeg" — Accept PNG or JPEG files. accept="image/" — Accept any file with an image/ MIME type. (Many mobile devices also let the user take a picture with the camera when this is used.) accept=".doc,.docx,.xml,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document"

attachmentsInfoMap

доп инфа по статусам на каждый элемент аттачмента [uuid]: attachInfo

onAdd

(uuidToFileMap, newAttachments, resultAttachments) => {} - всегда, даже если multiple=false, так как uuid важен для InstanceAttachments

openUploadDialogFn

бывает необходимо сделать кастомный вид кнопки загрузки, поэтому ставят showAddButton: false и children: (openUploadDialogFn, props) => {} куда и передается эта функция, чтобы мануально открыть окно выбора файла

attachmentInfo

Доп информация (в основном статусы, уровень загрузки) конкретного аттача

onDescriptionChange

(attachment, newDescription, event) => {}

onDescriptionBlur

(attachment, newDescription, event) => {}

onClick

(attachment, event) => {}

onRemove

(attachment) => {}

selectedValue

Meta

  • deprecated: use value

records

Самый важный текущий список данных к отображения для выбора (мы работаем с данными, а потом они переводятся в optionMeta а в SelectView они преобразуются уже в option node

isSaveFullRecord

по-умолчанию сохраняется только id, но если эта true - сохранится весь объект

onFieldChange

Внутренний метод от CoreField чтобы можно было задать кастомный onChange

(valuesOrNull, selectedRecords, context) => {}

  • context - { optionMeta: { record, recordId, isSelected, isDisabled } }
  • если multiple - это массивы, если нет - значения (если не выделено - null)
  • если isSaveFullRecord - то newValuesFinal - это рекорд, если нет то id

onChange

(valuesOrNull, selectedRecords, context) => {}

  • context - { optionMeta: { record, recordId, isSelected, isDisabled } }
  • если multiple - это массивы, если нет - значения (если не выделено - null)
  • если isSaveFullRecord - то newValuesFinal - это рекорд, если нет то id

renderOption

(record[fieldLabel], record, index, visibilityRecords) => React.node

onChangeCheck

(recordId, isCheck) => {}

CheckboxCore

Extends PureComponent

Нужно показывать только n первых элементов

update

Parameters

  • withBlur
  • withChange
  • event
  • comp
  • other ...any

selectedValue

Meta

  • deprecated: use value

records

Самый важный текущий список данных к отображения для выбора (мы работаем с данными, а потом они переводятся в optionMeta а в SelectView они преобразуются уже в option node Может быть массивом стрингов, либо массивом сущностей createSimpleSelectRecord ({ id, label })

isSaveFullRecord

по-умолчанию сохраняется только id, но если эта true - сохранится весь объект

fieldLabel

'name' - or use createSimpleSelectRecord

fieldId

'id'

isValueOnlyIntoRecords

false - значения могут быть только в рамках records. Если они выходят за рамки, происходит событие onChange и чистятся недопустимые

onFieldChange

Внутренний метод от CoreField чтобы можно было задать кастомный onChange

(values, selectedRecords, context) => {}

  • context - { optionMeta: { record, recordId, isSelected, isDisabled } }
  • если multiple - это массивы, если нет - значения
  • если isSaveFullRecord - то newValuesFinal - это рекорд, если нет то id

onChange

(values, selectedRecords, context) => {}

  • context - { optionMeta: { record, recordId, isSelected, isDisabled } }
  • если multiple - это массивы, если нет - значения
  • если isSaveFullRecord - то newValuesFinal - это рекорд, если нет то id

onSelect

(newSelectedValue, newRecordsFinal) => {}

  • если multiple - это массивы, если нет - значения
  • если isSaveFullRecord - то newSelectedValue - это рекорд, если нет то id

allowCreateNew

Добавление новых сущностей

parseNewItem

(label, id, index) => new record

onCreateNew

(record, index) => {}

renderOption

(record[fieldLabel], record, optionMeta, visibilityRecords) => React.node

isHideSelected

Если мы что-то выбрали, они убирается из доступного списко

renderInputText

(selectedRecords, props) => PropTypes.node

useUnique

только уникальные значения могут быть выбраны

onRemoveSelected

(deletedValue, newRecordsFinal, removedItemIndex) => {}

  • если multiple - это массивы, если нет - значения
  • если isSaveFullRecord - то deletedValue - это рекорд, если нет то id

useSearch

использовать поиск для выбора

onSearch

(searchTerm) => {}

  • если асинхронно нужно

searchOnceOnMinCharacters

если включаем - то игнорируется maxVisible и ищет один раз а остальные уточняющие буквы фильтруют текущее значение и так будет пока не дойдет до минимального кол-ва символов и снова ищет

  • если searchMinCharacters = 0 - то один раз при маунте будет
  • если searchMinCharacters > 0 - будет дергаться onSearch каждый раз при пересечении этой границы

onLoadMore

(searchTerm, alreadyShownLength) => {}

SelectCore

Extends PureComponent

Нужно показывать только n первых элементов

Parameters

  • args ...any

updateMultiple

Parameters

  • currentItemIds может быть как id так и просто optionMeta (если это createNew)
  • isRemove
  • removedItemIndexes

Returns any

update

Parameters

  • withBlur
  • withChange
  • event
  • comp

formData

Для передачи в onSubmit

initFormData

Начальные значения (которые могут потом меняться), но весь основной стейт находится внутри формы. Это подходит для форм с фильтрами, где есть кнопочка "Применить". Загружаем из урла начальные значения, потом внутри формы выбираем значения полей, нажимаем "применить" и обновляется таблица и initFormData (а вместе с ней и state этой формы)

onChangeField

(newFormPartValue) => {} приходит только часть и нужно делать merge в обработчике { address: { city: 'Moscow' } }

onUpdateForm

(newFullFormData) => {} Идеально подходит onUpdateForm из redux-simple-form декоратор для редукс

validate

(fieldErrors, formData, props) => result Где fieldErrors: [...string|{field, fieldLabel, errors}]

Где result: string|boolean|[...string|{field, fieldLabel, errors}]

  • если false: ошибка с текстом textDefaultFormErrorText
  • если true | null | undefined: не будет ошибок (не смотря на fieldErrors)
  • если массив: выведется массив ошибок

Layout

default - FormLayout props: id inModal

fields actions postActions actionStatus

model-attachment-access

accessPublic - все у кого есть ссылка accessAuth - только авторизованные пользователи accessOwnerOnly - только тот, кто создал (ну и админ ;)) [] - пермишен специальный

fileDescriptor

FILE: { lastModified: 1463127849264, lastModifiedDate: Fri May 13 2016 11:24:09 GMT+0300 (RTZ 2 (зима)) {}, name: "test name.jpg", preview: "blob:http://localhost:8080/3b5f332a-45a7-49a8-9a1e-5b9225bd831e", size: 57613, type: "image/jpeg", webkitRelativePath: "", }

contentId

id контента, по которому можно получить содержимое файла

TYPES

Type: {STRING: string, TEXT: string, DATE: string, DATETIME: string, NUMERIC: string, DECIMAL: string, BOOLEAN: string, REFERENCE: string, LIST: string, BINARY: string, CUSTOM: string}

Meta

  • deprecated: use FIELD_TYPES

SUB_TYPES

Type: {LOGIN: string, LOGIN_EMAIL: string, PASSWORD: string, EMAIL: string, PHONE: string}

Meta

  • deprecated: FIELD_SUB_TYPES

id

по умолчанию <form_id>_

valueName

Значение которое будет отображаться

label

в локализованных файлах могут автоматически подсасываться значения, к приеру pages: { SignupPage: { title: 'Sign up', fields: { username: { label: 'Login', placeholder: 'Enter login', title: 'User login', }, password: { label: 'Password', placeholder: 'Enter password', title: 'User password', hint: 'Password should be very strong', description: 'Digits and latin symbols only', }, }, ... } }

из локализации это '<field_name>.label'

placeholder

из локализации это '<field_name>.placeholder'

textPlaceholder

Meta

  • deprecated: use placeholder

title

то, что появляется над контролом при наведении средствами html из локализации это '<field_name>.title'

textHint

специальная иконка справа при наведении показывается дополнительная информация из локализации это '<field_name>.hint'

textDescription

то, что показывает под полем из локализации это '<field_name>.description'

Layout

className

label textDescription errors

required touched

onChange

(fieldName, parseOutValue, multiple, context, node) => {}

parseOutValue

(value, fieldProps, index) => parsedValue

instanceChange

обычно для больших форм, чтобы сэкономить ресурсы значение применяется после потери фокуса или Enter Это сделано и для input

Но бывают случаи когда нужно реально по символьно обновлять (когда данных мало и нужно явно показать что кнопка больше не дисеблится (к примеру, при форме логине) Значеие true - как раз и включает нотификацию по мере ввода

onAdd

(fieldName, index, null, context) => {}

onRemove

(fieldName, index, itemValue, context) => {}

constraints

values maxLength minLength multipleMaxSize multipleMinSize maxSize minSize minValue maxValue, maxBytes, minBytes, value pattern required,

validate

Дополнительная кастомная валидация, срабатывает после всех автоматических проверок (html5 валидации, required, constraints)

То есть если поле required, то вам не нужно дополнительного его проверять на пустоту. Если только вы не хотите переделать дефолтное сообщение о пустоте. В таком случаем нужно будет вернуть массив (это полностью заменит уже найденные ошибки defaultErrors)

(value, fieldProps, formDependentData, formData, defaultErrors) => result

где result:

  • если false - если нет других ошибок, то добавляет "Ошибку"
  • если true | null | undefined - никак не влияет, возвращает другие автоматически найденные ошибки
  • если массив - полность перезаписывает автоматические найденные ошибки

Пример: { label: 'Старый пароль', name: 'oldPassword', subType: FIELD_SUB_TYPES.PASSWORD, required: true, }, { label: 'Новый пароль', name: 'newPassword', subType: FIELD_SUB_TYPES.PASSWORD, required: true, formDependentFields: ['oldPassword'], validate: (value, props, formDependentData) => ( !value || value !== formDependentData.oldPassword || 'Новый пароль должен отличаться от старого' ), },

Механизм: const customValidateErrors = await executeVariable( validate, null, value, fieldProps, formDependentData, formDataFinal, errors, ); if (customValidateErrors === false) { if (errors.length === 0) { // если нет никаких ошибок - добавляется // если есть - не проставляем, пока другие не уберутся errors.push('Ошибка'); } } else if (customValidateErrors === true || customValidateErrors === null) { // возвращаем errors, какие есть } else if (typeof customValidateErrors === 'string') { // добавляем к текущим errors.push(customValidateErrors); } else if (Array.isArray(customValidateErrors)) { // польностью заменяем массив errors = customValidateErrors; }

required

дублирует поле constraints.required для удобства

formDependentFields

Список других полей на форме от которых зависит текущее поле Если есть - то будет подаваться formData в виде объекта и обновлять

formDependentData

значение зависимых полей

getFormData

Метод с формы, чтобы получить остальные контекстные формы

  • функция - чтобы не перезагружать компонент, при смене других значений

controlProps

для листов нужно объявить: { records - вместо options мы используем данные, потом они преобразуются в optionMeta и передаются в SelectView, а он уже отображет из них option node fieldId fieldLabel }

controlRef

ссылка на DOM (field, dom) => {}

controlClass

Класс - замена стандартному для контрола

render

Замена стандартной отрисовки (controlPropsFinal, resultNode, fieldProps) => node

renderGrouping

(groupingField, index, innerFieldComponents, innerFieldProps) => {}

apiGetUserAvatarUrl

синхронный метод, дает только урл, по которому вернется картинка

Parameters

  • userIdentify
  • key
  • userId

apiCheckVerifyToken

Parameters

  • verifyToken
  • userIdentify может не быть если это смка для регистрации

Returns any

bind

Parameters

  • isChangeFromSigninToSignup true - переключаемся между Логин -> Ренистрация false - переключаемся между Ренистрация -> Логин null - закрываем окно (закончили или регистрацию или логин)

Returns Promise<void>

bind

Определеяет какие куски приложения требуют авторизации В enterprise обычно все что не noAuthRequireMatcher Но других проектах помимо noAuthRequireMatcher (где указыавются просто файлы, статика, авторизация и подобное) еще позволительный страницы без юзера (к примеру лендинг)

Parameters

  • pathnameWithoutContextPath
  • moduleToRoutePrefixMap

Returns boolean

authViewDecorator

Оборачивание компонентов для проверки авторизации, наличия ролей или permissions

Последний параметр, если это object - рассматривается как options. Все перед ним это rolesOr

Parameters

  • args ...any
  • null (...rolesOr, options)
  • options rolesOr: [], - у пользователя должна быть хоть одна из ролей- rolesAnd: [] - должны быть все роли
    • permissionsOr: [] - должно быть хоть одно разрещение (также учитываются глобальные конфиги clientConfig.common.permissions)
    • permissionsAnd: [] - должны быть все разрещение
    • redirectNotAuth: string || (getRoutePath, location) => string - если нет авторизации то по умолчанию бросается ошибка и показывается модалка авторизации, либо если задать эту переменную то переходит на другую страницу
    • redirectNotAccess: PATH_ACCESS_DENIED || string || (getRoutePath, location) => string- если не хватает каких-либо
    • afterAuthRedirect: null,

Returns function (any) Пример 1:

checkAccess

По умолчанию используется оператор OR (Или) то есть пользователю достаточно иметь хотя бы одну соотвествующую роль \ разрешение

Parameters

  • user
  • roles либо массив ролей, либо объект accessObject (rolesOr: [], rolesAnd: [], permissionsOr: [], permissionsAnd: [])
  • permissions

Returns any boolean|Array - либо булеан, либо массив ошибок

actionChangeUser

Meta

  • deprecated: use actionSignin

ServiceAuth

Extends CoreService

Клиенсткая реализация протокола OAuth 2.0 Bearer PROTOCOL - https://tools.ietf.org/html/rfc6749#

Parameters

  • endpointServiceConfig

Returns {authValidate, authLogin}

authClientCredentials

clientCredentials { client_id, client_secret }

Parameters

  • clientCredentials (optional, default undefined)
  • force (optional, default false)

ServiceAuthMock

Extends ServiceAuth

Клиенсткая реализация протокола OAuth 2.0 Bearer

Parameters

  • endpointServiceConfig

Returns {authValidate, authLogin}

remoteJwt

token - это токен сотрудника банка

Parameters

  • server
  • pluginOptions

Returns {authenticate: authenticate}

sendForgotPasswordEmail

Parameters

  • email
  • resetPasswordPageUrl
  • emailOptions

Returns any

resetPasswordByEmail

Parameters

  • resetPasswordToken
  • newPassword
  • emailOptions

Returns Promise<any>

findUsers

Query

email optional string firstName optional string lastName optional string search optional A String contained in username, first or last name, or email string username optional string

briefRepresentation optional boolean first optional integer(int32) max optional Maximum results size (defaults to 100) integer(int32)

Parameters

  • query

Returns Promise<any>

findUser

Parameters

  • userIdentify userId | email | username
  • silent (optional, default false)

Returns any project user

getProtectedInfo

Информация которая загружается на клиент о пользователе (без системной инфы)

Parameters

  • userIdentify

Returns Promise<["userId", "displayName", "aliasId", "description", "username", "firstName", "lastName", "middleName", "email", "phone", "address"]>

sendForgotPasswordEmail

Протокол для @reagentum/[email protected]

Parameters

  • email
  • resetPasswordPageUrl
  • emailOptions

Returns any

resetPasswordByEmail

Протокол для @reagentum/[email protected]

Parameters

  • resetPasswordToken
  • newPassword
  • emailOptions

Returns Promise<any>

SUB_MODULE_FACTORY

Упрощенный модуль выглядит так: src/modules/module common/ subModule/ api/ components/ containers/ models/ stores/ redux-reducers.js redux-selectors.js mobx-stores.js index.js get-components.js routes.jsx routes.paths.js module-name.js server/ subModule/ services/ mockServices/ plugins/ mockRoutes/ api-routes/ index.js module-name.js package.json

COMMON_SUB_MODULE_REGEXP

ПРИМЕР только для require.context нужно явно regexp задавать а не через переменную

loadSubModules

Parameters

  • webpackRequireContext require.context('./', true, SUB_MODULE_FACTORY.COMMON_SUB_MODULE_REGEXP);
  • type

createCommonSubModule

  • MODULE_NAME: null,

  • initComponents: (componentsBase) => componentsBase,

  • paths: {},

  • getRoutes: (moduleRoutePrefix) => null,

  • getApi: () => [],

  • getRootReducers: () => ({}),

  • reduxSelectors: {},

  • reduxActions: (api) => ({}),

  • hotReloadFunc: (reloadUi, reloadStore, reloadAll) => { // module.hot.accept('./routes-products', reloadUi); },

Parameters

  • options

Returns any options

createServerSubModule

  • async initServerSubModule: (serverRunner) => {}, событие происходящее один раз на сервере. Если что-то изменили в модуле - нужно весь сервер перезапустить

  • async afterStartServer: (serverRunner) => {}, событие происходящее один раз на сервере. Если что-то изменили в модуле - нужно весь сервер перезапустить

  • getServerPlugins: (services, strategies, servicesContext) => [],

  • getServerApi: (services, strategies, servicesContext) => [],

  • getServerMocks: (services, strategies, servicesContext) => [],

  • getServerServices: (endpointServices, servicesContext) => ({}),

  • getServerMockServices: (endpointServices, servicesContext) => ({}),

  • getServerStrategies: (servicesContext) => ({}),

  • getDBModels: () => [],

Parameters

  • options

Returns {options: any}

DEFAULT_LOGGER_IDS

Которые определены в конфигах

contextData

любые контекстные данные при запуске приложения

register

Усорвешенствованная библиотека hapi-i18next (репо версия устарела для i18next)

Parameters

  • server
  • options
  • next

method

Returns fresh i18next instance for each request, to prevent cache pollution

method

This method is a facade for i18next's bundled 't' method. We wrap it so that we can pass an extra language parameter for Hapi server.method caching (so you can generate keys based on languages and avoid cache pollution)

prepare-state

загрузка необходимых вначале общих данных из различных сервисов (в данном случае organizations и profiles

Parameters

  • request
  • server
  • defaultState
  • pluginOptions

Returns {}

onPreResponse

включение моков по урлу

Parameters

  • mockOptions
  • request
  • reply

Returns (void | any)

createServices

Метод для создания сервисов

Parameters

  • endpointServiceConfigs

createMockServices

Метод для создания сервисов

WITHOUT_SERIALIZE_DATA

Данные нужные без обработки

WITHOUT_LINKED_DATA

Данные без связей (чтобы зациклинности не было)

WITHOUT_CALCULATING_DATA

Данные без калькулируемых полей

WITHOUT_DESERIALIZE_DATA

Без десериализации на сервер

endpointServiceConfig

Создается в config/utils/create-config.js:

Если в serverConfig.server.endpointServices[serviceName] нету используется по умолчанию serverConfig.server.endpointServices.middlewareApiService

protocol: string host: string port: number endpoint: string fullUrl: string timeout: number

getCrudUrlsPrefix

если его определить то все методы findRecords findRecordsWithPagination createRecord readRecord updateRecord deleteRecord patchRecord

  • заработают автоматом

Returns null

findRecords

Parameters

  • query
  • searchFields
  • options

findRecordsWithPagination

Parameters

  • query
  • searchFields
  • findOptions

patchRecord

Соглашение, что патч возвращает получившийся объект - https://stackoverflow.com/a/37718786/344172

Parameters

  • id
  • patchOperation
  • options

Returns Promise<any>

removeRecord

Parameters

  • id
  • options

Returns Promise<void>

Meta

  • deprecated: use deleteRecord

bulkOperations

This function does not trigger any middleware, not save() nor update(). If you need to trigger save() middleware for every document use create() instead.

Parameters

  • operations : {[this.operation_type.create]: createArray,[this.operation_type.update]: updateArray,[this.operation_type.remove]: removeArray,}
  • options (optional, default null)

Returns any BulkWriteOpResultObject- insertedCount number -- Number of documents inserted.

  • matchedCount number -- Number of documents matched for update.
  • modifiedCount number -- Number of documents modified.
  • deletedCount number -- Number of documents deleted.
  • upsertedCount number -- Number of documents upserted.
  • insertedIds object -- Inserted document generated Id's, hash key is the index of the originating operation
  • upsertedIds object -- Upserted document generated Id's, hash key is the index of the originating operation
  • result object -- The command result object.

removeRecord

Parameters

  • id
  • options

Returns Promise<void>

Meta

  • deprecated: use deleteRecord

pluginServicesContext

Обогощает request "servicesContext" и "services" еще перед авторизацией

Parameters

  • server
  • options
  • next

registerService

Parameters

  • serviceName
  • getServiceFn функция (endpoint) => инстанса сервиса, который унаследован от CoreService (есть setRequest, setServicesContext)
  • isMock

pluginStrategies

Обогощает request "servicesContext" и "services" еще перед авторизацией

Parameters

  • server
  • options
  • next

ROUTE_CONFIG

hapi настройки для роутера - см ROUTE_CONFIG_OPTIONS

ROLES

или

PERMISSIONS

или

ACCESS_OBJECT

Если не хватает ROLES и PERMISSIONS - можно воспользоваться объектом для тонкой настроки - src/modules/module-auth/common/subModule/helpers/access-object-utils.js

PROXY

h2o2 options

GUEST_MODE

поддержать гостевой режим (может пользователь быть, а может и не быть), но попытку авторизации нужно произвести false,

AUTH_IF_EXISTS

true - и если токен пользователя есть - запросит авторизацию, если нет - пропустит как если бы было routeConfig: { auth: false }

Это настройка понадобилась, так как если задать routeConfig: { auth: false } - то не запустится система авторизации в jwt-auth и user не проставится в request вообще

AUTH

hapi настройка true

если false - то не будет запускать системы авторизации, то есть jwt-auth не сработает и user в request не проставится

createProxyWrapperCallback

Parameters

  • handler (proxyPayload, requestData, apiRequest, newReply, proxyResponse, pluginOptions) => {}
  • apiRequest
  • pluginOptions

Returns function (any?, any?, any?)

apiPluginFullFactory

Подключена проверка пермишенов, логгинг, проксирование (и авторизация)

Parameters

  • apiConfig
  • apiPluginOptions
  • handler Можно не использовать reply, если возвращаем не response, то идет вызов reply автоматически с результатом в качестве аргумента
  • accessObject
  • permissions
  • roles
  • checkPermissionStrategy
  • routeConfig
  • isLogging

Returns any function(apiRequestData, request, reply) {}

apiPluginFactory

Parameters

  • apiConfig
  • handler (payload, apiRequest, reply, pluginOptions) => {}
  • apiPluginOptions permissions- checkPermissionStrategy
    • routeConfig
    • isLogging

proxyRoute

Parameters

  • path you can user wildcard (*) or h2o2 format: \path{otherPart}
  • proxy string \ mapUri function \ h2o2 options (proxyOptions) - https://github.com/hapijs/h2o2 (add support { apiPrefix: 'serviceApiPath' }) server.route({ method: 'GET', path: '/handlerTemplate/{a}/{b}', handler: { proxy: { uri: 'http://localhost:' + upstream.info.port + '/item/{a}/{b}' } } });
  • routeOptions если только функция, значит это handler- handler - (payload, requestData, apiRequest, reply, proxyResponse, pluginOptions) => {}
    • permissions
    • checkPermissionStrategy
    • routeConfig
    • isLogging

proxyRoutePluginFactory

Parameters

  • path
  • proxy
  • otherOptions

Meta

  • deprecated: use proxyRoute

createEndpointServiceConfig

Это настройка для набора сервисов, который после подключения спец библиотек (Thrift или оберток над Rest) позволяют дергать свое апи через методы с переменными (вся логика выстраивания пути до rest сервисов, инкапсулирована внутри). Это позволяет их легко переиспользовать, в том числе и в других проектах.

Parameters

  • $0 Object
    • $0.protocol
    • $0.host
    • $0.port
    • $0.endpoint
    • $0.useDefault (optional, default true)
    • $0.timeout
    • $0.fullUrl
    • $0.envPriority
    • $0.requestOptions
  • protocol
  • host
  • port
  • endpoint
  • timeout

Returns {protocol: string, host: string, port: number, endpoint: string, fullUrl: string, timeout: any}

HOST

Марафон при запуска автоматически добавляет адресс хоста в эту переменную

HOST

Марафон при запуска автоматически добавляет адресс хоста в эту переменную

SERVICES_HOST

Когда запускаем на localhost или нужно на стендах зашить

SERVICES_HOST

Когда запускаем на localhost или нужно на стендах зашить

REQUEST_TIMEOUT

Первый запуск мидловых сервисов бывает до 20 сек

REQUEST_TIMEOUT

Первый запуск мидловых сервисов бывает до 20 сек

createEndpointFactoryFromEnv

Parameters

  • env

Returns function (any, any?)

Meta

  • deprecated: This is deprecated.

createTempFile

Parameters

  • content
  • fileName
  • options https://raszi.github.io/node-tmp/ options mode: the file mode to create with, it fallbacks to 0600 on file creation and 0700 on directory creation prefix: the optional prefix, fallbacks to tmp- if not provided postfix: the optional postfix, fallbacks to .tmp on file creation template: mkstemp like filename template, no default dir: the optional temporary directory, fallbacks to system default (guesses from environment) tries: how many times should the function try to get a unique filename before giving up, default 3 keep: signals that the temporary file or directory should not be deleted on exit, default is false, means delete Please keep in mind that it is recommended in this case to call the provided cleanupCallback function manually. unsafeCleanup: recursively removes the created temporary directory, even when it's not empty. default is false

Returns any

cookie

Parameters

  • request
  • name
  • value

Returns any

Meta

  • deprecated: bug with set cookie value - use getCookie and setCookie instead

downloadFile

Parameters

  • reply
  • serverPath либо путь, либо data: , либо stream
  • fileName
  • type

Returns any

dirnameNormalize

webpack/webpack#1599 С любыми настройками webpack на сервере**dirname на unix выдает src... а **filename /index.js в любом варианте

Parameters

  • dirname

Returns string

inModules

Parameters

Returns Array

sendSimpleRequest

Parameters

Returns Promise

getEndpointServiceUrl

Parameters

  • endpointServiceConfig
  • serviceMethodPath
  • data если потребуется возьмутся для pathParams
  • additionalPathParams сначала из них возьмутся

Returns any

sendEndpointMethodRequest

  1. Обычено чтобы указать тип необходимых данных через TypeScript, делают такую обертку (чтобы data была в параметрах): export default function serviceMethodsFactory(endpointServiceConfig) { function findTariffByInn(data: DataTypeScript, ...other) { return sendEndpointMethodRequest(endpointServiceConfig, '/all', 'get', data, ...other); }

return { findTariffByInn }; }

  1. либо можете просто использовать фабрику (он сам все данные пробросит) findTariffByInn: factoryEndpointServiceMethodRequest(endpointServiceConfig, 'tariff', 'get')

Parameters

Returns any

factoryEndpointServiceMethodRequest

Реализует запрос до

Parameters

  • endpointServiceConfig
  • serviceMethodPath
  • method
  • data
  • requestOptions
  • logger

Returns Promise<any>

proceedRequest

Parameters

Returns any Promise