finalising members

pull/339/head
Youssef ABIDI 2017-09-14 10:52:43 +01:00
parent 03b1bfd1b9
commit ee3508f5b7
29 changed files with 880 additions and 137 deletions

Binary file not shown.

View File

@ -5,7 +5,7 @@
<div id="survey-builder" class="panel panel-default bootstrap-panel">
<div class="panel-heading"><h2 ng-model="survey.name" ng-attr-contenteditable="{{ editmode }}" class="panel-title pull-left">{{ survey.name }}</h2></div>
<div class="panel-body">
<p ng-model="survey.description" ng-attr-contenteditable="{{ editmode }}">Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum</p>
<p ng-model="survey.description" ng-attr-contenteditable="{{ editmode }}"></p>
<div id="newElem"></div>
@ -14,12 +14,20 @@
<button type="button" class="btn btn-primary btn-with-icon btn-lg" ng-click="addElement('multiple')" ><i class="ion-plus-round"></i>NEW QUESTION</button>
</div>
<hr />
<div id="survey-actions" style="display:none;">
<div class="btn-group">
<button ng-click="saveSurvey()" class="btn btn-info btn-lg">
Save as draft
</button>
</div>
<div class="btn-group">
<button ng-click="submitSurvey()" class="btn btn-success btn-lg">
Create
Save and next
</button>
</div>
</div>
</div>
<br/>
<br/>
@ -27,6 +35,58 @@
</div>
</div>
</div>
<div id="sidebar" class="col-md-4 col-lg-4" style="display:none;">
<div id="survey-lists" class="panel panel-default bootstrap-panel">
<div class="panel-heading"><h2 class="panel-title pull-left">Send your survey</h2></div>
<div class="panel-body">
<div class="form-group">
<ui-select multiple ng-model="lists.selected"
ng-disabled="false"
search-enabled="true"
append-to-body="true"
class="form-control ">
<ui-select-match placeholder="Choose a list">
{{$item.name}}
</ui-select-match>
<ui-select-choices repeat="multipleItem in lists | filter: $select.search">
{{multipleItem.name}}
</ui-select-choices>
</ui-select>
</div>
<div class="feed-messages-container" track-width="smallContainerWidth" min-width="360">
<div class="feed-message" ng-repeat="l in lists.selected">
<!--<img class="photo-icon" ng-src="{{m.name.split(' ')[0] | profilePicture}}">-->
<img class="photo-icon roll-in-blurred-right" ng-src="{{m | profilePicture}}" ng-repeat="m in l.members">
</div>
</div>
<div class="actions">
<div class="btn-group">
<button ng-click="sendSurvey()" class="btn btn-success btn-lg">
Send the Survey
</button>
</div>
<div class="btn-group">
<button ng-click="cancelSending()" class="btn btn-danger btn-lg">
Cancel
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script>

View File

