Przejdź do głównej zawartości

Komponenty CloudFlow

CloudFlow dostarcza zestaw komponentów UI opartych na Radzen Blazor, rozszerzonych o automatyczną walidację, lokalizację i integrację z systemem.

CFComponentBase

Klasa bazowa dla wszystkich komponentów CloudFlow. Zapewnia wstrzyknięcie serwisów i wspólne parametry.

Wstrzyknięte serwisy

SerwisTypOpis
NavigationManagerNavigationManagerNawigacja między stronami
DialogServiceDialogServiceDialogi i modalne okna Radzen
NotificationServiceNotificationServicePowiadomienia toast
DatabaseServiceDatabaseRequestorServiceOperacje bazodanowe (CRUD)
ClassLocalizerClassLocalizer<T>Lokalizacja pól modelu
SecurityServiceSecurityServiceAutoryzacja i uprawnienia
TabsServiceTabsServiceZarządzanie zakładkami
LocalStorageILocalStorageServiceBlazored Local Storage
LoggerILogger<T>Logowanie
JSRuntimeIJSRuntimeInterop JavaScript
ContextMenuServiceContextMenuServiceMenu kontekstowe
TooltipServiceTooltipServiceTooltips
VariablesServiceVariablesServiceZmienne globalne

Parametry bazowe

ParametrTypOpis
RecordT?Aktualny rekord
RecIdGuidID rekordu
TabItemTabItem?Informacje o zakładce
ParentObjectCFEntity?Obiekt nadrzędny (dla relacji)
ParentObjectIdGuid?ID obiektu nadrzędnego
IsBusyboolWskaźnik zajętości

Użycie

@inherits CFComponentBase<Product>

@code {
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();

// Dostęp do serwisów
var products = await DatabaseService.GetAsync<Product>();

// Logowanie
Logger.LogInformation("Załadowano {Count} produktów", products.Count());

// Nawigacja
NavigationManager.NavigateTo("/products");

// Powiadomienia
NotificationService.Notify(NotificationSeverity.Success, "Sukces", "Operacja zakończona");
}
}

CFForm

Główny komponent formularza obsługujący walidację, zapis i anulowanie.

Parametry

ParametrTypOpis
TItemTypeTyp encji (dziedziczy po CFEntity)
RecordTItem?Rekord do edycji
ExpandstringRelacje do załadowania
SelectstringPola do pobrania
FilterstringFiltr OData
IsModalboolCzy formularz w modalu
EnableAIFillboolWłącz AI fill
AIFillFieldsIEnumerable<string>?Pola do wypełnienia przez AI

Callbacki

CallbackTypKiedy wywoływany
OnSubmitEventCallbackPo wysłaniu formularza
OnCancelEventCallback<MouseEventArgs>Po anulowaniu
OnLoadEventCallback<TItem>Po załadowaniu rekordu
OnAfterCreateEventCallback<TItem>Po utworzeniu nowego
OnAfterUpdateEventCallback<TItem>Po aktualizacji

Przykład

<CFForm TItem="Product" 
Record="@Record"
Expand="Category,Variants"
EnableAIFill="true"
OnAfterCreate="HandleCreated">
<RadzenStack>
<RadzenRow>
<CFTextBox SizeMD="6" @bind-Value="@context.Name" Required="true" />
</RadzenRow>
</RadzenStack>
</CFForm>

@code {
private async Task HandleCreated(Product product)
{
NotificationService.Notify(NotificationSeverity.Success,
"Sukces", $"Utworzono produkt: {product.Name}");
}
}

CFDataGrid

Komponent gridu z automatycznym ładowaniem danych, paginacją, sortowaniem i filtrowaniem.

Parametry

ParametrTypOpis
TItemTypeTyp encji
TFormTypeTyp formularza
ExpandstringRelacje do załadowania
SelectstringPola do pobrania
FilterstringDomyślny filtr OData
OrderBystringDomyślne sortowanie
AllowAddboolPrzycisk dodawania
ConfirmDeleteboolPotwierdzenie usunięcia
UseTabsboolOtwórz w zakładce
CreateInModalboolTwórz w modalu
DialogOptionsDialogOptions?Opcje dialogu
FormParametersDictionary<string, object>?Parametry formularza

Przykład

<CFDataGrid TItem="Product" 
TForm="ProductForm"
Expand="Category"
OrderBy="Name asc"
AllowAdd="true">
<ChildContent>
<RadzenDataGridColumn TItem="Product" Property="Name" Title="Nazwa" />
<RadzenDataGridColumn TItem="Product" Property="Price" Title="Cena" FormatString="{0:C2}" />
</ChildContent>
</CFDataGrid>

CFDataGridEmbedded

Grid osadzony w formularzu dla edycji kolekcji podrzędnych (np. pozycje faktury).

Parametry

ParametrTypOpis
TItemTypeTyp encji podrzędnej
TFormTypeTyp formularza (lub DummyForm)
DataICollection<TItem>Kolekcja danych
ParentObjectCFEntity?Obiekt nadrzędny

Przykład

