Author SHA1 Message Date
ivanszabo 717becd1fc ServerSide Paging 2026-08-02 16:36:21 +02:00
ivanszabo 92acb42601 Na most jó a lapozás 2026-03-09 11:32:12 +01:00
ivanszabo 53dc9b326a Ez most szerver oldalon szűr és lapoz 2026-03-02 14:12:43 +01:00
ivanszabo ea9673c29b Login secure problem 2026-01-28 13:46:16 +01:00
ivanszabo 4c7e24c478 1.1.32 kiadás 2026-01-28 12:48:21 +01:00
ivanszabo c11ff65a3e Ellenőrzések szétválasztása + sorrend 2026-01-28 12:47:43 +01:00
ivanszabo 8c0796eb69 satatables hu language pack lokálisan 2026-01-28 11:54:11 +01:00
ivanszabo 10ad411b5e appsettings beállítása fejlesztéshez 2026-01-28 11:53:52 +01:00
ivanszabo 8d766ab988 publish cmd 2026-01-28 11:18:26 +01:00
ivanszabo 8177a60351 - 2026-01-21 13:01:06 +01:00
ivanszabo 0fd073755e Password első felhasználó rögzítésénél hiba 2026-01-21 12:59:56 +01:00
ivanszabo 6ea799dcdf WS2016DC\\SQLEXPRESS javítása 2026-01-21 10:22:33 +01:00
ivanszabo caf9746443 API pulish.cmd kiegészítése 2026-01-21 09:35:09 +01:00
ivanszabo 41542e492d E-mail küldése 10 próbálkozásra, 2 mp-es várakozással 2026-01-21 09:19:22 +01:00
ivanszabo 4f4ca5cec4 Login és ChangePassword formok változtatása spinner kiegészítés 2026-01-20 10:10:52 +01:00
ivanszabo f480269bc5 Maximumart gépre átállás VS 2026 2026-01-20 10:09:59 +01:00
ivanszabo 24c49567aa BUGFIX valu mentésére 2025-07-07 14:57:40 +02:00
ivanszabo affad21ab0 BUGFIX mentés, scrollozás 2025-07-03 08:55:09 +02:00
ivanszabo a646258837 Elvileg jó, meg a mentés is. 2025-07-02 19:38:33 +02:00
52 changed files with 911 additions and 151 deletions
+2 -2
View File
@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17 # Visual Studio Version 18
VisualStudioVersion = 17.12.35527.113 VisualStudioVersion = 18.2.11408.102 d18.0
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WorkFlowCheck.API", "WorkFlowCheck.API\WorkFlowCheck.API.csproj", "{2466E04A-CB0C-4421-9074-A928F819926C}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WorkFlowCheck.API", "WorkFlowCheck.API\WorkFlowCheck.API.csproj", "{2466E04A-CB0C-4421-9074-A928F819926C}"
EndProject EndProject
@@ -2,6 +2,7 @@
using Serilog; using Serilog;
using WorkFlowCheck.BL.Services; using WorkFlowCheck.BL.Services;
using WorkFlowCheck.BL.Services.Interfaces; using WorkFlowCheck.BL.Services.Interfaces;
using WorkFlowCheck.Common.DataTables;
using WorkFlowCheck.Common.DTO; using WorkFlowCheck.Common.DTO;
namespace WorkFlowCheck.API.Controllers namespace WorkFlowCheck.API.Controllers
@@ -39,6 +40,28 @@ namespace WorkFlowCheck.API.Controllers
return retVal; return retVal;
} }
[HttpPost("GetFilteredCheckListHeader")]
public async Task<ApiResponseListDTO<List<CheckListHeaderDTO>>> GetFilteredCheckListHeader([FromBody] DataTablesRequest dataTablesRequest)
{
var retVal = new ApiResponseListDTO<List<CheckListHeaderDTO>>()
{
IsSuccess = true
};
try
{
var result = await _checkListService.GetFilteredCheckListHeaderAsync(dataTablesRequest);
retVal.Data = result.Data;
retVal.Total = result.Total;
retVal.Filtered = result.Filtered;
}
catch (Exception ex)
{
retVal.IsSuccess = false;
Log.Error(ex.Message);
}
return retVal;
}
[HttpGet("CreatePDF/{id}")] [HttpGet("CreatePDF/{id}")]
public async Task<ApiResponseDTO<byte[]>> CreatePDF(int id) public async Task<ApiResponseDTO<byte[]>> CreatePDF(int id)
{ {
@@ -63,14 +86,14 @@ namespace WorkFlowCheck.API.Controllers
return retVal; return retVal;
} }
[HttpGet("GetAllCheckListHeaders")] [HttpGet("GetAllCheckListHeaders/{mode}")]
public async Task<ApiResponseDTO<List<CheckListHeaderDTO>>> GetAllCheckListHeadersAsync() public async Task<ApiResponseDTO<List<CheckListHeaderDTO>>> GetAllCheckListHeadersAsync(int mode = 0)
{ {
var retVal = new ApiResponseDTO<List<CheckListHeaderDTO>>() var retVal = new ApiResponseDTO<List<CheckListHeaderDTO>>()
{ {
IsSuccess = true, IsSuccess = true,
}; };
var checkPointListDTO = await _checkListService.GetAllCheckListHeaderAsync(); var checkPointListDTO = await _checkListService.GetAllCheckListHeaderAsync(mode);
if (checkPointListDTO != null) if (checkPointListDTO != null)
{ {
@@ -17,6 +17,16 @@
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} }
},
"WSL": {
"commandName": "WSL2",
"launchBrowser": true,
"launchUrl": "https://localhost:5069/swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"ASPNETCORE_URLS": "https://localhost:5069"
},
"distributionName": ""
} }
}, },
"$schema": "http://json.schemastore.org/launchsettings.json", "$schema": "http://json.schemastore.org/launchsettings.json",
@@ -10,6 +10,7 @@
<InvariantGlobalization>false</InvariantGlobalization> <InvariantGlobalization>false</InvariantGlobalization>
<PublishAot>false</PublishAot> <PublishAot>false</PublishAot>
<IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled> <IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled>
<UserSecretsId>4081cb25-5ca2-40a1-a788-0d8396b4f50e</UserSecretsId>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\WorkFlowCheck.BL\WorkFlowCheck.BL.csproj" /> <ProjectReference Include="..\WorkFlowCheck.BL\WorkFlowCheck.BL.csproj" />
@@ -9,5 +9,12 @@
"Default": "Information", "Default": "Information",
"Microsoft.AspNetCore": "Warning" "Microsoft.AspNetCore": "Warning"
} }
},
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:59027"
}
}
} }
} }
+14 -2
View File
@@ -1,2 +1,14 @@
dotnet publish -c Release -o e:\wfcapi\ @echo off
pause
REM ha van paraméter, azt használjuk, különben default
set PUBLISH_DIR=%1
if "%PUBLISH_DIR%"=="" (
set PUBLISH_DIR=c:\Publish\wfcapi
)
echo Publish to: %PUBLISH_DIR%
dotnet publish -c Release -o "%PUBLISH_DIR%"
pause
@@ -15,6 +15,7 @@ using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using WorkFlowCheck.BL.DocumentGenerator; using WorkFlowCheck.BL.DocumentGenerator;
using WorkFlowCheck.BL.Services.Interfaces; using WorkFlowCheck.BL.Services.Interfaces;
using WorkFlowCheck.Common.DataTables;
using WorkFlowCheck.Common.DTO; using WorkFlowCheck.Common.DTO;
using WorkFlowCheck.Common.Enums; using WorkFlowCheck.Common.Enums;
using WorkFlowCheck.DL; using WorkFlowCheck.DL;
@@ -81,21 +82,103 @@ namespace WorkFlowCheck.BL.Services
return retVal; return retVal;
} }
public async Task<List<CheckListHeaderDTO>> GetAllCheckListHeaderAsync() public async Task<ApiResponseListDTO<List<CheckListHeaderDTO>>> GetFilteredCheckListHeaderAsync(DataTablesRequest req)
{
var retVal = new ApiResponseListDTO<List<CheckListHeaderDTO>>();
try
{
var baseQuery = _dbContext.CheckListHeaders
.AsNoTracking()
.Where(x => !x.IsDeleted);
// MODE szűrés (csak WHERE, ORDER BY nélkül)
IQueryable<CheckListHeader> modeQuery = req.Mode switch
{
0 => baseQuery.Where(w => w.CheckStatus == CheckStatus.InProgress || w.CheckStatus == CheckStatus.Open),
1 => baseQuery.Where(w => w.CheckStatus == CheckStatus.Sent),
2 => baseQuery.Where(w => w.CheckStatus == CheckStatus.Closed),
3 => baseQuery.Where(w => w.CheckStatus == CheckStatus.Signed),
_ => baseQuery
};
// Total = mode szűrés után, keresés előtt
retVal.Total = await modeQuery.CountAsync();
// Search
var search = req.Search?.Value?.Trim();
IQueryable<CheckListHeader> filteredQuery = modeQuery;
if (!string.IsNullOrWhiteSpace(search))
{
filteredQuery = filteredQuery.Where(x =>
x.DocumentNumber.Contains(search) ||
(x.ShortName != null && x.ShortName.Contains(search)) ||
(x.Description != null && x.Description.Contains(search)) ||
(x.CreatedBy != null && x.CreatedBy.Contains(search)) ||
(x.AcceptUser != null && x.AcceptUser.UserName.Contains(search))
);
}
retVal.Filtered = await filteredQuery.CountAsync();
// Ordering (itt már jöhet)
filteredQuery = filteredQuery.OrderByDescending(o => o.CreatedAt);
// Paging
var list = await filteredQuery
.Include(x => x.CheckListRows)
.Include(x => x.User)
.Include(x => x.AcceptUser)
.AsSplitQuery()
.Skip(req.Start)
.Take(req.Length)
.ToListAsync();
retVal.Data = _mapper.Map<List<CheckListHeaderDTO>>(list);
}
catch (Exception ex)
{
Log.Error(ex, "GetFilteredCheckListHeaderAsync failed");
}
return retVal;
}
public async Task<List<CheckListHeaderDTO>> GetAllCheckListHeaderAsync(int mode = 0)
{ {
var retVal = new List<CheckListHeaderDTO>(); var retVal = new List<CheckListHeaderDTO>();
try try
{ {
var checkListHeaders = await _dbContext.CheckListHeaders IQueryable<CheckListHeader> query = _dbContext.CheckListHeaders
.Include(i => i.CheckListRows) .Include(i => i.CheckListRows)
.Include(i => i.User) .Include(i => i.User)
.Include(i => i.AcceptUser) .Include(i => i.AcceptUser)
.AsNoTracking() .AsNoTracking();
.ToListAsync(); switch (mode)
if (checkListHeaders != null)
{ {
retVal = _mapper.Map<List<CheckListHeaderDTO>>(checkListHeaders); case 0:
query = query.Where(w => w.CheckStatus == CheckStatus.InProgress || w.CheckStatus == CheckStatus.Open).OrderByDescending(o => o.CreatedAt);
break;
case 1:
query = query.Where(w => w.CheckStatus == CheckStatus.Sent).OrderByDescending(o => o.CreatedAt);
break;
case 2:
query = query.Where(w => w.CheckStatus == CheckStatus.Closed).OrderByDescending(o => o.CreatedAt);
break;
case 3:
query = query.Where(w => w.CheckStatus == CheckStatus.Signed).OrderByDescending(o => o.CreatedAt);
break;
default:
query = query.OrderByDescending(o => o.CreatedAt);
break;
} }
var list = await query.ToListAsync();
retVal = _mapper.Map<List<CheckListHeaderDTO>>(list);
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -285,7 +368,7 @@ namespace WorkFlowCheck.BL.Services
} }
catch (Exception ex) catch (Exception ex)
{ {
Log.Error(ex.Message);
} }
} }
@@ -320,7 +403,7 @@ namespace WorkFlowCheck.BL.Services
gen.SimpleReplace("#WorkUser#", $"{checkListHeader.UserDTO?.LastName} {checkListHeader.UserDTO?.FirstName}"); gen.SimpleReplace("#WorkUser#", $"{checkListHeader.UserDTO?.LastName} {checkListHeader.UserDTO?.FirstName}");
gen.SimpleReplace("#AcceptUser#", $"{checkListHeader.AcceptUserDTO?.LastName} {checkListHeader.AcceptUserDTO?.FirstName}"); gen.SimpleReplace("#AcceptUser#", $"{checkListHeader.AcceptUserDTO?.LastName} {checkListHeader.AcceptUserDTO?.FirstName}");
gen.SimpleReplace("#Guid#", checkListHeader.GuidNumber.ToString()); gen.SimpleReplace("#Guid#", checkListHeader.GuidNumber.ToString());
if (checkListHeader.CheckListRowDTO != null && checkListHeader.CheckListRowDTO.Count > 0) if (checkListHeader.CheckListRowDTO != null && checkListHeader.CheckListRowDTO.Count > 0)
{ {
var elements = new List<List<string>>(); var elements = new List<List<string>>();
@@ -1,4 +1,5 @@
using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.Rendering;
using WorkFlowCheck.Common.DataTables;
using WorkFlowCheck.Common.DTO; using WorkFlowCheck.Common.DTO;
namespace WorkFlowCheck.BL.Services.Interfaces namespace WorkFlowCheck.BL.Services.Interfaces
@@ -6,12 +7,13 @@ namespace WorkFlowCheck.BL.Services.Interfaces
public interface ICheckListService public interface ICheckListService
{ {
Task<CheckListHeaderDTO> GetCheckListHeaderAsync(int Id); Task<CheckListHeaderDTO> GetCheckListHeaderAsync(int Id);
Task<List<CheckListHeaderDTO>> GetAllCheckListHeaderAsync(); Task<ApiResponseListDTO<List<CheckListHeaderDTO>>> GetFilteredCheckListHeaderAsync(DataTablesRequest dataTablesRequest);
Task<List<CheckListHeaderDTO>> GetAllCheckListHeaderAsync(int mode = 0);
Task<CheckListHeaderDTO> UpdateCheckListHeaderAsync(CheckListHeaderDTO checkListHeaderDTO); Task<CheckListHeaderDTO> UpdateCheckListHeaderAsync(CheckListHeaderDTO checkListHeaderDTO);
Task<bool> AcceptCheckListHeaderAsync(int id, int userid); Task<bool> AcceptCheckListHeaderAsync(int id, int userid);
Task<bool> BlockCheckListHeaderAsync(int id, int userid); Task<bool> BlockCheckListHeaderAsync(int id, int userid);
Task<bool> UnBlockCheckListHeaderAsync(int id, int userid); Task<bool> UnBlockCheckListHeaderAsync(int id, int userid);
Task<bool> CloseCheckListHeader(CheckListHeaderCloseDTO closeCheckListHeaderCloseDTO); Task<bool> CloseCheckListHeader(CheckListHeaderCloseDTO closeCheckListHeaderCloseDTO);
Task<byte[]> CreateCheckListHeaderPDFAsync(int checkListHeaderId); Task<byte[]> CreateCheckListHeaderPDFAsync(int checkListHeaderId);
Task<CheckListHeaderDTO> StartNewCheckListAsync(CheckListHeaderNewDTO checkListHeaderNewDTO); Task<CheckListHeaderDTO> StartNewCheckListAsync(CheckListHeaderNewDTO checkListHeaderNewDTO);
@@ -22,13 +24,13 @@ namespace WorkFlowCheck.BL.Services.Interfaces
Task<bool> DeleteCheckListTemplateHeaderAsync(int id); Task<bool> DeleteCheckListTemplateHeaderAsync(int id);
Task<bool> CloneCheckListTemplateHeaderAsync(int id); Task<bool> CloneCheckListTemplateHeaderAsync(int id);
Task<CheckListTemplateRowDTO> GetCheckListTemplateRowAsync(int id); Task<CheckListTemplateRowDTO> GetCheckListTemplateRowAsync(int id);
Task<bool> DeleteCheckListTemplateRowAsync(int id); Task<bool> DeleteCheckListTemplateRowAsync(int id);
Task<CheckListTemplateRowDTO> UpdateCheckListTemplateRowAsync(CheckListTemplateRowDTO checkListTemplateRowDTO); Task<CheckListTemplateRowDTO> UpdateCheckListTemplateRowAsync(CheckListTemplateRowDTO checkListTemplateRowDTO);
Task<CheckListRowDTO> GetCheckListRowAsync(int id); Task<CheckListRowDTO> GetCheckListRowAsync(int id);
Task<CheckListRowDTO> UpdateCheckListRowAsync(CheckListRowDTO checkListRowDTO); Task<CheckListRowDTO> UpdateCheckListRowAsync(CheckListRowDTO checkListRowDTO);
} }
@@ -51,11 +51,43 @@ namespace WorkFlowCheck.BL.Services
} }
message.Body = builder.ToMessageBody(); message.Body = builder.ToMessageBody();
using var smtp = new SmtpClient(); const int maxRetries = 10;
await smtp.ConnectAsync(_settings.SmtpServer, _settings.SmtpPort, SecureSocketOptions.StartTls); const int delayMs = 2000;
await smtp.AuthenticateAsync(_settings.Username, _settings.Password);
await smtp.SendAsync(message); bool authenticated = false;
await smtp.DisconnectAsync(true); Exception lastException = null;
for (int attempt = 1; attempt <= maxRetries; attempt++)
{
try
{
using var smtp = new SmtpClient();
await smtp.ConnectAsync(_settings.SmtpServer, _settings.SmtpPort, SecureSocketOptions.StartTls);
await smtp.AuthenticateAsync(_settings.Username, _settings.Password);
await smtp.SendAsync(message);
await smtp.DisconnectAsync(true);
authenticated = true;
break; // 🎯 siker
}
catch (Exception ex)
{
lastException = ex;
Log.ForContext("TAG", "BusinessFlow").Error(lastException?.Message ?? "E-mail küldése sikertelen!");
if (attempt == maxRetries)
break;
// ⏳ várunk 1 másodpercet és újrapróbáljuk
await Task.Delay(delayMs);
}
}
if (!authenticated)
{
// 🔴 IDE ÍRHATSZ MAJD SAJÁT LOGIKÁT
Log.ForContext("TAG", "BusinessFlow").Error(lastException?.Message ?? "E-mail küldése sikertelen!");
}
return true; return true;
} }
+2 -2
View File
@@ -141,7 +141,7 @@ namespace WorkFlowCheck.BL.Services
var user = await _dbContext.Users var user = await _dbContext.Users
.Include(i => i.UserRoles) .Include(i => i.UserRoles)
.ThenInclude(i => i.Role) .ThenInclude(i => i.Role)
.Where(w => w.UserName == userName) .Where(w => w.UserName == userName && w.Active == true)
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
if (user != null && PasswordHasher.VerifyPassword(user.PasswordHash, password)) if (user != null && PasswordHasher.VerifyPassword(user.PasswordHash, password))
{ {
@@ -400,7 +400,7 @@ namespace WorkFlowCheck.BL.Services
user.Active = userDTO.Active; user.Active = userDTO.Active;
user.NFCActive = userDTO.NFCActive; user.NFCActive = userDTO.NFCActive;
user.NFCCode = userDTO.NFCCode; user.NFCCode = userDTO.NFCCode;
await _dbContext.SaveChangesAsync(); await _dbContext.SaveChangesAsync();
retVal = _mapper.Map<UserDTO>(user); retVal = _mapper.Map<UserDTO>(user);
@@ -35,9 +35,11 @@ namespace WorkFlowCheck.Common.DTO
{ {
public T Data { get; set; } public T Data { get; set; }
} }
public class ApiResponseListDTO<T> : ApiResponseBaseDTO public class ApiResponseListDTO<T> : ApiResponseBaseDTO
{ {
public T[] Data { get; set; } public T Data { get; set; }
public int Total { get; set; } public int Total { get; set; }
public int Filtered { get; set; }
} }
} }
@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.Common.DataTables
{
public class DataTablesRequest
{
public int Mode { get; set; }
public int Draw { get; set; }
public int Start { get; set; }
public int Length { get; set; }
public DataTablesSearch Search { get; set; } = new();
public List<DataTablesOrder> Order { get; set; } = new();
public List<DataTablesColumn> Columns { get; set; } = new();
}
public class DataTablesSearch { public string? Value { get; set; } }
public class DataTablesOrder { public int Column { get; set; } public string? Dir { get; set; } }
public class DataTablesColumn { public string? Data { get; set; } public bool Searchable { get; set; } public bool Orderable { get; set; } }
}
@@ -34,6 +34,8 @@ namespace WorkFlowCheck.Common.Security
// Jelszó ellenőrzése // Jelszó ellenőrzése
public static bool VerifyPassword(string storedPasswordHash, string inputPassword) public static bool VerifyPassword(string storedPasswordHash, string inputPassword)
{ {
var inputPasswordHash = HashPassword(inputPassword);
byte[] hashBytes = Convert.FromBase64String(storedPasswordHash); byte[] hashBytes = Convert.FromBase64String(storedPasswordHash);
// Extract salt (first 16 bytes) and stored hash (next 32 bytes) // Extract salt (first 16 bytes) and stored hash (next 32 bytes)
@@ -0,0 +1,62 @@
using SkiaSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkFlowCheck.MAUI.Helper
{
public static class ImageHelper
{
public static string ResizeAndSaveImage(byte[] imageBytes, int id, int targetWidth = 50)
{
// Átméretezett fájl elérési útja
var filename = Path.Combine(FileSystem.CacheDirectory, $"wfc_{id}_photo.jpg");
if (File.Exists(filename))
{
try
{
File.Delete(filename);
// opcionálisan logolhatsz
// Console.WriteLine($"Törölve: {filename}");
}
catch (Exception ex)
{
//Console.WriteLine($"Hiba a fájl törlésekor: {ex.Message}");
}
}
// Eredeti kép betöltése
using var inputStream = new MemoryStream(imageBytes);
using var original = SKBitmap.Decode(inputStream);
if (original == null)
throw new InvalidOperationException("A kép nem olvasható vagy hibás.");
// Új szélesség és magasság arányosan
int targetHeight = (int)(original.Height * ((double)targetWidth / original.Width));
// Új üres bitmap létrehozása
using var resizedSurface = SKSurface.Create(new SKImageInfo(targetWidth, targetHeight));
using var canvas = resizedSurface.Canvas;
canvas.Clear(SKColors.White); // választható háttérszín
var srcRect = new SKRect(0, 0, original.Width, original.Height);
var destRect = new SKRect(0, 0, targetWidth, targetHeight);
canvas.DrawBitmap(original, srcRect, destRect);
using var resizedImage = resizedSurface.Snapshot();
using var imageData = resizedImage.Encode(SKEncodedImageFormat.Jpeg, 90);
// Mentés fájlba
using var fileStream = File.OpenWrite(filename);
imageData.SaveTo(fileStream);
return filename;
}
}
}
@@ -19,7 +19,7 @@ namespace WorkFlowCheck.MAUI.Helper
public static string DatabaseName = ""; public static string DatabaseName = "";
public static bool Syncronised = false; public static bool Syncronised = false;
public static UserDTO SystemUserDTO; public static UserDTO SystemUserDTO;
public static string ProgramVersion = "v1.1.036"; public static string ProgramVersion = "v1.1.039";
#if DEBUG #if DEBUG
//public static string ApiBaseUrl = $"http://10.0.2.2:59027/"; //public static string ApiBaseUrl = $"http://10.0.2.2:59027/";
@@ -1,23 +1,27 @@
using System.ComponentModel; using SkiaSharp;
using System.ComponentModel;
using WorkFlowCheck.Common.DTO; using WorkFlowCheck.Common.DTO;
using WorkFlowCheck.MAUI.Helper;
namespace WorkFlowCheck.MAUI.Pages.CheckList namespace WorkFlowCheck.MAUI.Pages.CheckList
{ {
public class CheckListRowCS : INotifyPropertyChanged public class CheckListRowCS : INotifyPropertyChanged
{ {
private byte[] _photoBytes; private byte[] _photoBytes;
private ImageSource? _photo; //private ImageSource? _photo;
private string? _photoPath;
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler PropertyChanged;
public int Id { get; set; } public int Id { get; set; }
public string AnswerType { get; set; } = null!; public string AnswerType { get; set; } = null!;
public int RowIndex { get; set; } public int RowIndex { get; set; }
public string OperationDescription { get; set; } = null!; public string OperationDescription { get; set; } = null!;
public string GroupName { get; set; } = null!; public string GroupName { get; set; } = null!;
public string Answer { get; set; } = null!; public string Answer { get; set; } = null!;
public bool? AnswerYes { get; set; } = null!; public bool? AnswerYes { get; set; } = null!;
public bool? AnswerNo { get; set; } = null!; public bool? AnswerNo { get; set; } = null!;
public byte[] PhotoBytes public byte[] PhotoBytes
{ {
get => _photoBytes; get => _photoBytes;
@@ -26,37 +30,58 @@ namespace WorkFlowCheck.MAUI.Pages.CheckList
if (_photoBytes != value) if (_photoBytes != value)
{ {
_photoBytes = value; _photoBytes = value;
_photo = null; //_photo = null;
OnPropertyChanged(nameof(PhotoBytes)); _photoPath = null;
OnPropertyChanged(nameof(Photo)); //OnPropertyChanged(nameof(PhotoBytes));
//OnPropertyChanged(nameof(Photo));
OnPropertyChanged(nameof(PhotoPath));
} }
} }
} }
public ImageSource Photo //public ImageSource Photo
//{
// get
// {
// if (_photo == null)
// {
// if (PhotoBytes != null && PhotoBytes.Length > 0)
// {
// try
// {
// var bytesCopy = PhotoBytes.ToArray();
// _photo = ImageSource.FromStream(() => new MemoryStream(bytesCopy));
// }
// catch
// {
// _photo = ImageSource.FromFile("noimage.png");
// }
// }
// else
// {
// _photo = ImageSource.FromFile("noimage.png");
// }
// }
// return _photo;
// }
//}
public string PhotoPath
{ {
get get
{ {
if (_photo == null) if (_photoPath == null)
{ {
if (PhotoBytes != null && PhotoBytes.Length > 0) if (PhotoBytes != null && PhotoBytes.Length > 0)
{ {
try _photoPath = ImageHelper.ResizeAndSaveImage(PhotoBytes, Id, 100);
{
var bytesCopy = PhotoBytes.ToArray();
_photo = ImageSource.FromStream(() => new MemoryStream(bytesCopy));
}
catch
{
_photo = ImageSource.FromFile("noimage.png");
}
} }
else else
{ {
_photo = ImageSource.FromFile("noimage.png"); _photoPath = "noimage.png";
} }
} }
return _photoPath;
return _photo;
} }
} }
@@ -130,12 +130,12 @@
<Label Text="{Binding OperationDescription}" BackgroundColor="WhiteSmoke" Grid.Column="1" /> <Label Text="{Binding OperationDescription}" BackgroundColor="WhiteSmoke" Grid.Column="1" />
<Grid Grid.Column="2" ColumnDefinitions="Auto,Auto" VerticalOptions="Center"> <Grid Grid.Column="2" ColumnDefinitions="Auto,Auto" VerticalOptions="Center">
<Image Grid.Column="0" <Image Grid.Column="0"
WidthRequest="95" WidthRequest="65"
HeightRequest="120" HeightRequest="90"
Aspect="AspectFill" Aspect="AspectFill"
Margin="0,0,10,0" Margin="0,0,10,0"
VerticalOptions="Center" VerticalOptions="Center"
Source="{Binding Photo}" > Source="{Binding PhotoPath}" >
</Image> </Image>
<Button Text="📷" Grid.Column="1" <Button Text="📷" Grid.Column="1"
VerticalOptions="Center" VerticalOptions="Center"
@@ -162,6 +162,7 @@
<Entry Grid.Column="3" <Entry Grid.Column="3"
Text="{Binding Answer}" Text="{Binding Answer}"
HorizontalTextAlignment="Center" HorizontalTextAlignment="Center"
TextChanged="V_Entry_Text_Changed"
VerticalOptions="Center" /> VerticalOptions="Center" />
</Grid> </Grid>
</Frame> </Frame>
@@ -124,14 +124,19 @@ public partial class CheckListWorkPage : ContentPage
if (checkListRowDTO != null) if (checkListRowDTO != null)
{ {
if (checkListRowDTO.AnswerYes == true) checkListRowDTO.Answer = checkListRowCS.Answer;
if (checkListRowCS.AnswerYes == true)
{ {
checkListRowDTO.Answer = "Igen"; checkListRowDTO.Answer = "Igen";
} }
if (checkListRowDTO.AnswerNo == true) else if (checkListRowCS.AnswerNo == true)
{ {
checkListRowDTO.Answer = "Nem"; checkListRowDTO.Answer = "Nem";
} }
else
{
checkListRowDTO.Answer = checkListRowCS.Answer;
}
await _checkListService.UpdateCheckListRow(checkListRowDTO, withReload); await _checkListService.UpdateCheckListRow(checkListRowDTO, withReload);
} }
} }
@@ -182,7 +187,7 @@ public partial class CheckListWorkPage : ContentPage
{ {
if (MediaPicker.IsCaptureSupported) if (MediaPicker.IsCaptureSupported)
{ {
await OnSave(false); //await OnSave(false);
var photo = await MediaPicker.CapturePhotoAsync(); var photo = await MediaPicker.CapturePhotoAsync();
if (photo != null) if (photo != null)
{ {
@@ -192,11 +197,11 @@ public partial class CheckListWorkPage : ContentPage
var checkListRowDTO = CheckListRowDTOs.FirstOrDefault(w => w.Id == checkListRowCS.Id); var checkListRowDTO = CheckListRowDTOs.FirstOrDefault(w => w.Id == checkListRowCS.Id);
if (checkListRowDTO != null) if (checkListRowDTO != null)
{ {
checkListRowDTO.Photo = checkListRowCS.PhotoBytes; checkListRowDTO.Photo = checkListRowCS.PhotoBytes;
checkListRowDTO.Answer = "Igen"; checkListRowDTO.Answer = "Igen";
await _checkListService.UpdateCheckListRow(checkListRowDTO, true); await _checkListService.UpdateCheckListRow(checkListRowDTO, true);
await LoadCheckPointCheckListRows(); //await LoadCheckPointCheckListRows();
} }
} }
} }
@@ -249,6 +254,15 @@ public partial class CheckListWorkPage : ContentPage
IsLoading = false; IsLoading = false;
} }
private void V_Entry_Text_Changed(object sender, TextChangedEventArgs e)
{
var entry = sender as Entry;
var model = entry?.BindingContext as CheckListRowCS;
if (model != null)
{
model.Answer = e.NewTextValue;
}
}
} }
public class BindableRadioButton : RadioButton public class BindableRadioButton : RadioButton
{ {
@@ -274,12 +288,12 @@ public class BindableRadioButton : RadioButton
} }
private void OnCheckedChangedInternal(object sender, CheckedChangedEventArgs e) private void OnCheckedChangedInternal(object sender, CheckedChangedEventArgs e)
{ {
if (e.Value && BindingContext is CheckListRowDTO dto) if (e.Value && BindingContext is CheckListRowCS checkListRowCS)
{ {
if (Value?.ToString() == "Igen") if (Value?.ToString() == "Igen")
dto.Answer = "Igen"; checkListRowCS.Answer = "Igen";
else if (Value?.ToString() == "Nem") else if (Value?.ToString() == "Nem")
dto.Answer = "Nem"; checkListRowCS.Answer = "Nem";
} }
} }
@@ -287,12 +301,12 @@ public class BindableRadioButton : RadioButton
{ {
base.OnBindingContextChanged(); base.OnBindingContextChanged();
if (BindingContext is CheckListRowDTO dto) if (BindingContext is CheckListRowCS checkListRowCS)
{ {
if (Value?.ToString() == "Igen") if (Value?.ToString() == "Igen")
IsChecked = dto.Answer == "Igen"; IsChecked = checkListRowCS.Answer == "Igen";
else if (Value?.ToString() == "Nem") else if (Value?.ToString() == "Nem")
IsChecked = dto.Answer == "Nem"; IsChecked = checkListRowCS.Answer == "Nem";
} }
} }
} }
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