@ -5,7 +5,7 @@
(function () {
'use strict';
angular.module('BlurAdmin.pages.surveys.create',['BlurAdmin.pages.surveys'])
angular.module('BlurAdmin.pages.surveys.create',['BlurAdmin.pages.surveys', 'ui.select', 'ngSanitize'])
.directive('tagInput', tagInput);
function tagInput() {

View File

@ -33,9 +33,14 @@
});
/** @ngInject */
function CreateTabCtrl(SurveyService, $scope, $http, $compile, $timeout) {
function CreateTabCtrl(SurveyService, ListService, $scope, $http, $compile, $timeout, $stateParams, $log, toastr) {
$scope.editmode = true;
$scope.lists = [];
$scope.lists.selected = [];
$scope.$watch('lists.selected', $scope.updateLists);
$scope.survey = {};
$scope.survey.name = 'Page Title';
$scope.survey.description = 'Page Description';
@ -69,12 +74,12 @@
$scope.createEmptyElement = function(type,orderNo){
var item = {
id: 1,
id: null,
orderNo: 1,
value: null
};
return {
id: $scope.survey.elements.length+1, // TODO : generate the ID
id: null, // TODO : generate the ID
orderNo: orderNo,
text: "",
type: type,
@ -91,7 +96,7 @@
$scope.addNewItem=function(index){
var item = {
id: $scope.survey.elements[index].length + 1,
id: null,
orderNo: $scope.survey.elements[index].length + 1,
value: null
};
@ -111,27 +116,126 @@
};
$scope.submitSurvey=function(){
$scope.saveSurvey=function(){
var survey = $scope.survey
if($stateParams.survey_id) {
SurveyService
.update(survey)
.then(
function (data){
console.log('Survey edited', data);
toastr.info('The survey was edited successfuly :)', 'Surveys', {
"autoDismiss": true,
"positionClass": "toast-bottom-right",
"type": "success",
"timeOut": "5000",
"extendedTimeOut": "2000"
})
},
function (error){
toastr.error('There were an error editing the survey', 'Surveys', {
"autoDismiss": true,
"positionClass": "toast-bottom-right",
"type": "error",
"timeOut": "5000",
"extendedTimeOut": "2000"
})
}
);
} else {
SurveyService
.create(survey)
.then(
function (data){
console.log('Survey created', data);
toastr.info('The survey was created successfuly :)', 'Surveys', {
"autoDismiss": true,
"positionClass": "toast-bottom-right",
"type": "success",
"timeOut": "5000",
"extendedTimeOut": "2000"
})
},
function (error){
console.log("Error creating the survey");
toastr.error('There were an error creating the survey', 'Surveys', {
"autoDismiss": true,
"positionClass": "toast-bottom-right",
"type": "error",
"timeOut": "5000",
"extendedTimeOut": "2000"
})
}
);
}
};
$scope.submitSurvey=function(){
$scope.saveSurvey();
$("#sidebar").fadeIn();
$("#survey-actions").fadeOut();
};
$scope.sendSurvey=function(){
/*$scope.saveSurvey();
$("#sidebar").fadeIn();
$("#survey-actions").fadeOut();*/
};
$scope.cancelSending=function(){
$("#sidebar").fadeOut();
$("#survey-actions").fadeIn();
};
$scope.updateBuilder=function(){
var compiledeHTML = $compile("<div multiple-q></div>")($scope);
$("#newElem").html(compiledeHTML);
if($scope.survey.elements.length>0)
$("#survey-actions").show();
else
$("#survey-actions").hide();
console.log($scope.survey.elements);
};
$scope.loadSurvey = function(id) {
SurveyService
.get(id)
.then(function (data){
$scope.survey = data[0];
$scope.updateBuilder();
$log.info("Got the survey data",$scope.survey);
}, function (error){
$log.error(error);
});
}
$scope.loadLists = function() {
ListService
.list()
.then(function (data){
$scope.lists = data;
$log.info("Got the lists data",data);
}, function (error){
$log.error(error);
});
}
$scope.updateLists = function() {
}
$scope.activate=function(){
if($stateParams.survey_id) {
$scope.loadSurvey($stateParams.member_id);
}
$scope.loadLists();
}
$scope.activate();
}
})();

View File

@ -5,8 +5,9 @@
.controller('list', list);
/** @ngInject */
function list( SurveyService, $scope, $log, $state) {
function list( SurveyService, $scope, $rootScope, $log, $state, toastr) {
var vm = this;
$rootScope.$state = $state;
function loadSurveys() {
SurveyService
@ -24,9 +25,47 @@
$state.go('surveys.create');
}
function editSurvey(id){
$log.info("Edit");
$state.go('surveys.edit', {'survey_id': id})
};
function removeSurvey(id){
if (confirm("Are you sure?"))
{
$log.info("Remove");
SurveyService
.remove(id)
.then(
function (data){
console.log('Survey deleted', data);
$("tr#"+id).slideUp();
toastr.info('The survey was deleted successfuly :)', 'Surveys', {
"autoDismiss": true,
"positionClass": "toast-bottom-right",
"type": "success",
"timeOut": "5000",
"extendedTimeOut": "2000"
})
},
function (error){
toastr.error('There were an error deleting the survey', 'Surveys', {
"autoDismiss": true,
"positionClass": "toast-bottom-right",
"type": "error",
"timeOut": "5000",
"extendedTimeOut": "2000"
})
}
);
}
};
function activate(){
vm.surveys = [];
vm.goToCreate = goToCreate;
vm.editSurvey = editSurvey;
vm.removeSurvey = removeSurvey;
loadSurveys();
}

View File

@ -9,31 +9,39 @@
</button>
</div>
<table ng-if="vm.surveys.length > 0" class="table table-bordered table-hover">
<table ng-if="vm.surveys.length > 0" class="table table-bordered table-hover table-condensed">
<thead>
<tr class="black-muted-bg" >
<th></td>
<th>Title</td>
<th>Last edit</td>
<th>Responses</td>
<th>Actions</td>
<td class="table-id">#</td>
<td>Title</td>
<td>Created</td>
<td>Last edit</td>
<td>Responses</td>
<td>Status</td>
<td>Actions</td>
</tr>
<thead>
<tbody>
<tr ng-repeat="survey in vm.surveys track by survey.id" >
<tr id="{{ survey.id }}" ng-repeat="survey in vm.surveys track by survey.id" class="editable-row" >
<td>
{{ $index }}
</td>
<td>
{{ survey.name }} <br />
Create at : {{ survey.createdAt | date:'shortDate' }}
{{ survey.name }}
</td>
<td>
{{ survey.createdAt | date:'shortDate' }}
</td>
<td>
{{ survey.updatedAt | date:'shortDate' }}
</td>
<td> {{ survey.responses || 0 }}
<td> {{ survey.responses || 0 }} </td>
<td> {{ survey.status }} </td>
<td>
Action ...
<button class="status-button btn btn-xs btn-primary" ng-click="vm.editSurvey(survey.id)">Edit</button>
<button class="status-button btn btn-xs btn-info" ng-if="survey.status == 'Draft'" ng-click="vm.goToSend(survey.id)">Send</button>
<button class="status-button btn btn-xs btn-info" ng-if="survey.status == 'Draft'" ng-click="vm.goToAnswers(survey.id)">Answers</button>
<button class="status-button btn btn-xs btn-danger" ng-click="vm.removeSurvey(survey.id)">Remove</button>
</td>
</tr>
</tbody>

View File

@ -29,22 +29,39 @@
return $http.get(endpoint, params);
}
function get(id) {
var deferred = $q.defer();
$http.get(endpoint)
.success(function(data) {
deferred.resolve(data);
}).error(function(msg, code) {
deferred.reject(msg);
});
return deferred.promise;
return $http.get(endpoint, id);
}
function create(survey) {
return $http.post(endpoint, survey);
}
function edit(survery) {
console.log("edit jSurvey Opject", survey);
function update(survey) {
return $http.put(endpoint + "/"+survey.id, survey);
}
function remove(survery) {
console.log("remove Opject", survey);
function remove(id) {
return $http.delete(endpoint + "/"+id);
}
return {
list:list,
get:get,
create:create,
edit:edit,
update:update,
remove:remove
}
}

View File

@ -30,6 +30,11 @@
sidebarMeta: {
order: 1000,
},
}).state('surveys.edit', {
url: '/edit/:survey_id',
templateUrl: 'app/pages/surveys/create/create.html',
controller: "CreateTabCtrl",
title: 'Edit a survey'
}).state('surveys.list', {
url: '/list',
templateUrl: 'app/pages/surveys/list/list.html',

View File

@ -0,0 +1,62 @@
/**
* @author ayoub
*/
(function () {
'use strict';
angular.module('BlurAdmin.pages.teams')
.factory('AnswerService', AnswerService);
/** @ngInject */
function AnswerService($http, $q) {
var apiBaseUrl = "http://localhost:9000"
var endpoint = apiBaseUrl + "/answers";
function list(params) {
params = params || {};
var deferred = $q.defer();
$http.get(endpoint)
.success(function(data) {
deferred.resolve(data);
}).error(function(msg, code) {
deferred.reject(msg);
});
return deferred.promise;
return $http.get(endpoint, params);
}
function create(answer) {
console.log("new Answer Object", answer);
// return $http.post(endpoint, answer);
}
function put(answer) {
return $http.put(endpoint + "/" + answer.id, answer);
}
function get(id) {
return $http.get(endpoint + "/" + id);
}
function edit(answer) {
console.log("edit Answer Object", answer);
}
function remove(id) {
return $http.delete(endpoint + "/" + id);
}
return {
list:list,
create:create,
edit:edit,
get:get,
put:put,
remove:remove
}
}
})();

View File

@ -6,10 +6,21 @@
'use strict';
angular.module('BlurAdmin.pages.teams.lists')
.controller('ListsTabCtrl', ListsTabCtrl);
.controller('ListsTabCtrl', ListsTabCtrl)
.filter('bytetobase', function () {
return function (buffer) {
var binary = '';
var bytes = new Uint8Array(buffer);
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[i]);
}
return window.btoa(binary);
};
});
/** @ngInject */
function ListsTabCtrl($scope, baConfig, membersList, ListService,MemberService, $log) {
function ListsTabCtrl($scope, baConfig, membersList, ListService,MemberService, $log, $state,$stateParams) {
var vm = this;
vm.searchResult = [];
@ -18,6 +29,21 @@
ListService
.list()
.then(function (data){
if($stateParams.id){
for (var i = data.length - 1; i >= 0; i--) {
console.log('stateParams',$stateParams.id,data[i])
if($stateParams.id == data[i].id) {
data[i].isChecked = true;
vm.activeList = data[i];
vm.errors.noList = false;
vm.updateListMembers(data[i]);
} else
data[i].isChecked = false;
};
}
vm.Lists = data;
$log.info("Got the list data",data);
//getting all members
@ -26,6 +52,7 @@
.then(function (data){
vm.searchResult = data;
$log.info("Got the members data",data);
$log.info("activeList",vm.activeList);
}, function (error){
$log.error(error);
});
@ -70,7 +97,51 @@
vm.newList = {};
vm.activeList = {};
vm.listMembers = [];
vm.selectedLabel = "listing";
vm.selectedLabel = "";
vm.selectAllResults = false;
vm.selectAllMembers = false;
vm.errors = {};
vm.errors.noList = true;
vm.selectAllSearchResult = function() {
if (vm.selectAllResults) {
vm.selectAllResults = true;
} else {
vm.selectAllResults = false;
}
angular.forEach(vm.searchResult, function (item) {
item.Selected = vm.selectAllResults;
});
}
vm.selectAllListMembers = function() {
if (vm.selectAllMembers) {
vm.selectAllMembers = true;
} else {
vm.selectAllMembers = false;
}
angular.forEach(vm.listMembers, function (item) {
item.Selected = vm.selectAllMembers;
});
}
vm.insertSearchResult = function(member) {
angular.forEach(vm.searchResult, function (item) {
if(member.id == item.id)
item = member;
});
console.log('insertSearchResult:vm.searchResult', vm.searchResult)
}
vm.insertMemberList = function(member) {
angular.forEach(vm.listMembers, function (item) {
if(member.id == item.id)
item = member;
});
console.log('insertMemberList:vm.listMembers', vm.listMembers)
}
vm.addNewList = function (event, clickPlus) {
if (clickPlus || event.which === 13) {
@ -95,8 +166,10 @@
vm.updateListMembers = function (item) {
//uncheck others lists
if (item.isChecked) {
if (item && item.isChecked) {
vm.activeList = item;
vm.errors.noList = false;
$state.transitionTo('teams.lists', {id: item.id}, {notify: false});
angular.forEach(vm.Lists, function(list){
if(item.id != list.id)
list.isChecked = false;
@ -104,52 +177,87 @@
//getting members info
vm.listMembers = [];
var membersIds = item.members;
angular.forEach(membersIds, function(id){
var params = (item.members && item.members.length > 0) ? {"ids" : item.members} : {};
//angular.forEach(membersIds, function(id){
if (item.members.length > 0) {
vm.errors.noMember = false;
MemberService
.get(id)
.list(params)
.then(
function (data){
vm.listMembers.push( data.data );
vm.listMembers = data;
console.log("updateListMembers",vm.activeList, vm.listMembers);
},
function (error){
console.log("Error getting the member");
}
);
});
} else
vm.errors.noMember = true;
//});
} else {
vm.activeList = {};
vm.errors.noList = true;
vm.listMembers = [];
$state.transitionTo('teams.lists', {notify: false});
}
};
vm.getMemberByLabel = function (label) {
console.log(label);
vm.searchResult = membersList.getMembersByLabel(label);
vm.getMemberByLabel = function () {
//console.log(vm.selectedLabel);
var params = (vm.selectedLabel && vm.selectedLabel != "" && vm.selectedLabel != "listing") ? { "labels" : vm.selectedLabel } : {};
MemberService
.list(params)
.then(
function (data){
vm.searchResult = data;
console.log("getMemberByLabel",data);
},
function (error){
console.log("Error getting the members");
}
);
};
vm.updateMembers = function (member, action) {
vm.updateMembers = function (members, action, multi = false) {
if (confirm("Are you sure?"))
{
console.log('updateMembers:members', members)
var list = vm.activeList;
var index = list.members.indexOf(member.id);
vm.errors.noList = false;
for (var i = 0; i < members.length; i++) {
if(multi == false || (multi == true && members[i].Selected == true)) {
var index = list.members.indexOf(members[i].id);
//vm.listMembers = [];
if (action == "add") {
if (index == -1)
list.members.push(member.id);
list.members.push(members[i].id);
} else {
if (index != -1)
list.members.splice(index, 1);
}
}
}
vm.activeList.isChecked = true;
ListService
.edit(list)
.then(
function (data){
loadLists();
vm.newList.name = '';
//loadLists();
vm.updateListMembers(vm.activeList);
},
function (error){
console.log("Error updating the LIST");

View File

@ -12,7 +12,7 @@
function routeConfig($stateProvider,$urlRouterProvider) {
$stateProvider
.state('teams.lists', {
url: '/lists',
url: '/lists/:id',
//abstract: true,
templateUrl: 'app/pages/teams/lists/lists.html',
controller: "ListsTabCtrl as vm",

View File

@ -1,5 +1,5 @@
<div class="row">
<div class="col-xlg-4 col-lg-6 col-md-4 col-xs-12"
<div class="col-xlg-6 col-lg-6 col-md-6 col-xs-12 {{ vm.activeList.name ? 'slide-out-blurred-left' : '' }}"
ba-panel
ba-panel-title="Mailing LISTS"
ba-panel-class="xmedium-panel feed-comply-panel with-scroll todo-panel">
@ -26,61 +26,149 @@
</div>
<div class="col-xlg-4 col-lg-6 col-md-4 col-xs-12"
<div class="col-xlg-6 col-lg-6 col-md-6 col-xs-12"
ba-panel
ba-panel-title="List members"
ba-panel-title="{{vm.activeList.name}} members"
ba-panel-class="xmedium-panel feed-comply-panel with-scroll todo-panel">
<div class="feed-messages-container" track-width="smallContainerWidth" min-width="360">
<div class="feed-message" ng-repeat="m in vm.listMembers">
<div class="message-icon">
<!--<img class="photo-icon" ng-src="{{m.name.split(' ')[0] | profilePicture}}">-->
<img class="photo-icon" ng-src="{{'undefined' | profilePicture}}">
</div>
<div class="text-block text-message">
<div class="message-header">
<span class="author">{{m.name}}</span>
<span class="email">{{m.email}}</span>
</div>
<div class="message-content line-clamp">
<span>{{m.position}} </span>
</div>
<button class="btn btn-danger editable-table-button btn-xs pull-right" ng-click="vm.updateMembers(m, 'remove')">Remove</button>
<div id="members-control" class="mail-messages-control side-message-navigation-item">
<div class="toggle-navigation-container">
<a href class="collapse-navigation-link ion-navicon"
ng-click="tabCtrl.navigationCollapsed=!tabCtrl.navigationCollapsed"></a>
</div>
<label class="checkbox-inline custom-checkbox nowrap">
<input type="checkbox" id="members-check" ng-model="vm.selectAllMembers" ng-change="vm.selectAllListMembers()">
<span class="select-all-label">Select All</span>
</label>
<button type="button" class="btn btn-icon refresh-button"><i class="ion-refresh"></i></button>
<div class="btn-group" uib-dropdown>
<button type="button" class="btn more-button" uib-dropdown-toggle>
More <span class="caret"></span>
</button>
<ul uib-dropdown-menu>
<li><a ng-click="vm.updateMembers(vm.listMembers, 'remove', true)">Remove all selected members</a></li>
</ul>
</div>
</div>
<div id="members" class="messages">
<table>
<tr ng-repeat="m in vm.listMembers"
class="side-message-navigation-item little-human shineHover">
<td class="check-td">
<div class="mail-checkbox">
<label class="checkbox-inline custom-checkbox nowrap">
<input type="checkbox" ng-model="m.Selected" ng-change="vm.insertMemberList(m)">
<span></span>
</label>
</div>
<div class="col-xlg-4 col-lg-6 col-md-4 col-xs-12"
</td>
<td class="photo-td"><img ng-src="{{m.id | profilePicture}}" class="little-human-picture"></td>
<td>
<div class="name-container">
<div><span class="name">{{m.name}}</span></div>
<div>{{m.email}}</div>
</div>
</td>
<td ui-sref="components.mail.detail({id: m.id, label: listCtrl.label})">
<div class="additional-info">
<span class="subject"> {{m.position}}</span>
</div>
</td>
<td>
<button class="btn btn-danger btn-xs pull-left" ng-click="vm.updateMembers([m], 'remove')"><span class="glyphicon glyphicon-trash"></span></button>
</td>
</tr>
<tr class="side-message-navigation-item {{ vm.errors.noMember ? 'visible' : 'invisible' }}"><td class="check-td"></td><td><span>This list contain no member ! Please start adding some on your right.</span></td></tr>
<tr class="side-message-navigation-item {{ vm.errors.noList ? 'visible' : 'invisible' }}"><td class="check-td"></td><td><span>No list is selected ! Please select one on your left.</span></td></tr>
</table>
</div>
</div>
<div class="col-xlg-6 col-lg-6 col-md-6 col-xs-12 {{ vm.activeList.name ? 'roll-in-blurred-right' : 'invisible' }}"
ba-panel
ba-panel-title="Add new members"
ba-panel-class="xmedium-panel feed-comply-panel with-scroll todo-panel">
<input type="text" value="" class="form-control task-todo" placeholder="Search" ng-keyup="vm.addNewList($event)"/>
<select class="form-control" selectpicker ng-model="vm.selectedLabel" ng-change="vm.getMemberByLabel(selectedLabel)">
<option selected="true" value="listing">Search by tag ...</option>
<select class="form-control" selectpicker ng-model="vm.selectedLabel" ng-change="vm.getMemberByLabel()">
<option selected="true" value="">Search by tag ...</option>
<option ng-repeat="t in vm.tabs" value="{{t.label}}">{{t.name}}</option>
</select>
<div class="feed-messages-container" track-width="smallContainerWidth" min-width="360">
<div class="feed-message" ng-repeat="m in vm.searchResult">
<div class="message-icon">
<!--<img class="photo-icon" ng-src="{{m.name.split(' ')[0] | profilePicture}}">-->
<img class="photo-icon" ng-src="{{'undefined' | profilePicture}}">
<div id="results-control" class="mail-messages-control side-message-navigation-item">
<div class="toggle-navigation-container">
<a href class="collapse-navigation-link ion-navicon"
ng-click="tabCtrl.navigationCollapsed=!tabCtrl.navigationCollapsed"></a>
</div>
<div class="text-block text-message">
<div class="message-header">
<span class="author">{{m.name}}</span>
<span class="email">{{m.email}}</span>
<label class="checkbox-inline custom-checkbox nowrap">
<input type="checkbox" id="results-check" ng-model="vm.selectAllResults" ng-change="vm.selectAllSearchResult()">
<span class="select-all-label">Select All</span>
</label>
<button type="button" class="btn btn-icon refresh-button"><i class="ion-refresh"></i></button>
<div class="btn-group" uib-dropdown>
<button type="button" class="btn more-button" uib-dropdown-toggle>
More <span class="caret"></span>
</button>
<ul uib-dropdown-menu>
<li><a ng-click="vm.updateMembers(vm.searchResult, 'add', true)">Add all selected members</a></li>
</ul>
</div>
<div class="message-content line-clamp">
<span>{{m.position}} </span>
</div>
<button class="btn btn-success editable-table-button btn-xs pull-right" ng-click="vm.updateMembers(m, 'add')">Add</button>
<div id="results" class="messages">
<table>
<tr ng-repeat="m in vm.searchResult"
class="side-message-navigation-item little-human shineHover">
<td class="check-td">
<div class="mail-checkbox">
<label class="checkbox-inline custom-checkbox nowrap">
<input type="checkbox" ng-model="m.Selected" ng-change="vm.insertSearchResult(m)">
<span></span>
</label>
</div>
</td>
<td class="photo-td"><img ng-src="{{m.id | profilePicture}}" class="little-human-picture"></td>
<td>
<div class="name-container">
<div><span class="name">{{m.name}}</span></div>
<div>{{m.email}}</div>
</div>
</td>
<td ui-sref="components.mail.detail({id: m.id, label: listCtrl.label})">
<div class="additional-info">
<span class="subject"> {{m.position}}</span>
</div>
</td>
<td>
<button class="btn btn-success btn-xs pull-left" ng-click="vm.updateMembers([m], 'add')"><span class="glyphicon glyphicon-plus"></span></button>
</td>
</tr>
</table>
</div>
</div>
<div class="col-xlg-12 col-lg-12 col-md-12 col-xs-12">
<div class="btn-group pull-right {{ vm.activeList.name ? 'visible' : 'invisible' }}">
<button ng-click="vm.updateListMembers({})" class="btn btn-danger btn-lg">
Go back to the lists selection
</button>
</div>
</div>
</div>
</div>

View File

@ -9,13 +9,21 @@
.controller('MembersTabCtrl', MembersTabCtrl);
/** @ngInject */
function MembersTabCtrl(composeModal, membersList) {
function MembersTabCtrl(composeModal, membersList, MemberService, $log) {
var vm = this;
vm.navigationCollapsed = true;
vm.showCompose = function(id){
if (id != ''){
vm.member = membersList.getMemberById(id);
MemberService
.get(id)
.then(function (data){
vm.member = data.data;
$log.info("Got the member data",data.data);
}, function (error){
$log.error(error);
});
//vm.member = membersList.getMemberById(id);
//vm.actualIndex = membersList.getIndexById(id);
}
else
@ -27,6 +35,20 @@
})
};
vm.removeMember = function(id) {
MemberService
.remove(id)
.then(function (data){
$("tr#m-"+id).slideUp();
}, function (error){
$log.error(error);
});
}
vm.selectTab = function (label) {
};
vm.tabs = membersList.getTabs();
}

View File

@ -9,11 +9,12 @@
.controller('composeBoxCtrl', composeBoxCtrl);
/** @ngInject */
function composeBoxCtrl($scope ,member, membersList,MemberService,fileReader, $filter) {
function composeBoxCtrl($scope ,member, membersList,MemberService,fileReader, $filter, toastr, $state) {
var vm = this;
vm.member = member;
//vm.actualIndex = actualIndex;
vm.picture = (member.pic && member.pic != "") ? $filter('profilePicture')(member.name.split(' ')[0]) : $filter('appImage')('theme/no-photo.png');
//console.log("member",member)
vm.picture = $filter('profilePicture')(member.id, "jpeg") ;//: $filter('appImage')('theme/no-photo.png');
vm.Labels = membersList.getTabs();
$scope.removePicture = function () {
@ -35,11 +36,40 @@
};
vm.updateMember = function () {
console.log(membersList.getIndexById(vm.member.id), vm.member);
//vm.member.picture = vm.picture;
//vm.member.fileExt = "jpeg";
console.log('composeBoxCtrl.updateMember', membersList.getIndexById(vm.member.id), vm.member);
};
vm.createMember = function () {
MemberService.create(vm.member);
vm.member.picture = vm.picture.replace(/^data:image\/(png|jpg|jpeg);base64,/, "");
vm.member.fileExt = "jpeg";
MemberService
.create(vm.member)
.then(function (data){
vm.member = {}
$state.go('teams.members');
toastr.info('The member was created successfuly :)', 'Members', {
"autoDismiss": true,
"positionClass": "toast-bottom-right",
"type": "success",
"timeOut": "5000",
"extendedTimeOut": "2000"
})
}, function (error){
$log.error(error);
toastr.error('There were an error creating the memeber', 'Members', {
"autoDismiss": true,
"positionClass": "toast-bottom-right",
"type": "error",
"timeOut": "5000",
"extendedTimeOut": "2000"
})
});
};
}
})();

View File

@ -15,7 +15,7 @@
<div class="labels-container">
<div ng-repeat="t in tabCtrl.tabs" ui-sref-active="active" class="label-item"
ui-sref="teams.members.label({label: t.label})" ng-click="selectTab(t.label)">
ui-sref="teams.members.label({label: t.label})" ng-click="tabCtrl.selectTab(t.label)">
<span class="tag label {{t.label}}">{{t.name}}</span>
</div>

View File

@ -13,7 +13,7 @@
$stateProvider
.state('teams.members', {
url: '/members',
abstract: true,
//abstract: true,
templateUrl: 'app/pages/teams/members/members.html',
controller: "MembersTabCtrl",
controllerAs: "tabCtrl",
@ -28,7 +28,7 @@
controller: "MembersListCtrl",
controllerAs: "listCtrl"
}).state('teams.members.detail', {
url: '/:label/:id',
url: '/:id',
templateUrl: 'app/pages/teams/members/detail/memberDetail.html',
title: 'Detail',
controller: "MemberDetailCtrl",

View File

@ -14,8 +14,10 @@
//vm.members = ($stateParams.label == "listing") ? membersList.getAllMessages() : membersList.getMembersByLabel($stateParams.label);
function loadMembers() {
var params = ($stateParams.label && $stateParams.label != "listing") ? {"labels":$stateParams.label} : {}
console.log("params",params);
MemberService
.list()
.list(params)
.then(function (data){
vm.members = data;
$log.info("Got the members data",data);
@ -24,6 +26,8 @@
});
}
function activate(){
vm.members = [];
loadMembers();

View File

@ -24,7 +24,7 @@
</div>
<div class="messages">
<table>
<tr ng-repeat="m in listCtrl.members track by m.id"
<tr id="m-{{m.id}}" ng-repeat="m in listCtrl.members track by m.id"
class="side-message-navigation-item little-human shineHover {{m.tag}}">
<td class="check-td">
<div class="mail-checkbox">
@ -35,8 +35,8 @@
</div>
</td>
<td class="photo-td" ui-sref="teams.members.detail({id: m.id, label: listCtrl.label})">
<!--<img ng-src="{{m.name.split(' ')[0] | profilePicture}}" class="little-human-picture">-->
<img ng-src="{{'undefined' | profilePicture}}" class="little-human-picture">
<img ng-src="{{m.id | profilePicture}}" class="little-human-picture">
</td>
<td ui-sref="teams.members.detail({id: m.id, label: listCtrl.label})">
<div class="name-container">
@ -54,7 +54,7 @@
</td>
<td>
<button class="btn btn-primary editable-table-button btn-xs" ng-click="tabCtrl.showCompose(m.id)">Edit</button>
<button class="btn btn-danger editable-table-button btn-xs" ng-click="removeMember(m.id)">Delete</button>
<button class="btn btn-danger editable-table-button btn-xs" ng-click="tabCtrl.removeMember(m.id)">Delete</button>
</td>
</tr>
</table>

View File

@ -15,8 +15,10 @@
function list(params) {
params = params || {};
console.log("labels", params);
var deferred = $q.defer();
$http.get(endpoint)
$http.get(endpoint, { params : params})
.success(function(data) {
deferred.resolve(data);
}).error(function(msg, code) {
@ -49,13 +51,21 @@
return $http.delete(endpoint + "/" + id);
}
function getMembersByLabel (label){
var members = list();
return members.filter(function(m){
return m.labels.indexOf(label) != -1;
});
}
return {
list:list,
create:create,
edit:edit,
get:get,
put:put,
remove:remove
remove:remove,
getMembersByLabel:getMembersByLabel
}
}
})();

View File

@ -8,6 +8,7 @@
angular.module('BlurAdmin.pages.teams', [
'BlurAdmin.pages.teams.members',
'BlurAdmin.pages.teams.lists',
'lr.upload',
])
.config(routeConfig);

View File

@ -64,7 +64,7 @@
}
vm.submit = function(form){
vm.test = function(form){
//$scope.submitted = true;
alert("Angular is Awesome!!!");
console.log('submit', form);

View File

@ -14,7 +14,7 @@
form: '='
},
templateUrl: 'app/theme/components/baWizard/baWizardStep.html',
link: function($scope, $element, $attrs, wizard) {
link: function($scope, $element, $attrs, wizard, AnswerService) {
$scope.selected = true;
var tab = {
@ -43,6 +43,7 @@
$scope.form && $scope.form.$setSubmitted(true);
if($scope.form && $scope.form.$invalid == false) {
//console.log("inner", $scope.form.innerForm);
angular.forEach($scope.form.innerForm, function(val, key) {
if((key.indexOf("_") !== -1) && (key.indexOf("_comment") == -1)) {
@ -57,7 +58,8 @@
"memberEvaluated" : res[1],
"memberAsked" : res[2]
}
console.log(answer);
console.log($scope);
//AnswerService.create(answer);
/*$http.post(endpoint, answer).success(function(data) {
console.log(data.data);
//return response.data;

View File

@ -1,4 +1,4 @@
<ul class="al-msg-center clearfix">
<!--<ul class="al-msg-center clearfix">
<li uib-dropdown>
<a href uib-dropdown-toggle>
<i class="fa fa-bell-o"></i><span>5</span>
@ -50,4 +50,4 @@
<a href>See all messages</a>
</div>
</li>
</ul>
</ul>-->

View File

@ -1,6 +1,7 @@
<div class="page-top clearfix" scroll-position="scrolled" max-height="50" ng-class="{'scrolled': scrolled}">
<a href="#/dashboard" class="al-logo clearfix"><span>Blur</span>Admin</a>
<a href class="collapse-menu-link ion-navicon" ba-sidebar-toggle-menu></a>
<a href="#/dashboard" class="al-logo clearfix"><span>Avito</span> Survey Admin</a>
<div class="search">
<i class="ion-ios-search-strong" ng-click="startSearch()"></i>
@ -8,7 +9,8 @@
</div>
<div class="user-profile clearfix">
<div class="al-user-profile" uib-dropdown>
<!--<div class="al-user-profile" uib-dropdown>
<a uib-dropdown-toggle class="profile-toggle-link">
<img ng-src="{{::( 'Nasta' | profilePicture )}}">
</a>
@ -18,7 +20,8 @@
<li><a href><i class="fa fa-cog"></i>Settings</a></li>
<li><a href class="signout"><i class="fa fa-power-off"></i>Sign out</a></li>
</ul>
</div>
</div>-->
<msg-center></msg-center>
</div>
</div>

View File

@ -11,8 +11,9 @@
/** @ngInject */
function profilePicture(layoutPaths) {
return function(input, ext) {
ext = ext || 'png';
return layoutPaths.images.profile + input + '.' + ext;
ext = ext || 'jpeg';
//return layoutPaths.images.profile + input + '.' + ext;
return layoutPaths.images.pictures + input + '.' + ext;
};
}

View File

@ -16,6 +16,7 @@
images: {
root: IMAGES_ROOT,
profile: IMAGES_ROOT + 'app/profile/',
pictures: 'assets/pictures/',
amMap: 'assets/img/theme/vendor/ammap//dist/ammap/images/',
amChart: 'assets/img/theme/vendor/amcharts/dist/amcharts/images/'
}

View File

@ -191,14 +191,14 @@
.little-human {
cursor: pointer;
transition: border-left 1.5s ease;
/*transition: border-left 1.5s ease;*/
font-weight: 300;
.little-human-picture {
width: 45px;
height: 45px;
border-radius: 23px;
margin: 7px 0px 7px 7px;
transition: all .2s ease-in-out;
/*transition: all .2s ease-in-out;*/
}
.name {
font-size: 14px;

178
src/sass/theme/_custom.scss Normal file
View File

@ -0,0 +1,178 @@
#surveys .photo-icon {
margin-right:5px;
width: 45px;
height: 45px;
border-radius: 50%;
}
.roll-in-blurred-right {
-webkit-animation: roll-in-blurred-right 0.65s cubic-bezier(0.230, 1.000, 0.320, 1.000) 1s both;
animation: roll-in-blurred-right 0.65s cubic-bezier(0.230, 1.000, 0.320, 1.000) 1s both;
}
.roll-in-blurred-left {
-webkit-animation: roll-in-blurred-left 0.65s cubic-bezier(0.230, 1.000, 0.320, 1.000) both;
animation: roll-in-blurred-left 0.65s cubic-bezier(0.230, 1.000, 0.320, 1.000) both;
}
.slide-out-blurred-left {
-webkit-animation: slide-out-blurred-left 0.45s cubic-bezier(0.755, 0.050, 0.855, 0.060) both;
animation: slide-out-blurred-left 0.45s cubic-bezier(0.755, 0.050, 0.855, 0.060) both;
}
.slide-out-blurred-right {
-webkit-animation: slide-out-blurred-right 0.45s cubic-bezier(0.755, 0.050, 0.855, 0.060) both;
animation: slide-out-blurred-right 0.45s cubic-bezier(0.755, 0.050, 0.855, 0.060) both;
}
@-webkit-keyframes roll-in-blurred-right {
0% {
-webkit-transform: translateX(1000px) rotate(720deg);
transform: translateX(1000px) rotate(720deg);
-webkit-filter: blur(50px);
filter: blur(50px);
opacity: 0;
}
100% {
-webkit-transform: translateX(0) rotate(0deg);
transform: translateX(0) rotate(0deg);
-webkit-filter: blur(0);
filter: blur(0);
opacity: 1;
}
}
@keyframes roll-in-blurred-right {
0% {
-webkit-transform: translateX(1000px) rotate(720deg);
transform: translateX(1000px) rotate(720deg);
-webkit-filter: blur(50px);
filter: blur(50px);
opacity: 0;
}
100% {
-webkit-transform: translateX(0) rotate(0deg);
transform: translateX(0) rotate(0deg);
-webkit-filter: blur(0);
filter: blur(0);
opacity: 1;
}
}
@-webkit-keyframes roll-in-blurred-left {
0% {
-webkit-transform: translateX(-1000px) rotate(-720deg);
transform: translateX(-1000px) rotate(-720deg);
-webkit-filter: blur(50px);
filter: blur(50px);
opacity: 0;
}
100% {
-webkit-transform: translateX(0) rotate(0deg);
transform: translateX(0) rotate(0deg);
-webkit-filter: blur(0);
filter: blur(0);
opacity: 1;
}
}
@keyframes roll-in-blurred-left {
0% {
-webkit-transform: translateX(-1000px) rotate(-720deg);
transform: translateX(-1000px) rotate(-720deg);
-webkit-filter: blur(50px);
filter: blur(50px);
opacity: 0;
}
100% {
-webkit-transform: translateX(0) rotate(0deg);
transform: translateX(0) rotate(0deg);
-webkit-filter: blur(0);
filter: blur(0);
opacity: 1;
}
}
@-webkit-keyframes slide-out-blurred-left {
0% {
-webkit-transform: translateX(0) scaleY(1) scaleX(1);
transform: translateX(0) scaleY(1) scaleX(1);
-webkit-transform-origin: 50% 50%;
transform-origin: 50% 50%;
-webkit-filter: blur(0);
filter: blur(0);
opacity: 1;
}
100% {
-webkit-transform: translateX(-1000px) scaleX(2) scaleY(0.2);
transform: translateX(-1000px) scaleX(2) scaleY(0.2);
-webkit-transform-origin: 100% 50%;
transform-origin: 100% 50%;
-webkit-filter: blur(40px);
filter: blur(40px);
opacity: 0;
position: absolute;
}
}
@keyframes slide-out-blurred-left {
0% {
-webkit-transform: translateX(0) scaleY(1) scaleX(1);
transform: translateX(0) scaleY(1) scaleX(1);
-webkit-transform-origin: 50% 50%;
transform-origin: 50% 50%;
-webkit-filter: blur(0);
filter: blur(0);
opacity: 1;
}
100% {
-webkit-transform: translateX(-1000px) scaleX(2) scaleY(0.2);
transform: translateX(-1000px) scaleX(2) scaleY(0.2);
-webkit-transform-origin: 100% 50%;
transform-origin: 100% 50%;
-webkit-filter: blur(40px);
filter: blur(40px);
opacity: 0;
position: absolute;
}
}
@-webkit-keyframes slide-out-blurred-right {
0% {
-webkit-transform: translateX(0) scaleY(1) scaleX(1);
transform: translateX(0) scaleY(1) scaleX(1);
-webkit-transform-origin: 50% 50%;
transform-origin: 50% 50%;
-webkit-filter: blur(0);
filter: blur(0);
opacity: 1;
}
100% {
-webkit-transform: translateX(1000px) scaleX(2) scaleY(0.2);
transform: translateX(1000px) scaleX(2) scaleY(0.2);
-webkit-transform-origin: 0% 50%;
transform-origin: 0% 50%;
-webkit-filter: blur(40px);
filter: blur(40px);
opacity: 0;
}
}
@keyframes slide-out-blurred-right {
0% {
-webkit-transform: translateX(0) scaleY(1) scaleX(1);
transform: translateX(0) scaleY(1) scaleX(1);
-webkit-transform-origin: 50% 50%;
transform-origin: 50% 50%;
-webkit-filter: blur(0);
filter: blur(0);
opacity: 1;
}
100% {
-webkit-transform: translateX(1000px) scaleX(2) scaleY(0.2);
transform: translateX(1000px) scaleX(2) scaleY(0.2);
-webkit-transform-origin: 0% 50%;
transform-origin: 0% 50%;
-webkit-filter: blur(40px);
filter: blur(40px);
opacity: 0;
}
}

View File

@ -77,7 +77,7 @@ a.collapse-menu-link {
color: $sidebar-text;
padding: 0;
float: left;
margin: 11px 0 0 25px;
margin: 11px 10px 0 0px;
&:hover {
text-decoration: none;
@ -159,7 +159,7 @@ a.collapse-menu-link {
margin-right: 10px;
}
a.collapse-menu-link {
margin-left: 10px;
margin-right: 10px;
}
.al-skin-dropdown {