0.0.412 • Published 3 years ago

react-application-core v0.0.412

Weekly downloads
140
License
MIT
Repository
github
Last release
3 years ago

React Application Core

A react-based application core for the business applications.

Build Status

Flow

Flow

Description

The library is designed to quickly start develop the business applications are based on React, Redux, Material-UI.

Demo

Dependencies

Classes & markers

@action-builder

@component-container-impl

@component-impl

@effects-proxy-factory EffectsFactories

@reducer

@map

@middleware

@configuration-entity

@redux-holder-entity

Utils

Theme customization (styling)

Button

Chart

Chip

DefaultLayout

Dialog

DnD

Drawer

Field

Form

FormLayout

Header

Main

NavigationList

PageToolbar

SubHeaderLink

TabPanel

TextField

Title

Usage

Containers

Roles container
import * as React from 'react';

import {
  listWrapperMapper,
  filterWrapperMapper,
  defaultMappers,
  BaseContainer,
  DefaultLayoutContainer,
  ListContainer,
  ContainerVisibilityTypeEnum,
  actionsDisabledListWrapperEntityMapper,
  connector,
  SearchFieldToolbarContainer,
} from 'react-application-core';

import { ROUTER_PATHS } from '../../app.routes';
import { IRolesContainerProps, ROLES_SECTION } from './roles.interface';
import { IAppState } from '../../app.interface';
import { AccessConfigT, IRoleEntity } from '../permission.interface';
import { AppPermissions } from '../../app.permissions';

@connector<IAppState, AccessConfigT>({
  routeConfiguration: {
    type: ContainerVisibilityTypeEnum.PRIVATE,
    path: ROUTER_PATHS.ROLES,
  },
  accessConfiguration: [AppPermissions.ROLES_VIEW],
  mappers: [
    ...defaultMappers,
    (state) => filterWrapperMapper(state.roles),
    (state) => listWrapperMapper(state.roles)
  ],
})
class RolesContainer extends BaseContainer<IRolesContainerProps> {

  public static defaultProps: IRolesContainerProps = {
    sectionName: ROLES_SECTION,
  };

  public render(): JSX.Element {
    const props = this.props;
    const header = <SearchFieldToolbarContainer filterConfiguration={actionsDisabledListWrapperEntityMapper(props)}
                                               {...props}/>;
    return (
      <DefaultLayoutContainer headerConfiguration={{ items: header }}
                              {...props}>
        <ListContainer listConfiguration={{
                        itemConfiguration: { tpl: this.tpl },
                        useAddAction: this.permissionService.isAccessible(AppPermissions.ROLE_ADD),
                       }}
                       {...props}/>
      </DefaultLayoutContainer>
    );
  }

  private tpl = (item: IRoleEntity): JSX.Element => (
    <span>
       {item.name} {this.nc.id(item.id)}
    </span>
  )
}
Role container
import * as React from 'react';

import {
  BaseContainer,
  FormContainer,
  FormDialog,
  TextField,
  toSelectOptions,
  FORM_DIALOG_REF,
  listWrapperSelectedEntityMapper,
  formMapper,
  DefaultLayoutContainer,
  defaultMappers,
  ChipsField,
  ContainerVisibilityTypeEnum,
  connector,
  LayoutBuilder,
  LayoutBuilderTypeEnum,
} from 'react-application-core';

import { IRoleContainerProps, ROLE_SECTION } from './role.interface';
import { IAppState } from '../../../app.interface';
import { RIGHTS_DICTIONARY } from '../../../dictionary';
import { ROUTER_PATHS } from '../../../app.routes';
import { AccessConfigT } from '../../permission.interface';
import { AppPermissions } from '../../../app.permissions';

@connector<IAppState, AccessConfigT>({
  routeConfiguration: {
    type: ContainerVisibilityTypeEnum.PRIVATE,
    path: ROUTER_PATHS.ROLE,
  },
  accessConfiguration: [AppPermissions.ROLE_VIEW],
  mappers: [
    ...defaultMappers,
    (state) => formMapper(state.roles.role),
    (state) => listWrapperSelectedEntityMapper(state.roles, state.roles.role)
  ],
})
class RoleContainer extends BaseContainer<IRoleContainerProps> {

