Create new Web Project
This commit is contained in:
parent
d0a4249eb7
commit
2e148de18e
@ -1,12 +0,0 @@
|
||||
namespace EnvelopeGenerator.Web
|
||||
{
|
||||
public class Constants
|
||||
{
|
||||
public enum ErrorType
|
||||
{
|
||||
None,
|
||||
ServerError,
|
||||
FilesystemError
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
13
EnvelopeGenerator.Web/Data/WeatherForecast.cs
Normal file
13
EnvelopeGenerator.Web/Data/WeatherForecast.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
20
EnvelopeGenerator.Web/Data/WeatherForecastService.cs
Normal file
20
EnvelopeGenerator.Web/Data/WeatherForecastService.cs
Normal 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());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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>
|
||||
|
||||
18
EnvelopeGenerator.Web/Pages/Counter.razor
Normal file
18
EnvelopeGenerator.Web/Pages/Counter.razor
Normal 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++;
|
||||
}
|
||||
}
|
||||
48
EnvelopeGenerator.Web/Pages/FetchData.razor
Normal file
48
EnvelopeGenerator.Web/Pages/FetchData.razor
Normal 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);
|
||||
}
|
||||
}
|
||||
@ -1,5 +0,0 @@
|
||||
@page "/EnvelopeKey/Finish"
|
||||
|
||||
<h3>Dokumente signiert</h3>
|
||||
|
||||
<p>Sie haben den Umschlag erfolgreich signiert!</p>
|
||||
@ -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?" />
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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" />
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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);
|
||||
|
||||
// Add services to the container.
|
||||
builder.Services.AddRazorPages();
|
||||
builder.Services.AddServerSideBlazor();
|
||||
builder.Services.AddSingleton<WeatherForecastService>();
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
// 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();
|
||||
}
|
||||
|
||||
app.UseHttpsRedirection();
|
||||
|
||||
app.UseStaticFiles();
|
||||
|
||||
app.UseRouting();
|
||||
|
||||
app.MapBlazorHub();
|
||||
app.MapFallbackToPage("/_Host");
|
||||
|
||||
app.Run();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Redirect http:// to https://
|
||||
//app.UseHttpsRedirection();
|
||||
|
||||
// Serve static assets like css
|
||||
app.UseStaticFiles();
|
||||
|
||||
// Add a router
|
||||
app.UseRouting();
|
||||
|
||||
// Add controller routes
|
||||
app.MapControllers();
|
||||
|
||||
// Blazor plumbing
|
||||
app.MapBlazorHub();
|
||||
app.MapFallbackToPage("/_Host");
|
||||
|
||||
// Get crackin'!
|
||||
app.Run();
|
||||
|
||||
@ -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"
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
8620
EnvelopeGenerator.Web/Scripts/index.d.ts
vendored
8620
EnvelopeGenerator.Web/Scripts/index.d.ts
vendored
File diff suppressed because it is too large
Load Diff
@ -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 }
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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>
|
||||
|
||||
16
EnvelopeGenerator.Web/Shared/SurveyPrompt.razor
Normal file
16
EnvelopeGenerator.Web/Shared/SurveyPrompt.razor
Normal 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; }
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,6 +0,0 @@
|
||||
{
|
||||
"version": "1.0.0",
|
||||
"name": "asp.net",
|
||||
"private": true,
|
||||
"devDependencies": { }
|
||||
}
|
||||
@ -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"
|
||||
]
|
||||
}
|
||||
@ -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"
|
||||
]
|
||||
}
|
||||
@ -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
@ -1,2 +0,0 @@
|
||||
export {};
|
||||
//# sourceMappingURL=interfaces.js.map
|
||||
@ -1 +0,0 @@
|
||||
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../Scripts/interfaces.ts"],"names":[],"mappings":""}
|
||||
@ -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
|
||||
@ -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"}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
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
@ -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"]})}}]);
|
||||
@ -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"]})}}]);
|
||||
@ -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"]})}}]);
|
||||
@ -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"]})}}]);
|
||||
@ -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"]})}}]);
|
||||
@ -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"]})}}]);
|
||||
@ -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"]})}}]);
|
||||
@ -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"]})}}]);
|
||||
@ -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"]})}}]);
|
||||
@ -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"]})}}]);
|
||||
@ -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"]})}}]);
|
||||
@ -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"]})}}]);
|
||||
@ -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"]})}}]);
|
||||
@ -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"]})}}]);
|
||||
@ -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"]})}}]);
|
||||
@ -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"]})}}]);
|
||||
@ -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"]})}}]);
|
||||
@ -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"]})}}]);
|
||||
@ -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"]})}}]);
|
||||
@ -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"]})}}]);
|
||||
@ -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"]})}}]);
|
||||
@ -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
Loading…
x
Reference in New Issue
Block a user