Erste Version Dokumentenliste und Bearbeitung (#16)

parent 58f72c1e
......@@ -100,14 +100,14 @@ class localDocMGMT extends DocMGMT {
if(!is_writable($pdf_dir)) throw new Exception("Fehlende Schreibberechtigung in '$pdf_dir'");
$filePathOld = $pdf_dir . DIRECTORY_SEPARATOR . $processID . DIRECTORY_SEPARATOR . $fileRef;
$filePathNew = $pdf_dir . DIRECTORY_SEPARATOR . $processID . DIRECTORY_SEPARATOR . $fileName;
# Sonderzeichen entschärfen
$fileName = str_replace('.pdf', '', $fileName);
$fileName = preg_replace('/[^A-Za-z0-9_\-]/', '_', $fileName);
$fileName .= '.pdf';
$filePathOld = $pdf_dir . DIRECTORY_SEPARATOR . $processID . DIRECTORY_SEPARATOR . $fileRef;
$filePathNew = $pdf_dir . DIRECTORY_SEPARATOR . $processID . DIRECTORY_SEPARATOR . $fileName;
if($filePathOld !== $filePathNew && file_exists($filePathNew)) {
$fileName = time() . $fileName;
$filePathNew = $pdf_dir . DIRECTORY_SEPARATOR . $processID . DIRECTORY_SEPARATOR . $fileName;
......
......@@ -506,6 +506,24 @@ Art. 25 DSGVO Datenschutz durch Technikgestaltung und durch datenschutzfreundlic
</ul>
</div>
<div class="col-sm-offset-1 col-sm-10 printHide">
<h6 class="info-text text-ul-dot">Angehängte Dokumente</h6>
<p>Hier können vorhandene Dokumente im PDF-Format an die Dokumentation angehangen und hinterlegt werden.</p>
<table id="attached_documents" class="table table-hover btn-table">
<thead>
<tr>
<th>Dateireferenz</th>
<th>Beschreibung</th>
<th>Letzte Aktualisierung</th>
<th></th>
</tr>
</thead>
<tbody>
</tbody>
</table>
<button type="button" id="attached_documents_add" class="btn btn-wd btn-success"><i class="fa fa-plus"></i> Hinzufügen</button>
</div>
<div class="col-sm-offset-1 col-sm-10 printHide">
<h6 class="info-text text-ul-dot">Zugriffsberechtigungen innerhalb von SecDoc</h6>
<p>Hier können Berechtigungen zum Lesen und/oder Bearbeiten festgelegt werden, um beispielsweise Kollegen die Mitarbeit in SecDoc zu ermöglichen. Eingetragene Nutzer oder Gruppen bekommen Lesezugriff. Optional kann auch Schreibzugriff gewährt werden. <em>Der/die Datenschutzbeauftragte kann unabhängig von den hier getätigten Einstellungen alle Informationen einsehen.</em></p>
......
......@@ -501,6 +501,24 @@ Art. 25 DSGVO Datenschutz durch Technikgestaltung und durch datenschutzfreundlic
</ul>
</div>
<div class="col-sm-offset-1 col-sm-10 printHide">
<h6 class="info-text text-ul-dot">Angehängte Dokumente</h6>
<p>Hier können vorhandene Dokumente im PDF-Format an die Dokumentation angehangen und hinterlegt werden.</p>
<table id="attached_documents" class="table table-hover btn-table">
<thead>
<tr>
<th>Dateireferenz</th>
<th>Beschreibung</th>
<th>Letzte Aktualisierung</th>
<th></th>
</tr>
</thead>
<tbody>
</tbody>
</table>
<button type="button" id="attached_documents_add" class="btn btn-wd btn-success"><i class="fa fa-plus"></i> Hinzufügen</button>
</div>
<div class="col-sm-offset-1 col-sm-10 printHide">
<h6 class="info-text text-ul-dot">Zugriffsberechtigungen innerhalb von SecDoc</h6>
<p>Hier können Berechtigungen zum Lesen und/oder Bearbeiten festgelegt werden, um beispielsweise Kollegen die Mitarbeit in SecDoc zu ermöglichen. Eingetragene Nutzer oder Gruppen bekommen Lesezugriff. Optional kann auch Schreibzugriff gewährt werden. <em>Der/die Datenschutzbeauftragte kann unabhängig von den hier getätigten Einstellungen alle Informationen einsehen.</em></p>
......
......@@ -189,6 +189,24 @@ Art. 25 DSGVO Datenschutz durch Technikgestaltung und durch datenschutzfreundlic
</ul>
</div>
<div class="col-sm-offset-1 col-sm-10 printHide">
<h6 class="info-text text-ul-dot">Angehängte Dokumente</h6>
<p>Hier können vorhandene Dokumente im PDF-Format an die Dokumentation angehangen und hinterlegt werden.</p>
<table id="attached_documents" class="table table-hover btn-table">
<thead>
<tr>
<th>Dateireferenz</th>
<th>Beschreibung</th>
<th>Letzte Aktualisierung</th>
<th></th>
</tr>
</thead>
<tbody>
</tbody>
</table>
<button type="button" id="attached_documents_add" class="btn btn-wd btn-success"><i class="fa fa-plus"></i> Hinzufügen</button>
</div>
<div class="col-sm-offset-1 col-sm-10 printHide">
<h6 class="info-text text-ul-dot">Zugriffsberechtigungen innerhalb von SecDoc</h6>
<p>Hier können Berechtigungen zum Lesen und/oder Bearbeiten festgelegt werden, um beispielsweise Kollegen die Mitarbeit in SecDoc zu ermöglichen. Eingetragene Nutzer oder Gruppen bekommen Lesezugriff. Optional kann auch Schreibzugriff gewährt werden. <em>Der/die Datenschutzbeauftragte kann unabhängig von den hier getätigten Einstellungen alle Informationen einsehen.</em></p>
......
......@@ -633,6 +633,24 @@ Art. 35 DSGVO" class="fa fa-question-circle-o fa-lg"></i></h6>
</ul>
</div>
<div class="col-sm-offset-1 col-sm-10 printHide">
<h6 class="info-text text-ul-dot">Angehängte Dokumente</h6>
<p>Hier können vorhandene Dokumente im PDF-Format an die Dokumentation angehangen und hinterlegt werden.</p>
<table id="attached_documents" class="table table-hover btn-table">
<thead>
<tr>
<th>Dateireferenz</th>
<th>Beschreibung</th>
<th>Letzte Aktualisierung</th>
<th></th>
</tr>
</thead>
<tbody>
</tbody>
</table>
<button type="button" id="attached_documents_add" class="btn btn-wd btn-success"><i class="fa fa-plus"></i> Hinzufügen</button>
</div>
<div class="col-sm-offset-1 col-sm-10 printHide">
<h6 class="info-text text-ul-dot">Zugriffsberechtigungen innerhalb von SecDoc</h6>
<p>Hier können Berechtigungen zum Lesen und/oder Bearbeiten festgelegt werden, um beispielsweise Kollegen die Mitarbeit in SecDoc zu ermöglichen. Eingetragene Nutzer oder Gruppen bekommen Lesezugriff. Optional kann auch Schreibzugriff gewährt werden. <em>Der/die Datenschutzbeauftragte kann unabhängig von den hier getätigten Einstellungen alle Informationen einsehen.</em></p>
......
......@@ -1968,11 +1968,11 @@ function toggleTOMList(evt) {
* Zeigt den Dokumenten-Verwaltungs-Dialog an.
*
* @param {Number} docID (optional) Dokumenten-ID
* @param {String} filename (optional) Dateiname
* @param {String} fileref (optional) Dateiname
* @param {String} description (optional) Dokumenten-Beschreibung
* @return {undefined}
*/
function showDocumentAddDialog(docID = -1, filename = '', description = '') {
function showDocumentAddDialog(docID = -1, fileref = '', description = '') {
/**
* Läd eine ausgewählte Datei hoch als Base64 String.
*
......@@ -1988,7 +1988,7 @@ function showDocumentAddDialog(docID = -1, filename = '', description = '') {
if(file === undefined) {
$.post(backendPath, JSON.stringify({'action': 'updateDocument', 'debug': debug, 'data': {'docid': docID, 'description': description}})).done(function(data) {
if(data['success']) {
// TODO Reload Doc Table
loadDocuments();
modal.modal('hide');
}
else {
......@@ -2006,7 +2006,7 @@ function showDocumentAddDialog(docID = -1, filename = '', description = '') {
reader.onload = function () {
$.post(backendPath, JSON.stringify({'action': (docID === -1 ? 'addDocument' : 'updateDocument'), 'id': loadId, 'debug': debug, 'data': {'filename': file.name, 'filecontent': reader.result.split(',')[1], 'docid': docID, 'description': description}})).done(function(data) {
if(data['success']) {
// TODO Reload Doc Table
loadDocuments();
modal.modal('hide');
}
else {
......@@ -2028,10 +2028,10 @@ function showDocumentAddDialog(docID = -1, filename = '', description = '') {
modal.find('.modal-title').text('Dokumenten-Verwaltung');
let modalBody = modal.find('.modal-body');
if(docID === -1) {
modalBody.html('<div><p>Hier kann ein PDF-Dokument zum Anhängen und eine optionale Beschreibung ausgwählt werden.</p><div class="form-group text-center"><label>Beschreibung</label><textarea class="form-control" id="filedesc"></textarea></div><div class="text-center form-group"><label for="uploadFile">Neues PDF-Dokument zum Anhängen auswählen</label><input type="file" id="uploadFile" accept=".pdf,application/pdf" class="btn center-block hidden" /><div id="dropFile" class="text-center alert alert-info"></div><p><strong>Ausgewählte Datei:</strong> <span id="filename">Keine</span></p><p><button id="filesave" class=btn btn-fill btn-success">Speichern</button></p></div></div>');
modalBody.html('<div><p>Hier kann ein PDF-Dokument zum Anhängen und eine optionale Beschreibung ausgwählt werden.</p><div class="form-group text-center"><label>Beschreibung</label><textarea class="form-control" id="filedesc" placeholder="Beschreibt den Inhalt des Dokuments"></textarea></div><div class="text-center form-group"><label for="uploadFile">Neues PDF-Dokument zum Anhängen auswählen</label><input type="file" id="uploadFile" accept=".pdf,application/pdf" class="btn center-block hidden" /><div id="dropFile" class="text-center alert alert-info"></div><p><strong>Ausgewählte Datei:</strong> <span id="filename">Keine</span></p><p><button id="filesave" class=btn btn-fill btn-success">Speichern</button></p></div></div>');
}
else {
modalBody.html('<div><p>Bitte wählen Sie ein neues PDF-Dokument zum Ersetzen von "' + filename + '" aus oder passen Sie die Beschreibung an.</p><div class="form-group text-center"><label>Beschreibung</label><textarea class="form-control" id="filedesc"></textarea></div><div class="text-center form-group"><label for="uploadFile">Neues PDF-Dokument zum Ersetzen auswählen</label><input type="file" id="uploadFile" accept=".pdf,application/pdf" class="btn center-block hidden" /><div id="dropFile" class="text-center alert alert-info"></div><p><strong>Ausgewählte Datei:</strong> <span id="filename">Keine</span></p><p><button id="filesave" class=btn btn-fill btn-success">Speichern</button></p></div></div>');
modalBody.html('<div><p>Bitte wählen Sie ein neues PDF-Dokument zum Ersetzen von "' + fileref + '" aus oder passen Sie die Beschreibung an.</p><div class="form-group text-center"><label>Beschreibung</label><textarea class="form-control" id="filedesc" placeholder="Beschreibt den Inhalt des Dokuments"></textarea></div><div class="text-center form-group"><label for="uploadFile">Neues PDF-Dokument zum Ersetzen auswählen</label><input type="file" id="uploadFile" accept=".pdf,application/pdf" class="btn center-block hidden" /><div id="dropFile" class="text-center alert alert-info"></div><p><strong>Ausgewählte Datei:</strong> <span id="filename">Keine</span></p><p><button id="filesave" class=btn btn-fill btn-success">Speichern</button></p></div></div>');
$('#filedesc').val(description);
}
......@@ -2077,6 +2077,80 @@ function showDocumentAddDialog(docID = -1, filename = '', description = '') {
setOverlay(false);
}
function loadDocuments() {
$.get(backendPath, { 'action': 'listDocuments', 'id': loadId, 'debug': debug }).done(function(data) {
if(!data['success']) {
showError('Laden der angehängten Dokumente', data['error']);
return;
}
$('#attached_documents').find('tbody').empty();
data['data'].forEach((val, idx) => {
$('#attached_documents').find('tbody').append('<tr><td>' + htmlEncode(val['FileRef']) + '</td><td>' + htmlEncode(val['Description']) + '</td><td>' + htmlEncode(val['Date']) + '</td><td class="text-center"><div class="btn-group"><button type="button" class="attached_documents_show btn" data-docid="' + val['DocID'] + '">Anzeigen</button><button type="button" class="attached_documents_edit btn btn-warning" data-docid="' + val['DocID'] + '" data-docdesc="' + val['Description'] + '" data-fileref="' + val['FileRef'] + '"><i class="fa fa-pencil-square-o"></i> Bearbeiten</button><button type="button" class="attached_documents_del btn btn-danger" data-docid="' + val['DocID'] + '"><i class="fa fa-minus"></i> Löschen</button></div></td></tr>');
});
$('#attached_documents').find('.attached_documents_show').click((evt) => {
setOverlay();
$.post(backendPath, JSON.stringify({'action': 'getDocument', 'debug': debug, 'data': {'docid': parseInt($(evt.target).data('docid'))}})).done((data) => {
if(!data['success']) {
showError('Laden der PDF', data['error']);
return;
}
// Base64 Kodierung umkehren und Blob zum Download erstellen
let pdfData = atob(data['data']['fileContent'].replace(/\s/g, ''));
let pdfBuffer = new Uint8Array(new ArrayBuffer(pdfData.length));
for(let i=0; i < pdfData.length; i++) {
pdfBuffer[i] = pdfData.charCodeAt(i);
}
let blob = new Blob([pdfBuffer], {type: "application/pdf"});
let fileTitle = data['data']['fileName'];
// PDF-Anzeige starten (Unterscheidung, ob Edge genutzt wird)
if(window.navigator && window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveOrOpenBlob(blob, fileTitle);
}
else {
let url = window.URL.createObjectURL(blob);
let download = $('<a></a>');
download.attr('href', url).attr('download', fileTitle).addClass('hidden');;
$('body').append(download);
download[0].click();
window.URL.revokeObjectURL(url);
download.remove();
}
}).fail((jqXHR, error, errorThrown) => {
showError('Laden der PDF-Datei', false, {'jqXHR': jqXHR, 'error': error, 'errorThrown': errorThrown});
}).always(() => {
setOverlay(false);
});
});
$('#attached_documents').find('.attached_documents_edit').click((evt) => {
showDocumentAddDialog(parseInt($(evt.target).data('docid')), $(evt.target).data('fileref'), $(evt.target).data('docdesc'));
});
$('#attached_documents').find('.attached_documents_del').click((evt) => {
setOverlay();
$.post(backendPath, JSON.stringify({'action': 'deleteDocument', 'debug': debug, 'data': {'docid': parseInt($(evt.target).data('docid'))}})).done(function(data) {
if(!data['success']) {
showError('Löschen eines angehängten Dokuments', data['error']);
}
else {
loadDocuments();
}
}).fail((jqXHR, error, errorThrown) => {
showError('Löschen eines angehängten Dokuments', false, {'jqXHR': jqXHR, 'error': error, 'errorThrown': errorThrown});
}).always(() => {
setOverlay(false);
});
});
}).fail((jqXHR, error, errorThrown) => {
showError('Laden der angehängten Dokumente', false, {'jqXHR': jqXHR, 'error': error, 'errorThrown': errorThrown});
});
}
debugLog('Beginne Setup...');
// Abwarten, bis alle notwendigen Daten über AJAX-Requests geholt wurden
......@@ -2349,6 +2423,9 @@ Promise.all(promises).then(function() {
filterTOMList(parseInt($(this).val()));
});
// Angehängte Dokumente laden
loadDocuments();
console.timeEnd('Dynamische Inhalte initialisieren');
/*
......@@ -2465,6 +2542,11 @@ Promise.all(promises).then(function() {
}
});
// Button für neue angehängte Dokumente
$('#attached_documents_add').click(() => {
showDocumentAddDialog();
});
console.timeEnd('Spezielle Handler initialisieren');
// Verfahren laden, falls ID in der URL übergeben
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment