0.0.412 • Published 4 years ago

react-application-core v0.0.412

Weekly downloads
140
License
MIT
Repository
github
Last release
4 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

4 years ago

0.0.411

4 years ago

0.0.409

5 years ago

0.0.408

5 years ago

0.0.407

5 years ago

0.0.406

5 years ago

0.0.405

5 years ago

0.0.404

5 years ago

0.0.403

5 years ago

0.0.402

5 years ago

0.0.401

5 years ago

0.0.400

5 years ago

0.0.399

5 years ago

0.0.398

5 years ago

0.0.397

5 years ago

0.0.396

5 years ago

0.0.395

5 years ago

0.0.394

5 years ago

0.0.393

5 years ago

0.0.392

5 years ago

0.0.391

5 years ago

0.0.390

5 years ago

0.0.389

5 years ago

0.0.388

5 years ago

0.0.387

5 years ago

0.0.386

5 years ago

0.0.385

5 years ago

0.0.384

5 years ago

0.0.383

5 years ago

0.0.382

5 years ago

0.0.381

5 years ago

0.0.380

5 years ago

0.0.379

5 years ago

0.0.378

5 years ago

0.0.377

5 years ago

0.0.376

5 years ago

0.0.375

5 years ago

0.0.374

5 years ago

0.0.373

6 years ago

0.0.372

6 years ago

0.0.371

6 years ago

0.0.370

6 years ago

0.0.369

6 years ago

0.0.368

6 years ago

0.0.367

6 years ago

0.0.366

6 years ago

0.0.365

6 years ago

0.0.364

6 years ago

0.0.363

6 years ago

0.0.362

6 years ago

0.0.361

6 years ago

0.0.360

6 years ago

0.0.359

6 years ago

0.0.358

6 years ago

0.0.357

6 years ago

0.0.356

6 years ago

0.0.355

6 years ago

0.0.354

6 years ago

0.0.353

6 years ago

0.0.352

6 years ago

0.0.351

6 years ago

0.0.350

6 years ago

0.0.349

6 years ago

0.0.348

6 years ago

0.0.347

6 years ago

0.0.346

6 years ago

0.0.345

6 years ago

0.0.344

6 years ago

0.0.343

6 years ago

0.0.342

6 years ago

0.0.341

6 years ago

0.0.340

6 years ago

0.0.339

6 years ago

0.0.338

6 years ago

0.0.337

6 years ago

0.0.336

6 years ago

0.0.335

6 years ago

0.0.334

6 years ago

0.0.333

6 years ago

0.0.332

6 years ago

0.0.331

6 years ago

0.0.330

6 years ago

0.0.329

6 years ago

0.0.328

6 years ago

0.0.327

6 years ago

0.0.326

6 years ago

0.0.325

6 years ago

0.0.324

6 years ago

0.0.323

7 years ago

0.0.322

7 years ago

0.0.321

7 years ago

0.0.320

7 years ago

0.0.319

7 years ago

0.0.318

7 years ago

0.0.317

7 years ago

0.0.316

7 years ago

0.0.315

7 years ago

0.0.314

7 years ago

0.0.313

7 years ago

0.0.312

7 years ago

0.0.311

7 years ago

0.0.310

7 years ago

0.0.309

7 years ago

0.0.308

7 years ago

0.0.307

7 years ago

0.0.306

7 years ago

0.0.305

7 years ago

0.0.304

7 years ago

0.0.303

7 years ago

0.0.302

7 years ago

0.0.301

7 years ago

0.0.300

7 years ago

0.0.299

7 years ago

0.0.298

7 years ago

0.0.297

7 years ago

0.0.296

7 years ago

0.0.295

7 years ago

0.0.294

7 years ago

0.0.293

7 years ago

0.0.292

7 years ago

0.0.291

7 years ago

0.0.290

7 years ago

0.0.289

7 years ago

0.0.288

7 years ago

0.0.287

7 years ago

0.0.286

7 years ago

0.0.285

7 years ago

0.0.284

7 years ago

0.0.283

7 years ago

0.0.282

7 years ago

0.0.281