  public static defaultProps: IRoleContainerProps = {
    sectionName: ROLE_SECTION,
  };

  private readonly layoutBuilder = new LayoutBuilder();

  public render(): JSX.Element {
    const props = this.props;
    const dictionaries = props.dictionaries;
    const rights = dictionaries.rights && dictionaries.rights.data;
    const title = props.newEntity
      ? 'New role'
      : `Role ${this.nc.id(props.entityId)}`;

    return (
      <DefaultLayoutContainer headerConfiguration={{
                                navigationActionType: 'arrow_back',
                                onNavigationActionClick: this.activateFormDialog,
                              }}
                              title={title}
                              {...props}>
        <FormContainer {...props}>
          {
            this.layoutBuilder.build({
              layout: LayoutBuilderTypeEnum.VERTICAL,
              children: [
                <TextField name='name'
                           label='Name'
                           autoFocus={true}
                           required={true}/>,
                <ChipsField name='rights'
                            label='Rights'
                            options={toSelectOptions(rights)}
                            bindDictionary={RIGHTS_DICTIONARY}
                            menuConfiguration={{ useFilter: true, renderToCenterOfBody: true }}
                            displayMessage='%d right(s)'/>
              ],
            })
          }
        </FormContainer>
        <FormDialog ref={FORM_DIALOG_REF}
                    onAccept={this.navigateToBack}
                    {...props}/>
      </DefaultLayoutContainer>
    );
  }
}

Effects

Roles effects
import { EffectsService, IEffectsAction } from 'redux-effects-promise';

import {
  buildEntityRoute,
  provideInSingleton,
  ListActionBuilder,
  BaseEffects,
  effectsBy,
  makeFilteredListEffectsProxy,
  makeUntouchedListEffectsProxy,
  makeFailedListLoadEffectsProxy,
  makeEditedListEffectsProxy,
} from 'react-application-core';

import { IApi } from '../../api/api.interface';
import { ROUTER_PATHS } from '../../app.routes';
import { ROLES_SECTION } from './roles.interface';
import { IRoleEntity } from '../permission.interface';
import { IAppState } from '../../app.interface';
import { ROLE_SECTION } from './role';

@provideInSingleton(RolesEffects)
@effectsBy(
  makeUntouchedListEffectsProxy<IAppState>({
    section: ROLES_SECTION,
    resolver: (state) => state.roles,
  }),
  makeEditedListEffectsProxy<IRoleEntity, IAppState>({
    listSection: ROLES_SECTION,
    formSection: ROLE_SECTION,
    pathResolver: (role) => buildEntityRoute<IRoleEntity>(ROUTER_PATHS.ROLE, role),
  }),
  makeFilteredListEffectsProxy({ section: ROLES_SECTION }),
  makeFailedListLoadEffectsProxy(ROLES_SECTION)
)
class RolesEffects extends BaseEffects<IApi> {

  @EffectsService.effects(ListActionBuilder.buildLoadActionType(ROLES_SECTION))
  public $onRolesSearch(_: IEffectsAction, state: IAppState): Promise<IRoleEntity[]> {
    return this.api.searchRoles(state.roles.filter.query);
  }
}
Access group effects
import {
  EffectsService,
  IEffectsAction,
} from 'redux-effects-promise';
import {
  BaseEffects,
  CustomActionBuilder,
  DiSupport,
  effectsBy,
  EffectsFactories,
  FormActionBuilder,
  ListActionBuilder,
  RouterActionBuilder,
  Selectors,
} from 'react-application-core';

import { IPosAccessGroupEntity } from 'pos';

import { IApi } from '../../../api';
import { IPortalState } from '../../../app.interface';
import { PA_GROUP_SECTION } from './portal-access-group.interface';
import { PA_GROUPS_SECTION } from '../portal-access-groups.interface';
import { PortalRoutes } from '../../../app.routes';

