Removing unnecessary resolvers (closes #2869, closes #2892)

This commit is contained in:
FinnStutzenstein 2017-01-16 16:03:25 +01:00 committed by FinnStutzenstein
parent a724898ba3
commit 2b8a1168e0
15 changed files with 199 additions and 459 deletions

View File

@ -23,21 +23,26 @@ angular.module('OpenSlidesApp.agenda', ['OpenSlidesApp.users'])
.factory('AgendaUpdate',[
'Agenda',
function(Agenda) {
'operator',
function(Agenda, operator) {
return {
saveChanges: function (item_id, changes) {
Agenda.find(item_id).then(function(item) {
var something = false;
_.each(changes, function(change) {
if (change.value !== item[change.key]) {
item[change.key] = change.value;
something = true;
// change agenda item only if user has the permission to do that
if (operator.hasPerms('agenda.can_manage agenda.can_see_hidden_items')) {
Agenda.find(item_id).then(function (item) {
console.log(item);
var something = false;
_.each(changes, function(change) {
if (change.value !== item[change.key]) {
item[change.key] = change.value;
something = true;
}
});
if (something === true) {
Agenda.save(item);
}
});
if (something === true) {
Agenda.save(item);
}
});
}
}
};
}

View File

@ -40,58 +40,21 @@ angular.module('OpenSlidesApp.agenda.site', [
abstract: true,
template: "<ui-view/>",
})
.state('agenda.item.list', {
resolve: {
items: function(Agenda) {
return Agenda.findAll();
}
}
})
.state('agenda.item.list', {})
.state('agenda.item.detail', {
resolve: {
item: function(Agenda, $stateParams) {
return Agenda.find($stateParams.id).catch(
function () {
return null;
}
);
},
users: function(User) {
return User.findAll().catch(
function () {
return null;
}
);
},
tags: function(Tag) {
return Tag.findAll();
}
itemId: ['$stateParams', function($stateParams) {
return $stateParams.id;
}],
}
})
.state('agenda.item.sort', {
resolve: {
items: function(Agenda) {
return Agenda.findAll();
}
},
url: '/sort',
controller: 'AgendaSortCtrl',
})
.state('agenda.current-list-of-speakers', {
url: '/speakers',
controller: 'ListOfSpeakersViewCtrl',
resolve: {
users: function(User) {
return User.findAll().catch(
function () {
return null;
}
);
},
items: function(Agenda) {
return Agenda.findAll();
}
},
data: {
title: gettext('Current list of speakers'),
},
@ -421,10 +384,11 @@ angular.module('OpenSlidesApp.agenda.site', [
'operator',
'Agenda',
'User',
'item',
'itemId',
'Projector',
'ProjectionDefault',
function ($scope, $filter, $http, $state, operator, Agenda, User, item, Projector, ProjectionDefault) {
function ($scope, $filter, $http, $state, operator, Agenda, User, itemId, Projector, ProjectionDefault) {
var item = Agenda.get(itemId);
Agenda.bindOne(item.id, $scope, 'item');
User.bindAll({}, $scope, 'users');
$scope.$watch(function () {

View File

@ -8,11 +8,14 @@
<translate>New</translate>
</a>
<!-- import -->
<a ui-sref="topics.topic.import" os-perms="agenda.can_manage"
<span os-perms="agenda.can_manage">
<a ui-sref="topics.topic.import"
os-perms="agenda.can_see_hidden_items"
class="btn btn-default btn-sm">
<i class="fa fa-download fa-lg"></i>
<translate>Import</translate>
</a>
<i class="fa fa-download fa-lg"></i>
<translate>Import</translate>
</a>
</span>
<!-- current list of speakers -->
<a ui-sref="agenda.current-list-of-speakers" os-perms="users.can_see_name"
class="btn btn-default btn-sm">

View File

@ -316,6 +316,8 @@ angular.module('OpenSlidesApp.assignments', [])
verboseName: gettext('Election'),
verboseNamePlural: gettext('Elections'),
phases: phases,
// TODO (Issue 2885): Do not query this from server. It should be included in the startup data.
// Remove than all 'phases' injections from resolvers.
getPhases: function () {
if (!this.phases) {
this.phases = $http({ 'method': 'OPTIONS', 'url': '/rest/assignments/assignment/' })

View File

@ -42,48 +42,20 @@ angular.module('OpenSlidesApp.assignments.site', [
})
.state('assignments.assignment.list', {
resolve: {
assignments: function(Assignment) {
return Assignment.findAll();
},
tags: function(Tag) {
return Tag.findAll();
},
items: function(Agenda) {
return Agenda.findAll().catch(
function() {
return null;
}
);
},
phases: function(Assignment) {
phases: ['Assignment', function (Assignment) {
return Assignment.getPhases();
}
}],
}
})
.state('assignments.assignment.detail', {
controller: 'AssignmentDetailCtrl',
resolve: {
assignment: function(Assignment, $stateParams) {
return Assignment.find($stateParams.id).then(function(assignment) {
return assignment;
});
},
users: function(User) {
return User.findAll();
},
tags: function(Tag) {
return Tag.findAll();
},
items: function(Agenda) {
return Agenda.findAll().catch(
function() {
return null;
}
);
},
phases: function(Assignment) {
assignmentId: ['$stateParams', function($stateParams) {
return $stateParams.id;
}],
phases: ['Assignment', function (Assignment) {
return Assignment.getPhases();
}
}],
}
})
// redirects to assignment detail and opens assignment edit form dialog, uses edit url,
@ -91,8 +63,8 @@ angular.module('OpenSlidesApp.assignments.site', [
// (from assignment controller use AssignmentForm factory instead to open dialog in front
// of current view without redirect)
.state('assignments.assignment.detail.update', {
onEnter: ['$stateParams', '$state', 'ngDialog', 'Assignment',
function($stateParams, $state, ngDialog, Assignment) {
onEnter: ['$stateParams', '$state', 'ngDialog',
function($stateParams, $state, ngDialog) {
ngDialog.open({
template: 'static/templates/assignments/assignment-form.html',
controller: 'AssignmentUpdateCtrl',
@ -100,16 +72,8 @@ angular.module('OpenSlidesApp.assignments.site', [
closeByEscape: false,
closeByDocument: false,
resolve: {
assignment: function() {
return Assignment.find($stateParams.id).then(function(assignment) {
return Assignment.loadRelations(assignment, 'agenda_item');
});
},
items: function(Agenda) {
return Agenda.findAll().catch(
function() {
return null;
});
assignmentId: function() {
return $stateParams.id;
},
},
preCloseCallback: function() {
@ -135,25 +99,15 @@ angular.module('OpenSlidesApp.assignments.site', [
return {
// ngDialog for assignment form
getDialog: function (assignment) {
var resolve = {};
if (assignment) {
resolve.assignment = function () {
return assignment;
};
resolve.agenda_item = function () {
return Assignment.loadRelations(assignment, 'agenda_item');
};
}
resolve.items = function() {
return Agenda.getAll();
};
return {
template: 'static/templates/assignments/assignment-form.html',
controller: (assignment) ? 'AssignmentUpdateCtrl' : 'AssignmentCreateCtrl',
className: 'ngdialog-theme-default wide-form',
closeByEscape: false,
closeByDocument: false,
resolve: resolve
resolve: {
assignmentId: function () {return assignment ? assignment.id : void 0;}
},
};
},
// angular-formly fields for assignment form
@ -298,7 +252,6 @@ angular.module('OpenSlidesApp.assignments.site', [
'Assignment',
'Tag',
'Agenda',
'phases',
'Projector',
'ProjectionDefault',
'gettextCatalog',
@ -309,9 +262,10 @@ angular.module('OpenSlidesApp.assignments.site', [
'osTableFilter',
'osTableSort',
'gettext',
function($scope, ngDialog, AssignmentForm, Assignment, Tag, Agenda, phases, Projector, ProjectionDefault,
'phases',
function($scope, ngDialog, AssignmentForm, Assignment, Tag, Agenda, Projector, ProjectionDefault,
gettextCatalog, AssignmentContentProvider, AssignmentCatalogContentProvider, PdfMakeDocumentProvider,
User, osTableFilter, osTableSort, gettext) {
User, osTableFilter, osTableSort, gettext, phases) {
Assignment.bindAll({}, $scope, 'assignments');
Tag.bindAll({}, $scope, 'tags');
$scope.$watch(function () {
@ -419,21 +373,19 @@ angular.module('OpenSlidesApp.assignments.site', [
};
// create the PDF List
$scope.makePDF_assignmentList = function () {
User.findAll().then( function(users) {
var filename = gettextCatalog.getString("Elections") + ".pdf";
var assignmentContentProviderArray = [];
var filename = gettextCatalog.getString("Elections") + ".pdf";
var assignmentContentProviderArray = [];
//convert the filtered assignments to content providers
angular.forEach($scope.assignmentsFiltered, function(assignment) {
assignmentContentProviderArray.push(AssignmentContentProvider.createInstance(assignment));
});
var assignmentCatalogContentProvider =
AssignmentCatalogContentProvider.createInstance(assignmentContentProviderArray);
var documentProvider =
PdfMakeDocumentProvider.createInstance(assignmentCatalogContentProvider);
pdfMake.createPdf(documentProvider.getDocument()).download(filename);
//convert the filtered assignments to content providers
angular.forEach($scope.assignmentsFiltered, function(assignment) {
assignmentContentProviderArray.push(AssignmentContentProvider.createInstance(assignment));
});
var assignmentCatalogContentProvider =
AssignmentCatalogContentProvider.createInstance(assignmentContentProviderArray);
var documentProvider =
PdfMakeDocumentProvider.createInstance(assignmentCatalogContentProvider);
pdfMake.createPdf(documentProvider.getDocument()).download(filename);
};
}
])
@ -449,7 +401,7 @@ angular.module('OpenSlidesApp.assignments.site', [
'operator',
'Assignment',
'User',
'assignment',
'assignmentId',
'phases',
'Projector',
'ProjectionDefault',
@ -459,8 +411,9 @@ angular.module('OpenSlidesApp.assignments.site', [
'PdfMakeBallotPaperProvider',
'gettextCatalog',
function($scope, $http, $filter, filterFilter, gettext, ngDialog, AssignmentForm, operator, Assignment,
User, assignment, phases, Projector, ProjectionDefault, AssignmentContentProvider, BallotContentProvider,
User, assignmentId, phases, Projector, ProjectionDefault, AssignmentContentProvider, BallotContentProvider,
PdfMakeDocumentProvider, PdfMakeBallotPaperProvider, gettextCatalog) {
var assignment = Assignment.get(assignmentId);
User.bindAll({}, $scope, 'users');
Assignment.loadRelations(assignment, 'agenda_item');
$scope.$watch(function () {
@ -584,12 +537,7 @@ angular.module('OpenSlidesApp.assignments.site', [
closeByEscape: false,
closeByDocument: false,
resolve: {
assignmentpoll: function (AssignmentPoll) {
return AssignmentPoll.find(poll.id);
},
ballot: function () {
return ballot;
}
assignmentpollId: function () {return poll.id;}
}
});
};
@ -703,8 +651,9 @@ angular.module('OpenSlidesApp.assignments.site', [
'AssignmentForm',
'Agenda',
'AgendaUpdate',
'assignment',
function($scope, Assignment, AssignmentForm, Agenda, AgendaUpdate, assignment) {
'assignmentId',
function($scope, Assignment, AssignmentForm, Agenda, AgendaUpdate, assignmentId) {
var assignment = Assignment.get(assignmentId);
$scope.alert = {};
// set initial values for form model by create deep copy of assignment object
// so list/detail view is not updated while editing
@ -753,12 +702,13 @@ angular.module('OpenSlidesApp.assignments.site', [
'$filter',
'gettextCatalog',
'AssignmentPoll',
'assignmentpoll',
'assignmentpollId',
'ballot',
function($scope, $filter, gettextCatalog, AssignmentPoll, assignmentpoll, ballot) {
function($scope, $filter, gettextCatalog, AssignmentPoll, assignmentpollId, ballot) {
// set initial values for form model by create deep copy of assignmentpoll object
// so detail view is not updated while editing poll
$scope.model = angular.copy(assignmentpoll);
var assignmentpoll = angular.copy(AssignmentPoll.get(assignmentpollId));
$scope.model = assignmentpoll;
$scope.ballot = ballot;
$scope.formFields = [];
$scope.alert = {};

View File

@ -171,7 +171,7 @@ angular.module('OpenSlidesApp.core.projector', ['OpenSlidesApp.core'])
var STEPS = 5;
$scope.scroll = 0;
var setScroll = function (scroll) {
scroll = 80 * scroll;
scroll = -80 * scroll;
if ($scope.scrollTimeout) {
$timeout.cancel($scope.scrollTimeout);
}

View File

@ -336,22 +336,21 @@ angular.module('OpenSlidesApp.core.site', [
title: gettext('Tags'),
},
})
.state('core.tag.list', {
resolve: {
tags: function(Tag) {
return Tag.findAll();
}
}
})
.state('core.tag.list', {})
.state('core.tag.create', {})
.state('core.tag.detail', {
resolve: {
tag: function(Tag, $stateParams) {
return Tag.find($stateParams.id);
}
tagId: ['$stateParams', function($stateParams) {
return $stateParams.id;
}],
}
})
.state('core.tag.detail.update', {
resolve: {
tagId: ['$stateParams', function($stateParams) {
return $stateParams.id;
}],
},
views: {
'@core.tag': {}
}
@ -381,8 +380,8 @@ angular.module('OpenSlidesApp.core.site', [
closeByEscape: false,
closeByDocument: false,
resolve: {
projectorMessage: function () {
return message;
projectorMessageId: function () {
return message.id;
}
},
};
@ -1136,12 +1135,12 @@ angular.module('OpenSlidesApp.core.site', [
.controller('ProjectorMessageEditCtrl', [
'$scope',
'projectorMessage',
'projectorMessageId',
'ProjectorMessage',
'ProjectorMessageForm',
function ($scope, projectorMessage, ProjectorMessage, ProjectorMessageForm) {
function ($scope, projectorMessageId, ProjectorMessage, ProjectorMessageForm) {
$scope.formFields = ProjectorMessageForm.getFormFields();
$scope.model = angular.copy(projectorMessage);
$scope.model = angular.copy(ProjectorMessage.get(projectorMessageId));
$scope.save = function (message) {
ProjectorMessage.inject(message);
@ -1336,9 +1335,9 @@ angular.module('OpenSlidesApp.core.site', [
.controller('TagDetailCtrl', [
'$scope',
'Tag',
'tag',
function($scope, Tag, tag) {
Tag.bindOne(tag.id, $scope, 'tag');
'tagId',
function($scope, Tag, tagId) {
Tag.bindOne(tagId, $scope, 'tag');
}
])
@ -1362,9 +1361,9 @@ angular.module('OpenSlidesApp.core.site', [
'$scope',
'$state',
'Tag',
'tag',
function($scope, $state, Tag, tag) {
$scope.tag = tag;
'tagId',
function($scope, $state, Tag, tagId) {
$scope.tag = Tag.get(tagId);
$scope.save = function (tag) {
Tag.save(tag).then(
function(success) {

View File

@ -37,7 +37,7 @@
<td ng-mouseover="tag.hover=true" ng-mouseleave="tag.hover=false">
<strong>{{ tag.name }}</strong>
<div class="hoverActions" ng-class="{'hiddenDiv': !tag.hover}">
<a ui-sref="core.tag.detail.update({id: tag.id })" translate>Edit</a> |
<a ui-sref="core.tag.detail.update({id: tag.id })" translate>Edit</a> &middot;
<a href="" class="text-danger"
ng-bootbox-confirm="{{ 'Are you sure you want to delete this entry?' | translate }}<br>
<b>{{ tag.name }}</b>"

View File

@ -39,20 +39,7 @@ angular.module('OpenSlidesApp.mediafiles.states', [
abstract: true,
template: "<ui-view/>",
})
.state('mediafiles.mediafile.list', {
resolve: {
mediafiles: function (Mediafile) {
return Mediafile.findAll();
},
users: function (User) {
return User.findAll().catch(
function () {
return null;
}
);
},
}
});
.state('mediafiles.mediafile.list', {});
}
]);

View File

@ -46,9 +46,7 @@ angular.module('OpenSlidesApp.motions.motionBlock', [])
.run(['MotionBlock', function(MotionBlock) {}])
// MotionBlock views (list view, create dialog, update dialog)
.factory('MotionBlockForm', [
'$http',
'gettextCatalog',
@ -65,9 +63,7 @@ angular.module('OpenSlidesApp.motions.motionBlock', [])
closeByEscape: false,
closeByDocument: false,
resolve: {
motionBlock: function () {
return motionBlock;
}
motionBlockId: function () {return motionBlock ? motionBlock.id : void 0;}
}
};
},
@ -133,11 +129,11 @@ angular.module('OpenSlidesApp.motions.motionBlock', [])
'Motion',
'MotionBlockForm',
'MotionBlock',
'motionBlock',
'motionBlockId',
'Projector',
'ProjectionDefault',
function($scope, $http, ngDialog, Motion, MotionBlockForm, MotionBlock, motionBlock, Projector, ProjectionDefault) {
MotionBlock.bindOne(motionBlock.id, $scope, 'motionBlock');
function($scope, $http, ngDialog, Motion, MotionBlockForm, MotionBlock, motionBlockId, Projector, ProjectionDefault) {
MotionBlock.bindOne(motionBlockId, $scope, 'motionBlock');
Motion.bindAll({}, $scope, 'motions');
$scope.$watch(function () {
return Projector.lastModified();
@ -211,14 +207,15 @@ angular.module('OpenSlidesApp.motions.motionBlock', [])
'MotionBlock',
'MotionBlockForm',
'AgendaUpdate',
'motionBlock',
function($scope, $state, MotionBlock, MotionBlockForm, AgendaUpdate, motionBlock) {
'motionBlockId',
function($scope, $state, MotionBlock, MotionBlockForm, AgendaUpdate, motionBlockId) {
// TODO: Check #2486 and remove some agenda related code.
//MotionBlock.loadRelations(motionBlock, 'agenda_item');
$scope.alert = {};
// Prepare form. Set initial values by creating a deep copy of
// motionBlock object so list/detail view is not updated while editing.
var motionBlock = MotionBlock.get(motionBlockId);
$scope.model = angular.copy(motionBlock);
// Get all form fields.

View File

@ -43,82 +43,12 @@ angular.module('OpenSlidesApp.motions.site', [
abstract: true,
template: "<ui-view/>",
})
.state('motions.motion.list', {
resolve: {
motions: function(Motion) {
return Motion.findAll().then(function(motions) {
angular.forEach(motions, function(motion) {
Motion.loadRelations(motion, 'agenda_item');
});
});
},
categories: function(Category) {
return Category.findAll();
},
motionBlocks: function(MotionBlock) {
return MotionBlock.findAll();
},
tags: function(Tag) {
return Tag.findAll();
},
users: function(User) {
return User.findAll().catch(
function () {
return null;
});
},
workflows: function(Workflow) {
return Workflow.findAll();
},
items: function(Agenda) {
return Agenda.findAll().catch(
function () {
return null;
});
}
}
})
.state('motions.motion.list', {})
.state('motions.motion.detail', {
resolve: {
motion: function(Motion, $stateParams) {
return Motion.find($stateParams.id);
},
motions: function(Motion) {
return Motion.findAll();
},
categories: function(Category) {
return Category.findAll();
},
motionBlocks: function(MotionBlock) {
return MotionBlock.findAll();
},
users: function(User) {
return User.findAll().catch(
function () {
return null;
}
);
},
items: function(Agenda) {
return Agenda.findAll().catch(
function () {
return null;
}
);
},
mediafiles: function(Mediafile) {
return Mediafile.findAll().catch(
function () {
return null;
}
);
},
tags: function(Tag) {
return Tag.findAll();
},
change_recommendations: function(MotionChangeRecommendation, motion) {
return MotionChangeRecommendation.findAll({'where': {'motion_version_id': {'==': motion.active_version}}});
}
motionId: ['$stateParams', function($stateParams) {
return $stateParams.id;
}],
}
})
// redirects to motion detail and opens motion edit form dialog, uses edit url,
@ -135,20 +65,9 @@ angular.module('OpenSlidesApp.motions.site', [
closeByEscape: false,
closeByDocument: false,
resolve: {
motion: function() {
return Motion.find($stateParams.id).then(function(motion) {
return Motion.loadRelations(motion, 'agenda_item');
});
},
items: function(Agenda) {
return Agenda.findAll().catch(
function() {
return null;
}
);
}
motionId: function () {return $stateParams.id;},
},
preCloseCallback: function() {
preCloseCallback: function () {
$state.go('motions.motion.detail', {motion: $stateParams.id});
return true;
}
@ -159,17 +78,6 @@ angular.module('OpenSlidesApp.motions.site', [
.state('motions.motion.import', {
url: '/import',
controller: 'MotionImportCtrl',
resolve: {
motions: function(Motion) {
return Motion.findAll();
},
categories: function(Category) {
return Category.findAll();
},
users: function(User) {
return User.findAll();
}
}
})
// categories
.state('motions.category', {
@ -180,19 +88,13 @@ angular.module('OpenSlidesApp.motions.site', [
title: gettext('Categories'),
},
})
.state('motions.category.list', {
resolve: {
categories: function(Category) {
return Category.findAll();
}
}
})
.state('motions.category.list', {})
.state('motions.category.create', {})
.state('motions.category.detail', {
resolve: {
category: function(Category, $stateParams) {
return Category.find($stateParams.id);
}
categoryId: ['$stateParams', function($stateParams) {
return $stateParams.id;
}]
}
})
.state('motions.category.detail.update', {
@ -202,16 +104,13 @@ angular.module('OpenSlidesApp.motions.site', [
})
.state('motions.category.sort', {
url: '/sort/{id}',
resolve: {
category: function(Category, $stateParams) {
return Category.find($stateParams.id);
},
motions: function(Motion) {
return Motion.findAll();
}
},
controller: 'CategorySortCtrl',
templateUrl: 'static/templates/motions/category-sort.html'
templateUrl: 'static/templates/motions/category-sort.html',
resolve: {
categoryId: ['$stateParams', function($stateParams) {
return $stateParams.id;
}],
},
})
// MotionBlock
.state('motions.motionBlock', {
@ -222,38 +121,12 @@ angular.module('OpenSlidesApp.motions.site', [
title: gettext('Motion blocks'),
},
})
.state('motions.motionBlock.list', {
resolve: {
motionBlocks: function (MotionBlock) {
return MotionBlock.findAll();
},
motions: function(Motion) {
return Motion.findAll();
},
items: function(Agenda) {
return Agenda.findAll().catch(
function () {
return null;
}
);
}
}
})
.state('motions.motionBlock.list', {})
.state('motions.motionBlock.detail', {
resolve: {
motionBlock: function(MotionBlock, $stateParams) {
return MotionBlock.find($stateParams.id);
},
motions: function(Motion) {
return Motion.findAll();
},
items: function(Agenda) {
return Agenda.findAll().catch(
function () {
return null;
}
);
}
motionBlockId: ['$stateParams', function($stateParams) {
return $stateParams.id;
}],
}
})
// redirects to motionBlock detail and opens motionBlock edit form dialog, uses edit url,
@ -261,8 +134,8 @@ angular.module('OpenSlidesApp.motions.site', [
// (from motionBlock controller use MotionBlockForm factory instead to open dialog in front
// of current view without redirect)
.state('motions.motionBlock.detail.update', {
onEnter: ['$stateParams', '$state', 'ngDialog', 'MotionBlock',
function($stateParams, $state, ngDialog, MotionBlock) {
onEnter: ['$stateParams', '$state', 'ngDialog',
function($stateParams, $state, ngDialog) {
ngDialog.open({
template: 'static/templates/motions/motion-block-form.html',
controller: 'MotionBlockUpdateCtrl',
@ -270,8 +143,8 @@ angular.module('OpenSlidesApp.motions.site', [
closeByEscape: false,
closeByDocument: false,
resolve: {
motionBlock: function () {
return MotionBlock.find($stateParams.id);
motionBlockId: function () {
return $stateParams.id;
}
},
preCloseCallback: function() {
@ -417,28 +290,15 @@ angular.module('OpenSlidesApp.motions.site', [
return {
// ngDialog for motion form
getDialog: function (motion) {
var resolve = {};
if (motion) {
resolve = {
motion: function() {
MotionComment.populateFields(motion);
return motion;
},
agenda_item: function(Motion) {
return Motion.loadRelations(motion, 'agenda_item');
}
};
}
resolve.mediafiles = function (Mediafile) {
return Mediafile.findAll();
};
return {
template: 'static/templates/motions/motion-form.html',
controller: (motion) ? 'MotionUpdateCtrl' : 'MotionCreateCtrl',
controller: motion ? 'MotionUpdateCtrl' : 'MotionCreateCtrl',
className: 'ngdialog-theme-default wide-form',
closeByEscape: false,
closeByDocument: false,
resolve: (resolve) ? resolve : null
resolve: {
motionId: function () {return motion ? motion.id : void 0;},
},
};
},
// angular-formly fields for motion form
@ -1090,21 +950,21 @@ angular.module('OpenSlidesApp.motions.site', [
'User',
'Workflow',
'Config',
'motion',
'motionId',
'MotionInlineEditing',
'MotionCommentsInlineEditing',
'Projector',
'ProjectionDefault',
function($scope, $http, operator, ngDialog, MotionForm,
ChangeRecommmendationCreate, ChangeRecommmendationView, MotionChangeRecommendation, MotionPDFExport,
Motion, MotionComment, Category, Mediafile, Tag, User, Workflow, Config, motion, MotionInlineEditing,
Motion, MotionComment, Category, Mediafile, Tag, User, Workflow, Config, motionId, MotionInlineEditing,
MotionCommentsInlineEditing, Projector, ProjectionDefault) {
var motion = Motion.get(motionId);
Category.bindAll({}, $scope, 'categories');
Mediafile.bindAll({}, $scope, 'mediafiles');
Tag.bindAll({}, $scope, 'tags');
User.bindAll({}, $scope, 'users');
Workflow.bindAll({}, $scope, 'workflows');
Motion.loadRelations(motion, 'agenda_item');
$scope.$watch(function () {
return MotionChangeRecommendation.lastModified();
}, function () {
@ -1122,9 +982,9 @@ angular.module('OpenSlidesApp.motions.site', [
$scope.defaultProjectorId = ProjectionDefault.filter({name: 'motions'})[0].projector_id;
});
$scope.$watch(function () {
return Motion.lastModified(motion.id);
return Motion.lastModified(motionId);
}, function () {
$scope.motion = Motion.get(motion.id);
$scope.motion = Motion.get(motionId);
MotionComment.populateFields($scope.motion);
});
$scope.projectionModes = [
@ -1288,8 +1148,8 @@ angular.module('OpenSlidesApp.motions.site', [
closeByEscape: false,
closeByDocument: false,
resolve: {
motionpoll: function (MotionPoll) {
return MotionPoll.find(poll.id);
motionpollId: function () {
return poll.id;
},
voteNumber: function () {
return voteNumber;
@ -1454,7 +1314,8 @@ angular.module('OpenSlidesApp.motions.site', [
'Workflow',
'Agenda',
'AgendaUpdate',
function($scope, $state, gettext, gettextCatalog, operator, Motion, MotionForm, Category, Config, Mediafile, Tag, User, Workflow, Agenda, AgendaUpdate) {
function($scope, $state, gettext, gettextCatalog, operator, Motion, MotionForm,
Category, Config, Mediafile, Tag, User, Workflow, Agenda, AgendaUpdate) {
Category.bindAll({}, $scope, 'categories');
Mediafile.bindAll({}, $scope, 'mediafiles');
Tag.bindAll({}, $scope, 'tags');
@ -1489,14 +1350,11 @@ angular.module('OpenSlidesApp.motions.site', [
$scope.save = function (motion) {
Motion.create(motion).then(
function(success) {
// change agenda item only if user has the permission to do that
if (operator.hasPerms('agenda.can_manage')) {
// type: Value 1 means a non hidden agenda item, value 2 means a hidden agenda item,
// see openslides.agenda.models.Item.ITEM_TYPE.
var changes = [{key: 'type', value: (motion.showAsAgendaItem ? 1 : 2)},
{key: 'parent_id', value: motion.agenda_parent_item_id}];
AgendaUpdate.saveChanges(success.agenda_item_id, changes);
}
// type: Value 1 means a non hidden agenda item, value 2 means a hidden agenda item,
// see openslides.agenda.models.Item.ITEM_TYPE.
var changes = [{key: 'type', value: (motion.showAsAgendaItem ? 1 : 2)},
{key: 'parent_id', value: motion.agenda_parent_item_id}];
AgendaUpdate.saveChanges(success.agenda_item_id, changes);
if (isAmendment) {
$state.go('motions.motion.detail', {id: success.id});
}
@ -1519,8 +1377,8 @@ angular.module('OpenSlidesApp.motions.site', [
'Workflow',
'Agenda',
'AgendaUpdate',
'motion',
function($scope, Motion, Category, Config, Mediafile, MotionForm, Tag, User, Workflow, Agenda, AgendaUpdate, motion) {
'motionId',
function($scope, Motion, Category, Config, Mediafile, MotionForm, Tag, User, Workflow, Agenda, AgendaUpdate, motionId) {
Category.bindAll({}, $scope, 'categories');
Mediafile.bindAll({}, $scope, 'mediafiles');
Tag.bindAll({}, $scope, 'tags');
@ -1530,6 +1388,7 @@ angular.module('OpenSlidesApp.motions.site', [
// set initial values for form model by create deep copy of motion object
// so list/detail view is not updated while editing
var motion = Motion.get(motionId);
$scope.model = angular.copy(motion);
$scope.model.disable_versioning = false;
$scope.model.more = false;
@ -1581,14 +1440,12 @@ angular.module('OpenSlidesApp.motions.site', [
// save change motion object on server
Motion.save(motion, { method: 'PATCH' }).then(
function(success) {
Agenda.find(success.agenda_item_id).then(function(item) {
// type: Value 1 means a non hidden agenda item, value 2 means a hidden agenda item,
// see openslides.agenda.models.Item.ITEM_TYPE.
var changes = [{key: 'type', value: (motion.showAsAgendaItem ? 1 : 2)},
{key: 'parent_id', value: motion.agenda_parent_item_id}];
AgendaUpdate.saveChanges(success.agenda_item_id,changes);
$scope.closeThisDialog();
});
// type: Value 1 means a non hidden agenda item, value 2 means a hidden agenda item,
// see openslides.agenda.models.Item.ITEM_TYPE.
var changes = [{key: 'type', value: (motion.showAsAgendaItem ? 1 : 2)},
{key: 'parent_id', value: motion.agenda_parent_item_id}];
AgendaUpdate.saveChanges(success.agenda_item_id,changes);
$scope.closeThisDialog();
},
function (error) {
// save error: revert all changes by restore
@ -1610,11 +1467,12 @@ angular.module('OpenSlidesApp.motions.site', [
'gettextCatalog',
'MotionPoll',
'MotionPollForm',
'motionpoll',
'motionpollId',
'voteNumber',
function($scope, gettextCatalog, MotionPoll, MotionPollForm, motionpoll, voteNumber) {
function($scope, gettextCatalog, MotionPoll, MotionPollForm, motionpollId, voteNumber) {
// set initial values for form model by create deep copy of motionpoll object
// so detail view is not updated while editing poll
var motionpoll = MotionPoll.get(motionpollId);
$scope.model = angular.copy(motionpoll);
$scope.voteNumber = voteNumber;
$scope.formFields = MotionPollForm.getFormFields();
@ -1900,9 +1758,9 @@ angular.module('OpenSlidesApp.motions.site', [
.controller('CategoryDetailCtrl', [
'$scope',
'Category',
'category',
function($scope, Category, category) {
Category.bindOne(category.id, $scope, 'category');
'categoryId',
function($scope, Category, categoryId) {
Category.bindOne(categoryId, $scope, 'category');
}
])
@ -1926,9 +1784,9 @@ angular.module('OpenSlidesApp.motions.site', [
'$scope',
'$state',
'Category',
'category',
function($scope, $state, Category, category) {
$scope.category = category;
'categoryId',
function($scope, $state, Category, categoryId) {
$scope.category = Category.get(categoryId);
$scope.save = function (category) {
Category.save(category).then(
function(success) {
@ -1945,13 +1803,12 @@ angular.module('OpenSlidesApp.motions.site', [
'$http',
'MotionList',
'Category',
'category',
'categoryId',
'Motion',
'motions',
function($scope, $stateParams, $http, MotionList, Category, category, Motion, motions) {
Category.bindOne(category.id, $scope, 'category');
function($scope, $stateParams, $http, MotionList, Category, categoryId, Motion) {
Category.bindOne(categoryId, $scope, 'category');
Motion.bindAll({}, $scope, 'motions');
$scope.filter = { category_id: category.id,
$scope.filter = { category_id: categoryId,
parent_id: null,
orderBy: 'identifier' };

View File

@ -25,12 +25,9 @@ angular.module('OpenSlidesApp.topics.site', ['OpenSlidesApp.topics', 'OpenSlides
})
.state('topics.topic.detail', {
resolve: {
topic: function(Topic, $stateParams) {
return Topic.find($stateParams.id);
},
items: function(Agenda) {
return Agenda.findAll();
}
topicId: ['$stateParams', function($stateParams) {
return $stateParams.id;
}],
}
})
// redirects to topic detail and opens topic edit form dialog, uses edit url,
@ -38,8 +35,8 @@ angular.module('OpenSlidesApp.topics.site', ['OpenSlidesApp.topics', 'OpenSlides
// (from topic controller use TopicForm factory instead to open dialog in front
// of current view without redirect)
.state('topics.topic.detail.update', {
onEnter: ['$stateParams', '$state', 'ngDialog', 'Topic',
function($stateParams, $state, ngDialog, Topic) {
onEnter: ['$stateParams', '$state', 'ngDialog',
function($stateParams, $state, ngDialog) {
ngDialog.open({
template: 'static/templates/topics/topic-form.html',
controller: 'TopicUpdateCtrl',
@ -47,16 +44,9 @@ angular.module('OpenSlidesApp.topics.site', ['OpenSlidesApp.topics', 'OpenSlides
closeByEscape: false,
closeByDocument: false,
resolve: {
topic: function() {
return Topic.find($stateParams.id);
topicId: function() {
return $stateParams.id;
},
items: function(Agenda) {
return Agenda.findAll().catch(
function() {
return null;
}
);
}
},
preCloseCallback: function() {
$state.go('topics.topic.detail', {topic: $stateParams.id});
@ -82,22 +72,15 @@ angular.module('OpenSlidesApp.topics.site', ['OpenSlidesApp.topics', 'OpenSlides
return {
// ngDialog for topic form
getDialog: function (topic) {
var resolve = {};
if (topic) {
resolve = {
topic: function (Topic) {return Topic.find(topic.id);}
};
}
resolve.mediafiles = function (Mediafile) {
return Mediafile.findAll();
};
return {
template: 'static/templates/topics/topic-form.html',
controller: (topic) ? 'TopicUpdateCtrl' : 'TopicCreateCtrl',
className: 'ngdialog-theme-default wide-form',
closeByEscape: false,
closeByDocument: false,
resolve: (resolve) ? resolve : null
resolve: {
topicId: function () {return topic ? topic.id: void 0;}
},
};
},
getFormFields: function (isCreateForm) {
@ -169,11 +152,11 @@ angular.module('OpenSlidesApp.topics.site', ['OpenSlidesApp.topics', 'OpenSlides
'ngDialog',
'TopicForm',
'Topic',
'topic',
'topicId',
'Projector',
'ProjectionDefault',
function($scope, ngDialog, TopicForm, Topic, topic, Projector, ProjectionDefault) {
Topic.bindOne(topic.id, $scope, 'topic');
function($scope, ngDialog, TopicForm, Topic, topicId, Projector, ProjectionDefault) {
Topic.bindOne(topicId, $scope, 'topic');
$scope.$watch(function () {
return Projector.lastModified();
}, function () {
@ -182,7 +165,6 @@ angular.module('OpenSlidesApp.topics.site', ['OpenSlidesApp.topics', 'OpenSlides
$scope.defaultProjectorId = projectiondefault.projector_id;
}
});
Topic.loadRelations(topic, 'agenda_item');
$scope.openDialog = function (topic) {
ngDialog.open(TopicForm.getDialog(topic));
};
@ -224,9 +206,9 @@ angular.module('OpenSlidesApp.topics.site', ['OpenSlidesApp.topics', 'OpenSlides
'TopicForm',
'Agenda',
'AgendaUpdate',
'topic',
function($scope, $state, Topic, TopicForm, Agenda, AgendaUpdate, topic) {
Topic.loadRelations(topic, 'agenda_item');
'topicId',
function($scope, $state, Topic, TopicForm, Agenda, AgendaUpdate, topicId) {
var topic = Topic.get(topicId);
$scope.alert = {};
// set initial values for form model by create deep copy of topic object
// so list/detail view is not updated while editing
@ -273,7 +255,8 @@ angular.module('OpenSlidesApp.topics.site', ['OpenSlidesApp.topics', 'OpenSlides
'Topic',
'HumanTimeConverter',
'TopicsCsvExample',
function($scope, gettext, Agenda, Topic, HumanTimeConverter, TopicsCsvExample) {
'AgendaUpdate',
function($scope, gettext, Agenda, Topic, HumanTimeConverter, TopicsCsvExample, AgendaUpdate) {
// Big TODO: Change wording from "item" to "topic".
// import from textarea
$scope.importByLine = function () {
@ -285,13 +268,9 @@ angular.module('OpenSlidesApp.topics.site', ['OpenSlidesApp.topics', 'OpenSlides
// TODO: create all items in bulk mode
Topic.create(item).then(
function(success) {
// find related agenda item
Agenda.find(success.agenda_item_id).then(function(item) {
// import all items as type AGENDA_ITEM = 1
item.type = 1;
item.weight = 1000 + index;
Agenda.save(item);
});
var changes = [{key: 'type', value: 1},
{key: 'weight', value: 1000 + index}];
AgendaUpdate.saveChanges(success.agenda_item_id, changes);
$scope.importcounter++;
}
);
@ -376,15 +355,12 @@ angular.module('OpenSlidesApp.topics.site', ['OpenSlidesApp.topics', 'OpenSlides
if (item.selected && !item.importerror) {
Topic.create(item).then(
function(success) {
var changes = [{key: 'duration', value: item.duration},
{key: 'comment', value: item.comment},
{key: 'type', value: item.type},
{key: 'weight', value: item.weight}];
AgendaUpdate.saveChanges(success.agenda_item_id, changes);
item.imported = true;
// find related agenda item
Agenda.find(success.agenda_item_id).then(function(agendaItem) {
agendaItem.duration = item.duration;
agendaItem.comment = item.comment;
agendaItem.type = item.type;
agendaItem.weight = item.weight;
Agenda.save(agendaItem);
});
}
);
}

View File

@ -132,6 +132,8 @@ angular.module('OpenSlidesApp.users', [])
return DS.defineResource({
name: 'users/group',
permissions: permissions,
// TODO (Issue 2862): Do not query the permissions from server. They should be included
// in the startup data. Then remove 'permission' injection from group list controller.
getPermissions: function() {
if (!this.permissions) {
this.permissions = $http({ 'method': 'OPTIONS', 'url': '/rest/users/group/' })

View File

@ -751,9 +751,9 @@ angular.module('OpenSlidesApp.users.site', [
'$state',
'Editor',
'User',
'user',
function($scope, $state, Editor, User, user) {
$scope.user = user; // autoupdate is not activated
'userId',
function($scope, $state, Editor, User, userId) {
$scope.user = angular.copy(User.get(userId));
$scope.ckeditorOptions = Editor.getOptions();
$scope.save = function (user) {
User.save(user).then(
@ -805,10 +805,8 @@ angular.module('OpenSlidesApp.users.site', [
'$scope',
'$state',
'$http',
'user',
function($scope, $state, $http, user) {
$scope.user = user; // autoupdate is not activated
$scope.save = function (user) {
function($scope, $state, $http) {
$scope.save = function () {
if ($scope.newPassword != $scope.newPassword2) {
$scope.newPassword = $scope.newPassword2 = '';
$scope.formError = 'Password confirmation does not match.';

View File

@ -33,7 +33,7 @@
name="inputNewPassword2"
required>
</div>
<button type="submit" ng-click="save(user)" class="btn btn-primary" translate>
<button type="submit" ng-click="save()" class="btn btn-primary" translate>
Save
</button>
<button ui-sref="users.user.list" class="btn btn-default" translate>