mirror of
https://github.com/koel/koel
synced 2024-11-28 06:50:27 +00:00
Alert and confirm beautifully
This commit is contained in:
parent
4981109d2a
commit
e042346c4a
8 changed files with 109 additions and 43 deletions
|
@ -36,7 +36,8 @@ elixir(function (mix) {
|
||||||
.styles([
|
.styles([
|
||||||
'resources/assets/css/**/*.css',
|
'resources/assets/css/**/*.css',
|
||||||
'node_modules/font-awesome/css/font-awesome.min.css',
|
'node_modules/font-awesome/css/font-awesome.min.css',
|
||||||
'node_modules/rangeslider.js/dist/rangeslider.css'
|
'node_modules/rangeslider.js/dist/rangeslider.css',
|
||||||
|
'node_modules/sweetalert/dist/sweetalert.css'
|
||||||
], 'public/css/vendors.css', './');
|
], 'public/css/vendors.css', './');
|
||||||
|
|
||||||
mix.version(['css/vendors.css', 'css/app.css', 'js/vendors.js', 'js/main.js']);
|
mix.version(['css/vendors.css', 'css/app.css', 'js/vendors.js', 'js/main.js']);
|
||||||
|
|
|
@ -43,6 +43,7 @@
|
||||||
"rangetouch": "0.0.9",
|
"rangetouch": "0.0.9",
|
||||||
"select": "^1.0.6",
|
"select": "^1.0.6",
|
||||||
"sinon": "^1.17.2",
|
"sinon": "^1.17.2",
|
||||||
|
"sweetalert": "^1.1.3",
|
||||||
"vue": "^2.0.0-beta.5",
|
"vue": "^2.0.0-beta.5",
|
||||||
"vue-hot-reload-api": "^1.3.2",
|
"vue-hot-reload-api": "^1.3.2",
|
||||||
"vueify": "^9.1.0",
|
"vueify": "^9.1.0",
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
</button>
|
</button>
|
||||||
<button class="del btn btn-red"
|
<button class="del btn btn-red"
|
||||||
title="Delete this playlist"
|
title="Delete this playlist"
|
||||||
@click.prevent="del">
|
@click.prevent="confirmDelete">
|
||||||
<i class="fa fa-times"></i> Playlist
|
<i class="fa fa-times"></i> Playlist
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
|
@ -57,6 +57,7 @@
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import isMobile from 'ismobilejs';
|
import isMobile from 'ismobilejs';
|
||||||
|
import swal from 'sweetalert';
|
||||||
|
|
||||||
import { pluralize, event } from '../../../utils';
|
import { pluralize, event } from '../../../utils';
|
||||||
import { playlistStore, sharedStore } from '../../../stores';
|
import { playlistStore, sharedStore } from '../../../stores';
|
||||||
|
@ -101,6 +102,26 @@ export default {
|
||||||
playback.queueAndPlay(this.playlist.songs, true);
|
playback.queueAndPlay(this.playlist.songs, true);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Confirm deleting the playlist.
|
||||||
|
*/
|
||||||
|
confirmDelete() {
|
||||||
|
// If the playlist is empty, just go ahead and delete it.
|
||||||
|
if (!this.playlist.songs.length) {
|
||||||
|
this.del();
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
swal({
|
||||||
|
title: 'Are you sure?',
|
||||||
|
text: 'Once it’s gone, it’s gone, and there’s no turning back.',
|
||||||
|
type: 'warning',
|
||||||
|
showCancelButton: true,
|
||||||
|
confirmButtonText: 'Yes, go ahead',
|
||||||
|
}, this.del);
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete the current playlist.
|
* Delete the current playlist.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -35,7 +35,6 @@
|
||||||
|
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<button type="submit">Save</button>
|
<button type="submit">Save</button>
|
||||||
<span v-show="showStatus" class="status">Saved!</span>
|
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
@ -106,6 +105,7 @@
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import $ from 'jquery';
|
import $ from 'jquery';
|
||||||
|
import swal from 'sweetalert';
|
||||||
|
|
||||||
import { userStore, preferenceStore, sharedStore } from '../../../stores';
|
import { userStore, preferenceStore, sharedStore } from '../../../stores';
|
||||||
import { forceReloadWindow } from '../../../utils';
|
import { forceReloadWindow } from '../../../utils';
|
||||||
|
@ -118,7 +118,6 @@ export default {
|
||||||
cache: userStore.stub,
|
cache: userStore.stub,
|
||||||
pwd: '',
|
pwd: '',
|
||||||
confirmPwd: '',
|
confirmPwd: '',
|
||||||
showStatus: false,
|
|
||||||
prefs: preferenceStore.state,
|
prefs: preferenceStore.state,
|
||||||
sharedState: sharedStore.state,
|
sharedState: sharedStore.state,
|
||||||
};
|
};
|
||||||
|
@ -142,9 +141,12 @@ export default {
|
||||||
this.pwd = '';
|
this.pwd = '';
|
||||||
this.confirmPwd = '';
|
this.confirmPwd = '';
|
||||||
|
|
||||||
// "Save!" aaaaaaaand it's gone!
|
swal({
|
||||||
this.showStatus = true;
|
title: 'Done!',
|
||||||
setTimeout(() => this.showStatus = false, 3000);
|
text: 'Profile saved.',
|
||||||
|
type: 'success',
|
||||||
|
allowOutsideClick: true,
|
||||||
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,8 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import swal from 'sweetalert';
|
||||||
|
|
||||||
import { settingStore } from '../../../stores';
|
import { settingStore } from '../../../stores';
|
||||||
import { parseValidationError, forceReloadWindow, event, showOverlay, hideOverlay } from '../../../utils';
|
import { parseValidationError, forceReloadWindow, event, showOverlay, hideOverlay } from '../../../utils';
|
||||||
import router from '../../../router';
|
import router from '../../../router';
|
||||||
|
@ -32,28 +34,52 @@ export default {
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
state: settingStore.state,
|
state: settingStore.state,
|
||||||
|
originalMediaPath: null,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
this.originalMediaPath = this.state.settings.media_path;
|
||||||
|
console.log('dam');
|
||||||
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
/**
|
/**
|
||||||
* Save the settings.
|
* Save the settings.
|
||||||
*/
|
*/
|
||||||
save() {
|
save() {
|
||||||
showOverlay();
|
console.log(this.originalMediaPath);
|
||||||
|
swal({
|
||||||
|
title: 'Be careful!',
|
||||||
|
text: 'Changing the media path will essentially remove all existing data – songs, artists, \
|
||||||
|
albums, favorites, everything – and empty your playlists!',
|
||||||
|
type: 'warning',
|
||||||
|
showCancelButton: true,
|
||||||
|
confirmButtonText: 'I know. Go ahead.',
|
||||||
|
confirmButtonColor: '#c34848',
|
||||||
|
}, () => {
|
||||||
|
showOverlay();
|
||||||
|
|
||||||
settingStore.update().then(() => {
|
settingStore.update().then(() => {
|
||||||
// Make sure we're back to home first.
|
// Make sure we're back to home first.
|
||||||
router.go('home');
|
router.go('home');
|
||||||
forceReloadWindow();
|
forceReloadWindow();
|
||||||
}).catch(r => {
|
}).catch(r => {
|
||||||
let msg = 'Unknown error.';
|
let msg = 'Unknown error.';
|
||||||
|
|
||||||
if (r.status === 422) {
|
if (r.status === 422) {
|
||||||
msg = parseValidationError(r.responseJSON)[0];
|
msg = parseValidationError(r.responseJSON)[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
showOverlay(`Error: ${msg}`, 'error', true);
|
hideOverlay();
|
||||||
|
|
||||||
|
swal({
|
||||||
|
title: 'Something went wrong',
|
||||||
|
text: msg,
|
||||||
|
type: 'error',
|
||||||
|
allowOutsideClick: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
@ -12,15 +12,10 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="buttons">
|
<div class="buttons">
|
||||||
<button class="btn btn-blue" @click="edit" v-show="!confirmingDelete">
|
<button class="btn btn-blue" @click="edit">
|
||||||
{{ isCurrentUser ? 'Update Profile' : 'Edit' }}
|
{{ isCurrentUser ? 'Update Profile' : 'Edit' }}
|
||||||
</button>
|
</button>
|
||||||
<button v-show="!isCurrentUser && !confirmingDelete"
|
<button class="btn btn-red" @click="del">Delete</button>
|
||||||
class="btn btn-red" @click="confirmDelete">Delete</button>
|
|
||||||
<span v-show="confirmingDelete">
|
|
||||||
<button class="btn btn-red" @click="destroy">Confirm</button>
|
|
||||||
<button @click="cancelDelete">Cancel</button>
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -49,6 +44,7 @@
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { clone, assign } from 'lodash';
|
import { clone, assign } from 'lodash';
|
||||||
|
import swal from 'sweetalert';
|
||||||
|
|
||||||
import { userStore } from '../../stores';
|
import { userStore } from '../../stores';
|
||||||
import router from '../../router';
|
import router from '../../router';
|
||||||
|
@ -110,27 +106,21 @@ export default {
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
|
||||||
* Confirm the delete action by triggering the confirming div's visibility.
|
|
||||||
*/
|
|
||||||
confirmDelete() {
|
|
||||||
this.confirmingDelete = true;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Cancel the delete action.
|
|
||||||
*/
|
|
||||||
cancelDelete() {
|
|
||||||
this.confirmingDelete = false;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Kill off the freaking user.
|
* Kill off the freaking user.
|
||||||
*/
|
*/
|
||||||
destroy() {
|
del() {
|
||||||
userStore.destroy(this.user).then(() => {
|
swal({
|
||||||
this.confirmingDelete = false;
|
title: 'Hey…',
|
||||||
this.$destroy(true);
|
text: `You’re about to unperson ${this.user.name}. Are you sure?`,
|
||||||
|
type: 'warning',
|
||||||
|
showCancelButton: true,
|
||||||
|
confirmButtonText: 'Certainly',
|
||||||
|
cancelButtonText: 'Oops',
|
||||||
|
}, () => {
|
||||||
|
userStore.destroy(this.user).then(() => {
|
||||||
|
this.$destroy(true);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
@ -6,4 +6,6 @@
|
||||||
|
|
||||||
@import "vendor/_plyr.scss";
|
@import "vendor/_plyr.scss";
|
||||||
@import "vendor/_nprogress.scss";
|
@import "vendor/_nprogress.scss";
|
||||||
|
@import "vendor/_sweetalert.scss";
|
||||||
|
|
||||||
@import "partials/_shared.scss";
|
@import "partials/_shared.scss";
|
||||||
|
|
23
resources/assets/sass/vendor/_sweetalert.scss
vendored
Normal file
23
resources/assets/sass/vendor/_sweetalert.scss
vendored
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
.sweet-alert {
|
||||||
|
font-family: $fontFamily;
|
||||||
|
|
||||||
|
fieldset input {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-weight: $fontWeight_UltraThin;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
font-size: 1.1rem;
|
||||||
|
line-height: 1.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
box-shadow: none !important;
|
||||||
|
font-family: $fontFamily;
|
||||||
|
font-weight: $fontWeight_Thin;
|
||||||
|
font-size: 1.1rem;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue