From d735cb681681cb6f3d7b9b0f047a8e61ccf4fbc3 Mon Sep 17 00:00:00 2001 From: Maximilian Walter Date: Wed, 1 Jun 2016 21:02:16 +0200 Subject: [PATCH] update: implemeted playlist sort functionality --- app/Models/Playlist.php | 2 +- resources/assets/scripts/app/app.coffee | 2 +- .../app/controllers/playlists-list.coffee | 2 +- .../scripts/app/controllers/playlists.coffee | 52 +++++++++++---- .../scripts/app/services/playlists.coffee | 64 +++++++++++++++++-- 5 files changed, 103 insertions(+), 19 deletions(-) diff --git a/app/Models/Playlist.php b/app/Models/Playlist.php index 52a8be43..c9feff41 100644 --- a/app/Models/Playlist.php +++ b/app/Models/Playlist.php @@ -91,7 +91,7 @@ class Playlist extends Model implements Searchable, Commentable, Favouritable public static function summary() { return self::select('id', 'title', 'user_id', 'slug', 'created_at', 'is_public', 'description', 'comment_count', - 'download_count', 'view_count', 'favourite_count'); + 'download_count', 'view_count', 'favourite_count', 'track_count'); } public function scopeUserDetails($query) diff --git a/resources/assets/scripts/app/app.coffee b/resources/assets/scripts/app/app.coffee index a9550d11..646883cb 100644 --- a/resources/assets/scripts/app/app.coffee +++ b/resources/assets/scripts/app/app.coffee @@ -211,7 +211,7 @@ ponyfm.config [ abstract: true state.state 'content.playlists.list', - url: '?page' + url: '^/playlists?filter&page' controller: 'playlists-list' templateUrl: '/templates/playlists/list.html' diff --git a/resources/assets/scripts/app/controllers/playlists-list.coffee b/resources/assets/scripts/app/controllers/playlists-list.coffee index 98e34821..9aca00fa 100644 --- a/resources/assets/scripts/app/controllers/playlists-list.coffee +++ b/resources/assets/scripts/app/controllers/playlists-list.coffee @@ -23,6 +23,6 @@ window.pfm.preloaders['playlists-list'] = [ module.exports = angular.module('ponyfm').controller "playlists-list", [ '$scope', 'playlists', '$state', ($scope, playlists, $state) -> - playlists.fetchList($state.params.page).done (searchResults) -> + playlists.mainQuery.fetch().done (searchResults) -> $scope.playlists = searchResults.playlists ] diff --git a/resources/assets/scripts/app/controllers/playlists.coffee b/resources/assets/scripts/app/controllers/playlists.coffee index 7350b4e6..64e405a5 100644 --- a/resources/assets/scripts/app/controllers/playlists.coffee +++ b/resources/assets/scripts/app/controllers/playlists.coffee @@ -29,26 +29,56 @@ module.exports = angular.module('ponyfm').controller "playlists", [ $scope.query = playlists.mainQuery $scope.filters = playlists.filters + $scope.setFilter = (filter, value) -> + $scope.query.setFilter filter, value + $state.transitionTo 'content.playlists.list', {filter: $scope.query.toFilterString()} + + $scope.clearFilter = (filter) -> + $scope.query.clearFilter filter + $state.transitionTo 'content.playlists.list', {filter: $scope.query.toFilterString()} + playlists.mainQuery.listen (searchResults) -> $scope.playlists = searchResults.playlists - - refreshPages = (list) -> - $scope.playlists = list.playlists - $scope.currentPage = parseInt(list.current_page) - $scope.totalPages = parseInt(list.total_pages) - + $scope.currentPage = parseInt(searchResults.current_page) + $scope.totalPages = parseInt(searchResults.total_pages) delete $scope.nextPage delete $scope.prevPage + $scope.nextPage = $scope.currentPage + 1 if $scope.currentPage < $scope.totalPages $scope.prevPage = $scope.currentPage - 1 if $scope.currentPage > 1 - $scope.pages = [1..$scope.totalPages] + $scope.allPages = [1..$scope.totalPages] - playlists.fetchList($state.params.page).done refreshPages - $scope.$on 'playlists-feteched', (e, list) -> refreshPages(list) + # TODO: turn this into a directive + # The actual first page will always be in the paginator. + $scope.pages = [1] + + # This logic determines how many pages to add prior to the current page, if any. + firstPage = Math.max(2, $scope.currentPage-3) + $scope.pages = $scope.pages.concat [firstPage..$scope.currentPage] unless $scope.currentPage == 1 + + pagesLeftToAdd = 8-$scope.pages.length + + lastPage = Math.min($scope.totalPages - 1, $scope.currentPage+1+pagesLeftToAdd) + $scope.pages = $scope.pages.concat([$scope.currentPage+1..lastPage]) unless $scope.currentPage >= lastPage + + # The actual last page will always be in the paginator. + $scope.pages.push($scope.totalPages) unless $scope.totalPages in $scope.pages $scope.pageSelectorShown = false $scope.gotoPage = (page) -> - return if !page - $state.transitionTo 'content.playlists.list', {page: page} + $state.transitionTo 'content.playlists.list', {filter: $state.params.filter, page: page} + + $scope.showPageSelector = () -> + $scope.pageSelectorShown = true + focus('#pagination-jump-destination') + + $scope.hidePageSelector = () -> + $scope.pageSelectorShown = false + + + $scope.jumpToPage = (inputPageNumber) -> + $scope.gotoPage(inputPageNumber) + + $scope.$on '$destroy', -> playlists.mainQuery = playlists.createQuery() ] diff --git a/resources/assets/scripts/app/services/playlists.coffee b/resources/assets/scripts/app/services/playlists.coffee index a3e0ba39..52b42422 100644 --- a/resources/assets/scripts/app/services/playlists.coffee +++ b/resources/assets/scripts/app/services/playlists.coffee @@ -18,6 +18,7 @@ module.exports = angular.module('ponyfm').factory('playlists', [ '$rootScope', '$state', '$http', 'auth' ($rootScope, $state, $http, auth) -> playlistDef = null + filterDef = null playlists = {} playlistPages = [] @@ -51,6 +52,55 @@ module.exports = angular.module('ponyfm').factory('playlists', [ currentFilter.selectedObject = {} currentFilter.title = 'Any' + setPage: (page) -> + @page = page + @cachedDef = null + + setFilter: (type, value) -> + @cachedDef = null + @page = 1 + @filters[type] = value + + toFilterString: -> + parts = [] + _.each @availableFilters, (filter, name) => + filterName = filter.name + if filter.type == 'single' + return if @filters[name].query == '' + parts.push(filterName + '-' + @filters[name].query) + else + return if @filters[name].selectedArray.length == 0 + parts.push(filterName + '-' + _.map(@filters[name].selectedArray, (f) -> f.id).join '-') + + return parts.join '!' + + fromFilterString: (str) -> + @hasLoadedFilters = true + @cachedDef = null + @resetFilters() + + filters = (str || "").split '!' + for queryFilter in filters + parts = queryFilter.split '-' + queryName = parts[0] + + filterName = null + filter = null + + for name,f of @availableFilters + continue if f.name != queryName + filterName = name + filter = f + + return if !filter + + if filter.type == 'single' + filterToSet = _.find filter.values, (f) -> f.query == parts[1] + filterToSet = (_.find filter.values, (f) -> f.isDefault) if filterToSet == null + @setFilter filterName, filterToSet + else + @toggleListFilter filterName, id for id in _.rest parts, 1 + listen: (listener) -> @listeners.push listener @cachedDef.done listener if @cachedDef @@ -58,11 +108,10 @@ module.exports = angular.module('ponyfm').factory('playlists', [ fetch: () -> return @cachedDef if @cachedDef @cachedDef = new $.Deferred() - trackDef = @cachedDef + playlistDef = @cachedDef query = '/api/web/playlists?' - parts = ['page=' + @page] _.each @availableFilters, (filter, name) => if filter.type == 'single' @@ -78,10 +127,9 @@ module.exports = angular.module('ponyfm').factory('playlists', [ for listener in @listeners listener playlists + playlistDef.resolve playlists - trackDef.resolve tracks - - trackDef.promise() + playlistDef.promise() self = @@ -91,6 +139,9 @@ module.exports = angular.module('ponyfm').factory('playlists', [ createQuery: -> new Query self.filters loadFilters: -> + return filterDef if filterDef + + filterDef = new $.Deferred() self.filters.sort = type: 'single' name: 'sort' @@ -104,6 +155,9 @@ module.exports = angular.module('ponyfm').factory('playlists', [ ] self.mainQuery = self.createQuery() + filterDef.resolve self + + filterDef.promise() fetchList: (page, force) -> force = force || false