GridItem.js (5244B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 "use strict"; 6 7 const { 8 createElement, 9 createRef, 10 Fragment, 11 PureComponent, 12 } = require("resource://devtools/client/shared/vendor/react.mjs"); 13 const dom = require("resource://devtools/client/shared/vendor/react-dom-factories.js"); 14 const PropTypes = require("resource://devtools/client/shared/vendor/react-prop-types.mjs"); 15 const { 16 getFormatStr, 17 getStr, 18 } = require("resource://devtools/client/inspector/layout/utils/l10n.js"); 19 20 loader.lazyGetter(this, "Rep", function () { 21 return ChromeUtils.importESModule( 22 "resource://devtools/client/shared/components/reps/index.mjs" 23 ).REPS.Rep; 24 }); 25 loader.lazyGetter(this, "MODE", function () { 26 return ChromeUtils.importESModule( 27 "resource://devtools/client/shared/components/reps/index.mjs" 28 ).MODE; 29 }); 30 31 loader.lazyRequireGetter( 32 this, 33 "translateNodeFrontToGrip", 34 "resource://devtools/client/inspector/shared/utils.js", 35 true 36 ); 37 38 const Types = require("resource://devtools/client/inspector/grids/types.js"); 39 40 const { 41 highlightNode, 42 unhighlightNode, 43 } = require("resource://devtools/client/inspector/boxmodel/actions/box-model-highlighter.js"); 44 45 class GridItem extends PureComponent { 46 static get propTypes() { 47 return { 48 dispatch: PropTypes.func.isRequired, 49 getSwatchColorPickerTooltip: PropTypes.func.isRequired, 50 grid: PropTypes.shape(Types.grid).isRequired, 51 grids: PropTypes.arrayOf(PropTypes.shape(Types.grid)).isRequired, 52 onSetGridOverlayColor: PropTypes.func.isRequired, 53 onToggleGridHighlighter: PropTypes.func.isRequired, 54 setSelectedNode: PropTypes.func.isRequired, 55 }; 56 } 57 58 constructor(props) { 59 super(props); 60 61 this.swatchEl = createRef(); 62 63 this.onGridCheckboxClick = this.onGridCheckboxClick.bind(this); 64 this.onGridInspectIconClick = this.onGridInspectIconClick.bind(this); 65 this.setGridColor = this.setGridColor.bind(this); 66 } 67 68 componentDidMount() { 69 const tooltip = this.props.getSwatchColorPickerTooltip(); 70 71 let previousColor; 72 tooltip.addSwatch(this.swatchEl.current, { 73 onCommit: this.setGridColor, 74 onPreview: this.setGridColor, 75 onRevert: () => { 76 this.props.onSetGridOverlayColor( 77 this.props.grid.nodeFront, 78 previousColor 79 ); 80 }, 81 onShow: () => { 82 previousColor = this.props.grid.color; 83 }, 84 }); 85 } 86 87 componentWillUnmount() { 88 const tooltip = this.props.getSwatchColorPickerTooltip(); 89 tooltip.removeSwatch(this.swatchEl.current); 90 } 91 92 setGridColor() { 93 const color = this.swatchEl.current.dataset.color; 94 this.props.onSetGridOverlayColor(this.props.grid.nodeFront, color); 95 } 96 97 onGridCheckboxClick() { 98 const { grid, onToggleGridHighlighter } = this.props; 99 onToggleGridHighlighter(grid.nodeFront); 100 } 101 102 onGridInspectIconClick(nodeFront) { 103 const { setSelectedNode } = this.props; 104 setSelectedNode(nodeFront, { reason: "layout-panel" }); 105 nodeFront.scrollIntoView().catch(e => console.error(e)); 106 } 107 108 renderSubgrids() { 109 const { grid, grids } = this.props; 110 111 if (!grid.subgrids.length) { 112 return null; 113 } 114 115 const subgrids = grids.filter(g => grid.subgrids.includes(g.id)); 116 117 return dom.ul( 118 {}, 119 subgrids.map(g => { 120 return createElement(GridItem, { 121 key: g.id, 122 dispatch: this.props.dispatch, 123 getSwatchColorPickerTooltip: this.props.getSwatchColorPickerTooltip, 124 grid: g, 125 grids, 126 onSetGridOverlayColor: this.props.onSetGridOverlayColor, 127 onToggleGridHighlighter: this.props.onToggleGridHighlighter, 128 setSelectedNode: this.props.setSelectedNode, 129 }); 130 }) 131 ); 132 } 133 134 render() { 135 const { dispatch, grid } = this.props; 136 137 return createElement( 138 Fragment, 139 null, 140 dom.li( 141 {}, 142 dom.label( 143 {}, 144 dom.input({ 145 checked: grid.highlighted, 146 disabled: grid.disabled, 147 type: "checkbox", 148 value: grid.id, 149 onChange: this.onGridCheckboxClick, 150 title: getStr("layout.toggleGridHighlighter"), 151 }), 152 Rep({ 153 defaultRep: Rep.ElementNode, 154 mode: MODE.TINY, 155 object: translateNodeFrontToGrip(grid.nodeFront), 156 onDOMNodeMouseOut: () => dispatch(unhighlightNode()), 157 onDOMNodeMouseOver: () => dispatch(highlightNode(grid.nodeFront)), 158 onInspectIconClick: (_, e) => { 159 // Stoping click propagation to avoid firing onGridCheckboxClick() 160 e.stopPropagation(); 161 this.onGridInspectIconClick(grid.nodeFront); 162 }, 163 }) 164 ), 165 dom.button({ 166 className: "layout-color-swatch", 167 "data-color": grid.color, 168 ref: this.swatchEl, 169 style: { 170 backgroundColor: grid.color, 171 }, 172 title: getFormatStr("layout.colorSwatch.tooltip", grid.color), 173 }) 174 ), 175 this.renderSubgrids() 176 ); 177 } 178 } 179 180 module.exports = GridItem;