Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
141 changes: 128 additions & 13 deletions EstateManagementUI.BlazorServer/Components/Pages/Merchants/Edit.razor
Original file line number Diff line number Diff line change
Expand Up @@ -192,21 +192,57 @@
@if (showAddOperator)
{
<div class="bg-gray-50 p-4 rounded-lg mb-4">
<label class="block text-sm font-medium text-gray-700 mb-2">Select Operator</label>
<div class="flex space-x-2">
<select @bind="selectedOperatorId" class="input flex-1">
<option value="">Select an operator...</option>
@if (availableOperators != null)
{
@foreach (var op in availableOperators)
<div class="space-y-4">
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">Select Operator</label>
<select @bind="selectedOperatorId" @bind:after="OnOperatorSelected" class="input w-full">
<option value="">Select an operator...</option>
@if (availableOperators != null)
{
<option value="@op.OperatorId">@op.Name</option>
@foreach (var op in availableOperators)
{
<option value="@op.OperatorId">@op.Name</option>
}
}
</select>
</div>

@if (selectedOperator != null)
{
@if (selectedOperator.RequireCustomMerchantNumber)
{
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">
Merchant Number <span class="text-red-500">*</span>
</label>
<input @bind="merchantNumber" type="text" class="input w-full" placeholder="Enter merchant number" />
@if (!string.IsNullOrEmpty(merchantNumberError))
{
<p class="text-red-600 text-sm mt-1">@merchantNumberError</p>
}
</div>
}
</select>
<button type="button" @onclick="AddOperatorToMerchant" class="btn btn-primary" disabled="@(string.IsNullOrEmpty(selectedOperatorId))">
Add
</button>

@if (selectedOperator.RequireCustomTerminalNumber)
{
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">
Terminal Number <span class="text-red-500">*</span>
</label>
<input @bind="terminalNumber" type="text" class="input w-full" placeholder="Enter terminal number" />
@if (!string.IsNullOrEmpty(terminalNumberError))
{
<p class="text-red-600 text-sm mt-1">@terminalNumberError</p>
}
</div>
}
}

<div class="flex justify-end">
<button type="button" @onclick="AddOperatorToMerchant" class="btn btn-primary" disabled="@(string.IsNullOrEmpty(selectedOperatorId))">
Add
</button>
</div>
</div>
</div>
}
Expand Down Expand Up @@ -388,6 +424,11 @@
private List<OperatorModel> assignedOperators = new();
private bool showAddOperator = false;
private string? selectedOperatorId;
private OperatorModel? selectedOperator;
private string? merchantNumber;
private string? terminalNumber;
private string? merchantNumberError;
private string? terminalNumberError;

// Contracts
private List<ContractModel>? availableContracts;
Expand Down Expand Up @@ -615,12 +656,79 @@
}
}

private void OnOperatorSelected()
{
if (string.IsNullOrEmpty(selectedOperatorId))
{
selectedOperator = null;
merchantNumber = null;
terminalNumber = null;
merchantNumberError = null;
terminalNumberError = null;
}
else
{
var operatorId = Guid.Parse(selectedOperatorId);
selectedOperator = availableOperators?.FirstOrDefault(o => o.OperatorId == operatorId);
merchantNumber = null;
terminalNumber = null;
merchantNumberError = null;
terminalNumberError = null;
}
}

private bool ValidateOperatorFields()
{
bool isValid = true;
merchantNumberError = null;
terminalNumberError = null;

if (selectedOperator != null)
{
if (selectedOperator.RequireCustomMerchantNumber)
{
if (string.IsNullOrWhiteSpace(merchantNumber))
{
merchantNumberError = "Merchant number is required";
isValid = false;
}
else if (!System.Text.RegularExpressions.Regex.IsMatch(merchantNumber, @"^\d+$"))
{
merchantNumberError = "Merchant number must be numeric";
isValid = false;
}
}

if (selectedOperator.RequireCustomTerminalNumber)
{
if (string.IsNullOrWhiteSpace(terminalNumber))
{
terminalNumberError = "Terminal number is required";
isValid = false;
}
else if (!System.Text.RegularExpressions.Regex.IsMatch(terminalNumber, @"^\d+$"))
{
terminalNumberError = "Terminal number must be numeric";
isValid = false;
}
}
}

return isValid;
}

private async Task AddOperatorToMerchant()
{
if (string.IsNullOrEmpty(selectedOperatorId)) return;

ClearMessages();

// Validate fields
if (!ValidateOperatorFields())
{
return;
}

try
{
var correlationId = new CorrelationId(Guid.NewGuid());
Expand All @@ -633,7 +741,9 @@
accessToken,
estateId,
MerchantId,
operatorId
operatorId,
merchantNumber,
terminalNumber
);

var result = await Mediator.Send(command);
Expand All @@ -642,6 +752,11 @@
{
successMessage = "Operator added successfully";
selectedOperatorId = null;
selectedOperator = null;
merchantNumber = null;
terminalNumber = null;
merchantNumberError = null;
terminalNumberError = null;
showAddOperator = false;

// Add to assigned list (in real implementation, reload from server)
Expand Down
2 changes: 1 addition & 1 deletion EstateManagementUI.BlazorServer/Requests/Requests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public record GetMerchantQuery(CorrelationId CorrelationId, string AccessToken,
public static class Commands
{
public record AddMerchantDeviceCommand(CorrelationId CorrelationId, string AccessToken, Guid EstateId, Guid MerchantId, string DeviceIdentifier) : IRequest<Result>;
public record AddOperatorToMerchantCommand(CorrelationId CorrelationId, string AccessToken, Guid EstateId, Guid MerchantId, Guid OperatorId) : IRequest<Result>;
public record AddOperatorToMerchantCommand(CorrelationId CorrelationId, string AccessToken, Guid EstateId, Guid MerchantId, Guid OperatorId, string? MerchantNumber, string? TerminalNumber) : IRequest<Result>;
public record AddOperatorToEstateCommand(CorrelationId CorrelationId, string AccessToken, Guid EstateId, Guid OperatorId) : IRequest<Result>;
public record AssignContractToMerchantCommand(CorrelationId CorrelationId, string AccessToken, Guid EstateId, Guid MerchantId, Guid ContractId) : IRequest<Result>;
public record CreateContractCommand(CorrelationId CorrelationId, string AccessToken, Guid EstateId, string Description, Guid OperatorId) : IRequest<Result>;
Expand Down