OpenSlides/openslides/motions/static/js/motions/motion-block.js

279 lines
10 KiB
JavaScript

(function () {
'use strict';
angular.module('OpenSlidesApp.motions.motionBlock', [])
// MotionBlock model
.factory('MotionBlock', [
'DS',
'jsDataModel',
'gettext',
function(DS, jsDataModel, gettext) {
var name = 'motions/motion-block';
return DS.defineResource({
name: name,
useClass: jsDataModel,
verboseName: gettext('Motion block'),
methods: {
getResourceName: function () {
return name;
},
getAgendaTitle: function () {
return this.title;
},
},
relations: {
belongsTo: {
'agenda/item': {
localKey: 'agenda_item_id',
localField: 'agenda_item',
}
},
hasMany: {
'motions/motion': {
localField: 'motions',
foreignKey: 'motion_block_id',
osProtectedRelation: true,
}
},
}
});
}
])
.run(['MotionBlock', function(MotionBlock) {}])
// MotionBlock views (list view, create dialog, update dialog)
.factory('MotionBlockForm', [
'$http',
'operator',
'gettextCatalog',
'Agenda',
'AgendaTree',
function ($http, operator, gettextCatalog, Agenda, AgendaTree) {
return {
// Get ngDialog configuration.
getDialog: function (motionBlock) {
return {
template: 'static/templates/motions/motion-block-form.html',
controller: (motionBlock) ? 'MotionBlockUpdateCtrl' : 'MotionBlockCreateCtrl',
className: 'ngdialog-theme-default wide-form',
closeByEscape: false,
closeByDocument: false,
resolve: {
motionBlockId: function () {return motionBlock ? motionBlock.id : void 0;}
}
};
},
// Get angular-formly fields.
getFormFields: function () {
return [
{
key: 'title',
type: 'input',
templateOptions: {
label: gettextCatalog.getString('Title')
}
},
{
key: 'showAsAgendaItem',
type: 'checkbox',
templateOptions: {
label: gettextCatalog.getString('Show as agenda item'),
description: gettextCatalog.getString('If deactivated it appears as internal item on agenda.')
},
hide: !(operator.hasPerms('motions.can_manage') && operator.hasPerms('agenda.can_manage'))
},
{
key: 'agenda_parent_item_id',
type: 'select-single',
templateOptions: {
label: gettextCatalog.getString('Parent item'),
options: AgendaTree.getFlatTree(Agenda.getAll()),
ngOptions: 'item.id as item.getListViewTitle() for item in to.options | notself : model.agenda_item_id',
placeholder: gettextCatalog.getString('Select a parent item ...')
}
}
];
}
};
}
])
.controller('MotionBlockListCtrl', [
'$scope',
'ngDialog',
'MotionBlock',
'MotionBlockForm',
'Projector',
'ProjectionDefault',
function ($scope, ngDialog, MotionBlock, MotionBlockForm, Projector, ProjectionDefault) {
$scope.$watch(function () {
return Projector.lastModified();
}, function () {
var projectiondefault = ProjectionDefault.filter({name: 'motionBlocks'})[0];
if (projectiondefault) {
$scope.defaultProjectorId = projectiondefault.projector_id;
}
});
// Two-way data binding for all MotionBlock instances.
MotionBlock.bindAll({}, $scope, 'motionBlocks');
// Dialog with a form to create or update a MotionBlock instance.
$scope.openFormDialog = function (motionBlock) {
ngDialog.open(MotionBlockForm.getDialog(motionBlock));
};
// Confirm dialog to delete a MotionBlock instance.
$scope.delete = function (motionBlock) {
MotionBlock.destroy(motionBlock.id);
};
}
])
.controller('MotionBlockDetailCtrl', [
'$scope',
'$http',
'ngDialog',
'Motion',
'MotionBlockForm',
'MotionBlock',
'motionBlockId',
'Projector',
'ProjectionDefault',
'WebpageTitle',
'gettextCatalog',
'ErrorMessage',
function($scope, $http, ngDialog, Motion, MotionBlockForm, MotionBlock, motionBlockId, Projector,
ProjectionDefault, WebpageTitle, gettextCatalog, ErrorMessage) {
$scope.$watch(function () {
return MotionBlock.lastModified(motionBlockId);
}, function () {
$scope.motionBlock = MotionBlock.get(motionBlockId);
WebpageTitle.updateTitle(gettextCatalog.getString('Motion block') + ' ' +
$scope.motionBlock.agenda_item.getTitle());
});
Motion.bindAll({}, $scope, 'motions');
$scope.$watch(function () {
return Projector.lastModified();
}, function () {
var projectiondefault = ProjectionDefault.filter({name: 'motionBlocks'})[0];
if (projectiondefault) {
$scope.defaultProjectorId = projectiondefault.projector_id;
}
});
$scope.openDialog = function (motionBlock) {
ngDialog.open(MotionBlockForm.getDialog(motionBlock));
};
$scope.followRecommendations = function () {
$http.post('/rest/motions/motion-block/' + motionBlockId + '/follow_recommendations/').then(
function (success) {
$scope.alert = { type: 'success', msg: success.data.detail, show: true };
}, function (error) {
$scope.alert = ErrorMessage.forAlert(error);
});
};
$scope.delete = function (motion) {
motion.motion_block_id = null;
motion.title = motion.getTitle(-1);
motion.text = motion.getText(-1);
motion.reason = motion.getReason(-1);
Motion.save(motion);
};
}
])
.controller('MotionBlockCreateCtrl', [
'$scope',
'MotionBlock',
'MotionBlockForm',
'AgendaUpdate',
function($scope, MotionBlock, MotionBlockForm, AgendaUpdate) {
// Prepare form.
$scope.model = {};
$scope.model.showAsAgendaItem = true;
// Get all form fields.
$scope.formFields = MotionBlockForm.getFormFields();
// Save form.
$scope.save = function (motionBlock) {
MotionBlock.create(motionBlock).then(
function (success) {
// 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: (motionBlock.showAsAgendaItem ? 1 : 2)},
{key: 'parent_id', value: motionBlock.agenda_parent_item_id}];
AgendaUpdate.saveChanges(success.agenda_item_id, changes);
$scope.closeThisDialog();
},
function (error) {
var message = '';
for (var e in error.data) {
message += e + ': ' + error.data[e] + ' ';
}
$scope.alert = {type: 'danger', msg: message, show: true};
}
);
};
}
])
.controller('MotionBlockUpdateCtrl', [
'$scope',
'$state',
'MotionBlock',
'MotionBlockForm',
'AgendaUpdate',
'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.
$scope.formFields = MotionBlockForm.getFormFields();
for (var i = 0; i < $scope.formFields.length; i++) {
if ($scope.formFields[i].key == 'showAsAgendaItem') {
// Get state from agenda item (hidden/internal or agenda item).
$scope.formFields[i].defaultValue = !motionBlock.agenda_item.is_hidden;
} else if ($scope.formFields[i].key == 'agenda_parent_item_id') {
$scope.formFields[i].defaultValue = motionBlock.agenda_item.parent_id;
}
}
// Save form.
$scope.save = function (motionBlock) {
MotionBlock.create(motionBlock).then(
function (success) {
// 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: (motionBlock.showAsAgendaItem ? 1 : 2)},
{key: 'parent_id', value: motionBlock.agenda_parent_item_id}];
AgendaUpdate.saveChanges(success.agenda_item_id,changes);
$scope.closeThisDialog();
},
function (error) {
// Save error: revert all changes by restore
// (refresh) original motionBlock object from server
MotionBlock.refresh(motionBlock); // TODO: Why do we need a refresh here?
var message = '';
for (var e in error.data) {
message += e + ': ' + error.data[e] + ' ';
}
$scope.alert = {type: 'danger', msg: message, show: true};
}
);
};
}
]);
}());