Optymalizacja soneta-form-xml skill

This commit is contained in:
Marcin Wojas
2026-03-05 15:31:31 +01:00
parent 3f5d9a795e
commit 898fd6a98d
43 changed files with 5677 additions and 525 deletions
@@ -0,0 +1,12 @@
{
"eval_id": 3,
"eval_name": "warunkowa-widocznosc",
"prompt": "Pokaż jak w pageform.xml enova365 zastosować warunkową widoczność pól używając wyrażeń RowCondition. Stwórz przykładowy plik Kontrahent.Kredyt.pageform.xml z następującymi wzorcami:\n1. Pole 'LimitKredytu' widoczne tylko gdy TypKlienta='Korporacyjny'\n2. Pole 'WarunkiSpecjalne' widoczne gdy Status='Premium' LUB Status='VIP'\n3. Pole 'OstrzezenieBranze' widoczne gdy NIE Status='Aktywny'\n4. Przycisk Command widoczny gdy ObrotyRoczne > 0 (użyj WorkCondition lub własność bool)\n5. Cała Grupa 'Dane zaawansowane' zwijalna (Collapsable) z Renderable uzależnionym od licencji",
"assertions": [
"Użyto składni Visibility=\"{?Pole=Wartość}\" dla warunku równości",
"Użyto składni OR dla wielu wartości: {?Status=Premium or Status=VIP}",
"Użyto negacji: {?!Status=Aktywny}",
"Klasa Collapsable jest zastosowana do grupy",
"Atrybut Renderable jest użyty dla warunku licencji"
]
}
@@ -0,0 +1,35 @@
{
"expectations": [
{
"text": "Użyto składni Visibility=\"{?Pole=Wartość}\" dla warunku równości",
"passed": true,
"evidence": "Linia 30: Visibility=\"{?TypKlienta=Korporacyjny}\" — poprawna składnia RowCondition"
},
{
"text": "Użyto składni OR dla wielu wartości: {?Status=Premium or Status=VIP}",
"passed": true,
"evidence": "Linia 48: Visibility=\"{?Status=Premium or Status=VIP}\" — poprawny operator or"
},
{
"text": "Użyto negacji: {?!Status=Aktywny}",
"passed": true,
"evidence": "Linia 65: Visibility=\"{?!Status=Aktywny}\" — poprawna negacja z !"
},
{
"text": "Klasa Collapsable jest zastosowana do grupy",
"passed": true,
"evidence": "Linia 109: <Group CaptionHtml=\"Dane zaawansowane\" Class=\"Collapsable\" ...>"
},
{
"text": "Atrybut Renderable jest użyty dla warunku licencji",
"passed": true,
"evidence": "Linia 110: Renderable=\"{Licence.HAN}\" — licencja HAN jako warunek renderowania"
}
],
"summary": {
"passed": 5,
"failed": 0,
"total": 5,
"pass_rate": 1.0
}
}
@@ -0,0 +1,128 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Zakładka: Kredyt kontrahenta
Plik: Kontrahent.Kredyt.pageform.xml
Demonstruje wzorce warunkowej widoczności przy użyciu:
- RowCondition ({?...}) dla porównań wartości pól
- Visibility z bindowaniem do właściwości bool
- Renderable uzależniony od licencji (liczony raz przy logowaniu)
- Class="Collapsable" dla zwijanych grup
-->
<DataForm xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.enova.pl/schema/form.xsd"
xsi:schemaLocation="http://www.enova.pl/schema/ http://www.enova.pl/schema/form.xsd"
Priority="30">
<Page CaptionHtml="Kredyt" DataContext="{DataSource}">
<!-- =====================================================================
WZORZEC 1: Pole widoczne tylko gdy TypKlienta = 'Korporacyjny'
Używamy wyrażenia RowCondition: {?TypKlienta=Korporacyjny}
Pole LimitKredytu jest zwijane (Collapsed) gdy warunek nie jest spełniony.
====================================================================== -->
<Group CaptionHtml="Limit kredytu">
<Field CaptionHtml="Typ klienta" Width="20" EditValue="{TypKlienta}" />
<Field CaptionHtml="Limit kredytu"
Width="18"
EditValue="{LimitKredytu}"
Visibility="{?TypKlienta=Korporacyjny}" />
<Field CaptionHtml="Waluta limitu"
Width="10"
EditValue="{WalutaLimitu}"
Visibility="{?TypKlienta=Korporacyjny}" />
</Group>
<!-- =====================================================================
WZORZEC 2: Pole widoczne gdy Status = 'Premium' LUB Status = 'VIP'
Używamy operatora 'or' w wyrażeniu RowCondition.
Składnia: {?Pole=Wartość1 or Pole=Wartość2}
====================================================================== -->
<Group CaptionHtml="Warunki specjalne">
<Field CaptionHtml="Status klienta" Width="20" EditValue="{Status}" />
<Field CaptionHtml="Warunki specjalne"
Width="*"
Height="3"
EditValue="{WarunkiSpecjalne}"
Visibility="{?Status=Premium or Status=VIP}" />
<Field CaptionHtml="Opiekun VIP"
Width="30"
EditValue="{OpiekunVIP}"
Visibility="{?Status=Premium or Status=VIP}" />
</Group>
<!-- =====================================================================
WZORZEC 3: Pole widoczne gdy NIE Status = 'Aktywny'
Używamy negacji w wyrażeniu RowCondition: {?!Status=Aktywny}
Ostrzeżenie o branży pojawia się tylko dla nieaktywnych kontrahentów.
====================================================================== -->
<Group CaptionHtml="Ostrzeżenia">
<Field CaptionHtml="Ostrzezenie branze"
Width="*"
EditValue="{OstrzezenieBranzy}"
Class="WarningLabel"
Visibility="{?!Status=Aktywny}" />
<Field CaptionHtml="Powod nieaktywnosci"
Width="*"
EditValue="{PowodNieaktywnosci}"
Visibility="{?!Status=Aktywny}" />
</Group>
<!-- =====================================================================
WZORZEC 4: Przycisk Command widoczny gdy ObrotyRoczne > 0
Dla porównań numerycznych (> < >= <=) RowCondition nie obsługuje
operatorów arytmetycznych bezpośrednio — zamiast tego:
a) Używamy właściwości bool z logiki biznesowej: {MaObrotyRoczne}
(właściwość C# zwracająca: ObrotyRoczne > 0)
b) Alternatywnie: worker z właściwością bool: {Workers.KredytWorker.MaObroty}
====================================================================== -->
<Group CaptionHtml="Analiza obrotow">
<Row>
<Field CaptionHtml="Obroty roczne" Width="18" EditValue="{ObrotyRoczne}" />
<Field CaptionHtml="Obroty miesieczne" Width="18" EditValue="{ObrotyMiesieczne}" />
<Gap Width="*" />
<!-- Przycisk widoczny gdy ObrotyRoczne > 0 (via właściwość bool MaObrotyRoczne) -->
<Command CaptionHtml="Analiza kredytowa"
Width="18"
MethodName="WykonajAnalize"
CommandStyle="Important"
Visibility="{MaObrotyRoczne}" />
<!-- Alternatywny wzorzec: worker z właściwością bool -->
<Command CaptionHtml="Raport obrotow"
Width="16"
MethodName="GenerujRaport"
DataContext="{new KredytExtender}"
Visibility="{Workers.KredytWorker.MaObroty}" />
</Row>
</Group>
<!-- =====================================================================
WZORZEC 5: Grupa zwijalna (Collapsable) z Renderable uzależnionym
od licencji.
- Class="Collapsable" — użytkownik może zwijać/rozwijać grupę
- Renderable="{Licence.HAN}" — renderowana tylko gdy licencja HAN
aktywna (wartość liczona RAZ przy logowaniu operatora, optymalne
dla warunków środowiskowych i licencyjnych)
====================================================================== -->
<Group CaptionHtml="Dane zaawansowane"
Class="Collapsable"
Renderable="{Licence.HAN}">
<Row>
<Stack LabelWidth="20">
<Field CaptionHtml="Scoring kredytowy" Width="10" EditValue="{ScoringKredytowy}" />
<Field CaptionHtml="Kategoria ryzyka" Width="20" EditValue="{KategoriaRyzyka}" />
<Field CaptionHtml="Data ostatniej oceny" Width="15" EditValue="{DataOstOceny}" />
</Stack>
<Stack LabelWidth="20">
<Field CaptionHtml="Maksymalna ekspozycja" Width="18" EditValue="{MaksEkspozycja}" />
<Field CaptionHtml="Ubezpieczenie kredytu" Width="8" EditValue="{UbezpieczenieKredytu}" />
<Field CaptionHtml="Firma ubezpieczeniowa" Width="25" EditValue="{FirmaUbezpieczeniowa}"
Visibility="{UbezpieczenieKredytu}" />
</Stack>
</Row>
<Field CaptionHtml="Uwagi analityka" Width="*" Height="3" EditValue="{UwagiAnalityka}" />
</Group>
</Page>
</DataForm>
@@ -0,0 +1,4 @@
{
"files_created": ["Kontrahent.Kredyt.pageform.xml"],
"errors_encountered": 0
}
@@ -0,0 +1,5 @@
{
"total_tokens": 37262,
"duration_ms": 72689,
"total_duration_seconds": 72.7
}
@@ -0,0 +1,35 @@
{
"expectations": [
{
"text": "Użyto składni Visibility=\"{?Pole=Wartość}\" dla warunku równości",
"passed": false,
"evidence": "Użyto RowCondition=\"Kontrahent.TypKlienta = 'Korporacyjny'\" (nie istniejący atrybut) zamiast Visibility=\"{?...}\""
},
{
"text": "Użyto składni OR dla wielu wartości: {?Status=Premium or Status=VIP}",
"passed": false,
"evidence": "Użyto RowCondition=\"... OR ...\" (SQL-like syntax) zamiast Visibility=\"{?... or ...}\""
},
{
"text": "Użyto negacji: {?!Status=Aktywny}",
"passed": false,
"evidence": "Użyto RowCondition=\"NOT (...)\" zamiast Visibility=\"{?!...}\""
},
{
"text": "Klasa Collapsable jest zastosowana do grupy",
"passed": false,
"evidence": "Użyto Collapsable=\"True\" jako atrybut zamiast Class=\"Collapsable\""
},
{
"text": "Atrybut Renderable jest użyty dla warunku licencji",
"passed": false,
"evidence": "Użyto Renderable=\"Session.Features.IsAvailable(...)\" — błędna składnia wyrażenia, nie jest to format {Licence.X}"
}
],
"summary": {
"passed": 0,
"failed": 5,
"total": 5,
"pass_rate": 0.0
}
}
@@ -0,0 +1,167 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Kontrahent.Kredyt.pageform.xml
Przykład warunkowej widoczności pól w enova365 za pomocą wyrażeń RowCondition/Renderable.
Obiekt biznesowy: Kontrahent (moduł Handel)
-->
<Form
xmlns="http://www.enova.pl/schema/Form.xsd"
Caption="Kredyt kontrahenta"
Domain="Handel"
Class="Kontrahent"
View="Kredyt">
<!-- ============================================================
ŹRÓDŁO DANYCH
============================================================ -->
<DataSources>
<DataSource Name="Kontrahent" Class="Kontrahent" />
</DataSources>
<!-- ============================================================
KONTROLKI / LAYOUT
============================================================ -->
<Controls>
<!-- ──────────────────────────────────────────────────────────
1. Pole 'LimitKredytu' widoczne tylko gdy TypKlienta = 'Korporacyjny'
Użycie atrybutu RowCondition z wyrażeniem porównania wartości enumeracji/stringa.
────────────────────────────────────────────────────────── -->
<Edit
Name="LimitKredytu"
Caption="Limit kredytu"
Source="Kontrahent.LimitKredytu"
RowCondition="Kontrahent.TypKlienta = 'Korporacyjny'"
Visible="True" />
<!--
Uwaga: atrybut RowCondition przyjmuje wyrażenie ewaluowane przez silnik
wyrażeń Soneta (podobne do SQL WHERE). Gdy warunek jest False, wiersz
(kontrolka) jest ukrywany odpowiednik Visible=False ustawianego
dynamicznie w runtime.
-->
<!-- ──────────────────────────────────────────────────────────
2. Pole 'WarunkiSpecjalne' widoczne gdy Status = 'Premium' LUB Status = 'VIP'
Łączenie warunków operatorem OR (w Soneta: słowo kluczowe OR lub ||).
────────────────────────────────────────────────────────── -->
<Edit
Name="WarunkiSpecjalne"
Caption="Warunki specjalne"
Source="Kontrahent.WarunkiSpecjalne"
RowCondition="Kontrahent.Status = 'Premium' OR Kontrahent.Status = 'VIP'"
Visible="True" />
<!--
Alternatywna forma z nawiasami (zalecana dla czytelności):
RowCondition="(Kontrahent.Status = 'Premium') OR (Kontrahent.Status = 'VIP')"
-->
<!-- ──────────────────────────────────────────────────────────
3. Pole 'OstrzezenieBranze' widoczne gdy NIE Status = 'Aktywny'
Negacja warunku operator NOT lub <> (różne od).
────────────────────────────────────────────────────────── -->
<Edit
Name="OstrzezenieBranze"
Caption="Ostrzeżenie branży"
Source="Kontrahent.OstrzezenieBranze"
RowCondition="NOT (Kontrahent.Status = 'Aktywny')"
Visible="True" />
<!--
Równoważna postać z operatorem nierówności:
RowCondition="Kontrahent.Status &lt;&gt; 'Aktywny'"
W XML znaki < i > muszą być escapowane jako &lt; i &gt;.
-->
<!-- ──────────────────────────────────────────────────────────
4. Przycisk Command widoczny gdy ObrotyRoczne > 0
Dla warunków numerycznych zalecane jest mapowanie na właściwość bool
po stronie C# (np. MaObroty : bool { get => ObrotyRoczne > 0; })
i użycie jej w RowCondition lub WorkCondition.
Wariant A bezpośrednie wyrażenie numeryczne w RowCondition:
────────────────────────────────────────────────────────── -->
<Command
Name="PrzeliczKredyt"
Caption="Przelicz limit kredytu"
Action="Kontrahent.PrzeliczKredyt"
RowCondition="Kontrahent.ObrotyRoczne &gt; 0" />
<!--
Wariant B użycie właściwości bool z obiektu biznesowego (ZALECANE):
<Command
Name="PrzeliczKredyt"
Caption="Przelicz limit kredytu"
Action="Kontrahent.PrzeliczKredyt"
WorkCondition="Kontrahent.MaObroty" />
WorkCondition kontroluje AKTYWNOŚĆ (enabled) przycisku,
RowCondition kontroluje WIDOCZNOŚĆ (visible).
Można stosować oba jednocześnie.
Wariant C oba atrybuty razem:
<Command
Name="PrzeliczKredyt"
Caption="Przelicz limit kredytu"
Action="Kontrahent.PrzeliczKredyt"
RowCondition="Kontrahent.ObrotyRoczne &gt; 0"
WorkCondition="Kontrahent.MaObroty" />
-->
<!-- ──────────────────────────────────────────────────────────
5. Grupa 'Dane zaawansowane' zwijalna (Collapsable) z Renderable
uzależnionym od licencji.
Collapsable="True" pozwala użytkownikowi zwinąć grupę w UI.
Renderable wyrażenie decydujące, czy kontrolka jest w ogóle
renderowana (silniejsze niż Visible: nie zajmuje
miejsca w DOM formularza gdy False).
Tu: sprawdzamy dostępność modułu/licencji
przez wywołanie metody pomocniczej lub właściwość
sesji, np. Session.IsModuleAvailable('CRM').
────────────────────────────────────────────────────────── -->
<Group
Name="DaneZaawansowane"
Caption="Dane zaawansowane"
Collapsable="True"
Collapsed="False"
Renderable="Session.Features.IsAvailable('Kontrahent.DaneZaawansowane')">
<!-- Pola wewnątrz grupy zaawansowanej -->
<Edit
Name="KategoriaRyzyka"
Caption="Kategoria ryzyka"
Source="Kontrahent.KategoriaRyzyka" />
<Edit
Name="SkorKredytowy"
Caption="Skor kredytowy"
Source="Kontrahent.SkorKredytowy" />
<Edit
Name="DataOstatnejWeryfikacji"
Caption="Data ostatniej weryfikacji"
Source="Kontrahent.DataOstatnejWeryfikacji" />
</Group>
<!--
Uwaga do Renderable:
Gdy Renderable = False, kontrolka NIE jest tworzona w ogóle (brak węzła w drzewie UI).
Gdy Visible = False lub RowCondition = False, kontrolka istnieje, ale jest ukryta.
Renderable jest lepsze dla elementów zależnych od licencji/uprawnień,
ponieważ eliminuje element z drzewa renderowania.
Przykładowe wyrażenia Renderable uzależnione od licencji:
Renderable="Session.IsLicensed('ModulCRM')"
Renderable="Session.Rights.HasFeature('KredytKorporacyjny')"
Renderable="App.Configuration.GetBool('pokazDaneZaawansowane')"
-->
</Controls>
</Form>
@@ -0,0 +1,4 @@
{
"files_created": ["Kontrahent.Kredyt.pageform.xml"],
"errors_encountered": 0
}
@@ -0,0 +1,5 @@
{
"total_tokens": 5896,
"duration_ms": 50293,
"total_duration_seconds": 50.3
}