diff --git a/jmix-charts/charts-flowui-kit/src/main/java/io/jmix/chartsflowui/kit/meta/StudioChartsComponents.java b/jmix-charts/charts-flowui-kit/src/main/java/io/jmix/chartsflowui/kit/meta/StudioChartsComponents.java index 2e37c6b8ca..6d68c2da2e 100644 --- a/jmix-charts/charts-flowui-kit/src/main/java/io/jmix/chartsflowui/kit/meta/StudioChartsComponents.java +++ b/jmix-charts/charts-flowui-kit/src/main/java/io/jmix/chartsflowui/kit/meta/StudioChartsComponents.java @@ -29,6 +29,14 @@ public interface StudioChartsComponents { xmlns = "http://jmix.io/schema/charts/ui", xmlnsAlias = "charts", icon = "io/jmix/chartsflowui/kit/meta/icon/component/chart.svg", + propertyGroups = { + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.Size.class, + StudioPropertyGroups.AlignSelf.class, + StudioChartsPropertyGroups.AnimationDefaultProperties.class, + StudioPropertyGroups.Colspan.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", diff --git a/jmix-charts/charts-flowui-kit/src/main/java/io/jmix/chartsflowui/kit/meta/StudioChartsElements.java b/jmix-charts/charts-flowui-kit/src/main/java/io/jmix/chartsflowui/kit/meta/StudioChartsElements.java index 787659c14e..4a85f58dde 100644 --- a/jmix-charts/charts-flowui-kit/src/main/java/io/jmix/chartsflowui/kit/meta/StudioChartsElements.java +++ b/jmix-charts/charts-flowui-kit/src/main/java/io/jmix/chartsflowui/kit/meta/StudioChartsElements.java @@ -63,6 +63,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.TextStyleDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "color", type = StudioPropertyType.OPTIONS, options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", @@ -172,6 +173,28 @@ public interface StudioChartsElements { unlimitedCount = false, isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioPropertyGroups.Id.class, + StudioChartsPropertyGroups.Show.class, + StudioPropertyGroups.Text.class, + StudioChartsPropertyGroups.TriggerEvent.class, + StudioChartsPropertyGroups.Padding.class, + StudioChartsPropertyGroups.ItemGap.class, + StudioChartsPropertyGroups.IntegerZLevel.class, + StudioChartsPropertyGroups.IntegerZ.class, + StudioChartsPropertyGroups.Left.class, + StudioChartsPropertyGroups.StringTop.class, + StudioChartsPropertyGroups.StringRight.class, + StudioChartsPropertyGroups.Bottom.class, + StudioChartsPropertyGroups.BackgroundColor.class, + StudioChartsPropertyGroups.BorderColor.class, + StudioChartsPropertyGroups.IntegerBorderWidth.class, + StudioChartsPropertyGroups.BorderRadius.class, + StudioChartsPropertyGroups.ShadowBlur.class, + StudioChartsPropertyGroups.ShadowColor.class, + StudioChartsPropertyGroups.ShadowOffsetX.class, + StudioChartsPropertyGroups.ShadowOffsetY.class + }, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID), @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @@ -293,6 +316,26 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.ChartColor.class, + StudioChartsPropertyGroups.Ellipsis.class, + StudioChartsPropertyGroups.FontFamily.class, + StudioChartsPropertyGroups.FontSize.class, + StudioChartsPropertyGroups.FontStyle.class, + StudioChartsPropertyGroups.FontWeight.class, + StudioChartsPropertyGroups.IntegerHeight.class, + StudioChartsPropertyGroups.LineHeight.class, + StudioChartsPropertyGroups.Overflow.class, + StudioChartsPropertyGroups.TextBorderColor.class, + StudioChartsPropertyGroups.TextBorderDashOffset.class, + StudioChartsPropertyGroups.TextBorderType.class, + StudioChartsPropertyGroups.TextBorderWidth.class, + StudioChartsPropertyGroups.TextShadowBlur.class, + StudioChartsPropertyGroups.TextShadowColor.class, + StudioChartsPropertyGroups.TextShadowOffsetX.class, + StudioChartsPropertyGroups.TextShadowOffsetY.class, + StudioPropertyGroups.WidthWithIntegerType.class + }, properties = { @StudioProperty(xmlAttribute = "color", type = StudioPropertyType.OPTIONS, options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", @@ -401,6 +444,28 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.SharedAlign.class, + StudioChartsPropertyGroups.ChartColor.class, + StudioChartsPropertyGroups.Ellipsis.class, + StudioChartsPropertyGroups.FontFamily.class, + StudioChartsPropertyGroups.FontSize.class, + StudioChartsPropertyGroups.FontStyle.class, + StudioChartsPropertyGroups.FontWeight.class, + StudioChartsPropertyGroups.IntegerHeight.class, + StudioChartsPropertyGroups.LineHeight.class, + StudioChartsPropertyGroups.Overflow.class, + StudioChartsPropertyGroups.TextBorderColor.class, + StudioChartsPropertyGroups.TextBorderDashOffset.class, + StudioChartsPropertyGroups.TextBorderType.class, + StudioChartsPropertyGroups.TextBorderWidth.class, + StudioChartsPropertyGroups.TextShadowBlur.class, + StudioChartsPropertyGroups.TextShadowColor.class, + StudioChartsPropertyGroups.TextShadowOffsetX.class, + StudioChartsPropertyGroups.TextShadowOffsetY.class, + StudioChartsPropertyGroups.VerticalAlign.class, + StudioPropertyGroups.WidthWithIntegerType.class + }, properties = { @StudioProperty(xmlAttribute = "align", type = StudioPropertyType.ENUMERATION, classFqn = "io.jmix.chartsflowui.kit.component.model.shared.Align", @@ -513,6 +578,37 @@ public interface StudioChartsElements { xmlns = "http://jmix.io/schema/charts/ui", xmlnsAlias = "charts", icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioPropertyGroups.RequiredStringName.class, + StudioChartsPropertyGroups.SharedAlign.class, + StudioChartsPropertyGroups.BackgroundColor.class, + StudioChartsPropertyGroups.BorderColor.class, + StudioChartsPropertyGroups.BorderDashOffset.class, + StudioChartsPropertyGroups.BorderRadius.class, + StudioChartsPropertyGroups.BorderType.class, + StudioChartsPropertyGroups.IntegerBorderWidth.class, + StudioChartsPropertyGroups.ChartColor.class, + StudioChartsPropertyGroups.FontFamily.class, + StudioChartsPropertyGroups.FontSize.class, + StudioChartsPropertyGroups.FontStyle.class, + StudioChartsPropertyGroups.FontWeight.class, + StudioChartsPropertyGroups.IntegerHeight.class, + StudioChartsPropertyGroups.LineHeight.class, + StudioChartsPropertyGroups.Padding.class, + StudioChartsPropertyGroups.ShadowBlur.class, + StudioChartsPropertyGroups.ShadowColor.class, + StudioChartsPropertyGroups.ShadowOffsetX.class, + StudioChartsPropertyGroups.ShadowOffsetY.class, + StudioChartsPropertyGroups.TextBorderColor.class, + StudioChartsPropertyGroups.TextBorderDashOffset.class, + StudioChartsPropertyGroups.TextBorderType.class, + StudioChartsPropertyGroups.TextShadowBlur.class, + StudioChartsPropertyGroups.TextShadowColor.class, + StudioChartsPropertyGroups.TextShadowOffsetX.class, + StudioChartsPropertyGroups.TextShadowOffsetY.class, + StudioChartsPropertyGroups.VerticalAlign.class, + StudioPropertyGroups.WidthWithIntegerType.class + }, properties = { @StudioProperty(xmlAttribute = "name", type = StudioPropertyType.STRING, required = true), @StudioProperty(xmlAttribute = "align", type = StudioPropertyType.ENUMERATION, @@ -708,6 +804,15 @@ public interface StudioChartsElements { unlimitedCount = false, isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioPropertyGroups.Id.class, + StudioChartsPropertyGroups.GeoIndex.class, + StudioChartsPropertyGroups.XAxisIndex.class, + StudioChartsPropertyGroups.XAxisIndexes.class, + StudioChartsPropertyGroups.YAxisIndex.class, + StudioChartsPropertyGroups.YAxisIndexes.class, + StudioChartsPropertyGroups.IntegerZ.class + }, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID), @StudioProperty(xmlAttribute = "toolboxes", type = StudioPropertyType.VALUES_LIST, @@ -760,6 +865,11 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.IntegerBorderWidth.class, + StudioChartsPropertyGroups.ChartColor.class, + StudioChartsPropertyGroups.BorderColor.class + }, properties = { @StudioProperty(xmlAttribute = "borderWidth", type = StudioPropertyType.INTEGER), @StudioProperty(xmlAttribute = "color", type = StudioPropertyType.OPTIONS, @@ -825,6 +935,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.VisualEffectDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "symbol", type = StudioPropertyType.VALUES_LIST), @StudioProperty(xmlAttribute = "symbolSize", type = StudioPropertyType.VALUES_LIST), @@ -871,6 +982,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.VisualEffectDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "symbol", type = StudioPropertyType.VALUES_LIST), @StudioProperty(xmlAttribute = "symbolSize", type = StudioPropertyType.VALUES_LIST), @@ -920,6 +1032,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.VisualEffectDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "symbol", type = StudioPropertyType.VALUES_LIST), @StudioProperty(xmlAttribute = "symbolSize", type = StudioPropertyType.VALUES_LIST), @@ -969,6 +1082,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.VisualEffectDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "symbol", type = StudioPropertyType.VALUES_LIST), @StudioProperty(xmlAttribute = "symbolSize", type = StudioPropertyType.VALUES_LIST), @@ -1019,6 +1133,23 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.TriggerOn.class, + StudioPropertyGroups.HideDelay.class, + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.Trigger.class, + StudioChartsPropertyGroups.TooltipPosition.class, + StudioChartsPropertyGroups.PositionCoordinates.class, + StudioChartsPropertyGroups.Formatter.class, + StudioChartsPropertyGroups.FormatterFunction.class, + StudioChartsPropertyGroups.ValueFormatter.class, + StudioChartsPropertyGroups.ValueFormatterFunction.class, + StudioChartsPropertyGroups.BackgroundColor.class, + StudioChartsPropertyGroups.BorderColor.class, + StudioChartsPropertyGroups.IntegerBorderWidth.class, + StudioChartsPropertyGroups.ExtraCssText.class, + StudioChartsPropertyGroups.Padding.class + }, properties = { @StudioProperty(xmlAttribute = "showContent", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "alwaysShowContent", type = StudioPropertyType.BOOLEAN), @@ -1115,6 +1246,25 @@ public interface StudioChartsElements { xmlnsAlias = "charts", icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", isInjectable = false, + propertyGroups = { + StudioPropertyGroups.Id.class, + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.IntegerZLevel.class, + StudioChartsPropertyGroups.IntegerZ.class, + StudioChartsPropertyGroups.Left.class, + StudioChartsPropertyGroups.IntegerTop.class, + StudioChartsPropertyGroups.IntegerRight.class, + StudioChartsPropertyGroups.Bottom.class, + StudioPropertyGroups.WidthWithIntegerType.class, + StudioChartsPropertyGroups.IntegerHeight.class, + StudioChartsPropertyGroups.BackgroundColor.class, + StudioChartsPropertyGroups.BorderColor.class, + StudioChartsPropertyGroups.IntegerBorderWidth.class, + StudioChartsPropertyGroups.ShadowBlur.class, + StudioChartsPropertyGroups.ShadowColor.class, + StudioChartsPropertyGroups.ShadowOffsetX.class, + StudioChartsPropertyGroups.ShadowOffsetY.class + }, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID), @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @@ -1219,6 +1369,37 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.BackgroundColor.class, + StudioChartsPropertyGroups.BorderColor.class, + StudioChartsPropertyGroups.BorderDashOffset.class, + StudioChartsPropertyGroups.BorderType.class, + StudioChartsPropertyGroups.DoubleBorderWidth.class, + StudioChartsPropertyGroups.BorderRadius.class, + StudioChartsPropertyGroups.ChartColor.class, + StudioChartsPropertyGroups.Padding.class, + StudioChartsPropertyGroups.Ellipsis.class, + StudioChartsPropertyGroups.FontFamily.class, + StudioChartsPropertyGroups.FontSize.class, + StudioChartsPropertyGroups.FontStyle.class, + StudioChartsPropertyGroups.FontWeight.class, + StudioChartsPropertyGroups.IntegerHeight.class, + StudioChartsPropertyGroups.LineHeight.class, + StudioChartsPropertyGroups.Overflow.class, + StudioChartsPropertyGroups.ShadowBlur.class, + StudioChartsPropertyGroups.ShadowColor.class, + StudioChartsPropertyGroups.ShadowOffsetX.class, + StudioChartsPropertyGroups.ShadowOffsetY.class, + StudioChartsPropertyGroups.TextBorderColor.class, + StudioChartsPropertyGroups.TextBorderDashOffset.class, + StudioChartsPropertyGroups.TextBorderType.class, + StudioChartsPropertyGroups.TextBorderWidth.class, + StudioChartsPropertyGroups.TextShadowBlur.class, + StudioChartsPropertyGroups.TextShadowColor.class, + StudioChartsPropertyGroups.TextShadowOffsetX.class, + StudioChartsPropertyGroups.TextShadowOffsetY.class, + StudioPropertyGroups.WidthWithIntegerType.class + }, properties = { @StudioProperty(xmlAttribute = "backgroundColor", type = StudioPropertyType.OPTIONS, options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", @@ -1411,6 +1592,47 @@ public interface StudioChartsElements { unlimitedCount = false, isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioPropertyGroups.Id.class, + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.IntegerZLevel.class, + StudioChartsPropertyGroups.IntegerZ.class, + StudioChartsPropertyGroups.Left.class, + StudioChartsPropertyGroups.IntegerTop.class, + StudioChartsPropertyGroups.IntegerRight.class, + StudioChartsPropertyGroups.Bottom.class, + StudioPropertyGroups.WidthWithIntegerType.class, + StudioChartsPropertyGroups.IntegerHeight.class, + StudioChartsPropertyGroups.Orientation.class, + StudioChartsPropertyGroups.LegendAlign.class, + StudioChartsPropertyGroups.Padding.class, + StudioChartsPropertyGroups.ItemGap.class, + StudioChartsPropertyGroups.IntegerItemWidth.class, + StudioChartsPropertyGroups.IntegerItemHeight.class, + StudioChartsPropertyGroups.SymbolRotate.class, + StudioChartsPropertyGroups.Formatter.class, + StudioChartsPropertyGroups.FormatterFunction.class, + StudioChartsPropertyGroups.SelectedMode.class, + StudioChartsPropertyGroups.InactiveColor.class, + StudioChartsPropertyGroups.InactiveBorderColor.class, + StudioChartsPropertyGroups.InactiveBorderWidth.class, + StudioChartsPropertyGroups.UnselectedSeries.class, + StudioChartsPropertyGroups.Icon.class, + StudioChartsPropertyGroups.BackgroundColor.class, + StudioChartsPropertyGroups.BorderColor.class, + StudioChartsPropertyGroups.IntegerBorderWidth.class, + StudioChartsPropertyGroups.BorderRadius.class, + StudioChartsPropertyGroups.ShadowBlur.class, + StudioChartsPropertyGroups.ShadowColor.class, + StudioChartsPropertyGroups.ShadowOffsetX.class, + StudioChartsPropertyGroups.ShadowOffsetY.class, + StudioChartsPropertyGroups.Selector.class, + StudioChartsPropertyGroups.SelectorPosition.class, + StudioChartsPropertyGroups.SelectorItemGap.class, + StudioChartsPropertyGroups.SelectorButtonGap.class, + StudioChartsPropertyGroups.Animation.class, + StudioChartsPropertyGroups.AnimationDurationUpdate.class + }, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID), @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @@ -1652,6 +1874,45 @@ public interface StudioChartsElements { unlimitedCount = false, isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioPropertyGroups.Id.class, + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.IntegerZLevel.class, + StudioChartsPropertyGroups.IntegerZ.class, + StudioChartsPropertyGroups.Left.class, + StudioChartsPropertyGroups.IntegerTop.class, + StudioChartsPropertyGroups.IntegerRight.class, + StudioChartsPropertyGroups.Bottom.class, + StudioPropertyGroups.WidthWithIntegerType.class, + StudioChartsPropertyGroups.IntegerHeight.class, + StudioChartsPropertyGroups.Orientation.class, + StudioChartsPropertyGroups.LegendAlign.class, + StudioChartsPropertyGroups.Padding.class, + StudioChartsPropertyGroups.ItemGap.class, + StudioChartsPropertyGroups.IntegerItemWidth.class, + StudioChartsPropertyGroups.IntegerItemHeight.class, + StudioChartsPropertyGroups.SymbolRotate.class, + StudioChartsPropertyGroups.Formatter.class, + StudioChartsPropertyGroups.FormatterFunction.class, + StudioChartsPropertyGroups.SelectedMode.class, + StudioChartsPropertyGroups.InactiveColor.class, + StudioChartsPropertyGroups.InactiveBorderColor.class, + StudioChartsPropertyGroups.InactiveBorderWidth.class, + StudioChartsPropertyGroups.UnselectedSeries.class, + StudioChartsPropertyGroups.Icon.class, + StudioChartsPropertyGroups.BackgroundColor.class, + StudioChartsPropertyGroups.BorderColor.class, + StudioChartsPropertyGroups.IntegerBorderWidth.class, + StudioChartsPropertyGroups.BorderRadius.class, + StudioChartsPropertyGroups.ShadowBlur.class, + StudioChartsPropertyGroups.ShadowColor.class, + StudioChartsPropertyGroups.ShadowOffsetX.class, + StudioChartsPropertyGroups.ShadowOffsetY.class, + StudioChartsPropertyGroups.Selector.class, + StudioChartsPropertyGroups.SelectorPosition.class, + StudioChartsPropertyGroups.SelectorItemGap.class, + StudioChartsPropertyGroups.SelectorButtonGap.class + }, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID), @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @@ -1842,6 +2103,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.PageIconsDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "prevPageIcon", type = StudioPropertyType.STRING, required = true), @StudioProperty(xmlAttribute = "nextPageIcon", type = StudioPropertyType.STRING, required = true) @@ -1857,6 +2119,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.PageIconsDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "prevPageIcon", type = StudioPropertyType.STRING, required = true), @StudioProperty(xmlAttribute = "nextPageIcon", type = StudioPropertyType.STRING, required = true) @@ -1873,6 +2136,7 @@ public interface StudioChartsElements { unlimitedCount = false, xmlnsAlias = "charts", icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.TextStyleDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "color", type = StudioPropertyType.OPTIONS, options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", @@ -1996,6 +2260,43 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.Distance.class, + StudioChartsPropertyGroups.Rotate.class, + StudioChartsPropertyGroups.StringOffset.class, + StudioChartsPropertyGroups.SharedAlign.class, + StudioChartsPropertyGroups.VerticalAlign.class, + StudioChartsPropertyGroups.BackgroundColor.class, + StudioChartsPropertyGroups.BorderColor.class, + StudioChartsPropertyGroups.IntegerBorderWidth.class, + StudioChartsPropertyGroups.BorderType.class, + StudioChartsPropertyGroups.BorderDashOffset.class, + StudioChartsPropertyGroups.BorderRadius.class, + StudioChartsPropertyGroups.Padding.class, + StudioChartsPropertyGroups.ShadowColor.class, + StudioChartsPropertyGroups.ShadowOffsetX.class, + StudioChartsPropertyGroups.ShadowOffsetY.class, + StudioChartsPropertyGroups.ShadowBlur.class, + StudioChartsPropertyGroups.ChartColor.class, + StudioChartsPropertyGroups.FontStyle.class, + StudioChartsPropertyGroups.FontWeight.class, + StudioChartsPropertyGroups.FontFamily.class, + StudioChartsPropertyGroups.FontSize.class, + StudioChartsPropertyGroups.LineHeight.class, + StudioPropertyGroups.WidthWithIntegerType.class, + StudioChartsPropertyGroups.IntegerHeight.class, + StudioChartsPropertyGroups.TextBorderColor.class, + StudioChartsPropertyGroups.TextBorderWidth.class, + StudioChartsPropertyGroups.TextBorderType.class, + StudioChartsPropertyGroups.TextBorderDashOffset.class, + StudioChartsPropertyGroups.TextShadowColor.class, + StudioChartsPropertyGroups.TextShadowBlur.class, + StudioChartsPropertyGroups.TextShadowOffsetX.class, + StudioChartsPropertyGroups.TextShadowOffsetY.class, + StudioChartsPropertyGroups.Overflow.class, + StudioChartsPropertyGroups.Ellipsis.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "distance", type = StudioPropertyType.INTEGER), @@ -2220,6 +2521,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.ItemStyleDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "color", type = StudioPropertyType.OPTIONS, options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", @@ -2327,6 +2629,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.ItemStyleDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "color", type = StudioPropertyType.OPTIONS, options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", @@ -2430,6 +2733,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.ItemStyleDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "color", type = StudioPropertyType.OPTIONS, options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", @@ -2536,6 +2840,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.ItemStyleDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "color", type = StudioPropertyType.OPTIONS, options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", @@ -2642,6 +2947,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.ItemStyleDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "color", type = StudioPropertyType.OPTIONS, options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", @@ -2748,6 +3054,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.ItemStyleDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "color", type = StudioPropertyType.OPTIONS, options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", @@ -2852,6 +3159,13 @@ public interface StudioChartsElements { unlimitedCount = false, isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioPropertyGroups.Id.class, + StudioChartsPropertyGroups.IntegerZLevel.class, + StudioChartsPropertyGroups.IntegerZ.class, + StudioChartsPropertyGroups.Center.class, + StudioChartsPropertyGroups.Radius.class + }, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID), @StudioProperty(xmlAttribute = "zLevel", type = StudioPropertyType.INTEGER), @@ -2872,6 +3186,21 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.Trigger.class, + StudioChartsPropertyGroups.TooltipPosition.class, + StudioChartsPropertyGroups.PositionCoordinates.class, + StudioChartsPropertyGroups.Formatter.class, + StudioChartsPropertyGroups.FormatterFunction.class, + StudioChartsPropertyGroups.ValueFormatter.class, + StudioChartsPropertyGroups.ValueFormatterFunction.class, + StudioChartsPropertyGroups.BackgroundColor.class, + StudioChartsPropertyGroups.BorderColor.class, + StudioChartsPropertyGroups.IntegerBorderWidth.class, + StudioChartsPropertyGroups.ExtraCssText.class, + StudioChartsPropertyGroups.Padding.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "trigger", type = StudioPropertyType.ENUMERATION, @@ -2951,6 +3280,12 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Snap.class, + StudioChartsPropertyGroups.IntegerZ.class, + StudioChartsPropertyGroups.AnimationDefaultProperties.class, + StudioChartsPropertyGroups.AnimationFunctionDefaultProperties.class + }, properties = { @StudioProperty(xmlAttribute = "type", type = StudioPropertyType.ENUMERATION, classFqn = "io.jmix.chartsflowui.kit.component.model.shared.AbstractTooltip.AxisPointer.IndicatorType", @@ -2985,6 +3320,16 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.AxisPointerType.class, + StudioChartsPropertyGroups.Snap.class, + StudioChartsPropertyGroups.IntegerZ.class, + StudioChartsPropertyGroups.TriggerEmphasis.class, + StudioChartsPropertyGroups.TriggerTooltip.class, + StudioChartsPropertyGroups.IntegerValue.class, + StudioChartsPropertyGroups.Status.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "type", type = StudioPropertyType.ENUMERATION, @@ -3010,6 +3355,18 @@ public interface StudioChartsElements { unlimitedCount = false, isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioPropertyGroups.Id.class, + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.AxisPointerType.class, + StudioChartsPropertyGroups.Snap.class, + StudioChartsPropertyGroups.IntegerZ.class, + StudioChartsPropertyGroups.TriggerOn.class, + StudioChartsPropertyGroups.TriggerEmphasis.class, + StudioChartsPropertyGroups.TriggerTooltip.class, + StudioChartsPropertyGroups.IntegerValue.class, + StudioChartsPropertyGroups.Status.class + }, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.STRING), @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @@ -3038,6 +3395,17 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.Icon.class, + StudioChartsPropertyGroups.Margin.class, + StudioChartsPropertyGroups.ChartColor.class, + StudioChartsPropertyGroups.Throttle.class, + StudioChartsPropertyGroups.ShadowBlur.class, + StudioChartsPropertyGroups.ShadowColor.class, + StudioChartsPropertyGroups.ShadowOffsetX.class, + StudioChartsPropertyGroups.ShadowOffsetY.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "icon", type = StudioPropertyType.STRING), @@ -3113,6 +3481,39 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.IntegerPrecision.class, + StudioChartsPropertyGroups.Formatter.class, + StudioChartsPropertyGroups.FormatterFunction.class, + StudioChartsPropertyGroups.Margin.class, + StudioChartsPropertyGroups.Padding.class, + StudioChartsPropertyGroups.BackgroundColor.class, + StudioChartsPropertyGroups.BorderColor.class, + StudioChartsPropertyGroups.IntegerBorderWidth.class, + StudioChartsPropertyGroups.ShadowBlur.class, + StudioChartsPropertyGroups.ShadowColor.class, + StudioChartsPropertyGroups.ShadowOffsetX.class, + StudioChartsPropertyGroups.ShadowOffsetY.class, + StudioChartsPropertyGroups.ChartColor.class, + StudioChartsPropertyGroups.FontStyle.class, + StudioChartsPropertyGroups.FontWeight.class, + StudioChartsPropertyGroups.FontFamily.class, + StudioChartsPropertyGroups.FontSize.class, + StudioChartsPropertyGroups.LineHeight.class, + StudioPropertyGroups.WidthWithIntegerType.class, + StudioChartsPropertyGroups.IntegerHeight.class, + StudioChartsPropertyGroups.TextBorderColor.class, + StudioChartsPropertyGroups.TextBorderWidth.class, + StudioChartsPropertyGroups.TextBorderType.class, + StudioChartsPropertyGroups.TextBorderDashOffset.class, + StudioChartsPropertyGroups.TextShadowColor.class, + StudioChartsPropertyGroups.TextShadowBlur.class, + StudioChartsPropertyGroups.TextShadowOffsetX.class, + StudioChartsPropertyGroups.TextShadowOffsetY.class, + StudioChartsPropertyGroups.Overflow.class, + StudioChartsPropertyGroups.Ellipsis.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "precision", type = StudioPropertyType.INTEGER), @@ -3307,6 +3708,18 @@ public interface StudioChartsElements { unlimitedCount = false, isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioPropertyGroups.Id.class, + StudioChartsPropertyGroups.IntegerZLevel.class, + StudioChartsPropertyGroups.Center.class, + StudioChartsPropertyGroups.Radius.class, + StudioChartsPropertyGroups.StartAngle.class, + StudioChartsPropertyGroups.NameGap.class, + StudioChartsPropertyGroups.SplitNumber.class, + StudioChartsPropertyGroups.BooleanScale.class, + StudioChartsPropertyGroups.Silent.class, + StudioChartsPropertyGroups.TriggerEvent.class + }, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID), @StudioProperty(xmlAttribute = "zLevel", type = StudioPropertyType.INTEGER), @@ -3333,6 +3746,12 @@ public interface StudioChartsElements { xmlns = "http://jmix.io/schema/charts/ui", xmlnsAlias = "charts", icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioPropertyGroups.LocalizedNameWithoutCategory.class, + StudioPropertyGroups.IntegerMax.class, + StudioPropertyGroups.IntegerMin.class, + StudioChartsPropertyGroups.ChartColor.class + }, properties = { @StudioProperty(xmlAttribute = "name", type = StudioPropertyType.LOCALIZED_STRING), @StudioProperty(xmlAttribute = "max", type = StudioPropertyType.INTEGER), @@ -3375,6 +3794,40 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.Formatter.class, + StudioChartsPropertyGroups.FormatterFunction.class, + StudioChartsPropertyGroups.BackgroundColor.class, + StudioChartsPropertyGroups.BorderColor.class, + StudioChartsPropertyGroups.IntegerBorderWidth.class, + StudioChartsPropertyGroups.BorderType.class, + StudioChartsPropertyGroups.BorderDashOffset.class, + StudioChartsPropertyGroups.BorderRadius.class, + StudioChartsPropertyGroups.Padding.class, + StudioChartsPropertyGroups.ShadowColor.class, + StudioChartsPropertyGroups.ShadowBlur.class, + StudioChartsPropertyGroups.ShadowOffsetX.class, + StudioChartsPropertyGroups.ShadowOffsetY.class, + StudioChartsPropertyGroups.ChartColor.class, + StudioChartsPropertyGroups.FontStyle.class, + StudioChartsPropertyGroups.FontWeight.class, + StudioChartsPropertyGroups.FontFamily.class, + StudioChartsPropertyGroups.FontSize.class, + StudioChartsPropertyGroups.LineHeight.class, + StudioPropertyGroups.WidthWithIntegerType.class, + StudioChartsPropertyGroups.IntegerHeight.class, + StudioChartsPropertyGroups.TextBorderColor.class, + StudioChartsPropertyGroups.TextBorderWidth.class, + StudioChartsPropertyGroups.TextBorderType.class, + StudioChartsPropertyGroups.TextBorderDashOffset.class, + StudioChartsPropertyGroups.TextShadowColor.class, + StudioChartsPropertyGroups.TextShadowBlur.class, + StudioChartsPropertyGroups.TextShadowOffsetX.class, + StudioChartsPropertyGroups.TextShadowOffsetY.class, + StudioChartsPropertyGroups.Overflow.class, + StudioChartsPropertyGroups.Ellipsis.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "formatter", type = StudioPropertyType.STRING), @@ -3572,6 +4025,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.SplitDefaultProperties.class + }, properties = { @StudioProperty(xmlAttribute = "interval", type = StudioPropertyType.INTEGER), @StudioProperty(xmlAttribute = "intervalFunction", type = StudioPropertyType.STRING), @@ -3592,6 +4048,13 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.ShadowBlur.class, + StudioChartsPropertyGroups.ShadowColor.class, + StudioChartsPropertyGroups.ShadowOffsetX.class, + StudioChartsPropertyGroups.ShadowOffsetY.class, + StudioChartsPropertyGroups.Opacity.class + }, properties = { @StudioProperty(xmlAttribute = "shadowBlur", type = StudioPropertyType.INTEGER), @StudioProperty(xmlAttribute = "shadowColor", type = StudioPropertyType.OPTIONS, @@ -3663,6 +4126,10 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.SymbolsSize.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "onZero", type = StudioPropertyType.BOOLEAN), @@ -3687,6 +4154,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.SplitDefaultProperties.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "interval", type = StudioPropertyType.INTEGER), @@ -3704,6 +4174,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Show.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN) } @@ -3722,6 +4195,46 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.SplitDefaultProperties.class, + StudioChartsPropertyGroups.Inside.class, + StudioChartsPropertyGroups.Rotate.class, + StudioChartsPropertyGroups.Margin.class, + StudioChartsPropertyGroups.Formatter.class, + StudioChartsPropertyGroups.FormatterFunction.class, + StudioChartsPropertyGroups.HideOverlap.class, + StudioChartsPropertyGroups.SharedAlign.class, + StudioChartsPropertyGroups.VerticalAlign.class, + StudioChartsPropertyGroups.BackgroundColor.class, + StudioChartsPropertyGroups.BorderColor.class, + StudioChartsPropertyGroups.IntegerBorderWidth.class, + StudioChartsPropertyGroups.BorderType.class, + StudioChartsPropertyGroups.BorderDashOffset.class, + StudioChartsPropertyGroups.BorderRadius.class, + StudioChartsPropertyGroups.Padding.class, + StudioChartsPropertyGroups.ShadowColor.class, + StudioChartsPropertyGroups.ShadowBlur.class, + StudioChartsPropertyGroups.ShadowOffsetX.class, + StudioChartsPropertyGroups.ShadowOffsetY.class, + StudioChartsPropertyGroups.ChartColor.class, + StudioChartsPropertyGroups.FontStyle.class, + StudioChartsPropertyGroups.FontWeight.class, + StudioChartsPropertyGroups.FontFamily.class, + StudioChartsPropertyGroups.FontSize.class, + StudioChartsPropertyGroups.LineHeight.class, + StudioPropertyGroups.WidthWithIntegerType.class, + StudioChartsPropertyGroups.IntegerHeight.class, + StudioChartsPropertyGroups.TextBorderColor.class, + StudioChartsPropertyGroups.TextBorderWidth.class, + StudioChartsPropertyGroups.TextBorderType.class, + StudioChartsPropertyGroups.TextBorderDashOffset.class, + StudioChartsPropertyGroups.TextShadowColor.class, + StudioChartsPropertyGroups.TextShadowBlur.class, + StudioChartsPropertyGroups.TextShadowOffsetX.class, + StudioChartsPropertyGroups.TextShadowOffsetY.class, + StudioChartsPropertyGroups.Overflow.class, + StudioChartsPropertyGroups.Ellipsis.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "interval", type = StudioPropertyType.INTEGER), @@ -3934,6 +4447,11 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.SplitDefaultProperties.class, + StudioChartsPropertyGroups.Inside.class, + StudioChartsPropertyGroups.Length.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "alignWithLabel", type = StudioPropertyType.BOOLEAN), @@ -3954,6 +4472,11 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.SplitNumber.class, + StudioChartsPropertyGroups.Length.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "splitNumber", type = StudioPropertyType.INTEGER), @@ -3996,6 +4519,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.LineStyleDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "color", type = StudioPropertyType.OPTIONS, options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", @@ -4074,6 +4598,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.LineStyleDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "color", type = StudioPropertyType.OPTIONS, options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", @@ -4151,6 +4676,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.CartesianAxisDefaultProperties.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "gridIndex", type = StudioPropertyType.INTEGER), @@ -4210,6 +4738,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.CartesianAxisDefaultProperties.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "gridIndex", type = StudioPropertyType.INTEGER), @@ -4275,6 +4806,31 @@ public interface StudioChartsElements { unlimitedCount = false, isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.StartAngle.class, + StudioChartsPropertyGroups.Clockwise.class, + StudioChartsPropertyGroups.PolarIndex.class, + StudioChartsPropertyGroups.MinFunction.class, + StudioChartsPropertyGroups.MaxFunction.class, + StudioChartsPropertyGroups.AnimationFunctionDefaultProperties.class, + StudioPropertyGroups.Id.class, + StudioChartsPropertyGroups.AxisType.class, + StudioChartsPropertyGroups.CategoryBoundaryGap.class, + StudioChartsPropertyGroups.NonCategoryBoundaryGap.class, + StudioChartsPropertyGroups.StringMin.class, + StudioChartsPropertyGroups.StringMax.class, + StudioChartsPropertyGroups.BooleanScale.class, + StudioChartsPropertyGroups.SplitNumber.class, + StudioChartsPropertyGroups.MinInterval.class, + StudioChartsPropertyGroups.MaxInterval.class, + StudioChartsPropertyGroups.Interval.class, + StudioChartsPropertyGroups.LogBase.class, + StudioChartsPropertyGroups.Silent.class, + StudioChartsPropertyGroups.TriggerEvent.class, + StudioChartsPropertyGroups.AnimationDefaultProperties.class, + StudioChartsPropertyGroups.IntegerZLevel.class, + StudioChartsPropertyGroups.IntegerZ.class + }, properties = { @StudioProperty(xmlAttribute = "startAngle", type = StudioPropertyType.INTEGER), @StudioProperty(xmlAttribute = "clockwise", type = StudioPropertyType.BOOLEAN), @@ -4325,6 +4881,33 @@ public interface StudioChartsElements { unlimitedCount = false, isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Name.class, + StudioChartsPropertyGroups.NameGap.class, + StudioChartsPropertyGroups.NameRotate.class, + StudioChartsPropertyGroups.Inverse.class, + StudioChartsPropertyGroups.PolarIndex.class, + StudioChartsPropertyGroups.MinFunction.class, + StudioChartsPropertyGroups.MaxFunction.class, + StudioChartsPropertyGroups.AnimationFunctionDefaultProperties.class, + StudioPropertyGroups.Id.class, + StudioChartsPropertyGroups.AxisType.class, + StudioChartsPropertyGroups.CategoryBoundaryGap.class, + StudioChartsPropertyGroups.NonCategoryBoundaryGap.class, + StudioChartsPropertyGroups.StringMin.class, + StudioChartsPropertyGroups.StringMax.class, + StudioChartsPropertyGroups.BooleanScale.class, + StudioChartsPropertyGroups.SplitNumber.class, + StudioChartsPropertyGroups.MinInterval.class, + StudioChartsPropertyGroups.MaxInterval.class, + StudioChartsPropertyGroups.Interval.class, + StudioChartsPropertyGroups.LogBase.class, + StudioChartsPropertyGroups.Silent.class, + StudioChartsPropertyGroups.TriggerEvent.class, + StudioChartsPropertyGroups.AnimationDefaultProperties.class, + StudioChartsPropertyGroups.IntegerZLevel.class, + StudioChartsPropertyGroups.IntegerZ.class + }, properties = { @StudioProperty(xmlAttribute = "name", type = StudioPropertyType.STRING), @@ -4380,6 +4963,39 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.ChartColor.class, + StudioChartsPropertyGroups.Ellipsis.class, + StudioChartsPropertyGroups.FontFamily.class, + StudioChartsPropertyGroups.FontSize.class, + StudioChartsPropertyGroups.FontStyle.class, + StudioChartsPropertyGroups.FontWeight.class, + StudioChartsPropertyGroups.IntegerHeight.class, + StudioChartsPropertyGroups.LineHeight.class, + StudioChartsPropertyGroups.Overflow.class, + StudioChartsPropertyGroups.TextBorderColor.class, + StudioChartsPropertyGroups.TextBorderDashOffset.class, + StudioChartsPropertyGroups.TextBorderType.class, + StudioChartsPropertyGroups.TextBorderWidth.class, + StudioChartsPropertyGroups.TextShadowBlur.class, + StudioChartsPropertyGroups.TextShadowColor.class, + StudioChartsPropertyGroups.TextShadowOffsetX.class, + StudioChartsPropertyGroups.TextShadowOffsetY.class, + StudioPropertyGroups.WidthWithIntegerType.class, + StudioChartsPropertyGroups.SharedAlign.class, + StudioChartsPropertyGroups.VerticalAlign.class, + StudioChartsPropertyGroups.BackgroundColor.class, + StudioChartsPropertyGroups.BorderColor.class, + StudioChartsPropertyGroups.IntegerBorderWidth.class, + StudioChartsPropertyGroups.BorderType.class, + StudioChartsPropertyGroups.BorderDashOffset.class, + StudioChartsPropertyGroups.BorderRadius.class, + StudioChartsPropertyGroups.Padding.class, + StudioChartsPropertyGroups.ShadowColor.class, + StudioChartsPropertyGroups.ShadowBlur.class, + StudioChartsPropertyGroups.ShadowOffsetX.class, + StudioChartsPropertyGroups.ShadowOffsetY.class + }, properties = { @StudioProperty(xmlAttribute = "color", type = StudioPropertyType.OPTIONS, options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", @@ -4580,6 +5196,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.AreaStyleDefaultProperties.class + }, properties = { @StudioProperty(xmlAttribute = "shadowBlur", type = StudioPropertyType.INTEGER), @StudioProperty(xmlAttribute = "shadowOffsetX", type = StudioPropertyType.INTEGER), @@ -4647,6 +5266,27 @@ public interface StudioChartsElements { xmlnsAlias = "charts", isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioPropertyGroups.Id.class, + StudioChartsPropertyGroups.XAxisIndexes.class, + StudioChartsPropertyGroups.YAxisIndexes.class, + StudioChartsPropertyGroups.RadiusAxisIndexes.class, + StudioChartsPropertyGroups.AngleAxisIndexes.class, + StudioChartsPropertyGroups.FilterMode.class, + StudioChartsPropertyGroups.Start.class, + StudioChartsPropertyGroups.End.class, + StudioChartsPropertyGroups.StartValue.class, + StudioChartsPropertyGroups.EndValue.class, + StudioChartsPropertyGroups.MinSpan.class, + StudioChartsPropertyGroups.MaxSpan.class, + StudioChartsPropertyGroups.MinValueSpan.class, + StudioChartsPropertyGroups.MaxValueSpan.class, + StudioChartsPropertyGroups.Orientation.class, + StudioChartsPropertyGroups.ZoomLock.class, + StudioChartsPropertyGroups.Throttle.class, + StudioChartsPropertyGroups.RangeMode.class, + StudioChartsPropertyGroups.Disabled.class + }, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID), @StudioProperty(xmlAttribute = "xAxisIndexes", type = StudioPropertyType.VALUES_LIST), @@ -4688,6 +5328,41 @@ public interface StudioChartsElements { xmlnsAlias = "charts", isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioPropertyGroups.Id.class, + StudioChartsPropertyGroups.XAxisIndexes.class, + StudioChartsPropertyGroups.YAxisIndexes.class, + StudioChartsPropertyGroups.RadiusAxisIndexes.class, + StudioChartsPropertyGroups.AngleAxisIndexes.class, + StudioChartsPropertyGroups.FilterMode.class, + StudioChartsPropertyGroups.Start.class, + StudioChartsPropertyGroups.End.class, + StudioChartsPropertyGroups.StartValue.class, + StudioChartsPropertyGroups.EndValue.class, + StudioChartsPropertyGroups.MinSpan.class, + StudioChartsPropertyGroups.MaxSpan.class, + StudioChartsPropertyGroups.MinValueSpan.class, + StudioChartsPropertyGroups.MaxValueSpan.class, + StudioChartsPropertyGroups.Orientation.class, + StudioChartsPropertyGroups.ZoomLock.class, + StudioChartsPropertyGroups.Throttle.class, + StudioChartsPropertyGroups.RangeMode.class, + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.BackgroundColor.class, + StudioChartsPropertyGroups.BorderColor.class, + StudioChartsPropertyGroups.BorderRadius.class, + StudioChartsPropertyGroups.HandleIcon.class, + StudioChartsPropertyGroups.HandleSize.class, + StudioChartsPropertyGroups.Realtime.class, + StudioChartsPropertyGroups.IntegerZLevel.class, + StudioChartsPropertyGroups.IntegerZ.class, + StudioChartsPropertyGroups.Left.class, + StudioChartsPropertyGroups.StringTop.class, + StudioChartsPropertyGroups.StringRight.class, + StudioChartsPropertyGroups.Bottom.class, + StudioChartsPropertyGroups.Width.class, + StudioChartsPropertyGroups.StringHeight.class + }, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID), @StudioProperty(xmlAttribute = "xAxisIndexes", type = StudioPropertyType.VALUES_LIST), @@ -4856,6 +5531,38 @@ public interface StudioChartsElements { xmlnsAlias = "charts", isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioPropertyGroups.Id.class, + StudioChartsPropertyGroups.DoubleMin.class, + StudioChartsPropertyGroups.DoubleMax.class, + StudioChartsPropertyGroups.Inverse.class, + StudioChartsPropertyGroups.DoublePrecision.class, + StudioChartsPropertyGroups.DoubleItemWidth.class, + StudioChartsPropertyGroups.DoubleItemHeight.class, + StudioChartsPropertyGroups.MapAlign.class, + StudioChartsPropertyGroups.Text.class, + StudioChartsPropertyGroups.TextGap.class, + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.Dimension.class, + StudioChartsPropertyGroups.SeriesIndex.class, + StudioChartsPropertyGroups.HoverLink.class, + StudioChartsPropertyGroups.DoubleZLevel.class, + StudioChartsPropertyGroups.DoubleZ.class, + StudioChartsPropertyGroups.Left.class, + StudioChartsPropertyGroups.StringTop.class, + StudioChartsPropertyGroups.StringRight.class, + StudioChartsPropertyGroups.Bottom.class, + StudioChartsPropertyGroups.Padding.class, + StudioChartsPropertyGroups.DoubleBorderWidth.class, + StudioChartsPropertyGroups.Formatter.class, + StudioChartsPropertyGroups.FormatterFunction.class, + StudioChartsPropertyGroups.Orientation.class, + StudioChartsPropertyGroups.BackgroundColor.class, + StudioChartsPropertyGroups.BorderColor.class, + StudioChartsPropertyGroups.Realtime.class, + StudioChartsPropertyGroups.HandleIcon.class, + StudioChartsPropertyGroups.HandleSize.class + }, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID), @StudioProperty(xmlAttribute = "min", type = StudioPropertyType.DOUBLE), @@ -4955,6 +5662,38 @@ public interface StudioChartsElements { xmlnsAlias = "charts", isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioPropertyGroups.Id.class, + StudioChartsPropertyGroups.DoubleMin.class, + StudioChartsPropertyGroups.DoubleMax.class, + StudioChartsPropertyGroups.Inverse.class, + StudioChartsPropertyGroups.DoublePrecision.class, + StudioChartsPropertyGroups.DoubleItemWidth.class, + StudioChartsPropertyGroups.DoubleItemHeight.class, + StudioChartsPropertyGroups.MapAlign.class, + StudioChartsPropertyGroups.Text.class, + StudioChartsPropertyGroups.TextGap.class, + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.Dimension.class, + StudioChartsPropertyGroups.SeriesIndex.class, + StudioChartsPropertyGroups.HoverLink.class, + StudioChartsPropertyGroups.DoubleZLevel.class, + StudioChartsPropertyGroups.DoubleZ.class, + StudioChartsPropertyGroups.Left.class, + StudioChartsPropertyGroups.StringTop.class, + StudioChartsPropertyGroups.StringRight.class, + StudioChartsPropertyGroups.Bottom.class, + StudioChartsPropertyGroups.Padding.class, + StudioChartsPropertyGroups.DoubleBorderWidth.class, + StudioChartsPropertyGroups.Formatter.class, + StudioChartsPropertyGroups.FormatterFunction.class, + StudioChartsPropertyGroups.Orientation.class, + StudioChartsPropertyGroups.BackgroundColor.class, + StudioChartsPropertyGroups.BorderColor.class, + StudioChartsPropertyGroups.SplitNumber.class, + StudioChartsPropertyGroups.SelectedMode.class, + StudioChartsPropertyGroups.ItemGap.class + }, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID), @StudioProperty(xmlAttribute = "min", type = StudioPropertyType.DOUBLE), @@ -5059,6 +5798,13 @@ public interface StudioChartsElements { xmlns = "http://jmix.io/schema/charts/ui", xmlnsAlias = "charts", icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.DoubleMin.class, + StudioChartsPropertyGroups.DoubleMax.class, + StudioPropertyGroups.Label.class, + StudioChartsPropertyGroups.DoubleValue.class, + StudioChartsPropertyGroups.ChartColor.class + }, properties = { @StudioProperty(xmlAttribute = "min", type = StudioPropertyType.DOUBLE), @StudioProperty(xmlAttribute = "max", type = StudioPropertyType.DOUBLE), @@ -5119,6 +5865,7 @@ public interface StudioChartsElements { unlimitedCount = false, xmlnsAlias = "charts", icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.TextStyleDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "color", type = StudioPropertyType.OPTIONS, options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", @@ -5226,6 +5973,36 @@ public interface StudioChartsElements { xmlnsAlias = "charts", isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/element/lineSeries.svg", + propertyGroups = { + StudioChartsPropertyGroups.CoordinateSystem.class, + StudioChartsPropertyGroups.XAxisIndex.class, + StudioChartsPropertyGroups.YAxisIndex.class, + StudioChartsPropertyGroups.PolarIndex.class, + StudioChartsPropertyGroups.Clip.class, + StudioChartsPropertyGroups.Sampling.class, + StudioChartsPropertyGroups.Cursor.class, + StudioChartsPropertyGroups.AnimationDefaultProperties.class, + StudioPropertyGroups.Symbol.class, + StudioChartsPropertyGroups.IntegerSymbolSize.class, + StudioChartsPropertyGroups.SymbolSizeFunction.class, + StudioChartsPropertyGroups.SymbolRotate.class, + StudioChartsPropertyGroups.SymbolKeepAspect.class, + StudioChartsPropertyGroups.SymbolOffset.class, + StudioChartsPropertyGroups.SymbolType.class, + StudioChartsPropertyGroups.Stack.class, + StudioChartsPropertyGroups.StackStrategy.class, + StudioChartsPropertyGroups.LegendHoverLink.class, + StudioChartsPropertyGroups.SeriesLayoutBy.class, + StudioChartsPropertyGroups.DatasetIndex.class, + StudioPropertyGroups.Id.class, + StudioPropertyGroups.LocalizedNameWithoutCategory.class, + StudioChartsPropertyGroups.ColorBy.class, + StudioChartsPropertyGroups.SelectedMode.class, + StudioChartsPropertyGroups.DataGroupId.class, + StudioChartsPropertyGroups.IntegerZLevel.class, + StudioChartsPropertyGroups.IntegerZ.class, + StudioChartsPropertyGroups.Silent.class + }, properties = { @StudioProperty(xmlAttribute = "coordinateSystem", type = StudioPropertyType.ENUMERATION, classFqn = "io.jmix.chartsflowui.kit.component.model.series.CoordinateSystem", @@ -5304,6 +6081,45 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.SharedAlign.class, + StudioChartsPropertyGroups.VerticalAlign.class, + StudioChartsPropertyGroups.BorderType.class, + StudioChartsPropertyGroups.BorderDashOffset.class, + StudioChartsPropertyGroups.BorderRadius.class, + StudioChartsPropertyGroups.Distance.class, + StudioChartsPropertyGroups.Rotate.class, + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.Formatter.class, + StudioChartsPropertyGroups.FormatterFunction.class, + StudioChartsPropertyGroups.ValueAnimation.class, + StudioChartsPropertyGroups.Padding.class, + StudioChartsPropertyGroups.BackgroundColor.class, + StudioChartsPropertyGroups.BorderColor.class, + StudioChartsPropertyGroups.IntegerBorderWidth.class, + StudioChartsPropertyGroups.ShadowBlur.class, + StudioChartsPropertyGroups.ShadowColor.class, + StudioChartsPropertyGroups.ShadowOffsetX.class, + StudioChartsPropertyGroups.ShadowOffsetY.class, + StudioChartsPropertyGroups.ChartColor.class, + StudioChartsPropertyGroups.FontStyle.class, + StudioChartsPropertyGroups.FontWeight.class, + StudioChartsPropertyGroups.FontFamily.class, + StudioChartsPropertyGroups.FontSize.class, + StudioChartsPropertyGroups.LineHeight.class, + StudioPropertyGroups.WidthWithIntegerType.class, + StudioChartsPropertyGroups.IntegerHeight.class, + StudioChartsPropertyGroups.TextBorderColor.class, + StudioChartsPropertyGroups.TextBorderWidth.class, + StudioChartsPropertyGroups.TextBorderType.class, + StudioChartsPropertyGroups.TextBorderDashOffset.class, + StudioChartsPropertyGroups.TextShadowColor.class, + StudioChartsPropertyGroups.TextShadowBlur.class, + StudioChartsPropertyGroups.TextShadowOffsetX.class, + StudioChartsPropertyGroups.TextShadowOffsetY.class, + StudioChartsPropertyGroups.Overflow.class, + StudioChartsPropertyGroups.Ellipsis.class + }, properties = { @StudioProperty(xmlAttribute = "align", type = StudioPropertyType.ENUMERATION, classFqn = "io.jmix.chartsflowui.kit.component.model.shared.Align", @@ -5508,6 +6324,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.ItemStyleDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "color", type = StudioPropertyType.OPTIONS, options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", @@ -5611,6 +6428,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.ItemStyleDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "color", type = StudioPropertyType.OPTIONS, options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", @@ -5714,6 +6532,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.LabelLineDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "showAbove", type = StudioPropertyType.BOOLEAN), @@ -5733,6 +6552,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.AreaStyleDefaultProperties.class + }, properties = { @StudioProperty(xmlAttribute = "originType", type = StudioPropertyType.ENUMERATION, classFqn = "io.jmix.chartsflowui.kit.component.model.series.LineSeries.AreaStyle.Origin.OriginType", @@ -5817,6 +6639,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Disabled.class + }, properties = { @StudioProperty(xmlAttribute = "disabled", type = StudioPropertyType.BOOLEAN) } @@ -5832,6 +6657,12 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Disabled.class, + StudioChartsPropertyGroups.DoubleScale.class, + StudioChartsPropertyGroups.Focus.class, + StudioChartsPropertyGroups.BlurScope.class + }, properties = { @StudioProperty(xmlAttribute = "disabled", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "scale", type = StudioPropertyType.DOUBLE), @@ -5860,6 +6691,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Show.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN) } @@ -5875,6 +6709,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.AreaStyleDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "color", type = StudioPropertyType.OPTIONS, options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", @@ -5942,6 +6777,38 @@ public interface StudioChartsElements { xmlnsAlias = "charts", isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/element/barSeries.svg", + propertyGroups = { + StudioChartsPropertyGroups.CoordinateSystem.class, + StudioChartsPropertyGroups.XAxisIndex.class, + StudioChartsPropertyGroups.YAxisIndex.class, + StudioChartsPropertyGroups.PolarIndex.class, + StudioChartsPropertyGroups.Sampling.class, + StudioChartsPropertyGroups.Stack.class, + StudioChartsPropertyGroups.Clip.class, + StudioChartsPropertyGroups.StackStrategy.class, + StudioChartsPropertyGroups.RoundCap.class, + StudioChartsPropertyGroups.BarWidth.class, + StudioChartsPropertyGroups.BarMaxWidth.class, + StudioChartsPropertyGroups.BarMinWidth.class, + StudioChartsPropertyGroups.Cursor.class, + StudioChartsPropertyGroups.Large.class, + StudioChartsPropertyGroups.LargeThreshold.class, + StudioChartsPropertyGroups.Progressive.class, + StudioChartsPropertyGroups.ProgressiveThreshold.class, + StudioChartsPropertyGroups.AnimationDefaultProperties.class, + StudioChartsPropertyGroups.ProgressiveChunkMode.class, + StudioChartsPropertyGroups.LegendHoverLink.class, + StudioChartsPropertyGroups.SeriesLayoutBy.class, + StudioChartsPropertyGroups.DatasetIndex.class, + StudioPropertyGroups.Id.class, + StudioChartsPropertyGroups.Name.class, + StudioChartsPropertyGroups.ColorBy.class, + StudioChartsPropertyGroups.SelectedMode.class, + StudioChartsPropertyGroups.DataGroupId.class, + StudioChartsPropertyGroups.IntegerZLevel.class, + StudioChartsPropertyGroups.IntegerZ.class, + StudioChartsPropertyGroups.Silent.class + }, properties = { @StudioProperty(xmlAttribute = "coordinateSystem", type = StudioPropertyType.ENUMERATION, classFqn = "io.jmix.chartsflowui.kit.component.model.series.CoordinateSystem", @@ -6013,6 +6880,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.EmphasisDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "disabled", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "focus", type = StudioPropertyType.ENUMERATION, @@ -6046,6 +6914,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Disabled.class + }, properties = { @StudioProperty(xmlAttribute = "disabled", type = StudioPropertyType.BOOLEAN) } @@ -6062,6 +6933,17 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.HideOverlap.class, + StudioChartsPropertyGroups.X.class, + StudioChartsPropertyGroups.Y.class, + StudioChartsPropertyGroups.Rotate.class, + StudioPropertyGroups.WidthWithIntegerType.class, + StudioChartsPropertyGroups.IntegerHeight.class, + StudioChartsPropertyGroups.SharedAlign.class, + StudioChartsPropertyGroups.VerticalAlign.class, + StudioChartsPropertyGroups.FontSize.class + }, properties = { @StudioProperty(xmlAttribute = "hideOverlap", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "moveOverlap", type = StudioPropertyType.ENUMERATION, @@ -6096,6 +6978,18 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.TooltipPosition.class, + StudioChartsPropertyGroups.PositionCoordinates.class, + StudioChartsPropertyGroups.Formatter.class, + StudioChartsPropertyGroups.FormatterFunction.class, + StudioChartsPropertyGroups.ValueFormatter.class, + StudioChartsPropertyGroups.BackgroundColor.class, + StudioChartsPropertyGroups.BorderColor.class, + StudioChartsPropertyGroups.IntegerBorderWidth.class, + StudioChartsPropertyGroups.Padding.class, + StudioChartsPropertyGroups.ExtraCssText.class + }, properties = { @StudioProperty(xmlAttribute = "position", type = StudioPropertyType.ENUMERATION, classFqn = "io.jmix.chartsflowui.kit.component.model.shared.AbstractTooltip.Position.ItemTriggerPosition", @@ -6173,6 +7067,17 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioPropertyGroups.Symbol.class, + StudioChartsPropertyGroups.IntegerSymbolSize.class, + StudioChartsPropertyGroups.SymbolSizeFunction.class, + StudioChartsPropertyGroups.SymbolRotate.class, + StudioChartsPropertyGroups.SymbolKeepAspect.class, + StudioChartsPropertyGroups.SymbolOffset.class, + StudioChartsPropertyGroups.SymbolType.class, + StudioChartsPropertyGroups.Silent.class, + StudioChartsPropertyGroups.AnimationDefaultProperties.class + }, properties = { @StudioProperty(xmlAttribute = "symbol", type = StudioPropertyType.STRING), @StudioProperty(xmlAttribute = "symbolSize", type = StudioPropertyType.INTEGER), @@ -6192,7 +7097,7 @@ public interface StudioChartsElements { @StudioProperty(xmlAttribute = "animationDelay", type = StudioPropertyType.INTEGER), @StudioProperty(xmlAttribute = "animationDurationUpdate", type = StudioPropertyType.INTEGER), @StudioProperty(xmlAttribute = "animationEasingUpdate", type = StudioPropertyType.STRING), - @StudioProperty(xmlAttribute = "animationDelayUpdate", type = StudioPropertyType.STRING) + @StudioProperty(xmlAttribute = "animationDelayUpdate", type = StudioPropertyType.INTEGER) } ) MarkPoint markPoint(); @@ -6209,6 +7114,12 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.IntegerSymbolSize.class, + StudioChartsPropertyGroups.IntegerPrecision.class, + StudioChartsPropertyGroups.Silent.class, + StudioChartsPropertyGroups.AnimationDefaultProperties.class + }, properties = { @StudioProperty(xmlAttribute = "symbolSize", type = StudioPropertyType.INTEGER), @StudioProperty(xmlAttribute = "precision", type = StudioPropertyType.INTEGER), @@ -6224,7 +7135,7 @@ public interface StudioChartsElements { @StudioProperty(xmlAttribute = "animationDelay", type = StudioPropertyType.INTEGER), @StudioProperty(xmlAttribute = "animationDurationUpdate", type = StudioPropertyType.INTEGER), @StudioProperty(xmlAttribute = "animationEasingUpdate", type = StudioPropertyType.STRING), - @StudioProperty(xmlAttribute = "animationDelayUpdate", type = StudioPropertyType.STRING) + @StudioProperty(xmlAttribute = "animationDelayUpdate", type = StudioPropertyType.INTEGER) } ) MarkLine markLine(); @@ -6241,6 +7152,10 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Silent.class, + StudioChartsPropertyGroups.AnimationDefaultProperties.class + }, properties = { @StudioProperty(xmlAttribute = "silent", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "animation", type = StudioPropertyType.BOOLEAN), @@ -6250,7 +7165,7 @@ public interface StudioChartsElements { @StudioProperty(xmlAttribute = "animationDelay", type = StudioPropertyType.INTEGER), @StudioProperty(xmlAttribute = "animationDurationUpdate", type = StudioPropertyType.INTEGER), @StudioProperty(xmlAttribute = "animationEasingUpdate", type = StudioPropertyType.STRING), - @StudioProperty(xmlAttribute = "animationDelayUpdate", type = StudioPropertyType.STRING) + @StudioProperty(xmlAttribute = "animationDelayUpdate", type = StudioPropertyType.INTEGER) } ) MarkArea markArea(); @@ -6267,6 +7182,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Disabled.class + }, properties = { @StudioProperty(xmlAttribute = "disabled", type = StudioPropertyType.BOOLEAN) } @@ -6308,6 +7226,7 @@ public interface StudioChartsElements { xmlns = "http://jmix.io/schema/charts/ui", xmlnsAlias = "charts", icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.LinePointDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "name", type = StudioPropertyType.STRING), @StudioProperty(xmlAttribute = "type", type = StudioPropertyType.ENUMERATION, @@ -6356,6 +7275,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.LinePointDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "name", type = StudioPropertyType.STRING), @StudioProperty(xmlAttribute = "type", type = StudioPropertyType.ENUMERATION, @@ -6393,6 +7313,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.LinePointDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "name", type = StudioPropertyType.STRING), @StudioProperty(xmlAttribute = "type", type = StudioPropertyType.ENUMERATION, @@ -6433,6 +7354,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Disabled.class + }, properties = { @StudioProperty(xmlAttribute = "disabled", type = StudioPropertyType.BOOLEAN) } @@ -6458,6 +7382,23 @@ public interface StudioChartsElements { xmlns = "http://jmix.io/schema/charts/ui", xmlnsAlias = "charts", icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Name.class, + StudioChartsPropertyGroups.PintDataType.class, + StudioChartsPropertyGroups.ValueIndex.class, + StudioChartsPropertyGroups.ValueDim.class, + StudioChartsPropertyGroups.StringCoordinate.class, + StudioChartsPropertyGroups.NumberCoordinate.class, + StudioChartsPropertyGroups.X.class, + StudioChartsPropertyGroups.Y.class, + StudioPropertyGroups.Symbol.class, + StudioChartsPropertyGroups.IntegerSymbolSize.class, + StudioChartsPropertyGroups.SymbolSizeFunction.class, + StudioChartsPropertyGroups.SymbolRotate.class, + StudioChartsPropertyGroups.SymbolKeepAspect.class, + StudioChartsPropertyGroups.SymbolOffset.class, + StudioChartsPropertyGroups.SymbolType.class + }, properties = { @StudioProperty(xmlAttribute = "name", type = StudioPropertyType.STRING), @StudioProperty(xmlAttribute = "type", type = StudioPropertyType.ENUMERATION, @@ -6495,6 +7436,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Disabled.class + }, properties = { @StudioProperty(xmlAttribute = "disabled", type = StudioPropertyType.BOOLEAN) } @@ -6536,6 +7480,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.PointDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "name", type = StudioPropertyType.STRING), @StudioProperty(xmlAttribute = "type", type = StudioPropertyType.ENUMERATION, @@ -6561,6 +7506,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.PointDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "name", type = StudioPropertyType.STRING), @StudioProperty(xmlAttribute = "type", type = StudioPropertyType.ENUMERATION, @@ -6586,6 +7532,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.LabelDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "formatter", type = StudioPropertyType.STRING), @StudioProperty(xmlAttribute = "formatterFunction", type = StudioPropertyType.STRING), @@ -6806,6 +7753,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.LabelDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "formatter", type = StudioPropertyType.STRING), @StudioProperty(xmlAttribute = "formatterFunction", type = StudioPropertyType.STRING), @@ -7013,6 +7961,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Radius.class + }, properties = { @StudioProperty(xmlAttribute = "x", type = StudioPropertyType.VALUES_LIST), @StudioProperty(xmlAttribute = "y", type = StudioPropertyType.VALUES_LIST), @@ -7033,6 +7984,13 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.IntegerBorderWidth.class, + StudioChartsPropertyGroups.BorderType.class, + StudioChartsPropertyGroups.BorderRadius.class, + StudioChartsPropertyGroups.AreaStyleDefaultProperties.class, + StudioChartsPropertyGroups.BorderColor.class + }, properties = { @StudioProperty(xmlAttribute = "borderWidth", type = StudioPropertyType.INTEGER), @StudioProperty(xmlAttribute = "borderType", type = StudioPropertyType.STRING), @@ -7132,6 +8090,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Show.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN) } @@ -7150,6 +8111,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.RoundedItemStyleDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "color", type = StudioPropertyType.OPTIONS, options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", @@ -7246,6 +8208,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.RoundedItemStyleDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "color", type = StudioPropertyType.OPTIONS, options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", @@ -7343,6 +8306,12 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.SymbolKeepAspect.class, + StudioPropertyGroups.Rotation.class, + StudioChartsPropertyGroups.ChartColor.class, + StudioChartsPropertyGroups.BackgroundColor.class + }, properties = { @StudioProperty(xmlAttribute = "symbol", type = StudioPropertyType.ENUMERATION, classFqn = "io.jmix.chartsflowui.kit.component.model.shared.HasSymbols.SymbolType", @@ -7419,6 +8388,33 @@ public interface StudioChartsElements { xmlnsAlias = "charts", isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/element/pieSeries.svg", + propertyGroups = { + StudioChartsPropertyGroups.GeoIndex.class, + StudioChartsPropertyGroups.CalendarIndex.class, + StudioChartsPropertyGroups.Clockwise.class, + StudioChartsPropertyGroups.StartAngle.class, + StudioChartsPropertyGroups.Width.class, + StudioChartsPropertyGroups.StringHeight.class, + StudioChartsPropertyGroups.Cursor.class, + StudioChartsPropertyGroups.Center.class, + StudioChartsPropertyGroups.Radius.class, + StudioChartsPropertyGroups.AnimationDefaultProperties.class, + StudioChartsPropertyGroups.Left.class, + StudioChartsPropertyGroups.Bottom.class, + StudioChartsPropertyGroups.StringRight.class, + StudioChartsPropertyGroups.StringTop.class, + StudioChartsPropertyGroups.LegendHoverLink.class, + StudioChartsPropertyGroups.SeriesLayoutBy.class, + StudioChartsPropertyGroups.DatasetIndex.class, + StudioPropertyGroups.Id.class, + StudioChartsPropertyGroups.Name.class, + StudioChartsPropertyGroups.ColorBy.class, + StudioChartsPropertyGroups.SelectedMode.class, + StudioChartsPropertyGroups.DataGroupId.class, + StudioChartsPropertyGroups.IntegerZLevel.class, + StudioChartsPropertyGroups.IntegerZ.class, + StudioChartsPropertyGroups.Silent.class + }, properties = { @StudioProperty(xmlAttribute = "geoIndex", type = StudioPropertyType.INTEGER), @StudioProperty(xmlAttribute = "calendarIndex", type = StudioPropertyType.INTEGER), @@ -7487,6 +8483,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.LabelLineDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "showAbove", type = StudioPropertyType.BOOLEAN), @@ -7508,6 +8505,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.ScaleEmphasisDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "disabled", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "scale", type = StudioPropertyType.BOOLEAN), @@ -7543,6 +8541,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Disabled.class + }, properties = { @StudioProperty(xmlAttribute = "disabled", type = StudioPropertyType.BOOLEAN) } @@ -7557,6 +8558,39 @@ public interface StudioChartsElements { xmlnsAlias = "charts", isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/element/scatterSeries.svg", + propertyGroups = { + StudioChartsPropertyGroups.CoordinateSystem.class, + StudioChartsPropertyGroups.XAxisIndex.class, + StudioChartsPropertyGroups.YAxisIndex.class, + StudioChartsPropertyGroups.PolarIndex.class, + StudioChartsPropertyGroups.GeoIndex.class, + StudioChartsPropertyGroups.CalendarIndex.class, + StudioChartsPropertyGroups.Clip.class, + StudioChartsPropertyGroups.Cursor.class, + StudioChartsPropertyGroups.Large.class, + StudioChartsPropertyGroups.LargeThreshold.class, + StudioChartsPropertyGroups.Progressive.class, + StudioChartsPropertyGroups.ProgressiveThreshold.class, + StudioChartsPropertyGroups.AnimationDefaultProperties.class, + StudioPropertyGroups.Symbol.class, + StudioChartsPropertyGroups.IntegerSymbolSize.class, + StudioChartsPropertyGroups.SymbolSizeFunction.class, + StudioChartsPropertyGroups.SymbolRotate.class, + StudioChartsPropertyGroups.SymbolKeepAspect.class, + StudioChartsPropertyGroups.SymbolOffset.class, + StudioChartsPropertyGroups.SymbolType.class, + StudioChartsPropertyGroups.LegendHoverLink.class, + StudioChartsPropertyGroups.SeriesLayoutBy.class, + StudioChartsPropertyGroups.DatasetIndex.class, + StudioPropertyGroups.Id.class, + StudioChartsPropertyGroups.Name.class, + StudioChartsPropertyGroups.ColorBy.class, + StudioChartsPropertyGroups.SelectedMode.class, + StudioChartsPropertyGroups.DataGroupId.class, + StudioChartsPropertyGroups.IntegerZLevel.class, + StudioChartsPropertyGroups.IntegerZ.class, + StudioChartsPropertyGroups.Silent.class + }, properties = { @StudioProperty(xmlAttribute = "coordinateSystem", type = StudioPropertyType.ENUMERATION, classFqn = "io.jmix.chartsflowui.kit.component.model.series.CoordinateSystem", @@ -7620,6 +8654,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.LabelLineDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "showAbove", type = StudioPropertyType.BOOLEAN), @@ -7639,6 +8674,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.ScaleEmphasisDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "disabled", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "scale", type = StudioPropertyType.BOOLEAN), @@ -7673,6 +8709,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Disabled.class + }, properties = { @StudioProperty(xmlAttribute = "disabled", type = StudioPropertyType.BOOLEAN) } @@ -7687,6 +8726,35 @@ public interface StudioChartsElements { xmlnsAlias = "charts", isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/element/scatterSeries.svg", + propertyGroups = { + StudioChartsPropertyGroups.CoordinateSystem.class, + StudioChartsPropertyGroups.XAxisIndex.class, + StudioChartsPropertyGroups.YAxisIndex.class, + StudioChartsPropertyGroups.PolarIndex.class, + StudioChartsPropertyGroups.GeoIndex.class, + StudioChartsPropertyGroups.CalendarIndex.class, + StudioChartsPropertyGroups.Clip.class, + StudioChartsPropertyGroups.Cursor.class, + StudioChartsPropertyGroups.AnimationDefaultProperties.class, + StudioPropertyGroups.Symbol.class, + StudioChartsPropertyGroups.IntegerSymbolSize.class, + StudioChartsPropertyGroups.SymbolSizeFunction.class, + StudioChartsPropertyGroups.SymbolRotate.class, + StudioChartsPropertyGroups.SymbolKeepAspect.class, + StudioChartsPropertyGroups.SymbolOffset.class, + StudioChartsPropertyGroups.SymbolType.class, + StudioChartsPropertyGroups.LegendHoverLink.class, + StudioChartsPropertyGroups.SeriesLayoutBy.class, + StudioChartsPropertyGroups.DatasetIndex.class, + StudioPropertyGroups.Id.class, + StudioChartsPropertyGroups.Name.class, + StudioChartsPropertyGroups.ColorBy.class, + StudioChartsPropertyGroups.SelectedMode.class, + StudioChartsPropertyGroups.DataGroupId.class, + StudioChartsPropertyGroups.IntegerZLevel.class, + StudioChartsPropertyGroups.IntegerZ.class, + StudioChartsPropertyGroups.Silent.class + }, properties = { @StudioProperty(xmlAttribute = "coordinateSystem", type = StudioPropertyType.ENUMERATION, classFqn = "io.jmix.chartsflowui.kit.component.model.series.CoordinateSystem", @@ -7750,6 +8818,10 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.ChartColor.class, + StudioChartsPropertyGroups.DoubleScale.class + }, properties = { @StudioProperty(xmlAttribute = "color", type = StudioPropertyType.OPTIONS, options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", @@ -7795,6 +8867,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.LabelLineDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "showAbove", type = StudioPropertyType.BOOLEAN), @@ -7814,6 +8887,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.ScaleEmphasisDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "disabled", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "scale", type = StudioPropertyType.BOOLEAN), @@ -7847,6 +8921,9 @@ public interface StudioChartsElements { xmlns = "http://jmix.io/schema/charts/ui", xmlnsAlias = "charts", icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Disabled.class + }, properties = { @StudioProperty(xmlAttribute = "disabled", type = StudioPropertyType.BOOLEAN) } @@ -7861,6 +8938,24 @@ public interface StudioChartsElements { xmlnsAlias = "charts", isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/element/radarSeries.svg", + propertyGroups = { + StudioChartsPropertyGroups.AnimationDefaultProperties.class, + StudioPropertyGroups.Symbol.class, + StudioChartsPropertyGroups.IntegerSymbolSize.class, + StudioChartsPropertyGroups.SymbolSizeFunction.class, + StudioChartsPropertyGroups.SymbolRotate.class, + StudioChartsPropertyGroups.SymbolKeepAspect.class, + StudioChartsPropertyGroups.SymbolOffset.class, + StudioChartsPropertyGroups.SymbolType.class, + StudioPropertyGroups.Id.class, + StudioChartsPropertyGroups.Name.class, + StudioChartsPropertyGroups.ColorBy.class, + StudioChartsPropertyGroups.SelectedMode.class, + StudioChartsPropertyGroups.DataGroupId.class, + StudioChartsPropertyGroups.IntegerZLevel.class, + StudioChartsPropertyGroups.IntegerZ.class, + StudioChartsPropertyGroups.Silent.class + }, properties = { @StudioProperty(xmlAttribute = "radarIndex", type = StudioPropertyType.INTEGER), @StudioProperty(xmlAttribute = "animation", type = StudioPropertyType.BOOLEAN), @@ -7909,6 +9004,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.AreaStyleDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "color", type = StudioPropertyType.OPTIONS, options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", @@ -7977,6 +9073,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.EmphasisDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "disabled", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "focus", type = StudioPropertyType.ENUMERATION, @@ -8010,6 +9107,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Disabled.class + }, properties = { @StudioProperty(xmlAttribute = "disabled", type = StudioPropertyType.BOOLEAN) } @@ -8024,6 +9124,27 @@ public interface StudioChartsElements { xmlnsAlias = "charts", isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.CoordinateSystem.class, + StudioChartsPropertyGroups.XAxisIndex.class, + StudioChartsPropertyGroups.YAxisIndex.class, + StudioChartsPropertyGroups.HoverAnimation.class, + StudioChartsPropertyGroups.Layout.class, + StudioChartsPropertyGroups.LegendHoverLink.class, + StudioChartsPropertyGroups.SeriesLayoutBy.class, + StudioChartsPropertyGroups.DatasetIndex.class, + StudioPropertyGroups.Id.class, + StudioChartsPropertyGroups.Name.class, + StudioChartsPropertyGroups.ColorBy.class, + StudioChartsPropertyGroups.SelectedMode.class, + StudioChartsPropertyGroups.DataGroupId.class, + StudioChartsPropertyGroups.IntegerZLevel.class, + StudioChartsPropertyGroups.IntegerZ.class, + StudioChartsPropertyGroups.Silent.class, + StudioChartsPropertyGroups.AnimationDuration.class, + StudioChartsPropertyGroups.AnimationEasing.class, + StudioChartsPropertyGroups.AnimationDelay.class + }, properties = { @StudioProperty(xmlAttribute = "coordinateSystem", type = StudioPropertyType.ENUMERATION, classFqn = "io.jmix.chartsflowui.kit.component.model.series.CoordinateSystem", @@ -8068,6 +9189,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.EmphasisDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "disabled", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "focus", type = StudioPropertyType.ENUMERATION, @@ -8101,6 +9223,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Disabled.class + }, properties = { @StudioProperty(xmlAttribute = "disabled", type = StudioPropertyType.BOOLEAN) } @@ -8115,6 +9240,36 @@ public interface StudioChartsElements { xmlnsAlias = "charts", isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/element/candlestickSeries.svg", + propertyGroups = { + StudioChartsPropertyGroups.CoordinateSystem.class, + StudioChartsPropertyGroups.XAxisIndex.class, + StudioChartsPropertyGroups.YAxisIndex.class, + StudioChartsPropertyGroups.HoverAnimation.class, + StudioChartsPropertyGroups.Layout.class, + StudioChartsPropertyGroups.BarWidth.class, + StudioChartsPropertyGroups.BarMaxWidth.class, + StudioChartsPropertyGroups.BarMinWidth.class, + StudioChartsPropertyGroups.Large.class, + StudioChartsPropertyGroups.LargeThreshold.class, + StudioChartsPropertyGroups.Progressive.class, + StudioChartsPropertyGroups.ProgressiveThreshold.class, + StudioChartsPropertyGroups.ProgressiveChunkMode.class, + StudioChartsPropertyGroups.Clip.class, + StudioChartsPropertyGroups.LegendHoverLink.class, + StudioChartsPropertyGroups.SeriesLayoutBy.class, + StudioChartsPropertyGroups.DatasetIndex.class, + StudioPropertyGroups.Id.class, + StudioChartsPropertyGroups.Name.class, + StudioChartsPropertyGroups.ColorBy.class, + StudioChartsPropertyGroups.SelectedMode.class, + StudioChartsPropertyGroups.DataGroupId.class, + StudioChartsPropertyGroups.IntegerZLevel.class, + StudioChartsPropertyGroups.IntegerZ.class, + StudioChartsPropertyGroups.Silent.class, + StudioChartsPropertyGroups.AnimationDuration.class, + StudioChartsPropertyGroups.AnimationEasing.class, + StudioChartsPropertyGroups.AnimationDelay.class + }, properties = { @StudioProperty(xmlAttribute = "coordinateSystem", type = StudioPropertyType.ENUMERATION, classFqn = "io.jmix.chartsflowui.kit.component.model.series.CoordinateSystem", @@ -8169,6 +9324,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.EmphasisDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "disabled", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "focus", type = StudioPropertyType.ENUMERATION, @@ -8202,6 +9358,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Disabled.class + }, properties = { @StudioProperty(xmlAttribute = "disabled", type = StudioPropertyType.BOOLEAN) } @@ -8220,6 +9379,14 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.DoubleBorderWidth.class, + StudioChartsPropertyGroups.Opacity.class, + StudioChartsPropertyGroups.ShadowBlur.class, + StudioChartsPropertyGroups.ShadowColor.class, + StudioChartsPropertyGroups.ShadowOffsetX.class, + StudioChartsPropertyGroups.ShadowOffsetY.class + }, properties = { @StudioProperty(xmlAttribute = "bullishColor", type = StudioPropertyType.OPTIONS, options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", @@ -8388,6 +9555,29 @@ public interface StudioChartsElements { xmlnsAlias = "charts", isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/element/funnelSeries.svg", + propertyGroups = { + StudioPropertyGroups.IntegerMax.class, + StudioPropertyGroups.IntegerMin.class, + StudioChartsPropertyGroups.Orientation.class, + StudioChartsPropertyGroups.Width.class, + StudioChartsPropertyGroups.StringHeight.class, + StudioChartsPropertyGroups.AnimationDefaultProperties.class, + StudioChartsPropertyGroups.Left.class, + StudioChartsPropertyGroups.StringTop.class, + StudioChartsPropertyGroups.StringRight.class, + StudioChartsPropertyGroups.Bottom.class, + StudioChartsPropertyGroups.LegendHoverLink.class, + StudioChartsPropertyGroups.SeriesLayoutBy.class, + StudioChartsPropertyGroups.DatasetIndex.class, + StudioPropertyGroups.Id.class, + StudioChartsPropertyGroups.Name.class, + StudioChartsPropertyGroups.ColorBy.class, + StudioChartsPropertyGroups.SelectedMode.class, + StudioChartsPropertyGroups.DataGroupId.class, + StudioChartsPropertyGroups.IntegerZLevel.class, + StudioChartsPropertyGroups.IntegerZ.class, + StudioChartsPropertyGroups.Silent.class + }, properties = { @StudioProperty(xmlAttribute = "max", type = StudioPropertyType.INTEGER), @StudioProperty(xmlAttribute = "min", type = StudioPropertyType.INTEGER), @@ -8448,6 +9638,10 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.Length.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "length", type = StudioPropertyType.INTEGER) @@ -8464,6 +9658,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.EmphasisDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "disabled", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "focus", type = StudioPropertyType.ENUMERATION, @@ -8497,6 +9692,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Disabled.class + }, properties = { @StudioProperty(xmlAttribute = "disabled", type = StudioPropertyType.BOOLEAN) } @@ -8511,6 +9709,25 @@ public interface StudioChartsElements { xmlnsAlias = "charts", isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/element/gaugeSeries.svg", + propertyGroups = { + StudioChartsPropertyGroups.Center.class, + StudioChartsPropertyGroups.Radius.class, + StudioChartsPropertyGroups.LegendHoverLink.class, + StudioChartsPropertyGroups.StartAngle.class, + StudioChartsPropertyGroups.Clockwise.class, + StudioPropertyGroups.IntegerMin.class, + StudioPropertyGroups.IntegerMax.class, + StudioChartsPropertyGroups.SplitNumber.class, + StudioChartsPropertyGroups.AnimationDefaultProperties.class, + StudioPropertyGroups.Id.class, + StudioChartsPropertyGroups.Name.class, + StudioChartsPropertyGroups.ColorBy.class, + StudioChartsPropertyGroups.SelectedMode.class, + StudioChartsPropertyGroups.DataGroupId.class, + StudioChartsPropertyGroups.IntegerZLevel.class, + StudioChartsPropertyGroups.IntegerZ.class, + StudioChartsPropertyGroups.Silent.class + }, properties = { @StudioProperty(xmlAttribute = "center", type = StudioPropertyType.VALUES_LIST), @StudioProperty(xmlAttribute = "radius", type = StudioPropertyType.VALUES_LIST), @@ -8552,6 +9769,10 @@ public interface StudioChartsElements { xmlns = "http://jmix.io/schema/charts/ui", xmlnsAlias = "charts", icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioPropertyGroups.LocalizedNameWithoutCategory.class, + StudioChartsPropertyGroups.DoubleValue.class + }, properties = { @StudioProperty(xmlAttribute = "name", type = StudioPropertyType.LOCALIZED_STRING), @StudioProperty(xmlAttribute = "value", type = StudioPropertyType.DOUBLE) @@ -8571,6 +9792,40 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.OffsetCenter.class, + StudioChartsPropertyGroups.ValueAnimation.class, + StudioChartsPropertyGroups.BackgroundColor.class, + StudioChartsPropertyGroups.BorderColor.class, + StudioChartsPropertyGroups.IntegerBorderWidth.class, + StudioChartsPropertyGroups.BorderType.class, + StudioChartsPropertyGroups.BorderDashOffset.class, + StudioChartsPropertyGroups.BorderRadius.class, + StudioChartsPropertyGroups.Padding.class, + StudioChartsPropertyGroups.ShadowBlur.class, + StudioChartsPropertyGroups.ShadowColor.class, + StudioChartsPropertyGroups.ShadowOffsetX.class, + StudioChartsPropertyGroups.ShadowOffsetY.class, + StudioChartsPropertyGroups.ChartColor.class, + StudioChartsPropertyGroups.Ellipsis.class, + StudioChartsPropertyGroups.FontFamily.class, + StudioChartsPropertyGroups.FontSize.class, + StudioChartsPropertyGroups.FontStyle.class, + StudioChartsPropertyGroups.FontWeight.class, + StudioChartsPropertyGroups.IntegerHeight.class, + StudioChartsPropertyGroups.LineHeight.class, + StudioChartsPropertyGroups.Overflow.class, + StudioChartsPropertyGroups.TextBorderColor.class, + StudioChartsPropertyGroups.TextBorderDashOffset.class, + StudioChartsPropertyGroups.TextBorderType.class, + StudioChartsPropertyGroups.TextBorderWidth.class, + StudioChartsPropertyGroups.TextShadowBlur.class, + StudioChartsPropertyGroups.TextShadowColor.class, + StudioChartsPropertyGroups.TextShadowOffsetX.class, + StudioChartsPropertyGroups.TextShadowOffsetY.class, + StudioPropertyGroups.WidthWithIntegerType.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "offsetCenter", type = StudioPropertyType.VALUES_LIST), @@ -8768,6 +10023,42 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Formatter.class, + StudioChartsPropertyGroups.FormatterFunction.class, + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.OffsetCenter.class, + StudioChartsPropertyGroups.ValueAnimation.class, + StudioChartsPropertyGroups.BackgroundColor.class, + StudioChartsPropertyGroups.BorderColor.class, + StudioChartsPropertyGroups.IntegerBorderWidth.class, + StudioChartsPropertyGroups.BorderType.class, + StudioChartsPropertyGroups.BorderDashOffset.class, + StudioChartsPropertyGroups.BorderRadius.class, + StudioChartsPropertyGroups.Padding.class, + StudioChartsPropertyGroups.ShadowBlur.class, + StudioChartsPropertyGroups.ShadowColor.class, + StudioChartsPropertyGroups.ShadowOffsetX.class, + StudioChartsPropertyGroups.ShadowOffsetY.class, + StudioChartsPropertyGroups.ChartColor.class, + StudioChartsPropertyGroups.Ellipsis.class, + StudioChartsPropertyGroups.FontFamily.class, + StudioChartsPropertyGroups.FontSize.class, + StudioChartsPropertyGroups.FontStyle.class, + StudioChartsPropertyGroups.FontWeight.class, + StudioChartsPropertyGroups.IntegerHeight.class, + StudioChartsPropertyGroups.LineHeight.class, + StudioChartsPropertyGroups.Overflow.class, + StudioChartsPropertyGroups.TextBorderColor.class, + StudioChartsPropertyGroups.TextBorderDashOffset.class, + StudioChartsPropertyGroups.TextBorderType.class, + StudioChartsPropertyGroups.TextBorderWidth.class, + StudioChartsPropertyGroups.TextShadowBlur.class, + StudioChartsPropertyGroups.TextShadowColor.class, + StudioChartsPropertyGroups.TextShadowOffsetX.class, + StudioChartsPropertyGroups.TextShadowOffsetY.class, + StudioPropertyGroups.WidthWithIntegerType.class + }, properties = { @StudioProperty(xmlAttribute = "formatter", type = StudioPropertyType.STRING), @StudioProperty(xmlAttribute = "formatterFunction", type = StudioPropertyType.STRING), @@ -8964,6 +10255,10 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.RoundCap.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "roundCap", type = StudioPropertyType.BOOLEAN) @@ -8980,6 +10275,14 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioPropertyGroups.WidthWithIntegerType.class, + StudioChartsPropertyGroups.ShadowBlur.class, + StudioChartsPropertyGroups.ShadowColor.class, + StudioChartsPropertyGroups.ShadowOffsetX.class, + StudioChartsPropertyGroups.ShadowOffsetY.class, + StudioChartsPropertyGroups.Opacity.class + }, properties = { @StudioProperty(xmlAttribute = "width", category = StudioProperty.Category.SIZE, type = StudioPropertyType.INTEGER), @StudioProperty(xmlAttribute = "shadowBlur", type = StudioPropertyType.INTEGER), @@ -9062,6 +10365,12 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Show.class, + StudioPropertyGroups.WidthWithIntegerType.class, + StudioChartsPropertyGroups.RoundCap.class, + StudioChartsPropertyGroups.Clip.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "overlap", type = StudioPropertyType.BOOLEAN), @@ -9081,6 +10390,11 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.Length.class, + StudioChartsPropertyGroups.Distance.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "length", type = StudioPropertyType.INTEGER), @@ -9098,6 +10412,12 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.SplitNumber.class, + StudioChartsPropertyGroups.Length.class, + StudioChartsPropertyGroups.Distance.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "splitNumber", type = StudioPropertyType.INTEGER), @@ -9116,6 +10436,14 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.ShowAbove.class, + StudioChartsPropertyGroups.Icon.class, + StudioChartsPropertyGroups.OffsetCenter.class, + StudioPropertyGroups.WidthWithIntegerType.class, + StudioChartsPropertyGroups.KeepAspect.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "showAbove", type = StudioPropertyType.BOOLEAN), @@ -9137,6 +10465,13 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.ShowAbove.class, + StudioChartsPropertyGroups.Icon.class, + StudioChartsPropertyGroups.OffsetCenter.class, + StudioChartsPropertyGroups.KeepAspect.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "showAbove", type = StudioPropertyType.BOOLEAN), @@ -9157,6 +10492,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Disabled.class + }, properties = { @StudioProperty(xmlAttribute = "disabled", type = StudioPropertyType.BOOLEAN) } @@ -9172,6 +10510,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioPropertyGroups.Enabled.class + }, properties = { @StudioProperty(xmlAttribute = "enabled", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.BOOLEAN) } @@ -9187,6 +10528,10 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioPropertyGroups.Enabled.class, + StudioPropertyGroups.Description.class + }, properties = { @StudioProperty(xmlAttribute = "enabled", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "description", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.LOCALIZED_STRING) @@ -9219,6 +10564,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.MaxCount.class + }, properties = { @StudioProperty(xmlAttribute = "maxCount", type = StudioPropertyType.INTEGER) } @@ -9234,6 +10582,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.SeriesAriaLabelDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "prefix", type = StudioPropertyType.LOCALIZED_STRING), @StudioProperty(xmlAttribute = "withName", type = StudioPropertyType.LOCALIZED_STRING), @@ -9251,6 +10600,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.SeriesAriaLabelDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "prefix", type = StudioPropertyType.LOCALIZED_STRING), @StudioProperty(xmlAttribute = "withName", type = StudioPropertyType.LOCALIZED_STRING), @@ -9268,6 +10618,11 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.MaxCount.class, + StudioChartsPropertyGroups.WithName.class, + StudioChartsPropertyGroups.WithoutName.class + }, properties = { @StudioProperty(xmlAttribute = "maxCount", type = StudioPropertyType.INTEGER), @StudioProperty(xmlAttribute = "allData", type = StudioPropertyType.LOCALIZED_STRING), @@ -9287,6 +10642,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Show.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN) } @@ -9322,6 +10680,20 @@ public interface StudioChartsElements { unlimitedCount = false, isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioPropertyGroups.Id.class, + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.Orientation.class, + StudioChartsPropertyGroups.ItemGap.class, + StudioChartsPropertyGroups.IntegerZLevel.class, + StudioChartsPropertyGroups.IntegerZ.class, + StudioChartsPropertyGroups.Left.class, + StudioChartsPropertyGroups.StringTop.class, + StudioChartsPropertyGroups.StringRight.class, + StudioChartsPropertyGroups.Bottom.class, + StudioChartsPropertyGroups.Width.class, + StudioChartsPropertyGroups.StringHeight.class + }, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID), @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @@ -9367,6 +10739,7 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioChartsPropertyGroups.ItemStyleDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "textPosition", type = StudioPropertyType.ENUMERATION, classFqn = "io.jmix.chartsflowui.kit.component.model.toolbox.Emphasis.IconStyle.TextPosition", @@ -9580,6 +10953,11 @@ public interface StudioChartsElements { xmlns = "http://jmix.io/schema/charts/ui", xmlnsAlias = "charts", icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Show.class, + StudioPropertyGroups.Title.class, + StudioChartsPropertyGroups.Icon.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "title", type = StudioPropertyType.LOCALIZED_STRING), @@ -9595,6 +10973,9 @@ public interface StudioChartsElements { xmlns = "http://jmix.io/schema/charts/ui", xmlnsAlias = "charts", icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Show.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "types", type = StudioPropertyType.VALUES_LIST, @@ -9612,6 +10993,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", unlimitedCount = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Stack.class + }, properties = { @StudioProperty(xmlAttribute = "line", type = StudioPropertyType.STRING), @StudioProperty(xmlAttribute = "bar", type = StudioPropertyType.STRING), @@ -9645,6 +11029,12 @@ public interface StudioChartsElements { xmlns = "http://jmix.io/schema/charts/ui", xmlnsAlias = "charts", icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.FilterMode.class, + StudioChartsPropertyGroups.XAxisIndexes.class, + StudioChartsPropertyGroups.YAxisIndexes.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "filterMode", type = StudioPropertyType.ENUMERATION, @@ -9695,6 +11085,13 @@ public interface StudioChartsElements { xmlns = "http://jmix.io/schema/charts/ui", xmlnsAlias = "charts", icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioChartsPropertyGroups.Show.class, + StudioChartsPropertyGroups.Name.class, + StudioChartsPropertyGroups.BackgroundColor.class, + StudioPropertyGroups.Title.class, + StudioChartsPropertyGroups.Icon.class + }, properties = { @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "type", type = StudioPropertyType.ENUMERATION, @@ -9768,6 +11165,9 @@ public interface StudioChartsElements { xmlnsAlias = "charts", isInjectable = false, icon = "io/jmix/chartsflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioPropertyGroups.IdWithoutCategory.class + }, properties = { @StudioProperty(xmlAttribute = "id", type = StudioPropertyType.COMPONENT_ID) } diff --git a/jmix-charts/charts-flowui-kit/src/main/java/io/jmix/chartsflowui/kit/meta/StudioChartsPropertyGroups.java b/jmix-charts/charts-flowui-kit/src/main/java/io/jmix/chartsflowui/kit/meta/StudioChartsPropertyGroups.java new file mode 100644 index 0000000000..1a5e43edb6 --- /dev/null +++ b/jmix-charts/charts-flowui-kit/src/main/java/io/jmix/chartsflowui/kit/meta/StudioChartsPropertyGroups.java @@ -0,0 +1,2224 @@ +/* + * Copyright 2026 Haulmont. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.jmix.chartsflowui.kit.meta; + +import io.jmix.flowui.kit.meta.*; + +@StudioAPI +public final class StudioChartsPropertyGroups { + + private StudioChartsPropertyGroups() { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "align", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.shared.Align", + options = {"LEFT", "RIGHT", "CENTER"}) + } + ) + public interface SharedAlign { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "align", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.legend.AbstractLegend.Align", + options = {"AUTO", "LEFT", "RIGHT"}) + } + ) + public interface LegendAlign { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "align", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.visualMap.AbstractVisualMap.MapAlign", + options = {"AUTO", "LEFT", "TOP", "BOTTOM", "RIGHT"}) + } + ) + public interface MapAlign { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "alignTicks", type = StudioPropertyType.BOOLEAN) + } + ) + public interface AlignTicks { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "angleAxisIndexes", type = StudioPropertyType.VALUES_LIST) + } + ) + public interface AngleAxisIndexes { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "animation", type = StudioPropertyType.BOOLEAN) + } + ) + public interface Animation { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "animationDelayFunction", type = StudioPropertyType.STRING) + } + ) + public interface AnimationDelayFunction { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "animationDelay", type = StudioPropertyType.INTEGER) + } + ) + public interface AnimationDelay { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "animationDelayUpdateFunction", type = StudioPropertyType.STRING) + } + ) + public interface AnimationDelayUpdateFunction { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "animationDelayUpdate", type = StudioPropertyType.INTEGER) + } + ) + public interface AnimationDelayUpdate { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "animationDurationFunction", type = StudioPropertyType.STRING) + } + ) + public interface AnimationDurationFunction { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "animationDuration", type = StudioPropertyType.INTEGER) + } + ) + public interface AnimationDuration { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "animationDurationUpdateFunction", type = StudioPropertyType.STRING) + } + ) + public interface AnimationDurationUpdateFunction { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "animationDurationUpdate", type = StudioPropertyType.INTEGER) + } + ) + public interface AnimationDurationUpdate { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "animationEasing", type = StudioPropertyType.STRING) + } + ) + public interface AnimationEasing { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "animationEasingUpdate", type = StudioPropertyType.STRING) + } + ) + public interface AnimationEasingUpdate { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "animationThreshold", type = StudioPropertyType.INTEGER) + } + ) + public interface AnimationThreshold { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "backgroundColor", type = StudioPropertyType.OPTIONS, + options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", + "BLACK", "BLANCHEDALMOND", "BLUE", "BLUEVIOLET", "BROWN", "BURLYWOOD", "CADETBLUE", + "CHARTREUSE", "CHOCOLATE", "CORAL", "CORNFLOWERBLUE", "CORNSILK", "CRIMSON", "CYAN", + "DARKBLUE", "DARKCYAN", "DARKGOLDENROD", "DARKGRAY", "DARKGREY", "DARKGREEN", + "DARKKHAKI", "DARKMAGENTA", "DARKOLIVEGREEN", "DARKORANGE", "DARKORCHID", "DARKRED", + "DARKSALMON", "DARKSEAGREEN", "DARKSLATEBLUE", "DARKSLATEGRAY", "DARKSLATEGREY", + "DARKTURQUOISE", "DARKVIOLET", "DEEPPINK", "DEEPSKYBLUE", "DIMGRAY", "DIMGREY", + "DODGERBLUE", "FIREBRICK", "FLORALWHITE", "FORESTGREEN", "FUCHSIA", "GAINSBORO", + "GHOSTWHITE", "GOLD", "GOLDENROD", "GRAY", "GREY", "GREEN", "GREENYELLOW", + "HONEYDEW", "HOTPINK", "INDIANRED", "INDIGO", "IVORY", "KHAKI", "LAVENDER", + "LAVENDERBLUSH", "LAWNGREEN", "LEMONCHIFFON", "LIGHTBLUE", "LIGHTCORAL", + "LIGHTCYAN", "LIGHTGOLDENRODYELLOW", "LIGHTGRAY", "LIGHTGREY", "LIGHTGREEN", + "LIGHTPINK", "LIGHTSALMON", "LIGHTSEAGREEN", "LIGHTSKYBLUE", "LIGHTSLATEGRAY", + "LIGHTSLATEGREY", "LIGHTSTEELBLUE", "LIGHTYELLOW", "LIME", "LIMEGREEN", "LINEN", + "MAGENTA", "MAROON", "MEDIUMAQUAMARINE", "MEDIUMBLUE", "MEDIUMORCHID", + "MEDIUMPURPLE", "MEDIUMSEAGREEN", "MEDIUMSLATEBLUE", "MEDIUMSPRINGGREEN", + "MEDIUMTURQUOISE", "MEDIUMVIOLETRED", "MIDNIGHTBLUE", "MINTCREAM", "MISTYROSE", + "MOCCASIN", "NAVAJOWHITE", "NAVY", "OLDLACE", "OLIVE", "OLIVEDRAB", "ORANGE", + "ORANGERED", "ORCHID", "PALEGOLDENROD", "PALEGREEN", "PALETURQUOISE", + "PALEVIOLETRED", "PAPAYAWHIP", "PEACHPUFF", "PERU", "PINK", "PLUM", "POWDERBLUE", + "PURPLE", "RED", "ROSYBROWN", "ROYALBLUE", "SADDLEBROWN", "SALMON", "SANDYBROWN", + "SEAGREEN", "SEASHELL", "SIENNA", "SILVER", "SKYBLUE", "SLATEBLUE", "SLATEGRAY", + "SLATEGREY", "SNOW", "SPRINGGREEN", "STEELBLUE", "TAN", "TEAL", "THISTLE", "TOMATO", + "TURQUOISE", "VIOLET", "WHEAT", "WHITE", "WHITESMOKE", "YELLOW", "YELLOWGREEN"}) + } + ) + public interface BackgroundColor { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "barMaxWidth", type = StudioPropertyType.STRING) + } + ) + public interface BarMaxWidth { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "barMinWidth", type = StudioPropertyType.STRING) + } + ) + public interface BarMinWidth { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "barWidth", type = StudioPropertyType.STRING) + } + ) + public interface BarWidth { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "blurScope", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.series.BlurScopeType", + options = {"COORDINATE_SYSTEM", "SERIES", "GLOBAL"}) + } + ) + public interface BlurScope { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "borderColor", type = StudioPropertyType.OPTIONS, + options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", + "BLACK", "BLANCHEDALMOND", "BLUE", "BLUEVIOLET", "BROWN", "BURLYWOOD", "CADETBLUE", + "CHARTREUSE", "CHOCOLATE", "CORAL", "CORNFLOWERBLUE", "CORNSILK", "CRIMSON", "CYAN", + "DARKBLUE", "DARKCYAN", "DARKGOLDENROD", "DARKGRAY", "DARKGREY", "DARKGREEN", + "DARKKHAKI", "DARKMAGENTA", "DARKOLIVEGREEN", "DARKORANGE", "DARKORCHID", "DARKRED", + "DARKSALMON", "DARKSEAGREEN", "DARKSLATEBLUE", "DARKSLATEGRAY", "DARKSLATEGREY", + "DARKTURQUOISE", "DARKVIOLET", "DEEPPINK", "DEEPSKYBLUE", "DIMGRAY", "DIMGREY", + "DODGERBLUE", "FIREBRICK", "FLORALWHITE", "FORESTGREEN", "FUCHSIA", "GAINSBORO", + "GHOSTWHITE", "GOLD", "GOLDENROD", "GRAY", "GREY", "GREEN", "GREENYELLOW", + "HONEYDEW", "HOTPINK", "INDIANRED", "INDIGO", "IVORY", "KHAKI", "LAVENDER", + "LAVENDERBLUSH", "LAWNGREEN", "LEMONCHIFFON", "LIGHTBLUE", "LIGHTCORAL", + "LIGHTCYAN", "LIGHTGOLDENRODYELLOW", "LIGHTGRAY", "LIGHTGREY", "LIGHTGREEN", + "LIGHTPINK", "LIGHTSALMON", "LIGHTSEAGREEN", "LIGHTSKYBLUE", "LIGHTSLATEGRAY", + "LIGHTSLATEGREY", "LIGHTSTEELBLUE", "LIGHTYELLOW", "LIME", "LIMEGREEN", "LINEN", + "MAGENTA", "MAROON", "MEDIUMAQUAMARINE", "MEDIUMBLUE", "MEDIUMORCHID", + "MEDIUMPURPLE", "MEDIUMSEAGREEN", "MEDIUMSLATEBLUE", "MEDIUMSPRINGGREEN", + "MEDIUMTURQUOISE", "MEDIUMVIOLETRED", "MIDNIGHTBLUE", "MINTCREAM", "MISTYROSE", + "MOCCASIN", "NAVAJOWHITE", "NAVY", "OLDLACE", "OLIVE", "OLIVEDRAB", "ORANGE", + "ORANGERED", "ORCHID", "PALEGOLDENROD", "PALEGREEN", "PALETURQUOISE", + "PALEVIOLETRED", "PAPAYAWHIP", "PEACHPUFF", "PERU", "PINK", "PLUM", "POWDERBLUE", + "PURPLE", "RED", "ROSYBROWN", "ROYALBLUE", "SADDLEBROWN", "SALMON", "SANDYBROWN", + "SEAGREEN", "SEASHELL", "SIENNA", "SILVER", "SKYBLUE", "SLATEBLUE", "SLATEGRAY", + "SLATEGREY", "SNOW", "SPRINGGREEN", "STEELBLUE", "TAN", "TEAL", "THISTLE", "TOMATO", + "TURQUOISE", "VIOLET", "WHEAT", "WHITE", "WHITESMOKE", "YELLOW", "YELLOWGREEN"}) + } + ) + public interface BorderColor { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "borderDashOffset", type = StudioPropertyType.INTEGER) + } + ) + public interface BorderDashOffset { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "borderRadius", type = StudioPropertyType.INTEGER) + } + ) + public interface BorderRadius { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "borderType", type = StudioPropertyType.STRING) + } + ) + public interface BorderType { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "borderWidth", type = StudioPropertyType.DOUBLE) + } + ) + public interface DoubleBorderWidth { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "borderWidth", type = StudioPropertyType.INTEGER) + } + ) + public interface IntegerBorderWidth { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "bottom", type = StudioPropertyType.STRING) + } + ) + public interface Bottom { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "calendarIndex", type = StudioPropertyType.INTEGER) + } + ) + public interface CalendarIndex { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "cap", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.HasLineStyle.Cap", + options = {"BUTT", "ROUND", "SQUARE"}) + } + ) + public interface Cap { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "categoryBoundaryGap", type = StudioPropertyType.BOOLEAN) + } + ) + public interface CategoryBoundaryGap { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "center", type = StudioPropertyType.STRING) + } + ) + public interface Center { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "clip", type = StudioPropertyType.BOOLEAN) + } + ) + public interface Clip { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "clockwise", type = StudioPropertyType.BOOLEAN) + } + ) + public interface Clockwise { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "colorAlpha", type = StudioPropertyType.VALUES_LIST) + } + ) + public interface ColorAlpha { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "colorBy", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.series.ColorBy", + options = {"SERIES", "DATA"}) + } + ) + public interface ColorBy { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "colorHue", type = StudioPropertyType.VALUES_LIST) + } + ) + public interface ColorHue { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "colorLightness", type = StudioPropertyType.VALUES_LIST) + } + ) + public interface ColorLightness { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "colorSaturation", type = StudioPropertyType.VALUES_LIST) + } + ) + public interface ColorSaturation { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "color", type = StudioPropertyType.VALUES_LIST, + options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", + "BLACK", "BLANCHEDALMOND", "BLUE", "BLUEVIOLET", "BROWN", "BURLYWOOD", "CADETBLUE", + "CHARTREUSE", "CHOCOLATE", "CORAL", "CORNFLOWERBLUE", "CORNSILK", "CRIMSON", "CYAN", + "DARKBLUE", "DARKCYAN", "DARKGOLDENROD", "DARKGRAY", "DARKGREY", "DARKGREEN", + "DARKKHAKI", "DARKMAGENTA", "DARKOLIVEGREEN", "DARKORANGE", "DARKORCHID", "DARKRED", + "DARKSALMON", "DARKSEAGREEN", "DARKSLATEBLUE", "DARKSLATEGRAY", "DARKSLATEGREY", + "DARKTURQUOISE", "DARKVIOLET", "DEEPPINK", "DEEPSKYBLUE", "DIMGRAY", "DIMGREY", + "DODGERBLUE", "FIREBRICK", "FLORALWHITE", "FORESTGREEN", "FUCHSIA", "GAINSBORO", + "GHOSTWHITE", "GOLD", "GOLDENROD", "GRAY", "GREY", "GREEN", "GREENYELLOW", + "HONEYDEW", "HOTPINK", "INDIANRED", "INDIGO", "IVORY", "KHAKI", "LAVENDER", + "LAVENDERBLUSH", "LAWNGREEN", "LEMONCHIFFON", "LIGHTBLUE", "LIGHTCORAL", + "LIGHTCYAN", "LIGHTGOLDENRODYELLOW", "LIGHTGRAY", "LIGHTGREY", "LIGHTGREEN", + "LIGHTPINK", "LIGHTSALMON", "LIGHTSEAGREEN", "LIGHTSKYBLUE", "LIGHTSLATEGRAY", + "LIGHTSLATEGREY", "LIGHTSTEELBLUE", "LIGHTYELLOW", "LIME", "LIMEGREEN", "LINEN", + "MAGENTA", "MAROON", "MEDIUMAQUAMARINE", "MEDIUMBLUE", "MEDIUMORCHID", + "MEDIUMPURPLE", "MEDIUMSEAGREEN", "MEDIUMSLATEBLUE", "MEDIUMSPRINGGREEN", + "MEDIUMTURQUOISE", "MEDIUMVIOLETRED", "MIDNIGHTBLUE", "MINTCREAM", "MISTYROSE", + "MOCCASIN", "NAVAJOWHITE", "NAVY", "OLDLACE", "OLIVE", "OLIVEDRAB", "ORANGE", + "ORANGERED", "ORCHID", "PALEGOLDENROD", "PALEGREEN", "PALETURQUOISE", + "PALEVIOLETRED", "PAPAYAWHIP", "PEACHPUFF", "PERU", "PINK", "PLUM", "POWDERBLUE", + "PURPLE", "RED", "ROSYBROWN", "ROYALBLUE", "SADDLEBROWN", "SALMON", "SANDYBROWN", + "SEAGREEN", "SEASHELL", "SIENNA", "SILVER", "SKYBLUE", "SLATEBLUE", "SLATEGRAY", + "SLATEGREY", "SNOW", "SPRINGGREEN", "STEELBLUE", "TAN", "TEAL", "THISTLE", "TOMATO", + "TURQUOISE", "VIOLET", "WHEAT", "WHITE", "WHITESMOKE", "YELLOW", "YELLOWGREEN"}) + } + ) + public interface Color { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "coordinateSystem", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.series.CoordinateSystem", + options = {"CARTESIAN_2_D", "POLAR"}) + } + ) + public interface CoordinateSystem { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "cursor", type = StudioPropertyType.STRING) + } + ) + public interface Cursor { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "dashOffset", type = StudioPropertyType.INTEGER) + } + ) + public interface DashOffset { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "dataGroupId", type = StudioPropertyType.STRING) + } + ) + public interface DataGroupId { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "datasetIndex", type = StudioPropertyType.INTEGER) + } + ) + public interface DatasetIndex { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "dimension", type = StudioPropertyType.STRING) + } + ) + public interface Dimension { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "disabled", type = StudioPropertyType.BOOLEAN) + } + ) + public interface Disabled { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "distance", type = StudioPropertyType.INTEGER) + } + ) + public interface Distance { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "ellipsis", type = StudioPropertyType.STRING) + } + ) + public interface Ellipsis { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "end", type = StudioPropertyType.DOUBLE) + } + ) + public interface End { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "endValue", type = StudioPropertyType.STRING) + } + ) + public interface EndValue { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "extraCssText", type = StudioPropertyType.STRING) + } + ) + public interface ExtraCssText { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "filterMode", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.datazoom.AbstractDataZoom.FilterMode", + options = {"FILTER", "WEAK_FILTER", "EMPTY", "NONE"}) + } + ) + public interface FilterMode { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "focus", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.series.FocusType", + options = {"NONE", "SELF", "SERIES"}) + } + ) + public interface Focus { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "fontFamily", type = StudioPropertyType.STRING) + } + ) + public interface FontFamily { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "fontSize", type = StudioPropertyType.INTEGER) + } + ) + public interface FontSize { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "fontStyle", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.shared.FontStyle", + options = {"NORMAL", "ITALIC", "OBLIQUE"}) + } + ) + public interface FontStyle { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "fontWeight", type = StudioPropertyType.STRING) + } + ) + public interface FontWeight { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "formatterFunction", type = StudioPropertyType.STRING) + } + ) + public interface FormatterFunction { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "formatter", type = StudioPropertyType.STRING) + } + ) + public interface Formatter { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "geoIndex", type = StudioPropertyType.INTEGER) + } + ) + public interface GeoIndex { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "gridIndex", type = StudioPropertyType.INTEGER) + } + ) + public interface GridIndex { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "handleIcon", type = StudioPropertyType.STRING) + } + ) + public interface HandleIcon { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "handleSize", type = StudioPropertyType.STRING) + } + ) + public interface HandleSize { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "height", category = StudioProperty.Category.SIZE, type = StudioPropertyType.INTEGER) + } + ) + public interface IntegerHeight { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "height", category = StudioProperty.Category.SIZE, type = StudioPropertyType.STRING) + } + ) + public interface StringHeight { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "hideOverlap", type = StudioPropertyType.BOOLEAN) + } + ) + public interface HideOverlap { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "hoverAnimation", type = StudioPropertyType.BOOLEAN) + } + ) + public interface HoverAnimation { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "hoverLink", type = StudioPropertyType.BOOLEAN) + } + ) + public interface HoverLink { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "icon", type = StudioPropertyType.STRING) + } + ) + public interface Icon { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "inactiveBorderColor", type = StudioPropertyType.OPTIONS, + options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", + "BLACK", "BLANCHEDALMOND", "BLUE", "BLUEVIOLET", "BROWN", "BURLYWOOD", "CADETBLUE", + "CHARTREUSE", "CHOCOLATE", "CORAL", "CORNFLOWERBLUE", "CORNSILK", "CRIMSON", "CYAN", + "DARKBLUE", "DARKCYAN", "DARKGOLDENROD", "DARKGRAY", "DARKGREY", "DARKGREEN", + "DARKKHAKI", "DARKMAGENTA", "DARKOLIVEGREEN", "DARKORANGE", "DARKORCHID", "DARKRED", + "DARKSALMON", "DARKSEAGREEN", "DARKSLATEBLUE", "DARKSLATEGRAY", "DARKSLATEGREY", + "DARKTURQUOISE", "DARKVIOLET", "DEEPPINK", "DEEPSKYBLUE", "DIMGRAY", "DIMGREY", + "DODGERBLUE", "FIREBRICK", "FLORALWHITE", "FORESTGREEN", "FUCHSIA", "GAINSBORO", + "GHOSTWHITE", "GOLD", "GOLDENROD", "GRAY", "GREY", "GREEN", "GREENYELLOW", + "HONEYDEW", "HOTPINK", "INDIANRED", "INDIGO", "IVORY", "KHAKI", "LAVENDER", + "LAVENDERBLUSH", "LAWNGREEN", "LEMONCHIFFON", "LIGHTBLUE", "LIGHTCORAL", + "LIGHTCYAN", "LIGHTGOLDENRODYELLOW", "LIGHTGRAY", "LIGHTGREY", "LIGHTGREEN", + "LIGHTPINK", "LIGHTSALMON", "LIGHTSEAGREEN", "LIGHTSKYBLUE", "LIGHTSLATEGRAY", + "LIGHTSLATEGREY", "LIGHTSTEELBLUE", "LIGHTYELLOW", "LIME", "LIMEGREEN", "LINEN", + "MAGENTA", "MAROON", "MEDIUMAQUAMARINE", "MEDIUMBLUE", "MEDIUMORCHID", + "MEDIUMPURPLE", "MEDIUMSEAGREEN", "MEDIUMSLATEBLUE", "MEDIUMSPRINGGREEN", + "MEDIUMTURQUOISE", "MEDIUMVIOLETRED", "MIDNIGHTBLUE", "MINTCREAM", "MISTYROSE", + "MOCCASIN", "NAVAJOWHITE", "NAVY", "OLDLACE", "OLIVE", "OLIVEDRAB", "ORANGE", + "ORANGERED", "ORCHID", "PALEGOLDENROD", "PALEGREEN", "PALETURQUOISE", + "PALEVIOLETRED", "PAPAYAWHIP", "PEACHPUFF", "PERU", "PINK", "PLUM", "POWDERBLUE", + "PURPLE", "RED", "ROSYBROWN", "ROYALBLUE", "SADDLEBROWN", "SALMON", "SANDYBROWN", + "SEAGREEN", "SEASHELL", "SIENNA", "SILVER", "SKYBLUE", "SLATEBLUE", "SLATEGRAY", + "SLATEGREY", "SNOW", "SPRINGGREEN", "STEELBLUE", "TAN", "TEAL", "THISTLE", "TOMATO", + "TURQUOISE", "VIOLET", "WHEAT", "WHITE", "WHITESMOKE", "YELLOW", "YELLOWGREEN"}) + } + ) + public interface InactiveBorderColor { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "inactiveBorderWidth", type = StudioPropertyType.INTEGER) + } + ) + public interface InactiveBorderWidth { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "inactiveColor", type = StudioPropertyType.OPTIONS, + options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", + "BLACK", "BLANCHEDALMOND", "BLUE", "BLUEVIOLET", "BROWN", "BURLYWOOD", "CADETBLUE", + "CHARTREUSE", "CHOCOLATE", "CORAL", "CORNFLOWERBLUE", "CORNSILK", "CRIMSON", "CYAN", + "DARKBLUE", "DARKCYAN", "DARKGOLDENROD", "DARKGRAY", "DARKGREY", "DARKGREEN", + "DARKKHAKI", "DARKMAGENTA", "DARKOLIVEGREEN", "DARKORANGE", "DARKORCHID", "DARKRED", + "DARKSALMON", "DARKSEAGREEN", "DARKSLATEBLUE", "DARKSLATEGRAY", "DARKSLATEGREY", + "DARKTURQUOISE", "DARKVIOLET", "DEEPPINK", "DEEPSKYBLUE", "DIMGRAY", "DIMGREY", + "DODGERBLUE", "FIREBRICK", "FLORALWHITE", "FORESTGREEN", "FUCHSIA", "GAINSBORO", + "GHOSTWHITE", "GOLD", "GOLDENROD", "GRAY", "GREY", "GREEN", "GREENYELLOW", + "HONEYDEW", "HOTPINK", "INDIANRED", "INDIGO", "IVORY", "KHAKI", "LAVENDER", + "LAVENDERBLUSH", "LAWNGREEN", "LEMONCHIFFON", "LIGHTBLUE", "LIGHTCORAL", + "LIGHTCYAN", "LIGHTGOLDENRODYELLOW", "LIGHTGRAY", "LIGHTGREY", "LIGHTGREEN", + "LIGHTPINK", "LIGHTSALMON", "LIGHTSEAGREEN", "LIGHTSKYBLUE", "LIGHTSLATEGRAY", + "LIGHTSLATEGREY", "LIGHTSTEELBLUE", "LIGHTYELLOW", "LIME", "LIMEGREEN", "LINEN", + "MAGENTA", "MAROON", "MEDIUMAQUAMARINE", "MEDIUMBLUE", "MEDIUMORCHID", + "MEDIUMPURPLE", "MEDIUMSEAGREEN", "MEDIUMSLATEBLUE", "MEDIUMSPRINGGREEN", + "MEDIUMTURQUOISE", "MEDIUMVIOLETRED", "MIDNIGHTBLUE", "MINTCREAM", "MISTYROSE", + "MOCCASIN", "NAVAJOWHITE", "NAVY", "OLDLACE", "OLIVE", "OLIVEDRAB", "ORANGE", + "ORANGERED", "ORCHID", "PALEGOLDENROD", "PALEGREEN", "PALETURQUOISE", + "PALEVIOLETRED", "PAPAYAWHIP", "PEACHPUFF", "PERU", "PINK", "PLUM", "POWDERBLUE", + "PURPLE", "RED", "ROSYBROWN", "ROYALBLUE", "SADDLEBROWN", "SALMON", "SANDYBROWN", + "SEAGREEN", "SEASHELL", "SIENNA", "SILVER", "SKYBLUE", "SLATEBLUE", "SLATEGRAY", + "SLATEGREY", "SNOW", "SPRINGGREEN", "STEELBLUE", "TAN", "TEAL", "THISTLE", "TOMATO", + "TURQUOISE", "VIOLET", "WHEAT", "WHITE", "WHITESMOKE", "YELLOW", "YELLOWGREEN"}) + } + ) + public interface InactiveColor { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "inside", type = StudioPropertyType.BOOLEAN) + } + ) + public interface Inside { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "intervalFunction", type = StudioPropertyType.STRING) + } + ) + public interface IntervalFunction { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "interval", type = StudioPropertyType.INTEGER) + } + ) + public interface Interval { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "inverse", type = StudioPropertyType.BOOLEAN) + } + ) + public interface Inverse { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "itemGap", type = StudioPropertyType.INTEGER) + } + ) + public interface ItemGap { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "itemHeight", type = StudioPropertyType.DOUBLE) + } + ) + public interface DoubleItemHeight { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "itemHeight", type = StudioPropertyType.INTEGER) + } + ) + public interface IntegerItemHeight { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "itemWidth", type = StudioPropertyType.DOUBLE) + } + ) + public interface DoubleItemWidth { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "itemWidth", type = StudioPropertyType.INTEGER) + } + ) + public interface IntegerItemWidth { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "join", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.HasLineStyle.Join", + options = {"BEVEL", "ROUND", "MITER"}) + } + ) + public interface Join { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "keepAspect", type = StudioPropertyType.BOOLEAN) + } + ) + public interface KeepAspect { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "large", type = StudioPropertyType.BOOLEAN) + } + ) + public interface Large { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "largeThreshold", type = StudioPropertyType.INTEGER) + } + ) + public interface LargeThreshold { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "layout", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.shared.Orientation", + options = {"HORIZONTAL", "VERTICAL"}) + } + ) + public interface Layout { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "left", type = StudioPropertyType.STRING) + } + ) + public interface Left { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "legendHoverLink", type = StudioPropertyType.BOOLEAN) + } + ) + public interface LegendHoverLink { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "length", type = StudioPropertyType.INTEGER) + } + ) + public interface Length { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "lineHeight", type = StudioPropertyType.INTEGER) + } + ) + public interface LineHeight { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "logBase", type = StudioPropertyType.INTEGER) + } + ) + public interface LogBase { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "margin", type = StudioPropertyType.INTEGER) + } + ) + public interface Margin { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "maxCount", type = StudioPropertyType.INTEGER) + } + ) + public interface MaxCount { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "max", type = StudioPropertyType.DOUBLE) + } + ) + public interface DoubleMax { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "maxFunction", type = StudioPropertyType.STRING) + } + ) + public interface MaxFunction { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "maxInterval", type = StudioPropertyType.INTEGER) + } + ) + public interface MaxInterval { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "maxSpan", type = StudioPropertyType.DOUBLE) + } + ) + public interface MaxSpan { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "max", type = StudioPropertyType.STRING) + } + ) + public interface StringMax { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "maxValueSpan", type = StudioPropertyType.STRING) + } + ) + public interface MaxValueSpan { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "min", type = StudioPropertyType.DOUBLE) + } + ) + public interface DoubleMin { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "minFunction", type = StudioPropertyType.STRING) + } + ) + public interface MinFunction { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "minInterval", type = StudioPropertyType.INTEGER) + } + ) + public interface MinInterval { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "minSpan", type = StudioPropertyType.DOUBLE) + } + ) + public interface MinSpan { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "min", type = StudioPropertyType.STRING) + } + ) + public interface StringMin { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "minTurnAngle", type = StudioPropertyType.INTEGER) + } + ) + public interface MinTurnAngle { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "minValueSpan", type = StudioPropertyType.STRING) + } + ) + public interface MinValueSpan { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "miterLimit", type = StudioPropertyType.INTEGER) + } + ) + public interface MiterLimit { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "nameGap", type = StudioPropertyType.INTEGER) + } + ) + public interface NameGap { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "nameLocation", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.axis.AbstractCartesianAxis.NameLocation", + options = {"END", "CENTER", "START"}) + } + ) + public interface NameLocation { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "nameRotate", type = StudioPropertyType.INTEGER) + } + ) + public interface NameRotate { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "name", type = StudioPropertyType.STRING) + } + ) + public interface Name { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "nextPageIcon", type = StudioPropertyType.STRING, required = true) + } + ) + public interface NextPageIcon { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "nonCategoryBoundaryGap", type = StudioPropertyType.VALUES_LIST) + } + ) + public interface NonCategoryBoundaryGap { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "numberCoordinate", type = StudioPropertyType.STRING) + } + ) + public interface NumberCoordinate { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "offsetCenter", type = StudioPropertyType.VALUES_LIST) + } + ) + public interface OffsetCenter { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "offset", type = StudioPropertyType.INTEGER) + } + ) + public interface IntegerOffset { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "offset", type = StudioPropertyType.STRING) + } + ) + public interface StringOffset { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "opacity", type = StudioPropertyType.DOUBLE) + } + ) + public interface Opacity { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "opacity", type = StudioPropertyType.STRING) + } + ) + public interface StringOpacity { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "orientation", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.shared.Orientation", + options = {"HORIZONTAL", "VERTICAL"}) + } + ) + public interface Orientation { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "overflow", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.shared.Overflow", + options = {"NONE", "TRUNCATE", "BREAK", "BREAK_ALL"}) + } + ) + public interface Overflow { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "padding", type = StudioPropertyType.VALUES_LIST) + } + ) + public interface Padding { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "polarIndex", type = StudioPropertyType.INTEGER) + } + ) + public interface PolarIndex { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "positionCoordinates", type = StudioPropertyType.STRING) + } + ) + public interface PositionCoordinates { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "position", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.shared.AbstractTooltip.Position.ItemTriggerPosition", + options = {"INSIDE", "TOP", "LEFT", "RIGHT", "BOTTOM"}) + } + ) + public interface TooltipPosition { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "position", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.axis.AbstractCartesianAxis.Position", + options = {"TOP", "BOTTOM", "RIGHT", "LEFT"}) + } + ) + public interface AxisPosition { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "precision", type = StudioPropertyType.DOUBLE) + } + ) + public interface DoublePrecision { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "precision", type = StudioPropertyType.INTEGER) + } + ) + public interface IntegerPrecision { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "prefix", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface Prefix { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "prevPageIcon", type = StudioPropertyType.STRING, required = true) + } + ) + public interface PrevPageIcon { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "progressiveChunkMode", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.series.ProgressiveChunkMode", + options = {"SEQUENTIAL", "MOD"}) + } + ) + public interface ProgressiveChunkMode { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "progressive", type = StudioPropertyType.INTEGER) + } + ) + public interface Progressive { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "progressiveThreshold", type = StudioPropertyType.INTEGER) + } + ) + public interface ProgressiveThreshold { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "radiusAxisIndexes", type = StudioPropertyType.VALUES_LIST) + } + ) + public interface RadiusAxisIndexes { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "radius", type = StudioPropertyType.STRING) + } + ) + public interface Radius { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "rangeMode", type = StudioPropertyType.VALUES_LIST, + options = {"VALUE", "PERCENT"}) + } + ) + public interface RangeMode { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "realtime", type = StudioPropertyType.BOOLEAN) + } + ) + public interface Realtime { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "right", type = StudioPropertyType.INTEGER) + } + ) + public interface IntegerRight { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "right", type = StudioPropertyType.STRING) + } + ) + public interface StringRight { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "rotate", type = StudioPropertyType.INTEGER) + } + ) + public interface Rotate { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "roundCap", type = StudioPropertyType.BOOLEAN) + } + ) + public interface RoundCap { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "sampling", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.series.SamplingType", + options = {"LARGEST_TRIANGLE_THREE_BUCKET", "AVERAGE", "MAX", "MIN", "SUM"}) + } + ) + public interface Sampling { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "scale", type = StudioPropertyType.BOOLEAN) + } + ) + public interface BooleanScale { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "scale", type = StudioPropertyType.DOUBLE) + } + ) + public interface DoubleScale { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "selectedMode", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.shared.SelectedMode", + options = {"DISABLED", "SINGLE", "MULTIPLE"}) + } + ) + public interface SelectedMode { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "selector", type = StudioPropertyType.BOOLEAN) + } + ) + public interface Selector { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "selectorButtonGap", type = StudioPropertyType.INTEGER) + } + ) + public interface SelectorButtonGap { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "selectorItemGap", type = StudioPropertyType.INTEGER) + } + ) + public interface SelectorItemGap { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "selectorPosition", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.legend.AbstractLegend.Position", + options = {"START", "END"}) + } + ) + public interface SelectorPosition { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "seriesIndex", type = StudioPropertyType.VALUES_LIST) + } + ) + public interface SeriesIndex { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "seriesLayoutBy", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.series.AbstractAxisAwareSeries.SeriesLayoutType", + options = {"COLUMN", "ROW"}) + } + ) + public interface SeriesLayoutBy { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "shadowBlur", type = StudioPropertyType.INTEGER) + } + ) + public interface ShadowBlur { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "shadowColor", type = StudioPropertyType.OPTIONS, + options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", + "BLACK", "BLANCHEDALMOND", "BLUE", "BLUEVIOLET", "BROWN", "BURLYWOOD", "CADETBLUE", + "CHARTREUSE", "CHOCOLATE", "CORAL", "CORNFLOWERBLUE", "CORNSILK", "CRIMSON", "CYAN", + "DARKBLUE", "DARKCYAN", "DARKGOLDENROD", "DARKGRAY", "DARKGREY", "DARKGREEN", + "DARKKHAKI", "DARKMAGENTA", "DARKOLIVEGREEN", "DARKORANGE", "DARKORCHID", "DARKRED", + "DARKSALMON", "DARKSEAGREEN", "DARKSLATEBLUE", "DARKSLATEGRAY", "DARKSLATEGREY", + "DARKTURQUOISE", "DARKVIOLET", "DEEPPINK", "DEEPSKYBLUE", "DIMGRAY", "DIMGREY", + "DODGERBLUE", "FIREBRICK", "FLORALWHITE", "FORESTGREEN", "FUCHSIA", "GAINSBORO", + "GHOSTWHITE", "GOLD", "GOLDENROD", "GRAY", "GREY", "GREEN", "GREENYELLOW", + "HONEYDEW", "HOTPINK", "INDIANRED", "INDIGO", "IVORY", "KHAKI", "LAVENDER", + "LAVENDERBLUSH", "LAWNGREEN", "LEMONCHIFFON", "LIGHTBLUE", "LIGHTCORAL", + "LIGHTCYAN", "LIGHTGOLDENRODYELLOW", "LIGHTGRAY", "LIGHTGREY", "LIGHTGREEN", + "LIGHTPINK", "LIGHTSALMON", "LIGHTSEAGREEN", "LIGHTSKYBLUE", "LIGHTSLATEGRAY", + "LIGHTSLATEGREY", "LIGHTSTEELBLUE", "LIGHTYELLOW", "LIME", "LIMEGREEN", "LINEN", + "MAGENTA", "MAROON", "MEDIUMAQUAMARINE", "MEDIUMBLUE", "MEDIUMORCHID", + "MEDIUMPURPLE", "MEDIUMSEAGREEN", "MEDIUMSLATEBLUE", "MEDIUMSPRINGGREEN", + "MEDIUMTURQUOISE", "MEDIUMVIOLETRED", "MIDNIGHTBLUE", "MINTCREAM", "MISTYROSE", + "MOCCASIN", "NAVAJOWHITE", "NAVY", "OLDLACE", "OLIVE", "OLIVEDRAB", "ORANGE", + "ORANGERED", "ORCHID", "PALEGOLDENROD", "PALEGREEN", "PALETURQUOISE", + "PALEVIOLETRED", "PAPAYAWHIP", "PEACHPUFF", "PERU", "PINK", "PLUM", "POWDERBLUE", + "PURPLE", "RED", "ROSYBROWN", "ROYALBLUE", "SADDLEBROWN", "SALMON", "SANDYBROWN", + "SEAGREEN", "SEASHELL", "SIENNA", "SILVER", "SKYBLUE", "SLATEBLUE", "SLATEGRAY", + "SLATEGREY", "SNOW", "SPRINGGREEN", "STEELBLUE", "TAN", "TEAL", "THISTLE", "TOMATO", + "TURQUOISE", "VIOLET", "WHEAT", "WHITE", "WHITESMOKE", "YELLOW", "YELLOWGREEN"}) + } + ) + public interface ShadowColor { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "shadowOffsetX", type = StudioPropertyType.INTEGER) + } + ) + public interface ShadowOffsetX { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "shadowOffsetY", type = StudioPropertyType.INTEGER) + } + ) + public interface ShadowOffsetY { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "showAbove", type = StudioPropertyType.BOOLEAN) + } + ) + public interface ShowAbove { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "show", type = StudioPropertyType.BOOLEAN) + } + ) + public interface Show { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "silent", type = StudioPropertyType.BOOLEAN) + } + ) + public interface Silent { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "smooth", type = StudioPropertyType.BOOLEAN) + } + ) + public interface Smooth { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "snap", type = StudioPropertyType.BOOLEAN) + } + ) + public interface Snap { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "splitNumber", type = StudioPropertyType.INTEGER) + } + ) + public interface SplitNumber { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "stackStrategy", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.series.HasStack.StackStrategy", + options = {"SAME_SIGN", "ALL", "POSITIVE", "NEGATIVE"}) + } + ) + public interface StackStrategy { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "stack", type = StudioPropertyType.STRING) + } + ) + public interface Stack { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "startAngle", type = StudioPropertyType.INTEGER) + } + ) + public interface StartAngle { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "start", type = StudioPropertyType.DOUBLE) + } + ) + public interface Start { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "startValue", type = StudioPropertyType.STRING) + } + ) + public interface StartValue { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "status", type = StudioPropertyType.BOOLEAN) + } + ) + public interface Status { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "stringCoordinate", type = StudioPropertyType.STRING) + } + ) + public interface StringCoordinate { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "symbolKeepAspect", type = StudioPropertyType.BOOLEAN) + } + ) + public interface SymbolKeepAspect { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "symbolOffset", type = StudioPropertyType.STRING) + } + ) + public interface SymbolOffset { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "symbolRotate", type = StudioPropertyType.INTEGER) + } + ) + public interface SymbolRotate { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "symbolSizeFunction", type = StudioPropertyType.STRING) + } + ) + public interface SymbolSizeFunction { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "symbolSize", type = StudioPropertyType.INTEGER) + } + ) + public interface IntegerSymbolSize { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "symbolSize", type = StudioPropertyType.STRING) + } + ) + public interface StringSymbolSize { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "symbolType", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.shared.HasSymbols.SymbolType", + options = {"CIRCLE", "RECTANGLE", "ROUND_RECTANGLE", "PIN", "TRIANGLE", "DIAMOND", + "ARROW", "NONE"}) + } + ) + public interface SymbolType { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "symbol", type = StudioPropertyType.VALUES_LIST) + } + ) + public interface Symbol { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "symbolsSize", type = StudioPropertyType.VALUES_LIST) + } + ) + public interface SymbolsSize { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "textBorderColor", type = StudioPropertyType.OPTIONS, + options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", + "BLACK", "BLANCHEDALMOND", "BLUE", "BLUEVIOLET", "BROWN", "BURLYWOOD", "CADETBLUE", + "CHARTREUSE", "CHOCOLATE", "CORAL", "CORNFLOWERBLUE", "CORNSILK", "CRIMSON", "CYAN", + "DARKBLUE", "DARKCYAN", "DARKGOLDENROD", "DARKGRAY", "DARKGREY", "DARKGREEN", + "DARKKHAKI", "DARKMAGENTA", "DARKOLIVEGREEN", "DARKORANGE", "DARKORCHID", "DARKRED", + "DARKSALMON", "DARKSEAGREEN", "DARKSLATEBLUE", "DARKSLATEGRAY", "DARKSLATEGREY", + "DARKTURQUOISE", "DARKVIOLET", "DEEPPINK", "DEEPSKYBLUE", "DIMGRAY", "DIMGREY", + "DODGERBLUE", "FIREBRICK", "FLORALWHITE", "FORESTGREEN", "FUCHSIA", "GAINSBORO", + "GHOSTWHITE", "GOLD", "GOLDENROD", "GRAY", "GREY", "GREEN", "GREENYELLOW", + "HONEYDEW", "HOTPINK", "INDIANRED", "INDIGO", "IVORY", "KHAKI", "LAVENDER", + "LAVENDERBLUSH", "LAWNGREEN", "LEMONCHIFFON", "LIGHTBLUE", "LIGHTCORAL", + "LIGHTCYAN", "LIGHTGOLDENRODYELLOW", "LIGHTGRAY", "LIGHTGREY", "LIGHTGREEN", + "LIGHTPINK", "LIGHTSALMON", "LIGHTSEAGREEN", "LIGHTSKYBLUE", "LIGHTSLATEGRAY", + "LIGHTSLATEGREY", "LIGHTSTEELBLUE", "LIGHTYELLOW", "LIME", "LIMEGREEN", "LINEN", + "MAGENTA", "MAROON", "MEDIUMAQUAMARINE", "MEDIUMBLUE", "MEDIUMORCHID", + "MEDIUMPURPLE", "MEDIUMSEAGREEN", "MEDIUMSLATEBLUE", "MEDIUMSPRINGGREEN", + "MEDIUMTURQUOISE", "MEDIUMVIOLETRED", "MIDNIGHTBLUE", "MINTCREAM", "MISTYROSE", + "MOCCASIN", "NAVAJOWHITE", "NAVY", "OLDLACE", "OLIVE", "OLIVEDRAB", "ORANGE", + "ORANGERED", "ORCHID", "PALEGOLDENROD", "PALEGREEN", "PALETURQUOISE", + "PALEVIOLETRED", "PAPAYAWHIP", "PEACHPUFF", "PERU", "PINK", "PLUM", "POWDERBLUE", + "PURPLE", "RED", "ROSYBROWN", "ROYALBLUE", "SADDLEBROWN", "SALMON", "SANDYBROWN", + "SEAGREEN", "SEASHELL", "SIENNA", "SILVER", "SKYBLUE", "SLATEBLUE", "SLATEGRAY", + "SLATEGREY", "SNOW", "SPRINGGREEN", "STEELBLUE", "TAN", "TEAL", "THISTLE", "TOMATO", + "TURQUOISE", "VIOLET", "WHEAT", "WHITE", "WHITESMOKE", "YELLOW", "YELLOWGREEN"}) + } + ) + public interface TextBorderColor { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "textBorderDashOffset", type = StudioPropertyType.INTEGER) + } + ) + public interface TextBorderDashOffset { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "textBorderType", type = StudioPropertyType.STRING) + } + ) + public interface TextBorderType { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "textBorderWidth", type = StudioPropertyType.DOUBLE) + } + ) + public interface TextBorderWidth { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "textGap", type = StudioPropertyType.DOUBLE) + } + ) + public interface TextGap { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "textShadowBlur", type = StudioPropertyType.INTEGER) + } + ) + public interface TextShadowBlur { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "textShadowColor", type = StudioPropertyType.OPTIONS, + options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", + "BLACK", "BLANCHEDALMOND", "BLUE", "BLUEVIOLET", "BROWN", "BURLYWOOD", "CADETBLUE", + "CHARTREUSE", "CHOCOLATE", "CORAL", "CORNFLOWERBLUE", "CORNSILK", "CRIMSON", "CYAN", + "DARKBLUE", "DARKCYAN", "DARKGOLDENROD", "DARKGRAY", "DARKGREY", "DARKGREEN", + "DARKKHAKI", "DARKMAGENTA", "DARKOLIVEGREEN", "DARKORANGE", "DARKORCHID", "DARKRED", + "DARKSALMON", "DARKSEAGREEN", "DARKSLATEBLUE", "DARKSLATEGRAY", "DARKSLATEGREY", + "DARKTURQUOISE", "DARKVIOLET", "DEEPPINK", "DEEPSKYBLUE", "DIMGRAY", "DIMGREY", + "DODGERBLUE", "FIREBRICK", "FLORALWHITE", "FORESTGREEN", "FUCHSIA", "GAINSBORO", + "GHOSTWHITE", "GOLD", "GOLDENROD", "GRAY", "GREY", "GREEN", "GREENYELLOW", + "HONEYDEW", "HOTPINK", "INDIANRED", "INDIGO", "IVORY", "KHAKI", "LAVENDER", + "LAVENDERBLUSH", "LAWNGREEN", "LEMONCHIFFON", "LIGHTBLUE", "LIGHTCORAL", + "LIGHTCYAN", "LIGHTGOLDENRODYELLOW", "LIGHTGRAY", "LIGHTGREY", "LIGHTGREEN", + "LIGHTPINK", "LIGHTSALMON", "LIGHTSEAGREEN", "LIGHTSKYBLUE", "LIGHTSLATEGRAY", + "LIGHTSLATEGREY", "LIGHTSTEELBLUE", "LIGHTYELLOW", "LIME", "LIMEGREEN", "LINEN", + "MAGENTA", "MAROON", "MEDIUMAQUAMARINE", "MEDIUMBLUE", "MEDIUMORCHID", + "MEDIUMPURPLE", "MEDIUMSEAGREEN", "MEDIUMSLATEBLUE", "MEDIUMSPRINGGREEN", + "MEDIUMTURQUOISE", "MEDIUMVIOLETRED", "MIDNIGHTBLUE", "MINTCREAM", "MISTYROSE", + "MOCCASIN", "NAVAJOWHITE", "NAVY", "OLDLACE", "OLIVE", "OLIVEDRAB", "ORANGE", + "ORANGERED", "ORCHID", "PALEGOLDENROD", "PALEGREEN", "PALETURQUOISE", + "PALEVIOLETRED", "PAPAYAWHIP", "PEACHPUFF", "PERU", "PINK", "PLUM", "POWDERBLUE", + "PURPLE", "RED", "ROSYBROWN", "ROYALBLUE", "SADDLEBROWN", "SALMON", "SANDYBROWN", + "SEAGREEN", "SEASHELL", "SIENNA", "SILVER", "SKYBLUE", "SLATEBLUE", "SLATEGRAY", + "SLATEGREY", "SNOW", "SPRINGGREEN", "STEELBLUE", "TAN", "TEAL", "THISTLE", "TOMATO", + "TURQUOISE", "VIOLET", "WHEAT", "WHITE", "WHITESMOKE", "YELLOW", "YELLOWGREEN"}) + } + ) + public interface TextShadowColor { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "textShadowOffsetX", type = StudioPropertyType.INTEGER) + } + ) + public interface TextShadowOffsetX { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "textShadowOffsetY", type = StudioPropertyType.INTEGER) + } + ) + public interface TextShadowOffsetY { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "text", type = StudioPropertyType.VALUES_LIST) + } + ) + public interface Text { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "throttle", type = StudioPropertyType.INTEGER) + } + ) + public interface Throttle { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "top", type = StudioPropertyType.INTEGER) + } + ) + public interface IntegerTop { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "top", type = StudioPropertyType.STRING) + } + ) + public interface StringTop { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "triggerEmphasis", type = StudioPropertyType.BOOLEAN) + } + ) + public interface TriggerEmphasis { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "trigger", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.shared.AbstractTooltip.Trigger", + options = {"ITEM", "AXIS", "NONE"}) + } + ) + public interface Trigger { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "triggerEvent", type = StudioPropertyType.BOOLEAN) + } + ) + public interface TriggerEvent { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "triggerOn", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.shared.TriggerOnMode", + options = {"MOUSE_MOVE", "CLICK", "MOUSE_MOVE_CLICK", "NONE"}) + } + ) + public interface TriggerOn { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "triggerTooltip", type = StudioPropertyType.BOOLEAN) + } + ) + public interface TriggerTooltip { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "type", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.shared.AbstractAxisPointer.IndicatorType", + options = {"LINE", "SHADOW", "NONE"}) + } + ) + public interface AxisPointerType { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "type", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.axis.AxisType", + options = {"CATEGORY", "VALUE", "TIME", "LOG"}) + } + ) + public interface AxisType { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "type", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.series.mark.LineDataType", + options = {"MIN", "MAX", "AVERAGE", "MEDIAN"}) + } + ) + public interface LineDataType { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "type", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.series.mark.PointDataType", + options = {"MIN", "MAX", "AVERAGE"}) + } + ) + public interface PintDataType { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "type", type = StudioPropertyType.STRING) + } + ) + public interface Type { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "unselectedSeries", type = StudioPropertyType.VALUES_LIST) + } + ) + public interface UnselectedSeries { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "valueAnimation", type = StudioPropertyType.BOOLEAN) + } + ) + public interface ValueAnimation { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "valueDim", type = StudioPropertyType.INTEGER) + } + ) + public interface ValueDim { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "value", type = StudioPropertyType.DOUBLE) + } + ) + public interface DoubleValue { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "valueFormatterFunction", type = StudioPropertyType.STRING) + } + ) + public interface ValueFormatterFunction { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "valueFormatter", type = StudioPropertyType.STRING) + } + ) + public interface ValueFormatter { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "valueIndex", type = StudioPropertyType.INTEGER) + } + ) + public interface ValueIndex { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "value", type = StudioPropertyType.INTEGER) + } + ) + public interface IntegerValue { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "verticalAlign", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.chartsflowui.kit.component.model.shared.VerticalAlign", + options = {"TOP", "BOTTOM", "MIDDLE"}) + } + ) + public interface VerticalAlign { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "width", category = StudioProperty.Category.SIZE, type = StudioPropertyType.STRING) + } + ) + public interface Width { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "withName", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface WithName { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "withoutName", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface WithoutName { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "xAxisIndex", type = StudioPropertyType.INTEGER) + } + ) + public interface XAxisIndex { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "xAxisIndexes", type = StudioPropertyType.VALUES_LIST) + } + ) + public interface XAxisIndexes { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "xAxis", type = StudioPropertyType.STRING) + } + ) + public interface XAxis { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "x", type = StudioPropertyType.STRING) + } + ) + public interface X { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "yAxisIndex", type = StudioPropertyType.INTEGER) + } + ) + public interface YAxisIndex { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "yAxisIndexes", type = StudioPropertyType.VALUES_LIST) + } + ) + public interface YAxisIndexes { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "yAxis", type = StudioPropertyType.STRING) + } + ) + public interface YAxis { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "y", type = StudioPropertyType.STRING) + } + ) + public interface Y { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "z", type = StudioPropertyType.DOUBLE) + } + ) + public interface DoubleZ { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "z", type = StudioPropertyType.INTEGER) + } + ) + public interface IntegerZ { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "zLevel", type = StudioPropertyType.DOUBLE) + } + ) + public interface DoubleZLevel { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "zLevel", type = StudioPropertyType.INTEGER) + } + ) + public interface IntegerZLevel { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "zoomLock", type = StudioPropertyType.BOOLEAN) + } + ) + public interface ZoomLock { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "color", type = StudioPropertyType.OPTIONS, + options = {"ALICEBLUE", "ANTIQUEWHITE", "AQUA", "AQUAMARINE", "AZURE", "BEIGE", "BISQUE", + "BLACK", "BLANCHEDALMOND", "BLUE", "BLUEVIOLET", "BROWN", "BURLYWOOD", "CADETBLUE", + "CHARTREUSE", "CHOCOLATE", "CORAL", "CORNFLOWERBLUE", "CORNSILK", "CRIMSON", "CYAN", + "DARKBLUE", "DARKCYAN", "DARKGOLDENROD", "DARKGRAY", "DARKGREY", "DARKGREEN", + "DARKKHAKI", "DARKMAGENTA", "DARKOLIVEGREEN", "DARKORANGE", "DARKORCHID", "DARKRED", + "DARKSALMON", "DARKSEAGREEN", "DARKSLATEBLUE", "DARKSLATEGRAY", "DARKSLATEGREY", + "DARKTURQUOISE", "DARKVIOLET", "DEEPPINK", "DEEPSKYBLUE", "DIMGRAY", "DIMGREY", + "DODGERBLUE", "FIREBRICK", "FLORALWHITE", "FORESTGREEN", "FUCHSIA", "GAINSBORO", + "GHOSTWHITE", "GOLD", "GOLDENROD", "GRAY", "GREY", "GREEN", "GREENYELLOW", + "HONEYDEW", "HOTPINK", "INDIANRED", "INDIGO", "IVORY", "KHAKI", "LAVENDER", + "LAVENDERBLUSH", "LAWNGREEN", "LEMONCHIFFON", "LIGHTBLUE", "LIGHTCORAL", + "LIGHTCYAN", "LIGHTGOLDENRODYELLOW", "LIGHTGRAY", "LIGHTGREY", "LIGHTGREEN", + "LIGHTPINK", "LIGHTSALMON", "LIGHTSEAGREEN", "LIGHTSKYBLUE", "LIGHTSLATEGRAY", + "LIGHTSLATEGREY", "LIGHTSTEELBLUE", "LIGHTYELLOW", "LIME", "LIMEGREEN", "LINEN", + "MAGENTA", "MAROON", "MEDIUMAQUAMARINE", "MEDIUMBLUE", "MEDIUMORCHID", + "MEDIUMPURPLE", "MEDIUMSEAGREEN", "MEDIUMSLATEBLUE", "MEDIUMSPRINGGREEN", + "MEDIUMTURQUOISE", "MEDIUMVIOLETRED", "MIDNIGHTBLUE", "MINTCREAM", "MISTYROSE", + "MOCCASIN", "NAVAJOWHITE", "NAVY", "OLDLACE", "OLIVE", "OLIVEDRAB", "ORANGE", + "ORANGERED", "ORCHID", "PALEGOLDENROD", "PALEGREEN", "PALETURQUOISE", + "PALEVIOLETRED", "PAPAYAWHIP", "PEACHPUFF", "PERU", "PINK", "PLUM", "POWDERBLUE", + "PURPLE", "RED", "ROSYBROWN", "ROYALBLUE", "SADDLEBROWN", "SALMON", "SANDYBROWN", + "SEAGREEN", "SEASHELL", "SIENNA", "SILVER", "SKYBLUE", "SLATEBLUE", "SLATEGRAY", + "SLATEGREY", "SNOW", "SPRINGGREEN", "STEELBLUE", "TAN", "TEAL", "THISTLE", "TOMATO", + "TURQUOISE", "VIOLET", "WHEAT", "WHITE", "WHITESMOKE", "YELLOW", "YELLOWGREEN"}) + } + ) + public interface ChartColor { + } + + @StudioPropertyGroup + public interface AnimationDefaultProperties extends Animation, AnimationThreshold, AnimationDuration, + AnimationEasing, AnimationDelay, AnimationDurationUpdate, AnimationEasingUpdate, + AnimationDelayUpdate { + } + + @StudioPropertyGroup + public interface AnimationFunctionDefaultProperties extends AnimationDelayFunction, + AnimationDurationFunction, AnimationDelayUpdateFunction, AnimationDurationUpdateFunction { + } + + @StudioPropertyGroup + public interface VisualEffectDefaultProperties extends Symbol, StringSymbolSize, Color, ColorAlpha, StringOpacity, + ColorLightness, ColorSaturation, ColorHue { + } + + @StudioPropertyGroup + public interface PageIconsDefaultProperties extends PrevPageIcon, NextPageIcon { + } + + @StudioPropertyGroup + public interface ItemStyleDefaultProperties extends ChartColor, BorderColor, IntegerBorderWidth, BorderType, + BorderDashOffset, Cap, Join, MiterLimit, ShadowBlur, ShadowColor, ShadowOffsetX, ShadowOffsetY, + Opacity { + } + + @StudioPropertyGroup + public interface LabelLineDefaultProperties extends Show, ShowAbove, Length, Smooth, MinTurnAngle { + } + + @StudioPropertyGroup + public interface ScaleEmphasisDefaultProperties extends Disabled, BooleanScale, Focus, BlurScope { + } + + @StudioPropertyGroup + public interface EmphasisDefaultProperties extends Disabled, Focus, BlurScope { + } + + @StudioPropertyGroup + public interface TextStyleDefaultProperties extends ChartColor, FontStyle, FontWeight, FontFamily, FontSize, + LineHeight, StudioPropertyGroups.WidthWithIntegerType, IntegerHeight, TextBorderColor, + TextBorderWidth, TextBorderType, TextBorderDashOffset, TextShadowColor, TextShadowBlur, + TextShadowOffsetX, TextShadowOffsetY, Overflow, Ellipsis { + } + + @StudioPropertyGroup + public interface LineStyleDefaultProperties extends AreaStyleDefaultProperties, + StudioPropertyGroups.WidthWithIntegerType, Type, DashOffset, Cap, Join, MiterLimit { + } + + @StudioPropertyGroup + public interface AreaStyleDefaultProperties extends ChartColor, ShadowColor, ShadowBlur, ShadowOffsetX, + ShadowOffsetY, Opacity { + } + + @StudioPropertyGroup + public interface LinePointDefaultProperties extends Name, LineDataType, ValueIndex, ValueDim, + StringCoordinate, NumberCoordinate, X, Y, XAxis, YAxis, DoubleValue, StudioPropertyGroups.Symbol, + IntegerSymbolSize, SymbolSizeFunction, SymbolRotate, SymbolKeepAspect, SymbolOffset, SymbolType { + } + + @StudioPropertyGroup + public interface PointDefaultProperties extends Name, PintDataType, ValueIndex, ValueDim, StringCoordinate, + NumberCoordinate, X, Y, DoubleValue { + } + + @StudioPropertyGroup + public interface LabelDefaultProperties extends Formatter, FormatterFunction, Show, Distance, Rotate, + StringOffset, SharedAlign, VerticalAlign, BackgroundColor, BorderColor, IntegerBorderWidth, + BorderType, BorderDashOffset, BorderRadius, Padding, ShadowColor, ShadowBlur, ShadowOffsetX, + ShadowOffsetY, TooltipPosition, PositionCoordinates, TextStyleDefaultProperties { + } + + @StudioPropertyGroup + public interface RoundedItemStyleDefaultProperties extends AreaStyleDefaultProperties, BorderColor, + IntegerBorderWidth, BorderType, BorderRadius { + } + + @StudioPropertyGroup + public interface SeriesAriaLabelDefaultProperties extends Prefix, WithName, WithoutName { + } + + @StudioPropertyGroup + public interface SplitDefaultProperties extends Show, Interval, IntervalFunction { + } + + @StudioPropertyGroup + public interface CartesianAxisDefaultProperties extends StudioPropertyGroups.Id, Show, GridIndex, AlignTicks, + AxisPosition, IntegerOffset, Name, NameLocation, NameGap, NameRotate, Inverse, AxisType, + CategoryBoundaryGap, NonCategoryBoundaryGap, StringMin, StringMax, BooleanScale, SplitNumber, + MinInterval, MaxInterval, Interval, LogBase, Silent, TriggerEvent, AnimationDefaultProperties, + AnimationFunctionDefaultProperties, MinFunction, MaxFunction, IntegerZLevel, IntegerZ { + } +} diff --git a/jmix-dynattr/dynattr-flowui-kit/src/main/java/io/jmix/dynattrflowui/kit/meta/component/DynAttrStudioComponents.java b/jmix-dynattr/dynattr-flowui-kit/src/main/java/io/jmix/dynattrflowui/kit/meta/component/DynAttrStudioComponents.java index 5355d46a87..c2678fc2f7 100644 --- a/jmix-dynattr/dynattr-flowui-kit/src/main/java/io/jmix/dynattrflowui/kit/meta/component/DynAttrStudioComponents.java +++ b/jmix-dynattr/dynattr-flowui-kit/src/main/java/io/jmix/dynattrflowui/kit/meta/component/DynAttrStudioComponents.java @@ -19,6 +19,7 @@ import io.jmix.flowui.kit.meta.StudioProperty; import io.jmix.flowui.kit.meta.StudioPropertyType; import io.jmix.flowui.kit.meta.StudioUiKit; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; @StudioUiKit public interface DynAttrStudioComponents { @@ -31,11 +32,15 @@ public interface DynAttrStudioComponents { xmlns = "http://jmix.io/schema/dynattr/flowui", xmlnsAlias = "dynattr", icon = "io/jmix/dynattrflowui/icon/component/dynamicAttributesPanel.svg", + propertyGroups = { + StudioPropertyGroups.Id.class + }, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID), @StudioProperty(xmlAttribute = "dataContainer", category = StudioProperty.Category.DATA_BINDING, type = StudioPropertyType.DATA_CONTAINER_REF, required = true), @StudioProperty(xmlAttribute = "fieldWidth", type = StudioPropertyType.STRING), @StudioProperty(xmlAttribute = "categoryFieldVisible", type = StudioPropertyType.BOOLEAN), - }) + } + ) void dynamicAttributesPanel(); } diff --git a/jmix-dynattr/dynattr-flowui-kit/src/main/java/io/jmix/dynattrflowui/kit/meta/facet/DynAttrStudioFacets.java b/jmix-dynattr/dynattr-flowui-kit/src/main/java/io/jmix/dynattrflowui/kit/meta/facet/DynAttrStudioFacets.java index c1afb7580d..bdebad41eb 100644 --- a/jmix-dynattr/dynattr-flowui-kit/src/main/java/io/jmix/dynattrflowui/kit/meta/facet/DynAttrStudioFacets.java +++ b/jmix-dynattr/dynattr-flowui-kit/src/main/java/io/jmix/dynattrflowui/kit/meta/facet/DynAttrStudioFacets.java @@ -19,6 +19,7 @@ import io.jmix.flowui.kit.meta.StudioProperty; import io.jmix.flowui.kit.meta.StudioPropertyType; import io.jmix.flowui.kit.meta.StudioUiKit; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; @StudioUiKit public interface DynAttrStudioFacets { @@ -30,6 +31,9 @@ public interface DynAttrStudioFacets { xmlns = "http://jmix.io/schema/dynattr/flowui", xmlnsAlias = "dynattr", icon = "io/jmix/dynattrflowui/icon/facet/dynamicAttributes.svg", + propertyGroups = { + StudioPropertyGroups.IdWithoutCategory.class + }, properties = { @StudioProperty(xmlAttribute = "id", type = StudioPropertyType.COMPONENT_ID), } diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioAction.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioAction.java index 3a48b4fdf6..fa3da5d85f 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioAction.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioAction.java @@ -71,6 +71,11 @@ String[] unsupportedTarget() default { */ StudioProperty[] properties() default {}; + /** + * @see StudioComponent#propertyGroups() + */ + Class[] propertyGroups() default {}; + /** * Properties that should be wrapped into property tag * and added to the properties tag. diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioActionsGroup.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioActionsGroup.java index ab8fa3cb7c..006a3554ca 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioActionsGroup.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioActionsGroup.java @@ -92,6 +92,11 @@ */ StudioProperty[] properties() default {}; + /** + * @see StudioComponent#propertyGroups() + */ + Class[] propertyGroups() default {}; + /** * @see StudioComponent#xmlElementInitializer */ diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioComponent.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioComponent.java index 6b3d61db8a..f1840efd9a 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioComponent.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioComponent.java @@ -108,6 +108,15 @@ String availablePlaceRegExp() default "(^(mainView/appLayout)?((/drawerLayout)|( */ StudioProperty[] properties() default {}; + /** + * Reusable groups of XML attributes. + *

+ * Studio will merge group properties with {@link #properties()}. + * @see StudioPropertyGroup + * @see StudioPropertyGroups + */ + Class[] propertyGroups() default {}; + /** * Descriptions of the XML attributes relationship. * For example property and dataContainer diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioDataComponent.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioDataComponent.java index 2d92d84ec0..a1c6583b1e 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioDataComponent.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioDataComponent.java @@ -68,6 +68,11 @@ */ StudioProperty[] properties() default {}; + /** + * @see StudioComponent#propertyGroups() + */ + Class[] propertyGroups() default {}; + /** * @see StudioComponent#xmlElementInitializer */ diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioElement.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioElement.java index ff6a76339d..8b611f6c1d 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioElement.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioElement.java @@ -106,6 +106,11 @@ */ StudioProperty[] properties() default {}; + /** + * @see StudioComponent#propertyGroups() + */ + Class[] propertyGroups() default {}; + /** * @see StudioComponent#propertiesBindings */ diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioElementsGroup.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioElementsGroup.java index 159958d060..db11bb4258 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioElementsGroup.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioElementsGroup.java @@ -132,6 +132,11 @@ */ StudioProperty[] properties() default {}; + /** + * @see StudioComponent#propertyGroups() + */ + Class[] propertyGroups() default {}; + /** * @see StudioComponent#xmlElementInitializer */ diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioFacet.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioFacet.java index b5dc5f89d1..a0f237977c 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioFacet.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioFacet.java @@ -73,6 +73,11 @@ */ StudioProperty[] properties() default {}; + /** + * @see StudioComponent#propertyGroups() + */ + Class[] propertyGroups() default {}; + /** * @see StudioComponent#xmlElementInitializer */ diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioPropertyGroup.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioPropertyGroup.java new file mode 100644 index 0000000000..395ee76754 --- /dev/null +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioPropertyGroup.java @@ -0,0 +1,41 @@ +/* + * Copyright 2026 Haulmont. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.jmix.flowui.kit.meta; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +/** + * Declares a reusable group of {@link StudioProperty} definitions. + *

+ * A group should be declared on a class or interface and referenced from + * {@code propertyGroups()} in {@link StudioComponent}, {@link StudioElement}, + * {@link StudioFacet}, {@link StudioDataComponent}, {@link StudioAction}, + * {@link StudioActionsGroup} or {@link StudioElementsGroup}. + * + * @see StudioPropertyGroups + */ +@Documented +@Target(ElementType.TYPE) +public @interface StudioPropertyGroup { + + /** + * Properties included in the group. + */ + StudioProperty[] properties() default {}; +} \ No newline at end of file diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioPropertyGroups.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioPropertyGroups.java new file mode 100644 index 0000000000..056f2bc9d8 --- /dev/null +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/StudioPropertyGroups.java @@ -0,0 +1,2069 @@ +/* + * Copyright 2026 Haulmont. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.jmix.flowui.kit.meta; + +/** + * Standard reusable {@link StudioPropertyGroup} definitions. + */ +@StudioAPI +public final class StudioPropertyGroups { + + private StudioPropertyGroups() { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID)) + public interface Id { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "id", type = StudioPropertyType.COMPONENT_ID)) + public interface IdWithoutCategory { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID, required = true)) + public interface RequiredId { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "visible", type = StudioPropertyType.BOOLEAN, category = StudioProperty.Category.GENERAL, defaultValue = "true")) + public interface Visible { + } + + @StudioPropertyGroup + public interface IdAndVisible extends Id, Visible { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "alignSelf", type = StudioPropertyType.ENUMERATION, category = StudioProperty.Category.POSITION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", defaultValue = "AUTO", options = {"START", "END", "CENTER", "STRETCH", "BASELINE", "AUTO"})) + public interface AlignSelf { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "justifySelf", type = StudioPropertyType.ENUMERATION, category = StudioProperty.Category.POSITION, classFqn = "io.jmix.flowui.kit.component.Alignment", defaultValue = "AUTO", options = {"START", "END", "CENTER", "STRETCH", "BASELINE", "AUTO"})) + public interface JustifySelf { + } + + @StudioPropertyGroup + public interface AlignSelfAndJustifySelf extends AlignSelf, JustifySelf { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "colspan", type = StudioPropertyType.INTEGER, category = StudioProperty.Category.POSITION)) + public interface Colspan { + } + + @StudioPropertyGroup + public interface AlignSelfAndJustifySelfAndColspan extends AlignSelfAndJustifySelf, Colspan { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "classNames", type = StudioPropertyType.VALUES_LIST, category = StudioProperty.Category.LOOK_AND_FEEL)) + public interface ClassNames { + } + + @StudioPropertyGroup + public interface Css { + } + + @StudioPropertyGroup + public interface ClassNamesAndCss extends ClassNames, Css { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "enabled", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.BOOLEAN)) + public interface Enabled { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "enabled", type = StudioPropertyType.BOOLEAN, + category = StudioProperty.Category.GENERAL, defaultValue = "true")) + public interface EnabledWithTrueDefaultValue { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "height", type = StudioPropertyType.SIZE, + category = StudioProperty.Category.SIZE)) + public interface HeightWithoutOptions { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "maxHeight", type = StudioPropertyType.SIZE, + category = StudioProperty.Category.SIZE)) + public interface MaxHeightWithoutOptions { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "minHeight", type = StudioPropertyType.SIZE, + category = StudioProperty.Category.SIZE)) + public interface MinHeightWithoutOptions { + + } + + @StudioPropertyGroup + public interface MinAndMaxHeightWithoutOptions extends MinHeightWithoutOptions, MaxHeightWithoutOptions { + } + + @StudioPropertyGroup + public interface HeightWithoutOptionsGroup extends HeightWithoutOptions, MinAndMaxHeightWithoutOptions { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "width", type = StudioPropertyType.SIZE, category = StudioProperty.Category.SIZE)) + public interface WidthWithoutOptions { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "maxWidth", type = StudioPropertyType.SIZE, category = StudioProperty.Category.SIZE)) + public interface MaxWidthWithoutOptions { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "minWidth", type = StudioPropertyType.SIZE, category = StudioProperty.Category.SIZE)) + public interface MinWidthWithoutOptions { + } + + @StudioPropertyGroup + public interface MinAndMaxWidthWithoutOptions extends MinWidthWithoutOptions, MaxWidthWithoutOptions { + } + + @StudioPropertyGroup + public interface WidthWithoutOptionsGroup extends WidthWithoutOptions, MinAndMaxWidthWithoutOptions { + + } + + @StudioPropertyGroup + public interface SizeWithoutOptions extends WidthWithoutOptionsGroup, HeightWithoutOptionsGroup { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "height", type = StudioPropertyType.SIZE, + category = StudioProperty.Category.SIZE, options = {"AUTO", "100%"})) + public interface Height { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "maxHeight", type = StudioPropertyType.SIZE, + category = StudioProperty.Category.SIZE, options = {"AUTO", "100%"})) + public interface MaxHeight { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "minHeight", type = StudioPropertyType.SIZE, + category = StudioProperty.Category.SIZE, options = {"AUTO", "100%"})) + public interface MinHeight { + } + + @StudioPropertyGroup + public interface MinAndMaxHeight extends MinHeight, MaxHeight { + } + + @StudioPropertyGroup + public interface HeightGroup extends Height, MinAndMaxHeight { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "width", type = StudioPropertyType.SIZE, + category = StudioProperty.Category.SIZE, options = {"AUTO", "100%"})) + public interface Width { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "maxWidth", type = StudioPropertyType.SIZE, + category = StudioProperty.Category.SIZE, options = {"AUTO", "100%"})) + public interface MaxWidth { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "minWidth", type = StudioPropertyType.SIZE, + category = StudioProperty.Category.SIZE, options = {"AUTO", "100%"})) + public interface MinWidth { + } + + @StudioPropertyGroup + public interface MinAndMaxWidth extends MinWidth, MaxWidth { + } + + @StudioPropertyGroup + public interface WidthGroup extends Width, MinAndMaxWidth { + } + + @StudioPropertyGroup + public interface Size extends WidthGroup, HeightGroup { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "ariaLabel", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface AriaLabel { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "ariaLabelledBy", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface AriaLabelledBy { + } + + @StudioPropertyGroup + public interface AriaLabelAndLabelledBy extends AriaLabel, AriaLabelledBy { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "tabIndex", type = StudioPropertyType.INTEGER) + } + ) + public interface TabIndex { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "focusShortcut", type = StudioPropertyType.SHORTCUT_COMBINATION) + } + ) + public interface FocusShortcut { + } + + @StudioPropertyGroup + public interface AriaLabelAndTabIndexAndFocusShortcut extends AriaLabel, AriaLabelledBy, TabIndex, FocusShortcut { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "required", type = StudioPropertyType.BOOLEAN, + category = StudioProperty.Category.VALIDATION, defaultValue = "false") + } + ) + public interface Required { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "requiredMessage", type = StudioPropertyType.LOCALIZED_STRING, + category = StudioProperty.Category.VALIDATION) + } + ) + public interface RequiredMessage { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "errorMessage", type = StudioPropertyType.LOCALIZED_STRING, + category = StudioProperty.Category.VALIDATION) + } + ) + public interface ErrorMessage { + } + + @StudioPropertyGroup + public interface RequiredAndRequiredMessageAndErrorMessage extends Required, RequiredMessage, ErrorMessage { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "acceptedFileTypes", category = StudioProperty.Category.VALIDATION, type = StudioPropertyType.VALUES_LIST) + } + ) + public interface AcceptedFileTypes { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "action", type = StudioPropertyType.ACTION_REF, + classFqn = "io.jmix.flowui.kit.action.Action") + } + ) + public interface Action { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, + setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", + defaultValue = "DEFAULT", options = {"DEFAULT", "PRIMARY", "DANGER", "SUCCESS"}) + } + ) + public interface ActionVariantWithDefaultDefaultValue { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, + setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", + defaultValue = "DANGER", options = {"DEFAULT", "PRIMARY", "DANGER", "SUCCESS"}) + } + ) + public interface ActionVariantWithDangerDefaultValue { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, + setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", + defaultValue = "PRIMARY", options = {"DEFAULT", "PRIMARY", "DANGER", "SUCCESS"}) + } + ) + public interface ActionVariantWithPrimaryDefaultValue { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "aggregatable", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.BOOLEAN, + defaultValue = "false") + } + ) + public interface Aggregatable { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "aggregationPosition", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.flowui.component.grid.EnhancedDataGrid$AggregationPosition", + defaultValue = "BOTTOM", options = {"TOP", "BOTTOM"}) + } + ) + public interface AggregationPosition { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "alignItems", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, + setParameterFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", + classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", + defaultValue = "START", + options = {"START", "END", "CENTER", "STRETCH", "BASELINE", "AUTO"}) + } + ) + public interface AlignItems { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, + classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", + options = {"START", "END", "CENTER", "STRETCH", "BASELINE", "AUTO"}) + } + ) + public interface GridAlignSelf { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "allRowsVisible", type = StudioPropertyType.BOOLEAN, + defaultValue = "false") + } + ) + public interface AllRowsVisible { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "allowCustomValue", type = StudioPropertyType.BOOLEAN, + defaultValue = "false") + } + ) + public interface AllowCustomValue { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "allowedCharPattern", category = StudioProperty.Category.VALIDATION, type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface AllowedCharPattern { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "alternateText", type = StudioPropertyType.LOCALIZED_STRING, + setMethod = "setAlt") + } + ) + public interface AlternateText { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "autoApply", type = StudioPropertyType.BOOLEAN) + } + ) + public interface AutoApply { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "auto", type = StudioPropertyType.BOOLEAN, + defaultValue = "false", initialValue = "true") + } + ) + public interface Auto { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "autoOpen", type = StudioPropertyType.BOOLEAN, + defaultValue = "false") + } + ) + public interface AutoOpen { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "autoWidth", category = StudioProperty.Category.SIZE, type = StudioPropertyType.BOOLEAN, + defaultValue = "false") + } + ) + public interface AutoWidth { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "autocapitalize", type = StudioPropertyType.ENUMERATION, + classFqn = "com.vaadin.flow.component.textfield.Autocapitalize", defaultValue = "NONE", + options = {"NONE", "SENTENCES", "WORDS", "CHARACTERS"}) + } + ) + public interface Autocapitalize { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "autocomplete", type = StudioPropertyType.ENUMERATION, + classFqn = "com.vaadin.flow.component.textfield.Autocomplete", defaultValue = "OFF", + options = {"OFF", "ON", "NAME", "HONORIFIC_PREFIX", "GIVEN_NAME", "ADDITIONAL_NAME", + "FAMILY_NAME", "HONORIFIC_SUFFIX", "NICKNAME", "EMAIL", "USERNAME", "NEW_PASSWORD", + "CURRENT_PASSWORD", "ORGANIZATION_TITLE", "ORGANIZATION", "STREET_ADDRESS", + "ADDRESS_LINE1", "ADDRESS_LINE2", "ADDRESS_LINE3", "ADDRESS_LEVEL1", + "ADDRESS_LEVEL2", "ADDRESS_LEVEL3", "ADDRESS_LEVEL4", "COUNTRY", "COUNTRY_NAME", + "POSTAL_CODE", "CC_NAME", "CC_GIVEN_NAME", "CC_ADDITIONAL_NAME", "CC_FAMILY_NAME", + "CC_NUMBER", "CC_EXP", "CC_EXP_MONTH", "CC_EXP_YEAR", "CC_CSC", "CC_TYPE", + "TRANSACTION_CURRENCY", "TRANSACTION_AMOUNT", "LANGUAGE", "BDAY", "BDAY_DAY", + "BDAY_MONTH", "BDAY_YEAR", "SEX", "TEL", "TEL_COUNTRY_CODE", "TEL_NATIONAL", + "TEL_AREA_CODE", "TEL_LOCAL", "TEL_LOCAL_PREFIX", "TEL_LOCAL_SUFFIX", + "TEL_EXTENSION", "URL", "PHOTO",}) + } + ) + public interface Autocomplete { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "autocorrect", type = StudioPropertyType.BOOLEAN, + defaultValue = "false") + } + ) + public interface Autocorrect { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "autofocus", type = StudioPropertyType.BOOLEAN, + defaultValue = "false") + } + ) + public interface Autofocus { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "autoselect", type = StudioPropertyType.BOOLEAN, + defaultValue = "false") + } + ) + public interface Autoselect { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty( + xmlAttribute = "bean", + type = StudioPropertyType.STRING, + required = true + ) + } + ) + public interface Bean { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "boxSizing", category = StudioProperty.Category.SIZE, type = StudioPropertyType.ENUMERATION, + setParameterFqn = "com.vaadin.flow.component.orderedlayout.BoxSizing", + classFqn = "com.vaadin.flow.component.orderedlayout.BoxSizing", + defaultValue = "UNDEFINED", + options = {"UNDEFINED", "CONTENT_BOX", "BORDER_BOX"}) + } + ) + public interface BoxSizing { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "cellTitle", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface CellTitle { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "charCode", type = StudioPropertyType.STRING) + } + ) + public interface CharCode { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty( + xmlAttribute = "checkSeconds", + type = StudioPropertyType.BOOLEAN, + defaultValue = "false" + ) + } + ) + public interface CheckSeconds { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "checkable", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.BOOLEAN, + defaultValue = "false") + } + ) + public interface Checkable { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "checked", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.BOOLEAN, + defaultValue = "false") + } + ) + public interface Checked { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "class", type = StudioPropertyType.ENTITY_CLASS, required = true) + } + ) + public interface RequiredEntityClass { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "class", type = StudioPropertyType.ENTITY_CLASS) + } + ) + public interface EntityClass { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "class", category = StudioProperty.Category.GENERAL, + type = StudioPropertyType.FRAGMENT_CLASS, required = true) + } + ) + public interface RequiredFragmentClass { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "clearButtonAriaLabel", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface ClearButtonAriaLabel { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "clearButtonVisible", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.BOOLEAN, + defaultValue = "false") + } + ) + public interface ClearButtonVisible { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "clickShortcut", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.SHORTCUT_COMBINATION) + } + ) + public interface ClickShortcut { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "color", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface Color { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "columnRendering", type = StudioPropertyType.ENUMERATION, + classFqn = "com.vaadin.flow.component.grid.ColumnRendering", defaultValue = "EAGER", + options = {"EAGER", "LAZY"}) + } + ) + public interface ColumnRendering { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "columnReorderingAllowed", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.BOOLEAN, + defaultValue = "false") + } + ) + public interface ColumnReorderingAllowed { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "columns", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.INTEGER, required = true) + } + ) + public interface Columns { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "componentPrefix", type = StudioPropertyType.STRING, + defaultValue = "component_") + } + ) + public interface ComponentPrefix { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "connectingStatusText", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface ConnectingStatusText { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "containerPrefix", type = StudioPropertyType.STRING, + defaultValue = "container_") + } + ) + public interface ContainerPrefix { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "content", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface Content { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "dataContainer", category = StudioProperty.Category.DATA_BINDING, + type = StudioPropertyType.COLLECTION_DATA_CONTAINER_REF, required = true, + typeParameter = "E") + } + ) + public interface CollectionDataContainer { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "dataContainer", category = StudioProperty.Category.DATA_BINDING, type = StudioPropertyType.COLLECTION_OR_INSTANCE_DATA_CONTAINER_REF) + } + ) + public interface CollectionOrInstanceDataContainer { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "dataLoader", category = StudioProperty.Category.DATA_BINDING, type = StudioPropertyType.DATA_LOADER_REF, + required = true) + } + ) + public interface DataLoader { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "datatype", category = StudioProperty.Category.DATA_BINDING, type = StudioPropertyType.DATATYPE_ID, + typeParameter = "V") + } + ) + public interface Datatype { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "defaultValue", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.STRING) + } + ) + public interface DefaultValue { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "description", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface Description { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "detailsVisibleOnClick", type = StudioPropertyType.BOOLEAN, + defaultValue = "false") + } + ) + public interface DetailsVisibleOnClick { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "dropAllowed", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.BOOLEAN, + defaultValue = "false") + } + ) + public interface DropAllowed { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "dropMode", type = StudioPropertyType.ENUMERATION, + classFqn = "com.vaadin.flow.component.grid.dnd.GridDropMode", options = {"BETWEEN", "ON_TOP", + "ON_TOP_OR_BETWEEN", "ON_GRID"}) + } + ) + public interface DropMode { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "editable", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.BOOLEAN, + defaultValue = "false") + } + ) + public interface Editable { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "editorBuffered", type = StudioPropertyType.BOOLEAN, + defaultValue = "false") + } + ) + public interface EditorBuffered { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "emptyStateText", category = StudioProperty.Category.GENERAL, + type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface EmptyStateText { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "escapeValueForLike", type = StudioPropertyType.BOOLEAN, + defaultValue = "false") + } + ) + public interface EscapeValueForLike { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "exclude", type = StudioPropertyType.STRING) + } + ) + public interface Exclude { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "expand", category = StudioProperty.Category.POSITION, type = StudioPropertyType.STRING) + } + ) + public interface Expand { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "fetchPlan", type = StudioPropertyType.FETCH_PLAN) + } + ) + public interface FetchPlan { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "fileNameVisible", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.BOOLEAN, + defaultValue = "false") + } + ) + public interface FileNameVisible { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "fileNotSelectedText", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface FileNotSelectedText { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "fileStorageName", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.STRING) + } + ) + public interface FileStorageName { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "fileStoragePutMode", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.ENUMERATION, + options = {"MANUAL", "IMMEDIATE"}, defaultValue = "IMMEDIATE") + } + ) + public interface FileStoragePutMode { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "fileTooBigText", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface FileTooBigText { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "firstResult", + type = StudioPropertyType.INTEGER, defaultValue = "0")) + public interface FirstResult { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "flexGrow", + category = StudioProperty.Category.POSITION, type = StudioPropertyType.INTEGER)) + public interface FlexGrow { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "fontFamily", + category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.STRING)) + public interface FontFamily { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "footer", + type = StudioPropertyType.LOCALIZED_STRING)) + public interface Footer { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "forgotPassword", + type = StudioPropertyType.LOCALIZED_STRING)) + public interface ForgotPassword { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "format", + type = StudioPropertyType.LOCALIZED_STRING, required = true)) + public interface Format { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "frozen", + category = StudioProperty.Category.POSITION, type = StudioPropertyType.BOOLEAN, defaultValue = "false")) + public interface Frozen { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "gap", + category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.STRING)) + public interface Gap { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "hasInExpression", + type = StudioPropertyType.BOOLEAN, defaultValue = "false")) + public interface HasInExpression { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "header", + type = StudioPropertyType.LOCALIZED_STRING)) + public interface Header { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "helperText", + category = StudioProperty.Category.GENERAL, type = StudioPropertyType.LOCALIZED_STRING)) + public interface HelperText { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "hideDelay", + type = StudioPropertyType.INTEGER)) + public interface HideDelay { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "iconAfterText", + type = StudioPropertyType.BOOLEAN, defaultValue = "false")) + public interface IconAfterText { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "iconClassNames", + category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.VALUES_LIST)) + public interface IconClassNames { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "icon", + category = StudioProperty.Category.GENERAL, type = StudioPropertyType.ICON)) + public interface Icon { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "icon", + category = StudioProperty.Category.GENERAL, type = StudioPropertyType.ICON, required = true)) + public interface RequiredIcon { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "icon", + category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ICON, + setParameterFqn = "com.vaadin.flow.component.icon.Icon")) + public interface LookAndFeelIcon { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "includeAll", + type = StudioPropertyType.BOOLEAN, defaultValue = "false")) + public interface IncludeAll { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "inclusive", + type = StudioPropertyType.BOOLEAN)) + public interface Inclusive { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "incorrectFileTypeText", + type = StudioPropertyType.LOCALIZED_STRING)) + public interface IncorrectFileTypeText { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "indeterminate", + category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.BOOLEAN, defaultValue = "false")) + public interface Indeterminate { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "itemsContainer", + category = StudioProperty.Category.DATA_BINDING, type = StudioPropertyType.COLLECTION_DATA_CONTAINER_REF, typeParameter = "T")) + public interface ItemsContainerTypeParameterT { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "itemsContainer", + category = StudioProperty.Category.DATA_BINDING, type = StudioPropertyType.COLLECTION_DATA_CONTAINER_REF, typeParameter = "V")) + public interface ItemsContainerTypeParameterV { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "itemsEnum", + category = StudioProperty.Category.DATA_BINDING, type = StudioPropertyType.ENUM_CLASS, typeParameter = "V")) + public interface ItemsEnum { + } + + @StudioPropertyGroup( + properties = @StudioProperty(xmlAttribute = "justifyContent", + category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, + setParameterFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$JustifyContentMode", + classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$JustifyContentMode", + setMethod = "setJustifyContentMode", defaultValue = "START", + options = {"START", "END", "CENTER", "BETWEEN", "AROUND", "EVENLY"}) + ) + public interface JustifyContent { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "key", + type = StudioPropertyType.STRING)) + public interface Key { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "label", + category = StudioProperty.Category.GENERAL, type = StudioPropertyType.LOCALIZED_STRING)) + public interface Label { + } + + @StudioPropertyGroup( + properties = @StudioProperty(xmlAttribute = "labelPosition", + category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.flowui.component.SupportsLabelPosition$LabelPosition", + options = {"ASIDE", "TOP"}, defaultValue = "ASIDE") + + ) + public interface LabelPosition { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "labelVisible", + category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.BOOLEAN, defaultValue = "true")) + public interface LabelVisible { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "labelWidth", + category = StudioProperty.Category.SIZE, type = StudioPropertyType.SIZE)) + public interface LabelWidth { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "ligature", type = StudioPropertyType.STRING)) + public interface Ligature { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "loadMenuConfig", + category = StudioProperty.Category.GENERAL, type = StudioPropertyType.BOOLEAN, defaultValue = "true")) + public interface LoadMenuConfig { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "margin", + category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.BOOLEAN, defaultValue = "false")) + public interface Margin { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "max", + category = StudioProperty.Category.VALIDATION, type = StudioPropertyType.DOUBLE)) + public interface ValidationDoubleMax { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "maxFileSize", + category = StudioProperty.Category.VALIDATION, type = StudioPropertyType.INTEGER)) + public interface MaxFileSize { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "max", + type = StudioPropertyType.INTEGER)) + public interface IntegerMax { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "maxLength", + category = StudioProperty.Category.VALIDATION, type = StudioPropertyType.INTEGER)) + public interface MaxLength { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "maxResults", + type = StudioPropertyType.INTEGER, defaultValue = "0")) + public interface MaxResults { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "max", + category = StudioProperty.Category.VALIDATION, type = StudioPropertyType.STRING)) + public interface ValidationStringMax { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "value", + type = StudioPropertyType.STRING, required = true)) + public interface RequiredStringValue { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "value", + category = StudioProperty.Category.GENERAL, type = StudioPropertyType.STRING)) + public interface StringValue { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "integer", + type = StudioPropertyType.INTEGER, required = true)) + public interface RequiredInteger { + + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "message", + type = StudioPropertyType.LOCALIZED_STRING)) + public interface Message { + } + + @StudioPropertyGroup + public interface MessageAndCheckSeconds extends Message, CheckSeconds { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "messagesGroup", + type = StudioPropertyType.STRING)) + public interface MessagesGroup { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "metaClass", + category = StudioProperty.Category.DATA_BINDING, type = StudioPropertyType.ENTITY_NAME, typeParameter = "V")) + public interface MetaClassTypeParameterV { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "metaClass", + category = StudioProperty.Category.DATA_BINDING, type = StudioPropertyType.ENTITY_NAME, typeParameter = "E")) + public interface MetaClassTypeParameterE { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "min", + category = StudioProperty.Category.VALIDATION, type = StudioPropertyType.DOUBLE)) + public interface ValidationDoubleMin { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "min", + type = StudioPropertyType.INTEGER)) + public interface IntegerMin { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "minLength", + category = StudioProperty.Category.VALIDATION, type = StudioPropertyType.INTEGER)) + public interface MinLength { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "min", + category = StudioProperty.Category.VALIDATION, type = StudioPropertyType.STRING)) + public interface ValidationStringMin { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "minWidth", + category = StudioProperty.Category.GENERAL, type = StudioPropertyType.SIZE, options = {"AUTO", "100%"}, required = true)) + public interface RequiredMinWidthWithOptions { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "multiSort", + type = StudioPropertyType.BOOLEAN, defaultValue = "false")) + public interface MultiSort { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "multiSortOnShiftClickOnly", + type = StudioPropertyType.BOOLEAN, defaultValue = "false")) + public interface MultiSortOnShiftClickOnly { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "multiSortPriority", + type = StudioPropertyType.ENUMERATION, + classFqn = "com.vaadin.flow.component.grid.Grid.MultiSortPriority", + options = {"APPEND", "PREPEND"}, defaultValue = "PREPEND")) + public interface MultiSortPriority { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "name", + category = StudioProperty.Category.GENERAL, type = StudioPropertyType.LOCALIZED_STRING)) + public interface Name { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "nestedNullBehavior", + type = StudioPropertyType.ENUMERATION, + classFqn = "com.vaadin.flow.component.grid.Grid.NestedNullBehavior", + options = {"THROW", "ALLOW_NULLS"}, defaultValue = "THROW")) + public interface NestedNullBehavior { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "nullRepresentation", + type = StudioPropertyType.LOCALIZED_STRING)) + public interface NullRepresentation { + } + + @StudioPropertyGroup + public interface FormatAndNullRepresentation extends Format, NullRepresentation { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "openOnHover", + category = StudioProperty.Category.GENERAL, type = StudioPropertyType.BOOLEAN, defaultValue = "false")) + public interface OpenOnHover { + } + + @StudioPropertyGroup(properties = @StudioProperty(xmlAttribute = "opened", + category = StudioProperty.Category.GENERAL, type = StudioPropertyType.BOOLEAN, defaultValue = "false")) + public interface Opened { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "operationTextVisible", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.BOOLEAN, + defaultValue = "true") + } + ) + public interface OperationTextVisible { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "overlayWidth", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.SIZE) + } + ) + public interface OverlayWidth { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "padding", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.BOOLEAN, + defaultValue = "true") + } + ) + public interface Padding { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "pageSize", type = StudioPropertyType.INTEGER) + } + ) + public interface PageSize { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "pageSize", type = StudioPropertyType.INTEGER, defaultValue = "50") + } + ) + public interface PageSizeWithDefaultValue50 { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "param", type = StudioPropertyType.STRING) + } + ) + public interface Param { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "parameterName", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.STRING) + } + ) + public interface ParameterName { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "password", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface Password { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "pattern", category = StudioProperty.Category.VALIDATION, type = StudioPropertyType.STRING) + } + ) + public interface Pattern { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "placeholder", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface Placeholder { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "processingStatusText", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface ProcessingStatusText { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "property", category = StudioProperty.Category.DATA_BINDING, type = StudioPropertyType.PROPERTY_REF, + typeParameter = "T", required = true) + } + ) + public interface PropertyTypeParameterT { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "property", category = StudioProperty.Category.DATA_BINDING, type = StudioPropertyType.PROPERTY_REF, + typeParameter = "V") + } + ) + public interface PropertyTypeParameterV { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "property", category = StudioProperty.Category.DATA_BINDING, type = StudioPropertyType.PROPERTY_REF) + } + ) + public interface Property { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "query", type = StudioPropertyType.JPA_QUERY) + } + ) + public interface Query { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "readOnly", type = StudioPropertyType.BOOLEAN, + category = StudioProperty.Category.GENERAL, + defaultValue = "false") + } + ) + public interface ReadOnly { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "readOnly", type = StudioPropertyType.BOOLEAN, + defaultValue = "false") + } + ) + public interface ReadOnlyWithoutCategory { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "remainingTimeText", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface RemainingTimeText { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "remainingTimeUnknownText", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface RemainingTimeUnknownText { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "resource", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.STRING) + } + ) + public interface Resource { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "resource", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.STRING, + setMethod = "setSrc") + } + ) + public interface ImageResource { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "rotation", type = StudioPropertyType.DOUBLE) + } + ) + public interface Rotation { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "rowsDraggable", type = StudioPropertyType.BOOLEAN, + defaultValue = "false") + } + ) + public interface RowsDraggable { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "searchStringFormat", type = StudioPropertyType.STRING) + } + ) + public interface SearchStringFormat { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "selectionMode", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.ENUMERATION, + classFqn = "com.vaadin.flow.component.grid.Grid.SelectionMode", defaultValue = "SINGLE", + options = {"SINGLE", "MULTI", "NONE"}) + } + ) + public interface SelectionMode { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "shortcutCombination", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.SHORTCUT_COMBINATION) + } + ) + public interface ShortcutCombination { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty( + xmlAttribute = "showInContextMenuEnabled", + type = StudioPropertyType.BOOLEAN, + defaultValue = "true" + ) + } + ) + public interface ShowInContextMenuEnabled { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "sortable", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.BOOLEAN, + defaultValueRef = "parent:sortable") + } + ) + public interface ColumnSortable { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "sortable", type = StudioPropertyType.BOOLEAN, + defaultValue = "true") + } + ) + public interface Sortable { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "spacing", category = StudioProperty.Category.POSITION, type = StudioPropertyType.BOOLEAN, + defaultValue = "true") + } + ) + public interface Spacing { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "stepButtonsVisible", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.BOOLEAN, + defaultValue = "false") + } + ) + public interface StepButtonsVisible { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "step", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.DOUBLE) + } + ) + public interface Step { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "step", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.STRING, + options = {"900s", "15m", "20m", "30m", "2h", "3h", "4h", "6h", "8h", "12h"}) + } + ) + public interface TimeStep { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "store", type = StudioPropertyType.STORE) + } + ) + public interface Store { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "strategyClass", type = StudioPropertyType.STRING) + } + ) + public interface StrategyClass { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "submit", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface Submit { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "summaryText", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface DetailsSummaryText { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "summaryText", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface SummaryText { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "symbol", type = StudioPropertyType.STRING) + } + ) + public interface Symbol { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "text", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface Text { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "text", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.LOCALIZED_STRING, required = true) + } + ) + public interface RequiredText { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "themeNames", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.VALUES_LIST, + options = {"small", "align-center", "align-right", "helper-above-field", + "always-float-label"}) + } + ) + public interface FieldThemeNames { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "themeNames", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.VALUES_LIST, + options = {"filled", "reverse", "small"}) + } + ) + public interface DetailsThemeNames { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "themeNames", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.VALUES_LIST, + options = {"small", "large", "tertiary", "tertiary-inline", + "primary", "success", "warning", "error", "contrast", "icon", "contained", "outlined"}) + } + ) + public interface ButtonThemeNames { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "themeNames", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.VALUES_LIST, + options = {"non-checkable"}) + } + ) + public interface UserMenuItemThemeNames { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "themeNames", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.VALUES_LIST, + options = {"fill", "contain", "cover", "scale-down"}) + } + ) + public interface ImageThemeNames { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "themeNames", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.VALUES_LIST, + options = {"spacing-xs", "spacing-s", "spacing", "spacing-l", "spacing-xl"}) + } + ) + public interface LayoutThemeNames { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "themeNames", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.VALUES_LIST, + options = {"small", "align-left", "align-center", "align-right", "helper-above-field", + "always-float-label"}) + } + ) + public interface ComboBoxThemeNames { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "themeNames", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.VALUES_LIST, + options = {"no-border", "no-row-borders", "column-borders", "row-stripes", + "compact", "wrap-cell-content", "column-dividers"}) + } + ) + public interface GridThemeNames { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "themeNames", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.VALUES_LIST, + options = {"normal", "success", "warning", "error", "contrast", "primary", "small", "pill", "badge"}) + } + ) + public interface HtmlComponentThemeNames { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "themeNames", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.VALUES_LIST) + } + ) + public interface ThemeNames { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "themeNames", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.VALUES_LIST, + options = {"normal", "success", "warning", "error", "contrast", "primary", "small", "pill"}) + } + ) + public interface NativeLabelThemeNames { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "title", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface Title { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "trimEnabled", type = StudioPropertyType.BOOLEAN, defaultValue = "true", + defaultValueRef = "application_property:jmix.ui.component.default-trim-enabled") + } + ) + public interface TrimEnabled { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "uploadDialogCancelText", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface UploadDialogCancelText { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "uploadDialogTitle", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface UploadDialogTitle { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "uploadIcon", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ICON) + } + ) + public interface UploadIcon { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "uploadText", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface UploadText { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "username", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface Username { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "valueChangeMode", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.ENUMERATION, + classFqn = "com.vaadin.flow.data.value.ValueChangeMode", + options = {"EAGER", "LAZY", "TIMEOUT", "ON_BLUR", "ON_CHANGE"}) + } + ) + public interface ValueChangeMode { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "valueChangeTimeout", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.INTEGER) + } + ) + public interface ValueChangeTimeout { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "visible", type = StudioPropertyType.BOOLEAN, defaultValue = "true") + } + ) + public interface VisibleWithDefaultValueTrue { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "weekNumbersVisible", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.BOOLEAN, + defaultValue = "false") + } + ) + public interface WeekNumbersVisible { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "whiteSpace", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, + classFqn = "com.vaadin.flow.component.HasText$WhiteSpace", defaultValue = "NORMAL", + options = {"NORMAL", "NOWRAP", "PRE", "PRE_WRAP", "PRE_LINE", "BREAK_SPACES", "INHERIT", + "INITIAL"}) + } + ) + public interface WhiteSpace { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "width", category = StudioProperty.Category.SIZE, type = StudioPropertyType.INTEGER) + } + ) + public interface WidthWithIntegerType { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "width", category = StudioProperty.Category.SIZE, type = StudioPropertyType.SIZE, options = {"AUTO", "100%"}, defaultValue = "100%") + } + ) + public interface WidthWithDefaultValue100 { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "width", category = StudioProperty.Category.SIZE, type = StudioPropertyType.SIZE, options = {"AUTO", "100%"}, + defaultValue = "AUTO") + } + ) + public interface WidthWithDefaultValueAuto { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "width", category = StudioProperty.Category.SIZE, type = StudioPropertyType.SIZE, options = {"AUTO", "100%"}, defaultValue = "UNDEFINED") + } + ) + public interface WidthWithDefaultValueUndefined { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "width", category = StudioProperty.Category.SIZE, type = StudioPropertyType.SIZE, options = {"AUTO", "100%"}, initialValue = "100%") + } + ) + public interface WidthWithInitialValue100 { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "wrap", category = StudioProperty.Category.LOOK_AND_FEEL, + type = StudioPropertyType.BOOLEAN, defaultValue = "false") + } + ) + public interface Wrap { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "description", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface DescriptionWithoutCategory { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "enabled", type = StudioPropertyType.BOOLEAN, defaultValue = "true") + } + ) + public interface EnabledWithTrueDefaultValueWithoutCategory { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "icon", category = StudioProperty.Category.LOOK_AND_FEEL, + type = StudioPropertyType.ICON, initialValue = "CHECK", + setParameterFqn = "com.vaadin.flow.component.icon.Icon") + } + ) + public interface IconWithCheckInitialValue { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "icon", category = StudioProperty.Category.LOOK_AND_FEEL, + type = StudioPropertyType.ICON, initialValue = "BAN", + setParameterFqn = "com.vaadin.flow.component.icon.Icon") + } + ) + public interface IconWithBanInitialValue { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "icon", category = StudioProperty.Category.LOOK_AND_FEEL, + type = StudioPropertyType.ICON, initialValue = "PENCIL", + setParameterFqn = "com.vaadin.flow.component.icon.Icon") + } + ) + public interface IconWithPencilInitialValue { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "icon", type = StudioPropertyType.ICON) + } + ) + public interface IconWithoutCategory { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "key", type = StudioPropertyType.STRING, + initialValue = "editorActionsColumn") + } + ) + public interface KeyWithEditorActionsColumnInitialValue { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "minWidth", category = StudioProperty.Category.SIZE, + type = StudioPropertyType.SIZE, options = {"AUTO", "100%"}, + initialValue = "100px") + } + ) + public interface MinWidthWithInitialValue100px { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "name", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface LocalizedNameWithoutCategory { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "name", type = StudioPropertyType.STRING, required = true) + } + ) + public interface RequiredStringName { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "resizable", type = StudioPropertyType.BOOLEAN, + defaultValueRef = "parent:resizable") + } + ) + public interface ResizableWithoutCategoryWithParentDefaultValueRef { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "resizable", type = StudioPropertyType.BOOLEAN, + defaultValue = "false") + } + ) + public interface ResizableWithFalseDefaultValue { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "resizable", category = StudioProperty.Category.SIZE, + type = StudioPropertyType.BOOLEAN, defaultValueRef = "parent:resizable") + } + ) + public interface ResizableWithParentDefaultValueRef { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "text", category = StudioProperty.Category.GENERAL, + type = StudioPropertyType.LOCALIZED_STRING, initialValue = "msg:///actions.Cancel") + } + ) + public interface TextWithCancelInitialValue { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "text", category = StudioProperty.Category.GENERAL, + type = StudioPropertyType.LOCALIZED_STRING, initialValue = "msg:///actions.Edit") + } + ) + public interface TextWithEditInitialValue { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "type", type = StudioPropertyType.ENUMERATION, + classFqn = "io.jmix.flowui.component.AggregationInfo$Type", + options = {"SUM", "COUNT", "AVG", "MIN", "MAX"}) + } + ) + public interface AggregationType { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, + type = StudioPropertyType.COMPONENT_ID, required = true, + initialValue = "create") + } + ) + public interface RequiredIdWithCreateInitialValue { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "icon", category = StudioProperty.Category.LOOK_AND_FEEL, + type = StudioPropertyType.ICON, defaultValue = "PLUS", + setParameterFqn = "com.vaadin.flow.component.icon.Icon") + } + ) + public interface LookAndFeelIconWithPlusDefaultValue { + } + + @StudioPropertyGroup + public interface HtmlTextElementDefaultProperties extends ClassNames, ClickShortcut, Css, + EnabledWithTrueDefaultValue, Size, Id, Text, NativeLabelThemeNames, Title, Visible, WhiteSpace { + } + + @StudioPropertyGroup + public interface EditorActionButtonDefaultProperties extends Title, ShortcutCombination, WhiteSpace, + ButtonThemeNames, ClassNames, IconAfterText { + } + + @StudioPropertyGroup + public interface EditorActionTextButtonDefaultProperties extends EditorActionButtonDefaultProperties, Text { + } + + @StudioPropertyGroup + public interface LoginFormDefaultProperties extends ForgotPassword, Password, Submit, Title, Username { + } + + @StudioPropertyGroup + public interface UserMenuItemDefaultProperties extends RequiredId, Visible, Enabled, Checkable, Checked, + UserMenuItemThemeNames { + } + + @StudioPropertyGroup + public interface TextUserMenuItemDefaultProperties extends UserMenuItemDefaultProperties, RequiredText, Icon { + } + + @StudioPropertyGroup + public interface IdAndParam extends Id, Param { + } + + @StudioPropertyGroup + public interface ResponsiveStepDefaultProperties extends RequiredMinWidthWithOptions, Columns { + } + + @StudioPropertyGroup + public interface BasicComponentDefaultProperties extends AlignSelfAndJustifySelfAndColspan, IdAndVisible, Css { + } + + @StudioPropertyGroup + public interface AddonComponentDefaultProperties extends ClassNamesAndCss, IdAndVisible, Size, AlignSelf, + Colspan { + } + + @StudioPropertyGroup + public interface SizedComponentDefaultProperties extends AlignSelfAndJustifySelfAndColspan, ClassNamesAndCss, + IdAndVisible, EnabledWithTrueDefaultValue, Size { + } + + @StudioPropertyGroup + public interface FieldThemeTitleAndValueChangeDefaultProperties extends FieldThemeNames, Title, + ValueChangeMode, ValueChangeTimeout { + } + + @StudioPropertyGroup + public interface IconDefaultProperties extends AlignSelfAndJustifySelfAndColspan, ClassNamesAndCss, + IdAndVisible, ClickShortcut, Color, RequiredIcon { + } + + @StudioPropertyGroup + public interface SvgIconDefaultProperties extends AlignSelfAndJustifySelfAndColspan, ClassNamesAndCss, + IdAndVisible, ClickShortcut, Color, Resource, Symbol { + } + + @StudioPropertyGroup + public interface FontIconDefaultProperties extends AlignSelfAndJustifySelfAndColspan, ClassNamesAndCss, + IdAndVisible, CharCode, ClickShortcut, Color, FontFamily, IconClassNames, Ligature { + } + + @StudioPropertyGroup + public interface FieldDefaultProperties extends SizedComponentDefaultProperties, + AriaLabelAndTabIndexAndFocusShortcut, RequiredAndRequiredMessageAndErrorMessage, + CollectionOrInstanceDataContainer, HelperText, Label, ReadOnly { + } + + @StudioPropertyGroup + public interface TextInputFieldDefaultProperties extends FieldDefaultProperties, Autocapitalize, Autocomplete, + Autocorrect, Autofocus, Autoselect, ClearButtonVisible, Placeholder { + } + + @StudioPropertyGroup + public interface MultiSelectComboBoxDefaultProperties extends AlignSelfAndJustifySelfAndColspan, + ClassNamesAndCss, IdAndVisible, EnabledWithTrueDefaultValue, Size, + AriaLabelAndTabIndexAndFocusShortcut, AllowCustomValue, AllowedCharPattern, Autofocus, AutoOpen, + OverlayWidth, ClearButtonVisible, CollectionOrInstanceDataContainer, ErrorMessage, HelperText, + ItemsContainerTypeParameterV, ItemsEnum, Label, MetaClassTypeParameterV, Opened, PageSize, + Placeholder, PropertyTypeParameterV, ReadOnly, Required, ComboBoxThemeNames, Title { + } + + @StudioPropertyGroup + public interface ListBoxDefaultProperties extends AlignSelfAndJustifySelfAndColspan, ClassNamesAndCss, + IdAndVisible, EnabledWithTrueDefaultValue, Size, AriaLabel, AriaLabelledBy, + ItemsContainerTypeParameterV, ItemsEnum, ReadOnly { + } + + @StudioPropertyGroup + public interface ValuePickerDefaultProperties extends AlignSelfAndJustifySelfAndColspan, ClassNamesAndCss, + IdAndVisible, EnabledWithTrueDefaultValue, Size, AriaLabelAndTabIndexAndFocusShortcut, + RequiredAndRequiredMessageAndErrorMessage, AllowCustomValue, Autofocus, + CollectionOrInstanceDataContainer, HelperText, Label, Placeholder, PropertyTypeParameterV, + ReadOnly, ThemeNames, Title { + } + + @StudioPropertyGroup + public interface AutoWidthLayoutDefaultProperties extends AlignSelfAndJustifySelfAndColspan, + ClassNamesAndCss, IdAndVisible, Height, MaxHeight, MaxWidth, MinHeight, MinWidth, + WidthWithDefaultValueAuto { + } + + @StudioPropertyGroup + public interface EnabledAutoWidthLayoutDefaultProperties extends AutoWidthLayoutDefaultProperties, + EnabledWithTrueDefaultValue { + } + + @StudioPropertyGroup + public interface DataLoadCoordinatorDefaultProperties extends IdWithoutCategory, Auto, ComponentPrefix, + ContainerPrefix { + } + + @StudioPropertyGroup + public interface SettingsDefaultProperties extends IdWithoutCategory, Auto { + } + + @StudioPropertyGroup + public interface RequiredStringNameAndValue extends RequiredStringName, RequiredStringValue { + } + + @StudioPropertyGroup + public interface MessageAndRequiredStringValue extends Message, RequiredStringValue { + } + + @StudioPropertyGroup + public interface MessageAndInclusiveRequiredStringValue extends Message, Inclusive, RequiredStringValue { + } + + @StudioPropertyGroup + public interface MessagesGroupAndTitle extends MessagesGroup, Title { + } +} diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioActionPropertyGroups.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioActionPropertyGroups.java new file mode 100644 index 0000000000..8c5ca676d0 --- /dev/null +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioActionPropertyGroups.java @@ -0,0 +1,87 @@ +/* + * Copyright 2026 Haulmont. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.jmix.flowui.kit.meta.action; + +import io.jmix.flowui.kit.meta.StudioAPI; +import io.jmix.flowui.kit.meta.StudioPropertyGroup; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; + +@StudioAPI +public final class StudioActionPropertyGroups { + + private StudioActionPropertyGroups() { + } + + @StudioPropertyGroup + public interface ActionDefaultProperties extends StudioPropertyGroups.ActionVariantWithDefaultDefaultValue, + StudioPropertyGroups.Description, StudioPropertyGroups.EnabledWithTrueDefaultValue, + StudioPropertyGroups.ShortcutCombination, StudioPropertyGroups.Visible { + } + + @StudioPropertyGroup + public interface TextActionDefaultProperties extends ActionDefaultProperties, StudioPropertyGroups.Text { + } + + @StudioPropertyGroup + public interface IconActionDefaultProperties extends ActionDefaultProperties, StudioPropertyGroups.LookAndFeelIcon { + } + + @StudioPropertyGroup + public interface IconTextActionDefaultProperties extends IconActionDefaultProperties, StudioPropertyGroups.Text { + } + + @StudioPropertyGroup + public interface RequiredIconTextActionDefaultProperties extends IconTextActionDefaultProperties, + StudioPropertyGroups.RequiredId { + } + + @StudioPropertyGroup + public interface ActionDefaultPropertiesWithoutShortcutCombination extends + StudioPropertyGroups.ActionVariantWithDefaultDefaultValue, StudioPropertyGroups.Description, + StudioPropertyGroups.EnabledWithTrueDefaultValue, StudioPropertyGroups.Visible { + } + + @StudioPropertyGroup + public interface RequiredIconTextActionDefaultPropertiesWithoutShortcutCombination extends + ActionDefaultPropertiesWithoutShortcutCombination, StudioPropertyGroups.LookAndFeelIcon, + StudioPropertyGroups.RequiredId, StudioPropertyGroups.Text { + } + + @StudioPropertyGroup + public interface DangerActionDefaultProperties extends StudioPropertyGroups.ActionVariantWithDangerDefaultValue, + StudioPropertyGroups.Description, StudioPropertyGroups.EnabledWithTrueDefaultValue, + StudioPropertyGroups.ShortcutCombination, StudioPropertyGroups.Visible { + } + + @StudioPropertyGroup + public interface PrimaryActionDefaultProperties extends StudioPropertyGroups.ActionVariantWithPrimaryDefaultValue, + StudioPropertyGroups.Description, StudioPropertyGroups.EnabledWithTrueDefaultValue, + StudioPropertyGroups.ShortcutCombination, StudioPropertyGroups.Visible { + } + + @StudioPropertyGroup + public interface ActionCommonPropertiesWithoutCategory extends StudioPropertyGroups.DescriptionWithoutCategory, + StudioPropertyGroups.EnabledWithTrueDefaultValueWithoutCategory, + StudioPropertyGroups.ShortcutCombination, StudioPropertyGroups.VisibleWithDefaultValueTrue { + } + + @StudioPropertyGroup + public interface PrimaryActionDefaultPropertiesWithCreateIdAndPlusIcon extends + PrimaryActionDefaultProperties, StudioPropertyGroups.RequiredIdWithCreateInitialValue, + StudioPropertyGroups.LookAndFeelIconWithPlusDefaultValue { + } +} diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioActions.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioActions.java index 5f72477a7f..4e80b3bf8b 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioActions.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioActions.java @@ -20,6 +20,7 @@ import io.jmix.flowui.kit.meta.StudioProperty; import io.jmix.flowui.kit.meta.StudioPropertyType; import io.jmix.flowui.kit.meta.StudioUiKit; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; @StudioUiKit interface StudioActions { @@ -30,6 +31,7 @@ interface StudioActions { "io.jmix.flowui.component.PickerComponent" }, documentationLink = "%VERSION%/flow-ui/actions/declarative-actions.html", + propertyGroups = StudioActionPropertyGroups.RequiredIconTextActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioBulkEditorActions.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioBulkEditorActions.java index 175a83fd4a..f2906031dc 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioBulkEditorActions.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioBulkEditorActions.java @@ -21,6 +21,7 @@ import io.jmix.flowui.kit.meta.StudioProperty; import io.jmix.flowui.kit.meta.StudioPropertyType; import io.jmix.flowui.kit.meta.StudioUiKit; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; @StudioUiKit(requiredDependencies = "io.jmix.bulkeditor:jmix-bulkeditor-starter") interface StudioBulkEditorActions { @@ -31,6 +32,7 @@ interface StudioBulkEditorActions { classFqn = "io.jmix.bulkeditor.action.BulkEditAction", documentationLink = "%VERSION%/bulk-edit/index.html#usage", availableInViewWizard = true, + propertyGroups = StudioActionPropertyGroups.ActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioDataToolsActions.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioDataToolsActions.java index 10680e76f5..d68afa3627 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioDataToolsActions.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioDataToolsActions.java @@ -26,6 +26,7 @@ interface StudioDataToolsActions { description = "Displays a dialog window with detailed information about the selected entity", classFqn = "io.jmix.datatoolsflowui.action.ShowEntityInfoAction", documentationLink = "%VERSION%/data-tools/entity-info-action.html", + propertyGroups = StudioActionPropertyGroups.IconActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioGenericFilterActions.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioGenericFilterActions.java index 75f4a3f302..6061015eb9 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioGenericFilterActions.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioGenericFilterActions.java @@ -25,6 +25,7 @@ interface StudioGenericFilterActions { type = "genericFilter_addCondition", description = "Adds condition to current filter configuration", classFqn = "io.jmix.flowui.action.genericfilter.GenericFilterAddConditionAction", + propertyGroups = StudioActionPropertyGroups.TextActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -46,7 +47,7 @@ interface StudioGenericFilterActions { type = "genericFilter_clearValues", description = "Clears the filter condition values", classFqn = "io.jmix.flowui.action.genericfilter.GenericFilterClearValuesAction", - + propertyGroups = StudioActionPropertyGroups.TextActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -68,6 +69,7 @@ interface StudioGenericFilterActions { type = "genericFilter_copy", description = "Copies all conditions from design-time configuration to run-time configuration", classFqn = "io.jmix.flowui.action.genericfilter.GenericFilterCopyAction", + propertyGroups = StudioActionPropertyGroups.TextActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -89,6 +91,7 @@ interface StudioGenericFilterActions { type = "genericFilter_edit", description = "Edits current configuration", classFqn = "io.jmix.flowui.action.genericfilter.GenericFilterEditAction", + propertyGroups = StudioActionPropertyGroups.TextActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -110,6 +113,7 @@ interface StudioGenericFilterActions { type = "genericFilter_reset", description = "Resets current configuration", classFqn = "io.jmix.flowui.action.genericfilter.GenericFilterResetAction", + propertyGroups = StudioActionPropertyGroups.IconTextActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioGenericFilterDataActions.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioGenericFilterDataActions.java index 104b20141b..c430566e05 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioGenericFilterDataActions.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioGenericFilterDataActions.java @@ -25,6 +25,7 @@ interface StudioGenericFilterDataActions { type = "genericFilter_remove", description = "Removes current run-time filter configuration", classFqn = "io.jmix.flowuidata.action.genericfilter.GenericFilterRemoveAction", + propertyGroups = StudioActionPropertyGroups.TextActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -46,6 +47,7 @@ interface StudioGenericFilterDataActions { type = "genericFilter_makeDefault", description = "Makes the filter configuration default for this view", classFqn = "io.jmix.flowuidata.action.genericfilter.GenericFilterMakeDefaultAction", + propertyGroups = StudioActionPropertyGroups.TextActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -67,6 +69,7 @@ interface StudioGenericFilterDataActions { type = "genericFilter_save", description = "Saves changes to current filter configuration", classFqn = "io.jmix.flowuidata.action.genericfilter.GenericFilterSaveAction", + propertyGroups = StudioActionPropertyGroups.TextActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -88,6 +91,7 @@ interface StudioGenericFilterDataActions { type = "genericFilter_saveAs", description = "Saves current filter configuration under a new id and name", classFqn = "io.jmix.flowuidata.action.genericfilter.GenericFilterSaveAsAction", + propertyGroups = StudioActionPropertyGroups.TextActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -109,6 +113,7 @@ interface StudioGenericFilterDataActions { type = "genericFilter_saveWithValues", description = "Saves changes to current filter configuration using the values in filter components as default values", classFqn = "io.jmix.flowuidata.action.genericfilter.GenericFilterSaveWithValuesAction", + propertyGroups = StudioActionPropertyGroups.TextActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioGridExportActions.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioGridExportActions.java index 0eef94e08c..a7fd18762a 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioGridExportActions.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioGridExportActions.java @@ -21,6 +21,7 @@ import io.jmix.flowui.kit.meta.StudioProperty; import io.jmix.flowui.kit.meta.StudioPropertyType; import io.jmix.flowui.kit.meta.StudioUiKit; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; @StudioUiKit(requiredDependencies = "io.jmix.gridexport:jmix-gridexport-flowui-starter") interface StudioGridExportActions { @@ -32,6 +33,7 @@ interface StudioGridExportActions { target = {"io.jmix.flowui.component.ListDataComponent"}, documentationLink = "%VERSION%/grid-export/index.html", availableInViewWizard = true, + propertyGroups = StudioActionPropertyGroups.ActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -64,6 +66,7 @@ interface StudioGridExportActions { target = {"io.jmix.flowui.component.ListDataComponent"}, documentationLink = "%VERSION%/grid-export/index.html", availableInViewWizard = true, + propertyGroups = StudioActionPropertyGroups.ActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioListDataComponentActions.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioListDataComponentActions.java index f0dc4bc9a8..401113630b 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioListDataComponentActions.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioListDataComponentActions.java @@ -21,6 +21,7 @@ import io.jmix.flowui.kit.meta.StudioProperty; import io.jmix.flowui.kit.meta.StudioPropertyType; import io.jmix.flowui.kit.meta.StudioUiKit; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; @StudioUiKit interface StudioListDataComponentActions { @@ -31,6 +32,7 @@ interface StudioListDataComponentActions { classFqn = "io.jmix.flowui.action.list.CreateAction", documentationLink = "%VERSION%/flow-ui/actions/list-actions.html#list_create", availableInViewWizard = true, + propertyGroups = StudioActionPropertyGroups.PrimaryActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -62,6 +64,7 @@ interface StudioListDataComponentActions { classFqn = "io.jmix.flowui.action.list.EditAction", documentationLink = "%VERSION%/flow-ui/actions/list-actions.html#list_edit", availableInViewWizard = true, + propertyGroups = StudioActionPropertyGroups.ActionDefaultPropertiesWithoutShortcutCombination.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -94,6 +97,7 @@ interface StudioListDataComponentActions { classFqn = "io.jmix.flowui.action.list.RemoveAction", documentationLink = "%VERSION%/flow-ui/actions/list-actions.html#list_remove", availableInViewWizard = true, + propertyGroups = StudioActionPropertyGroups.DangerActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -124,6 +128,7 @@ interface StudioListDataComponentActions { classFqn = "io.jmix.flowui.action.list.AddAction", documentationLink = "%VERSION%/flow-ui/actions/list-actions.html#list_add", availableInViewWizard = true, + propertyGroups = StudioActionPropertyGroups.PrimaryActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -152,6 +157,7 @@ interface StudioListDataComponentActions { classFqn = "io.jmix.flowui.action.list.ExcludeAction", documentationLink = "%VERSION%/flow-ui/actions/list-actions.html#list_exclude", availableInViewWizard = true, + propertyGroups = StudioActionPropertyGroups.DangerActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -182,6 +188,7 @@ interface StudioListDataComponentActions { classFqn = "io.jmix.flowui.action.list.ReadAction", documentationLink = "%VERSION%/flow-ui/actions/list-actions.html#list_read", availableInViewWizard = true, + propertyGroups = StudioActionPropertyGroups.ActionDefaultPropertiesWithoutShortcutCombination.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -214,6 +221,7 @@ interface StudioListDataComponentActions { classFqn = "io.jmix.flowui.action.list.RefreshAction", documentationLink = "%VERSION%/flow-ui/actions/list-actions.html#list_refresh", availableInViewWizard = true, + propertyGroups = StudioActionPropertyGroups.ActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -236,6 +244,7 @@ interface StudioListDataComponentActions { type = "list_itemTracking", description = "Tracks the selected item from the bound ListDataComponent", classFqn = "io.jmix.flowui.action.list.ItemTrackingAction", + propertyGroups = StudioActionPropertyGroups.IconTextActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioMainViewActions.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioMainViewActions.java index f47f98f422..26dfb11771 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioMainViewActions.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioMainViewActions.java @@ -20,6 +20,7 @@ import io.jmix.flowui.kit.meta.StudioProperty; import io.jmix.flowui.kit.meta.StudioPropertyType; import io.jmix.flowui.kit.meta.StudioUiKit; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; @StudioUiKit interface StudioMainViewActions { @@ -28,6 +29,7 @@ interface StudioMainViewActions { type = "logout", description = "Logouts from application", classFqn = "io.jmix.flowui.action.security.LogoutAction", + propertyGroups = StudioActionPropertyGroups.ActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioPickerActions.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioPickerActions.java index 6df257baef..5b52b20eb2 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioPickerActions.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioPickerActions.java @@ -30,6 +30,15 @@ interface StudioPickerActions { "io.jmix.flowui.component.ListDataComponent" }, documentationLink = "%VERSION%/flow-ui/actions/declarative-actions.html", + propertyGroups = { + StudioPropertyGroups.ActionVariantWithDefaultDefaultValue.class, + StudioPropertyGroups.Description.class, + StudioPropertyGroups.EnabledWithTrueDefaultValue.class, + StudioPropertyGroups.RequiredId.class, + StudioPropertyGroups.ShortcutCombination.class, + StudioPropertyGroups.Text.class, + StudioPropertyGroups.Visible.class + }, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -52,6 +61,7 @@ interface StudioPickerActions { description = "Clears the value of picker component", classFqn = "io.jmix.flowui.action.valuepicker.ValueClearAction", documentationLink = "%VERSION%/flow-ui/actions/value-picker-actions.html#value_clear", + propertyGroups = StudioActionPropertyGroups.ActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -81,6 +91,7 @@ interface StudioPickerActions { "io.jmix.flowui.component.valuepicker.JmixMultiValuePicker" }, documentationLink = "%VERSION%/flow-ui/actions/entity-picker-actions.html#entity_clear", + propertyGroups = StudioActionPropertyGroups.ActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -110,6 +121,7 @@ interface StudioPickerActions { "io.jmix.flowui.component.valuepicker.JmixMultiValuePicker" }, documentationLink = "%VERSION%/flow-ui/actions/entity-picker-actions.html#entity_lookup", + propertyGroups = StudioActionPropertyGroups.ActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -143,6 +155,7 @@ interface StudioPickerActions { "io.jmix.flowui.component.valuepicker.JmixMultiValuePicker" }, documentationLink = "%VERSION%/flow-ui/actions/entity-picker-actions.html#entity_open", + propertyGroups = StudioActionPropertyGroups.ActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -176,6 +189,7 @@ interface StudioPickerActions { "io.jmix.flowui.component.valuepicker.JmixMultiValuePicker" }, documentationLink = "%VERSION%/flow-ui/actions/entity-picker-actions.html#entity_openComposition", + propertyGroups = StudioActionPropertyGroups.ActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -204,6 +218,7 @@ interface StudioPickerActions { classFqn = "io.jmix.flowui.action.multivaluepicker.MultiValueSelectAction", target = {"io.jmix.flowui.component.valuepicker.JmixMultiValuePicker"}, documentationLink = "%VERSION%/flow-ui/actions/value-picker-actions.html#multi_value_select", + propertyGroups = StudioActionPropertyGroups.ActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioReportsActions.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioReportsActions.java index 93858dd20b..eb22cdd0bf 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioReportsActions.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioReportsActions.java @@ -25,8 +25,8 @@ interface StudioReportsActions { type = "report_runReport", description = "A standard action that displays the list of all available reports.", classFqn = "io.jmix.reportsflowui.action.RunReportAction", - target = {"io.jmix.flowui.action.list.ListDataComponentAction"}, + propertyGroups = StudioActionPropertyGroups.RequiredIconTextActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -49,8 +49,8 @@ interface StudioReportsActions { type = "report_runSingleEntityReport", description = "A standard action for printing reports for entity instance.", classFqn = "io.jmix.reportsflowui.action.RunSingleEntityReportAction", - target = {"io.jmix.flowui.action.view.OperationResultViewAction"}, + propertyGroups = StudioActionPropertyGroups.RequiredIconTextActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -73,8 +73,8 @@ interface StudioReportsActions { type = "report_runListEntityReport", description = "A standard action for printing reports for entity instances associated with a list component (Table, DataGrid, etc.).", classFqn = "io.jmix.reportsflowui.action.RunListEntityReportAction", - target = {"io.jmix.flowui.action.list.ListDataComponentAction"}, + propertyGroups = StudioActionPropertyGroups.RequiredIconTextActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -96,8 +96,8 @@ interface StudioReportsActions { type = "report_showExecutionReportHistory", description = "A standard action for displaying the report execution history.", classFqn = "io.jmix.reportsflowui.action.ShowExecutionReportHistoryAction", - target = {"io.jmix.flowui.action.list.ListDataComponentAction"}, + propertyGroups = StudioActionPropertyGroups.RequiredIconTextActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioSecurityActions.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioSecurityActions.java index 53447a9a13..e4d2fd797c 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioSecurityActions.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioSecurityActions.java @@ -20,6 +20,7 @@ import io.jmix.flowui.kit.meta.StudioProperty; import io.jmix.flowui.kit.meta.StudioPropertyType; import io.jmix.flowui.kit.meta.StudioUiKit; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; @StudioUiKit(requiredDependencies = "io.jmix.security:jmix-security-flowui-starter") interface StudioSecurityActions { @@ -28,7 +29,7 @@ interface StudioSecurityActions { type = "sec_showRoleAssignments", description = "Shows the role assignments for the UserDetails instance", classFqn = "io.jmix.securityflowui.action.ShowRoleAssignmentsAction", - + propertyGroups = StudioActionPropertyGroups.ActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -53,7 +54,7 @@ interface StudioSecurityActions { type = "sec_showUserSubstitutions", description = "Shows the user substitutions", classFqn = "io.jmix.securityflowui.action.ShowUserSubstitutionsAction", - + propertyGroups = StudioActionPropertyGroups.ActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -77,7 +78,7 @@ interface StudioSecurityActions { type = "sec_assignToUsers", description = "Assign the role to selected users", classFqn = "io.jmix.securityflowui.action.AssignToUsersAction", - + propertyGroups = StudioActionPropertyGroups.ActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -101,7 +102,7 @@ interface StudioSecurityActions { type = "sec_changePassword", description = "Changes the password of the UserDetails instance", classFqn = "io.jmix.securityflowui.action.ChangePasswordAction", - + propertyGroups = StudioActionPropertyGroups.IconActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -125,7 +126,7 @@ interface StudioSecurityActions { type = "sec_resetPassword", description = "Resets the password of the UserDetails instance", classFqn = "io.jmix.securityflowui.action.ResetPasswordAction", - + propertyGroups = StudioActionPropertyGroups.IconActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -150,6 +151,13 @@ interface StudioSecurityActions { description = "An action that, depending on the number of substituted users, either opens a lookup view " + "to select a substituted user or shows a submenu with the substituted users.", classFqn = "io.jmix.securityflowui.action.UserMenuSubstituteUserAction", + propertyGroups = { + StudioPropertyGroups.Description.class, + StudioPropertyGroups.EnabledWithTrueDefaultValue.class, + StudioPropertyGroups.Visible.class, + StudioPropertyGroups.ShortcutCombination.class, + StudioPropertyGroups.ActionVariantWithDefaultDefaultValue.class + }, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID, required = true, diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioUserMenuActions.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioUserMenuActions.java index 7c0774d580..6dfd34c958 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioUserMenuActions.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioUserMenuActions.java @@ -20,6 +20,7 @@ import io.jmix.flowui.kit.meta.StudioProperty; import io.jmix.flowui.kit.meta.StudioPropertyType; import io.jmix.flowui.kit.meta.StudioUiKit; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; @StudioUiKit interface StudioUserMenuActions { @@ -30,6 +31,7 @@ interface StudioUserMenuActions { "'@JsModule(\"./src/theme/color-scheme-switching-support.js\")' " + "import to be added to the main application class", classFqn = "io.jmix.flowui.action.usermenu.UserMenuThemeSwitchAction", + propertyGroups = StudioActionPropertyGroups.IconActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioViewActions.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioViewActions.java index f8fb16870b..be97976e2e 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioViewActions.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/action/StudioViewActions.java @@ -21,6 +21,7 @@ import io.jmix.flowui.kit.meta.StudioProperty; import io.jmix.flowui.kit.meta.StudioPropertyType; import io.jmix.flowui.kit.meta.StudioUiKit; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; @StudioUiKit interface StudioViewActions { @@ -30,6 +31,7 @@ interface StudioViewActions { description = "Closes the view", classFqn = "io.jmix.flowui.action.view.ViewCloseAction", documentationLink = "%VERSION%/flow-ui/actions/view-actions.html#view_close", + propertyGroups = StudioActionPropertyGroups.ActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -58,6 +60,7 @@ interface StudioViewActions { description = "Selects item in lookup view", classFqn = "io.jmix.flowui.action.view.LookupSelectAction", documentationLink = "%VERSION%/flow-ui/actions/view-actions.html#lookup_select", + propertyGroups = StudioActionPropertyGroups.PrimaryActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -81,6 +84,7 @@ interface StudioViewActions { description = "Discards selection in lookup view", classFqn = "io.jmix.flowui.action.view.LookupDiscardAction", documentationLink = "%VERSION%/flow-ui/actions/view-actions.html#lookup_discard", + propertyGroups = StudioActionPropertyGroups.ActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -104,6 +108,7 @@ interface StudioViewActions { description = "Closes the detail view", classFqn = "io.jmix.flowui.action.view.DetailCloseAction", documentationLink = "%VERSION%/flow-ui/actions/view-actions.html#detail_close", + propertyGroups = StudioActionPropertyGroups.ActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -127,6 +132,7 @@ interface StudioViewActions { description = "Saves changes in the detail view", classFqn = "io.jmix.flowui.action.view.DetailSaveAction", documentationLink = "%VERSION%/flow-ui/actions/view-actions.html#detail_save", + propertyGroups = StudioActionPropertyGroups.ActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -150,6 +156,7 @@ interface StudioViewActions { description = "Saves changes and closes the detail view", classFqn = "io.jmix.flowui.action.view.DetailSaveCloseAction", documentationLink = "%VERSION%/flow-ui/actions/view-actions.html#detail_saveClose", + propertyGroups = StudioActionPropertyGroups.PrimaryActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -173,6 +180,7 @@ interface StudioViewActions { description = "Discards changes in the detail view", classFqn = "io.jmix.flowui.action.view.DetailDiscardAction", documentationLink = "%VERSION%/flow-ui/actions/view-actions.html#detail_discard", + propertyGroups = StudioActionPropertyGroups.ActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -196,6 +204,7 @@ interface StudioViewActions { description = "Enables editing in the detail view", classFqn = "io.jmix.flowui.action.view.DetailEnableEditingAction", documentationLink = "%VERSION%/flow-ui/actions/view-actions.html#detail_enableEditing", + propertyGroups = StudioActionPropertyGroups.ActionDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/actionsgroup/StudioActionsGroups.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/actionsgroup/StudioActionsGroups.java index 92eff686ce..0b2065cc29 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/actionsgroup/StudioActionsGroups.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/actionsgroup/StudioActionsGroups.java @@ -20,6 +20,7 @@ import io.jmix.flowui.kit.meta.StudioProperty; import io.jmix.flowui.kit.meta.StudioPropertyType; import io.jmix.flowui.kit.meta.StudioUiKit; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; @StudioUiKit interface StudioActionsGroups { @@ -56,6 +57,9 @@ interface StudioActionsGroups { name = "Actions", actionClassFqn = "io.jmix.flowui.action.list.ListDataComponentAction", target = {"io.jmix.flowui.component.ListDataComponent"}, + propertyGroups = { + StudioPropertyGroups.ShowInContextMenuEnabled.class + }, properties = { @StudioProperty( xmlAttribute = "showInContextMenuEnabled", diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/component/StudioComponents.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/component/StudioComponents.java index dc361a2bd2..951847ef21 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/component/StudioComponents.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/component/StudioComponents.java @@ -68,6 +68,7 @@ import io.jmix.flowui.kit.meta.component.preview.StudioGenericComponentPreview; @StudioUiKit +@SuppressWarnings("rawtypes") interface StudioComponents { @StudioComponent( @@ -75,6 +76,7 @@ interface StudioComponents { classFqn = "com.vaadin.flow.component.Component", category = "Components", xmlElement = "component", + propertyGroups = StudioPropertyGroups.BasicComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID), @StudioProperty(xmlAttribute = "css", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.STRING), @@ -101,6 +103,7 @@ interface StudioComponents { category = "Components", xmlElement = "fragment", icon = "io/jmix/flowui/kit/meta/icon/component/fragment.svg", + propertyGroups = StudioPropertyGroups.BasicComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID), @StudioProperty(xmlAttribute = "css", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.STRING), @@ -128,6 +131,13 @@ interface StudioComponents { xmlElement = "avatar", icon = "io/jmix/flowui/kit/meta/icon/component/avatar.svg", documentationLink = "%VERSION%/flow-ui/vc/components/avatar.html", + propertyGroups = { + StudioPropertyGroups.AlignSelfAndJustifySelfAndColspan.class, + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.Size.class, + StudioPropertyGroups.Name.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -170,6 +180,9 @@ interface StudioComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "svgIcon"), @StudioConvertStrategy.TagInfo(qualifiedName = "fontIcon"), }), + propertyGroups = { + StudioPropertyGroups.IconDefaultProperties.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -203,6 +216,9 @@ interface StudioComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "icon"), @StudioConvertStrategy.TagInfo(qualifiedName = "fontIcon") }), + propertyGroups = { + StudioPropertyGroups.SvgIconDefaultProperties.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -237,6 +253,9 @@ interface StudioComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "icon"), @StudioConvertStrategy.TagInfo(qualifiedName = "svgIcon") }), + propertyGroups = { + StudioPropertyGroups.FontIconDefaultProperties.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -275,6 +294,11 @@ interface StudioComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "numberField"), @StudioConvertStrategy.TagInfo(qualifiedName = "integerField"), }), + propertyGroups = { + StudioPropertyGroups.TextInputFieldDefaultProperties.class, + StudioPropertyGroups.Property.class, + StudioPropertyGroups.FieldThemeTitleAndValueChangeDefaultProperties.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -366,6 +390,17 @@ interface StudioComponents { convertStrategy = @StudioConvertStrategy(tagsToConvertInto = { @StudioConvertStrategy.TagInfo(qualifiedName = "comboButton") }), + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.AriaLabelAndTabIndexAndFocusShortcut.class, + StudioPropertyGroups.Autofocus.class, + StudioPropertyGroups.LookAndFeelIcon.class, + StudioPropertyGroups.ShortcutCombination.class, + StudioPropertyGroups.Text.class, + StudioPropertyGroups.ButtonThemeNames.class, + StudioPropertyGroups.Title.class, + StudioPropertyGroups.WhiteSpace.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -426,6 +461,18 @@ interface StudioComponents { convertStrategy = @StudioConvertStrategy(tagsToConvertInto = { @StudioConvertStrategy.TagInfo(qualifiedName = "radioButtonGroup") }), + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.RequiredAndRequiredMessageAndErrorMessage.class, + StudioPropertyGroups.AriaLabelAndLabelledBy.class, + StudioPropertyGroups.CollectionOrInstanceDataContainer.class, + StudioPropertyGroups.HelperText.class, + StudioPropertyGroups.ItemsContainerTypeParameterT.class, + StudioPropertyGroups.ItemsEnum.class, + StudioPropertyGroups.Label.class, + StudioPropertyGroups.PropertyTypeParameterV.class, + StudioPropertyGroups.ReadOnly.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -491,6 +538,18 @@ interface StudioComponents { xmlElement = "checkbox", icon = "io/jmix/flowui/kit/meta/icon/component/checkbox.svg", documentationLink = "%VERSION%/flow-ui/vc/components/checkbox.html", + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.AriaLabelAndTabIndexAndFocusShortcut.class, + StudioPropertyGroups.RequiredAndRequiredMessageAndErrorMessage.class, + StudioPropertyGroups.Autofocus.class, + StudioPropertyGroups.ClickShortcut.class, + StudioPropertyGroups.CollectionOrInstanceDataContainer.class, + StudioPropertyGroups.Indeterminate.class, + StudioPropertyGroups.Label.class, + StudioPropertyGroups.PropertyTypeParameterV.class, + StudioPropertyGroups.ReadOnly.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -551,6 +610,17 @@ interface StudioComponents { xmlElement = "switch", icon = "io/jmix/flowui/kit/meta/icon/component/checkbox.svg", documentationLink = "%VERSION%/flow-ui/vc/components/switch.html", + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.AriaLabelAndTabIndexAndFocusShortcut.class, + StudioPropertyGroups.RequiredAndRequiredMessageAndErrorMessage.class, + StudioPropertyGroups.Autofocus.class, + StudioPropertyGroups.ClickShortcut.class, + StudioPropertyGroups.CollectionOrInstanceDataContainer.class, + StudioPropertyGroups.Label.class, + StudioPropertyGroups.PropertyTypeParameterV.class, + StudioPropertyGroups.ReadOnly.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -613,6 +683,21 @@ interface StudioComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "select"), @StudioConvertStrategy.TagInfo(qualifiedName = "multiSelectComboBox") }), + propertyGroups = { + StudioPropertyGroups.FieldDefaultProperties.class, + StudioPropertyGroups.AllowCustomValue.class, + StudioPropertyGroups.Autofocus.class, + StudioPropertyGroups.Datatype.class, + StudioPropertyGroups.OverlayWidth.class, + StudioPropertyGroups.ClearButtonVisible.class, + StudioPropertyGroups.ItemsEnum.class, + StudioPropertyGroups.PageSize.class, + StudioPropertyGroups.Pattern.class, + StudioPropertyGroups.Placeholder.class, + StudioPropertyGroups.PropertyTypeParameterV.class, + StudioPropertyGroups.ComboBoxThemeNames.class, + StudioPropertyGroups.Title.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -698,6 +783,7 @@ interface StudioComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "select"), @StudioConvertStrategy.TagInfo(qualifiedName = "comboBox") }), + propertyGroups = StudioPropertyGroups.MultiSelectComboBoxDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -788,6 +874,7 @@ interface StudioComponents { xmlElement = "multiSelectComboBoxPicker", icon = "io/jmix/flowui/kit/meta/icon/component/comboBox.svg", documentationLink = "%VERSION%/flow-ui/vc/components/multiSelectComboBoxPicker.html", + propertyGroups = StudioPropertyGroups.MultiSelectComboBoxDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -871,8 +958,17 @@ interface StudioComponents { category = "Components", xmlElement = "userMenu", icon = "io/jmix/flowui/kit/meta/icon/mainview/userIndicator.svg", - // TODO: gg, add link when available -// documentationLink = "%VERSION%/flow-ui/vc/components/userMenu.html", + documentationLink = "%VERSION%/flow-ui/vc/components/userMenu.html", + propertyGroups = { + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.EnabledWithTrueDefaultValue.class, + StudioPropertyGroups.OpenOnHover.class, + StudioPropertyGroups.AlignSelfAndJustifySelfAndColspan.class, + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.TabIndex.class, + StudioPropertyGroups.FocusShortcut.class, + StudioPropertyGroups.Title.class + }, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID), @StudioProperty(xmlAttribute = "enabled", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.BOOLEAN, @@ -908,6 +1004,16 @@ interface StudioComponents { xmlElement = "dropdownButton", icon = "io/jmix/flowui/kit/meta/icon/component/dropdownButton.svg", documentationLink = "%VERSION%/flow-ui/vc/components/dropdownButton.html", + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.LookAndFeelIcon.class, + StudioPropertyGroups.OpenOnHover.class, + StudioPropertyGroups.TabIndex.class, + StudioPropertyGroups.FocusShortcut.class, + StudioPropertyGroups.Text.class, + StudioPropertyGroups.Title.class, + StudioPropertyGroups.WhiteSpace.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -961,6 +1067,16 @@ interface StudioComponents { convertStrategy = @StudioConvertStrategy(tagsToConvertInto = { @StudioConvertStrategy.TagInfo(qualifiedName = "button") }), + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.ShortcutCombination.class, + StudioPropertyGroups.OpenOnHover.class, + StudioPropertyGroups.TabIndex.class, + StudioPropertyGroups.FocusShortcut.class, + StudioPropertyGroups.Text.class, + StudioPropertyGroups.Title.class, + StudioPropertyGroups.WhiteSpace.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1016,6 +1132,19 @@ interface StudioComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "timePicker"), @StudioConvertStrategy.TagInfo(qualifiedName = "dateTimePicker") }), + propertyGroups = { + StudioPropertyGroups.FieldDefaultProperties.class, + StudioPropertyGroups.AllowedCharPattern.class, + StudioPropertyGroups.AutoOpen.class, + StudioPropertyGroups.ClearButtonVisible.class, + StudioPropertyGroups.ValidationStringMax.class, + StudioPropertyGroups.ValidationStringMin.class, + StudioPropertyGroups.Opened.class, + StudioPropertyGroups.Placeholder.class, + StudioPropertyGroups.PropertyTypeParameterV.class, + StudioPropertyGroups.ComboBoxThemeNames.class, + StudioPropertyGroups.WeekNumbersVisible.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1095,6 +1224,16 @@ interface StudioComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "datePicker"), @StudioConvertStrategy.TagInfo(qualifiedName = "timePicker") }), + propertyGroups = { + StudioPropertyGroups.FieldDefaultProperties.class, + StudioPropertyGroups.AutoOpen.class, + StudioPropertyGroups.ValidationStringMax.class, + StudioPropertyGroups.ValidationStringMin.class, + StudioPropertyGroups.PropertyTypeParameterV.class, + StudioPropertyGroups.TimeStep.class, + StudioPropertyGroups.ThemeNames.class, + StudioPropertyGroups.WeekNumbersVisible.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1165,6 +1304,15 @@ interface StudioComponents { xmlElement = "drawerToggle", icon = "io/jmix/flowui/kit/meta/icon/component/drawerToggle.svg", documentationLink = "%VERSION%/flow-ui/vc/components/drawerToggle.html", + propertyGroups = { + StudioPropertyGroups.AlignSelfAndJustifySelfAndColspan.class, + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.Size.class, + StudioPropertyGroups.AriaLabelAndTabIndexAndFocusShortcut.class, + StudioPropertyGroups.ClickShortcut.class, + StudioPropertyGroups.ThemeNames.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1204,6 +1352,14 @@ interface StudioComponents { category = "Components", xmlElement = "sidePanelLayoutCloser", icon = "io/jmix/flowui/kit/meta/icon/component/sidePanelLayoutCloser.svg", + propertyGroups = { + StudioPropertyGroups.AlignSelfAndJustifySelfAndColspan.class, + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.Size.class, + StudioPropertyGroups.AriaLabelAndTabIndexAndFocusShortcut.class, + StudioPropertyGroups.ThemeNames.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1245,6 +1401,15 @@ interface StudioComponents { convertStrategy = @StudioConvertStrategy(tagsToConvertInto = { @StudioConvertStrategy.TagInfo(qualifiedName = "textField") }), + propertyGroups = { + StudioPropertyGroups.TextInputFieldDefaultProperties.class, + StudioPropertyGroups.AllowedCharPattern.class, + StudioPropertyGroups.MaxLength.class, + StudioPropertyGroups.MinLength.class, + StudioPropertyGroups.Pattern.class, + StudioPropertyGroups.Property.class, + StudioPropertyGroups.FieldThemeTitleAndValueChangeDefaultProperties.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1341,6 +1506,23 @@ interface StudioComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "comboBox"), @StudioConvertStrategy.TagInfo(qualifiedName = "entityPicker") }), + propertyGroups = { + StudioPropertyGroups.FieldDefaultProperties.class, + StudioPropertyGroups.AllowedCharPattern.class, + StudioPropertyGroups.AllowCustomValue.class, + StudioPropertyGroups.Autofocus.class, + StudioPropertyGroups.AutoOpen.class, + StudioPropertyGroups.OverlayWidth.class, + StudioPropertyGroups.ItemsContainerTypeParameterV.class, + StudioPropertyGroups.MetaClassTypeParameterV.class, + StudioPropertyGroups.Opened.class, + StudioPropertyGroups.PageSize.class, + StudioPropertyGroups.Pattern.class, + StudioPropertyGroups.Placeholder.class, + StudioPropertyGroups.PropertyTypeParameterV.class, + StudioPropertyGroups.ComboBoxThemeNames.class, + StudioPropertyGroups.Title.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1434,6 +1616,16 @@ interface StudioComponents { ) }) }), + propertyGroups = { + StudioPropertyGroups.FieldDefaultProperties.class, + StudioPropertyGroups.AllowCustomValue.class, + StudioPropertyGroups.Autofocus.class, + StudioPropertyGroups.MetaClassTypeParameterV.class, + StudioPropertyGroups.Placeholder.class, + StudioPropertyGroups.PropertyTypeParameterV.class, + StudioPropertyGroups.ThemeNames.class, + StudioPropertyGroups.Title.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1501,6 +1693,41 @@ interface StudioComponents { convertStrategy = @StudioConvertStrategy(tagsToConvertInto = { @StudioConvertStrategy.TagInfo(qualifiedName = "treeDataGrid") }), + propertyGroups = { + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.EnabledWithTrueDefaultValue.class, + StudioPropertyGroups.GridAlignSelf.class, + StudioPropertyGroups.JustifySelf.class, + StudioPropertyGroups.AriaLabel.class, + StudioPropertyGroups.Aggregatable.class, + StudioPropertyGroups.AggregationPosition.class, + StudioPropertyGroups.AllRowsVisible.class, + StudioPropertyGroups.Colspan.class, + StudioPropertyGroups.ColumnReorderingAllowed.class, + StudioPropertyGroups.CollectionDataContainer.class, + StudioPropertyGroups.DetailsVisibleOnClick.class, + StudioPropertyGroups.DropMode.class, + StudioPropertyGroups.EmptyStateText.class, + StudioPropertyGroups.Height.class, + StudioPropertyGroups.MaxHeight.class, + StudioPropertyGroups.MaxWidth.class, + StudioPropertyGroups.MetaClassTypeParameterE.class, + StudioPropertyGroups.MinHeight.class, + StudioPropertyGroups.MultiSort.class, + StudioPropertyGroups.MultiSortOnShiftClickOnly.class, + StudioPropertyGroups.MultiSortPriority.class, + StudioPropertyGroups.NestedNullBehavior.class, + StudioPropertyGroups.PageSizeWithDefaultValue50.class, + StudioPropertyGroups.RowsDraggable.class, + StudioPropertyGroups.SelectionMode.class, + StudioPropertyGroups.TabIndex.class, + StudioPropertyGroups.FocusShortcut.class, + StudioPropertyGroups.GridThemeNames.class, + StudioPropertyGroups.WidthWithInitialValue100.class, + StudioPropertyGroups.EditorBuffered.class, + StudioPropertyGroups.ColumnRendering.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1540,8 +1767,7 @@ interface StudioComponents { @StudioProperty(xmlAttribute = "maxWidth", category = StudioProperty.Category.SIZE, type = StudioPropertyType.SIZE, options = {"AUTO", "100%"}), @StudioProperty(xmlAttribute = "metaClass", category = StudioProperty.Category.DATA_BINDING, type = StudioPropertyType.ENTITY_NAME, typeParameter = "E"), @StudioProperty(xmlAttribute = "minHeight", category = StudioProperty.Category.SIZE, type = StudioPropertyType.SIZE, options = {"AUTO", "100%"}), - @StudioProperty(xmlAttribute = "minWidth", category = StudioProperty.Category.SIZE, - type = StudioPropertyType.SIZE, options = {"AUTO", "100%"}, + @StudioProperty(xmlAttribute = "minWidth", category = StudioProperty.Category.SIZE, type = StudioPropertyType.SIZE, options = {"AUTO", "100%"}, initialValue = "100px"), @StudioProperty(xmlAttribute = "multiSort", type = StudioPropertyType.BOOLEAN, defaultValue = "false"), @@ -1592,6 +1818,39 @@ interface StudioComponents { convertStrategy = @StudioConvertStrategy(tagsToConvertInto = { @StudioConvertStrategy.TagInfo(qualifiedName = "dataGrid") }), + propertyGroups = { + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.EnabledWithTrueDefaultValue.class, + StudioPropertyGroups.GridAlignSelf.class, + StudioPropertyGroups.JustifySelf.class, + StudioPropertyGroups.AriaLabel.class, + StudioPropertyGroups.AggregationPosition.class, + StudioPropertyGroups.AllRowsVisible.class, + StudioPropertyGroups.Colspan.class, + StudioPropertyGroups.ColumnReorderingAllowed.class, + StudioPropertyGroups.CollectionDataContainer.class, + StudioPropertyGroups.DropMode.class, + StudioPropertyGroups.EmptyStateText.class, + StudioPropertyGroups.Height.class, + StudioPropertyGroups.MaxHeight.class, + StudioPropertyGroups.MaxWidth.class, + StudioPropertyGroups.MetaClassTypeParameterE.class, + StudioPropertyGroups.MinHeight.class, + StudioPropertyGroups.MultiSort.class, + StudioPropertyGroups.MultiSortOnShiftClickOnly.class, + StudioPropertyGroups.MultiSortPriority.class, + StudioPropertyGroups.NestedNullBehavior.class, + StudioPropertyGroups.PageSizeWithDefaultValue50.class, + StudioPropertyGroups.RowsDraggable.class, + StudioPropertyGroups.SelectionMode.class, + StudioPropertyGroups.TabIndex.class, + StudioPropertyGroups.FocusShortcut.class, + StudioPropertyGroups.GridThemeNames.class, + StudioPropertyGroups.WidthWithInitialValue100.class, + StudioPropertyGroups.EditorBuffered.class, + StudioPropertyGroups.ColumnRendering.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1693,6 +1952,12 @@ interface StudioComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "bigDecimalField"), @StudioConvertStrategy.TagInfo(qualifiedName = "numberField") }), + propertyGroups = { + StudioPropertyGroups.TextInputFieldDefaultProperties.class, + StudioPropertyGroups.Property.class, + StudioPropertyGroups.StepButtonsVisible.class, + StudioPropertyGroups.FieldThemeTitleAndValueChangeDefaultProperties.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1791,6 +2056,16 @@ interface StudioComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "integerField"), @StudioConvertStrategy.TagInfo(qualifiedName = "bigDecimalField") }), + propertyGroups = { + StudioPropertyGroups.TextInputFieldDefaultProperties.class, + StudioPropertyGroups.AllowedCharPattern.class, + StudioPropertyGroups.ValidationDoubleMax.class, + StudioPropertyGroups.ValidationDoubleMin.class, + StudioPropertyGroups.Property.class, + StudioPropertyGroups.Step.class, + StudioPropertyGroups.StepButtonsVisible.class, + StudioPropertyGroups.FieldThemeTitleAndValueChangeDefaultProperties.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1888,6 +2163,13 @@ interface StudioComponents { convertStrategy = @StudioConvertStrategy(tagsToConvertInto = { @StudioConvertStrategy.TagInfo(qualifiedName = "textField") }), + propertyGroups = { + StudioPropertyGroups.TextInputFieldDefaultProperties.class, + StudioPropertyGroups.AllowedCharPattern.class, + StudioPropertyGroups.Pattern.class, + StudioPropertyGroups.Property.class, + StudioPropertyGroups.FieldThemeTitleAndValueChangeDefaultProperties.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1980,6 +2262,15 @@ interface StudioComponents { xmlElement = "progressBar", icon = "io/jmix/flowui/kit/meta/icon/component/progressBar.svg", documentationLink = "%VERSION%/flow-ui/vc/components/progressBar.html", + propertyGroups = { + StudioPropertyGroups.AlignSelfAndJustifySelfAndColspan.class, + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.Size.class, + StudioPropertyGroups.Indeterminate.class, + StudioPropertyGroups.ValidationDoubleMax.class, + StudioPropertyGroups.ValidationDoubleMin.class, + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -2022,6 +2313,20 @@ interface StudioComponents { convertStrategy = @StudioConvertStrategy(tagsToConvertInto = { @StudioConvertStrategy.TagInfo(qualifiedName = "checkBoxGroup") }), + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.AriaLabelAndLabelledBy.class, + StudioPropertyGroups.CollectionOrInstanceDataContainer.class, + StudioPropertyGroups.Datatype.class, + StudioPropertyGroups.ErrorMessage.class, + StudioPropertyGroups.HelperText.class, + StudioPropertyGroups.ItemsContainerTypeParameterV.class, + StudioPropertyGroups.ItemsEnum.class, + StudioPropertyGroups.Label.class, + StudioPropertyGroups.PropertyTypeParameterV.class, + StudioPropertyGroups.ReadOnly.class, + StudioPropertyGroups.Required.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -2093,6 +2398,15 @@ interface StudioComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "multiSelectComboBox"), @StudioConvertStrategy.TagInfo(qualifiedName = "multiSelectComboBoxPicker") }), + propertyGroups = { + StudioPropertyGroups.FieldDefaultProperties.class, + StudioPropertyGroups.Autofocus.class, + StudioPropertyGroups.Datatype.class, + StudioPropertyGroups.OverlayWidth.class, + StudioPropertyGroups.ItemsContainerTypeParameterT.class, + StudioPropertyGroups.Placeholder.class, + StudioPropertyGroups.PropertyTypeParameterV.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -2185,6 +2499,12 @@ interface StudioComponents { xmlElement = "tabs", icon = "io/jmix/flowui/kit/meta/icon/component/tabs.svg", documentationLink = "%VERSION%/flow-ui/vc/components/tabs.html", + propertyGroups = { + StudioPropertyGroups.AlignSelfAndJustifySelfAndColspan.class, + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.Size.class, + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -2238,6 +2558,7 @@ interface StudioComponents { ) } ), + propertyGroups = StudioPropertyGroups.ListBoxDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -2301,6 +2622,7 @@ interface StudioComponents { ) } ), + propertyGroups = StudioPropertyGroups.ListBoxDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -2354,6 +2676,32 @@ interface StudioComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "codeEditor"), @StudioConvertStrategy.TagInfo(qualifiedName = "richTextEditor") }), + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.AriaLabelAndTabIndexAndFocusShortcut.class, + StudioPropertyGroups.AllowedCharPattern.class, + StudioPropertyGroups.Autocapitalize.class, + StudioPropertyGroups.Autocomplete.class, + StudioPropertyGroups.Autocorrect.class, + StudioPropertyGroups.Autofocus.class, + StudioPropertyGroups.Autoselect.class, + StudioPropertyGroups.ClearButtonVisible.class, + StudioPropertyGroups.CollectionOrInstanceDataContainer.class, + StudioPropertyGroups.ErrorMessage.class, + StudioPropertyGroups.HelperText.class, + StudioPropertyGroups.Label.class, + StudioPropertyGroups.MaxLength.class, + StudioPropertyGroups.MinLength.class, + StudioPropertyGroups.Pattern.class, + StudioPropertyGroups.Placeholder.class, + StudioPropertyGroups.Property.class, + StudioPropertyGroups.ReadOnly.class, + StudioPropertyGroups.Required.class, + StudioPropertyGroups.TrimEnabled.class, + StudioPropertyGroups.FieldThemeNames.class, + StudioPropertyGroups.ValueChangeMode.class, + StudioPropertyGroups.ValueChangeTimeout.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -2460,6 +2808,17 @@ interface StudioComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "integerField"), @StudioConvertStrategy.TagInfo(qualifiedName = "bigDecimalField") }), + propertyGroups = { + StudioPropertyGroups.TextInputFieldDefaultProperties.class, + StudioPropertyGroups.AllowedCharPattern.class, + StudioPropertyGroups.Datatype.class, + StudioPropertyGroups.MaxLength.class, + StudioPropertyGroups.MinLength.class, + StudioPropertyGroups.Pattern.class, + StudioPropertyGroups.PropertyTypeParameterV.class, + StudioPropertyGroups.FieldThemeTitleAndValueChangeDefaultProperties.class, + StudioPropertyGroups.TrimEnabled.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -2561,6 +2920,17 @@ interface StudioComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "datePicker"), @StudioConvertStrategy.TagInfo(qualifiedName = "dateTimePicker"), }), + propertyGroups = { + StudioPropertyGroups.FieldDefaultProperties.class, + StudioPropertyGroups.AllowedCharPattern.class, + StudioPropertyGroups.AutoOpen.class, + StudioPropertyGroups.ClearButtonVisible.class, + StudioPropertyGroups.ValidationStringMax.class, + StudioPropertyGroups.ValidationStringMin.class, + StudioPropertyGroups.Placeholder.class, + StudioPropertyGroups.PropertyTypeParameterV.class, + StudioPropertyGroups.TimeStep.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -2629,6 +2999,7 @@ interface StudioComponents { xmlElement = "valuePicker", icon = "io/jmix/flowui/kit/meta/icon/component/valuePicker.svg", documentationLink = "%VERSION%/flow-ui/vc/components/valuePicker.html", + propertyGroups = StudioPropertyGroups.ValuePickerDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -2691,6 +3062,7 @@ interface StudioComponents { xmlElement = "multiValuePicker", icon = "io/jmix/flowui/kit/meta/icon/component/multiValuePicker.svg", documentationLink = "%VERSION%/flow-ui/vc/components/multiValuePicker.html", + propertyGroups = StudioPropertyGroups.ValuePickerDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -2753,6 +3125,12 @@ interface StudioComponents { xmlElement = "loginForm", icon = "io/jmix/flowui/kit/meta/icon/component/loginForm.svg", documentationLink = "%VERSION%/flow-ui/vc/components/loginForm.html", + propertyGroups = { + StudioPropertyGroups.AlignSelfAndJustifySelfAndColspan.class, + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.EnabledWithTrueDefaultValue.class, + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -2786,6 +3164,13 @@ interface StudioComponents { category = "Components", xmlElement = "loginOverlay", icon = "io/jmix/flowui/kit/meta/icon/component/loginOverlay.svg", + propertyGroups = { + StudioPropertyGroups.AlignSelfAndJustifySelfAndColspan.class, + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.EnabledWithTrueDefaultValue.class, + StudioPropertyGroups.Opened.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -2807,7 +3192,6 @@ interface StudioComponents { @StudioProperty(xmlAttribute = "visible", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.BOOLEAN, defaultValue = "true") } - ) LoginOverlay loginOverlay(); @@ -2818,6 +3202,11 @@ interface StudioComponents { xmlElement = "simplePagination", icon = "io/jmix/flowui/kit/meta/icon/component/simplePagination.svg", documentationLink = "%VERSION%/flow-ui/vc/components/simplePagination.html", + propertyGroups = { + StudioPropertyGroups.AlignSelfAndJustifySelfAndColspan.class, + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.IdAndVisible.class, + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -2854,6 +3243,12 @@ interface StudioComponents { xmlElement = "upload", icon = "io/jmix/flowui/kit/meta/icon/component/upload.svg", documentationLink = "%VERSION%/flow-ui/vc/components/upload.html", + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.MaxFileSize.class, + StudioPropertyGroups.UploadText.class, + StudioPropertyGroups.UploadIcon.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -2909,6 +3304,32 @@ interface StudioComponents { convertStrategy = @StudioConvertStrategy(tagsToConvertInto = { @StudioConvertStrategy.TagInfo(qualifiedName = "fileStorageUploadField") }), + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.RequiredAndRequiredMessageAndErrorMessage.class, + StudioPropertyGroups.AcceptedFileTypes.class, + StudioPropertyGroups.ClearButtonAriaLabel.class, + StudioPropertyGroups.ClearButtonVisible.class, + StudioPropertyGroups.ConnectingStatusText.class, + StudioPropertyGroups.CollectionOrInstanceDataContainer.class, + StudioPropertyGroups.DropAllowed.class, + StudioPropertyGroups.FileNameVisible.class, + StudioPropertyGroups.FileNotSelectedText.class, + StudioPropertyGroups.FileTooBigText.class, + StudioPropertyGroups.HelperText.class, + StudioPropertyGroups.IncorrectFileTypeText.class, + StudioPropertyGroups.Label.class, + StudioPropertyGroups.MaxFileSize.class, + StudioPropertyGroups.ProcessingStatusText.class, + StudioPropertyGroups.Property.class, + StudioPropertyGroups.ReadOnly.class, + StudioPropertyGroups.RemainingTimeText.class, + StudioPropertyGroups.RemainingTimeUnknownText.class, + StudioPropertyGroups.UploadDialogCancelText.class, + StudioPropertyGroups.UploadDialogTitle.class, + StudioPropertyGroups.UploadIcon.class, + StudioPropertyGroups.UploadText.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -2983,6 +3404,34 @@ interface StudioComponents { convertStrategy = @StudioConvertStrategy(tagsToConvertInto = { @StudioConvertStrategy.TagInfo(qualifiedName = "fileUploadField") }), + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.RequiredAndRequiredMessageAndErrorMessage.class, + StudioPropertyGroups.AcceptedFileTypes.class, + StudioPropertyGroups.ClearButtonAriaLabel.class, + StudioPropertyGroups.ClearButtonVisible.class, + StudioPropertyGroups.ConnectingStatusText.class, + StudioPropertyGroups.CollectionOrInstanceDataContainer.class, + StudioPropertyGroups.DropAllowed.class, + StudioPropertyGroups.FileNameVisible.class, + StudioPropertyGroups.FileNotSelectedText.class, + StudioPropertyGroups.FileStorageName.class, + StudioPropertyGroups.FileStoragePutMode.class, + StudioPropertyGroups.FileTooBigText.class, + StudioPropertyGroups.HelperText.class, + StudioPropertyGroups.IncorrectFileTypeText.class, + StudioPropertyGroups.Label.class, + StudioPropertyGroups.MaxFileSize.class, + StudioPropertyGroups.ProcessingStatusText.class, + StudioPropertyGroups.Property.class, + StudioPropertyGroups.ReadOnly.class, + StudioPropertyGroups.RemainingTimeText.class, + StudioPropertyGroups.RemainingTimeUnknownText.class, + StudioPropertyGroups.UploadDialogCancelText.class, + StudioPropertyGroups.UploadDialogTitle.class, + StudioPropertyGroups.UploadIcon.class, + StudioPropertyGroups.UploadText.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -3056,6 +3505,11 @@ interface StudioComponents { xmlElement = "genericFilter", icon = "io/jmix/flowui/kit/meta/icon/component/genericFilter.svg", documentationLink = "%VERSION%/flow-ui/vc/components/genericFilter.html", + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.DataLoader.class, + StudioPropertyGroups.DetailsThemeNames.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -3108,6 +3562,22 @@ interface StudioComponents { maxCount = 1 ) ), + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.AriaLabelAndTabIndexAndFocusShortcut.class, + StudioPropertyGroups.RequiredAndRequiredMessageAndErrorMessage.class, + StudioPropertyGroups.AutoApply.class, + StudioPropertyGroups.DataLoader.class, + StudioPropertyGroups.DefaultValue.class, + StudioPropertyGroups.HelperText.class, + StudioPropertyGroups.Label.class, + StudioPropertyGroups.LabelVisible.class, + StudioPropertyGroups.LabelWidth.class, + StudioPropertyGroups.OperationTextVisible.class, + StudioPropertyGroups.ParameterName.class, + StudioPropertyGroups.ReadOnly.class, + StudioPropertyGroups.ThemeNames.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -3179,6 +3649,22 @@ interface StudioComponents { xmlElement = "jpqlFilter", icon = "io/jmix/flowui/kit/meta/icon/component/jpqlFilter.svg", documentationLink = "%VERSION%/flow-ui/vc/components/genericFilter-components.html#jpql-filter", + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.AriaLabelAndTabIndexAndFocusShortcut.class, + StudioPropertyGroups.RequiredAndRequiredMessageAndErrorMessage.class, + StudioPropertyGroups.AutoApply.class, + StudioPropertyGroups.DataLoader.class, + StudioPropertyGroups.DefaultValue.class, + StudioPropertyGroups.HasInExpression.class, + StudioPropertyGroups.HelperText.class, + StudioPropertyGroups.Label.class, + StudioPropertyGroups.LabelVisible.class, + StudioPropertyGroups.LabelWidth.class, + StudioPropertyGroups.ParameterName.class, + StudioPropertyGroups.ReadOnly.class, + StudioPropertyGroups.ThemeNames.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -3241,6 +3727,16 @@ interface StudioComponents { xmlElement = "groupFilter", icon = "io/jmix/flowui/kit/meta/icon/component/groupFilter.svg", documentationLink = "%VERSION%/flow-ui/vc/components/genericFilter-components.html#group-filter", + propertyGroups = { + StudioPropertyGroups.AlignSelfAndJustifySelfAndColspan.class, + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.EnabledWithTrueDefaultValue.class, + StudioPropertyGroups.AutoApply.class, + StudioPropertyGroups.DataLoader.class, + StudioPropertyGroups.OperationTextVisible.class, + StudioPropertyGroups.SummaryText.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -3268,7 +3764,6 @@ interface StudioComponents { @StudioProperty(xmlAttribute = "visible", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.BOOLEAN, defaultValue = "true"), } - ) HorizontalLayout groupFilter(); @@ -3276,6 +3771,19 @@ interface StudioComponents { name = "Layout", xmlElement = "layout", icon = "io/jmix/flowui/kit/meta/icon/view/layout.svg", + propertyGroups = { + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.EnabledWithTrueDefaultValue.class, + StudioPropertyGroups.MaxHeight.class, + StudioPropertyGroups.MaxWidth.class, + StudioPropertyGroups.MinHeight.class, + StudioPropertyGroups.MinWidth.class, + StudioPropertyGroups.WidthWithDefaultValue100.class, + StudioPropertyGroups.Padding.class, + StudioPropertyGroups.Spacing.class, + StudioPropertyGroups.AlignItems.class, + StudioPropertyGroups.JustifyContent.class + }, properties = { @StudioProperty(xmlAttribute = "classNames", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.VALUES_LIST), @StudioProperty(xmlAttribute = "css", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.STRING), @@ -3326,6 +3834,9 @@ interface StudioComponents { @StudioAvailableChildrenInfo.TagInfo(qualifiedName = "layout", maxCount = 1) } ), + propertyGroups = { + StudioPropertyGroups.Title.class + }, properties = { @StudioProperty(xmlAttribute = "focusComponent", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_REF), @StudioProperty(xmlAttribute = "focusMode", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.VALUES_LIST, @@ -3349,6 +3860,18 @@ interface StudioComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "textArea"), @StudioConvertStrategy.TagInfo(qualifiedName = "richTextEditor") }), + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.RequiredAndRequiredMessageAndErrorMessage.class, + StudioPropertyGroups.CollectionOrInstanceDataContainer.class, + StudioPropertyGroups.HelperText.class, + StudioPropertyGroups.Label.class, + StudioPropertyGroups.Property.class, + StudioPropertyGroups.ReadOnly.class, + StudioPropertyGroups.TabIndex.class, + StudioPropertyGroups.FocusShortcut.class, + StudioPropertyGroups.Title.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -3461,6 +3984,13 @@ interface StudioComponents { category = "Components", xmlElement = "virtualList", icon = "io/jmix/flowui/kit/meta/icon/component/virtualList.svg", + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.ItemsContainerTypeParameterV.class, + StudioPropertyGroups.ItemsEnum.class, + StudioPropertyGroups.TabIndex.class, + StudioPropertyGroups.FocusShortcut.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -3511,6 +4041,19 @@ interface StudioComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "multiSelectComboBox"), @StudioConvertStrategy.TagInfo(qualifiedName = "multiValuePicker") }), + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.AriaLabelAndLabelledBy.class, + StudioPropertyGroups.CollectionOrInstanceDataContainer.class, + StudioPropertyGroups.HelperText.class, + StudioPropertyGroups.ItemsContainerTypeParameterV.class, + StudioPropertyGroups.ItemsEnum.class, + StudioPropertyGroups.Label.class, + StudioPropertyGroups.ReadOnly.class, + StudioPropertyGroups.Property.class, + StudioPropertyGroups.Required.class, + StudioPropertyGroups.RequiredMessage.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -3575,6 +4118,14 @@ interface StudioComponents { category = "Components", xmlElement = "gridColumnVisibility", icon = "io/jmix/flowui/kit/meta/icon/component/gridColumnVisibility.svg", + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.TabIndex.class, + StudioPropertyGroups.FocusShortcut.class, + StudioPropertyGroups.Text.class, + StudioPropertyGroups.ButtonThemeNames.class, + StudioPropertyGroups.WhiteSpace.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -3627,6 +4178,17 @@ interface StudioComponents { category = "Components", xmlElement = "menuFilterField", icon = "io/jmix/flowui/kit/meta/icon/component/menufilterfield.svg", + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.AriaLabelAndTabIndexAndFocusShortcut.class, + StudioPropertyGroups.Autofocus.class, + StudioPropertyGroups.Autoselect.class, + StudioPropertyGroups.HelperText.class, + StudioPropertyGroups.Label.class, + StudioPropertyGroups.Placeholder.class, + StudioPropertyGroups.ReadOnly.class, + StudioPropertyGroups.FieldThemeTitleAndValueChangeDefaultProperties.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -3694,6 +4256,16 @@ interface StudioComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "textField"), @StudioConvertStrategy.TagInfo(qualifiedName = "codeEditor") }), + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.ReadOnly.class, + StudioPropertyGroups.AriaLabelAndLabelledBy.class, + StudioPropertyGroups.Label.class, + StudioPropertyGroups.HelperText.class, + StudioPropertyGroups.ValueChangeMode.class, + StudioPropertyGroups.CollectionOrInstanceDataContainer.class, + StudioPropertyGroups.Property.class + }, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID), @StudioProperty(xmlAttribute = "visible", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.BOOLEAN, @@ -3740,6 +4312,13 @@ interface StudioComponents { category = "Components", xmlElement = "horizontalMenu", icon = "io/jmix/flowui/kit/meta/icon/component/horizontalMenu.svg", + propertyGroups = { + StudioPropertyGroups.AlignSelfAndJustifySelfAndColspan.class, + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.Size.class, + StudioPropertyGroups.LoadMenuConfig.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -3774,6 +4353,12 @@ interface StudioComponents { category = "Components", xmlElement = "listMenu", icon = "io/jmix/flowui/kit/meta/icon/mainview/listMenu.svg", + propertyGroups = { + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.Size.class, + StudioPropertyGroups.LoadMenuConfig.class + }, properties = { @StudioProperty(xmlAttribute = "classNames", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.VALUES_LIST), @StudioProperty(xmlAttribute = "css", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.STRING), @@ -3808,6 +4393,12 @@ interface StudioComponents { maxCount = 1 ) ), + propertyGroups = { + StudioPropertyGroups.AlignSelfAndJustifySelfAndColspan.class, + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.Content.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -3841,6 +4432,13 @@ interface StudioComponents { maxCount = 1 ) ), + propertyGroups = { + StudioPropertyGroups.AlignSelfAndJustifySelfAndColspan.class, + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.Size.class, + StudioPropertyGroups.Content.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/component/StudioHTMLComponents.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/component/StudioHTMLComponents.java index c679417470..638190e467 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/component/StudioHTMLComponents.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/component/StudioHTMLComponents.java @@ -29,6 +29,16 @@ interface StudioHTMLComponents { xmlElement = "anchor", icon = "io/jmix/flowui/kit/meta/icon/html/htmlComponent.svg", documentationLink = "%VERSION%/flow-ui/vc/html.html", + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.AriaLabelAndTabIndexAndFocusShortcut.class, + StudioPropertyGroups.CollectionOrInstanceDataContainer.class, + StudioPropertyGroups.Property.class, + StudioPropertyGroups.Text.class, + StudioPropertyGroups.HtmlComponentThemeNames.class, + StudioPropertyGroups.Title.class, + StudioPropertyGroups.WhiteSpace.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -87,6 +97,7 @@ interface StudioHTMLComponents { xmlElement = "article", icon = "io/jmix/flowui/kit/meta/icon/html/htmlComponent.svg", documentationLink = "%VERSION%/flow-ui/vc/html.html", + propertyGroups = StudioHtmlComponentPropertyGroups.TextHtmlComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -138,6 +149,7 @@ interface StudioHTMLComponents { xmlElement = "aside", icon = "io/jmix/flowui/kit/meta/icon/html/htmlComponent.svg", documentationLink = "%VERSION%/flow-ui/vc/html.html", + propertyGroups = StudioHtmlComponentPropertyGroups.TextHtmlComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -189,6 +201,7 @@ interface StudioHTMLComponents { xmlElement = "descriptionList", icon = "io/jmix/flowui/kit/meta/icon/html/htmlComponent.svg", documentationLink = "%VERSION%/flow-ui/vc/html.html", + propertyGroups = StudioHtmlComponentPropertyGroups.TextHtmlComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -247,6 +260,7 @@ interface StudioHTMLComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "formLayout"), @StudioConvertStrategy.TagInfo(qualifiedName = "details"), }), + propertyGroups = StudioHtmlComponentPropertyGroups.TextHtmlComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -298,6 +312,7 @@ interface StudioHTMLComponents { xmlElement = "emphasis", icon = "io/jmix/flowui/kit/meta/icon/html/htmlComponent.svg", documentationLink = "%VERSION%/flow-ui/vc/html.html", + propertyGroups = StudioHtmlComponentPropertyGroups.TextHtmlComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -349,6 +364,7 @@ interface StudioHTMLComponents { xmlElement = "footer", icon = "io/jmix/flowui/kit/meta/icon/html/htmlComponent.svg", documentationLink = "%VERSION%/flow-ui/vc/html.html", + propertyGroups = StudioHtmlComponentPropertyGroups.TextHtmlComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -409,6 +425,7 @@ interface StudioHTMLComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "span"), @StudioConvertStrategy.TagInfo(qualifiedName = "nativeLabel"), }), + propertyGroups = StudioHtmlComponentPropertyGroups.TextHtmlComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -476,6 +493,7 @@ interface StudioHTMLComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "span"), @StudioConvertStrategy.TagInfo(qualifiedName = "nativeLabel"), }), + propertyGroups = StudioHtmlComponentPropertyGroups.TextHtmlComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -543,6 +561,7 @@ interface StudioHTMLComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "span"), @StudioConvertStrategy.TagInfo(qualifiedName = "nativeLabel"), }), + propertyGroups = StudioHtmlComponentPropertyGroups.TextHtmlComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -610,6 +629,7 @@ interface StudioHTMLComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "span"), @StudioConvertStrategy.TagInfo(qualifiedName = "nativeLabel"), }), + propertyGroups = StudioHtmlComponentPropertyGroups.TextHtmlComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -677,6 +697,7 @@ interface StudioHTMLComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "span"), @StudioConvertStrategy.TagInfo(qualifiedName = "nativeLabel"), }), + propertyGroups = StudioHtmlComponentPropertyGroups.TextHtmlComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -744,6 +765,7 @@ interface StudioHTMLComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "span"), @StudioConvertStrategy.TagInfo(qualifiedName = "nativeLabel"), }), + propertyGroups = StudioHtmlComponentPropertyGroups.TextHtmlComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -802,6 +824,7 @@ interface StudioHTMLComponents { xmlElement = "header", icon = "io/jmix/flowui/kit/meta/icon/html/htmlComponent.svg", documentationLink = "%VERSION%/flow-ui/vc/html.html", + propertyGroups = StudioHtmlComponentPropertyGroups.TextHtmlComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -853,6 +876,7 @@ interface StudioHTMLComponents { xmlElement = "hr", icon = "io/jmix/flowui/kit/meta/icon/html/htmlComponent.svg", documentationLink = "%VERSION%/flow-ui/vc/html.html", + propertyGroups = StudioHtmlComponentPropertyGroups.TitleHtmlComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -886,6 +910,18 @@ interface StudioHTMLComponents { xmlElement = "htmlObject", icon = "io/jmix/flowui/kit/meta/icon/html/htmlComponent.svg", documentationLink = "%VERSION%/flow-ui/vc/html.html", + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.ClickShortcut.class, + StudioPropertyGroups.CollectionOrInstanceDataContainer.class, + StudioPropertyGroups.Property.class, + StudioPropertyGroups.TabIndex.class, + StudioPropertyGroups.FocusShortcut.class, + StudioPropertyGroups.Text.class, + StudioPropertyGroups.HtmlComponentThemeNames.class, + StudioPropertyGroups.Title.class, + StudioPropertyGroups.WhiteSpace.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -941,6 +977,15 @@ interface StudioHTMLComponents { icon = "io/jmix/flowui/kit/meta/icon/html/iFrame.svg", xmlElement = "iframe", documentationLink = "%VERSION%/flow-ui/vc/html.html", + propertyGroups = { + StudioPropertyGroups.AlignSelfAndJustifySelfAndColspan.class, + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.Size.class, + StudioPropertyGroups.Name.class, + StudioPropertyGroups.Resource.class, + StudioPropertyGroups.Title.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -989,6 +1034,19 @@ interface StudioHTMLComponents { xmlElement = "image", icon = "io/jmix/flowui/kit/meta/icon/html/image.svg", documentationLink = "%VERSION%/flow-ui/vc/html-components/image.html", + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.AlternateText.class, + StudioPropertyGroups.AriaLabelAndLabelledBy.class, + StudioPropertyGroups.ClickShortcut.class, + StudioPropertyGroups.CollectionOrInstanceDataContainer.class, + StudioPropertyGroups.Property.class, + StudioPropertyGroups.ImageResource.class, + StudioPropertyGroups.Text.class, + StudioPropertyGroups.ImageThemeNames.class, + StudioPropertyGroups.Title.class, + StudioPropertyGroups.WhiteSpace.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1046,6 +1104,14 @@ interface StudioHTMLComponents { xmlElement = "input", icon = "io/jmix/flowui/kit/meta/icon/html/htmlComponent.svg", documentationLink = "%VERSION%/flow-ui/vc/html.html", + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.AriaLabelAndTabIndexAndFocusShortcut.class, + StudioPropertyGroups.Placeholder.class, + StudioPropertyGroups.ValueChangeMode.class, + StudioPropertyGroups.ValueChangeTimeout.class, + StudioPropertyGroups.Title.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1094,6 +1160,7 @@ interface StudioHTMLComponents { xmlElement = "listItem", icon = "io/jmix/flowui/kit/meta/icon/html/htmlComponent.svg", documentationLink = "%VERSION%/flow-ui/vc/html.html", + propertyGroups = StudioHtmlComponentPropertyGroups.TextHtmlComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1145,6 +1212,7 @@ interface StudioHTMLComponents { xmlElement = "main", icon = "io/jmix/flowui/kit/meta/icon/html/htmlComponent.svg", documentationLink = "%VERSION%/flow-ui/vc/html.html", + propertyGroups = StudioHtmlComponentPropertyGroups.AccessibleTextHtmlComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1198,6 +1266,7 @@ interface StudioHTMLComponents { xmlElement = "nav", icon = "io/jmix/flowui/kit/meta/icon/html/htmlComponent.svg", documentationLink = "%VERSION%/flow-ui/vc/html.html", + propertyGroups = StudioHtmlComponentPropertyGroups.AccessibleTextHtmlComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1251,6 +1320,7 @@ interface StudioHTMLComponents { xmlElement = "orderedList", icon = "io/jmix/flowui/kit/meta/icon/html/htmlComponent.svg", documentationLink = "%VERSION%/flow-ui/vc/html.html", + propertyGroups = StudioHtmlComponentPropertyGroups.TextHtmlComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1306,6 +1376,7 @@ interface StudioHTMLComponents { xmlElement = "p", icon = "io/jmix/flowui/kit/meta/icon/html/htmlComponent.svg", documentationLink = "%VERSION%/flow-ui/vc/html.html", + propertyGroups = StudioHtmlComponentPropertyGroups.TextHtmlComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1357,6 +1428,7 @@ interface StudioHTMLComponents { xmlElement = "param", icon = "io/jmix/flowui/kit/meta/icon/html/htmlComponent.svg", documentationLink = "%VERSION%/flow-ui/vc/html.html", + propertyGroups = StudioHtmlComponentPropertyGroups.TitleHtmlComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1392,6 +1464,7 @@ interface StudioHTMLComponents { xmlElement = "pre", icon = "io/jmix/flowui/kit/meta/icon/html/htmlComponent.svg", documentationLink = "%VERSION%/flow-ui/vc/html.html", + propertyGroups = StudioHtmlComponentPropertyGroups.TextHtmlComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1443,6 +1516,15 @@ interface StudioHTMLComponents { xmlElement = "code", icon = "io/jmix/flowui/kit/meta/icon/html/htmlComponent.svg", documentationLink = "%VERSION%/flow-ui/vc/html.html", + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.CollectionOrInstanceDataContainer.class, + StudioPropertyGroups.Property.class, + StudioPropertyGroups.Text.class, + StudioPropertyGroups.HtmlComponentThemeNames.class, + StudioPropertyGroups.Title.class, + StudioPropertyGroups.WhiteSpace.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1492,6 +1574,13 @@ interface StudioHTMLComponents { category = "HTML", xmlElement = "rangeInput", icon = "io/jmix/flowui/kit/meta/icon/html/rangeInput.svg", + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.AriaLabelAndTabIndexAndFocusShortcut.class, + StudioPropertyGroups.Step.class, + StudioPropertyGroups.ValueChangeMode.class, + StudioPropertyGroups.ValueChangeTimeout.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1541,6 +1630,7 @@ interface StudioHTMLComponents { xmlElement = "section", icon = "io/jmix/flowui/kit/meta/icon/html/htmlComponent.svg", documentationLink = "%VERSION%/flow-ui/vc/html.html", + propertyGroups = StudioHtmlComponentPropertyGroups.TextHtmlComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1600,6 +1690,7 @@ interface StudioHTMLComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "h5"), @StudioConvertStrategy.TagInfo(qualifiedName = "nativeLabel"), }), + propertyGroups = StudioHtmlComponentPropertyGroups.TextHtmlComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1658,6 +1749,7 @@ interface StudioHTMLComponents { xmlElement = "unorderedList", icon = "io/jmix/flowui/kit/meta/icon/html/htmlComponent.svg", documentationLink = "%VERSION%/flow-ui/vc/html.html", + propertyGroups = StudioHtmlComponentPropertyGroups.TextHtmlComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1717,6 +1809,15 @@ interface StudioHTMLComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "h5"), @StudioConvertStrategy.TagInfo(qualifiedName = "span"), }), + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.CollectionOrInstanceDataContainer.class, + StudioPropertyGroups.Property.class, + StudioPropertyGroups.Text.class, + StudioPropertyGroups.NativeLabelThemeNames.class, + StudioPropertyGroups.Title.class, + StudioPropertyGroups.WhiteSpace.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1775,6 +1876,17 @@ interface StudioHTMLComponents { xmlElement = "nativeButton", icon = "io/jmix/flowui/kit/meta/icon/html/htmlComponent.svg", documentationLink = "%VERSION%/flow-ui/vc/html.html", + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.AriaLabelAndTabIndexAndFocusShortcut.class, + StudioPropertyGroups.ClickShortcut.class, + StudioPropertyGroups.CollectionOrInstanceDataContainer.class, + StudioPropertyGroups.Property.class, + StudioPropertyGroups.Text.class, + StudioPropertyGroups.NativeLabelThemeNames.class, + StudioPropertyGroups.Title.class, + StudioPropertyGroups.WhiteSpace.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1829,6 +1941,7 @@ interface StudioHTMLComponents { category = "HTML", xmlElement = "term", icon = "io/jmix/flowui/kit/meta/icon/html/htmlComponent.svg", + propertyGroups = StudioHtmlComponentPropertyGroups.TextHtmlComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1879,6 +1992,7 @@ interface StudioHTMLComponents { category = "HTML", xmlElement = "description", icon = "io/jmix/flowui/kit/meta/icon/html/htmlComponent.svg", + propertyGroups = StudioHtmlComponentPropertyGroups.TextHtmlComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1930,6 +2044,15 @@ interface StudioHTMLComponents { xmlElement = "nativeDetails", icon = "io/jmix/flowui/kit/meta/icon/html/htmlComponent.svg", documentationLink = "%VERSION%/flow-ui/vc/html.html", + propertyGroups = { + StudioPropertyGroups.AlignSelfAndJustifySelfAndColspan.class, + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.Size.class, + StudioPropertyGroups.ClickShortcut.class, + StudioPropertyGroups.DetailsSummaryText.class, + StudioPropertyGroups.Title.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1974,6 +2097,16 @@ interface StudioHTMLComponents { @StudioConvertStrategy.TagInfo(qualifiedName = "formLayout"), @StudioConvertStrategy.TagInfo(qualifiedName = "details"), }), + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.CollectionOrInstanceDataContainer.class, + StudioPropertyGroups.Property.class, + StudioPropertyGroups.Text.class, + StudioPropertyGroups.HtmlComponentThemeNames.class, + StudioPropertyGroups.Title.class, + StudioPropertyGroups.WhiteSpace.class, + StudioPropertyGroups.AriaLabelAndLabelledBy.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/component/StudioHtmlComponentPropertyGroups.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/component/StudioHtmlComponentPropertyGroups.java new file mode 100644 index 0000000000..80bde82092 --- /dev/null +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/component/StudioHtmlComponentPropertyGroups.java @@ -0,0 +1,48 @@ +/* + * Copyright 2026 Haulmont. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.jmix.flowui.kit.meta.component; + +import io.jmix.flowui.kit.meta.StudioAPI; +import io.jmix.flowui.kit.meta.StudioPropertyGroup; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; + +@StudioAPI +public final class StudioHtmlComponentPropertyGroups { + + private StudioHtmlComponentPropertyGroups() { + } + + @StudioPropertyGroup + public interface TextHtmlComponentDefaultProperties extends StudioPropertyGroups.AlignSelfAndJustifySelfAndColspan, + StudioPropertyGroups.ClassNamesAndCss, StudioPropertyGroups.IdAndVisible, + StudioPropertyGroups.EnabledWithTrueDefaultValue, StudioPropertyGroups.Size, + StudioPropertyGroups.ClickShortcut, StudioPropertyGroups.CollectionOrInstanceDataContainer, + StudioPropertyGroups.Property, StudioPropertyGroups.Text, StudioPropertyGroups.HtmlComponentThemeNames, + StudioPropertyGroups.Title, StudioPropertyGroups.WhiteSpace { + } + + @StudioPropertyGroup + public interface AccessibleTextHtmlComponentDefaultProperties extends TextHtmlComponentDefaultProperties, + StudioPropertyGroups.AriaLabel, StudioPropertyGroups.AriaLabelledBy { + } + + @StudioPropertyGroup + public interface TitleHtmlComponentDefaultProperties extends StudioPropertyGroups.AlignSelfAndJustifySelfAndColspan, + StudioPropertyGroups.ClassNamesAndCss, StudioPropertyGroups.IdAndVisible, StudioPropertyGroups.Size, + StudioPropertyGroups.Title { + } +} diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/component/StudioLayouts.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/component/StudioLayouts.java index 24f8bb7c72..1563498785 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/component/StudioLayouts.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/component/StudioLayouts.java @@ -53,6 +53,21 @@ interface StudioLayouts { @StudioConvertStrategy.TagInfo(qualifiedName = "flexLayout"), @StudioConvertStrategy.TagInfo(qualifiedName = "formLayout"), }), + propertyGroups = { + StudioPropertyGroups.AlignSelfAndJustifySelfAndColspan.class, + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.EnabledWithTrueDefaultValue.class, + StudioPropertyGroups.Height.class, + StudioPropertyGroups.MaxHeight.class, + StudioPropertyGroups.MaxWidth.class, + StudioPropertyGroups.MinHeight.class, + StudioPropertyGroups.MinWidth.class, + StudioPropertyGroups.Opened.class, + StudioPropertyGroups.DetailsSummaryText.class, + StudioPropertyGroups.DetailsThemeNames.class, + StudioPropertyGroups.WidthWithDefaultValueAuto.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -100,6 +115,27 @@ interface StudioLayouts { @StudioConvertStrategy.TagInfo(qualifiedName = "flexLayout"), @StudioConvertStrategy.TagInfo(qualifiedName = "formLayout"), }), + propertyGroups = { + StudioPropertyGroups.AlignSelfAndJustifySelfAndColspan.class, + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.EnabledWithTrueDefaultValue.class, + StudioPropertyGroups.AlignItems.class, + StudioPropertyGroups.BoxSizing.class, + StudioPropertyGroups.ClickShortcut.class, + StudioPropertyGroups.Expand.class, + StudioPropertyGroups.Height.class, + StudioPropertyGroups.JustifyContent.class, + StudioPropertyGroups.Margin.class, + StudioPropertyGroups.MaxHeight.class, + StudioPropertyGroups.MaxWidth.class, + StudioPropertyGroups.MinHeight.class, + StudioPropertyGroups.MinWidth.class, + StudioPropertyGroups.Spacing.class, + StudioPropertyGroups.LayoutThemeNames.class, + StudioPropertyGroups.WidthWithDefaultValueAuto.class, + StudioPropertyGroups.Wrap.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -169,6 +205,28 @@ interface StudioLayouts { @StudioConvertStrategy.TagInfo(qualifiedName = "flexLayout"), @StudioConvertStrategy.TagInfo(qualifiedName = "formLayout"), }), + propertyGroups = { + StudioPropertyGroups.AlignSelfAndJustifySelfAndColspan.class, + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.EnabledWithTrueDefaultValue.class, + StudioPropertyGroups.AlignItems.class, + StudioPropertyGroups.BoxSizing.class, + StudioPropertyGroups.ClickShortcut.class, + StudioPropertyGroups.Expand.class, + StudioPropertyGroups.Height.class, + StudioPropertyGroups.JustifyContent.class, + StudioPropertyGroups.Margin.class, + StudioPropertyGroups.MaxHeight.class, + StudioPropertyGroups.MaxWidth.class, + StudioPropertyGroups.MinHeight.class, + StudioPropertyGroups.MinWidth.class, + StudioPropertyGroups.Padding.class, + StudioPropertyGroups.Spacing.class, + StudioPropertyGroups.LayoutThemeNames.class, + StudioPropertyGroups.WidthWithDefaultValue100.class, + StudioPropertyGroups.Wrap.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -236,6 +294,22 @@ interface StudioLayouts { @StudioConvertStrategy.TagInfo(qualifiedName = "details"), @StudioConvertStrategy.TagInfo(qualifiedName = "formLayout"), }), + propertyGroups = { + StudioPropertyGroups.AlignSelfAndJustifySelfAndColspan.class, + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.EnabledWithTrueDefaultValue.class, + StudioPropertyGroups.ClickShortcut.class, + StudioPropertyGroups.Height.class, + StudioPropertyGroups.MaxHeight.class, + StudioPropertyGroups.MinHeight.class, + StudioPropertyGroups.WidthWithDefaultValueAuto.class, + StudioPropertyGroups.MaxWidth.class, + StudioPropertyGroups.MinWidth.class, + StudioPropertyGroups.Expand.class, + StudioPropertyGroups.AlignItems.class, + StudioPropertyGroups.JustifyContent.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -308,6 +382,7 @@ interface StudioLayouts { availableChildren = @StudioAvailableChildrenInfo( availableClasses = @ClassInfo(qualifiedName = FLOW_COMPONENT_FQN, maxCount = 1) ), + propertyGroups = StudioPropertyGroups.EnabledAutoWidthLayoutDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -354,6 +429,18 @@ interface StudioLayouts { @StudioConvertStrategy.TagInfo(qualifiedName = "flexLayout"), @StudioConvertStrategy.TagInfo(qualifiedName = "formLayout"), }), + propertyGroups = { + StudioPropertyGroups.AlignSelfAndJustifySelfAndColspan.class, + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.ClickShortcut.class, + StudioPropertyGroups.Height.class, + StudioPropertyGroups.MaxHeight.class, + StudioPropertyGroups.MaxWidth.class, + StudioPropertyGroups.MinHeight.class, + StudioPropertyGroups.MinWidth.class, + StudioPropertyGroups.WidthWithDefaultValueAuto.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -394,6 +481,7 @@ interface StudioLayouts { xmlElement = "accordion", icon = "io/jmix/flowui/kit/meta/icon/layout/accordion.svg", documentationLink = "%VERSION%/flow-ui/vc/layouts/accordion.html", + propertyGroups = StudioPropertyGroups.AutoWidthLayoutDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -425,6 +513,16 @@ interface StudioLayouts { category = "Layouts", xmlElement = "sidePanelLayout", icon = "io/jmix/flowui/kit/meta/icon/layout/sidePanelLayout.svg", + propertyGroups = { + StudioPropertyGroups.AlignSelfAndJustifySelfAndColspan.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.Css.class, + StudioPropertyGroups.MaxHeight.class, + StudioPropertyGroups.MaxWidth.class, + StudioPropertyGroups.MinHeight.class, + StudioPropertyGroups.MinWidth.class, + StudioPropertyGroups.WidthWithInitialValue100.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -506,7 +604,8 @@ interface StudioLayouts { parentPath = "headerBox", qualifiedName = "sidePanelLayoutCloser" ) - })) + }) + ) JmixSidePanelLayout sidePanelLayout(); @StudioComponent( @@ -516,6 +615,7 @@ interface StudioLayouts { xmlElement = "formLayout", icon = "io/jmix/flowui/kit/meta/icon/layout/formLayout.svg", documentationLink = "%VERSION%/flow-ui/vc/layouts/formLayout.html", + propertyGroups = StudioPropertyGroups.EnabledAutoWidthLayoutDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -569,6 +669,7 @@ interface StudioLayouts { xmlElement = "tabSheet", icon = "io/jmix/flowui/kit/meta/icon/component/tabSheet.svg", documentationLink = "%VERSION%/flow-ui/vc/layouts/tabSheet.html", + propertyGroups = StudioPropertyGroups.AutoWidthLayoutDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -602,6 +703,11 @@ interface StudioLayouts { classFqn = "io.jmix.flowui.component.card.JmixCard", category = "Layouts", xmlElement = "card", + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.AriaLabelAndLabelledBy.class, + StudioPropertyGroups.Title.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, @@ -670,6 +776,10 @@ interface StudioLayouts { category = "Layouts", xmlElement = "gridLayout", icon = "io/jmix/flowui/kit/meta/icon/layout/gridLayout.svg", + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.Gap.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/component/StudioMainViewComponents.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/component/StudioMainViewComponents.java index fba46003f0..3f6e3f779a 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/component/StudioMainViewComponents.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/component/StudioMainViewComponents.java @@ -22,6 +22,7 @@ import io.jmix.flowui.kit.meta.StudioAvailableChildrenInfo; import io.jmix.flowui.kit.meta.StudioComponent; import io.jmix.flowui.kit.meta.StudioProperty; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; import io.jmix.flowui.kit.meta.StudioPropertyType; import io.jmix.flowui.kit.meta.StudioUiKit; @@ -34,6 +35,7 @@ interface StudioMainViewComponents { xmlElement = "appLayout", icon = "io/jmix/flowui/kit/meta/icon/mainview/appLayout.svg", availablePlaceRegExp = "^mainView$", + propertyGroups = StudioPropertyGroups.ClassNamesAndCss.class, properties = { @StudioProperty(xmlAttribute = "classNames", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.VALUES_LIST), @StudioProperty(xmlAttribute = "css", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.STRING), @@ -55,6 +57,13 @@ interface StudioMainViewComponents { icon = "io/jmix/flowui/kit/meta/icon/mainview/userIndicator.svg", availablePlaceRegExp = "(^(mainView/appLayout)?((/drawerLayout)|(/navigationBar))$)" + "|(^((mainView/appLayout)?((/drawerLayout)|(/navigationBar)))?(/hasComponents)*$)", + propertyGroups = { + StudioPropertyGroups.Size.class, + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.EnabledWithTrueDefaultValue.class, + StudioPropertyGroups.Title.class + }, properties = { @StudioProperty(xmlAttribute = "classNames", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.VALUES_LIST), @StudioProperty(xmlAttribute = "css", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.STRING), @@ -88,6 +97,7 @@ interface StudioMainViewComponents { @StudioAvailableChildrenInfo.TagInfo(qualifiedName = "appLayout", maxCount = 1) } ), + propertyGroups = StudioPropertyGroups.MessagesGroupAndTitle.class, properties = { @StudioProperty(xmlAttribute = "messagesGroup", type = StudioPropertyType.STRING), @StudioProperty(xmlAttribute = "title", type = StudioPropertyType.LOCALIZED_STRING) diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/datacomponent/StudioDataComponentPropertyGroups.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/datacomponent/StudioDataComponentPropertyGroups.java new file mode 100644 index 0000000000..8232bb5dba --- /dev/null +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/datacomponent/StudioDataComponentPropertyGroups.java @@ -0,0 +1,51 @@ +/* + * Copyright 2026 Haulmont. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.jmix.flowui.kit.meta.datacomponent; + +import io.jmix.flowui.kit.meta.StudioAPI; +import io.jmix.flowui.kit.meta.StudioProperty; +import io.jmix.flowui.kit.meta.StudioPropertyGroup; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; +import io.jmix.flowui.kit.meta.StudioPropertyType; + +@StudioAPI +public class StudioDataComponentPropertyGroups { + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "id", type = StudioPropertyType.COMPONENT_ID, required = true), + @StudioProperty(xmlAttribute = "class", type = StudioPropertyType.ENTITY_CLASS, required = true), + @StudioProperty(xmlAttribute = "fetchPlan", type = StudioPropertyType.FETCH_PLAN) + } + ) + public interface DataContainerDefaultProperties { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "id", type = StudioPropertyType.COMPONENT_ID, required = true), + @StudioProperty(xmlAttribute = "property", type = StudioPropertyType.STRING, required = true), + } + ) + public interface NestedDataContainerDefaultProperties { + } + + @StudioPropertyGroup + public interface QueryLoaderDefaultProperties extends StudioPropertyGroups.FirstResult, + StudioPropertyGroups.MaxResults, StudioPropertyGroups.ReadOnlyWithoutCategory, + StudioPropertyGroups.Query { + } +} diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/datacomponent/StudioDataComponents.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/datacomponent/StudioDataComponents.java index 9903e15c5a..e24a45c7ae 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/datacomponent/StudioDataComponents.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/datacomponent/StudioDataComponents.java @@ -20,6 +20,7 @@ import io.jmix.flowui.kit.meta.StudioProperty; import io.jmix.flowui.kit.meta.StudioPropertyType; import io.jmix.flowui.kit.meta.StudioUiKit; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; @StudioUiKit interface StudioDataComponents { @@ -31,6 +32,7 @@ interface StudioDataComponents { xmlElement = "collection", icon = "io/jmix/flowui/kit/meta/icon/datacomponent/collection.svg", documentationLink = "%VERSION%/flow-ui/data/collection-container.html", + propertyGroups = StudioDataComponentPropertyGroups.DataContainerDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "id", type = StudioPropertyType.COMPONENT_ID, required = true), @StudioProperty(xmlAttribute = "class", type = StudioPropertyType.ENTITY_CLASS, required = true), @@ -46,6 +48,7 @@ interface StudioDataComponents { xmlElement = "instance", icon = "io/jmix/flowui/kit/meta/icon/datacomponent/instance.svg", documentationLink = "%VERSION%/flow-ui/data/instance-container.html", + propertyGroups = StudioDataComponentPropertyGroups.DataContainerDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "id", type = StudioPropertyType.COMPONENT_ID, required = true), @StudioProperty(xmlAttribute = "class", type = StudioPropertyType.ENTITY_CLASS, required = true), @@ -61,9 +64,8 @@ interface StudioDataComponents { xmlElement = "keyValueInstance", icon = "io/jmix/flowui/kit/meta/icon/datacomponent/keyValueInstance.svg", documentationLink = "%VERSION%/flow-ui/data/key-value-containers.html", - properties = { - @StudioProperty(xmlAttribute = "id", type = StudioPropertyType.COMPONENT_ID, required = true) - } + propertyGroups = StudioPropertyGroups.RequiredId.class, + properties = @StudioProperty(xmlAttribute = "id", type = StudioPropertyType.COMPONENT_ID, required = true) ) void keyValueInstance(); @@ -74,9 +76,8 @@ interface StudioDataComponents { xmlElement = "keyValueCollection", icon = "io/jmix/flowui/kit/meta/icon/datacomponent/keyValueCollection.svg", documentationLink = "%VERSION%/flow-ui/data/key-value-containers.html", - properties = { - @StudioProperty(xmlAttribute = "id", type = StudioPropertyType.COMPONENT_ID, required = true) - } + propertyGroups = StudioPropertyGroups.RequiredId.class, + properties = @StudioProperty(xmlAttribute = "id", type = StudioPropertyType.COMPONENT_ID, required = true) ) void keyValueCollection(); } diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/element/StudioDataElements.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/element/StudioDataElements.java index 8f07494215..1928ba288c 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/element/StudioDataElements.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/element/StudioDataElements.java @@ -20,6 +20,8 @@ import io.jmix.flowui.kit.meta.StudioProperty; import io.jmix.flowui.kit.meta.StudioPropertyType; import io.jmix.flowui.kit.meta.StudioUiKit; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; +import io.jmix.flowui.kit.meta.datacomponent.StudioDataComponentPropertyGroups; @StudioUiKit interface StudioDataElements { @@ -33,6 +35,7 @@ interface StudioDataElements { unsupportedTarget = {"io.jmix.flowui.model.KeyValueContainer", "io.jmix.flowui.model.KeyValueCollectionContainer"}, documentationLink = "%VERSION%/flow-ui/data/property-containers.html", + propertyGroups = StudioDataComponentPropertyGroups.NestedDataContainerDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "id", type = StudioPropertyType.COMPONENT_ID, required = true), @StudioProperty(xmlAttribute = "property", type = StudioPropertyType.STRING, required = true), @@ -49,6 +52,7 @@ interface StudioDataElements { documentationLink = "%VERSION%/flow-ui/data/property-containers.html", unsupportedTarget = {"io.jmix.flowui.model.KeyValueContainer", "io.jmix.flowui.model.KeyValueCollectionContainer"}, + propertyGroups = StudioDataComponentPropertyGroups.NestedDataContainerDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "id", type = StudioPropertyType.COMPONENT_ID, required = true), @StudioProperty(xmlAttribute = "property", type = StudioPropertyType.STRING, required = true), @@ -66,6 +70,7 @@ interface StudioDataElements { "io.jmix.flowui.model.KeyValueCollectionContainer", "io.jmix.flowui.model.CollectionContainer"}, documentationLink = "%VERSION%/flow-ui/data/data-loaders.html", + propertyGroups = StudioDataComponentPropertyGroups.QueryLoaderDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "id", type = StudioPropertyType.COMPONENT_ID), @StudioProperty(xmlAttribute = "firstResult", type = StudioPropertyType.INTEGER, @@ -88,6 +93,7 @@ interface StudioDataElements { unsupportedTarget = {"io.jmix.flowui.model.KeyValueContainer", "io.jmix.flowui.model.KeyValueCollectionContainer"}, documentationLink = "%VERSION%/flow-ui/data/data-loaders.html", + propertyGroups = StudioDataComponentPropertyGroups.QueryLoaderDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "id", type = StudioPropertyType.COMPONENT_ID), @StudioProperty(xmlAttribute = "firstResult", type = StudioPropertyType.INTEGER, @@ -112,6 +118,10 @@ interface StudioDataElements { unsupportedTarget = {"io.jmix.flowui.model.CollectionContainer", "io.jmix.flowui.model.KeyValueCollectionContainer"}, documentationLink = "%VERSION%/flow-ui/data/data-loaders.html", + propertyGroups = { + StudioPropertyGroups.Store.class, + StudioPropertyGroups.Query.class + }, properties = { @StudioProperty(xmlAttribute = "id", type = StudioPropertyType.COMPONENT_ID), @StudioProperty(xmlAttribute = "store", type = StudioPropertyType.STORE), @@ -127,6 +137,12 @@ interface StudioDataElements { icon = "io/jmix/flowui/kit/meta/icon/datacomponent/keyValueLoader.svg", target = "io.jmix.flowui.model.KeyValueCollectionContainer", documentationLink = "%VERSION%/flow-ui/data/data-loaders.html", + propertyGroups = { + StudioPropertyGroups.FirstResult.class, + StudioPropertyGroups.MaxResults.class, + StudioPropertyGroups.Store.class, + StudioPropertyGroups.Query.class + }, properties = { @StudioProperty(xmlAttribute = "id", type = StudioPropertyType.COMPONENT_ID), @StudioProperty(xmlAttribute = "firstResult", type = StudioPropertyType.INTEGER, @@ -144,6 +160,10 @@ interface StudioDataElements { classFqn = "io.jmix.core.impl.keyvalue.KeyValueMetaProperty", xmlElement = "property", icon = "io/jmix/flowui/kit/meta/icon/element/property.svg", + propertyGroups = { + StudioPropertyGroups.EntityClass.class, + StudioPropertyGroups.RequiredStringName.class + }, properties = { @StudioProperty(xmlAttribute = "name", type = StudioPropertyType.STRING, required = true), @StudioProperty(xmlAttribute = "datatype", type = StudioPropertyType.DATATYPE_ID), diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/element/StudioElements.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/element/StudioElements.java index a1cff9598b..d8671bd31a 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/element/StudioElements.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/element/StudioElements.java @@ -30,8 +30,8 @@ import com.vaadin.flow.component.tabs.Tab; import io.jmix.flowui.kit.component.dropdownbutton.DropdownButtonItem; import io.jmix.flowui.kit.component.loginform.JmixLoginI18n; -import io.jmix.flowui.kit.component.twincolumn.JmixTwinColumn; import io.jmix.flowui.kit.component.usermenu.UserMenuItem; +import io.jmix.flowui.kit.meta.action.StudioActionPropertyGroups; import io.jmix.flowui.kit.meta.*; import io.jmix.flowui.kit.meta.GenericResolvingInfo.ResolvingStrategy; import io.jmix.flowui.kit.meta.GenericResolvingInfo.ResolvingStrategy.ClassFqnStrategy; @@ -49,6 +49,21 @@ interface StudioElements { icon = "io/jmix/flowui/kit/meta/icon/element/tab.svg", documentationLink = "%VERSION%/flow-ui/vc/layouts/accordion.html#_accordionpanel", visible = true, + propertyGroups = { + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.Colspan.class, + StudioPropertyGroups.Enabled.class, + StudioPropertyGroups.Height.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.MaxHeight.class, + StudioPropertyGroups.MaxWidth.class, + StudioPropertyGroups.MinHeight.class, + StudioPropertyGroups.MinWidth.class, + StudioPropertyGroups.SummaryText.class, + StudioPropertyGroups.Opened.class, + StudioPropertyGroups.DetailsThemeNames.class, + StudioPropertyGroups.WidthWithDefaultValue100.class + }, properties = { @StudioProperty(xmlAttribute = "classNames", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.VALUES_LIST), @StudioProperty(xmlAttribute = "css", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.STRING), @@ -96,6 +111,9 @@ interface StudioElements { xmlElement = "actionItem", documentationLink = "%VERSION%/flow-ui/vc/components/dropdownButton.html#actionItem", isInjectable = false, + propertyGroups = { + StudioPropertyGroups.RequiredId.class + }, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID, required = true), @StudioProperty(xmlAttribute = "ref", type = StudioPropertyType.ACTION_REF) @@ -113,6 +131,9 @@ interface StudioElements { icon = "io/jmix/flowui/kit/meta/icon/action/action.svg", target = {"io.jmix.flowui.kit.component.dropdownbutton.ActionItem"}, unlimitedCount = false, + propertyGroups = { + StudioActionPropertyGroups.RequiredIconTextActionDefaultPropertiesWithoutShortcutCombination.class + }, properties = { @StudioProperty(xmlAttribute = "type", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.STRING), @StudioProperty(xmlAttribute = "actionVariant", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ENUMERATION, @@ -134,6 +155,9 @@ interface StudioElements { xmlElement = "additionalInformation", target = {"com.vaadin.flow.component.login.AbstractLogin"}, unlimitedCount = false, + propertyGroups = { + StudioPropertyGroups.Message.class + }, properties = { @StudioProperty(xmlAttribute = "message", type = StudioPropertyType.LOCALIZED_STRING) } @@ -148,6 +172,19 @@ interface StudioElements { documentationLink = "%VERSION%/flow-ui/vc/components/dataGrid.html#column", visible = true, isInjectable = false, + propertyGroups = { + StudioPropertyGroups.AutoWidth.class, + StudioPropertyGroups.FlexGrow.class, + StudioPropertyGroups.Footer.class, + StudioPropertyGroups.Frozen.class, + StudioPropertyGroups.Header.class, + StudioPropertyGroups.Key.class, + StudioPropertyGroups.PropertyTypeParameterT.class, + StudioPropertyGroups.ColumnSortable.class, + StudioPropertyGroups.Visible.class, + StudioPropertyGroups.WidthWithDefaultValueUndefined.class, + StudioPropertyGroups.Editable.class + }, properties = { @StudioProperty(xmlAttribute = "autoWidth", category = StudioProperty.Category.SIZE, type = StudioPropertyType.BOOLEAN, defaultValue = "false"), @@ -217,6 +254,14 @@ interface StudioElements { icon = "io/jmix/flowui/kit/meta/icon/element/column.svg", documentationLink = "%VERSION%/flow-ui/vc/components/dataGrid.html#editorActionsColumn", unlimitedCount = false, + propertyGroups = { + StudioPropertyGroups.AutoWidth.class, + StudioPropertyGroups.FlexGrow.class, + StudioPropertyGroups.Footer.class, + StudioPropertyGroups.Header.class, + StudioPropertyGroups.Visible.class, + StudioPropertyGroups.WidthWithDefaultValueUndefined.class + }, properties = { @StudioProperty(xmlAttribute = "autoWidth", type = StudioPropertyType.BOOLEAN, defaultValue = "false"), @@ -240,6 +285,7 @@ interface StudioElements { xmlElement = "editButton", target = "io.jmix.flowui.kit.component.grid.EditorActionsColumn", unlimitedCount = false, + propertyGroups = StudioPropertyGroups.EditorActionButtonDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "title", type = StudioPropertyType.LOCALIZED_STRING), @StudioProperty(xmlAttribute = "icon", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ICON, @@ -267,6 +313,7 @@ interface StudioElements { xmlElement = "saveButton", target = "io.jmix.flowui.kit.component.grid.EditorActionsColumn", unlimitedCount = false, + propertyGroups = StudioPropertyGroups.EditorActionTextButtonDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "title", type = StudioPropertyType.LOCALIZED_STRING), @StudioProperty(xmlAttribute = "icon", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ICON, @@ -293,6 +340,7 @@ interface StudioElements { xmlElement = "closeButton", target = "io.jmix.flowui.kit.component.grid.EditorActionsColumn", unlimitedCount = false, + propertyGroups = StudioPropertyGroups.EditorActionTextButtonDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "title", type = StudioPropertyType.LOCALIZED_STRING), @StudioProperty(xmlAttribute = "icon", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ICON, @@ -319,6 +367,7 @@ interface StudioElements { xmlElement = "cancelButton", target = "io.jmix.flowui.kit.component.grid.EditorActionsColumn", unlimitedCount = false, + propertyGroups = StudioPropertyGroups.EditorActionButtonDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "title", type = StudioPropertyType.LOCALIZED_STRING), @StudioProperty(xmlAttribute = "icon", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.ICON, @@ -347,6 +396,10 @@ interface StudioElements { xmlElement = "aggregation", target = {"com.vaadin.flow.component.grid.Grid.Column"}, unsupportedTarget = {"io.jmix.flowui.kit.component.grid.EditorActionsColumn"}, + propertyGroups = { + StudioPropertyGroups.CellTitle.class, + StudioPropertyGroups.StrategyClass.class + }, properties = { @StudioProperty(xmlAttribute = "cellTitle", type = StudioPropertyType.LOCALIZED_STRING), @StudioProperty(xmlAttribute = "strategyClass", type = StudioPropertyType.STRING), @@ -364,6 +417,7 @@ interface StudioElements { target = {"com.vaadin.flow.component.grid.Grid.Column"}, unsupportedTarget = {"io.jmix.flowui.kit.component.grid.EditorActionsColumn"}, documentationLink = "%VERSION%/flow-ui/vc/components/dataGrid.html#renderers", + propertyGroups = StudioPropertyGroups.FormatAndNullRepresentation.class, properties = { @StudioProperty(xmlAttribute = "format", type = StudioPropertyType.LOCALIZED_STRING, required = true), @@ -381,6 +435,7 @@ interface StudioElements { target = {"com.vaadin.flow.component.grid.Grid.Column"}, unsupportedTarget = {"io.jmix.flowui.kit.component.grid.EditorActionsColumn"}, documentationLink = "%VERSION%/flow-ui/vc/components/dataGrid.html#renderers", + propertyGroups = StudioPropertyGroups.FormatAndNullRepresentation.class, properties = { @StudioProperty(xmlAttribute = "format", type = StudioPropertyType.LOCALIZED_STRING, required = true), @@ -398,6 +453,7 @@ interface StudioElements { target = {"com.vaadin.flow.component.grid.Grid.Column"}, unsupportedTarget = {"io.jmix.flowui.kit.component.grid.EditorActionsColumn"}, documentationLink = "%VERSION%/flow-ui/vc/components/dataGrid.html#renderers", + propertyGroups = StudioPropertyGroups.FormatAndNullRepresentation.class, properties = { @StudioProperty(xmlAttribute = "format", type = StudioPropertyType.LOCALIZED_STRING, required = true), @@ -420,6 +476,9 @@ interface StudioElements { maxCount = 1 ) ), + propertyGroups = { + StudioPropertyGroups.RequiredId.class + }, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID, required = true) } @@ -432,6 +491,12 @@ interface StudioElements { xmlElement = "errorMessage", unlimitedCount = false, target = {"com.vaadin.flow.component.login.AbstractLogin"}, + propertyGroups = { + StudioPropertyGroups.Title.class, + StudioPropertyGroups.Message.class, + StudioPropertyGroups.Username.class, + StudioPropertyGroups.Password.class + }, properties = { @StudioProperty(xmlAttribute = "title", type = StudioPropertyType.LOCALIZED_STRING), @StudioProperty(xmlAttribute = "message", type = StudioPropertyType.LOCALIZED_STRING), @@ -447,6 +512,7 @@ interface StudioElements { xmlElement = "form", unlimitedCount = false, target = {"io.jmix.flowui.kit.component.loginform.EnhancedLoginForm"}, + propertyGroups = StudioPropertyGroups.LoginFormDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "forgotPassword", type = StudioPropertyType.LOCALIZED_STRING), @StudioProperty(xmlAttribute = "password", type = StudioPropertyType.LOCALIZED_STRING), @@ -464,6 +530,7 @@ interface StudioElements { xmlElement = "form", target = {"com.vaadin.flow.component.login.LoginOverlay"}, unlimitedCount = false, + propertyGroups = StudioPropertyGroups.LoginFormDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "forgotPassword", type = StudioPropertyType.LOCALIZED_STRING), @StudioProperty(xmlAttribute = "password", type = StudioPropertyType.LOCALIZED_STRING), @@ -479,6 +546,10 @@ interface StudioElements { xmlElement = "header", target = {"com.vaadin.flow.component.login.LoginOverlay"}, unlimitedCount = false, + propertyGroups = { + StudioPropertyGroups.Title.class, + StudioPropertyGroups.Description.class + }, properties = { @StudioProperty(xmlAttribute = "title", type = StudioPropertyType.LOCALIZED_STRING), @StudioProperty(xmlAttribute = "description", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.LOCALIZED_STRING) @@ -520,6 +591,9 @@ interface StudioElements { xmlElement = "genericFilter", target = {"io.jmix.flowui.facet.UrlQueryParametersFacet"}, icon = "io/jmix/flowui/kit/meta/icon/element/filter.svg", + propertyGroups = { + StudioPropertyGroups.Id.class + }, properties = { @StudioProperty(xmlAttribute = "component", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_REF, componentRefTags = "genericFilter", required = true), @@ -538,6 +612,14 @@ interface StudioElements { icon = "io/jmix/flowui/kit/meta/icon/element/tab.svg", documentationLink = "%VERSION%/flow-ui/vc/components/tabs.html#tab", visible = true, + propertyGroups = { + StudioPropertyGroups.AriaLabelAndLabelledBy.class, + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.Enabled.class, + StudioPropertyGroups.RequiredId.class, + StudioPropertyGroups.Label.class, + StudioPropertyGroups.Visible.class + }, properties = { @StudioProperty(xmlAttribute = "ariaLabel", type = StudioPropertyType.LOCALIZED_STRING), @StudioProperty(xmlAttribute = "ariaLabelledBy", type = StudioPropertyType.LOCALIZED_STRING), @@ -563,6 +645,10 @@ interface StudioElements { xmlElement = "textItem", isInjectable = false, documentationLink = "%VERSION%/flow-ui/vc/components/dropdownButton.html#textItem", + propertyGroups = { + StudioPropertyGroups.RequiredId.class, + StudioPropertyGroups.Text.class + }, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID, required = true), @StudioProperty(xmlAttribute = "text", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.LOCALIZED_STRING) @@ -586,6 +672,7 @@ interface StudioElements { xmlElement = "textItem", isInjectable = false, documentationLink = "%VERSION%/flow-ui/vc/components/userMenu.html#textItem", + propertyGroups = StudioPropertyGroups.TextUserMenuItemDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID, required = true), @StudioProperty(xmlAttribute = "text", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.LOCALIZED_STRING, required = true), @@ -609,6 +696,7 @@ interface StudioElements { xmlElement = "actionItem", documentationLink = "%VERSION%/flow-ui/vc/components/userMenu.html#actionItem", isInjectable = false, + propertyGroups = StudioPropertyGroups.UserMenuItemDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID, required = true), @StudioProperty(xmlAttribute = "ref", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.ACTION_REF), @@ -635,6 +723,9 @@ interface StudioElements { icon = "io/jmix/flowui/kit/meta/icon/action/action.svg", target = {"io.jmix.flowui.kit.component.usermenu.ActionUserMenuItem"}, unlimitedCount = false, + propertyGroups = { + StudioActionPropertyGroups.RequiredIconTextActionDefaultPropertiesWithoutShortcutCombination.class + }, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID, required = true), @StudioProperty(xmlAttribute = "text", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.LOCALIZED_STRING), @@ -663,6 +754,7 @@ interface StudioElements { maxCount = 1 ) ), + propertyGroups = StudioPropertyGroups.UserMenuItemDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID, required = true), @StudioProperty(xmlAttribute = "visible", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.BOOLEAN, @@ -684,6 +776,7 @@ interface StudioElements { xmlElement = "viewItem", isInjectable = false, documentationLink = "%VERSION%/flow-ui/vc/components/userMenu.html#viewItem", + propertyGroups = StudioPropertyGroups.TextUserMenuItemDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID, required = true), @StudioProperty(xmlAttribute = "text", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.LOCALIZED_STRING, required = true), @@ -761,6 +854,10 @@ interface StudioElements { "io.jmix.flowui.component.propertyfilter.PropertyFilter", "io.jmix.flowui.component.jpqlfilter.JpqlFilter", "io.jmix.flowui.component.menufilterfield.MenuFilterField"}, + propertyGroups = { + StudioPropertyGroups.RequiredText.class, + StudioPropertyGroups.HideDelay.class + }, properties = { @StudioProperty(xmlAttribute = "text", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.LOCALIZED_STRING, required = true), @StudioProperty(xmlAttribute = "focusDelay", type = StudioPropertyType.INTEGER), @@ -783,6 +880,9 @@ interface StudioElements { xmlElement = "pagination", target = {"io.jmix.flowui.facet.UrlQueryParametersFacet"}, icon = "io/jmix/flowui/kit/meta/icon/element/pagination.svg", + propertyGroups = { + StudioPropertyGroups.Id.class + }, properties = { @StudioProperty(xmlAttribute = "component", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_REF, componentRefTags = {"simplePagination"}, required = true), @@ -799,6 +899,7 @@ interface StudioElements { xmlElement = "propertyFilter", target = {"io.jmix.flowui.facet.UrlQueryParametersFacet"}, icon = "io/jmix/flowui/kit/meta/icon/element/filter.svg", + propertyGroups = StudioPropertyGroups.IdAndParam.class, properties = { @StudioProperty(xmlAttribute = "component", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_REF, componentRefTags = "propertyFilter", required = true), @@ -813,6 +914,7 @@ interface StudioElements { classFqn = "io.jmix.flowui.facet.urlqueryparameters.DataGridFilterUrlQueryParametersBinder", xmlElement = "dataGridFilter", target = {"io.jmix.flowui.facet.UrlQueryParametersFacet"}, + propertyGroups = StudioPropertyGroups.IdAndParam.class, properties = { @StudioProperty(xmlAttribute = "component", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_REF, componentRefTags = "dataGridFilter", required = true), @@ -827,6 +929,7 @@ interface StudioElements { classFqn = "com.vaadin.flow.component.formlayout.FormLayout.ResponsiveStep", xmlElement = "responsiveStep", documentationLink = "%VERSION%/flow-ui/vc/layouts/formLayout.html#responsive-steps", + propertyGroups = StudioPropertyGroups.ResponsiveStepDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "minWidth", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.SIZE, options = {"AUTO", "100%"}, required = true), @StudioProperty(xmlAttribute = "columns", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.INTEGER, required = true), @@ -849,6 +952,14 @@ interface StudioElements { maxCount = 1 ) ), + propertyGroups = { + StudioPropertyGroups.ClassNames.class, + StudioPropertyGroups.ClickShortcut.class, + StudioPropertyGroups.Colspan.class, + StudioPropertyGroups.Label.class, + StudioPropertyGroups.EnabledWithTrueDefaultValue.class, + StudioPropertyGroups.IdAndVisible.class + }, properties = { @StudioProperty(xmlAttribute = "classNames", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.VALUES_LIST), @StudioProperty(xmlAttribute = "clickShortcut", type = StudioPropertyType.SHORTCUT_COMBINATION), @@ -860,7 +971,6 @@ interface StudioElements { @StudioProperty(xmlAttribute = "visible", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.BOOLEAN, defaultValue = "true") } - ) FormLayout.FormItem formItem(); @@ -877,6 +987,7 @@ interface StudioElements { name = "ResponsiveStep", classFqn = "io.jmix.flowui.component.SupportsResponsiveSteps.ResponsiveStep", xmlElement = "responsiveStep", + propertyGroups = StudioPropertyGroups.ResponsiveStepDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "minWidth", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.SIZE, options = {"AUTO", "100%"}, required = true), @StudioProperty(xmlAttribute = "columns", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.INTEGER, required = true), @@ -894,6 +1005,23 @@ interface StudioElements { "io.jmix.flowui.component.logicalfilter.GroupFilter", "io.jmix.flowui.component.genericfilter.configuration.DesignTimeConfiguration" }, + propertyGroups = { + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.Colspan.class, + StudioPropertyGroups.DefaultValue.class, + StudioPropertyGroups.EnabledWithTrueDefaultValue.class, + StudioPropertyGroups.RequiredAndRequiredMessageAndErrorMessage.class, + StudioPropertyGroups.HelperText.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.Label.class, + StudioPropertyGroups.LabelVisible.class, + StudioPropertyGroups.OperationTextVisible.class, + StudioPropertyGroups.ParameterName.class, + StudioPropertyGroups.ReadOnly.class, + StudioPropertyGroups.TabIndex.class, + StudioPropertyGroups.FocusShortcut.class, + StudioPropertyGroups.ThemeNames.class + }, properties = { @StudioProperty(xmlAttribute = "classNames", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.VALUES_LIST), @StudioProperty(xmlAttribute = "css", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.STRING), @@ -943,6 +1071,24 @@ interface StudioElements { "io.jmix.flowui.component.logicalfilter.GroupFilter", "io.jmix.flowui.component.genericfilter.configuration.DesignTimeConfiguration" }, + propertyGroups = { + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.Colspan.class, + StudioPropertyGroups.DefaultValue.class, + StudioPropertyGroups.EnabledWithTrueDefaultValue.class, + StudioPropertyGroups.RequiredAndRequiredMessageAndErrorMessage.class, + StudioPropertyGroups.HasInExpression.class, + StudioPropertyGroups.HelperText.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.Label.class, + StudioPropertyGroups.LabelVisible.class, + StudioPropertyGroups.ParameterName.class, + StudioPropertyGroups.ReadOnly.class, + StudioPropertyGroups.TabIndex.class, + StudioPropertyGroups.FocusShortcut.class, + StudioPropertyGroups.ThemeNames.class, + StudioPropertyGroups.Width.class + }, properties = { @StudioProperty(xmlAttribute = "classNames", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.VALUES_LIST), @StudioProperty(xmlAttribute = "css", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.STRING), @@ -1008,6 +1154,14 @@ interface StudioElements { "io.jmix.flowui.component.logicalfilter.GroupFilter", "io.jmix.flowui.component.genericfilter.configuration.DesignTimeConfiguration" }, + propertyGroups = { + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.Colspan.class, + StudioPropertyGroups.EnabledWithTrueDefaultValue.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.OperationTextVisible.class, + StudioPropertyGroups.SummaryText.class + }, properties = { @StudioProperty(xmlAttribute = "classNames", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.VALUES_LIST), @StudioProperty(xmlAttribute = "css", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.STRING), @@ -1032,6 +1186,9 @@ interface StudioElements { classFqn = "io.jmix.flowui.component.genericfilter.configuration.DesignTimeConfiguration", xmlElement = "configuration", icon = "io/jmix/flowui/kit/meta/icon/element/configuration.svg", + propertyGroups = { + StudioPropertyGroups.RequiredId.class, + }, properties = { @StudioProperty(xmlAttribute = "default", type = StudioPropertyType.BOOLEAN), @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID, required = true), @@ -1049,6 +1206,9 @@ interface StudioElements { xmlElement = "properties", icon = "io/jmix/flowui/kit/meta/icon/element/property.svg", target = {"io.jmix.flowui.component.genericfilter.GenericFilter"}, + propertyGroups = { + StudioPropertyGroups.Exclude.class + }, properties = { @StudioProperty(xmlAttribute = "include", type = StudioPropertyType.STRING, required = true), @StudioProperty(xmlAttribute = "exclude", type = StudioPropertyType.STRING), @@ -1071,6 +1231,11 @@ interface StudioElements { "io.jmix.flowui.component.multiselectcombobox.JmixMultiSelectComboBox", "io.jmix.flowui.component.multiselectcomboboxpicker.JmixMultiSelectComboBoxPicker" }, + propertyGroups = { + StudioPropertyGroups.SearchStringFormat.class, + StudioPropertyGroups.EscapeValueForLike.class, + StudioPropertyGroups.Query.class + }, properties = { @StudioProperty(xmlAttribute = "searchStringFormat", type = StudioPropertyType.STRING), @StudioProperty(xmlAttribute = "escapeValueForLike", type = StudioPropertyType.BOOLEAN, @@ -1092,11 +1257,17 @@ interface StudioElements { "io.jmix.flowui.component.multiselectcombobox.JmixMultiSelectComboBox", "io.jmix.flowui.component.multiselectcomboboxpicker.JmixMultiSelectComboBoxPicker" }, + propertyGroups = { + StudioPropertyGroups.RequiredEntityClass.class, + StudioPropertyGroups.SearchStringFormat.class, + StudioPropertyGroups.EscapeValueForLike.class, + StudioPropertyGroups.Query.class, + StudioPropertyGroups.FetchPlan.class + }, properties = { @StudioProperty(xmlAttribute = "class", type = StudioPropertyType.ENTITY_CLASS, required = true), @StudioProperty(xmlAttribute = "searchStringFormat", type = StudioPropertyType.STRING), - @StudioProperty(xmlAttribute = "escapeValueForLike", type = StudioPropertyType.BOOLEAN, - defaultValue = "false"), + @StudioProperty(xmlAttribute = "escapeValueForLike", type = StudioPropertyType.BOOLEAN, defaultValue = "false"), @StudioProperty(xmlAttribute = "query", type = StudioPropertyType.JPA_QUERY), @StudioProperty(xmlAttribute = "fetchPlan", type = StudioPropertyType.FETCH_PLAN) } @@ -1117,6 +1288,13 @@ interface StudioElements { "io.jmix.flowui.component.combobox.JmixComboBox", "io.jmix.flowui.component.combobox.EntityComboBox" }, + propertyGroups = { + StudioPropertyGroups.EntityClass.class, + StudioPropertyGroups.SearchStringFormat.class, + StudioPropertyGroups.EscapeValueForLike.class, + StudioPropertyGroups.Query.class, + StudioPropertyGroups.FetchPlan.class + }, properties = { @StudioProperty(xmlAttribute = "class", type = StudioPropertyType.ENTITY_CLASS), @StudioProperty(xmlAttribute = "searchStringFormat", type = StudioPropertyType.STRING), @@ -1249,6 +1427,9 @@ interface StudioElements { icon = "io/jmix/flowui/kit/meta/icon/component/icon.svg", documentationLink = "%VERSION%/flow-ui/vc/components/icon.html", isInjectable = false, + propertyGroups = { + StudioPropertyGroups.IconDefaultProperties.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1285,6 +1466,9 @@ interface StudioElements { "io.jmix.flowui.kit.component.stub.DownloadButtonIconElement"}, icon = "io/jmix/flowui/kit/meta/icon/component/svgIcon.svg", isInjectable = false, + propertyGroups = { + StudioPropertyGroups.SvgIconDefaultProperties.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1322,6 +1506,9 @@ interface StudioElements { "io.jmix.flowui.kit.component.stub.DownloadButtonIconElement"}, icon = "io/jmix/flowui/kit/meta/icon/component/fontIcon.svg", isInjectable = false, + propertyGroups = { + StudioPropertyGroups.FontIconDefaultProperties.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1362,6 +1549,28 @@ interface StudioElements { icon = "io/jmix/flowui/kit/meta/icon/html/image.svg", documentationLink = "%VERSION%/flow-ui/vc/html-components/image.html", isInjectable = false, + propertyGroups = { + StudioPropertyGroups.AlignSelfAndJustifySelfAndColspan.class, + StudioPropertyGroups.AlternateText.class, + StudioPropertyGroups.AriaLabelAndLabelledBy.class, + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.ClickShortcut.class, + StudioPropertyGroups.CollectionOrInstanceDataContainer.class, + StudioPropertyGroups.EnabledWithTrueDefaultValue.class, + StudioPropertyGroups.Height.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.MaxHeight.class, + StudioPropertyGroups.MaxWidth.class, + StudioPropertyGroups.MinHeight.class, + StudioPropertyGroups.MinWidth.class, + StudioPropertyGroups.Property.class, + StudioPropertyGroups.ImageResource.class, + StudioPropertyGroups.Text.class, + StudioPropertyGroups.ImageThemeNames.class, + StudioPropertyGroups.Title.class, + StudioPropertyGroups.WhiteSpace.class, + StudioPropertyGroups.Width.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -1433,6 +1642,9 @@ interface StudioElements { name = "Component", xmlElement = "component", target = "io.jmix.flowui.facet.SettingsFacet", + propertyGroups = { + StudioPropertyGroups.Enabled.class + }, properties = { @StudioProperty(xmlAttribute = "componentId", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.STRING, required = true), @StudioProperty(xmlAttribute = "enabled", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.BOOLEAN) @@ -1446,6 +1658,9 @@ interface StudioElements { name = "MenuItem", xmlElement = "menuItem", target = {"io.jmix.flowui.component.gridcolumnvisibility.JmixGridColumnVisibility"}, + propertyGroups = { + StudioPropertyGroups.Text.class + }, properties = { @StudioProperty(xmlAttribute = "refColumn", type = StudioPropertyType.COMPONENT_REF, componentRefTags = {"column"}, required = true), @@ -1461,6 +1676,10 @@ interface StudioElements { classFqn = "io.jmix.flowui.kit.component.grid.JmixGridContextMenu", unlimitedCount = false, target = {"io.jmix.flowui.component.grid.DataGrid", "io.jmix.flowui.component.grid.TreeDataGrid"}, + propertyGroups = { + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.IdAndVisible.class + }, properties = { @StudioProperty(xmlAttribute = "classNames", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.VALUES_LIST), @StudioProperty(xmlAttribute = "css", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.STRING), @@ -1493,6 +1712,14 @@ interface StudioElements { classFqn = "com.vaadin.flow.component.grid.contextmenu.GridMenuItem", target = {"io.jmix.flowui.kit.component.grid.JmixGridContextMenu", "com.vaadin.flow.component.grid.contextmenu.GridMenuItem"}, + propertyGroups = { + StudioPropertyGroups.Action.class, + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.EnabledWithTrueDefaultValue.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.Text.class, + StudioPropertyGroups.WhiteSpace.class + }, properties = { @StudioProperty(xmlAttribute = "action", type = StudioPropertyType.ACTION_REF, classFqn = "io.jmix.flowui.kit.action.Action"), @@ -1588,6 +1815,9 @@ interface StudioElements { }, unlimitedCount = false, isInjectable = false, + propertyGroups = { + StudioPropertyGroups.RequiredFragmentClass.class + }, properties = { @StudioProperty(xmlAttribute = "class", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.FRAGMENT_CLASS, required = true) diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/element/StudioFormatterElements.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/element/StudioFormatterElements.java index a8afd84f33..5e9ed447be 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/element/StudioFormatterElements.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/element/StudioFormatterElements.java @@ -20,6 +20,7 @@ import io.jmix.flowui.kit.meta.StudioProperty; import io.jmix.flowui.kit.meta.StudioPropertyType; import io.jmix.flowui.kit.meta.StudioUiKit; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; @StudioUiKit interface StudioFormatterElements { @@ -39,6 +40,9 @@ interface StudioFormatterElements { xmlElement = "custom", icon = "io/jmix/flowui/kit/meta/icon/element/formatter.svg", documentationLink = "%VERSION%/flow-ui/vc/miscellaneous/formatter.html#custom-formatter", + propertyGroups = { + StudioPropertyGroups.Bean.class + }, properties = { @StudioProperty(xmlAttribute = "bean", type = StudioPropertyType.STRING, required = true) } diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/element/StudioHTMLElements.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/element/StudioHTMLElements.java index bb81a50f4d..8799477059 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/element/StudioHTMLElements.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/element/StudioHTMLElements.java @@ -21,6 +21,7 @@ import io.jmix.flowui.kit.meta.StudioProperty; import io.jmix.flowui.kit.meta.StudioPropertyType; import io.jmix.flowui.kit.meta.StudioUiKit; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; @StudioUiKit interface StudioHTMLElements { @@ -31,6 +32,7 @@ interface StudioHTMLElements { xmlElement = "description", target = {"com.vaadin.flow.component.html.DescriptionList"}, visible = true, + propertyGroups = StudioPropertyGroups.HtmlTextElementDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "classNames", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.VALUES_LIST), @StudioProperty(xmlAttribute = "clickShortcut", type = StudioPropertyType.SHORTCUT_COMBINATION), @@ -64,6 +66,7 @@ interface StudioHTMLElements { xmlElement = "term", target = "com.vaadin.flow.component.html.DescriptionList", visible = true, + propertyGroups = StudioPropertyGroups.HtmlTextElementDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "classNames", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.VALUES_LIST), @StudioProperty(xmlAttribute = "clickShortcut", type = StudioPropertyType.SHORTCUT_COMBINATION), diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/element/StudioMainViewElements.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/element/StudioMainViewElements.java index 0934a51d5b..3fa1541e87 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/element/StudioMainViewElements.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/element/StudioMainViewElements.java @@ -31,6 +31,9 @@ interface StudioMainViewElements { icon = "io/jmix/flowui/kit/meta/icon/element/navigationBar.svg", unlimitedCount = false, visible = true, + propertyGroups = { + StudioPropertyGroups.Css.class + }, properties = { @StudioProperty(xmlAttribute = "css", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.STRING), @StudioProperty(xmlAttribute = "touchOptimized", type = StudioPropertyType.BOOLEAN, @@ -47,6 +50,9 @@ interface StudioMainViewElements { unlimitedCount = false, visible = true, target = {"com.vaadin.flow.component.applayout.AppLayout"}, + propertyGroups = { + StudioPropertyGroups.Css.class + }, properties = { @StudioProperty(xmlAttribute = "css", category = StudioProperty.Category.LOOK_AND_FEEL, type = StudioPropertyType.STRING) } @@ -61,6 +67,25 @@ interface StudioMainViewElements { target = {"com.vaadin.flow.component.applayout.AppLayout", "io.jmix.tabbedmode.component.workarea.WorkArea"}, unlimitedCount = false, visible = true, + propertyGroups = { + StudioPropertyGroups.Id.class, + StudioPropertyGroups.AlignItems.class, + StudioPropertyGroups.BoxSizing.class, + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.EnabledWithTrueDefaultValue.class, + StudioPropertyGroups.Expand.class, + StudioPropertyGroups.Height.class, + StudioPropertyGroups.JustifyContent.class, + StudioPropertyGroups.Margin.class, + StudioPropertyGroups.MaxHeight.class, + StudioPropertyGroups.MaxWidth.class, + StudioPropertyGroups.MinHeight.class, + StudioPropertyGroups.MinWidth.class, + StudioPropertyGroups.Padding.class, + StudioPropertyGroups.Spacing.class, + StudioPropertyGroups.LayoutThemeNames.class, + StudioPropertyGroups.WidthWithDefaultValue100.class + }, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_ID), @StudioProperty(xmlAttribute = "alignItems", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/element/StudioValidatorsElements.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/element/StudioValidatorsElements.java index 62b33e1962..520b050fc8 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/element/StudioValidatorsElements.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/element/StudioValidatorsElements.java @@ -20,6 +20,7 @@ import io.jmix.flowui.kit.meta.StudioProperty; import io.jmix.flowui.kit.meta.StudioPropertyType; import io.jmix.flowui.kit.meta.StudioUiKit; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; @StudioUiKit interface StudioValidatorsElements { @@ -30,6 +31,10 @@ interface StudioValidatorsElements { xmlElement = "custom", icon = "io/jmix/flowui/kit/meta/icon/element/validator.svg", documentationLink = "%VERSION%/flow-ui/vc/miscellaneous/validator.html#custom-validator", + propertyGroups = { + StudioPropertyGroups.Bean.class, + StudioPropertyGroups.Message.class + }, properties = { @StudioProperty( xmlAttribute = "bean", @@ -65,6 +70,7 @@ interface StudioValidatorsElements { "io.jmix.flowui.component.valuepicker.EntityPicker", "io.jmix.flowui.component.codeeditor.CodeEditor" }, + propertyGroups = StudioPropertyGroups.MessageAndInclusiveRequiredStringValue.class, properties = { @StudioProperty( xmlAttribute = "message", @@ -104,6 +110,7 @@ interface StudioValidatorsElements { "io.jmix.flowui.component.valuepicker.EntityPicker", "io.jmix.flowui.component.codeeditor.CodeEditor" }, + propertyGroups = StudioPropertyGroups.MessageAndInclusiveRequiredStringValue.class, properties = { @StudioProperty( xmlAttribute = "message", @@ -142,6 +149,10 @@ interface StudioValidatorsElements { xmlElement = "digits", icon = "io/jmix/flowui/kit/meta/icon/element/validator.svg", documentationLink = "%VERSION%/flow-ui/vc/miscellaneous/validator.html#DigitsValidator", + propertyGroups = { + StudioPropertyGroups.Message.class, + StudioPropertyGroups.RequiredInteger.class, + }, properties = { @StudioProperty( xmlAttribute = "message", @@ -181,6 +192,7 @@ interface StudioValidatorsElements { "io.jmix.flowui.component.valuepicker.EntityPicker", "io.jmix.flowui.component.codeeditor.CodeEditor" }, + propertyGroups = StudioPropertyGroups.MessageAndInclusiveRequiredStringValue.class, properties = { @StudioProperty( xmlAttribute = "message", @@ -220,6 +232,7 @@ interface StudioValidatorsElements { "io.jmix.flowui.component.valuepicker.EntityPicker", "io.jmix.flowui.component.codeeditor.CodeEditor" }, + propertyGroups = StudioPropertyGroups.MessageAndInclusiveRequiredStringValue.class, properties = { @StudioProperty( xmlAttribute = "message", @@ -256,6 +269,9 @@ interface StudioValidatorsElements { "io.jmix.flowui.component.valuepicker.EntityPicker", "io.jmix.flowui.component.textfield.JmixBigDecimalField" }, + propertyGroups = { + StudioPropertyGroups.Message.class + }, properties = { @StudioProperty( xmlAttribute = "message", @@ -286,6 +302,7 @@ interface StudioValidatorsElements { "io.jmix.flowui.component.PickerComponent", "io.jmix.flowui.component.codeeditor.CodeEditor" }, + propertyGroups = StudioPropertyGroups.MessageAndCheckSeconds.class, properties = { @StudioProperty( xmlAttribute = "message", @@ -321,6 +338,7 @@ interface StudioValidatorsElements { "io.jmix.flowui.component.PickerComponent", "io.jmix.flowui.component.codeeditor.CodeEditor" }, + propertyGroups = StudioPropertyGroups.MessageAndCheckSeconds.class, properties = { @StudioProperty( xmlAttribute = "message", @@ -355,6 +373,7 @@ interface StudioValidatorsElements { "io.jmix.flowui.component.valuepicker.EntityPicker", "io.jmix.flowui.component.codeeditor.CodeEditor" }, + propertyGroups = StudioPropertyGroups.MessageAndRequiredStringValue.class, properties = { @StudioProperty( xmlAttribute = "message", @@ -389,6 +408,7 @@ interface StudioValidatorsElements { "io.jmix.flowui.component.valuepicker.EntityPicker", "io.jmix.flowui.component.codeeditor.CodeEditor" }, + propertyGroups = StudioPropertyGroups.MessageAndRequiredStringValue.class, properties = { @StudioProperty( xmlAttribute = "message", @@ -422,6 +442,9 @@ interface StudioValidatorsElements { "io.jmix.flowui.component.valuepicker.EntityPicker", "io.jmix.flowui.component.codeeditor.CodeEditor" }, + propertyGroups = { + StudioPropertyGroups.Message.class + }, properties = { @StudioProperty( xmlAttribute = "message", @@ -450,6 +473,9 @@ interface StudioValidatorsElements { "io.jmix.flowui.component.valuepicker.EntityPicker", "io.jmix.flowui.component.codeeditor.CodeEditor" }, + propertyGroups = { + StudioPropertyGroups.Message.class + }, properties = { @StudioProperty( xmlAttribute = "message", @@ -477,6 +503,9 @@ interface StudioValidatorsElements { "io.jmix.flowui.component.valuepicker.EntityPicker", "io.jmix.flowui.component.textfield.JmixBigDecimalField" }, + propertyGroups = { + StudioPropertyGroups.Message.class + }, properties = { @StudioProperty( xmlAttribute = "message", @@ -502,6 +531,9 @@ interface StudioValidatorsElements { "io.jmix.flowui.component.valuepicker.EntityPicker", "io.jmix.flowui.component.textfield.JmixBigDecimalField" }, + propertyGroups = { + StudioPropertyGroups.Message.class + }, properties = { @StudioProperty( xmlAttribute = "message", @@ -517,6 +549,9 @@ interface StudioValidatorsElements { xmlElement = "notNull", icon = "io/jmix/flowui/kit/meta/icon/element/validator.svg", documentationLink = "%VERSION%/flow-ui/vc/miscellaneous/validator.html#NotNullValidator", + propertyGroups = { + StudioPropertyGroups.Message.class + }, properties = { @StudioProperty( xmlAttribute = "message", @@ -547,6 +582,7 @@ interface StudioValidatorsElements { "io.jmix.flowui.component.PickerComponent", "io.jmix.flowui.component.codeeditor.CodeEditor" }, + propertyGroups = StudioPropertyGroups.MessageAndCheckSeconds.class, properties = { @StudioProperty( xmlAttribute = "message", @@ -582,6 +618,7 @@ interface StudioValidatorsElements { "io.jmix.flowui.component.PickerComponent", "io.jmix.flowui.component.codeeditor.CodeEditor" }, + propertyGroups = StudioPropertyGroups.MessageAndCheckSeconds.class, properties = { @StudioProperty( xmlAttribute = "message", @@ -615,6 +652,9 @@ interface StudioValidatorsElements { "io.jmix.flowui.component.valuepicker.EntityPicker", "io.jmix.flowui.component.codeeditor.CodeEditor" }, + propertyGroups = { + StudioPropertyGroups.Message.class + }, properties = { @StudioProperty( xmlAttribute = "message", @@ -643,6 +683,9 @@ interface StudioValidatorsElements { "io.jmix.flowui.component.valuepicker.EntityPicker", "io.jmix.flowui.component.codeeditor.CodeEditor" }, + propertyGroups = { + StudioPropertyGroups.Message.class + }, properties = { @StudioProperty( xmlAttribute = "message", @@ -670,6 +713,9 @@ interface StudioValidatorsElements { "io.jmix.flowui.component.valuepicker.EntityPicker", "io.jmix.flowui.component.textfield.JmixBigDecimalField" }, + propertyGroups = { + StudioPropertyGroups.Message.class + }, properties = { @StudioProperty( xmlAttribute = "message", @@ -700,6 +746,11 @@ interface StudioValidatorsElements { "io.jmix.flowui.component.valuepicker.EntityPicker", "io.jmix.flowui.component.textfield.JmixBigDecimalField" }, + propertyGroups = { + StudioPropertyGroups.Message.class, + StudioPropertyGroups.IntegerMin.class, + StudioPropertyGroups.IntegerMax.class + }, properties = { @StudioProperty( xmlAttribute = "message", diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/elementsgroup/StudioElementsGroups.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/elementsgroup/StudioElementsGroups.java index 7f6a53de19..0beec5eb28 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/elementsgroup/StudioElementsGroups.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/elementsgroup/StudioElementsGroups.java @@ -17,12 +17,12 @@ package io.jmix.flowui.kit.meta.elementsgroup; import io.jmix.flowui.kit.meta.StudioElementsGroup; -import io.jmix.flowui.kit.meta.StudioMetaConstants; import io.jmix.flowui.kit.meta.StudioProperty; import io.jmix.flowui.kit.meta.StudioPropertyType; import io.jmix.flowui.kit.meta.StudioUiKit; import static io.jmix.flowui.kit.meta.StudioMetaConstants.TAG_PREFIX; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; @StudioUiKit interface StudioElementsGroups { @@ -34,6 +34,11 @@ interface StudioElementsGroups { icon = "io/jmix/flowui/kit/meta/icon/elementsgroup/columns.svg", target = {"com.vaadin.flow.component.grid.Grid"}, documentationLink = "%VERSION%/flow-ui/vc/components/dataGrid.html#columns", + propertyGroups = { + StudioPropertyGroups.Exclude.class, + StudioPropertyGroups.Sortable.class, + StudioPropertyGroups.IncludeAll.class + }, properties = { @StudioProperty(xmlAttribute = "exclude", type = StudioPropertyType.STRING), @StudioProperty(xmlAttribute = "sortable", type = StudioPropertyType.BOOLEAN, @@ -71,8 +76,8 @@ interface StudioElementsGroups { name = "Items", elementClassFqn = "io.jmix.flowui.kit.component.usermenu.UserMenuItem", xmlElement = "items", - target = {"io.jmix.flowui.component.usermenu.UserMenu"} -// documentationLink = "%VERSION%/flow-ui/vc/components/dropdownButton.html#_elements" + target = {"io.jmix.flowui.component.usermenu.UserMenu"}, + documentationLink = "%VERSION%/flow-ui/vc/components/dropdownButton.html#_elements" ) void userMenuItems(); @@ -85,8 +90,8 @@ interface StudioElementsGroups { "io.jmix.flowui.kit.component.stub.UserMenuStubSeparatorItem", "io.jmix.flowui.kit.component.usermenu.ActionUserMenuItem", "io.jmix.flowui.component.usermenu.ViewUserMenuItem" - } -// documentationLink = "%VERSION%/flow-ui/vc/components/dropdownButton.html#_elements" + }, + documentationLink = "%VERSION%/flow-ui/vc/components/dropdownButton.html#_elements" ) void userMenuItemItems(); diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/facet/StudioFacets.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/facet/StudioFacets.java index 86f2f27644..54688ae89b 100644 --- a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/facet/StudioFacets.java +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/facet/StudioFacets.java @@ -20,6 +20,7 @@ import io.jmix.flowui.kit.meta.StudioProperty; import io.jmix.flowui.kit.meta.StudioPropertyType; import io.jmix.flowui.kit.meta.StudioUiKit; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; @StudioUiKit interface StudioFacets { @@ -31,6 +32,7 @@ interface StudioFacets { xmlElement = "dataLoadCoordinator", icon = "io/jmix/flowui/kit/meta/icon/facet/dataLoadCoordinator.svg", documentationLink = "%VERSION%/flow-ui/facets/dataLoadCoordinator.html", + propertyGroups = StudioPropertyGroups.DataLoadCoordinatorDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "id", type = StudioPropertyType.COMPONENT_ID), @StudioProperty(xmlAttribute = "auto", type = StudioPropertyType.BOOLEAN, @@ -50,6 +52,7 @@ interface StudioFacets { xmlElement = "fragmentDataLoadCoordinator", icon = "io/jmix/flowui/kit/meta/icon/facet/dataLoadCoordinator.svg", documentationLink = "%VERSION%/flow-ui/facets/dataLoadCoordinator.html", + propertyGroups = StudioPropertyGroups.DataLoadCoordinatorDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "id", type = StudioPropertyType.COMPONENT_ID), @StudioProperty(xmlAttribute = "auto", type = StudioPropertyType.BOOLEAN, @@ -69,9 +72,8 @@ interface StudioFacets { xmlElement = "urlQueryParameters", icon = "io/jmix/flowui/kit/meta/icon/facet/urlQueryParameters.svg", documentationLink = "%VERSION%/flow-ui/facets/urlQueryParameters.html", - properties = { - @StudioProperty(xmlAttribute = "id", type = StudioPropertyType.COMPONENT_ID), - } + propertyGroups = StudioPropertyGroups.IdWithoutCategory.class, + properties = @StudioProperty(xmlAttribute = "id", type = StudioPropertyType.COMPONENT_ID) ) void queryParameters(); @@ -97,6 +99,7 @@ interface StudioFacets { category = "Facets", xmlElement = "settings", icon = "io/jmix/flowui/kit/meta/icon/facet/settings.svg", + propertyGroups = StudioPropertyGroups.SettingsDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "id", type = StudioPropertyType.COMPONENT_ID), @StudioProperty(xmlAttribute = "auto", type = StudioPropertyType.BOOLEAN, @@ -111,6 +114,7 @@ interface StudioFacets { category = "Facets", xmlElement = "fragmentSettings", icon = "io/jmix/flowui/kit/meta/icon/facet/settings.svg", + propertyGroups = StudioPropertyGroups.SettingsDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "id", type = StudioPropertyType.COMPONENT_ID), @StudioProperty(xmlAttribute = "auto", type = StudioPropertyType.BOOLEAN, diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/generator/README.md b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/generator/README.md new file mode 100644 index 0000000000..2684d62631 --- /dev/null +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/generator/README.md @@ -0,0 +1,88 @@ +# Studio Meta Generator + +This package contains internal tooling for generating Studio meta-annotations from Flow UI XSD schemas. + +The generator is intended for framework developers who add or update XSD elements and then need a starting point +for `@StudioComponent`, `@StudioElement`, `@StudioAction`, `@StudioFacet` or `@StudioDataComponent` +descriptions. + +## Main Classes + +- `StudioMetaDescriptionGenerator` parses XSD files, resolves referenced types and attributes, infers a meta kind + and renders Java source with `properties`, `propertyGroups`, TODO comments and child element hints. +- `StudioPropertyGroupsMatcher` scans existing `@StudioPropertyGroup` declarations and adds only exact + `propertyGroups` matches. +- `StudioXsdElementCandidate` describes a concrete XSD element match together with its context. +- `StudioMetaGenerationResult` contains the generated source, output path and collected TODOs. + +## Programmatic Usage + +Typical flow: + +1. Resolve the workspace root with `StudioMetaDescriptionGenerator.detectWorkspaceRoot(...)`. +2. Create `StudioMetaDescriptionGenerator`. +3. Find matching XSD elements with `findElementCandidates(...)`. +4. Pick the exact `StudioXsdElementCandidate`. +5. Compute the default output path with `getDefaultOutputPath(...)` or provide your own path. +6. Call `generate(...)` to preview the source or `write(...)` to create or update the Java file. + +Example: + +```java +Path workspaceRoot = StudioMetaDescriptionGenerator.detectWorkspaceRoot(Path.of("").toAbsolutePath()); +StudioMetaDescriptionGenerator generator = new StudioMetaDescriptionGenerator(workspaceRoot); + +Path schemaPath = workspaceRoot.resolve("jmix/jmix-flowui/flowui/src/main/resources/io/jmix/flowui/view/layout.xsd"); +StudioXsdElementCandidate candidate = generator.findElementCandidates(schemaPath, "button").get(0); + +Path outputPath = generator.getDefaultOutputPath(candidate); +StudioMetaGenerationResult result = generator.write(candidate, StudioMetaKind.AUTO, outputPath); +``` + +## CLI + +`StudioMetaDescriptionGenerator.Cli` is a thin command-line wrapper over the API. +It is not packaged as a separate distribution and is usually started from IDE run configuration or from a custom +Java launch with the `flowui-kit` runtime classpath. + +Example: + +```bash +java io.jmix.flowui.kit.meta.generator.StudioMetaDescriptionGenerator\$Cli \ + --root /path/to/jmix-all \ + --xsd /path/to/layout.xsd \ + --element button \ + --output /path/to/StudioButtonGenerated.java \ + --kind auto +``` + +Arguments: + +- `--root` points to the workspace root. +- `--xsd` points to the source schema. +- `--element` is the target XSD element name. +- `--output` is the file to create or update. +- `--kind` overrides automatic kind detection. Supported values: `auto`, `component`, `element`, `action`, + `facet`, `data-component`. +- `--list-schemas` prints discovered schemas under the workspace root. In this mode only `--root` is required. + +If several XSD elements share the same name, the CLI asks to choose the exact candidate by number. + +## Generated Output + +The generator intentionally keeps the output conservative. + +- Existing inline `properties` are always generated. +- `propertyGroups` are added only for exact matches against existing groups. +- Uncertain values are left as TODO comments instead of guessing. +- Child element declarations are reported as TODO comments when nested meta descriptions may also be needed. + +Generated source is a starting point for manual review, not a final replacement for hand-written meta descriptions. + +## Tests + +Integration-style tests for this package are located in the `flowui` module: + +- `jmix-flowui/flowui/src/test/groovy/io/jmix/flowui/kit/meta/generator` + +They validate generation against existing framework meta descriptions and dedicated test fixtures. diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/generator/StudioMetaDescriptionGenerator.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/generator/StudioMetaDescriptionGenerator.java new file mode 100644 index 0000000000..7950af6ec4 --- /dev/null +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/generator/StudioMetaDescriptionGenerator.java @@ -0,0 +1,1982 @@ +/* + * Copyright 2026 Haulmont. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.jmix.flowui.kit.meta.generator; + +import org.jspecify.annotations.Nullable; +import org.w3c.dom.Attr; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import javax.xml.parsers.DocumentBuilderFactory; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.nio.file.FileVisitResult; +import java.nio.file.FileVisitOption; +import java.nio.file.FileVisitor; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.HashSet; +import java.util.IdentityHashMap; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static java.util.Objects.requireNonNullElseGet; + +/** + * Internal generator that builds Studio meta-annotation source code from Flow UI XSD schemas. + *

+ * The generator resolves XSD element inheritance, referenced attributes, attribute groups and child elements, + * infers the most suitable {@link StudioMetaKind}, converts XSD attribute definitions to + * {@code @StudioProperty} declarations and reuses existing {@code propertyGroups} when an exact match is found. + * It can either return the generated source for preview or write it to a new or existing {@code @StudioUiKit} + * source file. + *

+ * This class is intended for framework development tooling and is not part of the public runtime API. + */ +final class StudioMetaDescriptionGenerator { + + public static void main(String[] args) throws Exception { + CLI.run(args); + } + + private final Path schemaSearchRoot; + private final XsdRegistry registry; + private final StudioPropertyGroupsMatcher propertyGroupsMatcher; + + StudioMetaDescriptionGenerator(Path schemaSearchRoot) { + this.schemaSearchRoot = schemaSearchRoot.toAbsolutePath().normalize(); + this.registry = new XsdRegistry(this.schemaSearchRoot); + this.propertyGroupsMatcher = new StudioPropertyGroupsMatcher(this.schemaSearchRoot); + } + + static Path detectWorkspaceRoot(Path workingDirectory) { + Path current = workingDirectory.toAbsolutePath().normalize(); + while (current != null) { + if (Files.isDirectory(current.resolve("jmix")) + && Files.isDirectory(current.resolve("jmix-premium"))) { + return current; + } + if (Files.exists(current.resolve("settings.gradle")) + && Files.isDirectory(current.resolve("jmix-flowui"))) { + Path parent = current.getParent(); + if (parent != null && Files.isDirectory(parent.resolve("jmix-premium"))) { + return parent; + } + return current; + } + if (Files.exists(current.resolve("flowui-kit.gradle"))) { + Path moduleParent = current.getParent(); + if (moduleParent != null) { + Path gradleRoot = moduleParent.getParent(); + if (gradleRoot != null && Files.exists(gradleRoot.resolve("settings.gradle"))) { + Path workspaceRoot = gradleRoot.getParent(); + return workspaceRoot != null ? workspaceRoot : gradleRoot; + } + } + } + current = current.getParent(); + } + return workingDirectory.toAbsolutePath().normalize(); + } + + List findKnownSchemas() { + return registry.discoverSchemas(); + } + + List findElementCandidates(Path schemaPath, String elementIdentifier) { + Objects.requireNonNull(elementIdentifier, "elementIdentifier"); + return registry.findCandidates(resolveAbsolutePath(schemaPath), elementIdentifier); + } + + Path getDefaultOutputPath(StudioXsdElementCandidate candidate) { + Path moduleRoot = findModuleRoot(candidate.schemaPath()); + if (moduleRoot == null) { + throw new IllegalArgumentException("Cannot detect module root for " + candidate.schemaPath()); + } + + String basePackage = detectBasePackage(moduleRoot, candidate.schemaPath()); + Path packagePath = Path.of(basePackage.replace('.', '/')).resolve("kit").resolve("meta"); + String contextPrefix = ""; + if (GENERIC_METHOD_NAMES.contains(candidate.elementName())) { + List contextSource = !candidate.ancestorElements().isEmpty() + ? candidate.ancestorElements() + : candidate.contextNames().subList(0, Math.max(0, candidate.contextNames().size() - 1)); + if (!contextSource.isEmpty()) { + contextPrefix = toPascalCase(contextSource.get(contextSource.size() - 1)); + } + } + + String fileName = "Studio" + contextPrefix + toPascalCase(candidate.elementName()) + "Generated.java"; + return moduleRoot.resolve("src/main/java").resolve(packagePath).resolve(fileName).normalize(); + } + + StudioMetaGenerationResult generate(StudioXsdElementCandidate candidate, + StudioMetaKind forcedKind, + @Nullable Path outputPath) { + GeneratedMeta meta = createGeneratedMeta(candidate, forcedKind); + Path resolvedOutputPath = outputPath != null + ? resolveAbsolutePath(outputPath) + : getDefaultOutputPath(candidate); + String uniqueMethodName = ensureUniqueMethodName(resolvedOutputPath, meta.methodName()); + GeneratedMeta metaWithUniqueMethod = meta.withMethodName(uniqueMethodName); + String source; + if (Files.exists(resolvedOutputPath)) { + source = buildUpdatedSourceForExistingFile(resolvedOutputPath, renderAnnotation(metaWithUniqueMethod)); + } else { + source = buildJavaSource(resolvedOutputPath, metaWithUniqueMethod, candidate.schemaPath()); + } + return new StudioMetaGenerationResult(resolvedOutputPath, source, metaWithUniqueMethod.kind(), metaWithUniqueMethod.headerTodos()); + } + + StudioMetaGenerationResult write(StudioXsdElementCandidate candidate, + StudioMetaKind forcedKind, + @Nullable Path outputPath) throws IOException { + GeneratedMeta meta = createGeneratedMeta(candidate, forcedKind); + Path resolvedOutputPath = outputPath != null + ? resolveAbsolutePath(outputPath) + : getDefaultOutputPath(candidate); + String uniqueMethodName = ensureUniqueMethodName(resolvedOutputPath, meta.methodName()); + GeneratedMeta metaWithUniqueMethod = meta.withMethodName(uniqueMethodName); + + Files.createDirectories(resolvedOutputPath.getParent()); + if (Files.exists(resolvedOutputPath) && Files.size(resolvedOutputPath) > 0) { + Files.writeString(resolvedOutputPath, + buildUpdatedSourceForExistingFile(resolvedOutputPath, renderAnnotation(metaWithUniqueMethod)), + StandardCharsets.UTF_8); + String source = Files.readString(resolvedOutputPath, StandardCharsets.UTF_8); + return new StudioMetaGenerationResult(resolvedOutputPath, source, metaWithUniqueMethod.kind(), + metaWithUniqueMethod.headerTodos()); + } + + String source = buildJavaSource(resolvedOutputPath, metaWithUniqueMethod, candidate.schemaPath()); + Files.writeString(resolvedOutputPath, source, StandardCharsets.UTF_8); + return new StudioMetaGenerationResult(resolvedOutputPath, source, metaWithUniqueMethod.kind(), + metaWithUniqueMethod.headerTodos()); + } + + private GeneratedMeta createGeneratedMeta(StudioXsdElementCandidate candidate, StudioMetaKind forcedKind) { + DefinitionRef elementRef = resolveElementReference(candidate.document(), candidate.element()); + ResolvedType elementType = resolveElementType(elementRef); + LinkedHashMap attributes = collectAttributes(elementType.ref(), elementType.kind(), + new HashSet<>(), new HashSet<>()); + ChildrenInfo childrenInfo = collectChildren(elementType.ref(), elementType.kind(), new HashSet<>(), new HashSet<>()); + KindInfo kindInfo = inferKind(candidate, elementType.ref(), elementType.kind(), attributes, forcedKind); + + List properties = new ArrayList<>(); + for (AttributeInfo attributeInfo : attributes.values()) { + properties.add(inferProperty(attributeInfo, kindInfo.kind())); + } + List propertyGroups = propertyGroupsMatcher.findMatchingGroupFqns( + properties.stream() + .map(this::toPropertySignature) + .toList(), + findModuleRoot(candidate.schemaPath()) + ); + + String xmlns = candidate.document().targetNamespace().isEmpty() ? null : candidate.document().targetNamespace(); + String xmlnsAlias = inferXmlnsAlias(candidate.document()); + List headerTodos = buildHeaderTodos(candidate, kindInfo.kind(), xmlns, xmlnsAlias, properties, propertyGroups); + String methodName = buildMethodName(candidate, kindInfo.kind()); + + return new GeneratedMeta( + kindInfo.kind(), + kindInfo.kindComment(), + toPascalCase(candidate.elementName()), + candidate.elementName(), + FLOWUI_LAYOUT_NS.equals(candidate.document().targetNamespace()) ? null : xmlns, + xmlnsAlias, + headerTodos, + propertyGroups, + properties, + childrenInfo.childElements(), + childrenInfo.supportsAnyChildren(), + methodName, + kindInfo.kind() == StudioMetaKind.COMPONENT ? "Object" : "void" + ); + } + + private DefinitionRef resolveElementReference(SchemaDocument document, Element element) { + String ref = element.getAttribute("ref"); + if (ref.isEmpty()) { + return new DefinitionRef(document, element); + } + + QNameRef qNameRef = registry.resolveQName(ref, document); + DefinitionRef resolved = registry.findDefinition(registry.elementDefinitions, qNameRef); + return resolved != null ? resolved : new DefinitionRef(document, element); + } + + private ResolvedType resolveElementType(DefinitionRef elementRef) { + assert elementRef.element() != null : "Element reference must have an element"; + + Element inlineComplexType = firstChildElement(elementRef.element(), "complexType"); + if (inlineComplexType != null) { + return new ResolvedType(new DefinitionRef(elementRef.document(), inlineComplexType), "complex"); + } + + Element inlineSimpleType = firstChildElement(elementRef.element(), "simpleType"); + if (inlineSimpleType != null) { + return new ResolvedType(new DefinitionRef(elementRef.document(), inlineSimpleType), "simple"); + } + + String typeName = elementRef.element().getAttribute("type"); + if (typeName.isEmpty()) { + return new ResolvedType(null, null); + } + + QNameRef qNameRef = registry.resolveQName(typeName, elementRef.document()); + if (XS_NS.equals(qNameRef.namespace())) { + return new ResolvedType(new DefinitionRef(elementRef.document(), null, qNameRef), "builtin"); + } + + DefinitionRef complexType = registry.findDefinition(registry.complexTypeDefinitions, qNameRef); + if (complexType != null) { + return new ResolvedType(complexType, "complex"); + } + + DefinitionRef simpleType = registry.findDefinition(registry.simpleTypeDefinitions, qNameRef); + if (simpleType != null) { + return new ResolvedType(simpleType, "simple"); + } + + return new ResolvedType(new DefinitionRef(elementRef.document(), null, qNameRef), "unknown"); + } + + private LinkedHashMap collectAttributes(@Nullable DefinitionRef typeRef, + @Nullable String typeKind, + Set visitedTypes, + Set visitedGroups) { + LinkedHashMap attributes = new LinkedHashMap<>(); + if (typeRef == null || typeRef.element() == null || !Set.of("complex", "simple").contains(typeKind)) { + return attributes; + } + + VisitedNodeKey visitedNodeKey = new VisitedNodeKey(typeRef.document().path(), System.identityHashCode(typeRef.element())); + if (!visitedTypes.add(visitedNodeKey)) { + return attributes; + } + + Element baseContainer = typeRef.element(); + Element extension = findExtension(typeRef.element()); + Element restriction = findRestriction(typeRef.element()); + if (extension != null) { + String baseName = extension.getAttribute("base"); + if (!baseName.isEmpty()) { + QNameRef baseQName = registry.resolveQName(baseName, typeRef.document()); + DefinitionRef baseRef = registry.findDefinition(registry.complexTypeDefinitions, baseQName); + if (baseRef != null) { + attributes.putAll(collectAttributes(baseRef, "complex", visitedTypes, visitedGroups)); + } + } + baseContainer = extension; + } else if (restriction != null && "complex".equals(typeKind)) { + String baseName = restriction.getAttribute("base"); + if (!baseName.isEmpty()) { + QNameRef baseQName = registry.resolveQName(baseName, typeRef.document()); + DefinitionRef baseRef = registry.findDefinition(registry.complexTypeDefinitions, baseQName); + if (baseRef != null) { + attributes.putAll(collectAttributes(baseRef, "complex", visitedTypes, visitedGroups)); + } + } + baseContainer = restriction; + } + + for (Element child : childElements(baseContainer)) { + String childLocalName = localName(child); + if ("attribute".equals(childLocalName)) { + AttributeInfo attribute = resolveAttribute(typeRef.document(), child); + if (attribute != null) { + attributes.put(attribute.xmlAttribute(), attribute); + } + } else if ("attributeGroup".equals(childLocalName) && child.hasAttribute("ref")) { + QNameRef groupQName = registry.resolveQName(child.getAttribute("ref"), typeRef.document()); + DefinitionRef groupRef = registry.findDefinition(registry.attributeGroupDefinitions, groupQName); + if (groupRef == null || groupRef.element() == null) { + continue; + } + VisitedNodeKey groupKey = new VisitedNodeKey(groupRef.document().path(), System.identityHashCode(groupRef.element())); + if (!visitedGroups.add(groupKey)) { + continue; + } + attributes.putAll(collectAttributeGroup(groupRef, visitedTypes, visitedGroups)); + } + } + + return attributes; + } + + private LinkedHashMap collectAttributeGroup(DefinitionRef groupRef, + Set visitedTypes, + Set visitedGroups) { + LinkedHashMap attributes = new LinkedHashMap<>(); + if (groupRef.element() == null) { + return attributes; + } + + for (Element child : childElements(groupRef.element())) { + String childLocalName = localName(child); + if ("attribute".equals(childLocalName)) { + AttributeInfo attribute = resolveAttribute(groupRef.document(), child); + if (attribute != null) { + attributes.put(attribute.xmlAttribute(), attribute); + } + } else if ("attributeGroup".equals(childLocalName) && child.hasAttribute("ref")) { + QNameRef groupQName = registry.resolveQName(child.getAttribute("ref"), groupRef.document()); + DefinitionRef nestedGroupRef = registry.findDefinition(registry.attributeGroupDefinitions, groupQName); + if (nestedGroupRef == null || nestedGroupRef.element() == null) { + continue; + } + VisitedNodeKey nestedKey = new VisitedNodeKey(nestedGroupRef.document().path(), + System.identityHashCode(nestedGroupRef.element())); + if (!visitedGroups.add(nestedKey)) { + continue; + } + attributes.putAll(collectAttributeGroup(nestedGroupRef, visitedTypes, visitedGroups)); + } + } + + return attributes; + } + + private @Nullable AttributeInfo resolveAttribute(SchemaDocument document, Element attributeElement) { + Element targetElement = attributeElement; + SchemaDocument targetDocument = document; + if (attributeElement.hasAttribute("ref")) { + QNameRef refQName = registry.resolveQName(attributeElement.getAttribute("ref"), document); + DefinitionRef resolved = registry.findDefinition(registry.attributeDefinitions, refQName); + if (resolved != null && resolved.element() != null) { + targetElement = resolved.element(); + targetDocument = resolved.document(); + } + } + + String name = attributeElement.getAttribute("name"); + if (name.isEmpty()) { + name = targetElement.getAttribute("name"); + } + if (name.isEmpty()) { + return null; + } + + Element inlineSimpleType = firstChildElement(targetElement, "simpleType"); + String typeName = attributeElement.getAttribute("type"); + if (typeName.isEmpty()) { + typeName = targetElement.getAttribute("type"); + } + QNameRef typeQName = typeName.isEmpty() ? null : registry.resolveQName(typeName, targetDocument); + + String defaultValue = firstNonEmptyOrNull( + attributeElement.getAttribute("default"), + attributeElement.getAttribute("fixed"), + targetElement.getAttribute("default"), + targetElement.getAttribute("fixed") + ); + boolean required = "required".equals(firstNonEmptyOrNull(attributeElement.getAttribute("use"), targetElement.getAttribute("use"))); + + return new AttributeInfo(name, required, defaultValue, typeQName, inlineSimpleType, targetDocument, List.of()); + } + + private ChildrenInfo collectChildren(@Nullable DefinitionRef typeRef, + @Nullable String typeKind, + Set visitedTypes, + Set visitedGroups) { + if (typeRef == null || typeRef.element() == null || !Set.of("complex", "simple").contains(typeKind)) { + return new ChildrenInfo(List.of(), false); + } + + VisitedNodeKey visitedNodeKey = new VisitedNodeKey(typeRef.document().path(), System.identityHashCode(typeRef.element())); + if (!visitedTypes.add(visitedNodeKey)) { + return new ChildrenInfo(List.of(), false); + } + + Element extension = findExtension(typeRef.element()); + Element restriction = findRestriction(typeRef.element()); + Element baseContainer; + baseContainer = requireNonNullElseGet(extension, + () -> requireNonNullElseGet(restriction, typeRef::element)); + + List childNames = new ArrayList<>(); + boolean supportsAnyChildren = false; + if (extension != null && extension.hasAttribute("base")) { + QNameRef baseQName = registry.resolveQName(extension.getAttribute("base"), typeRef.document()); + DefinitionRef baseRef = registry.findDefinition(registry.complexTypeDefinitions, baseQName); + if (baseRef != null) { + ChildrenInfo baseChildren = collectChildren(baseRef, "complex", visitedTypes, visitedGroups); + childNames.addAll(baseChildren.childElements()); + supportsAnyChildren = baseChildren.supportsAnyChildren(); + } + } + + ChildrenInfo nestedChildren = collectChildrenFromContainer(baseContainer, typeRef.document(), visitedGroups); + childNames.addAll(nestedChildren.childElements()); + supportsAnyChildren = supportsAnyChildren || nestedChildren.supportsAnyChildren(); + + return new ChildrenInfo(new ArrayList<>(new LinkedHashSet<>(childNames)), supportsAnyChildren); + } + + private ChildrenInfo collectChildrenFromContainer(Element container, + SchemaDocument document, + Set visitedGroups) { + List childNames = new ArrayList<>(); + boolean supportsAnyChildren = false; + + for (Element child : childElements(container)) { + String childLocalName = localName(child); + switch (childLocalName) { + case "element" -> { + String name = child.getAttribute("name"); + if (!name.isEmpty()) { + childNames.add(name); + } else if (child.hasAttribute("ref")) { + QNameRef refQName = registry.resolveQName(child.getAttribute("ref"), document); + childNames.add(refQName.localName()); + } + } + case "all", "choice", "sequence" -> { + ChildrenInfo nestedChildren = collectChildrenFromContainer(child, document, visitedGroups); + childNames.addAll(nestedChildren.childElements()); + supportsAnyChildren = supportsAnyChildren || nestedChildren.supportsAnyChildren(); + } + case "group" -> { + if (!child.hasAttribute("ref")) { + break; + } + QNameRef groupQName = registry.resolveQName(child.getAttribute("ref"), document); + DefinitionRef groupRef = registry.findDefinition(registry.groupDefinitions, groupQName); + if (groupRef == null || groupRef.element() == null) { + break; + } + VisitedNodeKey groupKey = new VisitedNodeKey(groupRef.document().path(), + System.identityHashCode(groupRef.element())); + if (!visitedGroups.add(groupKey)) { + break; + } + ChildrenInfo groupChildren = collectChildrenFromContainer(groupRef.element(), groupRef.document(), visitedGroups); + childNames.addAll(groupChildren.childElements()); + supportsAnyChildren = supportsAnyChildren || groupChildren.supportsAnyChildren(); + } + case "any" -> supportsAnyChildren = true; + default -> { + } + } + } + + return new ChildrenInfo(childNames, supportsAnyChildren); + } + + private @Nullable Element findExtension(Element element) { + Element complexContent = firstChildElement(element, "complexContent"); + if (complexContent != null) { + Element extension = firstChildElement(complexContent, "extension"); + if (extension != null) { + return extension; + } + } + + Element simpleContent = firstChildElement(element, "simpleContent"); + if (simpleContent != null) { + return firstChildElement(simpleContent, "extension"); + } + return null; + } + + private @Nullable Element findRestriction(Element element) { + Element complexContent = firstChildElement(element, "complexContent"); + if (complexContent != null) { + Element restriction = firstChildElement(complexContent, "restriction"); + if (restriction != null) { + return restriction; + } + } + + Element simpleContent = firstChildElement(element, "simpleContent"); + if (simpleContent != null) { + Element restriction = firstChildElement(simpleContent, "restriction"); + if (restriction != null) { + return restriction; + } + } + + return firstChildElement(element, "restriction"); + } + + private KindInfo inferKind(StudioXsdElementCandidate candidate, + @Nullable DefinitionRef typeRef, + @Nullable String typeKind, + Map attributes, + StudioMetaKind forcedKind) { + if (forcedKind != StudioMetaKind.AUTO) { + return new KindInfo(forcedKind, "Meta annotation kind was chosen explicitly."); + } + + if (containsContextName(candidate, "facets")) { + return new KindInfo(StudioMetaKind.FACET, + "The element is declared inside a facets container, so @StudioFacet was selected."); + } + + if (FLOWUI_DATA_NS.equals(candidate.document().targetNamespace()) + && !candidate.contextNames().isEmpty() + && ("viewData".equals(candidate.contextNames().get(0)) + || DATA_COMPONENT_ELEMENT_NAMES.contains(candidate.elementName()) + && candidate.contextNames().contains("viewData"))) { + return new KindInfo(StudioMetaKind.DATA_COMPONENT, + "The element belongs to the data schema root, so @StudioDataComponent was selected."); + } + + if (containsActionContext(candidate) || "action".equals(candidate.elementName()) && attributes.containsKey("type")) { + return new KindInfo(StudioMetaKind.ACTION, + "The element is located inside an actions definition, so @StudioAction was selected."); + } + + if (!candidate.ancestorElements().isEmpty() + || candidate.nested() && !candidate.element().hasAttribute("type")) { + return new KindInfo(StudioMetaKind.ELEMENT, + "The element is nested inside another XSD element, so @StudioElement was selected."); + } + + if (extendsBaseComponent(typeRef, typeKind, new HashSet<>())) { + return new KindInfo(StudioMetaKind.COMPONENT, + "The XSD type extends a component base type, so @StudioComponent was selected."); + } + + return new KindInfo(StudioMetaKind.ELEMENT, + "No component/data/facet/action markers were found, so @StudioElement was selected."); + } + + private boolean extendsBaseComponent(@Nullable DefinitionRef typeRef, + @Nullable String typeKind, + Set visitedTypes) { + if (typeRef == null || typeRef.element() == null || !"complex".equals(typeKind)) { + return false; + } + + VisitedNodeKey visitedNodeKey = new VisitedNodeKey(typeRef.document().path(), System.identityHashCode(typeRef.element())); + if (!visitedTypes.add(visitedNodeKey)) { + return false; + } + + Element extension = findExtension(typeRef.element()); + if (extension == null || !extension.hasAttribute("base")) { + return false; + } + + QNameRef baseQName = registry.resolveQName(extension.getAttribute("base"), typeRef.document()); + if (Set.of("baseComponent", "componentContainer").contains(baseQName.localName())) { + return true; + } + + DefinitionRef baseRef = registry.findDefinition(registry.complexTypeDefinitions, baseQName); + return extendsBaseComponent(baseRef, "complex", visitedTypes); + } + + private PropertyInfo inferProperty(AttributeInfo attributeInfo, StudioMetaKind kind) { + String inferredType = "STRING"; + String category = inferCategory(attributeInfo.xmlAttribute()); + List comments = new ArrayList<>(attributeInfo.comments()); + List options = List.of(); + + EnumValues enumValues = resolveEnumValues(attributeInfo); + String specialType = inferSpecialType(attributeInfo, kind); + String builtinType = inferBuiltinType(attributeInfo); + if (specialType != null) { + inferredType = specialType; + } else if ("LOCALIZED_STRING".equals(builtinType)) { + inferredType = builtinType; + } else if (!enumValues.values().isEmpty()) { + inferredType = enumValues.allowsFreeForm() ? "OPTIONS" : "ENUMERATION"; + options = enumValues.values(); + if (!enumValues.allowsFreeForm()) { + comments.add("Fill `classFqn` manually if \"" + attributeInfo.xmlAttribute() + + "\" should point to a Java enum."); + } + } else if (builtinType != null) { + inferredType = builtinType; + } + + if ("STRING".equals(inferredType) && AMBIGUOUS_SPECIAL_NAMES.contains(attributeInfo.xmlAttribute())) { + comments.add("The tool left \"" + attributeInfo.xmlAttribute() + + "\" as STRING because its exact StudioPropertyType depends on the Java model."); + } + + return new PropertyInfo(attributeInfo.xmlAttribute(), inferredType, category, attributeInfo.required(), + attributeInfo.defaultValue(), options, comments); + } + + private StudioPropertySignature toPropertySignature(PropertyInfo propertyInfo) { + return StudioPropertySignature.of( + propertyInfo.xmlAttribute(), + propertyInfo.studioType(), + propertyInfo.category() != null ? propertyInfo.category() : null, + propertyInfo.required(), + propertyInfo.defaultValue() != null ? propertyInfo.defaultValue() : "", + propertyInfo.options() + ); + } + + private @Nullable String inferSpecialType(AttributeInfo attributeInfo, StudioMetaKind kind) { + String xmlAttribute = attributeInfo.xmlAttribute(); + if (SIZE_NAMES.contains(xmlAttribute)) { + return "SIZE"; + } + if (kind == StudioMetaKind.DATA_COMPONENT && "class".equals(xmlAttribute)) { + return "ENTITY_CLASS"; + } + if (Set.of("classNames", "themeNames").contains(xmlAttribute)) { + return "VALUES_LIST"; + } + if ("icon".equals(xmlAttribute) || xmlAttribute.endsWith("Icon")) { + return "ICON"; + } + switch (xmlAttribute) { + case "id" -> { + return "COMPONENT_ID"; + } + case "fetchPlan" -> { + return "FETCH_PLAN"; + } + case "query" -> { + return "JPA_QUERY"; + } + case "loader" -> { + return "DATA_LOADER_REF"; + } + case "action" -> { + return "ACTION_REF"; + } + case "shortcutCombination" -> { + return "SHORTCUT_COMBINATION"; + } + case "datatype" -> { + return "DATATYPE_ID"; + } + case "store" -> { + return "STORE"; + } + } + return null; + } + + private @Nullable String inferBuiltinType(AttributeInfo attributeInfo) { + if (attributeInfo.inlineSimpleType() != null) { + String inferred = inferSimpleType(attributeInfo.inlineSimpleType(), attributeInfo.sourceDocument()); + if (inferred != null) { + return inferred; + } + } + + if (attributeInfo.typeQName() == null) { + return null; + } + + QNameRef typeQName = attributeInfo.typeQName(); + if (XS_NS.equals(typeQName.namespace())) { + return BUILTIN_TYPE_MAP.get(typeQName.localName()); + } + + if ("resourceString".equals(typeQName.localName())) { + return "LOCALIZED_STRING"; + } + + DefinitionRef simpleTypeRef = registry.findDefinition(registry.simpleTypeDefinitions, typeQName); + if (simpleTypeRef != null && simpleTypeRef.element() != null) { + String inferred = inferSimpleType(simpleTypeRef.element(), simpleTypeRef.document()); + if (inferred != null) { + return inferred; + } + } + + if (typeQName.localName().endsWith("resourceString")) { + return "LOCALIZED_STRING"; + } + + return null; + } + + private @Nullable String inferSimpleType(Element simpleType, @Nullable SchemaDocument document) { + Element restriction = findRestriction(simpleType); + if (restriction != null && restriction.hasAttribute("base") && document != null) { + QNameRef baseQName = registry.resolveQName(restriction.getAttribute("base"), document); + if (XS_NS.equals(baseQName.namespace())) { + return BUILTIN_TYPE_MAP.get(baseQName.localName()); + } + + DefinitionRef baseSimpleType = registry.findDefinition(registry.simpleTypeDefinitions, baseQName); + if (baseSimpleType != null && baseSimpleType.element() != null) { + return inferSimpleType(baseSimpleType.element(), baseSimpleType.document()); + } + } + + if (firstChildElement(simpleType, "list") != null) { + return "VALUES_LIST"; + } + return null; + } + + private EnumValues resolveEnumValues(AttributeInfo attributeInfo) { + Element source = attributeInfo.inlineSimpleType(); + SchemaDocument sourceDocument = attributeInfo.sourceDocument(); + if (source == null && attributeInfo.typeQName() != null && !XS_NS.equals(attributeInfo.typeQName().namespace())) { + DefinitionRef simpleTypeRef = registry.findDefinition(registry.simpleTypeDefinitions, attributeInfo.typeQName()); + if (simpleTypeRef != null && simpleTypeRef.element() != null) { + source = simpleTypeRef.element(); + sourceDocument = simpleTypeRef.document(); + } + } + if (source == null) { + return new EnumValues(List.of(), false); + } + return resolveEnumValues(source, sourceDocument, attributeInfo.xmlAttribute(), new HashSet<>()); + } + + private EnumValues resolveEnumValues(Element simpleType, + @Nullable SchemaDocument document, + String attributeName, + Set visitedTypes) { + VisitedNodeKey visitedNodeKey = new VisitedNodeKey( + document != null ? document.path() : Path.of(""), + System.identityHashCode(simpleType) + ); + if (!visitedTypes.add(visitedNodeKey)) { + return new EnumValues(List.of(), false); + } + + Element restriction = findRestriction(simpleType); + if (restriction != null) { + List values = new ArrayList<>(); + for (Element enumeration : childElements(restriction, "enumeration")) { + String value = enumeration.getAttribute("value"); + if (!value.isEmpty()) { + values.add(value); + } + } + if (!values.isEmpty()) { + return new EnumValues(values, false); + } + } + + Element union = firstChildElement(simpleType, "union"); + if (union == null) { + return new EnumValues(List.of(), false); + } + + LinkedHashSet values = new LinkedHashSet<>(); + boolean allowsFreeForm = false; + String memberTypes = union.getAttribute("memberTypes"); + if (!memberTypes.isBlank() && document != null) { + for (String memberType : memberTypes.trim().split("\\s+")) { + QNameRef qNameRef = registry.resolveQName(memberType, document); + if (XS_NS.equals(qNameRef.namespace()) && "string".equals(qNameRef.localName())) { + allowsFreeForm = true; + continue; + } + DefinitionRef nestedTypeRef = registry.findDefinition(registry.simpleTypeDefinitions, qNameRef); + if (nestedTypeRef != null && nestedTypeRef.element() != null) { + EnumValues nestedValues = resolveEnumValues(nestedTypeRef.element(), nestedTypeRef.document(), + attributeName, visitedTypes); + values.addAll(nestedValues.values()); + allowsFreeForm = allowsFreeForm || nestedValues.allowsFreeForm(); + } + } + } + + for (Element nestedSimpleType : childElements(union, "simpleType")) { + EnumValues nestedValues = resolveEnumValues(nestedSimpleType, document, attributeName, visitedTypes); + values.addAll(nestedValues.values()); + allowsFreeForm = allowsFreeForm || nestedValues.allowsFreeForm(); + } + + return new EnumValues(new ArrayList<>(values), allowsFreeForm); + } + + private @Nullable String inferCategory(String attributeName) { + if (SIZE_NAMES.contains(attributeName)) { + return "SIZE"; + } + if (POSITION_NAMES.contains(attributeName)) { + return "POSITION"; + } + if (LOOK_AND_FEEL_NAMES.contains(attributeName) || attributeName.endsWith("Color")) { + return "LOOK_AND_FEEL"; + } + if (VALIDATION_NAMES.contains(attributeName)) { + return "VALIDATION"; + } + if (Set.of("fetchPlan", "loader", "query").contains(attributeName)) { + return "DATA_BINDING"; + } + if (Set.of("id", "text", "enabled", "visible").contains(attributeName)) { + return "GENERAL"; + } + return null; + } + + private @Nullable String inferXmlnsAlias(SchemaDocument document) { + if (FLOWUI_LAYOUT_NS.equals(document.targetNamespace())) { + return ""; + } + + Path moduleRoot = findModuleRoot(document.path()); + if (moduleRoot == null) { + return null; + } + + Path srcDir = moduleRoot.resolve("src"); + if (!Files.isDirectory(srcDir)) { + return null; + } + + Pattern aliasPattern = Pattern.compile(XMLNS_ALIAS_PATTERN_TEMPLATE.pattern().formatted(Pattern.quote(document.targetNamespace()))); + Pattern defaultPattern = Pattern.compile(XMLNS_DEFAULT_PATTERN_TEMPLATE.pattern().formatted(Pattern.quote(document.targetNamespace()))); + + Map aliases = new HashMap<>(); + boolean defaultNamespaceFound = false; + try { + Files.walk(srcDir) + .filter(path -> Files.isRegularFile(path) && path.toString().endsWith(".xml")) + .forEach(path -> { + if (containsIgnoredDirectory(path)) { + return; + } + try { + String content = Files.readString(path, StandardCharsets.UTF_8); + Matcher aliasMatcher = aliasPattern.matcher(content); + while (aliasMatcher.find()) { + aliases.merge(aliasMatcher.group(1), 1, Integer::sum); + } + if (defaultPattern.matcher(content).find()) { + aliases.putIfAbsent("", 0); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + } catch (RuntimeException e) { + if (e.getCause() instanceof IOException ioException) { + throw new IllegalStateException("Cannot scan XML files for namespace aliases", ioException); + } + throw e; + } catch (IOException e) { + throw new IllegalStateException("Cannot scan XML files for namespace aliases", e); + } + + if (aliases.containsKey("")) { + defaultNamespaceFound = true; + } + aliases.remove(""); + + if (!aliases.isEmpty()) { + return aliases.entrySet().stream() + .max(Map.Entry.comparingByValue()) + .map(Map.Entry::getKey) + .orElse(null); + } + if (defaultNamespaceFound || document.targetNamespace().startsWith("http://jmix.io/schema/flowui/")) { + return ""; + } + return null; + } + + private List buildHeaderTodos(StudioXsdElementCandidate candidate, + StudioMetaKind kind, + @Nullable String xmlns, + @Nullable String xmlnsAlias, + List properties, + List propertyGroups) { + List todos = new ArrayList<>(); + switch (kind) { + case COMPONENT -> + todos.add("Replace Object with the actual component class and fill `classFqn`, `category`, `icon` " + + "and `documentationLink`."); + case ELEMENT -> + todos.add("Fill `classFqn`, `icon`, `target`/`unsupportedTarget` and `documentationLink` after " + + "checking the Java implementation."); + case FACET -> + todos.add("Fill `classFqn`, `category`, `icon` and `documentationLink` after checking the Java " + + "implementation."); + case DATA_COMPONENT -> + todos.add("Fill `classFqn`, `category`, `icon` and `documentationLink` after checking the " + + "Java implementation."); + case ACTION -> + todos.add("Fill `type`, `description`, `classFqn`, `icon` and `documentationLink` after checking " + + "the Java implementation."); + default -> { + } + } + + if (xmlns != null && xmlnsAlias == null && !FLOWUI_LAYOUT_NS.equals(xmlns)) { + todos.add("The tool could not infer `xmlnsAlias`. Review XML samples in the module and set it manually if the " + + "namespace uses a prefix."); + } + if (!candidate.ancestorElements().isEmpty() && Set.of(StudioMetaKind.ELEMENT, StudioMetaKind.ACTION).contains(kind)) { + todos.add("The selected XSD element is nested under `" + + String.join(" / ", candidate.ancestorElements()) + + "`. Verify `target` and nesting semantics manually."); + } + boolean hasPropertyTodos = properties.stream().anyMatch(propertyInfo -> !propertyInfo.comments().isEmpty()); + if (hasPropertyTodos) { + todos.add("Review properties with inline TODO comments. They require manual confirmation."); + } + if (propertyGroups.isEmpty()) { + todos.add("No exact existing `propertyGroups` match was found automatically. Extract a reusable group manually " + + "if this property set repeats elsewhere."); + } + return todos; + } + + private String buildMethodName(StudioXsdElementCandidate candidate, StudioMetaKind kind) { + String base = candidate.elementName(); + if (GENERIC_METHOD_NAMES.contains(candidate.elementName())) { + List contextSource = !candidate.ancestorElements().isEmpty() + ? candidate.ancestorElements() + : candidate.contextNames().subList(0, Math.max(0, candidate.contextNames().size() - 1)); + if (!contextSource.isEmpty()) { + base = contextSource.get(contextSource.size() - 1) + " " + candidate.elementName(); + } + } + + String methodName = toCamelCase(base); + if (kind == StudioMetaKind.ACTION && !methodName.endsWith("Action")) { + methodName += "Action"; + } + return methodName; + } + + private String buildJavaSource(Path outputPath, GeneratedMeta meta, Path selectedXsd) { + String packageName = detectPackageName(outputPath); + String interfaceName = outputPath.getFileName().toString().replaceFirst("\\.java$", ""); + List sourceLines = new ArrayList<>(); + sourceLines.add(""" + /* + * Copyright 2026 Haulmont. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + """.stripTrailing()); + sourceLines.add(""); + sourceLines.add("package " + packageName + ";"); + sourceLines.add(""); + sourceLines.add("import io.jmix.flowui.kit.meta.*;"); + sourceLines.add(""); + sourceLines.add("// Generated from " + relativizeIfPossible(selectedXsd) + "."); + sourceLines.add("// Review all TODO comments before using the generated meta description in production."); + sourceLines.add("@StudioUiKit"); + sourceLines.add("interface " + interfaceName + " {"); + sourceLines.add(""); + sourceLines.addAll(renderAnnotation(meta)); + sourceLines.add("}"); + sourceLines.add(""); + return String.join("\n", sourceLines); + } + + private List renderAnnotation(GeneratedMeta meta) { + String annotationName = switch (meta.kind()) { + case COMPONENT -> "StudioComponent"; + case ELEMENT -> "StudioElement"; + case ACTION -> "StudioAction"; + case FACET -> "StudioFacet"; + case DATA_COMPONENT -> "StudioDataComponent"; + default -> throw new IllegalStateException("Unexpected value: " + meta.kind()); + }; + + List lines = new ArrayList<>(); + if (meta.kindComment() != null) { + lines.add(" // TODO " + meta.kindComment()); + } + for (String todo : meta.headerTodos()) { + lines.add(" // TODO " + todo); + } + if (!meta.childElements().isEmpty()) { + lines.add(" // TODO XSD declares child elements: " + + String.join(", ", meta.childElements()) + + ". Generate nested meta descriptions if needed."); + } + if (meta.supportsAnyChildren()) { + lines.add(" // TODO The XSD also allows arbitrary nested elements via . Review available children manually."); + } + + lines.add(" @" + annotationName + "("); + List> argumentBlocks = new ArrayList<>(); + argumentBlocks.add(List.of(" name = " + javaQuote(meta.name()))); + argumentBlocks.add(List.of(" xmlElement = " + javaQuote(meta.xmlElement()))); + if (meta.xmlns() != null) { + argumentBlocks.add(List.of(" xmlns = " + javaQuote(meta.xmlns()))); + } + if (meta.xmlnsAlias() != null && !meta.xmlnsAlias().isEmpty()) { + argumentBlocks.add(List.of(" xmlnsAlias = " + javaQuote(meta.xmlnsAlias()))); + } + + if (!meta.propertyGroups().isEmpty()) { + List propertyGroupsBlock = new ArrayList<>(); + propertyGroupsBlock.add(" propertyGroups = {"); + for (String propertyGroup : meta.propertyGroups()) { + propertyGroupsBlock.add(" " + propertyGroup + ".class,"); + } + int lastIndex = propertyGroupsBlock.size() - 1; + propertyGroupsBlock.set(lastIndex, propertyGroupsBlock.get(lastIndex).replaceFirst(",$", "")); + propertyGroupsBlock.add(" }"); + argumentBlocks.add(propertyGroupsBlock); + } + + List propertiesBlock = new ArrayList<>(); + propertiesBlock.add(" properties = {"); + if (!meta.properties().isEmpty()) { + for (PropertyInfo property : meta.properties()) { + List renderedProperty = renderProperty(property); + for (int i = renderedProperty.size() - 1; i >= 0; i--) { + if (renderedProperty.get(i).stripLeading().startsWith("@StudioProperty")) { + renderedProperty.set(i, renderedProperty.get(i) + ","); + break; + } + } + propertiesBlock.addAll(renderedProperty); + } + } else { + propertiesBlock.add(" // TODO No XML attributes were discovered for this element."); + } + propertiesBlock.add(" }"); + argumentBlocks.add(propertiesBlock); + + for (int index = 0; index < argumentBlocks.size(); index++) { + List block = argumentBlocks.get(index); + boolean last = index == argumentBlocks.size() - 1; + if (block.size() == 1) { + lines.add(block.get(0) + (last ? "" : ",")); + continue; + } + lines.addAll(block.subList(0, block.size() - 1)); + lines.add(block.get(block.size() - 1) + (last ? "" : ",")); + } + lines.add(" )"); + lines.add(" " + meta.methodReturnType() + " " + meta.methodName() + "();"); + return lines; + } + + private List renderProperty(PropertyInfo propertyInfo) { + List lines = new ArrayList<>(); + for (String comment : propertyInfo.comments()) { + lines.add(" // TODO " + comment); + } + + List arguments = new ArrayList<>(); + arguments.add("xmlAttribute = " + javaQuote(propertyInfo.xmlAttribute())); + if (propertyInfo.category() != null) { + arguments.add("category = StudioProperty.Category." + propertyInfo.category()); + } + arguments.add("type = StudioPropertyType." + propertyInfo.studioType()); + if (propertyInfo.required()) { + arguments.add("required = true"); + } + if (propertyInfo.defaultValue() != null) { + arguments.add("defaultValue = " + javaQuote(propertyInfo.defaultValue())); + } + if (!propertyInfo.options().isEmpty()) { + List quotedOptions = propertyInfo.options().stream() + .map(StudioMetaDescriptionGenerator::javaQuote) + .toList(); + arguments.add("options = {" + String.join(", ", quotedOptions) + "}"); + } + lines.add(" @StudioProperty(" + String.join(", ", arguments) + ")"); + return lines; + } + + private String buildUpdatedSourceForExistingFile(Path outputPath, List generatedBlock) { + try { + String original = Files.readString(outputPath, StandardCharsets.UTF_8); + return buildUpdatedSourceForExistingFile(original, outputPath, generatedBlock); + } catch (IOException e) { + throw new IllegalStateException("Cannot update " + outputPath, e); + } + } + + private String buildUpdatedSourceForExistingFile(String original, Path outputPath, List generatedBlock) { + return appendGeneratedBlock(original, outputPath, generatedBlock); + } + + private String appendGeneratedBlock(String original, Path outputPath, List generatedBlock) { + if (!original.contains("@StudioUiKit")) { + throw new IllegalArgumentException(outputPath + " does not look like a Studio meta file. Create a new file instead."); + } + + String updated = original; + if (!updated.contains("import io.jmix.flowui.kit.meta.*;")) { + Matcher packageMatcher = Pattern.compile("^package\\s+[^;]+;\\R", Pattern.MULTILINE).matcher(updated); + if (packageMatcher.find()) { + int insertIndex = packageMatcher.end(); + updated = updated.substring(0, insertIndex) + + "\nimport io.jmix.flowui.kit.meta.*;\n" + + updated.substring(insertIndex); + } + } + + int lastBraceIndex = updated.lastIndexOf('}'); + if (lastBraceIndex < 0) { + throw new IllegalArgumentException("Cannot append generated block to " + outputPath + + ": interface closing brace was not found."); + } + + String block = "\n" + String.join("\n", generatedBlock) + "\n"; + updated = updated.substring(0, lastBraceIndex).stripTrailing() + + "\n\n" + + block + + updated.substring(lastBraceIndex); + return updated; + } + + private String ensureUniqueMethodName(Path outputPath, String methodName) { + if (!Files.exists(outputPath)) { + return methodName; + } + try { + String content = Files.readString(outputPath, StandardCharsets.UTF_8); + Pattern methodPattern = Pattern.compile("\\b" + Pattern.quote(methodName) + "\\s*\\("); + if (methodPattern.matcher(content).find()) { + return methodName + "Generated"; + } + return methodName; + } catch (IOException e) { + throw new IllegalStateException("Cannot read " + outputPath + " to verify method name uniqueness", e); + } + } + + private Path resolveAbsolutePath(Path path) { + if (path.isAbsolute()) { + return path.normalize(); + } + return Path.of("").toAbsolutePath().resolve(path).normalize(); + } + + private static boolean containsActionContext(StudioXsdElementCandidate candidate) { + return candidate.contextNames().stream().anyMatch(name -> + name.endsWith("Actions") + || name.endsWith("Action") + || "viewActions".equals(name) + || "actions".equals(name) + ) || candidate.ancestorElements().contains("actions"); + } + + private static boolean containsContextName(StudioXsdElementCandidate candidate, String value) { + return candidate.contextNames().contains(value) || candidate.ancestorElements().contains(value); + } + + private static boolean containsIgnoredDirectory(Path path) { + for (Path part : path) { + if (IGNORED_DIRS.contains(part.toString())) { + return true; + } + } + return false; + } + + private static @Nullable Path findModuleRoot(Path schemaPath) { + Path current = schemaPath.toAbsolutePath().normalize(); + for (int i = 0; i < current.getNameCount(); i++) { + if ("src".equals(current.getName(i).toString())) { + return current.getRoot() != null + ? current.getRoot().resolve(current.subpath(0, i)) + : current.subpath(0, i); + } + } + return null; + } + + private static String detectBasePackage(Path moduleRoot, Path schemaPath) { + Path javaRoot = moduleRoot.resolve("src/main/java"); + List packages = new ArrayList<>(); + if (Files.isDirectory(javaRoot)) { + try { + Files.walk(javaRoot) + .filter(path -> Files.isRegularFile(path) && path.toString().endsWith(".java")) + .forEach(path -> readJavaPackage(path).ifPresent(packages::add)); + } catch (IOException e) { + throw new IllegalStateException("Cannot scan Java packages in " + javaRoot, e); + } + } + + String commonPackagePrefix = commonPackagePrefix(packages); + if (!commonPackagePrefix.isEmpty()) { + return commonPackagePrefix; + } + + Path resourceRoot = moduleRoot.resolve("src/main/resources"); + if (!schemaPath.normalize().startsWith(resourceRoot.normalize())) { + return "io.jmix.generated"; + } + + Path relativePath = resourceRoot.relativize(schemaPath.normalize()); + List packageParts = new ArrayList<>(); + for (int i = 0; i < relativePath.getNameCount() - 1; i++) { + String part = relativePath.getName(i).toString(); + if (!part.matches("[A-Za-z_][A-Za-z0-9_]*")) { + break; + } + packageParts.add(part); + } + return packageParts.isEmpty() ? "io.jmix.generated" : String.join(".", packageParts); + } + + private static Optional readJavaPackage(Path javaFile) { + try { + for (String line : Files.readAllLines(javaFile, StandardCharsets.UTF_8)) { + Matcher matcher = JAVA_PACKAGE_PATTERN.matcher(line); + if (matcher.matches()) { + return Optional.of(matcher.group(1)); + } + } + } catch (IOException e) { + throw new IllegalStateException("Cannot read " + javaFile, e); + } + return Optional.empty(); + } + + private static String commonPackagePrefix(List packages) { + if (packages.isEmpty()) { + return ""; + } + + List prefix = new ArrayList<>(List.of(packages.get(0).split("\\."))); + for (int i = 1; i < packages.size() && !prefix.isEmpty(); i++) { + List current = List.of(packages.get(i).split("\\.")); + int commonLength = Math.min(prefix.size(), current.size()); + int index = 0; + while (index < commonLength && prefix.get(index).equals(current.get(index))) { + index++; + } + prefix = new ArrayList<>(prefix.subList(0, index)); + } + return String.join(".", prefix); + } + + private String detectPackageName(Path outputPath) { + if (Files.exists(outputPath)) { + Optional existingPackage = readJavaPackage(outputPath); + if (existingPackage.isPresent()) { + return existingPackage.get(); + } + } + + List parts = new ArrayList<>(); + for (int i = 0; i < outputPath.getNameCount(); i++) { + if ("java".equals(outputPath.getName(i).toString())) { + for (int j = i + 1; j < outputPath.getNameCount() - 1; j++) { + parts.add(outputPath.getName(j).toString()); + } + break; + } + } + return parts.isEmpty() ? "io.jmix.generated" : String.join(".", parts); + } + + private String relativizeIfPossible(Path path) { + Path normalized = path.toAbsolutePath().normalize(); + if (normalized.startsWith(schemaSearchRoot)) { + return schemaSearchRoot.relativize(normalized).toString().replace('\\', '/'); + } + return normalized.toString(); + } + + private static @Nullable String firstNonEmptyOrNull(String... values) { + for (String value : values) { + if (!value.isEmpty()) { + return value; + } + } + return null; + } + + private static String javaQuote(String value) { + return "\"" + value + .replace("\\", "\\\\") + .replace("\"", "\\\"") + .replace("\n", "\\n") + .replace("\r", "\\r") + .replace("\t", "\\t") + "\""; + } + + private static String toPascalCase(String value) { + StringBuilder result = new StringBuilder(); + for (String part : splitWords(value)) { + if (part.isEmpty()) { + continue; + } + result.append(Character.toUpperCase(part.charAt(0))); + if (part.length() > 1) { + result.append(part.substring(1)); + } + } + return result.toString(); + } + + private static String toCamelCase(String value) { + List parts = splitWords(value); + if (parts.isEmpty()) { + return "generatedMeta"; + } + StringBuilder result = new StringBuilder(); + String firstPart = parts.get(0); + result.append(Character.toLowerCase(firstPart.charAt(0))); + if (firstPart.length() > 1) { + result.append(firstPart.substring(1)); + } + for (int i = 1; i < parts.size(); i++) { + String part = parts.get(i); + result.append(Character.toUpperCase(part.charAt(0))); + if (part.length() > 1) { + result.append(part.substring(1)); + } + } + String candidate = result.toString(); + return switch (candidate) { + case "class", "default", "enum", "public", "switch" -> candidate + "Value"; + default -> candidate; + }; + } + + private static List splitWords(String value) { + String normalized = value + .replace('-', ' ') + .replace('_', ' ') + .replace('.', ' ') + .replace(':', ' ') + .replace('/', ' '); + normalized = normalized.replaceAll("(?<=[a-z0-9])(?=[A-Z])", " "); + normalized = normalized.replaceAll("(?<=[A-Z])(?=[A-Z][a-z])", " "); + String[] parts = normalized.trim().split("\\s+"); + List result = new ArrayList<>(); + for (String part : parts) { + if (!part.isBlank()) { + result.add(part); + } + } + return result; + } + + private static String localName(Node node) { + String localName = node.getLocalName(); + return localName != null ? localName : node.getNodeName(); + } + + private static @Nullable Element firstChildElement(Element element, String childLocalName) { + NodeList childNodes = element.getChildNodes(); + for (int i = 0; i < childNodes.getLength(); i++) { + Node child = childNodes.item(i); + if (child.getNodeType() == Node.ELEMENT_NODE && childLocalName.equals(localName(child))) { + return (Element) child; + } + } + return null; + } + + private static List childElements(Element element) { + List children = new ArrayList<>(); + NodeList childNodes = element.getChildNodes(); + for (int i = 0; i < childNodes.getLength(); i++) { + Node child = childNodes.item(i); + if (child.getNodeType() == Node.ELEMENT_NODE) { + children.add((Element) child); + } + } + return children; + } + + private static List childElements(Element element, String childLocalName) { + List children = new ArrayList<>(); + for (Element child : childElements(element)) { + if (childLocalName.equals(localName(child))) { + children.add(child); + } + } + return children; + } + + private record DefinitionKey(String namespace, String localName) { + } + + private record QNameRef(@Nullable String namespace, String localName) { + } + + static final class SchemaDocument { + private final Path path; + private final String targetNamespace; + private final Map namespaceMap; + private final Document document; + private final Element root; + private final Map parentMap; + + private SchemaDocument(Path path, + String targetNamespace, + Map namespaceMap, + Document document, + Element root, + Map parentMap) { + this.path = path; + this.targetNamespace = targetNamespace; + this.namespaceMap = namespaceMap; + this.document = document; + this.root = root; + this.parentMap = parentMap; + } + + Path path() { + return path; + } + + String targetNamespace() { + return targetNamespace; + } + + Map namespaceMap() { + return namespaceMap; + } + + Document document() { + return document; + } + + Element root() { + return root; + } + + Map parentMap() { + return parentMap; + } + } + + private record DefinitionRef(SchemaDocument document, @Nullable Element element, @Nullable QNameRef qName) { + private DefinitionRef(SchemaDocument document, @Nullable Element element) { + this(document, element, null); + } + + } + + private record ResolvedType(@Nullable DefinitionRef ref, @Nullable String kind) { + } + + private record AttributeInfo(String xmlAttribute, + boolean required, + @Nullable String defaultValue, + @Nullable QNameRef typeQName, + @Nullable Element inlineSimpleType, + SchemaDocument sourceDocument, + List comments) { + } + + private record PropertyInfo(String xmlAttribute, + String studioType, + @Nullable String category, + boolean required, + @Nullable String defaultValue, + List options, + List comments) { + } + + private record ChildrenInfo(List childElements, boolean supportsAnyChildren) { + } + + private record EnumValues(List values, boolean allowsFreeForm) { + } + + private record KindInfo(StudioMetaKind kind, @Nullable String kindComment) { + } + + private record VisitedNodeKey(Path path, int identityHash) { + } + + private record GeneratedMeta(StudioMetaKind kind, + @Nullable String kindComment, + String name, + String xmlElement, + @Nullable String xmlns, + @Nullable String xmlnsAlias, + List headerTodos, + List propertyGroups, + List properties, + List childElements, + boolean supportsAnyChildren, + String methodName, + String methodReturnType) { + + private GeneratedMeta withMethodName(String methodName) { + return new GeneratedMeta(kind, kindComment, name, xmlElement, xmlns, xmlnsAlias, headerTodos, + propertyGroups, properties, childElements, supportsAnyChildren, methodName, methodReturnType); + } + } + + private static final class XsdRegistry { + + private final Path schemaSearchRoot; + private final Map documents = new HashMap<>(); + private final Map> elementDefinitions = new HashMap<>(); + private final Map> complexTypeDefinitions = new HashMap<>(); + private final Map> simpleTypeDefinitions = new HashMap<>(); + private final Map> attributeGroupDefinitions = new HashMap<>(); + private final Map> attributeDefinitions = new HashMap<>(); + private final Map> groupDefinitions = new HashMap<>(); + + private XsdRegistry(Path schemaSearchRoot) { + this.schemaSearchRoot = schemaSearchRoot; + } + + private List discoverSchemas() { + List schemas = new ArrayList<>(); + FileVisitor visitor = new SimpleFileVisitor<>() { + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) { + if (!dir.equals(schemaSearchRoot) && IGNORED_DIRS.contains(dir.getFileName().toString())) { + return FileVisitResult.SKIP_SUBTREE; + } + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { + if (file.toString().endsWith(".xsd")) { + schemas.add(file.toAbsolutePath().normalize()); + } + return FileVisitResult.CONTINUE; + } + }; + + try { + Files.walkFileTree(schemaSearchRoot, EnumSet.noneOf(FileVisitOption.class), Integer.MAX_VALUE, visitor); + } catch (IOException e) { + throw new IllegalStateException("Cannot discover XSD files under " + schemaSearchRoot, e); + } + + schemas.sort(Comparator.naturalOrder()); + for (Path schema : schemas) { + loadDocument(schema); + } + return schemas; + } + + private List findCandidates(Path schemaPath, String elementIdentifier) { + SchemaDocument document = loadDocument(schemaPath); + List candidates = new ArrayList<>(); + for (Element element : allElements(document.document())) { + if (!XS_NS.equals(element.getNamespaceURI()) || !"element".equals(localName(element))) { + continue; + } + if (!elementIdentifier.equalsIgnoreCase(element.getAttribute("name"))) { + continue; + } + + List ancestorElements = collectAncestorElements(document, element); + List contextNames = collectContextNames(document, element); + boolean nested = document.parentMap().get(element) != document.root(); + String kind = nested ? "nested" : "global"; + String description = String.join("/", contextNames) + + " (" + kind + ", " + relativize(schemaSearchRoot, schemaPath) + ")"; + candidates.add(new StudioXsdElementCandidate( + document.path(), + element.getAttribute("name"), + nested, + ancestorElements, + contextNames, + description, + document, + element + )); + } + return candidates; + } + + private SchemaDocument loadDocument(Path schemaPath) { + Path normalizedPath = schemaPath.toAbsolutePath().normalize(); + SchemaDocument existing = documents.get(normalizedPath); + if (existing != null) { + return existing; + } + + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(true); + Document document = factory.newDocumentBuilder().parse(normalizedPath.toFile()); + Element root = document.getDocumentElement(); + Map namespaceMap = extractNamespaces(root); + Map parentMap = buildParentMap(root); + + SchemaDocument schemaDocument = new SchemaDocument( + normalizedPath, + root.getAttribute("targetNamespace"), + namespaceMap, + document, + root, + parentMap + ); + documents.put(normalizedPath, schemaDocument); + indexDocument(schemaDocument); + return schemaDocument; + } catch (Exception e) { + throw new IllegalStateException("Cannot parse XSD document " + normalizedPath, e); + } + } + + private void indexDocument(SchemaDocument document) { + for (Element child : childElements(document.root())) { + String name = child.getAttribute("name"); + if (name.isEmpty()) { + continue; + } + DefinitionRef definitionRef = new DefinitionRef(document, child); + DefinitionKey definitionKey = new DefinitionKey(document.targetNamespace(), name); + switch (localName(child)) { + case "element" -> + elementDefinitions.computeIfAbsent(definitionKey, key -> new ArrayList<>()).add(definitionRef); + case "complexType" -> + complexTypeDefinitions.computeIfAbsent(definitionKey, key -> new ArrayList<>()).add(definitionRef); + case "simpleType" -> + simpleTypeDefinitions.computeIfAbsent(definitionKey, key -> new ArrayList<>()).add(definitionRef); + case "attributeGroup" -> + attributeGroupDefinitions.computeIfAbsent(definitionKey, key -> new ArrayList<>()).add(definitionRef); + case "attribute" -> + attributeDefinitions.computeIfAbsent(definitionKey, key -> new ArrayList<>()).add(definitionRef); + case "group" -> + groupDefinitions.computeIfAbsent(definitionKey, key -> new ArrayList<>()).add(definitionRef); + default -> { + } + } + } + } + + private QNameRef resolveQName(String qName, SchemaDocument document) { + if (qName.contains(":")) { + String[] split = qName.split(":", 2); + return new QNameRef(document.namespaceMap().get(split[0]), split[1]); + } + if (BUILTIN_TYPE_MAP.containsKey(qName)) { + return new QNameRef(XS_NS, qName); + } + return new QNameRef(document.targetNamespace(), qName); + } + + private @Nullable DefinitionRef findDefinition(Map> index, QNameRef qName) { + assert qName.namespace() != null : "Namespace cannot be null for QNameRef: " + qName; + List definitions = index.get(new DefinitionKey(qName.namespace(), qName.localName())); + return definitions == null || definitions.isEmpty() ? null : definitions.get(0); + } + + private Map extractNamespaces(Element root) { + Map namespaces = new HashMap<>(); + NamedNodeMap attributes = root.getAttributes(); + for (int i = 0; i < attributes.getLength(); i++) { + Attr attribute = (Attr) attributes.item(i); + String attributeName = attribute.getName(); + if ("xmlns".equals(attributeName)) { + namespaces.put("", attribute.getValue()); + } else if (attributeName.startsWith("xmlns:")) { + namespaces.put(attributeName.substring("xmlns:".length()), attribute.getValue()); + } + } + return namespaces; + } + + private Map buildParentMap(Element root) { + Map parentMap = new IdentityHashMap<>(); + ArrayDeque stack = new ArrayDeque<>(); + stack.push(root); + while (!stack.isEmpty()) { + Element current = stack.pop(); + for (Element child : childElements(current)) { + parentMap.put(child, current); + stack.push(child); + } + } + return parentMap; + } + + private List allElements(Document document) { + List elements = new ArrayList<>(); + ArrayDeque stack = new ArrayDeque<>(); + stack.push(document.getDocumentElement()); + while (!stack.isEmpty()) { + Element current = stack.pop(); + elements.add(current); + List children = childElements(current); + for (int i = children.size() - 1; i >= 0; i--) { + stack.push(children.get(i)); + } + } + return elements; + } + + private List collectAncestorElements(SchemaDocument document, Element element) { + List ancestorElements = new ArrayList<>(); + Element current = element; + while (document.parentMap().containsKey(current)) { + current = document.parentMap().get(current); + if ("element".equals(localName(current)) && current.hasAttribute("name")) { + ancestorElements.add(current.getAttribute("name")); + } + } + Collections.reverse(ancestorElements); + return ancestorElements; + } + + private List collectContextNames(SchemaDocument document, Element element) { + List contextNames = new ArrayList<>(); + Element current = element; + while (true) { + if (Set.of("element", "complexType").contains(localName(current)) && current.hasAttribute("name")) { + contextNames.add(current.getAttribute("name")); + } + Element parent = document.parentMap().get(current); + if (parent == null) { + break; + } + current = parent; + } + Collections.reverse(contextNames); + return contextNames; + } + + private String relativize(Path base, Path path) { + Path normalizedPath = path.toAbsolutePath().normalize(); + if (normalizedPath.startsWith(base.toAbsolutePath().normalize())) { + return base.toAbsolutePath().normalize().relativize(normalizedPath).toString().replace('\\', '/'); + } + return normalizedPath.toString(); + } + } + + static final class CLI { + + static void run(String[] args) throws IOException { + CLI.CliArguments cliArguments = CLI.CliArguments.parse(args); + Path workspaceRoot = resolvePath(cliArguments.root()); + StudioMetaDescriptionGenerator generator = new StudioMetaDescriptionGenerator(workspaceRoot); + + if (cliArguments.listSchemas()) { + for (Path schema : generator.findKnownSchemas()) { + System.out.println(workspaceRoot.relativize(schema).toString().replace('\\', '/')); + } + return; + } + + BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + Path schemaPath = resolvePath(cliArguments.xsd()); + String elementIdentifier = cliArguments.element(); + StudioXsdElementCandidate candidate = chooseCandidate(generator, schemaPath, elementIdentifier, reader); + Path outputPath = resolvePath(cliArguments.output()); + + StudioMetaGenerationResult result = generator.write(candidate, cliArguments.kind(), outputPath); + System.out.println("Generated meta description in " + result.outputPath()); + if (!result.todos().isEmpty()) { + System.out.println("Review TODO comments before finalizing the file."); + } + } + + private static StudioXsdElementCandidate chooseCandidate(StudioMetaDescriptionGenerator generator, + Path schemaPath, + String elementIdentifier, + BufferedReader reader) throws IOException { + List candidates = generator.findElementCandidates(schemaPath, elementIdentifier); + while (candidates.isEmpty()) { + System.out.printf("No XSD element \"%s\" was found in %s.%n", elementIdentifier, schemaPath); + elementIdentifier = prompt(reader, "Enter another element identifier", null); + candidates = generator.findElementCandidates(schemaPath, elementIdentifier); + } + + if (candidates.size() == 1) { + return candidates.get(0); + } + + System.out.printf("Multiple XSD elements named \"%s\" were found:%n", elementIdentifier); + for (int i = 0; i < candidates.size(); i++) { + System.out.printf("%2d. %s%n", i + 1, candidates.get(i).description()); + } + + while (true) { + String rawValue = prompt(reader, "Choose the exact element by number", null); + if (rawValue.matches("\\d+")) { + int index = Integer.parseInt(rawValue); + if (index >= 1 && index <= candidates.size()) { + return candidates.get(index - 1); + } + } + System.out.println("Invalid element selection."); + } + } + + private static String prompt(BufferedReader reader, String message, @Nullable String defaultValue) throws IOException { + while (true) { + String suffix = defaultValue != null ? " [" + defaultValue + "]" : ""; + System.out.print(message + suffix + ": "); + String value = reader.readLine(); + if (value == null) { + throw new IOException("Input stream was closed."); + } + value = value.trim(); + if (!value.isEmpty()) { + return value; + } + if (defaultValue != null) { + return defaultValue; + } + } + } + + private static Path resolvePath(String pathValue) { + Path path = Path.of(pathValue); + if (!path.isAbsolute()) { + return Path.of("").toAbsolutePath().resolve(path).normalize(); + } + return path.normalize(); + } + + private record CliArguments(String xsd, + String element, + String output, + String root, + StudioMetaKind kind, + boolean listSchemas) { + + private static CliArguments parse(String[] args) { + String xsd = null; + String element = null; + String output = null; + String root = null; + StudioMetaKind kind = StudioMetaKind.AUTO; + boolean listSchemas = false; + + for (int i = 0; i < args.length; i++) { + String current = args[i]; + switch (current) { + case "--xsd" -> xsd = requireValue(args, ++i, current); + case "--element" -> element = requireValue(args, ++i, current); + case "--output" -> output = requireValue(args, ++i, current); + case "--root" -> root = requireValue(args, ++i, current); + case "--kind" -> kind = parseKind(requireValue(args, ++i, current)); + case "--list-schemas" -> listSchemas = true; + default -> throw new IllegalArgumentException("Unknown argument: " + current); + } + } + + assert root != null : "Root directory is required"; + if (!listSchemas) { + assert xsd != null : "XSD file is required"; + assert element != null : "Element identifier is required"; + assert output != null : "Output path is required"; + } + + return new CliArguments(xsd, element, output, root, kind, listSchemas); + } + + private static String requireValue(String[] args, int index, String option) { + if (index >= args.length) { + throw new IllegalArgumentException("Missing value for " + option); + } + return args[index]; + } + + private static StudioMetaKind parseKind(String rawKind) { + return switch (rawKind) { + case "auto" -> StudioMetaKind.AUTO; + case "component" -> StudioMetaKind.COMPONENT; + case "element" -> StudioMetaKind.ELEMENT; + case "action" -> StudioMetaKind.ACTION; + case "facet" -> StudioMetaKind.FACET; + case "data-component", "data_component" -> StudioMetaKind.DATA_COMPONENT; + default -> throw new IllegalArgumentException("Unknown --kind value: " + rawKind); + }; + } + } + } + + static final String XS_NS = "http://www.w3.org/2001/XMLSchema"; + static final String FLOWUI_LAYOUT_NS = "http://jmix.io/schema/flowui/layout"; + static final String FLOWUI_DATA_NS = "http://jmix.io/schema/flowui/data"; + + private static final Set IGNORED_DIRS = Set.of(".git", ".gradle", ".idea", "build", "out"); + private static final Set GENERIC_METHOD_NAMES = Set.of("action", "column", "item", "loader", "property"); + private static final Set LOOK_AND_FEEL_NAMES = Set.of("classNames", "css", "icon", "themeNames"); + private static final Set SIZE_NAMES = Set.of("height", "maxHeight", "maxWidth", "minHeight", "minWidth", "width"); + private static final Set POSITION_NAMES = Set.of("alignSelf", "colspan", "justifySelf", "rowspan"); + private static final Set VALIDATION_NAMES = Set.of( + "allowedCharPattern", "pattern", "errorMessage", "max", "maxLength", + "min", "minLength", "preventInvalidInput", "required", "requiredMessage" + ); + private static final Set AMBIGUOUS_SPECIAL_NAMES = Set.of( + "class", "component", "metaClass", "property", + "container", "dataContainer", "itemsContainer" + ); + private static final Map BUILTIN_TYPE_MAP = Map.ofEntries( + Map.entry("boolean", "BOOLEAN"), + Map.entry("byte", "INTEGER"), + Map.entry("date", "STRING"), + Map.entry("dateTime", "STRING"), + Map.entry("decimal", "BIG_DECIMAL"), + Map.entry("double", "DOUBLE"), + Map.entry("duration", "STRING"), + Map.entry("float", "FLOAT"), + Map.entry("int", "INTEGER"), + Map.entry("integer", "INTEGER"), + Map.entry("language", "STRING"), + Map.entry("long", "LONG"), + Map.entry("NCName", "STRING"), + Map.entry("negativeInteger", "INTEGER"), + Map.entry("nonNegativeInteger", "INTEGER"), + Map.entry("nonPositiveInteger", "INTEGER"), + Map.entry("normalizedString", "STRING"), + Map.entry("positiveInteger", "INTEGER"), + Map.entry("short", "INTEGER"), + Map.entry("string", "STRING"), + Map.entry("time", "STRING"), + Map.entry("token", "STRING"), + Map.entry("unsignedInt", "LONG"), + Map.entry("unsignedLong", "LONG"), + Map.entry("unsignedShort", "INTEGER") + ); + private static final Set DATA_COMPONENT_ELEMENT_NAMES = Set.of( + "instance", "collection", "keyValueInstance", "keyValueCollection" + ); + private static final Pattern JAVA_PACKAGE_PATTERN = + Pattern.compile("^package\\s+([^;]+);$"); + private static final Pattern XMLNS_ALIAS_PATTERN_TEMPLATE = + Pattern.compile("xmlns:([A-Za-z_][A-Za-z0-9_.-]*)=\"%s\""); + private static final Pattern XMLNS_DEFAULT_PATTERN_TEMPLATE = + Pattern.compile("xmlns=\"%s\""); +} diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/generator/StudioMetaGenerationResult.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/generator/StudioMetaGenerationResult.java new file mode 100644 index 0000000000..8a45830957 --- /dev/null +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/generator/StudioMetaGenerationResult.java @@ -0,0 +1,28 @@ +/* + * Copyright 2026 Haulmont. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.jmix.flowui.kit.meta.generator; + +import java.nio.file.Path; +import java.util.List; + +record StudioMetaGenerationResult( + Path outputPath, + String source, + StudioMetaKind generatedKind, + List todos +) { +} diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/generator/StudioMetaKind.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/generator/StudioMetaKind.java new file mode 100644 index 0000000000..f038590d2b --- /dev/null +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/generator/StudioMetaKind.java @@ -0,0 +1,26 @@ +/* + * Copyright 2026 Haulmont. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.jmix.flowui.kit.meta.generator; + +enum StudioMetaKind { + AUTO, + COMPONENT, + ELEMENT, + ACTION, + FACET, + DATA_COMPONENT +} diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/generator/StudioPropertyGroupsMatcher.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/generator/StudioPropertyGroupsMatcher.java new file mode 100644 index 0000000000..d2e4be846e --- /dev/null +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/generator/StudioPropertyGroupsMatcher.java @@ -0,0 +1,801 @@ +/* + * Copyright 2026 Haulmont. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.jmix.flowui.kit.meta.generator; + +import jakarta.annotation.Nullable; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.FileVisitResult; +import java.nio.file.FileVisitor; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.BitSet; +import java.util.Deque; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +final class StudioPropertyGroupsMatcher { + + private static final Set IGNORED_DIRS = Set.of(".git", ".gradle", ".idea", "build", "out"); + private static final String STUDIO_PROPERTY_GROUP_ANNOTATION = "@StudioPropertyGroup"; + private static final String STUDIO_PROPERTY_ANNOTATION = "@StudioProperty"; + private static final Pattern PACKAGE_PATTERN = Pattern.compile("\\bpackage\\s+([A-Za-z_][A-Za-z0-9_.]*)\\s*;"); + private static final Pattern IMPORT_PATTERN = Pattern.compile("\\bimport\\s+([A-Za-z_][A-Za-z0-9_.*]*)\\s*;"); + private static final Pattern INTERFACE_PATTERN = Pattern.compile( + "(?:public\\s+)?(?:static\\s+)?interface\\s+([A-Za-z_][A-Za-z0-9_]*)" + + "(?:\\s+extends\\s+([^\\{]+))?\\s*\\{" + ); + + private final Path workspaceRoot; + private final List scanRoots; + + private @Nullable Map groupDefinitions; + private @Nullable Map> flattenedProperties; + + StudioPropertyGroupsMatcher(Path workspaceRoot) { + this.workspaceRoot = workspaceRoot.toAbsolutePath().normalize(); + this.scanRoots = detectScanRoots(this.workspaceRoot); + } + + List findMatchingGroupFqns(List generatedProperties, + @Nullable Path preferredModuleRoot) { + if (generatedProperties.isEmpty()) { + return List.of(); + } + + Map definitions = getGroupDefinitions(); + Map> flattened = getFlattenedProperties(); + List candidates = new ArrayList<>(); + + for (GroupDefinition definition : definitions.values()) { + List groupProperties = flattened.get(definition.fqn()); + if (groupProperties == null || groupProperties.isEmpty()) { + continue; + } + + BitSet coverage = findCoverage(groupProperties, generatedProperties); + if (coverage == null || coverage.isEmpty()) { + continue; + } + + candidates.add(new GroupCandidate( + definition.fqn(), + definition.moduleRoot(), + !definition.parentGroupFqns().isEmpty(), + groupProperties.size(), + coverage + )); + } + + return selectGroups(candidates, preferredModuleRoot); + } + + private Map getGroupDefinitions() { + if (groupDefinitions == null) { + groupDefinitions = loadGroupDefinitions(); + } + return groupDefinitions; + } + + private Map> getFlattenedProperties() { + if (flattenedProperties == null) { + flattenedProperties = flattenGroups(getGroupDefinitions()); + } + return flattenedProperties; + } + + private Map loadGroupDefinitions() { + Map definitions = new LinkedHashMap<>(); + + for (Path scanRoot : scanRoots) { + if (!Files.isDirectory(scanRoot)) { + continue; + } + + FileVisitor visitor = new SimpleFileVisitor<>() { + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) { + if (!dir.equals(scanRoot) && IGNORED_DIRS.contains(dir.getFileName().toString())) { + return FileVisitResult.SKIP_SUBTREE; + } + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + if (!file.toString().endsWith(".java")) { + return FileVisitResult.CONTINUE; + } + + String source = Files.readString(file, StandardCharsets.UTF_8); + if (!source.contains(STUDIO_PROPERTY_GROUP_ANNOTATION)) { + return FileVisitResult.CONTINUE; + } + + parseGroupDefinitions(file, source).forEach(definition -> definitions.put(definition.fqn(), definition)); + return FileVisitResult.CONTINUE; + } + }; + + try { + Files.walkFileTree(scanRoot, visitor); + } catch (IOException e) { + throw new IllegalStateException("Cannot scan property group definitions under " + scanRoot, e); + } + } + + return definitions; + } + + private List parseGroupDefinitions(Path sourceFile, String source) { + String strippedSource = stripComments(source); + String packageName = parsePackageName(strippedSource); + if (packageName == null) { + return List.of(); + } + + String outerClassName = sourceFile.getFileName().toString().replaceFirst("\\.java$", ""); + ImportContext importContext = parseImports(strippedSource); + List definitions = new ArrayList<>(); + + int currentIndex = 0; + while (true) { + int annotationIndex = strippedSource.indexOf(STUDIO_PROPERTY_GROUP_ANNOTATION, currentIndex); + if (annotationIndex < 0) { + break; + } + + AnnotationParseResult annotation = parseAnnotation(strippedSource, annotationIndex, STUDIO_PROPERTY_GROUP_ANNOTATION); + Matcher matcher = INTERFACE_PATTERN.matcher(strippedSource); + matcher.region(annotation.endIndex(), strippedSource.length()); + if (!matcher.find()) { + break; + } + + String interfaceName = matcher.group(1); + String extendsClause = matcher.group(2); + List parentGroups = parseParentGroups(extendsClause, packageName, outerClassName, importContext); + List directProperties = parseGroupProperties(annotation.content()); + + definitions.add(new GroupDefinition( + packageName + "." + outerClassName + "." + interfaceName, + sourceFile, + detectModuleRoot(sourceFile), + parentGroups, + directProperties + )); + + currentIndex = matcher.end(); + } + + return definitions; + } + + private Map> flattenGroups(Map definitions) { + Map> flattened = new LinkedHashMap<>(); + for (GroupDefinition definition : definitions.values()) { + List properties = flattenGroup(definition.fqn(), definitions, flattened, new HashSet<>()); + if (properties != null) { + flattened.put(definition.fqn(), properties); + } + } + return flattened; + } + + private @Nullable List flattenGroup(String fqn, + Map definitions, + Map> cache, + Set visiting) { + List cached = cache.get(fqn); + if (cached != null) { + return cached; + } + + GroupDefinition definition = definitions.get(fqn); + if (definition == null || !visiting.add(fqn)) { + return null; + } + + List properties = new ArrayList<>(); + for (String parentFqn : definition.parentGroupFqns()) { + List parentProperties = flattenGroup(parentFqn, definitions, cache, visiting); + if (parentProperties == null) { + visiting.remove(fqn); + return null; + } + properties.addAll(parentProperties); + } + properties.addAll(definition.directProperties()); + visiting.remove(fqn); + + List flattened = List.copyOf(properties); + cache.put(fqn, flattened); + return flattened; + } + + private @Nullable BitSet findCoverage(List groupProperties, + List generatedProperties) { + Map> indexesBySignature = new HashMap<>(); + for (int i = 0; i < generatedProperties.size(); i++) { + indexesBySignature.computeIfAbsent(generatedProperties.get(i), key -> new ArrayDeque<>()).addLast(i); + } + + BitSet coverage = new BitSet(generatedProperties.size()); + for (StudioPropertySignature groupProperty : groupProperties) { + Deque indexes = indexesBySignature.get(groupProperty); + if (indexes == null || indexes.isEmpty()) { + return null; + } + coverage.set(indexes.removeFirst()); + } + return coverage; + } + + private List selectGroups(List candidates, @Nullable Path preferredModuleRoot) { + List selectedGroups = new ArrayList<>(); + BitSet coveredIndexes = new BitSet(); + + while (true) { + GroupCandidate bestCandidate = null; + int bestUncoveredCount = 0; + + for (GroupCandidate candidate : candidates) { + int uncoveredCount = uncoveredCount(candidate.coverage(), coveredIndexes); + if (uncoveredCount == 0) { + continue; + } + + if (bestCandidate == null + || isBetterCandidate(candidate, uncoveredCount, bestCandidate, bestUncoveredCount, + preferredModuleRoot)) { + bestCandidate = candidate; + bestUncoveredCount = uncoveredCount; + } + } + + if (bestCandidate == null) { + break; + } + + selectedGroups.add(bestCandidate.fqn()); + coveredIndexes.or(bestCandidate.coverage()); + } + + return List.copyOf(selectedGroups); + } + + private boolean isBetterCandidate(GroupCandidate candidate, + int uncoveredCount, + GroupCandidate currentBest, + int currentBestUncoveredCount, + @Nullable Path preferredModuleRoot) { + if (uncoveredCount != currentBestUncoveredCount) { + return uncoveredCount > currentBestUncoveredCount; + } + if (candidate.propertyCount() != currentBest.propertyCount()) { + return candidate.propertyCount() > currentBest.propertyCount(); + } + if (candidate.composite() != currentBest.composite()) { + return candidate.composite(); + } + + int candidateRank = moduleRank(candidate.moduleRoot(), preferredModuleRoot); + int bestRank = moduleRank(currentBest.moduleRoot(), preferredModuleRoot); + if (candidateRank != bestRank) { + return candidateRank < bestRank; + } + + return candidate.fqn().compareTo(currentBest.fqn()) < 0; + } + + private int moduleRank(Path candidateModuleRoot, @Nullable Path preferredModuleRoot) { + if (preferredModuleRoot != null && candidateModuleRoot.startsWith(preferredModuleRoot)) { + return 0; + } + Path flowuiKitModule = workspaceRoot.resolve("jmix/jmix-flowui/flowui-kit").normalize(); + if (candidateModuleRoot.startsWith(flowuiKitModule)) { + return 1; + } + return 2; + } + + private int uncoveredCount(BitSet candidateCoverage, BitSet coveredIndexes) { + BitSet uncovered = (BitSet) candidateCoverage.clone(); + uncovered.andNot(coveredIndexes); + return uncovered.cardinality(); + } + + private List parseParentGroups(@Nullable String extendsClause, + String packageName, + String outerClassName, + ImportContext importContext) { + if (extendsClause == null || extendsClause.isBlank()) { + return List.of(); + } + + List result = new ArrayList<>(); + for (String reference : splitTopLevel(extendsClause, ',')) { + String resolvedReference = resolveGroupReference(reference.strip(), packageName, outerClassName, importContext); + if (resolvedReference != null) { + result.add(resolvedReference); + } + } + return List.copyOf(result); + } + + private @Nullable String resolveGroupReference(String reference, + String packageName, + String outerClassName, + ImportContext importContext) { + if (reference.isBlank()) { + return null; + } + + String sanitizedReference = reference.replace(".class", "").strip(); + if (!sanitizedReference.contains(".")) { + return packageName + "." + outerClassName + "." + sanitizedReference; + } + + String firstSegment = sanitizedReference.substring(0, sanitizedReference.indexOf('.')); + if (!firstSegment.isEmpty() && Character.isLowerCase(firstSegment.charAt(0))) { + return sanitizedReference; + } + + if (outerClassName.equals(firstSegment)) { + return packageName + "." + sanitizedReference; + } + + String importedOuterClass = importContext.explicitImports().get(firstSegment); + if (importedOuterClass != null) { + return importedOuterClass + sanitizedReference.substring(firstSegment.length()); + } + + for (String wildcardImport : importContext.wildcardImports()) { + return wildcardImport + "." + sanitizedReference; + } + + return packageName + "." + sanitizedReference; + } + + private List parseGroupProperties(String annotationContent) { + if (annotationContent.isBlank()) { + return List.of(); + } + + List properties = new ArrayList<>(); + int currentIndex = 0; + while (true) { + int propertyIndex = annotationContent.indexOf(STUDIO_PROPERTY_ANNOTATION, currentIndex); + if (propertyIndex < 0) { + break; + } + + AnnotationParseResult propertyAnnotation = parseAnnotation(annotationContent, propertyIndex, + STUDIO_PROPERTY_ANNOTATION); + properties.add(parsePropertySignature(propertyAnnotation.content())); + currentIndex = propertyAnnotation.endIndex(); + } + + return List.copyOf(properties); + } + + private StudioPropertySignature parsePropertySignature(String propertyAnnotationContent) { + Map values = parseNamedArguments(propertyAnnotationContent); + + String xmlAttribute = unquoteJavaString(values.get("xmlAttribute")); + String type = lastSegment(values.get("type")); + String category = values.containsKey("category") + ? lastSegment(values.get("category")) + : null; + boolean required = Boolean.parseBoolean(values.getOrDefault("required", "false")); + String defaultValue = unquoteJavaString(values.getOrDefault("defaultValue", "")); + String defaultValueRef = unquoteJavaString(values.getOrDefault("defaultValueRef", "")); + String initialValue = unquoteJavaString(values.getOrDefault("initialValue", "")); + String classFqn = unquoteJavaString(values.getOrDefault("classFqn", "")); + List options = parseStringArray(values.get("options")); + String setMethod = unquoteJavaString(values.getOrDefault("setMethod", "")); + String setParameterFqn = unquoteJavaString(values.getOrDefault("setParameterFqn", "")); + String addMethod = unquoteJavaString(values.getOrDefault("addMethod", "")); + String addParameterFqn = unquoteJavaString(values.getOrDefault("addParameterFqn", "")); + String removeMethod = unquoteJavaString(values.getOrDefault("removeMethod", "")); + String removeParameterFqn = unquoteJavaString(values.getOrDefault("removeParameterFqn", "")); + String typeParameter = unquoteJavaString(values.getOrDefault("typeParameter", "")); + boolean useAsInjectionType = Boolean.parseBoolean(values.getOrDefault("useAsInjectionType", "false")); + List componentRefTags = parseStringArray(values.get("componentRefTags")); + String cdataWrapperTag = unquoteJavaString(values.getOrDefault("cdataWrapperTag", "")); + + return new StudioPropertySignature( + xmlAttribute, + type, + classFqn, + category, + required, + defaultValue, + defaultValueRef, + initialValue, + options, + setMethod, + setParameterFqn, + addMethod, + addParameterFqn, + removeMethod, + removeParameterFqn, + typeParameter, + useAsInjectionType, + componentRefTags, + cdataWrapperTag + ); + } + + private Map parseNamedArguments(String annotationContent) { + Map arguments = new LinkedHashMap<>(); + for (String part : splitTopLevel(annotationContent, ',')) { + if (part.isBlank()) { + continue; + } + + int equalsIndex = findTopLevelEquals(part); + if (equalsIndex < 0) { + continue; + } + + String name = part.substring(0, equalsIndex).strip(); + String value = part.substring(equalsIndex + 1).strip(); + arguments.put(name, value); + } + return arguments; + } + + private int findTopLevelEquals(String value) { + boolean inString = false; + boolean escaped = false; + int parenthesesDepth = 0; + int bracesDepth = 0; + + for (int i = 0; i < value.length(); i++) { + char current = value.charAt(i); + if (inString) { + if (escaped) { + escaped = false; + } else if (current == '\\') { + escaped = true; + } else if (current == '"') { + inString = false; + } + continue; + } + + if (current == '"') { + inString = true; + continue; + } + if (current == '(') { + parenthesesDepth++; + continue; + } + if (current == ')') { + parenthesesDepth--; + continue; + } + if (current == '{') { + bracesDepth++; + continue; + } + if (current == '}') { + bracesDepth--; + continue; + } + if (current == '=' && parenthesesDepth == 0 && bracesDepth == 0) { + return i; + } + } + return -1; + } + + private List parseStringArray(@Nullable String value) { + if (value == null || value.isBlank()) { + return List.of(); + } + + String strippedValue = value.strip(); + if (!strippedValue.startsWith("{") || !strippedValue.endsWith("}")) { + return List.of(unquoteJavaString(strippedValue)); + } + + String inner = strippedValue.substring(1, strippedValue.length() - 1).strip(); + if (inner.isEmpty()) { + return List.of(); + } + + List result = new ArrayList<>(); + for (String item : splitTopLevel(inner, ',')) { + if (!item.isBlank()) { + result.add(unquoteJavaString(item.strip())); + } + } + return List.copyOf(result); + } + + private ImportContext parseImports(String source) { + Map explicitImports = new LinkedHashMap<>(); + List wildcardImports = new ArrayList<>(); + + Matcher matcher = IMPORT_PATTERN.matcher(source); + while (matcher.find()) { + String importedValue = matcher.group(1); + if (importedValue.endsWith(".*")) { + wildcardImports.add(importedValue.substring(0, importedValue.length() - 2)); + continue; + } + + String simpleName = importedValue.substring(importedValue.lastIndexOf('.') + 1); + explicitImports.put(simpleName, importedValue); + } + + return new ImportContext(explicitImports, List.copyOf(wildcardImports)); + } + + private @Nullable String parsePackageName(String source) { + Matcher matcher = PACKAGE_PATTERN.matcher(source); + return matcher.find() ? matcher.group(1) : null; + } + + private AnnotationParseResult parseAnnotation(String source, int annotationIndex, String annotationName) { + int currentIndex = annotationIndex + annotationName.length(); + while (currentIndex < source.length() && Character.isWhitespace(source.charAt(currentIndex))) { + currentIndex++; + } + + if (currentIndex >= source.length() || source.charAt(currentIndex) != '(') { + return new AnnotationParseResult("", currentIndex); + } + + int endIndex = findMatchingBracket(source, currentIndex, '(', ')'); + return new AnnotationParseResult(source.substring(currentIndex + 1, endIndex), endIndex + 1); + } + + private int findMatchingBracket(String source, int startIndex, char open, char close) { + boolean inString = false; + boolean escaped = false; + int depth = 0; + + for (int i = startIndex; i < source.length(); i++) { + char current = source.charAt(i); + if (inString) { + if (escaped) { + escaped = false; + } else if (current == '\\') { + escaped = true; + } else if (current == '"') { + inString = false; + } + continue; + } + + if (current == '"') { + inString = true; + continue; + } + if (current == open) { + depth++; + continue; + } + if (current == close) { + depth--; + if (depth == 0) { + return i; + } + } + } + + throw new IllegalArgumentException("Cannot find matching bracket in property group source."); + } + + private List splitTopLevel(String value, char delimiter) { + List parts = new ArrayList<>(); + boolean inString = false; + boolean escaped = false; + int parenthesesDepth = 0; + int bracesDepth = 0; + int startIndex = 0; + + for (int i = 0; i < value.length(); i++) { + char current = value.charAt(i); + if (inString) { + if (escaped) { + escaped = false; + } else if (current == '\\') { + escaped = true; + } else if (current == '"') { + inString = false; + } + continue; + } + + if (current == '"') { + inString = true; + continue; + } + if (current == '(') { + parenthesesDepth++; + continue; + } + if (current == ')') { + parenthesesDepth--; + continue; + } + if (current == '{') { + bracesDepth++; + continue; + } + if (current == '}') { + bracesDepth--; + continue; + } + if (current == delimiter && parenthesesDepth == 0 && bracesDepth == 0) { + parts.add(value.substring(startIndex, i)); + startIndex = i + 1; + } + } + + parts.add(value.substring(startIndex)); + return parts; + } + + private String stripComments(String source) { + StringBuilder result = new StringBuilder(source.length()); + boolean inString = false; + boolean escaped = false; + boolean inLineComment = false; + boolean inBlockComment = false; + + for (int i = 0; i < source.length(); i++) { + char current = source.charAt(i); + char next = i + 1 < source.length() ? source.charAt(i + 1) : '\0'; + + if (inLineComment) { + if (current == '\n') { + inLineComment = false; + result.append(current); + } + continue; + } + + if (inBlockComment) { + if (current == '*' && next == '/') { + inBlockComment = false; + i++; + } else if (current == '\n') { + result.append('\n'); + } + continue; + } + + if (inString) { + result.append(current); + if (escaped) { + escaped = false; + } else if (current == '\\') { + escaped = true; + } else if (current == '"') { + inString = false; + } + continue; + } + + if (current == '"' ) { + inString = true; + result.append(current); + continue; + } + if (current == '/' && next == '/') { + inLineComment = true; + i++; + continue; + } + if (current == '/' && next == '*') { + inBlockComment = true; + i++; + continue; + } + + result.append(current); + } + + return result.toString(); + } + + private String lastSegment(@Nullable String value) { + String nonNullValue = Objects.requireNonNullElse(value, ""); + int separatorIndex = nonNullValue.lastIndexOf('.'); + return separatorIndex < 0 ? nonNullValue.strip() : nonNullValue.substring(separatorIndex + 1).strip(); + } + + private String unquoteJavaString(String value) { + String strippedValue = value.strip(); + if (strippedValue.length() >= 2 && strippedValue.startsWith("\"") && strippedValue.endsWith("\"")) { + strippedValue = strippedValue.substring(1, strippedValue.length() - 1); + } + return strippedValue + .replace("\\\"", "\"") + .replace("\\\\", "\\") + .replace("\\n", "\n") + .replace("\\r", "\r") + .replace("\\t", "\t"); + } + + private List detectScanRoots(Path root) { + LinkedHashSet paths = new LinkedHashSet<>(); + Path jmixRoot = root.resolve("jmix"); + Path premiumRoot = root.resolve("jmix-premium"); + if (Files.isDirectory(jmixRoot)) { + paths.add(jmixRoot.normalize()); + } + if (Files.isDirectory(premiumRoot)) { + paths.add(premiumRoot.normalize()); + } + if (paths.isEmpty()) { + paths.add(root); + } + return List.copyOf(paths); + } + + private Path detectModuleRoot(Path sourceFile) { + Path normalized = sourceFile.toAbsolutePath().normalize(); + for (int i = 0; i < normalized.getNameCount(); i++) { + if ("src".equals(normalized.getName(i).toString())) { + return normalized.getRoot() != null + ? normalized.getRoot().resolve(normalized.subpath(0, i)) + : normalized.subpath(0, i); + } + } + return normalized.getParent(); + } + + private record ImportContext(Map explicitImports, List wildcardImports) { + } + + private record AnnotationParseResult(String content, int endIndex) { + } + + private record GroupDefinition(String fqn, + Path sourceFile, + Path moduleRoot, + List parentGroupFqns, + List directProperties) { + } + + private record GroupCandidate(String fqn, + Path moduleRoot, + boolean composite, + int propertyCount, + BitSet coverage) { + } +} diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/generator/StudioPropertySignature.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/generator/StudioPropertySignature.java new file mode 100644 index 0000000000..ecd24041c2 --- /dev/null +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/generator/StudioPropertySignature.java @@ -0,0 +1,72 @@ +/* + * Copyright 2026 Haulmont. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.jmix.flowui.kit.meta.generator; + +import org.jspecify.annotations.Nullable; + +import java.util.List; + +record StudioPropertySignature( + String xmlAttribute, + String type, + String classFqn, + @Nullable String category, + boolean required, + String defaultValue, + String defaultValueRef, + String initialValue, + List options, + String setMethod, + String setParameterFqn, + String addMethod, + String addParameterFqn, + String removeMethod, + String removeParameterFqn, + String typeParameter, + boolean useAsInjectionType, + List componentRefTags, + String cdataWrapperTag +) { + static StudioPropertySignature of(String xmlAttribute, + String type, + @Nullable String category, + boolean required, + String defaultValue, + List options) { + return new StudioPropertySignature( + xmlAttribute, + type, + "", + category, + required, + defaultValue, + "", + "", + List.copyOf(options), + "", + "", + "", + "", + "", + "", + "", + false, + List.of(), + "" + ); + } +} diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/generator/StudioXsdElementCandidate.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/generator/StudioXsdElementCandidate.java new file mode 100644 index 0000000000..4760211844 --- /dev/null +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/generator/StudioXsdElementCandidate.java @@ -0,0 +1,50 @@ +/* + * Copyright 2026 Haulmont. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.jmix.flowui.kit.meta.generator; + +import org.w3c.dom.Element; + +import java.nio.file.Path; +import java.util.List; + +record StudioXsdElementCandidate(Path schemaPath, String elementName, boolean nested, + List ancestorElements, List contextNames, String description, + StudioMetaDescriptionGenerator.SchemaDocument document, Element element) { + + StudioXsdElementCandidate(Path schemaPath, + String elementName, + boolean nested, + List ancestorElements, + List contextNames, + String description, + StudioMetaDescriptionGenerator.SchemaDocument document, + Element element) { + this.schemaPath = schemaPath; + this.elementName = elementName; + this.nested = nested; + this.ancestorElements = List.copyOf(ancestorElements); + this.contextNames = List.copyOf(contextNames); + this.description = description; + this.document = document; + this.element = element; + } + + @Override + public String toString() { + return description; + } +} diff --git a/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/generator/package-info.java b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/generator/package-info.java new file mode 100644 index 0000000000..3dce7a3839 --- /dev/null +++ b/jmix-flowui/flowui-kit/src/main/java/io/jmix/flowui/kit/meta/generator/package-info.java @@ -0,0 +1,21 @@ +/* + * Copyright 2026 Haulmont. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@NullMarked +/// For internal use only. +package io.jmix.flowui.kit.meta.generator; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file diff --git a/jmix-flowui/flowui/src/test/groovy/io/jmix/flowui/kit/meta/generator/StudioMetaDescriptionGeneratorTest.groovy b/jmix-flowui/flowui/src/test/groovy/io/jmix/flowui/kit/meta/generator/StudioMetaDescriptionGeneratorTest.groovy new file mode 100644 index 0000000000..3c370724c5 --- /dev/null +++ b/jmix-flowui/flowui/src/test/groovy/io/jmix/flowui/kit/meta/generator/StudioMetaDescriptionGeneratorTest.groovy @@ -0,0 +1,775 @@ +/* + * Copyright 2026 Haulmont. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.jmix.flowui.kit.meta.generator + +import io.jmix.flowui.kit.meta.StudioAction +import io.jmix.flowui.kit.meta.StudioComponent +import io.jmix.flowui.kit.meta.StudioDataComponent +import io.jmix.flowui.kit.meta.StudioElement +import io.jmix.flowui.kit.meta.StudioFacet +import io.jmix.flowui.kit.meta.StudioPropertyGroups +import spock.lang.Shared +import spock.lang.Specification + +import java.nio.charset.StandardCharsets +import java.nio.file.Files +import java.nio.file.Path +import java.util.regex.Matcher +import java.util.regex.Pattern + +class StudioMetaDescriptionGeneratorTest extends Specification { + + @Shared + Path workspaceRoot = StudioMetaDescriptionGenerator.detectWorkspaceRoot(Path.of('').toAbsolutePath()) + + @Shared + Path layoutXsd = requiredClasspathResource(LAYOUT_SCHEMA_RESOURCE) + + @Shared + Path dataXsd = requiredClasspathResource(DATA_SCHEMA_RESOURCE) + + @Shared + StudioMetaDescriptionGenerator generator = new StudioMetaDescriptionGenerator(workspaceRoot) + + @Shared + Map> javaClassIndex = buildJavaClassIndex() + + def "test generated dataLoadCoordinator meta matches exact fixture property group"() { + when: + def generatedMeta = generateFacetMeta('dataLoadCoordinator') + + then: + generatedMeta.toComparableMap() == expectedMeta(TestStudioMetaDescriptions, 'dataLoadCoordinator').toComparableMap() + generatedMeta.propertyGroups == [TestStudioMetaPropertyGroups.DataLoadCoordinatorGeneratedProperties.canonicalName] + !containsPropertyGroup(generatedMeta.propertyGroups, StudioPropertyGroups.Auto) + } + + def "test generated timer meta uses only exact property groups"() { + when: + def generatedMeta = generateFacetMeta('timer') + + then: + propertyShape(generatedMeta.properties) == propertyShape(expectedMeta(STUDIO_FACETS_CLASS_NAME, 'timer').properties) + generatedMeta.propertyGroups == [StudioPropertyGroups.RequiredId.canonicalName] + !generatedMeta.propertyGroups.contains(TestStudioMetaPropertyGroups.TimerPropertiesWithDifferentRepeatingDefaultValue.canonicalName) + } + + def "test generated avatar meta matches existing StudioComponents description"() { + when: + def generatedMeta = generateMeta(layoutXsd, 'avatar') { true } + def expectedMeta = expectedMeta(STUDIO_COMPONENTS_CLASS_NAME, 'avatar') + + then: + generatedMeta.kind == expectedMeta.kind + generatedMeta.xmlElement == expectedMeta.xmlElement + propertyAttributes(generatedMeta.properties) == propertyAttributes(expectedMeta.properties) + containsPropertyGroup(generatedMeta.propertyGroups, StudioPropertyGroups.ClassNamesAndCss) + containsPropertyGroup(generatedMeta.propertyGroups, StudioPropertyGroups.ThemeNames) + } + + def "test generated accordionPanel meta matches existing StudioElements description"() { + when: + def generatedMeta = generateMeta(layoutXsd, 'accordionPanel') { true } + def expectedMeta = expectedMeta(STUDIO_ELEMENTS_CLASS_NAME, 'accordionPanel') + + then: + generatedMeta.kind == expectedMeta.kind + generatedMeta.xmlElement == expectedMeta.xmlElement + propertyAttributes(generatedMeta.properties).containsAll(propertyAttributes(expectedMeta.properties)) + containsPropertyGroup(generatedMeta.propertyGroups, StudioPropertyGroups.Colspan) + containsPropertyGroup(generatedMeta.propertyGroups, StudioPropertyGroups.Enabled) + } + + def "test generated view action reuses common StudioActions defaults"() { + given: + def expectedBaseAction = expectedMeta(STUDIO_ACTIONS_CLASS_NAME, "baseAction") + + when: + def generatedMeta = generateViewActionMeta(VIEW_ACTION_XML_ELEMENT) + + then: + generatedMeta.kind == StudioMetaKind.ACTION + generatedMeta.xmlElement == VIEW_ACTION_XML_ELEMENT + propertyAttributes(generatedMeta.properties).containsAll( + propertyAttributes(expectedBaseAction.properties) + [ACTION_TYPE_XML_ATTRIBUTE] + ) + containsPropertyGroup(generatedMeta.propertyGroups, StudioPropertyGroups.RequiredId) + containsPropertyGroup(generatedMeta.propertyGroups, StudioPropertyGroups.Text) + containsAnyPropertyGroup(generatedMeta.propertyGroups, + StudioPropertyGroups.Description, + StudioPropertyGroups.DescriptionWithoutCategory) + } + + def "test generated collection data component matches existing StudioDataComponents description"() { + when: + def generatedMeta = generateViewDataMeta('collection') + def expectedMeta = expectedMeta(STUDIO_DATA_COMPONENTS_CLASS_NAME, 'collection') + + then: + generatedMeta.kind == expectedMeta.kind + generatedMeta.xmlElement == expectedMeta.xmlElement + propertyAttributes(generatedMeta.properties) == propertyAttributes(expectedMeta.properties) + containsPropertyGroup(generatedMeta.propertyGroups, StudioPropertyGroups.RequiredId) + containsPropertyGroup(generatedMeta.propertyGroups, StudioPropertyGroups.EntityClass) + } + + private MetaProjection generateFacetMeta(String elementName) { + generateMeta(layoutXsd, elementName, candidateInContext(FACETS_CONTEXT)) + } + + private MetaProjection generateViewActionMeta(String elementName) { + generateMeta(layoutXsd, elementName, candidateInContext(VIEW_ACTIONS_CONTEXT)) + } + + private MetaProjection generateViewDataMeta(String elementName) { + generateMeta(dataXsd, elementName, candidateInContext(VIEW_DATA_CONTEXT)) + } + + private MetaProjection generateMeta(Path schemaPath, + String elementName, + Closure candidateSelector) { + StudioXsdElementCandidate candidate = findCandidate(schemaPath, elementName, candidateSelector) + Path outputPath = Files.createTempDirectory('generated-meta-test').resolve('TestGeneratedMeta.java') + + parseMetaSource(generator.generate(candidate, StudioMetaKind.AUTO, outputPath).source()) + } + + private StudioXsdElementCandidate findCandidate(Path schemaPath, + String elementName, + Closure candidateSelector) { + List candidates = generator.findElementCandidates(schemaPath, elementName) + .findAll(candidateSelector) + assert candidates.size() == 1: "Unexpected candidates for ${elementName}: ${candidates*.description()}" + candidates.first() + } + + private static Closure candidateInContext(String contextName) { + return { StudioXsdElementCandidate candidate -> candidate.contextNames().contains(contextName) } + } + + private MetaProjection expectedMeta(Class sourceClass, String methodName) { + expectedMeta(sourcePathOf(sourceClass), methodName) + } + + private MetaProjection expectedMeta(String sourceClassName, String methodName) { + expectedMeta(sourcePathOf(sourceClassName), methodName) + } + + private MetaProjection expectedMeta(Path sourcePath, String methodName) { + String source = Files.readString(sourcePath, StandardCharsets.UTF_8) + parseMetaSource(source, methodName, sourcePath.fileName.toString().replaceFirst(/\.java$/, '')) + } + + private MetaProjection parseMetaSource(String source) { + parseMetaSource(source, null, parseOuterClassName(stripComments(source))) + } + + private MetaProjection parseMetaSource(String source, String methodName, String outerClassName) { + String strippedSource = stripComments(source) + ImportContext importContext = parseImports(strippedSource) + String packageName = parsePackageName(strippedSource) + AnnotationParseResult annotation = methodName != null + ? findMethodAnnotation(strippedSource, methodName) + : findFirstMetaAnnotation(strippedSource) + Map annotationArguments = parseNamedArguments(annotation.content) + + new MetaProjection( + kind: metaKind(annotation.name), + xmlElement: unquoteJavaString(annotationArguments.getOrDefault('xmlElement', '')), + propertyGroups: parseClassArray(annotationArguments.get('propertyGroups'), packageName, outerClassName, importContext), + properties: parseProperties(annotationArguments.get('properties')) + ) + } + + private static AnnotationParseResult findMethodAnnotation(String source, String methodName) { + Matcher methodMatcher = Pattern.compile("\\b${Pattern.quote(methodName)}\\s*\\(").matcher(source) + assert methodMatcher.find(): "Method ${methodName} not found" + + int methodIndex = methodMatcher.start() + AnnotationParseResult result = null + for (String annotationName : SUPPORTED_META_ANNOTATIONS) { + Matcher annotationMatcher = Pattern.compile("@${annotationName}\\s*\\(").matcher(source) + while (annotationMatcher.find()) { + if (annotationMatcher.start() >= methodIndex) { + break + } + result = new AnnotationParseResult( + annotationName, + parseAnnotationContent(source, annotationMatcher.end() - 1) + ) + } + } + + assert result != null: "No Studio meta annotation found for ${methodName}" + result + } + + private static AnnotationParseResult findFirstMetaAnnotation(String source) { + List> matches = SUPPORTED_META_ANNOTATIONS.collect { annotationName -> + Matcher matcher = Pattern.compile("@${annotationName}\\s*\\(").matcher(source) + matcher.find() ? [name: annotationName, index: matcher.start(), parenIndex: matcher.end() - 1] : null + }.findAll { it != null } as List> + + assert !matches.empty: 'No Studio meta annotation found in generated source' + + Map firstMatch = matches.min { it.index as int } + new AnnotationParseResult( + firstMatch.name as String, + parseAnnotationContent(source, firstMatch.parenIndex as int) + ) + } + + private static AnnotationContent parseAnnotationContent(String source, int openingParenthesisIndex) { + int depth = 0 + boolean inString = false + boolean escaped = false + int startIndex = openingParenthesisIndex + 1 + + for (int i = openingParenthesisIndex; i < source.length(); i++) { + char current = source.charAt(i) + if (inString) { + if (escaped) { + escaped = false + } else if (current == '\\' as char) { + escaped = true + } else if (current == '"' as char) { + inString = false + } + continue + } + + if (current == '"' as char) { + inString = true + continue + } + if (current == '(' as char) { + depth++ + continue + } + if (current == ')' as char) { + depth-- + if (depth == 0) { + return new AnnotationContent(source.substring(startIndex, i), i + 1) + } + } + } + + throw new IllegalArgumentException('Cannot parse annotation content') + } + + private static Map parseNamedArguments(String annotationContent) { + Map arguments = [:] + splitTopLevel(annotationContent, ',').each { String part -> + if (part.isBlank()) { + return + } + + int equalsIndex = findTopLevelEquals(part) + if (equalsIndex < 0) { + return + } + + arguments.put(part.substring(0, equalsIndex).strip(), part.substring(equalsIndex + 1).strip()) + } + arguments + } + + private static int findTopLevelEquals(String value) { + boolean inString = false + boolean escaped = false + int parenthesesDepth = 0 + int bracesDepth = 0 + + for (int i = 0; i < value.length(); i++) { + char current = value.charAt(i) + if (inString) { + if (escaped) { + escaped = false + } else if (current == '\\' as char) { + escaped = true + } else if (current == '"' as char) { + inString = false + } + continue + } + + if (current == '"' as char) { + inString = true + } else if (current == '(' as char) { + parenthesesDepth++ + } else if (current == ')' as char) { + parenthesesDepth-- + } else if (current == '{' as char) { + bracesDepth++ + } else if (current == '}' as char) { + bracesDepth-- + } else if (current == '=' as char && parenthesesDepth == 0 && bracesDepth == 0) { + return i + } + } + + -1 + } + + private List parseClassArray(String value, + String packageName, + String outerClassName, + ImportContext importContext) { + if (!value) { + return List.of() + } + + String normalized = stripWrappingBraces(value.strip()) + if (normalized.isBlank()) { + return List.of() + } + + splitTopLevel(normalized, ',') + .collect { it.strip() } + .findAll { !it.isBlank() } + .collect { resolveClassReference(it, packageName, outerClassName, importContext) } + } + + private static List parseProperties(String propertiesValue) { + if (!propertiesValue) { + return List.of() + } + + List properties = [] + int currentIndex = 0 + while (true) { + int propertyIndex = propertiesValue.indexOf('@StudioProperty', currentIndex) + if (propertyIndex < 0) { + break + } + + int openingParenthesisIndex = propertiesValue.indexOf('(', propertyIndex) + AnnotationContent propertyAnnotation = parseAnnotationContent(propertiesValue, openingParenthesisIndex) + properties.add(parseProperty(propertyAnnotation.content)) + currentIndex = propertyAnnotation.endIndex + } + + properties + } + + private static StudioPropertySignature parseProperty(String propertyAnnotationContent) { + Map arguments = parseNamedArguments(propertyAnnotationContent) + + new StudioPropertySignature( + unquoteJavaString(arguments.get('xmlAttribute')), + lastSegment(arguments.get('type')), + unquoteJavaString(arguments.getOrDefault('classFqn', '')), + arguments.containsKey('category') ? lastSegment(arguments.get('category')) : null, + Boolean.parseBoolean(arguments.getOrDefault('required', 'false')), + unquoteJavaString(arguments.getOrDefault('defaultValue', '')), + unquoteJavaString(arguments.getOrDefault('defaultValueRef', '')), + unquoteJavaString(arguments.getOrDefault('initialValue', '')), + parseStringArray(arguments.get('options')), + unquoteJavaString(arguments.getOrDefault('setMethod', '')), + unquoteJavaString(arguments.getOrDefault('setParameterFqn', '')), + unquoteJavaString(arguments.getOrDefault('addMethod', '')), + unquoteJavaString(arguments.getOrDefault('addParameterFqn', '')), + unquoteJavaString(arguments.getOrDefault('removeMethod', '')), + unquoteJavaString(arguments.getOrDefault('removeParameterFqn', '')), + unquoteJavaString(arguments.getOrDefault('typeParameter', '')), + Boolean.parseBoolean(arguments.getOrDefault('useAsInjectionType', 'false')), + parseStringArray(arguments.get('componentRefTags')), + unquoteJavaString(arguments.getOrDefault('cdataWrapperTag', '')) + ) + } + + private static List parseStringArray(String value) { + if (!value) { + return List.of() + } + + String normalized = stripWrappingBraces(value.strip()) + if (normalized.isBlank()) { + return List.of() + } + + splitTopLevel(normalized, ',') + .collect { unquoteJavaString(it.strip()) } + .findAll { !it.isBlank() } + } + + private String resolveClassReference(String reference, + String packageName, + String outerClassName, + ImportContext importContext) { + String sanitizedReference = reference.replace('.class', '').strip() + if (!sanitizedReference.contains('.')) { + String explicitImport = importContext.explicitImports[sanitizedReference] + if (explicitImport) { + return explicitImport + } + String samePackageClass = findIndexedClassFqn(sanitizedReference, packageName) + if (samePackageClass) { + return samePackageClass + } + return "${packageName}.${outerClassName}.${sanitizedReference}" + } + + String firstSegment = sanitizedReference.substring(0, sanitizedReference.indexOf('.')) + if (Character.isLowerCase(firstSegment.charAt(0))) { + return sanitizedReference + } + if (outerClassName == firstSegment) { + return "${packageName}.${sanitizedReference}" + } + + String importedOuterClass = importContext.explicitImports[firstSegment] + if (importedOuterClass) { + return importedOuterClass + sanitizedReference.substring(firstSegment.length()) + } + String indexedSamePackage = findIndexedClassFqn(firstSegment, packageName) + if (indexedSamePackage) { + return indexedSamePackage + sanitizedReference.substring(firstSegment.length()) + } + String indexedWildcard = findIndexedClassFqn(firstSegment, importContext.wildcardImports) + if (indexedWildcard) { + return indexedWildcard + sanitizedReference.substring(firstSegment.length()) + } + if (!importContext.wildcardImports.empty) { + return "${importContext.wildcardImports.first()}.${sanitizedReference}" + } + return "${packageName}.${sanitizedReference}" + } + + private String findIndexedClassFqn(String simpleName, String packageName) { + javaClassIndex.getOrDefault(simpleName, List.of()) + .find { it.startsWith("${packageName}.") } + } + + private String findIndexedClassFqn(String simpleName, List candidatePackages) { + javaClassIndex.getOrDefault(simpleName, List.of()) + .find { String fqn -> candidatePackages.any { candidatePackage -> fqn.startsWith("${candidatePackage}.") } } + } + + private static ImportContext parseImports(String source) { + Map explicitImports = [:] + List wildcardImports = [] + + Matcher matcher = Pattern.compile("\\bimport\\s+([A-Za-z_][A-Za-z0-9_.*]*)\\s*;").matcher(source) + while (matcher.find()) { + String imported = matcher.group(1) + if (imported.endsWith('.*')) { + wildcardImports.add(imported.substring(0, imported.length() - 2)) + } else { + explicitImports[imported.substring(imported.lastIndexOf('.') + 1)] = imported + } + } + + new ImportContext(explicitImports, wildcardImports) + } + + private static String parsePackageName(String source) { + Matcher matcher = Pattern.compile("\\bpackage\\s+([A-Za-z_][A-Za-z0-9_.]*)\\s*;").matcher(source) + assert matcher.find(): 'Package declaration not found' + matcher.group(1) + } + + private static String parseOuterClassName(String source) { + Matcher matcher = Pattern.compile("\\b(?:public\\s+)?(?:final\\s+)?(?:class|interface)\\s+([A-Za-z_][A-Za-z0-9_]*)\\b") + .matcher(source) + assert matcher.find(): 'Outer class name not found' + matcher.group(1) + } + + private Map> buildJavaClassIndex() { + Map> index = [:].withDefault { [] } + repositoryRoots().findAll { Files.isDirectory(it) }.each { root -> + Files.walk(root) + .filter { path -> path.toString().endsWith('.java') } + .forEach { Path path -> + String source = Files.readString(path, StandardCharsets.UTF_8) + String strippedSource = stripComments(source) + Matcher packageMatcher = Pattern.compile("\\bpackage\\s+([A-Za-z_][A-Za-z0-9_.]*)\\s*;").matcher(strippedSource) + Matcher classMatcher = Pattern.compile("\\b(?:public\\s+)?(?:final\\s+)?(?:class|interface)\\s+([A-Za-z_][A-Za-z0-9_]*)\\b") + .matcher(strippedSource) + if (packageMatcher.find() && classMatcher.find()) { + String fqn = "${packageMatcher.group(1)}.${classMatcher.group(1)}" + index[classMatcher.group(1)] = index[classMatcher.group(1)] + fqn + } + } + } + index + } + + private List repositoryRoots() { + [ + workspaceRoot.resolve(OPEN_SOURCE_REPOSITORY_DIRECTORY), + workspaceRoot.resolve(PREMIUM_REPOSITORY_DIRECTORY) + ].collect { it.normalize() } + } + + private static Path requiredClasspathResource(String resourcePath) { + URL resource = StudioMetaDescriptionGeneratorTest.classLoader.getResource(resourcePath) + assert resource != null: "Classpath resource ${resourcePath} not found" + Path.of(resource.toURI()) + } + + private static Path sourcePathOf(String className) { + sourcePathOf(loadSourceClass(className)) + } + + private static Path sourcePathOf(Class sourceClass) { + Path compiledClassRoot = Path.of(sourceClass.protectionDomain.codeSource.location.toURI()) + Path buildDirectory = findAncestor(compiledClassRoot, BUILD_DIRECTORY) + assert buildDirectory != null: "Cannot resolve build directory for ${sourceClass.name}" + + Path moduleRoot = buildDirectory.parent + String relativeSourcePath = sourceClass.name.replace('.', '/') + '.java' + List preferredSourceSets = compiledClassRoot.fileName?.toString() == 'test' + ? TEST_SOURCE_SETS + MAIN_SOURCE_SETS + : MAIN_SOURCE_SETS + TEST_SOURCE_SETS + + Path sourcePath = preferredSourceSets.stream() + .map { sourceSet -> moduleRoot.resolve(sourceSet).resolve(relativeSourcePath).normalize() } + .filter { Files.exists(it) } + .findFirst() + .orElse(null) + + assert sourcePath != null: "Cannot resolve source path for ${sourceClass.name}" + sourcePath + } + + private static Class loadSourceClass(String className) { + Class.forName(className, false, StudioMetaDescriptionGeneratorTest.classLoader) + } + + private static Path findAncestor(Path path, String directoryName) { + Path current = path + while (current != null) { + if (current.fileName?.toString() == directoryName) { + return current + } + current = current.parent + } + null + } + + private static boolean containsPropertyGroup(List propertyGroups, Class propertyGroup) { + propertyGroups.contains(propertyGroup.canonicalName) + } + + private static boolean containsAnyPropertyGroup(List propertyGroups, Class... propertyGroupsToCheck) { + propertyGroupsToCheck.any { containsPropertyGroup(propertyGroups, it) } + } + + private static String stripComments(String source) { + source + .replaceAll(/(?s)\/\*.*?\*\//, '') + .replaceAll(/(?m)^\s*\/\/.*$/, '') + } + + private static List splitTopLevel(String value, String delimiter) { + List result = [] + char delimiterChar = delimiter.charAt(0) + boolean inString = false + boolean escaped = false + int parenthesesDepth = 0 + int bracesDepth = 0 + int bracketDepth = 0 + int startIndex = 0 + + for (int i = 0; i < value.length(); i++) { + char current = value.charAt(i) + if (inString) { + if (escaped) { + escaped = false + } else if (current == '\\' as char) { + escaped = true + } else if (current == '"' as char) { + inString = false + } + continue + } + + if (current == '"' as char) { + inString = true + } else if (current == '(' as char) { + parenthesesDepth++ + } else if (current == ')' as char) { + parenthesesDepth-- + } else if (current == '{' as char) { + bracesDepth++ + } else if (current == '}' as char) { + bracesDepth-- + } else if (current == '[' as char) { + bracketDepth++ + } else if (current == ']' as char) { + bracketDepth-- + } else if (current == delimiterChar && parenthesesDepth == 0 && bracesDepth == 0 && bracketDepth == 0) { + result.add(value.substring(startIndex, i)) + startIndex = i + 1 + } + } + + result.add(value.substring(startIndex)) + result + } + + private static String stripWrappingBraces(String value) { + value.startsWith('{') && value.endsWith('}') ? value.substring(1, value.length() - 1).strip() : value + } + + private static String unquoteJavaString(String value) { + if (value == null) { + return '' + } + + String stripped = value.strip() + if (stripped.length() >= 2 && stripped.startsWith('"') && stripped.endsWith('"')) { + return stripped.substring(1, stripped.length() - 1) + } + stripped + } + + private static String lastSegment(String value) { + if (!value) { + return '' + } + String stripped = value.strip() + int separatorIndex = stripped.lastIndexOf('.') + separatorIndex >= 0 ? stripped.substring(separatorIndex + 1) : stripped + } + + private static List> propertyShape(List properties) { + properties.collect { StudioPropertySignature property -> + [ + xmlAttribute: property.xmlAttribute(), + type : property.type(), + required : property.required() + ] + }.sort { it.xmlAttribute as String } as List> + } + + private static List propertyAttributes(List properties) { + properties.collect { it.xmlAttribute() }.sort() + } + + private static StudioMetaKind metaKind(String annotationName) { + StudioMetaKind metaKind = META_KIND_BY_ANNOTATION[annotationName] + if (metaKind == null) { + throw new IllegalArgumentException("Unsupported meta annotation: ${annotationName}") + } + metaKind + } + + private static final class AnnotationParseResult { + final String name + final String content + final int endIndex + + AnnotationParseResult(String name, AnnotationContent content) { + this.name = name + this.content = content.content + this.endIndex = content.endIndex + } + } + + private static final class AnnotationContent { + final String content + final int endIndex + + AnnotationContent(String content, int endIndex) { + this.content = content + this.endIndex = endIndex + } + } + + private static final class ImportContext { + final Map explicitImports + final List wildcardImports + + ImportContext(Map explicitImports, List wildcardImports) { + this.explicitImports = explicitImports + this.wildcardImports = wildcardImports + } + } + + private static final class MetaProjection { + StudioMetaKind kind + String xmlElement + List propertyGroups + List properties + + Map toComparableMap() { + [ + kind : kind, + xmlElement : xmlElement, + propertyGroups: propertyGroups, + properties : properties + ] + } + } + + private static final String BUILD_DIRECTORY = 'build' + + private static final String OPEN_SOURCE_REPOSITORY_DIRECTORY = 'jmix' + private static final String PREMIUM_REPOSITORY_DIRECTORY = 'jmix-premium' + + private static final String MAIN_JAVA_SOURCE_SET = 'src/main/java' + private static final String MAIN_GROOVY_SOURCE_SET = 'src/main/groovy' + private static final String TEST_JAVA_SOURCE_SET = 'src/test/java' + private static final String TEST_GROOVY_SOURCE_SET = 'src/test/groovy' + + private static final String FLOW_RESOURCES__BASE_DIR = 'io/jmix/flowui/view/' + private static final String LAYOUT_SCHEMA_RESOURCE = FLOW_RESOURCES__BASE_DIR + 'layout.xsd' + private static final String DATA_SCHEMA_RESOURCE = FLOW_RESOURCES__BASE_DIR + 'data.xsd' + + private static final String FACETS_CONTEXT = 'facets' + private static final String VIEW_ACTIONS_CONTEXT = 'viewActions' + private static final String VIEW_DATA_CONTEXT = 'viewData' + + private static final String ACTION_TYPE_XML_ATTRIBUTE = 'type' + private static final String VIEW_ACTION_XML_ELEMENT = 'action' + + // use string fqn because interfaces are package-private + private static final String STUDIO_COMPONENTS_CLASS_NAME = + 'io.jmix.flowui.kit.meta.component.StudioComponents' + private static final String STUDIO_ELEMENTS_CLASS_NAME = + 'io.jmix.flowui.kit.meta.element.StudioElements' + private static final String STUDIO_ACTIONS_CLASS_NAME = + 'io.jmix.flowui.kit.meta.action.StudioActions' + private static final String STUDIO_DATA_COMPONENTS_CLASS_NAME = + 'io.jmix.flowui.kit.meta.datacomponent.StudioDataComponents' + private static final String STUDIO_FACETS_CLASS_NAME = + 'io.jmix.flowui.kit.meta.facet.StudioFacets' + + private static final Map META_KIND_BY_ANNOTATION = [ + (StudioFacet.simpleName) : StudioMetaKind.FACET, + (StudioComponent.simpleName) : StudioMetaKind.COMPONENT, + (StudioElement.simpleName) : StudioMetaKind.ELEMENT, + (StudioAction.simpleName) : StudioMetaKind.ACTION, + (StudioDataComponent.simpleName): StudioMetaKind.DATA_COMPONENT + ].asImmutable() + + private static final List SUPPORTED_META_ANNOTATIONS = + META_KIND_BY_ANNOTATION.keySet().asList().asImmutable() + + private static final List TEST_SOURCE_SETS = [ + TEST_JAVA_SOURCE_SET, + TEST_GROOVY_SOURCE_SET + ].asImmutable() + + private static final List MAIN_SOURCE_SETS = [ + MAIN_JAVA_SOURCE_SET, + MAIN_GROOVY_SOURCE_SET + ].asImmutable() +} diff --git a/jmix-flowui/flowui/src/test/java/io/jmix/flowui/kit/meta/generator/TestStudioMetaDescriptions.java b/jmix-flowui/flowui/src/test/java/io/jmix/flowui/kit/meta/generator/TestStudioMetaDescriptions.java new file mode 100644 index 0000000000..561175b0f7 --- /dev/null +++ b/jmix-flowui/flowui/src/test/java/io/jmix/flowui/kit/meta/generator/TestStudioMetaDescriptions.java @@ -0,0 +1,40 @@ +/* + * Copyright 2026 Haulmont. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.jmix.flowui.kit.meta.generator; + +import io.jmix.flowui.kit.meta.StudioFacet; +import io.jmix.flowui.kit.meta.StudioProperty; +import io.jmix.flowui.kit.meta.StudioPropertyType; +import io.jmix.flowui.kit.meta.StudioUiKit; + +@StudioUiKit +public interface TestStudioMetaDescriptions { + + @StudioFacet( + name = "TestDataLoadCoordinator", + xmlElement = "dataLoadCoordinator", + propertyGroups = TestStudioMetaPropertyGroups.DataLoadCoordinatorGeneratedProperties.class, + properties = { + @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, + type = StudioPropertyType.COMPONENT_ID), + @StudioProperty(xmlAttribute = "auto", type = StudioPropertyType.BOOLEAN), + @StudioProperty(xmlAttribute = "containerPrefix", type = StudioPropertyType.STRING), + @StudioProperty(xmlAttribute = "componentPrefix", type = StudioPropertyType.STRING) + } + ) + void dataLoadCoordinator(); +} diff --git a/jmix-flowui/flowui/src/test/java/io/jmix/flowui/kit/meta/generator/TestStudioMetaPropertyGroups.java b/jmix-flowui/flowui/src/test/java/io/jmix/flowui/kit/meta/generator/TestStudioMetaPropertyGroups.java new file mode 100644 index 0000000000..e86adc73bb --- /dev/null +++ b/jmix-flowui/flowui/src/test/java/io/jmix/flowui/kit/meta/generator/TestStudioMetaPropertyGroups.java @@ -0,0 +1,68 @@ +/* + * Copyright 2026 Haulmont. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.jmix.flowui.kit.meta.generator; + +import io.jmix.flowui.kit.meta.StudioProperty; +import io.jmix.flowui.kit.meta.StudioPropertyGroup; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; +import io.jmix.flowui.kit.meta.StudioPropertyType; + +class TestStudioMetaPropertyGroups { + + private TestStudioMetaPropertyGroups() { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "auto", type = StudioPropertyType.BOOLEAN) + } + ) + interface AutoWithoutDefaultValue { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "componentPrefix", type = StudioPropertyType.STRING) + } + ) + interface ComponentPrefixWithoutDefaultValue { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "containerPrefix", type = StudioPropertyType.STRING) + } + ) + interface ContainerPrefixWithoutDefaultValue { + } + + @StudioPropertyGroup + interface DataLoadCoordinatorGeneratedProperties extends StudioPropertyGroups.Id, + AutoWithoutDefaultValue, ComponentPrefixWithoutDefaultValue, ContainerPrefixWithoutDefaultValue { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "id", type = StudioPropertyType.COMPONENT_ID, required = true), + @StudioProperty(xmlAttribute = "delay", type = StudioPropertyType.INTEGER, required = true), + @StudioProperty(xmlAttribute = "repeating", type = StudioPropertyType.BOOLEAN, defaultValue = "true"), + @StudioProperty(xmlAttribute = "autostart", type = StudioPropertyType.BOOLEAN, defaultValue = "false") + } + ) + interface TimerPropertiesWithDifferentRepeatingDefaultValue { + } +} diff --git a/jmix-fullcalendar/fullcalendar-flowui-kit/src/main/java/io/jmix/fullcalendarflowui/kit/meta/StudioFullCalendarActions.java b/jmix-fullcalendar/fullcalendar-flowui-kit/src/main/java/io/jmix/fullcalendarflowui/kit/meta/StudioFullCalendarActions.java index 490ea640eb..755a7fa415 100644 --- a/jmix-fullcalendar/fullcalendar-flowui-kit/src/main/java/io/jmix/fullcalendarflowui/kit/meta/StudioFullCalendarActions.java +++ b/jmix-fullcalendar/fullcalendar-flowui-kit/src/main/java/io/jmix/fullcalendarflowui/kit/meta/StudioFullCalendarActions.java @@ -17,6 +17,7 @@ package io.jmix.fullcalendarflowui.kit.meta; import io.jmix.flowui.kit.meta.*; +import io.jmix.flowui.kit.meta.action.StudioActionPropertyGroups; @StudioUiKit public interface StudioFullCalendarActions { @@ -27,6 +28,7 @@ public interface StudioFullCalendarActions { classFqn = "io.jmix.fullcalendarflowui.action.DaysOfWeekEditAction", icon = "io/jmix/fullcalendarflowui/kit/meta/icon/action/action.svg", documentationLink = "%VERSION%/calendar/full-calendar-component.html#days-of-week-datatype", + propertyGroups = StudioActionPropertyGroups.ActionCommonPropertiesWithoutCategory.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", diff --git a/jmix-fullcalendar/fullcalendar-flowui-kit/src/main/java/io/jmix/fullcalendarflowui/kit/meta/StudioFullCalendarComponents.java b/jmix-fullcalendar/fullcalendar-flowui-kit/src/main/java/io/jmix/fullcalendarflowui/kit/meta/StudioFullCalendarComponents.java index 6b5f008592..62f30fc2e6 100644 --- a/jmix-fullcalendar/fullcalendar-flowui-kit/src/main/java/io/jmix/fullcalendarflowui/kit/meta/StudioFullCalendarComponents.java +++ b/jmix-fullcalendar/fullcalendar-flowui-kit/src/main/java/io/jmix/fullcalendarflowui/kit/meta/StudioFullCalendarComponents.java @@ -22,6 +22,7 @@ import io.jmix.flowui.kit.meta.StudioUiKit; import io.jmix.fullcalendarflowui.kit.component.JmixFullCalendar; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; @StudioUiKit(studioClassloaderDependencies = "io.jmix.fullcalendar:jmix-fullcalendar-flowui-kit") public interface StudioFullCalendarComponents { @@ -34,6 +35,7 @@ public interface StudioFullCalendarComponents { classFqn = "io.jmix.fullcalendarflowui.component.FullCalendar", documentationLink = "%VERSION%/calendar/full-calendar-component.html", icon = "io/jmix/fullcalendarflowui/kit/meta/icon/component/calendar.svg", + propertyGroups = StudioPropertyGroups.AddonComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", diff --git a/jmix-fullcalendar/fullcalendar-flowui-kit/src/main/java/io/jmix/fullcalendarflowui/kit/meta/StudioFullCalendarElements.java b/jmix-fullcalendar/fullcalendar-flowui-kit/src/main/java/io/jmix/fullcalendarflowui/kit/meta/StudioFullCalendarElements.java index 67e836502f..836dc1d0fd 100644 --- a/jmix-fullcalendar/fullcalendar-flowui-kit/src/main/java/io/jmix/fullcalendarflowui/kit/meta/StudioFullCalendarElements.java +++ b/jmix-fullcalendar/fullcalendar-flowui-kit/src/main/java/io/jmix/fullcalendarflowui/kit/meta/StudioFullCalendarElements.java @@ -31,6 +31,7 @@ public interface StudioFullCalendarElements { icon = "io/jmix/fullcalendarflowui/kit/meta/icon/unknownComponent.svg", documentationLink = "%VERSION%/calendar/full-calendar-component.html#container-data-provider", isInjectable = false, + propertyGroups = StudioFullCalendarPropertyGroups.DataProviderProperties.class, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, @@ -74,6 +75,7 @@ public interface StudioFullCalendarElements { icon = "io/jmix/fullcalendarflowui/kit/meta/icon/unknownComponent.svg", documentationLink = "%VERSION%/calendar/full-calendar-component.html#callback-calendar-data-provider", isInjectable = false, + propertyGroups = StudioFullCalendarPropertyGroups.DataProviderProperties.class, properties = { @StudioProperty(xmlAttribute = "id", category = StudioProperty.Category.GENERAL, @@ -112,6 +114,11 @@ public interface StudioFullCalendarElements { icon = "io/jmix/flowui/kit/meta/icon/element/itemsQuery.svg", documentationLink = "%VERSION%/calendar/full-calendar-component.html#callback-calendar-data-provider", target = "io.jmix.fullcalendarflowui.component.data.EntityCalendarDataRetriever", + propertyGroups = { + StudioPropertyGroups.RequiredEntityClass.class, + StudioPropertyGroups.Query.class, + StudioPropertyGroups.FetchPlan.class + }, properties = { @StudioProperty(xmlAttribute = "class", type = StudioPropertyType.ENTITY_CLASS, required = true), @StudioProperty(xmlAttribute = "query", type = StudioPropertyType.JPA_QUERY), @@ -128,6 +135,9 @@ public interface StudioFullCalendarElements { icon = "io/jmix/fullcalendarflowui/kit/meta/icon/unknownComponent.svg", documentationLink = "%VERSION%/calendar/full-calendar-component.html#calendar-display-modes", isInjectable = false, + propertyGroups = { + StudioPropertyGroups.RequiredId.class + }, properties = { @StudioProperty(xmlAttribute = "id", type = StudioPropertyType.STRING, required = true), @StudioProperty(xmlAttribute = "type", type = StudioPropertyType.STRING, @@ -162,6 +172,13 @@ public interface StudioFullCalendarElements { classFqn = "io.jmix.fullcalendarflowui.kit.component.model.DayGridDayProperties", target = "io.jmix.fullcalendarflowui.kit.meta.element.StudioFullCalendarDisplayModeProperties", icon = "io/jmix/fullcalendarflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioFullCalendarPropertyGroups.DayHeaderFormat.class, + StudioFullCalendarPropertyGroups.DayPopoverFormat.class, + StudioFullCalendarPropertyGroups.EventTimeFormat.class, + StudioFullCalendarPropertyGroups.WeekNumberFormat.class, + StudioFullCalendarPropertyGroups.DisplayEventEnd.class + }, properties = { @StudioProperty(xmlAttribute = "dayHeaderFormat", type = StudioPropertyType.LOCALIZED_STRING), @StudioProperty(xmlAttribute = "dayPopoverFormat", type = StudioPropertyType.LOCALIZED_STRING), @@ -181,6 +198,7 @@ public interface StudioFullCalendarElements { classFqn = "io.jmix.fullcalendarflowui.kit.component.model.DayGridWeekProperties", target = "io.jmix.fullcalendarflowui.kit.meta.element.StudioFullCalendarDisplayModeProperties", icon = "io/jmix/fullcalendarflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioFullCalendarPropertyGroups.DayGridProperties.class, properties = { @StudioProperty(xmlAttribute = "dayHeaderFormat", type = StudioPropertyType.LOCALIZED_STRING), @StudioProperty(xmlAttribute = "dayPopoverFormat", type = StudioPropertyType.LOCALIZED_STRING), @@ -200,6 +218,11 @@ public interface StudioFullCalendarElements { classFqn = "io.jmix.fullcalendarflowui.kit.component.model.DayGridMonthProperties", target = "io.jmix.fullcalendarflowui.kit.meta.element.StudioFullCalendarDisplayModeProperties", icon = "io/jmix/fullcalendarflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioFullCalendarPropertyGroups.DayGridProperties.class, + StudioFullCalendarPropertyGroups.FixedWeekCount.class, + StudioFullCalendarPropertyGroups.ShowNonCurrentDates.class + }, properties = { @StudioProperty(xmlAttribute = "dayHeaderFormat", type = StudioPropertyType.LOCALIZED_STRING), @StudioProperty(xmlAttribute = "dayPopoverFormat", type = StudioPropertyType.LOCALIZED_STRING), @@ -221,6 +244,7 @@ public interface StudioFullCalendarElements { classFqn = "io.jmix.fullcalendarflowui.kit.component.model.DayGridYearProperties", target = "io.jmix.fullcalendarflowui.kit.meta.element.StudioFullCalendarDisplayModeProperties", icon = "io/jmix/fullcalendarflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioFullCalendarPropertyGroups.DayGridProperties.class, properties = { @StudioProperty(xmlAttribute = "dayHeaderFormat", type = StudioPropertyType.LOCALIZED_STRING), @StudioProperty(xmlAttribute = "dayPopoverFormat", type = StudioPropertyType.LOCALIZED_STRING), @@ -241,6 +265,7 @@ public interface StudioFullCalendarElements { classFqn = "io.jmix.fullcalendarflowui.kit.component.model.ListDayProperties", target = "io.jmix.fullcalendarflowui.kit.meta.element.StudioFullCalendarDisplayModeProperties", icon = "io/jmix/fullcalendarflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioFullCalendarPropertyGroups.ListProperties.class, properties = { @StudioProperty(xmlAttribute = "listDayFormat", type = StudioPropertyType.LOCALIZED_STRING), @StudioProperty(xmlAttribute = "listDaySideFormat", type = StudioPropertyType.LOCALIZED_STRING), @@ -260,6 +285,7 @@ public interface StudioFullCalendarElements { classFqn = "io.jmix.fullcalendarflowui.kit.component.model.ListWeekProperties", target = "io.jmix.fullcalendarflowui.kit.meta.element.StudioFullCalendarDisplayModeProperties", icon = "io/jmix/fullcalendarflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioFullCalendarPropertyGroups.ListProperties.class, properties = { @StudioProperty(xmlAttribute = "listDayFormat", type = StudioPropertyType.LOCALIZED_STRING), @StudioProperty(xmlAttribute = "listDaySideFormat", type = StudioPropertyType.LOCALIZED_STRING), @@ -278,6 +304,7 @@ public interface StudioFullCalendarElements { classFqn = "io.jmix.fullcalendarflowui.kit.component.model.ListMonthProperties", target = "io.jmix.fullcalendarflowui.kit.meta.element.StudioFullCalendarDisplayModeProperties", icon = "io/jmix/fullcalendarflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioFullCalendarPropertyGroups.ListProperties.class, properties = { @StudioProperty(xmlAttribute = "listDayFormat", type = StudioPropertyType.LOCALIZED_STRING), @StudioProperty(xmlAttribute = "listDaySideFormat", type = StudioPropertyType.LOCALIZED_STRING), @@ -296,6 +323,7 @@ public interface StudioFullCalendarElements { classFqn = "io.jmix.fullcalendarflowui.kit.component.model.ListYearProperties", target = "io.jmix.fullcalendarflowui.kit.meta.element.StudioFullCalendarDisplayModeProperties", icon = "io/jmix/fullcalendarflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioFullCalendarPropertyGroups.ListProperties.class, properties = { @StudioProperty(xmlAttribute = "listDayFormat", type = StudioPropertyType.LOCALIZED_STRING), @StudioProperty(xmlAttribute = "listDaySideFormat", type = StudioPropertyType.LOCALIZED_STRING), @@ -314,6 +342,7 @@ public interface StudioFullCalendarElements { classFqn = "io.jmix.fullcalendarflowui.kit.component.model.TimeGridDayProperties", target = "io.jmix.fullcalendarflowui.kit.meta.element.StudioFullCalendarDisplayModeProperties", icon = "io/jmix/fullcalendarflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioFullCalendarPropertyGroups.TimeGridProperties.class, properties = { @StudioProperty(xmlAttribute = "dayPopoverFormat", type = StudioPropertyType.LOCALIZED_STRING), @StudioProperty(xmlAttribute = "dayHeaderFormat", type = StudioPropertyType.LOCALIZED_STRING), @@ -338,6 +367,7 @@ public interface StudioFullCalendarElements { classFqn = "io.jmix.fullcalendarflowui.kit.component.model.TimeGridWeekProperties", target = "io.jmix.fullcalendarflowui.kit.meta.element.StudioFullCalendarDisplayModeProperties", icon = "io/jmix/fullcalendarflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioFullCalendarPropertyGroups.TimeGridProperties.class, properties = { @StudioProperty(xmlAttribute = "dayPopoverFormat", type = StudioPropertyType.LOCALIZED_STRING), @StudioProperty(xmlAttribute = "dayHeaderFormat", type = StudioPropertyType.LOCALIZED_STRING), @@ -362,6 +392,10 @@ public interface StudioFullCalendarElements { classFqn = "io.jmix.fullcalendarflowui.kit.component.model.MultiMonthYearProperties", target = "io.jmix.fullcalendarflowui.kit.meta.element.StudioFullCalendarDisplayModeProperties", icon = "io/jmix/fullcalendarflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioFullCalendarPropertyGroups.FixedWeekCount.class, + StudioFullCalendarPropertyGroups.ShowNonCurrentDates.class + }, properties = { @StudioProperty(xmlAttribute = "multiMonthMaxColumns", type = StudioPropertyType.INTEGER, defaultValue = "3"), @StudioProperty(xmlAttribute = "multiMonthMinWidth", type = StudioPropertyType.INTEGER, defaultValue = "350"), @@ -401,6 +435,7 @@ public interface StudioFullCalendarElements { documentationLink = "%VERSION%/calendar/full-calendar-component.html#properties", classFqn = "io.jmix.fullcalendarflowui.kit.meta.group.StudioFullCalendarProperties", icon = "io/jmix/fullcalendarflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = StudioPropertyGroups.RequiredStringNameAndValue.class, properties = { @StudioProperty(xmlAttribute = "name", type = StudioPropertyType.STRING, required = true), @StudioProperty(xmlAttribute = "value", type = StudioPropertyType.STRING, required = true), @@ -447,6 +482,9 @@ public interface StudioFullCalendarElements { classFqn = "io.jmix.fullcalendarflowui.facet.urlqueryparameters.FullCalendarUrlQueryParametersBinder", target = {"io.jmix.flowui.facet.UrlQueryParametersFacet"}, documentationLink = "%VERSION%/calendar/url-query-parameters.html", + propertyGroups = { + StudioPropertyGroups.Id.class + }, properties = { @StudioProperty(xmlAttribute = "component", category = StudioProperty.Category.GENERAL, type = StudioPropertyType.COMPONENT_REF, componentRefTags = "calendar", required = true), diff --git a/jmix-fullcalendar/fullcalendar-flowui-kit/src/main/java/io/jmix/fullcalendarflowui/kit/meta/StudioFullCalendarPropertyGroups.java b/jmix-fullcalendar/fullcalendar-flowui-kit/src/main/java/io/jmix/fullcalendarflowui/kit/meta/StudioFullCalendarPropertyGroups.java new file mode 100644 index 0000000000..f620a77c2d --- /dev/null +++ b/jmix-fullcalendar/fullcalendar-flowui-kit/src/main/java/io/jmix/fullcalendarflowui/kit/meta/StudioFullCalendarPropertyGroups.java @@ -0,0 +1,361 @@ +/* + * Copyright 2026 Haulmont. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.jmix.fullcalendarflowui.kit.meta; + +import io.jmix.flowui.kit.meta.*; + +@StudioAPI +public final class StudioFullCalendarPropertyGroups { + + private StudioFullCalendarPropertyGroups() { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "additionalProperties", type = StudioPropertyType.VALUES_LIST) + } + ) + public interface AdditionalProperties { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "allDay", type = StudioPropertyType.PROPERTY_REF) + } + ) + public interface AllDay { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "allDaySlotVisible", type = StudioPropertyType.BOOLEAN, defaultValue = "true") + } + ) + public interface AllDaySlotVisible { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "backgroundColor", type = StudioPropertyType.PROPERTY_REF) + } + ) + public interface BackgroundColor { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "borderColor", type = StudioPropertyType.PROPERTY_REF) + } + ) + public interface BorderColor { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "classNames", type = StudioPropertyType.PROPERTY_REF) + } + ) + public interface DataProviderClassNames { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "constraint", type = StudioPropertyType.PROPERTY_REF) + } + ) + public interface Constraint { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "dayHeaderFormat", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface DayHeaderFormat { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "dayPopoverFormat", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface DayPopoverFormat { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "description", type = StudioPropertyType.PROPERTY_REF) + } + ) + public interface Description { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "displayEventEnd", type = StudioPropertyType.BOOLEAN, defaultValue = "true") + } + ) + public interface DisplayEventEnd { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "displayEventEnd", type = StudioPropertyType.BOOLEAN, defaultValue = "false") + } + ) + public interface DisplayEventEndWithFalseDefaultValue { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "display", type = StudioPropertyType.PROPERTY_REF) + } + ) + public interface Display { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "durationEditable", type = StudioPropertyType.PROPERTY_REF) + } + ) + public interface DurationEditable { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "endDateTime", type = StudioPropertyType.PROPERTY_REF) + } + ) + public interface EndDateTime { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "eventMinHeight", type = StudioPropertyType.INTEGER, defaultValue = "15") + } + ) + public interface EventMinHeight { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "eventShortHeight", type = StudioPropertyType.INTEGER) + } + ) + public interface EventShortHeight { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "eventTimeFormat", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface EventTimeFormat { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "fixedWeekCount", type = StudioPropertyType.BOOLEAN, defaultValue = "true") + } + ) + public interface FixedWeekCount { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "groupId", type = StudioPropertyType.PROPERTY_REF) + } + ) + public interface GroupId { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "interactive", type = StudioPropertyType.PROPERTY_REF) + } + ) + public interface Interactive { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "listDayFormat", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface ListDayFormat { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "listDaySideFormat", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface ListDaySideFormat { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "listDaySideVisible", type = StudioPropertyType.BOOLEAN, defaultValue = "true") + } + ) + public interface ListDaySideVisible { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "listDayVisible", type = StudioPropertyType.BOOLEAN, defaultValue = "true") + } + ) + public interface ListDayVisible { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "overlap", type = StudioPropertyType.PROPERTY_REF) + } + ) + public interface Overlap { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "recurringDaysOfWeek", type = StudioPropertyType.PROPERTY_REF) + } + ) + public interface RecurringDaysOfWeek { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "recurringEndDate", type = StudioPropertyType.PROPERTY_REF) + } + ) + public interface RecurringEndDate { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "recurringEndTime", type = StudioPropertyType.PROPERTY_REF) + } + ) + public interface RecurringEndTime { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "recurringStartDate", type = StudioPropertyType.PROPERTY_REF) + } + ) + public interface RecurringStartDate { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "recurringStartTime", type = StudioPropertyType.PROPERTY_REF) + } + ) + public interface RecurringStartTime { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "showNonCurrentDates", type = StudioPropertyType.BOOLEAN, defaultValue = "true") + } + ) + public interface ShowNonCurrentDates { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "slotEventOverlap", type = StudioPropertyType.BOOLEAN, defaultValue = "true") + } + ) + public interface SlotEventOverlap { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "slotLabelFormat", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface SlotLabelFormat { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "startDateTime", type = StudioPropertyType.PROPERTY_REF) + } + ) + public interface StartDateTime { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "startEditable", type = StudioPropertyType.PROPERTY_REF) + } + ) + public interface StartEditable { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "textColor", type = StudioPropertyType.PROPERTY_REF) + } + ) + public interface TextColor { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "title", type = StudioPropertyType.PROPERTY_REF) + } + ) + public interface Title { + } + + @StudioPropertyGroup( + properties = { + @StudioProperty(xmlAttribute = "weekNumberFormat", type = StudioPropertyType.LOCALIZED_STRING) + } + ) + public interface WeekNumberFormat { + } + + @StudioPropertyGroup + public interface DataProviderProperties extends StudioPropertyGroups.Id, AdditionalProperties, AllDay, + BackgroundColor, BorderColor, DataProviderClassNames, Constraint, Description, Display, + DurationEditable, EndDateTime, GroupId, Interactive, Overlap, RecurringDaysOfWeek, RecurringEndDate, + RecurringEndTime, RecurringStartDate, RecurringStartTime, StartDateTime, StartEditable, TextColor, + Title { + } + + @StudioPropertyGroup + public interface ListProperties extends ListDayFormat, ListDaySideFormat, ListDaySideVisible, ListDayVisible { + } + + @StudioPropertyGroup + public interface TimeGridProperties extends DayPopoverFormat, DayHeaderFormat, WeekNumberFormat, + EventTimeFormat, SlotLabelFormat, EventMinHeight, EventShortHeight, SlotEventOverlap, + AllDaySlotVisible, DisplayEventEnd { + } + + @StudioPropertyGroup + public interface DayGridProperties extends DayHeaderFormat, DayPopoverFormat, EventTimeFormat, + WeekNumberFormat, DisplayEventEndWithFalseDefaultValue { + } +} diff --git a/jmix-messagetemplates/messagetemplates-flowui-kit/src/main/java/io/jmix/messagetemplatesflowui/kit/meta/StudioGrapesJsComponents.java b/jmix-messagetemplates/messagetemplates-flowui-kit/src/main/java/io/jmix/messagetemplatesflowui/kit/meta/StudioGrapesJsComponents.java index 16fd5e523c..ce9ae35e71 100644 --- a/jmix-messagetemplates/messagetemplates-flowui-kit/src/main/java/io/jmix/messagetemplatesflowui/kit/meta/StudioGrapesJsComponents.java +++ b/jmix-messagetemplates/messagetemplates-flowui-kit/src/main/java/io/jmix/messagetemplatesflowui/kit/meta/StudioGrapesJsComponents.java @@ -22,6 +22,7 @@ import io.jmix.flowui.kit.meta.StudioUiKit; import io.jmix.messagetemplatesflowui.kit.component.GrapesJs; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; @StudioUiKit(studioClassloaderDependencies = "io.jmix.messagetemplates:jmix-messagetemplates-flowui-kit") public interface StudioGrapesJsComponents { @@ -33,6 +34,14 @@ public interface StudioGrapesJsComponents { xmlns = "http://jmix.io/schema/messagetemplates/ui", xmlnsAlias = "msgtmp", icon = "io/jmix/messagetemplatesflowui/kit/meta/icon/unknownComponent.svg", + propertyGroups = { + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.IdAndVisible.class, + StudioPropertyGroups.SizeWithoutOptions.class, + StudioPropertyGroups.AlignSelf.class, + StudioPropertyGroups.Colspan.class, + StudioPropertyGroups.ReadOnly.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", type = StudioPropertyType.ENUMERATION, category = StudioProperty.Category.POSITION, @@ -66,7 +75,6 @@ public interface StudioGrapesJsComponents { @StudioProperty(xmlAttribute = "width", type = StudioPropertyType.SIZE, category = StudioProperty.Category.SIZE) } - ) GrapesJs grapesJs(); } diff --git a/jmix-messagetemplates/messagetemplates-flowui-kit/src/main/java/io/jmix/messagetemplatesflowui/kit/meta/StudioGrapesJsElements.java b/jmix-messagetemplates/messagetemplates-flowui-kit/src/main/java/io/jmix/messagetemplatesflowui/kit/meta/StudioGrapesJsElements.java index 167a2d90ce..d42c0084cd 100644 --- a/jmix-messagetemplates/messagetemplates-flowui-kit/src/main/java/io/jmix/messagetemplatesflowui/kit/meta/StudioGrapesJsElements.java +++ b/jmix-messagetemplates/messagetemplates-flowui-kit/src/main/java/io/jmix/messagetemplatesflowui/kit/meta/StudioGrapesJsElements.java @@ -20,6 +20,7 @@ import io.jmix.flowui.kit.meta.StudioProperty; import io.jmix.flowui.kit.meta.StudioPropertyType; import io.jmix.flowui.kit.meta.StudioUiKit; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; @StudioUiKit public interface StudioGrapesJsElements { @@ -48,6 +49,10 @@ public interface StudioGrapesJsElements { xmlns = "http://jmix.io/schema/messagetemplates/ui", xmlnsAlias = "msgtmp", icon = "io/jmix/messagetemplatesflowui/kit/meta/icon/element/block.svg", + propertyGroups = { + StudioPropertyGroups.RequiredId.class, + StudioPropertyGroups.Label2.class + }, properties = { @StudioProperty(xmlAttribute = "attributes", type = StudioPropertyType.STRING), @StudioProperty(xmlAttribute = "category", type = StudioPropertyType.LOCALIZED_STRING), @@ -66,6 +71,9 @@ public interface StudioGrapesJsElements { target = {"io.jmix.messagetemplatesflowui.kit.meta.stub.StudioGrapesJsBlockElement"}, unlimitedCount = false, icon = "io/jmix/messagetemplatesflowui/kit/meta/icon/element/content.svg", + propertyGroups = { + StudioPropertyGroups.Value2.class + }, properties = { @StudioProperty(xmlAttribute = "value", type = StudioPropertyType.CDATA) } @@ -80,6 +88,9 @@ public interface StudioGrapesJsElements { target = {"io.jmix.messagetemplatesflowui.kit.meta.stub.StudioGrapesJsBlockElement"}, unlimitedCount = false, icon = "io/jmix/messagetemplatesflowui/kit/meta/icon/element/attributes.svg", + propertyGroups = { + StudioPropertyGroups.Value2.class + }, properties = { @StudioProperty(xmlAttribute = "value", type = StudioPropertyType.CDATA) } diff --git a/jmix-pivottable/pivottable-flowui-kit/src/main/java/io/jmix/pivottableflowui/kit/meta/StudioPivotTableActions.java b/jmix-pivottable/pivottable-flowui-kit/src/main/java/io/jmix/pivottableflowui/kit/meta/StudioPivotTableActions.java index 3450f60e4d..20cb7228d3 100644 --- a/jmix-pivottable/pivottable-flowui-kit/src/main/java/io/jmix/pivottableflowui/kit/meta/StudioPivotTableActions.java +++ b/jmix-pivottable/pivottable-flowui-kit/src/main/java/io/jmix/pivottableflowui/kit/meta/StudioPivotTableActions.java @@ -17,6 +17,7 @@ package io.jmix.pivottableflowui.kit.meta; import io.jmix.flowui.kit.meta.*; +import io.jmix.flowui.kit.meta.action.StudioActionPropertyGroups; @StudioUiKit(requiredDependencies = "io.jmix.pivottable:jmix-pivottable-flowui-starter") public interface StudioPivotTableActions { @@ -25,7 +26,7 @@ public interface StudioPivotTableActions { type = "pvttbl_showPivotTableAction", description = "Shows the Pivot Table component", classFqn = "io.jmix.pivottableflowui.action.ShowPivotTableAction", - + propertyGroups = StudioActionPropertyGroups.ActionCommonPropertiesWithoutCategory.class, properties = { @StudioProperty(xmlAttribute = "actionVariant", type = StudioPropertyType.ENUMERATION, setMethod = "setVariant", classFqn = "io.jmix.flowui.kit.action.ActionVariant", @@ -53,4 +54,3 @@ public interface StudioPivotTableActions { ) void showPivotTableAction(); } - diff --git a/jmix-pivottable/pivottable-flowui-kit/src/main/java/io/jmix/pivottableflowui/kit/meta/StudioPivotTableComponents.java b/jmix-pivottable/pivottable-flowui-kit/src/main/java/io/jmix/pivottableflowui/kit/meta/StudioPivotTableComponents.java index 78240d0bf3..4f289c6705 100644 --- a/jmix-pivottable/pivottable-flowui-kit/src/main/java/io/jmix/pivottableflowui/kit/meta/StudioPivotTableComponents.java +++ b/jmix-pivottable/pivottable-flowui-kit/src/main/java/io/jmix/pivottableflowui/kit/meta/StudioPivotTableComponents.java @@ -30,6 +30,14 @@ public interface StudioPivotTableComponents { icon = "io/jmix/pivottableflowui/kit/meta/icon/component/pivotTable.svg", xmlns = "http://jmix.io/schema/pvttbl/ui", xmlnsAlias = "pvttbl", + propertyGroups = { + StudioPropertyGroups.ClassNamesAndCss.class, + StudioPropertyGroups.EnabledWithTrueDefaultValue.class, + StudioPropertyGroups.SizeWithoutOptions.class, + StudioPropertyGroups.AlignSelf.class, + StudioPropertyGroups.Colspan.class, + StudioPropertyGroups.Id.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", diff --git a/jmix-pivottable/pivottable-flowui-kit/src/main/java/io/jmix/pivottableflowui/kit/meta/StudioPivotTableElements.java b/jmix-pivottable/pivottable-flowui-kit/src/main/java/io/jmix/pivottableflowui/kit/meta/StudioPivotTableElements.java index ebb4844fe2..cdcfd67171 100644 --- a/jmix-pivottable/pivottable-flowui-kit/src/main/java/io/jmix/pivottableflowui/kit/meta/StudioPivotTableElements.java +++ b/jmix-pivottable/pivottable-flowui-kit/src/main/java/io/jmix/pivottableflowui/kit/meta/StudioPivotTableElements.java @@ -165,6 +165,9 @@ public interface StudioPivotTableElements { xmlns = "http://jmix.io/schema/pvttbl/ui", xmlnsAlias = "pvttbl", icon = "io/jmix/pivottableflowui/kit/meta/icon/element/property.svg", + propertyGroups = { + StudioPropertyGroups.RequiredStringValue.class + }, properties = { @StudioProperty(xmlAttribute = "value", type = StudioPropertyType.STRING, required = true) } diff --git a/jmix-search/search-flowui-kit/src/main/java/io/jmix/searchflowui/kit/meta/component/StudioSearchComponents.java b/jmix-search/search-flowui-kit/src/main/java/io/jmix/searchflowui/kit/meta/component/StudioSearchComponents.java index ca523f6d90..1e6f2ce600 100644 --- a/jmix-search/search-flowui-kit/src/main/java/io/jmix/searchflowui/kit/meta/component/StudioSearchComponents.java +++ b/jmix-search/search-flowui-kit/src/main/java/io/jmix/searchflowui/kit/meta/component/StudioSearchComponents.java @@ -20,6 +20,7 @@ import com.vaadin.flow.component.textfield.TextField; import io.jmix.flowui.kit.meta.StudioComponent; import io.jmix.flowui.kit.meta.StudioProperty; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; import io.jmix.flowui.kit.meta.StudioPropertyType; import io.jmix.flowui.kit.meta.StudioUiKit; @@ -34,6 +35,16 @@ public interface StudioSearchComponents { xmlns = "http://jmix.io/schema/search/ui", xmlnsAlias = "search", icon = "io/jmix/searchflowui/kit/meta/icon/component/searchField.svg", + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.AriaLabelAndTabIndexAndFocusShortcut.class, + StudioPropertyGroups.Autofocus.class, + StudioPropertyGroups.HelperText.class, + StudioPropertyGroups.Label.class, + StudioPropertyGroups.Placeholder.class, + StudioPropertyGroups.FieldThemeTitleAndValueChangeDefaultProperties.class, + StudioPropertyGroups.StringValue.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", @@ -99,6 +110,21 @@ public interface StudioSearchComponents { xmlns = "http://jmix.io/schema/search/ui", xmlnsAlias = "search", icon = "io/jmix/searchflowui/kit/meta/icon/component/searchField.svg", + propertyGroups = { + StudioPropertyGroups.SizedComponentDefaultProperties.class, + StudioPropertyGroups.AriaLabelAndTabIndexAndFocusShortcut.class, + StudioPropertyGroups.RequiredAndRequiredMessageAndErrorMessage.class, + StudioPropertyGroups.AutoApply.class, + StudioPropertyGroups.DataLoader.class, + StudioPropertyGroups.DefaultValue.class, + StudioPropertyGroups.HelperText.class, + StudioPropertyGroups.Label.class, + StudioPropertyGroups.LabelPosition.class, + StudioPropertyGroups.LabelVisible.class, + StudioPropertyGroups.ParameterName.class, + StudioPropertyGroups.ReadOnly.class, + StudioPropertyGroups.ThemeNames.class + }, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment", diff --git a/jmix-superset/superset-flowui-kit/src/main/java/io/jmix/supersetflowui/kit/meta/StudioSupersetComponents.java b/jmix-superset/superset-flowui-kit/src/main/java/io/jmix/supersetflowui/kit/meta/StudioSupersetComponents.java index aa70ed209f..561d439aac 100644 --- a/jmix-superset/superset-flowui-kit/src/main/java/io/jmix/supersetflowui/kit/meta/StudioSupersetComponents.java +++ b/jmix-superset/superset-flowui-kit/src/main/java/io/jmix/supersetflowui/kit/meta/StudioSupersetComponents.java @@ -21,6 +21,7 @@ import io.jmix.flowui.kit.meta.StudioPropertyType; import io.jmix.flowui.kit.meta.StudioUiKit; +import io.jmix.flowui.kit.meta.StudioPropertyGroups; @StudioUiKit public interface StudioSupersetComponents { @@ -32,6 +33,7 @@ public interface StudioSupersetComponents { xmlns = "http://jmix.io/schema/superset/ui", xmlnsAlias = "superset", icon = "io/jmix/supersetflowui/kit/meta/icon/supersetDashboard.svg", + propertyGroups = StudioPropertyGroups.AddonComponentDefaultProperties.class, properties = { @StudioProperty(xmlAttribute = "alignSelf", category = StudioProperty.Category.POSITION, type = StudioPropertyType.ENUMERATION, classFqn = "com.vaadin.flow.component.orderedlayout.FlexComponent$Alignment",