FODInputOnBehalfOfRadioGroup
Descriere Generală
FODInputOnBehalfOfRadioGroup<T>
este o componentă specializată pentru selectarea modului de acțiune: personal sau în numele altcuiva (prin MPower Authorization). Extinde FODSelectableFormComponent<T>
și folosește intern două componente FODInputRadioOnBehalfOf
pentru a oferi o selecție binară specifică pentru operațiuni guvernamentale.
Utilizare de Bază
<!-- Selector standard pentru "în numele cui" -->
<FODInputOnBehalfOfRadioGroup @bind-Value="onBehalfMode"
Label="Depuneți cererea"
OnBehalfOfFirstOptionText="Pentru mine personal"
OnBehalfOfSecondOptionText="În numele altcuiva (MPower)" />
<!-- Selector dezactivat -->
<FODInputOnBehalfOfRadioGroup @bind-Value="fixedMode"
Label="Mod depunere"
Disable="true"
OnBehalfOfFirstOptionText="Personal"
OnBehalfOfSecondOptionText="Prin împuternicire" />
Enum OnBehalfOnEnum
public enum OnBehalfOnEnum
{
Personal, // Acțiune personală
MPowerAuthorization // Acțiune prin împuternicire MPower
}
Atribute și Parametri
Parametru | Tip | Default | Descriere |
---|---|---|---|
Type | FodRadioType | Radio | Tipul afișării (Radio/Button) |
Disable | bool | false | Dezactivează ambele opțiuni |
ShowOnBehalfOf | bool | false | Controlează afișarea (nefolosit în template) |
OnBehalfOfFirstOptionText | string | null | Text pentru opțiunea Personal |
OnBehalfOfSecondOptionText | string | null | Text pentru opțiunea MPower |
Label | string | null | Eticheta grupului |
Exemple de Utilizare
Formular de Depunere Cerere
<EditForm Model="@application" OnValidSubmit="@SubmitApplication">
<DataAnnotationsValidator />
<FODInputOnBehalfOfRadioGroup @bind-Value="application.OnBehalfMode"
Label="Depun această cerere"
OnBehalfOfFirstOptionText="Pentru mine personal"
OnBehalfOfSecondOptionText="În numele unei alte persoane (prin MPower)"
@bind-Value:after="OnModeChanged" />
@if (application.OnBehalfMode == OnBehalfOnEnum.MPowerAuthorization)
{
<div class="mpower-info alert alert-info mt-3">
<h5>Informații despre MPower</h5>
<p>Pentru a depune în numele altcuiva, aveți nevoie de o împuternicire validă în sistemul MPower.</p>
<FodButton Color="FodColor.Primary" @onclick="OpenMPowerSelector">
Selectați împuternicirea
</FodButton>
</div>
@if (selectedAuthorization != null)
{
<div class="selected-authorization mt-3">
<h6>Împuternicire selectată:</h6>
<p><strong>Beneficiar:</strong> @selectedAuthorization.BeneficiaryName</p>
<p><strong>Valabilă până la:</strong> @selectedAuthorization.ValidUntil.ToString("dd.MM.yyyy")</p>
</div>
}
}
<ValidationSummary />
<button type="submit" class="btn btn-primary">Continuă</button>
</EditForm>
@code {
private ApplicationModel application = new();
private MPowerAuthorization selectedAuthorization;
public class ApplicationModel
{
[Required(ErrorMessage = "Selectați modul de depunere")]
public OnBehalfOnEnum? OnBehalfMode { get; set; }
public string AuthorizationId { get; set; }
}
private async Task OnModeChanged()
{
if (application.OnBehalfMode == OnBehalfOnEnum.Personal)
{
selectedAuthorization = null;
application.AuthorizationId = null;
}
}
private async Task OpenMPowerSelector()
{
// Deschide selector pentru împuterniciri MPower
selectedAuthorization = await MPowerService.SelectAuthorization();
if (selectedAuthorization != null)
{
application.AuthorizationId = selectedAuthorization.Id;
}
}
}
Verificare Permisiuni
<div class="service-request-form">
<h3>@serviceName</h3>
@if (serviceRequiresMPower)
{
<FODInputOnBehalfOfRadioGroup @bind-Value="requestMode"
Label="Acest serviciu poate fi solicitat"
OnBehalfOfFirstOptionText="❌ Personal (indisponibil)"
OnBehalfOfSecondOptionText="✓ Doar prin împuternicire MPower"
Disable="@disablePersonalOption" />
}
else
{
<FODInputOnBehalfOfRadioGroup @bind-Value="requestMode"
Label="Solicitați serviciul"
OnBehalfOfFirstOptionText="Pentru dumneavoastră"
OnBehalfOfSecondOptionText="Pentru altă persoană (MPower)" />
}
<div class="request-info mt-3">
@switch (requestMode)
{
case OnBehalfOnEnum.Personal:
<p>Veți completa cererea cu datele dumneavoastră personale.</p>
break;
case OnBehalfOnEnum.MPowerAuthorization:
<p>Veți completa cererea pentru persoana împuternicită.</p>
break;
}
</div>
</div>
@code {
private string serviceName = "Eliberare certificat";
private bool serviceRequiresMPower = false;
private bool disablePersonalOption => serviceRequiresMPower;
private OnBehalfOnEnum requestMode = OnBehalfOnEnum.Personal;
protected override void OnInitialized()
{
if (serviceRequiresMPower)
{
requestMode = OnBehalfOnEnum.MPowerAuthorization;
}
}
}
Workflow cu Pași
<FodWizard>
<FodWizardStep Title="Mod depunere">
<FODInputOnBehalfOfRadioGroup @bind-Value="wizardData.Mode"
Label="Cum doriți să procedați?"
OnBehalfOfFirstOptionText="Depun pentru mine"
OnBehalfOfSecondOptionText="Depun pentru altcineva"
@bind-Value:after="ConfigureNextSteps" />
</FodWizardStep>
@if (wizardData.Mode == OnBehalfOnEnum.MPowerAuthorization)
{
<FodWizardStep Title="Selectare împuternicire">
<h4>Selectați împuternicirea MPower</h4>
<MPowerAuthorizationSelector @bind-Value="wizardData.AuthorizationId" />
</FodWizardStep>
}
<FodWizardStep Title="Date solicitant">
@if (wizardData.Mode == OnBehalfOnEnum.Personal)
{
<PersonalDataForm @bind-Value="wizardData.PersonalData" />
}
else
{
<BeneficiaryDataDisplay AuthorizationId="@wizardData.AuthorizationId" />
}
</FodWizardStep>
<FodWizardStep Title="Confirmare">
<h4>Verificați datele</h4>
<p><strong>Mod depunere:</strong>
@(wizardData.Mode == OnBehalfOnEnum.Personal ? "Personal" : "Prin împuternicire")
</p>
</FodWizardStep>
</FodWizard>
@code {
private WizardData wizardData = new();
public class WizardData
{
public OnBehalfOnEnum Mode { get; set; } = OnBehalfOnEnum.Personal;
public string AuthorizationId { get; set; }
public PersonalData PersonalData { get; set; }
}
private void ConfigureNextSteps()
{
// Configurează pașii următori bazat pe selecție
}
}
Validare Condiționată
<EditForm Model="@model" OnValidSubmit="@HandleSubmit">
<DataAnnotationsValidator />
<FODInputOnBehalfOfRadioGroup @bind-Value="model.Mode"
Label="Tip cerere"
OnBehalfOfFirstOptionText="Cerere personală"
OnBehalfOfSecondOptionText="Cerere prin reprezentant" />
@if (model.Mode == OnBehalfOnEnum.MPowerAuthorization)
{
<div class="authorization-fields mt-3">
<FODInputText @bind-Value="model.AuthorizationNumber"
Label="Număr împuternicire"
Required="true" />
<FodDatePicker @bind-Value="model.AuthorizationDate"
Label="Data împuternicirii"
Required="true" />
<FODInputText @bind-Value="model.BeneficiaryIdnp"
Label="IDNP beneficiar"
Required="true" />
</div>
}
<ValidationSummary />
<button type="submit">Trimite</button>
</EditForm>
@code {
private RequestModel model = new();
public class RequestModel : IValidatableObject
{
public OnBehalfOnEnum Mode { get; set; }
public string AuthorizationNumber { get; set; }
public DateTime? AuthorizationDate { get; set; }
public string BeneficiaryIdnp { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (Mode == OnBehalfOnEnum.MPowerAuthorization)
{
if (string.IsNullOrEmpty(AuthorizationNumber))
yield return new ValidationResult("Numărul împuternicirii este obligatoriu",
new[] { nameof(AuthorizationNumber) });
if (!AuthorizationDate.HasValue)
yield return new ValidationResult("Data împuternicirii este obligatorie",
new[] { nameof(AuthorizationDate) });
if (string.IsNullOrEmpty(BeneficiaryIdnp))
yield return new ValidationResult("IDNP-ul beneficiarului este obligatoriu",
new[] { nameof(BeneficiaryIdnp) });
}
}
}
}
Integrare cu FODInputRadioOnBehalfOf
Componenta folosește intern două instanțe de FODInputRadioOnBehalfOf
:
<FODInputRadioOnBehalfOf Disable="@Disable"
Label="@OnBehalfOfFirstOptionText"
Item="@(new SelectableItem<OnBehalfOnEnum>(OnBehalfOnEnum.Personal))"
T="OnBehalfOnEnum" />
<FODInputRadioOnBehalfOf Disable="@Disable"
Label="@OnBehalfOfSecondOptionText"
Item="@(new SelectableItem<OnBehalfOnEnum>(OnBehalfOnEnum.MPowerAuthorization))"
T="OnBehalfOnEnum" />
Stilizare
Stiluri Standard
/* Grup radio pentru on behalf of */
.fod-onbehalf-group {
border: 1px solid #dee2e6;
border-radius: 8px;
padding: 1rem;
background-color: #f8f9fa;
}
/* Highlight pentru MPower */
.form-check:has(input[value="MPowerAuthorization"]) {
background-color: #e7f3ff;
padding: 0.5rem;
border-radius: 4px;
margin-top: 0.5rem;
}
/* Icon pentru MPower */
.form-check-label:contains("MPower")::before {
content: "🔐 ";
margin-right: 4px;
}
Teme pentru Contexte Diferite
/* Temă pentru servicii guvernamentale */
.gov-theme .fod-onbehalf-group {
background: linear-gradient(to right, #f0f4f8, #e6ecf1);
border-color: #0056b3;
}
/* Evidențiere opțiune recomandată */
.recommended-option {
position: relative;
}
.recommended-option::after {
content: "Recomandat";
position: absolute;
top: -10px;
right: 0;
background: #28a745;
color: white;
padding: 2px 8px;
border-radius: 12px;
font-size: 0.75rem;
}
Best Practices
- Etichete clare - Explicați diferența între personal și MPower
- Validare MPower - Verificați împuternicirea înainte de submit
- Feedback vizual - Arătați clar modul selectat
- Ghidare utilizator - Oferiți informații despre MPower când e selectat
- Fallback - Gestionați cazul când MPower nu e disponibil
Accesibilitate
- Label-uri descriptive pentru fiecare opțiune
- Suport complet pentru keyboard navigation
- ARIA labels pentru screen readers
- Focus vizibil pentru navigare
Integrare cu MPower
// Service pentru verificare împuterniciri
public interface IMPowerService
{
Task<List<MPowerAuthorization>> GetUserAuthorizations();
Task<bool> ValidateAuthorization(string authorizationId);
Task<BeneficiaryInfo> GetBeneficiaryInfo(string authorizationId);
}
// Utilizare în componentă
@inject IMPowerService MPowerService
private async Task ValidateMPowerSelection()
{
if (selectedMode == OnBehalfOnEnum.MPowerAuthorization)
{
var isValid = await MPowerService.ValidateAuthorization(authorizationId);
if (!isValid)
{
// Handle invalid authorization
}
}
}
Limitări
- Suportă doar două opțiuni (Personal/MPower)
- Nu permite customizare completă a opțiunilor
- Dependent de enum OnBehalfOnEnum
Concluzie
FODInputOnBehalfOfRadioGroup este o componentă esențială pentru aplicațiile guvernamentale care necesită distincția între acțiuni personale și cele efectuate în numele altcuiva prin sistemul MPower. Oferă o interfață clară și consistentă pentru această selecție importantă.