@DiSupport.provideInSingleton(PortalAccessGroupEffects)
@effectsBy(
  EffectsFactories.formSubmitErrorEffectsProxy(PA_GROUP_SECTION),
  EffectsFactories.succeedEditedListEffectsProxy({
    listSection: PA_GROUPS_SECTION,
    formSection: PA_GROUP_SECTION,
  })
)
class PortalAccessGroupEffects extends BaseEffects<IApi> {

  /**
   * @stable [01.08.2020]
   * @param action
   */
  @EffectsService.effects(FormActionBuilder.buildSubmitActionType(PA_GROUP_SECTION))
  public $onSaveAccessGroup = (action: IEffectsAction): Promise<IPosAccessGroupEntity> =>
    this.api.saveAccessGroup(action.data)

  /**
   * @stable [01.08.2020]
   * @param action
   * @param state
   */
  @EffectsService.effects(CustomActionBuilder.buildCustomDeleteActionType(PA_GROUP_SECTION))
  public async $onDeleteAccessGroup(action: IEffectsAction, state: IPortalState): Promise<IEffectsAction[]> {
    await this.api.deleteAccessGroup(
      Selectors.listSelectedEntity<IPosAccessGroupEntity>(state.access.accessGroups).id
    );
    return [
      ListActionBuilder.buildLoadAction(PA_GROUPS_SECTION),
      RouterActionBuilder.buildReplaceAction(PortalRoutes.ACCESS_GROUPS)
    ];
  }
}

License

Licensed under MIT.

@babel/core@babel/plugin-proposal-object-rest-spread@babel/preset-env@dagrejs/graphlib@fortawesome/fontawesome-svg-core@fortawesome/free-brands-svg-icons@fortawesome/free-regular-svg-icons@fortawesome/free-solid-svg-icons@fortawesome/react-fontawesome@microsoft/signalr@openid/appauth@popperjs/core@types/bluebird@types/core-js@types/google-libphonenumber@types/google.visualization@types/googlemaps@types/history@types/jquery@types/jqueryui@types/moment-timezone@types/node@types/prop-types@types/ramda@types/react@types/react-dom@types/react-redux@types/socket.io-client@types/source-map@types/sprintf-js@types/storejs@types/uglify-js@types/urijs@types/uuid@types/webpack@typopro/web-montserratanimate.cssawesome-typescript-loaderaxiosbabel-corebabel-loaderbabel-plugin-transform-export-extensionsbabel-preset-envbabel-preset-es2015babel-preset-stage-2bluebirdblueimp-canvas-to-blobcamelcasechart.jsclasslist-polyfillcompressorjscopy-webpack-plugincore-jscron-convertercropperjscross-envcrossventcrypto-jscss-loadercsstypedom-scroll-into-viewdragscrollevent-emitterexports-loaderexpose-loaderfile-loaderfs-extragoogle-libphonenumbergsaphtml-webpack-plugini18nexti18next-browser-languagedetectori18next-xhr-backendintlinversifyinversify-binding-decoratorsinversify-inject-decoratorsjqueryjquery-caret-pluginjquery-uijs-base64jsbarcodejwt-decodelocalforagematchmedia-polyfillmaterial-components-webmemoizeememoizee-decoratormini-css-extract-pluginmomentmoment-timezonencpnode-fs-extranode-sassnormalize.cssnouislideroptimize-js-pluginparse5pdfjs-distperfect-scrollbarplatformprop-typesradiumramdaraw-loaderreactreact-domreact-dropzonereact-reduxreact-router-domreact-svg-loaderreact-text-maskreact-webcamreduxredux-devtoolsredux-devtools-extensionredux-effects-promisereflect-metadataregenerator-runtimereplacerimrafsass-flex-mixinsass-lintsass-loadersass-mixinsscript-ext-html-webpack-pluginsmoothscroll-polyfillsocket.iosocket.io-clientsource-map-loadersprintf-jsstring-replace-loaderstring-replace-webpack-pluginstyle-loadertapabletippy.jsto-string-loaderts-nodets-smart-loggertslibtslinttslint-loadertypescriptuglifyjs-webpack-pluginurijsurl-search-paramsuuidwebcamjswebpackwebpack-bundle-analyzerwebpack-cliwebpack-dev-middlewarewebpack-dev-serverwebpack-dll-bundles-pluginwebpack-inline-manifest-pluginwebpack-mergewebpack-shell-pluginxregexpyargs
0.0.412

