Create new Web Project

This commit is contained in:
Jonathan Jenne 2023-11-08 08:59:25 +01:00
parent d0a4249eb7
commit 2e148de18e
765 changed files with 173 additions and 12962 deletions

View File

@ -1,12 +0,0 @@
namespace EnvelopeGenerator.Web
{
public class Constants
{
public enum ErrorType
{
None,
ServerError,
FilesystemError
}
}
}

View File

@ -1,30 +0,0 @@
using DigitalData.Modules.Logging;
using EnvelopeGenerator.Web.Services;
using Microsoft.AspNetCore.Mvc;
using static EnvelopeGenerator.Web.Constants;
namespace EnvelopeGenerator.Web.Controllers
{
public class BaseController : Controller
{
internal DatabaseService database;
internal LogConfig logConfig;
internal Logger logger;
public BaseController(DatabaseService database, LoggingService logging)
{
this.database = database;
this.logConfig = logging.LogConfig;
this.logger = logging.LogConfig.GetLoggerFor(GetType().Name);
}
internal ObjectResult ErrorResponse(Exception e)
{
logger.Error(e);
return Problem(
statusCode: 500,
detail: e.Message,
type: ErrorType.ServerError.ToString());
}
}
}

View File

@ -1,74 +0,0 @@
using Microsoft.AspNetCore.Mvc;
using EnvelopeGenerator.Common;
using EnvelopeGenerator.Web.Services;
namespace EnvelopeGenerator.Web.Controllers
{
public class DocumentController : BaseController
{
private readonly EnvelopeService envelopeService;
public DocumentController(DatabaseService database, LoggingService logging, EnvelopeService envelope) : base(database, logging)
{
envelopeService = envelope;
}
[HttpGet]
[Route("api/document/{envelopeKey}")]
public async Task<IActionResult> Get(string envelopeKey)
{
try
{
logger.Info("DocumentController/Get");
// Validate Envelope Key and load envelope
envelopeService.EnsureValidEnvelopeKey(envelopeKey);
EnvelopeResponse response = envelopeService.LoadEnvelope(envelopeKey);
// Load document info
var Request = ControllerContext.HttpContext.Request;
var document = envelopeService.GetDocument(Request, envelopeKey);
// Load the document from disk
var bytes = await envelopeService.GetDocumentContents(document);
// Return the document as bytes
return File(bytes, "application/octet-stream");
}
catch (Exception e)
{
return ErrorResponse(e);
}
}
[HttpPost]
[Route("api/document/{envelopeKey}")]
public async Task<IActionResult> Update(string envelopeKey)
{
try
{
logger.Info("DocumentController/Update");
// Validate Envelope Key and load envelope
envelopeService.EnsureValidEnvelopeKey(envelopeKey);
EnvelopeResponse response = envelopeService.LoadEnvelope(envelopeKey);
// Load Document info
var Request = ControllerContext.HttpContext.Request;
var document = envelopeService.GetDocument(Request, envelopeKey);
// Update the document with new data
await envelopeService.UpdateDocument(Request.Body, document.Filepath);
// Add history entry
envelopeService.InsertHistoryEntrySigned(response);
return Ok();
}
catch (Exception e)
{
return ErrorResponse(e);
}
}
}
}

View File

@ -1,71 +0,0 @@
using DigitalData.Modules.Logging;
using EnvelopeGenerator.Common;
using EnvelopeGenerator.Web.Services;
using Microsoft.AspNetCore.Mvc;
using static EnvelopeGenerator.Web.Constants;
namespace EnvelopeGenerator.Web.Controllers
{
public class EnvelopeController : BaseController
{
private readonly EnvelopeService envelopeService;
public EnvelopeController(DatabaseService database, LoggingService logging, EnvelopeService envelope) : base(database, logging)
{
envelopeService = envelope;
}
[HttpGet]
[Route("api/envelope/{envelopeKey}")]
public IActionResult Get(string envelopeKey)
{
try
{
logger.Info("EnvelopeController/Get");
// Validate Envelope Key and load envelope
envelopeService.EnsureValidEnvelopeKey(envelopeKey);
EnvelopeResponse response = envelopeService.LoadEnvelope(envelopeKey);
return Json(response);
}
catch (Exception e)
{
return ErrorResponse(e);
}
}
[HttpPost]
[Route("api/envelope/{envelopeKey}")]
public async Task<IActionResult> Update(string envelopeKey)
{
try
{
logger.Info("EnvelopeController/Update");
// Validate Envelope Key and load envelope
envelopeService.EnsureValidEnvelopeKey(envelopeKey);
EnvelopeResponse response = envelopeService.LoadEnvelope(envelopeKey);
var Request = ControllerContext.HttpContext.Request;
var document = envelopeService.GetDocument(Request, envelopeKey);
string annotationData = await envelopeService.EnsureValidAnnotationData(Request);
envelopeService.InsertDocumentStatus(new DocumentStatus()
{
EnvelopeId = response.Envelope.Id,
ReceiverId = response.Receiver.Id,
Value = annotationData,
Status = Common.Constants.DocumentStatus.Signed
});
return Ok();
}
catch (Exception e)
{
return ErrorResponse(e);
}
}
}
}

View File

@ -0,0 +1,13 @@
namespace EnvelopeGenerator.Web.Data
{
public class WeatherForecast
{
public DateTime Date { get; set; }
public int TemperatureC { get; set; }
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
public string? Summary { get; set; }
}
}

View File

@ -0,0 +1,20 @@
namespace EnvelopeGenerator.Web.Data
{
public class WeatherForecastService
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
public Task<WeatherForecast[]> GetForecastAsync(DateTime startDate)
{
return Task.FromResult(Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = startDate.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
}).ToArray());
}
}
}

View File

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
@ -6,42 +6,4 @@
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<TypeScriptCompile Remove="Scripts\app.ts" />
</ItemGroup>
<ItemGroup>
<Content Include="Scripts\app.ts">
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.TypeScript.MSBuild" Version="5.2.2">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</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>
<ProjectReference Include="..\EnvelopeGenerator.Common\EnvelopeGenerator.Common.vbproj" />
</ItemGroup>
<ItemGroup>
<Reference Include="DigitalData.Modules.Database">
<HintPath>..\..\DDModules\Database\bin\Debug\DigitalData.Modules.Database.dll</HintPath>
</Reference>
<Reference Include="DigitalData.Modules.Logging">
<HintPath>..\..\DDModules\Logging\bin\Debug\DigitalData.Modules.Logging.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Folder Include="wwwroot\lib\NewFolder\" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,18 @@
@page "/counter"
<PageTitle>Counter</PageTitle>
<h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
private void IncrementCount()
{
currentCount++;
}
}

View File

