UNPKG

@anterostecnologia/anteros-react-admin

Version:

Anteros components for React - Admin menu

454 lines (407 loc) 12.8 kB
import React, { Component } from "react"; import PropTypes from "prop-types"; import { AnterosButton, AnterosDropdownButton, AnterosDropdownMenu, AnterosAdvancedDropdown, AnterosAdvancedDropdownMenu, AnterosAdvancedDropdownToggle, } from "@anterostecnologia/anteros-react-buttons"; import { AnterosText } from "@anterostecnologia/anteros-react-label"; import AnterosMediaQuery from "./AnterosMediaQuery"; import { AnterosToolbar, AnterosToolbarGroup, } from "@anterostecnologia/anteros-react-containers"; import { Link } from "react-router-dom"; import { AnterosInputSearch } from "@anterostecnologia/anteros-react-querybuilder"; import { AnterosImage } from "@anterostecnologia/anteros-react-image"; import AnterosUserMenu from "./AnterosUserMenu"; import { autoBind } from "@anterostecnologia/anteros-react-core"; import CommandPalette from "react-command-palette"; import sublime from "react-command-palette/dist/themes/sublime-theme"; import "react-command-palette/dist/themes/chrome.css"; const wrapperStyle = { fontFamily: "arial", fontSize: "12px", color: "rgb(172, 172, 172)", marginBottom: "6px", display: "inline-block", }; const kbdStyle = { backgroundColor: "rgb(23, 23, 23)", fontSize: "12px", color: "#b9b9b9", padding: "2px 4px", marginRight: "6px", borderRadius: "4px", }; function CommandHeader() { const itemStyle = { paddingRight: "32px" }; return ( <div style={wrapperStyle}> <span style={itemStyle}>Digite um comando</span> <span style={itemStyle}> <kbd style={kbdStyle}>↑↓</kbd> p/navegar </span> <span style={itemStyle}> <kbd style={kbdStyle}>enter</kbd> p/selecionar </span> <span style={itemStyle}> <kbd style={kbdStyle}>esc</kbd> p/sair </span> </div> ); } function chromeCommand(suggestion) { const { name, highlight = [], category, shortcut, color } = suggestion; // handle simple highlight when searching a single key if (!Array.isArray(highlight)) { return ( <div className="chrome-suggestion"> <span style={{backgroundColor:color.backgroundColor, color: color.color}} className={`chrome-category`}>{category}</span> <span dangerouslySetInnerHTML={{ __html: highlight || name }} /> <kbd className="chrome-shortcut">{shortcut}</kbd> </div> ); } return ( <div className="chrome-suggestion"> <span style={{backgroundColor:color.backgroundColor, color: color.color}} dangerouslySetInnerHTML={{ __html: highlight[1] || category }} className={`chrome-category ${category}`} /> <span dangerouslySetInnerHTML={{ __html: highlight[0] || name }} /> <kbd className="chrome-shortcut">{shortcut}</kbd> </div> ); } function isBase64(str) { try { return btoa(atob(str)) == str; } catch (err) { return false; } } export default class AnterosMainHeader extends Component { constructor(props) { super(props); this.toggleScreenFull = this.toggleScreenFull.bind(this); this.toggleSidebar = this.toggleSidebar.bind(this); this.toggleUserDropdownMenu = this.toggleUserDropdownMenu.bind(this); this.state = { customizer: false, userDropdownMenu: false, quickLinksDropdownMenu: false, }; autoBind(this); } toggleSidebar(event) { const open = !this.props.sidebarOpen; this.props.onSetOpenSidebar(open); } toggleScreenFull() { var body = document.body; if ((body.className + " ").indexOf("full-screen") === -1) { var b = document.getElementsByTagName("body")[0]; b.className += "full-screen"; if (document.documentElement.requestFullscreen) { document.documentElement.requestFullscreen(); } else if (document.documentElement.mozRequestFullScreen) { document.documentElement.mozRequestFullScreen(); } else if (document.documentElement.webkitRequestFullscreen) { document.documentElement.webkitRequestFullscreen(); } else if (document.documentElement.msRequestFullscreen) { document.documentElement.msRequestFullscreen(); } } else { var bd = document.getElementsByTagName("body")[0]; bd.className = bd.className.replace(/\bfull-screen\b/, ""); if (document.exitFullscreen) { document.exitFullscreen(); } else if (document.mozCancelFullScreen) { document.mozCancelFullScreen(); } else if (document.webkitExitFullscreen) { document.webkitExitFullscreen(); } } } toggleUserDropdownMenu() { this.setState({ ...this.state, userDropdownMenu: !this.state.userDropdownMenu, }); } toggleQuickLinksDropdownMenu() { this.setState({ ...this.state, quickLinksDropdownMenu: !this.state.quickLinksDropdownMenu, }); } static get componentName() { return "AnterosMainHeader"; } onButtonClick(event, button) { let bb = this.btnQuickLinkRef.button.getBoundingClientRect(); if (this.props.onQuickLinkClick) { this.props.onQuickLinkClick(bb.left, bb.top); } } render() { let userActions; let quickLinks; let toolbarEnd; let toolbarCenter; if (this.props.children) { let arrChildren = React.Children.toArray(this.props.children); arrChildren.forEach(function (child) { if (child.type && child.type.componentName === "UserActions") { userActions = child.props.children; } else if (child.type && child.type.componentName === "QuickLinks") { quickLinks = child.props.children; } else if (child.type && child.type.componentName === "ToolbarEnd") { toolbarEnd = child.props.children; } else if (child.type && child.type.componentName === "ToolbarCenter") { toolbarCenter = child.props.children; } }); } const { horizontalMenu, logoNormal, sidebarOpen, onQuickLinkClick, commands, } = this.props; let imgUser = this.props.avatar; let isB64 = isBase64(imgUser); return ( <AnterosToolbar> <AnterosToolbarGroup justifyContent="start"> {horizontalMenu || sidebarOpen ? ( <div className="site-logo"> <Link to="/" className="logo-normal"> {typeof logoNormal==='object'?<logoNormal/>:<img src={logoNormal} alt="site-logo" />} </Link> </div> ) : null} {horizontalMenu ? null : this.props.showToggleSidebar? <AnterosButton circle medium icon="fal fa-bars" iconSize="24px" color={this.props.toolbarIconColor} onButtonClick={this.toggleSidebar} hintPosition="bottom" />:null } {quickLinks ? ( <AnterosDropdownButton medium icon="fab fa-buromobelexperte" iconSize="24px" backgroundColor={this.props.toolbarIconBackgroundColor} color={this.props.toolbarIconColor} hintPosition="bottom" > <AnterosDropdownMenu style={{ paddingTop: "0px", border: "1px solid #e0e0e0" }} styleHeader={{ backgroundColor: this.props.quickLinkHeaderColor, color: this.props.toolbarIconColor, }} title={"Links rápidos"} > {quickLinks} </AnterosDropdownMenu> </AnterosDropdownButton> ) : null} {onQuickLinkClick ? ( <AnterosButton medium ref={(ref) => (this.btnQuickLinkRef = ref)} icon="fab fa-buromobelexperte" iconSize="24px" backgroundColor={this.props.toolbarIconBackgroundColor} color={this.props.toolbarIconColor} onButtonClick={this.onButtonClick} hintPosition="bottom" ></AnterosButton> ) : null} {commands && commands.length > 0 ? ( <CommandPaletteButton toolbarIconColor={this.props.toolbarIconColor} toolbarIconBackgroundColor={this.props.toolbarIconBackgroundColor} commands={commands} /> ) : null} {this.props.showInputSearch ? ( <AnterosMediaQuery minDeviceWidth={1224}> <AnterosInputSearch placeHolder="Procurar" /> </AnterosMediaQuery> ) : null} </AnterosToolbarGroup> <AnterosToolbarGroup justifyContent="center" colSize="col-sm-2"> {toolbarCenter} </AnterosToolbarGroup> <AnterosToolbarGroup justifyContent="end"> {toolbarEnd} <AnterosAdvancedDropdown className="user-profile user-menu" isOpen={this.state.userDropdownMenu} toggle={this.toggleUserDropdownMenu} > <AnterosAdvancedDropdownToggle caret> <AnterosImage src={ imgUser && isB64 ? "data:image;base64," + imgUser : imgUser } circle={this.props.avatarWidth === this.props.avatarHeight} rounded={this.props.avatarWidth !== this.props.avatarHeight} width={this.props.avatarWidth} height={this.props.avatarHeight} /> <AnterosText text={this.props.userName} fontSize="12px" /> </AnterosAdvancedDropdownToggle> <AnterosAdvancedDropdownMenu right> <AnterosUserMenu userName={this.props.userName} email={this.props.email} > {userActions} </AnterosUserMenu> </AnterosAdvancedDropdownMenu> </AnterosAdvancedDropdown> </AnterosToolbarGroup> </AnterosToolbar> ); } } AnterosMainHeader.propTypes = { showInputSearch: PropTypes.bool.isRequired, toolbarIconColor: PropTypes.any, showToggleSidebar: PropTypes.bool.isRequired }; AnterosMainHeader.defaultPropTypes = { showInputSearch: true, quickLinkHeaderColor: "blue", toolbarIconColor: "white", showToggleSidebar: true }; export class QuickLinks extends Component { constructor(props) { super(props); autobind(this); } static get componentName() { return "QuickLinks"; } render() { return null; } } class CommandPaletteButton extends Component { constructor(props){ super(props); this.state = {commandOpen: false}; autoBind(this); } onButtonClick(event) { this.setState({...this.state, commandOpen: !this.state.commandOpen}); } onRequestClose(){ this.setState({...this.state, commandOpen: false}); } onAfterOpen(){ this.setState({...this.state, commandOpen: true}); } render() { return ( <CommandPalette alwaysRenderCommands closeOnSelect={true} highlightFirstSuggestion hotKeys="command+shift+p" maxDisplayed={10} commands={this.props.commands} options={{ keys: [ 'name', 'category' ] }} placeholder="" resetInputOnOpen reactModalParentSelector="body" shouldReturnFocusAfterClose renderCommand={chromeCommand} trigger={ <AnterosButton medium icon="far fa-terminal" iconSize="24px" hint="Comandos ⇧⌘P" backgroundColor={this.props.toolbarIconBackgroundColor} color={this.props.toolbarIconColor} hintPosition="bottom" onButtonClick={this.onButtonClick} ></AnterosButton> } open={this.state.commandOpen} header={<CommandHeader />} theme={sublime} /> ); } } export class ButtonQuickLinks extends Component { constructor(props) { super(props); autobind(this); } static get componentName() { return "ButtonQuickLinks"; } render() { return null; } } export class UserActions extends Component { constructor(props) { super(props); autobind(this); } static get componentName() { return "UserActions"; } render() { return null; } } export class ToolbarEnd extends Component { constructor(props) { super(props); autobind(this); } static get componentName() { return "ToolbarEnd"; } render() { return null; } } export class ToolbarCenter extends Component { constructor(props) { super(props); autobind(this); } static get componentName() { return "ToolbarCenter"; } render() { return null; } }