<CFDataGridEmbedded TItem="OrderItem" 
TForm="DummyForm"
@bind-Data="context.Items"
ParentObject="context">
<ChildContent Context="items">
<RadzenDataGridColumn TItem="OrderItem" Property="ProductName" Title="Produkt">
<EditTemplate Context="row">
<RadzenTextBox @bind-Value="@row.ProductName" class="rz-w-100" />
</EditTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn TItem="OrderItem" Property="Quantity" Title="Ilość">
<EditTemplate Context="row">
<RadzenNumeric @bind-Value="@row.Quantity" class="rz-w-100" />
</EditTemplate>
</RadzenDataGridColumn>
</ChildContent>
</CFDataGridEmbedded>

Komponenty pól formularza

CFTextBox

Pole tekstowe z walidacją.

<CFTextBox SizeMD="6" 
@bind-Value="@context.Name"
Required="true"
LabelText="Nazwa"
Placeholder="Wpisz nazwę..."
MaxLength="255" />

CFTextArea

Pole wieloliniowe.

<CFTextArea SizeMD="12" 
@bind-Value="@context.Description"
LabelText="Opis"
Rows="5"
Placeholder="Wprowadź opis..." />

CFNumeric

Pole numeryczne.

<CFNumeric SizeMD="4" 
@bind-Value="@context.Price"
LabelText="Cena"
Format="C2"
Min="0"
Max="999999.99"
Step="0.01" />

CFDatePicker

Wybór daty.

<CFDatePicker SizeMD="4" 
@bind-Value="@context.StartDate"
Required="true"
LabelText="Data rozpoczęcia"
DateFormat="dd.MM.yyyy" />

CFDropDown

Lista rozwijana dla enumów lub prostych list.

<CFDropDown SizeMD="4" 
TValue="ProductStatus"
Data="@(Tools.GenerateDropdownList<ProductStatus>())"
@bind-Value="@context.Status"
TextProperty="Text"
ValueProperty="Value"
LabelText="Status"
Placeholder="Wybierz status..." />

CFDropDownDataGrid

Lista rozwijana z gridem dla wyboru rekordu z relacji.

<CFDropDownDataGrid SizeMD="6" 
TValue="Guid?"
@bind-Value="@context.CategoryId"
LabelText="Kategoria"
Placeholder="Wybierz kategorię..." />

CFCheckbox

Pole wyboru.

<CFCheckbox @bind-Value="@context.IsActive" 
LabelText="Aktywny" />

CFMask

Pole z maską wprowadzania.

<CFMask SizeMD="4" 
@bind-Value="@context.NIP"
LabelText="NIP"
Mask="***-***-**-**"
CharacterPattern="[0-9]"
Placeholder="000-000-00-00" />

CFRadioButton

Przyciski radio.

<CFRadioButton TValue="PaymentMethod"
@bind-Value="@context.PaymentMethod"
Data="@paymentMethods"
TextProperty="Name"
ValueProperty="Value"
Orientation="Orientation.Horizontal" />

Wspólne parametry komponentów

ParametrTypOpis
@bind-ValueTValueWiązanie wartości (two-way binding)
LabelTextstringEtykieta pola
RequiredboolPole wymagane
DisabledboolPole wyłączone
PlaceholderstringTekst placeholder
SizeintSzerokość (1-12) dla wszystkich
SizeMDintSzerokość dla medium screens
SizeLGintSzerokość dla large screens

Narzędzia pomocnicze

Tools.GenerateDropdownList

Generuje listę dla dropdowna z enuma:

var statusList = Tools.GenerateDropdownList<ProductStatus>();
// Zwraca IEnumerable<{ Text, Value }> z Display names

ClassLocalizer

Automatyczne tłumaczenie nazw pól:

<CFTextBox LabelText="@ClassLocalizer["Name"]" />

@* Pobiera "Nazwa produktu" z Product.pl-PL.resx *@

GetDisplayName()

Rozszerzenie dla enumów:

var displayName = product.Status.GetDisplayName();
// Zwraca "Aktywny" zamiast "Active"

Troubleshooting

Problem: Formularz nie ładuje rekordu

Rozwiązanie:

  1. Sprawdź czy Expand zawiera wszystkie potrzebne relacje
  2. Sprawdź konsolę przeglądarki na błędy HTTP
  3. Upewnij się że RecId lub Record jest przekazany

Problem: Kolumna nie wyświetla danych relacji

Rozwiązanie:

  1. Dodaj relację do Expand: Expand="Category"
  2. Sprawdź czy FK jest prawidłowo skonfigurowany

Problem: Tłumaczenia nie działają

Rozwiązanie:

  1. Sprawdź czy plik .pl-PL.resx istnieje
  2. Upewnij się że klucz odpowiada nazwie właściwości
  3. Przebuduj projekt (dotnet build)

Problem: Walidacja nie działa

Rozwiązanie:

  1. Sprawdź czy pole ma atrybut [Required] w modelu
  2. Upewnij się że używasz Required="true" w komponencie
  3. Sprawdź czy formularz jest wewnątrz CFForm