@@ -167,10 +167,17 @@ namespace WorkFlowCheck.MAUI.Services
.Where(w => w.Id == checkListRowDTO.Id).FirstOrDefaultAsync(); .Where(w => w.Id == checkListRowDTO.Id).FirstOrDefaultAsync();
if (checkListRow != null) if (checkListRow != null)
{ {
checkListRow.Answer = checkListRowDTO.Answer; if (checkListRow.Answer != checkListRowDTO.Answer)
{
checkListRow.Answer = checkListRowDTO.Answer;
}
if (checkListRowDTO.Photo != null && checkListRowDTO.Photo.Length > 0 && withPhoto) if (checkListRowDTO.Photo != null && checkListRowDTO.Photo.Length > 0 && withPhoto)
{ {
checkListRow.Photo = checkListRowDTO.Photo; if (!checkListRow.Photo.SequenceEqual(checkListRowDTO.Photo ?? Array.Empty<byte>()))
{
checkListRow.Photo = checkListRowDTO.Photo ?? Array.Empty<byte>();
}
} }
await _dbContext.SaveChangesAsync(); await _dbContext.SaveChangesAsync();
} }
@@ -321,7 +328,8 @@ namespace WorkFlowCheck.MAUI.Services
.Include(i => i.CheckListTemplateRow) .Include(i => i.CheckListTemplateRow)
.ThenInclude(i => i.CheckPoint) .ThenInclude(i => i.CheckPoint)
.Where(w => w.CheckListHeaderId == checkListHeaderDTO.Id .Where(w => w.CheckListHeaderId == checkListHeaderDTO.Id
&& string.IsNullOrEmpty(w.Answer.Trim())) && string.IsNullOrEmpty(w.Answer.Trim())
&& w.CheckListTemplateRow.AnswerType != "PN")
.Select(w => w.CheckListTemplateRow.CheckPoint) .Select(w => w.CheckListTemplateRow.CheckPoint)
.OrderBy(cp => cp.ShortName) .OrderBy(cp => cp.ShortName)
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
@@ -7,7 +7,7 @@ namespace WorkFlowCheck.Web.Helpers
public static class SystemHelper public static class SystemHelper
{ {
public static string DatabaseName = ""; public static string DatabaseName = "";
public static string ProgramVersion = "v1.1.030"; public static string ProgramVersion = "v1.1.032";
public async static Task GetAPIInfoAsync(IConfiguration configuration) public async static Task GetAPIInfoAsync(IConfiguration configuration)
{ {
@@ -21,6 +21,15 @@
<div class="card shadow p-4" style="min-width: 350px; max-width: 400px; width: 100%;"> <div class="card shadow p-4" style="min-width: 350px; max-width: 400px; width: 100%;">
<h2 class="mb-4 text-center">Jelszó módosítása</h2> <h2 class="mb-4 text-center">Jelszó módosítása</h2>
<!-- Loading overlay -->
<div id="formLoading" class="position-absolute top-0 start-0 w-100 h-100 d-none align-items-center justify-content-center"
style="background: rgba(255,255,255,.75); z-index: 10; border-radius: .375rem;">
<div class="text-center">
<div class="spinner-border" role="status" aria-hidden="true"></div>
<div class="mt-2 small text-muted">Kérlek várj…</div>
</div>
</div>
<div id="errorMessageContainer" class="alert alert-danger" style="display:none;"></div> <div id="errorMessageContainer" class="alert alert-danger" style="display:none;"></div>
<form method="post"> <form method="post">
@@ -55,14 +64,14 @@
</div> </div>
<hr class="mt-4 mb-3 border-secondary"> <hr class="mt-4 mb-3 border-secondary">
<div id="login2F1" class="d-grid"> <div id="login2F1" class="d-grid">
<button id="Login2F1Btn" type="button" class="btn btn-primary">Bejelentkezés</button> <button id="Login2F1Btn" type="button" class="btn btn-primary">Ellenőrzés</button>
</div> </div>
<div id="login2F2" class="d-grid"> <div id="login2F2" class="d-grid">
<button id="Login2F2Btn" type="button" class="btn btn-primary">Megerősítés</button> <button id="Login2F2Btn" type="button" class="btn btn-primary">Megerősítés</button>
</div> </div>
</form> </form>
</div> </div>
<!-- Message Modal --> <!-- Message Modal -->
<div class="modal fade" id="messageModal" tabindex="-1" aria-labelledby="messageModalLabel" aria-hidden="true"> <div class="modal fade" id="messageModal" tabindex="-1" aria-labelledby="messageModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered"> <div class="modal-dialog modal-dialog-centered">
@@ -80,7 +89,7 @@
</div> </div>
</div> </div>
</div> </div>
<script src="~/js/site.js" asp-append-version="true"></script> <script src="~/js/site.js" asp-append-version="true"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script> <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
@@ -88,20 +97,46 @@
<script src="https://cdn.jsdelivr.net/npm/jquery-validation-unobtrusive@4.0.0/dist/jquery.validate.unobtrusive.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/jquery-validation-unobtrusive@4.0.0/dist/jquery.validate.unobtrusive.min.js"></script>
<script> <script>
function setLoading(isLoading) {
if (isLoading) {
$('#formLoading').removeClass('d-none').addClass('d-flex');
$('#Login2F1Btn, #Login2F2Btn').prop('disabled', true);
// opcionális: inputok tiltása is
// $('#User2FADTO_UserName, #User2FADTO_Password, #User2FADTO_Code').prop('disabled', true);
} else {
$('#formLoading').addClass('d-none').removeClass('d-flex');
$('#Login2F1Btn, #Login2F2Btn').prop('disabled', false);
// $('#User2FADTO_UserName, #User2FADTO_Password, #User2FADTO_Code').prop('disabled', false);
}
}
let requestInFlight = false;
function beginRequest() {
if (requestInFlight) return false;
requestInFlight = true;
setLoading(true);
return true;
}
function endRequest() {
requestInFlight = false;
setLoading(false);
}
$(document).ready(function () { $(document).ready(function () {
$('#VerificationCode').hide(); $('#VerificationCode').hide();
$('#login2F2').hide(); $('#login2F2').hide();
$('#Login2F2Btn').hide(); $('#Login2F2Btn').hide();
$('#UserChangePassword2FADTO_UserName').attr('readonly', true); $('#UserChangePassword2FADTO_UserName').attr('readonly', true);
$('#Login2F1Btn').on('click', function () { $('#Login2F1Btn').on('click', function () {
// $('#Login2F1Btn, #Login2F2Btn').prop('disabled', true); // $('#Login2F1Btn, #Login2F2Btn').prop('disabled', true);
if (!beginRequest()) return;
$('#errorMessageContainer').hide().text(''); $('#errorMessageContainer').hide().text('');
const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content'); const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
const userName = $('#UserChangePassword2FADTO_UserName').val(); const userName = $('#UserChangePassword2FADTO_UserName').val();
const password = $('#UserChangePassword2FADTO_OldPassword').val(); const password = $('#UserChangePassword2FADTO_OldPassword').val();
$.ajax({ $.ajax({
url: '/Account/ChangePassword?handler=Login2F1', url: '/Account/ChangePassword?handler=Login2F1',
type: 'POST', type: 'POST',
@@ -136,6 +171,9 @@
// .prop('disabled', false) // .prop('disabled', false)
// .removeAttr('disabled') // .removeAttr('disabled')
// .removeClass('disabled'); // .removeClass('disabled');
},
complete: function () {
endRequest();
} }
}); });
@@ -143,6 +181,7 @@
$('#Login2F2Btn').on('click', function () { $('#Login2F2Btn').on('click', function () {
// $('#Login2F1Btn, #Login2F2Btn').prop('disabled', true); // $('#Login2F1Btn, #Login2F2Btn').prop('disabled', true);
if (!beginRequest()) return;
$('#errorMessageContainer').hide().text(''); $('#errorMessageContainer').hide().text('');
const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content'); const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
@@ -194,6 +233,9 @@
// .prop('disabled', false) // .prop('disabled', false)
// .removeAttr('disabled') // .removeAttr('disabled')
// .removeClass('disabled'); // .removeClass('disabled');
},
complete: function () {
endRequest();
} }
}); });
}); });
@@ -8,9 +8,6 @@
Layout = null; Layout = null;
ViewData["Title"] = "Bejelentkezés"; ViewData["Title"] = "Bejelentkezés";
} }
<!DOCTYPE html> <!DOCTYPE html>
<html lang="hu"> <html lang="hu">
<head> <head>
@@ -22,39 +19,48 @@
@* <body class="bg-light d-flex justify-content-center align-items-center vh-100"> *@ @* <body class="bg-light d-flex justify-content-center align-items-center vh-100"> *@
<body class="bg-light d-flex flex-column min-vh-100"> <body class="bg-light d-flex flex-column min-vh-100">
<main class="flex-grow-1 d-flex justify-content-center align-items-center"> <main class="flex-grow-1 d-flex justify-content-center align-items-center">
<div class="card shadow p-4" style="min-width: 350px; max-width: 400px; width: 100%;"> <div class="card shadow p-4" style="min-width: 350px; max-width: 400px; width: 100%;">
<h2 class="mb-4 text-center">Bejelentkezés</h2> <h2 class="mb-4 text-center">Bejelentkezés</h2>
<div id="errorMessageContainer" class="alert alert-danger" style="display:none;"></div> <!-- Loading overlay -->
<div id="formLoading" class="position-absolute top-0 start-0 w-100 h-100 d-none align-items-center justify-content-center"
<form method="post"> style="background: rgba(255,255,255,.75); z-index: 10; border-radius: .375rem;">
<meta name="csrf-token" content="@Antiforgery.GetAndStoreTokens(HttpContext).RequestToken" /> <div class="text-center">
<input type="hidden" asp-for="User2FADTO.Token2FA" /> <div class="spinner-border" role="status" aria-hidden="true"></div>
<div class="mb-3"> <div class="mt-2 small text-muted">Kérlek várj…</div>
<label asp-for="User2FADTO.UserName" class="form-label">Felhasználónév</label> </div>
<input asp-for="User2FADTO.UserName" class="form-control" />
<span asp-validation-for="User2FADTO.UserName" class="text-danger small"></span>
</div> </div>
<div class="mb-3"> <div id="errorMessageContainer" class="alert alert-danger" style="display:none;"></div>
<label asp-for="User2FADTO.Password" class="form-label">Jelszó</label>
<input asp-for="User2FADTO.Password" type="password" class="form-control" /> <form method="post">
<span asp-validation-for="User2FADTO.Password" class="text-danger small"></span> <meta name="csrf-token" content="@Antiforgery.GetAndStoreTokens(HttpContext).RequestToken" />
</div> <input type="hidden" asp-for="User2FADTO.Token2FA" />
<div id="VerificationCode" class="mb-3"> <div class="mb-3">
<label asp-for="User2FADTO.Code" class="form-label">Megerősítő kód</label> <label asp-for="User2FADTO.UserName" class="form-label">Felhasználónév</label>
<input asp-for="User2FADTO.Code" class="form-control" /> <input asp-for="User2FADTO.UserName" class="form-control" />
<span asp-validation-for="User2FADTO.Code" class="text-danger small"></span> <span asp-validation-for="User2FADTO.UserName" class="text-danger small"></span>
</div> </div>
<hr class="mt-4 mb-3 border-secondary">
<div id="login2F1" class="d-grid"> <div class="mb-3">
<button id="Login2F1Btn" type="button" class="btn btn-primary">Bejelentkezés</button> <label asp-for="User2FADTO.Password" class="form-label">Jelszó</label>
</div> <input asp-for="User2FADTO.Password" type="password" class="form-control" />
<div id="login2F2" class="d-grid"> <span asp-validation-for="User2FADTO.Password" class="text-danger small"></span>
<button id="Login2F2Btn" type="button" class="btn btn-primary">Megerősítés</button> </div>
</div> <div id="VerificationCode" class="mb-3">
</form> <label asp-for="User2FADTO.Code" class="form-label">Megerősítő kód</label>
</div> <input asp-for="User2FADTO.Code" class="form-control" />
<span asp-validation-for="User2FADTO.Code" class="text-danger small"></span>
</div>
<hr class="mt-4 mb-3 border-secondary">
<div id="login2F1" class="d-grid">
<button id="Login2F1Btn" type="button" class="btn btn-primary">Bejelentkezés</button>
</div>
<div id="login2F2" class="d-grid">
<button id="Login2F2Btn" type="button" class="btn btn-primary">Megerősítés</button>
</div>
</form>
</div>
</main> </main>
<footer class="border-top footer text-muted"> <footer class="border-top footer text-muted">
<div class="container"> <div class="container">
@@ -68,13 +74,41 @@
<script src="https://cdn.jsdelivr.net/npm/jquery-validation-unobtrusive@4.0.0/dist/jquery.validate.unobtrusive.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/jquery-validation-unobtrusive@4.0.0/dist/jquery.validate.unobtrusive.min.js"></script>
<script> <script>
function setLoading(isLoading) {
if (isLoading) {
$('#formLoading').removeClass('d-none').addClass('d-flex');
$('#Login2F1Btn, #Login2F2Btn').prop('disabled', true);
// opcionális: inputok tiltása is
// $('#User2FADTO_UserName, #User2FADTO_Password, #User2FADTO_Code').prop('disabled', true);
} else {
$('#formLoading').addClass('d-none').removeClass('d-flex');
$('#Login2F1Btn, #Login2F2Btn').prop('disabled', false);
// $('#User2FADTO_UserName, #User2FADTO_Password, #User2FADTO_Code').prop('disabled', false);
}
}
let requestInFlight = false;
function beginRequest() {
if (requestInFlight) return false;
requestInFlight = true;
setLoading(true);
return true;
}
function endRequest() {
requestInFlight = false;
setLoading(false);
}
$(document).ready(function () { $(document).ready(function () {
$('#VerificationCode').hide(); $('#VerificationCode').hide();
$('#login2F2').hide(); $('#login2F2').hide();
$('#Login2F2Btn').hide(); $('#Login2F2Btn').hide();
$('#Login2F1Btn').on('click', function () { $('#Login2F1Btn').on('click', function () {
// $('#Login2F1Btn, #Login2F2Btn').prop('disabled', true); // $('#Login2F1Btn, #Login2F2Btn').prop('disabled', true);
if (!beginRequest()) return;
$('#errorMessageContainer').hide().text(''); $('#errorMessageContainer').hide().text('');
const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content'); const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
const userName = $('#User2FADTO_UserName').val(); const userName = $('#User2FADTO_UserName').val();
@@ -114,16 +148,20 @@
// .prop('disabled', false) // .prop('disabled', false)
// .removeAttr('disabled') // .removeAttr('disabled')
// .removeClass('disabled'); // .removeClass('disabled');
},
complete: function () {
endRequest();
} }
}); });
}); });
$('#Login2F2Btn').on('click', function () { $('#Login2F2Btn').on('click', function () {
// $('#Login2F1Btn, #Login2F2Btn').prop('disabled', true); // $('#Login2F1Btn, #Login2F2Btn').prop('disabled', true);
if (!beginRequest()) return;
$('#errorMessageContainer').hide().text(''); $('#errorMessageContainer').hide().text('');
const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content'); const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
const userName = $('#User2FADTO_UserName').val(); const userName = $('#User2FADTO_UserName').val();
const password = $('#User2FADTO_Password').val(); const password = $('#User2FADTO_Password').val();
const code = $('#User2FADTO_Code').val(); const code = $('#User2FADTO_Code').val();
@@ -147,6 +185,7 @@
if (result.success) { if (result.success) {
window.location.href = `/Index`; window.location.href = `/Index`;
} else { } else {
console.log(result);
$('#errorMessageContainer').text('Hibás felhasználónév vagy jelszó!').show(); $('#errorMessageContainer').text('Hibás felhasználónév vagy jelszó!').show();
// $('#Login2F1Btn, #Login2F2Btn') // $('#Login2F1Btn, #Login2F2Btn')
// .prop('disabled', false) // .prop('disabled', false)
@@ -162,6 +201,9 @@
// .prop('disabled', false) // .prop('disabled', false)
// .removeAttr('disabled') // .removeAttr('disabled')
// .removeClass('disabled'); // .removeClass('disabled');
},
complete: function () {
endRequest();
} }
}); });
}); });
@@ -55,8 +55,8 @@ namespace WorkFlowCheck.Web.Pages.Account
Response.Cookies.Append("AuthToken", token, new CookieOptions Response.Cookies.Append("AuthToken", token, new CookieOptions
{ {
HttpOnly = true, HttpOnly = true,
Secure = true, Secure = HttpContext.Request.IsHttps,
SameSite = SameSiteMode.Strict, SameSite = SameSiteMode.Lax,
Expires = DateTimeOffset.UtcNow.AddDays(1) Expires = DateTimeOffset.UtcNow.AddDays(1)
}); });
@@ -104,7 +104,7 @@
], ],
processing:true, processing:true,
language: { url: '//cdn.datatables.net/plug-ins/2.2.2/i18n/hu.json',} language: { url: '/lib/datatables/datatables.hu.json',}
}); });
$('#tbCheckPointsEditPage').on('click', '.edit-btn', function () $('#tbCheckPointsEditPage').on('click', '.edit-btn', function ()
@@ -80,7 +80,7 @@
], ],
processing:true, processing:true,
language: { url: '//cdn.datatables.net/plug-ins/2.2.2/i18n/hu.json',} language: { url: '/lib/datatables/datatables.hu.json',}
}); });
$('#newCheckPointBtn').on('click', function () $('#newCheckPointBtn').on('click', function ()
@@ -62,7 +62,7 @@
], ],
processing:true, processing:true,
language: { url: '//cdn.datatables.net/plug-ins/2.2.2/i18n/hu.json',} language: { url: '/lib/datatables/datatables.hu.json',}
}); });
$('#newEquipmentBtn').on('click', function () $('#newEquipmentBtn').on('click', function ()
@@ -68,7 +68,7 @@
], ],
processing:true, processing:true,
language: { url: '//cdn.datatables.net/plug-ins/2.2.2/i18n/hu.json',} language: { url: '/lib/datatables/datatables.hu.json',}
}); });
$('#tbImageFilesPage').on('click', '.download-btn', function () $('#tbImageFilesPage').on('click', '.download-btn', function ()
@@ -59,7 +59,7 @@
], ],
processing:true, processing:true,
language: { url: '//cdn.datatables.net/plug-ins/2.2.2/i18n/hu.json',} language: { url: '/lib/datatables/datatables.hu.json',}
}); });
$('#newLocationBtn').on('click', function () $('#newLocationBtn').on('click', function ()
@@ -68,7 +68,7 @@
], ],
processing:true, processing:true,
language: { url: '//cdn.datatables.net/plug-ins/2.2.2/i18n/hu.json',} language: { url: '/lib/datatables/datatables.hu.json',}
}); });
$('#tbAuditFilesPage').on('click', '.download-btn', function () $('#tbAuditFilesPage').on('click', '.download-btn', function ()
@@ -68,7 +68,7 @@
], ],
processing:true, processing:true,
language: { url: '//cdn.datatables.net/plug-ins/2.2.2/i18n/hu.json',} language: { url: '/lib/datatables/datatables.hu.json',}
}); });
$('#tbBusinessFilesPage').on('click', '.download-btn', function () $('#tbBusinessFilesPage').on('click', '.download-btn', function ()
@@ -68,7 +68,7 @@
], ],
processing:true, processing:true,
language: { url: '//cdn.datatables.net/plug-ins/2.2.2/i18n/hu.json',} language: { url: '/lib/datatables/datatables.hu.json',}
}); });
$('#tbPDFFilesPage').on('click', '.download-btn', function () $('#tbPDFFilesPage').on('click', '.download-btn', function ()
@@ -173,7 +173,7 @@
], ],
processing:true, processing:true,
language: { url: '//cdn.datatables.net/plug-ins/2.2.2/i18n/hu.json',} language: { url: '/lib/datatables/datatables.hu.json',}
}); });
@@ -5,7 +5,14 @@
@using Microsoft.AspNetCore.Antiforgery @using Microsoft.AspNetCore.Antiforgery
@inject IAntiforgery Antiforgery @inject IAntiforgery Antiforgery
@{ @{
ViewData["Title"] = "Ellenőrzések"; ViewData["Title"] = Model.Mode switch
{
0 => "Ellenőrzések (folyamatban)",
1 => "Ellenőrzések (beküldött)",
2 => "Ellenőrzések (lezárt)",
3 => "Ellenőrzések (jóváhagyott)",
_ => "Ellenőrzések (összes)"
};
} }
<h1>@ViewData["Title"]</h1> <h1>@ViewData["Title"]</h1>
<meta name="csrf-token" content="@Antiforgery.GetAndStoreTokens(HttpContext).RequestToken" /> <meta name="csrf-token" content="@Antiforgery.GetAndStoreTokens(HttpContext).RequestToken" />
@@ -49,10 +56,17 @@
@section Scripts { @section Scripts {
<script> <script>
let currentMode = @Model.Mode;
const table = new DataTable('#tbCheckListHeadersPage', { const table = new DataTable('#tbCheckListHeadersPage', {
serverSide: true,
ordering: true,
order: [],
ajax: { ajax: {
url: "@Url.Page("./CheckListHeaderPage", "LoadCheckListHeaders")", url: "@Url.Page("./CheckListHeaderPage", "LoadCheckListHeaders")",
type: "GET", type: "POST",
data: function (d) {
d.mode = currentMode;
},
dataSrc : "data" dataSrc : "data"
}, },
columns: [ columns: [
@@ -104,7 +118,7 @@
], ],
processing: true, processing: true,
language: { url: '//cdn.datatables.net/plug-ins/2.2.2/i18n/hu.json',} language: { url: '/lib/datatables/datatables.hu.json',}
}); });
$('#newCheckListHeaderBtn').on('click', function () $('#newCheckListHeaderBtn').on('click', function ()
@@ -179,7 +193,7 @@
} }
}); });
}); });
$('#tbCheckListHeadersPage').on('click', '.accept-btn', function () $('#tbCheckListHeadersPage').on('click', '.accept-btn', function ()
{ {
const row = table.row($(this).closest('tr')).data(); const row = table.row($(this).closest('tr')).data();
@@ -265,7 +279,7 @@
} }
}); });
}); });
$('#tbCheckListHeadersPage').on('click', '.unblock-btn', function () $('#tbCheckListHeadersPage').on('click', '.unblock-btn', function ()
{ {
const row = table.row($(this).closest('tr')).data(); const row = table.row($(this).closest('tr')).data();
@@ -309,6 +323,6 @@
}); });
}); });
</script> </script>
} }
@@ -1,4 +1,4 @@
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.Rendering;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
@@ -9,11 +9,12 @@ using System.Security.Claims;
using WorkFlowCheck.Common.DTO; using WorkFlowCheck.Common.DTO;
namespace WorkFlowCheck.Web.Pages.CheckList.CheckListHeader namespace WorkFlowCheck.Web.Pages.CheckList.CheckListHeader
{ {
[IgnoreAntiforgeryToken]
public class CheckListHeaderPageModel : PageModel public class CheckListHeaderPageModel : PageModel
{ {
private readonly ILogger<IndexModel> _logger; private readonly ILogger<IndexModel> _logger;
private readonly ICheckListService _checkListService; private readonly ICheckListService _checkListService;
public int Mode { get; private set; }
public List<SelectListItem> CheckStatus { get; set; } public List<SelectListItem> CheckStatus { get; set; }
public CheckListHeaderPageModel(ILogger<IndexModel> logger, ICheckListService checkListService) public CheckListHeaderPageModel(ILogger<IndexModel> logger, ICheckListService checkListService)
@@ -21,16 +22,57 @@ namespace WorkFlowCheck.Web.Pages.CheckList.CheckListHeader
_logger = logger; _logger = logger;
_checkListService = checkListService; _checkListService = checkListService;
} }
public async Task OnGet() public async Task OnGet(int mode = 0)
{ {
Mode = mode;
CheckStatus = _checkListService.GetCheckStatus(); CheckStatus = _checkListService.GetCheckStatus();
} }
public async Task<JsonResult> OnGetLoadCheckListHeaders() public async Task<JsonResult> OnPostLoadCheckListHeadersAsync()
{ {
var results = await _checkListService.GetAllCheckListHeaderAsync(); var mode = int.Parse(Request.Form["mode"]);
return new JsonResult(new { data = results });
var draw = int.Parse(Request.Form["draw"]);
var start = int.Parse(Request.Form["start"]);
var length = int.Parse(Request.Form["length"]);
var search = Request.Form["search[value]"].ToString();
var orderColIndexStr = Request.Query["order[0][column]"].ToString();
var orderDir = Request.Query["order[0][dir]"].ToString(); // "asc" / "desc"
int? orderColIndex = int.TryParse(orderColIndexStr, out var idx) ? idx : null;
// columns[x][data] alapján tudod, melyik mezőt rendezi
string? orderColData = null;
if (orderColIndex.HasValue)
orderColData = Request.Query[$"columns[{orderColIndex.Value}][data]"].ToString();
//var results = await _checkListService.GetAllCheckListHeaderAsync(mode);
var dataTablesRequest = new Common.DataTables.DataTablesRequest()
{
Mode = mode,
Length = length,
Start = start,
Draw = draw,
};
dataTablesRequest.Search.Value = search;
var results = await _checkListService.GetFilteredCheckListHeaderAsync(dataTablesRequest);
return new JsonResult(new
{
draw = draw,
recordsTotal = results.Total,
recordsFiltered = results.Filtered,
data = results.Data
});
//var results = await _checkListService.GetAllCheckListHeaderAsync(mode);
//return new JsonResult(new
//{
// draw = draw,
// data = results
//});
} }
public async Task<IActionResult> OnGetCreatePDF(int id) public async Task<IActionResult> OnGetCreatePDF(int id)
@@ -100,8 +142,8 @@ namespace WorkFlowCheck.Web.Pages.CheckList.CheckListHeader
public async Task<IActionResult> OnPostClose([FromBody] CheckListHeaderCloseDTO checkListHeaderCloseDTO) public async Task<IActionResult> OnPostClose([FromBody] CheckListHeaderCloseDTO checkListHeaderCloseDTO)
{ {
var userid = User.FindFirstValue(ClaimTypes.NameIdentifier); var userid = User.FindFirstValue(ClaimTypes.NameIdentifier);
checkListHeaderCloseDTO.UserId=int.Parse(userid); ; checkListHeaderCloseDTO.UserId = int.Parse(userid); ;
var response = await _checkListService.CloseCheckListHeader(checkListHeaderCloseDTO); var response = await _checkListService.CloseCheckListHeader(checkListHeaderCloseDTO);
if (response.IsSuccess) if (response.IsSuccess)
@@ -116,7 +116,7 @@
], ],
processing:true, processing:true,
language: { url: '//cdn.datatables.net/plug-ins/2.2.2/i18n/hu.json',} language: { url: '/lib/datatables/datatables.hu.json',}
}); });
@@ -63,7 +63,7 @@
], ],
processing:true, processing:true,
language: { url: '//cdn.datatables.net/plug-ins/2.2.2/i18n/hu.json',} language: { url: '/lib/datatables/datatables.hu.json',}
}); });
$('#newCheckListTemplateHeaderBtn').on('click', function () $('#newCheckListTemplateHeaderBtn').on('click', function ()
@@ -49,7 +49,26 @@
Ellenőrzési adatok Ellenőrzési adatok
</a> </a>
<ul class="dropdown-menu" aria-labelledby="checkListDropdown"> <ul class="dropdown-menu" aria-labelledby="checkListDropdown">
<li><a class="dropdown-item" asp-area="" asp-page="/CheckList/CheckListHeader/CheckListHeaderPage">Ellenőrzések</a></li> <li>
<a class="dropdown-item" asp-area="" asp-page="/CheckList/CheckListHeader/CheckListHeaderPage"
asp-route-mode="0">Ellenőrzések (folyamatban)</a>
</li>
<li>
<a class="dropdown-item" asp-area="" asp-page="/CheckList/CheckListHeader/CheckListHeaderPage"
asp-route-mode="1">Ellenőrzések (beküldött)</a>
</li>
<li>
<a class="dropdown-item" asp-area="" asp-page="/CheckList/CheckListHeader/CheckListHeaderPage"
asp-route-mode="3">Ellenőrzések (jóváhagyott)</a>
</li>
<li>
<a class="dropdown-item" asp-area="" asp-page="/CheckList/CheckListHeader/CheckListHeaderPage"
asp-route-mode="2">Ellenőrzések (lezárt)</a>
</li>
<li>
<a class="dropdown-item" asp-area="" asp-page="/CheckList/CheckListHeader/CheckListHeaderPage"
asp-route-mode="4">Ellenőrzések (összes)</a>
</li>
<li><hr class="dropdown-divider"></li> <!-- EZ AZ ELVÁLASZTÓ VONAL --> <li><hr class="dropdown-divider"></li> <!-- EZ AZ ELVÁLASZTÓ VONAL -->
<li><a class="dropdown-item" asp-area="" asp-page="/CheckListTemplate/CheckListTemplateHeader/CheckListTemplateHeaderPage">Ellenőrzési sablonok</a></li> <li><a class="dropdown-item" asp-area="" asp-page="/CheckListTemplate/CheckListTemplateHeader/CheckListTemplateHeaderPage">Ellenőrzési sablonok</a></li>
</ul> </ul>
@@ -67,7 +86,7 @@
<li><a class="dropdown-item" asp-area="" asp-page="/UserAndRole/RoleCheckPointsPage">Szabályok - Ellenőrzési pontok</a></li> <li><a class="dropdown-item" asp-area="" asp-page="/UserAndRole/RoleCheckPointsPage">Szabályok - Ellenőrzési pontok</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
<ul class="navbar-nav"> <ul class="navbar-nav">
<li class="nav-item dropdown"> <li class="nav-item dropdown">
@@ -72,7 +72,7 @@
], ],
processing:true, processing:true,
language: { url: '//cdn.datatables.net/plug-ins/2.2.2/i18n/hu.json',} language: { url: '/lib/datatables/datatables.hu.json',}
}); });
$('#newRoleCheckListTemplateHeadersBtn').on('click', function () $('#newRoleCheckListTemplateHeadersBtn').on('click', function ()
@@ -74,7 +74,7 @@
], ],
processing:true, processing:true,
language: { url: '//cdn.datatables.net/plug-ins/2.2.2/i18n/hu.json',} language: { url: '/lib/datatables/datatables.hu.json',}
}); });
$('#newRoleCheckPointsBtn').on('click', function () $('#newRoleCheckPointsBtn').on('click', function ()
@@ -122,7 +122,7 @@
], ],
processing:true, processing:true,
language: { url: '//cdn.datatables.net/plug-ins/2.2.2/i18n/hu.json',} language: { url: '/lib/datatables/datatables.hu.json',}
}); });
$('#newRoleBtn').on('click', function () $('#newRoleBtn').on('click', function ()
@@ -199,7 +199,7 @@
], ],
processing:true, processing:true,
language: { url: '//cdn.datatables.net/plug-ins/2.2.2/i18n/hu.json',} language: { url: '/lib/datatables/datatables.hu.json',}
}); });
$("#saveUser").click(function () { $("#saveUser").click(function () {
@@ -92,7 +92,7 @@
], ],
processing:true, processing:true,
language: { url: '//cdn.datatables.net/plug-ins/2.2.2/i18n/hu.json',} language: { url: '/lib/datatables/datatables.hu.json',}
}); });
$('#newUserBtn').on('click', function () $('#newUserBtn').on('click', function ()
@@ -60,7 +60,7 @@
], ],
processing:true, processing:true,
language: { url: '//cdn.datatables.net/plug-ins/2.2.2/i18n/hu.json',} language: { url: '/lib/datatables/datatables.hu.json',}
}); });
$('#newUserRoleBtn').on('click', function () $('#newUserRoleBtn').on('click', function ()
@@ -24,6 +24,16 @@
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} }
},
"WSL": {
"commandName": "WSL2",
"launchBrowser": true,
"launchUrl": "https://localhost:7041",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"ASPNETCORE_URLS": "https://localhost:7041;http://localhost:5258"
},
"distributionName": ""
} }
}, },
"$schema": "http://json.schemastore.org/launchsettings.json", "$schema": "http://json.schemastore.org/launchsettings.json",
@@ -4,6 +4,7 @@ using Serilog;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Net.Http; using System.Net.Http;
using System.Reflection; using System.Reflection;
using WorkFlowCheck.Common.DataTables;
using WorkFlowCheck.Common.DTO; using WorkFlowCheck.Common.DTO;
using WorkFlowCheck.Common.Enums; using WorkFlowCheck.Common.Enums;
using WorkFlowCheck.Web.Services.Interfaces; using WorkFlowCheck.Web.Services.Interfaces;
@@ -15,10 +16,37 @@ namespace WorkFlowCheck.Web.Services
public CheckListService(HttpClient httpClient, IConfiguration configuration, IHttpContextAccessor httpContextAccessor) : base(httpClient, configuration, httpContextAccessor) public CheckListService(HttpClient httpClient, IConfiguration configuration, IHttpContextAccessor httpContextAccessor) : base(httpClient, configuration, httpContextAccessor)
{ {
} }
public async Task<ApiResponseListDTO<List<CheckListHeaderDTO>>> GetFilteredCheckListHeaderAsync(DataTablesRequest dataTablesRequest)
public async Task<List<CheckListHeaderDTO>> GetAllCheckListHeaderAsync()
{ {
var endpoint = $"{_httpClient.BaseAddress}api/CheckList/GetAllCheckListHeaders"; try
{
string endpoint = $"{_httpClient.BaseAddress}api/CheckList/GetFilteredCheckListHeader";
using (HttpResponseMessage httpResponseMessage = await _httpClient.PostAsJsonAsync(endpoint, dataTablesRequest))
{
httpResponseMessage.EnsureSuccessStatusCode();
var jsonString = await httpResponseMessage.Content.ReadAsStringAsync();
var response = JsonConvert.DeserializeObject<ApiResponseListDTO<List<CheckListHeaderDTO>>>(jsonString);
return response ?? new ApiResponseListDTO<List<CheckListHeaderDTO>>
{
IsSuccess = false,
};
}
}
catch (Exception ex)
{
// Hiba visszaadása
return new ApiResponseListDTO<List<CheckListHeaderDTO>>
{
IsSuccess = false
};
}
}
public async Task<List<CheckListHeaderDTO>> GetAllCheckListHeaderAsync(int mode = 0)
{
var endpoint = $"{_httpClient.BaseAddress}api/CheckList/GetAllCheckListHeaders/{mode}";
var retVal = new List<CheckListHeaderDTO>(); var retVal = new List<CheckListHeaderDTO>();
try try
{ {
@@ -1,4 +1,5 @@
using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.Rendering;
using WorkFlowCheck.Common.DataTables;
using WorkFlowCheck.Common.DTO; using WorkFlowCheck.Common.DTO;
namespace WorkFlowCheck.Web.Services.Interfaces namespace WorkFlowCheck.Web.Services.Interfaces
@@ -6,7 +7,8 @@ namespace WorkFlowCheck.Web.Services.Interfaces
public interface ICheckListService public interface ICheckListService
{ {
Task<CheckListHeaderDTO> GetCheckListHeader(int id); Task<CheckListHeaderDTO> GetCheckListHeader(int id);
Task<List<CheckListHeaderDTO>> GetAllCheckListHeaderAsync(); Task<ApiResponseListDTO<List<CheckListHeaderDTO>>> GetFilteredCheckListHeaderAsync(DataTablesRequest dataTablesRequest);
Task<List<CheckListHeaderDTO>> GetAllCheckListHeaderAsync(int mode = 0);
Task<ApiResponseDTO<CheckListHeaderDTO>> UpdateCheckListHeader(CheckListHeaderDTO checkListHeaderDTO); Task<ApiResponseDTO<CheckListHeaderDTO>> UpdateCheckListHeader(CheckListHeaderDTO checkListHeaderDTO);
Task<ApiResponseDTO<byte[]>> CreatePDF(int id); Task<ApiResponseDTO<byte[]>> CreatePDF(int id);
Task<ApiResponseDTO<bool>> AcceptCheckListHeader(int id, int userid); Task<ApiResponseDTO<bool>> AcceptCheckListHeader(int id, int userid);
@@ -61,7 +61,10 @@ namespace WorkFlowCheck.Web.Services
{ {
if (userDTO.Id != null) if (userDTO.Id != null)
{ {
userDTO.Password = "xXyY3456!!!;;"; // Ez csak amiatt kell, hogy ne szálljon el a JSON if (userDTO.Id > 0)
{
userDTO.Password = "xXyY3456!!!;;"; // Ez csak amiatt kell, hogy ne szálljon el a JSON
}
} }
string endpoint = $"{_httpClient.BaseAddress}api/user/UpdateUser"; string endpoint = $"{_httpClient.BaseAddress}api/user/UpdateUser";
@@ -10,6 +10,7 @@
<InvariantGlobalization>false</InvariantGlobalization> <InvariantGlobalization>false</InvariantGlobalization>
<PublishAot>false</PublishAot> <PublishAot>false</PublishAot>
<IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled> <IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled>
<UserSecretsId>b1687ae9-f7e6-45cf-bfbb-293f5d38ca14</UserSecretsId>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@@ -1,10 +1,17 @@
{ {
"ApiBaseUrl": "https://localhost:44382/", "ApiBaseUrl": "http://localhost:59027/",
"DetailedErrors": true, "DetailedErrors": true,
"Logging": { "Logging": {
"LogLevel": { "LogLevel": {
"Default": "Information", "Default": "Information",
"Microsoft.AspNetCore": "Warning" "Microsoft.AspNetCore": "Warning"
} }
},
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:5258"
}
}
} }
} }
+14
View File
@@ -0,0 +1,14 @@
@echo off
REM ha van paraméter, azt használjuk, különben default
set PUBLISH_DIR=%1
if "%PUBLISH_DIR%"=="" (
set PUBLISH_DIR=c:\Publish\wfcweb
)
echo Publish to: %PUBLISH_DIR%
dotnet publish -c Release -o "%PUBLISH_DIR%"
pause
@@ -0,0 +1,230 @@
{
"emptyTable": "Nincs rendelkezésre álló adat",
"info": "Találatok: _START_ - _END_ Összesen: _TOTAL_",
"infoFiltered": "(_MAX_ összes rekord közül szűrve)",
"infoThousands": " ",
"lengthMenu": "_MENU_ találat oldalanként",
"loadingRecords": "Betöltés...",
"processing": "Feldolgozás...",
"search": "Keresés:",
"zeroRecords": "Nincs a keresésnek megfelelő találat",
"paginate": {
"first": "Első",
"previous": "Előző",
"next": "Következő",
"last": "Utolsó"
},
"aria": {
"sortAscending": ": aktiválja a növekvő rendezéshez",
"sortDescending": ": aktiválja a csökkenő rendezéshez"
},
"select": {
"rows": {
"_": "%d sor kiválasztva",
"1": "1 sor kiválasztva"
},
"cells": {
"1": "1 cella kiválasztva",
"_": "%d cella kiválasztva"
},
"columns": {
"1": "1 oszlop kiválasztva",
"_": "%d oszlop kiválasztva"
}
},
"buttons": {
"colvis": "Oszlopok",
"copy": "Másolás",
"copyTitle": "Vágólapra másolás",
"copySuccess": {
"_": "%d sor másolva",
"1": "1 sor másolva"
},
"collection": "Gyűjtemény",
"colvisRestore": "Oszlopok visszaállítása",
"csv": "CSV",
"excel": "Excel",
"pageLength": {
"-1": "Összes sor megjelenítése",
"_": "%d sor megjelenítése"
},
"pdf": "PDF",
"print": "Nyomtat",
"copyKeys": "A táblázat adatainak vágólapra másolásához nyomja meg a CTRL vagy u2318 + C billentyűt!<br \/><br \/>A megszakításhoz kattintson az üzenetre, vagy nyomja meg az ESC billentyűt!",
"createState": "Állapot mentése",
"removeAllStates": "Mentett állapotok törlése",
"removeState": "Törlés",
"renameState": "Átnevezés",
"savedStates": "Mentett állapotok",
"stateRestore": "%d. állapot",
"updateState": "Frissítés"
},
"autoFill": {
"cancel": "Megszakítás",
"fill": "Összes cella kitöltése a következővel: <i>%d<\/i>",
"fillHorizontal": "Cellák vízszintes kitöltése",
"fillVertical": "Cellák függőleges kitöltése"
},
"searchBuilder": {
"add": "Feltétel hozzáadása",
"button": {
"0": "Keresés konfigurátor",
"_": "Keresés konfigurátor (%d)"
},
"clearAll": "Összes feltétel törlése",
"condition": "Feltétel",
"conditions": {
"date": {
"after": "Után",
"before": "Előtt",
"between": "Között",
"empty": "Üres",
"equals": "Egyenlő",
"not": "Nem",
"notBetween": "Kívül eső",
"notEmpty": "Nem üres"
},
"number": {
"between": "Között",
"empty": "Üres",
"equals": "Egyenlő",
"gt": "Nagyobb mint",
"gte": "Nagyobb vagy egyenlő mint",
"lt": "Kissebb mint",
"lte": "Kissebb vagy egyenlő mint",
"not": "Nem",
"notBetween": "Kívül eső",
"notEmpty": "Nem üres"
},
"string": {
"contains": "Tartalmazza",
"empty": "Üres",
"endsWith": "Végződik",
"equals": "Egyenlő",
"not": "Nem",
"notEmpty": "Nem üres",
"startsWith": "Kezdődik",
"notContains": "Nem tartalmazza",
"notStartsWith": "Nem kezdődik",
"notEndsWith": "Nem végződik"
},
"array": {
"equals": "Egyenlő",
"empty": "Üres",
"contains": "Tartalmazza",
"not": "Nem",
"notEmpty": "Nem üres",
"without": "Nélkül"
}
},
"data": "Adat",
"deleteTitle": "Feltétel törlése",
"logicAnd": "És",
"logicOr": "Vagy",
"title": {
"0": "Keresés konfigurátor",
"_": "Keresés konfigurátor (%d)"
},
"value": "Érték"
},
"searchPanes": {
"clearMessage": "Szűrők törlése",
"collapse": {
"0": "Szűrőpanelek",
"_": "Szűrőpanelek (%d)"
},
"count": "{total}",
"countFiltered": "{shown} ({total})",
"emptyPanes": "Nincsenek szűrőpanelek",
"loadMessage": "Szűrőpanelek betöltése",
"title": "Aktív szűrőpanelek: %d",
"showMessage": "Mindet megmutat",
"collapseMessage": "Mindet összecsuk"
},
"datetime": {
"previous": "Előző",
"next": "Következő",
"hours": "Óra",
"minutes": "Perc",
"seconds": "Másodperc",
"amPm": [
"de.",
"du."
],
"weekdays": [
"H",
"K",
"Sze",
"Cs",
"P",
"Szo",
"V"
],
"months": [
"Január",
"Február",
"Március",
"Április",
"Május",
"Június",
"Július",
"Augusztus",
"Szeptember",
"Október",
"November",
"December"
]
},
"editor": {
"close": "Bezárás",
"create": {
"button": "Új",
"title": "Új",
"submit": "Létrehozás"
},
"edit": {
"button": "Módosítás",
"title": "Módosítás",
"submit": "Módosítás"
},
"remove": {
"button": "Törlés",
"title": "Törlés",
"submit": "Törlés"
},
"error": {
"system": "Technikai hiba történt."
}
},
"infoEmpty": "Nincs találat",
"thousands": "&nbsp;",
"stateRestore": {
"creationModal": {
"button": "Létrehozás",
"columns": {
"search": "Oszlopkeresők",
"visible": "Oszlop láthatóság"
},
"name": "Név:",
"order": "Rendezés",
"paging": "Oldalszám",
"scroller": "Görgetés pozíciója",
"search": "Kereső",
"searchBuilder": "Keresési feltételek",
"select": "Kijelölések",
"title": "Állapot mentése",
"toggleLabel": "Tartalmazza:"
},
"duplicateError": "Ilyen névvel már létezik mentett állapot.",
"emptyError": "A név nem lehet üres.",
"emptyStates": "Nincs mentett állapot",
"removeConfirm": "Biztos törlöd %s állapotot?",
"removeError": "Nem sikerült törölni a mentett állapotot.",
"removeJoiner": "és",
"removeSubmit": "Törlés",
"removeTitle": "Mentett állapot törlése",
"renameButton": "Átnevezés",
"renameLabel": "%s új neve:",
"renameTitle": "Mentett állapot átnevezése"
}
}