Feature-Update: Erweiterung der Envelope- und DocumentReceiverElement-Abfragen
Die Methoden `ReadAllWithAsync` und `ReadByUuidAsync` in `EnvelopeRepository` wurden erweitert, um optional DocumentReceiverElemente und Signaturdetails einzubeziehen.
This commit is contained in:
parent
cbb03d77ba
commit
ab713a23ac
@ -7,8 +7,8 @@ namespace EnvelopeGenerator.Application.Contracts
|
|||||||
{
|
{
|
||||||
public interface IEnvelopeService : IBasicCRUDService<IEnvelopeRepository, EnvelopeDto, Envelope, int>
|
public interface IEnvelopeService : IBasicCRUDService<IEnvelopeRepository, EnvelopeDto, Envelope, int>
|
||||||
{
|
{
|
||||||
Task<IServiceResult<IEnumerable<EnvelopeDto>>> ReadAllWithAsync(bool documents = false, bool receivers = false, bool history = false);
|
Task<IServiceResult<IEnumerable<EnvelopeDto>>> ReadAllWithAsync(bool documents = false, bool receivers = false, bool history = false, bool documentReceiverElement = false);
|
||||||
|
|
||||||
Task<IServiceResult<EnvelopeDto>> ReadByUuidAsync(string uuid, bool withDocuments = false, bool withReceivers = false, bool withHistory = false);
|
Task<IServiceResult<EnvelopeDto>> ReadByUuidAsync(string uuid, bool withDocuments = false, bool withReceivers = false, bool withHistory = false, bool withDocumentReceiverElement = false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -10,6 +10,6 @@ namespace EnvelopeGenerator.Application.DTOs
|
|||||||
string Filepath,
|
string Filepath,
|
||||||
DateTime AddedWhen,
|
DateTime AddedWhen,
|
||||||
string FilenameOriginal,
|
string FilenameOriginal,
|
||||||
ICollection<DocumentReceiverElement>? Elements
|
IEnumerable<DocumentReceiverElement>? Elements
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -32,7 +32,7 @@ namespace EnvelopeGenerator.Application.DTOs
|
|||||||
bool IsAlreadySent,
|
bool IsAlreadySent,
|
||||||
string? StatusTranslated,
|
string? StatusTranslated,
|
||||||
string? ContractTypeTranslated,
|
string? ContractTypeTranslated,
|
||||||
ICollection<EnvelopeDocument>? Documents,
|
IEnumerable<EnvelopeDocumentDto>? Documents,
|
||||||
ICollection<EnvelopeReceiver>? Receivers,
|
IEnumerable<EnvelopeReceiverDto>? Receivers,
|
||||||
ICollection<EnvelopeHistory>? History);
|
IEnumerable<EnvelopeHistoryDto>? History);
|
||||||
}
|
}
|
||||||
@ -16,16 +16,16 @@ namespace EnvelopeGenerator.Application.Services
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IServiceResult<IEnumerable<EnvelopeDto>>> ReadAllWithAsync(bool documents = false, bool receivers = false, bool history = false)
|
public async Task<IServiceResult<IEnumerable<EnvelopeDto>>> ReadAllWithAsync(bool documents = false, bool receivers = false, bool history = false, bool documentReceiverElement = false)
|
||||||
{
|
{
|
||||||
var envelopes = await _repository.ReadAllWithAsync(documents: documents, receivers: receivers, history: history);
|
var envelopes = await _repository.ReadAllWithAsync(documents: documents, receivers: receivers, history: history, documentReceiverElement: documentReceiverElement);
|
||||||
var readDto = _mapper.MapOrThrow<IEnumerable<EnvelopeDto>>(envelopes);
|
var readDto = _mapper.MapOrThrow<IEnumerable<EnvelopeDto>>(envelopes);
|
||||||
return Successful(readDto);
|
return Successful(readDto);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IServiceResult<EnvelopeDto>> ReadByUuidAsync(string uuid, bool withDocuments = false, bool withReceivers = false, bool withHistory = false)
|
public async Task<IServiceResult<EnvelopeDto>> ReadByUuidAsync(string uuid, bool withDocuments = false, bool withReceivers = false, bool withHistory = false, bool withDocumentReceiverElement = false)
|
||||||
{
|
{
|
||||||
var envelope = await _repository.ReadByUuidAsync(uuid: uuid, withDocuments: withDocuments, withReceivers: withReceivers, withHistory: withHistory);
|
var envelope = await _repository.ReadByUuidAsync(uuid: uuid, withDocuments: withDocuments, withReceivers: withReceivers, withHistory: withHistory, withDocumentReceiverElement: withDocumentReceiverElement);
|
||||||
|
|
||||||
if (envelope is null)
|
if (envelope is null)
|
||||||
return Failed<EnvelopeDto>();
|
return Failed<EnvelopeDto>();
|
||||||
|
|||||||
@ -109,10 +109,10 @@ namespace EnvelopeGenerator.Domain.Entities
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ICollection<EnvelopeDocument>? Documents { get; set; }
|
public IEnumerable<EnvelopeDocument>? Documents { get; set; }
|
||||||
|
|
||||||
public ICollection<EnvelopeReceiver>? Receivers { get; set; }
|
public IEnumerable<EnvelopeReceiver>? Receivers { get; set; }
|
||||||
|
|
||||||
public ICollection<EnvelopeHistory>? History { get; set; }
|
public IEnumerable<EnvelopeHistory>? History { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -30,6 +30,6 @@ namespace EnvelopeGenerator.Domain.Entities
|
|||||||
[Column("FILENAME_ORIGINAL", TypeName = "nvarchar(256)")]
|
[Column("FILENAME_ORIGINAL", TypeName = "nvarchar(256)")]
|
||||||
public string FilenameOriginal { get; set; }
|
public string FilenameOriginal { get; set; }
|
||||||
|
|
||||||
public ICollection<DocumentReceiverElement>? Elements { get; set; }
|
public IEnumerable<DocumentReceiverElement>? Elements { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -5,8 +5,8 @@ namespace EnvelopeGenerator.Infrastructure.Contracts
|
|||||||
{
|
{
|
||||||
public interface IEnvelopeRepository : ICRUDRepository<Envelope, int>
|
public interface IEnvelopeRepository : ICRUDRepository<Envelope, int>
|
||||||
{
|
{
|
||||||
Task<IEnumerable<Envelope>> ReadAllWithAsync(bool documents = false, bool receivers = false, bool history = false);
|
Task<IEnumerable<Envelope>> ReadAllWithAsync(bool documents = false, bool receivers = false, bool history = false, bool documentReceiverElement = true);
|
||||||
|
|
||||||
Task<Envelope?> ReadByUuidAsync(string uuid, bool withDocuments = false, bool withReceivers = false, bool withHistory = false);
|
Task<Envelope?> ReadByUuidAsync(string uuid, bool withDocuments = false, bool withReceivers = false, bool withHistory = false, bool withDocumentReceiverElement = false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -43,6 +43,17 @@ namespace DigitalData.UserManager.Infrastructure.Repositories
|
|||||||
.WithOne()
|
.WithOne()
|
||||||
.HasForeignKey(eh => eh.EnvelopeId);
|
.HasForeignKey(eh => eh.EnvelopeId);
|
||||||
|
|
||||||
|
modelBuilder.Entity<EnvelopeDocument>()
|
||||||
|
.HasMany(ed => ed.Elements)
|
||||||
|
.WithOne(e => e.Document)
|
||||||
|
.HasForeignKey(e => e.DocumentId);
|
||||||
|
|
||||||
|
modelBuilder.Entity<DocumentReceiverElement>()
|
||||||
|
.HasOne(dre => dre.Document)
|
||||||
|
.WithMany(ed => ed.Elements)
|
||||||
|
.HasForeignKey(dre => dre.DocumentId);
|
||||||
|
|
||||||
|
|
||||||
base.OnModelCreating(modelBuilder);
|
base.OnModelCreating(modelBuilder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,12 +12,15 @@ namespace EnvelopeGenerator.Infrastructure.Repositories
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<Envelope>> ReadAllWithAsync(bool documents = false, bool receivers = false, bool history = false)
|
public async Task<IEnumerable<Envelope>> ReadAllWithAsync(bool documents = false, bool receivers = false, bool history = false, bool documentReceiverElement = false)
|
||||||
{
|
{
|
||||||
var query = _dbSet.AsQueryable();
|
var query = _dbSet.AsQueryable();
|
||||||
|
|
||||||
if (documents)
|
if (documents)
|
||||||
query = query.Include(e => e.Documents);
|
if (documentReceiverElement)
|
||||||
|
query = query.Include(e => e.Documents!).ThenInclude(d => d.Elements);
|
||||||
|
else
|
||||||
|
query = query.Include(e => e.Documents);
|
||||||
|
|
||||||
if (receivers)
|
if (receivers)
|
||||||
query = query.Include(e => e.Receivers);
|
query = query.Include(e => e.Receivers);
|
||||||
@ -28,12 +31,15 @@ namespace EnvelopeGenerator.Infrastructure.Repositories
|
|||||||
return await query.ToListAsync();
|
return await query.ToListAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<Envelope?> ReadByUuidAsync(string uuid, bool withDocuments = false, bool withReceivers = false, bool withHistory = false)
|
public async Task<Envelope?> ReadByUuidAsync(string uuid, bool withDocuments = false, bool withReceivers = false, bool withHistory = false, bool withDocumentReceiverElement = false)
|
||||||
{
|
{
|
||||||
var query = _dbSet.Where(e => e.Uuid == uuid);
|
var query = _dbSet.Where(e => e.Uuid == uuid);
|
||||||
|
|
||||||
if (withDocuments)
|
if (withDocuments)
|
||||||
query = query.Include(e => e.Documents);
|
if (withDocumentReceiverElement)
|
||||||
|
query = query.Include(e => e.Documents!).ThenInclude(d => d.Elements);
|
||||||
|
else
|
||||||
|
query = query.Include(e => e.Documents);
|
||||||
|
|
||||||
if (withReceivers)
|
if (withReceivers)
|
||||||
query = query.Include(e => e.Receivers);
|
query = query.Include(e => e.Receivers);
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
using EnvelopeGenerator.Application.Contracts;
|
using EnvelopeGenerator.Application.Contracts;
|
||||||
|
using EnvelopeGenerator.Application.DTOs;
|
||||||
using EnvelopeGenerator.Application.Services;
|
using EnvelopeGenerator.Application.Services;
|
||||||
using EnvelopeGenerator.Common;
|
using EnvelopeGenerator.Common;
|
||||||
using EnvelopeGenerator.Web.Models;
|
using EnvelopeGenerator.Web.Models;
|
||||||
@ -92,6 +93,10 @@ namespace EnvelopeGenerator.Web.Controllers
|
|||||||
[HttpPost("/EnvelopeKey/{envelopeReceiverId}/Locked")]
|
[HttpPost("/EnvelopeKey/{envelopeReceiverId}/Locked")]
|
||||||
public async Task<IActionResult> ShowEnvelopePost([FromRoute] string envelopeReceiverId, [FromForm] string access_code)
|
public async Task<IActionResult> ShowEnvelopePost([FromRoute] string envelopeReceiverId, [FromForm] string access_code)
|
||||||
{
|
{
|
||||||
|
Tuple<string, string> decode = Helpers.DecodeEnvelopeReceiverId(envelopeReceiverId);
|
||||||
|
var envelopeUuid = decode.Item1;
|
||||||
|
var envlopeServiceResult = await _envelopeService.ReadByUuidAsync(envelopeUuid, withDocuments: true, withReceivers: true, withHistory: true, withDocumentReceiverElement:true);
|
||||||
|
|
||||||
EnvelopeResponse response = await envelopeOldService.LoadEnvelope(envelopeReceiverId);
|
EnvelopeResponse response = await envelopeOldService.LoadEnvelope(envelopeReceiverId);
|
||||||
string accessCode = response.Receiver.AccessCode;
|
string accessCode = response.Receiver.AccessCode;
|
||||||
|
|
||||||
@ -102,13 +107,13 @@ namespace EnvelopeGenerator.Web.Controllers
|
|||||||
|
|
||||||
if (accessCode == access_code)
|
if (accessCode == access_code)
|
||||||
{
|
{
|
||||||
bool actionResult = database.Services.actionService.EnterCorrectAccessCode(response.Envelope, response.Receiver);
|
database.Services.actionService.EnterCorrectAccessCode(response.Envelope, response.Receiver); //for history
|
||||||
ViewData["EnvelopeKey"] = envelopeReceiverId;
|
ViewData["EnvelopeKey"] = envelopeReceiverId;
|
||||||
return View("ShowEnvelope");
|
return View("ShowEnvelope", envlopeServiceResult);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
bool actionResult = database.Services.actionService.EnterIncorrectAccessCode(response.Envelope, response.Receiver);
|
database.Services.actionService.EnterIncorrectAccessCode(response.Envelope, response.Receiver); //for history
|
||||||
return Redirect($"/EnvelopeKey/{envelopeReceiverId}/Locked");
|
return Redirect($"/EnvelopeKey/{envelopeReceiverId}/Locked");
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -117,13 +122,6 @@ namespace EnvelopeGenerator.Web.Controllers
|
|||||||
[HttpGet("/EnvelopeKey/{envelopeReceiverId}/Locked")]
|
[HttpGet("/EnvelopeKey/{envelopeReceiverId}/Locked")]
|
||||||
public async Task<IActionResult> EnvelopeLocked([FromRoute] string envelopeReceiverId)
|
public async Task<IActionResult> EnvelopeLocked([FromRoute] string envelopeReceiverId)
|
||||||
{
|
{
|
||||||
Tuple<string, string> decode = Common.Helpers.DecodeEnvelopeReceiverId(envelopeReceiverId);
|
|
||||||
var envelopeUuid = decode.Item1;
|
|
||||||
var envlopeServiceResult = await _envelopeService.ReadByUuidAsync(envelopeUuid, withDocuments: true, withReceivers: true, withHistory: true);
|
|
||||||
|
|
||||||
|
|
||||||
ViewData["Envelope"] = envlopeServiceResult.Data;
|
|
||||||
|
|
||||||
ViewData["EnvelopeKey"] = envelopeReceiverId;
|
ViewData["EnvelopeKey"] = envelopeReceiverId;
|
||||||
return View();
|
return View();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,26 +1,57 @@
|
|||||||
@using EnvelopeGenerator.Application.DTOs;
|
@using DigitalData.Core.Contracts.Application;
|
||||||
|
@using EnvelopeGenerator.Application.DTOs;
|
||||||
|
@model IServiceResult<EnvelopeDto>;
|
||||||
@{
|
@{
|
||||||
ViewData["Title"] = "Dokument unterschreiben";
|
ViewData["Title"] = "Dokument unterschreiben";
|
||||||
EnvelopeDto? envelopeDto = ViewData["envelope"] as EnvelopeDto;
|
|
||||||
}
|
}
|
||||||
@if(envelopeDto is not null)
|
@if (Model.IsSuccess && Model.Data is not null)
|
||||||
{
|
{
|
||||||
|
var envelope = Model.Data;
|
||||||
|
var defaultDocument = envelope.Documents?.FirstOrDefault();
|
||||||
|
var pages = defaultDocument?.Elements?.Select(e => e.Page) ?? Array.Empty<int>();
|
||||||
|
var stPageIndexes = string.Join(pages.Count() > 1 ? ", " : "", pages.Take(pages.Count() - 1))
|
||||||
|
+ (pages.Count() > 1 ? " und " : "") + pages.LastOrDefault();
|
||||||
|
|
||||||
<nav class="navbar navbar-light bg-light">
|
<nav class="navbar navbar-light bg-light">
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarToggleExternalContent" aria-controls="navbarToggleExternalContent" aria-expanded="false" aria-label="Toggle navigation">
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarToggleExternalContent" aria-controls="navbarToggleExternalContent" aria-expanded="false" aria-label="Toggle navigation">
|
||||||
<span class="navbar-toggler-icon"></span>
|
<span class="navbar-toggler-icon"></span>
|
||||||
</button>
|
</button>
|
||||||
<div class="navbar-brand">Bitte prüfen Sie diese Dokumente und handeln Sie danach</div>
|
<div class="navbar-brand me-auto ms-5 envelope-message">@envelope.Message</div>
|
||||||
|
<div class="col-1 p-0 m-0 me-3 d-flex">
|
||||||
|
<img src="~/img/digital_data.svg" alt="...">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
<div class="collapse" id="navbarToggleExternalContent" data-bs-theme="light">
|
<div class="collapse show" id="navbarToggleExternalContent" data-bs-theme="light">
|
||||||
<div class="bg-light p-1">
|
<div class="bg-light p-1">
|
||||||
<h5 class="text-body-emphasis h4">Collapsed content</h5>
|
<div class="card sender-card mb-3">
|
||||||
<span class="text-body-secondary">Toggleable via the navbar brand.</span>
|
<div class="row g-0">
|
||||||
|
<div class="col-1 p-0 m-0 ps-4 mx-auto">
|
||||||
|
<img src="~/img/default-user.svg" class="img-fluid p-0 m-0" alt="...">
|
||||||
|
</div>
|
||||||
|
<div class="col p-0 m-0">
|
||||||
|
<div class="card-body p-0 m-0">
|
||||||
|
<h5 class="card-title p-0 m-0">@envelope.Title</h5>
|
||||||
|
<p class="card-text p-0 m-0">@($"Sie haben {(pages.Count())} Briefe zu unterschreiben. Bitte prüfen Sie die Seiten {stPageIndexes}.")</p>
|
||||||
|
<p class="card-text p-0 m-0"><small class="text-body-secondary">Erstellt am @envelope.AddedWhen</small></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
<script>
|
<script>
|
||||||
|
//document.addEventListener('click', function (event) {
|
||||||
|
// var navbarToggle = document.getElementById('navbarToggleExternalContent');
|
||||||
|
// var navbarButton = document.querySelector('[data-bs-target="#navbarToggleExternalContent"]');
|
||||||
|
// var isCollapsed = new bootstrap.Collapse(navbarToggle)._isTransitioning;
|
||||||
|
|
||||||
|
// if (!navbarToggle.contains(event.target) && !navbarButton.contains(event.target) && !isCollapsed) {
|
||||||
|
// new bootstrap.Collapse(navbarToggle).hide();
|
||||||
|
// }
|
||||||
|
//});
|
||||||
document.addEventListener("DOMContentLoaded", async () => {
|
document.addEventListener("DOMContentLoaded", async () => {
|
||||||
const app = new App("#app", "@ViewData["EnvelopeKey"]");
|
const app = new App("#app", "@ViewData["EnvelopeKey"]");
|
||||||
await app.init();
|
await app.init();
|
||||||
|
|||||||
@ -11,10 +11,6 @@
|
|||||||
<link rel="stylesheet" href="~/EnvelopeGenerator.Web.styles.css" asp-append-version="true" />
|
<link rel="stylesheet" href="~/EnvelopeGenerator.Web.styles.css" asp-append-version="true" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<main role="main">
|
|
||||||
@RenderBody()
|
|
||||||
</main>
|
|
||||||
|
|
||||||
<script src="~/lib/jquery/dist/jquery.min.js"></script>
|
<script src="~/lib/jquery/dist/jquery.min.js"></script>
|
||||||
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
|
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
|
||||||
<script src="~/lib/sweetalert2/sweetalert2.min.js"></script>
|
<script src="~/lib/sweetalert2/sweetalert2.min.js"></script>
|
||||||
@ -24,6 +20,11 @@
|
|||||||
<script src="~/js/app.js" asp-append-version="true"></script>
|
<script src="~/js/app.js" asp-append-version="true"></script>
|
||||||
<script src="~/lib/pspdfkit/pspdfkit.js" asp-append-version="true"></script>
|
<script src="~/lib/pspdfkit/pspdfkit.js" asp-append-version="true"></script>
|
||||||
@await RenderSectionAsync("Scripts", required: false)
|
@await RenderSectionAsync("Scripts", required: false)
|
||||||
|
<main role="main">
|
||||||
|
@RenderBody()
|
||||||
|
</main>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Html.AntiForgeryToken()
|
@Html.AntiForgeryToken()
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@ -119,4 +119,20 @@ footer#page-footer a:hover,
|
|||||||
footer#page-footer a:visited,
|
footer#page-footer a:visited,
|
||||||
footer#page-footer a:focus {
|
footer#page-footer a:focus {
|
||||||
color: #444;
|
color: #444;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sender-card {
|
||||||
|
background-color: transparent;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
.sender-card .row {
|
||||||
|
height: 7vh;
|
||||||
|
}
|
||||||
|
.sender-card img{
|
||||||
|
height: 7vh;
|
||||||
|
background-color: rgb(209, 207, 207);
|
||||||
|
border-radius: 50px;
|
||||||
|
}
|
||||||
|
.envelope-message {
|
||||||
|
font-family: 'Roboto', sans-serif;
|
||||||
}
|
}
|
||||||
5
EnvelopeGenerator.Web/wwwroot/img/default-user.svg
Normal file
5
EnvelopeGenerator.Web/wwwroot/img/default-user.svg
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<circle cx="12" cy="6" r="4" fill="#1C274C"/>
|
||||||
|
<ellipse opacity="0.5" cx="12" cy="17" rx="7" ry="4" fill="#1C274C"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 343 B |
12
EnvelopeGenerator.Web/wwwroot/img/digital_data.svg
Normal file
12
EnvelopeGenerator.Web/wwwroot/img/digital_data.svg
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg id="Ebene_1" data-name="Ebene 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 850 121.32">
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.cls-1 {
|
||||||
|
fill: #a52431;
|
||||||
|
stroke-width: 0px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</defs>
|
||||||
|
<path class="cls-1" d="M83.01,60.66c0-35.12-12.77-57.47-41.51-57.47H0v114.94h39.91c30.33,0,43.1-20.75,43.1-57.47M49.49,60.66c0,19.16-1.6,28.73-15.96,28.73V31.93c14.37,0,15.96,12.77,15.96,28.73M126.11,3.19h-33.52v114.94h33.52V3.19ZM223.49,97.38v-46.29h-39.91l-1.6,23.95h12.77v9.58c-3.19,4.79-6.39,7.98-12.77,7.98-7.98,0-12.77-11.17-12.77-31.93s4.79-31.93,12.77-31.93c6.86,0,11.33,5.75,12.77,14.37l28.73-6.39C218.7,15.96,207.52,0,181.98,0c-33.52,0-46.29,28.73-46.29,60.66s12.77,60.66,46.29,60.66c17.56,0,31.93-7.98,41.51-23.94M268.18,3.19h-33.52v114.94h33.52V3.19ZM346.4,31.93l-3.19-28.74h-65.45l-3.19,28.74h19.16v86.2h33.52V31.93h19.16ZM427.81,118.13L399.07,3.19h-31.93l-28.73,114.94h35.12l1.6-14.37h15.96l1.6,14.37h35.12ZM387.58,76.62h-8.94l3.51-28.74c.32-3.19.64-6.38.8-9.58h.32c.16,3.19.48,6.38.8,9.58l3.51,28.74ZM493.26,89.4h-25.54V3.19h-33.52v114.94h55.87l3.19-28.74ZM614.58,60.66c0-35.12-12.77-57.47-41.51-57.47h-41.51v114.94h39.91c30.33,0,43.1-20.75,43.1-57.47M581.05,60.66c0,19.16-1.6,28.73-15.96,28.73V31.93c14.37,0,15.96,12.77,15.96,28.73M704.75,118.13l-28.73-114.94h-31.93l-28.74,114.94h35.12l1.6-14.37h15.96l1.6,14.37h35.12ZM664.52,76.62h-8.94l3.51-28.74c.32-3.19.64-6.38.8-9.58h.32c.16,3.19.48,6.38.8,9.58l3.51,28.74ZM768.59,31.93l-3.19-28.74h-65.45l-3.19,28.74h19.16v86.2h33.52V31.93h19.16ZM850,118.13l-28.73-114.94h-31.93l-28.73,114.94h35.12l1.6-14.37h15.96l1.6,14.37h35.12ZM809.77,76.62h-8.94l3.51-28.74c.32-3.19.64-6.38.8-9.58h.32c.16,3.19.48,6.38.8,9.58l3.51,28.74Z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.7 KiB |
Loading…
x
Reference in New Issue
Block a user