{"version":3,"sources":["index.js"],"names":["container","lang","URLSearchParams","window","location","search","get","fileprefix","App","_this","Object","C_src_staticwebsite_static_website_blob_browser_node_modules_babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_0__","this","C_src_staticwebsite_static_website_blob_browser_node_modules_babel_runtime_helpers_esm_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__","C_src_staticwebsite_static_website_blob_browser_node_modules_babel_runtime_helpers_esm_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__","call","state","data","pages","markers","loading","prefix","fetchData","listBlobs","bind","C_src_staticwebsite_static_website_blob_browser_node_modules_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5__","instance","_this2","setState","anonymousCredential","AnonymousCredential","pipeline","StorageURL","newPipeline","serviceURL","ServiceURL","concat","containerName","containerURL","ContainerURL","fromServiceURL","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","icon","target","iconsprops","getFileTypeIconProps","type","FileIconType","folder","size","substr","lastIndexOf","replace","extension","react__WEBPACK_IMPORTED_MODULE_6___default","a","createElement","_fluentui_react_lib_Icon__WEBPACK_IMPORTED_MODULE_12__","href","_this3","_this$state","dataset","name","react_table__WEBPACK_IMPORTED_MODULE_14__","columns","Header","accessor","Cell","renderLink","value","manual","onFetchData","defaultPageSize","className","React","Component","initializeFileTypeIcons","render","document","getElementById"],"mappings":"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","file":"static/js/main.547472c4.chunk.js","sourcesContent":["import React, {useEffect} from \"react\";\r\nimport { render } from \"react-dom\";\r\nimport _ from \"lodash\";\r\nimport \"./index.css\";\r\nimport { FileIconType, initializeFileTypeIcons } from '@fluentui/react-file-type-icons';\r\nimport { Icon } from '@fluentui/react/lib/Icon';\r\nimport { getFileTypeIconProps } from '@fluentui/react-file-type-icons';\r\n\r\n// This sample uses React Table\r\n// Check it out at https://react-table.js.org/#/story/readme\r\nimport ReactTable from \"react-table\";\r\nimport \"react-table/react-table.css\";\r\n\r\n// Import Azure Storage Blob SDK\r\nimport { Aborter, ServiceURL, ContainerURL, StorageURL, AnonymousCredential } from \"@azure/storage-blob\";\r\n\r\n// Account name, and the container to list from\r\nconst account = 'amaretechniek'\r\nvar container = 'files-nl'\r\nconst urlParams = new URLSearchParams(window.location.search);\r\nvar lang = urlParams.get('lang');\r\nif (lang==='en')\r\n{\r\n container = 'files-en'\r\n}\r\nelse\r\n{\r\n lang='nl';\r\n\r\n}\r\n\r\n\r\n\r\nconst fileprefix = 'https://'+account+'.blob.core.windows.net/'+container+'/' \r\n\r\nclass App extends React.Component {\r\n constructor() {\r\n super();\r\n this.state = {\r\n data: [],\r\n pages: 2,\r\n markers: [],\r\n loading: true,\r\n prefix: \"\",\r\n lang:\"nl\"\r\n };\r\n this.fetchData = this.listBlobs.bind(this);\r\n }\r\n\r\n listBlobs(state, instance) {\r\n // this lists Blobs in pages defined in state.pageSize\r\n this.setState({ loading: true });\r\n \r\n // Use AnonymousCredential since $web container is made a 'public container' \r\n // and does not require authorization\r\n const anonymousCredential = new AnonymousCredential();\r\n const pipeline = StorageURL.newPipeline(anonymousCredential);\r\n \r\n const serviceURL = new ServiceURL(\r\n `https://${account}.blob.core.windows.net`,\r\n pipeline\r\n );\r\n \r\n // If you are using a SAS token, simply append to ContainerURL here. \r\n // We will use anonymous access hence no SAS token\r\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`;\r\n const containerURL = ContainerURL.fromServiceURL(serviceURL, containerName);\r\n \r\n // Fetch the prefix in the query params to browse into folders\r\n const urlParams = new URLSearchParams(window.location.search);\r\n const prefix = urlParams.get('prefix');\r\n\r\n // List objects from Blob storage using the prefix\r\n // Delimiter for virtual directories is a forward slash '/' here\r\n containerURL.listBlobHierarchySegment (\r\n Aborter.none,\r\n \"/\",\r\n state.markers[state.page],\r\n {\r\n maxresults: state.pageSize,\r\n prefix: prefix\r\n }\r\n ).then(res => {\r\n // Store the nextMarker in an array for prev/next buttons only if there are more blobs to show\r\n const markers = state.markers.slice();\r\n var totalPages = state.page+1;\r\n if (res.nextMarker) {\r\n markers[(state.page+1)] = res.nextMarker;\r\n totalPages++;\r\n }\r\n \r\n // Combine the found virtual directories and files\r\n Array.prototype.push.apply(res.segment.blobItems, res.segment.blobPrefixes)\r\n\r\n // This is to sort rows, and handles blobName, contentLength and lastModified time\r\n const sortedData = _.orderBy(\r\n res.segment.blobItems,\r\n state.sorted.map(sort => {\r\n return row => {\r\n if (row[sort.id] === null) {\r\n return -Infinity;\r\n } // TODO: following is a workaround to special case contentLength and lastModified\r\n else if(row[sort.id] === undefined){\r\n if(row.properties === undefined)\r\n {\r\n return -Infinity;\r\n } else {\r\n return row.properties[sort.id];\r\n }\r\n }\r\n return typeof row[sort.id] === \"string\"\r\n ? row[sort.id].toLowerCase()\r\n : row[sort.id];\r\n };\r\n }),\r\n state.sorted.map(d => (d.desc ? \"desc\" : \"asc\"))\r\n );\r\n\r\n // Store the state\r\n this.setState({\r\n data: sortedData,\r\n pages: totalPages,\r\n markers: markers,\r\n loading: false,\r\n prefix: prefix, \r\n lang: lang\r\n });\r\n });\r\n }\r\n\r\n // Custom links for various scenarios (handles blobs, directories and go back link)\r\n renderLink(blobName, prefix) {\r\n var link;\r\n var icon = \"\"\r\n var target = \"\"\r\n \r\n var iconsprops = getFileTypeIconProps({ type: FileIconType.folder, size: 20 });\r\n if(blobName === \"../\")\r\n {\r\n prefix = prefix.substr(0,prefix.lastIndexOf('/'))\r\n prefix = prefix.substr(0,prefix.lastIndexOf('/')+1)\r\n if (prefix == \"\")\r\n {\r\n link = \"/?lang=\"+ this.state.lang; \r\n }\r\n else\r\n {\r\n link = \"?lang=\"+ this.state.lang + \"&prefix=\" + prefix;\r\n }\r\n icon = \"documentFolder\"\r\n }\r\n else if(blobName.slice(-1) === \"/\")\r\n {\r\n link = \"?lang=\"+ this.state.lang + \"&prefix=\" + blobName\r\n blobName = blobName.replace(prefix, \"\");\r\n icon = \"documentFolder\"\r\n } else {\r\n link = fileprefix + blobName\r\n icon = blobName.substr(blobName.lastIndexOf('.') + 1);\r\n blobName = blobName.replace(prefix, \"\");\r\n target=\"\"\r\n iconsprops = getFileTypeIconProps({ extension: icon, size: 20 });\r\n }\r\n \r\n return (\r\n
\r\n {blobName}\r\n
\r\n );\r\n }\r\n\r\n render() {\r\n const { data, pages, markers, loading, prefix, lang } = this.state;\r\n\r\n // If this is a directory view, add a go back link for the root\r\n var dataset = data\r\n if(prefix !== null)\r\n {\r\n dataset = [{name: \"../\"}].concat(dataset);\r\n }\r\n\r\n return (\r\n
\r\n (\r\n this.renderLink(row.value, prefix)\r\n )\r\n }\r\n \r\n ]}\r\n manual // Do not paginate as we can only list objects in pages from Blob storage\r\n data={dataset}\r\n pages={pages} \r\n markers={markers}\r\n loading={loading} \r\n onFetchData={this.fetchData} \r\n defaultPageSize={10}\r\n className=\"-striped -highlight\"\r\n />\r\n
\r\n );\r\n }\r\n \r\n}\r\ninitializeFileTypeIcons();\r\nrender(, document.getElementById(\"root\"));"],"sourceRoot":""}