7 years ago

0.0.280

7 years ago

0.0.279

7 years ago

0.0.278

7 years ago

0.0.277

7 years ago

0.0.276

7 years ago

0.0.275

7 years ago

0.0.274

7 years ago

0.0.273

7 years ago

0.0.272

7 years ago

0.0.271

7 years ago

0.0.270

7 years ago

0.0.269

7 years ago

0.0.268

7 years ago

0.0.267

7 years ago

0.0.266

7 years ago

0.0.265

7 years ago

0.0.264

7 years ago

0.0.263

7 years ago

0.0.262

7 years ago

0.0.261

7 years ago

0.0.260

7 years ago

0.0.259

7 years ago

0.0.258

7 years ago

0.0.257

7 years ago

0.0.256

7 years ago

0.0.255

7 years ago

0.0.254

7 years ago

0.0.253

7 years ago

0.0.252

7 years ago

0.0.251

7 years ago

0.0.250

7 years ago

0.0.249

7 years ago

0.0.248

7 years ago

0.0.247

7 years ago

0.0.246

7 years ago

0.0.245

7 years ago

0.0.244

7 years ago

0.0.243

7 years ago

0.0.242

7 years ago

0.0.241

7 years ago

0.0.240

7 years ago

0.0.239

7 years ago

0.0.238

7 years ago

0.0.237

7 years ago

0.0.236

7 years ago

0.0.235

7 years ago

0.0.234

7 years ago

0.0.233

7 years ago

0.0.232

7 years ago

0.0.231

7 years ago

0.0.230

7 years ago

0.0.229

7 years ago

0.0.228

7 years ago

0.0.227

7 years ago

0.0.226

7 years ago

0.0.225

7 years ago

0.0.224

7 years ago

0.0.223

7 years ago

0.0.222

7 years ago

0.0.221

7 years ago

0.0.220

7 years ago

0.0.219

7 years ago

0.0.218

7 years ago

0.0.217

7 years ago

0.0.216

7 years ago

0.0.215

7 years ago

0.0.214

7 years ago

0.0.213

7 years ago

0.0.212

7 years ago

0.0.211

7 years ago

0.0.210

7 years ago

0.0.208

7 years ago

0.0.207

7 years ago

0.0.206

7 years ago

0.0.205

7 years ago

0.0.204

7 years ago

0.0.203

7 years ago

0.0.202

7 years ago

0.0.201

7 years ago

0.0.200

7 years ago

0.0.199

7 years ago

0.0.198

7 years ago

0.0.197

7 years ago

0.0.196

7 years ago

0.0.195

7 years ago

0.0.194

7 years ago

0.0.193

7 years ago

0.0.192

7 years ago

0.0.191

7 years ago

0.0.190

7 years ago

0.0.189

7 years ago

0.0.188

7 years ago

0.0.187

7 years ago

0.0.186

7 years ago

0.0.184

7 years ago

0.0.183

7 years ago

0.0.182

7 years ago

0.0.181

7 years ago

0.0.180

7 years ago

0.0.179

7 years ago

0.0.178

7 years ago

0.0.177

7 years ago

0.0.176

7 years ago

0.0.175

7 years ago

0.0.174

7 years ago

0.0.173

7 years ago

0.0.172

7 years ago

0.0.171

7 years ago

0.0.170

7 years ago

0.0.169

7 years ago

0.0.168

7 years ago

0.0.167

7 years ago

0.0.166

7 years ago

0.0.165

7 years ago

0.0.163

7 years ago

0.0.162

7 years ago

0.0.161

7 years ago

0.0.160

7 years ago

0.0.159

7 years ago

0.0.158

7 years ago

0.0.157

7 years ago

0.0.156

7 years ago

0.0.155

7 years ago

0.0.154

7 years ago

0.0.153

7 years ago

0.0.152

7 years ago

0.0.151

7 years ago

0.0.150

7 years ago

0.0.149

7 years ago

0.0.148

7 years ago

0.0.147

7 years ago

0.0.146

7 years ago

0.0.145

7 years ago

0.0.144

7 years ago

0.0.143

7 years ago

