-
Notifications
You must be signed in to change notification settings - Fork 2.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[not ready] create fullscreen example and control #3977
Conversation
4c5aff4
to
f67bfa5
Compare
awesome work @colleenmcginnis !!
|
js/ui/control/fullscreen.js
Outdated
var container = this._container = DOM.create('div', className + '-group', map.getContainer()); | ||
var button = this._fullscreenButton = DOM.create('button', (className + '-icon ' + className + '-fullscreen'), this._container); | ||
button.id = 'fullscreen-button'; | ||
this._fullscreenButton.type = 'button'; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@colleenmcginnis Could you include an aria-label attribute on the button with value of say "Fullscreen" for accessibility?
Similar to how it's done for the navigation buttons https://github.com/mapbox/mapbox-gl-js/blob/master/js/ui/control/navigation_control.js#L95
js/ui/control/fullscreen.js
Outdated
util.setOptions(this, options); | ||
} | ||
|
||
Fullscreen.prototype = util.inherit(Control, { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We deprecated the Control
class, and now controls don't need to inherit from anything, but they do need to follow the implementation of IControl
(i.e. need onAdd
, onRemove
functions. You can also add a getDefaultPosition
function to replace the options object passed to the Control
).
js/ui/control/fullscreen.js
Outdated
if (window.innerHeight === screen.height) { | ||
button.classList.remove(className + '-shrink'); | ||
button.classList.add(className + '-fullscreen'); | ||
if (document.exitFullscreen) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think you may need to require
the window
util and use window.document.exitFullscreen
etc to get past the linting errors.
dist/mapbox-gl.css
Outdated
@@ -267,3 +274,11 @@ | |||
display:none; | |||
} | |||
} | |||
.pseudo-fullscreen { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This doesn't seem to be used (and we shouldn't need to support "pseudo-fullscreen" mode, as all browsers supported by gl-js should support the HTML5 fullscreen API).
js/ui/control/fullscreen.js
Outdated
|
||
_onClickFullscreen: function() { | ||
var mapContainer = map.getContainer(); | ||
var button = document.getElementById('fullscreen-button'); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Use this._fullscreenButton
rather than looking up the element by ID.
js/ui/control/fullscreen.js
Outdated
var className = 'mapboxgl-ctrl'; | ||
var container = this._container = DOM.create('div', className + '-group', map.getContainer()); | ||
var button = this._fullscreenButton = DOM.create('button', (className + '-icon ' + className + '-fullscreen'), this._container); | ||
button.id = 'fullscreen-button'; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Avoid assigning an ID -- IDs are required to be unique, and there may be more than one map with fullscreen control on a page.
f67bfa5
to
9d28a22
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looking good @colleenmcginnis -- just a couple small changes. In order to add the documentation you write to the website, you'll also need to add it in the documentation.yml
file with the other controls.
debug/index.html
Outdated
map.addControl(new mapboxgl.NavigationControl()); | ||
map.addControl(new mapboxgl.GeolocateControl()); | ||
map.addControl(new mapboxgl.ScaleControl()); | ||
map.addControl(new mapboxgl.FullscreenControl()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
can you revert the changes on this file so it matches the debug/index.html
file on master? you can add a new debug page for controls instead if you want to.
dist/mapbox-gl.css
Outdated
@@ -85,7 +85,14 @@ | |||
.mapboxgl-ctrl-icon.mapboxgl-ctrl-geolocate.watching { | |||
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D%270%200%2020%2020%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%0D%0A%20%20%3Cpath%20style%3D%27fill%3A%2300f%3B%27%20d%3D%27M10%204C9%204%209%205%209%205L9%205.1A5%205%200%200%200%205.1%209L5%209C5%209%204%209%204%2010%204%2011%205%2011%205%2011L5.1%2011A5%205%200%200%200%209%2014.9L9%2015C9%2015%209%2016%2010%2016%2011%2016%2011%2015%2011%2015L11%2014.9A5%205%200%200%200%2014.9%2011L15%2011C15%2011%2016%2011%2016%2010%2016%209%2015%209%2015%209L14.9%209A5%205%200%200%200%2011%205.1L11%205C11%205%2011%204%2010%204zM10%206.5A3.5%203.5%200%200%201%2013.5%2010%203.5%203.5%200%200%201%2010%2013.5%203.5%203.5%200%200%201%206.5%2010%203.5%203.5%200%200%201%2010%206.5zM10%208.3A1.8%201.8%200%200%200%208.3%2010%201.8%201.8%200%200%200%2010%2011.8%201.8%201.8%200%200%200%2011.8%2010%201.8%201.8%200%200%200%2010%208.3z%27%20%2F%3E%0D%0A%3C%2Fsvg%3E"); | |||
} | |||
|
|||
.mapboxgl-ctrl-icon.mapboxgl-ctrl-fullscreen { | |||
padding: 5px; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think you need the padding here because its included here
dist/mapbox-gl.css
Outdated
background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxOS4wLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0iTGF5ZXJfMSIKICAgeD0iMHB4IgogICB5PSIwcHgiCiAgIHZpZXdCb3g9IjAgMCAyMCAyMCIKICAgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjAgMjA7IgogICB4bWw6c3BhY2U9InByZXNlcnZlIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkxIHIxMzcyNSIKICAgc29kaXBvZGk6ZG9jbmFtZT0iZnVsbHNjcmVlbi5zdmciPjxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQxODUiPjxyZGY6UkRGPjxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj48ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD48ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+PGRjOnRpdGxlPjwvZGM6dGl0bGU+PC9jYzpXb3JrPjwvcmRmOlJERj48L21ldGFkYXRhPjxkZWZzCiAgICAgaWQ9ImRlZnM0MTgzIiAvPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTQ3MSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI2OTUiCiAgICAgaWQ9Im5hbWVkdmlldzQxODEiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjExLjMxMzcwOCIKICAgICBpbmtzY2FwZTpjeD0iMTQuNjk4MjgiCiAgICAgaW5rc2NhcGU6Y3k9IjEwLjUyNjY4OSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iNjk3IgogICAgIGlua3NjYXBlOndpbmRvdy15PSIyOTgiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJMYXllcl8xIgogICAgIGlua3NjYXBlOnNuYXAtYmJveD0idHJ1ZSIKICAgICBpbmtzY2FwZTpiYm94LXBhdGhzPSJ0cnVlIgogICAgIGlua3NjYXBlOm9iamVjdC1wYXRocz0idHJ1ZSIKICAgICBpbmtzY2FwZTpiYm94LW5vZGVzPSJ0cnVlIgogICAgIGlua3NjYXBlOm9iamVjdC1ub2Rlcz0idHJ1ZSI+PGlua3NjYXBlOmdyaWQKICAgICAgIHR5cGU9Inh5Z3JpZCIKICAgICAgIGlkPSJncmlkNjA3NiIgLz48L3NvZGlwb2RpOm5hbWVkdmlldz48cGF0aAogICAgIGQ9Ik0gNSA0IEMgNC41IDQgNCA0LjUgNCA1IEwgNCA2IEwgNCA5IEwgNC41IDkgTCA1Ljc3NzM0MzggNy4yOTY4NzUgQyA2Ljc3NzEzMTkgOC4wNjAyMTMxIDcuODM1NzY1IDguOTU2NTcyOCA4Ljg5MDYyNSAxMCBDIDcuODI1NzEyMSAxMS4wNjMzIDYuNzc2MTc5MSAxMS45NTE2NzUgNS43ODEyNSAxMi43MDcwMzEgTCA0LjUgMTEgTCA0IDExIEwgNCAxNSBDIDQgMTUuNSA0LjUgMTYgNSAxNiBMIDkgMTYgTCA5IDE1LjUgTCA3LjI3MzQzNzUgMTQuMjA1MDc4IEMgOC4wNDI4OTMxIDEzLjE4Nzg4NiA4LjkzOTU0NDEgMTIuMTMzNDgxIDkuOTYwOTM3NSAxMS4wNjgzNTkgQyAxMS4wNDIzNzEgMTIuMTQ2OTkgMTEuOTQyMDkzIDEzLjIxMTIgMTIuNzA3MDMxIDE0LjIxODc1IEwgMTEgMTUuNSBMIDExIDE2IEwgMTQgMTYgTCAxNSAxNiBDIDE1LjUgMTYgMTYgMTUuNSAxNiAxNSBMIDE2IDE0IEwgMTYgMTEgTCAxNS41IDExIEwgMTQuMjA1MDc4IDEyLjcyNjU2MiBDIDEzLjE3Nzk4NSAxMS45NDk2MTcgMTIuMTEyNzE4IDExLjA0MzU3NyAxMS4wMzcxMDkgMTAuMDA5NzY2IEMgMTIuMTUxODU2IDguOTgxMDYxIDEzLjIyNDM0NSA4LjA3OTg2MjQgMTQuMjI4NTE2IDcuMzA0Njg3NSBMIDE1LjUgOSBMIDE2IDkgTCAxNiA1IEMgMTYgNC41IDE1LjUgNCAxNSA0IEwgMTEgNCBMIDExIDQuNSBMIDEyLjcwMzEyNSA1Ljc3NzM0MzggQyAxMS45MzI2NDcgNi43ODY0ODM0IDExLjAyNjY5MyA3Ljg1NTQ3MTIgOS45NzA3MDMxIDguOTE5OTIxOSBDIDguOTU4NDczOSA3LjgyMDQ5NDMgOC4wNjk4NzY3IDYuNzYyNzE4OCA3LjMwNDY4NzUgNS43NzE0ODQ0IEwgOSA0LjUgTCA5IDQgTCA2IDQgTCA1IDQgeiAiCiAgICAgaWQ9InBhdGg0MTY5IiAvPjwvc3ZnPg=="); | ||
} | ||
.mapboxgl-ctrl-icon.mapboxgl-ctrl-shrink { | ||
padding: 5px; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
same as L89
js/ui/control/fullscreen_control.js
Outdated
const util = require('../../util/util'); | ||
const window = require('../../util/window'); | ||
|
||
class FullscreenControl { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
can you add documentation markup here? here is an example from the NavigationControl
/**
* A `NavigationControl` control contains zoom buttons and a compass.
*
* @implements {IControl}
* @example
* var nav = new mapboxgl.NavigationControl();
* map.addControl(nav, 'top-left');
* @see [Display map navigation controls](https://www.mapbox.com/mapbox-gl-js/example/navigation/)
* @see [Add a third party vector tile source](https://www.mapbox.com/mapbox-gl-js/example/third-party/)
*/
package.json
Outdated
@@ -117,7 +117,7 @@ | |||
"build-docs": "documentation build --github --format html --config documentation.yml --theme ./docs/_theme --output docs/api/", | |||
"build": "npm run build-docs # invoked by publisher when publishing docs on the mb-pages branch", | |||
"start-docs": "npm run build-min && npm run build-docs && jekyll serve --watch", | |||
"lint": "eslint --ignore-path .gitignore js test bench docs/_posts/examples/*.html debug/*.html", | |||
"lint": "eslint --fix --ignore-path .gitignore js test bench docs/_posts/examples/*.html debug/*.html", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
please revert this as well 😉
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I recently learned that you can do this with npm:
npm run lint -- --fix
.. and it'll pass the --fix
flag down to the eslint
command 😄
js/ui/control/fullscreen_control.js
Outdated
util.bindAll([ | ||
'_isFullscreen', | ||
'_onClickFullscreen', | ||
'_onKeyDown', |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You can get rid of _onKeyDown
here -- I think you deleted that function from a previous iteration.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also I don't think you need to bind _isFullscreen
bc its not used as an event listener.
js/ui/control/fullscreen_control.js
Outdated
button.setAttribute("aria-label", "Toggle fullscreen"); | ||
this._fullscreenButton.addEventListener('click', this._onClickFullscreen); | ||
this._mapContainer = map.getContainer(); | ||
window.document.addEventListener('webkitfullscreenchange', this._changeIcon); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
webkitfullscreenchange
is specific to WebKit -- you'll need to do feature detection to determine the appropriate event name for other browsers. Here's how the Leaflet equivalent does it.
js/ui/control/fullscreen_control.js
Outdated
} | ||
|
||
onRemove() { | ||
this._container.parentNode.removeChild(this._container); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
onRemove
should unbind the fullscreenchange event handler, using window.document.removeEventListener
.
js/ui/control/fullscreen_control.js
Outdated
return this._fullscreen; | ||
} | ||
|
||
_changeIcon() { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
_changeIcon
, as the event handler bound to fullscreenchange event, needs to check if the event corresponds to the appropriate page element. There might be more than one map on the page, or other elements that go fullscreen. Here's the equivalent code in the Leaflet plugin.
js/ui/control/fullscreen_control.js
Outdated
} | ||
|
||
_onClickFullscreen() { | ||
if (this._isFullscreen()) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There doesn't seem to be a case in this function for IE11 (msRequestFullscreen
/ msExitFullscreen
).
d05e180
to
945b047
Compare
@jfirebaugh - @mollymerp and I worked on addressing your comments the other day. Can you take another look when you get the chance? Thanks! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice work! Just one last thing I noticed.
src/ui/control/fullscreen_control.js
Outdated
onRemove() { | ||
this._container.parentNode.removeChild(this._container); | ||
this._map = null; | ||
window.document.removeEventListener(this._fullscreenchange); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A second argument is needed here -- removeEventListener(this._fullscreenchange, this._changeIcon)
.
Creates a fullscreen control and an example using the fullscreen control to address #1824.
Hoping @mollymerp and @lucaswoj can help with some things that still need to be resolved:
master
andmb-pages
)?js/ui/control/fullscreen.js
file that I'm not sure how to interpret or resolve.