Skip to content

Commit f6934cf

Browse files
committed
Application Bootstrap
0 parents  commit f6934cf

23 files changed

+1106
-0
lines changed

app/categories/bookmarks/bookmarks.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
angular.module('bookmarks', [
2+
'categories.bookmarks.edit',
3+
'categories.bookmarks.create',
4+
'eggly.models.categories',
5+
'eggly.models.bookmarks'
6+
])
7+
.config(function ($stateProvider) {
8+
$stateProvider
9+
.state('eggly.categories.bookmarks', {
10+
url: 'categories/:category',
11+
views: {
12+
'bookmarks@': {
13+
controller: 'BookmarksCtrl',
14+
templateUrl: 'app/categories/bookmarks/bookmarks.tmpl.html'
15+
}
16+
}
17+
})
18+
;
19+
})
20+
.controller('BookmarksCtrl', function BookmarksCtrl($scope, $stateParams, bookmarks, categories) {
21+
categories.setCurrentCategory();
22+
23+
if ($stateParams.category) {
24+
categories.getCategoryByName($stateParams.category).then(function (category) {
25+
categories.setCurrentCategory(category);
26+
})
27+
}
28+
29+
bookmarks.getBookmarks()
30+
.then(function (result) {
31+
$scope.bookmarks = result;
32+
});
33+
34+
$scope.getCurrentCategory = categories.getCurrentCategory;
35+
$scope.getCurrentCategoryName = categories.getCurrentCategoryName;
36+
$scope.isSelectedBookmark = function (bookmarkId) {
37+
return $stateParams.bookmarkId == bookmarkId;
38+
};
39+
40+
$scope.deleteBookmark = bookmarks.deleteBookmark;
41+
})
42+
;
43+
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<div ui-sref-active="editing" bookmark="bookmark" ng-class="{active: isSelectedBookmark(bookmark.id)}" ng-repeat="bookmark in bookmarks | filter:{category:getCurrentCategoryName()}">
2+
3+
<button type="button" class="close" ng-click="deleteBookmark(bookmark)">&times;</button>
4+
<button type="button" class="btn btn-link" ui-sref="eggly.categories.bookmarks.edit({category:bookmark.category, bookmarkId:bookmark.id})"><span class="glyphicon glyphicon-pencil"></span>
5+
</button>
6+
<a href="{{bookmark.url}}" target="_blank">{{bookmark.title}}</a>
7+
</div>
8+
<hr/>
9+
10+
<ui-view>
11+
<div ng-if="getCurrentCategory()">
12+
<button type="button" class="btn btn-link"
13+
ui-sref="eggly.categories.bookmarks.create({category:getCurrentCategoryName()})"><span
14+
class="glyphicon glyphicon-plus"></span>
15+
Create Bookmark
16+
</button>
17+
</div>
18+
</ui-view>
19+
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
angular.module('categories.bookmarks.create', [
2+
'eggly.models.bookmarks'
3+
])
4+
.config(function ($stateProvider) {
5+
$stateProvider
6+
.state('eggly.categories.bookmarks.create', {
7+
url: '/bookmarks/create',
8+
views: {
9+
'@eggly.categories.bookmarks': {
10+
templateUrl: 'app/categories/bookmarks/create/create.bookmark.tmpl.html',
11+
controller: 'CreateBookMarkCtrl',
12+
}
13+
}
14+
})
15+
;
16+
})
17+
18+
.controller('CreateBookMarkCtrl', function ($scope, $stateParams, bookmarks, $state) {
19+
$scope.isCreating = false;
20+
21+
function toggleCreating() {
22+
$scope.isCreating = !$scope.isCreating;
23+
}
24+
25+
function returnToBookmarks() {
26+
$state.go('eggly.categories.bookmarks', {
27+
category: $stateParams.category
28+
})
29+
}
30+
31+
function cancelCreating() {
32+
$scope.isCreating = false;
33+
returnToBookmarks();
34+
}
35+
36+
function createBookmark() {
37+
bookmarks.createBookmark($scope.newBookmark);
38+
returnToBookmarks();
39+
}
40+
41+
function resetForm() {
42+
$scope.newBookmark = {
43+
title: '',
44+
url: '',
45+
category: $stateParams.category
46+
};
47+
}
48+
49+
$scope.toggleCreating = toggleCreating;
50+
$scope.cancelCreating = cancelCreating;
51+
$scope.createBookmark = createBookmark;
52+
53+
resetForm();
54+
toggleCreating();
55+
})
56+
;
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<div class="createBookmark">
2+
<form class="create-form" ng-show="isCreating" role="form" ng-submit="createBookmark()" novalidate>
3+
<div class="form-group">
4+
<label for="newBookmarkTitle">Bookmark Title</label>
5+
<input type="text" class="form-control" id="newBookmarkTitle" ng-model="newBookmark.title" placeholder="Enter title">
6+
</div>
7+
<div class="form-group">
8+
<label for="newBookmarkURL">Bookmark URL</label>
9+
<input type="text" class="form-control" id="newBookmarkURL" ng-model="newBookmark.url" placeholder="Enter URL">
10+
</div>
11+
<button type="submit" class="btn btn-info btn-lg">Create</button>
12+
<button type="button" class="btn btn-default btn-lg pull-right" ng-click="cancelCreating()">Cancel</button>
13+
</form>
14+
</div>
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
angular.module('categories.bookmarks.edit', [
2+
'eggly.models.bookmarks'
3+
])
4+
.config(function ($stateProvider) {
5+
$stateProvider
6+
.state('eggly.categories.bookmarks.edit', {
7+
url: '/bookmarks/:bookmarkId/edit',
8+
views: {
9+
'@eggly.categories.bookmarks': {
10+
templateUrl: 'app/categories/bookmarks/edit/edit.bookmark.tmpl.html',
11+
controller: 'EditBookmarkCtrl'
12+
}
13+
}
14+
})
15+
;
16+
})
17+
18+
.controller('EditBookmarkCtrl', function ($scope, bookmarks, $stateParams, $state) {
19+
$scope.isEditing = false;
20+
21+
function returnToBookmarks() {
22+
$state.go('eggly.categories.bookmarks', {
23+
category: $stateParams.category
24+
})
25+
}
26+
27+
bookmarks.getBookmarkById($stateParams.bookmarkId).then(function (bookmark) {
28+
if (bookmark) {
29+
$scope.isEditing = true;
30+
$scope.bookmark = bookmark;
31+
$scope.editedBookmark = angular.copy($scope.bookmark);
32+
} else {
33+
returnToBookmarks();
34+
}
35+
});
36+
37+
function toggleEditing() {
38+
$scope.isEditing = !$scope.isEditing;
39+
}
40+
41+
function updateBookmark() {
42+
$scope.bookmark = angular.copy($scope.editedBookmark);
43+
bookmarks.updateBookmark($scope.editedBookmark);
44+
returnToBookmarks();
45+
}
46+
47+
function cancelEditing() {
48+
$scope.isEditing = false;
49+
returnToBookmarks();
50+
}
51+
52+
$scope.toggleEditing = toggleEditing;
53+
$scope.cancelEditing = cancelEditing;
54+
$scope.updateBookmark = updateBookmark;
55+
})
56+
57+
;
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<h4>Editing {{bookmark.title}}</h4>
2+
3+
<form class="edit-form" ng-show="isEditing" role="form" ng-submit="updateBookmark()" novalidate>
4+
<div class="form-group">
5+
<label>Bookmark Title</label>
6+
<input type="text" class="form-control" ng-model="editedBookmark.title" placeholder="Enter title">
7+
</div>
8+
<div class="form-group">
9+
<label>Bookmark URL</label>
10+
<input type="text" class="form-control" ng-model="editedBookmark.url" placeholder="Enter URL">
11+
</div>
12+
<button type="submit" class="btn btn-info btn-lg">Save</button>
13+
<button type="button" class="btn btn-default btn-lg pull-right" ng-click="cancelEditing()">Cancel</button>
14+
</form>

