mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-09-03 08:40:52 +03:00
feat(form-decompile,form-compile): свойства CalendarField (кластер CalendarField)
CalendarField терял специфичные свойства при раундтрипе: декомпилятор их не читал, компилятор не эмитил. Пробел DSL (класс 3). CalendarField — длинный хвост (18 форм на 17033, 0.1%), но элемент маленький и ограниченный → решено покрыть целиком, убрав класс молчаливых потерь. Добавлены ключи (passthrough, эмитятся только при наличии): selectionMode, showCurrentDate, widthInMonths, heightInMonths, showMonthsPanel. Плюс подключён общий titleLocation (раньше у календаря не обрабатывался). Порядок тегов выверен по корпусу (18 форм): DataPath > Title > TitleLocation > [layout] > SelectionMode > ShowCurrentDate > WidthInMonths > HeightInMonths > ShowMonthsPanel > companions > Events. Декомпилятор (ps1) + компилятор (ps1+py) + spec. Новый тест-кейс calendar (два календаря: со скалярами+событием и с months-panel), сертифицирован в 1С 8.3.24. Регресс ps+py 33/33. Tooltip-свойства календаря (ToolTip/ToolTipRepresentation) намеренно оставлены будущему общему tooltip-кластеру. Раундтрип календарных форм: ПериодКомандировки → match; остаточный TitleLocation на radio/table — отдельная находка (BACKLOG). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
4c2c72abce
commit
8998c0b5db
@@ -1,4 +1,4 @@
|
||||
# form-compile v1.32 — Compile 1C managed form from JSON or object metadata
|
||||
# form-compile v1.33 — Compile 1C managed form from JSON or object metadata
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
param(
|
||||
[string]$JsonPath,
|
||||
@@ -1982,6 +1982,8 @@ function Emit-Element {
|
||||
"excludedCommands"=1
|
||||
"choiceMode"=1;"initialTreeView"=1;"enableDrag"=1;"enableStartDrag"=1
|
||||
"rowPictureDataPath"=1;"tableAutofill"=1
|
||||
# calendar-specific
|
||||
"selectionMode"=1;"showCurrentDate"=1;"widthInMonths"=1;"heightInMonths"=1;"showMonthsPanel"=1
|
||||
# pages-specific
|
||||
"pagesRepresentation"=1
|
||||
# button-specific
|
||||
@@ -2862,8 +2864,29 @@ function Emit-Calendar {
|
||||
|
||||
Emit-Title -el $el -name $name -indent $inner -auto:(-not $el.path)
|
||||
Emit-CommonFlags -el $el -indent $inner
|
||||
|
||||
if ($el.titleLocation) {
|
||||
$loc = switch ("$($el.titleLocation)") {
|
||||
"none" { "None" }
|
||||
"left" { "Left" }
|
||||
"right" { "Right" }
|
||||
"top" { "Top" }
|
||||
"bottom" { "Bottom" }
|
||||
"auto" { "Auto" }
|
||||
default { "$($el.titleLocation)" }
|
||||
}
|
||||
X "$inner<TitleLocation>$loc</TitleLocation>"
|
||||
}
|
||||
|
||||
Emit-Layout -el $el -indent $inner
|
||||
|
||||
# Календарно-специфичные свойства (порядок схемы: после layout, до companions)
|
||||
if ($el.selectionMode) { X "$inner<SelectionMode>$($el.selectionMode)</SelectionMode>" }
|
||||
if ($null -ne $el.showCurrentDate) { $v = if ($el.showCurrentDate) { "true" } else { "false" }; X "$inner<ShowCurrentDate>$v</ShowCurrentDate>" }
|
||||
if ($null -ne $el.widthInMonths) { X "$inner<WidthInMonths>$($el.widthInMonths)</WidthInMonths>" }
|
||||
if ($null -ne $el.heightInMonths) { X "$inner<HeightInMonths>$($el.heightInMonths)</HeightInMonths>" }
|
||||
if ($null -ne $el.showMonthsPanel) { $v = if ($el.showMonthsPanel) { "true" } else { "false" }; X "$inner<ShowMonthsPanel>$v</ShowMonthsPanel>" }
|
||||
|
||||
# Companions
|
||||
Emit-Companion -tag "ContextMenu" -name "${name}КонтекстноеМеню" -indent $inner
|
||||
Emit-Companion -tag "ExtendedTooltip" -name "${name}РасширеннаяПодсказка" -indent $inner
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# form-compile v1.32 — Compile 1C managed form from JSON or object metadata
|
||||
# form-compile v1.33 — Compile 1C managed form from JSON or object metadata
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
import argparse
|
||||
import copy
|
||||
@@ -1357,6 +1357,7 @@ KNOWN_KEYS = {
|
||||
"name", "path", "title",
|
||||
"visible", "hidden", "enabled", "disabled", "readOnly", "userVisible",
|
||||
"events", "on", "handlers",
|
||||
"selectionMode", "showCurrentDate", "widthInMonths", "heightInMonths", "showMonthsPanel",
|
||||
"titleLocation", "representation", "width", "height",
|
||||
"horizontalStretch", "verticalStretch", "autoMaxWidth", "autoMaxHeight",
|
||||
"maxWidth", "maxHeight",
|
||||
@@ -2494,8 +2495,26 @@ def emit_calendar(lines, el, name, eid, indent):
|
||||
|
||||
emit_title(lines, el, name, inner, auto=not el.get('path'))
|
||||
emit_common_flags(lines, el, inner)
|
||||
|
||||
if el.get('titleLocation'):
|
||||
loc_map = {'none': 'None', 'left': 'Left', 'right': 'Right', 'top': 'Top', 'bottom': 'Bottom', 'auto': 'Auto'}
|
||||
loc = loc_map.get(str(el['titleLocation']), str(el['titleLocation']))
|
||||
lines.append(f'{inner}<TitleLocation>{loc}</TitleLocation>')
|
||||
|
||||
emit_layout(lines, el, inner)
|
||||
|
||||
# \u041a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u043d\u043e-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 (\u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u0445\u0435\u043c\u044b: \u043f\u043e\u0441\u043b\u0435 layout, \u0434\u043e companions)
|
||||
if el.get('selectionMode'):
|
||||
lines.append(f'{inner}<SelectionMode>{el["selectionMode"]}</SelectionMode>')
|
||||
if el.get('showCurrentDate') is not None:
|
||||
lines.append(f'{inner}<ShowCurrentDate>{"true" if el["showCurrentDate"] else "false"}</ShowCurrentDate>')
|
||||
if el.get('widthInMonths') is not None:
|
||||
lines.append(f'{inner}<WidthInMonths>{el["widthInMonths"]}</WidthInMonths>')
|
||||
if el.get('heightInMonths') is not None:
|
||||
lines.append(f'{inner}<HeightInMonths>{el["heightInMonths"]}</HeightInMonths>')
|
||||
if el.get('showMonthsPanel') is not None:
|
||||
lines.append(f'{inner}<ShowMonthsPanel>{"true" if el["showMonthsPanel"] else "false"}</ShowMonthsPanel>')
|
||||
|
||||
# Companions
|
||||
emit_companion(lines, 'ContextMenu', f'{name}\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0435\u041c\u0435\u043d\u044e', inner)
|
||||
emit_companion(lines, 'ExtendedTooltip', f'{name}\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u0430\u044f\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430', inner)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# form-decompile v0.12 — Decompile 1C managed Form.xml to JSON DSL (draft)
|
||||
# form-decompile v0.13 — Decompile 1C managed Form.xml to JSON DSL (draft)
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
|
||||
param(
|
||||
@@ -422,6 +422,12 @@ function Decompile-Element {
|
||||
$obj[$key] = $name
|
||||
$dp = Get-Child $node 'DataPath'; if ($dp) { $obj['path'] = $dp }
|
||||
Add-CommonProps $obj $node $name
|
||||
$tl = Get-Child $node 'TitleLocation'; if ($tl) { $obj['titleLocation'] = $tl.ToLower() }
|
||||
$sm = Get-Child $node 'SelectionMode'; if ($sm) { $obj['selectionMode'] = $sm }
|
||||
$scd = Get-Child $node 'ShowCurrentDate'; if ($null -ne $scd) { $obj['showCurrentDate'] = ($scd -eq 'true') }
|
||||
$wim = Get-Child $node 'WidthInMonths'; if ($null -ne $wim) { $obj['widthInMonths'] = [int]$wim }
|
||||
$him = Get-Child $node 'HeightInMonths'; if ($null -ne $him) { $obj['heightInMonths'] = [int]$him }
|
||||
$smp = Get-Child $node 'ShowMonthsPanel'; if ($null -ne $smp) { $obj['showMonthsPanel'] = ($smp -eq 'true') }
|
||||
}
|
||||
'Table' {
|
||||
$obj[$key] = $name
|
||||
|
||||
Reference in New Issue
Block a user