0.0.142

7 years ago

0.0.141

7 years ago

0.0.140

7 years ago

0.0.139

7 years ago

0.0.138

7 years ago

0.0.137

7 years ago

0.0.136

7 years ago

0.0.135

7 years ago

0.0.134

7 years ago

0.0.133

7 years ago

0.0.132

7 years ago

0.0.131

8 years ago

0.0.130

8 years ago

0.0.129

8 years ago

0.0.128

8 years ago

0.0.127

8 years ago

0.0.126

8 years ago

0.0.125

8 years ago

0.0.124

8 years ago

0.0.123

8 years ago

0.0.122

8 years ago

0.0.121

8 years ago

0.0.120

8 years ago

0.0.119

8 years ago

0.0.118

8 years ago

0.0.117

8 years ago

0.0.116

8 years ago

0.0.115

8 years ago

0.0.113

8 years ago

0.0.112

8 years ago

0.0.111

8 years ago

0.0.110

8 years ago

0.0.109

8 years ago

0.0.108

8 years ago

0.0.107

8 years ago

0.0.106

8 years ago

0.0.105

8 years ago

0.0.104

8 years ago

0.0.103

8 years ago

0.0.102

8 years ago

0.0.101

8 years ago

0.0.100

8 years ago

0.0.99

8 years ago

0.0.98

8 years ago

0.0.97

8 years ago

0.0.96

8 years ago

0.0.95

8 years ago

0.0.94

8 years ago

0.0.93

8 years ago

0.0.92

8 years ago

0.0.91

8 years ago

0.0.90

8 years ago

0.0.88

8 years ago

0.0.87

8 years ago

0.0.86

8 years ago

0.0.85

8 years ago

0.0.84

8 years ago

0.0.83

8 years ago

0.0.81

8 years ago

0.0.80

8 years ago

0.0.79

8 years ago

0.0.78

8 years ago

0.0.77

8 years ago

0.0.76

8 years ago

0.0.75

8 years ago

0.0.74

8 years ago

0.0.73

8 years ago

0.0.72

8 years ago

0.0.71

8 years ago

0.0.70

8 years ago

0.0.69

8 years ago

0.0.68

8 years ago

0.0.67

8 years ago

0.0.66

8 years ago

0.0.65

8 years ago

0.0.64

8 years ago

0.0.63

8 years ago

0.0.62

8 years ago

0.0.61

8 years ago

0.0.60

8 years ago

0.0.59

8 years ago

0.0.58

8 years ago

0.0.57

8 years ago

0.0.56

8 years ago

0.0.55

8 years ago

0.0.54

8 years ago

0.0.53

8 years ago

0.0.52

8 years ago

0.0.51

8 years ago

0.0.50

8 years ago

0.0.49

8 years ago

0.0.48

8 years ago

0.0.47

8 years ago

0.0.46

8 years ago

0.0.45

8 years ago

0.0.44

8 years ago

0.0.43

8 years ago

0.0.42

8 years ago

0.0.40

8 years ago

0.0.39

8 years ago

0.0.38

8 years ago

0.0.37

8 years ago

0.0.36

8 years ago

0.0.35

8 years ago

0.0.34

8 years ago

0.0.33

8 years ago

0.0.32

8 years ago

0.0.31

8 years ago

0.0.30

8 years ago

0.0.29

8 years ago

0.0.28

8 years ago

0.0.27

8 years ago

0.0.26

8 years ago

0.0.25

8 years ago

0.0.24

8 years ago

0.0.23

8 years ago

0.0.22

8 years ago

0.0.21

8 years ago

0.0.20

8 years ago

0.0.19

8 years ago

0.0.18

8 years ago

0.0.17

8 years ago

0.0.16

8 years ago

0.0.14

8 years ago

0.0.13

8 years ago

0.0.11

8 years ago

0.0.10

8 years ago

0.0.9

8 years ago

0.0.8

8 years ago

0.0.6

8 years ago

0.0.5

8 years ago

0.0.4

8 years ago

0.0.3

8 years ago

0.0.2

8 years ago

0.0.1

8 years ago