123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329 |
- /*
- * <<
- * Davinci
- * ==
- * Copyright (C) 2016 - 2017 EDP
- * ==
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * >>
- */
- import produce from 'immer'
- import pick from 'lodash/pick'
- import { IViewState, IView, IFormedViews, IViewBase } from './types'
- import { getFormedView, getValidModel } from './util'
- import { ActionTypes, DEFAULT_SQL_LIMIT } from './constants'
- import { ViewActionType } from './actions'
- import { ActionTypes as SourceActionTypes } from 'containers/Source/constants'
- import { SourceActionType } from 'containers/Source/actions'
- import { ActionTypes as WidgetActionTypes } from 'containers/Widget/constants'
- import { WidgetActionType } from 'containers/Widget/actions'
- import { ActionTypes as DashboardActionTypes } from 'containers/Dashboard/constants'
- import { DashboardActionType } from 'containers/Dashboard/actions'
- import { ActionTypes as DisplayActionTypes } from 'containers/Display/constants'
- import { DisplayActionType } from 'containers/Display/actions'
- import { LOCATION_CHANGE, LocationChangeAction } from 'connected-react-router'
- const emptyView: IView = {
- id: null,
- name: '',
- sql: '',
- model: '',
- variable: '',
- roles: [],
- config: '',
- description: '',
- projectId: null,
- sourceId: null
- }
- const initialState: IViewState = {
- views: [],
- formedViews: {},
- editingView: emptyView,
- editingViewInfo: {
- model: {},
- variable: [],
- roles: []
- },
- sources: [],
- schema: {
- mapDatabases: {},
- mapTables: {},
- mapColumns: {}
- },
- sqlValidation: {
- code: null,
- message: null
- },
- sqlDataSource: {
- columns: [],
- totalCount: 0,
- resultList: []
- },
- sqlLimit: DEFAULT_SQL_LIMIT,
- loading: {
- view: false,
- table: false,
- modal: false,
- execute: false,
- copy: false
- },
- channels: [],
- tenants: [],
- bizs: [],
- cancelTokenSources: [],
- isLastExecuteWholeSql: true
- }
- const viewReducer = (
- state = initialState,
- action:
- | ViewActionType
- | WidgetActionType
- | DashboardActionType
- | DisplayActionType
- | SourceActionType
- | LocationChangeAction
- ): IViewState =>
- produce(state, (draft) => {
- switch (action.type) {
- case ActionTypes.LOAD_VIEWS:
- case ActionTypes.DELETE_VIEW:
- draft.loading.view = true
- break
- case ActionTypes.LOAD_VIEWS_FAILURE:
- case ActionTypes.DELETE_VIEW_FAILURE:
- draft.loading.view = false
- break
- case ActionTypes.LOAD_VIEWS_SUCCESS:
- draft.views = action.payload.views
- draft.formedViews = Object.entries(draft.formedViews).reduce(
- (obj, [viewId, formedView]) => {
- const existView = action.payload.views.find(
- (v) => v.id === Number(viewId)
- )
- if (existView) {
- obj[viewId] = formedView
- }
- return obj
- },
- {}
- )
- draft.loading.view = false
- break
- case ActionTypes.LOAD_VIEWS_DETAIL:
- draft.formedViews = action.payload.viewIds.reduce((acc, id) => {
- if (!acc[id]) {
- acc[id] = {
- id,
- name: '',
- description: '',
- sql: '',
- config: '',
- sourceId: 0,
- projectId: 0,
- model: {},
- variable: [],
- roles: []
- }
- }
- return acc
- }, draft.formedViews)
- break
- case ActionTypes.LOAD_VIEWS_DETAIL_SUCCESS:
- const detailedViews = action.payload.views
- if (action.payload.isEditing) {
- draft.editingView = detailedViews[0]
- draft.editingViewInfo = pick(getFormedView(detailedViews[0]), [
- 'model',
- 'variable',
- 'roles'
- ])
- }
- draft.formedViews = detailedViews.reduce((acc, view) => {
- const { id, model, variable, roles } = getFormedView(view)
- acc[id] = {
- ...view,
- model,
- variable,
- roles
- }
- return acc
- }, draft.formedViews)
- break
- case SourceActionTypes.LOAD_SOURCES_SUCCESS:
- draft.sources = action.payload.sources
- draft.schema = {
- mapDatabases: {},
- mapTables: {},
- mapColumns: {}
- }
- break
- case SourceActionTypes.LOAD_SOURCE_DATABASES_SUCCESS:
- const { sourceDatabases } = action.payload
- draft.schema.mapDatabases[sourceDatabases.sourceId] =
- sourceDatabases.databases
- break
- case SourceActionTypes.LOAD_SOURCE_DATABASE_TABLES_SUCCESS:
- const { databaseTables } = action.payload
- draft.schema.mapTables[
- `${databaseTables.sourceId}_${databaseTables.dbName}`
- ] = databaseTables
- break
- case SourceActionTypes.LOAD_SOURCE_TABLE_COLUMNS_SUCCESS:
- const { databaseName, tableColumns } = action.payload
- draft.schema.mapColumns[
- `${tableColumns.sourceId}_${databaseName}_${tableColumns.tableName}`
- ] = tableColumns
- break
- case ActionTypes.IS_LAST_EXECUTE_WHOLE_SQL:
- draft.isLastExecuteWholeSql = action.payload.isLastExecuteWholeSql
- break
- case ActionTypes.EXECUTE_SQL:
- draft.loading.execute = true
- draft.sqlValidation = { code: null, message: null }
- break
- case ActionTypes.EXECUTE_SQL_SUCCESS:
- const sqlResponse = action.payload.result
- const validModel = getValidModel(
- draft.editingViewInfo.model,
- sqlResponse.payload.columns
- )
- draft.sqlDataSource = sqlResponse.payload
- draft.editingViewInfo.model = validModel
- draft.loading.execute = false
- draft.sqlValidation = {
- code: sqlResponse.header.code,
- message: sqlResponse.header.msg
- }
- break
- case ActionTypes.EXECUTE_SQL_FAILURE:
- draft.sqlDataSource = {
- ...draft.sqlDataSource,
- columns: [],
- totalCount: 0,
- resultList: []
- }
- draft.loading.execute = false
- draft.sqlValidation = {
- code: action.payload.err.code,
- message: action.payload.err.msg
- }
- break
- case ActionTypes.EXECUTE_SQL_CANCEL:
- draft.sqlDataSource = {
- ...draft.sqlDataSource,
- columns: [],
- totalCount: 0,
- resultList: []
- }
- draft.loading.execute = false
- break
- case ActionTypes.UPDATE_EDITING_VIEW:
- draft.editingView = action.payload.view
- break
- case ActionTypes.UPDATE_EDITING_VIEW_INFO:
- draft.editingViewInfo = action.payload.viewInfo
- break
- case ActionTypes.SET_SQL_LIMIT:
- draft.sqlLimit = action.payload.limit
- break
- case ActionTypes.EDIT_VIEW_SUCCESS:
- draft.editingView = emptyView
- draft.editingViewInfo = { model: {}, variable: [], roles: [] }
- draft.formedViews[action.payload.result.id] = getFormedView(
- action.payload.result
- )
- break
- case ActionTypes.COPY_VIEW:
- draft.loading.copy = true
- break
- case ActionTypes.COPY_VIEW_SUCCESS:
- const fromViewId = action.payload.fromViewId
- const { id, name, description, source } = action.payload.result
- const copiedView: IViewBase = {
- id,
- name,
- description,
- sourceName: source.name
- }
- draft.views.splice(
- draft.views.findIndex(({ id }) => id === fromViewId) + 1,
- 0,
- copiedView
- )
- draft.loading.copy = false
- break
- case ActionTypes.COPY_VIEW_FAILURE:
- draft.loading.copy = false
- break
- case ActionTypes.LOAD_DAC_CHANNELS_SUCCESS:
- draft.channels = action.payload.channels
- break
- case ActionTypes.LOAD_DAC_TENANTS_SUCCESS:
- draft.tenants = action.payload.tenants
- break
- case ActionTypes.LOAD_DAC_TENANTS_FAILURE:
- draft.tenants = []
- break
- case ActionTypes.LOAD_DAC_BIZS_SUCCESS:
- draft.bizs = action.payload.bizs
- break
- case ActionTypes.LOAD_DAC_BIZS_FAILURE:
- draft.bizs = []
- break
- case ActionTypes.RESET_VIEW_STATE:
- return initialState
- break
- case WidgetActionTypes.LOAD_WIDGET_DETAIL_SUCCESS:
- const widgetView = action.payload.view
- draft.formedViews[widgetView.id] = {
- ...widgetView,
- model: JSON.parse(widgetView.model || '{}'),
- variable: JSON.parse(widgetView.variable || '[]')
- }
- break
- case DashboardActionTypes.LOAD_DASHBOARD_DETAIL_SUCCESS:
- case DisplayActionTypes.LOAD_SLIDE_DETAIL_SUCCESS:
- draft.formedViews = {
- ...draft.formedViews,
- ...action.payload.formedViews
- }
- break
- case ActionTypes.LOAD_VIEW_DATA_FROM_VIZ_ITEM:
- case ActionTypes.LOAD_SELECT_OPTIONS:
- draft.cancelTokenSources.push(action.payload.cancelTokenSource)
- break
- case LOCATION_CHANGE:
- if (state.cancelTokenSources.length) {
- state.cancelTokenSources.forEach((source) => {
- source.cancel()
- })
- draft.cancelTokenSources = []
- }
- break
- default:
- break
- }
- })
- export { initialState as viewInitialState }
- export default viewReducer
|