3 years ago

0.0.411

3 years ago

0.0.409

3 years ago

0.0.408

3 years ago

0.0.407

3 years ago

0.0.406

4 years ago

0.0.405

4 years ago

0.0.404

4 years ago

0.0.403

4 years ago

0.0.402

4 years ago

0.0.401

4 years ago

0.0.400

4 years ago

0.0.399

4 years ago

0.0.398

4 years ago

0.0.397

4 years ago

0.0.396

4 years ago

0.0.395

4 years ago

0.0.394

4 years ago

0.0.393

4 years ago

0.0.392

4 years ago

0.0.391

4 years ago

0.0.390

4 years ago

0.0.389

4 years ago

0.0.388

4 years ago

0.0.387

4 years ago

0.0.386

4 years ago

0.0.385

4 years ago

0.0.384

4 years ago

0.0.383

4 years ago

0.0.382

4 years ago

0.0.381

4 years ago

0.0.380

4 years ago

0.0.379

4 years ago

0.0.378

4 years ago

0.0.377

4 years ago

0.0.376

4 years ago

0.0.375

4 years ago

0.0.374

4 years ago

0.0.373

4 years ago

0.0.372

4 years ago

0.0.371

4 years ago

0.0.370

4 years ago

0.0.369

4 years ago

0.0.368

5 years ago

0.0.367

5 years ago

0.0.366

5 years ago

0.0.365

5 years ago

0.0.364

5 years ago

0.0.363

5 years ago

0.0.362

5 years ago

0.0.361

5 years ago

0.0.360

5 years ago

0.0.359

5 years ago

0.0.358

5 years ago

0.0.357

5 years ago

0.0.356

5 years ago

0.0.355

5 years ago

0.0.354

5 years ago

0.0.353

5 years ago

0.0.352

5 years ago

0.0.351

5 years ago

0.0.350

5 years ago

0.0.349

5 years ago

0.0.348

5 years ago

0.0.347

5 years ago

0.0.346

5 years ago

0.0.345

5 years ago

0.0.344

5 years ago

0.0.343

5 years ago

0.0.342

5 years ago

0.0.341

5 years ago

0.0.340

5 years ago

0.0.339

5 years ago

0.0.338

5 years ago

0.0.337

5 years ago

0.0.336

5 years ago

0.0.335

5 years ago

0.0.334

5 years ago

0.0.333

5 years ago

0.0.332

5 years ago

0.0.331

5 years ago

0.0.330

5 years ago

0.0.329

5 years ago

0.0.328

5 years ago

0.0.327

5 years ago

0.0.326

5 years ago

0.0.325

5 years ago

0.0.324

5 years ago

0.0.323

5 years ago

0.0.322

5 years ago

0.0.321

5 years ago

0.0.320

5 years ago

0.0.319

5 years ago

0.0.318

5 years ago

0.0.317

5 years ago

0.0.316

5 years ago

0.0.315

5 years ago

0.0.314

5 years ago

0.0.313

5 years ago

0.0.312

5 years ago

0.0.311

5 years ago

0.0.310

5 years ago

0.0.309

5 years ago

0.0.308

5 years ago

0.0.307

5 years ago

0.0.306

5 years ago

0.0.305

5 years ago

0.0.304

5 years ago

0.0.303

6 years ago

0.0.302

6 years ago

0.0.301

6 years ago

0.0.300

6 years ago

0.0.299

6 years ago

0.0.298

6 years ago

0.0.297

6 years ago

0.0.296

6 years ago

0.0.295

6 years ago

0.0.294

6 years ago

0.0.293

6 years ago

0.0.292

6 years ago

0.0.291

6 years ago

0.0.290

6 years ago

0.0.289

6 years ago

0.0.288

6 years ago

0.0.287

6 years ago

0.0.286

6 years ago

0.0.285

6 years ago

0.0.284

6 years ago

0.0.283

6 years ago

0.0.282

6 years ago

0.0.281

6 years ago

0.0.280

6 years ago

0.0.279

6 years ago

0.0.278

6 years ago

0.0.277

6 years ago

0.0.276

6 years ago

0.0.275

6 years ago

0.0.274

6 years ago

0.0.273

6 years ago

0.0.272

6 years ago

0.0.271

6 years ago

0.0.270

6 years ago

0.0.269

6 years ago

0.0.268

6 years ago

0.0.267

6 years ago

0.0.266

6 years ago

0.0.265

6 years ago

0.0.264

6 years ago

0.0.263

6 years ago

0.0.262

6 years ago

0.0.261

6 years ago

0.0.260

6 years ago

0.0.259

6 years ago

0.0.258

6 years ago

0.0.257

6 years ago

0.0.256

6 years ago

0.0.255

6 years ago

0.0.254

6 years ago

0.0.253

6 years ago

0.0.252

6 years ago

0.0.251

6 years ago

0.0.250

6 years ago

0.0.249

6 years ago

0.0.248

6 years ago

0.0.247

6 years ago

0.0.246

6 years ago

0.0.245

6 years ago

0.0.244

6 years ago

0.0.243

6 years ago

0.0.242

6 years ago

0.0.241

6 years ago

0.0.240

6 years ago

0.0.239

6 years ago

0.0.238

6 years ago

0.0.237

6 years ago

0.0.236

6 years ago

0.0.235

6 years ago

0.0.234

6 years ago

0.0.233

6 years ago

0.0.232

6 years ago

0.0.231

6 years ago

0.0.230

6 years ago

0.0.229

6 years ago

0.0.228

6 years ago

0.0.227

6 years ago

0.0.226

6 years ago

0.0.225

6 years ago

0.0.224

6 years ago

0.0.223

6 years ago

0.0.222

6 years ago

0.0.221

6 years ago

0.0.220

6 years ago

0.0.219

6 years ago

0.0.218

6 years ago

0.0.217

6 years ago

0.0.216

6 years ago

0.0.215

6 years ago

0.0.214

6 years ago

0.0.213

6 years ago

0.0.212

6 years ago

0.0.211

6 years ago

0.0.210

6 years ago

0.0.208

6 years ago

0.0.207

6 years ago

0.0.206

6 years ago

0.0.205

6 years ago

0.0.204

6 years ago

0.0.203

6 years ago

0.0.202

6 years ago

0.0.201

6 years ago

0.0.200

6 years ago

0.0.199

6 years ago

0.0.198

6 years ago

0.0.197

6 years ago

0.0.196

6 years ago

0.0.195

6 years ago

0.0.194

6 years ago

0.0.193

6 years ago

0.0.192

6 years ago

0.0.191

6 years ago

0.0.190

6 years ago

0.0.189

6 years ago

0.0.188

6 years ago

0.0.187

6 years ago

0.0.186

6 years ago

0.0.184

6 years ago

0.0.183

6 years ago

0.0.182

6 years ago

0.0.181

6 years ago

0.0.180

6 years ago

0.0.179

6 years ago

0.0.178

6 years ago

0.0.177

6 years ago

0.0.176

6 years ago

0.0.175

6 years ago

0.0.174

6 years ago

0.0.173

6 years ago

0.0.172

6 years ago

0.0.171

6 years ago

0.0.170

6 years ago

0.0.169

6 years ago

0.0.168

6 years ago

0.0.167

6 years ago

0.0.166

6 years ago

0.0.165

6 years ago

0.0.163

6 years ago

0.0.162

6 years ago

0.0.161

6 years ago

0.0.160

6 years ago

0.0.159

6 years ago

0.0.158

6 years ago

0.0.157

6 years ago

0.0.156

6 years ago

0.0.155

6 years ago

0.0.154

6 years ago

0.0.153

6 years ago

0.0.152

6 years ago

0.0.151

6 years ago

0.0.150

6 years ago

0.0.149

6 years ago

0.0.148

6 years ago

0.0.147

6 years ago

0.0.146

6 years ago

0.0.145

6 years ago

0.0.144

6 years ago

