{"version":3,"sources":["components/Extension/ExportBtn/ExportBtn.js","components/func/func.js","components/Extension/Extension.js","components/Configure/SelectSheets/Sheet/Sheet.js","components/Configure/SelectSheets/SelectSheets.js","components/Configure/SelectColumns/Sheet/Column/Column.js","components/Configure/SelectColumns/Sheet/Sheet.js","components/Configure/SelectColumns/SelectColumns.js","components/Configure/ActionButtons/ActionButtons.js","components/Configure/ConfigureTab/ConfigureTab.js","components/Configure/logo.svg","components/Configure/Configure.js","components/DesktopExport/DesktopExport.js","containers/Main.js","serviceWorker.js","index.js"],"names":["ExportBtn","props","kind","style","disabled","onClick","export","label","saveSettings","Promise","resolve","reject","console","log","tableau","extensions","settings","set","environment","mode","saveAsync","then","newSavedSettings","catch","setSettings","type","value","settingKey","JSON","stringify","getSheetColumns","sheet","existingCols","modified","getSummaryDataAsync","ignoreSelection","data","columns","cols","existingIdx","j","length","col","index","name","fieldName","dataType","changeName","selected","push","i","hasOwnProperty","maxPos","map","idx","eIdx","indexOf","ret","order","k","newCol","sort","a","b","error","initializeMeta","promises","meta","dashboardContent","_dashboard","worksheets","worksheet","item","sheetName","customCols","all","sheetArr","sheetMeta","revalidateMeta","existing","sheetIdx","findIndex","e","existed","forEach","arr","old_index","new_index","undefined","splice","array_move","exportToExcel","env","filename","xlsFile","buildExcelBlob","wb","wbout","XLSX","write","bookType","bookSST","ignoreEC","saveAs","Blob","dashboard","utils","book_new","totalSheets","sheetCount","sheetList","columnList","tabNames","tabName","replace","metaSheet","find","s","columnMeta","headerOrder","colMeta","column","objCol","o","outputName","decodeDataset","rows","ws","json_to_sheet","header","sheetname","book_append_sheet","dataset","decodeRow","datasetArr","row","dtype","dval","nativeValue","formattedValue","_dataType","Number","isNaN","v","t","Extension","refreshSettings","sheetSettings","get","existingSettings","parse","updateMeta","disableButton","labelSettings","updateLabel","styleSettings","updateButtonStyle","filenameSettings","updateFilename","configure","popupUrl","window","location","origin","ui","displayDialogAsync","height","width","closePayload","errorCode","ErrorCodes","DialogClosedByUser","message","useEffect","initializeAsync","metaVersion","updateMetaVersion","context","tableauVersion","compareVersions","compare","desktopExportHandler","useStyles","makeStyles","theme","root","heading","fontSize","typography","pxToRem","details","alignItems","flexBasis","display","lineHeight","group","color","flexDirection","fontFamily","position","strikeThrough","textDecoration","marginRight","Accordion","withStyles","boxShadow","borderBottom","margin","expanded","MuiAccordion","Sheet","rename","classes","inputProps","onChange","target","onClear","placeholder","className","square","AccordionSummary","aria-controls","id","checked","select","AccordionDetails","min","max","sheets","step","pageSteps","onValueChange","changeOrder","stepper","SelectSheets","selectSheet","newPos","ExpansionPanel","Column","expandIcon","Sheets","colSelect","SelectColumns","placeButtons","bottom","right","version","left","ActionButtons","packageJson","resetSettings","enableButton","save","flexGrow","gridItem","marginTop","ConfigureTab","labelProps","filenameProps","Grid","container","xs","Fragment","marginLeft","configBody","logoBanner","backgroundColor","paddingTop","paddingBottom","paddingLeft","Configure","useState","tab","switchTab","initializeDialogAsync","openPayload","src","logo","alt","onTabChange","selectedTabIndex","tabs","content","changeSettings","colIdx","enableSave","savedSettings","DesktopExport","spacing","align","justify","Typography","component","padding","Main","metaVersionChangedHandler","setState","labelChangedHandler","labelTxt","button","state","filenameChangedHandler","buttonStateChangedHandler","buttonStyleChangedHandler","metaChangedHandler","newSettings","settingsChangedHandler","settingsChanged","resetSettingsHandler","isLoading","renderExtension","renderConfigure","renderDesktopExport","path","this","Component","Boolean","hostname","match","ReactDOM","render","document","getElementById","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.afb3ec49.chunk.js","sourcesContent":["import React from 'react';\nimport { Button } from '@tableau/tableau-ui';\n\nfunction ExportBtn(props) {\n return (\n
\n \n
\n );\n}\n\nexport default ExportBtn;\n","import XLSX from 'xlsx';\nimport { saveAs } from 'file-saver';\n\n// Declare this so our linter knows that tableau is a global object\n/* global tableau */\n\n\n//array_move function from stackoverflow solution:\n//https://stackoverflow.com/questions/5306680/move-an-array-element-from-one-array-position-to-another\nfunction array_move(arr, old_index, new_index) {\n if (new_index >= arr.length) {\n var k = new_index - arr.length + 1;\n while (k--) {\n arr.push(undefined);\n }\n }\n arr.splice(new_index, 0, arr.splice(old_index, 1)[0]);\n return arr; // for testing\n};\n\nconst saveSettings = () => new Promise((resolve, reject) => {\n console.log('[func.js] Saving settings');\n tableau.extensions.settings.set('metaVersion', 2);\n console.log('[func.js] Authoring mode', tableau.extensions.environment.mode);\n if (tableau.extensions.environment.mode === \"authoring\") {\n tableau.extensions.settings.saveAsync()\n .then(newSavedSettings => {\n //console.log('[func.js] newSavedSettings', newSavedSettings);\n resolve(newSavedSettings);\n }).catch(reject);\n } else {\n resolve();\n }\n \n});\n\nconst setSettings = (type, value) => new Promise((resolve, reject) => {\n console.log('[func.js] Set settings', type, value);\n let settingKey = '';\n switch(type) {\n case 'sheets':\n settingKey = 'selectedSheets';\n break;\n case 'label':\n settingKey = 'buttonLabel';\n break;\n case 'style':\n settingKey = 'buttonStyle';\n break;\n case 'filename':\n settingKey = 'filename';\n break;\n case 'version':\n settingKey = 'metaVersion';\n break;\n default:\n settingKey = 'unknown';\n }\n tableau.extensions.settings.set(settingKey, JSON.stringify(value));\n resolve();\n});\n\nconst getSheetColumns = (sheet, existingCols, modified) => new Promise((resolve, reject) => {\n sheet.getSummaryDataAsync({ignoreSelection: true}).then((data) => {\n //console.log('[func.js] Sheet Summary Data', data);\n console.log('[func.js] getSheetColumns existingCols', JSON.stringify(existingCols));\n const columns = data.columns;\n let cols = [];\n const existingIdx = [];\n if (modified) {\n for (var j = 0; j < columns.length; j++) {\n //console.log(columns[j]);\n var col = {};\n col.index = columns[j].index;\n col.name = columns[j].fieldName;\n col.dataType = columns[j].dataType;\n col.changeName = null;\n col.selected = false;\n cols.push(col);\n }\n for (var i = 0; i < existingCols.length; i++) {\n if (existingCols[i] && existingCols[i].hasOwnProperty(\"name\")) {\n existingIdx.push(existingCols[i].name);\n }\n }\n console.log('[func.js] getSheetColumns existingIdx', existingIdx);\n let maxPos = existingIdx.length;\n cols = cols.map((col, idx) => {\n //console.log('[func.js] getSheetColumns Looking for col', col);\n const eIdx = existingIdx.indexOf(col.name);\n const ret = {...col};\n if (eIdx > -1) {\n ret.selected = existingCols[eIdx].selected;\n ret.changeName = existingCols[eIdx].changeName;\n ret.order = eIdx;\n } else {\n ret.order = maxPos;\n maxPos += 1;\n }\n return ret;\n });\n } else {\n for (var k = 0; k < columns.length; k++) {\n var newCol = {};\n newCol.index = columns[k].index;\n newCol.name = columns[k].fieldName;\n newCol.dataType = columns[k].dataType;\n newCol.selected = true;\n newCol.order = k + 1;\n cols.push(newCol);\n }\n }\n cols = cols.sort((a, b) => (a.order > b.order) ? 1 : -1)\n resolve(cols);\n })\n .catch(error => {\n console.log('[func.js] Error with getSummaryDataAsync', sheet, error);\n });\n});\n\nconst initializeMeta = () => new Promise((resolve, reject) => {\n console.log('[func.js] Initialise Meta');\n var promises = [];\n const worksheets = tableau.extensions.dashboardContent._dashboard.worksheets;\n //console.log('[func.js] Worksheets in dashboard', worksheets);\n var meta = worksheets.map(worksheet => {\n var sheet = worksheet;\n var item = {};\n item.sheetName = sheet.name;\n item.selected = false;\n item.changeName = null;\n item.customCols = false;\n promises.push(getSheetColumns(sheet, null, false));\n return item;\n });\n\n console.log(`[func.js] Found ${meta.length} sheets`, meta);\n\n Promise.all(promises).then((sheetArr) => {\n for (var i = 0; i < sheetArr.length; i++) {\n var sheetMeta = meta[i];\n sheetMeta.columns = sheetArr[i];\n meta[i] = sheetMeta;\n console.log(`[func.js] Added ${sheetArr[i].length} columns to ${sheetMeta.sheetName}`, meta);\n }\n //console.log(`[func.js] Meta initialised`, meta);\n resolve(meta);\n });\n});\n\nconst revalidateMeta = (existing) => new Promise((resolve, reject) => {\n console.log('[func.js] Revalidate Meta');\n var promises = [];\n const worksheets = tableau.extensions.dashboardContent._dashboard.worksheets;\n //console.log('[func.js] Worksheets in dashboard', worksheets);\n var meta = worksheets.map(worksheet => {\n var sheet = worksheet;\n const sheetIdx = existing.findIndex((e) => {\n return e.sheetName === sheet.name;\n });\n if (sheetIdx > -1) {\n console.log(`[func.js] Existing sheet ${sheet.name} columns`, JSON.stringify(existing[sheetIdx].columns));\n promises.push(getSheetColumns(sheet, existing[sheetIdx].columns, true));\n existing[sheetIdx].existed = true;\n return existing[sheetIdx];\n } else {\n var item = {};\n item.sheetName = sheet.name;\n item.selected = false;\n item.changeName = null;\n item.customCols = false;\n item.existed = false;\n promises.push(getSheetColumns(sheet, null, false));\n return item;\n }\n });\n\n console.log(`[func.js] Found ${meta.length} sheets`, meta);\n\n Promise.all(promises).then((sheetArr) => {\n\n for (var i = 0; i < sheetArr.length; i++) {\n var sheetMeta = meta[i];\n sheetMeta.columns = sheetArr[i];\n meta[i] = sheetMeta;\n //console.log(`[func.js] Added ${sheetArr[i].length} columns to ${sheetMeta.sheetName}`, meta);\n }\n meta.forEach((sheet, idx) => {\n if (sheet && sheet.sheetName) {\n const eIdx = existing.findIndex((e) => {\n return e.sheetName === sheet.sheetName;\n });\n meta = array_move(meta, idx, eIdx);\n } else {\n console.log('[func.js] Sheet ordering issue. No sheet defined in idx', idx);\n }\n })\n console.log(`[func.js] Meta revalidated`, JSON.stringify(meta));\n resolve(meta);\n });\n});\n\nconst exportToExcel = (meta, env, filename) => new Promise((resolve, reject) => {\n let xlsFile = \"export.xlsx\";\n if (filename && filename.length > 0) {\n xlsFile = filename + \".xlsx\";\n }\n buildExcelBlob(meta).then(wb => {\n // add ignoreEC:false to prevent excel crashes during text to column\n var wopts = { bookType:'xlsx', bookSST:false, type:'array', ignoreEC:false };\n var wbout = XLSX.write(wb,wopts);\n saveAs(new Blob([wbout],{type:\"application/octet-stream\"}), xlsFile);\n resolve();\n });\n});\n\n\n\n// krisd: move excel creation to caller (to support extra export to methodss)\n// callback receives a blob to save or transfer\nconst buildExcelBlob = (meta) => new Promise((resolve, reject) => {\n console.log(\"[func.js] Got Meta\", meta);\n // func.saveSettings(meta, function(newSettings) {\n // console.log(\"Saved settings\", newSettings);\n const worksheets = tableau.extensions.dashboardContent.dashboard.worksheets;\n const wb = XLSX.utils.book_new();\n let totalSheets = 0;\n let sheetCount = 0;\n const sheetList = [];\n const columnList = [];\n const tabNames = [];\n for (let i =0; i < meta.length; i++) {\n if (meta[i] && meta[i].selected) {\n let tabName = meta[i].changeName || meta[i].sheetName;\n tabName = tabName.replace(/[*?/\\\\[\\]]/gi, '');\n sheetList.push(meta[i].sheetName);\n tabNames.push(tabName);\n columnList.push(meta[i].columns);\n totalSheets = totalSheets + 1;\n }\n }\n sheetList.map((metaSheet, idx) => {\n //console.log(\"[func.js] Finding sheet\", metaSheet, worksheets);\n const sheet = worksheets.find(s => s.name === metaSheet);\n // eslint-disable-next-line\n sheet.getSummaryDataAsync({ignoreSelection: true}).then((data) => {\n const columns = data.columns;\n const columnMeta = columnList[sheetCount];\n const headerOrder = [];\n columnMeta.map((colMeta, idx) => {\n if (colMeta && colMeta.selected) {\n headerOrder.push(colMeta.changeName || colMeta.name);\n }\n return colMeta;\n });\n columns.map((column, idx) => {\n //console.log(\"[func.js] Finding column\", column.fieldName, columnMeta);\n const objCol = columnMeta.find(o => o.name === column.fieldName);\n if (objCol) {\n let col = { ...column, selected: objCol.selected }\n col.outputName = objCol.changeName || objCol.name;\n columns[idx] = col;\n return col;\n } else {\n return null;\n }\n });\n //console.log(\"[func.js] Running decodeRows\", columns, data.data);\n decodeDataset(columns, data.data)\n .then((rows) => {\n //console.log(\"[func.js] decodeRows returned\", rows);\n console.log(\"[func.js] Header Order\", headerOrder);\n var ws = XLSX.utils.json_to_sheet(rows, {header: headerOrder});\n var sheetname = tabNames[sheetCount];\n sheetCount = sheetCount + 1;\n XLSX.utils.book_append_sheet(wb, ws, sheetname);\n if (sheetCount === totalSheets) {\n resolve(wb);\n }\n });\n });\n return sheet;\n });\n});\n\n\n// krisd: Remove recursion to work with larger data sets\n// and translate cell data types\nconst decodeDataset = (columns, dataset) => new Promise((resolve, reject) => {\n let promises = [];\n for (let i=0; i {\n //console.log('[func.js] datasetArr', datasetArr);\n resolve(datasetArr);\n });\n\n});\n\nconst decodeRow = (columns, row) => new Promise((resolve, reject) => {\n let meta = {};\n for (let j = 0; j < columns.length; j++) {\n if (columns[j].selected) {\n // krisd: let's assign the sheetjs type according to the summary data column type\n let dtype = undefined;\n let dval = undefined;\n // console.log('[func.js] Row', row[j]);\n if (row[j].value === '%null%' && row[j].nativeValue === null && row[j].formattedValue === 'Null') {\n dtype = 'z';\n dval = null;\n } else {\n switch (columns[j]._dataType) {\n case 'int':\n case 'float':\n dtype = 'n';\n dval = Number(row[j].value); // let nums be raw w/o formatting\n if (isNaN(dval)) dval = row[j].formattedValue; // protect in case issue\n break;\n case 'date':\n case 'date-time':\n dtype = 's';\n dval = row[j].formattedValue;\n break;\n case 'bool':\n dtype = 'b';\n dval = row[j].value;\n break;\n default:\n dtype = 's';\n dval = row[j].formattedValue;\n }\n }\n let o = {v:dval, t:dtype};\n meta[columns[j].outputName] = o;\n }\n }\n resolve(meta);\n});\n\n\n\nexport {\n initializeMeta,\n revalidateMeta,\n saveSettings,\n setSettings,\n exportToExcel,\n}\n","import React, { useEffect } from 'react';\nimport ExportBtn from './ExportBtn/ExportBtn';\nimport { initializeMeta, revalidateMeta, saveSettings, setSettings, exportToExcel } from '../func/func';\nimport compareVersions from 'compare-versions';\n\n// Declare this so our linter knows that tableau is a global object\n/* global tableau */\n\nfunction Extension (props) {\n\n useEffect(() => {\n console.log('[Extension.js] Props Changed', props);\n }, [props]);\n\n useEffect(() => {\n console.log('[Extension.js] useEffect');\n //console.log('[Extension.js] Initialise Extension', props);\n //Initialise Extension\n tableau.extensions.initializeAsync({'configure': configure}).then(() => {\n\n let metaVersion = tableau.extensions.settings.get('metaVersion');\n\n if (metaVersion) {\n console.log('[Extension.js] Meta Version', metaVersion);\n props.updateMetaVersion(metaVersion);\n } else {\n console.log('[Extension.js] Meta Version', 1);\n metaVersion = 1;\n props.updateMetaVersion(1);\n }\n\n let sheetSettings = tableau.extensions.settings.get('selectedSheets');\n\n if (sheetSettings && sheetSettings != null) {\n console.log('[Extension.js] Existing Sheet Settings Found', JSON.parse(sheetSettings));\n props.updateMeta(JSON.parse(sheetSettings));\n props.disableButton(false);\n } else {\n console.log('[Extension.js] Can\\'t find existing sheet settings');\n initializeMeta()\n .then(meta => {\n props.updateMeta(meta);\n setSettings('sheets', meta);\n setSettings('label', 'Export All');\n return saveSettings();\n })\n .then(meta => configure(meta));\n }\n\n let labelSettings = tableau.extensions.settings.get('buttonLabel');\n\n if (labelSettings && labelSettings != null) {\n labelSettings = labelSettings.replace(/\"/g,'');\n console.log('[Extension.js] initializeAsync Existing Label Settings Found', labelSettings);\n props.updateLabel(labelSettings);\n }\n\n let styleSettings = tableau.extensions.settings.get('buttonStyle');\n\n if (styleSettings && styleSettings != null) {\n console.log('[Extension.js] initializeAsync Existing Label Style Found', styleSettings);\n props.updateButtonStyle(styleSettings);\n }\n\n let filenameSettings = tableau.extensions.settings.get('filename');\n\n if (filenameSettings && filenameSettings != null) {\n console.log('[Extension.js] initializeAsync Existing Filename Found', filenameSettings);\n props.updateFilename(filenameSettings);\n }\n\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n function refreshSettings() {\n let sheetSettings = tableau.extensions.settings.get('selectedSheets');\n\n if (sheetSettings && sheetSettings != null) {\n const existingSettings = JSON.parse(sheetSettings);\n console.log('[Extension.js] refreshSettings Existing Sheet Settings Found. Refreshing', JSON.stringify(existingSettings));\n revalidateMeta(existingSettings)\n .then(meta => {\n console.log('[Extension.js] refreshSettings settings revalidated',JSON.stringify(meta));\n props.updateMeta(meta);\n props.disableButton(false);\n });\n }\n\n let labelSettings = tableau.extensions.settings.get('buttonLabel');\n\n if (labelSettings && labelSettings != null) {\n labelSettings = labelSettings.replace(/\"/g,'');\n console.log('[Extension.js] refreshSettings Existing Label Settings Found', labelSettings);\n props.updateLabel(labelSettings);\n }\n\n let styleSettings = tableau.extensions.settings.get('buttonStyle');\n\n if (styleSettings && styleSettings != null) {\n console.log('[Extension.js] refreshSettings Existing Label Style Found', styleSettings);\n props.updateButtonStyle(styleSettings);\n }\n\n let filenameSettings = tableau.extensions.settings.get('filename');\n\n if (filenameSettings && filenameSettings != null) {\n console.log('[Extension.js] refreshSettings Existing Filename Found', filenameSettings);\n props.updateFilename(filenameSettings);\n }\n }\n\n function configure () {\n console.log('[Extension.js] Opening configure popup');\n const popupUrl = `${window.location.origin}/configure`;\n tableau.extensions.ui.displayDialogAsync(popupUrl, null, { height: 500, width: 500 }).then((closePayload) => {\n refreshSettings();\n console.log('[Extension.js] Config window closed', props)\n }).catch((error) => {\n switch(error.errorCode) {\n case tableau.ErrorCodes.DialogClosedByUser:\n console.log('[Extension.js] Dialog was closed by user');\n refreshSettings();\n break;\n default:\n console.error('[Extension.js]', error.message);\n }\n });\n }\n\n function clickExportHandler() {\n let sheetSettings = tableau.extensions.settings.get('selectedSheets');\n const meta = JSON.parse(sheetSettings);\n if (tableau.extensions.environment.context === \"server\") {\n exportToExcel(meta, 'server', props.filename);\n } else {\n console.log('[Extension.js] Tableau Version', tableau.extensions.environment.tableauVersion);\n if (compareVersions.compare(tableau.extensions.environment.tableauVersion, '2019.4.0', '>=') ) {\n exportToExcel(meta, 'desktop', props.filename);\n } else {\n desktopExportHandler ();\n }\n }\n }\n\n function desktopExportHandler () {\n const popupUrl = `${window.location.origin}/desktopexport`;\n tableau.extensions.ui.displayDialogAsync(popupUrl, '', { height: 350, width: 400 }).then((closePayload) => {\n console.log('[Extension.js] Export window closed')\n }).catch((error) => {\n switch(error.errorCode) {\n case tableau.ErrorCodes.DialogClosedByUser:\n console.log('[Extension.js] Export window was closed by user');\n break;\n default:\n console.error('[Extension.js]', error.message);\n }\n });\n }\n\n return (\n \n );\n}\n\nexport default Extension;\n","import React from 'react';\nimport { Checkbox, TextField, Stepper } from '@tableau/tableau-ui';\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\nimport MuiAccordion from '@material-ui/core/Accordion';\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\nimport AccordionSummary from '@material-ui/core/AccordionSummary';\n\nconst useStyles = makeStyles(theme => ({\n root: {\n width: '100%',\n },\n heading: {\n fontSize: theme.typography.pxToRem(15),\n },\n details: {\n alignItems: 'center',\n },\n column: {\n flexBasis: '50%',\n },\n label: {\n display: 'block',\n fontSize: 12,\n lineHeight: '21px',\n order: 0\n },\n group: {\n color: 'rgba(0, 0, 0, 0.56)',\n display: 'inline-flex',\n flexDirection: 'column',\n fontFamily: 'Benton Sans, Arial, Helvetica, sans-serif',\n position: 'relative',\n },\n strikeThrough: {\n textDecoration: 'line-through',\n marginRight: 5,\n color: 'rgba(156, 156, 156, 0.8)',\n }\n}));\n\nconst Accordion = withStyles({\n root: {\n boxShadow: 'none',\n '&:not(:last-child)': {\n borderBottom: 0,\n },\n '&:before': {\n display: 'none',\n },\n '&$expanded': {\n margin: 'auto',\n },\n },\n expanded: {},\n})(MuiAccordion);\n\nfunction Sheet(props) {\n\n const classes = useStyles();\n\n const inputProps = {\n label: 'Rename',\n onChange: e => props.changeName(e.target.value),\n onClear: () => {\n props.changeName(null); \n },\n placeholder: props.name || 'Override Export Tab Name',\n style: { width: 200 },\n value: props.rename || '',\n };\n\n function renderSheetName(name, rename) {\n if (rename) {\n return (\n
\n {name}\n {rename}\n
\n )\n }\n return (\n
{name}
\n )\n }\n\n return (\n
\n \n \n
\n {renderSheetName(props.name, props.rename)}\n
\n \n \n
\n \n
\n
\n
\n \n props.changeOrder(value)} className={classes.stepper} />\n
\n
\n
\n
\n
\n );\n\n}\n\nexport default Sheet;\n","import React from 'react';\nimport Sheet from './Sheet/Sheet'\n\nfunction SelectSheets(props) {\n\n if (props && props.sheets) {\n return props.sheets.map((sheet, index) => {\n return (\n props.selectSheet(index)}\n changeName={(name) => props.changeName(index,name)}\n changeOrder={(newPos) => props.changeOrder(index,newPos)}\n />\n );\n });\n } else {\n return (\n
\n )\n }\n\n}\n\nexport default SelectSheets;\n","import React from 'react';\nimport { Checkbox, TextField, Stepper } from '@tableau/tableau-ui';\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\nimport MuiAccordion from '@material-ui/core/Accordion';\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\nimport AccordionSummary from '@material-ui/core/AccordionSummary';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\n\nconst useStyles = makeStyles(theme => ({\n root: {\n width: '100%',\n },\n heading: {\n fontSize: theme.typography.pxToRem(15),\n },\n details: {\n alignItems: 'center',\n },\n column: {\n flexBasis: '50%',\n },\n label: {\n display: 'block',\n fontSize: 12,\n lineHeight: '21px',\n order: 0,\n },\n group: {\n color: 'rgba(0, 0, 0, 0.56)',\n display: 'inline-flex',\n flexDirection: 'column',\n fontFamily: 'Benton Sans, Arial, Helvetica, sans-serif',\n position: 'relative',\n },\n strikeThrough: {\n textDecoration: 'line-through',\n color: 'rgba(156, 156, 156, 0.8)',\n marginRight: 5,\n }\n}));\n\nconst ExpansionPanel = withStyles({\n root: {\n boxShadow: 'none',\n '&:not(:last-child)': {\n borderBottom: 0,\n },\n '&:before': {\n display: 'none',\n },\n '&$expanded': {\n margin: 'auto',\n },\n },\n expanded: {},\n})(MuiAccordion);\n\nfunction Column(props) {\n\n const classes = useStyles();\n\n const inputProps = {\n label: 'Rename',\n onChange: e => props.changeName(e.target.value),\n onClear: () => {\n props.changeName(null);\n },\n placeholder: props.name || 'Override Export Column Name',\n style: { width: 200 },\n value: props.rename || '',\n };\n\n function renderColName(name, rename) {\n if (rename) {\n return (\n
\n {name}\n {rename}\n
\n )\n }\n return (\n
{name}
\n )\n }\n\n return (\n
\n \n }\n aria-controls=\"panel1c-content\"\n id=\"panel1c-header\"\n >\n
\n {renderColName(props.name, props.rename)}\n
\n \n \n
\n \n
\n
\n
\n \n props.changeOrder(value)} className={classes.stepper} />\n
\n
\n
\n
\n
\n );\n\n}\n\nexport default Column;\n","import React from 'react';\nimport Column from './Column/Column'\n\nfunction Sheets(props) {\n\n if (props && props.cols) {\n return props.cols.map((col, index) => {\n return (\n props.colSelect(props.id, index)}\n changeName={(name) => props.changeName(props.id, index, name)}\n cols={props.cols}\n changeOrder={(newPos) => props.changeOrder(props.id, index, newPos)}\n />\n );\n });\n } else {\n return (\n
\n )\n }\n\n}\n\nexport default Sheets;\n","import React from 'react';\nimport Sheet from './Sheet/Sheet'\n\nfunction SelectColumns(props) {\n\n if (props && props.sheets) {\n return props.sheets.map((sheet, index) => {\n if (sheet.selected) {\n return (\n
\n
{sheet.sheetName}
\n \n
\n );\n } else {\n return (\n
\n )\n }\n });\n } else {\n return (\n
\n )\n }\n\n}\n\nexport default SelectColumns;\n","import React from 'react';\nimport { Button } from '@tableau/tableau-ui';\nimport packageJson from '../../../../package.json';\n\nconst placeButtons = {\n bottom: 10,\n right: 10,\n position: 'fixed'\n}\n\nconst version = {\n left: 10,\n bottom: 10,\n position: 'fixed',\n color: '#4f4f4f',\n fontSize: 12\n}\n\nfunction ActionButtons(props) {\n\n return (\n
\n
v{packageJson.version}
\n
\n \n \n
\n
\n )\n\n}\n\nexport default ActionButtons;\n","import React from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Grid from '@material-ui/core/Grid';\nimport { TextField, DropdownSelect } from '@tableau/tableau-ui';\n\nconst useStyles = makeStyles(theme => ({\n root: {\n flexGrow: 1,\n },\n gridItem: {\n marginTop: 10\n }\n}));\n\nfunction ConfigureTab(props) {\n const classes = useStyles();\n\n const labelProps = {\n label: 'Button Label',\n onChange: e => {\n console.log('[ConfigureTab.js] Updating Button Label',e.target.value)\n props.updateLabel(e.target.value)\n },\n onClear: () => {\n props.updateLabel('Export All');\n },\n placeholder: 'Button Label',\n style: { width: 400 },\n value: props.label || '',\n };\n\n const filenameProps = {\n label: 'Export Filename',\n onChange: e => props.updateFilename(JSON.stringify(e.target.value)),\n onClear: () => {\n props.updateFilename('ExportAll');\n },\n placeholder: 'Export Filename',\n style: { width: 400 },\n value: props.filename || '',\n };\n\n const styleDropDown = {\n marginLeft: 10\n }\n\n return (\n
\n \n \n \n \n \n \n \n \n \n Set Button Style to:\n props.updateButtonStyle(JSON.stringify(e.target.value))} style={styleDropDown}>\n \n \n \n \n \n \n \n
\n )\n\n}\n\nexport default ConfigureTab;\n","export default __webpack_public_path__ + \"static/media/logo.c38a9163.svg\";","import React, { useState, useEffect } from 'react';\nimport { Tabs } from '@tableau/tableau-ui';\nimport SelectSheets from './SelectSheets/SelectSheets';\nimport SelectColumns from './SelectColumns/SelectColumns';\nimport ActionButtons from './ActionButtons/ActionButtons';\nimport ConfigureTab from './ConfigureTab/ConfigureTab';\nimport { saveSettings, setSettings, initializeMeta, revalidateMeta } from '../func/func';\nimport logo from './logo.svg';\nimport './Configure.css';\n\n// Declare this so our linter knows that tableau is a global object\n/* global tableau */\n\nconst configBody = {\n height: 'calc(100vh - 170px)',\n}\n\nconst logoBanner = {\n backgroundColor: 'rgb(245, 245, 245)',\n height: 26,\n paddingTop: 12,\n paddingBottom: 12,\n paddingLeft: 18,\n}\n\nfunction Configure(props) {\n const [tab, switchTab] = useState(0);\n const tabs = [ { content: 'Select Sheets'}, { content: 'Select Columns' }, { content: 'Configure' } ];\n\n useEffect(() => {\n console.log('[Configure.js] useEffect');\n //Initialise Extension\n tableau.extensions.initializeDialogAsync().then((openPayload) => {\n\n console.log('[Configure.js] Initialise Dialog', openPayload);\n\n let sheetSettings = tableau.extensions.settings.get('selectedSheets');\n\n if (sheetSettings && sheetSettings != null) {\n const existingSettings = JSON.parse(sheetSettings);\n console.log('[Configure.js] Existing Sheet Settings Found', sheetSettings);\n revalidateMeta(existingSettings)\n .then(meta => {\n props.updateMeta(meta);\n });\n }\n\n let labelSettings = tableau.extensions.settings.get('buttonLabel');\n\n if (labelSettings && labelSettings != null) {\n labelSettings = labelSettings.replace(/\"/g,'');\n console.log('[Configure.js] initializeDialogAsync Existing Label Settings Found', labelSettings);\n props.updateLabel(labelSettings);\n }\n\n let styleSettings = tableau.extensions.settings.get('buttonStyle');\n\n if (styleSettings && styleSettings != null) {\n console.log('[Configure.js] initializeDialogAsync Existing Label Style Found', styleSettings);\n props.updateButtonStyle(styleSettings);\n }\n\n let filenameSettings = tableau.extensions.settings.get('filename');\n\n if (filenameSettings && filenameSettings != null) {\n console.log('[Configure.js] initializeDialogAsync Existing Filename Found', filenameSettings);\n props.updateFilename(filenameSettings);\n }\n\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n function selectSheetHandler(i) {\n console.log('[Configure.js] selectSheetHandler', i);\n const meta = props.meta;\n meta[i].selected = !meta[i].selected;\n props.updateMeta(meta);\n props.changeSettings(true);\n }\n\n function selectColumnHandler(sheetIdx, colIdx) {\n console.log('[Configure.js] selectColumnHandler', sheetIdx, colIdx);\n const meta = props.meta;\n const sheet = meta[sheetIdx];\n sheet.columns[colIdx].selected = !sheet.columns[colIdx].selected;\n meta[sheetIdx] = sheet;\n props.updateMeta(meta);\n props.changeSettings(true);\n }\n\n function changeSheetNameHandler(i, name) {\n console.log('[Configure.js] changeSheetNameHandler', i, name);\n const meta = props.meta;\n meta[i].changeName = name;\n props.updateMeta(meta);\n props.changeSettings(true);\n }\n\n function changeColumnNameHandler(sheetIdx, colIdx, name) {\n console.log('[Configure.js] changeColumnNameHandler', sheetIdx, colIdx, name);\n const meta = props.meta;\n const sheet = meta[sheetIdx];\n sheet.columns[colIdx].changeName = name;\n meta[sheetIdx] = sheet;\n props.updateMeta(meta);\n props.changeSettings(true);\n }\n\n function array_move(arr, old_index, new_index) {\n if (new_index >= arr.length) {\n var k = new_index - arr.length + 1;\n while (k--) {\n arr.push(undefined);\n }\n }\n arr.splice(new_index, 0, arr.splice(old_index, 1)[0]);\n return arr;\n };\n\n function changeSheetOrderHandler(i, newPos) {\n console.log('[Configure.js] changeSheetOrderHandler', i, newPos);\n if (newPos > 0) {\n const meta = array_move(props.meta, i, newPos - 1);\n props.updateMeta(meta);\n props.changeSettings(true);\n }\n }\n\n function changeColumnOrderHandler(sheetIdx, colIdx, newPos) {\n console.log('[Configure.js] changeColumnOrderHandler', sheetIdx, colIdx, newPos);\n if (newPos > 0) {\n const meta = props.meta;\n const sheet = meta[sheetIdx];\n const columns = array_move(sheet.columns, colIdx, newPos - 1);\n columns.map((col, idx) => {\n col.order = idx;\n return col;\n });\n meta[sheetIdx].columns = columns;\n props.updateMeta(meta);\n props.changeSettings(true);\n }\n }\n\n function updateLabelHandler(label) {\n console.log('[Configure.js] changeUpdateLabelHandler', label);\n props.updateLabel(label);\n props.changeSettings(true);\n }\n\n function updateButtonStyleHandler(style) {\n console.log('[Configure.js] changeLabelStyleHandler', style);\n props.updateButtonStyle(style);\n props.changeSettings(true);\n }\n\n function updateFilenameHandler(filename) {\n console.log('[Configure.js] updateFilenameHandler', filename);\n props.updateFilename(filename);\n props.changeSettings(true);\n }\n\n function saveSettingsHandler() {\n console.log('[Configure.js] saveSettingsHandler - Saving Settings', props);\n const meta = props.meta;\n const label = props.label;\n const style = props.style;\n const filename = props.filename;\n props.disableButton(false);\n console.log('[Configure.js] saveSettingsHandler - sheets', meta);\n setSettings('sheets', meta)\n .then(setSettings('label', label))\n .then(setSettings('style', style))\n .then(setSettings('filename', filename))\n .then(saveSettings())\n .then((savedSettings) => {\n console.log('[Configure.js] Saved Settings', savedSettings);\n props.changeSettings(false);\n let sheetSettings = tableau.extensions.settings.get('selectedSheets');\n if (sheetSettings && sheetSettings != null) {\n const existingSettings = JSON.parse(sheetSettings);\n console.log('[Configure.js] Sheet Settings Updated', existingSettings);\n }\n })\n }\n\n function resetSettingsHandler() {\n console.log('[Configure.js] resetSettingsHandler - Reset Settings');\n initializeMeta()\n .then(meta => {\n props.updateMeta(meta);\n });\n }\n\n return (\n
\n
The Information Lab
\n {\n switchTab(index);\n }}\n selectedTabIndex={tab}\n tabs={tabs}\n >
\n { tab === 0 ? : null }\n { tab === 1 ? : null }\n { tab === 2 ? : null }\n
\n \n \n
\n );\n}\n\nexport default Configure;\n","import React, { useEffect } from 'react';\nimport Typography from '@material-ui/core/Typography';\nimport Grid from '@material-ui/core/Grid';\nimport './DesktopExport.css';\n// import { exportToExcel } from '../func/func';\n\n// Declare this so our linter knows that tableau is a global object\n/* global tableau */\n\nfunction DesktopExport() {\n\n console.log('[DesktopExport.js] Initialise Export Screen');\n\n useEffect(() => {\n console.log('[DesktopExport.js] useEffect');\n //Initialise Extension\n tableau.extensions.initializeDialogAsync().then((openPayload) => {\n\n console.log('[DesktopExport.js] Initialise Dialog', openPayload);\n\n let sheetSettings = tableau.extensions.settings.get('selectedSheets');\n\n if (sheetSettings && sheetSettings != null) {\n // console.log('[DesktopExport.js] Existing Sheet Settings Found', sheetSettings);\n // const meta = JSON.parse(sheetSettings);\n // exportToExcel(meta, 'desktop')\n // .then((blob) => {\n // navigator.webkitPersistentStorage.requestQuota (\n // blob.byteLength, function(grantedBytes) {\n // window.webkitRequestFileSystem(window.PERSISTENT, grantedBytes, onInitFs, handleError);\n //\n // }, function(e) { console.log('Error', e); }\n // );\n // });\n }\n\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n \n \n \n

