20-09-2023

This commit is contained in:
Jonathan Jenne
2023-09-20 13:42:24 +02:00
parent 12556e41e4
commit 446bcfeb9e
21 changed files with 399 additions and 78 deletions

View File

@@ -24,6 +24,7 @@
</PackageReference>
<PackageReference Include="NLog" Version="5.0.5" />
<PackageReference Include="System.Data.SqlClient" Version="4.8.5" />
<PackageReference Include="System.Drawing.Common" Version="7.0.0" />
</ItemGroup>
<ItemGroup>

View File

@@ -1,4 +1,5 @@
using EnvelopeGenerator.Web.Services;
using EnvelopeGenerator.Common;
using EnvelopeGenerator.Web.Services;
namespace EnvelopeGenerator.Web.Handler
{
@@ -7,12 +8,48 @@ namespace EnvelopeGenerator.Web.Handler
public async static Task<IResult> HandleFile(HttpContext ctx, DatabaseService database, LoggingService logging)
{
var logger = logging.LogConfig.GetLogger("FileHandler");
int docId = int.Parse((string)ctx.Request.RouteValues["docId"]);
var document = database.LoadDocument(docId);
string envelopeKey = (string)ctx.Request.RouteValues["envelopeKey"];
logger.Info("Downloading file with EnvelopeKey [{0}]", envelopeKey);
Tuple<string, string> result = Helpers.DecodeEnvelopeReceiverId(envelopeKey);
logger.Info("EnvelopeUUID: [{0}]", result.Item1);
logger.Info("ReceiverSignature: [{0}]", result.Item2);
EnvelopeResponse response = database.LoadEnvelope(envelopeKey);
var envelope = response.Envelope;
logger.Info("Envelope [{0}] loaded", envelope.Id);
logger.Info("Contains [{0}] documents", envelope.Documents.Count);
logger.Info("Contains [{0}] receivers", envelope.Receivers.Count);
var document = envelope.Documents.First();
var bytes = await File.ReadAllBytesAsync(document.Filepath);
logger.Info("Serving file, size: [{0}]", bytes.Length);
return Results.File(bytes);
}
public static Task<IResult> HandleGetData(HttpContext ctx, DatabaseService database, LoggingService logging)
{
var logger = logging.LogConfig.GetLogger("FileHandler");
string envelopeKey = (string)ctx.Request.RouteValues["envelopeKey"];
logger.Info("Fetching data for envelope with EnvelopeKey [{0}]", envelopeKey);
Tuple<string, string> result = Helpers.DecodeEnvelopeReceiverId(envelopeKey);
logger.Info("EnvelopeUUID: [{0}]", result.Item1);
logger.Info("ReceiverSignature: [{0}]", result.Item2);
var response = database.LoadEnvelope(envelopeKey);
var envelope = response.Envelope;
logger.Info("Envelope [{0}] loaded", envelope.Id);
logger.Info("Contains [{0}] documents", envelope.Documents.Count);
logger.Info("Contains [{0}] receivers", envelope.Receivers.Count);
return Task.FromResult(Results.Json(response));
}
}
}

View File

@@ -8,7 +8,7 @@
<ul>
@foreach (var envelope in envelopes)
{
<li><a href="/EnvelopeKey/@Helpers.EncodeEnvelopeReceiverId(envelope.Uuid, " ABCDE")">Envelope @envelope.Id</a></li>
<li><a href="/EnvelopeKey/@Helpers.EncodeEnvelopeReceiverId(envelope.Uuid, "DDA3F6FA6605965DAC6FCF5AC518C78CDA11086584FED872BE146E987976F829")">Envelope @envelope.Id</a></li>
}
</ul>
@@ -17,7 +17,8 @@
protected override void OnInitialized()
{
envelopes = Database.LoadEnvelopes();
// Test
envelopes = Database.LoadEnvelopes(11);
}

View File

