532 lines
24 KiB
JavaScript
532 lines
24 KiB
JavaScript
var __assign = (this && this.__assign) || function () {
|
||
__assign = Object.assign || function(t) {
|
||
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
||
s = arguments[i];
|
||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
||
t[p] = s[p];
|
||
}
|
||
return t;
|
||
};
|
||
return __assign.apply(this, arguments);
|
||
};
|
||
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 ActionType;
|
||
(function (ActionType) {
|
||
ActionType[ActionType["Created"] = 0] = "Created";
|
||
ActionType[ActionType["Saved"] = 1] = "Saved";
|
||
ActionType[ActionType["Sent"] = 2] = "Sent";
|
||
ActionType[ActionType["EmailSent"] = 3] = "EmailSent";
|
||
ActionType[ActionType["Delivered"] = 4] = "Delivered";
|
||
ActionType[ActionType["Seen"] = 5] = "Seen";
|
||
ActionType[ActionType["Signed"] = 6] = "Signed";
|
||
ActionType[ActionType["Rejected"] = 7] = "Rejected";
|
||
})(ActionType || (ActionType = {}));
|
||
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, description;
|
||
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();
|
||
description = "Umschlag wurde ge<67>ffnet";
|
||
return [4 /*yield*/, App.Network.postHistory(App.envelopeKey, ActionType.Seen, description)];
|
||
case 8:
|
||
_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<75>ckgesetzt!");
|
||
}
|
||
else {
|
||
alert("Fehler beim Zur<75>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<69>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, description, e_5;
|
||
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:
|
||
_a.trys.push([11, 13, , 14]);
|
||
description = "Dokument wurde signiert";
|
||
return [4 /*yield*/, App.Network.postHistory(App.envelopeKey, ActionType.Signed, description)];
|
||
case 12:
|
||
_a.sent();
|
||
return [3 /*break*/, 14];
|
||
case 13:
|
||
e_5 = _a.sent();
|
||
console.error(e_5);
|
||
return [2 /*return*/, false];
|
||
case 14: 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<75>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), this.withCSRFToken({ credentials: "include" }))
|
||
.then(function (res) { return res.json(); });
|
||
};
|
||
Network.prototype.getDocument = function (envelopeKey, documentId) {
|
||
return fetch("/api/document/".concat(envelopeKey, "?index=").concat(documentId), this.withCSRFToken({ credentials: "include" }))
|
||
.then(function (res) { return res.arrayBuffer(); });
|
||
};
|
||
Network.prototype.postDocument = function (envelopeKey, documentId, buffer) {
|
||
var url = "/api/document/".concat(envelopeKey, "?index=").concat(documentId);
|
||
var options = {
|
||
credentials: "include",
|
||
method: "POST",
|
||
body: buffer
|
||
};
|
||
console.debug("PostDocument/Calling url: " + url);
|
||
return fetch(url, this.withCSRFToken(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, this.withCSRFToken(options))
|
||
.then(this.handleResponse)
|
||
.then(function (res) {
|
||
if (!res.ok) {
|
||
return false;
|
||
}
|
||
;
|
||
return true;
|
||
});
|
||
};
|
||
Network.prototype.postHistory = function (envelopeKey, actionType, actionDescription) {
|
||
var url = "/api/history/".concat(envelopeKey);
|
||
var data = {
|
||
actionDescription: actionDescription,
|
||
actionType: actionType.toString()
|
||
};
|
||
var options = {
|
||
credentials: "include",
|
||
method: "POST",
|
||
headers: {
|
||
'Content-Type': "application/json; charset=utf-8"
|
||
},
|
||
body: JSON.stringify(data)
|
||
};
|
||
console.debug("PostHistory/Calling url: " + url);
|
||
return fetch(url, this.withCSRFToken(options))
|
||
.then(this.handleResponse)
|
||
.then(function (res) {
|
||
if (!res.ok) {
|
||
return false;
|
||
}
|
||
;
|
||
return true;
|
||
});
|
||
};
|
||
Network.prototype.withCSRFToken = function (options) {
|
||
var token = document.getElementsByName("__RequestVerificationToken")[0].value;
|
||
var headers = options.headers;
|
||
options.headers = __assign(__assign({}, headers), { 'X-XSRF-TOKEN': token });
|
||
return options;
|
||
};
|
||
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<75>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<69>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
|