Hi There!

\n

It looks like you're trying to create the Excel file using a desktop version earlier than 2019.4. Unfortunately you {\"can't\"} as the download function is disabled, however there are two solutions. Either publish your dashboard to Server where the Excel file will download as expected, or upgrade your copy of Desktop to 2019.4 or greater.

\n

To those who've previously emailed Tableau to request they enable the download feature...we did it!! Thank you so much for taking the time to present the case, I {\"can't\"} believe how many emails you sent. {\"I'm\"} humbled.

\n

Craig

\n
\n
\n \n );\n}\n\nexport default DesktopExport;\n","import React, { Component } from 'react';\nimport { BrowserRouter, Route, Switch } from 'react-router-dom';\nimport Extension from '../components/Extension/Extension';\nimport Configure from '../components/Configure/Configure';\nimport DesktopExport from '../components/DesktopExport/DesktopExport';\nimport './Main.css';\n\nclass Main extends Component {\n\n constructor(props) {\n console.log('[Main.js] new constructor');\n super(props);\n this.state = {\n meta : undefined,\n metaVersion: 2,\n button: {\n label : 'Export All',\n style: 'outline',\n disabled : true\n },\n isLoading: false,\n filename: 'ExportAll',\n settingsChanged: false,\n };\n console.log('[Main.js] state initialised', this.state);\n }\n\n componentWillMount () {\n console.log('[Main.js] componentWillMount');\n }\n\n componentDidMount() {\n console.log('[Main.js] componentDidMount');\n }\n\n metaVersionChangedHandler = (version) => {\n console.log(`[Main.js] Updating meta version to ${version}`);\n this.setState({metaVersion: version});\n }\n\n labelChangedHandler = (labelTxt) => {\n console.log(`[Main.js] Updating label text to ${labelTxt}`);\n const button = {...this.state.button, label: labelTxt};\n this.setState({button});\n }\n\n filenameChangedHandler = (filename) => {\n console.log(`[Main.js] Updating filename to ${JSON.parse(filename)}`);\n this.setState({filename: JSON.parse(filename)});\n }\n\n buttonStateChangedHandler = (disabled) => {\n console.log(`[Main.js] Changing button state to ${disabled}`);\n const button = {...this.state.button, disabled};\n this.setState({button});\n }\n\n buttonStyleChangedHandler = (style) => {\n console.log(`[Main.js] Changing button style to ${style}`);\n const button = {...this.state.button, style: JSON.parse(style)};\n this.setState({button});\n }\n\n metaChangedHandler = (newSettings) => {\n console.log('[Main.js] Meta changed', newSettings);\n this.setState({meta: newSettings});\n }\n\n settingsChangedHandler = (state) => {\n console.log('[Main.js] Settings changed', state);\n this.setState({settingsChanged: state});\n }\n\n resetSettingsHandler = () => {\n console.log('[Main.js] Reset Settings');\n this.setState({\n meta : undefined,\n metaVersion: 2,\n button: {\n label : 'Export All',\n style: 'outline',\n disabled : true\n },\n isLoading: false,\n filename: 'ExportAll',\n settingsChanged: false,\n });\n }\n\n renderExtension = () => {\n return (\n \n )\n }\n\n renderConfigure = () => {\n return (\n \n )\n }\n\n renderDesktopExport = () => {\n return (\n \n )\n }\n\n render() {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n }\n}\n\nexport default Main;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import 'react-app-polyfill/ie11';\nimport 'react-app-polyfill/stable';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport Main from './containers/Main';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(
, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}