| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 | /* * << * 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 { call, put, all, takeLatest, takeEvery } from 'redux-saga/effects'import { ActionTypes } from './constants'import omit from 'lodash/omit'import { WidgetActions, WidgetActionType } from './actions'import { IWidgetRaw, IWidgetFormed } from './types'import request from 'utils/request'import api from 'utils/api'import { errorHandler } from 'utils/util'import { widgetConfigMigrationRecorder } from 'app/utils/migrationRecorders'export function* getWidgets(action: WidgetActionType) {  if (action.type !== ActionTypes.LOAD_WIDGETS) {    return  }  const { projectId } = action.payload  try {    const result = yield call(request, `${api.widget}?projectId=${projectId}`)    const formedWidgets: IWidgetFormed[] = result.payload.map(      (widget: IWidgetRaw) => {        const parsedConfig = JSON.parse(widget.config)        return {          ...widget,          config: widgetConfigMigrationRecorder(parsedConfig, {            viewId: widget.viewId          })        }      }    )    yield put(WidgetActions.widgetsLoaded(formedWidgets))  } catch (err) {    yield put(WidgetActions.widgetsLoadedFail())    errorHandler(err)  }}export function* addWidget(action: WidgetActionType) {  if (action.type !== ActionTypes.ADD_WIDGET) {    return  }  const { widget, resolve } = action.payload  try {    const result = yield call(request, {      method: 'post',      url: api.widget,      data: widget    })    const addedWidget: IWidgetRaw = result.payload    const formdWidget: IWidgetFormed = {      ...addedWidget,      config: JSON.parse(addedWidget.config)    }    yield put(WidgetActions.widgetAdded(formdWidget))    resolve()  } catch (err) {    yield put(WidgetActions.addWidgetFail())    errorHandler(err)  }}export function* deleteWidget(action: WidgetActionType) {  if (action.type !== ActionTypes.DELETE_WIDGET) {    return  }  const { id } = action.payload  try {    yield call(request, {      method: 'delete',      url: `${api.widget}/${id}`    })    yield put(WidgetActions.widgetDeleted(id))  } catch (err) {    yield put(WidgetActions.deleteWidgetFail())    errorHandler(err)  }}export function* getWidgetDetail(action: WidgetActionType) {  if (action.type !== ActionTypes.LOAD_WIDGET_DETAIL) {    return  }  const { id } = action.payload  try {    const widgetResult = yield call(request, `${api.widget}/${id}`)    const widget: IWidgetRaw = widgetResult.payload    const parsedConfig = JSON.parse(widget.config)    const formedWidget: IWidgetFormed = {      ...widget,      config: widgetConfigMigrationRecorder(parsedConfig, {        viewId: widget.viewId      })    }    const viewResult = yield call(request, `${api.view}/${widget.viewId}`)    yield put(      WidgetActions.widgetDetailLoaded(formedWidget, viewResult.payload)    )  } catch (err) {    yield put(WidgetActions.loadWidgetDetailFail(err))    errorHandler(err)  }}export function* editWidget(action: WidgetActionType) {  if (action.type !== ActionTypes.EDIT_WIDGET) {    return  }  const { widget, resolve } = action.payload  try {    yield call(request, {      method: 'put',      url: `${api.widget}/${widget.id}`,      data: widget    })    yield put(WidgetActions.widgetEdited())    resolve()  } catch (err) {    yield put(WidgetActions.editWidgetFail())    errorHandler(err)  }}export function* copyWidget(action: WidgetActionType) {  if (action.type !== ActionTypes.COPY_WIDGET) {    return  }  const { widget, resolve } = action.payload  try {    const result = yield call(request, {      method: 'post',      url: api.widget,      data: omit(widget, 'id')    })    const copiedWidget: IWidgetRaw = result.payload    const formdWidget: IWidgetFormed = {      ...copiedWidget,      config: JSON.parse(copiedWidget.config)    }    yield put(WidgetActions.widgetCopied(widget.id, formdWidget))    resolve()  } catch (err) {    yield put(WidgetActions.copyWidgetFail())    errorHandler(err)  }}export function* executeComputed(action: WidgetActionType) {  if (action.type !== ActionTypes.EXECUTE_COMPUTED_SQL) {    return  }  const { sql } = action.payload  try {    const result = yield call(request, {      method: 'post',      //  url: api.widget,      data: sql    })    // todo  返回sql校验结果  } catch (err) {    errorHandler(err)  }}export default function* rootWidgetSaga() {  yield all([    takeLatest(ActionTypes.LOAD_WIDGETS, getWidgets),    takeEvery(ActionTypes.ADD_WIDGET, addWidget),    takeEvery(ActionTypes.DELETE_WIDGET, deleteWidget),    takeLatest(ActionTypes.LOAD_WIDGET_DETAIL, getWidgetDetail),    takeEvery(ActionTypes.EDIT_WIDGET, editWidget),    takeEvery(ActionTypes.COPY_WIDGET, copyWidget),    takeEvery(ActionTypes.EXECUTE_COMPUTED_SQL, executeComputed)  ])}
 |