0.0.143

6 years ago

0.0.142

6 years ago

0.0.141

6 years ago

0.0.140

6 years ago

0.0.139

6 years ago

0.0.138

6 years ago

0.0.137

6 years ago

0.0.136

6 years ago

0.0.135

6 years ago

0.0.134

6 years ago

0.0.133

6 years ago

0.0.132

6 years ago

0.0.131

6 years ago

0.0.130

6 years ago

0.0.129

6 years ago

0.0.128

6 years ago

0.0.127

6 years ago

0.0.126

6 years ago

0.0.125

6 years ago

0.0.124

6 years ago

0.0.123

6 years ago

0.0.122

6 years ago

0.0.121

6 years ago

0.0.120

6 years ago

0.0.119

6 years ago

0.0.118

6 years ago

0.0.117

6 years ago

0.0.116

6 years ago

0.0.115

6 years ago

0.0.113

6 years ago

0.0.112

6 years ago

0.0.111

6 years ago

0.0.110

6 years ago

0.0.109

6 years ago

0.0.108

6 years ago

0.0.107

6 years ago

0.0.106

6 years ago

0.0.105

6 years ago

0.0.104

6 years ago

0.0.103

6 years ago

0.0.102

6 years ago

0.0.101

6 years ago

0.0.100

6 years ago

0.0.99

6 years ago

0.0.98

6 years ago

0.0.97

6 years ago

0.0.96

6 years ago

0.0.95

6 years ago

0.0.94

7 years ago

0.0.93

7 years ago

0.0.92

7 years ago

0.0.91

7 years ago

0.0.90

7 years ago

0.0.88

7 years ago

0.0.87

7 years ago

0.0.86

7 years ago

0.0.85

7 years ago

0.0.84

7 years ago

0.0.83

7 years ago

0.0.81

7 years ago

0.0.80

7 years ago

0.0.79

7 years ago

0.0.78

7 years ago

0.0.77

7 years ago

0.0.76

7 years ago

0.0.75

7 years ago

0.0.74

7 years ago

0.0.73

7 years ago

0.0.72

7 years ago

0.0.71

7 years ago

0.0.70

7 years ago

0.0.69

7 years ago

0.0.68

7 years ago

0.0.67

7 years ago

0.0.66

7 years ago

0.0.65

7 years ago

0.0.64

7 years ago

0.0.63

7 years ago

0.0.62

7 years ago

0.0.61

7 years ago

0.0.60

7 years ago

0.0.59

7 years ago

0.0.58

7 years ago

0.0.57

7 years ago

0.0.56

7 years ago

0.0.55

7 years ago

0.0.54

7 years ago

0.0.53

7 years ago

0.0.52

7 years ago

0.0.51

7 years ago

0.0.50

7 years ago

0.0.49

7 years ago

0.0.48

7 years ago

0.0.47

7 years ago

0.0.46

7 years ago

0.0.45

7 years ago

0.0.44

7 years ago

0.0.43

7 years ago

0.0.42

7 years ago

0.0.40

7 years ago

0.0.39

7 years ago

0.0.38

7 years ago

0.0.37

7 years ago

0.0.36

7 years ago

0.0.35

7 years ago

0.0.34

7 years ago

0.0.33

7 years ago

0.0.32

7 years ago

0.0.31

7 years ago

0.0.30

7 years ago

0.0.29

7 years ago

0.0.28

7 years ago

0.0.27

7 years ago

0.0.26

7 years ago

0.0.25

7 years ago

0.0.24

7 years ago

0.0.23

7 years ago

0.0.22

7 years ago

0.0.21

7 years ago

0.0.20

7 years ago

0.0.19

7 years ago

0.0.18

7 years ago

0.0.17

7 years ago

0.0.16

7 years ago

0.0.14

7 years ago

0.0.13

7 years ago

0.0.11

7 years ago

0.0.10

7 years ago

0.0.9

7 years ago

0.0.8

7 years ago

0.0.6

7 years ago

0.0.5

7 years ago

0.0.4

7 years ago

0.0.3

7 years ago

0.0.2

7 years ago

0.0.1

7 years ago