{"version":3,"sources":["index.js"],"names":["App","_this","Object","_usr_src_app_node_modules_babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_0__","this","_usr_src_app_node_modules_babel_runtime_helpers_esm_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__","_usr_src_app_node_modules_babel_runtime_helpers_esm_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__","call","state","data","pages","markers","loading","prefix","fetchData","listBlobs","bind","_usr_src_app_node_modules_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5__","instance","_this2","setState","anonymousCredential","AnonymousCredential","pipeline","StorageURL","newPipeline","serviceURL","ServiceURL","concat","containerURL","ContainerURL","fromServiceURL","URLSearchParams","window","location","search","get","listBlobHierarchySegment","Aborter","none","page","maxresults","pageSize","then","res","slice","totalPages","nextMarker","Array","prototype","push","apply","segment","blobItems","blobPrefixes","sortedData","_","orderBy","sorted","map","sort","row","id","Infinity","undefined","properties","toLowerCase","d","desc","blobName","link","react__WEBPACK_IMPORTED_MODULE_6___default","a","createElement","href","_this3","_this$state","dataset","name","react_table__WEBPACK_IMPORTED_MODULE_10__","columns","Header","accessor","Cell","renderLink","value","lastModified","toISOString","maxWidth","contentLength","manual","onFetchData","defaultPageSize","className","React","Component","render","document","getElementById"],"mappings":"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","file":"static/js/main.9e421603.chunk.js","sourcesContent":["import React from \"react\";\nimport { render } from \"react-dom\";\nimport _ from \"lodash\";\nimport \"./index.css\";\n\n// This sample uses React Table\n// Check it out at https://react-table.js.org/#/story/readme\nimport ReactTable from \"react-table\";\nimport \"react-table/react-table.css\";\n\n// Import Azure Storage Blob SDK\nimport { Aborter, ServiceURL, ContainerURL, StorageURL, AnonymousCredential } from \"@azure/storage-blob\";\n\n// Account name, and the container to list from\nconst account = 'communityimproveosmdumps'\nconst container = 'dumps'\n\nclass App extends React.Component {\n constructor() {\n super();\n this.state = {\n data: [],\n pages: 2,\n markers: [],\n loading: true,\n prefix: \"\"\n };\n this.fetchData = this.listBlobs.bind(this);\n }\n \n listBlobs(state, instance) {\n // this lists Blobs in pages defined in state.pageSize\n this.setState({ loading: true });\n \n // Use AnonymousCredential since $web container is made a 'public container' \n // and does not require authorization\n const anonymousCredential = new AnonymousCredential();\n const pipeline = StorageURL.newPipeline(anonymousCredential);\n \n const serviceURL = new ServiceURL(\n `https://${account}.blob.core.windows.net`,\n pipeline\n );\n \n // If you are using a SAS token, simply append to ContainerURL here. \n // We will use anonymous access hence no SAS token\n const containerName = container //+ `?st=2018-11-06T06%3A15%3A24Z&se=2019-11-07T06%3A15%3A00Z&sp=rl&sv=2018-03-28&sr=c&sig=4vCT7aInDWRiypkuYlezN8dos0K2h2DvQ0pnNkMJSFs%3D`;\n const containerURL = ContainerURL.fromServiceURL(serviceURL, containerName);\n \n // Fetch the prefix in the query params to browse into folders\n const urlParams = new URLSearchParams(window.location.search);\n const prefix = urlParams.get('prefix');\n\n // List objects from Blob storage using the prefix\n // Delimiter for virtual directories is a forward slash '/' here\n containerURL.listBlobHierarchySegment (\n Aborter.none,\n \"/\",\n state.markers[state.page],\n {\n maxresults: state.pageSize,\n prefix: prefix\n }\n ).then(res => {\n // Store the nextMarker in an array for prev/next buttons only if there are more blobs to show\n const markers = state.markers.slice();\n var totalPages = state.page+1;\n if (res.nextMarker) {\n markers[(state.page+1)] = res.nextMarker;\n totalPages++;\n }\n \n // Combine the found virtual directories and files\n Array.prototype.push.apply(res.segment.blobItems, res.segment.blobPrefixes)\n\n // This is to sort rows, and handles blobName, contentLength and lastModified time\n const sortedData = _.orderBy(\n res.segment.blobItems,\n state.sorted.map(sort => {\n return row => {\n if (row[sort.id] === null) {\n return -Infinity;\n } // TODO: following is a workaround to special case contentLength and lastModified\n else if(row[sort.id] === undefined){\n if(row.properties === undefined)\n {\n return -Infinity;\n } else {\n return row.properties[sort.id];\n }\n }\n return typeof row[sort.id] === \"string\"\n ? row[sort.id].toLowerCase()\n : row[sort.id];\n };\n }),\n state.sorted.map(d => (d.desc ? \"desc\" : \"asc\"))\n );\n\n // Store the state\n this.setState({\n data: sortedData,\n pages: totalPages,\n markers: markers,\n loading: false,\n prefix: prefix\n });\n });\n }\n\n // Custom links for various scenarios (handles blobs, directories and go back link)\n renderLink(blobName) {\n var link;\n if(blobName === \"../\")\n {\n link = \"/\"\n }\n else if(blobName.slice(-1) === \"/\")\n {\n link = \"?prefix=\" + blobName\n } else {\n link = \"/\" + blobName\n }\n return (\n \n {blobName}\n \n );\n }\n\n render() {\n const { data, pages, markers, loading, prefix } = this.state;\n\n // If this is a directory view, add a go back link for the root\n var dataset = data\n if(prefix !== null)\n {\n dataset = [{name: \"../\"}].concat(dataset);\n }\n\n return (\n
\n (\n this.renderLink(row.value)\n )\n },\n {\n Header: \"Last Modified\",\n id: \"lastModified\",\n accessor: (d) => {\n if(typeof d.properties !== \"undefined\" ){\n return d.properties.lastModified.toISOString()\n }\n },\n maxWidth: 400\n },\n {\n Header: \"Content Length\",\n id: \"contentLength\",\n accessor: (d) => {\n if(typeof d.properties !== \"undefined\"){\n return d.properties.contentLength\n }\n },\n maxWidth: 200\n }\n ]}\n manual // Do not paginate as we can only list objects in pages from Blob storage\n data={dataset}\n pages={pages} \n markers={markers}\n loading={loading} \n onFetchData={this.fetchData} \n defaultPageSize={20}\n className=\"-striped -highlight\"\n />\n
\n );\n }\n}\n\nrender(, document.getElementById(\"root\"));"],"sourceRoot":""}