Skip to content

Commit

Permalink
feat(articles): Modify articles module to implement style guidelines.
Browse files Browse the repository at this point in the history
Update the articles module to implement the style guidelines.

Much of this work is from @trainerbill

Closes meanjs#874
Closes meanjs#339
  • Loading branch information
rhutchison committed Jan 2, 2016
1 parent 169d4cd commit b3ad56e
Show file tree
Hide file tree
Showing 14 changed files with 508 additions and 257 deletions.
9 changes: 6 additions & 3 deletions modules/articles/client/articles.client.module.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
'use strict';
(function (app) {
'use strict';

// Use Applicaion configuration module to register a new module
ApplicationConfiguration.registerModule('articles');
app.registerModule('articles');
app.registerModule('articles.services');
app.registerModule('articles.routes', ['ui.router', 'articles.services']);
})(ApplicationConfiguration);
18 changes: 11 additions & 7 deletions modules/articles/client/config/articles.client.config.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
'use strict';
(function () {
'use strict';

// Configuring the Articles module
angular.module('articles').run(['Menus',
function (Menus) {
// Add the articles dropdown item
angular
.module('articles')
.run(menuConfig);

menuConfig.$inject = ['Menus'];

function menuConfig(Menus) {
Menus.addMenuItem('topbar', {
title: 'Articles',
state: 'articles',
Expand All @@ -19,9 +23,9 @@ angular.module('articles').run(['Menus',

// Add the dropdown create item
Menus.addSubMenuItem('topbar', 'articles', {
title: 'Create Articles',
title: 'Create Article',
state: 'articles.create',
roles: ['user']
});
}
]);
})();
61 changes: 48 additions & 13 deletions modules/articles/client/config/articles.client.routes.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
'use strict';
(function () {
'use strict';

// Setting up route
angular.module('articles').config(['$stateProvider',
function ($stateProvider) {
// Articles state routing
angular
.module('articles.routes')
.config(routeConfig);

routeConfig.$inject = ['$stateProvider'];

function routeConfig($stateProvider) {
$stateProvider
.state('articles', {
abstract: true,
Expand All @@ -12,25 +16,56 @@ angular.module('articles').config(['$stateProvider',
})
.state('articles.list', {
url: '',
templateUrl: 'modules/articles/client/views/list-articles.client.view.html'
templateUrl: 'modules/articles/client/views/list-articles.client.view.html',
controller: 'ArticlesListController',
controllerAs: 'vm'
})
.state('articles.create', {
url: '/create',
templateUrl: 'modules/articles/client/views/create-article.client.view.html',
templateUrl: 'modules/articles/client/views/form-article.client.view.html',
controller: 'ArticlesController',
controllerAs: 'vm',
resolve: {
articleResolve: newArticle
},
data: {
roles: ['user', 'admin']
}
})
.state('articles.view', {
url: '/:articleId',
templateUrl: 'modules/articles/client/views/view-article.client.view.html'
})
.state('articles.edit', {
url: '/:articleId/edit',
templateUrl: 'modules/articles/client/views/edit-article.client.view.html',
templateUrl: 'modules/articles/client/views/form-article.client.view.html',
controller: 'ArticlesController',
controllerAs: 'vm',
resolve: {
articleResolve: getArticle
},
data: {
roles: ['user', 'admin']
}
})
.state('articles.view', {
url: '/:articleId',
templateUrl: 'modules/articles/client/views/view-article.client.view.html',
controller: 'ArticlesController',
controllerAs: 'vm',
resolve: {
articleResolve: getArticle
}
});
}
]);

getArticle.$inject = ['$stateParams', 'ArticlesService'];

function getArticle($stateParams, ArticlesService) {
return ArticlesService.get({
articleId: $stateParams.articleId
}).$promise;
}

newArticle.$inject = ['ArticlesService'];

function newArticle(ArticlesService) {
return new ArticlesService();
}
})();
106 changes: 37 additions & 69 deletions modules/articles/client/controllers/articles.client.controller.js
Original file line number Diff line number Diff line change
@@ -1,84 +1,52 @@
'use strict';
(function () {
'use strict';

// Articles controller
angular.module('articles').controller('ArticlesController', ['$scope', '$stateParams', '$location', 'Authentication', 'Articles',
function ($scope, $stateParams, $location, Authentication, Articles) {
$scope.authentication = Authentication;
angular
.module('articles')
.controller('ArticlesController', ArticlesController);

// Create new Article
$scope.create = function (isValid) {
$scope.error = null;
ArticlesController.$inject = ['$scope', '$state', 'articleResolve', 'Authentication'];

if (!isValid) {
$scope.$broadcast('show-errors-check-validity', 'articleForm');

return false;
}

// Create new Article object
var article = new Articles({
title: this.title,
content: this.content
});
function ArticlesController($scope, $state, article, Authentication) {
var vm = this;

// Redirect after save
article.$save(function (response) {
$location.path('articles/' + response._id);

// Clear form fields
$scope.title = '';
$scope.content = '';
}, function (errorResponse) {
$scope.error = errorResponse.data.message;
});
};
vm.article = article;
vm.authentication = Authentication;
vm.error = null;
vm.form = {};
vm.remove = remove;
vm.save = save;

// Remove existing Article
$scope.remove = function (article) {
if (article) {
article.$remove();

for (var i in $scope.articles) {
if ($scope.articles[i] === article) {
$scope.articles.splice(i, 1);
}
}
} else {
$scope.article.$remove(function () {
$location.path('articles');
});
function remove() {
if (confirm('Are you sure you want to delete?')) {
vm.article.$remove($state.go('articles.list'));
}
};

// Update existing Article
$scope.update = function (isValid) {
$scope.error = null;
}

// Save Article
function save(isValid) {
if (!isValid) {
$scope.$broadcast('show-errors-check-validity', 'articleForm');

$scope.$broadcast('show-errors-check-validity', 'vm.form.articleForm');
return false;
}

var article = $scope.article;

article.$update(function () {
$location.path('articles/' + article._id);
}, function (errorResponse) {
$scope.error = errorResponse.data.message;
});
};
// TODO: move create/update logic to service
if (vm.article._id) {
vm.article.$update(successCallback, errorCallback);
} else {
vm.article.$save(successCallback, errorCallback);
}

// Find a list of Articles
$scope.find = function () {
$scope.articles = Articles.query();
};
function successCallback(res) {
$state.go('articles.view', {
articleId: res._id
});
}

// Find existing Article
$scope.findOne = function () {
$scope.article = Articles.get({
articleId: $stateParams.articleId
});
};
function errorCallback(res) {
vm.error = res.data.message;
}
}
}
]);
})();
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
(function () {
'use strict';

angular
.module('articles')
.controller('ArticlesListController', ArticlesListController);

ArticlesListController.$inject = ['ArticlesService'];

function ArticlesListController(ArticlesService) {
var vm = this;

vm.articles = ArticlesService.query();
}
})();
15 changes: 10 additions & 5 deletions modules/articles/client/services/articles.client.service.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
'use strict';
(function () {
'use strict';

//Articles service used for communicating with the articles REST endpoints
angular.module('articles').factory('Articles', ['$resource',
function ($resource) {
angular
.module('articles.services')
.factory('ArticlesService', ArticlesService);

ArticlesService.$inject = ['$resource'];

function ArticlesService($resource) {
return $resource('api/articles/:articleId', {
articleId: '@_id'
}, {
Expand All @@ -11,4 +16,4 @@ angular.module('articles').factory('Articles', ['$resource',
}
});
}
]);
})();
28 changes: 0 additions & 28 deletions modules/articles/client/views/create-article.client.view.html

This file was deleted.

28 changes: 0 additions & 28 deletions modules/articles/client/views/edit-article.client.view.html

This file was deleted.

28 changes: 28 additions & 0 deletions modules/articles/client/views/form-article.client.view.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<section>
<div class="page-header">
<h1>{{vm.article._id ? 'Edit Article' : 'New Article'}}</h1>
</div>
<div class="col-md-12">
<form name="vm.form.articleForm" class="form-horizontal" ng-submit="vm.save(vm.form.articleForm.$valid)" novalidate>
<fieldset>
<div class="form-group" show-errors>
<label class="control-label" for="title">Title</label>
<input name="title" type="text" ng-model="vm.article.title" id="title" class="form-control" placeholder="Title" required>
<div ng-messages="vm.form.articleForm.title.$error" role="alert">
<p class="help-block error-text" ng-message="required">Article title is required.</p>
</div>
</div>
<div class="form-group">
<label class="control-label" for="content">Content</label>
<textarea name="content" data-ng-model="vm.article.content" id="content" class="form-control" cols="30" rows="10" placeholder="Content"></textarea>
</div>
<div class="form-group">
<button type="submit" class="btn btn-default">{{vm.article._id ? 'Update' : 'Create'}}</button>
</div>
<div ng-show="vm.error" class="text-danger">
<strong ng-bind="vm.error"></strong>
</div>
</fieldset>
</form>
</div>
</section>
6 changes: 3 additions & 3 deletions modules/articles/client/views/list-articles.client.view.html
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
<section ng-controller="ArticlesController" ng-init="find()">
<section>
<div class="page-header">
<h1>Articles</h1>
</div>
<div class="list-group">
<a ng-repeat="article in articles" ui-sref="articles.view({articleId: article._id})" class="list-group-item">
<a ng-repeat="article in vm.articles" ui-sref="articles.view({ articleId: article._id })" class="list-group-item">
<small class="list-group-item-text">
Posted on
<span ng-bind="article.created | date:'mediumDate'"></span>
Expand All @@ -15,7 +15,7 @@ <h4 class="list-group-item-heading" ng-bind="article.title"></h4>
<p class="list-group-item-text" ng-bind="article.content"></p>
</a>
</div>
<div class="alert alert-warning text-center" ng-if="articles.$resolved && !articles.length">
<div class="alert alert-warning text-center" ng-if="vm.articles.$resolved && !vm.articles.length">
No articles yet, why don't you <a ui-sref="articles.create">create one</a>?
</div>
</section>
Loading

0 comments on commit b3ad56e

Please sign in to comment.