diff --git a/openslides/assignments/static/js/assignments/pdf.js b/openslides/assignments/static/js/assignments/pdf.js index 4f5df21c8..0e34b44b3 100644 --- a/openslides/assignments/static/js/assignments/pdf.js +++ b/openslides/assignments/static/js/assignments/pdf.js @@ -266,14 +266,46 @@ angular.module('OpenSlidesApp.assignments.pdf', ['OpenSlidesApp.core.pdf']) ]) .factory('BallotContentProvider', [ + '$q', '$filter', 'gettextCatalog', 'PDFLayout', 'Config', 'User', - function($filter, gettextCatalog, PDFLayout, Config, User) { + 'ImageConverter', + function($q, $filter, gettextCatalog, PDFLayout, Config, User, ImageConverter) { var createInstance = function(assignment, poll, pollNumber) { + var logoAssignmentBallotPaperUrl = Config.get('logo_pdf_assignment_ballot_paper').value.path; + var imageMap = {}; + + // PDF header + var header = function() { + var columns = []; + + var text = Config.get('general_event_name').value + columns.push({ + text: text, + fontSize: 8, + alignment: 'left', + width: '80%' + }); + + // logo + columns.push({ + image: imageMap[logoAssignmentBallotPaperUrl].data, + fit: [90,25], + width: '20%' + }); + return { + color: '#555', + fontSize: 10, + margin: [30, 10, 10, 0], // [left, top, right, bottom] + columns: columns, + columnGap: 5 + }; + }; + // page title var createTitle = function() { return { @@ -351,11 +383,12 @@ angular.module('OpenSlidesApp.assignments.pdf', ['OpenSlidesApp.core.pdf']) // since it is not possible to give a column a fixed height, we draw an "empty" column // with a one px width and a fixed top-margin return { - columns : [ + columns: [ + header(), { width: 1, margin: [0, marginTop], - text: "" + text: '', }, { width: '*', @@ -363,8 +396,8 @@ angular.module('OpenSlidesApp.assignments.pdf', ['OpenSlidesApp.core.pdf']) createTitle(), createPollHint(), createSelectionField(), - ] - } + ], + }, ] }; }; @@ -473,9 +506,17 @@ angular.module('OpenSlidesApp.assignments.pdf', ['OpenSlidesApp.core.pdf']) return createContentTable(); }; - return { - getContent: getContent - }; + return $q(function (resolve) { + var imageSources = [ + logoAssignmentBallotPaperUrl, + ]; + ImageConverter.toBase64(imageSources).then(function (_imageMap) { + imageMap = _imageMap; + resolve({ + getContent: getContent + }); + }); + }); }; return { @@ -610,9 +651,10 @@ angular.module('OpenSlidesApp.assignments.pdf', ['OpenSlidesApp.core.pdf']) } }); 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); + BallotContentProvider.createInstance(assignment, thePoll, pollNumber).then(function (ballotContentProvider) { + var documentProvider = PdfMakeBallotPaperProvider.createInstance(ballotContentProvider); + PdfCreate.download(documentProvider.getDocument(), filename); + }); }, }; } diff --git a/openslides/core/config_variables.py b/openslides/core/config_variables.py index c43354e8a..96e628d4b 100644 --- a/openslides/core/config_variables.py +++ b/openslides/core/config_variables.py @@ -250,9 +250,11 @@ def get_config_variables(): default_value=[ 'logo_projector_main', 'logo_projector_header', + 'logo_web_header', 'logo_pdf_header', 'logo_pdf_footer', - 'logo_web_header'], + 'logo_pdf_assignment_ballot_paper', + 'logo_pdf_motion_poll'], weight=300, group='Logo', hidden=True) @@ -277,6 +279,16 @@ def get_config_variables(): group='Logo', hidden=True) + yield ConfigVariable( + name='logo_web_header', + default_value={ + 'display_name': 'Web interface header logo', + 'path': ''}, + input_type='logo', + weight=303, + group='Logo', + hidden=True) + # PDF logos yield ConfigVariable( name='logo_pdf_header', @@ -299,11 +311,21 @@ def get_config_variables(): hidden=True) yield ConfigVariable( - name='logo_web_header', + name='logo_pdf_assignment_ballot_paper', default_value={ - 'display_name': 'Web interface header logo', + 'display_name': 'Election ballot paper', 'path': ''}, input_type='logo', - weight=311, + weight=312, + group='Logo', + hidden=True) + + yield ConfigVariable( + name='logo_pdf_motion_poll', + default_value={ + 'display_name': 'Motion poll', + 'path': ''}, + input_type='logo', + weight=313, group='Logo', hidden=True) diff --git a/openslides/core/static/templates/index.html b/openslides/core/static/templates/index.html index e1ff6f6e1..a57ef9f3e 100644 --- a/openslides/core/static/templates/index.html +++ b/openslides/core/static/templates/index.html @@ -29,8 +29,8 @@
- OpenSlides Logo - Logo + OpenSlides Logo + OpenSlides Logo
diff --git a/openslides/motions/static/js/motions/pdf.js b/openslides/motions/static/js/motions/pdf.js index 3fa126ee3..e1061bf29 100644 --- a/openslides/motions/static/js/motions/pdf.js +++ b/openslides/motions/static/js/motions/pdf.js @@ -540,11 +540,13 @@ angular.module('OpenSlidesApp.motions.pdf', ['OpenSlidesApp.core.pdf']) ]) .factory('PollContentProvider', [ + '$q', 'PDFLayout', 'gettextCatalog', 'Config', 'User', - function(PDFLayout, gettextCatalog, Config, User) { + 'ImageConverter', + function($q, PDFLayout, gettextCatalog, Config, User, ImageConverter) { /** * Generates a content provider for polls * @constructor @@ -553,6 +555,36 @@ angular.module('OpenSlidesApp.motions.pdf', ['OpenSlidesApp.core.pdf']) */ var createInstance = function(title, id) { + var logoMotionPollUrl = Config.get('logo_pdf_motion_poll').value.path; + var imageMap = {}; + + // PDF header + var header = function() { + var columns = []; + + var text = Config.get('general_event_name').value + columns.push({ + text: text, + fontSize: 8, + alignment: 'left', + width: '80%' + }); + + // logo + columns.push({ + image: imageMap[logoMotionPollUrl].data, + fit: [90,25], + width: '20%' + }); + return { + color: '#555', + fontSize: 10, + margin: [30, 10, 10, 0], // [left, top, right, bottom] + columns: columns, + columnGap: 5 + }; + }; + /** * Returns a single section on the ballot paper * @function @@ -560,18 +592,21 @@ angular.module('OpenSlidesApp.motions.pdf', ['OpenSlidesApp.core.pdf']) var createSection = function() { var sheetend = 75; return { - stack: [{ - text: gettextCatalog.getString("Motion") + " " + id, - style: 'title', - }, { - text: title, - style: 'description' - }, - PDFLayout.createBallotEntry(gettextCatalog.getString("Yes")), - PDFLayout.createBallotEntry(gettextCatalog.getString("No")), - PDFLayout.createBallotEntry(gettextCatalog.getString("Abstain")), + stack: [ + header(), + { + text: gettextCatalog.getString('Motion') + ' ' + id, + style: 'title', + }, + { + text: title, + style: 'description' + }, + PDFLayout.createBallotEntry(gettextCatalog.getString('Yes')), + PDFLayout.createBallotEntry(gettextCatalog.getString('No')), + PDFLayout.createBallotEntry(gettextCatalog.getString('Abstain')), ], - margin: [0, 0, 0, sheetend] + margin: [0, 0, 0, sheetend], }; }; @@ -642,9 +677,17 @@ angular.module('OpenSlidesApp.motions.pdf', ['OpenSlidesApp.core.pdf']) return content; }; - return { - getContent: getContent, - }; + return $q(function (resolve) { + var imageSources = [ + logoMotionPollUrl, + ]; + ImageConverter.toBase64(imageSources).then(function (_imageMap) { + imageMap = _imageMap; + resolve({ + getContent: getContent + }); + }); + }); }; return { createInstance: createInstance @@ -944,9 +987,10 @@ angular.module('OpenSlidesApp.motions.pdf', ['OpenSlidesApp.core.pdf']) var id = motion.identifier.replace(' ', ''); var title = motion.getTitle(version); var filename = gettextCatalog.getString('Motion') + '-' + id + '-' + gettextCatalog.getString('ballot-paper') + '.pdf'; - var pollContentProvider = PollContentProvider.createInstance(title, id); - var documentProvider = PdfMakeBallotPaperProvider.createInstance(pollContentProvider); - PdfCreate.download(documentProvider.getDocument(), filename); + PollContentProvider.createInstance(title, id).then(function (pollContentProvider) { + var documentProvider = PdfMakeBallotPaperProvider.createInstance(pollContentProvider); + PdfCreate.download(documentProvider.getDocument(), filename); + }); }, exportPersonalNote: function (motion, filename) { var personalNote = PersonalNoteManager.getNote(motion);