diff --git a/public/templates/account/track.html b/public/templates/account/track.html index dc4328d0..032a518b 100644 --- a/public/templates/account/track.html +++ b/public/templates/account/track.html @@ -1,120 +1 @@ -
- -
-
- - -
{{errors.title}}
-
-
-
- - -
{{errors.description}}
-
-
- - -
{{errors.lyrics}}
-
{{errors.lyrics}}
-
-
-
-
- - -
{{errors.genre_id}}
-
-
- - -
{{errors.track_type_id}}
-
-
-
-
- - Album: - {{selectedAlbum.title}} - None - -
- -
-
{{errors.album_id}}
-
-
- Show Songs: {{selectedSongsTitle}} -
- -
-
{{errors.show_song_ids}}
-
-
-
-
- - -
-
- - -
{{errors.released_at}}
-
-
-
-
- -
-
- -
-
- -
-
-
- - -
-
-
+ diff --git a/public/templates/directives/track-editor.html b/public/templates/directives/track-editor.html new file mode 100644 index 00000000..6855894d --- /dev/null +++ b/public/templates/directives/track-editor.html @@ -0,0 +1,120 @@ +
+ +
+
+ + +
{{errors.title}}
+
+
+
+ + +
{{errors.description}}
+
+
+ + +
{{errors.lyrics}}
+
{{errors.lyrics}}
+
+
+
+
+ + +
{{errors.genre_id}}
+
+
+ + +
{{errors.track_type_id}}
+
+
+
+
+ + Album: + {{selectedAlbum.title}} + None + +
+ +
+
{{errors.album_id}}
+
+
+ Show Songs: {{selectedSongsTitle}} +
+ +
+
{{errors.show_song_ids}}
+
+
+
+
+ + +
+
+ + +
{{errors.released_at}}
+
+
+
+
+ +
+
+ +
+
+ +
+
+
+ + +
+
+
diff --git a/resources/assets/scripts/app/controllers/account-track.coffee b/resources/assets/scripts/app/controllers/account-track.coffee index 7ce9a99b..14390611 100644 --- a/resources/assets/scripts/app/controllers/account-track.coffee +++ b/resources/assets/scripts/app/controllers/account-track.coffee @@ -14,149 +14,151 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -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)] -] +#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 if value != null - formData.append name, value - - if parseInt($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-XSRF-TOKEN', $.cookie('XSRF-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 - is_listed: track.is_listed - - $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 + '"?', [ - {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) - .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?') + $scope.trackId = $state.params.track_id +# $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 if value != null +# formData.append name, value +# +# if parseInt($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-XSRF-TOKEN', $.cookie('XSRF-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 +# is_listed: track.is_listed +# +# $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 + '"?', [ +# {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) +# .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?') ] diff --git a/resources/assets/scripts/app/controllers/track-edit.coffee b/resources/assets/scripts/app/controllers/track-edit.coffee index e76e139d..37b4e818 100644 --- a/resources/assets/scripts/app/controllers/track-edit.coffee +++ b/resources/assets/scripts/app/controllers/track-edit.coffee @@ -15,17 +15,18 @@ # along with this program. If not, see . window.pfm.preloaders['track-edit'] = [ - 'tracks', '$state', 'playlists' - (tracks, $state, playlists) -> - $.when.all [tracks.fetch $state.params.id, playlists.refreshOwned(true)] + 'tracks', '$state', 'playlists' + (tracks, $state, playlists) -> + $.when.all [tracks.fetch $state.params.id, playlists.refreshOwned(true)] ] angular.module('ponyfm').controller "track-edit", [ - '$scope', 'tracks', '$state', 'playlists', 'auth', 'favourites', '$dialog' - ($scope, tracks, $state, playlists, auth, favourites, $dialog) -> - track = null + '$scope', 'tracks', '$state', 'playlists', 'auth', 'favourites', '$dialog' + ($scope, tracks, $state, playlists, auth, favourites, $dialog) -> + track = null + + tracks.fetch($state.params.id).done (trackResponse) -> + $scope.track = trackResponse.track + track = trackResponse.track - tracks.fetch($state.params.id).done (trackResponse) -> - $scope.track = trackResponse.track - track = trackResponse.track ] diff --git a/resources/assets/scripts/app/directives/track-editor.coffee b/resources/assets/scripts/app/directives/track-editor.coffee new file mode 100644 index 00000000..b15881ed --- /dev/null +++ b/resources/assets/scripts/app/directives/track-editor.coffee @@ -0,0 +1,180 @@ +# Pony.fm - A community for pony fan music. +# Copyright (C) 2015 Peter Deltchev +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +# +#window.pfm.preloaders['account-track'] = [ +# 'account-albums', 'taxonomies' +# (albums, taxonomies, state) -> +# $.when.all [albums.refresh(), taxonomies.refresh()] +#] + + +angular.module('ponyfm').directive 'pfmTrackEditor', () -> + restrict: 'E' + templateUrl: '/templates/directives/track-editor.html' + scope: + trackId: '=trackId' + + controller: [ + '$scope', 'auth', 'account-tracks', 'account-albums', 'taxonomies', 'images' + ($scope, auth, tracks, albums, taxonomies, images) -> + $scope.isDirty = false + $scope.isSaving = false + $scope.taxonomies = taxonomies + $scope.selectedSongsTitle = 'None' + $scope.selectedSongs = {} + $scope.albums = [] + $scope.selectedAlbum = null + albumsDb = {} + + $scope.selectAlbum = (album) -> + $scope.selectedAlbum = album + $scope.track.album_id = if album then album.id else null + $scope.isDirty = true + + $scope.setCover = (image, type) -> + delete $scope.track.cover_id + delete $scope.track.cover + + if image == null + $scope.track.remove_cover = true + else if type == 'file' + $scope.track.cover = image + else if type == 'gallery' + $scope.track.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.track.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.track.title +# trackDbItem.is_explicit = $scope.track.is_explicit +# trackDbItem.is_vocal = $scope.track.is_vocal +# trackDbItem.genre_id = $scope.track.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.track, (value, name) -> + if name == 'cover' + return if value == null + if typeof(value) == 'object' + formData.append name, value, value.name + else if value != null + formData.append name, value + + if parseInt($scope.track.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.track.id, true + xhr.setRequestHeader 'X-XSRF-TOKEN', $.cookie('XSRF-TOKEN') + $scope.isSaving = true + xhr.send formData + + $scope.deleteTrack = (track) -> + $dialog.messageBox('Delete ' + track.title, 'Are you sure you want to delete "' + track.title + '"?', [ + {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) + .then -> $scope.$apply -> + $scope.$emit 'track-deleted' + $state.transitionTo 'account.tracks' + + ## Bootstrap this thing + + $.when( + albums.refresh(), + taxonomies.refresh(), + tracks.getEdit($scope.trackId) + ).done (albums, taxonomies, track)-> + $scope.track = + 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 + is_listed: track.is_listed + + $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() + + + albums.refresh().done (albums) -> + $scope.albums.legnth = 0 + albumsDb = {} + for album in albums + albumsDb[album.id] = album + $scope.albums.push album + + $scope.touchModel = -> $scope.isDirty = true + + $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?') + ]