app/categories/categories.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
angular.module('categories', [
2+
'eggly.models.categories'
3+
])
4+
.config(function ($stateProvider) {
5+
$stateProvider
6+
.state('eggly.categories', {
7+
url: '/',
8+
views: {
9+
'categories@': {
10+
controller: 'CategoriesCtrl',
11+
templateUrl: 'app/categories/categories.tmpl.html'
12+
},
13+
'bookmarks@': {
14+
controller: 'BookmarksCtrl',
15+
templateUrl: 'app/categories/bookmarks/bookmarks.tmpl.html'
16+
}
17+
}
18+
});
19+
})
20+
21+
.controller('CategoriesCtrl', function CategoriesCtrl($scope, categories) {
22+
$scope.getCurrentCategoryName = categories.getCurrentCategoryName;
23+
24+
categories.getCategories()
25+
.then(function (result) {
26+
$scope.categories = result;
27+
});
28+
29+
$scope.isCurrentCategory = function (category) {
30+
return category.name === $scope.getCurrentCategoryName();
31+
}
32+
})
33+
;

app/categories/categories.tmpl.html

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<a href="#/"><img class="logo" src="assets/img/eggly-logo.png"></a>
2+
<ul class="nav nav-sidebar">
3+
<li ng-repeat="category in categories" ng-class="{'active':isCurrentCategory(category)}">
4+
<a ui-sref="eggly.categories.bookmarks({category: category.name})">
5+
{{category.name}}
6+
</a></li>
7+
</ul>

app/common/models/bookmarks-model.js

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
angular.module('eggly.models.bookmarks', [
2+
3+
])
4+
.service('bookmarks', function BookmarksService($http, $q) {
5+
var URLS = {
6+
FETCH: 'data/bookmarks.json'
7+
},
8+
bookmarks,
9+
bookmarksModel = this;
10+
11+
function extract(result) {
12+
return result.data;
13+
}
14+
15+
function cacheBookmarks(result) {
16+
bookmarks = extract(result);
17+
return bookmarks;
18+
}
19+
20+
bookmarksModel.getBookmarks = function () {
21+
return (bookmarks) ? $q.when(bookmarks) : $http.get(URLS.FETCH).then(cacheBookmarks);
22+
};
23+
24+
function findBookmark(bookmarkId) {
25+
return _.find(bookmarks, function (bookmark) {
26+
return bookmark.id === parseInt(bookmarkId, 10);
27+
})
28+
}
29+
30+
bookmarksModel.getBookmarkById = function (bookmarkId) {
31+
var deferred = $q.defer();
32+
if (bookmarks) {
33+
deferred.resolve(findBookmark(bookmarkId))
34+
} else {
35+
bookmarksModel.getBookmarks().then(function () {
36+
deferred.resolve(findBookmark(bookmarkId))
37+
})
38+
}
39+
return deferred.promise;
40+
};
41+
42+
bookmarksModel.createBookmark = function (bookmark) {
43+
bookmark.id = bookmarks.length;
44+
bookmarks.push(bookmark);
45+
};
46+
47+
bookmarksModel.updateBookmark = function (bookmark) {
48+
var index = _.findIndex(bookmarks, function (b) {
49+
return b.id == bookmark.id
50+
});
51+
bookmarks[index] = bookmark;
52+
};
53+
54+
bookmarksModel.deleteBookmark = function (bookmark) {
55+
_.remove(bookmarks, function (b) {
56+
return b.id == bookmark.id;
57+
});
58+
};
59+
60+
bookmarksModel.getBookmarksForCategory = function (category) {
61+
_.filter(bookmarks, function (b) {
62+
return b.category == category;
63+
});
64+
};
65+
})
66+
;

app/common/models/categories-model.js

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
angular.module('eggly.models.categories', [
2+
3+
])
4+
.service('categories', function CategoriesService($http, $q) {
5+
var URLS = {
6+
FETCH: 'data/categories.json'
7+
},
8+
categories,
9+
currentCategory,
10+
categoriesModel = this;
11+
12+
function extract(result) {
13+
return result.data;
14+
}
15+
16+
function cacheCategories(result) {
17+
categories = extract(result);
18+
return categories;
19+
}
20+
21+
categoriesModel.getCategories = function () {
22+
return (categories) ? $q.when(categories) : $http.get(URLS.FETCH).then(cacheCategories);
23+
};
24+
25+
categoriesModel.getCurrentCategory = function () {
26+
return currentCategory;
27+
};
28+
29+
categoriesModel.getCurrentCategoryName = function () {
30+
return currentCategory ? currentCategory.name : '';
31+
};
32+
33+
categoriesModel.setCurrentCategory = function (category) {
34+
currentCategory = category;
35+
return currentCategory;
36+
};
37+
38+
categoriesModel.createCategory = function (category) {
39+
category.id = categories.length;
40+
categories.push(category);
41+
};
42+
43+
categoriesModel.deleteCategory = function (category) {
44+
_.remove(categories, function (c) {
45+
return c.id == category.id;
46+
});
47+
};
48+
49+
categoriesModel.getCategoryByName = function (categoryName) {
50+
var deferred = $q.defer();
51+
52+
function findCategory() {
53+
return _.find(categories, function (c) {
54+
return c.name == categoryName;
55+
})
56+
}
57+
58+
if (categories) {
59+
deferred.resolve(findCategory());
60+
} else {
61+
categoriesModel.getCategories().then(function () {
62+
deferred.resolve(findCategory());
63+
})
64+
}
65+
66+
return deferred.promise;
67+
};
68+
69+
})
70+
;

0 commit comments

Comments
 (0)