UNPKG

15.5 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../../src/AddToCalendar/AddToCalendar.jsx"],"names":["helpers","HelpersClass","styleDropdown","ReactAddToCalendar","props","state","optionsOpen","isCrappyIE","toggleCalendarDropdown","bind","handleDropdownLinkClick","String","prototype","startsWith","searchString","position","indexOf","window","navigator","msSaveOrOpenBlob","Blob","setState","showOptions","isTouchDevice","document","addEventListener","removeEventListener","e","preventDefault","url","currentTarget","getAttribute","isMobile","filename","blob","type","link","createElement","href","URL","createObjectURL","setAttribute","body","appendChild","click","removeChild","open","self","items","listItems","map","listItem","currentItem","Object","keys","currentLabel","icon","displayItemIcons","currentIcon","getRandomKey","color","buildUrl","event","buttonLabel","buttonIcon","template","buttonTemplate","iconPlacement","buttonClassPrefix","buttonIconClass","iconPrefix","useFontAwesomeIcons","mainButtonIconClass","buttonClass","buttonClassClosed","buttonClassOpen","buttonWrapperClass","options","renderDropdown","addToCalendarBtn","renderButton","width","rootClass","Component","displayName","propTypes","PropTypes","string","object","bool","dropdownClass","shape","title","description","location","startTime","endTime","isRequired","arrayOf","defaultProps","caret","apple","google","outlook","outlookcom","yahoo"],"mappings":"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","sourcesContent":["import React, { Component } from 'react';\nimport { css } from 'emotion';\nimport PropTypes from 'prop-types';\nimport Button from '@lskjs/button';\n\nimport HelpersClass from './helpers';\n\nconst helpers = new HelpersClass();\n\nconst styleDropdown = css`\n background-color: #fff;\n border: 1px solid #9b9b9b;\n border-radius: 2px;\n padding: 5px 10px;\n margin-top: 4px;\n > ul {\n margin-bottom: 0;\n }\n`;\n\nexport default class ReactAddToCalendar extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n optionsOpen: props.optionsOpen || false,\n isCrappyIE: false,\n };\n\n this.toggleCalendarDropdown = this.toggleCalendarDropdown.bind(this);\n this.handleDropdownLinkClick = this.handleDropdownLinkClick.bind(this);\n }\n\n componentWillMount() {\n // polyfill for startsWith to fix IE bug\n if (!String.prototype.startsWith) {\n String.prototype.startsWith = function(searchString, position) {\n position = position || 0;\n return this.indexOf(searchString, position) === position;\n };\n }\n\n let isCrappyIE = false;\n if (typeof window !== 'undefined' && window.navigator.msSaveOrOpenBlob && window.Blob) {\n isCrappyIE = true;\n }\n\n this.setState({ isCrappyIE });\n }\n\n toggleCalendarDropdown() {\n const showOptions = !this.state.optionsOpen;\n\n if (!isTouchDevice()) {\n if (showOptions) {\n document.addEventListener('click', this.toggleCalendarDropdown, false);\n } else {\n document.removeEventListener('click', this.toggleCalendarDropdown);\n }\n }\n\n this.setState({ optionsOpen: showOptions });\n }\n\n handleDropdownLinkClick(e) {\n e.preventDefault();\n const url = e.currentTarget.getAttribute('href');\n\n if (!helpers.isMobile() && (url.startsWith('data') || url.startsWith('BEGIN'))) {\n const filename = 'download.ics';\n const blob = new Blob([url], { type: 'text/calendar;charset=utf-8' });\n\n if (this.state.isCrappyIE) {\n window.navigator.msSaveOrOpenBlob(blob, filename);\n } else {\n /** **************************************************************\n // many browsers do not properly support downloading data URIs\n // (even with \"download\" attribute in use) so this solution\n // ensures the event will download cross-browser\n *************************************************************** */\n const link = document.createElement('a');\n link.href = window.URL.createObjectURL(blob);\n link.setAttribute('download', filename);\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n } else {\n window.open(url, '_blank');\n }\n\n this.toggleCalendarDropdown();\n }\n\n renderDropdown() {\n const self = this;\n\n const items = this.props.listItems.map(listItem => {\n const currentItem = Object.keys(listItem)[0];\n const currentLabel = listItem[currentItem];\n\n let icon = null;\n if (self.props.displayItemIcons) {\n const currentIcon = currentItem === 'outlook' || currentItem === 'outlookcom' ? 'windows' : currentItem;\n icon = <i className={`fa fa-${currentIcon}`} />;\n }\n\n return (\n <li key={helpers.getRandomKey()}>\n <a\n className={`${currentItem}-link`}\n style={{ color: '#4a4a4a' }}\n onClick={self.handleDropdownLinkClick}\n href={helpers.buildUrl(self.props.event, currentItem, self.state.isCrappyIE)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {icon}\n {currentLabel}\n </a>\n </li>\n );\n });\n\n return (\n <div className={styleDropdown}>\n <ul>{items}</ul>\n </div>\n );\n }\n\n renderButton() {\n let { buttonLabel } = this.props;\n let buttonIcon = null;\n const template = Object.keys(this.props.buttonTemplate);\n\n if (template[0] !== 'textOnly') {\n const iconPlacement = this.props.buttonTemplate[template];\n const buttonClassPrefix =\n this.props.buttonIconClass === 'react-add-to-calendar__icon--'\n ? `${this.props.buttonIconClass}${iconPlacement}`\n : this.props.buttonIconClass;\n const iconPrefix = this.props.useFontAwesomeIcons ? 'fa fa-' : '';\n\n const mainButtonIconClass =\n template[0] === 'caret' ? (this.state.optionsOpen ? 'caret-up' : 'caret-down') : template[0];\n\n const buttonIconClass = `${buttonClassPrefix} ${iconPrefix}${mainButtonIconClass}`;\n\n buttonIcon = <i className={buttonIconClass} />;\n buttonLabel =\n iconPlacement === 'right' ? (\n <span>\n {`${buttonLabel} `}\n {buttonIcon}\n </span>\n ) : (\n <span>\n {buttonIcon}\n {` ${buttonLabel}`}\n </span>\n );\n }\n\n const buttonClass = this.state.optionsOpen\n ? `${this.props.buttonClassClosed} ${this.props.buttonClassOpen}`\n : this.props.buttonClassClosed;\n\n return (\n <div className={this.props.buttonWrapperClass}>\n <Button\n componentClass=\"a\"\n paint=\"primary\"\n view=\"text\"\n bordered\n block\n className={buttonClass}\n onClick={this.toggleCalendarDropdown}\n >\n {buttonLabel}\n </Button>\n </div>\n );\n }\n\n render() {\n let options = null;\n if (this.state.optionsOpen) {\n options = this.renderDropdown();\n }\n\n let addToCalendarBtn = null;\n if (this.props.event) {\n addToCalendarBtn = this.renderButton();\n }\n\n return (\n <div style={{ width: '100%' }} className={this.props.rootClass}>\n {addToCalendarBtn}\n {options}\n </div>\n );\n }\n}\n\nReactAddToCalendar.displayName = 'Add To Calendar';\n\nReactAddToCalendar.propTypes = {\n buttonClassClosed: PropTypes.string,\n buttonClassOpen: PropTypes.string,\n buttonLabel: PropTypes.string,\n buttonTemplate: PropTypes.object,\n buttonIconClass: PropTypes.string,\n useFontAwesomeIcons: PropTypes.bool,\n buttonWrapperClass: PropTypes.string,\n displayItemIcons: PropTypes.bool,\n optionsOpen: PropTypes.bool,\n dropdownClass: PropTypes.string,\n event: PropTypes.shape({\n title: PropTypes.string,\n description: PropTypes.string,\n location: PropTypes.string,\n startTime: PropTypes.string,\n endTime: PropTypes.string,\n }).isRequired,\n listItems: PropTypes.arrayOf(PropTypes.object),\n rootClass: PropTypes.string,\n};\n\nReactAddToCalendar.defaultProps = {\n buttonClassClosed: 'react-add-to-calendar__button',\n buttonClassOpen: 'react-add-to-calendar__button--light',\n buttonLabel: 'Add to My Calendar',\n buttonTemplate: { caret: 'right' },\n buttonIconClass: 'react-add-to-calendar__icon--',\n useFontAwesomeIcons: true,\n buttonWrapperClass: 'react-add-to-calendar__wrapper',\n displayItemIcons: true,\n optionsOpen: false,\n dropdownClass: 'react-add-to-calendar__dropdown',\n event: {\n title: 'Sample Event',\n description: 'This is the sample event provided as an example only',\n location: 'Portland, OR',\n startTime: '2016-09-16T20:15:00-04:00',\n endTime: '2016-09-16T21:45:00-04:00',\n },\n listItems: [\n { apple: 'Apple Calendar' },\n { google: 'Google' },\n { outlook: 'Outlook' },\n { outlookcom: 'Outlook.com' },\n { yahoo: 'Yahoo' },\n ],\n rootClass: 'react-add-to-calendar',\n};\n"],"file":"AddToCalendar.js"}
\No newline at end of file