Added styles and dirty check for attendance.

UserCtrl is minifiable.
User route now works with names.
This commit is contained in:
Tanshu 2012-11-29 15:47:16 +05:30
parent ecbbf65feb
commit cd408e3cde
8 changed files with 94 additions and 31 deletions

View File

@ -10,3 +10,47 @@
background-color: #1F7A1F; background-color: #1F7A1F;
} }
.table tbody tr.success td {
background-color: #1F7A1F;
}
.table tbody tr.Present td {
background-color: #228B22;
}
.table tbody tr.Off td {
background-color: #87CEFA;
}
.table tbody tr.Leave td {
background-color: #CD5C5C;
}
.table tbody tr.Absent td {
background-color: #CD0000;
}
.table tbody tr.HalfDay td {
background-color: #98FB98;
}
.table tbody tr.Double td {
background-color: #006400;
}
.table tbody tr.PaidLeaveAvailed td {
background-color: #EEEE00;
}
.table tbody tr.CasualLeaveAvailed td {
background-color: #800080;
}
.table tbody tr.Overtime td {
background-color: #006400;
}
.table tbody tr.OffWorked td {
background-color: #F5DEB3;
}
.table tbody tr.COff td {
background-color: #F5DEB3;
}
.table tbody tr.HalfPL td {
background-color: #FFF68F;
}
.table tbody tr.HalfCL td {
background-color: #FF00FF;
}

View File

@ -23,9 +23,11 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr ng-repeat="item in info.Body"> <tr ng-repeat="item in info.Body"
ng-class="{0:'', 1:'Present', 2:'Off', 3:'Leave', 4:'Absent', 5:'HalfDay', 6:'Double', 7:'PaidLeaveAvailed', 8:'CasualLeaveAvailed', 9:'Overtime', 10:'OffWorked', 11:'COff', 12:'HalfPL', 13:'HalfCL'}[item.AttendanceTypeID]"
ng-controller="AttendanceSubCtrl">
<td class="right">{{item.Code}}</td> <td class="right">{{item.Code}}</td>
<td>{{item.Name}}</td> <td><i class="icon-leaf" ng-show="isDirty()"></i> {{item.Name}}</td>
<td>{{item.Designation}}</td> <td>{{item.Designation}}</td>
<td>{{item.Department}}</td> <td>{{item.Department}}</td>
<td> <td>

View File

@ -31,7 +31,7 @@
</thead> </thead>
<tbody> <tbody>
<tr ng-repeat="item in info.Body" <tr ng-repeat="item in info.Body"
ng-class="{0:'', 1:'', 2:'info', 3:'error', 4:'error', 5:'', 6:'', 7:'warning', 8:'success'}[item.AttendanceTypeID]" ng-class="{0:'', 1:'Present', 2:'Off', 3:'Leave', 4:'Absent', 5:'HalfDay', 6:'Double', 7:'PaidLeaveAvailed', 8:'CasualLeaveAvailed', 9:'Overtime', 10:'OffWorked', 11:'COff', 12:'HalfPL', 13:'HalfCL'}[item.AttendanceTypeID]"
ng-controller="EmployeeAttendanceSubCtrl"> ng-controller="EmployeeAttendanceSubCtrl">
<td>{{item.Date}}</td> <td>{{item.Date}}</td>
<td> <td>
@ -40,7 +40,7 @@
</td> </td>
<td> <td>
<button ng-hide="!isDirty()" class="btn btn-primary">Is Dirty</button> <button ng-show="isDirty()" class="btn btn-primary">Is Dirty</button>
</td> </td>
</tr> </tr>
</tbody> </tbody>

View File

