From ea45091f93f59e94dd930a615088d413a66581ee Mon Sep 17 00:00:00 2001 From: Miu Razvan Date: Thu, 3 Sep 2020 16:38:11 +0300 Subject: [PATCH] Fixed View; Added Iframe; Update QueryParamButton; --- jsconfig.json | 3 + mrs.developer.json | 5 + package.json | 5 +- src/components/manage/Blocks/Iframe/Edit.jsx | 94 +++++++++++++++++++ src/components/manage/Blocks/Iframe/View.jsx | 72 ++++++++++++++ src/components/manage/Blocks/Iframe/style.css | 3 + .../manage/Blocks/QueryParamButton/Edit.jsx | 22 ++++- .../manage/Blocks/QueryParamButton/View.jsx | 27 ++++-- .../manage/Blocks/QueryParamText/View.jsx | 4 +- src/components/theme/View/DefaultView.jsx | 8 +- src/components/theme/View/RedirectView.jsx | 3 +- .../volto/components/theme/View/View.jsx | 23 ++++- src/localconfig.js | 12 +++ theme/site/globals/site.overrides | 10 +- yarn.lock | 14 +++ 15 files changed, 281 insertions(+), 24 deletions(-) create mode 100644 src/components/manage/Blocks/Iframe/Edit.jsx create mode 100644 src/components/manage/Blocks/Iframe/View.jsx create mode 100644 src/components/manage/Blocks/Iframe/style.css diff --git a/jsconfig.json b/jsconfig.json index 9847306b..6fc1de22 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -1,6 +1,9 @@ { "compilerOptions": { "paths": { + "volto-slate": [ + "develop/volto-slate/src" + ], "volto-tabsview": [ "develop/volto-tabsview/src" ], diff --git a/mrs.developer.json b/mrs.developer.json index 3b9a2a6f..193a3ac9 100644 --- a/mrs.developer.json +++ b/mrs.developer.json @@ -1,4 +1,9 @@ { + "volto-slate": { + "url": "https://github.com/eea/volto-slate.git", + "path": "src", + "branch": "develop" + }, "volto-tabsview": { "url": "https://github.com/eea/volto-tabsview.git", "branch": "master", diff --git a/package.json b/package.json index 270aa783..77e39944 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "version": "0.4.1", "private": true, "workspaces": [ + "src/develop/volto-slate", "src/develop/volto-grid-block", "src/develop/volto-addons", "src/develop/volto-datablocks" @@ -109,9 +110,10 @@ "@eeacms/volto-image-zoom-and-flip": "github:eea/volto-image-zoom-and-flip#0.1.0", "@eeacms/volto-metadata-block": "github:eea/volto-metadata-block#0.2.0", "@eeacms/volto-slate-metadata-mentions": "github:eea/volto-slate-metadata-mentions#0.2.0", - "@eeacms/volto-widgets-view": "github:eea/volto-widgets-view#0.2.4", "@eeacms/volto-tabs-block": "github:eea/volto-tabs-block#0.2.2", + "@eeacms/volto-widgets-view": "github:eea/volto-widgets-view#0.2.4", "@plone/volto": "github:eea/volto#7.11.1-beta.1", + "@tinymce/tinymce-react": "^3.6.0", "axios": "^0.20.0", "jsonp": "^0.2.1", "ol": "^6.4.3", @@ -120,6 +122,7 @@ "react-component-queries": "^2.3.0", "react-dom": "^16.13.1", "react-highlight-words": "^0.16.0", + "react-iframe": "^1.8.0", "react-loadable": "^5.5.0", "react-sizeme": "^2.6.12", "react-visibility-sensor": "^5.1.1", diff --git a/src/components/manage/Blocks/Iframe/Edit.jsx b/src/components/manage/Blocks/Iframe/Edit.jsx new file mode 100644 index 00000000..9a8d92fa --- /dev/null +++ b/src/components/manage/Blocks/Iframe/Edit.jsx @@ -0,0 +1,94 @@ +import React, { useState, useEffect } from 'react'; +import { connect } from 'react-redux'; +import { compose } from 'redux'; +import _uniqueId from 'lodash/uniqueId'; +import RenderFields from 'volto-addons/Widgets/RenderFields'; +import View from './View'; +import { settings } from '~/config'; +import './style.css'; + +const getSchema = (props) => { + return { + url: { + title: 'Url', + type: 'text', + }, + title: { + title: 'Title', + type: 'text', + }, + width: { + title: 'Width', + type: 'text', + }, + height: { + title: 'Height', + type: 'text', + }, + hideToolbar: { + title: 'Hide toolbar', + type: 'boolean', + }, + overflow: { + title: 'Overflow', + type: 'boolean', + }, + queryParameters: { + title: 'Query parameters', + type: 'schema', + fieldSetTitle: 'Query parameters', + fieldSetId: 'query_parameters', + fieldSetSchema: { + fieldsets: [ + { + id: 'default', + title: 'title', + fields: ['title', 'id', 'queryParam'], + }, + ], + properties: { + title: { + title: 'Title', + type: 'text', + }, + id: { + title: 'Id', + type: 'text', + description: 'This will be used as query param key for tableau', + }, + queryParam: { + title: 'Query to use', + type: 'text', + }, + }, + required: ['id', 'title', 'key'], + }, + editFieldset: false, + deleteFieldset: false, + }, + }; +}; + +const Edit = (props) => { + const [state, setState] = useState({ + schema: getSchema({ ...props, providerUrl: settings.providerUrl }), + id: _uniqueId('block_'), + }); + return ( +
+ + +
+ ); +}; + +export default compose( + connect((state, props) => ({ + pathname: state.router.location.pathname, + })), +)(Edit); diff --git a/src/components/manage/Blocks/Iframe/View.jsx b/src/components/manage/Blocks/Iframe/View.jsx new file mode 100644 index 00000000..08e49b0f --- /dev/null +++ b/src/components/manage/Blocks/Iframe/View.jsx @@ -0,0 +1,72 @@ +/* REACT */ +import React, { useState, useEffect } from 'react'; +import { compose } from 'redux'; +import { connect } from 'react-redux'; +import Iframe from 'react-iframe'; +import qs from 'query-string'; +import './style.css'; + +const View = ({ content, ...props }) => { + const [discodataQuery, setDiscodataQuery] = useState({}); + const { data } = props; + const { url = '', title = '', width = '100%', height = 'auto' } = data; + const { hideToolbar = false, overflow = false } = data; + useEffect(() => { + if (props.data.queryParameters?.value) { + try { + const newDiscodataQuery = {}; + const properties = JSON.parse(props.data.queryParameters?.value) + .properties; + properties && + Object.entries(properties).forEach(([key, value]) => { + if (props.searhc[value.queryParam]) { + newDiscodataQuery[key] = props.search[value.queryParam] || ''; + } + }); + + if ( + JSON.stringify(newDiscodataQuery) !== JSON.stringify(discodataQuery) + ) { + setDiscodataQuery(newDiscodataQuery); + } + } catch { + setDiscodataQuery({}); + } + } + /* eslint-disable-next-line */ + }, [props.data.queryParameters]) + + const getUrl = (url) => { + const newUrl = new URL(url); + return newUrl.protocol + '//' + newUrl.host + newUrl.pathname; + }; + const applyQueryParameters = (url, query) => { + const queryParameters = { + ...query, + ':toolbar': hideToolbar ? 'n' : 'y', + ':embed': 'y', + }; + return `${getUrl(url)}?${qs.stringify(queryParameters)}`; + }; + return ( +
+