Optymalizacja soneta-form-xml skill
This commit is contained in:
@@ -0,0 +1,187 @@
|
||||
{
|
||||
"metadata": {
|
||||
"skill_name": "soneta-form-xml",
|
||||
"skill_path": "/Users/marcin/d/Skills/soneta-form-xml",
|
||||
"executor_model": "claude-sonnet-4-6",
|
||||
"timestamp": "2026-03-05T12:00:00Z",
|
||||
"evals_run": ["pageform-z-gridem", "viewform-lista", "warunkowa-widocznosc"],
|
||||
"runs_per_configuration": 1
|
||||
},
|
||||
|
||||
"runs": [
|
||||
{
|
||||
"eval_id": 1,
|
||||
"eval_name": "pageform-z-gridem",
|
||||
"configuration": "with_skill",
|
||||
"run_number": 1,
|
||||
"result": {
|
||||
"pass_rate": 1.0,
|
||||
"passed": 8,
|
||||
"failed": 0,
|
||||
"total": 8,
|
||||
"time_seconds": 37.8,
|
||||
"tokens": 32707,
|
||||
"tool_calls": 9,
|
||||
"errors": 0
|
||||
},
|
||||
"expectations": [
|
||||
{"text": "Plik zaczyna się od <?xml...?>", "passed": true, "evidence": "Poprawna deklaracja XML"},
|
||||
{"text": "DataForm ma Priority=\"10\"", "passed": true, "evidence": "Atrybut w elemencie root"},
|
||||
{"text": "Page ma DataContext=\"{DataSource}\"", "passed": true, "evidence": "Linia 8"},
|
||||
{"text": "Trzy grupy: Dane podstawowe, Warunki, Pozycje", "passed": true, "evidence": "Linie 10,17,30"},
|
||||
{"text": "Układ Row>Stack w grupie Warunki", "passed": true, "evidence": "Linie 18-28"},
|
||||
{"text": "Grid: IsToolbarVisible, EditInPlace, NewInPlace", "passed": true, "evidence": "Linie 31-35"},
|
||||
{"text": "Footer=Sum na Ilosc i Wartosc", "passed": true, "evidence": "Linie 38,40"},
|
||||
{"text": "Binding {NazwaPola}", "passed": true, "evidence": "EditValue we wszystkich polach"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"eval_id": 1,
|
||||
"eval_name": "pageform-z-gridem",
|
||||
"configuration": "without_skill",
|
||||
"run_number": 1,
|
||||
"result": {
|
||||
"pass_rate": 0.5,
|
||||
"passed": 4,
|
||||
"failed": 4,
|
||||
"total": 8,
|
||||
"time_seconds": 17.7,
|
||||
"tokens": 4263,
|
||||
"tool_calls": 3,
|
||||
"errors": 0
|
||||
},
|
||||
"expectations": [
|
||||
{"text": "Plik zaczyna się od <?xml...?>", "passed": true, "evidence": "Poprawna deklaracja"},
|
||||
{"text": "DataForm ma Priority=\"10\"", "passed": false, "evidence": "Używa <PageForm.Priority> zamiast atrybutu"},
|
||||
{"text": "Page ma DataContext=\"{DataSource}\"", "passed": false, "evidence": "Brak Page i DataContext"},
|
||||
{"text": "Trzy grupy: Dane podstawowe, Warunki, Pozycje", "passed": false, "evidence": "Grupy z Name= zamiast CaptionHtml="},
|
||||
{"text": "Układ Row>Stack w grupie Warunki", "passed": true, "evidence": "Row>Stack obecne"},
|
||||
{"text": "Grid: IsToolbarVisible, EditInPlace, NewInPlace", "passed": true, "evidence": "Atrybuty obecne"},
|
||||
{"text": "Footer=Sum na Ilosc i Wartosc", "passed": true, "evidence": "Footer=Sum na Column"},
|
||||
{"text": "Binding {NazwaPola}", "passed": false, "evidence": "Brak EditValue — używa Name= na Control"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"eval_id": 2,
|
||||
"eval_name": "viewform-lista",
|
||||
"configuration": "with_skill",
|
||||
"run_number": 1,
|
||||
"result": {
|
||||
"pass_rate": 1.0,
|
||||
"passed": 7,
|
||||
"failed": 0,
|
||||
"total": 7,
|
||||
"time_seconds": 38.4,
|
||||
"tokens": 34304,
|
||||
"tool_calls": 10,
|
||||
"errors": 0
|
||||
},
|
||||
"expectations": [
|
||||
{"text": "Poprawna deklaracja XML", "passed": true, "evidence": "Linia 1"},
|
||||
{"text": "xmlns='http://www.enova.pl/schema/form.xsd'", "passed": true, "evidence": "Poprawny namespace"},
|
||||
{"text": "Element Grid", "passed": true, "evidence": "Grid z ViewType=Folder"},
|
||||
{"text": "OrderBy='NazwiskoImie'", "passed": true, "evidence": "Linia 12"},
|
||||
{"text": "IsToolbarVisible i IsFilterRowVisible", "passed": true, "evidence": "Linie 10-11"},
|
||||
{"text": "6 pól: Kod, NazwiskoImie, NumerPracownika, Dzial, Stanowisko, DataZatrudnienia", "passed": true, "evidence": "Linie 13-18"},
|
||||
{"text": "Dzial ma Width='*'", "passed": true, "evidence": "Linia 16"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"eval_id": 2,
|
||||
"eval_name": "viewform-lista",
|
||||
"configuration": "without_skill",
|
||||
"run_number": 1,
|
||||
"result": {
|
||||
"pass_rate": 0.43,
|
||||
"passed": 3,
|
||||
"failed": 4,
|
||||
"total": 7,
|
||||
"time_seconds": 13.9,
|
||||
"tokens": 3821,
|
||||
"tool_calls": 3,
|
||||
"errors": 0
|
||||
},
|
||||
"expectations": [
|
||||
{"text": "Poprawna deklaracja XML", "passed": true, "evidence": "Linia 1"},
|
||||
{"text": "xmlns='http://www.enova.pl/schema/form.xsd'", "passed": false, "evidence": "Błędny namespace: http://www.soneta.pl/viewform"},
|
||||
{"text": "Element Grid", "passed": false, "evidence": "<grid> lowercase — błędna nazwa elementu"},
|
||||
{"text": "OrderBy='NazwiskoImie'", "passed": false, "evidence": "defaultsort= zamiast OrderBy="},
|
||||
{"text": "IsToolbarVisible i IsFilterRowVisible", "passed": false, "evidence": "Atrybuty lowercase — błędna składnia"},
|
||||
{"text": "6 pól: Kod, NazwiskoImie, NumerPracownika, Dzial, Stanowisko, DataZatrudnienia", "passed": true, "evidence": "<column> z właściwymi nazwami"},
|
||||
{"text": "Dzial ma Width='*'", "passed": true, "evidence": "width='*' na Dzial"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"eval_id": 3,
|
||||
"eval_name": "warunkowa-widocznosc",
|
||||
"configuration": "with_skill",
|
||||
"run_number": 1,
|
||||
"result": {
|
||||
"pass_rate": 1.0,
|
||||
"passed": 5,
|
||||
"failed": 0,
|
||||
"total": 5,
|
||||
"time_seconds": 72.7,
|
||||
"tokens": 37262,
|
||||
"tool_calls": 10,
|
||||
"errors": 0
|
||||
},
|
||||
"expectations": [
|
||||
{"text": "Visibility='{?Pole=Wartość}'", "passed": true, "evidence": "Linia 30: {?TypKlienta=Korporacyjny}"},
|
||||
{"text": "OR: {?Status=Premium or Status=VIP}", "passed": true, "evidence": "Linia 48"},
|
||||
{"text": "Negacja: {?!Status=Aktywny}", "passed": true, "evidence": "Linia 65"},
|
||||
{"text": "Class='Collapsable' na Group", "passed": true, "evidence": "Linia 109"},
|
||||
{"text": "Renderable dla licencji", "passed": true, "evidence": "Linia 110: Renderable='{Licence.HAN}'"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"eval_id": 3,
|
||||
"eval_name": "warunkowa-widocznosc",
|
||||
"configuration": "without_skill",
|
||||
"run_number": 1,
|
||||
"result": {
|
||||
"pass_rate": 0.0,
|
||||
"passed": 0,
|
||||
"failed": 5,
|
||||
"total": 5,
|
||||
"time_seconds": 50.3,
|
||||
"tokens": 5896,
|
||||
"tool_calls": 3,
|
||||
"errors": 0
|
||||
},
|
||||
"expectations": [
|
||||
{"text": "Visibility='{?Pole=Wartość}'", "passed": false, "evidence": "RowCondition= (nie istnieje) zamiast Visibility"},
|
||||
{"text": "OR: {?Status=Premium or Status=VIP}", "passed": false, "evidence": "SQL-like OR syntax zamiast {?... or ...}"},
|
||||
{"text": "Negacja: {?!Status=Aktywny}", "passed": false, "evidence": "NOT (...) zamiast {?!...}"},
|
||||
{"text": "Class='Collapsable' na Group", "passed": false, "evidence": "Collapsable='True' atrybut zamiast Class="},
|
||||
{"text": "Renderable dla licencji", "passed": false, "evidence": "Session.Features.IsAvailable() — błędna składnia"}
|
||||
]
|
||||
}
|
||||
],
|
||||
|
||||
"run_summary": {
|
||||
"with_skill": {
|
||||
"pass_rate": {"mean": 1.0, "stddev": 0.0, "min": 1.0, "max": 1.0},
|
||||
"time_seconds": {"mean": 49.6, "stddev": 18.1, "min": 37.8, "max": 72.7},
|
||||
"tokens": {"mean": 34758, "stddev": 2284, "min": 32707, "max": 37262}
|
||||
},
|
||||
"without_skill": {
|
||||
"pass_rate": {"mean": 0.31, "stddev": 0.22, "min": 0.0, "max": 0.5},
|
||||
"time_seconds": {"mean": 27.3, "stddev": 19.1, "min": 13.9, "max": 50.3},
|
||||
"tokens": {"mean": 4660, "stddev": 1080, "min": 3821, "max": 5896}
|
||||
},
|
||||
"delta": {
|
||||
"pass_rate": "+0.69",
|
||||
"time_seconds": "+22.3",
|
||||
"tokens": "+30098"
|
||||
}
|
||||
},
|
||||
|
||||
"notes": [
|
||||
"Skill daje 100% pass rate we wszystkich 3 ewalach vs 31% bez skilla — poprawa o 69 punktów procentowych",
|
||||
"Bez skilla model halucynuje nieistniejące elementy XML: <PageForm>, <Control>, <viewform>, <Edit>, RowCondition=",
|
||||
"Najsłabszy wynik bez skilla: warunkowa-widocznosc (0%) — model zna pojęcia ale ma zupełnie błędną składnię",
|
||||
"Skill kosztuje więcej tokenów (30k vs 4.7k) i czasu (50s vs 27s) — uzasadnione biorąc pod uwagę czytanie SKILL.md i ELEMENTS.md",
|
||||
"Asercja 'Poprawna deklaracja XML' zawsze przechodzi — mało dyskryminująca, ale utrzymana dla kompletności"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"eval_id": 1,
|
||||
"eval_name": "pageform-z-gridem",
|
||||
"prompt": "Utwórz plik Zamowienie.Szczegoly.pageform.xml dla platformy enova365. Zakładka powinna zawierać:\n- Grupę 'Dane podstawowe' z polami: Numer (szerokość 20), DataZlozenia (szerokość 15), Kontrahent (szerokość *), Status (szerokość 15)\n- Grupę 'Warunki' z układem dwukolumnowym (Row > Stack): lewa kolumna ma SposobDostawy (20) i TerminDostawy (15), prawa kolumna ma SposobZaplaty (20) i TerminZaplaty (15)\n- Grupę 'Pozycje' z Grid (IsToolbarVisible, EditInPlace, NewInPlace) i kolumnami: Lp (5), Towar (*), Ilosc (10) z Footer=Sum, CenaJednostkowa (18), Wartosc (15) z Footer=Sum\nPriority zakładki: 10.",
|
||||
"assertions": [
|
||||
"Plik zaczyna się od <?xml version=\"1.0\" encoding=\"utf-8\"?>",
|
||||
"Element DataForm ma atrybut Priority=\"10\"",
|
||||
"Element Page ma atrybut DataContext=\"{DataSource}\"",
|
||||
"Są trzy elementy Group: 'Dane podstawowe', 'Warunki', 'Pozycje'",
|
||||
"Układ dwukolumnowy w grupie Warunki używa Row zawierającego Stack",
|
||||
"Element Grid ma atrybuty IsToolbarVisible=\"true\", EditInPlace=\"true\", NewInPlace=\"true\"",
|
||||
"Pola Ilosc i Wartosc w Grid mają atrybut Footer=\"Sum\"",
|
||||
"Binding pól używa składni {NazwaPola} w cudzysłowie"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
{
|
||||
"expectations": [
|
||||
{
|
||||
"text": "Plik zaczyna się od <?xml version=\"1.0\" encoding=\"utf-8\"?>",
|
||||
"passed": true,
|
||||
"evidence": "Linia 1: <?xml version=\"1.0\" encoding=\"utf-8\"?>"
|
||||
},
|
||||
{
|
||||
"text": "Element DataForm ma atrybut Priority=\"10\"",
|
||||
"passed": true,
|
||||
"evidence": "Linia 6: Priority=\"10\" w elemencie DataForm"
|
||||
},
|
||||
{
|
||||
"text": "Element Page ma atrybut DataContext=\"{DataSource}\"",
|
||||
"passed": true,
|
||||
"evidence": "Linia 8: <Page CaptionHtml=\"Szczegoly\" DataContext=\"{DataSource}\">"
|
||||
},
|
||||
{
|
||||
"text": "Są trzy elementy Group: 'Dane podstawowe', 'Warunki', 'Pozycje'",
|
||||
"passed": true,
|
||||
"evidence": "Linie 10, 17, 30: Group CaptionHtml=\"Dane podstawowe\", \"Warunki\", \"Pozycje\""
|
||||
},
|
||||
{
|
||||
"text": "Układ dwukolumnowy w grupie Warunki używa Row zawierającego Stack",
|
||||
"passed": true,
|
||||
"evidence": "Linie 18-28: <Row><Stack>SposobDostawy, TerminDostawy</Stack><Stack>SposobZaplaty, TerminZaplaty</Stack></Row>"
|
||||
},
|
||||
{
|
||||
"text": "Element Grid ma atrybuty IsToolbarVisible=\"true\", EditInPlace=\"true\", NewInPlace=\"true\"",
|
||||
"passed": true,
|
||||
"evidence": "Linie 31-35: Grid z IsToolbarVisible=\"true\" EditInPlace=\"true\" NewInPlace=\"true\""
|
||||
},
|
||||
{
|
||||
"text": "Pola Ilosc i Wartosc w Grid mają atrybut Footer=\"Sum\"",
|
||||
"passed": true,
|
||||
"evidence": "Linia 38: Footer=\"Sum\" na Ilosc; Linia 40: Footer=\"Sum\" na Wartosc"
|
||||
},
|
||||
{
|
||||
"text": "Binding pól używa składni {NazwaPola} w cudzysłowie",
|
||||
"passed": true,
|
||||
"evidence": "EditValue=\"{Numer}\", EditValue=\"{DataZlozenia}\" itp. — poprawna składnia"
|
||||
}
|
||||
],
|
||||
"summary": {
|
||||
"passed": 8,
|
||||
"failed": 0,
|
||||
"total": 8,
|
||||
"pass_rate": 1.0
|
||||
}
|
||||
}
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<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="10">
|
||||
|
||||
<Page CaptionHtml="Szczegoly" DataContext="{DataSource}">
|
||||
|
||||
<Group CaptionHtml="Dane podstawowe">
|
||||
<Field CaptionHtml="Numer" Width="20" EditValue="{Numer}" />
|
||||
<Field CaptionHtml="DataZlozenia" Width="15" EditValue="{DataZlozenia}" />
|
||||
<Field CaptionHtml="Kontrahent" Width="*" EditValue="{Kontrahent}" />
|
||||
<Field CaptionHtml="Status" Width="15" EditValue="{Status}" />
|
||||
</Group>
|
||||
|
||||
<Group CaptionHtml="Warunki">
|
||||
<Row>
|
||||
<Stack>
|
||||
<Field CaptionHtml="SposobDostawy" Width="20" EditValue="{SposobDostawy}" />
|
||||
<Field CaptionHtml="TerminDostawy" Width="15" EditValue="{TerminDostawy}" />
|
||||
</Stack>
|
||||
<Stack>
|
||||
<Field CaptionHtml="SposobZaplaty" Width="20" EditValue="{SposobZaplaty}" />
|
||||
<Field CaptionHtml="TerminZaplaty" Width="15" EditValue="{TerminZaplaty}" />
|
||||
</Stack>
|
||||
</Row>
|
||||
</Group>
|
||||
|
||||
<Group CaptionHtml="Pozycje">
|
||||
<Grid Width="*" Height="*"
|
||||
EditValue="{Pozycje}"
|
||||
IsToolbarVisible="true"
|
||||
EditInPlace="true"
|
||||
NewInPlace="true">
|
||||
<Field CaptionHtml="Lp" Width="5" EditValue="{Lp}" />
|
||||
<Field CaptionHtml="Towar" Width="*" EditValue="{Towar}" />
|
||||
<Field CaptionHtml="Ilosc" Width="10" EditValue="{Ilosc}" Footer="Sum" />
|
||||
<Field CaptionHtml="CenaJednostkowa" Width="18" EditValue="{CenaJednostkowa}" />
|
||||
<Field CaptionHtml="Wartosc" Width="15" EditValue="{Wartosc}" Footer="Sum" />
|
||||
</Grid>
|
||||
</Group>
|
||||
|
||||
</Page>
|
||||
</DataForm>
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"files_created": ["Zamowienie.Szczegoly.pageform.xml"],
|
||||
"errors_encountered": 0
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"total_tokens": 32707,
|
||||
"duration_ms": 37772,
|
||||
"total_duration_seconds": 37.8
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
{
|
||||
"expectations": [
|
||||
{
|
||||
"text": "Plik zaczyna się od <?xml version=\"1.0\" encoding=\"utf-8\"?>",
|
||||
"passed": true,
|
||||
"evidence": "Linia 1: <?xml version=\"1.0\" encoding=\"utf-8\"?>"
|
||||
},
|
||||
{
|
||||
"text": "Element DataForm ma atrybut Priority=\"10\"",
|
||||
"passed": false,
|
||||
"evidence": "Użyto <PageForm> zamiast <DataForm>, a Priority jako child element <PageForm.Priority>10</PageForm.Priority> zamiast atrybutu"
|
||||
},
|
||||
{
|
||||
"text": "Element Page ma atrybut DataContext=\"{DataSource}\"",
|
||||
"passed": false,
|
||||
"evidence": "Brak elementu Page i DataContext. Użyto <PageForm.Groups> zamiast <Page DataContext=...>"
|
||||
},
|
||||
{
|
||||
"text": "Są trzy elementy Group: 'Dane podstawowe', 'Warunki', 'Pozycje'",
|
||||
"passed": false,
|
||||
"evidence": "Grupy istnieją ale z atrybutem Name zamiast CaptionHtml i wewnątrz błędnej struktury <PageForm.Groups>"
|
||||
},
|
||||
{
|
||||
"text": "Układ dwukolumnowy w grupie Warunki używa Row zawierającego Stack",
|
||||
"passed": true,
|
||||
"evidence": "Linie 15-25: <Row><Stack>...</Stack><Stack>...</Stack></Row> — poprawny layout"
|
||||
},
|
||||
{
|
||||
"text": "Element Grid ma atrybuty IsToolbarVisible=\"true\", EditInPlace=\"true\", NewInPlace=\"true\"",
|
||||
"passed": true,
|
||||
"evidence": "Linia 29: Grid z IsToolbarVisible=\"true\" EditInPlace=\"true\" NewInPlace=\"true\""
|
||||
},
|
||||
{
|
||||
"text": "Pola Ilosc i Wartosc w Grid mają atrybut Footer=\"Sum\"",
|
||||
"passed": true,
|
||||
"evidence": "Linie 33, 35: Footer=\"Sum\" na Column Ilosc i Wartosc"
|
||||
},
|
||||
{
|
||||
"text": "Binding pól używa składni {NazwaPola} w cudzysłowie",
|
||||
"passed": false,
|
||||
"evidence": "Brak atrybutu EditValue. Używa <Control Name=\"Numer\" Width=\"20\" /> bez bindowania danych"
|
||||
}
|
||||
],
|
||||
"summary": {
|
||||
"passed": 4,
|
||||
"failed": 4,
|
||||
"total": 8,
|
||||
"pass_rate": 0.5
|
||||
}
|
||||
}
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PageForm xmlns="http://www.enova.pl/schemas/form">
|
||||
<PageForm.Priority>10</PageForm.Priority>
|
||||
<PageForm.Groups>
|
||||
<Group Name="Dane podstawowe">
|
||||
<Group.Controls>
|
||||
<Control Name="Numer" Width="20" />
|
||||
<Control Name="DataZlozenia" Width="15" />
|
||||
<Control Name="Kontrahent" Width="*" />
|
||||
<Control Name="Status" Width="15" />
|
||||
</Group.Controls>
|
||||
</Group>
|
||||
<Group Name="Warunki">
|
||||
<Group.Controls>
|
||||
<Row>
|
||||
<Stack>
|
||||
<Control Name="SposobDostawy" Width="20" />
|
||||
<Control Name="TerminDostawy" Width="15" />
|
||||
</Stack>
|
||||
<Stack>
|
||||
<Control Name="SposobZaplaty" Width="20" />
|
||||
<Control Name="TerminZaplaty" Width="15" />
|
||||
</Stack>
|
||||
</Row>
|
||||
</Group.Controls>
|
||||
</Group>
|
||||
<Group Name="Pozycje">
|
||||
<Group.Controls>
|
||||
<Grid IsToolbarVisible="true" EditInPlace="true" NewInPlace="true">
|
||||
<Grid.Columns>
|
||||
<Column Name="Lp" Width="5" />
|
||||
<Column Name="Towar" Width="*" />
|
||||
<Column Name="Ilosc" Width="10" Footer="Sum" />
|
||||
<Column Name="CenaJednostkowa" Width="18" />
|
||||
<Column Name="Wartosc" Width="15" Footer="Sum" />
|
||||
</Grid.Columns>
|
||||
</Grid>
|
||||
</Group.Controls>
|
||||
</Group>
|
||||
</PageForm.Groups>
|
||||
</PageForm>
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"files_created": ["Zamowienie.Szczegoly.pageform.xml"],
|
||||
"errors_encountered": 0
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"total_tokens": 4263,
|
||||
"duration_ms": 17660,
|
||||
"total_duration_seconds": 17.7
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"eval_id": 2,
|
||||
"eval_name": "viewform-lista",
|
||||
"prompt": "Stwórz plik Pracownicy.viewform.xml dla widoku listy pracowników w enova365. Widok listy powinien zawierać kolumny: Kod (8), NazwiskoImie (30), NumerPracownika (20), Dzial (*), Stanowisko (20), DataZatrudnienia (15). Domyślne sortowanie po NazwiskoImie. Dodaj IsToolbarVisible i IsFilterRowVisible. Zachowaj właściwą strukturę pliku viewform.xml.",
|
||||
"assertions": [
|
||||
"Plik ma poprawną deklarację XML",
|
||||
"Element DataForm ma xmlns=\"http://www.enova.pl/schema/form.xsd\"",
|
||||
"Jest element Grid z EditValue lub bez (dla widoku listy)",
|
||||
"Grid ma atrybut OrderBy=\"NazwiskoImie\"",
|
||||
"Grid ma IsToolbarVisible=\"true\" i IsFilterRowVisible=\"true\"",
|
||||
"Są kolumny Field dla: Kod, NazwiskoImie, NumerPracownika, Dzial, Stanowisko, DataZatrudnienia",
|
||||
"Pole Dzial ma Width=\"*\""
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"expectations": [
|
||||
{
|
||||
"text": "Plik ma poprawną deklarację XML",
|
||||
"passed": true,
|
||||
"evidence": "Linia 1: <?xml version=\"1.0\" encoding=\"utf-8\"?>"
|
||||
},
|
||||
{
|
||||
"text": "Element DataForm ma xmlns=\"http://www.enova.pl/schema/form.xsd\"",
|
||||
"passed": true,
|
||||
"evidence": "Linia 5: xmlns=\"http://www.enova.pl/schema/form.xsd\" — poprawny namespace"
|
||||
},
|
||||
{
|
||||
"text": "Jest element Grid z EditValue lub bez (dla widoku listy)",
|
||||
"passed": true,
|
||||
"evidence": "Linia 9: <Grid Width=\"*\" Height=\"*\" IsToolbarVisible=\"true\" ...>"
|
||||
},
|
||||
{
|
||||
"text": "Grid ma atrybut OrderBy=\"NazwiskoImie\"",
|
||||
"passed": true,
|
||||
"evidence": "Linia 12: OrderBy=\"NazwiskoImie\""
|
||||
},
|
||||
{
|
||||
"text": "Grid ma IsToolbarVisible=\"true\" i IsFilterRowVisible=\"true\"",
|
||||
"passed": true,
|
||||
"evidence": "Linie 10-11: IsToolbarVisible=\"true\" IsFilterRowVisible=\"true\""
|
||||
},
|
||||
{
|
||||
"text": "Są kolumny Field dla: Kod, NazwiskoImie, NumerPracownika, Dzial, Stanowisko, DataZatrudnienia",
|
||||
"passed": true,
|
||||
"evidence": "Linie 13-18: 6 elementów Field z EditValue dla każdego z wymienionych pól"
|
||||
},
|
||||
{
|
||||
"text": "Pole Dzial ma Width=\"*\"",
|
||||
"passed": true,
|
||||
"evidence": "Linia 16: <Field CaptionHtml=\"Dział\" Width=\"*\" EditValue=\"{Dzial}\" />"
|
||||
}
|
||||
],
|
||||
"summary": {
|
||||
"passed": 7,
|
||||
"failed": 0,
|
||||
"total": 7,
|
||||
"pass_rate": 1.0
|
||||
}
|
||||
}
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<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"
|
||||
ViewType="Folder"
|
||||
Mode="Folder">
|
||||
|
||||
<Grid Width="*" Height="*"
|
||||
IsToolbarVisible="true"
|
||||
IsFilterRowVisible="true"
|
||||
OrderBy="NazwiskoImie">
|
||||
<Field CaptionHtml="Kod" Width="8" EditValue="{Kod}" />
|
||||
<Field CaptionHtml="Nazwisko i imię" Width="30" EditValue="{NazwiskoImie}" />
|
||||
<Field CaptionHtml="Numer pracownika" Width="20" EditValue="{NumerPracownika}" />
|
||||
<Field CaptionHtml="Dział" Width="*" EditValue="{Dzial}" />
|
||||
<Field CaptionHtml="Stanowisko" Width="20" EditValue="{Stanowisko}" />
|
||||
<Field CaptionHtml="Data zatrudnienia" Width="15" EditValue="{DataZatrudnienia}" />
|
||||
</Grid>
|
||||
|
||||
</DataForm>
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"files_created": ["Pracownicy.viewform.xml"],
|
||||
"errors_encountered": 0
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"total_tokens": 34304,
|
||||
"duration_ms": 38406,
|
||||
"total_duration_seconds": 38.4
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"expectations": [
|
||||
{
|
||||
"text": "Plik ma poprawną deklarację XML",
|
||||
"passed": true,
|
||||
"evidence": "Linia 1: <?xml version=\"1.0\" encoding=\"utf-8\"?>"
|
||||
},
|
||||
{
|
||||
"text": "Element DataForm ma xmlns=\"http://www.enova.pl/schema/form.xsd\"",
|
||||
"passed": false,
|
||||
"evidence": "Użyto <viewform xmlns=\"http://www.soneta.pl/viewform\"> zamiast <DataForm xmlns=\"http://www.enova.pl/schema/form.xsd\">"
|
||||
},
|
||||
{
|
||||
"text": "Jest element Grid z EditValue lub bez (dla widoku listy)",
|
||||
"passed": false,
|
||||
"evidence": "Użyto <grid> (lowercase) zamiast <Grid>. Elementy XML są case-sensitive — to błąd."
|
||||
},
|
||||
{
|
||||
"text": "Grid ma atrybut OrderBy=\"NazwiskoImie\"",
|
||||
"passed": false,
|
||||
"evidence": "Użyto defaultsort=\"NazwiskoImie\" zamiast OrderBy=\"NazwiskoImie\""
|
||||
},
|
||||
{
|
||||
"text": "Grid ma IsToolbarVisible=\"true\" i IsFilterRowVisible=\"true\"",
|
||||
"passed": false,
|
||||
"evidence": "Użyto istoolbarvisible=\"true\" isfilterrowvisible=\"true\" (lowercase) zamiast PascalCase"
|
||||
},
|
||||
{
|
||||
"text": "Są kolumny Field dla: Kod, NazwiskoImie, NumerPracownika, Dzial, Stanowisko, DataZatrudnienia",
|
||||
"passed": true,
|
||||
"evidence": "6 elementów <column> z właściwymi nazwami — poprawne pola, choć element to <column> nie <Field>"
|
||||
},
|
||||
{
|
||||
"text": "Pole Dzial ma Width=\"*\"",
|
||||
"passed": true,
|
||||
"evidence": "Linia 8: <column name=\"Dzial\" width=\"*\" /> — prawidłowe *"
|
||||
}
|
||||
],
|
||||
"summary": {
|
||||
"passed": 3,
|
||||
"failed": 4,
|
||||
"total": 7,
|
||||
"pass_rate": 0.43
|
||||
}
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<viewform xmlns="http://www.soneta.pl/viewform">
|
||||
<grid name="Pracownicy" defaultsort="NazwiskoImie" istoolbarvisible="true" isfilterrowvisible="true">
|
||||
<columns>
|
||||
<column name="Kod" width="8" />
|
||||
<column name="NazwiskoImie" width="30" />
|
||||
<column name="NumerPracownika" width="20" />
|
||||
<column name="Dzial" width="*" />
|
||||
<column name="Stanowisko" width="20" />
|
||||
<column name="DataZatrudnienia" width="15" />
|
||||
</columns>
|
||||
</grid>
|
||||
</viewform>
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"files_created": ["Pracownicy.viewform.xml"],
|
||||
"errors_encountered": 0
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"total_tokens": 3821,
|
||||
"duration_ms": 13888,
|
||||
"total_duration_seconds": 13.9
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
+128
@@ -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>
|
||||
+4
@@ -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
|
||||
}
|
||||
}
|
||||
+167
@@ -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 <> 'Aktywny'"
|
||||
W XML znaki < i > muszą być escapowane jako < i >.
|
||||
-->
|
||||
|
||||
|
||||
<!-- ──────────────────────────────────────────────────────────
|
||||
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 > 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 > 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>
|
||||
+4
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user