Files
tubestation/devtools/client/responsive.html/components/device-adder.js
J. Ryan Stinnett e450b03956 Bug 1321675 - Move device adder below devices. r=gl
This gets closer to Helen's mockup.  The spacing is a bit tight.  When adjusting
the modal size, I used the most popular DevTools screen resolution (1366 x 768)
as a reference.

MozReview-Commit-ID: 4EjJKKhuxpA
2017-02-07 16:57:03 -06:00

253 lines
6.1 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* eslint-env browser */
"use strict";
const { DOM: dom, createClass, createFactory, PropTypes, addons } =
require("devtools/client/shared/vendor/react");
const { getFormatStr, getStr } = require("../utils/l10n");
const Types = require("../types");
const ViewportDimension = createFactory(require("./viewport-dimension"));
module.exports = createClass({
displayName: "DeviceAdder",
propTypes: {
devices: PropTypes.shape(Types.devices).isRequired,
viewportTemplate: PropTypes.shape(Types.viewport).isRequired,
onAddCustomDevice: PropTypes.func.isRequired,
},
mixins: [ addons.PureRenderMixin ],
getInitialState() {
return {};
},
componentWillReceiveProps(nextProps) {
let {
width,
height,
} = nextProps.viewportTemplate;
this.setState({
width,
height,
});
},
onChangeSize(width, height) {
this.setState({
width,
height,
});
},
onDeviceAdderShow() {
this.setState({
deviceAdderDisplayed: true,
});
},
onDeviceAdderSave() {
let {
devices,
onAddCustomDevice,
} = this.props;
if (!this.pixelRatioInput.checkValidity()) {
return;
}
if (devices.custom.find(device => device.name == this.nameInput.value)) {
this.nameInput.setCustomValidity("Device name already in use");
return;
}
this.setState({
deviceAdderDisplayed: false,
});
onAddCustomDevice({
name: this.nameInput.value,
width: this.state.width,
height: this.state.height,
pixelRatio: parseFloat(this.pixelRatioInput.value),
userAgent: this.userAgentInput.value,
touch: this.touchInput.checked,
});
},
render() {
let {
devices,
viewportTemplate,
} = this.props;
let {
deviceAdderDisplayed,
height,
width,
} = this.state;
if (!deviceAdderDisplayed) {
return dom.div(
{
id: "device-adder"
},
dom.button(
{
id: "device-adder-show",
onClick: this.onDeviceAdderShow,
},
getStr("responsive.addDevice")
)
);
}
// If a device is currently selected, fold its attributes into a single object for use
// as the starting values of the form. If no device is selected, use the values for
// the current window.
let deviceName;
let normalizedViewport = Object.assign({}, viewportTemplate);
if (viewportTemplate.device) {
let device = devices[viewportTemplate.deviceType].find(d => {
return d.name == viewportTemplate.device;
});
deviceName = getFormatStr("responsive.customDeviceNameFromBase", device.name);
Object.assign(normalizedViewport, {
pixelRatio: device.pixelRatio,
userAgent: device.userAgent,
touch: device.touch,
});
} else {
deviceName = getStr("responsive.customDeviceName");
Object.assign(normalizedViewport, {
pixelRatio: window.devicePixelRatio,
userAgent: navigator.userAgent,
touch: false,
});
}
return dom.div(
{
id: "device-adder"
},
dom.div(
{
id: "device-adder-content",
},
dom.div(
{
id: "device-adder-column-1",
},
dom.label(
{
id: "device-adder-name",
},
dom.span(
{
className: "device-adder-label",
},
getStr("responsive.deviceAdderName")
),
dom.input({
defaultValue: deviceName,
ref: input => {
this.nameInput = input;
},
})
),
dom.label(
{
id: "device-adder-size",
},
dom.span(
{
className: "device-adder-label"
},
getStr("responsive.deviceAdderSize")
),
ViewportDimension({
viewport: {
width,
height,
},
onChangeSize: this.onChangeSize,
onRemoveDeviceAssociation: () => {},
})
),
dom.label(
{
id: "device-adder-pixel-ratio",
},
dom.span(
{
className: "device-adder-label"
},
getStr("responsive.deviceAdderPixelRatio")
),
dom.input({
type: "number",
step: "any",
defaultValue: normalizedViewport.pixelRatio,
ref: input => {
this.pixelRatioInput = input;
},
})
)
),
dom.div(
{
id: "device-adder-column-2",
},
dom.label(
{
id: "device-adder-user-agent",
},
dom.span(
{
className: "device-adder-label"
},
getStr("responsive.deviceAdderUserAgent")
),
dom.input({
defaultValue: normalizedViewport.userAgent,
ref: input => {
this.userAgentInput = input;
},
})
),
dom.label(
{
id: "device-adder-touch",
},
dom.span(
{
className: "device-adder-label"
},
getStr("responsive.deviceAdderTouch")
),
dom.input({
defaultChecked: normalizedViewport.touch,
type: "checkbox",
ref: input => {
this.touchInput = input;
},
})
)
),
),
dom.button(
{
id: "device-adder-save",
onClick: this.onDeviceAdderSave,
},
getStr("responsive.deviceAdderSave")
)
);
},
});