Compare commits
60 Commits
cf300d3ade
...
feat/logou
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
255843d760 | ||
|
|
121f0568ad | ||
|
|
5d95f2f221 | ||
|
|
3d5053d177 | ||
|
|
b79bc2e418 | ||
|
|
b4154b60a7 | ||
|
|
0090fc0dfa | ||
|
|
6eac92b7cb | ||
|
|
1b1edca23c | ||
|
|
57ea9e01f8 | ||
|
|
1a99041c60 | ||
|
|
56c735890d | ||
|
|
3688373481 | ||
|
|
b8fbeee322 | ||
|
|
57e4dfb3fb | ||
|
|
afc8d3baf0 | ||
|
|
51d77367ca | ||
|
|
614f3768d9 | ||
|
|
5f780f8d1e | ||
|
|
20825aa3ea | ||
|
|
c5b508d274 | ||
|
|
4eec4451b2 | ||
|
|
ca4718e159 | ||
|
|
33fcb5b70e | ||
|
|
82d8521a25 | ||
|
|
2f9d07312b | ||
|
|
fa36593b26 | ||
|
|
9cdb1409c0 | ||
|
|
95785e8c8b | ||
|
|
6d6e62c8d0 | ||
|
|
1720e137f9 | ||
|
|
3e6e2078bb | ||
|
|
6b0ec9386c | ||
|
|
ee49538f1e | ||
|
|
311009bc97 | ||
|
|
f5028a82fa | ||
|
|
07d70dbd22 | ||
|
|
152050ebf4 | ||
|
|
e27daa4b90 | ||
|
|
c63f369bd6 | ||
|
|
c50e16d74f | ||
|
|
808a02968b | ||
|
|
bbd03615e1 | ||
|
|
772d510705 | ||
|
|
aa918d875d | ||
|
|
28fdf0a115 | ||
|
|
120c8623dd | ||
|
|
363329ca18 | ||
|
|
eb0c6dabf4 | ||
|
|
cd88af6807 | ||
|
|
1941de1928 | ||
|
|
22347a0202 | ||
|
|
e54d9d2da8 | ||
|
|
06b1aa9560 | ||
|
|
4f35fe54be | ||
|
|
84e3e4e18d | ||
|
|
7f26bb4766 | ||
|
|
f674be5200 | ||
|
|
0718f24339 | ||
|
|
6abc17c3bf |
@@ -1,6 +1,6 @@
|
|||||||
namespace EnvelopeGenerator.Application.Configurations
|
namespace EnvelopeGenerator.Application.Configurations
|
||||||
{
|
{
|
||||||
public class CodeGeneratorParams
|
public class AuthenticatorParams
|
||||||
{
|
{
|
||||||
public string CharPool { get; init; } = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789012345678901234567890123456789";
|
public string CharPool { get; init; } = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789012345678901234567890123456789";
|
||||||
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
namespace EnvelopeGenerator.Application.Configurations
|
|
||||||
{
|
|
||||||
public class DispatcherConfig
|
|
||||||
{
|
|
||||||
public int SendingProfile { get; init; } = 1;
|
|
||||||
|
|
||||||
public string AddedWho { get; init; } = "DDEnvelopGenerator";
|
|
||||||
|
|
||||||
public int ReminderTypeId { get; init; } = 202377;
|
|
||||||
|
|
||||||
public string EmailAttmt1 { get; init; } = string.Empty;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
namespace EnvelopeGenerator.Application.Configurations;
|
||||||
|
|
||||||
|
public class DispatcherParams
|
||||||
|
{
|
||||||
|
public int SendingProfile { get; init; } = 1;
|
||||||
|
|
||||||
|
public string AddedWho { get; init; } = "DDEnvelopGenerator";
|
||||||
|
|
||||||
|
public int ReminderTypeId { get; init; } = 202377;
|
||||||
|
|
||||||
|
public string EmailAttmt1 { get; init; } = string.Empty;
|
||||||
|
}
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
namespace EnvelopeGenerator.Application.Configurations
|
|
||||||
{
|
|
||||||
public class EnvelopeReceiverCacheParams
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the cache key format for SMS codes.
|
|
||||||
/// The placeholder {0} represents the envelopeReceiverId.
|
|
||||||
/// </summary>
|
|
||||||
public string CodeCacheKeyFormat { get; init; } = "sms-code-{0}";
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the cache expiration key format for SMS codes.
|
|
||||||
/// The placeholder {0} represents the envelopeReceiverId.
|
|
||||||
/// </summary>
|
|
||||||
public string CodeExpirationCacheKeyFormat { get; init; } = "sms-code-expiration-{0}";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
using DigitalData.Core.Abstractions.Client;
|
|
||||||
using Microsoft.Extensions.Caching.Distributed;
|
|
||||||
using OtpNet;
|
|
||||||
|
|
||||||
namespace EnvelopeGenerator.Application.Configurations.GtxMessaging
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// https://www.gtx-messaging.com/en/api-docs/sms-rest-api/
|
|
||||||
/// </summary>
|
|
||||||
public class SmsParams : IHttpClientOptions
|
|
||||||
{
|
|
||||||
public required string Uri { get; init; }
|
|
||||||
|
|
||||||
public string? Path { get; init; }
|
|
||||||
|
|
||||||
public Dictionary<string, object>? Headers { get; init; }
|
|
||||||
|
|
||||||
public Dictionary<string, object?>? QueryParams { get; init; }
|
|
||||||
|
|
||||||
public string RecipientQueryParamName { get; init; } = "to";
|
|
||||||
|
|
||||||
public string MessageQueryParamName { get; init; } = "text";
|
|
||||||
|
|
||||||
public int CodeLength { get; init; } = 5;
|
|
||||||
|
|
||||||
public int SmsTotpStep { get; init; } = 300;
|
|
||||||
|
|
||||||
public string DefaultTotpMessageFormat { get; init; } = "{0}";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
using DigitalData.Core.Abstractions.Client;
|
||||||
|
namespace EnvelopeGenerator.Application.Configurations;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// https://www.gtx-messaging.com/en/api-docs/sms-rest-api/
|
||||||
|
/// </summary>
|
||||||
|
public class GtxMessagingParams : IHttpClientOptions
|
||||||
|
{
|
||||||
|
public required string Uri { get; init; }
|
||||||
|
|
||||||
|
public string? Path { get; init; }
|
||||||
|
|
||||||
|
public Dictionary<string, object>? Headers { get; init; }
|
||||||
|
|
||||||
|
public Dictionary<string, object?>? QueryParams { get; init; }
|
||||||
|
|
||||||
|
public string RecipientQueryParamName { get; init; } = "to";
|
||||||
|
|
||||||
|
public string MessageQueryParamName { get; init; } = "text";
|
||||||
|
}
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
namespace EnvelopeGenerator.Application.Configurations
|
|
||||||
{
|
|
||||||
public class MailConfig
|
|
||||||
{
|
|
||||||
public required Dictionary<string, string> Placeholders { get; init; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
namespace EnvelopeGenerator.Application.Configurations;
|
||||||
|
|
||||||
|
public class MailParams
|
||||||
|
{
|
||||||
|
public required Dictionary<string, string> Placeholders { get; init; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
using OtpNet;
|
||||||
|
using System.Globalization;
|
||||||
|
|
||||||
|
namespace EnvelopeGenerator.Application.Configurations
|
||||||
|
{
|
||||||
|
public class TotpSmsParams
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The unit is second.
|
||||||
|
/// </summary>
|
||||||
|
public int TotpStep { get; init; } = 90;
|
||||||
|
|
||||||
|
public string Format { get; init; } = "Ihr 2FA-Passwort lautet {0}. Gültig bis {1}";
|
||||||
|
|
||||||
|
public ExpirationHandler Expiration { get; init; } = new();
|
||||||
|
|
||||||
|
public VerificationWindow? TotpVerificationWindow { get; private init; } = VerificationWindow.RfcSpecifiedNetworkDelay;
|
||||||
|
|
||||||
|
private IEnumerable<int>? _tvwParams;
|
||||||
|
|
||||||
|
public IEnumerable<int>? TotpVerificationWindowParams
|
||||||
|
{
|
||||||
|
get => _tvwParams;
|
||||||
|
init
|
||||||
|
{
|
||||||
|
_tvwParams = value;
|
||||||
|
if(_tvwParams is not null)
|
||||||
|
TotpVerificationWindow = new(previous: _tvwParams.ElementAtOrDefault(0), future: _tvwParams.ElementAtOrDefault(0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ExpirationHandler
|
||||||
|
{
|
||||||
|
public string CacheKeyFormat { get; init; } = "e{0}_r{1}_sms_code_expiration";
|
||||||
|
|
||||||
|
public string Format { get; init; } = "HH:mm:ss";
|
||||||
|
|
||||||
|
public string CultureName
|
||||||
|
{
|
||||||
|
get => _cultureInfo.Name;
|
||||||
|
init => _cultureInfo = new(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
private CultureInfo _cultureInfo = new("de-DE");
|
||||||
|
|
||||||
|
public CultureInfo CultureInfo => _cultureInfo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
namespace EnvelopeGenerator.Application.Contracts
|
namespace EnvelopeGenerator.Application.Contracts
|
||||||
{
|
{
|
||||||
public interface ICodeGenerator
|
public interface IAuthenticator
|
||||||
{
|
{
|
||||||
string GenerateCode(int length);
|
string GenerateCode(int length);
|
||||||
|
|
||||||
@@ -15,7 +15,5 @@ namespace EnvelopeGenerator.Application.Contracts
|
|||||||
string GenerateTotp(string secretKey, int step = 30);
|
string GenerateTotp(string secretKey, int step = 30);
|
||||||
|
|
||||||
bool VerifyTotp(string totpCode, string secretKey, int step = 30, VerificationWindow? window = null);
|
bool VerifyTotp(string totpCode, string secretKey, int step = 30, VerificationWindow? window = null);
|
||||||
|
|
||||||
bool GetTotpExpirationTime(int step = 30);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver;
|
||||||
|
using EnvelopeGenerator.Application.DTOs.Messaging;
|
||||||
|
|
||||||
|
namespace EnvelopeGenerator.Application.Contracts;
|
||||||
|
|
||||||
|
public interface IEnvelopeSmsHandler
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// If expiration is passed then, sends sms and returns smsResponse and up-to-date expiration; otherwise send expiration.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="er_secret"></param>
|
||||||
|
/// <param name="cToken"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<(SmsResponse? SmsResponse, DateTime Expiration)> SendTotpAsync(EnvelopeReceiverSecretDto er_secret, CancellationToken cToken = default);
|
||||||
|
|
||||||
|
bool VerifyTotp(string totpCode, string secretKey);
|
||||||
|
}
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
using Microsoft.IdentityModel.Tokens;
|
|
||||||
using System.IdentityModel.Tokens.Jwt;
|
|
||||||
using System.Security.Claims;
|
|
||||||
using System.Security.Cryptography;
|
|
||||||
|
|
||||||
namespace EnvelopeGenerator.Application.Contracts
|
|
||||||
{
|
|
||||||
public interface IJWTService<TClaimValue>
|
|
||||||
{
|
|
||||||
public static SymmetricSecurityKey GenerateSecurityKey(int byteSize = 32)
|
|
||||||
{
|
|
||||||
using var rng = RandomNumberGenerator.Create();
|
|
||||||
var randomBytes = new byte[byteSize];
|
|
||||||
rng.GetBytes(randomBytes);
|
|
||||||
var securityKey = new SymmetricSecurityKey(randomBytes);
|
|
||||||
|
|
||||||
return securityKey;
|
|
||||||
}
|
|
||||||
|
|
||||||
string GenerateToken(TClaimValue claimValue);
|
|
||||||
|
|
||||||
JwtSecurityToken? ReadSecurityToken(string token);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -2,11 +2,10 @@
|
|||||||
|
|
||||||
namespace EnvelopeGenerator.Application.Contracts;
|
namespace EnvelopeGenerator.Application.Contracts;
|
||||||
|
|
||||||
public interface IMessagingService
|
//TODO: move to DigitalData.Core
|
||||||
|
public interface ISmsSender
|
||||||
{
|
{
|
||||||
string ServiceProvider { get; }
|
string ServiceProvider { get; }
|
||||||
|
|
||||||
Task<SmsResponse> SendSmsAsync(string recipient, string message);
|
Task<SmsResponse> SendSmsAsync(string recipient, string message);
|
||||||
|
|
||||||
Task<SmsResponse> SendSmsCodeAsync(string recipient, string secretKey, string messageFormat = "{0}");
|
|
||||||
}
|
}
|
||||||
@@ -4,6 +4,8 @@
|
|||||||
{
|
{
|
||||||
public required bool Ok { get; init; }
|
public required bool Ok { get; init; }
|
||||||
|
|
||||||
|
public bool Failed => !Ok;
|
||||||
|
|
||||||
public dynamic? Errors { get; init; }
|
public dynamic? Errors { get; init; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4,7 +4,7 @@ using System.Text;
|
|||||||
|
|
||||||
namespace EnvelopeGenerator.Application.DTOs.Receiver
|
namespace EnvelopeGenerator.Application.DTOs.Receiver
|
||||||
{
|
{
|
||||||
public record ReceiverCreateDto([EmailAddress] string EmailAddress, string? TotpSecretkey = null, DateTime? TotpExpiration = null)
|
public record ReceiverCreateDto([EmailAddress] string EmailAddress, string? TotpSecretkey = null)
|
||||||
{
|
{
|
||||||
public string Signature => sha256HexOfMail.Value;
|
public string Signature => sha256HexOfMail.Value;
|
||||||
|
|
||||||
|
|||||||
@@ -4,23 +4,21 @@ using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes;
|
|||||||
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver;
|
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver;
|
||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
namespace EnvelopeGenerator.Application.DTOs.Receiver
|
namespace EnvelopeGenerator.Application.DTOs.Receiver;
|
||||||
|
|
||||||
|
public record ReceiverReadDto(
|
||||||
|
int Id,
|
||||||
|
string EmailAddress,
|
||||||
|
string Signature,
|
||||||
|
DateTime AddedWhen
|
||||||
|
) : BaseDTO<int>(Id), IUnique<int>
|
||||||
{
|
{
|
||||||
public record ReceiverReadDto(
|
[JsonIgnore]
|
||||||
int Id,
|
public IEnumerable<EnvelopeReceiverBasicDto>? EnvelopeReceivers { get; init; }
|
||||||
string EmailAddress,
|
|
||||||
string Signature,
|
|
||||||
DateTime AddedWhen
|
|
||||||
) : BaseDTO<int>(Id), IUnique<int>
|
|
||||||
{
|
|
||||||
[JsonIgnore]
|
|
||||||
public IEnumerable<EnvelopeReceiverBasicDto>? EnvelopeReceivers { get; init; }
|
|
||||||
|
|
||||||
public string? LastUsedName => EnvelopeReceivers?.LastOrDefault()?.Name;
|
public string? LastUsedName => EnvelopeReceivers?.LastOrDefault()?.Name;
|
||||||
|
|
||||||
public string? TotpSecretkey { get; set; } = null;
|
public string? TotpSecretkey { get; set; } = null;
|
||||||
|
|
||||||
[TemplatePlaceholder("[TFA_QR_EXPIRATION]")]
|
public DateTime? TfaRegDeadline { get; set; }
|
||||||
public DateTime? TotpExpiration { get; set; } = null;
|
};
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
using DigitalData.Core.Abstractions;
|
using DigitalData.Core.Abstractions;
|
||||||
|
|
||||||
namespace EnvelopeGenerator.Application.DTOs.Receiver
|
namespace EnvelopeGenerator.Application.DTOs.Receiver;
|
||||||
{
|
|
||||||
public record ReceiverUpdateDto(int Id, string? TotpSecretkey = null, DateTime? TotpExpiration = null) : IUnique<int>;
|
public record ReceiverUpdateDto(int Id, string? TotpSecretkey = null, DateTime? TfaRegDeadline = null) : IUnique<int>;
|
||||||
}
|
|
||||||
@@ -9,70 +9,61 @@ using Microsoft.Extensions.Configuration;
|
|||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.DependencyInjection.Extensions;
|
using Microsoft.Extensions.DependencyInjection.Extensions;
|
||||||
using DigitalData.Core.Client;
|
using DigitalData.Core.Client;
|
||||||
using EnvelopeGenerator.Application.Configurations.GtxMessaging;
|
|
||||||
using QRCoder;
|
using QRCoder;
|
||||||
|
|
||||||
namespace EnvelopeGenerator.Application.Extensions
|
namespace EnvelopeGenerator.Application.Extensions;
|
||||||
|
|
||||||
|
public static class DIExtensions
|
||||||
{
|
{
|
||||||
public static class DIExtensions
|
public static IServiceCollection AddEnvelopeGenerator(this IServiceCollection services, IConfiguration config)
|
||||||
{
|
{
|
||||||
public static IServiceCollection AddEnvelopeGenerator(this IServiceCollection services, IConfigurationSection dispatcherConfigSection, IConfigurationSection mailConfigSection, IConfigurationSection smsConfigSection, IConfigurationSection codeGeneratorConfigSection, IConfigurationSection envelopeReceiverCacheParamsSection)
|
//Inject CRUD Service and repositoriesad
|
||||||
{
|
services.TryAddScoped<IConfigRepository, ConfigRepository>();
|
||||||
//Inject CRUD Service and repositoriesad
|
services.TryAddScoped<IDocumentReceiverElementRepository, DocumentReceiverElementRepository>();
|
||||||
services.TryAddScoped<IConfigRepository, ConfigRepository>();
|
services.TryAddScoped<IEnvelopeDocumentRepository, EnvelopeDocumentRepository>();
|
||||||
services.TryAddScoped<IDocumentReceiverElementRepository, DocumentReceiverElementRepository>();
|
services.TryAddScoped<IConfigRepository, ConfigRepository>();
|
||||||
services.TryAddScoped<IEnvelopeDocumentRepository, EnvelopeDocumentRepository>();
|
services.TryAddScoped<IDocumentReceiverElementRepository, DocumentReceiverElementRepository>();
|
||||||
services.TryAddScoped<IConfigRepository, ConfigRepository>();
|
services.TryAddScoped<IDocumentStatusRepository, DocumentStatusRepository>();
|
||||||
services.TryAddScoped<IDocumentReceiverElementRepository, DocumentReceiverElementRepository>();
|
services.TryAddScoped<IEmailTemplateRepository, EmailTemplateRepository>();
|
||||||
services.TryAddScoped<IDocumentStatusRepository, DocumentStatusRepository>();
|
services.TryAddScoped<IEnvelopeRepository, EnvelopeRepository>();
|
||||||
services.TryAddScoped<IEmailTemplateRepository, EmailTemplateRepository>();
|
services.TryAddScoped<IEnvelopeCertificateRepository, EnvelopeCertificateRepository>();
|
||||||
services.TryAddScoped<IEnvelopeRepository, EnvelopeRepository>();
|
services.TryAddScoped<IEnvelopeDocumentRepository, EnvelopeDocumentRepository>();
|
||||||
services.TryAddScoped<IEnvelopeCertificateRepository, EnvelopeCertificateRepository>();
|
services.TryAddScoped<IEnvelopeHistoryRepository, EnvelopeHistoryRepository>();
|
||||||
services.TryAddScoped<IEnvelopeDocumentRepository, EnvelopeDocumentRepository>();
|
services.TryAddScoped<IEnvelopeReceiverRepository, EnvelopeReceiverRepository>();
|
||||||
services.TryAddScoped<IEnvelopeHistoryRepository, EnvelopeHistoryRepository>();
|
services.TryAddScoped<IEnvelopeTypeRepository, EnvelopeTypeRepository>();
|
||||||
services.TryAddScoped<IEnvelopeReceiverRepository, EnvelopeReceiverRepository>();
|
services.TryAddScoped<IReceiverRepository, ReceiverRepository>();
|
||||||
services.TryAddScoped<IEnvelopeTypeRepository, EnvelopeTypeRepository>();
|
services.TryAddScoped<IUserReceiverRepository, UserReceiverRepository>();
|
||||||
services.TryAddScoped<IReceiverRepository, ReceiverRepository>();
|
services.TryAddScoped<IEnvelopeReceiverReadOnlyRepository, EnvelopeReceiverReadOnlyRepository>();
|
||||||
services.TryAddScoped<IUserReceiverRepository, UserReceiverRepository>();
|
services.TryAddScoped<IConfigService, ConfigService>();
|
||||||
services.TryAddScoped<IEnvelopeReceiverReadOnlyRepository, EnvelopeReceiverReadOnlyRepository>();
|
services.TryAddScoped<IDocumentReceiverElementService, DocumentReceiverElementService>();
|
||||||
services.TryAddScoped<IConfigService, ConfigService>();
|
services.TryAddScoped<IEnvelopeDocumentService, EnvelopeDocumentService>();
|
||||||
services.TryAddScoped<IDocumentReceiverElementService, DocumentReceiverElementService>();
|
services.TryAddScoped<IEnvelopeHistoryService, EnvelopeHistoryService>();
|
||||||
services.TryAddScoped<IEnvelopeDocumentService, EnvelopeDocumentService>();
|
services.TryAddScoped<IDocumentStatusService, DocumentStatusService>();
|
||||||
services.TryAddScoped<IEnvelopeHistoryService, EnvelopeHistoryService>();
|
services.TryAddScoped<IEmailTemplateService, EmailTemplateService>();
|
||||||
services.TryAddScoped<IDocumentStatusService, DocumentStatusService>();
|
services.TryAddScoped<IEnvelopeService, EnvelopeService>();
|
||||||
services.TryAddScoped<IEmailTemplateService, EmailTemplateService>();
|
services.TryAddScoped<IEnvelopeCertificateService, EnvelopeCertificateService>();
|
||||||
services.TryAddScoped<IEnvelopeService, EnvelopeService>();
|
services.TryAddScoped<IEnvelopeDocumentService, EnvelopeDocumentService>();
|
||||||
services.TryAddScoped<IEnvelopeCertificateService, EnvelopeCertificateService>();
|
services.TryAddScoped<IEnvelopeReceiverService, EnvelopeReceiverService>();
|
||||||
services.TryAddScoped<IEnvelopeDocumentService, EnvelopeDocumentService>();
|
services.TryAddScoped<IEnvelopeTypeService, EnvelopeTypeService>();
|
||||||
services.TryAddScoped<IEnvelopeReceiverService, EnvelopeReceiverService>();
|
services.TryAddScoped<IReceiverService, ReceiverService>();
|
||||||
services.TryAddScoped<IEnvelopeTypeService, EnvelopeTypeService>();
|
services.TryAddScoped<IUserReceiverService, UserReceiverService>();
|
||||||
services.TryAddScoped<IReceiverService, ReceiverService>();
|
services.TryAddScoped<IEnvelopeReceiverReadOnlyService, EnvelopeReceiverReadOnlyService>();
|
||||||
services.TryAddScoped<IUserReceiverService, UserReceiverService>();
|
|
||||||
services.TryAddScoped<IEnvelopeReceiverReadOnlyService, EnvelopeReceiverReadOnlyService>();
|
|
||||||
|
|
||||||
//Auto mapping profiles
|
//Auto mapping profiles
|
||||||
services.AddAutoMapper(typeof(BasicDtoMappingProfile).Assembly);
|
services.AddAutoMapper(typeof(BasicDtoMappingProfile).Assembly);
|
||||||
services.AddAutoMapper(typeof(UserMappingProfile).Assembly);
|
services.AddAutoMapper(typeof(UserMappingProfile).Assembly);
|
||||||
|
|
||||||
services.Configure<DispatcherConfig>(dispatcherConfigSection);
|
services.Configure<DispatcherParams>(config.GetSection(nameof(DispatcherParams)));
|
||||||
services.Configure<MailConfig>(mailConfigSection);
|
services.Configure<MailParams>(config.GetSection(nameof(MailParams)));
|
||||||
services.Configure<CodeGeneratorParams>(codeGeneratorConfigSection);
|
services.Configure<AuthenticatorParams>(config.GetSection(nameof(AuthenticatorParams)));
|
||||||
services.Configure<EnvelopeReceiverCacheParams>(envelopeReceiverCacheParamsSection);
|
services.Configure<TotpSmsParams>(config.GetSection(nameof(TotpSmsParams)));
|
||||||
|
|
||||||
services.AddHttpClientService<SmsParams>(smsConfigSection);
|
services.AddHttpClientService<GtxMessagingParams>(config.GetSection(nameof(GtxMessagingParams)));
|
||||||
services.TryAddSingleton<IMessagingService, GtxMessagingService>();
|
services.TryAddSingleton<ISmsSender, GTXSmsSender>();
|
||||||
services.TryAddSingleton<ICodeGenerator, CodeGenerator>();
|
services.TryAddSingleton<IEnvelopeSmsHandler, EnvelopeSmsHandler>();
|
||||||
services.TryAddSingleton<IEnvelopeReceiverCache, EnvelopeReceiverCache>();
|
services.TryAddSingleton<IAuthenticator, Authenticator>();
|
||||||
services.TryAddSingleton<QRCodeGenerator>();
|
services.TryAddSingleton<QRCodeGenerator>();
|
||||||
|
|
||||||
return services;
|
return services;
|
||||||
}
|
|
||||||
|
|
||||||
public static IServiceCollection AddEnvelopeGenerator(this IServiceCollection services, IConfiguration config) => services.AddEnvelopeGenerator(
|
|
||||||
dispatcherConfigSection: config.GetSection("DispatcherConfig"),
|
|
||||||
mailConfigSection: config.GetSection("MailConfig"),
|
|
||||||
smsConfigSection: config.GetSection("SmsConfig"),
|
|
||||||
codeGeneratorConfigSection: config.GetSection("CodeGeneratorParams"),
|
|
||||||
envelopeReceiverCacheParamsSection: config.GetSection("EnvelopeReceiverCacheParams"));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
using EnvelopeGenerator.Application.DTOs.Receiver;
|
|
||||||
using EnvelopeGenerator.Extensions;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
|
|
||||||
namespace EnvelopeGenerator.Application.Extensions
|
|
||||||
{
|
|
||||||
public static class DTOExtensions
|
|
||||||
{
|
|
||||||
public static bool IsTotpSecretExpired(this ReceiverReadDto dto, int minutesBeforeExpiration = 30)
|
|
||||||
=> dto.TotpExpiration < DateTime.Now.AddMinutes(minutesBeforeExpiration * -1);
|
|
||||||
|
|
||||||
public static bool IsTotpSecretInvalid(this ReceiverReadDto dto, int minutesBeforeExpiration = 30)
|
|
||||||
=> dto.IsTotpSecretExpired(minutesBeforeExpiration) || dto.TotpSecretkey is null;
|
|
||||||
|
|
||||||
public static bool IsTotpSecretValid(this ReceiverReadDto dto, int minutesBeforeExpiration = 30)
|
|
||||||
=> !dto.IsTotpSecretInvalid(minutesBeforeExpiration);
|
|
||||||
|
|
||||||
public static bool IsTotpValid(this ReceiverReadDto dto, string totp) => dto.TotpSecretkey is null ? throw new ArgumentNullException(nameof(dto), $"TotpSecretkey of DTO cannot validate without TotpSecretkey. Dto: {JsonConvert.SerializeObject(dto)}") : totp.IsValidTotp(dto.TotpSecretkey);
|
|
||||||
|
|
||||||
public static bool IsTotpInvalid(this ReceiverReadDto dto, string totp) => !dto.IsTotpValid(totp: totp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -163,10 +163,10 @@
|
|||||||
<value>Bitte überprüfen Sie die Standortinformationen. Wenn sie falsch sind, korrigieren Sie diese bitte.</value>
|
<value>Bitte überprüfen Sie die Standortinformationen. Wenn sie falsch sind, korrigieren Sie diese bitte.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LockedBodyAccess" xml:space="preserve">
|
<data name="LockedBodyAccess" xml:space="preserve">
|
||||||
<value>Wir haben Ihnen gerade den Zugriffscode an die hinterlegte Email Adresse gesendet. Dies kann evtl. einige Minuten dauern.</value>
|
<value>Wir senden Ihnen nun einen Zugriffscode an Ihre hinterlegte Email-Adresse. Dies kann evtl. einige Minuten dauern!</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LockedBodyAuthenticator" xml:space="preserve">
|
<data name="LockedBodyAuthenticator" xml:space="preserve">
|
||||||
<value>Ihr QR-Code ist bis {0} gültig.</value>
|
<value>Bitte geben Sie den in Ihrer Authenticator-App angegebenen TOTP-Code ein.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LockedBodyAuthenticatorNew" xml:space="preserve">
|
<data name="LockedBodyAuthenticatorNew" xml:space="preserve">
|
||||||
<value>Wir haben den QR-Code an Ihre E-Mail-Adresse gesendet. Ihr QR-Code ist bis {0} gültig. Sie können ihn für alle Umschläge verwenden, die Sie an diese E-Mail-Adresse erhalten.</value>
|
<value>Wir haben den QR-Code an Ihre E-Mail-Adresse gesendet. Ihr QR-Code ist bis {0} gültig. Sie können ihn für alle Umschläge verwenden, die Sie an diese E-Mail-Adresse erhalten.</value>
|
||||||
@@ -184,7 +184,7 @@
|
|||||||
<value>SMS-Code</value>
|
<value>SMS-Code</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LockedFooterBodyAccess" xml:space="preserve">
|
<data name="LockedFooterBodyAccess" xml:space="preserve">
|
||||||
<value>Bitte überprüfen Sie Ihr Email Postfach inklusive Spam-Ordner. Sie können auch den Absender bitten, Ihnen den Code auf anderem Wege zukommen zu lassen.</value>
|
<value>Bitte überprüfen Sie Ihr Email Postfach inklusive Spam-Ordner. Sie können auch den Absender <a class="mail-link" href="mailto:{0}?subject={1}&body={2}" target="_blank">{0}</a> bitten, Ihnen den Code auf anderem Wege zukommen zu lassen.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LockedFooterBodyAuthenticator" xml:space="preserve">
|
<data name="LockedFooterBodyAuthenticator" xml:space="preserve">
|
||||||
<value>Der neue QR-Code wird nur einmal für einen bestimmten Zeitraum gesendet und nach dem Scannen in Ihrer Authenticator-App gespeichert. Er kann für alle Umschläge verwendet werden, die an dieselbe E-Mail-Adresse gesendet werden, bis er abläuft. Wenn Sie die QR-Code-Mail nicht erhalten oder sie sowohl aus der Mail als auch aus authenticator löschen, kontaktieren Sie bitte den Absender.</value>
|
<value>Der neue QR-Code wird nur einmal für einen bestimmten Zeitraum gesendet und nach dem Scannen in Ihrer Authenticator-App gespeichert. Er kann für alle Umschläge verwendet werden, die an dieselbe E-Mail-Adresse gesendet werden, bis er abläuft. Wenn Sie die QR-Code-Mail nicht erhalten oder sie sowohl aus der Mail als auch aus authenticator löschen, kontaktieren Sie bitte den Absender.</value>
|
||||||
|
|||||||
@@ -163,10 +163,10 @@
|
|||||||
<value>Please review the location information. If it is incorrect, kindly make the necessary corrections.</value>
|
<value>Please review the location information. If it is incorrect, kindly make the necessary corrections.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LockedBodyAccess" xml:space="preserve">
|
<data name="LockedBodyAccess" xml:space="preserve">
|
||||||
<value>We have just sent you the access code to the email address you provided. This may take a few minutes.</value>
|
<value>We will now send you an access code to your registered e-mail address. This may take a few minutes!</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LockedBodyAuthenticator" xml:space="preserve">
|
<data name="LockedBodyAuthenticator" xml:space="preserve">
|
||||||
<value>Your QR code is valid until {0}.</value>
|
<value>Please enter the TOTP provided in your Authenticator app.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LockedBodyAuthenticatorNew" xml:space="preserve">
|
<data name="LockedBodyAuthenticatorNew" xml:space="preserve">
|
||||||
<value>We have sent the QR code to your e-mail address. Your QR code is valid until {0}. You can use it for all envelopes received at this email address.</value>
|
<value>We have sent the QR code to your e-mail address. Your QR code is valid until {0}. You can use it for all envelopes received at this email address.</value>
|
||||||
@@ -184,7 +184,7 @@
|
|||||||
<value>SMS Code</value>
|
<value>SMS Code</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LockedFooterBodyAccess" xml:space="preserve">
|
<data name="LockedFooterBodyAccess" xml:space="preserve">
|
||||||
<value>Please check your email inbox including your spam folder. Furthermore, you can also ask the sender to send the code by other means.</value>
|
<value>Please check your email inbox including the spam folder. You can also ask the sender <a class="mail-link" href="mailto:{0}?subject={1}&body={2}" target="_blank">{0}</a> to send you the code by other means.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="LockedFooterBodyAuthenticator" xml:space="preserve">
|
<data name="LockedFooterBodyAuthenticator" xml:space="preserve">
|
||||||
<value>The new QR code is sent only once for a given period and is saved in your authenticator app once scanned. It can be used for all envelopes received at the same email address until it expires. If you do not receive the QR code mail or delete it both from the mail and from authenticator, please contact the sender.</value>
|
<value>The new QR code is sent only once for a given period and is saved in your authenticator app once scanned. It can be used for all envelopes received at the same email address until it expires. If you do not receive the QR code mail or delete it both from the mail and from authenticator, please contact the sender.</value>
|
||||||
|
|||||||
@@ -7,17 +7,17 @@ using System.Text;
|
|||||||
|
|
||||||
namespace EnvelopeGenerator.Application.Services
|
namespace EnvelopeGenerator.Application.Services
|
||||||
{
|
{
|
||||||
public class CodeGenerator : ICodeGenerator
|
public class Authenticator : IAuthenticator
|
||||||
{
|
{
|
||||||
public static Lazy<CodeGenerator> LazyStatic => new(() => new CodeGenerator(Options.Create<CodeGeneratorParams>(new()), new QRCodeGenerator()));
|
public static Lazy<Authenticator> LazyStatic => new(() => new Authenticator(Options.Create<AuthenticatorParams>(new()), new QRCodeGenerator()));
|
||||||
|
|
||||||
public static CodeGenerator Static => LazyStatic.Value;
|
public static Authenticator Static => LazyStatic.Value;
|
||||||
|
|
||||||
private readonly CodeGeneratorParams _params;
|
private readonly AuthenticatorParams _params;
|
||||||
|
|
||||||
private readonly QRCodeGenerator _qrCodeGenerator;
|
private readonly QRCodeGenerator _qrCodeGenerator;
|
||||||
|
|
||||||
public CodeGenerator(IOptions<CodeGeneratorParams> options, QRCodeGenerator qrCodeGenerator)
|
public Authenticator(IOptions<AuthenticatorParams> options, QRCodeGenerator qrCodeGenerator)
|
||||||
{
|
{
|
||||||
_params = options.Value;
|
_params = options.Value;
|
||||||
_qrCodeGenerator = qrCodeGenerator;
|
_qrCodeGenerator = qrCodeGenerator;
|
||||||
@@ -67,10 +67,5 @@ namespace EnvelopeGenerator.Application.Services
|
|||||||
|
|
||||||
public bool VerifyTotp(string totpCode, string secretKey, int step = 30, VerificationWindow? window = null)
|
public bool VerifyTotp(string totpCode, string secretKey, int step = 30, VerificationWindow? window = null)
|
||||||
=> new Totp(Base32Encoding.ToBytes(secretKey), step).VerifyTotp(totpCode, out _, window);
|
=> new Totp(Base32Encoding.ToBytes(secretKey), step).VerifyTotp(totpCode, out _, window);
|
||||||
|
|
||||||
public bool GetTotpExpirationTime(int step = 30)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -21,19 +21,19 @@ namespace EnvelopeGenerator.Application.Services
|
|||||||
{
|
{
|
||||||
private readonly IEmailTemplateService _tempService;
|
private readonly IEmailTemplateService _tempService;
|
||||||
private readonly IEnvelopeReceiverService _envRcvService;
|
private readonly IEnvelopeReceiverService _envRcvService;
|
||||||
private readonly DispatcherConfig _dConfig;
|
private readonly DispatcherParams _dConfig;
|
||||||
private readonly IConfigService _configService;
|
private readonly IConfigService _configService;
|
||||||
private readonly Dictionary<string, string> _placeholders;
|
private readonly Dictionary<string, string> _placeholders;
|
||||||
private readonly ICodeGenerator _codeGenerator;
|
private readonly IAuthenticator _authenticator;
|
||||||
|
|
||||||
public EnvelopeMailService(IEmailOutRepository repository, IMapper mapper, IEmailTemplateService tempService, IEnvelopeReceiverService envelopeReceiverService, IOptions<DispatcherConfig> dispatcherConfigOptions, IConfigService configService, IOptions<MailConfig> mailConfig, ICodeGenerator codeGenerator) : base(repository, mapper)
|
public EnvelopeMailService(IEmailOutRepository repository, IMapper mapper, IEmailTemplateService tempService, IEnvelopeReceiverService envelopeReceiverService, IOptions<DispatcherParams> dispatcherConfigOptions, IConfigService configService, IOptions<MailParams> mailConfig, IAuthenticator authenticator) : base(repository, mapper)
|
||||||
{
|
{
|
||||||
_tempService = tempService;
|
_tempService = tempService;
|
||||||
_envRcvService = envelopeReceiverService;
|
_envRcvService = envelopeReceiverService;
|
||||||
_dConfig = dispatcherConfigOptions.Value;
|
_dConfig = dispatcherConfigOptions.Value;
|
||||||
_configService = configService;
|
_configService = configService;
|
||||||
_placeholders = mailConfig.Value.Placeholders;
|
_placeholders = mailConfig.Value.Placeholders;
|
||||||
_codeGenerator = codeGenerator;
|
_authenticator = authenticator;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<Dictionary<string, string>> CreatePlaceholders(string? accessCode = null, EnvelopeReceiverDto? envelopeReceiverDto = null)
|
private async Task<Dictionary<string, string>> CreatePlaceholders(string? accessCode = null, EnvelopeReceiverDto? envelopeReceiverDto = null)
|
||||||
@@ -164,14 +164,11 @@ namespace EnvelopeGenerator.Application.Services
|
|||||||
throw new ArgumentNullException(nameof(dto), $"TFA Qr Code cannot sent. Receiver information is missing. Envelope receiver dto is {JsonConvert.SerializeObject(dto)}");
|
throw new ArgumentNullException(nameof(dto), $"TFA Qr Code cannot sent. Receiver information is missing. Envelope receiver dto is {JsonConvert.SerializeObject(dto)}");
|
||||||
if (dto.Receiver.TotpSecretkey is null)
|
if (dto.Receiver.TotpSecretkey is null)
|
||||||
throw new ArgumentNullException(nameof(dto), $"TFA Qr Code cannot sent. Receiver.TotpSecretKey is null. Envelope receiver dto is {JsonConvert.SerializeObject(dto)}");
|
throw new ArgumentNullException(nameof(dto), $"TFA Qr Code cannot sent. Receiver.TotpSecretKey is null. Envelope receiver dto is {JsonConvert.SerializeObject(dto)}");
|
||||||
if (dto.Receiver.TotpExpiration is null)
|
|
||||||
throw new ArgumentNullException(nameof(dto), $"TFA Qr Code cannot sent. Receiver.TotpExpiration is null. Envelope receiver dto is {JsonConvert.SerializeObject(dto)}");
|
|
||||||
|
|
||||||
var totp_qr_64 = _codeGenerator.GenerateTotpQrCode(userEmail: dto.Receiver.EmailAddress, secretKey: dto.Receiver.TotpSecretkey).ToBase64String();
|
var totp_qr_64 = _authenticator.GenerateTotpQrCode(userEmail: dto.Receiver.EmailAddress, secretKey: dto.Receiver.TotpSecretkey).ToBase64String();
|
||||||
return SendAsync(dto, EmailTemplateType.TotpSecret, new()
|
return SendAsync(dto, EmailTemplateType.TotpSecret, new()
|
||||||
{
|
{
|
||||||
{"[TFA_QR_CODE]", totp_qr_64 },
|
{"[TFA_QR_CODE]", totp_qr_64 },
|
||||||
{"[TFA_EXPIRATION]", dto.Receiver.TotpExpiration }
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,13 +17,13 @@ namespace EnvelopeGenerator.Application.Services
|
|||||||
{
|
{
|
||||||
private readonly IStringLocalizer<Resource> _localizer;
|
private readonly IStringLocalizer<Resource> _localizer;
|
||||||
|
|
||||||
private readonly IMessagingService _messagingService;
|
private readonly ISmsSender _smsSender;
|
||||||
|
|
||||||
public EnvelopeReceiverService(IEnvelopeReceiverRepository repository, IStringLocalizer<Resource> localizer, IMapper mapper, IMessagingService messagingService)
|
public EnvelopeReceiverService(IEnvelopeReceiverRepository repository, IStringLocalizer<Resource> localizer, IMapper mapper, ISmsSender smsSender)
|
||||||
: base(repository, mapper)
|
: base(repository, mapper)
|
||||||
{
|
{
|
||||||
_localizer = localizer;
|
_localizer = localizer;
|
||||||
_messagingService = messagingService;
|
_smsSender = smsSender;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadBySignatureAsync(string signature, bool withEnvelope = false, bool withReceiver = true, bool readOnly = true)
|
public async Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadBySignatureAsync(string signature, bool withEnvelope = false, bool withReceiver = true, bool readOnly = true)
|
||||||
@@ -171,7 +171,7 @@ namespace EnvelopeGenerator.Application.Services
|
|||||||
.Message(Key.PhoneNumberNonexists)
|
.Message(Key.PhoneNumberNonexists)
|
||||||
.Notice(LogLevel.Error, Flag.NotFound, $"An attempt was made to send sms to the user whose phone number is null. Envelope recipient ID is {envelopeReceiverId}, UUID is {uuid} and signature is {signature}.");
|
.Notice(LogLevel.Error, Flag.NotFound, $"An attempt was made to send sms to the user whose phone number is null. Envelope recipient ID is {envelopeReceiverId}, UUID is {uuid} and signature is {signature}.");
|
||||||
|
|
||||||
var res = await _messagingService.SendSmsAsync(recipient: env_rcv.PhoneNumber, message: message);
|
var res = await _smsSender.SendSmsAsync(recipient: env_rcv.PhoneNumber, message: message);
|
||||||
|
|
||||||
return Result.Success(res);
|
return Result.Success(res);
|
||||||
}
|
}
|
||||||
|
|||||||
54
EnvelopeGenerator.Application/Services/EnvelopeSmsHandler.cs
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
using EnvelopeGenerator.Application.Configurations;
|
||||||
|
using EnvelopeGenerator.Application.Contracts;
|
||||||
|
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver;
|
||||||
|
using EnvelopeGenerator.Application.DTOs.Messaging;
|
||||||
|
using EnvelopeGenerator.Application.Extensions;
|
||||||
|
using Microsoft.Extensions.Caching.Distributed;
|
||||||
|
using Microsoft.Extensions.Options;
|
||||||
|
|
||||||
|
namespace EnvelopeGenerator.Application.Services;
|
||||||
|
|
||||||
|
public class EnvelopeSmsHandler : IEnvelopeSmsHandler
|
||||||
|
{
|
||||||
|
private readonly ISmsSender _sender;
|
||||||
|
|
||||||
|
private readonly TotpSmsParams _totpSmsParams;
|
||||||
|
|
||||||
|
private readonly IDistributedCache _dCache;
|
||||||
|
|
||||||
|
private readonly IAuthenticator _authenticator;
|
||||||
|
|
||||||
|
public EnvelopeSmsHandler(ISmsSender sender, IOptions<TotpSmsParams> totpSmsParamsOptions, IDistributedCache distributedCache, IAuthenticator authenticator)
|
||||||
|
{
|
||||||
|
_sender = sender;
|
||||||
|
_totpSmsParams = totpSmsParamsOptions.Value;
|
||||||
|
_dCache = distributedCache;
|
||||||
|
_authenticator = authenticator;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// If expiration is passed then, sends sms and returns smsResponse and up-to-date expiration; otherwise send expiration.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="er_secret"></param>
|
||||||
|
/// <param name="cToken"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task<(SmsResponse? SmsResponse, DateTime Expiration)> SendTotpAsync(EnvelopeReceiverSecretDto er_secret, CancellationToken cToken = default)
|
||||||
|
{
|
||||||
|
var key = string.Format(_totpSmsParams.Expiration.CacheKeyFormat, er_secret.EnvelopeId, er_secret.ReceiverId);
|
||||||
|
var expiration = await _dCache.GetDateTimeAsync(key, cToken);
|
||||||
|
|
||||||
|
if(expiration is DateTime expirationDateTime && expirationDateTime >= DateTime.Now)
|
||||||
|
return (null, expirationDateTime);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var new_expiration = DateTime.Now.AddSeconds(_totpSmsParams.TotpStep);
|
||||||
|
var totp = _authenticator.GenerateTotp(er_secret.Receiver!.TotpSecretkey!, _totpSmsParams.TotpStep);
|
||||||
|
var msg = string.Format(_totpSmsParams.Format, totp, new_expiration.ToString(_totpSmsParams.Expiration.Format, _totpSmsParams.Expiration.CultureInfo));
|
||||||
|
await _dCache.SetDateTimeAsync(key, new_expiration, cToken: cToken);
|
||||||
|
return (await _sender.SendSmsAsync(er_secret.PhoneNumber!, msg), new_expiration);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool VerifyTotp(string totpCode, string secretKey) => _authenticator
|
||||||
|
.VerifyTotp(totpCode, secretKey, _totpSmsParams.TotpStep, _totpSmsParams.TotpVerificationWindow);
|
||||||
|
}
|
||||||
@@ -1,32 +1,30 @@
|
|||||||
using AutoMapper;
|
using AutoMapper;
|
||||||
using DigitalData.Core.Abstractions.Client;
|
using DigitalData.Core.Abstractions.Client;
|
||||||
using DigitalData.Core.Client;
|
using DigitalData.Core.Client;
|
||||||
using EnvelopeGenerator.Application.Configurations.GtxMessaging;
|
using EnvelopeGenerator.Application.Configurations;
|
||||||
using EnvelopeGenerator.Application.Contracts;
|
using EnvelopeGenerator.Application.Contracts;
|
||||||
using EnvelopeGenerator.Application.DTOs.Messaging;
|
using EnvelopeGenerator.Application.DTOs.Messaging;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
|
|
||||||
namespace EnvelopeGenerator.Application.Services;
|
namespace EnvelopeGenerator.Application.Services;
|
||||||
|
|
||||||
public class GtxMessagingService : IMessagingService
|
//TODO: move to DigitalData.Core
|
||||||
|
public class GTXSmsSender : ISmsSender
|
||||||
{
|
{
|
||||||
private readonly IHttpClientService<SmsParams> _smsClient;
|
private readonly IHttpClientService<GtxMessagingParams> _smsClient;
|
||||||
|
|
||||||
private readonly SmsParams _smsParams;
|
private readonly GtxMessagingParams _smsParams;
|
||||||
|
|
||||||
private readonly IMapper _mapper;
|
private readonly IMapper _mapper;
|
||||||
|
|
||||||
private readonly ICodeGenerator _codeGen;
|
|
||||||
|
|
||||||
public string ServiceProvider { get; }
|
public string ServiceProvider { get; }
|
||||||
|
|
||||||
public GtxMessagingService(IHttpClientService<SmsParams> smsClient, IOptions<SmsParams> smsParamsOptions, IMapper mapper, ICodeGenerator codeGenerator)
|
public GTXSmsSender(IHttpClientService<GtxMessagingParams> smsClient, IOptions<GtxMessagingParams> smsParamsOptions, IMapper mapper)
|
||||||
{
|
{
|
||||||
_smsClient = smsClient;
|
_smsClient = smsClient;
|
||||||
_smsParams = smsParamsOptions.Value;
|
_smsParams = smsParamsOptions.Value;
|
||||||
_mapper = mapper;
|
_mapper = mapper;
|
||||||
ServiceProvider = GetType().Name.Replace("Service", string.Empty);
|
ServiceProvider = GetType().Name.Replace("Service", string.Empty);
|
||||||
_codeGen = codeGenerator;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<SmsResponse> SendSmsAsync(string recipient, string message)
|
public async Task<SmsResponse> SendSmsAsync(string recipient, string message)
|
||||||
@@ -39,11 +37,4 @@ public class GtxMessagingService : IMessagingService
|
|||||||
.ThenAsync(res => res.Json<GtxMessagingResponse>())
|
.ThenAsync(res => res.Json<GtxMessagingResponse>())
|
||||||
.ThenAsync(_mapper.Map<SmsResponse>);
|
.ThenAsync(_mapper.Map<SmsResponse>);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<SmsResponse> SendSmsCodeAsync(string recipient, string secretKey, string? messageFormat = null)
|
|
||||||
{
|
|
||||||
var code = _codeGen.GenerateTotp(secretKey, _smsParams.SmsTotpStep);
|
|
||||||
var message = string.Format(messageFormat ?? _smsParams.DefaultTotpMessageFormat, code);
|
|
||||||
return await SendSmsAsync(recipient: recipient, message: message);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -112,6 +112,13 @@
|
|||||||
End Enum
|
End Enum
|
||||||
#End Region
|
#End Region
|
||||||
|
|
||||||
|
#Region "Role"
|
||||||
|
Public NotInheritable Class ReceiverRole
|
||||||
|
Public Const PreAuth As String = "PreAuth"
|
||||||
|
Public Const FullyAuth As String = "FullyAuth"
|
||||||
|
End Class
|
||||||
|
#End Region
|
||||||
|
|
||||||
#Region "Constants"
|
#Region "Constants"
|
||||||
|
|
||||||
Public Const DATABASE = "DATABASE"
|
Public Const DATABASE = "DATABASE"
|
||||||
|
|||||||
@@ -6,4 +6,6 @@
|
|||||||
Public Property SendingProfile As Integer = 0
|
Public Property SendingProfile As Integer = 0
|
||||||
Public Property SignatureHost As String = ""
|
Public Property SignatureHost As String = ""
|
||||||
Public Property Default_TFA_Enabled As Boolean = False
|
Public Property Default_TFA_Enabled As Boolean = False
|
||||||
|
Public Property Default_TFA_WithPhone As Boolean = False
|
||||||
|
|
||||||
End Class
|
End Class
|
||||||
|
|||||||
@@ -22,7 +22,8 @@ Public Class ConfigModel
|
|||||||
.SendingProfile = oRow.ItemEx("SENDING_PROFILE", 0),
|
.SendingProfile = oRow.ItemEx("SENDING_PROFILE", 0),
|
||||||
.SignatureHost = oRow.ItemEx("SIGNATURE_HOST", ""),
|
.SignatureHost = oRow.ItemEx("SIGNATURE_HOST", ""),
|
||||||
.ExternalProgramName = oRow.ItemEx("EXTERNAL_PROGRAM_NAME", ""),
|
.ExternalProgramName = oRow.ItemEx("EXTERNAL_PROGRAM_NAME", ""),
|
||||||
.Default_TFA_Enabled = oRow.ItemEx("DEF_TFA_ENABLED", False)
|
.Default_TFA_Enabled = oRow.ItemEx("DEF_TFA_ENABLED", False),
|
||||||
|
.Default_TFA_WithPhone = oRow.ItemEx("DEF_TFA_WITH_PHONE", False)
|
||||||
}
|
}
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
Logger.Error(ex)
|
Logger.Error(ex)
|
||||||
|
|||||||
@@ -277,7 +277,7 @@ Public Class ReceiverModel
|
|||||||
Try
|
Try
|
||||||
Dim oSql As String
|
Dim oSql As String
|
||||||
oSql = "SELECT TOP 1 [PHONE_NUMBER] FROM dbo.VWSIG_ENVELOPE_RECEIVERS "
|
oSql = "SELECT TOP 1 [PHONE_NUMBER] FROM dbo.VWSIG_ENVELOPE_RECEIVERS "
|
||||||
oSql += $" WHERE ENV_USERID_CREATED = {pUserId}) "
|
oSql += $" WHERE ENV_USERID_CREATED = {pUserId} "
|
||||||
oSql += $" AND EMAIL_ADDRESS = '{pEmailAddress}' "
|
oSql += $" AND EMAIL_ADDRESS = '{pEmailAddress}' "
|
||||||
oSql += " AND Len([PHONE_NUMBER]) > 0 "
|
oSql += " AND Len([PHONE_NUMBER]) > 0 "
|
||||||
oSql += " ORDER BY [ADDED_WHEN] DESC"
|
oSql += " ORDER BY [ADDED_WHEN] DESC"
|
||||||
|
|||||||
@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
|
|||||||
' indem Sie "*" wie unten gezeigt eingeben:
|
' indem Sie "*" wie unten gezeigt eingeben:
|
||||||
' <Assembly: AssemblyVersion("1.0.*")>
|
' <Assembly: AssemblyVersion("1.0.*")>
|
||||||
|
|
||||||
<Assembly: AssemblyVersion("2.2.0.0")>
|
<Assembly: AssemblyVersion("2.3.0.0")>
|
||||||
<Assembly: AssemblyFileVersion("2.2.0.0")>
|
<Assembly: AssemblyFileVersion("2.3.0.0")>
|
||||||
|
|||||||
@@ -50,6 +50,6 @@ namespace EnvelopeGenerator.Domain.Entities
|
|||||||
public (int Envelope, int Receiver) Id => (Envelope: EnvelopeId, Receiver: ReceiverId);
|
public (int Envelope, int Receiver) Id => (Envelope: EnvelopeId, Receiver: ReceiverId);
|
||||||
|
|
||||||
[NotMapped]
|
[NotMapped]
|
||||||
public bool HasPhoneNumber => PhoneNumber is not null;
|
public bool HasPhoneNumber => !string.IsNullOrWhiteSpace(PhoneNumber);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2,34 +2,33 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
|
|
||||||
namespace EnvelopeGenerator.Domain.Entities
|
namespace EnvelopeGenerator.Domain.Entities;
|
||||||
|
|
||||||
|
[Table("TBSIG_RECEIVER", Schema = "dbo")]
|
||||||
|
public class Receiver : IUnique<int>
|
||||||
{
|
{
|
||||||
[Table("TBSIG_RECEIVER", Schema = "dbo")]
|
[Key]
|
||||||
public class Receiver : IUnique<int>
|
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
||||||
{
|
[Column("GUID")]
|
||||||
[Key]
|
public int Id { get; set; }
|
||||||
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
|
|
||||||
[Column("GUID")]
|
[Required, EmailAddress]
|
||||||
public int Id { get; set; }
|
[Column("EMAIL_ADDRESS", TypeName = "nvarchar(128)")]
|
||||||
|
public required string EmailAddress { get; set; }
|
||||||
[Required, EmailAddress]
|
|
||||||
[Column("EMAIL_ADDRESS", TypeName = "nvarchar(128)")]
|
|
||||||
public required string EmailAddress { get; set; }
|
|
||||||
|
|
||||||
[Required]
|
[Required]
|
||||||
[Column("SIGNATURE", TypeName = "nvarchar(64)")]
|
[Column("SIGNATURE", TypeName = "nvarchar(64)")]
|
||||||
public required string Signature { get; set; }
|
public required string Signature { get; set; }
|
||||||
|
|
||||||
[Required]
|
[Required]
|
||||||
[Column("ADDED_WHEN", TypeName = "datetime")]
|
[Column("ADDED_WHEN", TypeName = "datetime")]
|
||||||
public DateTime AddedWhen { get; set; }
|
public DateTime AddedWhen { get; set; }
|
||||||
|
|
||||||
[Column("TOTP_SECRET_KEY", TypeName = "nvarchar(MAX)")]
|
[Column("TOTP_SECRET_KEY", TypeName = "nvarchar(MAX)")]
|
||||||
public string? TotpSecretkey { get; set; }
|
public string? TotpSecretkey { get; set; }
|
||||||
|
|
||||||
[Column("TOTP_EXPIRATION", TypeName = "datetime")]
|
[Column("TFA_REG_DEADLINE", TypeName = "datetime")]
|
||||||
public DateTime? TotpExpiration { get; set; }
|
public DateTime? TfaRegDeadline { get; set; }
|
||||||
|
|
||||||
public IEnumerable<EnvelopeReceiver>? EnvelopeReceivers { get; init; }
|
public IEnumerable<EnvelopeReceiver>? EnvelopeReceivers { get; init; }
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -54,6 +54,7 @@
|
|||||||
<Reference Include="DevExpress.Charts.v21.2.Core, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
|
<Reference Include="DevExpress.Charts.v21.2.Core, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
|
||||||
<Reference Include="DevExpress.Data.v21.2" />
|
<Reference Include="DevExpress.Data.v21.2" />
|
||||||
<Reference Include="DevExpress.Data.Desktop.v21.2" />
|
<Reference Include="DevExpress.Data.Desktop.v21.2" />
|
||||||
|
<Reference Include="DevExpress.Dialogs.v21.2.Core, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
|
||||||
<Reference Include="DevExpress.Utils.v21.2" />
|
<Reference Include="DevExpress.Utils.v21.2" />
|
||||||
<Reference Include="DevExpress.Sparkline.v21.2.Core" />
|
<Reference Include="DevExpress.Sparkline.v21.2.Core" />
|
||||||
<Reference Include="DevExpress.Utils.v21.2.UI, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
|
<Reference Include="DevExpress.Utils.v21.2.UI, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
|
||||||
@@ -64,6 +65,7 @@
|
|||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="DevExpress.XtraCharts.v21.2.UI, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
|
<Reference Include="DevExpress.XtraCharts.v21.2.UI, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
|
||||||
<Reference Include="DevExpress.XtraCharts.v21.2.Wizard, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
|
<Reference Include="DevExpress.XtraCharts.v21.2.Wizard, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
|
||||||
|
<Reference Include="DevExpress.XtraDialogs.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
|
||||||
<Reference Include="DevExpress.XtraEditors.v21.2" />
|
<Reference Include="DevExpress.XtraEditors.v21.2" />
|
||||||
<Reference Include="DevExpress.Printing.v21.2.Core" />
|
<Reference Include="DevExpress.Printing.v21.2.Core" />
|
||||||
<Reference Include="DevExpress.XtraGrid.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
|
<Reference Include="DevExpress.XtraGrid.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
|
||||||
@@ -167,6 +169,12 @@
|
|||||||
<Compile Include="frmMain.vb">
|
<Compile Include="frmMain.vb">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="frmOrderFiles.Designer.vb">
|
||||||
|
<DependentUpon>frmOrderFiles.vb</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="frmOrderFiles.vb">
|
||||||
|
<SubType>Form</SubType>
|
||||||
|
</Compile>
|
||||||
<Compile Include="frmRueckruf.Designer.vb">
|
<Compile Include="frmRueckruf.Designer.vb">
|
||||||
<DependentUpon>frmRueckruf.vb</DependentUpon>
|
<DependentUpon>frmRueckruf.vb</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
@@ -222,6 +230,9 @@
|
|||||||
<DependentUpon>frmMain.vb</DependentUpon>
|
<DependentUpon>frmMain.vb</DependentUpon>
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="frmOrderFiles.resx">
|
||||||
|
<DependentUpon>frmOrderFiles.vb</DependentUpon>
|
||||||
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="frmRueckruf.resx">
|
<EmbeddedResource Include="frmRueckruf.resx">
|
||||||
<DependentUpon>frmRueckruf.vb</DependentUpon>
|
<DependentUpon>frmRueckruf.vb</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ Module ModuleSettings
|
|||||||
Public MS_GDPICTUREKEY As String = ""
|
Public MS_GDPICTUREKEY As String = ""
|
||||||
Public DB_DD_ECM As MSSQLServer = Nothing
|
Public DB_DD_ECM As MSSQLServer = Nothing
|
||||||
Public DEF_TF_ENABLED As Boolean = False
|
Public DEF_TF_ENABLED As Boolean = False
|
||||||
|
Public DEF_TF_ENABLED_WITH_PHONE As Boolean = False
|
||||||
Public MYUSER As User
|
Public MYUSER As User
|
||||||
Public MyTempFiles As TempFiles
|
Public MyTempFiles As TempFiles
|
||||||
Public SQL_REP_ENV_USER_LM As String = ""
|
Public SQL_REP_ENV_USER_LM As String = ""
|
||||||
|
|||||||
16
EnvelopeGenerator.Form/frmEnvelopeEditor.Designer.vb
generated
@@ -60,6 +60,7 @@ Partial Public Class frmEnvelopeEditor
|
|||||||
Me.BarButtonItem2 = New DevExpress.XtraBars.BarButtonItem()
|
Me.BarButtonItem2 = New DevExpress.XtraBars.BarButtonItem()
|
||||||
Me.BarButtonItem3 = New DevExpress.XtraBars.BarButtonItem()
|
Me.BarButtonItem3 = New DevExpress.XtraBars.BarButtonItem()
|
||||||
Me.bbtnitm_ConcatFiles = New DevExpress.XtraBars.BarButtonItem()
|
Me.bbtnitm_ConcatFiles = New DevExpress.XtraBars.BarButtonItem()
|
||||||
|
Me.btnShowFile = New DevExpress.XtraBars.BarButtonItem()
|
||||||
Me.RibbonPage1 = New DevExpress.XtraBars.Ribbon.RibbonPage()
|
Me.RibbonPage1 = New DevExpress.XtraBars.Ribbon.RibbonPage()
|
||||||
Me.RibbonPageGroup1 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup()
|
Me.RibbonPageGroup1 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup()
|
||||||
Me.RibbonPageGroupDocuments = New DevExpress.XtraBars.Ribbon.RibbonPageGroup()
|
Me.RibbonPageGroupDocuments = New DevExpress.XtraBars.Ribbon.RibbonPageGroup()
|
||||||
@@ -101,7 +102,6 @@ Partial Public Class frmEnvelopeEditor
|
|||||||
Me.EnvelopeDocumentBindingSource = New System.Windows.Forms.BindingSource(Me.components)
|
Me.EnvelopeDocumentBindingSource = New System.Windows.Forms.BindingSource(Me.components)
|
||||||
Me.OpenFileDialog1 = New System.Windows.Forms.OpenFileDialog()
|
Me.OpenFileDialog1 = New System.Windows.Forms.OpenFileDialog()
|
||||||
Me.txtEnvelopeIdLabel = New DevExpress.XtraBars.BarStaticItem()
|
Me.txtEnvelopeIdLabel = New DevExpress.XtraBars.BarStaticItem()
|
||||||
Me.btnShowFile = New DevExpress.XtraBars.BarButtonItem()
|
|
||||||
CType(Me.SplitContainerControl1, System.ComponentModel.ISupportInitialize).BeginInit()
|
CType(Me.SplitContainerControl1, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
CType(Me.SplitContainerControl1.Panel1, System.ComponentModel.ISupportInitialize).BeginInit()
|
CType(Me.SplitContainerControl1.Panel1, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
Me.SplitContainerControl1.Panel1.SuspendLayout()
|
Me.SplitContainerControl1.Panel1.SuspendLayout()
|
||||||
@@ -359,6 +359,13 @@ Partial Public Class frmEnvelopeEditor
|
|||||||
Me.bbtnitm_ConcatFiles.ImageOptions.SvgImage = CType(resources.GetObject("bbtnitm_ConcatFiles.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
|
Me.bbtnitm_ConcatFiles.ImageOptions.SvgImage = CType(resources.GetObject("bbtnitm_ConcatFiles.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
|
||||||
Me.bbtnitm_ConcatFiles.Name = "bbtnitm_ConcatFiles"
|
Me.bbtnitm_ConcatFiles.Name = "bbtnitm_ConcatFiles"
|
||||||
'
|
'
|
||||||
|
'btnShowFile
|
||||||
|
'
|
||||||
|
resources.ApplyResources(Me.btnShowFile, "btnShowFile")
|
||||||
|
Me.btnShowFile.Id = 17
|
||||||
|
Me.btnShowFile.ImageOptions.SvgImage = CType(resources.GetObject("btnShowFile.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
|
||||||
|
Me.btnShowFile.Name = "btnShowFile"
|
||||||
|
'
|
||||||
'RibbonPage1
|
'RibbonPage1
|
||||||
'
|
'
|
||||||
Me.RibbonPage1.Groups.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageGroup() {Me.RibbonPageGroup1, Me.RibbonPageGroupDocuments, Me.RibbonPageGroupInvitation, Me.RibbonPageGroupAddSignature, Me.RibbonPageGroupReceiver})
|
Me.RibbonPage1.Groups.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageGroup() {Me.RibbonPageGroup1, Me.RibbonPageGroupDocuments, Me.RibbonPageGroupInvitation, Me.RibbonPageGroupAddSignature, Me.RibbonPageGroupReceiver})
|
||||||
@@ -684,13 +691,6 @@ Partial Public Class frmEnvelopeEditor
|
|||||||
Me.txtEnvelopeIdLabel.PaintStyle = DevExpress.XtraBars.BarItemPaintStyle.CaptionGlyph
|
Me.txtEnvelopeIdLabel.PaintStyle = DevExpress.XtraBars.BarItemPaintStyle.CaptionGlyph
|
||||||
Me.txtEnvelopeIdLabel.Tag = "Envelope-ID: {0}"
|
Me.txtEnvelopeIdLabel.Tag = "Envelope-ID: {0}"
|
||||||
'
|
'
|
||||||
'btnShowFile
|
|
||||||
'
|
|
||||||
resources.ApplyResources(Me.btnShowFile, "btnShowFile")
|
|
||||||
Me.btnShowFile.Id = 17
|
|
||||||
Me.btnShowFile.ImageOptions.SvgImage = CType(resources.GetObject("BarButtonItem4.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
|
|
||||||
Me.btnShowFile.Name = "btnShowFile"
|
|
||||||
'
|
|
||||||
'frmEnvelopeEditor
|
'frmEnvelopeEditor
|
||||||
'
|
'
|
||||||
Me.AllowDrop = True
|
Me.AllowDrop = True
|
||||||
|
|||||||
@@ -436,7 +436,7 @@
|
|||||||
<data name="btnShowFile.Caption" xml:space="preserve">
|
<data name="btnShowFile.Caption" xml:space="preserve">
|
||||||
<value>Dokument anzeigen</value>
|
<value>Dokument anzeigen</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BarButtonItem4.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v21.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="btnShowFile.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v21.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40
|
AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40
|
||||||
LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
|
LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
|
||||||
@@ -1131,6 +1131,12 @@
|
|||||||
<data name=">>bbtnitm_ConcatFiles.Type" xml:space="preserve">
|
<data name=">>bbtnitm_ConcatFiles.Type" xml:space="preserve">
|
||||||
<value>DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
|
<value>DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name=">>btnShowFile.Name" xml:space="preserve">
|
||||||
|
<value>btnShowFile</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>btnShowFile.Type" xml:space="preserve">
|
||||||
|
<value>DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
|
||||||
|
</data>
|
||||||
<data name=">>RibbonPage1.Name" xml:space="preserve">
|
<data name=">>RibbonPage1.Name" xml:space="preserve">
|
||||||
<value>RibbonPage1</value>
|
<value>RibbonPage1</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -1329,12 +1335,6 @@
|
|||||||
<data name=">>txtEnvelopeIdLabel.Type" xml:space="preserve">
|
<data name=">>txtEnvelopeIdLabel.Type" xml:space="preserve">
|
||||||
<value>DevExpress.XtraBars.BarStaticItem, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
|
<value>DevExpress.XtraBars.BarStaticItem, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>btnShowFile.Name" xml:space="preserve">
|
|
||||||
<value>btnShowFile</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>btnShowFile.Type" xml:space="preserve">
|
|
||||||
<value>DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>$this.Name" xml:space="preserve">
|
<data name=">>$this.Name" xml:space="preserve">
|
||||||
<value>frmEnvelopeEditor</value>
|
<value>frmEnvelopeEditor</value>
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -103,6 +103,8 @@ Partial Public Class frmEnvelopeEditor
|
|||||||
If oResult = DialogResult.Cancel Then
|
If oResult = DialogResult.Cancel Then
|
||||||
Controller.DeleteEnvelopeFromDisk(Controller.Envelope)
|
Controller.DeleteEnvelopeFromDisk(Controller.Envelope)
|
||||||
Me.Close()
|
Me.Close()
|
||||||
|
Else
|
||||||
|
Envelope = Controller.Envelope
|
||||||
End If
|
End If
|
||||||
Else
|
Else
|
||||||
Controller = New EnvelopeEditorController(State, Envelope)
|
Controller = New EnvelopeEditorController(State, Envelope)
|
||||||
@@ -166,8 +168,12 @@ Partial Public Class frmEnvelopeEditor
|
|||||||
End If
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub SetPhoneNumberColumnVisible()
|
Private Sub SetPhoneNumberColumnVisible()
|
||||||
|
If IsNothing(Envelope) Then
|
||||||
|
colPhoneNumber.Visible = False
|
||||||
|
Exit Sub
|
||||||
|
End If
|
||||||
If Envelope.TFA_Enabled = True Then
|
If Envelope.TFA_Enabled = True Then
|
||||||
colPhoneNumber.Visible = True
|
colPhoneNumber.Visible = DEF_TF_ENABLED_WITH_PHONE
|
||||||
Else
|
Else
|
||||||
colPhoneNumber.Visible = False
|
colPhoneNumber.Visible = False
|
||||||
End If
|
End If
|
||||||
@@ -586,7 +592,9 @@ Partial Public Class frmEnvelopeEditor
|
|||||||
ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns.Item(COL_EMAIL), oEmailAdress)
|
ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns.Item(COL_EMAIL), oEmailAdress)
|
||||||
ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns.Item(COL_NAME), oLastName)
|
ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns.Item(COL_NAME), oLastName)
|
||||||
ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns.Item(COL_CODE), oAccessCode)
|
ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns.Item(COL_CODE), oAccessCode)
|
||||||
ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns.Item(COL_PHONE), oPhoneNumber)
|
If Envelope.TFA_Enabled AndAlso DEF_TF_ENABLED_WITH_PHONE Then
|
||||||
|
ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns.Item(COL_PHONE), oPhoneNumber)
|
||||||
|
End If
|
||||||
Else
|
Else
|
||||||
Dim oMsg = Resources.Envelope.Error_email_Validation
|
Dim oMsg = Resources.Envelope.Error_email_Validation
|
||||||
oMsg = oMsg.Replace("@Mail", oEmailAdress)
|
oMsg = oMsg.Replace("@Mail", oEmailAdress)
|
||||||
@@ -639,22 +647,23 @@ Partial Public Class frmEnvelopeEditor
|
|||||||
|
|
||||||
End Sub
|
End Sub
|
||||||
Private Async Sub bbtnitm_ConcatFiles_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles bbtnitm_ConcatFiles.ItemClick
|
Private Async Sub bbtnitm_ConcatFiles_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles bbtnitm_ConcatFiles.ItemClick
|
||||||
ENVELOPE_TEMP_DOCUMENT = String.Empty
|
|
||||||
OpenFileDialog1.Multiselect = True
|
|
||||||
OpenFileDialog1.Title = Resources.Envelope.Dialog_Concat_PDF
|
|
||||||
Dim oSuccess As Boolean = False
|
|
||||||
Dim oHandle = SplashScreenManager.ShowOverlayForm(Me)
|
Dim oHandle = SplashScreenManager.ShowOverlayForm(Me)
|
||||||
Try
|
Try
|
||||||
Dim oErr As Boolean = False
|
|
||||||
If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
|
ENVELOPE_TEMP_DOCUMENT = String.Empty
|
||||||
|
Dim openform As New frmOrderFiles
|
||||||
|
openform.oTitle = Resources.Envelope.Dialog_Concat_PDF
|
||||||
|
openform.ShowDialog()
|
||||||
|
If Not IsNothing(openform.fileResults) Then
|
||||||
Dim oIDX As Integer = -1
|
Dim oIDX As Integer = -1
|
||||||
For Each oFile As String In OpenFileDialog1.FileNames
|
For Each oFile As String In openform.fileResults
|
||||||
oIDX += 1
|
oIDX += 1
|
||||||
Next
|
Next
|
||||||
|
Dim oSuccess As Boolean = False
|
||||||
|
Dim oErr As Boolean = False
|
||||||
Dim arPDF As GdPicturePDF() = New GdPicturePDF(oIDX) {}
|
Dim arPDF As GdPicturePDF() = New GdPicturePDF(oIDX) {}
|
||||||
oIDX = 0
|
oIDX = 0
|
||||||
For Each oFile As String In OpenFileDialog1.FileNames
|
For Each oFile As String In openform.fileResults
|
||||||
arPDF(oIDX) = New GdPicturePDF()
|
arPDF(oIDX) = New GdPicturePDF()
|
||||||
If arPDF(oIDX).LoadFromFile(oFile) <> GdPictureStatus.OK Then
|
If arPDF(oIDX).LoadFromFile(oFile) <> GdPictureStatus.OK Then
|
||||||
MsgBox($"PDF Status of file {oFile} is not OK. Please check PDF-conformity!", MsgBoxStyle.Critical)
|
MsgBox($"PDF Status of file {oFile} is not OK. Please check PDF-conformity!", MsgBoxStyle.Critical)
|
||||||
@@ -691,7 +700,7 @@ Partial Public Class frmEnvelopeEditor
|
|||||||
End If
|
End If
|
||||||
dstPDF.Dispose()
|
dstPDF.Dispose()
|
||||||
oIDX = 0
|
oIDX = 0
|
||||||
For Each oFile As String In OpenFileDialog1.FileNames
|
For Each oFile As String In openform.fileResults
|
||||||
arPDF(oIDX).CloseDocument()
|
arPDF(oIDX).CloseDocument()
|
||||||
oIDX += 1
|
oIDX += 1
|
||||||
Next
|
Next
|
||||||
@@ -701,8 +710,8 @@ Partial Public Class frmEnvelopeEditor
|
|||||||
End If
|
End If
|
||||||
End If
|
End If
|
||||||
|
|
||||||
End If
|
|
||||||
|
|
||||||
|
End If
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
Logger.Error(ex)
|
Logger.Error(ex)
|
||||||
Finally
|
Finally
|
||||||
@@ -710,7 +719,7 @@ Partial Public Class frmEnvelopeEditor
|
|||||||
End Try
|
End Try
|
||||||
|
|
||||||
|
|
||||||
'frmChooseDocVariant.ShowDialog()
|
|
||||||
|
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
@@ -741,7 +750,6 @@ Partial Public Class frmEnvelopeEditor
|
|||||||
Private Async Sub frmEnvelopeEditor_DragDrop(sender As Object, e As DragEventArgs) Handles Me.DragDrop
|
Private Async Sub frmEnvelopeEditor_DragDrop(sender As Object, e As DragEventArgs) Handles Me.DragDrop
|
||||||
' Den Pfad der Datei(en) erhalten
|
' Den Pfad der Datei(en) erhalten
|
||||||
Dim ofiles() As String = CType(e.Data.GetData(DataFormats.FileDrop), String())
|
Dim ofiles() As String = CType(e.Data.GetData(DataFormats.FileDrop), String())
|
||||||
|
|
||||||
' Beispiel: Ersten Dateipfad anzeigen
|
' Beispiel: Ersten Dateipfad anzeigen
|
||||||
If ofiles IsNot Nothing AndAlso ofiles.Length > 0 Then
|
If ofiles IsNot Nothing AndAlso ofiles.Length > 0 Then
|
||||||
If Not ofiles(0).ToString.EndsWith("pdf") Then
|
If Not ofiles(0).ToString.EndsWith("pdf") Then
|
||||||
@@ -754,7 +762,6 @@ Partial Public Class frmEnvelopeEditor
|
|||||||
SplashScreenManager.CloseOverlayForm(oHandle)
|
SplashScreenManager.CloseOverlayForm(oHandle)
|
||||||
' MessageBox.Show("Dateipfad: " & ofiles(0), "Datei abgelegt", MessageBoxButtons.OK, MessageBoxIcon.Information)
|
' MessageBox.Show("Dateipfad: " & ofiles(0), "Datei abgelegt", MessageBoxButtons.OK, MessageBoxIcon.Information)
|
||||||
End If
|
End If
|
||||||
|
|
||||||
End If
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
|
|||||||
@@ -56,20 +56,25 @@ Public Class frmEnvelopeMainData
|
|||||||
cmbLanguage.Properties.Items.AddRange(New List(Of String) From {"de", "en"})
|
cmbLanguage.Properties.Items.AddRange(New List(Of String) From {"de", "en"})
|
||||||
|
|
||||||
groupAllOptions.Expanded = False
|
groupAllOptions.Expanded = False
|
||||||
|
Dim EnvelopeType = oTypes.FirstOrDefault()
|
||||||
If NewEnvelopeMode = True Then
|
If NewEnvelopeMode = True Then
|
||||||
Dim oType = oTypes.FirstOrDefault()
|
|
||||||
|
|
||||||
' This will trigger loading values from the type
|
' This will trigger loading values from the type
|
||||||
cmbEnvelopeType.EditValue = oType
|
cmbEnvelopeType.EditValue = EnvelopeType
|
||||||
chked_2Faktor.EditValue = DEF_TF_ENABLED
|
chked_2Faktor.EditValue = DEF_TF_ENABLED
|
||||||
|
|
||||||
Else
|
Else
|
||||||
' This will trigger loading values from the type
|
If Envelope.EnvelopeType.ContractType = 0 Then
|
||||||
cmbEnvelopeType.EditValue = Envelope.EnvelopeType
|
cmbEnvelopeType.EditValue = EnvelopeType
|
||||||
' cmbEnvelopeType.SelectedIndex = Convert.ToInt32(Envelope.EnvelopeType) - 1
|
Else
|
||||||
' cmbEnvelopeType.SelectedIndex = Envelope.Type.Id - 1
|
' This will trigger loading values from the type
|
||||||
' cmbEnvelopeType.SelectedItem = cmbEnvelopeType.Properties.Items.Cast(Of EnvelopeType).Where(Function(i) i.Id = Envelope.EnvelopeType.Id).SingleOrDefault()
|
cmbEnvelopeType.EditValue = Envelope.EnvelopeType
|
||||||
|
' cmbEnvelopeType.SelectedIndex = Convert.ToInt32(Envelope.EnvelopeType) - 1
|
||||||
|
' cmbEnvelopeType.SelectedIndex = Envelope.Type.Id - 1
|
||||||
|
' cmbEnvelopeType.SelectedItem = cmbEnvelopeType.Properties.Items.Cast(Of EnvelopeType).Where(Function(i) i.Id = Envelope.EnvelopeType.Id).SingleOrDefault()
|
||||||
|
End If
|
||||||
|
|
||||||
|
|
||||||
' Now we can override these values with the values from envelope
|
' Now we can override these values with the values from envelope
|
||||||
txtTitle.EditValue = Envelope.Title
|
txtTitle.EditValue = Envelope.Title
|
||||||
|
|||||||
211
EnvelopeGenerator.Form/frmMain.Designer.vb
generated
@@ -62,10 +62,11 @@ Partial Class frmMain
|
|||||||
Me.bbtnitmEB = New DevExpress.XtraBars.BarButtonItem()
|
Me.bbtnitmEB = New DevExpress.XtraBars.BarButtonItem()
|
||||||
Me.bbtnitmInfoMail = New DevExpress.XtraBars.BarButtonItem()
|
Me.bbtnitmInfoMail = New DevExpress.XtraBars.BarButtonItem()
|
||||||
Me.BarButtonItem2 = New DevExpress.XtraBars.BarButtonItem()
|
Me.BarButtonItem2 = New DevExpress.XtraBars.BarButtonItem()
|
||||||
|
Me.BarButtonItem3 = New DevExpress.XtraBars.BarButtonItem()
|
||||||
Me.RibbonPage1 = New DevExpress.XtraBars.Ribbon.RibbonPage()
|
Me.RibbonPage1 = New DevExpress.XtraBars.Ribbon.RibbonPage()
|
||||||
Me.RibbonPageEnvelopeActions = New DevExpress.XtraBars.Ribbon.RibbonPageGroup()
|
Me.RibbonPageEnvelopeActions = New DevExpress.XtraBars.Ribbon.RibbonPageGroup()
|
||||||
Me.RibbonPageGroup1 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup()
|
Me.RibbonPageGroup1 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup()
|
||||||
Me.RibbonPageFunctions = New DevExpress.XtraBars.Ribbon.RibbonPageGroup()
|
Me.RibbonPageGroupFunctions = New DevExpress.XtraBars.Ribbon.RibbonPageGroup()
|
||||||
Me.RibbonPage2 = New DevExpress.XtraBars.Ribbon.RibbonPage()
|
Me.RibbonPage2 = New DevExpress.XtraBars.Ribbon.RibbonPage()
|
||||||
Me.RibbonPageGroup3 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup()
|
Me.RibbonPageGroup3 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup()
|
||||||
Me.RibbonStatusBar = New DevExpress.XtraBars.Ribbon.RibbonStatusBar()
|
Me.RibbonStatusBar = New DevExpress.XtraBars.Ribbon.RibbonStatusBar()
|
||||||
@@ -86,9 +87,12 @@ Partial Class frmMain
|
|||||||
Me.GridColumn5 = New DevExpress.XtraGrid.Columns.GridColumn()
|
Me.GridColumn5 = New DevExpress.XtraGrid.Columns.GridColumn()
|
||||||
Me.GridColumn7 = New DevExpress.XtraGrid.Columns.GridColumn()
|
Me.GridColumn7 = New DevExpress.XtraGrid.Columns.GridColumn()
|
||||||
Me.XtraTabPageAdmin = New DevExpress.XtraTab.XtraTabPage()
|
Me.XtraTabPageAdmin = New DevExpress.XtraTab.XtraTabPage()
|
||||||
|
Me.SplitContainerControl2 = New DevExpress.XtraEditors.SplitContainerControl()
|
||||||
Me.GridControlData = New DevExpress.XtraGrid.GridControl()
|
Me.GridControlData = New DevExpress.XtraGrid.GridControl()
|
||||||
Me.GridViewData = New DevExpress.XtraGrid.Views.Grid.GridView()
|
Me.GridViewData = New DevExpress.XtraGrid.Views.Grid.GridView()
|
||||||
Me.PanelControl1 = New DevExpress.XtraEditors.PanelControl()
|
Me.PanelControl1 = New DevExpress.XtraEditors.PanelControl()
|
||||||
|
Me.GroupControl2 = New DevExpress.XtraEditors.GroupControl()
|
||||||
|
Me.LabelControl1 = New DevExpress.XtraEditors.LabelControl()
|
||||||
Me.GroupControl1 = New DevExpress.XtraEditors.GroupControl()
|
Me.GroupControl1 = New DevExpress.XtraEditors.GroupControl()
|
||||||
Me.btnEnvelopes_All = New DevExpress.XtraEditors.SimpleButton()
|
Me.btnEnvelopes_All = New DevExpress.XtraEditors.SimpleButton()
|
||||||
Me.btnEnvelopes_thisYear = New DevExpress.XtraEditors.SimpleButton()
|
Me.btnEnvelopes_thisYear = New DevExpress.XtraEditors.SimpleButton()
|
||||||
@@ -96,9 +100,7 @@ Partial Class frmMain
|
|||||||
Me.btnEnvelopes_thismonth = New DevExpress.XtraEditors.SimpleButton()
|
Me.btnEnvelopes_thismonth = New DevExpress.XtraEditors.SimpleButton()
|
||||||
Me.RefreshTimer = New System.Windows.Forms.Timer(Me.components)
|
Me.RefreshTimer = New System.Windows.Forms.Timer(Me.components)
|
||||||
Me.SaveFileDialog1 = New System.Windows.Forms.SaveFileDialog()
|
Me.SaveFileDialog1 = New System.Windows.Forms.SaveFileDialog()
|
||||||
Me.GroupControl2 = New DevExpress.XtraEditors.GroupControl()
|
Me.XtraSaveFileDialog1 = New DevExpress.XtraEditors.XtraSaveFileDialog(Me.components)
|
||||||
Me.SplitContainerControl2 = New DevExpress.XtraEditors.SplitContainerControl()
|
|
||||||
Me.ChartControl1 = New DevExpress.XtraCharts.ChartControl()
|
|
||||||
CType(Me.SplitContainerControl1, System.ComponentModel.ISupportInitialize).BeginInit()
|
CType(Me.SplitContainerControl1, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
CType(Me.SplitContainerControl1.Panel1, System.ComponentModel.ISupportInitialize).BeginInit()
|
CType(Me.SplitContainerControl1.Panel1, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
Me.SplitContainerControl1.Panel1.SuspendLayout()
|
Me.SplitContainerControl1.Panel1.SuspendLayout()
|
||||||
@@ -118,20 +120,19 @@ Partial Class frmMain
|
|||||||
CType(Me.ViewHistoryCompleted, System.ComponentModel.ISupportInitialize).BeginInit()
|
CType(Me.ViewHistoryCompleted, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
CType(Me.ViewCompleted, System.ComponentModel.ISupportInitialize).BeginInit()
|
CType(Me.ViewCompleted, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
Me.XtraTabPageAdmin.SuspendLayout()
|
Me.XtraTabPageAdmin.SuspendLayout()
|
||||||
CType(Me.GridControlData, System.ComponentModel.ISupportInitialize).BeginInit()
|
|
||||||
CType(Me.GridViewData, System.ComponentModel.ISupportInitialize).BeginInit()
|
|
||||||
CType(Me.PanelControl1, System.ComponentModel.ISupportInitialize).BeginInit()
|
|
||||||
Me.PanelControl1.SuspendLayout()
|
|
||||||
CType(Me.GroupControl1, System.ComponentModel.ISupportInitialize).BeginInit()
|
|
||||||
Me.GroupControl1.SuspendLayout()
|
|
||||||
CType(Me.GroupControl2, System.ComponentModel.ISupportInitialize).BeginInit()
|
|
||||||
CType(Me.SplitContainerControl2, System.ComponentModel.ISupportInitialize).BeginInit()
|
CType(Me.SplitContainerControl2, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
CType(Me.SplitContainerControl2.Panel1, System.ComponentModel.ISupportInitialize).BeginInit()
|
CType(Me.SplitContainerControl2.Panel1, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
Me.SplitContainerControl2.Panel1.SuspendLayout()
|
Me.SplitContainerControl2.Panel1.SuspendLayout()
|
||||||
CType(Me.SplitContainerControl2.Panel2, System.ComponentModel.ISupportInitialize).BeginInit()
|
CType(Me.SplitContainerControl2.Panel2, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
Me.SplitContainerControl2.Panel2.SuspendLayout()
|
|
||||||
Me.SplitContainerControl2.SuspendLayout()
|
Me.SplitContainerControl2.SuspendLayout()
|
||||||
CType(Me.ChartControl1, System.ComponentModel.ISupportInitialize).BeginInit()
|
CType(Me.GridControlData, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
|
CType(Me.GridViewData, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
|
CType(Me.PanelControl1, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
|
Me.PanelControl1.SuspendLayout()
|
||||||
|
CType(Me.GroupControl2, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
|
Me.GroupControl2.SuspendLayout()
|
||||||
|
CType(Me.GroupControl1, System.ComponentModel.ISupportInitialize).BeginInit()
|
||||||
|
Me.GroupControl1.SuspendLayout()
|
||||||
Me.SuspendLayout()
|
Me.SuspendLayout()
|
||||||
'
|
'
|
||||||
'SplashScreenManager1
|
'SplashScreenManager1
|
||||||
@@ -140,16 +141,16 @@ Partial Class frmMain
|
|||||||
'
|
'
|
||||||
'SplitContainerControl1
|
'SplitContainerControl1
|
||||||
'
|
'
|
||||||
|
resources.ApplyResources(Me.SplitContainerControl1, "SplitContainerControl1")
|
||||||
Me.SplitContainerControl1.Collapsed = True
|
Me.SplitContainerControl1.Collapsed = True
|
||||||
Me.SplitContainerControl1.CollapsePanel = DevExpress.XtraEditors.SplitCollapsePanel.Panel2
|
Me.SplitContainerControl1.CollapsePanel = DevExpress.XtraEditors.SplitCollapsePanel.Panel2
|
||||||
resources.ApplyResources(Me.SplitContainerControl1, "SplitContainerControl1")
|
|
||||||
Me.SplitContainerControl1.Horizontal = False
|
Me.SplitContainerControl1.Horizontal = False
|
||||||
Me.SplitContainerControl1.Name = "SplitContainerControl1"
|
Me.SplitContainerControl1.Name = "SplitContainerControl1"
|
||||||
'
|
'
|
||||||
'SplitContainerControl1.Panel1
|
'SplitContainerControl1.Panel1
|
||||||
'
|
'
|
||||||
Me.SplitContainerControl1.Panel1.Controls.Add(Me.XtraTabControlMain)
|
|
||||||
resources.ApplyResources(Me.SplitContainerControl1.Panel1, "SplitContainerControl1.Panel1")
|
resources.ApplyResources(Me.SplitContainerControl1.Panel1, "SplitContainerControl1.Panel1")
|
||||||
|
Me.SplitContainerControl1.Panel1.Controls.Add(Me.XtraTabControlMain)
|
||||||
'
|
'
|
||||||
'SplitContainerControl1.Panel2
|
'SplitContainerControl1.Panel2
|
||||||
'
|
'
|
||||||
@@ -165,19 +166,25 @@ Partial Class frmMain
|
|||||||
'
|
'
|
||||||
'XtraTabPage1
|
'XtraTabPage1
|
||||||
'
|
'
|
||||||
|
resources.ApplyResources(Me.XtraTabPage1, "XtraTabPage1")
|
||||||
Me.XtraTabPage1.Controls.Add(Me.GridEnvelopes)
|
Me.XtraTabPage1.Controls.Add(Me.GridEnvelopes)
|
||||||
Me.XtraTabPage1.Name = "XtraTabPage1"
|
Me.XtraTabPage1.Name = "XtraTabPage1"
|
||||||
resources.ApplyResources(Me.XtraTabPage1, "XtraTabPage1")
|
|
||||||
'
|
'
|
||||||
'GridEnvelopes
|
'GridEnvelopes
|
||||||
'
|
'
|
||||||
resources.ApplyResources(Me.GridEnvelopes, "GridEnvelopes")
|
resources.ApplyResources(Me.GridEnvelopes, "GridEnvelopes")
|
||||||
|
Me.GridEnvelopes.EmbeddedNavigator.AccessibleDescription = resources.GetString("GridEnvelopes.EmbeddedNavigator.AccessibleDescription")
|
||||||
|
Me.GridEnvelopes.EmbeddedNavigator.AccessibleName = resources.GetString("GridEnvelopes.EmbeddedNavigator.AccessibleName")
|
||||||
Me.GridEnvelopes.EmbeddedNavigator.AllowHtmlTextInToolTip = CType(resources.GetObject("GridEnvelopes.EmbeddedNavigator.AllowHtmlTextInToolTip"), DevExpress.Utils.DefaultBoolean)
|
Me.GridEnvelopes.EmbeddedNavigator.AllowHtmlTextInToolTip = CType(resources.GetObject("GridEnvelopes.EmbeddedNavigator.AllowHtmlTextInToolTip"), DevExpress.Utils.DefaultBoolean)
|
||||||
Me.GridEnvelopes.EmbeddedNavigator.Anchor = CType(resources.GetObject("GridEnvelopes.EmbeddedNavigator.Anchor"), System.Windows.Forms.AnchorStyles)
|
Me.GridEnvelopes.EmbeddedNavigator.Anchor = CType(resources.GetObject("GridEnvelopes.EmbeddedNavigator.Anchor"), System.Windows.Forms.AnchorStyles)
|
||||||
|
Me.GridEnvelopes.EmbeddedNavigator.BackgroundImage = CType(resources.GetObject("GridEnvelopes.EmbeddedNavigator.BackgroundImage"), System.Drawing.Image)
|
||||||
Me.GridEnvelopes.EmbeddedNavigator.BackgroundImageLayout = CType(resources.GetObject("GridEnvelopes.EmbeddedNavigator.BackgroundImageLayout"), System.Windows.Forms.ImageLayout)
|
Me.GridEnvelopes.EmbeddedNavigator.BackgroundImageLayout = CType(resources.GetObject("GridEnvelopes.EmbeddedNavigator.BackgroundImageLayout"), System.Windows.Forms.ImageLayout)
|
||||||
Me.GridEnvelopes.EmbeddedNavigator.ImeMode = CType(resources.GetObject("GridEnvelopes.EmbeddedNavigator.ImeMode"), System.Windows.Forms.ImeMode)
|
Me.GridEnvelopes.EmbeddedNavigator.ImeMode = CType(resources.GetObject("GridEnvelopes.EmbeddedNavigator.ImeMode"), System.Windows.Forms.ImeMode)
|
||||||
|
Me.GridEnvelopes.EmbeddedNavigator.MaximumSize = CType(resources.GetObject("GridEnvelopes.EmbeddedNavigator.MaximumSize"), System.Drawing.Size)
|
||||||
Me.GridEnvelopes.EmbeddedNavigator.TextLocation = CType(resources.GetObject("GridEnvelopes.EmbeddedNavigator.TextLocation"), DevExpress.XtraEditors.NavigatorButtonsTextLocation)
|
Me.GridEnvelopes.EmbeddedNavigator.TextLocation = CType(resources.GetObject("GridEnvelopes.EmbeddedNavigator.TextLocation"), DevExpress.XtraEditors.NavigatorButtonsTextLocation)
|
||||||
|
Me.GridEnvelopes.EmbeddedNavigator.ToolTip = resources.GetString("GridEnvelopes.EmbeddedNavigator.ToolTip")
|
||||||
Me.GridEnvelopes.EmbeddedNavigator.ToolTipIconType = CType(resources.GetObject("GridEnvelopes.EmbeddedNavigator.ToolTipIconType"), DevExpress.Utils.ToolTipIconType)
|
Me.GridEnvelopes.EmbeddedNavigator.ToolTipIconType = CType(resources.GetObject("GridEnvelopes.EmbeddedNavigator.ToolTipIconType"), DevExpress.Utils.ToolTipIconType)
|
||||||
|
Me.GridEnvelopes.EmbeddedNavigator.ToolTipTitle = resources.GetString("GridEnvelopes.EmbeddedNavigator.ToolTipTitle")
|
||||||
GridLevelNode1.LevelTemplate = Me.ViewReceivers
|
GridLevelNode1.LevelTemplate = Me.ViewReceivers
|
||||||
GridLevelNode1.RelationName = "Receivers"
|
GridLevelNode1.RelationName = "Receivers"
|
||||||
GridLevelNode2.LevelTemplate = Me.ViewHistory
|
GridLevelNode2.LevelTemplate = Me.ViewHistory
|
||||||
@@ -191,6 +198,7 @@ Partial Class frmMain
|
|||||||
'
|
'
|
||||||
'ViewReceivers
|
'ViewReceivers
|
||||||
'
|
'
|
||||||
|
resources.ApplyResources(Me.ViewReceivers, "ViewReceivers")
|
||||||
Me.ViewReceivers.Columns.AddRange(New DevExpress.XtraGrid.Columns.GridColumn() {Me.ColReceiverStatus, Me.ColName, Me.ColEmail, Me.ColSignedDate, Me.colAccessCode, Me.ColStatusReceiver})
|
Me.ViewReceivers.Columns.AddRange(New DevExpress.XtraGrid.Columns.GridColumn() {Me.ColReceiverStatus, Me.ColName, Me.ColEmail, Me.ColSignedDate, Me.colAccessCode, Me.ColStatusReceiver})
|
||||||
Me.ViewReceivers.GridControl = Me.GridEnvelopes
|
Me.ViewReceivers.GridControl = Me.GridEnvelopes
|
||||||
Me.ViewReceivers.Name = "ViewReceivers"
|
Me.ViewReceivers.Name = "ViewReceivers"
|
||||||
@@ -200,7 +208,6 @@ Partial Class frmMain
|
|||||||
Me.ViewReceivers.OptionsView.ShowDetailButtons = False
|
Me.ViewReceivers.OptionsView.ShowDetailButtons = False
|
||||||
Me.ViewReceivers.OptionsView.ShowGroupPanel = False
|
Me.ViewReceivers.OptionsView.ShowGroupPanel = False
|
||||||
Me.ViewReceivers.OptionsView.ShowIndicator = False
|
Me.ViewReceivers.OptionsView.ShowIndicator = False
|
||||||
resources.ApplyResources(Me.ViewReceivers, "ViewReceivers")
|
|
||||||
'
|
'
|
||||||
'ColReceiverStatus
|
'ColReceiverStatus
|
||||||
'
|
'
|
||||||
@@ -244,6 +251,7 @@ Partial Class frmMain
|
|||||||
'
|
'
|
||||||
'ViewHistory
|
'ViewHistory
|
||||||
'
|
'
|
||||||
|
resources.ApplyResources(Me.ViewHistory, "ViewHistory")
|
||||||
Me.ViewHistory.Columns.AddRange(New DevExpress.XtraGrid.Columns.GridColumn() {Me.ColHistoryStatus, Me.ColHistoryUserReference, Me.ColHistoryDate})
|
Me.ViewHistory.Columns.AddRange(New DevExpress.XtraGrid.Columns.GridColumn() {Me.ColHistoryStatus, Me.ColHistoryUserReference, Me.ColHistoryDate})
|
||||||
Me.ViewHistory.GridControl = Me.GridEnvelopes
|
Me.ViewHistory.GridControl = Me.GridEnvelopes
|
||||||
Me.ViewHistory.Name = "ViewHistory"
|
Me.ViewHistory.Name = "ViewHistory"
|
||||||
@@ -275,6 +283,7 @@ Partial Class frmMain
|
|||||||
'
|
'
|
||||||
'ViewEnvelopes
|
'ViewEnvelopes
|
||||||
'
|
'
|
||||||
|
resources.ApplyResources(Me.ViewEnvelopes, "ViewEnvelopes")
|
||||||
Me.ViewEnvelopes.Columns.AddRange(New DevExpress.XtraGrid.Columns.GridColumn() {Me.colEnvelopeId, Me.colContractType, Me.colStatus, Me.colTitle, Me.colAddedWhen})
|
Me.ViewEnvelopes.Columns.AddRange(New DevExpress.XtraGrid.Columns.GridColumn() {Me.colEnvelopeId, Me.colContractType, Me.colStatus, Me.colTitle, Me.colAddedWhen})
|
||||||
Me.ViewEnvelopes.GridControl = Me.GridEnvelopes
|
Me.ViewEnvelopes.GridControl = Me.GridEnvelopes
|
||||||
Me.ViewEnvelopes.Name = "ViewEnvelopes"
|
Me.ViewEnvelopes.Name = "ViewEnvelopes"
|
||||||
@@ -316,12 +325,14 @@ Partial Class frmMain
|
|||||||
'
|
'
|
||||||
'RibbonControl
|
'RibbonControl
|
||||||
'
|
'
|
||||||
|
resources.ApplyResources(Me.RibbonControl, "RibbonControl")
|
||||||
Me.RibbonControl.ExpandCollapseItem.Id = 0
|
Me.RibbonControl.ExpandCollapseItem.Id = 0
|
||||||
Me.RibbonControl.ExpandCollapseItem.ImageOptions.ImageIndex = CType(resources.GetObject("RibbonControl.ExpandCollapseItem.ImageOptions.ImageIndex"), Integer)
|
Me.RibbonControl.ExpandCollapseItem.ImageOptions.ImageIndex = CType(resources.GetObject("RibbonControl.ExpandCollapseItem.ImageOptions.ImageIndex"), Integer)
|
||||||
Me.RibbonControl.ExpandCollapseItem.ImageOptions.LargeImageIndex = CType(resources.GetObject("RibbonControl.ExpandCollapseItem.ImageOptions.LargeImageIndex"), Integer)
|
Me.RibbonControl.ExpandCollapseItem.ImageOptions.LargeImageIndex = CType(resources.GetObject("RibbonControl.ExpandCollapseItem.ImageOptions.LargeImageIndex"), Integer)
|
||||||
Me.RibbonControl.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.RibbonControl.ExpandCollapseItem, Me.RibbonControl.SearchEditItem, Me.btnCreateEnvelope, Me.btnEditEnvelope, Me.btnDeleteEnvelope, Me.BarButtonItem1, Me.txtRefreshLabel, Me.btnShowDocument, Me.btnContactReceiver, Me.txtEnvelopeIdLabel, Me.btnOpenLogDirectory, Me.BarCheckItem1, Me.bsitmInfo, Me.bbtnitmEB, Me.bbtnitmInfoMail, Me.BarButtonItem2})
|
Me.RibbonControl.ExpandCollapseItem.ImageOptions.SvgImage = CType(resources.GetObject("RibbonControl.ExpandCollapseItem.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
|
||||||
resources.ApplyResources(Me.RibbonControl, "RibbonControl")
|
Me.RibbonControl.ExpandCollapseItem.SearchTags = resources.GetString("RibbonControl.ExpandCollapseItem.SearchTags")
|
||||||
Me.RibbonControl.MaxItemId = 17
|
Me.RibbonControl.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.RibbonControl.ExpandCollapseItem, Me.RibbonControl.SearchEditItem, Me.btnCreateEnvelope, Me.btnEditEnvelope, Me.btnDeleteEnvelope, Me.BarButtonItem1, Me.txtRefreshLabel, Me.btnShowDocument, Me.btnContactReceiver, Me.txtEnvelopeIdLabel, Me.btnOpenLogDirectory, Me.BarCheckItem1, Me.bsitmInfo, Me.bbtnitmEB, Me.bbtnitmInfoMail, Me.BarButtonItem2, Me.BarButtonItem3})
|
||||||
|
Me.RibbonControl.MaxItemId = 18
|
||||||
Me.RibbonControl.Name = "RibbonControl"
|
Me.RibbonControl.Name = "RibbonControl"
|
||||||
Me.RibbonControl.Pages.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPage() {Me.RibbonPage1, Me.RibbonPage2})
|
Me.RibbonControl.Pages.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPage() {Me.RibbonPage1, Me.RibbonPage2})
|
||||||
Me.RibbonControl.ShowApplicationButton = DevExpress.Utils.DefaultBoolean.[False]
|
Me.RibbonControl.ShowApplicationButton = DevExpress.Utils.DefaultBoolean.[False]
|
||||||
@@ -410,6 +421,8 @@ Partial Class frmMain
|
|||||||
'
|
'
|
||||||
resources.ApplyResources(Me.btnOpenLogDirectory, "btnOpenLogDirectory")
|
resources.ApplyResources(Me.btnOpenLogDirectory, "btnOpenLogDirectory")
|
||||||
Me.btnOpenLogDirectory.Id = 10
|
Me.btnOpenLogDirectory.Id = 10
|
||||||
|
Me.btnOpenLogDirectory.ImageOptions.ImageIndex = CType(resources.GetObject("btnOpenLogDirectory.ImageOptions.ImageIndex"), Integer)
|
||||||
|
Me.btnOpenLogDirectory.ImageOptions.LargeImageIndex = CType(resources.GetObject("btnOpenLogDirectory.ImageOptions.LargeImageIndex"), Integer)
|
||||||
Me.btnOpenLogDirectory.ImageOptions.SvgImage = CType(resources.GetObject("btnOpenLogDirectory.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
|
Me.btnOpenLogDirectory.ImageOptions.SvgImage = CType(resources.GetObject("btnOpenLogDirectory.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
|
||||||
Me.btnOpenLogDirectory.Name = "btnOpenLogDirectory"
|
Me.btnOpenLogDirectory.Name = "btnOpenLogDirectory"
|
||||||
'
|
'
|
||||||
@@ -418,13 +431,20 @@ Partial Class frmMain
|
|||||||
resources.ApplyResources(Me.BarCheckItem1, "BarCheckItem1")
|
resources.ApplyResources(Me.BarCheckItem1, "BarCheckItem1")
|
||||||
Me.BarCheckItem1.Id = 12
|
Me.BarCheckItem1.Id = 12
|
||||||
Me.BarCheckItem1.ImageOptions.Image = CType(resources.GetObject("BarCheckItem1.ImageOptions.Image"), System.Drawing.Image)
|
Me.BarCheckItem1.ImageOptions.Image = CType(resources.GetObject("BarCheckItem1.ImageOptions.Image"), System.Drawing.Image)
|
||||||
|
Me.BarCheckItem1.ImageOptions.ImageIndex = CType(resources.GetObject("BarCheckItem1.ImageOptions.ImageIndex"), Integer)
|
||||||
Me.BarCheckItem1.ImageOptions.LargeImage = CType(resources.GetObject("BarCheckItem1.ImageOptions.LargeImage"), System.Drawing.Image)
|
Me.BarCheckItem1.ImageOptions.LargeImage = CType(resources.GetObject("BarCheckItem1.ImageOptions.LargeImage"), System.Drawing.Image)
|
||||||
|
Me.BarCheckItem1.ImageOptions.LargeImageIndex = CType(resources.GetObject("BarCheckItem1.ImageOptions.LargeImageIndex"), Integer)
|
||||||
|
Me.BarCheckItem1.ImageOptions.SvgImage = CType(resources.GetObject("BarCheckItem1.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
|
||||||
Me.BarCheckItem1.Name = "BarCheckItem1"
|
Me.BarCheckItem1.Name = "BarCheckItem1"
|
||||||
'
|
'
|
||||||
'bsitmInfo
|
'bsitmInfo
|
||||||
'
|
'
|
||||||
|
resources.ApplyResources(Me.bsitmInfo, "bsitmInfo")
|
||||||
Me.bsitmInfo.Id = 13
|
Me.bsitmInfo.Id = 13
|
||||||
Me.bsitmInfo.ImageOptions.Image = CType(resources.GetObject("bsitmInfo.ImageOptions.Image"), System.Drawing.Image)
|
Me.bsitmInfo.ImageOptions.Image = CType(resources.GetObject("bsitmInfo.ImageOptions.Image"), System.Drawing.Image)
|
||||||
|
Me.bsitmInfo.ImageOptions.ImageIndex = CType(resources.GetObject("bsitmInfo.ImageOptions.ImageIndex"), Integer)
|
||||||
|
Me.bsitmInfo.ImageOptions.LargeImageIndex = CType(resources.GetObject("bsitmInfo.ImageOptions.LargeImageIndex"), Integer)
|
||||||
|
Me.bsitmInfo.ImageOptions.SvgImage = CType(resources.GetObject("bsitmInfo.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
|
||||||
Me.bsitmInfo.Name = "bsitmInfo"
|
Me.bsitmInfo.Name = "bsitmInfo"
|
||||||
Me.bsitmInfo.PaintStyle = DevExpress.XtraBars.BarItemPaintStyle.CaptionGlyph
|
Me.bsitmInfo.PaintStyle = DevExpress.XtraBars.BarItemPaintStyle.CaptionGlyph
|
||||||
Me.bsitmInfo.Visibility = DevExpress.XtraBars.BarItemVisibility.Never
|
Me.bsitmInfo.Visibility = DevExpress.XtraBars.BarItemVisibility.Never
|
||||||
@@ -434,6 +454,8 @@ Partial Class frmMain
|
|||||||
resources.ApplyResources(Me.bbtnitmEB, "bbtnitmEB")
|
resources.ApplyResources(Me.bbtnitmEB, "bbtnitmEB")
|
||||||
Me.bbtnitmEB.Enabled = False
|
Me.bbtnitmEB.Enabled = False
|
||||||
Me.bbtnitmEB.Id = 14
|
Me.bbtnitmEB.Id = 14
|
||||||
|
Me.bbtnitmEB.ImageOptions.ImageIndex = CType(resources.GetObject("bbtnitmEB.ImageOptions.ImageIndex"), Integer)
|
||||||
|
Me.bbtnitmEB.ImageOptions.LargeImageIndex = CType(resources.GetObject("bbtnitmEB.ImageOptions.LargeImageIndex"), Integer)
|
||||||
Me.bbtnitmEB.ImageOptions.SvgImage = CType(resources.GetObject("bbtnitmEB.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
|
Me.bbtnitmEB.ImageOptions.SvgImage = CType(resources.GetObject("bbtnitmEB.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
|
||||||
Me.bbtnitmEB.Name = "bbtnitmEB"
|
Me.bbtnitmEB.Name = "bbtnitmEB"
|
||||||
'
|
'
|
||||||
@@ -441,6 +463,8 @@ Partial Class frmMain
|
|||||||
'
|
'
|
||||||
resources.ApplyResources(Me.bbtnitmInfoMail, "bbtnitmInfoMail")
|
resources.ApplyResources(Me.bbtnitmInfoMail, "bbtnitmInfoMail")
|
||||||
Me.bbtnitmInfoMail.Id = 15
|
Me.bbtnitmInfoMail.Id = 15
|
||||||
|
Me.bbtnitmInfoMail.ImageOptions.ImageIndex = CType(resources.GetObject("bbtnitmInfoMail.ImageOptions.ImageIndex"), Integer)
|
||||||
|
Me.bbtnitmInfoMail.ImageOptions.LargeImageIndex = CType(resources.GetObject("bbtnitmInfoMail.ImageOptions.LargeImageIndex"), Integer)
|
||||||
Me.bbtnitmInfoMail.ImageOptions.SvgImage = CType(resources.GetObject("bbtnitmInfoMail.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
|
Me.bbtnitmInfoMail.ImageOptions.SvgImage = CType(resources.GetObject("bbtnitmInfoMail.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
|
||||||
Me.bbtnitmInfoMail.Name = "bbtnitmInfoMail"
|
Me.bbtnitmInfoMail.Name = "bbtnitmInfoMail"
|
||||||
'
|
'
|
||||||
@@ -448,12 +472,23 @@ Partial Class frmMain
|
|||||||
'
|
'
|
||||||
resources.ApplyResources(Me.BarButtonItem2, "BarButtonItem2")
|
resources.ApplyResources(Me.BarButtonItem2, "BarButtonItem2")
|
||||||
Me.BarButtonItem2.Id = 16
|
Me.BarButtonItem2.Id = 16
|
||||||
|
Me.BarButtonItem2.ImageOptions.ImageIndex = CType(resources.GetObject("BarButtonItem2.ImageOptions.ImageIndex"), Integer)
|
||||||
|
Me.BarButtonItem2.ImageOptions.LargeImageIndex = CType(resources.GetObject("BarButtonItem2.ImageOptions.LargeImageIndex"), Integer)
|
||||||
Me.BarButtonItem2.ImageOptions.SvgImage = CType(resources.GetObject("BarButtonItem2.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
|
Me.BarButtonItem2.ImageOptions.SvgImage = CType(resources.GetObject("BarButtonItem2.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
|
||||||
Me.BarButtonItem2.Name = "BarButtonItem2"
|
Me.BarButtonItem2.Name = "BarButtonItem2"
|
||||||
'
|
'
|
||||||
|
'BarButtonItem3
|
||||||
|
'
|
||||||
|
resources.ApplyResources(Me.BarButtonItem3, "BarButtonItem3")
|
||||||
|
Me.BarButtonItem3.Id = 17
|
||||||
|
Me.BarButtonItem3.ImageOptions.ImageIndex = CType(resources.GetObject("BarButtonItem3.ImageOptions.ImageIndex"), Integer)
|
||||||
|
Me.BarButtonItem3.ImageOptions.LargeImageIndex = CType(resources.GetObject("BarButtonItem3.ImageOptions.LargeImageIndex"), Integer)
|
||||||
|
Me.BarButtonItem3.ImageOptions.SvgImage = CType(resources.GetObject("BarButtonItem3.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
|
||||||
|
Me.BarButtonItem3.Name = "BarButtonItem3"
|
||||||
|
'
|
||||||
'RibbonPage1
|
'RibbonPage1
|
||||||
'
|
'
|
||||||
Me.RibbonPage1.Groups.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageGroup() {Me.RibbonPageEnvelopeActions, Me.RibbonPageGroup1, Me.RibbonPageFunctions})
|
Me.RibbonPage1.Groups.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageGroup() {Me.RibbonPageEnvelopeActions, Me.RibbonPageGroup1, Me.RibbonPageGroupFunctions})
|
||||||
Me.RibbonPage1.Name = "RibbonPage1"
|
Me.RibbonPage1.Name = "RibbonPage1"
|
||||||
resources.ApplyResources(Me.RibbonPage1, "RibbonPage1")
|
resources.ApplyResources(Me.RibbonPage1, "RibbonPage1")
|
||||||
'
|
'
|
||||||
@@ -469,18 +504,19 @@ Partial Class frmMain
|
|||||||
'
|
'
|
||||||
Me.RibbonPageGroup1.Alignment = DevExpress.XtraBars.Ribbon.RibbonPageGroupAlignment.Far
|
Me.RibbonPageGroup1.Alignment = DevExpress.XtraBars.Ribbon.RibbonPageGroupAlignment.Far
|
||||||
Me.RibbonPageGroup1.ItemLinks.Add(Me.BarButtonItem1)
|
Me.RibbonPageGroup1.ItemLinks.Add(Me.BarButtonItem1)
|
||||||
|
Me.RibbonPageGroup1.ItemLinks.Add(Me.BarButtonItem3)
|
||||||
Me.RibbonPageGroup1.Name = "RibbonPageGroup1"
|
Me.RibbonPageGroup1.Name = "RibbonPageGroup1"
|
||||||
resources.ApplyResources(Me.RibbonPageGroup1, "RibbonPageGroup1")
|
resources.ApplyResources(Me.RibbonPageGroup1, "RibbonPageGroup1")
|
||||||
'
|
'
|
||||||
'RibbonPageFunctions
|
'RibbonPageGroupFunctions
|
||||||
'
|
'
|
||||||
Me.RibbonPageFunctions.ItemLinks.Add(Me.btnShowDocument)
|
Me.RibbonPageGroupFunctions.ItemLinks.Add(Me.btnShowDocument)
|
||||||
Me.RibbonPageFunctions.ItemLinks.Add(Me.btnContactReceiver)
|
Me.RibbonPageGroupFunctions.ItemLinks.Add(Me.BarButtonItem2)
|
||||||
Me.RibbonPageFunctions.ItemLinks.Add(Me.bbtnitmInfoMail)
|
Me.RibbonPageGroupFunctions.ItemLinks.Add(Me.btnContactReceiver)
|
||||||
Me.RibbonPageFunctions.ItemLinks.Add(Me.bbtnitmEB)
|
Me.RibbonPageGroupFunctions.ItemLinks.Add(Me.bbtnitmEB)
|
||||||
Me.RibbonPageFunctions.ItemLinks.Add(Me.BarButtonItem2)
|
Me.RibbonPageGroupFunctions.ItemLinks.Add(Me.bbtnitmInfoMail)
|
||||||
Me.RibbonPageFunctions.Name = "RibbonPageFunctions"
|
Me.RibbonPageGroupFunctions.Name = "RibbonPageGroupFunctions"
|
||||||
resources.ApplyResources(Me.RibbonPageFunctions, "RibbonPageFunctions")
|
resources.ApplyResources(Me.RibbonPageGroupFunctions, "RibbonPageGroupFunctions")
|
||||||
'
|
'
|
||||||
'RibbonPage2
|
'RibbonPage2
|
||||||
'
|
'
|
||||||
@@ -497,28 +533,34 @@ Partial Class frmMain
|
|||||||
'
|
'
|
||||||
'RibbonStatusBar
|
'RibbonStatusBar
|
||||||
'
|
'
|
||||||
|
resources.ApplyResources(Me.RibbonStatusBar, "RibbonStatusBar")
|
||||||
Me.RibbonStatusBar.ItemLinks.Add(Me.txtRefreshLabel)
|
Me.RibbonStatusBar.ItemLinks.Add(Me.txtRefreshLabel)
|
||||||
Me.RibbonStatusBar.ItemLinks.Add(Me.txtEnvelopeIdLabel)
|
Me.RibbonStatusBar.ItemLinks.Add(Me.txtEnvelopeIdLabel)
|
||||||
Me.RibbonStatusBar.ItemLinks.Add(Me.bsitmInfo)
|
Me.RibbonStatusBar.ItemLinks.Add(Me.bsitmInfo)
|
||||||
resources.ApplyResources(Me.RibbonStatusBar, "RibbonStatusBar")
|
|
||||||
Me.RibbonStatusBar.Name = "RibbonStatusBar"
|
Me.RibbonStatusBar.Name = "RibbonStatusBar"
|
||||||
Me.RibbonStatusBar.Ribbon = Me.RibbonControl
|
Me.RibbonStatusBar.Ribbon = Me.RibbonControl
|
||||||
'
|
'
|
||||||
'XtraTabPage2
|
'XtraTabPage2
|
||||||
'
|
'
|
||||||
|
resources.ApplyResources(Me.XtraTabPage2, "XtraTabPage2")
|
||||||
Me.XtraTabPage2.Controls.Add(Me.GridCompleted)
|
Me.XtraTabPage2.Controls.Add(Me.GridCompleted)
|
||||||
Me.XtraTabPage2.Name = "XtraTabPage2"
|
Me.XtraTabPage2.Name = "XtraTabPage2"
|
||||||
resources.ApplyResources(Me.XtraTabPage2, "XtraTabPage2")
|
|
||||||
'
|
'
|
||||||
'GridCompleted
|
'GridCompleted
|
||||||
'
|
'
|
||||||
resources.ApplyResources(Me.GridCompleted, "GridCompleted")
|
resources.ApplyResources(Me.GridCompleted, "GridCompleted")
|
||||||
|
Me.GridCompleted.EmbeddedNavigator.AccessibleDescription = resources.GetString("GridCompleted.EmbeddedNavigator.AccessibleDescription")
|
||||||
|
Me.GridCompleted.EmbeddedNavigator.AccessibleName = resources.GetString("GridCompleted.EmbeddedNavigator.AccessibleName")
|
||||||
Me.GridCompleted.EmbeddedNavigator.AllowHtmlTextInToolTip = CType(resources.GetObject("GridCompleted.EmbeddedNavigator.AllowHtmlTextInToolTip"), DevExpress.Utils.DefaultBoolean)
|
Me.GridCompleted.EmbeddedNavigator.AllowHtmlTextInToolTip = CType(resources.GetObject("GridCompleted.EmbeddedNavigator.AllowHtmlTextInToolTip"), DevExpress.Utils.DefaultBoolean)
|
||||||
Me.GridCompleted.EmbeddedNavigator.Anchor = CType(resources.GetObject("GridCompleted.EmbeddedNavigator.Anchor"), System.Windows.Forms.AnchorStyles)
|
Me.GridCompleted.EmbeddedNavigator.Anchor = CType(resources.GetObject("GridCompleted.EmbeddedNavigator.Anchor"), System.Windows.Forms.AnchorStyles)
|
||||||
|
Me.GridCompleted.EmbeddedNavigator.BackgroundImage = CType(resources.GetObject("GridCompleted.EmbeddedNavigator.BackgroundImage"), System.Drawing.Image)
|
||||||
Me.GridCompleted.EmbeddedNavigator.BackgroundImageLayout = CType(resources.GetObject("GridCompleted.EmbeddedNavigator.BackgroundImageLayout"), System.Windows.Forms.ImageLayout)
|
Me.GridCompleted.EmbeddedNavigator.BackgroundImageLayout = CType(resources.GetObject("GridCompleted.EmbeddedNavigator.BackgroundImageLayout"), System.Windows.Forms.ImageLayout)
|
||||||
Me.GridCompleted.EmbeddedNavigator.ImeMode = CType(resources.GetObject("GridCompleted.EmbeddedNavigator.ImeMode"), System.Windows.Forms.ImeMode)
|
Me.GridCompleted.EmbeddedNavigator.ImeMode = CType(resources.GetObject("GridCompleted.EmbeddedNavigator.ImeMode"), System.Windows.Forms.ImeMode)
|
||||||
|
Me.GridCompleted.EmbeddedNavigator.MaximumSize = CType(resources.GetObject("GridCompleted.EmbeddedNavigator.MaximumSize"), System.Drawing.Size)
|
||||||
Me.GridCompleted.EmbeddedNavigator.TextLocation = CType(resources.GetObject("GridCompleted.EmbeddedNavigator.TextLocation"), DevExpress.XtraEditors.NavigatorButtonsTextLocation)
|
Me.GridCompleted.EmbeddedNavigator.TextLocation = CType(resources.GetObject("GridCompleted.EmbeddedNavigator.TextLocation"), DevExpress.XtraEditors.NavigatorButtonsTextLocation)
|
||||||
|
Me.GridCompleted.EmbeddedNavigator.ToolTip = resources.GetString("GridCompleted.EmbeddedNavigator.ToolTip")
|
||||||
Me.GridCompleted.EmbeddedNavigator.ToolTipIconType = CType(resources.GetObject("GridCompleted.EmbeddedNavigator.ToolTipIconType"), DevExpress.Utils.ToolTipIconType)
|
Me.GridCompleted.EmbeddedNavigator.ToolTipIconType = CType(resources.GetObject("GridCompleted.EmbeddedNavigator.ToolTipIconType"), DevExpress.Utils.ToolTipIconType)
|
||||||
|
Me.GridCompleted.EmbeddedNavigator.ToolTipTitle = resources.GetString("GridCompleted.EmbeddedNavigator.ToolTipTitle")
|
||||||
GridLevelNode3.LevelTemplate = Me.ViewReceiversCompleted
|
GridLevelNode3.LevelTemplate = Me.ViewReceiversCompleted
|
||||||
GridLevelNode3.RelationName = "Receivers"
|
GridLevelNode3.RelationName = "Receivers"
|
||||||
GridLevelNode4.LevelTemplate = Me.ViewHistoryCompleted
|
GridLevelNode4.LevelTemplate = Me.ViewHistoryCompleted
|
||||||
@@ -532,6 +574,7 @@ Partial Class frmMain
|
|||||||
'
|
'
|
||||||
'ViewReceiversCompleted
|
'ViewReceiversCompleted
|
||||||
'
|
'
|
||||||
|
resources.ApplyResources(Me.ViewReceiversCompleted, "ViewReceiversCompleted")
|
||||||
Me.ViewReceiversCompleted.Columns.AddRange(New DevExpress.XtraGrid.Columns.GridColumn() {Me.ColStatusCompleted, Me.ColNameCompleted, Me.ColEmailCompleted, Me.ColSignedDateCompleted})
|
Me.ViewReceiversCompleted.Columns.AddRange(New DevExpress.XtraGrid.Columns.GridColumn() {Me.ColStatusCompleted, Me.ColNameCompleted, Me.ColEmailCompleted, Me.ColSignedDateCompleted})
|
||||||
Me.ViewReceiversCompleted.GridControl = Me.GridCompleted
|
Me.ViewReceiversCompleted.GridControl = Me.GridCompleted
|
||||||
Me.ViewReceiversCompleted.Name = "ViewReceiversCompleted"
|
Me.ViewReceiversCompleted.Name = "ViewReceiversCompleted"
|
||||||
@@ -541,7 +584,6 @@ Partial Class frmMain
|
|||||||
Me.ViewReceiversCompleted.OptionsView.ShowDetailButtons = False
|
Me.ViewReceiversCompleted.OptionsView.ShowDetailButtons = False
|
||||||
Me.ViewReceiversCompleted.OptionsView.ShowGroupPanel = False
|
Me.ViewReceiversCompleted.OptionsView.ShowGroupPanel = False
|
||||||
Me.ViewReceiversCompleted.OptionsView.ShowIndicator = False
|
Me.ViewReceiversCompleted.OptionsView.ShowIndicator = False
|
||||||
resources.ApplyResources(Me.ViewReceiversCompleted, "ViewReceiversCompleted")
|
|
||||||
'
|
'
|
||||||
'ColStatusCompleted
|
'ColStatusCompleted
|
||||||
'
|
'
|
||||||
@@ -569,6 +611,7 @@ Partial Class frmMain
|
|||||||
'
|
'
|
||||||
'ViewHistoryCompleted
|
'ViewHistoryCompleted
|
||||||
'
|
'
|
||||||
|
resources.ApplyResources(Me.ViewHistoryCompleted, "ViewHistoryCompleted")
|
||||||
Me.ViewHistoryCompleted.Columns.AddRange(New DevExpress.XtraGrid.Columns.GridColumn() {Me.ColHistoryStatusCompleted, Me.ColHistoryUserReferenceCompleted, Me.ColHistoryDateCompleted})
|
Me.ViewHistoryCompleted.Columns.AddRange(New DevExpress.XtraGrid.Columns.GridColumn() {Me.ColHistoryStatusCompleted, Me.ColHistoryUserReferenceCompleted, Me.ColHistoryDateCompleted})
|
||||||
Me.ViewHistoryCompleted.GridControl = Me.GridCompleted
|
Me.ViewHistoryCompleted.GridControl = Me.GridCompleted
|
||||||
Me.ViewHistoryCompleted.Name = "ViewHistoryCompleted"
|
Me.ViewHistoryCompleted.Name = "ViewHistoryCompleted"
|
||||||
@@ -602,6 +645,7 @@ Partial Class frmMain
|
|||||||
'
|
'
|
||||||
'ViewCompleted
|
'ViewCompleted
|
||||||
'
|
'
|
||||||
|
resources.ApplyResources(Me.ViewCompleted, "ViewCompleted")
|
||||||
Me.ViewCompleted.Columns.AddRange(New DevExpress.XtraGrid.Columns.GridColumn() {Me.GridColumn3, Me.GridColumn4, Me.GridColumn5, Me.GridColumn7})
|
Me.ViewCompleted.Columns.AddRange(New DevExpress.XtraGrid.Columns.GridColumn() {Me.GridColumn3, Me.GridColumn4, Me.GridColumn5, Me.GridColumn7})
|
||||||
Me.ViewCompleted.GridControl = Me.GridCompleted
|
Me.ViewCompleted.GridControl = Me.GridCompleted
|
||||||
Me.ViewCompleted.Name = "ViewCompleted"
|
Me.ViewCompleted.Name = "ViewCompleted"
|
||||||
@@ -635,14 +679,41 @@ Partial Class frmMain
|
|||||||
'
|
'
|
||||||
'XtraTabPageAdmin
|
'XtraTabPageAdmin
|
||||||
'
|
'
|
||||||
|
resources.ApplyResources(Me.XtraTabPageAdmin, "XtraTabPageAdmin")
|
||||||
Me.XtraTabPageAdmin.Controls.Add(Me.SplitContainerControl2)
|
Me.XtraTabPageAdmin.Controls.Add(Me.SplitContainerControl2)
|
||||||
Me.XtraTabPageAdmin.Controls.Add(Me.PanelControl1)
|
Me.XtraTabPageAdmin.Controls.Add(Me.PanelControl1)
|
||||||
Me.XtraTabPageAdmin.Name = "XtraTabPageAdmin"
|
Me.XtraTabPageAdmin.Name = "XtraTabPageAdmin"
|
||||||
resources.ApplyResources(Me.XtraTabPageAdmin, "XtraTabPageAdmin")
|
'
|
||||||
|
'SplitContainerControl2
|
||||||
|
'
|
||||||
|
resources.ApplyResources(Me.SplitContainerControl2, "SplitContainerControl2")
|
||||||
|
Me.SplitContainerControl2.Name = "SplitContainerControl2"
|
||||||
|
'
|
||||||
|
'SplitContainerControl2.Panel1
|
||||||
|
'
|
||||||
|
resources.ApplyResources(Me.SplitContainerControl2.Panel1, "SplitContainerControl2.Panel1")
|
||||||
|
Me.SplitContainerControl2.Panel1.Controls.Add(Me.GridControlData)
|
||||||
|
'
|
||||||
|
'SplitContainerControl2.Panel2
|
||||||
|
'
|
||||||
|
resources.ApplyResources(Me.SplitContainerControl2.Panel2, "SplitContainerControl2.Panel2")
|
||||||
|
Me.SplitContainerControl2.SplitterPosition = 584
|
||||||
'
|
'
|
||||||
'GridControlData
|
'GridControlData
|
||||||
'
|
'
|
||||||
resources.ApplyResources(Me.GridControlData, "GridControlData")
|
resources.ApplyResources(Me.GridControlData, "GridControlData")
|
||||||
|
Me.GridControlData.EmbeddedNavigator.AccessibleDescription = resources.GetString("GridControlData.EmbeddedNavigator.AccessibleDescription")
|
||||||
|
Me.GridControlData.EmbeddedNavigator.AccessibleName = resources.GetString("GridControlData.EmbeddedNavigator.AccessibleName")
|
||||||
|
Me.GridControlData.EmbeddedNavigator.AllowHtmlTextInToolTip = CType(resources.GetObject("GridControlData.EmbeddedNavigator.AllowHtmlTextInToolTip"), DevExpress.Utils.DefaultBoolean)
|
||||||
|
Me.GridControlData.EmbeddedNavigator.Anchor = CType(resources.GetObject("GridControlData.EmbeddedNavigator.Anchor"), System.Windows.Forms.AnchorStyles)
|
||||||
|
Me.GridControlData.EmbeddedNavigator.BackgroundImage = CType(resources.GetObject("GridControlData.EmbeddedNavigator.BackgroundImage"), System.Drawing.Image)
|
||||||
|
Me.GridControlData.EmbeddedNavigator.BackgroundImageLayout = CType(resources.GetObject("GridControlData.EmbeddedNavigator.BackgroundImageLayout"), System.Windows.Forms.ImageLayout)
|
||||||
|
Me.GridControlData.EmbeddedNavigator.ImeMode = CType(resources.GetObject("GridControlData.EmbeddedNavigator.ImeMode"), System.Windows.Forms.ImeMode)
|
||||||
|
Me.GridControlData.EmbeddedNavigator.MaximumSize = CType(resources.GetObject("GridControlData.EmbeddedNavigator.MaximumSize"), System.Drawing.Size)
|
||||||
|
Me.GridControlData.EmbeddedNavigator.TextLocation = CType(resources.GetObject("GridControlData.EmbeddedNavigator.TextLocation"), DevExpress.XtraEditors.NavigatorButtonsTextLocation)
|
||||||
|
Me.GridControlData.EmbeddedNavigator.ToolTip = resources.GetString("GridControlData.EmbeddedNavigator.ToolTip")
|
||||||
|
Me.GridControlData.EmbeddedNavigator.ToolTipIconType = CType(resources.GetObject("GridControlData.EmbeddedNavigator.ToolTipIconType"), DevExpress.Utils.ToolTipIconType)
|
||||||
|
Me.GridControlData.EmbeddedNavigator.ToolTipTitle = resources.GetString("GridControlData.EmbeddedNavigator.ToolTipTitle")
|
||||||
Me.GridControlData.MainView = Me.GridViewData
|
Me.GridControlData.MainView = Me.GridViewData
|
||||||
Me.GridControlData.MenuManager = Me.RibbonControl
|
Me.GridControlData.MenuManager = Me.RibbonControl
|
||||||
Me.GridControlData.Name = "GridControlData"
|
Me.GridControlData.Name = "GridControlData"
|
||||||
@@ -650,51 +721,63 @@ Partial Class frmMain
|
|||||||
'
|
'
|
||||||
'GridViewData
|
'GridViewData
|
||||||
'
|
'
|
||||||
|
resources.ApplyResources(Me.GridViewData, "GridViewData")
|
||||||
Me.GridViewData.GridControl = Me.GridControlData
|
Me.GridViewData.GridControl = Me.GridControlData
|
||||||
Me.GridViewData.Name = "GridViewData"
|
Me.GridViewData.Name = "GridViewData"
|
||||||
'
|
'
|
||||||
'PanelControl1
|
'PanelControl1
|
||||||
'
|
'
|
||||||
|
resources.ApplyResources(Me.PanelControl1, "PanelControl1")
|
||||||
Me.PanelControl1.Controls.Add(Me.GroupControl2)
|
Me.PanelControl1.Controls.Add(Me.GroupControl2)
|
||||||
Me.PanelControl1.Controls.Add(Me.GroupControl1)
|
Me.PanelControl1.Controls.Add(Me.GroupControl1)
|
||||||
resources.ApplyResources(Me.PanelControl1, "PanelControl1")
|
|
||||||
Me.PanelControl1.Name = "PanelControl1"
|
Me.PanelControl1.Name = "PanelControl1"
|
||||||
'
|
'
|
||||||
|
'GroupControl2
|
||||||
|
'
|
||||||
|
resources.ApplyResources(Me.GroupControl2, "GroupControl2")
|
||||||
|
Me.GroupControl2.Controls.Add(Me.LabelControl1)
|
||||||
|
Me.GroupControl2.Name = "GroupControl2"
|
||||||
|
'
|
||||||
|
'LabelControl1
|
||||||
|
'
|
||||||
|
resources.ApplyResources(Me.LabelControl1, "LabelControl1")
|
||||||
|
Me.LabelControl1.Name = "LabelControl1"
|
||||||
|
'
|
||||||
'GroupControl1
|
'GroupControl1
|
||||||
'
|
'
|
||||||
|
resources.ApplyResources(Me.GroupControl1, "GroupControl1")
|
||||||
Me.GroupControl1.Controls.Add(Me.btnEnvelopes_All)
|
Me.GroupControl1.Controls.Add(Me.btnEnvelopes_All)
|
||||||
Me.GroupControl1.Controls.Add(Me.btnEnvelopes_thisYear)
|
Me.GroupControl1.Controls.Add(Me.btnEnvelopes_thisYear)
|
||||||
Me.GroupControl1.Controls.Add(Me.btnEnvelopes_lastmonth)
|
Me.GroupControl1.Controls.Add(Me.btnEnvelopes_lastmonth)
|
||||||
Me.GroupControl1.Controls.Add(Me.btnEnvelopes_thismonth)
|
Me.GroupControl1.Controls.Add(Me.btnEnvelopes_thismonth)
|
||||||
resources.ApplyResources(Me.GroupControl1, "GroupControl1")
|
|
||||||
Me.GroupControl1.Name = "GroupControl1"
|
Me.GroupControl1.Name = "GroupControl1"
|
||||||
'
|
'
|
||||||
'btnEnvelopes_All
|
'btnEnvelopes_All
|
||||||
'
|
'
|
||||||
|
resources.ApplyResources(Me.btnEnvelopes_All, "btnEnvelopes_All")
|
||||||
Me.btnEnvelopes_All.Appearance.BackColor = System.Drawing.Color.MediumTurquoise
|
Me.btnEnvelopes_All.Appearance.BackColor = System.Drawing.Color.MediumTurquoise
|
||||||
Me.btnEnvelopes_All.Appearance.Options.UseBackColor = True
|
Me.btnEnvelopes_All.Appearance.Options.UseBackColor = True
|
||||||
resources.ApplyResources(Me.btnEnvelopes_All, "btnEnvelopes_All")
|
|
||||||
Me.btnEnvelopes_All.Name = "btnEnvelopes_All"
|
Me.btnEnvelopes_All.Name = "btnEnvelopes_All"
|
||||||
'
|
'
|
||||||
'btnEnvelopes_thisYear
|
'btnEnvelopes_thisYear
|
||||||
'
|
'
|
||||||
|
resources.ApplyResources(Me.btnEnvelopes_thisYear, "btnEnvelopes_thisYear")
|
||||||
Me.btnEnvelopes_thisYear.Appearance.BackColor = System.Drawing.Color.LightSeaGreen
|
Me.btnEnvelopes_thisYear.Appearance.BackColor = System.Drawing.Color.LightSeaGreen
|
||||||
Me.btnEnvelopes_thisYear.Appearance.Options.UseBackColor = True
|
Me.btnEnvelopes_thisYear.Appearance.Options.UseBackColor = True
|
||||||
resources.ApplyResources(Me.btnEnvelopes_thisYear, "btnEnvelopes_thisYear")
|
|
||||||
Me.btnEnvelopes_thisYear.Name = "btnEnvelopes_thisYear"
|
Me.btnEnvelopes_thisYear.Name = "btnEnvelopes_thisYear"
|
||||||
'
|
'
|
||||||
'btnEnvelopes_lastmonth
|
'btnEnvelopes_lastmonth
|
||||||
'
|
'
|
||||||
|
resources.ApplyResources(Me.btnEnvelopes_lastmonth, "btnEnvelopes_lastmonth")
|
||||||
Me.btnEnvelopes_lastmonth.Appearance.BackColor = System.Drawing.Color.Turquoise
|
Me.btnEnvelopes_lastmonth.Appearance.BackColor = System.Drawing.Color.Turquoise
|
||||||
Me.btnEnvelopes_lastmonth.Appearance.Options.UseBackColor = True
|
Me.btnEnvelopes_lastmonth.Appearance.Options.UseBackColor = True
|
||||||
resources.ApplyResources(Me.btnEnvelopes_lastmonth, "btnEnvelopes_lastmonth")
|
|
||||||
Me.btnEnvelopes_lastmonth.Name = "btnEnvelopes_lastmonth"
|
Me.btnEnvelopes_lastmonth.Name = "btnEnvelopes_lastmonth"
|
||||||
'
|
'
|
||||||
'btnEnvelopes_thismonth
|
'btnEnvelopes_thismonth
|
||||||
'
|
'
|
||||||
|
resources.ApplyResources(Me.btnEnvelopes_thismonth, "btnEnvelopes_thismonth")
|
||||||
Me.btnEnvelopes_thismonth.Appearance.BackColor = System.Drawing.Color.Aquamarine
|
Me.btnEnvelopes_thismonth.Appearance.BackColor = System.Drawing.Color.Aquamarine
|
||||||
Me.btnEnvelopes_thismonth.Appearance.Options.UseBackColor = True
|
Me.btnEnvelopes_thismonth.Appearance.Options.UseBackColor = True
|
||||||
resources.ApplyResources(Me.btnEnvelopes_thismonth, "btnEnvelopes_thismonth")
|
|
||||||
Me.btnEnvelopes_thismonth.Name = "btnEnvelopes_thismonth"
|
Me.btnEnvelopes_thismonth.Name = "btnEnvelopes_thismonth"
|
||||||
'
|
'
|
||||||
'RefreshTimer
|
'RefreshTimer
|
||||||
@@ -705,32 +788,10 @@ Partial Class frmMain
|
|||||||
'
|
'
|
||||||
resources.ApplyResources(Me.SaveFileDialog1, "SaveFileDialog1")
|
resources.ApplyResources(Me.SaveFileDialog1, "SaveFileDialog1")
|
||||||
'
|
'
|
||||||
'GroupControl2
|
'XtraSaveFileDialog1
|
||||||
'
|
'
|
||||||
resources.ApplyResources(Me.GroupControl2, "GroupControl2")
|
resources.ApplyResources(Me.XtraSaveFileDialog1, "XtraSaveFileDialog1")
|
||||||
Me.GroupControl2.Name = "GroupControl2"
|
Me.XtraSaveFileDialog1.FileName = "XtraSaveFileDialog1"
|
||||||
'
|
|
||||||
'SplitContainerControl2
|
|
||||||
'
|
|
||||||
resources.ApplyResources(Me.SplitContainerControl2, "SplitContainerControl2")
|
|
||||||
Me.SplitContainerControl2.Name = "SplitContainerControl2"
|
|
||||||
'
|
|
||||||
'SplitContainerControl2.Panel1
|
|
||||||
'
|
|
||||||
Me.SplitContainerControl2.Panel1.Controls.Add(Me.GridControlData)
|
|
||||||
resources.ApplyResources(Me.SplitContainerControl2.Panel1, "SplitContainerControl2.Panel1")
|
|
||||||
'
|
|
||||||
'SplitContainerControl2.Panel2
|
|
||||||
'
|
|
||||||
Me.SplitContainerControl2.Panel2.Controls.Add(Me.ChartControl1)
|
|
||||||
resources.ApplyResources(Me.SplitContainerControl2.Panel2, "SplitContainerControl2.Panel2")
|
|
||||||
Me.SplitContainerControl2.SplitterPosition = 501
|
|
||||||
'
|
|
||||||
'ChartControl1
|
|
||||||
'
|
|
||||||
resources.ApplyResources(Me.ChartControl1, "ChartControl1")
|
|
||||||
Me.ChartControl1.Name = "ChartControl1"
|
|
||||||
Me.ChartControl1.SeriesSerializable = New DevExpress.XtraCharts.Series(-1) {}
|
|
||||||
'
|
'
|
||||||
'frmMain
|
'frmMain
|
||||||
'
|
'
|
||||||
@@ -762,20 +823,20 @@ Partial Class frmMain
|
|||||||
CType(Me.ViewHistoryCompleted, System.ComponentModel.ISupportInitialize).EndInit()
|
CType(Me.ViewHistoryCompleted, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
CType(Me.ViewCompleted, System.ComponentModel.ISupportInitialize).EndInit()
|
CType(Me.ViewCompleted, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
Me.XtraTabPageAdmin.ResumeLayout(False)
|
Me.XtraTabPageAdmin.ResumeLayout(False)
|
||||||
|
CType(Me.SplitContainerControl2.Panel1, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
|
Me.SplitContainerControl2.Panel1.ResumeLayout(False)
|
||||||
|
CType(Me.SplitContainerControl2.Panel2, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
|
CType(Me.SplitContainerControl2, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
|
Me.SplitContainerControl2.ResumeLayout(False)
|
||||||
CType(Me.GridControlData, System.ComponentModel.ISupportInitialize).EndInit()
|
CType(Me.GridControlData, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
CType(Me.GridViewData, System.ComponentModel.ISupportInitialize).EndInit()
|
CType(Me.GridViewData, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
CType(Me.PanelControl1, System.ComponentModel.ISupportInitialize).EndInit()
|
CType(Me.PanelControl1, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
Me.PanelControl1.ResumeLayout(False)
|
Me.PanelControl1.ResumeLayout(False)
|
||||||
|
CType(Me.GroupControl2, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
|
Me.GroupControl2.ResumeLayout(False)
|
||||||
|
Me.GroupControl2.PerformLayout()
|
||||||
CType(Me.GroupControl1, System.ComponentModel.ISupportInitialize).EndInit()
|
CType(Me.GroupControl1, System.ComponentModel.ISupportInitialize).EndInit()
|
||||||
Me.GroupControl1.ResumeLayout(False)
|
Me.GroupControl1.ResumeLayout(False)
|
||||||
CType(Me.GroupControl2, System.ComponentModel.ISupportInitialize).EndInit()
|
|
||||||
CType(Me.SplitContainerControl2.Panel1, System.ComponentModel.ISupportInitialize).EndInit()
|
|
||||||
Me.SplitContainerControl2.Panel1.ResumeLayout(False)
|
|
||||||
CType(Me.SplitContainerControl2.Panel2, System.ComponentModel.ISupportInitialize).EndInit()
|
|
||||||
Me.SplitContainerControl2.Panel2.ResumeLayout(False)
|
|
||||||
CType(Me.SplitContainerControl2, System.ComponentModel.ISupportInitialize).EndInit()
|
|
||||||
Me.SplitContainerControl2.ResumeLayout(False)
|
|
||||||
CType(Me.ChartControl1, System.ComponentModel.ISupportInitialize).EndInit()
|
|
||||||
Me.ResumeLayout(False)
|
Me.ResumeLayout(False)
|
||||||
Me.PerformLayout()
|
Me.PerformLayout()
|
||||||
|
|
||||||
@@ -825,7 +886,6 @@ Partial Class frmMain
|
|||||||
Friend WithEvents txtRefreshLabel As DevExpress.XtraBars.BarStaticItem
|
Friend WithEvents txtRefreshLabel As DevExpress.XtraBars.BarStaticItem
|
||||||
Friend WithEvents btnShowDocument As DevExpress.XtraBars.BarButtonItem
|
Friend WithEvents btnShowDocument As DevExpress.XtraBars.BarButtonItem
|
||||||
Friend WithEvents btnContactReceiver As DevExpress.XtraBars.BarButtonItem
|
Friend WithEvents btnContactReceiver As DevExpress.XtraBars.BarButtonItem
|
||||||
Friend WithEvents RibbonPageFunctions As DevExpress.XtraBars.Ribbon.RibbonPageGroup
|
|
||||||
Friend WithEvents colEnvelopeId As DevExpress.XtraGrid.Columns.GridColumn
|
Friend WithEvents colEnvelopeId As DevExpress.XtraGrid.Columns.GridColumn
|
||||||
Friend WithEvents ViewHistoryCompleted As DevExpress.XtraGrid.Views.Grid.GridView
|
Friend WithEvents ViewHistoryCompleted As DevExpress.XtraGrid.Views.Grid.GridView
|
||||||
Friend WithEvents ColHistoryStatusCompleted As DevExpress.XtraGrid.Columns.GridColumn
|
Friend WithEvents ColHistoryStatusCompleted As DevExpress.XtraGrid.Columns.GridColumn
|
||||||
@@ -853,5 +913,8 @@ Partial Class frmMain
|
|||||||
Friend WithEvents GridViewData As DevExpress.XtraGrid.Views.Grid.GridView
|
Friend WithEvents GridViewData As DevExpress.XtraGrid.Views.Grid.GridView
|
||||||
Friend WithEvents GroupControl2 As DevExpress.XtraEditors.GroupControl
|
Friend WithEvents GroupControl2 As DevExpress.XtraEditors.GroupControl
|
||||||
Friend WithEvents SplitContainerControl2 As DevExpress.XtraEditors.SplitContainerControl
|
Friend WithEvents SplitContainerControl2 As DevExpress.XtraEditors.SplitContainerControl
|
||||||
Friend WithEvents ChartControl1 As DevExpress.XtraCharts.ChartControl
|
Friend WithEvents LabelControl1 As DevExpress.XtraEditors.LabelControl
|
||||||
|
Friend WithEvents BarButtonItem3 As DevExpress.XtraBars.BarButtonItem
|
||||||
|
Friend WithEvents XtraSaveFileDialog1 As DevExpress.XtraEditors.XtraSaveFileDialog
|
||||||
|
Friend WithEvents RibbonPageGroupFunctions As DevExpress.XtraBars.Ribbon.RibbonPageGroup
|
||||||
End Class
|
End Class
|
||||||
|
|||||||
@@ -353,12 +353,260 @@
|
|||||||
MC40QzIuMSwyNS4zLDIuMiwyNS4zLDIuMiwyNS4yeiIgY2xhc3M9IlllbGxvdyIgLz4NCiAgPC9nPg0K
|
MC40QzIuMSwyNS4zLDIuMiwyNS4zLDIuMiwyNS4yeiIgY2xhc3M9IlllbGxvdyIgLz4NCiAgPC9nPg0K
|
||||||
ICA8cGF0aCBkPSJNMzEuMywxNEg5LjZMNCwyNmgyMS44YzAuNSwwLDEuMS0wLjMsMS4zLTAuN0wzMiwx
|
ICA8cGF0aCBkPSJNMzEuMywxNEg5LjZMNCwyNmgyMS44YzAuNSwwLDEuMS0wLjMsMS4zLTAuN0wzMiwx
|
||||||
NC43QzMyLjEsMTQuMywzMS44LDE0LDMxLjMsMTR6IiBjbGFzcz0iWWVsbG93IiAvPg0KPC9zdmc+Cw==
|
NC43QzMyLjEsMTQuMywzMS44LDE0LDMxLjMsMTR6IiBjbGFzcz0iWWVsbG93IiAvPg0KPC9zdmc+Cw==
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||||
|
<data name="BarCheckItem1.ImageOptions.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABN0RVh0VGl0
|
||||||
|
bGUAUHJvamVjdDtGaWxlOz37jYIAAAK6SURBVDhPfdNbSNNRHAfwv5bRNK3Ql1WEc5IgDLsIFk3LiIJK
|
||||||
|
Ic2XHlJLNC95mVpumCOWLrXUZJZu5g3NoqtYKJnhpZeSIHrIkuFDpRFl7eru+3bO2RouqMFn52Hn9/39
|
||||||
|
zuGMA+BTl7hFQLQo9vDn5fER8zLR+pbKGJ5g5Z6/0U8gsYpYrRBv1sp388skceHRxbFh0eUxwWUlgiAt
|
||||||
|
+S3Ii+4L8AtYGCyd0Pacg7anCCOydMx1FWLuVgE+dubjgyYfD4oOY1adh/cduXinOjNJG/kFTF85BevC
|
||||||
|
Sz+2b29g+TqD5cUZmBdew/TlFdOVd5TOHEqsIehEAdyINA362SF8firDp2Eps/iiEX39w7jaOYVGSuPR
|
||||||
|
oJlEg5pon0CtamyKBQ3mHoB2qAa92TvRlBKNtoxYvNXkoJ5sdLvh4yJfjMsNJ1Grek6n4XENh2JRtYOP
|
||||||
|
a6TYaZiAXMyHYl8klDfGWYHZ4mBMFidBVwccThcuXX9GA4K51uPxUGUkoO7gVphnMnB+VwTa0kVQtI6x
|
||||||
|
TqZlB4xeBrOHzeFCdeMIDQjhujOTMVqdjoq4jTgr5EEi2oBHhWLUNI2STm4YzXZSZIfe5ICerDqTHVa7
|
||||||
|
C1XKYU/AzRMJGMhJQnuqEB3HhFCnRuFhXgKk9U9YJz0p0Jls0Bk9fhHLVifKFY9pwDqu+YgI6rQ4NCfz
|
||||||
|
0UTt56MjbRsqLg/BYnf6in4aPJYMVhgtdhRfvEcDQjm5OGpamSSEMjEKdWIBavdGoiVlO0pr7sNMOi15
|
||||||
|
i5b0VvzwrnqzDQXSO54ANgbHhRMRK2wqlN1lN84KGQu+66wMnSincoAGhPmepN/z5Li1uRdus0v7cwfs
|
||||||
|
GASdhoZlS/r+GxCUWdI9frq8j23MkvQiq6wXmVQpUdKDk/nt9H/B+1dAAEHfezARQtBj0vNSYV48juMC
|
||||||
|
fwOJP3aHKtHXCAAAAABJRU5ErkJggg==
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="BarCheckItem1.ImageOptions.LargeImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABN0RVh0VGl0
|
||||||
|
bGUAUHJvamVjdDtGaWxlOz37jYIAAAiRSURBVFhHlZcJVJTXFcdJbG2axCZICgoqnGjcJRqXurUmBg1W
|
||||||
|
U7eoRUshVkyMIoIFhYCA4oBKkE0GEFwTWRUVFxQFRFDcMJrVE42ABhWHGdZhBob8e+/7vg8HQ23zzvmd
|
||||||
|
+3n85v3/3333vvewAPALzMZzRLft3kuszycH+FxI8s8rSfC9Xhzrg/wtK788vnHZqXRfFz/3qaP60Hsv
|
||||||
|
Er8lnpd/1+XcT/OsIcSPqFa8XRLv8+jG/g24fTQSFSei8fCcGt9mBONashcKVG74fPn0ex+NcZhG7/+B
|
||||||
|
6C7/9pnD3AC/3BXdiBeObXCruJW2HgXhbjjwiTN2uk7G1veGYccHo5HsMhbH1s1CacRCBI3vV0Xv2xIv
|
||||||
|
E78hupqTEcPcAAvxDxhOocLviFf2eTjj6g53qN4dDI9Rdu6uw2ym2b3c3W7xICunDwdbuYZMsEd+wFT4
|
||||||
|
Ob7Gsw0irImX5N8rcFa6XB6L6pLdhQ8v7MXDC3skSncLHpTuElxU++GHg8E4EeqO6uIUVJ/bKfipiGJR
|
||||||
|
Mgq2rsCXqZ7I9l2A+4WJuF+gxj3mrBpVZxNQeWYHKvPjcTMzvEg20ZEFMSpPx6Hpbj5aNWVmXETrY+aC
|
||||||
|
TOkTakpgfHSeKJY5B+NDpkimUGB4UCDgZ+03GTj+6VzO0AsEZ+HJKFd7oOG7NOguh0N3SUZ+1jLyc115
|
||||||
|
HHTX1QLt9QTUdkKN2nKKhKZceubI7+muRqHhZjKyPKexAV6azgZKty1GdWEU7mR4oiLHCxWHvXE3ZzW+
|
||||||
|
y/iYWEH/Xo2qYz6oLtiMnJw8pKRfwc4MgmJy2mVBEpHIHLgkUH8hcTJrL+6fCaP5tyBm9hA28ArRbUtS
|
||||||
|
gdAWoyB0Hm5l+qE8biGuxy7Elah5OOnvhOxVE5C5cjyOr5+K8vgF+D7DC8kk2tUwGtvQpDeirl6PR5oG
|
||||||
|
VNzTovzrn1Bc9iMyE+Pwbfo6RLwnDFgS3cJiTwttMU76z0RJxFwUh0wV5K2bjC88RqOqPAtV17IQ5mSP
|
||||||
|
XJ8JKItegqQDl9H+889oM0m0mtoFLQbJgK6hBQ81jbhTVYu4fRdAr+Jk0ffYtS0C22aPYwNWROdC3OU+
|
||||||
|
sSj+b4OQtGAo1POHIHrWAKS4OqK9iYqwOhr+k2wQOqUPktymiPSa2mXhNopt7TDKtBha0dhshEbbTAY0
|
||||||
|
iEw5Jww06tuQe/YbBHoGVJPcH4lfbFS26jkOSFw8GlHT+yLiHVvEzB9M4gnQf70Ua8dYIWSyNRL/MQkJ
|
||||||
|
n5dJBmRREVvbYWg1UTShuaUVtbQMtykDm+PPCAN6Y7swkXPqKyz3TdlKerxl897TYcJm76KBOL1hNtLc
|
||||||
|
RmCPyxConB1wM80Z17b3xpqRloid9ToOeTsjfv9FmCj1LG4gYUWcaWGMJmhpGX6o0CDosxPCAGeqRZgw
|
||||||
|
IfvEDXy4JiWcNLkdO0zY7CEDFyOX4OgnY3Fo+VsIf7cPPh70Ej4a+CKCJlpj16IhOBHwPuL2loq1N7RJ
|
||||||
|
okKYRBX0VIx1jQbcrqiFn+qIKFA2QStGy8ZGTMjMLYfrSrWKdHkpREv2Sp3XH5ciF+PoirdwhEhzH4GE
|
||||||
|
2f0R5WyPnfPfQObSN6kbZiJmdwkZoPWmL5dE22RhggpRbzChvtGIygd1CIvNg1dwNjw3ZMEzKAurAplM
|
||||||
|
5OTdQPiOM1yQylJY2Ca+74Dzqvk46OGI7GVvSvzLEVnLCIqZSx1x2HcGonedlwzIX8uCijDHJj0VIlGj
|
||||||
|
0+PHezrcvPUAV76qQtn1SpRcvYvCstsovnQbYXH5bKCHYsAuzrkfTgfMRNo/hyPdfTgyiHS3YYI04oDr
|
||||||
|
MGR7T0NUSjHaaP1ZrNmcFhInuAg51jcZqRhb8JiMVGuacO9BPe7e14nauFOpwabYU2yAj24+AC36Rjv1
|
||||||
|
wZHVU5A6dwBS5/RH6vwB2L3gDexZOBB7F1H8+0CkrXoHkTuLROV3FpZEmUaGMtBA7cixnmIdm6HCrNE1
|
||||||
|
o7qmETW1jQjdnscGeFcUBvptm2KLzGV/QsJfHWTskTDDATtm2AviqBZS3egekEgHDRloIvEOUWoxIcrp
|
||||||
|
b5ZiA0eiXqHDhF5sVsHUIaT7qmLAPnxSL+xfMhKxTn0RY0Y0dQMTNdUOiS7jEZFwlgyYhKAk2iYJyqJP
|
||||||
|
BFtRR7GOIxWlTkZDy9JIZoIihQHeliUDm8ZZI2XeUHz2l96ErYiRCn/uja2TeyP+g3FQUfVy7wsDJNBJ
|
||||||
|
lKHJWZwjp14R1lFrahskuE4Cth5nAz0VA3aBo6xqYpz6YctEG2yZYI61QDXeGjFzxmBzbL7Y8SRhFpMF
|
||||||
|
5Wfzr2W0CrJ4bb1BdJB/RC4bUM4Fi1ddXu/h4T+iZ22gY08EOloicIQlPlUYbgn/YZZQTR+JjTGnxeaj
|
||||||
|
fKECi0niBkmYxcxEFTTCQBvWqY6ygdcUA3xn43T0JQYQA2X4fqcwlBgbQtXLX9AhLkTNvraBi41bUDIg
|
||||||
|
RCmysKaO2rLOIFrYd/MRNsAHkzDA+zGvBRv5PcE71NNwz9py9bIBRVRZ21p6FsIspkAFx6IaEmUDj2UD
|
||||||
|
3L5rN+V0MsCDTTwLftEqaNtxse1qWVgRl4U70kwij3kTYmTRGoo1dXoRuXV9QoUBvj1377ge/zfkIQxw
|
||||||
|
9fK2q6xxxxezsBBUvlSiRsfCLXhE/f9IS5cVrV500JqQQzyxDfHrDKwPzxUpFOnltArhJ+mt6fhaFpWF
|
||||||
|
OZIwiwsD1EFeG7J54l7ErzLQ0y/8qLiQSPcA6S7ANSEdTsrB1Pl8kHZLeeMicYZPR5rv/14CrgE+tXqs
|
||||||
|
CU4v/HfYYTBrNx2GDxWTz8YceNOaeoceIg6K9HoFHxSspi9lPJkgho7koEws99t3juaTtuKuRM2RB18c
|
||||||
|
+ALBRyj3L7vnNWQ4leb0fgr+e9Ec/g2Lc9c936WoOfLgLLAJbldeDjbzv1D+Lnwa/j+eh+azeO4/pQGb
|
||||||
|
2zax9GEAAAAASUVORK5CYII=
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="bsitmInfo.ImageOptions.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAt0RVh0VGl0
|
||||||
|
bGUASW5mbzttEi2GAAAKW0lEQVRYR5VWd1DVVxYmbdOTzc5sZst/O7M7s7Ozs9mdzCRZE5WiYCFERSmS
|
||||||
|
KIL0IrCASpUighQpAtKLICC9FwFBenvwKArSm9IFBQXRb8+5D4iazGT3zHzv3nfv/Z3vO+eee38/OQAv
|
||||||
|
4f+w134Gv2g/4eOfxOx2uXhCgoCE+hLRJmS2CcRnSvjZTZLXN/DGz2BzTqyNvt4sF53WJBdFiEyllhCZ
|
||||||
|
0igXwbjW8KOAOCLZVPQqNpwJwpD4ys+uXGs4F5nWVBuV2twandayHnW9eT0ytbGNnNaGJdW4+YYX/IvW
|
||||||
|
vsnrN5597ef8hiXVyfzzT8z1lpcmxcTGw4Q3Qq/WqEekNvWm5HeguWMME1NLmJl/hOfPnwtwf+L+Ihrb
|
||||||
|
R5GUK0FYUm3fpahyLXr2LX6e/bzqPyShZpNHTqTmxUkyEfWFkNw/hSfVN+Te6MEkkW4ak64/e46n68+w
|
||||||
|
9vSZaJ+uP8czGmObnFpEdmkngmKrG097xP6ZfHFGXqepLY7A2CrmkVl4smw/GGQiat/wYqXw5Pr5zjv3
|
||||||
|
aJhJgdW1dfSNL6Go7R5Sasbgk9MHr+xeJNwcQWb9ODoG5rH0aA1rtI5FtvdMIjiuat7VN12ZfHI2tkT4
|
||||||
|
R1Yyl8xCr27sxwa5T2ihUlRq4+rE/QfMLSKUDi0gqGgAAYVDCCwZQVDpKGEEAcXDuJg3BK+su3BNvQP3
|
||||||
|
lG7c6prCw0erQvDY5AIux9esOnglq5DvLRE+4eXMJ7OguFvciLQ7X0z5y+WEmtn707KUrzx5iqSqEfjk
|
||||||
|
9SOQCENujCGkfAzBhMCyMQSQGL/CYXiTCM+sfiHCLq4Tgdl3MD2/jJXHa6I+/CLK54xtLv2NOFjEa16X
|
||||||
|
S5hTZv7RN7nhSn+LFtZJb08K8kcrawgu6Id3bj/8S4ZxqWxUwL9oBCXSKUzMr2D+4SqqumfgQeTuWQNw
|
||||||
|
TevD2aQe/CdaCqe4DkzOPCQ/q5B0jcH9Un49cbxH2DwhW8Z/3nQLyNFOyGgS5Jy+6LIBeGTehU/+EHwp
|
||||||
|
1b5Fw/DKG0Dz3TmsrK5jefUpnlARPqb+mcQuuFzvg9O1Ozh7tRs2MZ0wC2vD+WQp5hZWsEyZiEyqhbVz
|
||||||
|
3DHiepvAAW8Z/3nbK6S0b3h8TlRzbfc0HJO7KbI+nM8dxHki9iIhDsldmJxdJlLZCWBr75vGqah2OBD5
|
||||||
|
mas9sI3tgg1lwIIE6Ac0IvvWEGYXlnF3aBoOXln9xPUBgU+GyIKI3tYtUTnyWq1wuLS8CqerneSwB+fS
|
||||||
|
+3Auox9ulGKGHUUaX3wHD2l7uvpnkFxyG7o+NyniDtgnUOrjumDN5Fc6YBLaKgQY+tVh7N4SFhYfIzim
|
||||||
|
HPqWAarE+asXBbx19kK6f3XjXRF9K0cU3Y7TyT1wpKJyTOuFE+2tE7VnaMz8Sit0LlRCw7UMWm7lsApv
|
||||||
|
gmWEBFYxXZQJKcwjOmAa2gbD4Bbo+TfgqOctZFcP4t70Q5RVdcP8TEwQcb5LENvAP+84emfVDI7MiKqN
|
||||||
|
KOiFZZQEtvFdsE/shj0VlT0Rn6bWJr4TJpcbEZQuRX3XJBZXnoqt0CUi88h2mIZLYHy5FYZBMvLjvvXQ
|
||||||
|
9qiGR1wbxu8too2K0dIhgYvxQwIXoxDw7lmvzNnFpceYmVuGU6yEopBQFqSwpiNlzWnllvbWMKQJkr4Z
|
||||||
|
Il6TYXlNbNvR81Uw5qhDWnEysAknKPXHL9bj+wu1lKVqHPeswuD4PPoGp2HhkDhHnB8TuA6Eivft3a+v
|
||||||
|
rdOFM0ZnVsOlAkaXW2B2RQIzSidHZhHZATNq9QMbkVZxFwtE/IDALZumWyVOBjVDL6AJun4NOOZTT9tU
|
||||||
|
C01Kv7pLJfZYFaJ/eBb9I7MwOxO/RpyfEPhOEAI+sHFNEQKG6BR8Z1eCAw4VMCCHRlRIRhSZAFW1QUgL
|
||||||
|
DrncwCRlap5uuwW6etnUXcplxBcboONdRxmpgZYHk9/EXqti7D1VgN7BGdwemIKxXQwL+M1LAiwdk2Yf
|
||||||
|
LK5gYHQOOuRsj3Ux1E6X4weKRI9Sqr8BPRJ15FwleobnSMATcRGxHXAokxF7EbFnNTTcqnDIkfwQ+W7z
|
||||||
|
fGg4lOB2/zRapKPQt4rgLWABYgu4Bt43to2t6x24h8HReZzyuwVly0LstS7BXpsSHHSsJOe1OOZLERIO
|
||||||
|
Uga6h2Yxt/QEsySAX1Sq9sXQcq+GpjsRO1dgv10p+SjAbosCKJnmwtz7Jrr6psQpOGYS3Eicv35RwLu6
|
||||||
|
5iFBReVSjE4sIC6nC0pm+VA5VSQiECAxqvZlQsxe20L0ji5ghgVQ4fIpULMrwn77UiFYhcQrE/Fui3wi
|
||||||
|
z4O8URZCUySQ0ps1Ia0GR3S9wojzpVPw9gEdZzV3v2xMzT5CS+cE7Vk+dpOI3RQFC1EmqJwqFBEdOV2A
|
||||||
|
abpUphefYIZazoS5dwUUTXLFPBPvMsuDIkWuaJQDZfMc1EtGxevZ/tw17FY7pUGc/E5gbtlFRPhY1yxs
|
||||||
|
QNozBv4G8E1ogYJxLmUiTziUoQDyxtmobh/H1IPHArMPn2CZ3pgzdN/vMMzCLopYyTRHiJE3ysYOg0x4
|
||||||
|
xzTR+R9Hbkk7NPT8hojrt4Stm5CNlbz33VHnk64+GeK4tHSO46hjMYnIgRI544h2meVCgZyGprVj/P6P
|
||||||
|
X0hDEw8QQineSWSKJtmEHMiTGP6vdaZQRN8iHYe1YzxFb21CXJvp3xKwmYVPtAwCmosrpGglxRUNg1C1
|
||||||
|
ysNOcqZAkSuSGAUi2GGYia/1rmPbiTRs003F1/ppIlJ54yyx37x++8kM7LPIQWntABrpOzIq6SYO6pxv
|
||||||
|
J45PCfw23CKX0zbkq1lWjF/Jf//VcbOQ+Rp6LzRLx8hBP7TPFmHHSSIwIAJyziQKAtkCPMaiWMQOIt6u
|
||||||
|
nw7t04Uoqu5Dg2QE2UUSaOn5L3z2xYHtxMFvwpeil9PUv8QND/Cx+FB+n6m6nmXYWgGdCv7SrWkehmdE
|
||||||
|
HXaZZArn2w0yiIxAZAI09o1+Br6hrCgaZcD9Sh2qmgZR1zaMtNxm6BhcWvtKQZe/kvnoiS8itaNe1GzY
|
||||||
|
kRP+L34TioLcrmx4RFM/4EFiei05GkFd6zBu1A3gYmwj9FxLcNg2H1+foPTrpom+nksJfGIaUFrTj5qW
|
||||||
|
YdS2DCEsvgKHfriw+OXOY9rkky8eUXjM9a2WB3U37NCxiy8K2BTx0d8/3/+F2lGPdlvnRKTnt5DjIeGY
|
||||||
|
UdNM2GhvNQ8SuJX1U3OaYWYXhX2HXTr++o9d/yZffO9vVr0QsF/DnbobdkDHWwh4RQRvx/uET3eqmJqq
|
||||||
|
anmO6luEwiswB8lZjcgoaEM1pZmRTv2kzAacD8jGcZNg7D9ybnSbooEFPft7Ale8SDtjk2fPYVf6u2Fq
|
||||||
|
2l5bAl4RwcXCFfsR4Xefb9NSVVK1Cd1LkRF6v9XyxLeaHtij7ty3R92pQ2GfVdg/v1T/jtb+gcD7/Q6B
|
||||||
|
A3mJnKFyyJmGNmy/hqecqqbHT0D2qhCuYE4nHyWO7o8b4D6P8T7zGl67RbznkIucwEFnQaxy0ElO+YAT
|
||||||
|
Tf3vtimEjyo75pQyyYvgMZ7jNQxe/wsmJ/df0Zh/vpjXMzsAAAAASUVORK5CYII=
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="bbtnitmEB.Caption" xml:space="preserve">
|
||||||
|
<value>Show results report</value>
|
||||||
|
</data>
|
||||||
|
<data name="bbtnitmEB.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v21.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40
|
||||||
|
LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
|
||||||
|
dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAJYEAAAC77u/
|
||||||
|
PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
|
||||||
|
IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
|
||||||
|
MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
|
||||||
|
Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
|
||||||
|
MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJ
|
||||||
|
LlJlZHtmaWxsOiNEMTFDMUM7fQoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5HcmVlbntmaWxsOiMwMzlD
|
||||||
|
MjM7fQoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
|
||||||
|
Y2l0eTowLjc1O30KPC9zdHlsZT4NCiAgPGcgaWQ9IkRvY3VtZW50UERGIj4NCiAgICA8cGF0aCBkPSJN
|
||||||
|
MjIsMjR2NEgyVjJoMTR2NWMwLDAuNiwwLjQsMSwxLDFoNXY0aDJWN2wtNy03SDFDMC40LDAsMCwwLjQs
|
||||||
|
MCwxdjI4YzAsMC42LDAuNCwxLDEsMWgyMmMwLjYsMCwxLTAuNCwxLTEgICB2LTVIMjJ6IiBjbGFzcz0i
|
||||||
|
QmxhY2siIC8+DQogICAgPHBhdGggZD0iTTE5LjIsMTZjMC4zLDAuNSwwLjQsMS4xLDAuNCwxLjljMCww
|
||||||
|
LjktMC4yLDEuNS0wLjUsMmMtMC4zLDAuNS0wLjcsMC43LTEuMywwLjdoLTAuNnYtNS4zaDAuNiAgIEMx
|
||||||
|
OC40LDE1LjMsMTguOSwxNS42LDE5LjIsMTZ6IE0xMi4xLDE1LjNoLTAuNXYyLjZoMC41YzAuNywwLDEu
|
||||||
|
MS0wLjQsMS4xLTEuM2MwLTAuNC0wLjEtMC44LTAuMy0xQzEyLjYsMTUuNCwxMi40LDE1LjMsMTIuMSwx
|
||||||
|
NS4zeiAgICBNMzAsMTJ2MTJINlYxMkgzMHogTTE0LjgsMTYuNWMwLTAuOC0wLjItMS41LTAuNi0xLjlj
|
||||||
|
LTAuNC0wLjQtMS0wLjctMS44LTAuN0gxMHY4aDEuNnYtMi43aDAuNmMwLjgsMCwxLjQtMC4zLDEuOS0w
|
||||||
|
LjggICBDMTQuNSwxOCwxNC44LDE3LjMsMTQuOCwxNi41eiBNMjEuMiwxNy45YzAtMi42LTEuMS0zLjkt
|
||||||
|
My40LTMuOWgtMi4xdjhoMi4yYzEuMSwwLDEuOS0wLjQsMi41LTEuMUMyMC45LDIwLjIsMjEuMiwxOS4y
|
||||||
|
LDIxLjIsMTcuOXogICAgTTI2LDE0aC0zLjd2OGgxLjZ2LTMuMWgydi0xLjNoLTJ2LTIuMkgyNlYxNHoi
|
||||||
|
IGNsYXNzPSJSZWQiIC8+DQogIDwvZz4NCjwvc3ZnPgs=
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="bbtnitmInfoMail.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v21.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40
|
||||||
|
LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
|
||||||
|
dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAKQCAAAC77u/
|
||||||
|
PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
|
||||||
|
IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
|
||||||
|
MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
|
||||||
|
Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
|
||||||
|
MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9Cgku
|
||||||
|
WWVsbG93e2ZpbGw6I0ZGQjExNTt9CgkuQmx1ZXtmaWxsOiMxMTc3RDc7fQoJLlJlZHtmaWxsOiNEMTFD
|
||||||
|
MUM7fQoJLldoaXRle2ZpbGw6I0ZGRkZGRjt9CgkuR3JlZW57ZmlsbDojMDM5QzIzO30KCS5zdDB7Zmls
|
||||||
|
bDojNzI3MjcyO30KCS5zdDF7b3BhY2l0eTowLjU7fQoJLnN0MntvcGFjaXR5OjAuNzU7fQo8L3N0eWxl
|
||||||
|
Pg0KICA8ZyBpZD0iTWFpbCI+DQogICAgPHBhdGggZD0iTTE2LDE4LjNsMTQtOFYyNWMwLDAuNS0wLjUs
|
||||||
|
MS0xLDFIM2MtMC41LDAtMS0wLjUtMS0xVjEwLjNMMTYsMTguM3ogTTI5LDZIM0MyLjUsNiwyLDYuNSwy
|
||||||
|
LDd2MWwxNCw4bDE0LThWNyAgIEMzMCw2LjUsMjkuNSw2LDI5LDZ6IiBjbGFzcz0iQmxhY2siIC8+DQog
|
||||||
|
IDwvZz4NCjwvc3ZnPgs=
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="BarButtonItem2.Caption" xml:space="preserve">
|
||||||
|
<value>Send invitation again</value>
|
||||||
|
</data>
|
||||||
|
<data name="BarButtonItem2.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v21.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40
|
||||||
|
LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
|
||||||
|
dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAKQCAAAC77u/
|
||||||
|
PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
|
||||||
|
IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
|
||||||
|
MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
|
||||||
|
Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
|
||||||
|
MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9Cgku
|
||||||
|
WWVsbG93e2ZpbGw6I0ZGQjExNTt9CgkuQmx1ZXtmaWxsOiMxMTc3RDc7fQoJLlJlZHtmaWxsOiNEMTFD
|
||||||
|
MUM7fQoJLldoaXRle2ZpbGw6I0ZGRkZGRjt9CgkuR3JlZW57ZmlsbDojMDM5QzIzO30KCS5zdDB7Zmls
|
||||||
|
bDojNzI3MjcyO30KCS5zdDF7b3BhY2l0eTowLjU7fQoJLnN0MntvcGFjaXR5OjAuNzU7fQo8L3N0eWxl
|
||||||
|
Pg0KICA8ZyBpZD0iTWFpbCI+DQogICAgPHBhdGggZD0iTTE2LDE4LjNsMTQtOFYyNWMwLDAuNS0wLjUs
|
||||||
|
MS0xLDFIM2MtMC41LDAtMS0wLjUtMS0xVjEwLjNMMTYsMTguM3ogTTI5LDZIM0MyLjUsNiwyLDYuNSwy
|
||||||
|
LDd2MWwxNCw4bDE0LThWNyAgIEMzMCw2LjUsMjkuNSw2LDI5LDZ6IiBjbGFzcz0iQmxhY2siIC8+DQog
|
||||||
|
IDwvZz4NCjwvc3ZnPgs=
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="BarButtonItem3.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v21.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40
|
||||||
|
LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
|
||||||
|
dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAHYNAAAC77u/
|
||||||
|
PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
|
||||||
|
IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
|
||||||
|
MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
|
||||||
|
Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
|
||||||
|
MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5H
|
||||||
|
cmVlbntmaWxsOiMwMzlDMjM7fQoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9Cgkuc3Qwe29wYWNpdHk6MC4z
|
||||||
|
O30KPC9zdHlsZT4NCiAgPHBhdGggZD0iTTgsNGgxOHY2aDJWM2MwLTAuNS0wLjUtMS0xLTFIN0M2LjUs
|
||||||
|
Miw2LDIuNSw2LDN2N2gyVjR6IiBjbGFzcz0iQmxhY2siIC8+DQogIDxwYXRoIGQ9Ik0yNiwyNkg4di04
|
||||||
|
SDZ2OWMwLDAuNSwwLjUsMSwxLDFoMjBjMC41LDAsMS0wLjUsMS0xdi05aC0yVjI2eiIgY2xhc3M9IkJs
|
||||||
|
YWNrIiAvPg0KICA8cGF0aCBkPSJNMzEsOEgzQzIuNCw4LDIsOC40LDIsOXYxMGMwLDAuNiwwLjQsMSwx
|
||||||
|
LDFoMjhjMC42LDAsMS0wLjQsMS0xVjlDMzIsOC40LDMxLjYsOCwzMSw4eiBNOS4xLDE4bC0xLjMtMi41
|
||||||
|
ICBjLTAuMS0wLjEtMC4xLTAuMy0wLjItMC41aDBjMCwwLjEtMC4xLDAuMy0wLjIsMC41TDYuMSwxOEg0
|
||||||
|
bDIuNS0zLjlsLTIuMi0zLjloMi4xbDEuMSwyLjNjMC4xLDAuMiwwLjIsMC40LDAuMiwwLjdoMCAgYzAt
|
||||||
|
MC4yLDAuMS0wLjQsMC4yLTAuN2wxLjItMi4zaDEuOWwtMi4zLDMuOGwyLjQsMy45SDkuMXogTTE2Ljcs
|
||||||
|
MThoLTQuNnYtNy43aDEuN3Y2LjNoMi45VjE4eiBNMjIuNCwxNi45Yy0wLjIsMC4zLTAuNCwwLjUtMC43
|
||||||
|
LDAuNyAgcy0wLjYsMC4zLTEsMC40Yy0wLjQsMC4xLTAuOCwwLjEtMS4yLDAuMWMtMC40LDAtMC44LDAt
|
||||||
|
MS4yLTAuMWMtMC40LTAuMS0wLjctMC4yLTEtMC4zVjE2YzAuMywwLjMsMC42LDAuNSwxLDAuNnMwLjcs
|
||||||
|
MC4yLDEuMSwwLjIgIGMwLjIsMCwwLjQsMCwwLjYtMC4xczAuMy0wLjEsMC40LTAuMmMwLjEtMC4xLDAu
|
||||||
|
Mi0wLjIsMC4yLTAuMmMwLjEtMC4xLDAuMS0wLjIsMC4xLTAuM2MwLTAuMiwwLTAuMy0wLjEtMC40ICBj
|
||||||
|
LTAuMS0wLjEtMC4yLTAuMi0wLjQtMC4zUzIwLDE1LjEsMTkuOCwxNXMtMC40LTAuMi0wLjctMC4zYy0w
|
||||||
|
LjYtMC4zLTEuMS0wLjYtMS4zLTAuOWMtMC4zLTAuNC0wLjQtMC44LTAuNC0xLjMgIGMwLTAuNCwwLjEt
|
||||||
|
MC43LDAuMi0xYzAuMi0wLjMsMC40LTAuNSwwLjctMC43YzAuMy0wLjIsMC42LTAuMywxLTAuNHMwLjgt
|
||||||
|
MC4xLDEuMi0wLjFjMC40LDAsMC44LDAsMS4xLDAuMWMwLjMsMCwwLjYsMC4xLDAuOSwwLjIgIHYxLjZj
|
||||||
|
LTAuMS0wLjEtMC4zLTAuMi0wLjQtMC4ycy0wLjMtMC4xLTAuNS0wLjJjLTAuMiwwLTAuMy0wLjEtMC41
|
||||||
|
LTAuMXMtMC4zLDAtMC41LDBjLTAuMiwwLTAuNCwwLTAuNSwwLjFjLTAuMiwwLTAuMywwLjEtMC40LDAu
|
||||||
|
MiAgYy0wLjEsMC4xLTAuMiwwLjEtMC4zLDAuMmMtMC4xLDAuMS0wLjEsMC4yLTAuMSwwLjNjMCwwLjEs
|
||||||
|
MCwwLjIsMC4xLDAuM2MwLjEsMC4xLDAuMiwwLjIsMC4zLDAuM2MwLjEsMC4xLDAuMywwLjIsMC41LDAu
|
||||||
|
MyAgczAuNCwwLjIsMC42LDAuM2MwLjMsMC4xLDAuNiwwLjMsMC44LDAuNGMwLjIsMC4xLDAuNSwwLjMs
|
||||||
|
MC42LDAuNWMwLjIsMC4yLDAuMywwLjQsMC40LDAuNnMwLjEsMC41LDAuMSwwLjggIEMyMi42LDE2LjMs
|
||||||
|
MjIuNSwxNi42LDIyLjQsMTYuOXogTTI4LjEsMThsLTEuMy0yLjVjLTAuMS0wLjEtMC4xLTAuMy0wLjIt
|
||||||
|
MC41aDBjMCwwLjEtMC4xLDAuMy0wLjIsMC41TDI1LjEsMThIMjNsMi41LTMuOWwtMi4yLTMuOSAgaDIu
|
||||||
|
MWwxLjEsMi4zYzAuMSwwLjIsMC4yLDAuNCwwLjIsMC43aDBjMC0wLjIsMC4xLTAuNCwwLjItMC43bDEu
|
||||||
|
Mi0yLjNoMS45bC0yLjMsMy44bDIuNCwzLjlIMjguMXoiIGNsYXNzPSJHcmVlbiIgLz4NCiAgPGcgY2xh
|
||||||
|
c3M9InN0MCI+DQogICAgPHBhdGggZD0iTTMxLDhIM0MyLjQsOCwyLDguNCwyLDl2MTBjMCwwLjYsMC40
|
||||||
|
LDEsMSwxaDI4YzAuNiwwLDEtMC40LDEtMVY5QzMyLDguNCwzMS42LDgsMzEsOHogTTkuMSwxOGwtMS4z
|
||||||
|
LTIuNSAgIGMtMC4xLTAuMS0wLjEtMC4zLTAuMi0wLjVoMGMwLDAuMS0wLjEsMC4zLTAuMiwwLjVMNi4x
|
||||||
|
LDE4SDRsMi41LTMuOWwtMi4yLTMuOWgyLjFsMS4xLDIuM2MwLjEsMC4yLDAuMiwwLjQsMC4yLDAuN2gw
|
||||||
|
ICAgYzAtMC4yLDAuMS0wLjQsMC4yLTAuN2wxLjItMi4zaDEuOWwtMi4zLDMuOGwyLjQsMy45SDkuMXog
|
||||||
|
TTE2LjcsMThoLTQuNnYtNy43aDEuN3Y2LjNoMi45VjE4eiBNMjIuNCwxNi45ICAgYy0wLjIsMC4zLTAu
|
||||||
|
NCwwLjUtMC43LDAuN3MtMC42LDAuMy0xLDAuNGMtMC40LDAuMS0wLjgsMC4xLTEuMiwwLjFjLTAuNCww
|
||||||
|
LTAuOCwwLTEuMi0wLjFjLTAuNC0wLjEtMC43LTAuMi0xLTAuM1YxNiAgIGMwLjMsMC4zLDAuNiwwLjUs
|
||||||
|
MSwwLjZzMC43LDAuMiwxLjEsMC4yYzAuMiwwLDAuNCwwLDAuNi0wLjFzMC4zLTAuMSwwLjQtMC4yYzAu
|
||||||
|
MS0wLjEsMC4yLTAuMiwwLjItMC4yYzAuMS0wLjEsMC4xLTAuMiwwLjEtMC4zICAgYzAtMC4yLDAtMC4z
|
||||||
|
LTAuMS0wLjRjLTAuMS0wLjEtMC4yLTAuMi0wLjQtMC4zUzIwLDE1LjEsMTkuOCwxNXMtMC40LTAuMi0w
|
||||||
|
LjctMC4zYy0wLjYtMC4zLTEuMS0wLjYtMS4zLTAuOSAgIGMtMC4zLTAuNC0wLjQtMC44LTAuNC0xLjNj
|
||||||
|
MC0wLjQsMC4xLTAuNywwLjItMWMwLjItMC4zLDAuNC0wLjUsMC43LTAuN2MwLjMtMC4yLDAuNi0wLjMs
|
||||||
|
MS0wLjRzMC44LTAuMSwxLjItMC4xICAgYzAuNCwwLDAuOCwwLDEuMSwwLjFjMC4zLDAsMC42LDAuMSww
|
||||||
|
LjksMC4ydjEuNmMtMC4xLTAuMS0wLjMtMC4yLTAuNC0wLjJzLTAuMy0wLjEtMC41LTAuMmMtMC4yLDAt
|
||||||
|
MC4zLTAuMS0wLjUtMC4xcy0wLjMsMC0wLjUsMCAgIGMtMC4yLDAtMC40LDAtMC41LDAuMWMtMC4yLDAt
|
||||||
|
MC4zLDAuMS0wLjQsMC4yYy0wLjEsMC4xLTAuMiwwLjEtMC4zLDAuMmMtMC4xLDAuMS0wLjEsMC4yLTAu
|
||||||
|
MSwwLjNjMCwwLjEsMCwwLjIsMC4xLDAuMyAgIGMwLjEsMC4xLDAuMiwwLjIsMC4zLDAuM2MwLjEsMC4x
|
||||||
|
LDAuMywwLjIsMC41LDAuM3MwLjQsMC4yLDAuNiwwLjNjMC4zLDAuMSwwLjYsMC4zLDAuOCwwLjRjMC4y
|
||||||
|
LDAuMSwwLjUsMC4zLDAuNiwwLjUgICBjMC4yLDAuMiwwLjMsMC40LDAuNCwwLjZzMC4xLDAuNSwwLjEs
|
||||||
|
MC44QzIyLjYsMTYuMywyMi41LDE2LjYsMjIuNCwxNi45eiBNMjguMSwxOGwtMS4zLTIuNWMtMC4xLTAu
|
||||||
|
MS0wLjEtMC4zLTAuMi0wLjVoMCAgIGMwLDAuMS0wLjEsMC4zLTAuMiwwLjVMMjUuMSwxOEgyM2wyLjUt
|
||||||
|
My45bC0yLjItMy45aDIuMWwxLjEsMi4zYzAuMSwwLjIsMC4yLDAuNCwwLjIsMC43aDBjMC0wLjIsMC4x
|
||||||
|
LTAuNCwwLjItMC43bDEuMi0yLjNoMS45ICAgbC0yLjMsMy44bDIuNCwzLjlIMjguMXoiIGNsYXNzPSJC
|
||||||
|
bHVlIiAvPg0KICA8L2c+DQo8L3N2Zz4L
|
||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RibbonPageGroup1.Text" xml:space="preserve">
|
<data name="RibbonPageGroup1.Text" xml:space="preserve">
|
||||||
<value>Data</value>
|
<value>Data</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RibbonPageGroup2.Text" xml:space="preserve">
|
<data name="RibbonPageGroupFunctions.Text" xml:space="preserve">
|
||||||
<value>Functions</value>
|
<value>Functions</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="RibbonPageGroup3.Text" xml:space="preserve">
|
<data name="RibbonPageGroup3.Text" xml:space="preserve">
|
||||||
@@ -397,7 +645,24 @@
|
|||||||
<data name="XtraTabPage2.Text" xml:space="preserve">
|
<data name="XtraTabPage2.Text" xml:space="preserve">
|
||||||
<value>Completed Envelopes</value>
|
<value>Completed Envelopes</value>
|
||||||
</data>
|
</data>
|
||||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
<data name="btnEnvelopes_All.Text" xml:space="preserve">
|
||||||
|
<value>All over</value>
|
||||||
|
</data>
|
||||||
|
<data name="btnEnvelopes_thisYear.Text" xml:space="preserve">
|
||||||
|
<value>this year</value>
|
||||||
|
</data>
|
||||||
|
<data name="btnEnvelopes_lastmonth.Text" xml:space="preserve">
|
||||||
|
<value>last month</value>
|
||||||
|
</data>
|
||||||
|
<data name="btnEnvelopes_thismonth.Text" xml:space="preserve">
|
||||||
|
<value>this month</value>
|
||||||
|
</data>
|
||||||
|
<data name="GroupControl1.Text" xml:space="preserve">
|
||||||
|
<value>Envelopes per user</value>
|
||||||
|
</data>
|
||||||
|
<data name="XtraTabPageAdmin.Text" xml:space="preserve">
|
||||||
|
<value>Reports (Admin) - BETA</value>
|
||||||
|
</data>
|
||||||
<data name="frmMain.IconOptions.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="frmMain.IconOptions.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL
|
iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ Imports EnvelopeGenerator.Common
|
|||||||
Imports EnvelopeGenerator.Common.My
|
Imports EnvelopeGenerator.Common.My
|
||||||
Imports System.Diagnostics
|
Imports System.Diagnostics
|
||||||
Imports System.ComponentModel
|
Imports System.ComponentModel
|
||||||
|
Imports DevExpress.XtraPrinting
|
||||||
|
|
||||||
Public Class frmMain
|
Public Class frmMain
|
||||||
Private ReadOnly LogConfig As LogConfig
|
Private ReadOnly LogConfig As LogConfig
|
||||||
@@ -195,7 +196,7 @@ Public Class frmMain
|
|||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Private Sub XtraTabControl1_SelectedPageChanged(sender As Object, e As DevExpress.XtraTab.TabPageChangedEventArgs) Handles XtraTabControlMain.SelectedPageChanged
|
Private Sub XtraTabControl1_SelectedPageChanged(sender As Object, e As DevExpress.XtraTab.TabPageChangedEventArgs) Handles XtraTabControlMain.SelectedPageChanged
|
||||||
RibbonPageFunctions.Enabled = True
|
RibbonPageGroupFunctions.Enabled = True
|
||||||
RibbonPageEnvelopeActions.Enabled = True
|
RibbonPageEnvelopeActions.Enabled = True
|
||||||
Select Case XtraTabControlMain.SelectedTabPageIndex
|
Select Case XtraTabControlMain.SelectedTabPageIndex
|
||||||
Case 1
|
Case 1
|
||||||
@@ -215,7 +216,7 @@ Public Class frmMain
|
|||||||
txtEnvelopeIdLabel.Caption = "No Envelope selected"
|
txtEnvelopeIdLabel.Caption = "No Envelope selected"
|
||||||
|
|
||||||
Case 2
|
Case 2
|
||||||
RibbonPageFunctions.Enabled = False
|
RibbonPageGroupFunctions.Enabled = False
|
||||||
RibbonPageEnvelopeActions.Enabled = False
|
RibbonPageEnvelopeActions.Enabled = False
|
||||||
End Select
|
End Select
|
||||||
End Sub
|
End Sub
|
||||||
@@ -395,7 +396,7 @@ Public Class frmMain
|
|||||||
End If
|
End If
|
||||||
Catch ex As Exception
|
Catch ex As Exception
|
||||||
MsgBox(Resources.Envelope.Document_could_not_be_opened, MsgBoxStyle.Critical, Text)
|
MsgBox(Resources.Envelope.Document_could_not_be_opened, MsgBoxStyle.Critical, Text)
|
||||||
Logger.Error(ex)
|
Logger.Error(ex)
|
||||||
End Try
|
End Try
|
||||||
Me.Cursor = Cursors.Default
|
Me.Cursor = Cursors.Default
|
||||||
End Sub
|
End Sub
|
||||||
@@ -640,4 +641,27 @@ Public Class frmMain
|
|||||||
|
|
||||||
End Try
|
End Try
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
|
Private Sub LabelControl1_Click(sender As Object, e As EventArgs) Handles LabelControl1.Click
|
||||||
|
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub BarButtonItem3_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem3.ItemClick
|
||||||
|
XtraSaveFileDialog1.FileName = "Overview.xlsx"
|
||||||
|
XtraSaveFileDialog1.DefaultExt = ".xlsx"
|
||||||
|
|
||||||
|
If XtraSaveFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
|
||||||
|
Dim oOptions As New XlsxExportOptions() With {
|
||||||
|
.ExportMode = XlsxExportMode.SingleFile
|
||||||
|
}
|
||||||
|
If XtraTabControlMain.SelectedTabPageIndex = 0 Then
|
||||||
|
GridEnvelopes.ExportToXlsx(XtraSaveFileDialog1.FileName, oOptions)
|
||||||
|
ElseIf XtraTabControlMain.SelectedTabPageIndex = 1 Then
|
||||||
|
GridCompleted.ExportToXlsx(XtraSaveFileDialog1.FileName, oOptions)
|
||||||
|
ElseIf XtraTabControlMain.SelectedTabPageIndex = 2 Then
|
||||||
|
GridControlData.ExportToXlsx(XtraSaveFileDialog1.FileName, oOptions)
|
||||||
|
End If
|
||||||
|
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
End Class
|
End Class
|
||||||
112
EnvelopeGenerator.Form/frmOrderFiles.Designer.vb
generated
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
|
||||||
|
Partial Class frmOrderFiles
|
||||||
|
Inherits System.Windows.Forms.Form
|
||||||
|
|
||||||
|
'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen.
|
||||||
|
<System.Diagnostics.DebuggerNonUserCode()> _
|
||||||
|
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
|
||||||
|
Try
|
||||||
|
If disposing AndAlso components IsNot Nothing Then
|
||||||
|
components.Dispose()
|
||||||
|
End If
|
||||||
|
Finally
|
||||||
|
MyBase.Dispose(disposing)
|
||||||
|
End Try
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
'Wird vom Windows Form-Designer benötigt.
|
||||||
|
Private components As System.ComponentModel.IContainer
|
||||||
|
|
||||||
|
'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich.
|
||||||
|
'Das Bearbeiten ist mit dem Windows Form-Designer möglich.
|
||||||
|
'Das Bearbeiten mit dem Code-Editor ist nicht möglich.
|
||||||
|
<System.Diagnostics.DebuggerStepThrough()> _
|
||||||
|
Private Sub InitializeComponent()
|
||||||
|
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmOrderFiles))
|
||||||
|
Me.SimpleButton1 = New DevExpress.XtraEditors.SimpleButton()
|
||||||
|
Me.SimpleButton2 = New DevExpress.XtraEditors.SimpleButton()
|
||||||
|
Me.OpenFileDialog1 = New System.Windows.Forms.OpenFileDialog()
|
||||||
|
Me.ListView1 = New System.Windows.Forms.ListView()
|
||||||
|
Me.Dateiname = CType(New System.Windows.Forms.ColumnHeader(), System.Windows.Forms.ColumnHeader)
|
||||||
|
Me.SuspendLayout()
|
||||||
|
'
|
||||||
|
'SimpleButton1
|
||||||
|
'
|
||||||
|
Me.SimpleButton1.Anchor = CType(((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left) _
|
||||||
|
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
|
||||||
|
Me.SimpleButton1.Appearance.Font = New System.Drawing.Font("Tahoma", 12.0!)
|
||||||
|
Me.SimpleButton1.Appearance.Options.UseFont = True
|
||||||
|
Me.SimpleButton1.ImageOptions.SvgImage = CType(resources.GetObject("SimpleButton1.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
|
||||||
|
Me.SimpleButton1.Location = New System.Drawing.Point(12, 179)
|
||||||
|
Me.SimpleButton1.Name = "SimpleButton1"
|
||||||
|
Me.SimpleButton1.Size = New System.Drawing.Size(580, 37)
|
||||||
|
Me.SimpleButton1.TabIndex = 0
|
||||||
|
Me.SimpleButton1.Text = "Dateien zusammenfügen"
|
||||||
|
'
|
||||||
|
'SimpleButton2
|
||||||
|
'
|
||||||
|
Me.SimpleButton2.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
|
||||||
|
Me.SimpleButton2.Appearance.Font = New System.Drawing.Font("Tahoma", 9.75!)
|
||||||
|
Me.SimpleButton2.Appearance.Options.UseFont = True
|
||||||
|
Me.SimpleButton2.ImageOptions.SvgImage = CType(resources.GetObject("SimpleButton2.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
|
||||||
|
Me.SimpleButton2.Location = New System.Drawing.Point(598, 179)
|
||||||
|
Me.SimpleButton2.Name = "SimpleButton2"
|
||||||
|
Me.SimpleButton2.Size = New System.Drawing.Size(110, 37)
|
||||||
|
Me.SimpleButton2.TabIndex = 1
|
||||||
|
Me.SimpleButton2.Text = "Abbruch"
|
||||||
|
'
|
||||||
|
'OpenFileDialog1
|
||||||
|
'
|
||||||
|
Me.OpenFileDialog1.FileName = "OpenFileDialog1"
|
||||||
|
Me.OpenFileDialog1.Filter = "PDF Files|*.pdf"
|
||||||
|
Me.OpenFileDialog1.Multiselect = True
|
||||||
|
'
|
||||||
|
'ListView1
|
||||||
|
'
|
||||||
|
Me.ListView1.AllowDrop = True
|
||||||
|
Me.ListView1.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
|
||||||
|
Or System.Windows.Forms.AnchorStyles.Left) _
|
||||||
|
Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
|
||||||
|
Me.ListView1.Columns.AddRange(New System.Windows.Forms.ColumnHeader() {Me.Dateiname})
|
||||||
|
Me.ListView1.Font = New System.Drawing.Font("Tahoma", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
|
||||||
|
Me.ListView1.FullRowSelect = True
|
||||||
|
Me.ListView1.GridLines = True
|
||||||
|
Me.ListView1.HideSelection = False
|
||||||
|
Me.ListView1.Location = New System.Drawing.Point(12, 12)
|
||||||
|
Me.ListView1.Name = "ListView1"
|
||||||
|
Me.ListView1.Size = New System.Drawing.Size(696, 161)
|
||||||
|
Me.ListView1.TabIndex = 3
|
||||||
|
Me.ListView1.UseCompatibleStateImageBehavior = False
|
||||||
|
Me.ListView1.View = System.Windows.Forms.View.Details
|
||||||
|
'
|
||||||
|
'Dateiname
|
||||||
|
'
|
||||||
|
Me.Dateiname.Text = "Dateiname"
|
||||||
|
Me.Dateiname.Width = 534
|
||||||
|
'
|
||||||
|
'frmOrderFiles
|
||||||
|
'
|
||||||
|
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
|
||||||
|
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
|
||||||
|
Me.ClientSize = New System.Drawing.Size(712, 227)
|
||||||
|
Me.Controls.Add(Me.ListView1)
|
||||||
|
Me.Controls.Add(Me.SimpleButton2)
|
||||||
|
Me.Controls.Add(Me.SimpleButton1)
|
||||||
|
Me.Font = New System.Drawing.Font("Tahoma", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
|
||||||
|
Me.MaximizeBox = False
|
||||||
|
Me.MinimizeBox = False
|
||||||
|
Me.Name = "frmOrderFiles"
|
||||||
|
Me.ShowIcon = False
|
||||||
|
Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
|
||||||
|
Me.Text = "Auswahl Dateien ordnen"
|
||||||
|
Me.TopMost = True
|
||||||
|
Me.ResumeLayout(False)
|
||||||
|
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Friend WithEvents SimpleButton1 As DevExpress.XtraEditors.SimpleButton
|
||||||
|
Friend WithEvents SimpleButton2 As DevExpress.XtraEditors.SimpleButton
|
||||||
|
Friend WithEvents OpenFileDialog1 As OpenFileDialog
|
||||||
|
Friend WithEvents ListView1 As ListView
|
||||||
|
Friend WithEvents Dateiname As ColumnHeader
|
||||||
|
End Class
|
||||||
159
EnvelopeGenerator.Form/frmOrderFiles.resx
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<assembly alias="DevExpress.Data.v21.2" name="DevExpress.Data.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
|
||||||
|
<data name="SimpleButton1.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v21.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40
|
||||||
|
LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
|
||||||
|
dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAMcCAAAC77u/
|
||||||
|
PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
|
||||||
|
IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
|
||||||
|
MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
|
||||||
|
Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
|
||||||
|
MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJ
|
||||||
|
LlJlZHtmaWxsOiNEMTFDMUM7fQoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5HcmVlbntmaWxsOiMwMzlD
|
||||||
|
MjM7fQoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
|
||||||
|
Y2l0eTowLjc1O30KPC9zdHlsZT4NCiAgPGcgaWQ9IkNvcHkiPg0KICAgIDxwYXRoIGQ9Ik0yMSwySDEx
|
||||||
|
Yy0wLjUsMC0xLDAuNS0xLDF2NUg1QzQuNSw4LDQsOC41LDQsOXYyMGMwLDAuNSwwLjUsMSwxLDFoMTZj
|
||||||
|
MC41LDAsMS0wLjUsMS0xdi01aDVjMC41LDAsMS0wLjUsMS0xICAgVjlMMjEsMnogTTIwLDI4SDZWMTBo
|
||||||
|
OHY1YzAsMC41LDAuNSwxLDEsMWg1VjI4eiBNMjYsMjJoLTR2LTdsLTctN2gtM1Y0aDh2NWMwLDAuNSww
|
||||||
|
LjUsMSwxLDFoNVYyMnoiIGNsYXNzPSJCbGFjayIgLz4NCiAgPC9nPg0KPC9zdmc+Cw==
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<data name="SimpleButton2.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v21.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40
|
||||||
|
LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
|
||||||
|
dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAPoBAAAC77u/
|
||||||
|
PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
|
||||||
|
IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
|
||||||
|
MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
|
||||||
|
Y2U9InByZXNlcnZlIiBpZD0iQ2xlYXJIZWFkZXJBbmRGb290ZXIiIHN0eWxlPSJlbmFibGUtYmFja2dy
|
||||||
|
b3VuZDpuZXcgMCAwIDMyIDMyIj4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5SZWR7ZmlsbDoj
|
||||||
|
RDExQzFDO30KPC9zdHlsZT4NCiAgPHBhdGggZD0iTTI3LDRINUM0LjUsNCw0LDQuNSw0LDV2MjJjMCww
|
||||||
|
LjUsMC41LDEsMSwxaDIyYzAuNSwwLDEtMC41LDEtMVY1QzI4LDQuNSwyNy41LDQsMjcsNHogTTIyLDIw
|
||||||
|
bC0yLDJsLTQtNGwtNCw0ICBsLTItMmw0LTRsLTQtNGwyLTJsNCw0bDQtNGwyLDJsLTQsNEwyMiwyMHoi
|
||||||
|
IGNsYXNzPSJSZWQiIC8+DQo8L3N2Zz4L
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
|
<metadata name="OpenFileDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>17, 17</value>
|
||||||
|
</metadata>
|
||||||
|
</root>
|
||||||
62
EnvelopeGenerator.Form/frmOrderFiles.vb
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
Imports System.IO
|
||||||
|
|
||||||
|
Public Class frmOrderFiles
|
||||||
|
Public fileResults As List(Of String)
|
||||||
|
Public oTitle As String
|
||||||
|
|
||||||
|
Private Sub frmOrderFiles_Shown(sender As Object, e As EventArgs) Handles Me.Shown
|
||||||
|
OpenFileDialog1.Title = oTitle
|
||||||
|
If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
|
||||||
|
ListView1.Items.Clear()
|
||||||
|
For Each file As String In OpenFileDialog1.FileNames
|
||||||
|
Dim item As New ListViewItem(Path.GetFileName(file))
|
||||||
|
item.Tag = file ' Speichere den vollständigen Pfad im Tag
|
||||||
|
ListView1.Items.Add(item)
|
||||||
|
Next
|
||||||
|
Else
|
||||||
|
Me.Close()
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub SimpleButton1_Click(sender As Object, e As EventArgs) Handles SimpleButton1.Click
|
||||||
|
fileResults = New List(Of String)
|
||||||
|
For Each item As ListViewItem In ListView1.Items
|
||||||
|
fileResults.Add(item.Tag.ToString())
|
||||||
|
Next
|
||||||
|
Me.Close()
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub SimpleButton2_Click(sender As Object, e As EventArgs) Handles SimpleButton2.Click
|
||||||
|
Me.Close()
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub ListView1_MouseDown(sender As Object, e As MouseEventArgs) Handles ListView1.MouseDown
|
||||||
|
' Starte den Drag & Drop-Vorgang, wenn ein Item ausgewählt ist
|
||||||
|
If ListView1.SelectedItems.Count > 0 Then
|
||||||
|
ListView1.DoDragDrop(ListView1.SelectedItems(0), DragDropEffects.Move)
|
||||||
|
End If
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub ListView1_DragOver(sender As Object, e As DragEventArgs) Handles ListView1.DragOver
|
||||||
|
' Erlaube das Verschieben von Items innerhalb der ListView
|
||||||
|
e.Effect = DragDropEffects.Move
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub ListView1_DragDrop(sender As Object, e As DragEventArgs) Handles ListView1.DragDrop
|
||||||
|
' Füge das Item an der neuen Position ein und entferne es von der alten Position
|
||||||
|
Dim point As Point = ListView1.PointToClient(New Point(e.X, e.Y))
|
||||||
|
Dim hoverItem As ListViewItem = ListView1.GetItemAt(point.X, point.Y)
|
||||||
|
Dim draggedItem As ListViewItem = CType(e.Data.GetData(GetType(ListViewItem)), ListViewItem)
|
||||||
|
|
||||||
|
If hoverItem Is Nothing Then
|
||||||
|
' Wenn kein Item unter dem Mauszeiger ist, füge das Item am Ende hinzu
|
||||||
|
ListView1.Items.Add(DirectCast(draggedItem.Clone(), ListViewItem))
|
||||||
|
Else
|
||||||
|
' Füge das Item vor dem hoverItem ein
|
||||||
|
ListView1.Items.Insert(hoverItem.Index, DirectCast(draggedItem.Clone(), ListViewItem))
|
||||||
|
End If
|
||||||
|
|
||||||
|
' Entferne das ursprüngliche Item
|
||||||
|
ListView1.Items.Remove(draggedItem)
|
||||||
|
End Sub
|
||||||
|
End Class
|
||||||
24
EnvelopeGenerator.Form/frmRueckruf.Designer.vb
generated
@@ -25,11 +25,11 @@ Partial Class frmRueckruf
|
|||||||
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmRueckruf))
|
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmRueckruf))
|
||||||
Me.Label2 = New System.Windows.Forms.Label()
|
Me.Label2 = New System.Windows.Forms.Label()
|
||||||
Me.txtReason = New System.Windows.Forms.TextBox()
|
Me.txtReason = New System.Windows.Forms.TextBox()
|
||||||
Me.btnWeiter = New System.Windows.Forms.Button()
|
|
||||||
Me.Label1 = New System.Windows.Forms.Label()
|
Me.Label1 = New System.Windows.Forms.Label()
|
||||||
Me.btnCancel = New System.Windows.Forms.Button()
|
Me.btnCancel = New System.Windows.Forms.Button()
|
||||||
Me.StatusStrip1 = New System.Windows.Forms.StatusStrip()
|
Me.StatusStrip1 = New System.Windows.Forms.StatusStrip()
|
||||||
Me.tsstatus = New System.Windows.Forms.ToolStripStatusLabel()
|
Me.tsstatus = New System.Windows.Forms.ToolStripStatusLabel()
|
||||||
|
Me.SimpleButton1 = New DevExpress.XtraEditors.SimpleButton()
|
||||||
Me.StatusStrip1.SuspendLayout()
|
Me.StatusStrip1.SuspendLayout()
|
||||||
Me.SuspendLayout()
|
Me.SuspendLayout()
|
||||||
'
|
'
|
||||||
@@ -53,15 +53,6 @@ Partial Class frmRueckruf
|
|||||||
Me.txtReason.Size = New System.Drawing.Size(429, 87)
|
Me.txtReason.Size = New System.Drawing.Size(429, 87)
|
||||||
Me.txtReason.TabIndex = 1
|
Me.txtReason.TabIndex = 1
|
||||||
'
|
'
|
||||||
'btnWeiter
|
|
||||||
'
|
|
||||||
Me.btnWeiter.Location = New System.Drawing.Point(25, 134)
|
|
||||||
Me.btnWeiter.Name = "btnWeiter"
|
|
||||||
Me.btnWeiter.Size = New System.Drawing.Size(203, 44)
|
|
||||||
Me.btnWeiter.TabIndex = 2
|
|
||||||
Me.btnWeiter.Text = "Umschlag zurückrufen"
|
|
||||||
Me.btnWeiter.UseVisualStyleBackColor = True
|
|
||||||
'
|
|
||||||
'Label1
|
'Label1
|
||||||
'
|
'
|
||||||
Me.Label1.AutoSize = True
|
Me.Label1.AutoSize = True
|
||||||
@@ -96,15 +87,24 @@ Partial Class frmRueckruf
|
|||||||
Me.tsstatus.Name = "tsstatus"
|
Me.tsstatus.Name = "tsstatus"
|
||||||
Me.tsstatus.Size = New System.Drawing.Size(0, 17)
|
Me.tsstatus.Size = New System.Drawing.Size(0, 17)
|
||||||
'
|
'
|
||||||
|
'SimpleButton1
|
||||||
|
'
|
||||||
|
Me.SimpleButton1.ImageOptions.SvgImage = CType(resources.GetObject("SimpleButton1.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
|
||||||
|
Me.SimpleButton1.Location = New System.Drawing.Point(25, 134)
|
||||||
|
Me.SimpleButton1.Name = "SimpleButton1"
|
||||||
|
Me.SimpleButton1.Size = New System.Drawing.Size(220, 44)
|
||||||
|
Me.SimpleButton1.TabIndex = 6
|
||||||
|
Me.SimpleButton1.Text = "Umschlag zurückrufen"
|
||||||
|
'
|
||||||
'frmRueckruf
|
'frmRueckruf
|
||||||
'
|
'
|
||||||
Me.AutoScaleDimensions = New System.Drawing.SizeF(7.0!, 16.0!)
|
Me.AutoScaleDimensions = New System.Drawing.SizeF(7.0!, 16.0!)
|
||||||
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
|
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
|
||||||
Me.ClientSize = New System.Drawing.Size(488, 207)
|
Me.ClientSize = New System.Drawing.Size(488, 207)
|
||||||
|
Me.Controls.Add(Me.SimpleButton1)
|
||||||
Me.Controls.Add(Me.StatusStrip1)
|
Me.Controls.Add(Me.StatusStrip1)
|
||||||
Me.Controls.Add(Me.btnCancel)
|
Me.Controls.Add(Me.btnCancel)
|
||||||
Me.Controls.Add(Me.Label1)
|
Me.Controls.Add(Me.Label1)
|
||||||
Me.Controls.Add(Me.btnWeiter)
|
|
||||||
Me.Controls.Add(Me.txtReason)
|
Me.Controls.Add(Me.txtReason)
|
||||||
Me.Controls.Add(Me.Label2)
|
Me.Controls.Add(Me.Label2)
|
||||||
Me.Font = New System.Drawing.Font("Tahoma", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
|
Me.Font = New System.Drawing.Font("Tahoma", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
|
||||||
@@ -124,9 +124,9 @@ Partial Class frmRueckruf
|
|||||||
|
|
||||||
Friend WithEvents Label2 As Label
|
Friend WithEvents Label2 As Label
|
||||||
Friend WithEvents txtReason As TextBox
|
Friend WithEvents txtReason As TextBox
|
||||||
Friend WithEvents btnWeiter As Button
|
|
||||||
Friend WithEvents Label1 As Label
|
Friend WithEvents Label1 As Label
|
||||||
Friend WithEvents btnCancel As Button
|
Friend WithEvents btnCancel As Button
|
||||||
Friend WithEvents StatusStrip1 As StatusStrip
|
Friend WithEvents StatusStrip1 As StatusStrip
|
||||||
Friend WithEvents tsstatus As ToolStripStatusLabel
|
Friend WithEvents tsstatus As ToolStripStatusLabel
|
||||||
|
Friend WithEvents SimpleButton1 As DevExpress.XtraEditors.SimpleButton
|
||||||
End Class
|
End Class
|
||||||
|
|||||||
@@ -120,17 +120,37 @@
|
|||||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||||
<data name="btnCancel.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="btnCancel.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
||||||
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAFJSURBVDhPpVOhjoNQEOQT+gn9hPuEC56kFleBB41CYRs8
|
wQAADsEBuJFr7QAAAUlJREFUOE+lU6GOg1AQ5BP6Cf2E+4QLnqQWV4EHjUJhGzxJJbICDxpFQvCHg4DA
|
||||||
SSWyAg8aRULwh4OAwGHf7Sz7yuMCd+ImmfRlZ3cYeFsLWJblQnwSFXEmBiz8ANUj6dG8aSGoqko5jsNs
|
Yd/tLPvK4wJ34iaZ9GVndxh4WwtYluVCfBIVcSYGLPwA1SPp0bxpIaiqSjmOw2zbdhMJdL4S6yzLlG3b
|
||||||
23YTCXS+Eussy5Rt26ooCuiRyNxQpmnKIuh5nhrHEUmQLMA5jmPW0Ee1l4yuQBMSaAMwSRI0zl3XsSFq
|
qigK6JHI3FCmacoi6HmeGscRSZAswDmOY9bQR7WXjK5AExJoAzBJEjTOXdexIWowoVpNvMjoChQg5Hm+
|
||||||
MKFaTbzI6AoUIOR5vjPB0/BKOBuprjK2x5kJCJNpmvD0T2k/BtyJHNU0gCnVn9J2DBk+TOC67p/xP4gz
|
M8HT8Eo4G6muMrbHmQkIk2ma8PRPaT8G3Ikc1TSAKdWf0nYMGT5M4Lrun/E/iDM+nDlofgPf9/kDysgG
|
||||||
Ppw5aH4D3/f5A8rIBj18Ers2b0Fu5iGjKxAtDMPdMBaGGvmu6feOHiQwjN9LZunt0jy6azoj5Rc0vFLT
|
PXwSuzZvQW7mIaMrEC0Mw90wFoYa+a7p944eJDCM30tm6e3SPLprOiPlFzS8UtM0vGQsmgani0JAjVii
|
||||||
NLxkLJoGp4tCQI1Yoh+v1Pd9ycIwDLzjEntzPgHpD/wXsLl0jrRzIPx1WIP67sQStJRS/6CyvgGjI/3S
|
H6/U933JwjAMvOMSe3M+AekP/BewuXSOtHMg/HVYg/ruxBK0lFL/oLK+AaMj/dL+UYA6AAAAAElFTkSu
|
||||||
/lGAOgAAAABJRU5ErkJggg==
|
QmCC
|
||||||
</value>
|
</value>
|
||||||
</data>
|
</data>
|
||||||
<metadata name="StatusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
<metadata name="StatusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
<value>17, 17</value>
|
<value>17, 17</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
|
<assembly alias="DevExpress.Data.v21.2" name="DevExpress.Data.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
|
||||||
|
<data name="SimpleButton1.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v21.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>
|
||||||
|
AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40
|
||||||
|
LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
|
||||||
|
dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAKoCAAAC77u/
|
||||||
|
PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
|
||||||
|
IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
|
||||||
|
MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
|
||||||
|
Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
|
||||||
|
MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5Z
|
||||||
|
ZWxsb3d7ZmlsbDojRkZCMTE1O30KCS5CbGFja3tmaWxsOiM3MjcyNzI7fQoJLkdyZWVue2ZpbGw6IzAz
|
||||||
|
OUMyMzt9CgkuUmVke2ZpbGw6I0QxMUMxQzt9Cgkuc3Qwe29wYWNpdHk6MC43NTt9Cgkuc3Qxe29wYWNp
|
||||||
|
dHk6MC41O30KPC9zdHlsZT4NCiAgPGcgaWQ9IlRyYXNoIj4NCiAgICA8cGF0aCBkPSJNOCwyN2MwLDAu
|
||||||
|
NSwwLjUsMSwxLDFoMTRjMC41LDAsMS0wLjUsMS0xVjEySDhWMjd6IiBjbGFzcz0iQmxhY2siIC8+DQog
|
||||||
|
ICAgPHBhdGggZD0iTTI1LDZoLTdWNWMwLTAuNS0wLjUtMS0xLTFoLTJjLTAuNSwwLTEsMC41LTEsMXYx
|
||||||
|
SDdDNi41LDYsNiw2LjUsNiw3djNoMjBWN0MyNiw2LjUsMjUuNSw2LDI1LDZ6IiBjbGFzcz0iQmxhY2si
|
||||||
|
IC8+DQogIDwvZz4NCjwvc3ZnPgs=
|
||||||
|
</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
@@ -12,7 +12,19 @@ Public Class frmRueckruf
|
|||||||
' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
|
' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
|
||||||
|
|
||||||
End Sub
|
End Sub
|
||||||
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btnWeiter.Click
|
|
||||||
|
Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
|
||||||
|
Continue_Reject = False
|
||||||
|
Me.Close()
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub frmRueckruf_Load(sender As Object, e As EventArgs) Handles Me.Load
|
||||||
|
txtReason.Text = ""
|
||||||
|
tsstatus.Text = ""
|
||||||
|
Continue_Reject = False
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub SimpleButton1_Click(sender As Object, e As EventArgs) Handles SimpleButton1.Click
|
||||||
If txtReason.Text <> "" Then
|
If txtReason.Text <> "" Then
|
||||||
If MsgBox(Resources.Envelope.Do_you_really_want_to_delete_this_envelope, MsgBoxStyle.Question Or MsgBoxStyle.YesNo, Text) = MsgBoxResult.No Then
|
If MsgBox(Resources.Envelope.Do_you_really_want_to_delete_this_envelope, MsgBoxStyle.Question Or MsgBoxStyle.YesNo, Text) = MsgBoxResult.No Then
|
||||||
Me.Close()
|
Me.Close()
|
||||||
@@ -38,13 +50,4 @@ Public Class frmRueckruf
|
|||||||
tsstatus.Text = "Please add a reason for aborting - " & Now
|
tsstatus.Text = "Please add a reason for aborting - " & Now
|
||||||
End If
|
End If
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
|
|
||||||
Me.Close()
|
|
||||||
End Sub
|
|
||||||
|
|
||||||
Private Sub frmRueckruf_Load(sender As Object, e As EventArgs) Handles Me.Load
|
|
||||||
txtReason.Text = ""
|
|
||||||
tsstatus.Text = ""
|
|
||||||
End Sub
|
|
||||||
End Class
|
End Class
|
||||||
@@ -97,6 +97,7 @@ Public Class frmSplashScreen
|
|||||||
Dim ConfigModel = New ConfigModel(oState)
|
Dim ConfigModel = New ConfigModel(oState)
|
||||||
oState.DbConfig = ConfigModel.LoadConfiguration()
|
oState.DbConfig = ConfigModel.LoadConfiguration()
|
||||||
DEF_TF_ENABLED = oState.DbConfig.Default_TFA_Enabled
|
DEF_TF_ENABLED = oState.DbConfig.Default_TFA_Enabled
|
||||||
|
DEF_TF_ENABLED_WITH_PHONE = oState.DbConfig.Default_TFA_WithPhone
|
||||||
' DOCUMENT_PATH_MOVE_AFTSEND = oState.DbConfig.DOCUMENT_PATH_MOVE_AFTSEND
|
' DOCUMENT_PATH_MOVE_AFTSEND = oState.DbConfig.DOCUMENT_PATH_MOVE_AFTSEND
|
||||||
Worker.ReportProgress(60, "Initializing User")
|
Worker.ReportProgress(60, "Initializing User")
|
||||||
Dim oKey = oState.Database.GetScalarValue("SELECT LICENSE FROM TBDD_3RD_PARTY_MODULES WHERE NAME = 'GDPICTURE' and ACTIVE = 1")
|
Dim oKey = oState.Database.GetScalarValue("SELECT LICENSE FROM TBDD_3RD_PARTY_MODULES WHERE NAME = 'GDPICTURE' and ACTIVE = 1")
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
using EnvelopeGenerator.Web.Models;
|
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver;
|
||||||
|
using EnvelopeGenerator.Web.Models;
|
||||||
|
using Microsoft.AspNetCore.Authentication.Cookies;
|
||||||
|
using Microsoft.AspNetCore.Authentication;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
|
|
||||||
@@ -6,6 +9,7 @@ namespace EnvelopeGenerator.Web.Controllers
|
|||||||
{
|
{
|
||||||
public static class ControllerBaseExtensions
|
public static class ControllerBaseExtensions
|
||||||
{
|
{
|
||||||
|
#region Auth
|
||||||
public static string? GetClaimValue(this ControllerBase controller, string claimType) => controller.User.FindFirstValue(claimType);
|
public static string? GetClaimValue(this ControllerBase controller, string claimType) => controller.User.FindFirstValue(claimType);
|
||||||
|
|
||||||
public static string? GetAuthEnvelopeUuid(this ControllerBase controller) => controller.User.FindFirstValue(ClaimTypes.NameIdentifier);
|
public static string? GetAuthEnvelopeUuid(this ControllerBase controller) => controller.User.FindFirstValue(ClaimTypes.NameIdentifier);
|
||||||
@@ -23,7 +27,35 @@ namespace EnvelopeGenerator.Web.Controllers
|
|||||||
var env_id_str = controller.User.FindFirstValue(EnvelopeClaimTypes.Id);
|
var env_id_str = controller.User.FindFirstValue(EnvelopeClaimTypes.Id);
|
||||||
return int.TryParse(env_id_str, out int env_id) ? env_id : null;
|
return int.TryParse(env_id_str, out int env_id) ? env_id : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static async Task SignInEnvelopeAsync(this HttpContext context, EnvelopeReceiverDto er, string receiverRole)
|
||||||
|
{
|
||||||
|
var claims = new List<Claim> {
|
||||||
|
new(ClaimTypes.NameIdentifier, er.Envelope!.Uuid),
|
||||||
|
new(ClaimTypes.Hash, er.Receiver!.Signature),
|
||||||
|
new(ClaimTypes.Name, er.Name ?? string.Empty),
|
||||||
|
new(ClaimTypes.Email, er.Receiver.EmailAddress),
|
||||||
|
new(EnvelopeClaimTypes.Title, er.Envelope.Title),
|
||||||
|
new(EnvelopeClaimTypes.Id, er.Envelope.Id.ToString()),
|
||||||
|
new(ClaimTypes.Role, receiverRole)
|
||||||
|
};
|
||||||
|
|
||||||
|
var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
|
||||||
|
|
||||||
|
var authProperties = new AuthenticationProperties
|
||||||
|
{
|
||||||
|
AllowRefresh = false,
|
||||||
|
IsPersistent = false
|
||||||
|
};
|
||||||
|
|
||||||
|
await context.SignInAsync(
|
||||||
|
CookieAuthenticationDefaults.AuthenticationScheme,
|
||||||
|
new ClaimsPrincipal(claimsIdentity),
|
||||||
|
authProperties);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region View error
|
||||||
//TODO: integrate localizer for ready-to-use views
|
//TODO: integrate localizer for ready-to-use views
|
||||||
public static ViewResult ViewError(this Controller controller, ErrorViewModel errorViewModel) => controller.View("_Error", errorViewModel);
|
public static ViewResult ViewError(this Controller controller, ErrorViewModel errorViewModel) => controller.View("_Error", errorViewModel);
|
||||||
|
|
||||||
@@ -61,5 +93,6 @@ namespace EnvelopeGenerator.Web.Controllers
|
|||||||
Subtitle = "Ein unerwarteter Fehler ist aufgetreten",
|
Subtitle = "Ein unerwarteter Fehler ist aufgetreten",
|
||||||
Body = "Bitte kontaktieren Sie das IT-Team."
|
Body = "Bitte kontaktieren Sie das IT-Team."
|
||||||
});
|
});
|
||||||
}
|
#endregion
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -3,12 +3,12 @@ using EnvelopeGenerator.Common;
|
|||||||
using EnvelopeGenerator.Web.Services;
|
using EnvelopeGenerator.Web.Services;
|
||||||
using EnvelopeGenerator.Application.Contracts;
|
using EnvelopeGenerator.Application.Contracts;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using EnvelopeGenerator.Application;
|
|
||||||
using EnvelopeGenerator.Extensions;
|
using EnvelopeGenerator.Extensions;
|
||||||
|
using static EnvelopeGenerator.Common.Constants;
|
||||||
|
|
||||||
namespace EnvelopeGenerator.Web.Controllers
|
namespace EnvelopeGenerator.Web.Controllers
|
||||||
{
|
{
|
||||||
[Authorize]
|
[Authorize(Roles = ReceiverRole.FullyAuth)]
|
||||||
[Route("api/[controller]")]
|
[Route("api/[controller]")]
|
||||||
public class DocumentController : BaseController
|
public class DocumentController : BaseController
|
||||||
{
|
{
|
||||||
@@ -48,7 +48,7 @@ namespace EnvelopeGenerator.Web.Controllers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[Authorize]
|
[Authorize(Roles = ReceiverRole.FullyAuth)]
|
||||||
[HttpPost("{envelopeKey}")]
|
[HttpPost("{envelopeKey}")]
|
||||||
public async Task<IActionResult> Open(string envelopeKey)
|
public async Task<IActionResult> Open(string envelopeKey)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ using EnvelopeGenerator.Extensions;
|
|||||||
|
|
||||||
namespace EnvelopeGenerator.Web.Controllers
|
namespace EnvelopeGenerator.Web.Controllers
|
||||||
{
|
{
|
||||||
[Authorize]
|
[Authorize(Roles = ReceiverRole.FullyAuth)]
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[Route("api/[controller]")]
|
[Route("api/[controller]")]
|
||||||
public class EnvelopeController : BaseController
|
public class EnvelopeController : BaseController
|
||||||
@@ -64,7 +64,7 @@ namespace EnvelopeGenerator.Web.Controllers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[Authorize]
|
[Authorize(Roles = ReceiverRole.FullyAuth)]
|
||||||
[HttpPost("{envelopeKey}")]
|
[HttpPost("{envelopeKey}")]
|
||||||
public async Task<IActionResult> Update(string envelopeKey, int index)
|
public async Task<IActionResult> Update(string envelopeKey, int index)
|
||||||
{
|
{
|
||||||
@@ -110,7 +110,7 @@ namespace EnvelopeGenerator.Web.Controllers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[Authorize]
|
[Authorize(Roles = ReceiverRole.FullyAuth)]
|
||||||
[HttpPost("reject")]
|
[HttpPost("reject")]
|
||||||
public async Task<IActionResult> Reject([FromBody] string? reason = null)
|
public async Task<IActionResult> Reject([FromBody] string? reason = null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ using EnvelopeGenerator.Application.DTOs.EnvelopeReceiverReadOnly;
|
|||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
using static EnvelopeGenerator.Common.Constants;
|
||||||
|
|
||||||
namespace EnvelopeGenerator.Web.Controllers
|
namespace EnvelopeGenerator.Web.Controllers
|
||||||
{
|
{
|
||||||
@@ -28,7 +29,7 @@ namespace EnvelopeGenerator.Web.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
[Authorize]
|
[Authorize(Roles = ReceiverRole.FullyAuth)]
|
||||||
public async Task<IActionResult> CreateAsync([FromBody] EnvelopeReceiverReadOnlyCreateDto createDto)
|
public async Task<IActionResult> CreateAsync([FromBody] EnvelopeReceiverReadOnlyCreateDto createDto)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|||||||
106
EnvelopeGenerator.Web/Controllers/TFARegController.cs
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
using EnvelopeGenerator.Application.Contracts;
|
||||||
|
using EnvelopeGenerator.Web.Models;
|
||||||
|
using Ganss.Xss;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using EnvelopeGenerator.Extensions;
|
||||||
|
using Microsoft.Extensions.Localization;
|
||||||
|
using EnvelopeGenerator.Application.Resources;
|
||||||
|
using DigitalData.Core.DTO;
|
||||||
|
using EnvelopeGenerator.Application.Extensions;
|
||||||
|
using Microsoft.Extensions.Options;
|
||||||
|
using Microsoft.AspNetCore.Authorization;
|
||||||
|
using static EnvelopeGenerator.Common.Constants;
|
||||||
|
using Microsoft.AspNetCore.Authentication.Cookies;
|
||||||
|
using Microsoft.AspNetCore.Authentication;
|
||||||
|
|
||||||
|
namespace EnvelopeGenerator.Web.Controllers;
|
||||||
|
|
||||||
|
//TODO: Add authorization as well as limiting the link duration (intermediate token with different role) or sign it
|
||||||
|
public class TFARegController : ViewControllerBase
|
||||||
|
{
|
||||||
|
private readonly IEnvelopeReceiverService _envRcvService;
|
||||||
|
private readonly IAuthenticator _authenticator;
|
||||||
|
private readonly IReceiverService _rcvService;
|
||||||
|
private readonly TFARegParams _params;
|
||||||
|
|
||||||
|
public TFARegController(ILogger<TFARegController> logger, HtmlSanitizer sanitizer, Cultures cultures, IStringLocalizer<Resource> localizer, IEnvelopeReceiverService erService, IAuthenticator authenticator, IReceiverService receiverService, IOptions<TFARegParams> tfaRegParamsOptions) : base(logger, sanitizer, cultures, localizer)
|
||||||
|
{
|
||||||
|
_envRcvService = erService;
|
||||||
|
_authenticator = authenticator;
|
||||||
|
_rcvService = receiverService;
|
||||||
|
_params = tfaRegParamsOptions.Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO: move under auth route
|
||||||
|
[Authorize]
|
||||||
|
[HttpGet("tfa/{envelopeReceiverId}")]
|
||||||
|
public async Task<IActionResult> Reg(string envelopeReceiverId)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
envelopeReceiverId = _sanitizer.Sanitize(envelopeReceiverId);
|
||||||
|
(string? uuid, string? signature) = envelopeReceiverId.DecodeEnvelopeReceiverId();
|
||||||
|
|
||||||
|
if (uuid is null || signature is null)
|
||||||
|
{
|
||||||
|
_logger.LogEnvelopeError(uuid: uuid, signature: signature, message: _localizer[WebKey.WrongEnvelopeReceiverId]);
|
||||||
|
return Unauthorized();
|
||||||
|
}
|
||||||
|
|
||||||
|
var er_secret_res = await _envRcvService.ReadWithSecretByUuidSignatureAsync(uuid: uuid, signature: signature);
|
||||||
|
|
||||||
|
if (er_secret_res.IsFailed)
|
||||||
|
{
|
||||||
|
_logger.LogNotice(er_secret_res.Notices);
|
||||||
|
return this.ViewEnvelopeNotFound();
|
||||||
|
}
|
||||||
|
var er_secret = er_secret_res.Data;
|
||||||
|
|
||||||
|
if (!er_secret.Envelope!.TFAEnabled)
|
||||||
|
return Unauthorized();
|
||||||
|
|
||||||
|
var rcv = er_secret.Receiver;
|
||||||
|
|
||||||
|
// Generate QR code as base 64
|
||||||
|
rcv!.TotpSecretkey = _authenticator.GenerateTotpSecretKey();
|
||||||
|
await _rcvService.UpdateAsync(rcv);
|
||||||
|
var totp_qr_64 = _authenticator.GenerateTotpQrCode(userEmail: rcv.EmailAddress, secretKey: rcv.TotpSecretkey).ToBase64String();
|
||||||
|
|
||||||
|
// Calculate RFA registiration deadline
|
||||||
|
if (rcv.TfaRegDeadline is null)
|
||||||
|
{
|
||||||
|
rcv.TfaRegDeadline = _params.Deadline;
|
||||||
|
await _rcvService.UpdateAsync(rcv);
|
||||||
|
}
|
||||||
|
else if (rcv.TfaRegDeadline <= DateTime.Now)
|
||||||
|
return View("_Expired");
|
||||||
|
|
||||||
|
ViewData["RegDeadline"] = rcv.TfaRegDeadline;
|
||||||
|
|
||||||
|
ViewData["TotpQR64"] = totp_qr_64;
|
||||||
|
|
||||||
|
return View();
|
||||||
|
}
|
||||||
|
catch(Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogEnvelopeError(envelopeReceiverId: envelopeReceiverId, exception: ex, message: _localizer[WebKey.UnexpectedError]);
|
||||||
|
return this.ViewInnerServiceError();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Authorize(Roles = ReceiverRole.FullyAuth)]
|
||||||
|
[HttpPost("auth/logout")]
|
||||||
|
public async Task<IActionResult> LogOut()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
|
||||||
|
return Ok();
|
||||||
|
}
|
||||||
|
catch(Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "{message}", ex.Message);
|
||||||
|
return this.ViewInnerServiceError();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
using EnvelopeGenerator.Application.Contracts;
|
|
||||||
using EnvelopeGenerator.Application.Services;
|
|
||||||
using Microsoft.AspNetCore.Authorization;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
using System.Security.Claims;
|
|
||||||
|
|
||||||
namespace EnvelopeGenerator.Web.Controllers.Test
|
|
||||||
{
|
|
||||||
[ApiController]
|
|
||||||
[Route("api/test/[controller]")]
|
|
||||||
public class TestAuthController : ControllerBase
|
|
||||||
{
|
|
||||||
private readonly IJWTService<string> _authService;
|
|
||||||
|
|
||||||
public TestAuthController(IJWTService<string> authService)
|
|
||||||
{
|
|
||||||
_authService = authService;
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpPost]
|
|
||||||
public IActionResult ProvideToken([FromQuery] string value)
|
|
||||||
{
|
|
||||||
var token = _authService.GenerateToken(value);
|
|
||||||
return Ok(token);
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpGet]
|
|
||||||
public IActionResult GetSecurityToken([FromQuery] string token)
|
|
||||||
{
|
|
||||||
var sToken = _authService.ReadSecurityToken(token);
|
|
||||||
return Ok(sToken);
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpGet("Username")]
|
|
||||||
[Authorize]
|
|
||||||
public IActionResult Getname()
|
|
||||||
{
|
|
||||||
var username = User.Claims?.FirstOrDefault(c => c.Type == ClaimTypes.Name)?.Value;
|
|
||||||
return Ok(username);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -7,9 +7,9 @@ namespace EnvelopeGenerator.Web.Controllers.Test
|
|||||||
[ApiController]
|
[ApiController]
|
||||||
public class TestMessagingController : ControllerBase
|
public class TestMessagingController : ControllerBase
|
||||||
{
|
{
|
||||||
private readonly IMessagingService _service;
|
private readonly ISmsSender _service;
|
||||||
|
|
||||||
public TestMessagingController(IMessagingService service)
|
public TestMessagingController(ISmsSender service)
|
||||||
{
|
{
|
||||||
_service = service;
|
_service = service;
|
||||||
}
|
}
|
||||||
|
|||||||
23
EnvelopeGenerator.Web/Controllers/ViewControllerBase.cs
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
using EnvelopeGenerator.Web.Models;
|
||||||
|
using Ganss.Xss;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Microsoft.Extensions.Localization;
|
||||||
|
using EnvelopeGenerator.Application.Resources;
|
||||||
|
|
||||||
|
namespace EnvelopeGenerator.Web.Controllers;
|
||||||
|
|
||||||
|
public class ViewControllerBase : Controller
|
||||||
|
{
|
||||||
|
protected readonly ILogger _logger;
|
||||||
|
protected readonly HtmlSanitizer _sanitizer;
|
||||||
|
protected readonly Cultures _cultures;
|
||||||
|
protected readonly IStringLocalizer<Resource> _localizer;
|
||||||
|
|
||||||
|
public ViewControllerBase(ILogger logger, HtmlSanitizer sanitizer, Cultures cultures, IStringLocalizer<Resource> localizer)
|
||||||
|
{
|
||||||
|
_logger = logger;
|
||||||
|
_sanitizer = sanitizer;
|
||||||
|
_cultures = cultures;
|
||||||
|
_localizer = localizer;
|
||||||
|
}
|
||||||
|
}
|
||||||
17
EnvelopeGenerator.Web/Models/TFARegParams.cs
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
namespace EnvelopeGenerator.Web.Models;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Represents the parameters for two-factor authentication (2FA) registration.
|
||||||
|
/// </summary>
|
||||||
|
public class TFARegParams
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The maximum allowed time for completing the registration process.
|
||||||
|
/// </summary>
|
||||||
|
public TimeSpan TimeLimit { get; init; } = new(0, 30, 0);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The deadline for registration, calculated as the current time plus the <see cref="TimeLimit"/>.
|
||||||
|
/// </summary>
|
||||||
|
public DateTime Deadline => DateTime.Now.AddTicks(TimeLimit.Ticks);
|
||||||
|
}
|
||||||
@@ -49,6 +49,8 @@ try
|
|||||||
// Add higher order services
|
// Add higher order services
|
||||||
builder.Services.AddScoped<EnvelopeOldService>();
|
builder.Services.AddScoped<EnvelopeOldService>();
|
||||||
|
|
||||||
|
builder.ConfigureBySection<TFARegParams>();
|
||||||
|
|
||||||
// Add controllers and razor views
|
// Add controllers and razor views
|
||||||
builder.Services.AddControllersWithViews(options =>
|
builder.Services.AddControllersWithViews(options =>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,20 +2,23 @@
|
|||||||
@using Newtonsoft.Json
|
@using Newtonsoft.Json
|
||||||
@model Auth;
|
@model Auth;
|
||||||
@{
|
@{
|
||||||
|
//TODO: Create view model
|
||||||
var nonce = _accessor.HttpContext?.Items["csp-nonce"] as string;
|
var nonce = _accessor.HttpContext?.Items["csp-nonce"] as string;
|
||||||
var logo = _logoOpt.Value;
|
var logo = _logoOpt.Value;
|
||||||
ViewData["Title"] = _localizer[WebKey.DocProtected];
|
ViewData["Title"] = _localizer[WebKey.DocProtected];
|
||||||
var userCulture = ViewData["UserCulture"] as Culture;
|
var userCulture = ViewData["UserCulture"] as Culture;
|
||||||
string codeType = ViewData["CodeType"] is string _codeType ? _codeType : "accessCode";
|
string codeType = ViewData["CodeType"] is string _codeType ? _codeType : "accessCode";
|
||||||
string codePropName = char.ToUpper(codeType[0]) + codeType.Substring(1);
|
string codeKeyName = (char.ToUpper(codeType[0]) + codeType.Substring(1)).Replace("Code", "");
|
||||||
string codeKeyName = codePropName.Replace("Code", "");
|
|
||||||
bool viaSms = codeType == "smsCode";
|
bool viaSms = codeType == "smsCode";
|
||||||
bool viaAuthenticator = codeType == "authenticatorCode";
|
bool viaAuthenticator = codeType == "authenticatorCode";
|
||||||
bool viaTFA = viaSms || viaAuthenticator;
|
bool viaTFA = viaSms || viaAuthenticator;
|
||||||
DateTime? smsExpiration = ViewData["SmsExpiration"] is DateTime _smsExpiration ? _smsExpiration : null;
|
DateTime? smsExpiration = ViewData["SmsExpiration"] is DateTime _smsExpiration ? _smsExpiration : null;
|
||||||
DateTime? qrCodeExpiration = ViewData["QRCodeExpiration"] is DateTime _qrCodeExpiration ? _qrCodeExpiration : null;
|
|
||||||
bool tfaEnabled = ViewData["TFAEnabled"] is bool _tfaEnabled && _tfaEnabled;
|
bool tfaEnabled = ViewData["TFAEnabled"] is bool _tfaEnabled && _tfaEnabled;
|
||||||
bool hasPhoneNumber = ViewData["HasPhoneNumber"] is bool _hasPhoneNumber && _hasPhoneNumber;
|
bool hasPhoneNumber = ViewData["HasPhoneNumber"] is bool _hasPhoneNumber && _hasPhoneNumber;
|
||||||
|
var envelopeKey = ViewData["EnvelopeKey"] as string;
|
||||||
|
DateTime? tfaRegDeadline = ViewData["TfaRegDeadline"] is DateTime _deadline ? _deadline : null;
|
||||||
|
var senderEmail = ViewData["SenderEmail"] as string ?? string.Empty;
|
||||||
|
var envelopeTitle = ViewData["EnvelopeTitle"] as string ?? string.Empty;
|
||||||
}
|
}
|
||||||
<div class="page container py-4 px-4">
|
<div class="page container py-4 px-4">
|
||||||
<header class="text-center">
|
<header class="text-center">
|
||||||
@@ -31,12 +34,25 @@
|
|||||||
</div>
|
</div>
|
||||||
<h1>@_localizer[WebKey.Formats.LockedTitle.Format(codeKeyName)]</h1>
|
<h1>@_localizer[WebKey.Formats.LockedTitle.Format(codeKeyName)]</h1>
|
||||||
</header>
|
</header>
|
||||||
|
@if (viaAuthenticator && (tfaRegDeadline is null || tfaRegDeadline > DateTime.Now))
|
||||||
|
{
|
||||||
<section class="text-center">
|
<section class="text-center">
|
||||||
<p>@_localizer[WebKey.Formats.LockedBody.Format(codeKeyName)].Value.Format(qrCodeExpiration.ToString())</p>
|
<p class="m-0 p-0">
|
||||||
|
Klicken Sie auf den
|
||||||
|
<a class="icon-link m-0 p-0" href="/tfa/@envelopeKey" style="text-decoration: none;" target="_blank">
|
||||||
|
Link
|
||||||
|
<i class="bi bi-box-arrow-up-right"></i>
|
||||||
|
</a>
|
||||||
|
um Ihre Authenticator-App einzurichten.
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
}
|
||||||
|
<section class="text-center">
|
||||||
|
<p>@_localizer[WebKey.Formats.LockedBody.Format(codeKeyName)].Value</p>
|
||||||
</section>
|
</section>
|
||||||
<div class="row m-0 p-0">
|
<div class="row m-0 p-0">
|
||||||
<div class="access-code-panel justify-content-center align-items-center p-0 m-0">
|
<div class="access-code-panel justify-content-center align-items-center p-0 m-0">
|
||||||
<form id="form-access-code" class="form form-floating mb-0" method="post">
|
<form id="form-access-code" class="form form-floating mb-0" method="post">
|
||||||
<div class="form-floating access-code-form-floating">
|
<div class="form-floating access-code-form-floating">
|
||||||
<input type="password" id="access_code" class="form-control" name="@codeType" placeholder="@_localizer[WebKey.Formats.LockedCodeLabel.Format(codeKeyName)]" required="required">
|
<input type="password" id="access_code" class="form-control" name="@codeType" placeholder="@_localizer[WebKey.Formats.LockedCodeLabel.Format(codeKeyName)]" required="required">
|
||||||
<label for="access_code">@_localizer[WebKey.Formats.LockedCodeLabel.Format(codeKeyName)]</label>
|
<label for="access_code">@_localizer[WebKey.Formats.LockedCodeLabel.Format(codeKeyName)]</label>
|
||||||
@@ -47,21 +63,21 @@
|
|||||||
</button>
|
</button>
|
||||||
@if (tfaEnabled)
|
@if (tfaEnabled)
|
||||||
{
|
{
|
||||||
<div class="form-check form-switch tfa-sms">
|
<div class="form-check form-switch tfa-sms">
|
||||||
@if(hasPhoneNumber)
|
@if(hasPhoneNumber)
|
||||||
{
|
{
|
||||||
<input asp-for="UserSelectSMS" class="form-check-input" name="userSelectSMS" type="checkbox" role="switch" id="flexSwitchCheckChecked">
|
<input asp-for="UserSelectSMS" class="form-check-input" name="userSelectSMS" type="checkbox" role="switch" id="flexSwitchCheckChecked">
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
<input asp-for="UserSelectSMS" class="form-check-input" name="userSelectSMS" type="checkbox" role="switch" id="flexSwitchCheckChecked" disabled>
|
<input asp-for="UserSelectSMS" class="form-check-input" name="userSelectSMS" type="checkbox" role="switch" id="flexSwitchCheckChecked" disabled>
|
||||||
}
|
}
|
||||||
<label class="form-check-label" for="flexSwitchCheckChecked">2FA per SMS</label>
|
<label class="form-check-label" for="flexSwitchCheckChecked">2FA per SMS</label>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
@if (smsExpiration is not null)
|
@if (smsExpiration is not null)
|
||||||
{
|
{
|
||||||
<div id="sms-timer" class="alert alert-primary" role="alert">00:00</div>
|
<div id="sms-timer" class="alert alert-primary" role="alert">00:00</div>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
@@ -69,15 +85,15 @@
|
|||||||
</div>
|
</div>
|
||||||
@if (ViewData["ErrorMessage"] is string errMsg)
|
@if (ViewData["ErrorMessage"] is string errMsg)
|
||||||
{
|
{
|
||||||
<div id="access-code-error-message" class="alert alert-danger row" role="alert">
|
<div id="access-code-error-message" class="alert alert-danger row" role="alert">
|
||||||
@_sanitizer.Sanitize(errMsg)
|
@_sanitizer.Sanitize(errMsg)
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
<section class="no-receiver-explanation text-center">
|
<section class="no-receiver-explanation text-center">
|
||||||
<details>
|
<details>
|
||||||
<summary>@_localizer[WebKey.Formats.LockedFooterTitle.Format(codeKeyName)]</summary>
|
<summary>@_localizer[WebKey.Formats.LockedFooterTitle.Format(codeKeyName)]</summary>
|
||||||
<p>@_localizer[WebKey.Formats.LockedFooterBody.Format(codeKeyName)]</p>
|
<p>@Html.Raw(_localizer[WebKey.Formats.LockedFooterBody.Format(codeKeyName)].Value.Format(senderEmail, "Envelope - " + envelopeTitle, string.Empty))</p>
|
||||||
</details>
|
</details>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
25
EnvelopeGenerator.Web/Views/Shared/_Expired.cshtml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
@{
|
||||||
|
ViewData["Title"] = "Abgelaufen";
|
||||||
|
var head = ViewData["Head"] as string ?? "Abgelaufen!";
|
||||||
|
var body = ViewData["Body"] as string ?? "Die Gültigkeitsdauer der Verbindung ist abgelaufen.";
|
||||||
|
}
|
||||||
|
<div class="page container p-5">
|
||||||
|
<header class="text-center">
|
||||||
|
<div class="icon expired">
|
||||||
|
<svg width="72" height="72" viewBox="0 0 48 48" version="1" xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 48 48">
|
||||||
|
<circle fill="#00ACC1" cx="17" cy="17" r="14" />
|
||||||
|
<circle fill="#eee" cx="17" cy="17" r="11" />
|
||||||
|
<rect x="16" y="8" width="2" height="9" />
|
||||||
|
<rect x="18.2" y="16" transform="matrix(-.707 .707 -.707 -.707 46.834 19.399)" width="2.4" height="6.8" />
|
||||||
|
<circle cx="17" cy="17" r="2" />
|
||||||
|
<circle fill="#00ACC1" cx="17" cy="17" r="1" />
|
||||||
|
<path fill="#FFC107" d="M11.9,42l14.4-24.1c0.8-1.3,2.7-1.3,3.4,0L44.1,42c0.8,1.3-0.2,3-1.7,3H13.6C12.1,45,11.1,43.3,11.9,42z" />
|
||||||
|
<path fill="#263238" d="M26.4,39.9c0-0.2,0-0.4,0.1-0.6s0.2-0.3,0.3-0.5s0.3-0.2,0.5-0.3s0.4-0.1,0.6-0.1s0.5,0,0.7,0.1 s0.4,0.2,0.5,0.3s0.2,0.3,0.3,0.5s0.1,0.4,0.1,0.6s0,0.4-0.1,0.6s-0.2,0.3-0.3,0.5s-0.3,0.2-0.5,0.3s-0.4,0.1-0.7,0.1 s-0.5,0-0.6-0.1s-0.4-0.2-0.5-0.3s-0.2-0.3-0.3-0.5S26.4,40.1,26.4,39.9z M29.2,36.8h-2.3L26.5,27h3L29.2,36.8z" />
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<h1>@head</h1>
|
||||||
|
</header>
|
||||||
|
<section class="text-center">
|
||||||
|
<p>@body</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
@@ -26,6 +26,7 @@
|
|||||||
<link rel="stylesheet" href="~/lib/alertifyjs/css/alertify.min.css" />
|
<link rel="stylesheet" href="~/lib/alertifyjs/css/alertify.min.css" />
|
||||||
<link href="https://fonts.googleapis.com/icon?family=Material+Symbols+Outlined" rel="stylesheet">
|
<link href="https://fonts.googleapis.com/icon?family=Material+Symbols+Outlined" rel="stylesheet">
|
||||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0" />
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0" />
|
||||||
|
<link rel="stylesheet" href="~/lib/bootstrap-icons/font/bootstrap-icons.min.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<style>
|
<style>
|
||||||
@@ -67,7 +68,7 @@
|
|||||||
{
|
{
|
||||||
ContractResolver = new CamelCasePropertyNamesContractResolver()
|
ContractResolver = new CamelCasePropertyNamesContractResolver()
|
||||||
};
|
};
|
||||||
var lStrsJson = JsonConvert.SerializeObject(_localizer.ToDictionary(), settings).TrySanitize(_sanitizer);
|
var lStrsJson = JsonConvert.SerializeObject(_localizer.ToDictionary(), settings);
|
||||||
}
|
}
|
||||||
<script nonce="@nonce">
|
<script nonce="@nonce">
|
||||||
var localized = @Html.Raw(lStrsJson)
|
var localized = @Html.Raw(lStrsJson)
|
||||||
|
|||||||
75
EnvelopeGenerator.Web/Views/TFAReg/Reg.cshtml
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
@using System.Globalization
|
||||||
|
@{
|
||||||
|
ViewData["Title"] = "2FA Registrierung";
|
||||||
|
var totpQR64 = ViewData["TotpQR64"] as string;
|
||||||
|
var regDeadline = ViewData["RegDeadline"] is DateTime _dateTime ? _dateTime : throw new InvalidOperationException("RegDeadline is not added to view in Reg.cshtml view.");
|
||||||
|
}
|
||||||
|
<div class="page container p-5">
|
||||||
|
<header class="text-center">
|
||||||
|
<div class="icon locked mt-4 mb-1">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="72" height="72" fill="currentColor" class="bi bi-shield-lock" viewBox="0 0 16 16">
|
||||||
|
<path d="M5.338 1.59a61 61 0 0 0-2.837.856.48.48 0 0 0-.328.39c-.554 4.157.726 7.19 2.253 9.188a10.7 10.7 0 0 0 2.287 2.233c.346.244.652.42.893.533q.18.085.293.118a1 1 0 0 0 .101.025 1 1 0 0 0 .1-.025q.114-.034.294-.118c.24-.113.547-.29.893-.533a10.7 10.7 0 0 0 2.287-2.233c1.527-1.997 2.807-5.031 2.253-9.188a.48.48 0 0 0-.328-.39c-.651-.213-1.75-.56-2.837-.855C9.552 1.29 8.531 1.067 8 1.067c-.53 0-1.552.223-2.662.524zM5.072.56C6.157.265 7.31 0 8 0s1.843.265 2.928.56c1.11.3 2.229.655 2.887.87a1.54 1.54 0 0 1 1.044 1.262c.596 4.477-.787 7.795-2.465 9.99a11.8 11.8 0 0 1-2.517 2.453 7 7 0 0 1-1.048.625c-.28.132-.581.24-.829.24s-.548-.108-.829-.24a7 7 0 0 1-1.048-.625 11.8 11.8 0 0 1-2.517-2.453C1.928 10.487.545 7.169 1.141 2.692A1.54 1.54 0 0 1 2.185 1.43 63 63 0 0 1 5.072.56" />
|
||||||
|
<path d="M9.5 6.5a1.5 1.5 0 0 1-1 1.415l.385 1.99a.5.5 0 0 1-.491.595h-.788a.5.5 0 0 1-.49-.595l.384-1.99a1.5 1.5 0 1 1 2-1.415" />
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<h2 class="mb-0">2-Factor Authentication (2FA)</h2>
|
||||||
|
<h2>Registrierung</h2>
|
||||||
|
</header>
|
||||||
|
<section class="text-center">
|
||||||
|
<p class="p-0 m-0"> @string.Format("Diese Seite ist bis {0} sichtbar.", regDeadline.ToString("d. MMM, HH:mm", new CultureInfo("de-DE")))</p>
|
||||||
|
</section>
|
||||||
|
<section class="text-start mt-4">
|
||||||
|
<div class="accordion" id="tfaRegStep">
|
||||||
|
<div class="accordion-item">
|
||||||
|
<h2 class="accordion-header">
|
||||||
|
<button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
|
||||||
|
<p class="fw-bolder">Schritt 1 - Download einer 2FA Applikation</p>
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
|
<div id="collapseOne" class="accordion-collapse collapse show" data-bs-parent="#tfaRegStep">
|
||||||
|
<div class="accordion-body">
|
||||||
|
<p class="text-wrap fw-medium">Bitte nehmen Sie Ihr Smartphone zur Hand und laden eine Applikation herunter, die zur Zwei-Faktor-Authentifizierung (2FA) benutzt werden kann.</p>
|
||||||
|
<p class="text-wrap fw-light">Folgende Applikationen empfehlen wir</p>
|
||||||
|
<ul class="list-group text-start">
|
||||||
|
<li class="list-group-item">
|
||||||
|
<a href="https://support.google.com/accounts/answer/1066447?hl=de&co=GENIE.Platform%3DAndroid" target="_blank" style="text-decoration: none;">
|
||||||
|
<samp>Google Authenticator</samp>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="list-group-item">
|
||||||
|
<a href="https://support.microsoft.com/de-de/account-billing/microsoft-authenticator-herunterladen-351498fc-850a-45da-b7b6-27e523b8702a" target="_blank" style="text-decoration: none;">
|
||||||
|
<samp>Microsoft Authenticator</samp>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="accordion-item">
|
||||||
|
<h2 class="accordion-header">
|
||||||
|
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
|
||||||
|
<p class="fw-bolder">Schritt 2 - Scannen des QR-Codes</p>
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
|
<div id="collapseTwo" class="accordion-collapse collapse" data-bs-parent="#tfaRegStep">
|
||||||
|
<div class="accordion-body">
|
||||||
|
<div class="text-center m-0 p-0"><img class="tfaQrCode" src="data:image/png;base64,@totpQR64"></div>
|
||||||
|
<p class="text-wrap fw-medium">Sobald Sie eine Zwei-Faktor-Authentifizierung App installiert haben, können Sie fortfahren und innerhalb der Applikation die Option zum Scannen eines QR-Codes suchen und bestätigen. Im Anschluss, sobald die Kamera freigegeben wurde, können Sie den QR-Code von uns scannen.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="accordion-item">
|
||||||
|
<h2 class="accordion-header">
|
||||||
|
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseThree" aria-expanded="false" aria-controls="collapseThree">
|
||||||
|
<p class="fw-bolder">Schritt 3 - Verifizierung des Codes</p>
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
|
<div id="collapseThree" class="accordion-collapse collapse" data-bs-parent="#tfaRegStep">
|
||||||
|
<div class="accordion-body">
|
||||||
|
<p class="text-wrap fw-medium">Sie können nun in der Zwei-Faktor-Authentifizierung App einen Zahlencode zur Verifizierung des Vorganges ablesen. Bitte tragen Sie diesen Code in das unten aufgeführte Eingabefeld ein und Klicken auf <samp>Absenden</samp>.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
@@ -70,11 +70,6 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"Jwt": {
|
|
||||||
"Issuer": null,
|
|
||||||
"Audience": null,
|
|
||||||
"Key": "8RGnd7x0G2TYLOIW4m_qlIls7MfbAIGNrpQJzMAUIvULHOLiG723znRa_MG-Z4yw3SErusOU4hTui2rVBMcCaQ"
|
|
||||||
},
|
|
||||||
"ContactLink": {
|
"ContactLink": {
|
||||||
"Label": "Kontakt",
|
"Label": "Kontakt",
|
||||||
"Href": "https://digitaldata.works/",
|
"Href": "https://digitaldata.works/",
|
||||||
@@ -113,30 +108,28 @@
|
|||||||
"ShowPageClass": "dd-show-logo",
|
"ShowPageClass": "dd-show-logo",
|
||||||
"LockedPageClass": "dd-locked-logo"
|
"LockedPageClass": "dd-locked-logo"
|
||||||
},
|
},
|
||||||
"DispatcherConfig": {
|
"DispatcherParams": {
|
||||||
"SendingProfile": 1,
|
"SendingProfile": 1,
|
||||||
"AddedWho": "DDEnvelopGenerator",
|
"AddedWho": "DDEnvelopGenerator",
|
||||||
"ReminderTypeId": 202377,
|
"ReminderTypeId": 202377,
|
||||||
"EmailAttmt1": ""
|
"EmailAttmt1": ""
|
||||||
},
|
},
|
||||||
"MailConfig": {
|
"MailParams": {
|
||||||
"Placeholders": {
|
"Placeholders": {
|
||||||
"[NAME_PORTAL]": "signFlow",
|
"[NAME_PORTAL]": "signFlow",
|
||||||
"[SIGNATURE_TYPE]": "signieren",
|
"[SIGNATURE_TYPE]": "signieren",
|
||||||
"[REASON]": ""
|
"[REASON]": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"GTXMessagingConfig": {
|
"GtxMessagingParams": {
|
||||||
"AuthKey": "ep$?A!Gs"
|
|
||||||
},
|
|
||||||
"SmsConfig": {
|
|
||||||
"Uri": "https://rest.gtx-messaging.net",
|
"Uri": "https://rest.gtx-messaging.net",
|
||||||
"Path": "smsc/sendsms/f566f7e5-bdf2-4a9a-bf52-ed88215a432e/json",
|
"Path": "smsc/sendsms/f566f7e5-bdf2-4a9a-bf52-ed88215a432e/json",
|
||||||
"Headers": {},
|
"Headers": {},
|
||||||
"QueryParams": {
|
"QueryParams": {
|
||||||
"from": "signFlow"
|
"from": "signFlow"
|
||||||
},
|
}
|
||||||
"CodeCacheValidityPeriod": "00:10:00"
|
|
||||||
},
|
},
|
||||||
"EnvelopeReceiverCacheParams": {}
|
"TFARegParams": {
|
||||||
|
"TimeLimit": "00:30:00"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -618,4 +618,8 @@ footer#page-footer {
|
|||||||
.collapse {
|
.collapse {
|
||||||
height: 4rem;
|
height: 4rem;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#tfaRegStep .tfaQrCode {
|
||||||
|
width: 7rem;
|
||||||
}
|
}
|
||||||
@@ -211,6 +211,9 @@ class App {
|
|||||||
// Show the modal
|
// Show the modal
|
||||||
Comp.ShareBackdrop.show();
|
Comp.ShareBackdrop.show();
|
||||||
break;
|
break;
|
||||||
|
case 'LOGOUT':
|
||||||
|
await logout();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
2
EnvelopeGenerator.Web/wwwroot/js/app.min.js
vendored
@@ -1,3 +1,3 @@
|
|||||||
const ActionType={Created:0,Saved:1,Sent:2,EmailSent:3,Delivered:4,Seen:5,Signed:6,Rejected:7};class App{constructor(n,t,i,r,u,f){this.container=f??`#${this.constructor.name.toLowerCase()}`;this.envelopeKey=n;this.Network=new Network;this.Instance=null;this.currentDocument=null;this.currentReceiver=null;this.signatureCount=0;this.envelopeReceiver=t;this.documentBytes=i;this.licenseKey=r;this.locale=u}async init(){this.currentDocument=this.envelopeReceiver.envelope.documents[0];this.currentReceiver=this.envelopeReceiver.receiver;const n=this.documentBytes;if(n.fatal||n.error)return Swal.fire({title:"Fehler",text:"Dokument konnte nicht geladen werden!",icon:"error"});const t=this.documentBytes;this.Instance=await UI.loadPSPDFKit(t,this.container,this.licenseKey,this.locale);UI.addToolbarItems(this.Instance,this.handleClick.bind(this));this.Instance.addEventListener("annotations.load",this.handleAnnotationsLoad.bind(this));this.Instance.addEventListener("annotations.change",this.handleAnnotationsChange.bind(this));this.Instance.addEventListener("annotations.create",this.handleAnnotationsCreate.bind(this));this.Instance.addEventListener("annotations.willChange",()=>{Comp.ActPanel.Toggle()});try{this.signatureCount=this.currentDocument.elements.length;await Annotation.createAnnotations(this.currentDocument,this.Instance);const n=await this.Network.openDocument(this.envelopeKey);if(n.fatal||n.error)return Swal.fire({title:"Fehler",text:"Umschlag konnte nicht geöffnet werden!",icon:"error"})}catch(i){}[...document.getElementsByClassName("btn_refresh")].forEach(n=>n.addEventListener("click",()=>this.handleClick("RESET")));[...document.getElementsByClassName("btn_complete")].forEach(n=>n.addEventListener("click",()=>this.handleClick("FINISH")));[...document.getElementsByClassName("btn_reject")].forEach(n=>n.addEventListener("click",()=>this.handleClick("REJECT")))}handleAnnotationsLoad(n){n.toJS()}handleAnnotationsChange(){}async handleAnnotationsCreate(n){const t=n.toJS()[0],i=!!t.formFieldName,r=!!t.isSignature;if(i===!1&&r===!0){const r=t.boundingBox.left-20,u=t.boundingBox.top-20,n=150,i=75,f=new Date,e=await Annotation.createAnnotationFrameBlob(this.envelopeReceiver.name,this.currentReceiver.signature,f,n,i),o=await fetch(e),s=await o.blob(),h=await this.Instance.createAttachment(s),c=Annotation.createImageAnnotation(new PSPDFKit.Geometry.Rect({left:r,top:u,width:n,height:i}),t.pageIndex,h);this.Instance.create(c)}}async handleClick(n){let t=!1;switch(n){case"RESET":t=await this.handleReset(null);Comp.SignatureProgress.SignedCount=0;t.isConfirmed&&Swal.fire({title:"Erfolg",text:"Dokument wurde zurückgesetzt",icon:"info"});break;case"FINISH":t=await this.handleFinish(null);t==!0&&(window.location.href=`/EnvelopeKey/${this.envelopeKey}/Success`);break;case"REJECT":Swal.fire({title:localized.rejection,html:`<div class="text-start fs-6 p-0 m-0">${localized.rejectionReasonQ}</div>`,icon:"question",input:"text",inputAttributes:{autocapitalize:"off"},showCancelButton:!0,confirmButtonColor:"#3085d6",cancelButtonColor:"#d33",confirmButtonText:localized.complete,cancelButtonText:localized.back,showLoaderOnConfirm:!0,preConfirm:async n=>{try{return await rejectEnvelope(n)}catch(t){Swal.showValidationMessage(`
|
const ActionType={Created:0,Saved:1,Sent:2,EmailSent:3,Delivered:4,Seen:5,Signed:6,Rejected:7};class App{constructor(n,t,i,r,u,f){this.container=f??`#${this.constructor.name.toLowerCase()}`;this.envelopeKey=n;this.Network=new Network;this.Instance=null;this.currentDocument=null;this.currentReceiver=null;this.signatureCount=0;this.envelopeReceiver=t;this.documentBytes=i;this.licenseKey=r;this.locale=u}async init(){this.currentDocument=this.envelopeReceiver.envelope.documents[0];this.currentReceiver=this.envelopeReceiver.receiver;const n=this.documentBytes;if(n.fatal||n.error)return Swal.fire({title:"Fehler",text:"Dokument konnte nicht geladen werden!",icon:"error"});const t=this.documentBytes;this.Instance=await UI.loadPSPDFKit(t,this.container,this.licenseKey,this.locale);UI.addToolbarItems(this.Instance,this.handleClick.bind(this));this.Instance.addEventListener("annotations.load",this.handleAnnotationsLoad.bind(this));this.Instance.addEventListener("annotations.change",this.handleAnnotationsChange.bind(this));this.Instance.addEventListener("annotations.create",this.handleAnnotationsCreate.bind(this));this.Instance.addEventListener("annotations.willChange",()=>{Comp.ActPanel.Toggle()});try{this.signatureCount=this.currentDocument.elements.length;await Annotation.createAnnotations(this.currentDocument,this.Instance);const n=await this.Network.openDocument(this.envelopeKey);if(n.fatal||n.error)return Swal.fire({title:"Fehler",text:"Umschlag konnte nicht geöffnet werden!",icon:"error"})}catch(i){}[...document.getElementsByClassName("btn_refresh")].forEach(n=>n.addEventListener("click",()=>this.handleClick("RESET")));[...document.getElementsByClassName("btn_complete")].forEach(n=>n.addEventListener("click",()=>this.handleClick("FINISH")));[...document.getElementsByClassName("btn_reject")].forEach(n=>n.addEventListener("click",()=>this.handleClick("REJECT")))}handleAnnotationsLoad(n){n.toJS()}handleAnnotationsChange(){}async handleAnnotationsCreate(n){const t=n.toJS()[0],i=!!t.formFieldName,r=!!t.isSignature;if(i===!1&&r===!0){const r=t.boundingBox.left-20,u=t.boundingBox.top-20,n=150,i=75,f=new Date,e=await Annotation.createAnnotationFrameBlob(this.envelopeReceiver.name,this.currentReceiver.signature,f,n,i),o=await fetch(e),s=await o.blob(),h=await this.Instance.createAttachment(s),c=Annotation.createImageAnnotation(new PSPDFKit.Geometry.Rect({left:r,top:u,width:n,height:i}),t.pageIndex,h);this.Instance.create(c)}}async handleClick(n){let t=!1;switch(n){case"RESET":t=await this.handleReset(null);Comp.SignatureProgress.SignedCount=0;t.isConfirmed&&Swal.fire({title:"Erfolg",text:"Dokument wurde zurückgesetzt",icon:"info"});break;case"FINISH":t=await this.handleFinish(null);t==!0&&(window.location.href=`/EnvelopeKey/${this.envelopeKey}/Success`);break;case"REJECT":Swal.fire({title:localized.rejection,html:`<div class="text-start fs-6 p-0 m-0">${localized.rejectionReasonQ}</div>`,icon:"question",input:"text",inputAttributes:{autocapitalize:"off"},showCancelButton:!0,confirmButtonColor:"#3085d6",cancelButtonColor:"#d33",confirmButtonText:localized.complete,cancelButtonText:localized.back,showLoaderOnConfirm:!0,preConfirm:async n=>{try{return await rejectEnvelope(n)}catch(t){Swal.showValidationMessage(`
|
||||||
Request failed: ${t}
|
Request failed: ${t}
|
||||||
`)}},allowOutsideClick:()=>!Swal.isLoading()}).then(n=>{if(n.isConfirmed){const t=n.value;t.ok?redirRejected():Swal.showValidationMessage(`Request failed: ${t.message}`)}});break;case"COPY_URL":const n=window.location.href.replace(/\/readonly/gi,"");navigator.clipboard.writeText(n).then(function(){bsNotify("Kopiert",{alert_type:"success",delay:4,icon_name:"check_circle"})}).catch(function(){bsNotify("Unerwarteter Fehler",{alert_type:"danger",delay:4,icon_name:"error"})});break;case"SHARE":Comp.ShareBackdrop.show()}}async handleFinish(){const n=await this.Instance.exportInstantJSON(),t=await n.formFieldValues,r=t.filter(n=>Annotation.isFieldRequired(n)),u=r.some(n=>n.value===undefined||n.value===null||n.value==="");if(u)return Swal.fire({title:"Warnung",text:"Bitte füllen Sie alle Standortinformationen vollständig aus!",icon:"warning"}),!1;const f=new RegExp("^[a-zA-Z\\u0080-\\u024F]+(?:([\\ \\-\\']|(\\.\\ ))[a-zA-Z\\u0080-\\u024F]+)*$"),e=t.filter(n=>Annotation.isCityField(n));for(var i of e)if(!IS_MOBILE_DEVICE&&!f.test(i.value))return Swal.fire({title:"Warnung",text:`Bitte überprüfen Sie die eingegebene Ortsangabe "${i.value}" auf korrekte Formatierung. Beispiele für richtige Formate sind: München, Île-de-France, Sauðárkrókur, San Francisco, St. Catharines usw.`,icon:"warning"}),!1;const o=await this.validateAnnotations(this.signatureCount);return o===!1?(Swal.fire({title:"Warnung",text:"Es wurden nicht alle Signaturfelder ausgefüllt!",icon:"warning"}),!1):Swal.fire({title:localized.confirmation,html:`<div class="text-start fs-6 p-0 m-0">${localized.sigAgree}</div>`,icon:"question",showCancelButton:!0,confirmButtonColor:"#3085d6",cancelButtonColor:"#d33",confirmButtonText:localized.finalize,cancelButtonText:localized.back}).then(async t=>{if(t.isConfirmed){try{await this.Instance.save()}catch(i){return Swal.fire({title:"Fehler",text:"Umschlag konnte nicht signiert werden!",icon:"error"}),!1}try{const i=await n,t=await this.Network.postEnvelope(this.envelopeKey,this.currentDocument.id,i);return t.fatal?(Swal.fire({title:"Fehler",text:"Umschlag konnte nicht signiert werden!",icon:"error"}),!1):t.error?(Swal.fire({title:"Warnung",text:"Umschlag ist nicht mehr verfügbar.",icon:"warning"}),!1):!0}catch(i){return!1}}else return!1})}async validateAnnotations(n){const t=await Annotation.getAnnotations(this.Instance),i=t.map(n=>n.toJS()).filter(n=>n.isSignature);return n>i.length?!1:!0}async handleReset(){const n=await Swal.fire({title:"Sind sie sicher?",text:"Wollen Sie das Dokument und alle erstellten Signaturen zurücksetzen?",icon:"question",showCancelButton:!0});if(n.isConfirmed){const n=await Annotation.deleteAnnotations(this.Instance)}return n}}
|
`)}},allowOutsideClick:()=>!Swal.isLoading()}).then(n=>{if(n.isConfirmed){const t=n.value;t.ok?redirRejected():Swal.showValidationMessage(`Request failed: ${t.message}`)}});break;case"COPY_URL":const n=window.location.href.replace(/\/readonly/gi,"");navigator.clipboard.writeText(n).then(function(){bsNotify("Kopiert",{alert_type:"success",delay:4,icon_name:"check_circle"})}).catch(function(){bsNotify("Unerwarteter Fehler",{alert_type:"danger",delay:4,icon_name:"error"})});break;case"SHARE":Comp.ShareBackdrop.show();break;case"LOGOUT":await logout()}}async handleFinish(){const n=await this.Instance.exportInstantJSON(),t=await n.formFieldValues,r=t.filter(n=>Annotation.isFieldRequired(n)),u=r.some(n=>n.value===undefined||n.value===null||n.value==="");if(u)return Swal.fire({title:"Warnung",text:"Bitte füllen Sie alle Standortinformationen vollständig aus!",icon:"warning"}),!1;const f=new RegExp("^[a-zA-Z\\u0080-\\u024F]+(?:([\\ \\-\\']|(\\.\\ ))[a-zA-Z\\u0080-\\u024F]+)*$"),e=t.filter(n=>Annotation.isCityField(n));for(var i of e)if(!IS_MOBILE_DEVICE&&!f.test(i.value))return Swal.fire({title:"Warnung",text:`Bitte überprüfen Sie die eingegebene Ortsangabe "${i.value}" auf korrekte Formatierung. Beispiele für richtige Formate sind: München, Île-de-France, Sauðárkrókur, San Francisco, St. Catharines usw.`,icon:"warning"}),!1;const o=await this.validateAnnotations(this.signatureCount);return o===!1?(Swal.fire({title:"Warnung",text:"Es wurden nicht alle Signaturfelder ausgefüllt!",icon:"warning"}),!1):Swal.fire({title:localized.confirmation,html:`<div class="text-start fs-6 p-0 m-0">${localized.sigAgree}</div>`,icon:"question",showCancelButton:!0,confirmButtonColor:"#3085d6",cancelButtonColor:"#d33",confirmButtonText:localized.finalize,cancelButtonText:localized.back}).then(async t=>{if(t.isConfirmed){try{await this.Instance.save()}catch(i){return Swal.fire({title:"Fehler",text:"Umschlag konnte nicht signiert werden!",icon:"error"}),!1}try{const i=await n,t=await this.Network.postEnvelope(this.envelopeKey,this.currentDocument.id,i);return t.fatal?(Swal.fire({title:"Fehler",text:"Umschlag konnte nicht signiert werden!",icon:"error"}),!1):t.error?(Swal.fire({title:"Warnung",text:"Umschlag ist nicht mehr verfügbar.",icon:"warning"}),!1):!0}catch(i){return!1}}else return!1})}async validateAnnotations(n){const t=await Annotation.getAnnotations(this.Instance),i=t.map(n=>n.toJS()).filter(n=>n.isSignature);return n>i.length?!1:!0}async handleReset(){const n=await Swal.fire({title:"Sind sie sicher?",text:"Wollen Sie das Dokument und alle erstellten Signaturen zurücksetzen?",icon:"question",showCancelButton:!0});if(n.isConfirmed){const n=await Annotation.deleteAnnotations(this.Instance)}return n}}
|
||||||
@@ -194,4 +194,16 @@ async function setLanguage(language) {
|
|||||||
else if (!response.ok)
|
else if (!response.ok)
|
||||||
return Promise.reject('Failed to set language');
|
return Promise.reject('Failed to set language');
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function logout() {
|
||||||
|
return await fetch(`/auth/logout`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
}
|
||||||
|
}).then(res => {
|
||||||
|
if (res.ok)
|
||||||
|
window.location.href = "/";
|
||||||
|
});
|
||||||
}
|
}
|
||||||
@@ -1 +1 @@
|
|||||||
async function setLangAsync(n,t){document.getElementById("selectedFlag").className="fi "+t+" me-2";await fetch(`/lang/${n}`,{method:"POST",headers:{"Content-Type":"application/json"}})}async function setLanguage(n){const t=await fetch("/lang",{method:"GET",headers:{"Content-Type":"application/json"}}).then(n=>n.json()).then(t=>t.includes(n)).catch(()=>!1);if(t)return await fetch(`/lang/${n}`,{method:"POST",headers:{"Content-Type":"application/json"}}).then(n=>{if(n.redirected)window.location.href=n.url;else if(!n.ok)return Promise.reject("Failed to set language")})}class Network{async getEnvelope(n){return this.getRequest(`/api/envelope/${n}`).then(this.wrapJsonResponse.bind(this))}async postEnvelope(n,t,i){return this.postRequest(`/api/envelope/${n}?index=${t}`,i).then(this.wrapJsonResponse.bind(this))}async getDocument(n,t){return this.getRequest(`/api/document/${n}?index=${t}`).then(this.wrapBinaryResponse.bind(this))}async openDocument(n){return this.postRequest(`/api/document/${n}`,{}).then(this.wrapJsonResponse.bind(this))}withCSRFToken(n){const t=getCSRFToken;let i=n.headers;return n.headers={...i,...t},n}getCSRFToken(){const n=document.getElementsByName("__RequestVerificationToken")[0].value;return{"X-XSRF-TOKEN":n}}getRequest(n,t){const r=this.getCSRFToken(),i={credentials:"include",method:"GET",headers:{...r}};return t!==undefined&&(i.body=JSON.stringify(t)),fetch(n,i)}postRequest(n,t){const i=this.getCSRFToken(),r={credentials:"include",method:"POST",headers:{...i,"Content-Type":"application/json; charset=utf-8"},body:JSON.stringify(t)};return fetch(n,r)}async wrapJsonResponse(n){return await this.wrapResponse(n,async n=>await n.json())}async wrapBinaryResponse(n){return await this.wrapResponse(n,async n=>await n.arrayBuffer())}async wrapResponse(n,t){let i;if(n.status===200){const r=await t(n);i=new WrappedResponse(r,null)}else if(n.status===403){const t=await n.json();i=new WrappedResponse(null,t)}else i=new WrappedResponse(null,null);return i}}class WrappedResponse{constructor(n,t){this.data=n;this.error=t;this.fatal=n===null&&t===null}}
|
async function setLangAsync(n,t){document.getElementById("selectedFlag").className="fi "+t+" me-2";await fetch(`/lang/${n}`,{method:"POST",headers:{"Content-Type":"application/json"}})}async function setLanguage(n){const t=await fetch("/lang",{method:"GET",headers:{"Content-Type":"application/json"}}).then(n=>n.json()).then(t=>t.includes(n)).catch(()=>!1);if(t)return await fetch(`/lang/${n}`,{method:"POST",headers:{"Content-Type":"application/json"}}).then(n=>{if(n.redirected)window.location.href=n.url;else if(!n.ok)return Promise.reject("Failed to set language")})}async function logout(){return await fetch(`/auth/logout`,{method:"POST",headers:{"Content-Type":"application/json"}}).then(n=>{n.ok&&(window.location.href="/")})}class Network{async getEnvelope(n){return this.getRequest(`/api/envelope/${n}`).then(this.wrapJsonResponse.bind(this))}async postEnvelope(n,t,i){return this.postRequest(`/api/envelope/${n}?index=${t}`,i).then(this.wrapJsonResponse.bind(this))}async getDocument(n,t){return this.getRequest(`/api/document/${n}?index=${t}`).then(this.wrapBinaryResponse.bind(this))}async openDocument(n){return this.postRequest(`/api/document/${n}`,{}).then(this.wrapJsonResponse.bind(this))}withCSRFToken(n){const t=getCSRFToken;let i=n.headers;return n.headers={...i,...t},n}getCSRFToken(){const n=document.getElementsByName("__RequestVerificationToken")[0].value;return{"X-XSRF-TOKEN":n}}getRequest(n,t){const r=this.getCSRFToken(),i={credentials:"include",method:"GET",headers:{...r}};return t!==undefined&&(i.body=JSON.stringify(t)),fetch(n,i)}postRequest(n,t){const i=this.getCSRFToken(),r={credentials:"include",method:"POST",headers:{...i,"Content-Type":"application/json; charset=utf-8"},body:JSON.stringify(t)};return fetch(n,r)}async wrapJsonResponse(n){return await this.wrapResponse(n,async n=>await n.json())}async wrapBinaryResponse(n){return await this.wrapResponse(n,async n=>await n.arrayBuffer())}async wrapResponse(n,t){let i;if(n.status===200){const r=await t(n);i=new WrappedResponse(r,null)}else if(n.status===403){const t=await n.json();i=new WrappedResponse(null,t)}else i=new WrappedResponse(null,null);return i}}class WrappedResponse{constructor(n,t){this.data=n;this.error=t;this.fatal=n===null&&t===null}}
|
||||||
@@ -89,6 +89,26 @@
|
|||||||
icon: `<svg width="30" height="30" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
icon: `<svg width="30" height="30" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
<path d="M20 13V17.5C20 20.5577 16 20.5 12 20.5C8 20.5 4 20.5577 4 17.5V13M12 3L12 15M12 3L16 7M12 3L8 7" stroke="#000000" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
<path d="M20 13V17.5C20 20.5577 16 20.5 12 20.5C8 20.5 4 20.5577 4 17.5V13M12 3L12 15M12 3L16 7M12 3L8 7" stroke="#000000" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
</svg>`,
|
</svg>`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'custom',
|
||||||
|
id: 'button-logout',
|
||||||
|
className: 'button-logout',
|
||||||
|
title: 'logout',
|
||||||
|
onPress() {
|
||||||
|
callback('LOGOUT')
|
||||||
|
},
|
||||||
|
icon: `<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-box-arrow-left" viewBox="0 0 16 16">
|
||||||
|
<path fill-rule="evenodd" d="M6 12.5a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-9a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v2a.5.5 0 0 1-1 0v-2A1.5 1.5 0 0 1 6.5 2h8A1.5 1.5 0 0 1 16 3.5v9a1.5 1.5 0 0 1-1.5 1.5h-8A1.5 1.5 0 0 1 5 12.5v-2a.5.5 0 0 1 1 0z"/>
|
||||||
|
<path fill-rule="evenodd" d="M.146 8.354a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L1.707 7.5H10.5a.5.5 0 0 1 0 1H1.707l2.147 2.146a.5.5 0 0 1-.708.708z"/>
|
||||||
|
</svg>`
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'custom',
|
||||||
|
id: 'mock',
|
||||||
|
className: 'mock',
|
||||||
|
title: 'Mock',
|
||||||
|
icon: `<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-box-arrow-left" viewBox="0 0 16 16"></svg>`
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
5
EnvelopeGenerator.Web/wwwroot/js/ui.min.js
vendored
@@ -1,7 +1,10 @@
|
|||||||
class UI{static allowedToolbarItems=["sidebar-thumbnails","sidebar-document-ouline","sidebar-bookmarks","pager","pan","zoom-out","zoom-in","zoom-mode","spacer","search","export-pdf"];static Instance
|
class UI{static allowedToolbarItems=["sidebar-thumbnails","sidebar-document-ouline","sidebar-bookmarks","pager","pan","zoom-out","zoom-in","zoom-mode","spacer","search","export-pdf"];static Instance
|
||||||
static loadPSPDFKit(n,t,i,r){return UI.Instance=PSPDFKit.load({inlineWorkers:!1,locale:r,licenseKey:i,styleSheets:["/css/site.css"],container:t,document:n,annotationPresets:UI.getPresets(),electronicSignatures:{creationModes:["DRAW","TYPE","IMAGE"]},initialViewState:new PSPDFKit.ViewState({sidebarMode:PSPDFKit.SidebarMode.THUMBNAILS}),isEditableAnnotation:function(n){return n.isSignature||n.description=="FRAME"?!1:!0},customRenderers:{Annotation:UI.annotationRenderer}}),UI.Instance}static addToolbarItems(n,t){var i=n.toolbarItems.filter(n=>UI.allowedToolbarItems.includes(n.type));i=IS_READONLY?i.concat(UI.getReadOnlyItems(t)):i.concat(UI.getWritableItems(t));IS_DESKTOP_SIZE||IS_READONLY||(i=i.concat(UI.getMobileWritableItems(t)));n.setToolbarItems(i)}static annotationRenderer(){return null}static createElementFromHTML(n){const t=document.createElement("div");return t.innerHTML=n.trim(),t.firstChild}static getWritableItems=function(n){return[{type:"custom",id:"button-share",className:"button-share",title:"Teilen",onPress(){n("SHARE")},icon:`<svg width="30" height="30" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
static loadPSPDFKit(n,t,i,r){return UI.Instance=PSPDFKit.load({inlineWorkers:!1,locale:r,licenseKey:i,styleSheets:["/css/site.css"],container:t,document:n,annotationPresets:UI.getPresets(),electronicSignatures:{creationModes:["DRAW","TYPE","IMAGE"]},initialViewState:new PSPDFKit.ViewState({sidebarMode:PSPDFKit.SidebarMode.THUMBNAILS}),isEditableAnnotation:function(n){return n.isSignature||n.description=="FRAME"?!1:!0},customRenderers:{Annotation:UI.annotationRenderer}}),UI.Instance}static addToolbarItems(n,t){var i=n.toolbarItems.filter(n=>UI.allowedToolbarItems.includes(n.type));i=IS_READONLY?i.concat(UI.getReadOnlyItems(t)):i.concat(UI.getWritableItems(t));IS_DESKTOP_SIZE||IS_READONLY||(i=i.concat(UI.getMobileWritableItems(t)));n.setToolbarItems(i)}static annotationRenderer(){return null}static createElementFromHTML(n){const t=document.createElement("div");return t.innerHTML=n.trim(),t.firstChild}static getWritableItems=function(n){return[{type:"custom",id:"button-share",className:"button-share",title:"Teilen",onPress(){n("SHARE")},icon:`<svg width="30" height="30" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
<path d="M20 13V17.5C20 20.5577 16 20.5 12 20.5C8 20.5 4 20.5577 4 17.5V13M12 3L12 15M12 3L16 7M12 3L8 7" stroke="#000000" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
<path d="M20 13V17.5C20 20.5577 16 20.5 12 20.5C8 20.5 4 20.5577 4 17.5V13M12 3L12 15M12 3L16 7M12 3L8 7" stroke="#000000" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
</svg>`}]};static getReadOnlyItems=function(n){return[{type:"custom",id:"button-copy-url",className:"button-copy-url",title:"Teilen",onPress(){n("COPY_URL")},icon:`<svg viewBox="4 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
|
</svg>`},{type:"custom",id:"button-logout",className:"button-logout",title:"logout",onPress(){n("LOGOUT")},icon:`<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-box-arrow-left" viewBox="0 0 16 16">
|
||||||
|
<path fill-rule="evenodd" d="M6 12.5a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-9a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v2a.5.5 0 0 1-1 0v-2A1.5 1.5 0 0 1 6.5 2h8A1.5 1.5 0 0 1 16 3.5v9a1.5 1.5 0 0 1-1.5 1.5h-8A1.5 1.5 0 0 1 5 12.5v-2a.5.5 0 0 1 1 0z"/>
|
||||||
|
<path fill-rule="evenodd" d="M.146 8.354a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L1.707 7.5H10.5a.5.5 0 0 1 0 1H1.707l2.147 2.146a.5.5 0 0 1-.708.708z"/>
|
||||||
|
</svg>`},{type:"custom",id:"mock",className:"mock",title:"Mock",icon:`<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-box-arrow-left" viewBox="0 0 16 16"></svg>`}]};static getReadOnlyItems=function(n){return[{type:"custom",id:"button-copy-url",className:"button-copy-url",title:"Teilen",onPress(){n("COPY_URL")},icon:`<svg viewBox="4 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
<path d="M15 3H9C6.79086 3 5 4.79086 5 7V15" stroke="#222222"/>
|
<path d="M15 3H9C6.79086 3 5 4.79086 5 7V15" stroke="#222222"/>
|
||||||
<path d="M8.5 11.5C8.5 10.3156 8.50074 9.46912 8.57435 8.81625C8.64681 8.17346 8.78457 7.78051 9.01662 7.4781C9.14962 7.30477 9.30477 7.14962 9.4781 7.01662C9.78051 6.78457 10.1735 6.64681 10.8163 6.57435C11.4691 6.50074 12.3156 6.5 13.5 6.5C14.6844 6.5 15.5309 6.50074 16.1837 6.57435C16.8265 6.64681 17.2195 6.78457 17.5219 7.01662C17.6952 7.14962 17.8504 7.30477 17.9834 7.4781C18.2154 7.78051 18.3532 8.17346 18.4257 8.81625C18.4993 9.46912 18.5 10.3156 18.5 11.5V15.5C18.5 16.6844 18.4993 17.5309 18.4257 18.1837C18.3532 18.8265 18.2154 19.2195 17.9834 19.5219C17.8504 19.6952 17.6952 19.8504 17.5219 19.9834C17.2195 20.2154 16.8265 20.3532 16.1837 20.4257C15.5309 20.4993 14.6844 20.5 13.5 20.5C12.3156 20.5 11.4691 20.4993 10.8163 20.4257C10.1735 20.3532 9.78051 20.2154 9.4781 19.9834C9.30477 19.8504 9.14962 19.6952 9.01662 19.5219C8.78457 19.2195 8.64681 18.8265 8.57435 18.1837C8.50074 17.5309 8.5 16.6844 8.5 15.5V11.5Z" stroke="#222222"/>
|
<path d="M8.5 11.5C8.5 10.3156 8.50074 9.46912 8.57435 8.81625C8.64681 8.17346 8.78457 7.78051 9.01662 7.4781C9.14962 7.30477 9.30477 7.14962 9.4781 7.01662C9.78051 6.78457 10.1735 6.64681 10.8163 6.57435C11.4691 6.50074 12.3156 6.5 13.5 6.5C14.6844 6.5 15.5309 6.50074 16.1837 6.57435C16.8265 6.64681 17.2195 6.78457 17.5219 7.01662C17.6952 7.14962 17.8504 7.30477 17.9834 7.4781C18.2154 7.78051 18.3532 8.17346 18.4257 8.81625C18.4993 9.46912 18.5 10.3156 18.5 11.5V15.5C18.5 16.6844 18.4993 17.5309 18.4257 18.1837C18.3532 18.8265 18.2154 19.2195 17.9834 19.5219C17.8504 19.6952 17.6952 19.8504 17.5219 19.9834C17.2195 20.2154 16.8265 20.3532 16.1837 20.4257C15.5309 20.4993 14.6844 20.5 13.5 20.5C12.3156 20.5 11.4691 20.4993 10.8163 20.4257C10.1735 20.3532 9.78051 20.2154 9.4781 19.9834C9.30477 19.8504 9.14962 19.6952 9.01662 19.5219C8.78457 19.2195 8.64681 18.8265 8.57435 18.1837C8.50074 17.5309 8.5 16.6844 8.5 15.5V11.5Z" stroke="#222222"/>
|
||||||
</svg>`}]};static getMobileWritableItems=function(n){return[{type:"custom",id:"button-finish",className:"button-finish",onPress(){n("FINISH")},icon:`<svg class="icon" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="-4 -4 26 26">
|
</svg>`}]};static getMobileWritableItems=function(n){return[{type:"custom",id:"button-finish",className:"button-finish",onPress(){n("FINISH")},icon:`<svg class="icon" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="-4 -4 26 26">
|
||||||
|
|||||||
21
EnvelopeGenerator.Web/wwwroot/lib/bootstrap-icons/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2019-2024 The Bootstrap Authors
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
100
EnvelopeGenerator.Web/wwwroot/lib/bootstrap-icons/README.md
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
<p align="center">
|
||||||
|
<a href="https://getbootstrap.com/">
|
||||||
|
<img src="https://getbootstrap.com/docs/5.2/assets/brand/bootstrap-logo-shadow.png" alt="Bootstrap logo" width="200" height="165">
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3 align="center">Bootstrap Icons</h3>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
Official open source SVG icon library for Bootstrap with over 2,000 icons.
|
||||||
|
<br>
|
||||||
|
<a href="https://icons.getbootstrap.com/"><strong>Explore Bootstrap Icons »</strong></a>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<a href="https://getbootstrap.com/">Bootstrap</a>
|
||||||
|
·
|
||||||
|
<a href="https://themes.getbootstrap.com/">Themes</a>
|
||||||
|
·
|
||||||
|
<a href="https://blog.getbootstrap.com/">Blog</a>
|
||||||
|
<br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
[](https://icons.getbootstrap.com/)
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
Bootstrap Icons are packaged up and published to npm. We only include the processed SVGs in this package—it's up to you and your team to implement. [Read our docs](https://icons.getbootstrap.com/) for usage instructions.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
npm i bootstrap-icons
|
||||||
|
```
|
||||||
|
|
||||||
|
For those [using Packagist](https://packagist.org/packages/twbs/bootstrap-icons), you can also install Bootstrap Icons via Composer:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
composer require twbs/bootstrap-icons
|
||||||
|
```
|
||||||
|
|
||||||
|
[Also available in Figma](https://www.figma.com/community/file/1042482994486402696/Bootstrap-Icons).
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Depending on your setup, you can include Bootstrap Icons in a handful of ways.
|
||||||
|
|
||||||
|
- Copy-paste SVGs as embedded HTML
|
||||||
|
- Reference via `<img>` element
|
||||||
|
- Use the SVG sprite
|
||||||
|
- Include via CSS
|
||||||
|
|
||||||
|
[See the docs for more information](https://icons.getbootstrap.com/#usage).
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
[](https://github.com/twbs/icons/actions/workflows/test.yml?query=workflow%3ATests+branch%3Amain)
|
||||||
|
[](https://www.npmjs.com/package/bootstrap-icons)
|
||||||
|
|
||||||
|
Clone the repo, install dependencies, and start the Hugo server locally.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
git clone https://github.com/twbs/icons/
|
||||||
|
cd icons
|
||||||
|
npm i
|
||||||
|
npm start
|
||||||
|
```
|
||||||
|
|
||||||
|
Then open `http://localhost:4000` in your browser.
|
||||||
|
|
||||||
|
### npm scripts
|
||||||
|
|
||||||
|
Here are some key scripts you'll use during development. Be sure to look to our `package.json` or `npm run` output for a complete list of scripts.
|
||||||
|
|
||||||
|
| Script | Description |
|
||||||
|
|--------------|-------------------------------------------------------------------------------|
|
||||||
|
| `start` | Alias for running `docs-serve` |
|
||||||
|
| `docs-serve` | Starts a local Hugo server |
|
||||||
|
| `pages` | Generates permalink pages for each icon with template Markdown |
|
||||||
|
| `icons` | Processes and optimizes SVGs in `icons` directory, generates fonts and sprite |
|
||||||
|
|
||||||
|
## Adding SVGs
|
||||||
|
|
||||||
|
Icons are typically only added by @mdo, but exceptions can be made. New glyphs are designed in Figma first on a 16x16px grid, then exported as flattened SVGs with `fill` (no stroke). Once a new SVG icon has been added to the `icons` directory, we use an npm script to:
|
||||||
|
|
||||||
|
1. Optimize our SVGs with SVGO.
|
||||||
|
2. Modify the SVGs source code, removing all attributes before setting new attributes and values in our preferred order.
|
||||||
|
|
||||||
|
Use `npm run icons` to run the script, run `npm run pages` to build permalink pages, complete those pages, and, finally, commit the results in a new branch for updating.
|
||||||
|
|
||||||
|
**Warning**: Please exclude any auto-generated files, like `font/**` and `bootstrap-icons.svg` from your branch because they cause conflicts, and we generally update the dist files before a release.
|
||||||
|
|
||||||
|
## Publishing
|
||||||
|
|
||||||
|
Documentation is published automatically when a new Git tag is published. See our [GitHub Actions](https://github.com/twbs/icons/tree/main/.github/workflows) and [`package.json`](https://github.com/twbs/icons/blob/main/package.json) for more information.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
[MIT](LICENSE)
|
||||||
|
|
||||||
|
## Author
|
||||||
|
|
||||||
|
[@mdo](https://github.com/mdo)
|
||||||
|
After Width: | Height: | Size: 1.0 MiB |
2078
EnvelopeGenerator.Web/wwwroot/lib/bootstrap-icons/font/bootstrap-icons.css
vendored
Normal file
5
EnvelopeGenerator.Web/wwwroot/lib/bootstrap-icons/font/bootstrap-icons.min.css
vendored
Normal file
2090
EnvelopeGenerator.Web/wwwroot/lib/bootstrap-icons/font/bootstrap-icons.scss
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-0-circle-fill" viewBox="0 0 16 16">
|
||||||
|
<path d="M8 4.951c-1.008 0-1.629 1.09-1.629 2.895v.31c0 1.81.627 2.895 1.629 2.895s1.623-1.09 1.623-2.895v-.31c0-1.8-.621-2.895-1.623-2.895"/>
|
||||||
|
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0m-8.012 4.158c1.858 0 2.96-1.582 2.96-3.99V7.84c0-2.426-1.079-3.996-2.936-3.996-1.864 0-2.965 1.588-2.965 3.996v.328c0 2.42 1.09 3.99 2.941 3.99"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 476 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-0-circle" viewBox="0 0 16 16">
|
||||||
|
<path d="M7.988 12.158c-1.851 0-2.941-1.57-2.941-3.99V7.84c0-2.408 1.101-3.996 2.965-3.996 1.857 0 2.935 1.57 2.935 3.996v.328c0 2.408-1.101 3.99-2.959 3.99M8 4.951c-1.008 0-1.629 1.09-1.629 2.895v.31c0 1.81.627 2.895 1.629 2.895s1.623-1.09 1.623-2.895v-.31c0-1.8-.621-2.895-1.623-2.895"/>
|
||||||
|
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 507 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-0-square-fill" viewBox="0 0 16 16">
|
||||||
|
<path d="M8 4.951c-1.008 0-1.629 1.09-1.629 2.895v.31c0 1.81.627 2.895 1.629 2.895s1.623-1.09 1.623-2.895v-.31c0-1.8-.621-2.895-1.623-2.895"/>
|
||||||
|
<path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zm5.988 12.158c-1.851 0-2.941-1.57-2.941-3.99V7.84c0-2.408 1.101-3.996 2.965-3.996 1.857 0 2.935 1.57 2.935 3.996v.328c0 2.408-1.101 3.99-2.959 3.99"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 514 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-0-square" viewBox="0 0 16 16">
|
||||||
|
<path d="M7.988 12.158c-1.851 0-2.941-1.57-2.941-3.99V7.84c0-2.408 1.101-3.996 2.965-3.996 1.857 0 2.935 1.57 2.935 3.996v.328c0 2.408-1.101 3.99-2.959 3.99M8 4.951c-1.008 0-1.629 1.09-1.629 2.895v.31c0 1.81.627 2.895 1.629 2.895s1.623-1.09 1.623-2.895v-.31c0-1.8-.621-2.895-1.623-2.895"/>
|
||||||
|
<path d="M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2zm15 0a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 579 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-1-circle-fill" viewBox="0 0 16 16">
|
||||||
|
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0M9.283 4.002H7.971L6.072 5.385v1.271l1.834-1.318h.065V12h1.312z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 250 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-1-circle" viewBox="0 0 16 16">
|
||||||
|
<path d="M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8m15 0A8 8 0 1 1 0 8a8 8 0 0 1 16 0M9.283 4.002V12H7.971V5.338h-.065L6.072 6.656V5.385l1.899-1.383z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 279 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-1-square-fill" viewBox="0 0 16 16">
|
||||||
|
<path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zm7.283 4.002V12H7.971V5.338h-.065L6.072 6.656V5.385l1.899-1.383z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 286 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-1-square" viewBox="0 0 16 16">
|
||||||
|
<path d="M9.283 4.002V12H7.971V5.338h-.065L6.072 6.656V5.385l1.899-1.383z"/>
|
||||||
|
<path d="M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2zm15 0a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 366 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-123" viewBox="0 0 16 16">
|
||||||
|
<path d="M2.873 11.297V4.142H1.699L0 5.379v1.137l1.64-1.18h.06v5.961zm3.213-5.09v-.063c0-.618.44-1.169 1.196-1.169.676 0 1.174.44 1.174 1.106 0 .624-.42 1.101-.807 1.526L4.99 10.553v.744h4.78v-.99H6.643v-.069L8.41 8.252c.65-.724 1.237-1.332 1.237-2.27C9.646 4.849 8.723 4 7.308 4c-1.573 0-2.36 1.064-2.36 2.15v.057zm6.559 1.883h.786c.823 0 1.374.481 1.379 1.179.01.707-.55 1.216-1.421 1.21-.77-.005-1.326-.419-1.379-.953h-1.095c.042 1.053.938 1.918 2.464 1.918 1.478 0 2.642-.839 2.62-2.144-.02-1.143-.922-1.651-1.551-1.714v-.063c.535-.09 1.347-.66 1.326-1.678-.026-1.053-.933-1.855-2.359-1.845-1.5.005-2.317.88-2.348 1.898h1.116c.032-.498.498-.944 1.206-.944.703 0 1.206.435 1.206 1.07.005.64-.504 1.106-1.2 1.106h-.75z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 854 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-2-circle-fill" viewBox="0 0 16 16">
|
||||||
|
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0M6.646 6.24c0-.691.493-1.306 1.336-1.306.756 0 1.313.492 1.313 1.236 0 .697-.469 1.23-.902 1.705l-2.971 3.293V12h5.344v-1.107H7.268v-.077l1.974-2.22.096-.107c.688-.763 1.287-1.428 1.287-2.43 0-1.266-1.031-2.215-2.613-2.215-1.758 0-2.637 1.19-2.637 2.402v.065h1.271v-.07Z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 457 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-2-circle" viewBox="0 0 16 16">
|
||||||
|
<path d="M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8m15 0A8 8 0 1 1 0 8a8 8 0 0 1 16 0M6.646 6.24v.07H5.375v-.064c0-1.213.879-2.402 2.637-2.402 1.582 0 2.613.949 2.613 2.215 0 1.002-.6 1.667-1.287 2.43l-.096.107-1.974 2.22v.077h3.498V12H5.422v-.832l2.97-3.293c.434-.475.903-1.008.903-1.705 0-.744-.557-1.236-1.313-1.236-.843 0-1.336.615-1.336 1.306"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 477 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-2-square-fill" viewBox="0 0 16 16">
|
||||||
|
<path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zm4.646 6.24v.07H5.375v-.064c0-1.213.879-2.402 2.637-2.402 1.582 0 2.613.949 2.613 2.215 0 1.002-.6 1.667-1.287 2.43l-.096.107-1.974 2.22v.077h3.498V12H5.422v-.832l2.97-3.293c.434-.475.903-1.008.903-1.705 0-.744-.557-1.236-1.313-1.236-.843 0-1.336.615-1.336 1.306"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 484 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-2-square" viewBox="0 0 16 16">
|
||||||
|
<path d="M6.646 6.24v.07H5.375v-.064c0-1.213.879-2.402 2.637-2.402 1.582 0 2.613.949 2.613 2.215 0 1.002-.6 1.667-1.287 2.43l-.096.107-1.974 2.22v.077h3.498V12H5.422v-.832l2.97-3.293c.434-.475.903-1.008.903-1.705 0-.744-.557-1.236-1.313-1.236-.843 0-1.336.615-1.336 1.306"/>
|
||||||
|
<path d="M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2zm15 0a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 564 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-3-circle-fill" viewBox="0 0 16 16">
|
||||||
|
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0m-8.082.414c.92 0 1.535.54 1.541 1.318.012.791-.615 1.36-1.588 1.354-.861-.006-1.482-.469-1.54-1.066H5.104c.047 1.177 1.05 2.144 2.754 2.144 1.653 0 2.954-.937 2.93-2.396-.023-1.278-1.031-1.846-1.734-1.916v-.07c.597-.1 1.505-.739 1.482-1.876-.03-1.177-1.043-2.074-2.637-2.062-1.675.006-2.59.984-2.625 2.12h1.248c.036-.556.557-1.054 1.348-1.054.785 0 1.348.486 1.348 1.195.006.715-.563 1.237-1.342 1.237h-.838v1.072h.879Z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 607 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-3-circle" viewBox="0 0 16 16">
|
||||||
|
<path d="M7.918 8.414h-.879V7.342h.838c.78 0 1.348-.522 1.342-1.237 0-.709-.563-1.195-1.348-1.195-.79 0-1.312.498-1.348 1.055H5.275c.036-1.137.95-2.115 2.625-2.121 1.594-.012 2.608.885 2.637 2.062.023 1.137-.885 1.776-1.482 1.875v.07c.703.07 1.71.64 1.734 1.917.024 1.459-1.277 2.396-2.93 2.396-1.705 0-2.707-.967-2.754-2.144H6.33c.059.597.68 1.06 1.541 1.066.973.006 1.6-.563 1.588-1.354-.006-.779-.621-1.318-1.541-1.318"/>
|
||||||
|
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 642 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-3-square-fill" viewBox="0 0 16 16">
|
||||||
|
<path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zm5.918 8.414h-.879V7.342h.838c.78 0 1.348-.522 1.342-1.237 0-.709-.563-1.195-1.348-1.195-.79 0-1.312.498-1.348 1.055H5.275c.036-1.137.95-2.115 2.625-2.121 1.594-.012 2.608.885 2.637 2.062.023 1.137-.885 1.776-1.482 1.875v.07c.703.07 1.71.64 1.734 1.917.024 1.459-1.277 2.396-2.93 2.396-1.705 0-2.707-.967-2.754-2.144H6.33c.059.597.68 1.06 1.541 1.066.973.006 1.6-.563 1.588-1.354-.006-.779-.621-1.318-1.541-1.318"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 634 B |