@ -70,8 +70,7 @@
</div> </div>
</div> </div>
<div class="form-actions"> <div class="form-actions">
<button class="btn btn-primary" ng-click="save()" <button class="btn btn-primary" ng-click="save()" ng-disabled="preventAlteration(voucher)">{{voucher.VoucherID | save_button}}
ng-disabled="preventAlteration(voucher)">{{voucher.VoucherID | save_button}}
</button> </button>
<button class="btn btn-inverse" ng-click="post()" ng-hide="!voucher.VoucherID" <button class="btn btn-inverse" ng-click="post()" ng-hide="!voucher.VoucherID"
ng-disabled="voucher.Posted || !perms['Post Vouchers']">{{voucher.Posted | posted}} ng-disabled="voucher.Posted || !perms['Post Vouchers']">{{voucher.Posted | posted}}

View File

@ -14,7 +14,17 @@ var AttendanceCtrl = ['$scope', '$location', 'Attendance', 'attendance_types', '
}); });
}; };
$('#txtDate').focus(); $('#txtDate').focus();
}]; }]
var AttendanceSubCtrl = ['$scope', function ($scope) {
$scope.original = {};
angular.copy($scope.item, $scope.original);
$scope.isDirty = function(){
return !angular.equals($scope.original, $scope.item)
}
}]
AttendanceCtrl.resolve = { AttendanceCtrl.resolve = {
info:['$q', '$route', 'Attendance', function ($q, $route, Attendance) { info:['$q', '$route', 'Attendance', function ($q, $route, Attendance) {
var deferred = $q.defer(); var deferred = $q.defer();

View File

@ -1,11 +1,11 @@
'use strict'; 'use strict';
function UserListCtrl($scope, users) { var UserListCtrl = ['$scope', 'users', function ($scope, users) {
$scope.info = users; $scope.info = users;
} }]
UserListCtrl.resolve = { UserListCtrl.resolve = {
users:function ($q, User) { users:['$q', 'User', function ($q, User) {
var deferred = $q.defer(); var deferred = $q.defer();
var successCb = function (result) { var successCb = function (result) {
@ -14,10 +14,10 @@ UserListCtrl.resolve = {
User.query({}, successCb); User.query({}, successCb);
return deferred.promise; return deferred.promise;
} }]
}; };
function UserCtrl($scope, $location, user) { var UserCtrl = ['$scope', '$location', 'user', function ($scope, $location, user) {
$scope.user = user; $scope.user = user;
$scope.save = function () { $scope.save = function () {
@ -39,10 +39,10 @@ function UserCtrl($scope, $location, user) {
}; };
$('#txtName').focus(); $('#txtName').focus();
} }]
UserCtrl.resolve = { UserCtrl.resolve = {
user:function ($q, $route, User) { user:['$q', '$route', 'User', function ($q, $route, User) {
var deferred = $q.defer(); var deferred = $q.defer();
var id = $route.current.params.id; var id = $route.current.params.id;
@ -52,5 +52,5 @@ UserCtrl.resolve = {
User.get({id:id}, successCb); User.get({id:id}, successCb);
return deferred.promise; return deferred.promise;
} }]
}; }

View File

@ -157,23 +157,19 @@
</li> </li>
</ul> </ul>
<ul class="nav pull-right"> <ul class="nav pull-right">
<li class="dropdown" ng-hide="!auth.isAuthenticated"><a href="#" class="dropdown-toggle" data-toggle="dropdown"><i class="icon-user"></i> {{auth.Name}} <b class="caret"></b></a> <li class="dropdown" ng-show="auth.isAuthenticated"><a href="#" class="dropdown-toggle" data-toggle="dropdown"><i class="icon-user"></i> {{auth.Name}} <b class="caret"></b></a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a href="/logout">Logout {{user.name}}</a></li> <li><a href="/logout">Logout {{auth.Name}}</a></li>
<li><a href="/AccountsTesting/Security/ChangePassword.aspx">Change Password</a></li> <li><a href="/User/{{auth.Name}}">Change Password</a></li>
<li><a href="/Users">Users</a></li> <li><a href="/Users">Users</a></li>
<li><a href="/Groups">Groups</a></li> <li><a href="/Groups">Groups</a></li>
<li><a href="/Clients">Clients</a></li> <li><a href="/Clients">Clients</a></li>
<li><a href="/AccountsTesting/Maintenance/Split.aspx">Split Data</a></li> <li><a href="/AccountsTesting/Maintenance/Split.aspx">Split Data</a></li>
</ul> </ul>
</li> </li>
<li class="dropdown" ng-hide="auth.isAuthenticated"><a href="#" class="dropdown-toggle" data-toggle="dropdown"><i class="icon-user"></i> User <b class="caret"></b></a> <ul class="nav" ng-hide="auth.isAuthenticated">
<ul class="dropdown-menu"> <li><a href="/login"><i class="icon-user"></i> Log in</a></li>
<li><a href="/login">Log in</a></li> </ul>
<li><a href="/Users">Users</a></li>
<li><a href="/Groups">Groups</a></li>
</ul>
</li>
</ul> </ul>
</div> </div>

View File

@ -1,3 +1,4 @@
import re
import uuid import uuid
from pyramid.response import Response from pyramid.response import Response
@ -35,8 +36,12 @@ def save(request):
@view_config(request_method='POST', route_name='user_id', renderer='json', xhr=True, permission='Users') @view_config(request_method='POST', route_name='user_id', renderer='json', xhr=True, permission='Users')
def update(request): def update(request):
try: try:
id = request.matchdict.get('id', None) id = request.matchdict['id']
user = User.by_id(uuid.UUID(id)) p = re.compile('^[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}$')
if p.match(id):
user = User.by_id(uuid.UUID(id))
else:
user = User.by_name(id)
user.name = request.json_body['Name'] user.name = request.json_body['Name']
user.locked_out = request.json_body['LockedOut'] user.locked_out = request.json_body['LockedOut']
if request.json_body['Password'] != '' and request.json_body['Password'] != user.password: if request.json_body['Password'] != '' and request.json_body['Password'] != user.password:
@ -77,7 +82,11 @@ def delete(request):
@view_config(request_method='GET', route_name='user_id', renderer='json', xhr=True, permission='Users') @view_config(request_method='GET', route_name='user_id', renderer='json', xhr=True, permission='Users')
def show_id(request): def show_id(request):
return user_info(uuid.UUID(request.matchdict.get('id', None))) id = request.matchdict['id']
p = re.compile('^[A-Za-z0-9]{8}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{12}$')
if p.match(id):
id = uuid.UUID(id)
return user_info(id)
@view_config(request_method='GET', route_name='user', renderer='json', xhr=True, permission='Users') @view_config(request_method='GET', route_name='user', renderer='json', xhr=True, permission='Users')
@ -91,7 +100,7 @@ def show_list(request):
users = [] users = []
for item in list: for item in list:
user = {'Name': item.name, 'LockedOut': item.locked_out, user = {'Name': item.name, 'LockedOut': item.locked_out,
'Groups': [], 'Url': request.route_url('user_id', id=item.id)} 'Groups': [], 'Url': request.route_url('user_id', id=item.name)}
for group in item.groups: for group in item.groups:
user['Groups'].append(group.name) user['Groups'].append(group.name)
users.append(user) users.append(user)
@ -104,7 +113,10 @@ def user_info(id):
for item in Group.list(): for item in Group.list():
account['Groups'].append({'GroupID': item.id, 'Name': item.name, 'Enabled': False}) account['Groups'].append({'GroupID': item.id, 'Name': item.name, 'Enabled': False})
else: else:
user = User.by_id(id) if isinstance(id, uuid.UUID):
user = User.by_id(id)
else:
user = User.by_name(id)
account = {'UserID': user.id, 'Name': user.name, 'Password': '', 'LockedOut': user.locked_out, 'Groups': []} account = {'UserID': user.id, 'Name': user.name, 'Password': '', 'LockedOut': user.locked_out, 'Groups': []}
for item in Group.list(): for item in Group.list():
account['Groups'].append( account['Groups'].append(