Skip to content

Instantly share code, notes, and snippets.

@cyberfly
Last active November 28, 2017 06:38
Show Gist options
  • Select an option

  • Save cyberfly/40722752b75d838a70661e67035fd028 to your computer and use it in GitHub Desktop.

Select an option

Save cyberfly/40722752b75d838a70661e67035fd028 to your computer and use it in GitHub Desktop.
Form validation (on submit) with AngularJS 1.X
(function() {
'use strict';
angular
.module('app')
.directive('wmBlock', wmBlock)
.directive('pwCheck', pwCheck);
function wmBlock() {
return {
scope: {
wmBlockLength: '='
},
link: function(scope, elm, attrs) {
elm.bind('keypress', function(e) {
if (elm[0].value.length > scope.wmBlockLength) {
e.preventDefault();
return false;
}
});
}
};
}
function pwCheck(){
return {
require: 'ngModel',
link: function (scope, elem, attrs, ctrl) {
var firstPassword = '#' + attrs.pwCheck;
elem.add(firstPassword).on('keyup', function () {
scope.$apply(function () {
var v = elem.val()===$(firstPassword).val();
ctrl.$setValidity('pwmatch', v);
});
});
}
}
}
})();
<form class="form-horizontal" role="form" name="createUserForm" ng-submit="submitForm(createUserForm.$valid)" novalidate>
<div class="modal-header">
<h3 class="modal-title">Create User</h3>
</div>
<div class="modal-body">
<div class="form-group" ng-class="{ 'has-error' : createUserForm.name.$invalid && submitted }">
<label class="col-sm-3 control-label"
for="name">Full Name <span class="required_label">*</span></label>
<div class="col-sm-9">
<input type="text" name="name" class="form-control" ng-model="formData.name" required />
<p ng-show="createUserForm.name.$invalid && submitted" class="help-block">Full Name is required.</p>
</div>
</div>
<div class="form-group" ng-class="{ 'has-error' : createUserForm.email.$invalid && submitted }">
<label class="col-sm-3 control-label"
for="email">Email <span class="required_label">*</span></label>
<div class="col-sm-9">
<input type="email" name="email" class="form-control" ng-model="formData.email" required />
<p ng-show="createUserForm.email.$invalid && submitted" class="help-block">Email is required.</p>
</div>
</div>
<div class="form-group" ng-class="{ 'has-error' : createUserForm.password.$invalid && submitted }">
<label class="col-sm-3 control-label"
for="password">Password <span class="required_label">*</span></label>
<div class="col-sm-9">
<input type="password" name="password" id="password" class="form-control" ng-model="formData.password" required />
<p ng-show="createUserForm.password.$invalid && submitted" class="help-block">Password is required.</p>
</div>
</div>
<div class="form-group" ng-class="{ 'has-error' : createUserForm.repeat_password.$invalid && submitted }">
<label class="col-sm-3 control-label"
for="repeat_password">Confirm Password <span class="required_label">*</span></label>
<div class="col-sm-9">
<input type="password" name="repeat_password" class="form-control" ng-model="formData.repeat_password" required pw-check="password" />
<p ng-show="createUserForm.repeat_password.$invalid && submitted" class="help-block">Confirm Password is required.</p>
<p class="help-block" ng-show="createUserForm.repeat_password.$error.pwmatch && submitted">Passwords don't match.</p>
</div>
</div>
<div class="form-group" ng-class="{ 'has-error' : createUserForm.role_id.$invalid && submitted }">
<label class="col-sm-3 control-label"
for="role_id">Role <span class="required_label">*</span></label>
<div class="col-sm-9">
<select name="role_id" id="" ng-model="formData.role_id" class="form-control" required >
<option value="">Select Role</option>
<option value="{{ role.role_id }}" ng-repeat="role in roles">{{ role.description }}</option>
</select>
<p ng-show="createUserForm.role_id.$invalid && submitted" class="help-block">Role is required.</p>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default pull-right" ng-click="cancel()">Cancel</button>
<button type="submit" class="btn btn-primary pull-right" >Submit</button>
</div>
</form>
<form class="form-horizontal" role="form" name="deleteUserForm" ng-submit="submitForm(deleteUserForm.$valid)" novalidate>
<div class="modal-header">
<h3 class="modal-title">Delete User</h3>
</div>
<div class="modal-body">
<div class="form-group">
<div class="col-sm-12">
Are you sure to delete this user? This action is permanent.
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" class="btn btn-danger pull-right" >Delete</button>
<button type="button" class="btn btn-default pull-right" ng-click="cancel()">Cancel</button>
</div>
</form>
<form class="form-horizontal" role="form" name="editUserForm" ng-submit="submitForm(editUserForm.$valid)" novalidate>
<div class="modal-header">
<h3 class="modal-title">Edit User</h3>
</div>
<div class="modal-body">
<div class="form-group" ng-class="{ 'has-error' : editUserForm.name.$invalid && submitted }">
<label class="col-sm-3 control-label"
for="name">Full Name <span class="required_label">*</span></label>
<div class="col-sm-9">
<input type="text" name="name" class="form-control" ng-model="formData.name" required />
<p ng-show="editUserForm.name.$invalid && submitted" class="help-block">Full Name is required.</p>
</div>
</div>
<div class="form-group" ng-class="{ 'has-error' : editUserForm.email.$invalid && submitted }">
<label class="col-sm-3 control-label"
for="email">Email <span class="required_label">*</span></label>
<div class="col-sm-9">
<input type="email" name="email" class="form-control" ng-model="formData.email" readonly="" />
<p ng-show="editUserForm.email.$invalid && submitted" class="help-block">Email is required.</p>
</div>
</div>
<div class="form-group" ng-class="{ 'has-error' : editUserForm.role_id.$invalid && submitted }">
<label class="col-sm-3 control-label"
for="role_id">Role <span class="required_label">*</span></label>
<div class="col-sm-9">
<select name="role_id" id="" ng-model="formData.role_id" class="form-control" required >
<option value="">Select Role</option>
<option value="{{ role.role_id }}" ng-repeat="role in roles" ng-selected="role.role_id == formData.role_id" >{{ role.description }}</option>
</select>
<p ng-show="editUserForm.role_id.$invalid && submitted" class="help-block">Role is required.</p>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default pull-right" ng-click="cancel()">Cancel</button>
<button type="submit" class="btn btn-primary pull-right" >Save Changes</button>
</div>
</form>
angular
.module('app.admin')
.controller('UserController', UserController);
UserController.$inject = ['$rootScope', '$scope', '$stateParams','userService','$timeout','adminService','$uibModal', '$state'];
function UserController($rootScope, $scope, $stateParams,userService, $timeout,adminService,$uibModal,$state) {
var vm = this;
vm.openCreateUser = openCreateUser;
vm.openEditUser = openEditUser;
vm.openDeleteUser = openDeleteUser;
//start modal
//Create User Modal
function openCreateUser() {
var modalInstance = $uibModal.open({
templateUrl: 'assets/admin/create-user.modal.html',
controller: modelInstanceController
});
modelInstanceController.$inject = ['$rootScope', '$scope', '$state', 'userService', 'Notification'];
function modelInstanceController($rootScope, $scope, $state, userService, Notification) {
//get roles
userService.getRoles()
.then(function(data){
console.log('get all roles :', data);
$scope.roles = data;
});
$scope.ok = ok;
$scope.cancel = cancel;
$scope.formData = {};
// function to submit the form after all validation has occurred
$scope.submitForm = function(isValid) {
$scope.submitted = true;
// check to make sure the form is completely valid
if (isValid) {
ok();
}
};
function ok() {
console.log('Create User Form Data: ', $scope.formData);
// return false;
userService
.createUser($scope.formData)
.finally(finallyCallback);
function finallyCallback() {
modalInstance.close();
$rootScope.$broadcast('users:updated');
Notification.success('User Created');
}
}
function cancel() {
modalInstance.close();
}
}
}
//Edit User Modal
function openEditUser(user) {
var modalInstance = $uibModal.open({
templateUrl: 'assets/admin/edit-user.modal.html',
controller: modelInstanceController
});
modelInstanceController.$inject = ['$rootScope', '$scope', '$stateParams', '$state', 'userService', 'Notification'];
function modelInstanceController($rootScope, $scope, $stateParams, $state, userService, Notification) {
//get roles and set current user data
userService.getRoles()
.then(function(data){
console.log('get all roles :', data);
$scope.roles = data;
//set current user data
var currentUser = {};
currentUser.name = user.name;
currentUser.email = user.email;
//convert role_id to string to match js comparison
currentUser.role_id = user.role_id.toString();
$scope.formData = currentUser;
});
console.log('edit user data : ', user);
$scope.ok = ok;
$scope.cancel = cancel;
// function to submit the form after all validation has occurred
$scope.submitForm = function(isValid) {
$scope.submitted = true;
// check to make sure the form is completely valid
if (isValid) {
ok();
}
};
function ok() {
//remove email from formData to prevent update email
delete $scope.formData.email;
userService
.updateUser(user.id, $scope.formData)
.finally(finallyCallback);
function finallyCallback() {
modalInstance.close();
$rootScope.$broadcast('users:updated');
Notification.success('User Updated');
}
}
function cancel() {
modalInstance.close();
}
}
}
//Delete User Modal
function openDeleteUser(user) {
var modalInstance = $uibModal.open({
templateUrl: 'assets/admin/delete-user.modal.html',
controller: modelInstanceController
});
modelInstanceController.$inject = ['$rootScope', '$scope', '$stateParams', '$state', 'userService', 'Notification'];
function modelInstanceController($rootScope, $scope, $stateParams, $state, userService, Notification) {
$scope.ok = ok;
$scope.cancel = cancel;
// function to submit the form after all validation has occurred
$scope.submitForm = function(isValid) {
$scope.submitted = true;
// check to make sure the form is completely valid
if (isValid) {
ok();
}
};
function ok() {
userService
.deleteUser(user.id)
.then(function(response){
console.log('delete user result : ', response);
})
.finally(finallyCallback);
function finallyCallback() {
modalInstance.close();
$rootScope.$broadcast('users:updated');
Notification.success('User Deleted');
}
}
function cancel() {
modalInstance.close();
}
}
}
//end of modal
}
<div class="table-responsive panel-body">
<table class="table" >
<tr class="border-top-white">
<th class="text-center">#</th>
<th>Name</th>
<th class="text-center">Email</th>
<th class="text-center">Role</th>
<th class="text-center">Companies</th>
<th class="text-center">Actions</th>
</tr>
<tr ng-repeat="user in userList">
<td class="text-center">{{ $index+1 }}</td>
<td>{{ user.name }}</td>
<td class="text-center">{{user.email}}</td>
<td class="text-center">{{user.role.description}}</td>
<td class="text-center">
<button type="button" class="btn btn-default btn-success" ng-click="viewCompanies(user)" ng-disabled="user.companies_count < 1">
{{user.companies_count}}
</button>
</td>
<td class="text-center">
<button type="button" class="btn btn-default" ng-click="vm.openEditUser(user)" >Edit</button>
<button ng-show="user.companies_count==0 && user.role_id!=3" type="button" class="btn btn-danger" ng-click="vm.openDeleteUser(user)" >Delete</button>
</td>
</tr>
</table>
</div>
(function() {
'use strict';
angular
.module('app')
.factory('userService', userService);
userService.$inject = ['$resource', '$rootScope', '$q', 'API'];
function userService($resource, $rootScope, $q, API) {
var userBaseURI = API.BaseURL + API.Services.Users;
return {
getUserByEmail: getUserByEmail,
getUsers: getUsers,
createUser: createUser,
updateUser: updateUser,
deleteUser: deleteUser,
getRoles : getRoles
};
function getUserByEmail (email) {
return $resource(userBaseURI + '/getUserByEmail/:email')
.get({email: email})
.$promise
.then(successCallback);
function successCallback(data) {
return data.user;
}
}
function getUsers () {
return $resource(userBaseURI)
.get()
.$promise
.then(successCallback);
function successCallback(data) {
return data.users;
}
}
function getRoles() {
return $resource(userBaseURI + '/roles')
.get()
.$promise
.then(successCallback);
function successCallback(data) {
return data.roles;
}
}
function createUser (data) {
return $resource(userBaseURI + '/create', null, {
'post': {
method: 'POST',
}
})
.post(data)
.$promise
.then(successCallback);
function successCallback(data) {
return data;
}
}
function updateUser (id, data) {
return $resource(userBaseURI + '/:id', null, {
'update': {
method: 'PUT',
}
})
.update({id: id}, data)
.$promise
.then(successCallback);
function successCallback(data) {
return data;
}
}
function deleteUser (id) {
return $resource(userBaseURI + '/:id', null, {
'delete': {
method: 'DELETE',
}
})
.delete({id: id})
.$promise
.then(successCallback);
function successCallback(data) {
return data;
}
}
}
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment