464 lines
21 KiB
JavaScript
464 lines
21 KiB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
};
|
|
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
function step(op) {
|
|
if (f) throw new TypeError("Generator is already executing.");
|
|
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
switch (op[0]) {
|
|
case 0: case 1: t = op; break;
|
|
case 4: _.label++; return { value: op[1], done: false };
|
|
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
default:
|
|
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
if (t[2]) _.ops.pop();
|
|
_.trys.pop(); continue;
|
|
}
|
|
op = body.call(thisArg, _);
|
|
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
}
|
|
};
|
|
var List = PSPDFKit.Immutable.List;
|
|
var Rect = PSPDFKit.Geometry.Rect;
|
|
var SignatureFormField = PSPDFKit.FormFields.SignatureFormField;
|
|
var _a = PSPDFKit.ElectronicSignatureCreationMode, DRAW = _a.DRAW, TYPE = _a.TYPE;
|
|
var DISABLED = PSPDFKit.AutoSaveMode.DISABLED;
|
|
var App = /** @class */ (function () {
|
|
function App() {
|
|
}
|
|
// This function will be called in the ShowEnvelope.razor page
|
|
// and will trigger loading of the Editor Interface
|
|
App.init = function (container, envelopeKey) {
|
|
return __awaiter(this, void 0, void 0, function () {
|
|
var envelopeObject, arrayBuffer, e_1, _a, annotations, createdAnnotations;
|
|
return __generator(this, function (_b) {
|
|
switch (_b.label) {
|
|
case 0:
|
|
// Initialize classes
|
|
console.debug("Initializing classes..");
|
|
App.UI = new UI();
|
|
App.Network = new Network();
|
|
App.Annotation = new Annotation();
|
|
// Load the envelope from the database
|
|
console.debug("Loading envelope from database..");
|
|
return [4 /*yield*/, App.Network.getEnvelope(envelopeKey)];
|
|
case 1:
|
|
envelopeObject = _b.sent();
|
|
console.debug(envelopeObject);
|
|
App.envelopeKey = envelopeKey;
|
|
App.currentDocument = envelopeObject.envelope.documents[0];
|
|
// Load the document from the filestore
|
|
console.debug("Loading document from filestore");
|
|
_b.label = 2;
|
|
case 2:
|
|
_b.trys.push([2, 4, , 5]);
|
|
return [4 /*yield*/, App.Network.getDocument(envelopeKey, App.currentDocument.id)];
|
|
case 3:
|
|
arrayBuffer = _b.sent();
|
|
return [3 /*break*/, 5];
|
|
case 4:
|
|
e_1 = _b.sent();
|
|
console.error(e_1);
|
|
return [3 /*break*/, 5];
|
|
case 5:
|
|
// Load PSPDFKit
|
|
console.debug("Loading PSPDFKit..");
|
|
_a = App;
|
|
return [4 /*yield*/, App.UI.loadPSPDFKit(arrayBuffer, container)];
|
|
case 6:
|
|
_a.Instance = _b.sent();
|
|
App.UI.configurePSPDFKit(this.Instance, App.handleClick);
|
|
// Load annotations into PSPDFKit
|
|
console.debug("Loading annotations..");
|
|
annotations = App.Annotation.createAnnotations(App.currentDocument);
|
|
return [4 /*yield*/, App.Instance.create(annotations)];
|
|
case 7:
|
|
createdAnnotations = _b.sent();
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
});
|
|
};
|
|
App.handleClick = function (eventType) {
|
|
return __awaiter(this, void 0, void 0, function () {
|
|
var result, _a;
|
|
return __generator(this, function (_b) {
|
|
switch (_b.label) {
|
|
case 0:
|
|
result = false;
|
|
_a = eventType;
|
|
switch (_a) {
|
|
case "RESET": return [3 /*break*/, 1];
|
|
case "FINISH": return [3 /*break*/, 3];
|
|
}
|
|
return [3 /*break*/, 5];
|
|
case 1: return [4 /*yield*/, App.handleReset(null)];
|
|
case 2:
|
|
result = _b.sent();
|
|
if (result == true) {
|
|
alert("Dokument zurückgesetzt!");
|
|
}
|
|
else {
|
|
alert("Fehler beim Zurücksetzen des Dokuments!");
|
|
}
|
|
return [3 /*break*/, 5];
|
|
case 3: return [4 /*yield*/, App.handleFinish(null)];
|
|
case 4:
|
|
result = _b.sent();
|
|
if (result == true) {
|
|
// TODO: Redirect to success page
|
|
alert("Dokument erfolgreich signiert!");
|
|
}
|
|
else {
|
|
alert("Fehler beim Abschließen des Dokuments!");
|
|
}
|
|
return [3 /*break*/, 5];
|
|
case 5: return [2 /*return*/];
|
|
}
|
|
});
|
|
});
|
|
};
|
|
App.handleFinish = function (event) {
|
|
return __awaiter(this, void 0, void 0, function () {
|
|
var e_2, json, postEnvelopeResult, e_3, buffer, postDocumentResult, e_4;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0:
|
|
_a.trys.push([0, 2, , 3]);
|
|
return [4 /*yield*/, App.Instance.save()];
|
|
case 1:
|
|
_a.sent();
|
|
return [3 /*break*/, 3];
|
|
case 2:
|
|
e_2 = _a.sent();
|
|
console.error(e_2);
|
|
return [2 /*return*/, false];
|
|
case 3:
|
|
_a.trys.push([3, 6, , 7]);
|
|
return [4 /*yield*/, App.Instance.exportInstantJSON()];
|
|
case 4:
|
|
json = _a.sent();
|
|
return [4 /*yield*/, App.Network.postEnvelope(App.envelopeKey, App.currentDocument.id, JSON.stringify(json))];
|
|
case 5:
|
|
postEnvelopeResult = _a.sent();
|
|
if (postEnvelopeResult === false) {
|
|
return [2 /*return*/, false];
|
|
}
|
|
return [3 /*break*/, 7];
|
|
case 6:
|
|
e_3 = _a.sent();
|
|
console.error(e_3);
|
|
return [2 /*return*/, false];
|
|
case 7:
|
|
_a.trys.push([7, 10, , 11]);
|
|
return [4 /*yield*/, App.Instance.exportPDF({ flatten: true })];
|
|
case 8:
|
|
buffer = _a.sent();
|
|
return [4 /*yield*/, App.Network.postDocument(App.envelopeKey, App.currentDocument.id, buffer)];
|
|
case 9:
|
|
postDocumentResult = _a.sent();
|
|
if (postDocumentResult === false) {
|
|
return [2 /*return*/, false];
|
|
}
|
|
return [3 /*break*/, 11];
|
|
case 10:
|
|
e_4 = _a.sent();
|
|
console.error(e_4);
|
|
return [2 /*return*/, false];
|
|
case 11: return [2 /*return*/, true];
|
|
}
|
|
});
|
|
});
|
|
};
|
|
App.handleReset = function (event) {
|
|
return __awaiter(this, void 0, void 0, function () {
|
|
var result;
|
|
return __generator(this, function (_a) {
|
|
if (confirm("Wollen Sie das Dokument und alle erstellten Signaturen zurücksetzen?")) {
|
|
result = App.Annotation.deleteAnnotations(App.Instance);
|
|
return [2 /*return*/, true];
|
|
}
|
|
else {
|
|
return [2 /*return*/, true];
|
|
}
|
|
return [2 /*return*/];
|
|
});
|
|
});
|
|
};
|
|
App.downloadDocument = function () {
|
|
return __awaiter(this, void 0, void 0, function () {
|
|
function downloadPdf(blob) {
|
|
var a = document.createElement("a");
|
|
a.href = blob;
|
|
a.style.display = "none";
|
|
a.download = "download.pdf";
|
|
a.setAttribute("download", "download.pdf");
|
|
document.body.appendChild(a);
|
|
a.click();
|
|
document.body.removeChild(a);
|
|
}
|
|
var buffer, supportsDownloadAttribute, blob, reader_1, objectUrl;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0: return [4 /*yield*/, App.Instance.exportPDF({ flatten: true })];
|
|
case 1:
|
|
buffer = _a.sent();
|
|
supportsDownloadAttribute = HTMLAnchorElement.prototype.hasOwnProperty("download");
|
|
blob = new Blob([buffer], { type: "application/pdf" });
|
|
if (!supportsDownloadAttribute) {
|
|
reader_1 = new FileReader();
|
|
reader_1.onloadend = function () {
|
|
var dataUrl = reader_1.result;
|
|
downloadPdf(dataUrl);
|
|
};
|
|
reader_1.readAsDataURL(blob);
|
|
}
|
|
else {
|
|
objectUrl = window.URL.createObjectURL(blob);
|
|
downloadPdf(objectUrl);
|
|
window.URL.revokeObjectURL(objectUrl);
|
|
}
|
|
return [2 /*return*/];
|
|
}
|
|
});
|
|
});
|
|
};
|
|
return App;
|
|
}());
|
|
export { App };
|
|
var Annotation = /** @class */ (function () {
|
|
function Annotation() {
|
|
}
|
|
Annotation.prototype.createAnnotations = function (document) {
|
|
var _this = this;
|
|
var annotations = [];
|
|
document.elements.forEach(function (element) {
|
|
console.log("Creating annotation for element", element.id);
|
|
var _a = _this.createAnnotationFromElement(element), annotation = _a[0], formField = _a[1];
|
|
annotations.push(annotation);
|
|
annotations.push(formField);
|
|
});
|
|
return annotations;
|
|
};
|
|
Annotation.prototype.deleteAnnotations = function (instance) {
|
|
return __awaiter(this, void 0, void 0, function () {
|
|
var pageAnnotations;
|
|
return __generator(this, function (_a) {
|
|
switch (_a.label) {
|
|
case 0: return [4 /*yield*/, Promise.all(Array.from({ length: instance.totalPageCount }).map(function (_, pageIndex) {
|
|
return instance.getAnnotations(pageIndex);
|
|
}))];
|
|
case 1:
|
|
pageAnnotations = (_a.sent()).flatMap(function (annotations) {
|
|
return annotations.reduce(function (acc, annotation) { return acc.concat(annotation); }, []);
|
|
}).filter(function (annotation) { return !!annotation.isSignature; });
|
|
return [4 /*yield*/, instance.delete(pageAnnotations)];
|
|
case 2:
|
|
//deleting all Annotations
|
|
return [2 /*return*/, _a.sent()];
|
|
}
|
|
});
|
|
});
|
|
};
|
|
Annotation.prototype.createAnnotationFromElement = function (element) {
|
|
var id = PSPDFKit.generateInstantId();
|
|
var width = this.inchToPoint(element.width);
|
|
var height = this.inchToPoint(element.height);
|
|
var top = this.inchToPoint(element.top) - (height / 2);
|
|
var left = this.inchToPoint(element.left) - (width / 2);
|
|
var page = element.page - 1;
|
|
var annotation = this.createSignatureAnnotation(id, width, height, top, left, page);
|
|
console.log(annotation);
|
|
var formField = new SignatureFormField({
|
|
name: id,
|
|
annotationIds: List([annotation.id])
|
|
});
|
|
console.log(formField);
|
|
return [annotation, formField];
|
|
};
|
|
Annotation.prototype.createSignatureAnnotation = function (id, width, height, top, left, pageIndex) {
|
|
var annotation = new PSPDFKit.Annotations.WidgetAnnotation({
|
|
id: id,
|
|
pageIndex: pageIndex,
|
|
formFieldName: id,
|
|
boundingBox: new Rect({ width: width, height: height, top: top, left: left })
|
|
});
|
|
return annotation;
|
|
};
|
|
Annotation.prototype.inchToPoint = function (inch) {
|
|
return inch * 72;
|
|
};
|
|
return Annotation;
|
|
}());
|
|
var Network = /** @class */ (function () {
|
|
function Network() {
|
|
}
|
|
Network.prototype.getEnvelope = function (envelopeKey) {
|
|
return fetch("/api/envelope/".concat(envelopeKey), { credentials: "include" })
|
|
.then(function (res) { return res.json(); });
|
|
};
|
|
Network.prototype.getDocument = function (envelopeKey, documentId) {
|
|
return fetch("/api/document/".concat(envelopeKey, "?index=").concat(documentId), { credentials: "include" })
|
|
.then(function (res) { return res.arrayBuffer(); });
|
|
};
|
|
Network.prototype.postDocument = function (envelopeKey, documentId, buffer) {
|
|
var url = "/api/document/".concat(envelopeKey, "/").concat(documentId);
|
|
var options = {
|
|
credentials: "include",
|
|
method: "POST",
|
|
body: buffer
|
|
};
|
|
console.debug("PostDocument/Calling url: " + url);
|
|
return fetch(url, options)
|
|
.then(this.handleResponse)
|
|
.then(function (res) {
|
|
if (!res.ok) {
|
|
return false;
|
|
}
|
|
;
|
|
return true;
|
|
});
|
|
};
|
|
Network.prototype.postEnvelope = function (envelopeKey, documentId, jsonString) {
|
|
var url = "/api/envelope/".concat(envelopeKey, "?index=").concat(documentId);
|
|
var options = {
|
|
credentials: "include",
|
|
method: "POST",
|
|
body: jsonString
|
|
};
|
|
console.debug("PostEnvelope/Calling url: " + url);
|
|
return fetch(url, options)
|
|
.then(this.handleResponse)
|
|
.then(function (res) {
|
|
if (!res.ok) {
|
|
return false;
|
|
}
|
|
;
|
|
return true;
|
|
});
|
|
};
|
|
Network.prototype.handleResponse = function (res) {
|
|
if (!res.ok) {
|
|
console.log("Request failed with status ".concat(res.status));
|
|
return res;
|
|
}
|
|
else {
|
|
return res;
|
|
}
|
|
};
|
|
return Network;
|
|
}());
|
|
var UI = /** @class */ (function () {
|
|
function UI() {
|
|
this.allowedToolbarItems = [
|
|
"sidebar-thumbnails",
|
|
"sidebar-document-ouline",
|
|
"sidebar-bookmarks",
|
|
"pager",
|
|
"pan",
|
|
"zoom-out",
|
|
"zoom-in",
|
|
"zoom-mode",
|
|
"spacer",
|
|
"search"
|
|
];
|
|
this.getCustomItems = function (callback) {
|
|
var customItems = [
|
|
{
|
|
type: "custom",
|
|
id: "button-reset",
|
|
className: "button-reset",
|
|
title: "Zurücksetzen",
|
|
onPress: function () {
|
|
callback("RESET");
|
|
},
|
|
icon: "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"currentColor\" class=\"bi bi-arrow-counterclockwise\" viewBox=\"0 0 16 16\">\n <path fill-rule=\"evenodd\" d=\"M8 3a5 5 0 1 1-4.546 2.914.5.5 0 0 0-.908-.417A6 6 0 1 0 8 2v1z\"/>\n <path d=\"M8 4.466V.534a.25.25 0 0 0-.41-.192L5.23 2.308a.25.25 0 0 0 0 .384l2.36 1.966A.25.25 0 0 0 8 4.466z\"/>\n </svg>"
|
|
},
|
|
{
|
|
type: "custom",
|
|
id: "button-finish",
|
|
className: "button-finish",
|
|
title: "Abschließen",
|
|
onPress: function () {
|
|
callback("FINISH");
|
|
},
|
|
icon: "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"currentColor\" class=\"bi bi-check2-circle\" viewBox=\"0 0 16 16\">\n <path d=\"M2.5 8a5.5 5.5 0 0 1 8.25-4.764.5.5 0 0 0 .5-.866A6.5 6.5 0 1 0 14.5 8a.5.5 0 0 0-1 0 5.5 5.5 0 1 1-11 0z\"/>\n <path d=\"M15.354 3.354a.5.5 0 0 0-.708-.708L8 9.293 5.354 6.646a.5.5 0 1 0-.708.708l3 3a.5.5 0 0 0 .708 0l7-7z\" />\n </svg>"
|
|
}
|
|
];
|
|
return customItems;
|
|
};
|
|
}
|
|
// Load the PSPDFKit UI by setting a target element as the container to render in
|
|
// and a arraybuffer which represents the document that should be displayed.
|
|
UI.prototype.loadPSPDFKit = function (arrayBuffer, container) {
|
|
return PSPDFKit.load({
|
|
container: container,
|
|
document: arrayBuffer,
|
|
autoSaveMode: DISABLED,
|
|
annotationPresets: this.getPresets(),
|
|
electronicSignatures: {
|
|
creationModes: [DRAW, TYPE]
|
|
},
|
|
isEditableAnnotation: function (annotation) {
|
|
// Check if the annotation is a signature
|
|
// This will allow new signatures, but not allow edits.
|
|
return !annotation.isSignature;
|
|
}
|
|
});
|
|
};
|
|
UI.prototype.configurePSPDFKit = function (instance, handler) {
|
|
var _this = this;
|
|
instance.addEventListener("annotations.load", function (loadedAnnotations) {
|
|
console.log("annotations loaded", loadedAnnotations.toJS());
|
|
});
|
|
instance.addEventListener("annotations.change", function () {
|
|
console.log("annotations changed");
|
|
});
|
|
instance.addEventListener("annotations.create", function (createdAnnotations) { return __awaiter(_this, void 0, void 0, function () {
|
|
return __generator(this, function (_a) {
|
|
console.log("annotations created");
|
|
return [2 /*return*/];
|
|
});
|
|
}); });
|
|
var toolbarItems = this.getToolbarItems(instance, handler);
|
|
instance.setToolbarItems(toolbarItems);
|
|
console.debug("PSPDFKit configured!");
|
|
};
|
|
UI.prototype.getToolbarItems = function (instance, handler) {
|
|
var customItems = this.getCustomItems(handler);
|
|
var defaultItems = this.getDefaultItems(instance.toolbarItems);
|
|
return defaultItems.concat(customItems);
|
|
};
|
|
UI.prototype.getDefaultItems = function (items) {
|
|
var _this = this;
|
|
return items.filter(function (item) { return _this.allowedToolbarItems.includes(item.type); });
|
|
};
|
|
UI.prototype.getPresets = function () {
|
|
var annotationPresets = PSPDFKit.defaultAnnotationPresets;
|
|
annotationPresets.ink = {
|
|
lineWidth: 10
|
|
};
|
|
annotationPresets.widget = {
|
|
readOnly: true
|
|
};
|
|
return annotationPresets;
|
|
};
|
|
return UI;
|
|
}());
|
|
//# sourceMappingURL=app.js.map
|