Merge pull request #3498 from FinnStutzenstein/MotionHref

Give motions by id in state and recommendation.
This commit is contained in:
Norman Jäckel 2017-11-21 20:41:47 +01:00 committed by GitHub
commit 3161bdaa05
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 74 additions and 44 deletions

View File

@ -49,6 +49,7 @@ Motions:
- Improved the multiselect state filter [#3459]. - Improved the multiselect state filter [#3459].
- Added karma:watch command [#3466]. - Added karma:watch command [#3466].
- Show the number of next speakers in motion list view [#3470]. - Show the number of next speakers in motion list view [#3470].
- Reference to motions by id in state and recommendation special field [#3498].
Elections: Elections:
- Added pagination for list view [#3393]. - Added pagination for list view [#3393].

View File

@ -189,10 +189,34 @@ angular.module('OpenSlidesApp.motions', [
} }
]) ])
.factory('MotionStateAndRecommendationParser', [
'DS',
'gettextCatalog',
function (DS, gettextCatalog) {
return {
formatMotion: function (motion) {
return '[motion:' + motion.id + ']';
},
parse: function (recommendation) {
return recommendation.replace(/\[motion:(\d+)\]/g, function (match, id) {
var motion = DS.get('motions/motion', id);
if (motion) {
return motion.identifier ? motion.identifier : motion.getTitle();
} else {
return gettextCatalog.getString("<unknown motion>");
}
});
},
};
}
])
.factory('Motion', [ .factory('Motion', [
'DS', 'DS',
'$http', '$http',
'MotionPoll', 'MotionPoll',
'MotionStateAndRecommendationParser',
'MotionChangeRecommendation', 'MotionChangeRecommendation',
'MotionComment', 'MotionComment',
'jsDataModel', 'jsDataModel',
@ -204,7 +228,7 @@ angular.module('OpenSlidesApp.motions', [
'OpenSlidesSettings', 'OpenSlidesSettings',
'Projector', 'Projector',
'operator', 'operator',
function(DS, $http, MotionPoll, MotionChangeRecommendation, MotionComment, jsDataModel, gettext, gettextCatalog, function(DS, $http, MotionPoll, MotionStateAndRecommendationParser, MotionChangeRecommendation, MotionComment, jsDataModel, gettext, gettextCatalog,
Config, lineNumberingService, diffService, OpenSlidesSettings, Projector, operator) { Config, lineNumberingService, diffService, OpenSlidesSettings, Projector, operator) {
var name = 'motions/motion'; var name = 'motions/motion';
return DS.defineResource({ return DS.defineResource({
@ -399,35 +423,33 @@ angular.module('OpenSlidesApp.motions', [
// depended by state and provided by a custom comment field // depended by state and provided by a custom comment field
getStateName: function () { getStateName: function () {
var name = ''; var name = '';
var additionalName = '';
if (this.state) { if (this.state) {
name = gettextCatalog.getString(this.state.name); name = gettextCatalog.getString(this.state.name);
if (this.state.show_state_extension_field) { if (this.state.show_state_extension_field) {
// check motion comment fields for flag 'forState' // check motion comment fields for flag 'forState'
var commentFieldForStateId = MotionComment.getFieldIdForFlag('forState'); var commentFieldForStateId = MotionComment.getFieldIdForFlag('forState');
if (commentFieldForStateId > -1) { if (commentFieldForStateId > -1) {
additionalName = ' ' + this.comments[commentFieldForStateId]; name += ' ' + this.comments[commentFieldForStateId];
} }
} }
} }
return name + additionalName; return MotionStateAndRecommendationParser.parse(name);
}, },
// full recommendation string - optional with custom recommendationextension // full recommendation string - optional with custom recommendationextension
// depended by state and provided by a custom comment field // depended by state and provided by a custom comment field
getRecommendationName: function () { getRecommendationName: function () {
var recommendation = ''; var recommendation = '';
var additionalName = '';
if (Config.get('motions_recommendations_by').value !== '' && this.recommendation) { if (Config.get('motions_recommendations_by').value !== '' && this.recommendation) {
recommendation = gettextCatalog.getString(this.recommendation.recommendation_label); recommendation = gettextCatalog.getString(this.recommendation.recommendation_label);
if (this.recommendation.show_recommendation_extension_field) { if (this.recommendation.show_recommendation_extension_field) {
// check motion comment fields for flag 'forRecommendation' // check motion comment fields for flag 'forRecommendation'
var commentFieldForRecommendationId = MotionComment.getFieldIdForFlag('forRecommendation'); var commentFieldForRecommendationId = MotionComment.getFieldIdForFlag('forRecommendation');
if (commentFieldForRecommendationId > -1) { if (commentFieldForRecommendationId > -1) {
additionalName = ' ' + this.comments[commentFieldForRecommendationId]; recommendation += ' ' + this.comments[commentFieldForRecommendationId];
} }
} }
} }
return recommendation + additionalName; return MotionStateAndRecommendationParser.parse(recommendation);
}, },
// link name which is shown in search result // link name which is shown in search result
getSearchResultName: function () { getSearchResultName: function () {
@ -808,21 +830,6 @@ angular.module('OpenSlidesApp.motions', [
} }
]) ])
.factory('MotionList', [
function () {
return {
getList: function (items){
var list = [];
_.each(items, function (item) {
list.push({ id: item.id,
item: item });
});
return list;
}
};
}
])
.factory('MotionChangeRecommendation', [ .factory('MotionChangeRecommendation', [
'DS', 'DS',
'Config', 'Config',

View File

@ -185,7 +185,7 @@ angular.module('OpenSlidesApp.motions.motionservices', ['OpenSlidesApp.motions',
} }
]) ])
.factory('ChangeRecommmendationCreate', [ .factory('ChangeRecommendationCreate', [
'ngDialog', 'ngDialog',
'ChangeRecommendationForm', 'ChangeRecommendationForm',
function(ngDialog, ChangeRecommendationForm) { function(ngDialog, ChangeRecommendationForm) {
@ -366,7 +366,7 @@ angular.module('OpenSlidesApp.motions.motionservices', ['OpenSlidesApp.motions',
} }
]) ])
.factory('ChangeRecommmendationView', [ .factory('ChangeRecommendationView', [
'Motion', 'Motion',
'MotionChangeRecommendation', 'MotionChangeRecommendation',
'Config', 'Config',

View File

@ -1326,8 +1326,9 @@ angular.module('OpenSlidesApp.motions.site', [
'ngDialog', 'ngDialog',
'gettextCatalog', 'gettextCatalog',
'MotionForm', 'MotionForm',
'ChangeRecommmendationCreate', 'ChangeRecommendationCreate',
'ChangeRecommmendationView', 'ChangeRecommendationView',
'MotionStateAndRecommendationParser',
'MotionChangeRecommendation', 'MotionChangeRecommendation',
'Motion', 'Motion',
'MotionComment', 'MotionComment',
@ -1349,11 +1350,11 @@ angular.module('OpenSlidesApp.motions.site', [
'WebpageTitle', 'WebpageTitle',
'EditingWarning', 'EditingWarning',
function($scope, $http, $timeout, $window, $filter, operator, ngDialog, gettextCatalog, function($scope, $http, $timeout, $window, $filter, operator, ngDialog, gettextCatalog,
MotionForm, ChangeRecommmendationCreate, ChangeRecommmendationView, MotionForm, ChangeRecommendationCreate, ChangeRecommendationView,
MotionChangeRecommendation, Motion, MotionComment, Category, Mediafile, Tag, User, MotionStateAndRecommendationParser, MotionChangeRecommendation, Motion, MotionComment,
Workflow, Config, motionId, MotionInlineEditing, MotionCommentsInlineEditing, Editor, Category, Mediafile, Tag, User, Workflow, Config, motionId, MotionInlineEditing,
Projector, ProjectionDefault, MotionBlock, MotionPdfExport, PersonalNoteManager, MotionCommentsInlineEditing, Editor, Projector, ProjectionDefault, MotionBlock,
WebpageTitle, EditingWarning) { MotionPdfExport, PersonalNoteManager, WebpageTitle, EditingWarning) {
var motion = Motion.get(motionId); var motion = Motion.get(motionId);
Category.bindAll({}, $scope, 'categories'); Category.bindAll({}, $scope, 'categories');
Mediafile.bindAll({}, $scope, 'mediafiles'); Mediafile.bindAll({}, $scope, 'mediafiles');
@ -1361,6 +1362,7 @@ angular.module('OpenSlidesApp.motions.site', [
User.bindAll({}, $scope, 'users'); User.bindAll({}, $scope, 'users');
Workflow.bindAll({}, $scope, 'workflows'); Workflow.bindAll({}, $scope, 'workflows');
MotionBlock.bindAll({}, $scope, 'motionBlocks'); MotionBlock.bindAll({}, $scope, 'motionBlocks');
Motion.bindAll({}, $scope, 'motions');
$scope.$watch(function () { $scope.$watch(function () {
return MotionChangeRecommendation.lastModified(); return MotionChangeRecommendation.lastModified();
}, function () { }, function () {
@ -1568,6 +1570,9 @@ angular.module('OpenSlidesApp.motions.site', [
motion['comment_' + $scope.commentFieldForRecommendationId] = recommendationExtension; motion['comment_' + $scope.commentFieldForRecommendationId] = recommendationExtension;
$scope.save(motion); $scope.save(motion);
}; };
$scope.addMotionToRecommendationField = function (motion) {
$scope.recommendationExtension += MotionStateAndRecommendationParser.formatMotion(motion);
};
// update recommendation // update recommendation
$scope.updateRecommendation = function (recommendation_id) { $scope.updateRecommendation = function (recommendation_id) {
$http.put('/rest/motions/motion/' + motion.id + '/set_recommendation/', {'recommendation': recommendation_id}); $http.put('/rest/motions/motion/' + motion.id + '/set_recommendation/', {'recommendation': recommendation_id});
@ -1741,11 +1746,11 @@ angular.module('OpenSlidesApp.motions.site', [
); );
// Change recommendation creation functions // Change recommendation creation functions
$scope.createChangeRecommendation = ChangeRecommmendationCreate; $scope.createChangeRecommendation = ChangeRecommendationCreate;
$scope.createChangeRecommendation.init($scope, motion); $scope.createChangeRecommendation.init($scope, motion);
// Change recommendation viewing // Change recommendation viewing
$scope.viewChangeRecommendations = ChangeRecommmendationView; $scope.viewChangeRecommendations = ChangeRecommendationView;
$scope.viewChangeRecommendations.init($scope, Config.get('motions_recommendation_text_mode').value); $scope.viewChangeRecommendations.init($scope, Config.get('motions_recommendation_text_mode').value);
// PDF creating functions // PDF creating functions
@ -2417,26 +2422,28 @@ angular.module('OpenSlidesApp.motions.site', [
'$scope', '$scope',
'$stateParams', '$stateParams',
'$http', '$http',
'MotionList',
'Category', 'Category',
'categoryId', 'categoryId',
'Motion', 'Motion',
'ErrorMessage', 'ErrorMessage',
function($scope, $stateParams, $http, MotionList, Category, categoryId, Motion, ErrorMessage) { function($scope, $stateParams, $http, Category, categoryId, Motion, ErrorMessage) {
Category.bindOne(categoryId, $scope, 'category'); Category.bindOne(categoryId, $scope, 'category');
Motion.bindAll({}, $scope, 'motions'); Motion.bindAll({}, $scope, 'motions');
$scope.filter = { category_id: categoryId, $scope.filter = { category_id: categoryId,
parent_id: null, parent_id: null,
orderBy: 'identifier' }; orderBy: 'identifier' };
$scope.$watch( $scope.$watch(function () {
function () {
return Motion.lastModified(); return Motion.lastModified();
}, }, function () {
function () { var motions = Motion.filter($scope.filter);
$scope.items = MotionList.getList(Motion.filter($scope.filter)); $scope.items = _.map(motions, function (motion) {
} return {
); id: motion.id,
item: motion
};
});
});
$scope.alert = {}; $scope.alert = {};
// Numbers all motions in this category by the given order in $scope.items // Numbers all motions in this category by the given order in $scope.items

View File

@ -224,7 +224,7 @@
<label class="sr-only" for="recommendationExtensionField"> <label class="sr-only" for="recommendationExtensionField">
{{ commentsFields[commentFieldForRecommendationId].name }} {{ commentsFields[commentFieldForRecommendationId].name }}
</label> </label>
<input type="text" ng-model="recommendationExtension" <input type="text" ng-model="$parent.$parent.recommendationExtension"
id="recommendationExtensionField" class="form-control input-sm" id="recommendationExtensionField" class="form-control input-sm"
placeholder="{{ commentsFields[commentFieldForRecommendationId].name }}"> placeholder="{{ commentsFields[commentFieldForRecommendationId].name }}">
<span class="input-group-btn"> <span class="input-group-btn">
@ -232,6 +232,21 @@
<i class="fa fa-check"></i> <i class="fa fa-check"></i>
</button> </button>
</span> </span>
<span class="input-group-btn">
<span uib-dropdown>
<span id="motion-dropdown" class="drop-down-name btn btn-default btn-sm" uib-dropdown-toggle>
<i class="fa fa-plus"></i>
<translate>Motion</translate>
</span>
<ul uib-dropdown-menu class="dropdown-menu" aria-labelledby="motion-dropdown">
<li ng-repeat="m in motions">
<a href ng-click="addMotionToRecommendationField(m)">
{{ m.identifier ? m.identifier + ':' : '' }} {{ m.getTitle() }}
</a>
</li>
</ul>
</span>
</span>
</div> </div>
<button <button
ng-if="motion.recommendation && ng-if="motion.recommendation &&