From 0f7ee188c232b5f96f356b319d9cbdd51f784523 Mon Sep 17 00:00:00 2001 From: Santiago <71732018+Zasa-san@users.noreply.github.com> Date: Mon, 7 Oct 2024 11:36:38 -0300 Subject: [PATCH] [HOTFIX] - Page datasets update (#7309) * increase version * expose function * types for datasets * simple updater function * e2e test * revert change to config --- app/react/Pages/PageView.js | 6 ++- app/react/Pages/specs/PageView.spec.js | 6 +++ .../utils/specs/updatePageDatasets.spec.ts | 43 ++++++++++++++++++ app/react/Pages/utils/updatePageDatasets.ts | 23 ++++++++++ app/react/istore.d.ts | 3 ++ ...e script using the updated function #0.png | Bin 0 -> 12029 bytes cypress/e2e/pages/graphs.cy.ts | 28 ++++++++++++ package.json | 2 +- 8 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 app/react/Pages/utils/specs/updatePageDatasets.spec.ts create mode 100644 app/react/Pages/utils/updatePageDatasets.ts create mode 100644 cypress/e2e/pages/__image_snapshots__/Graphs in Page dataset updates should update a graph via the page script using the updated function #0.png diff --git a/app/react/Pages/PageView.js b/app/react/Pages/PageView.js index ee15b79dcc..5bb310c385 100644 --- a/app/react/Pages/PageView.js +++ b/app/react/Pages/PageView.js @@ -1,5 +1,5 @@ import React from 'react'; - +import { isClient } from 'app/utils'; import { actions } from 'app/BasicReducer'; import { unselectAllDocuments } from 'app/Library/actions/libraryActions'; import { wrapDispatch } from 'app/Multireducer'; @@ -11,6 +11,7 @@ import { trackPage } from 'app/App/GoogleAnalytics'; import { ErrorBoundary } from 'app/V2/Components/ErrorHandling'; import { PageViewer } from './components/PageViewer'; import { getPageAssets } from './utils/getPageAssets'; +import { updatePageDatasets } from './utils/updatePageDatasets'; class PageViewComponent extends RouteHandler { static async requestState(requestParams) { @@ -32,6 +33,9 @@ class PageViewComponent extends RouteHandler { componentDidMount() { this.closeSidePanel(); + if (isClient) { + window.updatePageDatasets = updatePageDatasets; + } } componentWillUnmount() { diff --git a/app/react/Pages/specs/PageView.spec.js b/app/react/Pages/specs/PageView.spec.js index 7e65233337..b24dc8eb34 100644 --- a/app/react/Pages/specs/PageView.spec.js +++ b/app/react/Pages/specs/PageView.spec.js @@ -104,4 +104,10 @@ describe('PageView', () => { }); }); }); + + describe('dataset functions', () => { + it('should expose a function to update page datasets', () => { + expect(window.updatePageDatasets).not.toBeUndefined(); + }); + }); }); diff --git a/app/react/Pages/utils/specs/updatePageDatasets.spec.ts b/app/react/Pages/utils/specs/updatePageDatasets.spec.ts new file mode 100644 index 0000000000..d4321caf2b --- /dev/null +++ b/app/react/Pages/utils/specs/updatePageDatasets.spec.ts @@ -0,0 +1,43 @@ +/** + * @jest-environment jsdom + */ +import { fromJS } from 'immutable'; +import { Store } from 'redux'; +import create from 'app/store'; +import { IStore } from 'app/istore'; +import { updatePageDatasets } from '../updatePageDatasets'; + +describe('Update page datasets', () => { + let ReduxStore: Store; + + beforeEach(() => { + ReduxStore = create({ + page: { + datasets: fromJS({ + default: { rows: [], totalRows: 10, aggregations: {} }, + dataset1: { rows: [], totalRows: 10, aggregations: {} }, + }), + }, + }); + + spyOn(ReduxStore, 'dispatch'); + }); + + it('should update the selected dataset', () => { + updatePageDatasets('dataset1', { rows: [], totalRows: 7, aggregations: { new: 'info' } }); + + expect(ReduxStore.dispatch).toHaveBeenCalledWith({ + type: 'page/datasets/SET', + value: { + default: { rows: [], totalRows: 10, aggregations: {} }, + dataset1: { rows: [], totalRows: 7, aggregations: { new: 'info' } }, + }, + }); + }); + + it('should not dispatch if there is no dataset', () => { + updatePageDatasets('dataset2', { rows: [], totalRows: 7, aggregations: { new: 'info' } }); + + expect(ReduxStore.dispatch).not.toHaveBeenCalled(); + }); +}); diff --git a/app/react/Pages/utils/updatePageDatasets.ts b/app/react/Pages/utils/updatePageDatasets.ts new file mode 100644 index 0000000000..bc0227b835 --- /dev/null +++ b/app/react/Pages/utils/updatePageDatasets.ts @@ -0,0 +1,23 @@ +import { actions } from 'app/BasicReducer'; +import { store } from 'app/store'; + +declare global { + interface Window { + updatePageDatasets: (name: string, data: any) => void; + } +} + +const updatePageDatasets = (name: string, data: any) => { + if (!store) { + return; + } + + const currentDatasets = store.getState().page.datasets?.toJS(); + + if (currentDatasets && currentDatasets[name]) { + currentDatasets[name] = data; + store.dispatch(actions.set('page/datasets', currentDatasets)); + } +}; + +export { updatePageDatasets }; diff --git a/app/react/istore.d.ts b/app/react/istore.d.ts index 38929fded8..90f34fdb2e 100644 --- a/app/react/istore.d.ts +++ b/app/react/istore.d.ts @@ -193,6 +193,9 @@ export interface IStore { data: PageType; uiState: IImmutable<{ savingPage: boolean }>; formState: any; + datasets?: IImmutable<{ + [name: string]: { rows: any[]; totalRows: number; aggregations: any }; + }>; }; pages: IImmutable; relationTypes: IImmutable; diff --git a/cypress/e2e/pages/__image_snapshots__/Graphs in Page dataset updates should update a graph via the page script using the updated function #0.png b/cypress/e2e/pages/__image_snapshots__/Graphs in Page dataset updates should update a graph via the page script using the updated function #0.png new file mode 100644 index 0000000000000000000000000000000000000000..0713cac619549a99a1fc7e617eac719eefb108a0 GIT binary patch literal 12029 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�_U`tXZc0PC zWueCvpyfry$A_IU18*rL>~GlnuEKuiwvSr{9y1CN~11H;g8bCcP+b!!Ea!C1BQ z%6d`JbnpmZ^`%Rf=1MJVZEjwF0U9s>LeR&n>S_hA{#9Y?r0)SIjVII7^YWrhrH;0N z7@m9P%$c{qp~32CYHDU#7T!`09M45^0$khiS3*K`(BR|OH3TH*UO_?Zu^*pTMv9(0 zcP<62JD8A*y1M%5)2H2s+7$9#-W@hK-zX$yH`tF zds+UmA1|GEcfYYo-nGL^F;3o1L{t@d+RJMVy6)QfvP+BF2q<(!#LD{mdcWz(Jx7il znGOZ+q=Mq=n3xD}*svkXEbnT5zTDxIRbb4^moImx)Ni{~_PuqEFdTl9uy4>EN=ow6x_@_lp?JPT;XACj?@vubeSE?cm@sF=S<35>y3Zg#YC556a5Q-QC@` zp8GfNm6z{w-@ijj>OO&h2F82r^6n=WXJS?g78`zIhZ=|$3l}c5#CwI>?hYZ*&YV8| zGk5`G&w&FqEjZ`Uqp8mj>~&xwb0!16{-mIw%S#csfuW({31j1<3FV#1`S~%KCOIA~ z#yPu3>%)X)96%{@x)!{ach1G7yCzQdetNpW$&+Q1llxUs+zMkev#N>;{_ybd>B*6W zk(K3ua!c&kQJU}6v=eL_1r+x{RaKRgMgA`}H9Fi1YEve3Nn9_fyZMp*({@)Xm3r36 z>0V08MG$0SWNd0*hHrv{m?*zoNXQe^P9G?`cfi29PYYH*&cI@OUPVhL?7y&}`tgpP zJMG4LUpE8Sq0s4lA6|s*Pt?`Y(lUKyx5(b!zInk#n3B&x2N<^{0htJv30QoSoJ(o1 zPtn87%+!YuL$6+4tgo+cS`wrH*1IC+)~&-', pieChart: '', @@ -81,4 +86,27 @@ describe('Graphs in Page ', () => { it('should insert List chart with nested graph in created page', () => { testChart(graphs.listChartScatter, 'List chart with nested graph'); }); + + describe('dataset updates', () => { + it('should update a graph via the page script using the updated function', () => { + cy.contains('a', 'Settings').click(); + cy.contains('a', 'Pages').click(); + cy.contains('tr', 'Bar chart graph').contains('button', 'Edit').click(); + cy.contains('Javascript').click(); + // delete extra closing keys added by the code editor when writing this text + // eslint-disable-next-line cypress/unsafe-to-chain-command + cy.get('div[data-mode-id="javascript"]') + .type(updateDatasetScript, { + parseSpecialCharSequences: false, + delay: 0, + }) + .type('{backspace}{backspace}'); + // wait for editor to update + // eslint-disable-next-line cypress/no-unnecessary-waiting + cy.wait(501); + savePage(); + visitPage(); + takeSnapshot(); + }); + }); }); diff --git a/package.json b/package.json index 8559f03cc4..1770222ef4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "uwazi", - "version": "1.187.2", + "version": "1.187.3", "description": "Uwazi is a free, open-source solution for organising, analysing and publishing your documents.", "keywords": [ "react"