@ -0,0 +1,48 @@
@page "/fetchdata"
<PageTitle>Weather forecast</PageTitle>
@using EnvelopeGenerator.Web.Data
@inject WeatherForecastService ForecastService
<h1>Weather forecast</h1>
<p>This component demonstrates fetching data from a service.</p>
@if (forecasts == null)
{
<p><em>Loading...</em></p>
}
else
{
<table class="table">
<thead>
<tr>
<th>Date</th>
<th>Temp. (C)</th>
<th>Temp. (F)</th>
<th>Summary</th>
</tr>
</thead>
<tbody>
@foreach (var forecast in forecasts)
{
<tr>
<td>@forecast.Date.ToShortDateString()</td>
<td>@forecast.TemperatureC</td>
<td>@forecast.TemperatureF</td>
<td>@forecast.Summary</td>
</tr>
}
</tbody>
</table>
}
@code {
private WeatherForecast[]? forecasts;
protected override async Task OnInitializedAsync()
{
forecasts = await ForecastService.GetForecastAsync(DateTime.Now);
}
}

View File

@ -1,5 +0,0 @@
@page "/EnvelopeKey/Finish"
<h3>Dokumente signiert</h3>
<p>Sie haben den Umschlag erfolgreich signiert!</p>

View File

@ -1,39 +1,9 @@
@page "/"
@using EnvelopeGenerator.Common;
@using EnvelopeGenerator.Web.Services;
@inject EnvelopeService Envelope;
<PageTitle>Index</PageTitle>
<ul>
@foreach (var envelope in envelopes)
{
<li><a href="/EnvelopeKey/@getEnvelopeKey(envelope)">@envelope.Title</a></li>
}
</ul>
<h1>Hello, world!</h1>
@code {
public List<Envelope> envelopes = new();
Welcome to your new app.
// List envelopes delivered to j.jenne@digitaldata.works
public int receiverId = 11;
string? getReceiverSignature(Envelope envelope)
{
var receiver = envelope.Receivers.Where(r => r.Id == receiverId).SingleOrDefault();
return receiver?.Signature;
}
string getEnvelopeKey(Envelope envelope)
{
return Helpers.EncodeEnvelopeReceiverId(envelope.Uuid, getReceiverSignature(envelope));
}
protected override void OnInitialized()
{
// Test
envelopes = Envelope.LoadEnvelopes(receiverId);
}
}
<SurveyPrompt Title="How is Blazor working for you?" />

View File

@ -1,21 +0,0 @@
@page "/EnvelopeKey/{EnvelopeReceiverId}"
@using EnvelopeGenerator.Common;
@using EnvelopeGenerator.Web.Services;
@inject DatabaseService Database
@inject IJSRuntime JS
<div id='container' style='background: gray; width: 100vw; height: 100vh; margin: 0 auto;'></div>
@code {
[Parameter] public string EnvelopeReceiverId { get; set; }
protected override async void OnAfterRender(bool firstRender)
{
if (firstRender)
{
var module = await JS.InvokeAsync<IJSObjectReference>("import", "./js/app.js");
await module.InvokeVoidAsync("App.init", "#container", EnvelopeReceiverId);
}
}
}

View File

@ -5,8 +5,4 @@
Layout = "_Layout";
}
@* Include pspdfkit.js in your Pages/_Host.cshtml file *@
<script src="lib/pspdfkit.js"></script>
<script src="js/app.js"></script>
<component type="typeof(App)" render-mode="ServerPrerendered" />

View File

@ -3,13 +3,10 @@
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
<!DOCTYPE html>
<html lang="de">
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<base href="~/" />
<link rel="stylesheet" href="css/bootstrap/bootstrap.min.css" />
<link href="css/site.css" rel="stylesheet" />
@ -31,7 +28,5 @@
</div>
<script src="_framework/blazor.server.js"></script>
@Html.AntiForgeryToken()
</body>
</html>

View File

@ -1,47 +1,40 @@
using EnvelopeGenerator.Web.Services;
using EnvelopeGenerator.Web.Data;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
var builder = WebApplication.CreateBuilder(args);
// Add basic blazor services to the container.
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
// Add base services
builder.Services.AddSingleton<LoggingService>();
builder.Services.AddTransient<DatabaseService>();
// Add higher order services
builder.Services.AddSingleton<EnvelopeService>();
builder.Services.AddControllers();
builder.Services.AddLocalization();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
namespace EnvelopeGenerator.Web
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
//app.UseHsts();
}
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// Redirect http:// to https://
//app.UseHttpsRedirection();
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
builder.Services.AddSingleton<WeatherForecastService>();
// Serve static assets like css
app.UseStaticFiles();
var app = builder.Build();
// Add a router
app.UseRouting();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
// Add controller routes
app.MapControllers();
app.UseHttpsRedirection();
// Blazor plumbing
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");
app.UseStaticFiles();
// Get crackin'!
app.Run();
app.UseRouting();
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");
app.Run();
}
}
}

View File

@ -3,8 +3,8 @@
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:34717",
"sslPort": 44343
"applicationUrl": "http://localhost:3194",
"sslPort": 44379
}
},
"profiles": {
@ -12,7 +12,7 @@
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://localhost:7196;http://localhost:5201",
"applicationUrl": "https://localhost:7187;http://localhost:5169",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}

View File

