85 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // Copyright (c) 2018 Dominic Masters
 | |
| //
 | |
| // MIT License
 | |
| //
 | |
| // Permission is hereby granted, free of charge, to any person obtaining
 | |
| // a copy of this software and associated documentation files (the
 | |
| // "Software"), to deal in the Software without restriction, including
 | |
| // without limitation the rights to use, copy, modify, merge, publish,
 | |
| // distribute, sublicense, and/or sell copies of the Software, and to
 | |
| // permit persons to whom the Software is furnished to do so, subject to
 | |
| // the following conditions:
 | |
| //
 | |
| // The above copyright notice and this permission notice shall be
 | |
| // included in all copies or substantial portions of the Software.
 | |
| //
 | |
| // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 | |
| // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 | |
| // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 | |
| // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 | |
| // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 | |
| // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 | |
| // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | |
| 
 | |
| import React from 'react';
 | |
| import { NavLink } from 'react-router-dom';
 | |
| 
 | |
| import Styles from './Button.scss';
 | |
| 
 | |
| export default props => {
 | |
|   let newProps = {...props};
 | |
|   let {
 | |
|     className, href, to, style, type, value, children,
 | |
|     error, danger, primary, warning, manager
 | |
|   } = newProps;
 | |
| 
 | |
|   [
 | |
|     "style", "value", "href", "to", "children", "error", "danger", "primary",
 | |
|     "warning", "manager"
 | |
|   ].forEach(e => delete newProps[e]);
 | |
| 
 | |
|   type = type;
 | |
|   children = children || value;
 | |
| 
 | |
|   if(primary) style = "primary";
 | |
|   if(warning) style = "warning";
 | |
|   if(error || danger) style = "danger";
 | |
| 
 | |
| 
 | |
|   let ElementType = "button";//Upper Camel-Case because of react requriements
 | |
|   let clazzes = "o-btn";
 | |
| 
 | |
|   //Basic Element Determining
 | |
|   if(type) {
 | |
|     //Buttons and Input Buttons
 | |
|     clazzes += " is-button";
 | |
| 
 | |
|   } else if(href) {
 | |
|     //Anchor Tags!
 | |
|     ElementType = "a";
 | |
|     clazzes += " is-link is-anchor";
 | |
|     newProps.href = to || href;
 | |
| 
 | |
|   } else if(to) {
 | |
|     ElementType = NavLink;
 | |
|     clazzes += " is-link is-nav-link";
 | |
|     newProps.to = to || href;
 | |
| 
 | |
|   } else {
 | |
|     //Everything Else (button without a type);
 | |
|     type = "button";
 | |
|     clazzes += " is-not-button";
 | |
|   }
 | |
| 
 | |
|   if(style) clazzes += ` o-btn--style-${style}`;
 | |
|   if(className) clazzes += ` ${className}`;
 | |
| 
 | |
|   return (
 | |
|     <ElementType {...newProps} className={clazzes}>
 | |
|       <span className={"o-btn__inner"+(style?` o-btn--style-${style}__inner`:"")}>
 | |
|         { children }
 | |
|       </span>
 | |
|     </ElementType>
 | |
|   );
 | |
| }
 |