@@ -10,21 +10,12 @@
@code {
[Parameter] public string EnvelopeReceiverId { get; set; }
private Envelope envelope;
private EnvelopeDocument document;
protected override void OnInitialized()
{
envelope = Database.LoadEnvelope(EnvelopeReceiverId);
document = envelope.Documents.First();
}
protected override async void OnAfterRender(bool firstRender)
{
if (firstRender)
{
var module = await JS.InvokeAsync<IJSObjectReference>("import", "./js/app.js");
await module.InvokeVoidAsync("App.loadPDFFromUrl", "#container", document.Id);
await module.InvokeVoidAsync("App.loadPDFFromUrl", "#container", EnvelopeReceiverId);
}
}
}

View File

@@ -35,7 +35,8 @@ app.UseStaticFiles();
app.UseRouting();
// Add file download endpoint
app.MapGet("/api/download/{docId}", FileHandler.HandleFile);
app.MapGet("/api/download/{envelopeKey}", FileHandler.HandleFile);
app.MapGet("/api/get-data/{envelopeKey}", FileHandler.HandleGetData);
// Blazor plumbing
app.MapBlazorHub();

View File

@@ -1,25 +1,59 @@
//import PSPDFKit, { Instance } from 'index.d.ts';
import PSPDFKitType from "./index";
import { Instance, WidgetAnnotation } from "./index";
import PSPDFKitType, { AnnotationsUnion } from "./index";
import { Instance, WidgetAnnotation, ToolbarItem } from "./index";
declare const PSPDFKit: typeof PSPDFKitType
const { List } = PSPDFKit.Immutable;
const { Rect } = PSPDFKit.Geometry;
const { SignatureFormField } = PSPDFKit.FormFields;
const { DRAW, TYPE } = PSPDFKit.ElectronicSignatureCreationMode;
const { DISABLED } = PSPDFKit.AutoSaveMode;
interface EnvelopeResponse {
receiverId: number;
envelope: Envelope;
}
interface Envelope {
id: number;
userId: number;
title: string;
contractType: number;
status: number;
uuid: string;
}
class Settings {
public static allowedToolbarItems: string[] = [
"sidebar-thumbnails",
"sidebar-document-ouline",
"sidebar-bookmarks",
"pager",
"pan",
"zoom-out",
"zoom-in",
"zoom-mode",
"spacer",
"search"
]
}
export class App {
public static Instance: Instance;
// This function will be called in the ShowEnvelope.razor page
// and will trigger loading of the Editor Interface
public static async loadPDFFromUrl (container: string, documentId: number) {
public static async loadPDFFromUrl (container: string, envelopeKey: string) {
console.debug("Loading PSPDFKit..");
const arrayBuffer = await App.loadDocument(`/api/download/${documentId}`)
const instance = await App.loadPSPDFKit(arrayBuffer, container)
App.configurePSPDFKit(instance)
const arrayBuffer = await App.loadDocument(`/api/download/${envelopeKey}`);
const envelopeObject: EnvelopeResponse = await App.loadData(`/api/get-data/${envelopeKey}`);
console.debug("PSPDFKit configured!")
App.Instance = await App.loadPSPDFKit(arrayBuffer, container)
App.configurePSPDFKit(this.Instance)
console.debug(envelopeObject.envelope.id);
console.debug("PSPDFKit configured!");
const id = PSPDFKit.generateInstantId()
const annotation: WidgetAnnotation = App.createSignatureAnnotation(id, 150, 50, 50, 50, 0)
@@ -31,7 +65,7 @@ export class App {
console.debug("Annotation created.")
const [createdAnnotation] = await instance.create([annotation, formField])
const [createdAnnotation] = await App.Instance.create([annotation, formField])
console.debug(createdAnnotation)
}
@@ -39,7 +73,13 @@ export class App {
// Makes a call to the supplied url and fetches the binary response as an array buffer
private static loadDocument(url: string): Promise<ArrayBuffer> {
return fetch(url, { credentials: "include" })
.then(res => res.arrayBuffer())
.then(res => res.arrayBuffer());
}
// Makes a call to the supplied url and fetches the json response as an object
private static loadData(url: string): Promise<any> {
return fetch(url, { credentials: "include" })
.then(res => res.json());
}
// Load the PSPDFKit UI by setting a target element as the container to render in
@@ -54,9 +94,10 @@ export class App {
return PSPDFKit.load({
container: container,
document: arrayBuffer,
autoSaveMode: DISABLED,
annotationPresets,
electronicSignatures: {
creationModes: [TYPE, DRAW]
creationModes: [DRAW]
}
})
}
@@ -71,8 +112,62 @@ export class App {
})
instance.addEventListener("annotations.create", (createdAnnotations) => {
const annotation: AnnotationsUnion = createdAnnotations[0];
console.log("annotations created", createdAnnotations.toJS());
})
const filteredItems: Array<ToolbarItem> = instance.toolbarItems
.filter((item) => Settings.allowedToolbarItems.includes(item.type))
const customItems: ToolbarItem[] = [
{
type: "custom",
id: "button-finish",
title: "Abschließen",
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">
<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"/>
<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" />
</svg>`,
onPress: this.handleFinish
}
]
instance.setToolbarItems(filteredItems.concat(customItems))
}
private static async handleFinish(event: any) {
await App.Instance.applyOperations([{ type: "flattenAnnotations" }])
//await downloadDocument();
}
private static async downloadDocument() {
const buffer = await App.Instance.exportPDF({ flatten: true });
const supportsDownloadAttribute = HTMLAnchorElement.prototype.hasOwnProperty("download");
const blob = new Blob([buffer], { type: "application/pdf" });
if (!supportsDownloadAttribute) {
const reader = new FileReader();
reader.onloadend = function () {
const dataUrl = reader.result;
downloadPdf(dataUrl);
};
reader.readAsDataURL(blob);
} else {
const objectUrl = window.URL.createObjectURL(blob);
downloadPdf(objectUrl);
window.URL.revokeObjectURL(objectUrl);
}
function downloadPdf(blob) {
const 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);
}
}

View File

@@ -10,6 +10,8 @@ namespace EnvelopeGenerator.Web.Services
private EnvelopeModel envelopeModel;
private DocumentModel documentModel;
private ReceiverModel receiverModel;
private ElementModel elementModel;
private readonly LogConfig _logConfig;
private readonly Logger _logger;
@@ -50,25 +52,32 @@ namespace EnvelopeGenerator.Web.Services
{
envelopeModel = new(state);
documentModel = new(state);
receiverModel = new(state);
elementModel = new(state);
}
public Envelope LoadEnvelope(string envelopeReceiverId)
public EnvelopeResponse LoadEnvelope(string pEnvelopeKey)
{
Tuple<string, string> result = Helpers.DecodeEnvelopeReceiverId(envelopeReceiverId);
Tuple<string, string> result = Helpers.DecodeEnvelopeReceiverId(pEnvelopeKey);
var envelopeUuid = result.Item1;
var receiverSignature = result.Item2;
var receiverId = receiverModel.GetReceiverIdBySignature(receiverSignature);
Envelope envelope = envelopeModel.GetByUuid(envelopeUuid);
List<EnvelopeDocument> documents = (List<EnvelopeDocument>)documentModel.List(envelope.Id);
List<EnvelopeDocument> documents = (List<EnvelopeDocument>)documentModel.List(envelope.Id, receiverId);
envelope.Documents = documents;
return envelope;
return new()
{
ReceiverId = receiverId,
Envelope = envelope
};
}
public List<Envelope> LoadEnvelopes()
public List<Envelope> LoadEnvelopes(int pReceiverId)
{
return (List<Envelope>)envelopeModel.List();
return (List<Envelope>)envelopeModel.List(pReceiverId);
}
public EnvelopeDocument LoadDocument(int pDocumentId)

View File

@@ -9,7 +9,7 @@
"moduleResolution": "Classic",
"sourceMap": true,
"target": "es5",
"lib": ["ES2015", "DOM"]
"lib": ["ES2016", "DOM"]
},
"include": [
"Scripts/**/*.ts"

View File

@@ -38,25 +38,48 @@ 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 Settings = /** @class */ (function () {
function Settings() {
}
Settings.allowedToolbarItems = [
"sidebar-thumbnails",
"sidebar-document-ouline",
"sidebar-bookmarks",
"pager",
"pan",
"zoom-out",
"zoom-in",
"zoom-mode",
"spacer",
"search"
];
return Settings;
}());
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.loadPDFFromUrl = function (container, documentId) {
App.loadPDFFromUrl = function (container, envelopeKey) {
return __awaiter(this, void 0, void 0, function () {
var arrayBuffer, instance, id, annotation, formField, createdAnnotation;
return __generator(this, function (_a) {
switch (_a.label) {
var arrayBuffer, envelopeObject, _a, id, annotation, formField, createdAnnotation;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
console.debug("Loading PSPDFKit..");
return [4 /*yield*/, App.loadDocument("/api/download/".concat(documentId))];
return [4 /*yield*/, App.loadDocument("/api/download/".concat(envelopeKey))];
case 1:
arrayBuffer = _a.sent();
return [4 /*yield*/, App.loadPSPDFKit(arrayBuffer, container)];
arrayBuffer = _b.sent();
return [4 /*yield*/, App.loadData("/api/get-data/".concat(envelopeKey))];
case 2:
instance = _a.sent();
App.configurePSPDFKit(instance);
envelopeObject = _b.sent();
_a = App;
return [4 /*yield*/, App.loadPSPDFKit(arrayBuffer, container)];
case 3:
_a.Instance = _b.sent();
App.configurePSPDFKit(this.Instance);
console.debug(envelopeObject.envelope.id);
console.debug("PSPDFKit configured!");
id = PSPDFKit.generateInstantId();
annotation = App.createSignatureAnnotation(id, 150, 50, 50, 50, 0);
@@ -65,9 +88,9 @@ var App = /** @class */ (function () {
annotationIds: List([annotation.id])
});
console.debug("Annotation created.");
return [4 /*yield*/, instance.create([annotation, formField])];
case 3:
createdAnnotation = (_a.sent())[0];
return [4 /*yield*/, App.Instance.create([annotation, formField])];
case 4:
createdAnnotation = (_b.sent())[0];
console.debug(createdAnnotation);
return [2 /*return*/];
}
@@ -79,6 +102,11 @@ var App = /** @class */ (function () {
return fetch(url, { credentials: "include" })
.then(function (res) { return res.arrayBuffer(); });
};
// Makes a call to the supplied url and fetches the json response as an object
App.loadData = function (url) {
return fetch(url, { credentials: "include" })
.then(function (res) { return res.json(); });
};
// 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.
App.loadPSPDFKit = function (arrayBuffer, container) {
@@ -90,9 +118,10 @@ var App = /** @class */ (function () {
return PSPDFKit.load({
container: container,
document: arrayBuffer,
autoSaveMode: DISABLED,
annotationPresets: annotationPresets,
electronicSignatures: {
creationModes: [TYPE, DRAW]
creationModes: [DRAW]
}
});
};
@@ -104,8 +133,73 @@ var App = /** @class */ (function () {
console.log("annotations changed");
});
instance.addEventListener("annotations.create", function (createdAnnotations) {
var annotation = createdAnnotations[0];
console.log("annotations created", createdAnnotations.toJS());
});
var filteredItems = instance.toolbarItems
.filter(function (item) { return Settings.allowedToolbarItems.includes(item.type); });
var customItems = [
{
type: "custom",
id: "button-finish",
title: "Abschließen",
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>",
onPress: this.handleFinish
}
];
instance.setToolbarItems(filteredItems.concat(customItems));
};
App.handleFinish = function (event) {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, App.Instance.applyOperations([{ type: "flattenAnnotations" }])
//await downloadDocument();
];
case 1:
_a.sent();
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*/];
}
});
});
};
App.createSignatureAnnotation = function (id, x, y, top, left, pageIndex) {
var annotation = new PSPDFKit.Annotations.WidgetAnnotation({

View File

@@ -1 +1 @@
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../Scripts/app.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../Scripts/app.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1 @@
//# sourceMappingURL=settings.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../Scripts/settings.ts"],"names":[],"mappings":""}