diff --git a/public/lib/workpad_service.js b/public/lib/workpad_service.js index 0156f52f795af..028058168291c 100644 --- a/public/lib/workpad_service.js +++ b/public/lib/workpad_service.js @@ -23,5 +23,6 @@ export function remove(id) { } export function find(searchTerm) { - return fetch.get(`${apiPath}/find?name=${_get(searchTerm, 'length') ? searchTerm : '*'}`).then(resp => resp.data); + return fetch.get(`${apiPath}/find?name=${_get(searchTerm, 'length') ? searchTerm : '*'}`) + .then(resp => resp.data); } diff --git a/public/state/actions/elements.js b/public/state/actions/elements.js index 0e6df6bc85407..162e7e6c12fc7 100644 --- a/public/state/actions/elements.js +++ b/public/state/actions/elements.js @@ -1,5 +1,5 @@ import { createAction } from 'redux-actions'; -import { get, omit } from 'lodash'; +import { get, pick } from 'lodash'; import { set, del } from 'object-path-immutable'; import { createThunk } from 'redux-thunks'; import * as args from './resolved_args'; @@ -51,6 +51,12 @@ function getSiblingContext(state, elementId, checkIndex) { return getSiblingContext(state, elementId, prevContextIndex); } +function getBareElement(el, includeId = false) { + const props = ['position', 'expression', 'filters']; + if (includeId) return pick(el, props.concat('id')); + return pick(el, props); +} + export const elementLayer = createAction('elementLayer'); export const setPosition = createAction('setPosition', (elementId, pageId, position) => ({ pageId, elementId, position })); @@ -136,7 +142,7 @@ export const fetchAllRenderables = createThunk('fetchAllRenderables', ({ dispatc }); export const duplicateElement = createThunk('duplicateElement', ({ dispatch, type }, element, pageId) => { - const newElement = Object.assign({}, getDefaultElement(), omit(element, 'id')); + const newElement = Object.assign({}, getDefaultElement(), getBareElement(element)); // move the element so users can see that it was added newElement.position.top = newElement.position.top + 10; newElement.position.left = newElement.position.left + 10; @@ -270,7 +276,7 @@ export const deleteArgumentAtIndex = createThunk('deleteArgumentAtIndex', ({ dis payload: element defaults. Eg {expression: 'foo'} */ export const addElement = createThunk('addElement', ({ dispatch }, pageId, element) => { - const newElement = Object.assign({}, getDefaultElement(), omit(element, 'id')); + const newElement = Object.assign({}, getDefaultElement(), getBareElement(element)); const _addElement = createAction('addElement'); dispatch(_addElement({ pageId, element: newElement })); diff --git a/public/state/actions/workpad.js b/public/state/actions/workpad.js index e12bde9a8483b..0382cf4957966 100644 --- a/public/state/actions/workpad.js +++ b/public/state/actions/workpad.js @@ -45,17 +45,10 @@ export const loadWorkpadById = createThunk('loadWorkpadById', ({ dispatch }, wor export const downloadWorkpadById = createThunk('downloadWorkpadbyId', ({ dispatch }, workpadId) => { // TODO: handle the failed loading state - workpadService.get(workpadId).then(resp => { - console.log(resp); - fileSaver.saveAs(new Blob([JSON.stringify(resp)], { type: 'application/json' }), `canvas-workpad-${resp.name}-${resp.id}.json`); - }); -}); - -export const downloadWorkpad = createThunk('downloadWorkpad', ({ dispatch }, workpadId) => { - // TODO: handle the failed loading state - workpadService.get(workpadId).then(resp => { - console.log(resp); - fileSaver.saveAs(new Blob([JSON.stringify(resp)], { type: 'application/json' }), `canvas-workpad-${resp.name}-${resp.id}.json`); + workpadService.get(workpadId) + .then(resp => { + const jsonBlob = new Blob([JSON.stringify(resp)], { type: 'application/json' }); + fileSaver.saveAs(jsonBlob, `canvas-workpad-${resp.name}-${resp.id}.json`); }); }); diff --git a/public/state/selectors/workpad.js b/public/state/selectors/workpad.js index a8d4d63559f75..2486416229af7 100644 --- a/public/state/selectors/workpad.js +++ b/public/state/selectors/workpad.js @@ -1,4 +1,4 @@ -import { get, find, findIndex, map } from 'lodash'; +import { get, find, findIndex, map, omit } from 'lodash'; import { safeElementFromExpression } from '../../../common/lib/ast'; import { append } from '../../lib/modify_path'; import { getAssets } from './assets'; @@ -76,8 +76,12 @@ export function getElements(state, pageId, withAst = true) { const page = getPageById(state, id); const elements = get(page, 'elements'); + if (!elements) return []; - if (!withAst) return elements; + + // explicitely strip the ast, basically a fix for corrupted workpads + // due to https://github.com/elastic/kibana-canvas/issues/260 + if (!withAst) return elements.map(el => omit(el, ['ast'])); return elements.map(appendAst); }