diff --git a/browser/app/index.js b/browser/app/index.js
index 255de4d86..65293294f 100644
--- a/browser/app/index.js
+++ b/browser/app/index.js
@@ -41,6 +41,8 @@ import _Login from './js/components/Login.js'
import _Browse from './js/components/Browse.js'
import fontAwesome from 'font-awesome/css/font-awesome.css'
+import MaterialDesignIconicFonts from 'material-design-iconic-font/dist/css/material-design-iconic-font.min.css'
+
import Web from './js/web'
window.Web = Web
diff --git a/browser/app/js/actions.js b/browser/app/js/actions.js
index 8dfea65e9..da8ceb1c6 100644
--- a/browser/app/js/actions.js
+++ b/browser/app/js/actions.js
@@ -24,6 +24,8 @@ export const SET_CURRENT_BUCKET = 'SET_CURRENT_BUCKET'
export const SET_CURRENT_PATH = 'SET_CURRENT_PATH'
export const SET_BUCKETS = 'SET_BUCKETS'
export const ADD_BUCKET = 'ADD_BUCKET'
+export const REMOVE_BUCKET = 'REMOVE_BUCKET'
+export const SHOW_BUCKET_DROPDOWN = 'SHOW_BUCKET_DROPDOWN'
export const SET_VISIBLE_BUCKETS = 'SET_VISIBLE_BUCKETS'
export const SET_OBJECTS = 'SET_OBJECTS'
export const APPEND_OBJECTS = 'APPEND_OBJECTS'
@@ -173,6 +175,27 @@ export const addBucket = bucket => {
}
}
+export const removeBucket = bucket => {
+ return {
+ type: REMOVE_BUCKET,
+ bucket
+ }
+}
+
+export const showBucketDropdown = bucket => {
+ return {
+ type: SHOW_BUCKET_DROPDOWN,
+ showBucketDropdown: true
+ }
+}
+
+export const hideBucketDropdown = bucket => {
+ return {
+ type: SHOW_BUCKET_DROPDOWN,
+ showBucketDropdown: false
+ }
+}
+
export const showMakeBucketModal = () => {
return {
type: SHOW_MAKEBUCKET_MODAL,
@@ -314,6 +337,31 @@ export const selectBucket = (newCurrentBucket, prefix) => {
}
}
+export const deleteBucket = (bucket) => {
+ return (dispatch, getState) => {
+ // DeleteBucket() RPC call will ONLY delete a bucket if it is empty of
+ // objects. This means a call can just be sent, as it is entirely reversable
+ // and won't do any permanent damage.
+ web.DeleteBucket({
+ bucketName: bucket
+ })
+ .then(() => {
+ dispatch(showAlert({
+ type: 'info',
+ message: `Bucket '${bucket}' has been deleted.`
+ }))
+ dispatch(removeBucket(bucket))
+ })
+ .catch(err => {
+ let message = err.message
+ dispatch(showAlert({
+ type: 'danger',
+ message: message
+ }))
+ })
+ }
+}
+
export const listObjects = () => {
return (dispatch, getState) => {
const {buckets, currentBucket, currentPath, marker, objects, istruncated, web} = getState()
diff --git a/browser/app/js/components/Browse.js b/browser/app/js/components/Browse.js
index 4d66937cc..b6fbe40f6 100644
--- a/browser/app/js/components/Browse.js
+++ b/browser/app/js/components/Browse.js
@@ -210,9 +210,19 @@ export default class Browse extends React.Component {
dispatch(actions.hideAbout())
}
+ toggleBucketDropdown(e) {
+ const {dispatch, showBucketDropdown} = this.props
+ if (showBucketDropdown) {
+ dispatch(actions.hideBucketDropdown())
+ } else {
+ dispatch(actions.showBucketDropdown())
+ }
+ }
+
showBucketPolicy(e) {
e.preventDefault()
const {dispatch} = this.props
+ this.toggleBucketDropdown(e)
dispatch(actions.showBucketPolicy())
}
@@ -222,10 +232,17 @@ export default class Browse extends React.Component {
dispatch(actions.hideBucketPolicy())
}
+ deleteBucket(e, bucket) {
+ e.preventDefault()
+ const {dispatch} = this.props
+ this.toggleBucketDropdown(e)
+ dispatch(actions.deleteBucket(bucket))
+ browserHistory.push(`${minioBrowserPrefix}/`)
+ }
+
uploadFile(e) {
e.preventDefault()
- const {dispatch, buckets} = this.props
-
+ const {dispatch, buckets, currentBucket} = this.props
if (buckets.length === 0) {
dispatch(actions.showAlert({
type: 'danger',
@@ -233,6 +250,13 @@ export default class Browse extends React.Component {
}))
return
}
+ if (currentBucket === '') {
+ dispatch(actions.showAlert({
+ type: 'danger',
+ message: "Please choose a bucket before trying to upload files."
+ }))
+ return
+ }
let file = e.target.files[0]
e.target.value = null
this.xhr = new XMLHttpRequest()
@@ -577,7 +601,9 @@ export default class Browse extends React.Component {