diff --git a/src/config/states.js b/src/config/states.js index 2aa51dcc..b8d6cd7c 100644 --- a/src/config/states.js +++ b/src/config/states.js @@ -29,12 +29,21 @@ angular.module('codexen') /* Snippets */ .state('snippets', { - url: '/snippets?search', + url: '/snippets', views: { 'main-view': { templateUrl: 'tpls/states/snippets.list.tpl.html', controller: 'SnippetsListController as vm' } + }, + resolve: { + mySnippets: function (Snippet) { + return Snippet.findMine({ + 'include': ['Tag'] + }).then(function (res) { + return res.data + }) + } } }) .state('snippets.detail', { diff --git a/src/controllers/states/SnippetsListController.js b/src/controllers/states/SnippetsListController.js index 1da50f10..49bd7fa8 100644 --- a/src/controllers/states/SnippetsListController.js +++ b/src/controllers/states/SnippetsListController.js @@ -1,44 +1,32 @@ /* global angular */ angular.module('codexen') - .controller('SnippetsListController', function ($auth, Snippet, $scope, $state, $scope) { + .controller('SnippetsListController', function ($auth, Snippet, $scope, $state, $scope, $filter, mySnippets) { var vm = this - vm.isLoaded = false - - vm.search = $state.params.search + vm.isLoading = false vm.snippetId = parseInt($state.params.id) + + vm.snippets = mySnippets + + vm.searchSnippets = searchSnippets + vm.searchSnippets() + + // TODO: add Navigation methods + // vm.nextSnippet() + // vm.priorSnippet() + // vm.firstSnippet() + // vm.lastSnippet() + + // TODO: keyboard navigating UX + $scope.$on('$stateChangeStart', function (e, toState, toParams) { vm.snippetId = parseInt(toParams.id) - }) - - var loadSnippets = function () { - if ($auth.isAuthenticated) { - Snippet.findMine({ - 'include': ['Tag'] - }) - .success(function (data) { - console.log('snippets fetched', data) - vm.isLoaded = true - vm.snippets = data - vm.isGuest = false - }) - } else { - vm.isLoaded = true - vm.isGuest = true - vm.snippets = void 0 + if (!vm.snippetId && vm.filtered[0]) { + $state.go('snippets.detail', {id: vm.filtered[0].id}) } - } - - loadSnippets() - - $scope.$on('userSignIn', function () { - loadSnippets() }) - $scope.$on('userSignOut', function () { - loadSnippets() - }) $scope.$on('snippetUpdated', function (e, snippet) { $state.go('snippets.detail', {id: snippet.id}) @@ -64,4 +52,32 @@ angular.module('codexen') loadSnippets() }) + $scope.$on('tagSelected', function (e, tag) { + e.stopPropagation() + $scope.$apply(function () { + vm.search = '#' + tag.name + searchSnippets() + }) + }) + + function loadSnippets() { + if ($auth.isAuthenticated) { + Snippet.findMine({ + 'include': ['Tag'] + }) + .success(function (data) { + vm.snippets = data + }) + } else { + vm.snippets = void 0 + } + } + + function searchSnippets() { + vm.filtered = $filter('searchSnippets')(mySnippets, vm.search) + if (vm.search && vm.filtered[0] && (!vm.snippetId || vm.snippetId !== vm.filtered[0].id)) { + $state.go('snippets.detail', {id: vm.filtered[0].id}) + } + } + }) diff --git a/src/directives/tag-item.js b/src/directives/tag-item.js new file mode 100644 index 00000000..d919c461 --- /dev/null +++ b/src/directives/tag-item.js @@ -0,0 +1,16 @@ +/* global angular */ +angular.module('codexen') + .directive('tagItem', function () { + return { + restrict: 'A', + template: '#', + scope: { + tag: '=tagItem' + }, + link: function (scope, el) { + el.on('click', function () { + scope.$emit('tagSelected', scope.tag) + }) + } + } + }) diff --git a/src/directives/tags.js b/src/directives/tag-list.js similarity index 68% rename from src/directives/tags.js rename to src/directives/tag-list.js index 8ab21888..d28d32d7 100644 --- a/src/directives/tags.js +++ b/src/directives/tag-list.js @@ -1,14 +1,14 @@ /* global angular */ angular.module('codexen') - .directive('tags', function () { + .directive('tagList', function () { return { restrict: 'A', template: '

' + ' ' + - '#' + + '' + '

', scope: { - tags: '=' + tags: '=tagList' }, link: function (scope, el) { el.ready(function () { diff --git a/src/filters/search-snippets.js b/src/filters/search-snippets.js index aff6d6c9..417b067f 100644 --- a/src/filters/search-snippets.js +++ b/src/filters/search-snippets.js @@ -8,7 +8,7 @@ angular.module('codexen') return input.filter(function (snippet) { return snippet.Tags.some(function (tag) { - return tag.name.match(new RegExp(name)) + return tag.name.match(new RegExp('^'+name)) }) }) } diff --git a/src/tpls/states/snippets.detail.tpl.html b/src/tpls/states/snippets.detail.tpl.html index 7625a6f8..4fa48787 100644 --- a/src/tpls/states/snippets.detail.tpl.html +++ b/src/tpls/states/snippets.detail.tpl.html @@ -21,7 +21,9 @@

-
+ +
+