{"version":3,"file":"static/js/563.d8956e43.chunk.js","mappings":"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","sources":["util/catalogUtil.js","components/DataHeader.jsx","../../../node_modules/@material-ui/icons/DateRange.js","../../../node_modules/@material-ui/icons/List.js"],"sourcesContent":["/* eslint-disable default-param-last */\n/* eslint-disable import/prefer-default-export */\nimport JSPDF from 'jspdf';\nimport moment from 'moment';\nimport camelCase from 'lodash/camelCase';\n\nimport Theme from 'portal-core-components/lib/components/Theme';\n\nimport RouteService from 'portal-core-components/lib/service/RouteService';\n\nimport {\n FILTER_KEYS,\n FILTER_LABELS,\n SORT_METHODS,\n VISUALIZATIONS,\n} from './filterUtil';\n\n/**\n Payload Columns\n\n We don't export all state data and particular fields in the catalog download\n warrant more public-facing naming. This data structure defines all the fields we\n expect to see in a catalog download. Only used for JSON and CSV because PDF\n generation has a more complex layout.\n Column attributes:\n\n * label \n Field label as it should appear in CSV/PDF. Will be camelCased for JSON.\n * value \n If string: key name in product to use as field value. If function: take product\n as only argument and return appropriate field value.\n * formats \n List of string extensions where the column should appear\n * escape \n Whether the field's value may contain a comma and therefore be quoted/escaped in CSV\n*/\nconst payloadColumns = [\n {\n label: 'Product ID',\n value: 'productCode',\n formats: ['csv', 'json'],\n },\n {\n label: 'Level',\n value: (product) => product.productCode.substr(2, 1),\n formats: ['csv', 'json'],\n },\n {\n label: 'Name',\n value: 'productName',\n formats: ['csv', 'json'],\n escape: true,\n },\n {\n label: 'Status',\n value: (product) => product.filterableValues.DATA_STATUS,\n formats: ['csv', 'json'],\n },\n {\n label: 'URL',\n value: (product) => RouteService.getProductDetailPath(product.productCode),\n formats: ['csv', 'json'],\n },\n {\n label: 'First Available Month',\n value: (product) => (\n product.filterableValues.DATE_RANGE.length ? product.filterableValues.DATE_RANGE[0] : ''\n ),\n formats: ['csv', 'json'],\n },\n {\n label: 'Latest Available Month',\n value: (product) => (\n product.filterableValues.DATE_RANGE.length\n ? product.filterableValues.DATE_RANGE[product.filterableValues.DATE_RANGE.length - 1]\n : ''\n ),\n formats: ['csv', 'json'],\n },\n {\n label: 'Science Team',\n value: 'productScienceTeam',\n formats: ['csv', 'json'],\n escape: true,\n },\n {\n label: 'Description',\n value: 'productDescription',\n formats: ['csv', 'json'],\n escape: true,\n },\n {\n label: 'Keywords',\n value: 'keywords',\n formats: ['json'],\n },\n];\n\n// Helper function to format a list of strings into a comma separated list with an oxford comma\n// and an \"and\", as necessary. Strings passed to this function are a no-op.\nconst orList = (list) => {\n if (typeof list === 'string') { return list; }\n switch (list.length) {\n case 0:\n return '';\n case 1:\n return list[0];\n case 2:\n return `${list[0]} or ${list[1]}`;\n default:\n return `${list.slice(0, list.length - 1).join(', ')}, or ${list[list.length - 1]}`;\n }\n};\n\nconst generateProductIDList = (products, productOrder, filtered = false) => {\n if (filtered) { return [...productOrder]; }\n const list = Object.keys(products);\n list.sort((a, b) => (\n products[a].productName.toUpperCase() < products[b].productName.toUpperCase() ? -1 : 1\n ));\n return list;\n};\n\nconst generateCsv = (products, productOrder, filtered = false) => {\n const rows = [payloadColumns.map((column) => column.label).join(',')];\n const orderedList = generateProductIDList(products, productOrder, filtered);\n orderedList.forEach((productCode) => {\n const row = payloadColumns\n .filter((column) => column.formats.includes('csv'))\n .map((column) => {\n let value = typeof column.value === 'function'\n ? column.value(products[productCode])\n : products[productCode][column.value];\n if (column.escape) { value = `\"${value.replace(/\"/g, '\"\"')}\"`; }\n return value;\n });\n rows.push(row.join(','));\n });\n return rows.join('\\n');\n};\n\nconst generateJson = (products, productOrder, filtered = false) => {\n const orderedList = generateProductIDList(products, productOrder, filtered);\n const productList = orderedList.map((productCode) => {\n const product = {};\n payloadColumns\n .filter((column) => column.formats.includes('json'))\n .forEach((column) => {\n const key = camelCase(column.label);\n const value = typeof column.value === 'function'\n ? column.value(products[productCode])\n : products[productCode][column.value];\n product[key] = value;\n });\n return product;\n });\n return JSON.stringify({ products: productList });\n};\n\nconst generatePdf = (\n products,\n productOrder,\n filtersApplied = [],\n filterValues = {},\n sortMethod = null,\n sortDirection = null,\n search,\n statesJSON,\n) => {\n const formatFilterContent = (key) => {\n if (!FILTER_KEYS[key]) { return ''; }\n switch (key) {\n case FILTER_KEYS.SEARCH:\n return search;\n case FILTER_KEYS.DATE_RANGE:\n return `Any data available from ${filterValues[key][0]} through ${filterValues[key][1]}`;\n case FILTER_KEYS.SITES:\n case FILTER_KEYS.DOMAINS:\n return `Data available from ${orList(filterValues[key])}`;\n case FILTER_KEYS.STATES:\n return `Data available from ${orList(filterValues[key].map((abb) => (statesJSON[abb].name || abb)))}`;\n case FILTER_KEYS.VISUALIZATIONS:\n return `Can be visualized by ${orList(filterValues[key].map((viz) => (VISUALIZATIONS[viz].name || viz)))}`;\n default:\n return orList(filterValues[key]);\n }\n };\n const filtered = filtersApplied.length > 0;\n const productList = generateProductIDList(products, productOrder, filtered);\n // PDF layout constants (in inches)\n const margin = 0.75;\n const pageWidth = 8.5;\n const pageHeight = 11;\n // vertical baseline-to-baseline at 11pt font size for multi-line text like descriptions\n const lineHeight = 0.17;\n // vertical baseline-to-baseline at 11pt font size for a block-level element\n const blockLineHeight = 0.22;\n // height from hr to description (title and catalog data except description, including spacing)\n const baseProductHeight = 1.15;\n // Document Setup\n const pdf = new JSPDF({ orientation: 'portrait', unit: 'in', format: 'letter' });\n pdf.setTextColor('#000000');\n pdf.setFont('helvetica', 'normal');\n // Document Title\n pdf.setFontSize(18);\n pdf.text(\n `NEON Data Product Catalog (${filtered ? 'Filtered Subset' : 'All Products'})`,\n margin,\n margin,\n );\n pdf.setFontSize(11);\n // Catalog Info\n let y = 1.05;\n let sort = 'by Product Name, ascending';\n const filtersAppliedByLabelWidth = [...filtersApplied.filter((key) => FILTER_KEYS[key])];\n filtersAppliedByLabelWidth.sort((a, b) => {\n const aWidth = pdf.getTextWidth(FILTER_LABELS[a]);\n const bWidth = pdf.getTextWidth(FILTER_LABELS[b]);\n if (aWidth === bWidth) { return a < b ? -1 : 1; }\n return aWidth <= bWidth ? 1 : -1;\n });\n const filterLabelWidth = filtered\n ? Math.max(pdf.getTextWidth(FILTER_LABELS[filtersAppliedByLabelWidth[0]]) + 0.2, 0.88)\n : 0.88;\n pdf.setFont('helvetica', 'bold');\n pdf.text('Generated:', margin, y);\n pdf.text('Product Count:', margin + filterLabelWidth + 1.07, y);\n pdf.setFont('helvetica', 'normal');\n pdf.text(moment().format('YYYY-MM-DD'), margin + filterLabelWidth, y);\n if (!filtered) {\n pdf.text(`${Object.keys(products).length} (full catalog)`, margin + filterLabelWidth + 2.27, y);\n } else {\n pdf.text(\n `${productList.length} (filtered from full catalog of ${Object.keys(products).length})`,\n margin + filterLabelWidth + 2.27,\n y,\n );\n y += blockLineHeight * 1.5;\n pdf.setFont('helvetica', 'bold');\n pdf.setFontSize(12.5);\n pdf.text('Filters and Sorting', margin, y);\n pdf.setFontSize(11);\n y += blockLineHeight * 0.5;\n filtersAppliedByLabelWidth.forEach((key) => {\n const filterLabel = FILTER_LABELS[key];\n const filterContent = formatFilterContent(key);\n const splitFilterContent = filterContent.length\n ? pdf.splitTextToSize(filterContent, pageWidth - (2 * margin) - filterLabelWidth)\n : [''];\n y += blockLineHeight;\n pdf.setFont('helvetica', 'bold');\n pdf.text(`${filterLabel}:`, margin, y);\n pdf.setFont('helvetica', 'normal');\n pdf.text(splitFilterContent, margin + filterLabelWidth, y);\n y += (splitFilterContent.length - 1) * lineHeight;\n });\n const { label } = SORT_METHODS[sortMethod];\n sort = `${label}, ${sortDirection === 'ASC' ? 'ascending' : 'descending'}`;\n }\n y += blockLineHeight;\n pdf.setFont('helvetica', 'bold');\n pdf.text('Sort:', margin, y);\n pdf.setFont('helvetica', 'normal');\n pdf.text(sort, margin + filterLabelWidth, y);\n y += blockLineHeight;\n // Loop through products\n productList.forEach((productCode) => {\n const product = products[productCode];\n const splitDescription = pdf.splitTextToSize(\n product.productDescription,\n pageWidth - (2 * margin),\n );\n const productHeight = baseProductHeight\n + (lineHeight * splitDescription.length)\n + (1.5 * lineHeight);\n // Draw divider or new page, never both\n if (y + productHeight + margin > pageHeight) {\n pdf.addPage();\n y = margin;\n } else {\n pdf.setFillColor(Theme.palette.grey[300]);\n pdf.rect(margin, y, pageWidth - (2 * margin), 0.002, 'F');\n pdf.setFillColor('#000000');\n }\n let offset = 0.3;\n // Render product name\n pdf.setFont('helvetica', 'bold');\n pdf.setFontSize(12.5);\n pdf.setTextColor(Theme.palette.primary.main);\n pdf.text(product.productName, margin, y + offset);\n pdf.setFont('helvetica', 'normal');\n pdf.setFontSize(11);\n pdf.setTextColor('#000000');\n // Render product ID and URL\n offset += 0.28;\n pdf.setFont('helvetica', 'bold');\n pdf.text('ID:', margin, y + offset);\n pdf.setFont('helvetica', 'normal');\n pdf.text(productCode, margin + 0.25, y + offset);\n const url = RouteService.getProductDetailPath(productCode);\n pdf.setFont('helvetica', 'bold');\n pdf.text('URL:', margin + 1.5, y + offset);\n pdf.setFont('helvetica', 'normal');\n pdf.setTextColor(Theme.palette.secondary.light);\n pdf.textWithLink(url, margin + 1.95, y + offset, { url });\n pdf.setTextColor('#000000');\n // Render Level, Status, and Availability\n offset += blockLineHeight;\n pdf.setFont('helvetica', 'bold');\n pdf.text('Level:', margin, y + offset);\n pdf.setFont('helvetica', 'normal');\n pdf.text(product.productCode.substr(2, 1), margin + 0.5, y + offset);\n pdf.setFont('helvetica', 'bold');\n pdf.text('Status:', margin + 1.5, y + offset);\n pdf.setFont('helvetica', 'normal');\n pdf.text(product.filterableValues.DATA_STATUS, margin + 2.1, y + offset);\n if (product.filterableValues.DATA_STATUS === 'Available') {\n const rangeStart = product.filterableValues.DATE_RANGE[0];\n const rangeLength = product.filterableValues.DATE_RANGE.length;\n const rangeEnd = product.filterableValues.DATE_RANGE[rangeLength - 1];\n const available = `${rangeStart} through ${rangeEnd}`;\n pdf.setFont('helvetica', 'bold');\n pdf.text('Data Available:', margin + 3.1, y + offset);\n pdf.setFont('helvetica', 'normal');\n pdf.text(available, margin + 4.28, y + offset);\n }\n // Render Science Team\n offset += blockLineHeight;\n pdf.setFont('helvetica', 'bold');\n pdf.text('Science Team:', margin, y + offset);\n pdf.setFont('helvetica', 'normal');\n pdf.text(product.productScienceTeam, margin + 1.15, y + offset);\n // Render Description\n offset += 0.3;\n pdf.text(splitDescription, margin, y + offset);\n // Final y-adjustment for this product\n y += productHeight;\n });\n return pdf;\n};\n\nexport const downloadCatalog = (\n products,\n productOrder,\n ext = 'csv',\n filtersApplied = [],\n filterValues = {},\n sortMethod = null,\n sortDirection = null,\n search = '',\n statesJSON,\n) => {\n const filtered = filtersApplied.length > 0;\n let payload = '';\n let mimeType = '';\n const fileName = `NEON_Data_Product_Catalog_${filtered ? 'FILTERED' : 'ALL_PRODUCTS'}.${ext}`;\n switch (ext) {\n case 'csv':\n payload = generateCsv(products, productOrder, filtered);\n mimeType = 'text/csv;charset=utf-8';\n break;\n case 'json':\n payload = generateJson(products, productOrder, filtered);\n mimeType = 'application/json;charset=utf-8';\n break;\n case 'pdf':\n payload = generatePdf(\n products,\n productOrder,\n filtersApplied,\n filterValues,\n sortMethod,\n sortDirection,\n search,\n statesJSON,\n );\n payload.save(fileName);\n return;\n default:\n break;\n }\n if (!payload.length) { return; }\n if (navigator.msSaveBlob) { // IE10+\n navigator.msSaveBlob(new Blob([payload], { type: mimeType }), fileName);\n } else {\n const link = document.createElement('a');\n if (URL) {\n link.href = URL.createObjectURL(new Blob([payload], { type: mimeType }));\n } else {\n link.setAttribute('href', `data:${mimeType},${encodeURI(payload)}`);\n }\n link.setAttribute('download', fileName);\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport moment from 'moment';\n\nimport { makeStyles } from '@material-ui/core/styles';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\nimport Button from '@material-ui/core/Button';\nimport ButtonGroup from '@material-ui/core/ButtonGroup';\nimport Card from '@material-ui/core/Card';\nimport CardContent from '@material-ui/core/CardContent';\nimport Collapse from '@material-ui/core/Collapse';\nimport Divider from '@material-ui/core/Divider';\nimport Grid from '@material-ui/core/Grid';\nimport IconButton from '@material-ui/core/IconButton';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Typography from '@material-ui/core/Typography';\nimport Skeleton from '@material-ui/lab/Skeleton';\n\nimport DateIcon from '@material-ui/icons/DateRange';\nimport ListIcon from '@material-ui/icons/List';\nimport NoneIcon from '@material-ui/icons/NotInterested';\nimport ClearIcon from '@material-ui/icons/Clear';\n\nimport Theme from 'portal-core-components/lib/components/Theme';\n\nimport ExploreContext from '../ExploreContext';\n\nimport { FILTER_KEYS, getCurrentProductsByRelease } from '../util/filterUtil';\nimport { downloadCatalog } from '../util/catalogUtil';\n\nconst useStyles = makeStyles((theme) => ({\n card: {\n marginBottom: theme.spacing(3),\n backgroundColor: theme.palette.grey[50],\n boxShadow: '0px 1px 3px rgba(0, 0, 0, 0.25), 0px 1px 1px rgba(0, 0, 0, 0.25)',\n },\n divider: {\n margin: theme.spacing(2, 0, 2.5, 0),\n },\n catalogContainer: {\n marginBottom: theme.spacing(1.5),\n },\n sectionTitle: {\n fontWeight: 500,\n marginBottom: theme.spacing(1.5),\n },\n statContainer: {\n display: 'flex',\n flexWrap: 'wrap',\n },\n stat: {\n color: theme.palette.grey[500],\n display: 'flex',\n alignItems: 'flex-start',\n marginRight: theme.spacing(2),\n },\n statIcon: {\n color: theme.palette.grey[500],\n margin: theme.spacing(0.375, 0.5, 0, 0),\n fontSize: '1rem',\n },\n statLabel: {\n fontSize: '0.875rem',\n },\n downloadContainer: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-start',\n flexWrap: 'wrap',\n marginTop: theme.spacing(1),\n },\n downloadLabel: {\n color: theme.palette.grey[400],\n whiteSpace: 'nowrap',\n margin: theme.spacing(0, 0.5, 0.5, 0),\n },\n title: {\n fontWeight: 600,\n [theme.breakpoints.up('md')]: {\n marginBottom: theme.spacing(2),\n fontSize: '1.5rem',\n },\n [theme.breakpoints.down('sm')]: {\n marginRight: theme.spacing(1.5),\n fontSize: '1.3rem',\n },\n },\n summary: {\n color: theme.palette.grey[400],\n fontWeight: 400,\n fontSize: '0.85rem',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n marginTop: theme.spacing(1),\n },\n}));\n\nconst DataHeader = (props) => {\n const classes = useStyles(Theme);\n\n const { skeleton } = props;\n\n const [state, dispatch] = ExploreContext.useExploreContextState();\n const {\n catalogStats,\n filtersApplied,\n filterValues,\n sortMethod,\n sortDirection,\n localStorageSearch,\n catalogSummaryVisible,\n neonContextState,\n currentProducts: { order: productOrder },\n } = state;\n const products = getCurrentProductsByRelease(state);\n\n const belowMd = useMediaQuery(Theme.breakpoints.down('sm'));\n const visible = catalogSummaryVisible || !belowMd;\n\n const { states: statesJSON = {} } = neonContextState.data;\n\n const handleDownload = (ext, filtered) => {\n if (!filtered) {\n downloadCatalog(products, productOrder, ext);\n } else {\n downloadCatalog(\n products,\n productOrder,\n ext,\n filtersApplied,\n filterValues,\n sortMethod,\n sortDirection,\n localStorageSearch,\n statesJSON,\n );\n }\n };\n\n const gtmProps = (ext, filtered) => ({\n 'data-gtm': 'explore-data-products.download-catalog',\n 'data-gtm-catalog-ext': ext,\n 'data-gtm-catalog-filtered': filtered ? 'filtered' : 'full',\n });\n\n const stats = {\n products: {\n total: catalogStats.totalProducts,\n filtered: productOrder.length,\n },\n sites: {\n total: catalogStats.totalSites,\n filtered: 0,\n },\n dateRange: {\n total: catalogStats.totalDateRange,\n filtered: [null, null],\n },\n };\n\n const filteredSites = new Set();\n const filteredDates = new Set();\n\n productOrder.forEach((productCode) => {\n products[productCode].filterableValues[FILTER_KEYS.SITES].forEach(\n (site) => filteredSites.add(site),\n );\n products[productCode].filterableValues[FILTER_KEYS.DATE_RANGE].forEach(\n (date) => filteredDates.add(date),\n );\n });\n\n stats.sites.filtered = filteredSites.size;\n stats.dateRange.filtered = Array.from(filteredDates).sort();\n if (stats.dateRange.filtered.length === 1) {\n stats.dateRange.filtered = [stats.dateRange.filtered[0], stats.dateRange.filtered[0]];\n } else {\n stats.dateRange.filtered.splice(1, stats.dateRange.filtered.length - 2);\n }\n\n const formatRange = (stat, offset) => (\n stats.dateRange[stat][offset]\n ? moment(`${stats.dateRange[stat][offset]}-02`).format('MMM YYYY')\n : ''\n );\n const totalAvailability = `Data available ${formatRange('total', 0)} – ${formatRange('total', 1)}`;\n let filteredAvailability = 'No data available';\n if (stats.dateRange.filtered.length === 2) {\n filteredAvailability = stats.dateRange.filtered[0] === stats.dateRange.filtered[1]\n ? `Data available only for ${formatRange('filtered', 0)}`\n : `Data available ${formatRange('filtered', 0)} – ${formatRange('filtered', 1)}`;\n }\n\n const selenium = 'browse-data-products-page.data-header';\n\n const getTooltip = (format, filtered) => {\n const baseTooltip = `Download a ${format} file containing catalog data (product name, description, url, etc.--no science data)`;\n return filtered\n ? `${baseTooltip} for the ${stats.products.filtered} data product${stats.products.filtered === 1 ? '' : 's'} matching currently applied filters, sorted by the current sort.`\n : `${baseTooltip} for all ${stats.products.total} data product${stats.products.total === 1 ? '' : 's'}, sorted alphabetically by name.`;\n };\n\n let catalogSummaryContents = (\n \n \n
\n \n All Products\n \n
\n
\n \n \n {`\n${stats.products.total} product${stats.products.total === 1 ? '' : 's'}\nfrom ${stats.sites.total} site${stats.sites.total === 1 ? '' : 's'}\n `}\n \n
\n
\n \n \n {totalAvailability}\n \n
\n
\n
\n \n Download Full Catalog:\n \n \n \n { handleDownload('csv', false); }}\n aria-label=\"Download Full Catalog CSV\"\n >\n CSV\n \n \n \n { handleDownload('json', false); }}\n aria-label=\"Download Full Catalog JSON\"\n >\n JSON\n \n \n \n { handleDownload('pdf', false); }}\n aria-label=\"Download Full Catalog PDF\"\n >\n PDF\n \n \n \n
\n
\n
\n \n \n \n Filtered Products\n \n {filtersApplied.length ? (\n <>\n
\n
\n \n \n {`\n${stats.products.filtered} product${stats.products.filtered === 1 ? '' : 's'}\nfrom ${stats.sites.filtered} site${stats.sites.filtered === 1 ? '' : 's'}\n `}\n \n
\n
\n {stats.dateRange.filtered.length === 2 ? (\n \n ) : (\n \n )}\n \n {filteredAvailability}\n \n
\n
\n
\n \n Download Filtered Catalog:\n \n \n \n { handleDownload('csv', true); }}\n aria-label=\"Download Filtered Catalog CSV\"\n >\n CSV\n \n \n \n { handleDownload('json', true); }}\n aria-label=\"Download Filtered Catalog JSON\"\n >\n JSON\n \n \n \n { handleDownload('pdf', true); }}\n aria-label=\"Download Filtered Catalog PDF\"\n >\n PDF\n \n \n \n
\n \n ) : (\n
\n \n \n no filters currently applied\n \n
\n )}\n \n
\n
\n );\n\n if (skeleton) {\n catalogSummaryContents = (\n \n \n
\n \n All Products\n \n \n \n \n
\n
\n \n
\n \n Filtered Products\n \n \n \n \n
\n
\n
\n );\n }\n\n if (belowMd) {\n let summary = `${stats.products.total} total products`;\n if (filtersApplied.length) {\n summary = `${summary}, ${stats.products.filtered} filtered`;\n }\n return (\n \n \n
\n
\n Summary\n
\n {summary}\n
\n
\n \n dispatch({ type: 'toggleCatalogSummaryVisibility' })}>\n {catalogSummaryVisible ? : }\n \n \n
\n \n \n {catalogSummaryContents}\n \n
\n
\n );\n }\n\n return catalogSummaryContents;\n};\n\nDataHeader.propTypes = {\n skeleton: PropTypes.bool,\n};\n\nDataHeader.defaultProps = {\n skeleton: false,\n};\n\nexport default DataHeader;\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M9 11H7v2h2v-2zm4 0h-2v2h2v-2zm4 0h-2v2h2v-2zm2-7h-1V2h-2v2H8V2H6v2H5c-1.11 0-1.99.9-1.99 2L3 20c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 16H5V9h14v11z\"\n}), 'DateRange');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M3 13h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm4 4h14v-2H7v2zm0 4h14v-2H7v2zM7 7v2h14V7H7z\"\n}), 'List');\n\nexports.default = _default;"],"names":["payloadColumns","label","value","formats","product","productCode","substr","escape","filterableValues","DATA_STATUS","RouteService","getProductDetailPath","DATE_RANGE","length","orList","list","slice","join","generateProductIDList","products","productOrder","arguments","undefined","Object","keys","sort","a","b","productName","toUpperCase","generatePdf","filtersApplied","filterValues","sortMethod","sortDirection","search","statesJSON","filtered","productList","margin","lineHeight","blockLineHeight","pdf","JSPDF","orientation","unit","format","setTextColor","setFont","setFontSize","text","y","filtersAppliedByLabelWidth","filter","key","FILTER_KEYS","aWidth","getTextWidth","FILTER_LABELS","bWidth","filterLabelWidth","Math","max","moment","forEach","filterLabel","filterContent","SEARCH","SITES","DOMAINS","STATES","map","abb","name","VISUALIZATIONS","viz","formatFilterContent","splitFilterContent","splitTextToSize","pageWidth","SORT_METHODS","splitDescription","productDescription","productHeight","addPage","setFillColor","Theme","palette","grey","rect","offset","primary","main","url","secondary","light","textWithLink","rangeStart","rangeLength","available","productScienceTeam","downloadCatalog","ext","payload","mimeType","fileName","rows","column","row","includes","replace","push","generateCsv","camelCase","JSON","stringify","generateJson","save","navigator","msSaveBlob","Blob","type","link","document","createElement","URL","href","createObjectURL","setAttribute","encodeURI","body","appendChild","click","removeChild","useStyles","makeStyles","theme","card","marginBottom","spacing","backgroundColor","boxShadow","divider","catalogContainer","sectionTitle","fontWeight","statContainer","display","flexWrap","stat","color","alignItems","marginRight","statIcon","fontSize","statLabel","downloadContainer","justifyContent","marginTop","downloadLabel","whiteSpace","title","breakpoints","up","down","summary","overflow","textOverflow","DataHeader","props","classes","skeleton","state","dispatch","ExploreContext","useExploreContextState","catalogStats","localStorageSearch","catalogSummaryVisible","neonContextState","currentProducts","order","getCurrentProductsByRelease","belowMd","useMediaQuery","visible","states","data","handleDownload","gtmProps","stats","total","totalProducts","sites","totalSites","dateRange","totalDateRange","filteredSites","Set","filteredDates","site","add","date","size","Array","from","splice","formatRange","totalAvailability","filteredAvailability","selenium","getTooltip","baseTooltip","catalogSummaryContents","_jsxs","Grid","container","style","children","_jsx","item","xs","sm","className","Typography","component","variant","ListIcon","DateIcon","ButtonGroup","Tooltip","Button","onClick","opacity","_Fragment","NoneIcon","disabled","Skeleton","width","height","Card","CardContent","flex","placement","IconButton","ClearIcon","Collapse","in","Divider","defaultProps","_interopRequireDefault","require","_interopRequireWildcard","defineProperty","exports","React","_default","default","d"],"sourceRoot":""}