From b8e69f2513eea923364a90a85a887cbd933163ce Mon Sep 17 00:00:00 2001 From: Darius Date: Wed, 21 Apr 2021 13:23:31 +0200 Subject: [PATCH] fix export current results --- src/reducers/app/actions.ts | 10 +++++++++- src/reducers/app/reducers.ts | 7 ++++++- src/reducers/app/thunks.ts | 36 ++++++++++++++++++++++++------------ src/reducers/app/types.ts | 1 + 4 files changed, 40 insertions(+), 14 deletions(-) diff --git a/src/reducers/app/actions.ts b/src/reducers/app/actions.ts index 89d4f203..03acf1df 100644 --- a/src/reducers/app/actions.ts +++ b/src/reducers/app/actions.ts @@ -1,5 +1,6 @@ import { SET_ITEMS, + SET_ITEMS_CSV, SET_FILTER, SET_TAB, SET_LOADING, @@ -286,4 +287,11 @@ export function setTopBakersQueryUrl(topBakersUrl: string) { type: SET_TOP_BAKERS_QUERY_URL, topBakersUrl, } -} \ No newline at end of file +} + +export function setItemsCsv(itemsCsv: string) { + return { + type: SET_ITEMS_CSV, + itemsCsv, + } +} diff --git a/src/reducers/app/reducers.ts b/src/reducers/app/reducers.ts index 7f3c2e56..63bb0a4b 100644 --- a/src/reducers/app/reducers.ts +++ b/src/reducers/app/reducers.ts @@ -1,5 +1,6 @@ import { SET_ITEMS, + SET_ITEMS_CSV, SET_FILTER, SET_TAB, SET_LOADING, @@ -48,6 +49,7 @@ export interface AppState { columns: object; attributes: object; items: object; + itemsCsv: string; operators: object; selectedFilters: any; queryFilters: any; @@ -80,6 +82,7 @@ let initialState: AppState = { entities: [], attributes, items: {}, + itemsCsv: '', selectedFilters: {}, queryFilters: {}, operators: { @@ -163,6 +166,8 @@ export const app = (state = initialState, action: any) => { const items = { ...state.items, [action.entity]: action.items }; return { ...state, items }; } + case SET_ITEMS_CSV: + return { ...state, itemsCsv: action.itemsCsv }; case SET_COLUMNS: { const columns = { ...state.columns, [action.entity]: action.columns }; const sort = { ...state.sort, [action.entity]: action.sorts }; @@ -305,7 +310,7 @@ export const app = (state = initialState, action: any) => { } case SET_HOURLY_TRANSACTIONS_LOADING: return { ...state, isTransactionsLoading: action.isTransactionsLoading }; - case SET_HOURLY_TRANSACTIONS: + case SET_HOURLY_TRANSACTIONS: return { ...state, hourlytransactions: action.hourlytransactions }; case SET_HOURLY_TRANSACTIONS_QUERY_URL: return { ...state, hourlytransactionsUrl: action.hourlytransactionsUrl }; diff --git a/src/reducers/app/thunks.ts b/src/reducers/app/thunks.ts index bdfa7843..765d5f42 100644 --- a/src/reducers/app/thunks.ts +++ b/src/reducers/app/thunks.ts @@ -39,6 +39,7 @@ import { setTopBakersLoadingAction, setTopBakersQueryUrl, setTopAccountsQueryUrl, + setItemsCsv, } from './actions'; import { setModalItems, setModalOpen } from '../modal/actions'; import { createMessageAction } from '../message/actions'; @@ -270,6 +271,13 @@ export const fetchInitEntityAction = ( dispatch(createMessageAction(`Unable to retrieve data for ${name} request.`, true)); return []; }); + + // Fetch items CSV + let queryCsv = ConseilQueryBuilder.setOutputType(query, ConseilOutput.csv); + queryCsv = ConseilQueryBuilder.setLimit(queryCsv, 50000); + const itemsCsv: any = await executeEntityQuery(serverInfo, platform, network, entity, queryCsv); + dispatch(setItemsCsv(itemsCsv)); + await dispatch(setQueryFilters(entity, query)); await dispatch(setEntityPropertiesAction(entity, filters, sorts, columns, items, aggregations)); await Promise.all(cardinalityPromises); @@ -615,23 +623,14 @@ export const shareReport = () => async (dispatch: any, state: any) => { }; export const exportCsvData = () => async (dispatch: any, state: any) => { - const { selectedEntity, columns, sort, selectedFilters, selectedConfig, aggregations } = state().app; - const { platform, network, url, apiKey } = selectedConfig; - const serverInfo = { url, apiKey, network }; + const { itemsCsv } = state().app; - const attributeNames = getAttributeNames(columns[selectedEntity]); - let query = getMainQuery(attributeNames, selectedFilters[selectedEntity], sort[selectedEntity], aggregations[selectedEntity]); - query = ConseilQueryBuilder.setOutputType(query, ConseilOutput.csv); - query = ConseilQueryBuilder.setLimit(query, 50000); - - const result: any = await executeEntityQuery(serverInfo, platform, network, selectedEntity, query); - - if (!result || result.length === 0) { + if (!itemsCsv || itemsCsv.length === 0) { dispatch(createMessageAction('Export failed, no results were returned.', true)); return; } - let blob = new Blob([result]); + let blob = new Blob([itemsCsv]); const winOpenBlob: any = window.navigator.msSaveOrOpenBlob || null; if (winOpenBlob) { window.navigator.msSaveBlob(blob, 'arronax-results.csv'); @@ -654,10 +653,15 @@ export const submitQuery = () => async (dispatch: any, state: any) => { let query = getMainQuery(attributeNames, selectedFilters[selectedEntity], sort[selectedEntity], aggregations[selectedEntity]); query = setLimit(query, 1000); + let queryCsv = ConseilQueryBuilder.setOutputType(query, ConseilOutput.csv); + queryCsv = ConseilQueryBuilder.setLimit(queryCsv, 50000); + try { const items = await executeEntityQuery(serverInfo, platform, network, selectedEntity, query); await dispatch(setSubmitAction(selectedEntity, items, selectedFilters[selectedEntity].length)); await dispatch(setQueryFilters(selectedEntity, query)); + const itemsCsv: any = await executeEntityQuery(serverInfo, platform, network, selectedEntity, queryCsv); + dispatch(setItemsCsv(itemsCsv)); dispatch(setLoadingAction(false)); } catch (e) { const message = `Unable to submit query`; @@ -696,14 +700,22 @@ export const searchByIdThunk = (id: string | number) => async (dispatch: any, st try { const { entity, query } = TezosConseilClient.getEntityQueryForId(id); const items = await executeEntityQuery(serverInfo, platform, network, entity, query); + if (items.length > 0) { await dispatch(changeTab(entity)); + + // Fetch items CSV + let queryCsv = ConseilQueryBuilder.setOutputType(query, ConseilOutput.csv); + queryCsv = ConseilQueryBuilder.setLimit(queryCsv, 50000); + const itemsCsv: any = await executeEntityQuery(serverInfo, platform, network, entity, queryCsv); + dispatch(setItemsCsv(itemsCsv)); } else { const searchedEntity = entities.find((item: any) => item.name === entity); dispatch(setLoadingAction(false)); dispatch(createMessageAction(`The ${searchedEntity.displayName.toLowerCase()} was not found.`, true)); return { entity: '', items: [], subItems: [] }; } + dispatch(setLoadingAction(false)); await dispatch(setModalItems(platform, network, entity, id, items )); await dispatch(setModalOpen(true)); diff --git a/src/reducers/app/types.ts b/src/reducers/app/types.ts index bfda98ed..8fbd9acc 100644 --- a/src/reducers/app/types.ts +++ b/src/reducers/app/types.ts @@ -1,4 +1,5 @@ export const SET_ITEMS = 'SET_ITEMS'; +export const SET_ITEMS_CSV = 'SET_ITEMS_CSV'; export const SET_COLUMNS = 'SET_COLUMNS'; export const SET_FILTER = 'SET_FILTER'; export const SET_TAB = 'SET_TAB';