- Runners
- AbstractClientRunner
- CoreClientRunner
- AbstractServerRunner
- CoreServerRunner
- Navigation
- createStatusesReducer
- createTablesModule
- getBindActions
- apiFindRecords
- apiLoadRecords
- apiEditRecord
- actionLoadRecords
- getLogLevel
- createLogger
- getBindActions
- getTableInfo
- createFilteredReducer
- createReducer
- createAllTypesMapCollectionReducer
- mergeWithConcatArrays
- clientConfig
- initConfig
- Info404
- ThemeProvider
- ThemeProvider
- UniError
- ListItem
- Notifications
- Loading
- Link
- MediaQuery
- ReadMore
- theme
- className
- default
- default
- default
- decoratorContextModules
- rootAppComponentProps
- appUrl
- getModuleFullPath
- initApiClientClass
- initApiClient
- MAP
- MAP
- MAP
- STATUS_PROP
- action-status
- ACTION_STATUS_PROPS
- UNI_ERROR_PROPS
- USER_INFO_PROPS
- CONSTRAINTS_PROP_TYPE
- FIELD_PROP_TYPE
- META_PROP
- getMeta
- filterAndSortDb
- USER
- FROM_BOOM
- FROM_BOOM_RESPONSE
- FROM_BOOM_ERROR
- clientErrorMessage
- uniMessage
- parseFromBoom
- parseFromBoomResponse
- parseFromBoomError
- DEFAULT_VALUES
- user-info
- PATH_INDEX
- createJsonPatchOperation
- createCrudApi
- loadRecords
- apiCreateRecord
- BaseApiClientClass
- valueFromRange
- removeFirstBy
- findInTree
- findInTree
- arrayToTree
- aggregation
- emitProcessing
- createApiConfig
- createApiConfig
- TIMESTAMP
- reduxSimpleFormDecorator
- reduxTableDecorator
- titledDecorator
- updatePathIfChange
- onPropsUpdate
- onStatusPropUpdate
- deepDiff
- deep-diff
- postFormToUrl
- formatDate
- formatStringInner
- formatString
- formatStringWithoutAutoSpaces
- generateId
- init
- translateDefault
- i18nContextProvider
- ImageTools
- apiClient
- isEmpty
- parseUrlParameters
- formatUrlParameters
- joinPath
- joinPathSimple
- joinUri
- updateUrl
- getModuleRoutePath
- connect
- connect
- onChangeStatus
- updateValues
- replace
- replace
- getAttachmentsByFieldId
- getAttachmentInfosByUuids
- getAttachmentIsSummaryFetching
- uploadFile
- downloadFile
- deleteFile
- uploadFile
- downloadFile
- deleteFile
- ServiceAttachments
- link
- type
- notNaturalButton
- asyncIsLoading
- bemDecorator
- render
- linkTo
- type
- image
- content
- mobile
- onClick
- isLink
- parseValueToString
- options
- touched
- children
- accept
- attachmentsInfoMap
- onAdd
- openUploadDialogFn
- attachmentInfo
- onDescriptionChange
- onDescriptionBlur
- onClick
- onRemove
- selectedValue
- records
- isSaveFullRecord
- onFieldChange
- onChange
- renderOption
- onChangeCheck
- CheckboxCore
- update
- selectedValue
- records
- isSaveFullRecord
- fieldLabel
- fieldId
- isValueOnlyIntoRecords
- onFieldChange
- onChange
- onSelect
- allowCreateNew
- parseNewItem
- onCreateNew
- renderOption
- isHideSelected
- renderInputText
- useUnique
- onRemoveSelected
- useSearch
- onSearch
- searchOnceOnMinCharacters
- onLoadMore
- SelectCore
- update
- formData
- initFormData
- onChangeField
- onUpdateForm
- validate
- Layout
- model-attachment-access
- fileDescriptor
- contentId
- TYPES
- SUB_TYPES
- id
- valueName
- label
- placeholder
- textPlaceholder
- title
- textHint
- textDescription
- Layout
- onChange
- parseOutValue
- instanceChange
- onAdd
- onRemove
- constraints
- validate
- required
- formDependentFields
- formDependentData
- getFormData
- controlProps
- controlRef
- controlClass
- render
- renderGrouping
- apiGetUserAvatarUrl
- apiCheckVerifyToken
- bind
- bind
- authViewDecorator
- checkAccess
- actionChangeUser
- ServiceAuth
- ServiceAuthMock
- remoteJwt
- sendForgotPasswordEmail
- resetPasswordByEmail
- findUsers
- findUser
- getProtectedInfo
- sendForgotPasswordEmail
- resetPasswordByEmail
- SUB_MODULE_FACTORY
- DEFAULT_LOGGER_IDS
- contextData
- register
- method
- method
- prepare-state
- onPreResponse
- createServices
- createMockServices
- WITHOUT_SERIALIZE_DATA
- WITHOUT_LINKED_DATA
- WITHOUT_CALCULATING_DATA
- WITHOUT_DESERIALIZE_DATA
- endpointServiceConfig
- getCrudUrlsPrefix
- findRecords
- findRecordsWithPagination
- patchRecord
- removeRecord
- bulkOperations
- removeRecord
- pluginServicesContext
- registerService
- pluginStrategies
- ROUTE_CONFIG
- ROLES
- PERMISSIONS
- ACCESS_OBJECT
- PROXY
- GUEST_MODE
- AUTH_IF_EXISTS
- AUTH
- createProxyWrapperCallback
- apiPluginFullFactory
- apiPluginFactory
- proxyRoute
- proxyRoutePluginFactory
- createEndpointServiceConfig
- HOST
- HOST
- SERVICES_HOST
- SERVICES_HOST
- REQUEST_TIMEOUT
- REQUEST_TIMEOUT
- createEndpointFactoryFromEnv
- createTempFile
- cookie
- downloadFile
- dirnameNormalize
- inModules
- sendSimpleRequest
- getEndpointServiceUrl
- sendEndpointMethodRequest
- factoryEndpointServiceMethodRequest
- proceedRequest
Освновные расширяемые класс по управлению клиентом и сервером
Абстракный класс для точечной настройки процесса запуска клиентской (браузерной) части приложения
Parameters
runnerOptions
(optional, default{}
)htmlContainerId
id дива, в котором будет разворачиваться реатовское приложение
для hot reload необходимо загружать через require
Returns {}
Маппинг модуля на путь
место для переопределения и инициализации инстанса BaseApiClient
Extends AbstractClientRunner
Расширение для установки core зависимостей по redux и импорт данных, пришедших с сервера при отрисовки
нужно выделить отдельный метод с контекстами, для hot reload (чтобы там id их использовать)
Returns [any]
Возвращаем мапу редьюсеров
Returns any
Абстрактный класс для серверного ранера, икапсулирующий логику запуска node js сервера hapi
Parameters
runnerOptions
(optional, default{}
)
Extends AbstractServerRunner
Расширение для установки core зависимостей
Returns any string || (reduxStore, i18n) => string
остальное
Parameters
typesArray
...any один или несколько массивов, в каждом по три types. Первый - fetch, второй - success, третий - fail
Parameters
tableModuleName
ReduxTableClass
api
В зависимости есть ли нужный 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, defaultthis.getTypes(this.getPrefix())
)localDataList
(optional, defaultundefined
)
апи который возвращает { meta, records }, либо массив, когда мультипейджинг не нужен
Meta
- deprecated: use apiFindRecords
Meta
- deprecated: use apiUpdateRecord
Parameters
tableUuid
meta
мержится к текушейfilters
полностью заменяется (чтобы можно было очистить)forceUpdate
isReplaceLocation
syncWithUrlParameters
синхронизировать с url query (но делается scroll to top и не подходит для load more и нескольких таблиц на странице)searchFieldObjects
isLoadMore
Returns function (any, any)
Get log level string based on supplied params
Parameters
level
(string | function | object) console[level]action
object selected actionpayload
array selected payloadtype
string log entry type
Returns string level
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 colorsoptions.logger
object implementation of theconsole
APIoptions.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 behavioroptions.stateTransformer
function transform state before printoptions.actionTransformer
function transform action before printoptions.errorTransformer
function transform error before print
Returns function logger middleware
Сама мапа таблиц уже добавлена в рутовый редьюсер под именем 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)
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: {} }
Проверяет по action
Parameters
reducerFunction
reducerPredicate
Returns function (any?, any?)
Удобное создание редьюсеров (без лишних switch-case условий)
Parameters
initialState
handlers
key - action type, value - caseReducerfieldsHandlers
defaultHandler
Returns reducer
Parameters
TYPES
reducer
actionIdField
createIfNotExist
bool | (initialState, action) => {}
Returns any
!!! mutable
Parameters
source
newObj
Returns any
Располагается в common, так как используется для инициализации и на серверной части тоже для компонентов
Конфиги для клиента - это только лишь часть общих конфигов, которые поставляются на клиент вместе с initialState для стора при формировании html страницы
Parameters
inputConfig
Returns {}
Meta
- deprecated: чтобы не подгружались все лишние компоненты, нужно не импортить index.js а писать полный путь
Meta
- deprecated: чтобы не подгружались все лишние компоненты, нужно не импортить index.js а писать полный путь
Extends Component
Компонент задающий тему для своих дочерних компонентов. Важно! Может содержать в себе строго один дочерний компонент.
Meta
- deprecated: чтобы не подгружались все лишние компоненты, нужно не импортить index.js а писать полный путь
Meta
- deprecated: чтобы не подгружались все лишние компоненты, нужно не импортить index.js а писать полный путь
Meta
- deprecated: чтобы не подгружались все лишние компоненты, нужно не импортить index.js а писать полный путь
Meta
- deprecated: чтобы не подгружались все лишние компоненты, нужно не импортить index.js а писать полный путь
Meta
- deprecated: чтобы не подгружались все лишние компоненты, нужно не импортить index.js а писать полный путь
Meta
- deprecated: чтобы не подгружались все лишние компоненты, нужно не импортить index.js а писать полный путь
Meta
- deprecated: чтобы не подгружались все лишние компоненты, нужно не импортить index.js а писать полный путь
Тема компонента
Дополнительный класс
Meta
- deprecated: user src/common/all-permissions.js
Meta
- deprecated: use feature-ui-form/common/subModule/model-attachment
Meta
- deprecated: use feature-ui-form/common/subModule/model-attachment
Meta
- deprecated: use src/routes-pathes.js
Декорирует компонент и добавляет в него:
- getFullPath(location, moduleName)
- getRoutePath(location, moduleName)
- onGoTo(location, moduleName)
- onReplaceLocation(location, moduleName)
- match
- location
- moduleToRoutePrefixMap
location - LocationDescriptor (see \src\common\models\model-location.js)
themeProviderProps: {}, modulesProviderProps: { moduleToRoutePrefixMap: {} }
осторожно!!! contextPath (basename) уже учитывается во всех роутингах, дополнительно в path его задавать не нужно. Поэтому пользуйтесь аккуратно учитывает contextPath (basepath) приложения
Parameters
pathname
otherPaths
...any
Полный путь до ресурса с учетом префикса различных модулей и contextPath
Parameters
relativeLocation
LocationDescription - @see model-location.jsmoduleName
modulesPrefixes
мапа: moduleName => prefixqueryParams
Returns any
берется из AbstractClientRunner getApiClientClass
Parameters
NewApiClientClass
Returns BaseApiClientClass
Проставляется в AbstractClientRunner
Parameters
newApiClient
Returns any
Meta
- deprecated: use model-action-status
Meta
- deprecated: use UNI_ERROR_PROP_TYPE_MAP
Meta
- deprecated: use model-user-info
Meta
- deprecated: use model-action-status
Meta
- deprecated: use model-action-status
Meta
- deprecated: use ACTION_STATUS_PROP_TYPE
Meta
- deprecated: use UNI_ERROR_PROP_TYPE
Meta
- deprecated: use USER_INFO_PROP_TYPE
Meta
- deprecated: use src/modules/feature-ui-form/common/subModule/model-constraints
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
Type: shim
Meta
- deprecated: use META_PROP_TYPE
Формат ЗАПРОСА от фронта к бэку:
Вот так это выглядит 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
Parameters
mockDb
query
search sortBy sortDesc itemsPerPage если false - отменяет разбивку на страницы - выдает все разультаты startPage itemsPerPagesearchFieldObjects
withPagination
isGetAllNotMutable
Returns {records, meta}
Meta
- deprecated: use /src/modules/module-auth/common/subModule/model-user.js
https://github.com/hapijs/boom
Meta
- deprecated: старый формат
Meta
- deprecated: старый формат
Meta
- deprecated: use clientErrorMessages
Meta
- deprecated: use uniMessages
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{}
)
Parameters
errorOrResponse
uniErrorData
(optional, default{}
)
Meta
- deprecated: старый формат
Parameters
boomError
uniErrorData
(optional, default{}
)
Meta
- deprecated: старый формат
Meta
- deprecated: use model-user-info
Meta
- deprecated: use model-user-info
Type: string
Meta
- deprecated: use PATH_MAIN_INDEX
по умолчанию не добавляет в конец, нужно обязательно указывать позицию createJsonPatchOperation('/field2', 'newValue4', PATCH_OPERATIONS.ADD),
Parameters
path
value
operationType
itemIds
Returns {path: string, value: any, op: string}
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)}
Meta
- deprecated: use findRecords
Parameters
data
filesMap
может быть File, массивом File, либо мапой <имя поля>: File|[...File]
Returns any
Класс для отсылки запросов на сервер
Parameters
apiClientOptions
(optional, default{}
)
Parameters
args
...any
Returns any
Meta
- deprecated: use getUser
Используется для загрузки НЕ АПИ методов при настроенном на один хост клиент апи (для апи использовать client.post \ client.get)
Parameters
absoluteUrl
params
options
Returns any
Используется для загрузки НЕ АПИ методов при настроенном на один хост клиент апи
Parameters
absoluteUrl
data
options
Returns any
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 - resultmockFilter
function(requestOptions, error, response) {}
Returns Promise
Примеры 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
кол-во на одно меньше чем inputValueRangesoutRangeValue
Parameters
array
predicate
либо значение \ либо (arrayItem, index)
Returns any
Parameters
tree
id
config
(optional, default{}
)deep
(optional, default0
)path
(optional, default[]
)pathStr
(optional, default''
)
Meta
- deprecated: user tree-utils.js::findInTree
Ищет первое вхождение в дереве
Parameters
tree
filter
либо искомый id либо функция (treeItem, config)options
{ fieldChildren = 'children', fieldSearch = 'id', - если не задано поле filter как функция equalConstraint = EQUAL_CONSTRAINTS.EQUAL, }deep
(optional, default0
)path
(optional, default[]
)pathStr
(optional, default''
)
Returns {result: any, isRoot: boolean, pathStr: string}
Parameters
array
options
(optional, default{}
)parent
(optional, defaultnull
)level
(optional, default0
)
Meta
- deprecated: use tree-utils.js arrayToTree
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.
Метод который, который на время исполнения промиса, проставляет через setState значение переменной processingStateVariable (по умолчанию, isProcessing)
Многие промисы - это обычные Promise.resolve и выполняются моментально Поэтому, проверка необходимости этих действий идет через 10 секунд, и если proimse до сих пор в pending тогда запускается setState, чтобы лишний раз не нагружать перерендеринг реакта
Parameters
handlerPromise
componentWithSetState
processingStateVariable
immediately
выполняет setState сразу же, без задержки в 15 милисекунд
Returns any
Создание настроек для клиенской части и их роутинг через плагину на серверной
Parameters
path
method
payload
Returns ({method, path, payload} | any)
Создание настроек для клиенской части и их роутинг через плагину на серверной
Parameters
path
method
payload
Returns ({method, path, payload} | any)
Meta
- deprecated: use TIMESTAMP_MILLISECONDS or UNIX_TIMESTAMP_SECONDS
Декорирует компонент для отображения формы с данными. Упрощенная версия redux-form
Автоматически инициализирует в redux store под forms свои данные и при выходе их очищает
Parameters
formId
айди форма, или функция (props) => iddefaultValues
дефолтные значенияПлюс в пропертях можно передать initValues - дефолтные значения из значенийВозвращает компонент с доп пропертями:- form - текущие данные формы- formId - id формы
- getFormId - (props = this.props) => {}
- onUpdateForm - метод обновления данных
Декорирует компонент для отображения таблицы с данными Автоматически инициализирует в redux store под tables свои данные и при выходе их очищает
Parameters
tableId
айди таблицы, или функция (props) => id. !!! Если зависит от table meta или filters то не используйте actionLoadRecords со старым id (вместо этого используйте onUpdateTableFilters и onUpdateTableMeta)Options:$1
Object (optional, default{}
)$1.loadOnMount
(optional, defaulttrue
)$1.loadOnChange
(optional, defaulttrue
)$1.clearOnUnmount
(optional, defaulttrue
)$1.initMeta
(optional, default{}
)$1.initFilters
(optional, default{}
)$1.tableActions
$1.useLoading
(optional, defaulttrue
)$1.urlFilterValueNormalizers
$1.syncWithUrlParameters
(optional, defaultfalse
)$1.autoSaveState
(optional, defaultfalse
)
loadOnMount
запускать загрузку данных при маунте (componentWillMount)loadOnChange
если изменилась мета или фильтры - запускает загрузку в componentWillReceivePropsclearOnUnmount
очищать ли данные, когда компонент 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 и урла
Декорирует компонент, проставляя указанные данные в заголовок и в хедар документа
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';
Parameters
path
deepEqual
singleRun
handler
context
newProps
oldProps
isInit
Returns any возвращает true - если нужно прервать последующие обработчики, либо false если продолжать
Таргет метод для обновления данных, если меняются пропсы наденные по пути 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, defaulttrue
)$1.singleRun
(optional, defaulttrue
)$1.oldPropsNotNull
(optional, defaulttrue
)$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, ... } ...
Метод для работы со статусами - см \src\stub\app-redux\helpers\create-status-reducer.js
Parameters
statusPropPath
Returns function
Arguments
- lhs - the left-hand operand; the origin object.
- rhs - the right-hand operand; the object being compared structurally with the origin object.
- 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
- 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
Arguments
- lhs - the left-hand operand; the origin object.
- rhs - the right-hand operand; the object being compared structurally with the origin object.
- 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
Parameters
url
data
encoding
newWindow
при банк эквейринге (оплате через банк) нужно открывать
Переводит дату из формата '2016-01-26' в формат '26 января 2016' или 26.1.2016.
Parameters
Returns String Cтрока даты в формате DD month YYYY или DD.MM.YYYY
Parameters
addNextNonWordCharacters
str
args
...any либо один параметр - мапа с параметрами ключ:значение- либо остальные стринги \ намбер - последовательно добавляются- последний параметр может быть функция реплейсмент (path, значение из мапы если есть, type, mask, nextNonWordCharacters, position, allString)
Returns any
Parameters
str
args
...any либо один параметр - мапа с параметрами ключ:значение- либо остальные стринги \ намбер - последовательно добавляются- последний параметр может быть функция реплейсмент (path, значение из мапы если есть, type, mask, nextNonWordCharacters, position, allString) важно использовать nonWordSeparator (пустое место до следующего элемента), ибо по умолчанию для функции оно не подставляется. Это нужно чтобы иметь возможность менять его в функции
Returns any
автоматически не добавляет nextNonWordCharacters
Parameters
str
args
...any либо один параметр - мапа с параметрами ключ:значение- либо остальные стринги \ намбер - последовательно добавляются- последний параметр может быть функция реплейсмент (path, значение из мапы если есть, type, mask, nextNonWordCharacters, position, allString) важно использовать nextNonWordCharacters (пустое место до следующего элемента), ибо по умолчанию для функции оно не подставляется. Это нужно чтобы иметь возможность менять его в функции
Returns any
Returns string
Meta
- deprecated: use common/utils/common.js::generateId
Метод инициализации настроек Используется отдельно на клиенте и отдельно на сервере
Parameters
newI18nInstance
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
чтобы каждый раз не писать префиксы для конкретного компонента
Пример: import {i18nContextProvider} const i18n = i18nContextProvider('components.MyComponent'); console.log(i18n('core:keyForMyComponent')); //components.MyComponent.keyForMyComponent
Parameters
context
Returns Function
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. });
Meta
- deprecated: используйте helpers/get-api-client.js
Parameters
value
objectChecker
(optional, defaultnull
)
Meta
- deprecated: use common.js::isEmpty // todo @ANKU @LOW - удалить когда удалим методы дерева из common.js (чтобы взаимных ссылок не было) и оттуда будем пользоваться
Parameters
url
либо объект location, либо мапа параметров, либо стрингаdefaultValues
customNormalizersMap
мапа : (urlValue)=>normalizedValue - для правильного парсинга из урла значений
Returns {}
// todo @ANKU @LOW - не работают с "bracket" (когда multiple test[]=value1&test[]=value2)
Parameters
params
url
если '' пустая строка - то это сигнал вернуть c символом начала query параметров (знаком вопроса): ?test=testValuehash
Returns string
Конкатинация кусков path (в переди всегда проставляется '/')
Parameters
paths
...any пути, который нужно объединить Последним параметром может быть мапа queryParams которая преобразуется в строку
Returns any
в отличии от joinPath не добавляет в начало / и не парсит параметры, просто конкатинирует части path
Parameters
paths
...any
Returns string
Parameters
paths
...any
Returns any
Meta
- deprecated: renaming - use joinPath
Parameters
url
newQueryParams
merge
по умолчанию реплейс массивов и объектов
Returns string
Путь до ресурса с учетом префикса различных модулей для роутинг (без учета contextPath)
Parameters
relativeLocation
LocationDescription - @see model-location.jsmoduleName
modulesPrefixes
мапа: moduleName => prefixqueryParams
(optional, defaultundefined
)
Returns any
класс который поддерживает мгновенную загрузку аттачментов и хранение инфы об этом в редуксе
По ключу userId обновляет все, то если если пользователь сменится - все обновится
(isSummaryFetching) => {} - если один из атачей всего контрола имеет процесс
Наполняем результаты из рудекса (сколько загружено)
Returns any
Meta
- deprecated: InstanceAttachment - use InstantlyAttachment
Meta
- deprecated: TextArea - use Input with type = 'textarea'
Parameters
globalState
fieldId
undefined - то найдет все у которых еще id нет
Returns {}
(globalState, attachments) => { [uuid]: objectInfo }
(globalState, attachments) => boolean
Parameters
filename
contentType
readStream
Returns Promise attachmentContentId
Parameters
contentId
Returns any stream
Parameters
contentId
Returns Promise
Parameters
filename
contentType
readStream
Returns Promise attachmentContentId
Parameters
attachmentContentId
Returns any stream
Parameters
attachmentContentId
Returns Promise
Extends CoreService
Обычно аттачи хранят в виде двух сущностей информации об аттаче (Attachment) и его контент (AttachmentContent) причем бывают на разных серверах
Но, по умолчанию, мы будем считать, что аттачи хранятся в базе и Attachment = AttachmentContent, весь процесс управляется через ServiceAttachmentContents поэтому тут ничего не нунжно делать
Если необходимо разбить сущности, то этот класс нужно переопределить
если какой-то объект использует этот аттач то link проставляется этому объекту удобно чтобы удалять темповые не используемые фотография
Parameters
id
linkByObjectId
objectModel
Returns Promise
если какой-то объект использует этот аттач то link проставляется этому объекту удобно чтобы удалять темповые не используемые фотография
Parameters
id
linkByObjectId
objectModel
Returns Promise
default "button" (not "submit")
Эмуляция кнопки (к примеру, выглядит label оборачивает input type="file" и выглядит как кнопка)
(default: true) показывать лоадинг если onClick возвращает promise
Компонент для того, чтобы не писать bind функции c ключом В основном используется, чтобы улучшить производительность - не биндить фунции внутри render каждый раз при перерисовки (а она оооочень частая) См. https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-bind.md#lists-of-items
(cellValue, column, record, rowIndex) => {}
Оборачивает значение колонки в линку если функция - (record, column, rowIndex) => {}
MENU_ITEM_TYPE = { NORMAL: 'normal', DELIMITER: 'delimiter', HEADER: 'header', }
url аватарки либо будет использована icon
либо name будет рисоваться
true - показывать только для мобильных false - показывать только для не мобильных undefined \ null - показывать везде
либо path будет использован для перехода
по умолчанию, если есть path или onClick то считается линкой, но это можно исправить с помощью этого параметра
Parameters
type
value
customMask
props
если LIST - то нужно records, componentProps: fieldLabel \ fieldId - если они отличаются от стандартных
Returns any
Meta
- deprecated: use controlProps.records
Meta
- deprecated: в CoreField--touched есть
Если функция - (openUploadDialogFn, props) => Node
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"
доп инфа по статусам на каждый элемент аттачмента [uuid]: attachInfo
(uuidToFileMap, newAttachments, resultAttachments) => {} - всегда, даже если multiple=false, так как uuid важен для InstanceAttachments
бывает необходимо сделать кастомный вид кнопки загрузки, поэтому ставят showAddButton: false и children: (openUploadDialogFn, props) => {} куда и передается эта функция, чтобы мануально открыть окно выбора файла
Доп информация (в основном статусы, уровень загрузки) конкретного аттача
(attachment, newDescription, event) => {}
(attachment, newDescription, event) => {}
(attachment, event) => {}
(attachment) => {}
Meta
- deprecated: use value
Самый важный текущий список данных к отображения для выбора (мы работаем с данными, а потом они переводятся в optionMeta а в SelectView они преобразуются уже в option node
по-умолчанию сохраняется только id, но если эта true - сохранится весь объект
Внутренний метод от CoreField чтобы можно было задать кастомный onChange
(valuesOrNull, selectedRecords, context) => {}
- context - { optionMeta: { record, recordId, isSelected, isDisabled } }
- если multiple - это массивы, если нет - значения (если не выделено - null)
- если isSaveFullRecord - то newValuesFinal - это рекорд, если нет то id
(valuesOrNull, selectedRecords, context) => {}
- context - { optionMeta: { record, recordId, isSelected, isDisabled } }
- если multiple - это массивы, если нет - значения (если не выделено - null)
- если isSaveFullRecord - то newValuesFinal - это рекорд, если нет то id
(record[fieldLabel], record, index, visibilityRecords) => React.node
(recordId, isCheck) => {}
Extends PureComponent
Нужно показывать только n первых элементов
Parameters
withBlur
withChange
event
comp
other
...any
Meta
- deprecated: use value
Самый важный текущий список данных к отображения для выбора (мы работаем с данными, а потом они переводятся в optionMeta а в SelectView они преобразуются уже в option node Может быть массивом стрингов, либо массивом сущностей createSimpleSelectRecord ({ id, label })
по-умолчанию сохраняется только id, но если эта true - сохранится весь объект
'name' - or use createSimpleSelectRecord
'id'
false - значения могут быть только в рамках records. Если они выходят за рамки, происходит событие onChange и чистятся недопустимые
Внутренний метод от CoreField чтобы можно было задать кастомный onChange
(values, selectedRecords, context) => {}
- context - { optionMeta: { record, recordId, isSelected, isDisabled } }
- если multiple - это массивы, если нет - значения
- если isSaveFullRecord - то newValuesFinal - это рекорд, если нет то id
(values, selectedRecords, context) => {}
- context - { optionMeta: { record, recordId, isSelected, isDisabled } }
- если multiple - это массивы, если нет - значения
- если isSaveFullRecord - то newValuesFinal - это рекорд, если нет то id
(newSelectedValue, newRecordsFinal) => {}
- если multiple - это массивы, если нет - значения
- если isSaveFullRecord - то newSelectedValue - это рекорд, если нет то id
Добавление новых сущностей
(label, id, index) => new record
(record, index) => {}
(record[fieldLabel], record, optionMeta, visibilityRecords) => React.node
Если мы что-то выбрали, они убирается из доступного списко
(selectedRecords, props) => PropTypes.node
только уникальные значения могут быть выбраны
(deletedValue, newRecordsFinal, removedItemIndex) => {}
- если multiple - это массивы, если нет - значения
- если isSaveFullRecord - то deletedValue - это рекорд, если нет то id
использовать поиск для выбора
(searchTerm) => {}
- если асинхронно нужно
если включаем - то игнорируется maxVisible и ищет один раз а остальные уточняющие буквы фильтруют текущее значение и так будет пока не дойдет до минимального кол-ва символов и снова ищет
- если searchMinCharacters = 0 - то один раз при маунте будет
- если searchMinCharacters > 0 - будет дергаться onSearch каждый раз при пересечении этой границы
(searchTerm, alreadyShownLength) => {}
Extends PureComponent
Нужно показывать только n первых элементов
Parameters
args
...any
Parameters
currentItemIds
может быть как id так и просто optionMeta (если это createNew)isRemove
removedItemIndexes
Returns any
Parameters
withBlur
withChange
event
comp
Для передачи в onSubmit
Начальные значения (которые могут потом меняться), но весь основной стейт находится внутри формы. Это подходит для форм с фильтрами, где есть кнопочка "Применить". Загружаем из урла начальные значения, потом внутри формы выбираем значения полей, нажимаем "применить" и обновляется таблица и initFormData (а вместе с ней и state этой формы)
(newFormPartValue) => {} приходит только часть и нужно делать merge в обработчике { address: { city: 'Moscow' } }
(newFullFormData) => {} Идеально подходит onUpdateForm из redux-simple-form декоратор для редукс
(fieldErrors, formData, props) => result Где fieldErrors: [...string|{field, fieldLabel, errors}]
Где result: string|boolean|[...string|{field, fieldLabel, errors}]
- если false: ошибка с текстом textDefaultFormErrorText
- если true | null | undefined: не будет ошибок (не смотря на fieldErrors)
- если массив: выведется массив ошибок
default - FormLayout props: id inModal
fields actions postActions actionStatus
accessPublic - все у кого есть ссылка accessAuth - только авторизованные пользователи accessOwnerOnly - только тот, кто создал (ну и админ ;)) [] - пермишен специальный
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: "", }
id контента, по которому можно получить содержимое файла
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
Type: {LOGIN: string, LOGIN_EMAIL: string, PASSWORD: string, EMAIL: string, PHONE: string}
Meta
- deprecated: FIELD_SUB_TYPES
по умолчанию <form_id>_
Значение которое будет отображаться
в локализованных файлах могут автоматически подсасываться значения, к приеру 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'
из локализации это '<field_name>.placeholder'
Meta
- deprecated: use placeholder
то, что появляется над контролом при наведении средствами html из локализации это '<field_name>.title'
специальная иконка справа при наведении показывается дополнительная информация из локализации это '<field_name>.hint'
то, что показывает под полем из локализации это '<field_name>.description'
className
label textDescription errors
required touched
(fieldName, parseOutValue, multiple, context, node) => {}
(value, fieldProps, index) => parsedValue
обычно для больших форм, чтобы сэкономить ресурсы значение применяется после потери фокуса или Enter Это сделано и для input
Но бывают случаи когда нужно реально по символьно обновлять (когда данных мало и нужно явно показать что кнопка больше не дисеблится (к примеру, при форме логине) Значеие true - как раз и включает нотификацию по мере ввода
(fieldName, index, null, context) => {}
(fieldName, index, itemValue, context) => {}
values maxLength minLength multipleMaxSize multipleMinSize maxSize minSize minValue maxValue, maxBytes, minBytes, value pattern required,
Дополнительная кастомная валидация, срабатывает после всех автоматических проверок (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; }
дублирует поле constraints.required для удобства
Список других полей на форме от которых зависит текущее поле Если есть - то будет подаваться formData в виде объекта и обновлять
значение зависимых полей
Метод с формы, чтобы получить остальные контекстные формы
- функция - чтобы не перезагружать компонент, при смене других значений
для листов нужно объявить: { records - вместо options мы используем данные, потом они преобразуются в optionMeta и передаются в SelectView, а он уже отображет из них option node fieldId fieldLabel }
ссылка на DOM (field, dom) => {}
Класс - замена стандартному для контрола
Замена стандартной отрисовки (controlPropsFinal, resultNode, fieldProps) => node
(groupingField, index, innerFieldComponents, innerFieldProps) => {}
синхронный метод, дает только урл, по которому вернется картинка
Parameters
userIdentify
key
userId
Parameters
verifyToken
userIdentify
может не быть если это смка для регистрации
Returns any
Parameters
isChangeFromSigninToSignup
true - переключаемся между Логин -> Ренистрация false - переключаемся между Ренистрация -> Логин null - закрываем окно (закончили или регистрацию или логин)
Returns Promise<void>
Определеяет какие куски приложения требуют авторизации В enterprise обычно все что не noAuthRequireMatcher Но других проектах помимо noAuthRequireMatcher (где указыавются просто файлы, статика, авторизация и подобное) еще позволительный страницы без юзера (к примеру лендинг)
Parameters
pathnameWithoutContextPath
moduleToRoutePrefixMap
Returns boolean
Оборачивание компонентов для проверки авторизации, наличия ролей или permissions
Последний параметр, если это object - рассматривается как options. Все перед ним это rolesOr
Parameters
args
...anynull
(...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:
По умолчанию используется оператор OR (Или) то есть пользователю достаточно иметь хотя бы одну соотвествующую роль \ разрешение
Parameters
user
roles
либо массив ролей, либо объект accessObject (rolesOr: [], rolesAnd: [], permissionsOr: [], permissionsAnd: [])permissions
Returns any boolean|Array - либо булеан, либо массив ошибок
Meta
- deprecated: use actionSignin
Extends CoreService
Клиенсткая реализация протокола OAuth 2.0 Bearer PROTOCOL - https://tools.ietf.org/html/rfc6749#
Parameters
endpointServiceConfig
Returns {authValidate, authLogin}
clientCredentials { client_id, client_secret }
Parameters
clientCredentials
(optional, defaultundefined
)force
(optional, defaultfalse
)
Extends ServiceAuth
Клиенсткая реализация протокола OAuth 2.0 Bearer
Parameters
endpointServiceConfig
Returns {authValidate, authLogin}
token - это токен сотрудника банка
Parameters
server
pluginOptions
Returns {authenticate: authenticate}
Parameters
email
resetPasswordPageUrl
emailOptions
Returns any
Parameters
resetPasswordToken
newPassword
emailOptions
Returns Promise<any>
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>
Parameters
userIdentify
userId | email | usernamesilent
(optional, defaultfalse
)
Returns any project user
Информация которая загружается на клиент о пользователе (без системной инфы)
Parameters
userIdentify
Returns Promise<["userId"
, "displayName"
, "aliasId"
, "description"
, "username"
, "firstName"
, "lastName"
, "middleName"
, "email"
, "phone"
, "address"
]>
Протокол для @reagentum/[email protected]
Parameters
email
resetPasswordPageUrl
emailOptions
Returns any
Протокол для @reagentum/[email protected]
Parameters
resetPasswordToken
newPassword
emailOptions
Returns Promise<any>
Упрощенный модуль выглядит так: 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
ПРИМЕР только для require.context нужно явно regexp задавать а не через переменную
Parameters
webpackRequireContext
require.context('./', true, SUB_MODULE_FACTORY.COMMON_SUB_MODULE_REGEXP);type
-
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
-
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}
Которые определены в конфигах
любые контекстные данные при запуске приложения
Усорвешенствованная библиотека hapi-i18next (репо версия устарела для i18next)
Parameters
server
options
next
Returns fresh i18next instance for each request, to prevent cache pollution
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)
загрузка необходимых вначале общих данных из различных сервисов (в данном случае organizations и profiles
Parameters
request
server
defaultState
pluginOptions
Returns {}
включение моков по урлу
Parameters
mockOptions
request
reply
Returns (void | any)
Метод для создания сервисов
Parameters
endpointServiceConfigs
Метод для создания сервисов
Данные нужные без обработки
Данные без связей (чтобы зациклинности не было)
Данные без калькулируемых полей
Без десериализации на сервер
Создается в 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
если его определить то все методы findRecords findRecordsWithPagination createRecord readRecord updateRecord deleteRecord patchRecord
- заработают автоматом
Returns null
Parameters
query
searchFields
options
Parameters
query
searchFields
findOptions
Соглашение, что патч возвращает получившийся объект - https://stackoverflow.com/a/37718786/344172
Parameters
id
patchOperation
options
Returns Promise<any>
Parameters
id
options
Returns Promise<void>
Meta
- deprecated: use deleteRecord
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, defaultnull
)
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.
Parameters
id
options
Returns Promise<void>
Meta
- deprecated: use deleteRecord
Обогощает request "servicesContext" и "services" еще перед авторизацией
Parameters
server
options
next
Parameters
serviceName
getServiceFn
функция (endpoint) => инстанса сервиса, который унаследован от CoreService (есть setRequest, setServicesContext)isMock
Обогощает request "servicesContext" и "services" еще перед авторизацией
Parameters
server
options
next
hapi настройки для роутера - см ROUTE_CONFIG_OPTIONS
или
или
Если не хватает ROLES и PERMISSIONS - можно воспользоваться объектом для тонкой настроки - src/modules/module-auth/common/subModule/helpers/access-object-utils.js
h2o2 options
поддержать гостевой режим (может пользователь быть, а может и не быть), но попытку авторизации нужно произвести false,
true - и если токен пользователя есть - запросит авторизацию, если нет - пропустит как если бы было routeConfig: { auth: false }
Это настройка понадобилась, так как если задать routeConfig: { auth: false } - то не запустится система авторизации в jwt-auth и user не проставится в request вообще
hapi настройка true
если false - то не будет запускать системы авторизации, то есть jwt-auth не сработает и user в request не проставится
Parameters
handler
(proxyPayload, requestData, apiRequest, newReply, proxyResponse, pluginOptions) => {}apiRequest
pluginOptions
Returns function (any?, any?, any?)
Подключена проверка пермишенов, логгинг, проксирование (и авторизация)
Parameters
apiConfig
apiPluginOptions
handler
Можно не использовать reply, если возвращаем не response, то идет вызов reply автоматически с результатом в качестве аргументаaccessObject
permissions
roles
checkPermissionStrategy
routeConfig
isLogging
Returns any function(apiRequestData, request, reply) {}
Parameters
apiConfig
handler
(payload, apiRequest, reply, pluginOptions) => {}apiPluginOptions
permissions- checkPermissionStrategy- routeConfig
- isLogging
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
Parameters
path
proxy
otherOptions
Meta
- deprecated: use proxyRoute
Это настройка для набора сервисов, который после подключения спец библиотек (Thrift или оберток над Rest) позволяют дергать свое апи через методы с переменными (вся логика выстраивания пути до rest сервисов, инкапсулирована внутри). Это позволяет их легко переиспользовать, в том числе и в других проектах.
Parameters
$0
Object$0.protocol
$0.host
$0.port
$0.endpoint
$0.useDefault
(optional, defaulttrue
)$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}
Марафон при запуска автоматически добавляет адресс хоста в эту переменную
Марафон при запуска автоматически добавляет адресс хоста в эту переменную
Когда запускаем на localhost или нужно на стендах зашить
Когда запускаем на localhost или нужно на стендах зашить
Первый запуск мидловых сервисов бывает до 20 сек
Первый запуск мидловых сервисов бывает до 20 сек
Parameters
env
Returns function (any, any?)
Meta
- deprecated: This is deprecated.
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
Parameters
request
name
value
Returns any
Meta
- deprecated: bug with set cookie value - use getCookie and setCookie instead
Parameters
reply
serverPath
либо путь, либо data: , либо streamfileName
type
Returns any
webpack/webpack#1599 С любыми настройками webpack на сервере**dirname на unix выдает src... а **filename /index.js в любом варианте
Parameters
dirname
Returns string
Parameters
globRegexp
https://www.npmjs.com/package/glob#glob-primerprojectSrcPath
Returns Array
Parameters
requestOptions
https://github.com/request/request#requestoptions-callback!!! Есть ужасная бага при загрузке файлов - буффер по умолчанию переводится в строку https://stackoverflow.com/questions/14855015/getting-binary-content-in-node-js-using-request нужно установить в настройках: encoding: null,
Returns Promise
Parameters
endpointServiceConfig
serviceMethodPath
data
если потребуется возьмутся для pathParamsadditionalPathParams
сначала из них возьмутся
Returns any
- Обычено чтобы указать тип необходимых данных через TypeScript, делают такую обертку (чтобы data была в параметрах): export default function serviceMethodsFactory(endpointServiceConfig) { function findTariffByInn(data: DataTypeScript, ...other) { return sendEndpointMethodRequest(endpointServiceConfig, '/all', 'get', data, ...other); }
return { findTariffByInn }; }
- либо можете просто использовать фабрику (он сам все данные пробросит) findTariffByInn: factoryEndpointServiceMethodRequest(endpointServiceConfig, 'tariff', 'get')
Parameters
endpointServiceConfig
serviceMethodPath
method
data
apiRequest
requestOptions
https://www.npmjs.com/package/requestlogger
Returns any
Реализует запрос до
Parameters
endpointServiceConfig
serviceMethodPath
method
data
requestOptions
logger
Returns Promise<any>
Parameters
requestOptions
see https://hapijs.com/api#serverinjectoptions-callbackserver
Returns any Promise