123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493 |
- /*
- * <<
- * 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 { LOCATION_CHANGE, LocationChangeAction } from 'connected-react-router'
- import { matchDisplaySlidePath } from 'utils/router'
- import { ActionTypes } from './constants'
- import { ActionTypes as VizActionTypes } from 'containers/Viz/constants'
- import { ActionTypes as ViewActionTypes } from '../View/constants'
- import { GraphTypes } from './components/constants'
- import { fieldGroupedSort } from 'containers/Widget/components/Config/Sort'
- import { DisplayActionType } from './actions'
- import { VizActionType } from '../Viz/actions'
- import { ViewActionType } from '../View/actions'
- import { IDisplayState, IDisplaySharePanelState } from './types'
- const defaultSharePanelState: IDisplaySharePanelState = {
- id: 0,
- type: 'display',
- title: '',
- visible: false
- }
- export const initialState: IDisplayState = {
- currentDisplayShareToken: '',
- currentDisplayAuthorizedShareToken: '',
- currentDisplayPasswordShareToken: '',
- currentDisplayPasswordPassword: '',
- sharePanel: defaultSharePanelState,
- currentDisplaySelectOptions: {},
- currentSlideId: 0,
- currentDisplayWidgets: {},
- slideLayers: {},
- slideLayersInfo: {},
- slideLayersOperationInfo: {},
- clipboardSlides: [],
- clipboardLayers: [],
- lastOperationType: null,
- lastLayers: [],
- editorBaselines: [],
- operateItemParams: [],
- loading: {
- shareToken: false,
- slideLayers: false
- }
- }
- const displayReducer = (
- state = initialState,
- action:
- | DisplayActionType
- | VizActionType
- | ViewActionType
- | LocationChangeAction
- ) =>
- produce(state, (draft: IDisplayState) => {
- let slideId: number
- let layerId: number
- const layersInfo = draft.slideLayersInfo[draft.currentSlideId]
- const layersOperationInfo =
- draft.slideLayersOperationInfo[draft.currentSlideId]
- switch (action.type) {
- case VizActionTypes.EDIT_SLIDES_SUCCESS:
- draft.lastOperationType = VizActionTypes.EDIT_SLIDES_SUCCESS
- break
- case ActionTypes.LOAD_SLIDE_DETAIL:
- draft.loading.slideLayers = true
- break
- case ActionTypes.LOAD_SLIDE_DETAIL_SUCCESS:
- slideId = action.payload.slideId
- if (!draft.currentSlideId) {
- draft.currentSlideId = slideId
- }
- draft.currentDisplaySelectOptions = {}
- draft.currentDisplayWidgets = action.payload.widgets.reduce(
- (obj, widget) => {
- obj[widget.id] = widget
- return obj
- },
- draft.currentDisplayWidgets
- )
- draft.slideLayers[slideId] = (action.payload.layers || []).reduce(
- (obj, layer) => {
- obj[layer.id] = layer
- return obj
- },
- {}
- )
- draft.slideLayersInfo[slideId] = (action.payload.layers || []).reduce(
- (obj, layer) => {
- obj[layer.id] =
- layer.type === GraphTypes.Chart
- ? {
- datasource: { resultList: [] },
- loading: false,
- queryConditions: {
- tempFilters: [], // @TODO combine widget static filters with local filters
- linkageFilters: [],
- globalFilters: [],
- variables: [],
- linkageVariables: [],
- globalVariables: [],
- pagination: {}
- },
- interactId: '',
- rendered: false,
- renderType: 'rerender'
- }
- : {
- loading: false,
- datasource: { resultList: [] }
- }
- return obj
- },
- {}
- )
- draft.slideLayersOperationInfo[slideId] = (
- action.payload.layers || []
- ).reduce((obj, layer) => {
- obj[layer.id] = {
- selected: false,
- dragging: false,
- resizing: false,
- editing: false
- }
- return obj
- }, {})
- draft.editorBaselines = []
- break
- case ActionTypes.LOAD_SLIDE_DETAIL_FAILURE:
- draft.loading.slideLayers = false
- break
- case ActionTypes.ADD_SLIDE_LAYERS_SUCCESS:
- draft.lastOperationType = ActionTypes.ADD_SLIDE_LAYERS_SUCCESS
- draft.lastLayers = action.payload.layers
- slideId = action.payload.slideId
- Object.entries(layersOperationInfo).forEach(
- ([id, layerOperationInfo]: [string, any]) => {
- draft.slideLayersOperationInfo[slideId][+id] = {
- ...layerOperationInfo,
- selected: false
- }
- }
- )
- draft.slideLayersOperationInfo[slideId] = {
- ...layersOperationInfo
- }
- action.payload.layers.forEach((layer) => {
- draft.slideLayers[slideId][layer.id] = layer
- draft.slideLayersInfo[slideId][layer.id] =
- layer.type === GraphTypes.Chart
- ? {
- datasource: { resultList: [] },
- loading: false,
- queryConditions: {
- tempFilters: [],
- linkageFilters: [],
- globalFilters: [],
- variables: [],
- linkageVariables: [],
- globalVariables: []
- },
- interactId: '',
- rendered: false,
- renderType: 'rerender'
- }
- : {
- datasource: { resultList: [] },
- loading: false
- }
- draft.slideLayersOperationInfo[slideId][layer.id] = {
- selected: true,
- resizing: false,
- dragging: false,
- editing: false
- }
- if (Array.isArray(action.payload.widgets)) {
- action.payload.widgets.forEach((w) => {
- draft.currentDisplayWidgets[w.id] = w
- })
- }
- })
- break
- case ActionTypes.DELETE_SLIDE_LAYERS_SUCCESS:
- slideId = action.payload.slideId
- draft.lastOperationType = ActionTypes.DELETE_SLIDE_LAYERS_SUCCESS
- draft.lastLayers = action.payload.layerIds.map(
- (layerId) => draft.slideLayers[slideId][layerId]
- )
- action.payload.layerIds.forEach((id) => {
- delete draft.slideLayers[slideId][id]
- delete draft.slideLayersInfo[slideId][id]
- delete draft.slideLayersOperationInfo[slideId][id]
- })
- break
- case ActionTypes.LOAD_DISPLAY_PASSWORD_SHARE_LINK_SUCCESS:
- draft.currentDisplayPasswordShareToken = action.payload.passwordShareToken
- draft.currentDisplayPasswordPassword = action.payload.password
- draft.loading.shareToken = false
- break
- case ActionTypes.EDIT_SLIDE_LAYERS_SUCCESS:
- slideId = action.payload.slideId
- const lastLayers = []
- action.payload.layers.forEach((layer) => {
- lastLayers.push(draft.slideLayers[slideId][layer.id])
- draft.slideLayers[slideId][layer.id] = layer
- if (draft.slideLayersInfo[slideId][layer.id].renderType) {
- draft.slideLayersInfo[slideId][layer.id].renderType = 'resize'
- draft.slideLayersInfo[slideId][layer.id].datasource = {
- ...draft.slideLayersInfo[slideId][layer.id].datasource
- }
- }
- })
- draft.lastOperationType = ActionTypes.EDIT_SLIDE_LAYERS_SUCCESS
- draft.lastLayers = lastLayers
- break
- case ActionTypes.CHANGE_LAYER_OPERATION_INFO:
- Object.entries(layersOperationInfo).forEach(
- ([id, layerOperationInfo]: [string, any]) => {
- Object.entries(action.payload.changedInfo).forEach(
- ([type, status]: [string, boolean]) => {
- if (status) {
- return (draft.slideLayersOperationInfo[draft.currentSlideId][
- id
- ] = {
- ...layerOperationInfo,
- [type]: +id === action.payload.layerId
- })
- } else {
- return (draft.slideLayersOperationInfo[draft.currentSlideId][
- id
- ] = {
- ...layerOperationInfo,
- [type]: status
- })
- }
- }
- )
- }
- )
- draft.slideLayersOperationInfo[draft.currentSlideId] = {
- ...layersOperationInfo
- }
- break
- case ViewActionTypes.LOAD_VIEW_DATA_FROM_VIZ_ITEM:
- if (action.payload.vizType === 'display') {
- ;[slideId, layerId] = action.payload.itemId as [number, number]
- const layerInfo = draft.slideLayersInfo[slideId][layerId]
- layerInfo.loading = true
- layerInfo.queryConditions = {
- tempFilters: action.payload.requestParams.tempFilters,
- linkageFilters: action.payload.requestParams.linkageFilters,
- globalFilters: action.payload.requestParams.globalFilters,
- variables: action.payload.requestParams.variables,
- linkageVariables: action.payload.requestParams.linkageVariables,
- globalVariables: action.payload.requestParams.globalVariables
- }
- }
- break
- case ViewActionTypes.LOAD_VIEW_DATA_FROM_VIZ_ITEM_SUCCESS:
- if (action.payload.vizType === 'display') {
- ;[slideId, layerId] = action.payload.itemId as [number, number]
- fieldGroupedSort(
- action.payload.result.resultList,
- action.payload.requestParams.customOrders
- )
- const layerInfo = draft.slideLayersInfo[slideId][layerId]
- layerInfo.loading = false
- layerInfo.datasource = action.payload.result
- layerInfo.renderType = action.payload.renderType
- }
- break
- case ViewActionTypes.LOAD_VIEW_DATA_FROM_VIZ_ITEM_FAILURE:
- if (action.payload.vizType === 'display') {
- ;[slideId, layerId] = action.payload.itemId as [number, number]
- if (draft.slideLayersInfo[slideId]) {
- draft.slideLayersInfo[slideId][layerId].loading = false
- }
- }
- break
- case ActionTypes.RESIZE_LAYER_ADJUSTED:
- const resizingLayerIds = action.payload.layerIds
- resizingLayerIds.forEach((layerId) => {
- if (!action.payload.finish) {
- draft.slideLayers[draft.currentSlideId][layerId].params.width +=
- action.payload.deltaSize.deltaWidth
- draft.slideLayers[draft.currentSlideId][layerId].params.height +=
- action.payload.deltaSize.deltaHeight
- }
- if (layersInfo[layerId].renderType) {
- layersInfo[layerId].renderType = 'resize'
- layersInfo[layerId].datasource = {
- ...layersInfo[layerId].datasource
- }
- }
- draft.slideLayersOperationInfo[draft.currentSlideId][
- layerId
- ].resizing = !action.payload.finish
- })
- break
- case ActionTypes.DRAG_LAYER_ADJUSTED: {
- const {
- slideSize: { width: slideWidth, height: slideHeight },
- layerIds,
- deltaPosition
- } = action.payload
- const isEmpty = draft.operateItemParams.length === 0
- layerIds.forEach((layerId) => {
- if (isEmpty) {
- draft.operateItemParams.push({
- ...draft.slideLayers[draft.currentSlideId][layerId]
- })
- }
- const item = draft.operateItemParams.find(
- (item) => item.id === layerId
- )
- if (item) {
- item.params.positionX += deltaPosition.deltaX
- item.params.positionY += deltaPosition.deltaY
- if (item.params.positionX < 0) {
- item.params.positionX = 0
- } else if (item.params.positionX + item.params.width > slideWidth) {
- item.params.positionX = slideWidth - item.params.width
- }
- if (item.params.positionY < 0) {
- item.params.positionY = 0
- } else if (
- item.params.positionY + item.params.height >
- slideHeight
- ) {
- item.params.positionY = slideHeight - item.params.height
- }
- draft.slideLayersOperationInfo[draft.currentSlideId][
- layerId
- ].dragging = true
- }
- })
- break
- }
- case ActionTypes.SELECT_LAYER:
- Object.entries(layersOperationInfo).forEach(
- ([id, layerOperationInfo]: [string, any]) => {
- if (action.payload.selected && action.payload.exclusive) {
- draft.slideLayersOperationInfo[draft.currentSlideId][id] = {
- ...layerOperationInfo,
- selected: false,
- editing: false
- }
- }
- if (+id === action.payload.layerId) {
- draft.slideLayersOperationInfo[draft.currentSlideId][id] = {
- ...layerOperationInfo,
- selected: action.payload.selected
- }
- }
- }
- )
- draft.slideLayersOperationInfo[draft.currentSlideId] = {
- ...layersOperationInfo
- }
- break
- case ActionTypes.CLEAR_LAYERS_OPERATION_INFO:
- if (layersOperationInfo) {
- Object.values(layersOperationInfo).forEach(
- (layerOperationInfo: any) => {
- return Object.entries(action.payload.changedInfo).forEach(
- ([type, value]: [string, boolean]) => {
- layerOperationInfo[type] = value
- }
- )
- }
- )
- }
- break
- case ActionTypes.CLEAR_EDITOR_BASELINES:
- draft.editorBaselines = []
- draft.operateItemParams = []
- Object.values(
- draft.slideLayersOperationInfo[draft.currentSlideId]
- ).forEach((item) => {
- item.dragging = false
- })
- break
- case ActionTypes.SHOW_EDITOR_BASELINES:
- draft.editorBaselines = action.payload.baselines
- break
- case ActionTypes.COPY_SLIDE_LAYERS_SUCCESS:
- draft.clipboardLayers = action.payload.layers
- break
- case ActionTypes.LOAD_DISPLAY_SHARE_LINK:
- draft.loading.shareToken = true
- if (action.payload.params.mode === 'AUTH') {
- draft.currentDisplayAuthorizedShareToken = ''
- }
- break
- case ActionTypes.LOAD_DISPLAY_SHARE_LINK_SUCCESS:
- draft.currentDisplayShareToken = action.payload.shareToken
- draft.loading.shareToken = false
- break
- case ActionTypes.LOAD_DISPLAY_AUTHORIZED_SHARE_LINK_SUCCESS:
- draft.currentDisplayAuthorizedShareToken =
- action.payload.authorizedShareToken
- draft.loading.shareToken = false
- break
- case ActionTypes.LOAD_DISPLAY_SHARE_LINK_FAILURE:
- draft.loading.shareToken = false
- break
- case ActionTypes.OPEN_SHARE_PANEL:
- draft.sharePanel = {
- id: action.payload.id,
- type: 'display',
- title: action.payload.title,
- visible: true
- }
- break
- case ActionTypes.CLOSE_SHARE_PANEL:
- draft.sharePanel = defaultSharePanelState
- break
- case ActionTypes.RESET_DISPLAY_STATE:
- return initialState
- case LOCATION_CHANGE:
- const matchSlide = matchDisplaySlidePath(
- action.payload.location.pathname
- )
- if (matchSlide) {
- draft.currentSlideId = +matchSlide.params.slideId || null
- } else {
- return initialState
- }
- break
- }
- })
- export { initialState as displayInitialState}
- export default displayReducer
|