window.pfm.preloaders['account-track'] = [ 'account-tracks', 'account-albums', 'taxonomies', '$state' (tracks, albums, taxonomies, state) -> $.when.all [albums.refresh(), taxonomies.refresh(), tracks.getEdit(state.params.track_id, true)] ] angular.module('ponyfm').controller "account-track", [ '$scope', '$state', 'taxonomies', '$dialog', 'account-albums', 'account-tracks', 'images' ($scope, $state, taxonomies, $dialog, albums, tracks, images) -> $scope.isDirty = false $scope.isSaving = false $scope.taxonomies = taxonomies $scope.selectedSongsTitle = 'None' $scope.selectedSongs = {} $scope.albums = [] $scope.selectedAlbum = null albumsDb = {} albums.refresh().done (albums) -> $scope.albums.legnth = 0 albumsDb = {} for album in albums albumsDb[album.id] = album $scope.albums.push album $scope.selectAlbum = (album) -> $scope.selectedAlbum = album $scope.edit.album_id = if album then album.id else null $scope.isDirty = true $scope.setCover = (image, type) -> delete $scope.edit.cover_id delete $scope.edit.cover if image == null $scope.edit.remove_cover = true else if type == 'file' $scope.edit.cover = image else if type == 'gallery' $scope.edit.cover_id = image.id $scope.isDirty = true updateSongDisplay = () -> if _.size $scope.selectedSongs $scope.selectedSongsTitle = (_.map _.values($scope.selectedSongs), (s) -> s.title).join(', ') else $scope.selectedSongsTitle = 'None' $scope.toggleSong = (song) -> $scope.isDirty = true if $scope.selectedSongs[song.id] delete $scope.selectedSongs[song.id] else $scope.selectedSongs[song.id] = song updateSongDisplay() $scope.updateIsVocal = () -> delete $scope.errors.lyrics if !$scope.edit.is_vocal $scope.updateTrack = () -> xhr = new XMLHttpRequest() xhr.onload = -> $scope.$apply -> $scope.isSaving = false if xhr.status != 200 errors = if xhr.getResponseHeader('content-type') == 'application/json' $.parseJSON(xhr.responseText).errors else ['There was an unknown error!'] $scope.errors = {} _.each errors, (value, key) -> $scope.errors[key] = value.join ', ' return track = $.parseJSON(xhr.responseText) trackDbItem = $scope.data.selectedTrack trackDbItem.title = $scope.edit.title trackDbItem.is_explicit = $scope.edit.is_explicit trackDbItem.is_vocal = $scope.edit.is_vocal trackDbItem.genre_id = $scope.edit.genre_id trackDbItem.is_published = true trackDbItem.cover_url = track.real_cover_url $scope.isDirty = false $scope.errors = {} images.refresh true formData = new FormData(); _.each $scope.edit, (value, name) -> if name == 'cover' return if value == null if typeof(value) == 'object' formData.append name, value, value.name else formData.append name, value if $scope.edit.track_type_id == 2 formData.append 'show_song_ids', _.map(_.values($scope.selectedSongs), (s) -> s.id).join() xhr.open 'POST', '/api/web/tracks/edit/' + $scope.edit.id, true xhr.setRequestHeader 'X-Token', pfm.token $scope.isSaving = true xhr.send formData tracks.getEdit($state.params.track_id).done (track) -> $scope.edit = id: track.id title: track.title description: track.description lyrics: track.lyrics is_explicit: track.is_explicit is_downloadable: track.is_downloadable is_vocal: track.is_vocal license_id: track.license_id genre_id: track.genre_id track_type_id: track.track_type_id released_at: if track.released_at then track.released_at.date else '' remove_cover: false cover: track.cover_url album_id: track.album_id is_published: track.is_published $scope.selectedAlbum = if track.album_id then albumsDb[track.album_id] else null $scope.selectedSongs = {} $scope.selectedSongs[song.id] = song for song in track.show_songs updateSongDisplay() $scope.touchModel = -> $scope.isDirty = true $scope.deleteTrack = (track) -> $dialog.messageBox('Delete ' + track.title, 'Are you sure you want to delete "' + track.title + '"? This cannot be undone.', [ {result: 'ok', label: 'Yes', cssClass: 'btn-danger'}, {result: 'cancel', label: 'No', cssClass: 'btn-primary'} ]).open().then (res) -> return if res == 'cancel' $.post('/api/web/tracks/delete/' + track.id, {_token: window.pfm.token}) .then -> $scope.$apply -> $scope.$emit 'track-deleted' $state.transitionTo 'account.tracks' $scope.$on '$locationChangeStart', (e) -> return if !$scope.isDirty e.preventDefault() if !confirm('Are you sure you want to leave this page without saving your changes?') ]