diff --git a/docma-config.json b/docma-config.json index e43df8879f..98a1cf617b 100644 --- a/docma-config.json +++ b/docma-config.json @@ -107,17 +107,21 @@ { "framework" : [ "web/client/components/index.jsdoc", + "web/client/components/buttons/FullScreenButton.jsx", "web/client/components/mapcontrols/search/SearchBar.jsx", + "web/client/components/buttons/ToggleButton.jsx", "web/client/actions/index.jsdoc", - "web/client/actions/search.js", "web/client/actions/controls.js", + "web/client/actions/fullscreen.js", + "web/client/actions/search.js", "web/client/reducers/index.jsdoc", - "web/client/reducers/search.js", "web/client/reducers/controls.js", + "web/client/reducers/search.js", "web/client/epics/index.jsdoc", + "web/client/epics/fullscreen.js", "web/client/epics/search.js", "web/client/utils/index.jsdoc", @@ -126,12 +130,13 @@ "jsapi": "web/client/jsapi/MapStore2.js", "plugins": [ "web/client/plugins/index.jsdoc", - "web/client/plugins/Search.jsx", "web/client/plugins/BackgroundSwitcher.jsx", "web/client/plugins/Map.jsx", + "web/client/plugins/FullScreen.jsx", "web/client/plugins/Identify.jsx", "web/client/plugins/Login.jsx", - "web/client/plugins/ScrollTop.jsx" + "web/client/plugins/ScrollTop.jsx", + "web/client/plugins/Search.jsx" ] }, "./docs/**/*md", diff --git a/package.json b/package.json index c5615ba3b1..b14f979cc4 100644 --- a/package.json +++ b/package.json @@ -151,6 +151,7 @@ "redux-undo": "0.5.0", "reselect": "2.5.1", "rxjs": "5.1.1", + "screenfull": "3.1.0", "shpjs": "3.3.2", "turf-bbox": "3.0.10", "turf-buffer": "3.0.10", diff --git a/web/client/actions/__tests__/fullscreen-test.js b/web/client/actions/__tests__/fullscreen-test.js new file mode 100644 index 0000000000..1611c1dd72 --- /dev/null +++ b/web/client/actions/__tests__/fullscreen-test.js @@ -0,0 +1,25 @@ +/** + * Copyright 2017, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + +const expect = require('expect'); +const { + TOGGLE_FULLSCREEN, + toggleFullscreen +} = require('../fullscreen'); + +describe('Test correctness of the fullscreen actions', () => { + it('toggleFullscreen', () => { + const testControl = 'test'; + var retval = toggleFullscreen(true, testControl); + + expect(retval).toExist(); + expect(retval.type).toBe(TOGGLE_FULLSCREEN); + expect(retval.enable).toBe(true); + expect(retval.elementSelector).toBe(testControl); + }); +}); diff --git a/web/client/actions/fullscreen.js b/web/client/actions/fullscreen.js new file mode 100644 index 0000000000..535fe706ab --- /dev/null +++ b/web/client/actions/fullscreen.js @@ -0,0 +1,28 @@ +/* + * Copyright 2016, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + + +const TOGGLE_FULLSCREEN = "TOGGLE_FULLSCREEN"; +/** + * when fullscreen have to be toggled + * @param {boolean} enable true for enable, false for disable + * @param {string} elementSelector querySelector string to use to get the element to fullscreen. + * @return {action} the action of type `TOGGLE_FULLSCREEN` with enable flag and element selector. + */ +function toggleFullscreen(enable, elementSelector) { + return { + type: TOGGLE_FULLSCREEN, + enable, + elementSelector + }; +} + +module.exports = { + toggleFullscreen, + TOGGLE_FULLSCREEN +}; diff --git a/web/client/components/TOC/DefaultLayer.jsx b/web/client/components/TOC/DefaultLayer.jsx index b077d05524..03106e4783 100644 --- a/web/client/components/TOC/DefaultLayer.jsx +++ b/web/client/components/TOC/DefaultLayer.jsx @@ -167,7 +167,7 @@ var DefaultLayer = React.createClass({ className="toc-zoomTool" ref="target" style={{"float": "right", cursor: "pointer"}} - glyph="1-full-screen" + glyph="zoom-in" onClick={(node) => this.props.onZoom(node.bbox.bounds, node.bbox.crs)}/> ); } diff --git a/web/client/components/buttons/FullScreenButton.jsx b/web/client/components/buttons/FullScreenButton.jsx new file mode 100644 index 0000000000..163677115a --- /dev/null +++ b/web/client/components/buttons/FullScreenButton.jsx @@ -0,0 +1,89 @@ +/** + * Copyright 2017, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + +const React = require('react'); + +const ToggleButton = require('./ToggleButton'); +const {Tooltip} = require('react-bootstrap'); +const Message = require('../I18N/Message'); +/** + * Toggle button for fullscreen. Wraps {@link #components.buttons.ToggleButton} with some defaults + * @memberof components.buttons + * @class + * @prop {string} [id] an id for the html component + * @prop {object} [btnConfig] the configuration to pass to the bootstrap button + * @prop {object} [options] the options to send when toggle is clicked + * @prop {string|element} [text] the text to disaplay + * @prop {string|element} [help] the help text + * @prop {string} glyphicon the icon name + * @prop {bool} active the status of the button + * @prop {function} onClick. The method to call when clicked. the method will return as parameter the toggled `pressed` prop and the `options` object + * @prop {node} [activeTooltip] the tooltip to use on mouse hover + * @prop {node} [notActiveTooltip] the tooltip to use on mouse hover when the button is active + * @prop {string} [tooltipPlace] positon of the tooltip, one of: 'top', 'right', 'bottom', 'left' + * @prop {object} css style object for the component + * @prop {btnType} [btnType] one of 'normal', 'image' + * @prop {string} image if type is 'image', the src of the image + * @prop {string} pressedStyle the bootstrap style for pressedStyle + * @prop {string} defaultStyle the bootstrap style when not pressed + * + */ +const FullScreenButton = React.createClass({ + propTypes: { + id: React.PropTypes.string, + btnConfig: React.PropTypes.object, + options: React.PropTypes.options, + text: React.PropTypes.oneOfType([React.PropTypes.string, React.PropTypes.element]), + help: React.PropTypes.oneOfType([React.PropTypes.string, React.PropTypes.element]), + glyphicon: React.PropTypes.string, + active: React.PropTypes.bool, + onClick: React.PropTypes.func, + activeTooltip: React.PropTypes.string, + notActiveTooltip: React.PropTypes.string, + tooltipPlace: React.PropTypes.string, + style: React.PropTypes.object, + btnType: React.PropTypes.oneOf(['normal', 'image']), + image: React.PropTypes.string, + pressedStyle: React.PropTypes.string, + defaultStyle: React.PropTypes.string + }, + getDefaultProps() { + return { + id: 'fullscreen-btn', + activeTooltip: 'fullscreen.tooltipDeactivate', + notActiveTooltip: 'fullscreen.tooltipActivate', + tooltipPlace: 'left', + defaultStyle: 'primary', + pressedStyle: 'success', + glyphicon: '1-full-screen', + btnConfig: { + className: "square-button" + } + }; + }, + getButtonProperties() { + return ['id', + 'btnConfig', + 'options', + 'text', + 'glyphicon', + 'onClick', + 'tooltipPlace', + 'style', + 'btnType', + 'image', + 'pressedStyle', + 'defaultStyle' + ].reduce((result, key) => { result[key] = this.props[key]; return result; }, {}); + }, + render() { + return } />; + } +}); + +module.exports = FullScreenButton; diff --git a/web/client/components/buttons/ToggleButton.jsx b/web/client/components/buttons/ToggleButton.jsx index a9a2dd97f9..0bf9b63de3 100644 --- a/web/client/components/buttons/ToggleButton.jsx +++ b/web/client/components/buttons/ToggleButton.jsx @@ -1,4 +1,4 @@ -/** +/* * Copyright 2015, GeoSolutions Sas. * All rights reserved. * @@ -12,11 +12,32 @@ var {Button, Glyphicon} = require('react-bootstrap'); const OverlayTrigger = require('../misc/OverlayTrigger'); var ImageButton = require('./ImageButton'); - +/** + * Toggle button with tooltip and icons or image support. + * @memberof components.buttons + * @class + * @prop {string} [id] an id for the html component + * @prop {object} [btnConfig] the configuration to pass to the bootstrap button + * @prop {object} [options] the options to send when toggle is clicked + * @prop {string|element} [text] the text to disaplay + * @prop {string|element} [help] the help text + * @prop {string} glyphicon the icon name + * @prop {bool} pressed the status of the button + * @prop {function} onClick. The method to call when clicked. the method will return as parameter the toggled `pressed` prop and the `options` object + * @prop {node} [tooltip] the tooltip to use on mouse hover + * @prop {string} [tooltipPlace] positon of the tooltip, one of: 'top', 'right', 'bottom', 'left' + * @prop {object} css style object for the component + * @prop {btnType} [btnType] one of 'normal', 'image' + * @prop {string} image if type is 'image', the src of the image + * @prop {string} pressedStyle the bootstrap style for pressedStyle + * @prop {string} defaultStyle the bootstrap style when not pressed + * + */ var ToggleButton = React.createClass({ propTypes: { id: React.PropTypes.string, btnConfig: React.PropTypes.object, + options: React.PropTypes.options, text: React.PropTypes.oneOfType([React.PropTypes.string, React.PropTypes.element]), help: React.PropTypes.oneOfType([React.PropTypes.string, React.PropTypes.element]), glyphicon: React.PropTypes.string, @@ -33,6 +54,7 @@ var ToggleButton = React.createClass({ getDefaultProps() { return { onClick: () => {}, + options: {}, pressed: false, tooltipPlace: "top", style: {width: "100%"}, @@ -42,7 +64,7 @@ var ToggleButton = React.createClass({ }; }, onClick() { - this.props.onClick(!this.props.pressed); + this.props.onClick(!this.props.pressed, this.props.options); }, renderNormalButton() { return ( diff --git a/web/client/components/buttons/__tests__/FullScreenButton-test.jsx b/web/client/components/buttons/__tests__/FullScreenButton-test.jsx new file mode 100644 index 0000000000..46a28918b6 --- /dev/null +++ b/web/client/components/buttons/__tests__/FullScreenButton-test.jsx @@ -0,0 +1,36 @@ +/** + * Copyright 2017, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ +var expect = require('expect'); + +var React = require('react'); +var ReactDOM = require('react-dom'); +var FullScreenButton = require('../FullScreenButton'); + +describe("test the FullScreenButton", () => { + beforeEach((done) => { + document.body.innerHTML = '
'; + setTimeout(done); + }); + + afterEach((done) => { + ReactDOM.unmountComponentAtNode(document.getElementById("container")); + document.body.innerHTML = ''; + setTimeout(done); + }); + + it('test default properties', () => { + const tb = ReactDOM.render(, document.getElementById("container")); + expect(tb).toExist(); + + const tbNode = ReactDOM.findDOMNode(tb); + expect(tbNode).toExist(); + expect(tbNode.id).toBe('fullscreen-btn'); + expect(tbNode).toExist(); + expect(tbNode.className.indexOf('primary') >= 0).toBe(true); + }); +}); diff --git a/web/client/components/buttons/__tests__/ToggleButton-test.jsx b/web/client/components/buttons/__tests__/ToggleButton-test.jsx index 8b11ca47fd..8cbfdf521f 100644 --- a/web/client/components/buttons/__tests__/ToggleButton-test.jsx +++ b/web/client/components/buttons/__tests__/ToggleButton-test.jsx @@ -75,14 +75,16 @@ describe("test the ToggleButton", () => { const testHandlers = { onClick: (pressed) => {return pressed; } }; + const test = {test: "test"}; const spy = expect.spyOn(testHandlers, 'onClick'); - const tb = ReactDOM.render(, document.getElementById("container")); + const tb = ReactDOM.render(, document.getElementById("container")); const tbNode = ReactDOM.findDOMNode(tb); tbNode.click(); expect(spy.calls.length).toEqual(1); - expect(spy.calls[0].arguments).toEqual([false]); + expect(spy.calls[0].arguments[0]).toEqual(false); + expect(spy.calls[0].arguments[1]).toEqual(test); }; genericTest('normal'); diff --git a/web/client/components/data/featuregrid/FeatureGrid.jsx b/web/client/components/data/featuregrid/FeatureGrid.jsx index ff714c7d3d..f4f688b249 100644 --- a/web/client/components/data/featuregrid/FeatureGrid.jsx +++ b/web/client/components/data/featuregrid/FeatureGrid.jsx @@ -135,7 +135,7 @@ const FeatureGrid = React.createClass({ let tools = []; if (this.props.toolbar.zoom) { - tools.push(); + tools.push(); } if (this.props.toolbar.exporter) { diff --git a/web/client/components/data/featuregrid/ZoomToFeatureIcon.jsx b/web/client/components/data/featuregrid/ZoomToFeatureIcon.jsx index 2c986f9eff..fc7111bb53 100644 --- a/web/client/components/data/featuregrid/ZoomToFeatureIcon.jsx +++ b/web/client/components/data/featuregrid/ZoomToFeatureIcon.jsx @@ -15,7 +15,7 @@ const ZoomToFeatureIcon = React.createClass({ render() { const geometry = this.props.params && this.props.params.data && this.props.params.data.geometry; return geometry && geometry.coordinates ? ( - + ) : null; } }); diff --git a/web/client/epics/__tests__/fullscreen-test.js b/web/client/epics/__tests__/fullscreen-test.js new file mode 100644 index 0000000000..c7b506a36f --- /dev/null +++ b/web/client/epics/__tests__/fullscreen-test.js @@ -0,0 +1,64 @@ + +/** + * Copyright 2017, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ + +var expect = require('expect'); + +const configureMockStore = require('redux-mock-store').default; +const { createEpicMiddleware, combineEpics } = require('redux-observable'); +const {toggleFullscreen} = require('../../actions/fullscreen'); +const {SET_CONTROL_PROPERTY} = require('../../actions/controls'); +const screenfull = require('screenfull'); + +const {toggleFullscreenEpic } = require('../fullscreen'); +const rootEpic = combineEpics(toggleFullscreenEpic); +const epicMiddleware = createEpicMiddleware(rootEpic); +const mockStore = configureMockStore([epicMiddleware]); + +describe('search Epics', () => { + let store; + beforeEach(() => { + store = mockStore(); + }); + + afterEach(() => { + epicMiddleware.replaceEpic(rootEpic); + screenfull.exit(); + }); + + it('produces the search epic', (done) => { + let changed = false; + let action = toggleFullscreen(true, "html"); + if ( screenfull.enabled ) { + screenfull.onchange( () => {changed = true; }); + } + store.dispatch( action ); + + const actions = store.getActions(); + expect(actions.length).toBe(2); + expect(actions[1].type).toBe(SET_CONTROL_PROPERTY); + + setTimeout( () => { + // emulate user exit by hitting esc + if ( screenfull.enabled ) { + screenfull.exit(); + } + setTimeout( () => { + const newActions = store.getActions(); + if ( screenfull.enabled ) { + expect(newActions.length).toBe(3); + expect(actions[2].type).toBe(SET_CONTROL_PROPERTY); + expect(changed).toBe(true); + } + done(); + }, 10); + + }, 10); + + }); +}); diff --git a/web/client/epics/fullscreen.js b/web/client/epics/fullscreen.js new file mode 100644 index 0000000000..aa604b7caa --- /dev/null +++ b/web/client/epics/fullscreen.js @@ -0,0 +1,56 @@ +/* + * Copyright 2017, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ +const screenfull = require('screenfull'); +const {setControlProperty} = require('../actions/controls'); +const {TOGGLE_FULLSCREEN} = require('../actions/fullscreen'); +const ConfigUtils = require('../utils/ConfigUtils'); +const Rx = require('rxjs'); + +const getFullScreenEvent = () => { + let candidates = [ + ['exitFullscreen', 'fullscreenchange'], + ['webkitExitFullscreen', 'webkitfullscreenchange'], + ['webkitCancelFullScreen', 'webkitfullscreenchange'], + ['mozCancelFullScreen', 'mozfullscreenchange'], + ['msExitFullscreen', 'MSFullscreenChange'] + ]; + return candidates.filter((c) => document[c[0]]).reduce( eventMapping => eventMapping && eventMapping[1] ); +}; +/** + * Gets every `TOGGLE_FULLSCREEN` event. + * Dispatches the fullscreen toggle event toggles the fullscreen itself. + * Intercept all events for fullscreen and properly syncronizes the button state. + * and updates every time the user toggles fullscreen (also hitting Esc) + * @param {external:Observable} action$ manages `TOGGLE_FULLSCREEN`. + * @memberof epics.fullscreen + * @return {external:Observable} emitting {@link #actions.controls.setControlProperty} events + */ +const toggleFullscreenEpic = action$ => + action$.ofType(TOGGLE_FULLSCREEN).switchMap(action => { + const element = document.querySelector(action && action.querySelector || ('.' + (ConfigUtils.getConfigProp('themePrefix') || 'ms2') + " > div")); + if (element && action.enable && screenfull.enabled) { + screenfull.request(element); + + } else if (element && !action.enable) { + screenfull.exit(); + } + return Rx.Observable.merge( + Rx.Observable.fromEvent(document, getFullScreenEvent()) + .filter(() => screenfull.element !== element) + .map( () => setControlProperty("fullscreen", "enabled", false) ), + Rx.Observable.of(setControlProperty("fullscreen", "enabled", action.enable)) + ); + }); +/** + * Epics for fullscreen functionality + * @name epics.fullscreen + * @type {Object} + */ +module.exports = { + toggleFullscreenEpic +}; diff --git a/web/client/examples/api/init.js b/web/client/examples/api/init.js index 030ef8708f..54e300dd8e 100644 --- a/web/client/examples/api/init.js +++ b/web/client/examples/api/init.js @@ -27,7 +27,8 @@ function init() { "DrawerMenu", "TOC", "BackgroundSwitcher", - "Identify" + "Identify", + "FullScreen" ]}; /*eslint-disable */ pluginsCfg = cfg && MapStore2.buildPluginsCfg(cfg.pluginsCfg.standard, cfg.userCfg) || embeddedPlugins; diff --git a/web/client/jsapi/MapStore2.js b/web/client/jsapi/MapStore2.js index 209e8c8539..93306f2f0d 100644 --- a/web/client/jsapi/MapStore2.js +++ b/web/client/jsapi/MapStore2.js @@ -136,7 +136,8 @@ const defaultPlugins = { "BurgerMenu", "Expander", "Undo", - "Redo" + "Redo", + "FullScreen" ] }; diff --git a/web/client/jsapi/plugins.js b/web/client/jsapi/plugins.js index a437d901c8..260d9eeb63 100644 --- a/web/client/jsapi/plugins.js +++ b/web/client/jsapi/plugins.js @@ -44,6 +44,7 @@ module.exports = { RulesManagerPlugin: require('../plugins/manager/RulesManager'), ManagerMenuPlugin: require('../plugins/manager/ManagerMenu'), SharePlugin: require('../plugins/Share'), + FullScreenPlugin: require('../plugins/FullScreen'), SavePlugin: require('../plugins/Save'), SaveAsPlugin: require('../plugins/SaveAs') }, diff --git a/web/client/localConfig.json b/web/client/localConfig.json index d73a00f044..7b0975fbf2 100644 --- a/web/client/localConfig.json +++ b/web/client/localConfig.json @@ -91,6 +91,13 @@ "alwaysVisible": true } } + }, { + "name": "FullScreen", + "override": { + "Toolbar": { + "alwaysVisible": false + } + } }, "Login", "OmniBar", "BurgerMenu", "Expander" ], @@ -186,7 +193,7 @@ } } }, - "OmniBar", "Login", "Save", "SaveAs", "BurgerMenu", "Expander", "Undo", "Redo" + "OmniBar", "Login", "Save", "SaveAs", "BurgerMenu", "Expander", "Undo", "Redo", "FullScreen" ], "embedded": [{ "name": "Map", diff --git a/web/client/plugins/FullScreen.jsx b/web/client/plugins/FullScreen.jsx new file mode 100644 index 0000000000..5a814647bc --- /dev/null +++ b/web/client/plugins/FullScreen.jsx @@ -0,0 +1,48 @@ +/* + * Copyright 2017, GeoSolutions Sas. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. + */ +const {connect} = require('react-redux'); + +const {toggleFullscreen} = require('../actions/fullscreen'); +const {toggleFullscreenEpic} = require('../epics/fullscreen'); + +const assign = require('object-assign'); + + +const FullScreenButton = require('../components/buttons/FullScreenButton'); + +/** + * FullScreen Plugin. A button that toggles to fullscreen mode + * @class FullScreen + * @memberof plugins + * @static + * + * @prop {string} cfg.id identifier of the Plugin + * @prop {boolean} cfg.options.querySelector query selector to get the element to zoom. By default .ms2 > div + * + */ +const FullScreen = connect( ({controls = {}} = {}) => ({ + active: controls.fullscreen && controls.fullscreen.enabled +}), { + onClick: (pressed, options) => toggleFullscreen(pressed, options.querySelector) +})(FullScreenButton); + +module.exports = { + FullScreenPlugin: assign(FullScreen, { + Toolbar: { + name: 'fullscreen', + position: 5, + alwaysVisible: true, + tool: true, + priority: 1 + } + }), + reducers: {}, + epics: { + toggleFullscreenEpic + } +}; diff --git a/web/client/plugins/Styler.jsx b/web/client/plugins/Styler.jsx index cb50978708..d786cbc588 100644 --- a/web/client/plugins/Styler.jsx +++ b/web/client/plugins/Styler.jsx @@ -205,7 +205,7 @@ const Styler = React.createClass({ if (originalLayer && originalLayer.capabilities) { return (); + }}onClick={this.zoomToLayerExtent} >Zoom To Layer); } }, renderBody() { diff --git a/web/client/plugins/searchbar/ToggleButton.jsx b/web/client/plugins/searchbar/ToggleButton.jsx index d7fe5aec15..cc64317117 100644 --- a/web/client/plugins/searchbar/ToggleButton.jsx +++ b/web/client/plugins/searchbar/ToggleButton.jsx @@ -23,7 +23,7 @@ const ToggleButton = React.createClass({ }; }, render() { - return ; + return ; } }); diff --git a/web/client/plugins/tutorial/preset/map.js b/web/client/plugins/tutorial/preset/map.js index bb98a40dff..a0504cca65 100644 --- a/web/client/plugins/tutorial/preset/map.js +++ b/web/client/plugins/tutorial/preset/map.js @@ -38,6 +38,11 @@ module.exports = [ selector: '#zoomout-btn', position: 'top' }, + { + translation: 'fullscreen', + selector: '#fullscreen-btn', + position: 'top' + }, { translation: 'identifyButton', selector: '#identifyBar-container', diff --git a/web/client/product/plugins.js b/web/client/product/plugins.js index bdff739f33..896e8dc01d 100644 --- a/web/client/product/plugins.js +++ b/web/client/product/plugins.js @@ -28,6 +28,7 @@ module.exports = { ZoomInPlugin: require('../plugins/ZoomIn'), ZoomOutPlugin: require('../plugins/ZoomOut'), ZoomAllPlugin: require('../plugins/ZoomAll'), + FullScreenPlugin: require('../plugins/FullScreen'), MapLoadingPlugin: require('../plugins/MapLoading'), AboutPlugin: require('./plugins/About'), HelpPlugin: require('../plugins/Help'), @@ -62,7 +63,7 @@ module.exports = { QueryPanelPlugin: require('../plugins/QueryPanel'), FeatureGridPlugin: require('../plugins/FeatureGrid'), TutorialPlugin: require('../plugins/Tutorial'), - ThemeSwitchePluginr: require('../plugins/ThemeSwitcher'), + ThemeSwitcherPlugin: require('../plugins/ThemeSwitcher'), ScrollTopPlugin: require('../plugins/ScrollTop') }, requires: { diff --git a/web/client/translations/data.de-DE b/web/client/translations/data.de-DE index 6465137ea9..4549769fa9 100644 --- a/web/client/translations/data.de-DE +++ b/web/client/translations/data.de-DE @@ -353,6 +353,10 @@ "zoomOutTooltip": "Zoom verringern", "zoomAllTooltip": "Zoom auf maximale Ausdehnung" }, + "fullscreen": { + "tooltipActivate": "Umschalten auf Vollbild", + "tooltipDeactivate": "Vollbild verlassen" + }, "helptexts": { "scaleBox": "Das ist die Hilfe für die ScaleBox", "zoomToMaxExtentButton": "Das ist die Hilfe für den ZoomToMaxExtentButton", @@ -815,6 +819,10 @@ "title": "Zoom Out", "text": "Click to reduce the map" }, + "fullscreen": { + "title": "Vollbild", + "text": "Umschalten auf Vollbild" + }, "identifyButton": { "title": "Info", "text": "Press the button to activate the tool, then click on the map to retrieve information from layers" diff --git a/web/client/translations/data.en-US b/web/client/translations/data.en-US index b8aadcfa4e..423b73a891 100644 --- a/web/client/translations/data.en-US +++ b/web/client/translations/data.en-US @@ -353,6 +353,10 @@ "zoomOutTooltip": "Decrease Zoom", "zoomAllTooltip": "Zoom To Max Extent" }, + "fullscreen": { + "tooltipActivate": "Switch to Full Screen", + "tooltipDeactivate": "Exit full screen" + }, "helptexts": { "scaleBox": "This is the helptext for the ScaleBox", "zoomToMaxExtentButton": "This is the helptext for the ZoomToMaxExtentButton", @@ -815,6 +819,10 @@ "title": "Zoom Out", "text": "Click to reduce the map" }, + "fullscreen": { + "title": "Full Screen", + "text": "Click to go full screen" + }, "identifyButton": { "title": "Info", "text": "Press the button to activate the tool, then click on the map to retrieve information from layers" diff --git a/web/client/translations/data.fr-FR b/web/client/translations/data.fr-FR index c96b299313..6ede70f4ac 100644 --- a/web/client/translations/data.fr-FR +++ b/web/client/translations/data.fr-FR @@ -355,6 +355,10 @@ "zoomOutTooltip": "Diminuer", "zoomAllTooltip": "Ajuster à l'extension des données" }, + "fullscreen": { + "tooltipActivate": "Basculer en plein écran", + "tooltipDeactivate": "Quitter plein écran" + }, "helptexts": { "scaleBox": "This is the helptext for the ScaleBox", "zoomToMaxExtentButton": "This is the helptext for the ZoomToMaxExtentButton", @@ -817,6 +821,10 @@ "title": "Zoom Out", "text": "Click to reduce the map" }, + "fullscreen": { + "title": "Basculer en plein écran", + "text": "Basculer en plein écran" + }, "identifyButton": { "title": "Info", "text": "Press the button to activate the tool, then click on the map to retrieve information from layers" diff --git a/web/client/translations/data.it-IT b/web/client/translations/data.it-IT index 9eba02a033..5d30b62468 100644 --- a/web/client/translations/data.it-IT +++ b/web/client/translations/data.it-IT @@ -353,6 +353,10 @@ "zoomOutTooltip": "Diminuisci Zoom", "zoomAllTooltip": "Zoom Alla Massima Estensione" }, + "fullscreen": { + "tooltipActivate": "Passa a schermo intero", + "tooltipDeactivate": "Esci da schermo intero" + }, "helptexts": { "scaleBox": "Questo è il testo di aiuto per ScaleBox", "zoomToMaxExtentButton": "Questo è il testo di aiuto per ZoomToMaxExtentButton", @@ -815,6 +819,10 @@ "title": "Zoom Out", "text": "Premi per ridurre la mappa" }, + "fullscreen": { + "title": "Schermo Intero", + "text": "Premi per passare a schermo intero" + }, "identifyButton": { "title": "Info", "text": "Premi il pulsante per attivare lo strumento, poi fai click sulla mappa per ottenere informazioni dal layer"