@ -1,472 +0,0 @@
import PSPDFKitType, { Action, AnnotationsUnion, SignatureFormField as SignatureFormFieldType } from "./index";
import { Instance, WidgetAnnotation, ToolbarItem } from "./index";
import { EnvelopeResponse, Envelope, User, Element, Document, IFunction } from "./interfaces";
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;
enum ActionType {
Created = 0,
Saved = 1,
Sent = 2,
EmailSent = 3,
Delivered = 4,
Seen = 5,
Signed = 6,
Rejected = 7,
}
export class App {
public static Instance: Instance;
public static currentDocument: Document;
public static envelopeKey: string;
public static UI: UI;
public static Network: Network;
public static Annotation: Annotation;
// This function will be called in the ShowEnvelope.razor page
// and will trigger loading of the Editor Interface
public static async init(container: string, envelopeKey: string) {
// 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..")
const envelopeObject: EnvelopeResponse = await App.Network.getEnvelope(envelopeKey);
console.debug(envelopeObject)
App.envelopeKey = envelopeKey;
App.currentDocument = envelopeObject.envelope.documents[0];
// Load the document from the filestore
console.debug("Loading document from filestore")
let arrayBuffer
try {
arrayBuffer = await App.Network.getDocument(envelopeKey, App.currentDocument.id);
} catch (e) {
console.error(e)
}
// Load PSPDFKit
console.debug("Loading PSPDFKit..")
App.Instance = await App.UI.loadPSPDFKit(arrayBuffer, container)
App.UI.configurePSPDFKit(this.Instance, App.handleClick)
// Load annotations into PSPDFKit
console.debug("Loading annotations..")
const annotations = App.Annotation.createAnnotations(App.currentDocument)
const createdAnnotations = await App.Instance.create(annotations)
const description = "Umschlag wurde geöffnet"
await App.Network.postHistory(App.envelopeKey, ActionType.Seen, description);
}
public static async handleClick(eventType: string) {
let result = false;
switch (eventType) {
case "RESET":
result = await App.handleReset(null)
if (result == true) {
alert("Dokument zurückgesetzt!");
} else {
alert("Fehler beim Zurücksetzen des Dokuments!")
}
break;
case "FINISH":
result = await App.handleFinish(null)
if (result == true) {
// TODO: Redirect to success page
alert("Dokument erfolgreich signiert!")
} else {
alert("Fehler beim Abschließen des Dokuments!")
}
break;
}
}
public static async handleFinish(event: any): Promise<boolean> {
// Save changes before doing anything
try {
await App.Instance.save();
} catch (e) {
console.error(e);
return false;
}
// Export annotation data and save to database
try {
const json = await App.Instance.exportInstantJSON()
const postEnvelopeResult: boolean = await App.Network.postEnvelope(App.envelopeKey, App.currentDocument.id, JSON.stringify(json))
if (postEnvelopeResult === false) {
return false;
}
} catch (e) {
console.error(e);
return false;
}
// Flatten the annotations and save the document to disk
try {
const buffer = await App.Instance.exportPDF({ flatten: true });
const postDocumentResult: boolean = await App.Network.postDocument(App.envelopeKey, App.currentDocument.id, buffer);
if (postDocumentResult === false) {
return false;
}
} catch (e) {
console.error(e);
return false;
}
try {
const description = "Dokument wurde signiert"
await App.Network.postHistory(App.envelopeKey, ActionType.Signed, description);
} catch (e) {
console.error(e);
return false;
}
return true;
}
public static async handleReset(event: any): Promise<boolean> {
if (confirm("Wollen Sie das Dokument und alle erstellten Signaturen zurücksetzen?")) {
const result = App.Annotation.deleteAnnotations(App.Instance)
return true;
} else {
return true;
}
}
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);
}
}
}
class Annotation {
public createAnnotations(document: Document): AnnotationsUnion[] {
const annotations: any[] = [];
document.elements.forEach((element: Element) => {
console.log("Creating annotation for element", element.id)
const [annotation, formField] = this.createAnnotationFromElement(element)
annotations.push(annotation);
annotations.push(formField);
})
return annotations;
}
public async deleteAnnotations(instance: Instance): Promise<any> {
let pageAnnotations = (
await Promise.all(Array.from({ length: instance.totalPageCount }).map((_, pageIndex) =>
instance.getAnnotations(pageIndex)
))
).flatMap((annotations) =>
annotations.reduce((acc, annotation) => acc.concat(annotation), [])
).filter((annotation) => !!annotation.isSignature);
//deleting all Annotations
return await instance.delete(pageAnnotations);
}
public async validateAnnotations(instance: Instance): Promise<boolean> {
let pageAnnotations = (
await Promise.all(Array.from({ length: instance.totalPageCount }).map((_, pageIndex) =>
instance.getAnnotations(pageIndex)
))
).flatMap((annotations) =>
annotations.reduce((acc, annotation) => acc.concat(annotation), [])
).map((annotation: WidgetAnnotation) => {
console.log(annotation.toJS());
return annotation;
});
return true;
}
private createAnnotationFromElement(element: Element): [annotation: WidgetAnnotation, formField: SignatureFormFieldType] {
const id = PSPDFKit.generateInstantId()
const width = this.inchToPoint(element.width)
const height = this.inchToPoint(element.height)
const top = this.inchToPoint(element.top) - (height / 2)
const left = this.inchToPoint(element.left) - (width / 2)
const page = element.page - 1
const annotation: WidgetAnnotation = this.createSignatureAnnotation(id, width, height, top, left, page)
console.log(annotation)
const formField = new SignatureFormField({
name: id,
annotationIds: List([annotation.id])
})
console.log(formField)
return [annotation, formField]
}
private createSignatureAnnotation(id: string, width: number, height: number, top: number, left: number, pageIndex: number): WidgetAnnotation {
const annotation = new PSPDFKit.Annotations.WidgetAnnotation({
id: id,
pageIndex: pageIndex,
formFieldName: id,
boundingBox: new Rect({ width, height, top, left })
})
return annotation
}
private inchToPoint(inch: number): number {
return inch * 72;
}
}
class Network {
public getEnvelope(envelopeKey: string): Promise<any> {
return fetch(`/api/envelope/${envelopeKey}`, this.withCSRFToken({ credentials: "include" }))
.then(res => res.json());
}
public getDocument(envelopeKey: string, documentId: number): Promise<ArrayBuffer> {
return fetch(`/api/document/${envelopeKey}?index=${documentId}`, this.withCSRFToken({ credentials: "include" }))
.then(res => res.arrayBuffer());
}
public postDocument(envelopeKey: string, documentId: number, buffer: ArrayBuffer): Promise<any> {
const url = `/api/document/${envelopeKey}?index=${documentId}`;
const options: RequestInit = {
credentials: "include",
method: "POST",
body: buffer
}
console.debug("PostDocument/Calling url: " + url)
return fetch(url, this.withCSRFToken(options))
.then(this.handleResponse)
.then((res: Response) => {
if (!res.ok) {
return false;
};
return true;
});
}
public postEnvelope(envelopeKey: string, documentId: number, jsonString: string): Promise<boolean> {
const url = `/api/envelope/${envelopeKey}?index=${documentId}`;
const options: RequestInit = {
credentials: "include",
method: "POST",
body: jsonString
}
console.debug("PostEnvelope/Calling url: " + url)
return fetch(url, this.withCSRFToken(options))
.then(this.handleResponse)
.then((res: Response) => {
if (!res.ok) {
return false;
};
return true;
});
}
public postHistory(envelopeKey: string, actionType: ActionType, actionDescription: string): Promise<boolean> {
const url = `/api/history/${envelopeKey}`;
const data = {
actionDescription: actionDescription,
actionType: actionType.toString()
}
const options: RequestInit = {
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((res: Response) => {
if (!res.ok) {
return false;
};
return true;
});
}
private withCSRFToken(options: RequestInit): RequestInit {
const token = (document.getElementsByName("__RequestVerificationToken")[0] as any).value;
let headers = options.headers;
options.headers = { ...headers, 'X-XSRF-TOKEN': token };
return options;
}
private handleResponse(res: Response) {
if (!res.ok) {
console.log(`Request failed with status ${res.status}`)
return res
} else {
return res
}
}
}
class UI {
public allowedToolbarItems: string[] = [
"sidebar-thumbnails",
"sidebar-document-ouline",
"sidebar-bookmarks",
"pager",
"pan",
"zoom-out",
"zoom-in",
"zoom-mode",
"spacer",
"search"
]
// 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.
public loadPSPDFKit(arrayBuffer: ArrayBuffer, container: string): Promise<Instance> {
return PSPDFKit.load({
container: container,
document: arrayBuffer,
autoSaveMode: DISABLED,
annotationPresets: this.getPresets(),
electronicSignatures: {
creationModes: [DRAW, TYPE]
},
isEditableAnnotation: function (annotation: WidgetAnnotation) {
// Check if the annotation is a signature
// This will allow new signatures, but not allow edits.
return !annotation.isSignature;
}
})
}
public configurePSPDFKit(instance: Instance, handler: any) {
instance.addEventListener("annotations.load", (loadedAnnotations) => {
console.log("annotations loaded", loadedAnnotations.toJS());
})
instance.addEventListener("annotations.change", () => {
console.log("annotations changed")
})
instance.addEventListener("annotations.create", async (createdAnnotations) => {
console.log("annotations created");
})
const toolbarItems = this.getToolbarItems(instance, handler)
instance.setToolbarItems(toolbarItems)
console.debug("PSPDFKit configured!");
}
public getToolbarItems(instance: Instance, handler: any): ToolbarItem[] {
const customItems = this.getCustomItems(handler)
const defaultItems: Array<ToolbarItem> = this.getDefaultItems(instance.toolbarItems)
return defaultItems.concat(customItems)
}
private getCustomItems = function (callback: any) {
const customItems: ToolbarItem[] = [
{
type: "custom",
id: "button-reset",
className: "button-reset",
title: "Zurücksetzen",
onPress() {
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">
<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"/>
<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"/>
</svg>`
},
{
type: "custom",
id: "button-finish",
className: "button-finish",
title: "Abschließen",
onPress() {
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">
<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>`
}
]
return customItems
}
private getDefaultItems(items: ToolbarItem[]): ToolbarItem[] {
return items.filter((item) => this.allowedToolbarItems.includes(item.type))
}
private getPresets() {
const annotationPresets = PSPDFKit.defaultAnnotationPresets;
annotationPresets.ink = {
lineWidth: 10
};
annotationPresets.widget = {
readOnly: true
}
return annotationPresets;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,49 +0,0 @@
interface EnvelopeResponse {
receiverId: number;
envelope: Envelope;
}
interface Envelope {
id: number;
userId: number;
title: string;
status: number;
statusTranslated: string;
contractType: number;
contractTypeTranslated: string;
subject: string;
uuid: string;
user: User;
documents: Document[];
}
interface Document {
id: number;
filepath: string;
filename: string;
elements: Element[];
}
interface Element {
id: number;
left: number;
top: number;
width: number;
height: number;
page: number;
readOnly: boolean;
}
interface User {
id: number;
email: string;
name: string;
prename: string;
username: string;
language: string;
fullName: string;
}
type IFunction<T = void> = (...args: Array<any>) => T;
export { EnvelopeResponse, Envelope, Document, Element, User, IFunction }

View File

@ -1,18 +0,0 @@
using DigitalData.Modules.Logging;
namespace EnvelopeGenerator.Web.Services
{
public class BaseService
{
internal readonly LogConfig logConfig;
internal readonly IConfiguration config;
internal Logger logger;
public BaseService(IConfiguration Config, LoggingService Logging)
{
logConfig = Logging.LogConfig;
logger = Logging.LogConfig.GetLogger();
config = Config;
}
}
}

View File

@ -1,61 +0,0 @@
using DigitalData.Modules.Database;
using EnvelopeGenerator.Common;
namespace EnvelopeGenerator.Web.Services
{
public class DatabaseService: BaseService
{
public MSSQLServer MSSQL { get; set; }
public class ModelContainer
{
public EnvelopeModel envelopeModel;
public DocumentModel documentModel;
public ReceiverModel receiverModel;
public ElementModel elementModel;
public HistoryModel historyModel;
public DocumentStatusModel documentStatusModel;
public ModelContainer(State state)
{
envelopeModel = new(state);
documentModel = new(state);
receiverModel = new(state);
elementModel = new(state);
historyModel = new(state);
documentStatusModel = new(state);
}
}
public readonly ModelContainer? Models;
public DatabaseService(IConfiguration Config, LoggingService Logging) : base(Config, Logging)
{
logger = Logging.LogConfig.GetLogger();
logger.Debug("Establishing MSSQL Database connection..");
MSSQL = new MSSQLServer(logConfig, Config["Config:ConnectionString"]);
if (MSSQL.DBInitialized == true)
{
logger.Debug("MSSQL Connection: [{0}]", MSSQL.CurrentConnectionString);
var state = GetState();
Models = new(state);
}
else
{
logger.Error("Connection could not be established!");
}
}
private State GetState()
{
return new State
{
Database = MSSQL,
LogConfig = logConfig,
UserId = 2 // TODO
};
}
}
}

View File

@ -1,192 +0,0 @@
using EnvelopeGenerator.Common;
using Microsoft.Extensions.Primitives;
using System.Reflection.Metadata;
using System.Text;
using static EnvelopeGenerator.Common.Constants;
namespace EnvelopeGenerator.Web.Services
{
public class EnvelopeService : BaseService
{
private ReceiverModel receiverModel;
private EnvelopeModel envelopeModel;
private HistoryModel historyModel;
private DocumentModel documentModel;
private DocumentStatusModel documentStatusModel;
public EnvelopeService(IConfiguration Config, LoggingService Logging, DatabaseService database) : base(Config, Logging)
{
logger = Logging.LogConfig.GetLogger();
if (database.Models == null)
{
throw new ArgumentNullException("Models not loaded.");
}
receiverModel = database.Models.receiverModel;
envelopeModel = database.Models.envelopeModel;
historyModel = database.Models.historyModel;
documentModel = database.Models.documentModel;
documentStatusModel = database.Models.documentStatusModel;
}
public void EnsureValidEnvelopeKey(string envelopeKey)
{
logger.Debug("Parsing EnvelopeKey..");
if (string.IsNullOrEmpty(envelopeKey))
throw new ArgumentNullException("EnvelopeKey");
Tuple<string, string> result = Helpers.DecodeEnvelopeReceiverId(envelopeKey);
logger.Debug("EnvelopeUUID: [{0}]", result.Item1);
logger.Debug("ReceiverSignature: [{0}]", result.Item2);
if (string.IsNullOrEmpty(result.Item1))
throw new ArgumentNullException("EnvelopeUUID");
if (string.IsNullOrEmpty(result.Item2))
throw new ArgumentNullException("ReceiverSignature");
}
public EnvelopeResponse LoadEnvelope(string pEnvelopeKey)
{
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);
if (envelope == null)
{
throw new NullReferenceException("Envelope not found");
}
if (envelope.Receivers == null)
{
throw new NullReferenceException("Receivers for envelope not loaded");
}
EnvelopeReceiver? receiver = envelope.Receivers.Where(r => r.Id == receiverId).SingleOrDefault();
if (receiver == null)
{
throw new NullReferenceException("Receiver not found");
}
return new()
{
Receiver = receiver,
Envelope = envelope
};
}
public List<Envelope> LoadEnvelopes(int pReceiverId)
{
return (List<Envelope>)envelopeModel.List(pReceiverId);
}
public bool InsertHistoryEntry(EnvelopeHistoryEntry historyEntry)
{
return historyModel.Insert(historyEntry);
}
public bool InsertHistoryEntrySigned(EnvelopeResponse response)
{
return historyModel.Insert(new EnvelopeHistoryEntry()
{
ActionDescription = "Dokument wurde signiert",
ActionDate = DateTime.Now,
ActionType = EnvelopeHistoryActionType.Signed,
EnvelopeId = response.Envelope.Id,
UserReference = response.Receiver.Email
});
}
public bool InsertDocumentStatus(Common.DocumentStatus documentStatus)
{
return documentStatusModel.InsertOrUpdate(documentStatus);
}
public async Task<string?> EnsureValidAnnotationData(HttpRequest request)
{
try
{
logger.Debug("Parsing annotation data from request..");
using MemoryStream ms = new();
await request.BodyReader.CopyToAsync(ms);
var bytes = ms.ToArray();
return Encoding.UTF8.GetString(bytes);
}
catch (Exception e)
{
logger.Error(e);
throw new ArgumentNullException("AnnotationData");
}
}
public int EnsureValidDocumentIndex(HttpRequest request)
{
if (!request.Query.TryGetValue("index", out StringValues documentIndexStringList))
{
logger.Warn("There is no query parameter called index");
throw new ArgumentNullException("DocumentIndex");
}
if (documentIndexStringList.FirstOrDefault() == null)
{
logger.Warn("There is no query parameter called index");
throw new ArgumentNullException("DocumentIndex");
}
if (!int.TryParse(documentIndexStringList.First(), out int documentIndex))
{
logger.Warn("Invalid document index [{0}]", documentIndexStringList.First());
throw new ArgumentNullException("DocumentIndex");
}
return documentIndex;
}
public EnvelopeDocument GetDocument(HttpRequest request, string envelopeKey)
{
EnvelopeResponse response = LoadEnvelope(envelopeKey);
int documentId = EnsureValidDocumentIndex(request);
logger.Debug("Loading document for Id [{0}]", documentId);
var document = response.Envelope.Documents.
Where(d => d.Id == documentId).
FirstOrDefault();
if (document == null)
throw new ArgumentException("DocumentId");
logger.Debug("Document [{0}] loaded!", documentId);
return document;
}
public async Task UpdateDocument(Stream fileStream, string filePath)
{
logger.Debug("Writing document to path [{0}]..", filePath);
using FileStream fs = new(filePath, FileMode.Open);
await fileStream.CopyToAsync(fs);
logger.Debug("Document written!");
}
public async Task<byte[]> GetDocumentContents(EnvelopeDocument document)
{
logger.Debug("Loading file [{0}]", document.Filepath);
var bytes = await File.ReadAllBytesAsync(document.Filepath);
logger.Info("File loaded, size: [{0}]", bytes.Length);
return bytes;
}
}
}

View File

@ -1,25 +0,0 @@
using DigitalData.Modules.Logging;
namespace EnvelopeGenerator.Web.Services
{
public class LoggingService
{
public LogConfig LogConfig { get; set; }
public LoggingService(IConfiguration Config)
{
LogConfig = new LogConfig(LogConfig.PathType.CustomPath, Config["Config:LogPath"], null, "Digital Data", "ECM.EnvelopeGenerator.Web");
var logger = LogConfig.GetLogger();
logger.Info("Logging initialized!");
var debugLog = bool.Parse(Config["Config:LogDebug"]);
logger.Info("Setting DEBUG Logging to: [{0}]", debugLog);
LogConfig.Debug = debugLog;
var jsonLog = bool.Parse(Config["Config:LogJson"]);
logger.Info("Setting JSON Logging to: [{0}]", jsonLog);
LogConfig.Debug = jsonLog;
}
}
}

View File

@ -1,2 +1,19 @@
@inherits LayoutComponentBase
@Body
<PageTitle>EnvelopeGenerator.Web</PageTitle>
<div class="page">
<div class="sidebar">
<NavMenu />
</div>
<main>
<div class="top-row px-4">
<a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a>
</div>
<article class="content px-4">
@Body
</article>
</main>
</div>

View File

@ -0,0 +1,16 @@
<div class="alert alert-secondary mt-4">
<span class="oi oi-pencil me-2" aria-hidden="true"></span>
<strong>@Title</strong>
<span class="text-nowrap">
Please take our
<a target="_blank" class="font-weight-bold link-dark" href="https://go.microsoft.com/fwlink/?linkid=2149017">brief survey</a>
</span>
and tell us what you think.
</div>
@code {
// Demonstrates how a parent component can supply parameters
[Parameter]
public string? Title { get; set; }
}

View File

@ -5,11 +5,5 @@
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"Config": {
"ConnectionString": "Server=sDD-VMP04-SQL17\\DD_DEVELOP01;Database=DD_ECM;User Id=sa;Password=dd;",
"LogPath": "E:\\EnvelopeGenerator\\Logs",
"LogDebug": true,
"LogJson": true
}
}

View File

@ -1,6 +0,0 @@
{
"version": "1.0.0",
"name": "asp.net",
"private": true,
"devDependencies": { }
}

View File

@ -1,20 +0,0 @@
{
"compileOnSave": true,
"compilerOptions": {
"noEmitOnError": true,
"noImplicitAny": false,
"outDir": "wwwroot/js",
"removeComments": false,
"module": "ES2015",
"moduleResolution": "Classic",
"sourceMap": true,
"target": "es5",
"lib": [ "ES2019", "DOM" ]
},
"include": [
"Scripts/**/*.ts"
],
"exclude": [
"node_modules"
]
}

View File

@ -1,20 +0,0 @@
{
"compileOnSave": true,
"compilerOptions": {
"noEmitOnError": true,
"noImplicitAny": false,
"outDir": "wwwroot/js",
"removeComments": false,
"module": "ES2015",
"moduleResolution": "Classic",
"sourceMap": true,
"target": "es5",
"lib": ["ES2016", "DOM"]
},
"include": [
"Scripts/**/*.ts"
],
"exclude": [
"node_modules"
]
}

View File

@ -1,532 +0,0 @@
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

File diff suppressed because one or more lines are too long

View File

@ -1,2 +0,0 @@
export {};
//# sourceMappingURL=interfaces.js.map

View File

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

View File

@ -1,14 +0,0 @@
const allowedToolbarItems = [
"sidebar-thumbnails",
"sidebar-document-ouline",
"sidebar-bookmarks",
"pager",
"pan",
"zoom-out",
"zoom-in",
"zoom-mode",
"spacer",
"search"
];
export { allowedToolbarItems };
//# sourceMappingURL=settings.js.map

View File

@ -1 +0,0 @@
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../Scripts/settings.ts"],"names":[],"mappings":"AAAA,MAAM,mBAAmB,GAAa;IAClC,oBAAoB;IACpB,yBAAyB;IACzB,mBAAmB;IACnB,OAAO;IACP,KAAK;IACL,UAAU;IACV,SAAS;IACT,WAAW;IACX,QAAQ;IACR,QAAQ;CACX,CAAA;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAA"}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,13 +0,0 @@
/*!
* PSPDFKit for Web 2023.4.6 (https://pspdfkit.com/web)
*
* Copyright (c) 2016-2023 PSPDFKit GmbH. All rights reserved.
*
* THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
* AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
* UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
* This notice may not be removed from this file.
*
* PSPDFKit uses several open source third-party components: https://pspdfkit.com/acknowledgements/web/
*/
(self.webpackChunkPSPDFKit=self.webpackChunkPSPDFKit||[]).push([[3005],{12282:()=>{Intl.PluralRules&&"function"==typeof Intl.PluralRules.__addLocaleData&&Intl.PluralRules.__addLocaleData({data:{cs:{categories:{cardinal:["one","few","many","other"],ordinal:["other"]},fn:function(a,e){var l=String(a).split("."),t=l[0],n=!l[1];return e?"other":1==a&&n?"one":t>=2&&t<=4&&n?"few":n?"other":"many"}}},availableLocales:["cs"]})}}]);

View File

@ -1,13 +0,0 @@
/*!
* PSPDFKit for Web 2023.4.6 (https://pspdfkit.com/web)
*
* Copyright (c) 2016-2023 PSPDFKit GmbH. All rights reserved.
*
* THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
* AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
* UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
* This notice may not be removed from this file.
*
* PSPDFKit uses several open source third-party components: https://pspdfkit.com/acknowledgements/web/
*/
(self.webpackChunkPSPDFKit=self.webpackChunkPSPDFKit||[]).push([[7050],{26873:()=>{Intl.PluralRules&&"function"==typeof Intl.PluralRules.__addLocaleData&&Intl.PluralRules.__addLocaleData({data:{cy:{categories:{cardinal:["zero","one","two","few","many","other"],ordinal:["zero","one","two","few","many","other"]},fn:function(e,a){return a?0==e||7==e||8==e||9==e?"zero":1==e?"one":2==e?"two":3==e||4==e?"few":5==e||6==e?"many":"other":0==e?"zero":1==e?"one":2==e?"two":3==e?"few":6==e?"many":"other"}}},availableLocales:["cy"]})}}]);

View File

@ -1,13 +0,0 @@
/*!
* PSPDFKit for Web 2023.4.6 (https://pspdfkit.com/web)
*
* Copyright (c) 2016-2023 PSPDFKit GmbH. All rights reserved.
*
* THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
* AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
* UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
* This notice may not be removed from this file.
*
* PSPDFKit uses several open source third-party components: https://pspdfkit.com/acknowledgements/web/
*/
(self.webpackChunkPSPDFKit=self.webpackChunkPSPDFKit||[]).push([[752],{5407:()=>{Intl.PluralRules&&"function"==typeof Intl.PluralRules.__addLocaleData&&Intl.PluralRules.__addLocaleData({data:{da:{categories:{cardinal:["one","other"],ordinal:["other"]},fn:function(a,l){var e=String(a).split("."),t=e[0],n=Number(e[0])==a;return l||1!=a&&(n||0!=t&&1!=t)?"other":"one"}}},availableLocales:["da"]})}}]);

View File

@ -1,13 +0,0 @@
/*!
* PSPDFKit for Web 2023.4.6 (https://pspdfkit.com/web)
*
* Copyright (c) 2016-2023 PSPDFKit GmbH. All rights reserved.
*
* THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
* AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
* UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
* This notice may not be removed from this file.
*
* PSPDFKit uses several open source third-party components: https://pspdfkit.com/acknowledgements/web/
*/
(self.webpackChunkPSPDFKit=self.webpackChunkPSPDFKit||[]).push([[8869],{60333:()=>{Intl.PluralRules&&"function"==typeof Intl.PluralRules.__addLocaleData&&Intl.PluralRules.__addLocaleData({data:{de:{categories:{cardinal:["one","other"],ordinal:["other"]},fn:function(a,e){var l=!String(a).split(".")[1];return e?"other":1==a&&l?"one":"other"}}},availableLocales:["de"]})}}]);

View File

@ -1,13 +0,0 @@
/*!
* PSPDFKit for Web 2023.4.6 (https://pspdfkit.com/web)
*
* Copyright (c) 2016-2023 PSPDFKit GmbH. All rights reserved.
*
* THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
* AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
* UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
* This notice may not be removed from this file.
*
* PSPDFKit uses several open source third-party components: https://pspdfkit.com/acknowledgements/web/
*/
(self.webpackChunkPSPDFKit=self.webpackChunkPSPDFKit||[]).push([[1882],{80056:()=>{Intl.PluralRules&&"function"==typeof Intl.PluralRules.__addLocaleData&&Intl.PluralRules.__addLocaleData({data:{el:{categories:{cardinal:["one","other"],ordinal:["other"]},fn:function(a,e){return e?"other":1==a?"one":"other"}}},availableLocales:["el"]})}}]);

View File

@ -1,13 +0,0 @@
/*!
* PSPDFKit for Web 2023.4.6 (https://pspdfkit.com/web)
*
* Copyright (c) 2016-2023 PSPDFKit GmbH. All rights reserved.
*
* THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
* AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
* UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
* This notice may not be removed from this file.
*
* PSPDFKit uses several open source third-party components: https://pspdfkit.com/acknowledgements/web/
*/
(self.webpackChunkPSPDFKit=self.webpackChunkPSPDFKit||[]).push([[5014],{32778:()=>{Intl.PluralRules&&"function"==typeof Intl.PluralRules.__addLocaleData&&Intl.PluralRules.__addLocaleData({data:{en:{categories:{cardinal:["one","other"],ordinal:["one","two","few","other"]},fn:function(e,a){var l=String(e).split("."),t=!l[1],n=Number(l[0])==e,o=n&&l[0].slice(-1),r=n&&l[0].slice(-2);return a?1==o&&11!=r?"one":2==o&&12!=r?"two":3==o&&13!=r?"few":"other":1==e&&t?"one":"other"}}},availableLocales:["en"]})}}]);

View File

@ -1,13 +0,0 @@
/*!
* PSPDFKit for Web 2023.4.6 (https://pspdfkit.com/web)
*
* Copyright (c) 2016-2023 PSPDFKit GmbH. All rights reserved.
*
* THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
* AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
* UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
* This notice may not be removed from this file.
*
* PSPDFKit uses several open source third-party components: https://pspdfkit.com/acknowledgements/web/
*/
(self.webpackChunkPSPDFKit=self.webpackChunkPSPDFKit||[]).push([[1252],{53802:()=>{Intl.PluralRules&&"function"==typeof Intl.PluralRules.__addLocaleData&&Intl.PluralRules.__addLocaleData({data:{es:{categories:{cardinal:["one","other"],ordinal:["other"]},fn:function(a,e){return e?"other":1==a?"one":"other"}}},availableLocales:["es"]})}}]);

View File

@ -1,13 +0,0 @@
/*!
* PSPDFKit for Web 2023.4.6 (https://pspdfkit.com/web)
*
* Copyright (c) 2016-2023 PSPDFKit GmbH. All rights reserved.
*
* THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
* AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
* UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
* This notice may not be removed from this file.
*
* PSPDFKit uses several open source third-party components: https://pspdfkit.com/acknowledgements/web/
*/
(self.webpackChunkPSPDFKit=self.webpackChunkPSPDFKit||[]).push([[5528],{15857:()=>{Intl.PluralRules&&"function"==typeof Intl.PluralRules.__addLocaleData&&Intl.PluralRules.__addLocaleData({data:{fi:{categories:{cardinal:["one","other"],ordinal:["other"]},fn:function(a,l){var e=!String(a).split(".")[1];return l?"other":1==a&&e?"one":"other"}}},availableLocales:["fi"]})}}]);

View File

@ -1,13 +0,0 @@
/*!
* PSPDFKit for Web 2023.4.6 (https://pspdfkit.com/web)
*
* Copyright (c) 2016-2023 PSPDFKit GmbH. All rights reserved.
*
* THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
* AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
* UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
* This notice may not be removed from this file.
*
* PSPDFKit uses several open source third-party components: https://pspdfkit.com/acknowledgements/web/
*/
(self.webpackChunkPSPDFKit=self.webpackChunkPSPDFKit||[]).push([[1145],{75828:()=>{Intl.PluralRules&&"function"==typeof Intl.PluralRules.__addLocaleData&&Intl.PluralRules.__addLocaleData({data:{fr:{categories:{cardinal:["one","other"],ordinal:["one","other"]},fn:function(a,e){return e?1==a?"one":"other":a>=0&&a<2?"one":"other"}}},availableLocales:["fr"]})}}]);

View File

@ -1,13 +0,0 @@
/*!
* PSPDFKit for Web 2023.4.6 (https://pspdfkit.com/web)
*
* Copyright (c) 2016-2023 PSPDFKit GmbH. All rights reserved.
*
* THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
* AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
* UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
* This notice may not be removed from this file.
*
* PSPDFKit uses several open source third-party components: https://pspdfkit.com/acknowledgements/web/
*/
(self.webpackChunkPSPDFKit=self.webpackChunkPSPDFKit||[]).push([[9677],{34029:()=>{Intl.PluralRules&&"function"==typeof Intl.PluralRules.__addLocaleData&&Intl.PluralRules.__addLocaleData({data:{hr:{categories:{cardinal:["one","few","other"],ordinal:["other"]},fn:function(e,l){var a=String(e).split("."),t=a[0],n=a[1]||"",r=!a[1],i=t.slice(-1),o=t.slice(-2),c=n.slice(-1),s=n.slice(-2);return l?"other":r&&1==i&&11!=o||1==c&&11!=s?"one":r&&i>=2&&i<=4&&(o<12||o>14)||c>=2&&c<=4&&(s<12||s>14)?"few":"other"}}},availableLocales:["hr"]})}}]);

View File

@ -1,13 +0,0 @@
/*!
* PSPDFKit for Web 2023.4.6 (https://pspdfkit.com/web)
*
* Copyright (c) 2016-2023 PSPDFKit GmbH. All rights reserved.
*
* THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
* AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
* UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
* This notice may not be removed from this file.
*
* PSPDFKit uses several open source third-party components: https://pspdfkit.com/acknowledgements/web/
*/
(self.webpackChunkPSPDFKit=self.webpackChunkPSPDFKit||[]).push([[5192],{32419:()=>{Intl.PluralRules&&"function"==typeof Intl.PluralRules.__addLocaleData&&Intl.PluralRules.__addLocaleData({data:{id:{categories:{cardinal:["other"],ordinal:["other"]},fn:function(a,l){return"other"}}},availableLocales:["id"]})}}]);

View File

@ -1,13 +0,0 @@
/*!
* PSPDFKit for Web 2023.4.6 (https://pspdfkit.com/web)
*
* Copyright (c) 2016-2023 PSPDFKit GmbH. All rights reserved.
*
* THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
* AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
* UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
* This notice may not be removed from this file.
*
* PSPDFKit uses several open source third-party components: https://pspdfkit.com/acknowledgements/web/
*/
(self.webpackChunkPSPDFKit=self.webpackChunkPSPDFKit||[]).push([[3424],{81998:()=>{Intl.PluralRules&&"function"==typeof Intl.PluralRules.__addLocaleData&&Intl.PluralRules.__addLocaleData({data:{it:{categories:{cardinal:["one","other"],ordinal:["many","other"]},fn:function(a,l){var e=!String(a).split(".")[1];return l?11==a||8==a||80==a||800==a?"many":"other":1==a&&e?"one":"other"}}},availableLocales:["it"]})}}]);

View File

@ -1,13 +0,0 @@
/*!
* PSPDFKit for Web 2023.4.6 (https://pspdfkit.com/web)
*
* Copyright (c) 2016-2023 PSPDFKit GmbH. All rights reserved.
*
* THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
* AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
* UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
* This notice may not be removed from this file.
*
* PSPDFKit uses several open source third-party components: https://pspdfkit.com/acknowledgements/web/
*/
(self.webpackChunkPSPDFKit=self.webpackChunkPSPDFKit||[]).push([[4728],{55389:()=>{Intl.PluralRules&&"function"==typeof Intl.PluralRules.__addLocaleData&&Intl.PluralRules.__addLocaleData({data:{ja:{categories:{cardinal:["other"],ordinal:["other"]},fn:function(a,l){return"other"}}},availableLocales:["ja"]})}}]);

View File

@ -1,13 +0,0 @@
/*!
* PSPDFKit for Web 2023.4.6 (https://pspdfkit.com/web)
*
* Copyright (c) 2016-2023 PSPDFKit GmbH. All rights reserved.
*
* THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
* AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
* UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
* This notice may not be removed from this file.
*
* PSPDFKit uses several open source third-party components: https://pspdfkit.com/acknowledgements/web/
*/
(self.webpackChunkPSPDFKit=self.webpackChunkPSPDFKit||[]).push([[1089],{97301:()=>{Intl.PluralRules&&"function"==typeof Intl.PluralRules.__addLocaleData&&Intl.PluralRules.__addLocaleData({data:{ko:{categories:{cardinal:["other"],ordinal:["other"]},fn:function(a,l){return"other"}}},availableLocales:["ko"]})}}]);

View File

@ -1,13 +0,0 @@
/*!
* PSPDFKit for Web 2023.4.6 (https://pspdfkit.com/web)
*
* Copyright (c) 2016-2023 PSPDFKit GmbH. All rights reserved.
*
* THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
* AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
* UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
* This notice may not be removed from this file.
*
* PSPDFKit uses several open source third-party components: https://pspdfkit.com/acknowledgements/web/
*/
(self.webpackChunkPSPDFKit=self.webpackChunkPSPDFKit||[]).push([[1518],{55367:()=>{Intl.PluralRules&&"function"==typeof Intl.PluralRules.__addLocaleData&&Intl.PluralRules.__addLocaleData({data:{ms:{categories:{cardinal:["other"],ordinal:["one","other"]},fn:function(a,l){return l&&1==a?"one":"other"}}},availableLocales:["ms"]})}}]);

View File

@ -1,13 +0,0 @@
/*!
* PSPDFKit for Web 2023.4.6 (https://pspdfkit.com/web)
*
* Copyright (c) 2016-2023 PSPDFKit GmbH. All rights reserved.
*
* THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
* AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
* UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
* This notice may not be removed from this file.
*
* PSPDFKit uses several open source third-party components: https://pspdfkit.com/acknowledgements/web/
*/
(self.webpackChunkPSPDFKit=self.webpackChunkPSPDFKit||[]).push([[2279],{93673:()=>{Intl.PluralRules&&"function"==typeof Intl.PluralRules.__addLocaleData&&Intl.PluralRules.__addLocaleData({data:{nb:{categories:{cardinal:["one","other"],ordinal:["other"]},fn:function(a,e){return e?"other":1==a?"one":"other"}}},availableLocales:["nb"]})}}]);

View File

@ -1,13 +0,0 @@
/*!
* PSPDFKit for Web 2023.4.6 (https://pspdfkit.com/web)
*
* Copyright (c) 2016-2023 PSPDFKit GmbH. All rights reserved.
*
* THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
* AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
* UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
* This notice may not be removed from this file.
*
* PSPDFKit uses several open source third-party components: https://pspdfkit.com/acknowledgements/web/
*/
(self.webpackChunkPSPDFKit=self.webpackChunkPSPDFKit||[]).push([[9486],{80953:()=>{Intl.PluralRules&&"function"==typeof Intl.PluralRules.__addLocaleData&&Intl.PluralRules.__addLocaleData({data:{nl:{categories:{cardinal:["one","other"],ordinal:["other"]},fn:function(a,l){var e=!String(a).split(".")[1];return l?"other":1==a&&e?"one":"other"}}},availableLocales:["nl"]})}}]);

View File

@ -1,13 +0,0 @@
/*!
* PSPDFKit for Web 2023.4.6 (https://pspdfkit.com/web)
*
* Copyright (c) 2016-2023 PSPDFKit GmbH. All rights reserved.
*
* THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
* AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
* UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
* This notice may not be removed from this file.
*
* PSPDFKit uses several open source third-party components: https://pspdfkit.com/acknowledgements/web/
*/
(self.webpackChunkPSPDFKit=self.webpackChunkPSPDFKit||[]).push([[6523],{12533:()=>{Intl.PluralRules&&"function"==typeof Intl.PluralRules.__addLocaleData&&Intl.PluralRules.__addLocaleData({data:{pl:{categories:{cardinal:["one","few","many","other"],ordinal:["other"]},fn:function(a,l){var e=String(a).split("."),t=e[0],n=!e[1],o=t.slice(-1),r=t.slice(-2);return l?"other":1==a&&n?"one":n&&o>=2&&o<=4&&(r<12||r>14)?"few":n&&1!=t&&(0==o||1==o)||n&&o>=5&&o<=9||n&&r>=12&&r<=14?"many":"other"}}},availableLocales:["pl"]})}}]);

View File

@ -1,13 +0,0 @@
/*!
* PSPDFKit for Web 2023.4.6 (https://pspdfkit.com/web)
*
* Copyright (c) 2016-2023 PSPDFKit GmbH. All rights reserved.
*
* THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
* AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
* UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
* This notice may not be removed from this file.
*
* PSPDFKit uses several open source third-party components: https://pspdfkit.com/acknowledgements/web/
*/
(self.webpackChunkPSPDFKit=self.webpackChunkPSPDFKit||[]).push([[4932],{28708:()=>{Intl.PluralRules&&"function"==typeof Intl.PluralRules.__addLocaleData&&Intl.PluralRules.__addLocaleData({data:{pt:{categories:{cardinal:["one","other"],ordinal:["other"]},fn:function(a,l){var e=String(a).split(".")[0];return l?"other":0==e||1==e?"one":"other"}}},availableLocales:["pt"]})}}]);

View File

@ -1,13 +0,0 @@
/*!
* PSPDFKit for Web 2023.4.6 (https://pspdfkit.com/web)
*
* Copyright (c) 2016-2023 PSPDFKit GmbH. All rights reserved.
*
* THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
* AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
* UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
* This notice may not be removed from this file.
*
* PSPDFKit uses several open source third-party components: https://pspdfkit.com/acknowledgements/web/
*/
(self.webpackChunkPSPDFKit=self.webpackChunkPSPDFKit||[]).push([[1385],{63409:()=>{Intl.PluralRules&&"function"==typeof Intl.PluralRules.__addLocaleData&&Intl.PluralRules.__addLocaleData({data:{ru:{categories:{cardinal:["one","few","many","other"],ordinal:["other"]},fn:function(a,e){var l=String(a).split("."),t=l[0],n=!l[1],r=t.slice(-1),o=t.slice(-2);return e?"other":n&&1==r&&11!=o?"one":n&&r>=2&&r<=4&&(o<12||o>14)?"few":n&&0==r||n&&r>=5&&r<=9||n&&o>=11&&o<=14?"many":"other"}}},availableLocales:["ru"]})}}]);

View File

@ -1,13 +0,0 @@
/*!
* PSPDFKit for Web 2023.4.6 (https://pspdfkit.com/web)
*
* Copyright (c) 2016-2023 PSPDFKit GmbH. All rights reserved.
*
* THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
* AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
* UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
* This notice may not be removed from this file.
*
* PSPDFKit uses several open source third-party components: https://pspdfkit.com/acknowledgements/web/
*/
(self.webpackChunkPSPDFKit=self.webpackChunkPSPDFKit||[]).push([[1077],{87042:()=>{Intl.PluralRules&&"function"==typeof Intl.PluralRules.__addLocaleData&&Intl.PluralRules.__addLocaleData({data:{sk:{categories:{cardinal:["one","few","many","other"],ordinal:["other"]},fn:function(a,e){var l=String(a).split("."),t=l[0],n=!l[1];return e?"other":1==a&&n?"one":t>=2&&t<=4&&n?"few":n?"other":"many"}}},availableLocales:["sk"]})}}]);

View File

@ -1,13 +0,0 @@
/*!
* PSPDFKit for Web 2023.4.6 (https://pspdfkit.com/web)
*
* Copyright (c) 2016-2023 PSPDFKit GmbH. All rights reserved.
*
* THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
* AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE PSPDFKIT LICENSE AGREEMENT.
* UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
* This notice may not be removed from this file.
*
* PSPDFKit uses several open source third-party components: https://pspdfkit.com/acknowledgements/web/
*/
(self.webpackChunkPSPDFKit=self.webpackChunkPSPDFKit||[]).push([[1277],{13367:()=>{Intl.PluralRules&&"function"==typeof Intl.PluralRules.__addLocaleData&&Intl.PluralRules.__addLocaleData({data:{sl:{categories:{cardinal:["one","two","few","other"],ordinal:["other"]},fn:function(l,a){var e=String(l).split("."),t=e[0],n=!e[1],o=t.slice(-2);return a?"other":n&&1==o?"one":n&&2==o?"two":n&&(3==o||4==o)||!n?"few":"other"}}},availableLocales:["sl"]})}}]);

Some files were not shown because too many files have changed in this diff Show More