commit
941ac8809e
@ -38,7 +38,8 @@ Users:
|
||||
Core:
|
||||
- No reload on logoff. OpenSlides is now a full single page
|
||||
application [#3172].
|
||||
- Adding support for choosing image files as logos [#3184, #3207].
|
||||
- Adding support for choosing image files as logos for projector and
|
||||
pdf [#3184, #3207, #3208].
|
||||
- Fixing error when clearing empty chat [#3199].
|
||||
- Added notify system [#3212].
|
||||
|
||||
|
@ -75,6 +75,24 @@ angular.module('OpenSlidesApp.agenda.pdf', ['OpenSlidesApp.core.pdf'])
|
||||
createInstance: createInstance
|
||||
};
|
||||
|
||||
}]);
|
||||
}])
|
||||
|
||||
.factory('AgendaPdfExport', [
|
||||
'gettextCatalog',
|
||||
'AgendaContentProvider',
|
||||
'PdfMakeDocumentProvider',
|
||||
'PdfCreate',
|
||||
function (gettextCatalog, AgendaContentProvider, PdfMakeDocumentProvider, PdfCreate) {
|
||||
return {
|
||||
export: function (items) {
|
||||
var filename = gettextCatalog.getString('Agenda') + '.pdf';
|
||||
var agendaContentProvider = AgendaContentProvider.createInstance(items);
|
||||
PdfMakeDocumentProvider.createInstance(agendaContentProvider).then(function (documentProvider) {
|
||||
PdfCreate.download(documentProvider.getDocument(), filename);
|
||||
});
|
||||
},
|
||||
};
|
||||
}
|
||||
]);
|
||||
|
||||
}());
|
||||
|
@ -89,17 +89,15 @@ angular.module('OpenSlidesApp.agenda.site', [
|
||||
'AgendaTree',
|
||||
'Projector',
|
||||
'ProjectionDefault',
|
||||
'AgendaContentProvider',
|
||||
'PdfMakeDocumentProvider',
|
||||
'gettextCatalog',
|
||||
'gettext',
|
||||
'osTableFilter',
|
||||
'AgendaCsvExport',
|
||||
'PdfCreate',
|
||||
'AgendaPdfExport',
|
||||
'ErrorMessage',
|
||||
function($scope, $filter, $http, $state, DS, operator, ngDialog, Agenda, TopicForm,
|
||||
AgendaTree, Projector, ProjectionDefault, AgendaContentProvider, PdfMakeDocumentProvider,
|
||||
gettextCatalog, gettext, osTableFilter, AgendaCsvExport, PdfCreate, ErrorMessage) {
|
||||
AgendaTree, Projector, ProjectionDefault, gettextCatalog, gettext, osTableFilter,
|
||||
AgendaCsvExport, AgendaPdfExport, ErrorMessage) {
|
||||
// Bind agenda tree to the scope
|
||||
$scope.$watch(function () {
|
||||
return Agenda.lastModified();
|
||||
@ -276,10 +274,7 @@ angular.module('OpenSlidesApp.agenda.site', [
|
||||
};
|
||||
// export
|
||||
$scope.pdfExport = function () {
|
||||
var filename = gettextCatalog.getString('Agenda') + '.pdf';
|
||||
var agendaContentProvider = AgendaContentProvider.createInstance($scope.itemsFiltered);
|
||||
var documentProvider = PdfMakeDocumentProvider.createInstance(agendaContentProvider);
|
||||
PdfCreate.download(documentProvider.getDocument(), filename);
|
||||
AgendaPdfExport.export($scope.itemsFiltered);
|
||||
};
|
||||
$scope.csvExport = function () {
|
||||
AgendaCsvExport.export($scope.itemsFiltered);
|
||||
|
@ -259,10 +259,11 @@ angular.module('OpenSlidesApp.assignments.pdf', ['OpenSlidesApp.core.pdf'])
|
||||
};
|
||||
};
|
||||
|
||||
return {
|
||||
createInstance: createInstance
|
||||
};
|
||||
}])
|
||||
return {
|
||||
createInstance: createInstance
|
||||
};
|
||||
}
|
||||
])
|
||||
|
||||
.factory('BallotContentProvider', [
|
||||
'$filter',
|
||||
@ -271,12 +272,12 @@ angular.module('OpenSlidesApp.assignments.pdf', ['OpenSlidesApp.core.pdf'])
|
||||
'Config',
|
||||
'User',
|
||||
function($filter, gettextCatalog, PDFLayout, Config, User) {
|
||||
var createInstance = function(scope, poll, pollNumber) {
|
||||
var createInstance = function(assignment, poll, pollNumber) {
|
||||
|
||||
// page title
|
||||
var createTitle = function() {
|
||||
return {
|
||||
text: scope.assignment.title,
|
||||
text: assignment.title,
|
||||
style: 'title',
|
||||
};
|
||||
};
|
||||
@ -477,10 +478,11 @@ angular.module('OpenSlidesApp.assignments.pdf', ['OpenSlidesApp.core.pdf'])
|
||||
};
|
||||
};
|
||||
|
||||
return {
|
||||
createInstance: createInstance
|
||||
};
|
||||
}])
|
||||
return {
|
||||
createInstance: createInstance
|
||||
};
|
||||
}
|
||||
])
|
||||
|
||||
.factory('AssignmentCatalogContentProvider', [
|
||||
'gettextCatalog',
|
||||
@ -552,9 +554,68 @@ angular.module('OpenSlidesApp.assignments.pdf', ['OpenSlidesApp.core.pdf'])
|
||||
};
|
||||
};
|
||||
|
||||
return {
|
||||
createInstance: createInstance
|
||||
};
|
||||
}]);
|
||||
return {
|
||||
createInstance: createInstance
|
||||
};
|
||||
}
|
||||
])
|
||||
|
||||
.factory('AssignmentPdfExport', [
|
||||
'gettextCatalog',
|
||||
'AssignmentContentProvider',
|
||||
'AssignmentCatalogContentProvider',
|
||||
'PdfMakeDocumentProvider',
|
||||
'BallotContentProvider',
|
||||
'PdfMakeBallotPaperProvider',
|
||||
'PdfCreate',
|
||||
function (gettextCatalog, AssignmentContentProvider, AssignmentCatalogContentProvider,
|
||||
PdfMakeDocumentProvider, BallotContentProvider, PdfMakeBallotPaperProvider, PdfCreate) {
|
||||
return {
|
||||
export: function (assignments, singleAssignment) {
|
||||
var filename = singleAssignment ?
|
||||
gettextCatalog.getString('Election') + '_' + assignments.title :
|
||||
gettextCatalog.getString('Elections');
|
||||
filename += '.pdf';
|
||||
if (singleAssignment) {
|
||||
assignments = [assignments];
|
||||
}
|
||||
var assignmentContentProviderArray = [];
|
||||
|
||||
// Convert the assignments to content providers
|
||||
angular.forEach(assignments, function(assignment) {
|
||||
assignmentContentProviderArray.push(AssignmentContentProvider.createInstance(assignment));
|
||||
});
|
||||
|
||||
var documentProviderPromise;
|
||||
if (singleAssignment) {
|
||||
documentProviderPromise =
|
||||
PdfMakeDocumentProvider.createInstance(assignmentContentProviderArray[0]);
|
||||
} else {
|
||||
var assignmentCatalogContentProvider =
|
||||
AssignmentCatalogContentProvider.createInstance(assignmentContentProviderArray);
|
||||
documentProviderPromise =
|
||||
PdfMakeDocumentProvider.createInstance(assignmentCatalogContentProvider);
|
||||
}
|
||||
documentProviderPromise.then(function (documentProvider) {
|
||||
PdfCreate.download(documentProvider.getDocument(), filename);
|
||||
});
|
||||
},
|
||||
createBallotPdf: function (assignment, pollId) {
|
||||
var thePoll;
|
||||
var pollNumber;
|
||||
angular.forEach(assignment.polls, function(poll, pollIndex) {
|
||||
if (poll.id == pollId) {
|
||||
thePoll = poll;
|
||||
pollNumber = pollIndex+1;
|
||||
}
|
||||
});
|
||||
var filename = gettextCatalog.getString('Ballot') + '_' + pollNumber + '_' + assignment.title + '.pdf';
|
||||
var ballotContentProvider = BallotContentProvider.createInstance(assignment, thePoll, pollNumber);
|
||||
var documentProvider = PdfMakeBallotPaperProvider.createInstance(ballotContentProvider);
|
||||
PdfCreate.download(documentProvider.getDocument(), filename);
|
||||
},
|
||||
};
|
||||
}
|
||||
]);
|
||||
|
||||
}());
|
||||
|
@ -265,18 +265,14 @@ angular.module('OpenSlidesApp.assignments.site', [
|
||||
'Projector',
|
||||
'ProjectionDefault',
|
||||
'gettextCatalog',
|
||||
'AssignmentContentProvider',
|
||||
'AssignmentCatalogContentProvider',
|
||||
'PdfMakeDocumentProvider',
|
||||
'User',
|
||||
'osTableFilter',
|
||||
'osTableSort',
|
||||
'gettext',
|
||||
'PdfCreate',
|
||||
'AssignmentPhases',
|
||||
'AssignmentPdfExport',
|
||||
function($scope, ngDialog, AssignmentForm, Assignment, Tag, Agenda, Projector, ProjectionDefault,
|
||||
gettextCatalog, AssignmentContentProvider, AssignmentCatalogContentProvider, PdfMakeDocumentProvider,
|
||||
User, osTableFilter, osTableSort, gettext, PdfCreate, AssignmentPhases) {
|
||||
gettextCatalog, User, osTableFilter, osTableSort, gettext, AssignmentPhases, AssignmentPdfExport) {
|
||||
Assignment.bindAll({}, $scope, 'assignments');
|
||||
Tag.bindAll({}, $scope, 'tags');
|
||||
$scope.$watch(function () {
|
||||
@ -383,20 +379,8 @@ angular.module('OpenSlidesApp.assignments.site', [
|
||||
Assignment.destroy(assignment.id);
|
||||
};
|
||||
// create the PDF List
|
||||
$scope.makePDF_assignmentList = function () {
|
||||
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);
|
||||
PdfCreate.download(documentProvider.getDocument(), filename);
|
||||
$scope.pdfExport = function () {
|
||||
AssignmentPdfExport.export($scope.assignmentsFiltered);
|
||||
};
|
||||
}
|
||||
])
|
||||
@ -416,18 +400,13 @@ angular.module('OpenSlidesApp.assignments.site', [
|
||||
'assignmentId',
|
||||
'Projector',
|
||||
'ProjectionDefault',
|
||||
'AssignmentContentProvider',
|
||||
'BallotContentProvider',
|
||||
'PdfMakeDocumentProvider',
|
||||
'PdfMakeBallotPaperProvider',
|
||||
'gettextCatalog',
|
||||
'PdfCreate',
|
||||
'AssignmentPhases',
|
||||
'AssignmentPdfExport',
|
||||
'ErrorMessage',
|
||||
function($scope, $http, $filter, $timeout, filterFilter, gettext, ngDialog, AssignmentForm, operator, Assignment,
|
||||
User, assignmentId, Projector, ProjectionDefault, AssignmentContentProvider, BallotContentProvider,
|
||||
PdfMakeDocumentProvider, PdfMakeBallotPaperProvider, gettextCatalog, PdfCreate, AssignmentPhases,
|
||||
ErrorMessage) {
|
||||
function($scope, $http, $filter, $timeout, filterFilter, gettext, ngDialog, AssignmentForm, operator,
|
||||
Assignment, User, assignmentId, Projector, ProjectionDefault, gettextCatalog, AssignmentPhases,
|
||||
AssignmentPdfExport, ErrorMessage) {
|
||||
User.bindAll({}, $scope, 'users');
|
||||
var assignment = Assignment.get(assignmentId);
|
||||
Assignment.loadRelations(assignment, 'agenda_item');
|
||||
@ -600,28 +579,13 @@ angular.module('OpenSlidesApp.assignments.site', [
|
||||
|
||||
};
|
||||
|
||||
//creates the document as pdf
|
||||
$scope.makePDF_singleAssignment = function() {
|
||||
var filename = gettextCatalog.getString("Election") + "_" + $scope.assignment.title + ".pdf";
|
||||
var assignmentContentProvider = AssignmentContentProvider.createInstance($scope.assignment);
|
||||
var documentProvider = PdfMakeDocumentProvider.createInstance(assignmentContentProvider);
|
||||
PdfCreate.download(documentProvider.getDocument(), filename);
|
||||
// Creates the document as pdf
|
||||
$scope.pdfExport = function() {
|
||||
AssignmentPdfExport.export($scope.assignment, true);
|
||||
};
|
||||
|
||||
//creates the ballotpaper as pdf
|
||||
$scope.makePDF_assignmentpoll = function(pollID) {
|
||||
var thePoll;
|
||||
var pollNumber;
|
||||
angular.forEach($scope.assignment.polls, function(poll, pollIndex) {
|
||||
if (poll.id == pollID) {
|
||||
thePoll = poll;
|
||||
pollNumber = pollIndex+1;
|
||||
}
|
||||
});
|
||||
var filename = gettextCatalog.getString("Ballot") + "_" + pollNumber + "_" + $scope.assignment.title + ".pdf";
|
||||
var ballotContentProvider = BallotContentProvider.createInstance($scope, thePoll, pollNumber);
|
||||
var documentProvider = PdfMakeBallotPaperProvider.createInstance(ballotContentProvider);
|
||||
PdfCreate.download(documentProvider.getDocument(), filename);
|
||||
// Creates the ballotpaper as pdf
|
||||
$scope.ballotpaperExport = function(pollId) {
|
||||
AssignmentPdfExport.createBallotPdf($scope.assignment, pollId);
|
||||
};
|
||||
|
||||
// Just mark some vote value strings for translation.
|
||||
|
@ -21,7 +21,7 @@
|
||||
<i class="fa fa-pencil"></i>
|
||||
</a>
|
||||
<!-- pdf -->
|
||||
<a ng-click="makePDF_singleAssignment()" target="_blank" class="btn btn-default btn-sm">
|
||||
<a ng-click="pdfExport()" target="_blank" class="btn btn-default btn-sm">
|
||||
<i class="fa fa-file-pdf-o fa-lg"></i>
|
||||
<translate>PDF</translate>
|
||||
</a>
|
||||
@ -152,7 +152,7 @@
|
||||
<!-- angular requires to open the link in new tab with "target='_blank'".
|
||||
Otherwise the pdf url can't be open in same window; angular redirects to "/". -->
|
||||
<!-- PDF -->
|
||||
<a ng-click="makePDF_assignmentpoll(poll.id)" target="_blank" class="btn btn-default btn-sm">
|
||||
<a ng-click="ballotpaperExport(poll.id)" target="_blank" class="btn btn-default btn-sm">
|
||||
<i class="fa fa-file-pdf-o"></i>
|
||||
<translate>Print ballot paper</translate>
|
||||
</a>
|
||||
|
@ -39,7 +39,7 @@
|
||||
<ul class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownExport">
|
||||
<!-- PDF export -->
|
||||
<li>
|
||||
<a href="" ng-click="makePDF_assignmentList()">
|
||||
<a href="" ng-click="pdfExport()">
|
||||
<i class="fa fa-file-pdf-o"></i>
|
||||
<translate>PDF</translate>
|
||||
</a>
|
||||
|
@ -223,7 +223,9 @@ def get_config_variables():
|
||||
name='logos_available',
|
||||
default_value=[
|
||||
'logo_projector_main',
|
||||
'logo_projector_header'],
|
||||
'logo_projector_header',
|
||||
'logo_pdf_header',
|
||||
'logo_pdf_footer'],
|
||||
weight=300,
|
||||
group='Logo',
|
||||
hidden=True)
|
||||
@ -247,3 +249,24 @@ def get_config_variables():
|
||||
weight=302,
|
||||
group='Logo',
|
||||
hidden=True)
|
||||
|
||||
# PDF logos
|
||||
yield ConfigVariable(
|
||||
name='logo_pdf_header',
|
||||
default_value={
|
||||
'display_name': 'PDF header logo',
|
||||
'path': ''},
|
||||
input_type='logo',
|
||||
weight=310,
|
||||
group='Logo',
|
||||
hidden=True)
|
||||
|
||||
yield ConfigVariable(
|
||||
name='logo_pdf_footer',
|
||||
default_value={
|
||||
'display_name': 'PDF footer logo',
|
||||
'path': ''},
|
||||
input_type='logo',
|
||||
weight=311,
|
||||
group='Logo',
|
||||
hidden=True)
|
||||
|
@ -96,15 +96,16 @@ self.addEventListener('message', function(e) {
|
||||
// see https://github.com/bpampuch/pdfmake/issues/38
|
||||
if (data.footerTpl) {
|
||||
data.footer = function (currentPage, pageCount) {
|
||||
var footerText = data.footerTpl.text
|
||||
.replace('{{currentPage}}', currentPage)
|
||||
.replace('{{pageCount}}', pageCount);
|
||||
for(var i = 0; i < data.footerTpl.columns.length; i++) {
|
||||
if (data.footerTpl.columns[i].text) {
|
||||
data.footerTpl.columns[i].text = data.footerTpl.columns[i].text
|
||||
.replace('{{currentPage}}', currentPage)
|
||||
.replace('{{pageCount}}', pageCount);
|
||||
}
|
||||
}
|
||||
return {
|
||||
text: footerText,
|
||||
alignment: data.footerTpl.alignment,
|
||||
columns: data.footerTpl.columns,
|
||||
margin: data.footerTpl.margin,
|
||||
fontSize: data.footerTpl.fontSize,
|
||||
color: data.footerTpl.color
|
||||
};
|
||||
};
|
||||
}
|
||||
|
@ -135,27 +135,35 @@ angular.module('OpenSlidesApp.core.pdf', [])
|
||||
|
||||
|
||||
.factory('PdfMakeDocumentProvider', [
|
||||
'$q',
|
||||
'Config',
|
||||
'PDFLayout',
|
||||
function(Config, PDFLayout) {
|
||||
'PdfImageConverter',
|
||||
function($q, Config, PDFLayout, PdfImageConverter) {
|
||||
/**
|
||||
* Provides the global document
|
||||
* @constructor
|
||||
* @param {object} contentProvider - Object with on method `getContent`, which
|
||||
* returns an array for content
|
||||
*/
|
||||
//images shall contain the the logos as URL: base64Str, just like the converter
|
||||
var createInstance = function(contentProvider) {
|
||||
// Logo urls
|
||||
var logoHeaderUrl = Config.get('logo_pdf_header').value.path,
|
||||
logoFooterUrl = Config.get('logo_pdf_footer').value.path;
|
||||
var imageMap = {};
|
||||
|
||||
// PDF header
|
||||
var getHeader = function() {
|
||||
var columns = [];
|
||||
|
||||
// add here your custom logo (which has to be added to a custom vfs_fonts.js)
|
||||
// see https://github.com/pdfmake/pdfmake/wiki/Custom-Fonts---client-side
|
||||
/*
|
||||
columns.push({
|
||||
image: 'logo.png',
|
||||
fit: [180,40]
|
||||
});*/
|
||||
if (logoHeaderUrl) {
|
||||
columns.push({
|
||||
image: imageMap[logoHeaderUrl],
|
||||
fit: [180, 40],
|
||||
width: '20%'
|
||||
});
|
||||
}
|
||||
|
||||
var line1 = [
|
||||
Config.translate(Config.get('general_event_name').value),
|
||||
@ -168,15 +176,16 @@ angular.module('OpenSlidesApp.core.pdf', [])
|
||||
var text = [line1, line2].join('\n');
|
||||
columns.push({
|
||||
text: text,
|
||||
fontSize:10,
|
||||
width: '100%'
|
||||
fontSize: 10,
|
||||
alignment: 'right',
|
||||
margin: [0, 10, 0, 0],
|
||||
});
|
||||
return {
|
||||
color: '#555',
|
||||
fontSize: 9,
|
||||
margin: [75, 30, 75, 10], // [left, top, right, bottom]
|
||||
columns: columns,
|
||||
columnGap: 10
|
||||
columnGap: 10,
|
||||
};
|
||||
};
|
||||
|
||||
@ -185,12 +194,26 @@ angular.module('OpenSlidesApp.core.pdf', [])
|
||||
// Used placeholder for currentPage and pageCount which
|
||||
// are replaced by dynamic footer function in pdf-worker.js.
|
||||
var getFooter = function() {
|
||||
return {
|
||||
alignment: 'right',
|
||||
margin: [0, 15, 75, 0],
|
||||
fontSize: 9,
|
||||
var columns = [];
|
||||
|
||||
if (logoFooterUrl) {
|
||||
columns.push({
|
||||
image: imageMap[logoFooterUrl],
|
||||
fit: [400,50],
|
||||
width: '80%'
|
||||
});
|
||||
}
|
||||
columns.push({
|
||||
text: '{{currentPage}} / {{pageCount}}',
|
||||
color: '#555',
|
||||
text: '{{currentPage}} / {{pageCount}}'
|
||||
fontSize: 9,
|
||||
alignment: 'right',
|
||||
margin: [0, 15, 0, 0],
|
||||
});
|
||||
return {
|
||||
margin: [75, 0, 75, 10],
|
||||
columns: columns,
|
||||
columnGap: 10,
|
||||
};
|
||||
};
|
||||
// Generates the document(definition) for pdfMake
|
||||
@ -295,9 +318,18 @@ angular.module('OpenSlidesApp.core.pdf', [])
|
||||
};
|
||||
};
|
||||
|
||||
return {
|
||||
getDocument: getDocument
|
||||
};
|
||||
return $q(function (resolve) {
|
||||
var imageSources = [
|
||||
logoHeaderUrl,
|
||||
logoFooterUrl
|
||||
];
|
||||
PdfImageConverter.toBase64(imageSources).then(function (_imageMap) {
|
||||
imageMap = _imageMap;
|
||||
resolve({
|
||||
getDocument: getDocument
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
return {
|
||||
createInstance: createInstance
|
||||
@ -768,7 +800,7 @@ angular.module('OpenSlidesApp.core.pdf', [])
|
||||
height *= scaleByHeight;
|
||||
}
|
||||
alreadyConverted.push({
|
||||
image: BaseMap[element.getAttribute("src")],
|
||||
image: images[element.getAttribute("src")],
|
||||
width: width,
|
||||
height: height
|
||||
});
|
||||
@ -837,7 +869,6 @@ angular.module('OpenSlidesApp.core.pdf', [])
|
||||
ParseHtml(content, html);
|
||||
return content;
|
||||
},
|
||||
BaseMap = images,
|
||||
/**
|
||||
* Creates containerelements for pdfMake
|
||||
* e.g create("text":"MyText") result in { text: "MyText" }
|
||||
@ -862,7 +893,34 @@ angular.module('OpenSlidesApp.core.pdf', [])
|
||||
return {
|
||||
createInstance: createInstance
|
||||
};
|
||||
}])
|
||||
}
|
||||
])
|
||||
|
||||
.factory('PdfImageConverter', [
|
||||
'$q',
|
||||
'PDFLayout',
|
||||
function ($q, PDFLayout) {
|
||||
return {
|
||||
toBase64: function (imageSources) {
|
||||
var imageMap = {};
|
||||
var imagePromises = _.map(imageSources, function (imageSource) {
|
||||
if (imageSource) {
|
||||
return PDFLayout.imageURLtoBase64(imageSource).then(function (base64Str) {
|
||||
imageMap[imageSource] = base64Str;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return $q(function (resolve) {
|
||||
//resolve promises to get base64
|
||||
$q.all(imagePromises).then(function() {
|
||||
resolve(imageMap);
|
||||
});
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
])
|
||||
|
||||
.factory('PdfCreate', [
|
||||
'$timeout',
|
||||
|
@ -1714,6 +1714,8 @@ angular.module('OpenSlidesApp.core.site', [
|
||||
gettext('List of speakers overlay');
|
||||
gettext('Projector logo');
|
||||
gettext('Projector header image');
|
||||
gettext('PDF header logo');
|
||||
gettext('PDF footer logo');
|
||||
|
||||
// Mark the string 'Default projector' here, because it does not appear in the templates.
|
||||
gettext('Default projector');
|
||||
|
@ -341,7 +341,7 @@
|
||||
uib-tooltip="{{ 'The projector header should have a default size of 1024x70px. Adapt the image width if you change the projector resolution.' | translate }}">
|
||||
<i class="fa fa-info-circle"></i>
|
||||
</span>
|
||||
<i class="fa fa-cog fa-lg spacer-left" ng-show="mediafile.logoHover"></i>
|
||||
<i class="fa fa-cog fa-lg spacer-left" ng-show="mediafile.logoHover && mediafile.isUsedAsLogo()"></i>
|
||||
</span>
|
||||
<ul class="dropdown-menu" aria-labelledby="dropdownLogos{{ mediafile.id }}">
|
||||
<li ng-repeat="logo in logos">
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -9,108 +9,109 @@ angular.module('OpenSlidesApp.users.pdf', ['OpenSlidesApp.core.pdf'])
|
||||
'PDFLayout',
|
||||
function(gettextCatalog, PDFLayout) {
|
||||
|
||||
var createInstance = function(userList, groups) {
|
||||
var createInstance = function(userList, groups) {
|
||||
|
||||
//use the Predefined Functions to create the title
|
||||
var title = PDFLayout.createTitle(gettextCatalog.getString("List of participants"));
|
||||
//use the Predefined Functions to create the title
|
||||
var title = PDFLayout.createTitle(gettextCatalog.getString("List of participants"));
|
||||
|
||||
//function to generate the user list
|
||||
var createUserList = function() {
|
||||
var userJsonList = [];
|
||||
//function to generate the user list
|
||||
var createUserList = function() {
|
||||
var userJsonList = [];
|
||||
|
||||
angular.forEach(userList, function (user, counter) {
|
||||
angular.forEach(userList, function (user, counter) {
|
||||
|
||||
//parse for the group names
|
||||
var userGroups = [];
|
||||
angular.forEach(user.groups_id, function (id) {
|
||||
if (id) {
|
||||
angular.forEach(groups, function(group) {
|
||||
if (id == group.id) {
|
||||
userGroups.push(gettextCatalog.getString(group.name));
|
||||
}
|
||||
});
|
||||
}
|
||||
//parse for the group names
|
||||
var userGroups = [];
|
||||
angular.forEach(user.groups_id, function (id) {
|
||||
if (id) {
|
||||
angular.forEach(groups, function(group) {
|
||||
if (id == group.id) {
|
||||
userGroups.push(gettextCatalog.getString(group.name));
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
var userJsonObj = [
|
||||
{
|
||||
text: "" + (counter+1),
|
||||
style: PDFLayout.flipTableRowStyle(userJsonList.length)
|
||||
},
|
||||
{
|
||||
text: user.short_name,
|
||||
style: PDFLayout.flipTableRowStyle(userJsonList.length)
|
||||
},
|
||||
{
|
||||
text: user.structure_level,
|
||||
style: PDFLayout.flipTableRowStyle(userJsonList.length)
|
||||
},
|
||||
{
|
||||
text: userGroups.join(" "),
|
||||
style: PDFLayout.flipTableRowStyle(userJsonList.length)
|
||||
}
|
||||
];
|
||||
userJsonList.push(userJsonObj);
|
||||
});
|
||||
|
||||
var userJsonObj = [
|
||||
{
|
||||
text: "" + (counter+1),
|
||||
style: PDFLayout.flipTableRowStyle(userJsonList.length)
|
||||
},
|
||||
{
|
||||
text: user.short_name,
|
||||
style: PDFLayout.flipTableRowStyle(userJsonList.length)
|
||||
},
|
||||
{
|
||||
text: user.structure_level,
|
||||
style: PDFLayout.flipTableRowStyle(userJsonList.length)
|
||||
},
|
||||
{
|
||||
text: userGroups.join(" "),
|
||||
style: PDFLayout.flipTableRowStyle(userJsonList.length)
|
||||
}
|
||||
var userTableBody = [
|
||||
[
|
||||
{
|
||||
text: '#',
|
||||
style: 'tableHeader'
|
||||
},
|
||||
{
|
||||
text: gettextCatalog.getString("Name"),
|
||||
style: 'tableHeader'
|
||||
},
|
||||
{
|
||||
text: gettextCatalog.getString("Structure level"),
|
||||
style: 'tableHeader'
|
||||
},
|
||||
{
|
||||
text: gettextCatalog.getString("Groups"),
|
||||
style: 'tableHeader'
|
||||
}
|
||||
]
|
||||
];
|
||||
userJsonList.push(userJsonObj);
|
||||
});
|
||||
userTableBody = userTableBody.concat((userJsonList));
|
||||
|
||||
var userTableBody = [
|
||||
[
|
||||
{
|
||||
text: '#',
|
||||
style: 'tableHeader'
|
||||
var userTableJsonString = {
|
||||
table: {
|
||||
widths: ['auto', '*', 'auto', 'auto'],
|
||||
headerRows: 1,
|
||||
body: userTableBody
|
||||
},
|
||||
{
|
||||
text: gettextCatalog.getString("Name"),
|
||||
style: 'tableHeader'
|
||||
},
|
||||
{
|
||||
text: gettextCatalog.getString("Structure level"),
|
||||
style: 'tableHeader'
|
||||
},
|
||||
{
|
||||
text: gettextCatalog.getString("Groups"),
|
||||
style: 'tableHeader'
|
||||
}
|
||||
]
|
||||
];
|
||||
userTableBody = userTableBody.concat((userJsonList));
|
||||
layout: 'headerLineOnly'
|
||||
};
|
||||
|
||||
var userTableJsonString = {
|
||||
table: {
|
||||
widths: ['auto', '*', 'auto', 'auto'],
|
||||
headerRows: 1,
|
||||
body: userTableBody
|
||||
},
|
||||
layout: 'headerLineOnly'
|
||||
return userTableJsonString;
|
||||
};
|
||||
|
||||
return userTableJsonString;
|
||||
};
|
||||
var getContent = function() {
|
||||
return [
|
||||
title,
|
||||
createUserList()
|
||||
];
|
||||
};
|
||||
|
||||
var getContent = function() {
|
||||
return [
|
||||
title,
|
||||
createUserList()
|
||||
];
|
||||
return {
|
||||
getContent: getContent
|
||||
};
|
||||
};
|
||||
|
||||
return {
|
||||
getContent: getContent
|
||||
createInstance: createInstance
|
||||
};
|
||||
};
|
||||
|
||||
return {
|
||||
createInstance: createInstance
|
||||
};
|
||||
|
||||
}])
|
||||
}
|
||||
])
|
||||
|
||||
.factory('UserAccessDataListContentProvider', [
|
||||
'gettextCatalog',
|
||||
'PDFLayout',
|
||||
function(gettextCatalog, PDFLayout) {
|
||||
'Config',
|
||||
function(gettextCatalog, PDFLayout, Config) {
|
||||
|
||||
var createInstance = function(userList, groups, Config) {
|
||||
var createInstance = function(userList) {
|
||||
|
||||
var creadeUserHeadLine = function(user) {
|
||||
var titleLine = [];
|
||||
@ -256,14 +257,17 @@ angular.module('OpenSlidesApp.users.pdf', ['OpenSlidesApp.core.pdf'])
|
||||
|
||||
var getContent = function() {
|
||||
var content = [];
|
||||
angular.forEach(userList, function (user) {
|
||||
angular.forEach(userList, function (user, index) {
|
||||
content.push(creadeUserHeadLine(user));
|
||||
content.push(createAccessDataContent(user));
|
||||
content.push(createWelcomeText());
|
||||
content.push({
|
||||
text: '',
|
||||
pageBreak: 'after'
|
||||
});
|
||||
// No pagebreak after the last user
|
||||
if (index !== userList.length - 1) {
|
||||
content.push({
|
||||
text: '',
|
||||
pageBreak: 'after'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return [
|
||||
@ -280,5 +284,38 @@ angular.module('OpenSlidesApp.users.pdf', ['OpenSlidesApp.core.pdf'])
|
||||
createInstance: createInstance
|
||||
};
|
||||
}
|
||||
])
|
||||
|
||||
.factory('UserPdfExport', [
|
||||
'gettextCatalog',
|
||||
'UserListContentProvider',
|
||||
'UserAccessDataListContentProvider',
|
||||
'PdfMakeDocumentProvider',
|
||||
'PdfCreate',
|
||||
function (gettextCatalog, UserListContentProvider, UserAccessDataListContentProvider, PdfMakeDocumentProvider, PdfCreate) {
|
||||
return {
|
||||
exportUserList: function (users) {
|
||||
var filename = gettextCatalog.getString('List of participants') + '.pdf';
|
||||
var userListContentProvider = UserListContentProvider.createInstance(users);
|
||||
PdfMakeDocumentProvider.createInstance(userListContentProvider).then(
|
||||
function (documentProvider) {
|
||||
PdfCreate.download(documentProvider.getDocument(), filename);
|
||||
}
|
||||
);
|
||||
},
|
||||
exportUserAccessDataList: function (users) {
|
||||
var filename = gettextCatalog.getString('List of access data') + '.pdf';
|
||||
var userAccessDataListContentProvider = UserAccessDataListContentProvider.createInstance(
|
||||
users);
|
||||
PdfMakeDocumentProvider.createInstance(userAccessDataListContentProvider).then(
|
||||
function (documentProvider) {
|
||||
var noFooter = true;
|
||||
PdfCreate.download(documentProvider.getDocument(noFooter), filename);
|
||||
}
|
||||
);
|
||||
}
|
||||
};
|
||||
}
|
||||
]);
|
||||
|
||||
}());
|
||||
|
@ -478,6 +478,7 @@ angular.module('OpenSlidesApp.users.site', [
|
||||
'$scope',
|
||||
'$state',
|
||||
'$http',
|
||||
'$q',
|
||||
'ngDialog',
|
||||
'UserForm',
|
||||
'User',
|
||||
@ -485,19 +486,15 @@ angular.module('OpenSlidesApp.users.site', [
|
||||
'PasswordGenerator',
|
||||
'Projector',
|
||||
'ProjectionDefault',
|
||||
'UserListContentProvider',
|
||||
'Config',
|
||||
'UserAccessDataListContentProvider',
|
||||
'PdfMakeDocumentProvider',
|
||||
'gettextCatalog',
|
||||
'UserCsvExport',
|
||||
'osTableFilter',
|
||||
'osTableSort',
|
||||
'gettext',
|
||||
'PdfCreate',
|
||||
function($scope, $state, $http, ngDialog, UserForm, User, Group, PasswordGenerator, Projector, ProjectionDefault,
|
||||
UserListContentProvider, Config, UserAccessDataListContentProvider, PdfMakeDocumentProvider, gettextCatalog,
|
||||
UserCsvExport, osTableFilter, osTableSort, gettext, PdfCreate) {
|
||||
'UserPdfExport',
|
||||
function($scope, $state, $http, $q, ngDialog, UserForm, User, Group, PasswordGenerator, Projector, ProjectionDefault,
|
||||
Config, gettextCatalog, UserCsvExport, osTableFilter, osTableSort, gettext, UserPdfExport) {
|
||||
User.bindAll({}, $scope, 'users');
|
||||
Group.bindAll({where: {id: {'>': 1}}}, $scope, 'groups');
|
||||
$scope.$watch(function () {
|
||||
@ -685,18 +682,10 @@ angular.module('OpenSlidesApp.users.site', [
|
||||
|
||||
// Export as PDF
|
||||
$scope.pdfExportUserList = function () {
|
||||
var filename = gettextCatalog.getString("List of participants")+".pdf";
|
||||
var userListContentProvider = UserListContentProvider.createInstance($scope.usersFiltered, $scope.groups);
|
||||
var documentProvider = PdfMakeDocumentProvider.createInstance(userListContentProvider);
|
||||
PdfCreate.download(documentProvider.getDocument(), filename);
|
||||
UserPdfExport.exportUserList($scope.usersFiltered);
|
||||
};
|
||||
$scope.pdfExportUserAccessDataList = function () {
|
||||
var filename = gettextCatalog.getString("List of access data")+".pdf";
|
||||
var userAccessDataListContentProvider = UserAccessDataListContentProvider.createInstance(
|
||||
$scope.usersFiltered, $scope.groups, Config);
|
||||
var documentProvider = PdfMakeDocumentProvider.createInstance(userAccessDataListContentProvider);
|
||||
var noFooter = true;
|
||||
PdfCreate.download(documentProvider.getDocument(noFooter), filename);
|
||||
UserPdfExport.exportUserAccessDataList($scope.usersFiltered);
|
||||
};
|
||||
// Export as a csv file
|
||||
$scope.csvExport = function () {
|
||||
@ -1506,7 +1495,7 @@ angular.module('OpenSlidesApp.users.site', [
|
||||
},
|
||||
function (error) {
|
||||
// Error: Username or password is not correct.
|
||||
$state.transitionTo($state.current, {msg: error.data.detail}, {
|
||||
$state.transitionTo($state.current, {msg: error.data.detail}, {
|
||||
reload: true, inherit: false, notify: true
|
||||
});
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user